better folding for python and coffeeScript

This commit is contained in:
nightwing 2011-12-13 01:03:15 +04:00
commit 0a9a997883
5 changed files with 44 additions and 29 deletions

View file

@ -40,6 +40,7 @@ define(function(require, exports, module) {
var Tokenizer = require("../tokenizer").Tokenizer; var Tokenizer = require("../tokenizer").Tokenizer;
var Rules = require("./coffee_highlight_rules").CoffeeHighlightRules; var Rules = require("./coffee_highlight_rules").CoffeeHighlightRules;
var Outdent = require("./matching_brace_outdent").MatchingBraceOutdent; var Outdent = require("./matching_brace_outdent").MatchingBraceOutdent;
var PythonFoldMode = require("./folding/pythonic").FoldMode;
var Range = require("../range").Range; var Range = require("../range").Range;
var TextMode = require("./text").Mode; var TextMode = require("./text").Mode;
var WorkerClient = require("../worker/worker_client").WorkerClient; var WorkerClient = require("../worker/worker_client").WorkerClient;
@ -48,6 +49,7 @@ var oop = require("../lib/oop");
function Mode() { function Mode() {
this.$tokenizer = new Tokenizer(new Rules().getRules()); this.$tokenizer = new Tokenizer(new Rules().getRules());
this.$outdent = new Outdent(); this.$outdent = new Outdent();
this.foldingRules = new PythonFoldMode("\\[|=|(=>)|(->)");
} }
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);

View file

@ -55,26 +55,12 @@ oop.inherits(FoldMode, BaseFoldMode);
if (match) { if (match) {
var i = match.index; var i = match.index;
if (match[2]) { if (match[1])
var range = session.getCommentFoldRange(row, i + match[0].length); return this.openingBracketBlock(session, match[1], row, i);
range.end.column -= 2;
return range;
}
var start = {row: row, column: i+1}; var range = session.getCommentFoldRange(row, i + match[0].length);
var end = session.$findClosingBracket(match[1], start); range.end.column -= 2;
if (!end) return range;
return;
var fw = session.foldWidgets[end.row];
if (fw == null)
fw = this.getFoldWidget(session, end.row);
if (fw == "start") {
end.row --;
end.column = session.getLine(end.row).length;
}
return Range.fromPoints(start, end);
} }
if (foldStyle !== "markbeginend") if (foldStyle !== "markbeginend")

View file

@ -43,8 +43,6 @@ var FoldMode = exports.FoldMode = function() {};
(function() { (function() {
this.FOO = 12;
this.foldingStartMarker = null; this.foldingStartMarker = null;
this.foldingStopMarker = null; this.foldingStopMarker = null;
@ -70,15 +68,17 @@ var FoldMode = exports.FoldMode = function() {};
return null; return null;
}; };
this.indentationBlock = function(session, foldStyle, row) { this.indentationBlock = function(session, row) {
var re = /^\s*/; var re = /^\s*/;
var startRow = row; var startRow = row;
var endRow = row; var endRow = row;
var line = session.getLine(row); var line = session.getLine(row);
var startColumn = line.length - 1; var startColumn = line.length - 1;
var startLevel = line.match(re)[0].length; var startLevel = line.match(re)[0].length;
var maxRow = session.getLength()
while (line = session.getLine(++row)) {
while (++row < maxRow) {
line = session.getLine(row);
var level = line.match(re)[0].length; var level = line.match(re)[0].length;
if (level == line.length) if (level == line.length)
@ -96,6 +96,23 @@ var FoldMode = exports.FoldMode = function() {};
} }
}; };
this.openingBracketBlock = function(session, bracket, row, column) {
var start = {row: row, column: column + 1};
var end = session.$findClosingBracket(bracket, start);
if (!end)
return;
var fw = session.foldWidgets[end.row];
if (fw == null)
fw = this.getFoldWidget(session, end.row);
if (fw == "start") {
end.row --;
end.column = session.getLine(end.row).length;
}
return Range.fromPoints(start, end);
};
this.$testStart = function(session, foldStyle, row) { this.$testStart = function(session, foldStyle, row) {
if (this.foldingStartMarker.test(session.getLine(row))) if (this.foldingStartMarker.test(session.getLine(row)))
return "start"; return "start";

View file

@ -40,13 +40,23 @@ define(function(require, exports, module) {
var oop = require("../../lib/oop"); var oop = require("../../lib/oop");
var BaseFoldMode = require("./fold_mode").FoldMode; var BaseFoldMode = require("./fold_mode").FoldMode;
var FoldMode = exports.FoldMode = function() {}; var FoldMode = exports.FoldMode = function(markers) {
this.foldingStartMarker = new RegExp("(?:(\\[)|" + markers + ")(?:\\s*)(?:#.*)?$");
};
oop.inherits(FoldMode, BaseFoldMode); oop.inherits(FoldMode, BaseFoldMode);
(function() { (function() {
this.foldingStartMarker = /\:(:?\s*)?(:?#.*)?$/; this.getFoldWidgetRange = function(session, foldStyle, row) {
this.getFoldWidgetRange = BaseFoldMode.prototype.indentationBlock; var line = session.getLine(row);
var match = line.match(this.foldingStartMarker);
if (match) {
if (match[1])
return this.openingBracketBlock(session, match[1], row, match.index);
return this.indentationBlock(session, row)
}
}
}).call(FoldMode.prototype); }).call(FoldMode.prototype);

View file

@ -42,12 +42,12 @@ var oop = require("../lib/oop");
var TextMode = require("./text").Mode; var TextMode = require("./text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer; var Tokenizer = require("../tokenizer").Tokenizer;
var PythonHighlightRules = require("./python_highlight_rules").PythonHighlightRules; var PythonHighlightRules = require("./python_highlight_rules").PythonHighlightRules;
var PythonFoldMode = require("./folding/python").FoldMode; var PythonFoldMode = require("./folding/pythonic").FoldMode;
var Range = require("../range").Range; var Range = require("../range").Range;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new PythonHighlightRules().getRules()); this.$tokenizer = new Tokenizer(new PythonHighlightRules().getRules());
this.foldingRules = new PythonFoldMode(); this.foldingRules = new PythonFoldMode("\\:");
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);