From 9a70c98fc413602bcc2091ec5c53d5545f332b9b Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 21 Sep 2013 15:38:06 +0400 Subject: [PATCH] ini fold mode --- lib/ace/mode/folding/ini.js | 80 ++++++++++++++++++++ lib/ace/mode/ini.js | 11 +-- lib/ace/mode/ini_highlight_rules.js | 112 ++++++++++++++++------------ lib/ace/mode/toml.js | 3 +- 4 files changed, 145 insertions(+), 61 deletions(-) create mode 100644 lib/ace/mode/folding/ini.js diff --git a/lib/ace/mode/folding/ini.js b/lib/ace/mode/folding/ini.js new file mode 100644 index 00000000..ef4eaa0b --- /dev/null +++ b/lib/ace/mode/folding/ini.js @@ -0,0 +1,80 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function() { +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /^\s*\[([^\])]*)]\s*(?:$|[;#])/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var re = this.foldingStartMarker; + var line = session.getLine(row); + + var m = line.match(re); + + if (!m) return; + + var startName = m[1] + "."; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + if (/^\s*$/.test(line)) + continue; + m = line.match(re); + if (m && m[1].lastIndexOf(startName, 0) !== 0) + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/lib/ace/mode/ini.js b/lib/ace/mode/ini.js index cd21990a..8e660061 100644 --- a/lib/ace/mode/ini.js +++ b/lib/ace/mode/ini.js @@ -26,17 +26,8 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * - * Contributor(s): - * - * - * * ***** END LICENSE BLOCK ***** */ -/* - THIS FILE WAS AUTOGENERATED BY mode.tmpl.js -*/ - define(function(require, exports, module) { "use strict"; @@ -45,7 +36,7 @@ var TextMode = require("./text").Mode; var Tokenizer = require("../tokenizer").Tokenizer; var IniHighlightRules = require("./ini_highlight_rules").IniHighlightRules; // TODO: pick appropriate fold mode -var FoldMode = require("./folding/cstyle").FoldMode; +var FoldMode = require("./folding/ini").FoldMode; var Mode = function() { var highlighter = new IniHighlightRules(); diff --git a/lib/ace/mode/ini_highlight_rules.js b/lib/ace/mode/ini_highlight_rules.js index b4c152a4..8ce3d949 100644 --- a/lib/ace/mode/ini_highlight_rules.js +++ b/lib/ace/mode/ini_highlight_rules.js @@ -29,10 +29,6 @@ * ***** END LICENSE BLOCK ***** */ /* This file was autogenerated from tool\tm bundles\ini.tmbundle\Syntaxes\Ini.plist (uuid: ) */ -/**************************************************************************************** - * IT MIGHT NOT BE PERFECT ...But it's a good start from an existing *.tmlanguage file. * - * fileTypes * - ****************************************************************************************/ define(function(require, exports, module) { "use strict"; @@ -40,56 +36,74 @@ define(function(require, exports, module) { var oop = require("../lib/oop"); var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; -var IniHighlightRules = function() { - // regexp must not have capturing parentheses. Use (?:) instead. - // regexps are ordered -> the first match is used +var escapeRe = "\\\\(?:[\\\\0abtrn;#=:]|x[a-fA-F\\d]{4})"; - this.$rules = { start: - [ { token: 'punctuation.definition.comment.ini', - regex: '#.*', - push_: - [ { token: 'comment.line.number-sign.ini', - regex: '$', - next: 'pop' }, - { defaultToken: 'comment.line.number-sign.ini' } ] }, - { token: 'punctuation.definition.comment.ini', - regex: ';.*', - push_: - [ { token: 'comment.line.semicolon.ini', regex: '$', next: 'pop' }, - { defaultToken: 'comment.line.semicolon.ini' } ] }, - { token: - [ 'keyword.other.definition.ini', - 'text', - 'punctuation.separator.key-value.ini' ], - regex: '\\b([a-zA-Z0-9_.-]+)\\b(\\s*)(=)' }, - { token: - [ 'punctuation.definition.entity.ini', - 'constant.section.group-title.ini', - 'punctuation.definition.entity.ini' ], - regex: '^(\\[)(.*?)(\\])' }, - { token: 'punctuation.definition.string.begin.ini', - regex: '\'', - push: - [ { token: 'punctuation.definition.string.end.ini', - regex: '\'', - next: 'pop' }, - { token: 'constant.character.escape.ini', regex: '\\\\.' }, - { defaultToken: 'string.quoted.single.ini' } ] }, - { token: 'punctuation.definition.string.begin.ini', - regex: '"', - push: - [ { token: 'punctuation.definition.string.end.ini', +var IniHighlightRules = function() { + this.$rules = { + start: [{ + token: 'punctuation.definition.comment.ini', + regex: '#.*', + push_: [{ + token: 'comment.line.number-sign.ini', + regex: '$|^', + next: 'pop' + }, { + defaultToken: 'comment.line.number-sign.ini' + }] + }, { + token: 'punctuation.definition.comment.ini', + regex: ';.*', + push_: [{ + token: 'comment.line.semicolon.ini', + regex: '$|^', + next: 'pop' + }, { + defaultToken: 'comment.line.semicolon.ini' + }] + }, { + token: ['keyword.other.definition.ini', 'text', 'punctuation.separator.key-value.ini'], + regex: '\\b([a-zA-Z0-9_.-]+)\\b(\\s*)(=)' + }, { + token: ['punctuation.definition.entity.ini', 'constant.section.group-title.ini', 'punctuation.definition.entity.ini'], + regex: '^(\\[)(.*?)(\\])' + }, { + token: 'punctuation.definition.string.begin.ini', + regex: "'", + push: [{ + token: 'punctuation.definition.string.end.ini', + regex: "'", + next: 'pop' + }, { + token: "constant.language.escape", + regex: escapeRe + }, { + defaultToken: 'string.quoted.single.ini' + }] + }, { + token: 'punctuation.definition.string.begin.ini', + regex: '"', + push: [{ + token: "constant.language.escape", + regex: escapeRe + }, { + token: 'punctuation.definition.string.end.ini', regex: '"', - next: 'pop' }, - { defaultToken: 'string.quoted.double.ini' } ] } ] } - + next: 'pop' + }, { + defaultToken: 'string.quoted.double.ini' + }] + }] + }; + this.normalizeRules(); }; -IniHighlightRules.metaData = { fileTypes: [ 'ini', 'conf' ], - keyEquivalent: '^~I', - name: 'Ini', - scopeName: 'source.ini' } +IniHighlightRules.metaData = { + fileTypes: ['ini', 'conf'], + keyEquivalent: '^~I', + name: 'Ini', + scopeName: 'source.ini' +}; oop.inherits(IniHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/toml.js b/lib/ace/mode/toml.js index bd47182f..dab36136 100644 --- a/lib/ace/mode/toml.js +++ b/lib/ace/mode/toml.js @@ -40,8 +40,7 @@ var oop = require("../lib/oop"); var TextMode = require("./text").Mode; var Tokenizer = require("../tokenizer").Tokenizer; var TomlHighlightRules = require("./toml_highlight_rules").TomlHighlightRules; -// TODO: pick appropriate fold mode -var FoldMode = require("./folding/cstyle").FoldMode; +var FoldMode = require("./folding/ini").FoldMode; var Mode = function() { var highlighter = new TomlHighlightRules();