diff --git a/doc/site/js/main.js b/doc/site/js/main.js index 7e564fbf..4762bab6 100644 --- a/doc/site/js/main.js +++ b/doc/site/js/main.js @@ -168,14 +168,6 @@ function highlight() { var m = el.className.match(/language-(\w+)|(javascript)/); if (!m) return var mode = "ace/mode/" + (m[1] || m[2]); - var theme = "ace/theme/xcode"; - var data = dom.getInnerText(el).trim(); - - highlighter.render(data, mode, theme, 1, true, function (highlighted) { - dom.importCssString(highlighted.css, "ace_highlight"); - el.innerHTML = highlighted.html; - }); + highlighter.highlight(el, {mode: mode, theme: "ace/theme/xcode"}) }); - - } \ No newline at end of file diff --git a/index.html b/index.html index fb658135..59504235 100644 --- a/index.html +++ b/index.html @@ -9,8 +9,8 @@ - - + + diff --git a/lib/ace/ext/static_highlight.js b/lib/ace/ext/static_highlight.js index 2729bf04..43ee2ec9 100644 --- a/lib/ace/ext/static_highlight.js +++ b/lib/ace/ext/static_highlight.js @@ -35,6 +35,7 @@ var EditSession = require("../edit_session").EditSession; var TextLayer = require("../layer/text").Text; var baseStyles = require("../requirejs/text!./static.css"); var config = require("../config"); +var dom = require("../lib/dom"); /** * Transforms a given input code snippet into HTML using the given mode * @@ -86,13 +87,13 @@ exports.render = function(input, mode, theme, lineStart, disableGutter, callback return waiting || done(); }; -/* Transforms a given input code snippet into HTML using the given mode -* -* @param {string} input Code snippet -* @param {mode} mode Mode loaded from /ace/mode (use 'ServerSideHiglighter.getMode') -* @param {string} r Code snippet -* @returns {object} An object containing: html, css -*/ +/* + * Transforms a given input code snippet into HTML using the given mode + * @param {string} input Code snippet + * @param {mode} mode Mode loaded from /ace/mode (use 'ServerSideHiglighter.getMode') + * @param {string} r Code snippet + * @returns {object} An object containing: html, css + */ exports.renderSync = function(input, mode, theme, lineStart, disableGutter) { lineStart = parseInt(lineStart || 1, 10); @@ -136,4 +137,43 @@ exports.renderSync = function(input, mode, theme, lineStart, disableGutter) { }; }; + + +exports.highlight = function(el, opts) { + var m = el.className.match(/lang-(\w+)/); + var mode = opts.mode || m && ("ace/mode/" + m[1]); + if (!mode) + return false; + var theme = opts.theme || "ace/theme/textmate"; + + var data = ""; + var nodes = []; + + if (el.firstElementChild) { + var textLen = 0; + for (var i = 0; i < el.childNodes.length; i++) { + var ch = el.childNodes[i]; + if (ch.nodeType == 3) { + textLen += ch.data.length; + data += ch.data; + } else { + nodes.push(textLen, ch); + } + } + } else { + data = dom.getInnerText(el); + } + + exports.render(data, mode, theme, 1, true, function (highlighted) { + dom.importCssString(highlighted.css, "ace_highlight"); + el.innerHTML = highlighted.html; + var container = el.firstChild.firstChild + for (var i = 0; i < nodes.length; i += 2) { + var pos = highlighted.session.doc.indexToPosition(nodes[i]) + var node = nodes[i + 1]; + var lineEl = container.children[pos.row]; + lineEl && lineEl.appendChild(nodes[i+1]); + } + }); +}; });