diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index d402131b..3147b84e 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -710,12 +710,23 @@ function Folding() { var range = this.getFoldWidgetRange(row); if (range) { + // sometimes singleline folds can be missed by the code above + if (!range.isMultiLine()) { + fold = this.getFoldAt(range.start.row, range.start.column, 1); + if (fold && range.isEequal(fold.range)) { + this.removeFold(fold); + return; + } + } + if (!onlySubfolds) this.addFold("...", range); if (addSubfolds) this.foldAll(range.start.row + 1, range.end.row); } else { + if (addSubfolds) + this.foldAll(row + 1, this.getLength()); e.target.className += " invalid" } }; diff --git a/lib/ace/mode/folding/fold_mode.js b/lib/ace/mode/folding/fold_mode.js index 5180ec73..fcb75c5f 100644 --- a/lib/ace/mode/folding/fold_mode.js +++ b/lib/ace/mode/folding/fold_mode.js @@ -48,32 +48,26 @@ var FoldMode = exports.FoldMode = function() {}; // must return "" if there's no fold, to enable caching this.getFoldWidget = function(session, foldStyle, row) { - if (this.foldingStartMarker) { - if (this.foldingStopMarker) { - // rewrite getFoldWidget so the check is only performed once - FoldMode.prototype.getFoldWidget = this.$testBoth; - return this.$testBoth(session, foldStyle, row); - } - else { - // rewrite getFoldWidget so the check is only performed once - FoldMode.prototype.getFoldWidget = this.$testStart; - return this.$testStart(session, foldStyle, row); - } - } - else - return ""; + var line = session.getLine(row); + if (this.foldingStartMarker.test(line)) + return "start"; + if (foldStyle == "markbeginend" + && this.foldingStopMarker + && this.foldingStopMarker.test(line)) + return "end"; + return ""; }; this.getFoldWidgetRange = function(session, foldStyle, row) { return null; }; - this.indentationBlock = function(session, row) { + this.indentationBlock = function(session, row, column) { var re = /^\s*/; var startRow = row; var endRow = row; var line = session.getLine(row); - var startColumn = line.length - 1; + var startColumn = column || line.length; var startLevel = line.match(re)[0].length; var maxRow = session.getLength() @@ -113,21 +107,6 @@ var FoldMode = exports.FoldMode = function() {}; return Range.fromPoints(start, end); }; - this.$testStart = function(session, foldStyle, row) { - if (this.foldingStartMarker.test(session.getLine(row))) - return "start"; - return ""; - }; - - this.$testBoth = function(session, foldStyle, row) { - var line = session.getLine(row); - if (this.foldingStartMarker.test(line)) - return "start"; - if (foldStyle == "markbeginend" && this.foldingStopMarker.test(line)) - return "end"; - return ""; - }; - }).call(FoldMode.prototype); }); diff --git a/lib/ace/mode/folding/pythonic.js b/lib/ace/mode/folding/pythonic.js index 2bfecfd2..c76588a0 100644 --- a/lib/ace/mode/folding/pythonic.js +++ b/lib/ace/mode/folding/pythonic.js @@ -54,7 +54,7 @@ oop.inherits(FoldMode, BaseFoldMode); if (match[1]) return this.openingBracketBlock(session, match[1], row, match.index); - return this.indentationBlock(session, row) + return this.indentationBlock(session, row, match.index + 1); } } diff --git a/lib/ace/mode/folding/pythonic_test.js b/lib/ace/mode/folding/pythonic_test.js new file mode 100644 index 00000000..1b667f9b --- /dev/null +++ b/lib/ace/mode/folding/pythonic_test.js @@ -0,0 +1,99 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +if (typeof process !== "undefined") + require("amd-loader"); + +define(function(require, exports, module) { + +var PythonMode = require("../python").Mode; +var EditSession = require("../../edit_session").EditSession; +var assert = require("../../test/assertions"); + +module.exports = { + + "test: bracket folding": function() { + var session = new EditSession([ + '[ #-', + 'stuff', + ']', + '[ ' + ]); + + var mode = new PythonMode(); + session.setFoldStyle("markbeginend"); + session.setMode(mode); + + assert.equal(session.getFoldWidget(0), "start"); + assert.equal(session.getFoldWidget(1), ""); + assert.equal(session.getFoldWidget(2), ""); + assert.equal(session.getFoldWidget(3), "start"); + + assert.range(session.getFoldWidgetRange(0), 0, 1, 2, 0); + assert.equal(session.getFoldWidgetRange(3), null); + }, + + "test: indentation folding": function() { + var session = new EditSession([ + 'def a: #', + '', + ' b:', + ' c', + ' ', + ' c', + '', + ' ', + '' + ]); + + var mode = new PythonMode(); + session.setFoldStyle("markbeginend"); + session.setMode(mode); + + assert.equal(session.getFoldWidget(0), "start"); + assert.equal(session.getFoldWidget(1), ""); + assert.equal(session.getFoldWidget(2), "start"); + + assert.range(session.getFoldWidgetRange(0), 0, 6, 5, 3); + assert.range(session.getFoldWidgetRange(2), 2, 3, 5, 3); + } +}; + +}); + +if (typeof module !== "undefined" && module === require.main) + require("asyncjs").test.testcase(module.exports).exec(); \ No newline at end of file diff --git a/lib/ace/mode/folding/xml.js b/lib/ace/mode/folding/xml.js index e4af4878..eb868b26 100644 --- a/lib/ace/mode/folding/xml.js +++ b/lib/ace/mode/folding/xml.js @@ -217,13 +217,12 @@ oop.inherits(FoldMode, BaseFoldMode); if (tag.closing) { this._pop(stack, tag); if (stack.length == 0) - break; + return Range.fromPoints(start, tag.start); } else { stack.push(tag) } } - return Range.fromPoints(start, tag.start); } else { var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); @@ -244,15 +243,15 @@ oop.inherits(FoldMode, BaseFoldMode); if (!tag.closing) { this._pop(stack, tag); - if (stack.length == 0) - break; + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } } else { stack.push(tag) } } - tag.start.column += tag.tagName.length + 2; - return Range.fromPoints(tag.start, end); } }; diff --git a/lib/ace/mode/html_highlight_rules.js b/lib/ace/mode/html_highlight_rules.js index 04fe428f..352a08bb 100644 --- a/lib/ace/mode/html_highlight_rules.js +++ b/lib/ace/mode/html_highlight_rules.js @@ -49,7 +49,7 @@ var HtmlHighlightRules = function() { // regexps are ordered -> the first match is used this.$rules = { start : [{ - token : "meta.tag", + token : "text", merge : true, regex : "<\\!\\[CDATA\\[", next : "cdata" @@ -63,11 +63,11 @@ var HtmlHighlightRules = function() { next : "comment" }, { token : "meta.tag", - regex : "<(?=\s*script)", + regex : "<(?=\s*script\\b)", next : "script" }, { token : "meta.tag", - regex : "<(?=\s*style)", + regex : "<(?=\s*style\\b)", next : "css" }, { token : "meta.tag", // opening tag diff --git a/lib/ace/mouse/default_handlers.js b/lib/ace/mouse/default_handlers.js index e7056e1c..71973b0a 100644 --- a/lib/ace/mouse/default_handlers.js +++ b/lib/ace/mouse/default_handlers.js @@ -108,7 +108,7 @@ function DefaultHandlers(editor) { var mousePageX = pageX, mousePageY = pageY; var mousedownTime = (new Date()).getTime(); - var dragCursor, dragRange; + var dragCursor, dragRange, dragSelectionMarker; var onMouseSelection = function(e) { mousePageX = event.getDocumentX(e); @@ -175,7 +175,7 @@ function DefaultHandlers(editor) { state = STATE_DRAG; dragRange = editor.getSelectionRange(); var style = editor.getSelectionStyle(); - editor.session.addMarker(dragRange, "ace_selection", style); + dragSelectionMarker = editor.session.addMarker(dragRange, "ace_selection", style); editor.clearSelection(); dom.addCssClass(editor.container, "ace_dragging"); } diff --git a/lib/ace/test/all_browser.js b/lib/ace/test/all_browser.js index 6af75012..9c7a2384 100644 --- a/lib/ace/test/all_browser.js +++ b/lib/ace/test/all_browser.js @@ -37,6 +37,10 @@ var tests = [ require("ace/mode/text_test"), require("ace/mode/xml_test"), require("ace/mode/xml_tokenizer_test"), + require("ace/mode/folding/cstyle_test"), + require("ace/mode/folding/html_test"), + require("ace/mode/folding/pythonic_test"), + require("ace/mode/folding/xml_test"), require("ace/range_test"), require("ace/search_test"), require("ace/selection_test"),