Skip to content

Commit

Permalink
Merge pull request #1083 from ajaxorg/folding-1
Browse files Browse the repository at this point in the history
add more folding rules
  • Loading branch information
Mostafa Eweda committed Nov 6, 2012
2 parents 48f0644 + d666d03 commit c622a10
Show file tree
Hide file tree
Showing 7 changed files with 308 additions and 7 deletions.
162 changes: 162 additions & 0 deletions lib/ace/mode/folding/latex.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/* ***** BEGIN LICENSE BLOCK *****
* Distributed under the BSD license:
*
* Copyright (c) 2012, 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 BaseFoldMode = require("./fold_mode").FoldMode;
var Range = require("../../range").Range;
var TokenIterator = require("ace/token_iterator").TokenIterator;

var FoldMode = exports.FoldMode = function() {};

oop.inherits(FoldMode, BaseFoldMode);

(function() {

this.foldingStartMarker = /^\s*\\(begin)|(section|subsection)\b|{\s*$/;
this.foldingStopMarker = /^\s*\\(end)\b|^\s*}/;

this.getFoldWidgetRange = function(session, foldStyle, row) {
var line = session.doc.getLine(row);
var match = this.foldingStartMarker.exec(line);
if (match) {
if (match[1])
return this.latexBlock(session, row, match[0].length - 1);
if (match[2])
return this.latexSection(session, row, match[0].length - 1);

return this.openingBracketBlock(session, "{", row, match.index);
}

var match = this.foldingStopMarker.exec(line);
if (match) {
if (match[1])
return this.latexBlock(session, row, match[0].length - 1);

return this.closingBracketBlock(session, "}", row, match.index + match[0].length);
}
};

this.latexBlock = function(session, row, column) {
var keywords = {
"\\begin": 1,
"\\end": -1
};

var stream = new TokenIterator(session, row, column);
var token = stream.getCurrentToken();
if (!token || token.type !== "keyword")
return;

var val = token.value;
var dir = keywords[val];

var getType = function() {
var token = stream.stepForward();
var type = token.type == "lparen" ?stream.stepForward().value : "";
if (dir === -1) {
stream.stepBackward();
if (type)
stream.stepBackward();
}
return type;
};
var stack = [getType()];
var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length;
var startRow = row;

stream.step = dir === -1 ? stream.stepBackward : stream.stepForward;
while(token = stream.step()) {
if (token.type !== "keyword")
continue;
var level = keywords[token.value];
if (!level)
continue;
var type = getType();
if (level === dir)
stack.unshift(type);
else if (stack.shift() !== type || !stack.length)
break;
}

if (stack.length)
return;

var row = stream.getCurrentTokenRow();
if (dir === -1)
return new Range(row, session.getLine(row).length, startRow, startColumn);
else
return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn());
};

this.latexSection = function(session, row, column) {
var keywords = ["\\subsection", "\\section", "\\begin", "\\end"];

var stream = new TokenIterator(session, row, column);
var token = stream.getCurrentToken();
if (!token || token.type != "keyword")
return;

var startLevel = keywords.indexOf(token.value);
var stackDepth = 0
var endRow = row;

while(token = stream.stepForward()) {
if (token.type !== "keyword")
continue;
var level = keywords.indexOf(token.value);

if (level >= 2) {
if (!stackDepth)
endRow = stream.getCurrentTokenRow() - 1;
stackDepth += level == 2 ? 1 : - 1;
if (stackDepth < 0)
break
} else if (level >= startLevel)
break;
}

if (!stackDepth)
endRow = stream.getCurrentTokenRow() - 1;

while (endRow > row && !/\S/.test(session.getLine(endRow)))
endRow--;

return new Range(
row, session.getLine(row).length,
endRow, session.getLine(endRow).length
);
};

}).call(FoldMode.prototype);

});
125 changes: 125 additions & 0 deletions lib/ace/mode/folding/markdown.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
/* ***** 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 BaseFoldMode = require("./fold_mode").FoldMode;
var Range = require("../../range").Range;

var FoldMode = exports.FoldMode = function() {};
oop.inherits(FoldMode, BaseFoldMode);

(function() {
this.foldingStartMarker = /^(?:[=-]+\s*$|#{1,6} |`{3})/;

this.getFoldWidget = function(session, foldStyle, row) {
var line = session.getLine(row);
if (!this.foldingStartMarker.test(line))
return "";

if (line[0] == "`") {
if (session.bgTokenizer.getState(row) == "start")
return "end";
return "start";
}

return "start";
};

this.getFoldWidgetRange = function(session, foldStyle, row) {
var line = session.getLine(row);
var startColumn = line.length;
var maxRow = session.getLength();
var startRow = row;
var endRow = row;
if (!line.match(this.foldingStartMarker))
return;

if (line[0] == "`") {
if (session.bgTokenizer.getState(row) !== "start") {
while (++row < maxRow) {
line = session.getLine(row);
if (line[0] == "`" & line.substring(0, 3) == "```")
break;
}
return new Range(startRow, startColumn, row, 0);
} else {
while (row -- > 0) {
line = session.getLine(row);
if (line[0] == "`" & line.substring(0, 3) == "```")
break;
}
return new Range(row, line.length, startRow, 0);
}
}

var token;
function isHeading(row) {
token = session.getTokens(row)[0];
return token && token.type.lastIndexOf(heading, 0) === 0;
}

var heading = "markup.heading";
function getLevel() {
var ch = token.value[0];
if (ch == "=") return 6;
if (ch == "-") return 5;
return 7 - token.value.search(/[^#]/);
}

if (isHeading(row)) {
var startHeadingLevel = getLevel();
while (++row < maxRow) {
if (!isHeading(row))
continue;
var level = getLevel();
if (level >= startHeadingLevel)
break;
}

endRow = row - (!token || ["=", "-"].indexOf(token.value[0]) == -1 ? 1 : 2);

if (endRow > startRow) {
while (endRow > startRow && /^\s*$/.test(session.getLine(endRow)))
endRow--;
}

if (endRow > startRow) {
var endColumn = session.getLine(endRow).length;
return new Range(startRow, startColumn, endRow, endColumn);
}
}
};

}).call(FoldMode.prototype);

});
4 changes: 2 additions & 2 deletions lib/ace/mode/jade.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@ var oop = require("../lib/oop");
var TextMode = require("./text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer;
var JadeHighlightRules = require("./jade_highlight_rules").JadeHighlightRules;
// var JavascriptMode = require("../mode/javascript").Mode;
// var CssMode = require("../mode/css").Mode;
var FoldMode = require("./folding/coffee").FoldMode;

var Mode = function() {
var highlighter = new JadeHighlightRules();

this.$tokenizer = new Tokenizer(highlighter.getRules());
this.foldingRules = new FoldMode();
};
oop.inherits(Mode, TextMode);

Expand Down
5 changes: 3 additions & 2 deletions lib/ace/mode/latex.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ var oop = require("../lib/oop");
var TextMode = require("./text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer;
var LatexHighlightRules = require("./latex_highlight_rules").LatexHighlightRules;
var LatexFoldMode = require("./folding/latex").FoldMode;
var Range = require("../range").Range;

var Mode = function()
{
var Mode = function() {
this.$tokenizer = new Tokenizer(new LatexHighlightRules().getRules());
this.foldingRules = new LatexFoldMode();
};
oop.inherits(Mode, TextMode);

Expand Down
3 changes: 3 additions & 0 deletions lib/ace/mode/markdown.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ var XmlMode = require("./xml").Mode;
var HtmlMode = require("./html").Mode;
var Tokenizer = require("../tokenizer").Tokenizer;
var MarkdownHighlightRules = require("./markdown_highlight_rules").MarkdownHighlightRules;
var MarkdownFoldMode = require("./folding/markdown").FoldMode;

var Mode = function() {
var highlighter = new MarkdownHighlightRules();
Expand All @@ -49,6 +50,8 @@ var Mode = function() {
"xml-": XmlMode,
"html-": HtmlMode
});

this.foldingRules = new MarkdownFoldMode();
};
oop.inherits(Mode, TextMode);

Expand Down
2 changes: 2 additions & 0 deletions lib/ace/mode/ruby.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ var Tokenizer = require("../tokenizer").Tokenizer;
var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules;
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
var Range = require("../range").Range;
var FoldMode = require("./folding/coffee").FoldMode;

var Mode = function() {
this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules());
this.$outdent = new MatchingBraceOutdent();
this.foldingRules = new FoldMode();
};
oop.inherits(Mode, TextMode);

Expand Down
14 changes: 11 additions & 3 deletions lib/ace/mode/typescript.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,19 +41,27 @@ define(function(require, exports, module) {
"use strict";

var oop = require("../lib/oop");
var TextMode = require("./text").Mode;
var jsMode = require("./javascript").Mode;
var Tokenizer = require("../tokenizer").Tokenizer;
var TypeScriptHighlightRules = require("./typescript_highlight_rules").TypeScriptHighlightRules;
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;

var Mode = function() {
var highlighter = new TypeScriptHighlightRules();

this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);
oop.inherits(Mode, jsMode);

(function() {
// Extra logic goes here.
this.createWorker = function(session) {
return null;
};
}).call(Mode.prototype);

exports.Mode = Mode;
Expand Down

0 comments on commit c622a10

Please sign in to comment.