From 285afeb4f2969596d0ebae7f50ce8b6731a50583 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Thu, 1 Dec 2011 16:44:55 +0100 Subject: [PATCH] handle void elements in html folding --- lib/ace/edit_session/folding.js | 52 ++++++++++++++++++++++++++++- lib/ace/mode/html_tokenizer_test.js | 2 +- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index 46aacfea..170a82e4 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -771,6 +771,26 @@ Folding.commonFoldingRules = { "indentation": null, "xml": { + + voidElements: { + "area": 1, + "base": 1, + "br": 1, + "col": 1, + "command": 1, + "embed": 1, + "hr": 1, + "img": 1, + "input": 1, + "keygen": 1, + "link": 1, + "meta": 1, + "param": 1, + "source": 1, + "track": 1, + "wbr": 1 + }, + getFoldWidget: function(row) { var tags = this.getTokens(row, row)[0].tokens .filter(function(token) { @@ -786,8 +806,9 @@ Folding.commonFoldingRules = { var fold = tags[0]; - if (!fold) + if (!fold || Folding.commonFoldingRules.xml.voidElements[fold]) return; + if (fold.charAt(0) == "/") return "end"; @@ -805,12 +826,38 @@ Folding.commonFoldingRules = { var step = "stepForward"; var isBack = false; + // http://dev.w3.org/html5/spec/syntax.html#optional-tags + // TODO +// var optionalTags = { +// "html": 1, +// "head": 1, +// "body": 1, +// "li": 1, +// "dt": 1, +// "dd": 1, +// "p": 1, +// "rt": 1, +// "rp": 1, +// "optgroup": 1, +// "option": 1, +// "colgroup": 1, +// "thead": 1, +// "tbody": 1, +// "tfoot": 1, +// "tr": 1, +// "td": 1, +// "th": 1 +// }; + do { var token = iterator.getCurrentToken(); var value = token.value.trim(); if (token && token.type == "meta.tag" && token.value !== ">") { var tagName = value.replace(/^[<\s]*|[\s*>]$/g, ""); + if (Folding.commonFoldingRules.xml.voidElements[tagName]) + continue; + if (!start) { if (tagName.charAt(0) == "/") { tagName = tagName.slice(1); @@ -823,6 +870,7 @@ Folding.commonFoldingRules = { column: iterator.getCurrentTokenColumn() + (isBack ? 0 : value.length + 1) }; + console.log("push", tagName) stack.push(tagName); } else { @@ -835,6 +883,7 @@ Folding.commonFoldingRules = { if (close) { if (stack[stack.length-1] == tagName) { + console.log("pop", tagName) stack.pop(); if (stack.length == 0) { end = { @@ -852,6 +901,7 @@ Folding.commonFoldingRules = { } } else { + console.log("push", tagName) stack.push(tagName); } } diff --git a/lib/ace/mode/html_tokenizer_test.js b/lib/ace/mode/html_tokenizer_test.js index c939e2a5..ec96dc49 100644 --- a/lib/ace/mode/html_tokenizer_test.js +++ b/lib/ace/mode/html_tokenizer_test.js @@ -85,5 +85,5 @@ module.exports = { }); if (typeof module !== "undefined" && module === require.main) { - require("asyncjs").test.testcase(module.exports).exec() + require("asyncjs").test.testcase(module.exports).exec(); } \ No newline at end of file