diff --git a/demo/static-highlighter/client-noconflict.html b/demo/static-highlighter/client-noconflict.html index fa9d345d..ee589679 100644 --- a/demo/static-highlighter/client-noconflict.html +++ b/demo/static-highlighter/client-noconflict.html @@ -19,9 +19,10 @@

Syntax highlighting using Ace language modes and themes.

-
+
.code { width: 50%; + position: relative; white-space: pre-wrap; } @@ -41,28 +42,20 @@ function wobble (flam) { diff --git a/lib/ace/css/editor.css b/lib/ace/css/editor.css index 277cd161..96cc27d7 100644 --- a/lib/ace/css/editor.css +++ b/lib/ace/css/editor.css @@ -231,10 +231,6 @@ border-left-width: 1px; } -.ace_line { - white-space: nowrap; -} - .ace_marker-layer .ace_step, .ace_marker-layer .ace_stack { position: absolute; z-index: 3; diff --git a/lib/ace/ext/static_highlight.js b/lib/ace/ext/static_highlight.js index 2119653a..56588f14 100644 --- a/lib/ace/ext/static_highlight.js +++ b/lib/ace/ext/static_highlight.js @@ -36,6 +36,49 @@ var TextLayer = require("../layer/text").Text; var baseStyles = require("../requirejs/text!./static.css"); var config = require("../config"); var dom = require("../lib/dom"); + + +var highlight = function(el, opts, callback) { + 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); + if (opts.trim) + data = data.trim(); + } + + highlight.render(data, mode, theme, opts.firstLineNumber, !opts.showGutter, 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(node); + } + callback && callback(); + }); +}; + /** * Transforms a given input code snippet into HTML using the given mode * @@ -56,7 +99,7 @@ var dom = require("../lib/dom"); * @returns {object} An object containing the properties `html` and `css`. */ -exports.render = function(input, mode, theme, lineStart, disableGutter, callback) { +highlight.render = function(input, mode, theme, lineStart, disableGutter, callback) { var waiting = 0; var modeCache = EditSession.prototype.$modes; @@ -81,7 +124,7 @@ exports.render = function(input, mode, theme, lineStart, disableGutter, callback // loads or passes the specified mode module then calls renderer function done() { - var result = exports.renderSync(input, mode, theme, lineStart, disableGutter); + var result = highlight.renderSync(input, mode, theme, lineStart, disableGutter); return callback ? callback(result) : result; } return waiting || done(); @@ -95,7 +138,7 @@ exports.render = function(input, mode, theme, lineStart, disableGutter, callback * @returns {object} An object containing: html, css */ -exports.renderSync = function(input, mode, theme, lineStart, disableGutter) { +highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) { lineStart = parseInt(lineStart || 1, 10); var session = new EditSession(""); @@ -119,7 +162,7 @@ exports.renderSync = function(input, mode, theme, lineStart, disableGutter) { if (!disableGutter) stringBuilder.push("" + (ix + lineStart) + ""); textLayer.$renderLine(stringBuilder, ix, true, false); - stringBuilder.push("
"); + stringBuilder.push("\n
"); } // let's prepare the whole html @@ -133,48 +176,11 @@ exports.renderSync = function(input, mode, theme, lineStart, disableGutter) { return { css: baseStyles + theme.cssText, - html: html + html: html, + session: session }; }; - - -exports.highlight = function(el, opts, callback) { - 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]); - } - callback && callback(); - }); -}; +module.exports = highlight; +module.exports.highlight =highlight; }); diff --git a/lib/ace/ext/static_highlight_test.js b/lib/ace/ext/static_highlight_test.js index bdbecbfc..63f0ebc3 100644 --- a/lib/ace/ext/static_highlight_test.js +++ b/lib/ace/ext/static_highlight_test.js @@ -28,7 +28,14 @@ module.exports = { var mode = new JavaScriptMode(); var result = highlighter.render(snippet, mode, theme); - assert.equal(result.html, "
1/**\xa0this\xa0is\xa0a\xa0function
2*
3*/
4function\xa0hello\xa0(a,\xa0b,\xa0c)\xa0{
5\xa0\xa0\xa0\xa0console.log(a\xa0*\xa0b\xa0+\xa0c\xa0+\xa0'sup$');
6}
"); + assert.equal(result.html, "
" + + "
1/**\xa0this\xa0is\xa0a\xa0function\n
" + + "
2*\n
" + + "
3*/\n
" + + "
4function\xa0hello\xa0(a,\xa0b,\xa0c)\xa0{\n
" + + "
5\xa0\xa0\xa0\xa0console.log(a\xa0*\xa0b\xa0+\xa0c\xa0+\xa0'sup$');\n
" + + "
6}\n
" + + "
"); assert.ok(!!result.css); next(); },