diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index 0274cd58..a86c27ce 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -696,7 +696,8 @@ function Folding() { this.$foldMode = foldMode; - this.removeListener('change', this.$updateFoldWidgets); + this.off('change', this.$updateFoldWidgets); + this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); this._emit("changeAnnotation"); if (!foldMode || this.$foldStyle == "manual") { @@ -709,8 +710,9 @@ function Folding() { this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); this.on('change', this.$updateFoldWidgets); - + this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); }; this.getParentFoldRangeData = function (row, ignoreCurrent) { @@ -843,7 +845,13 @@ function Folding() { this.foldWidgets.splice.apply(this.foldWidgets, args); } }; - + this.tokenizerUpdateFoldWidgets = function(e) { + var rows = e.data; + if (rows.first != rows.last) { + if (this.foldWidgets.length > rows.first) + this.foldWidgets.splice(rows.first, this.foldWidgets.length); + } + } } exports.Folding = Folding; diff --git a/lib/ace/mode/folding/html_test.js b/lib/ace/mode/folding/html_test.js index 2698d936..3471ee57 100644 --- a/lib/ace/mode/folding/html_test.js +++ b/lib/ace/mode/folding/html_test.js @@ -153,6 +153,30 @@ module.exports = { assert.range(session.getFoldWidgetRange(0), 0, 5, 5, 0); assert.range(session.getFoldWidgetRange(5), 0, 5, 5, 0); + }, + + "test: fold multiple nested optional elements": function() { + var session = new EditSession([ + '

', + '

  • ', + '

    juhu', + '

    ', + 'kinners', + '

  • ' + ]); + + var mode = new HtmlMode(); + session.setMode(mode); + session.setFoldStyle("markbeginend"); + + assert.equal(session.getFoldWidget(0), "start"); + assert.equal(session.getFoldWidget(1), "start"); + assert.equal(session.getFoldWidget(2), "start"); + assert.equal(session.getFoldWidget(3), "start"); + assert.equal(session.getFoldWidget(4), ""); + assert.equal(session.getFoldWidget(5), "end"); + + assert.range(session.getFoldWidgetRange(1), 1, 4, 5, 0); } }; diff --git a/lib/ace/mode/folding/xml.js b/lib/ace/mode/folding/xml.js index 3a353eba..27f57a8c 100644 --- a/lib/ace/mode/folding/xml.js +++ b/lib/ace/mode/folding/xml.js @@ -192,9 +192,6 @@ function is(token, type) { if (!tag || top.tagName == tag.tagName) { return stack.pop(); } - else if (this.optionalEndTags.hasOwnProperty(tag.tagName)) { - return; - } else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { stack.pop(); continue; diff --git a/lib/ace/mode/php.js b/lib/ace/mode/php.js index a44e79c6..2754ef51 100644 --- a/lib/ace/mode/php.js +++ b/lib/ace/mode/php.js @@ -110,6 +110,7 @@ var Mode = function(opts) { "css-": CssMode, "php-": PhpMode }); + this.foldingRules.subModes["php-"] = new CStyleFoldMode(); }; oop.inherits(Mode, HtmlMode);