diff --git a/lib/ace/serversidehighlighter.js b/lib/ace/serversidehighlighter.js new file mode 100644 index 00000000..c1ef873a --- /dev/null +++ b/lib/ace/serversidehighlighter.js @@ -0,0 +1,91 @@ +if (typeof process !== "undefined") { + require("../../support/paths"); + require("ace/test/mockdom"); +} + +var theme = require("ace/theme/tomorrow"); +var EditSession = require("ace/edit_session").EditSession; +var Editor = require("ace/editor").Editor; +var MockRenderer = require("ace/test/mockrenderer").MockRenderer; +var TextLayer = require("ace/layer/text").Text; + +/** Ace highlighting but server side + */ +var ServerSideHighlighter = module.exports = function() { +}; + +(function () { + + /** Returns a mode from /ace/mode based on a filename + * + * @param {string} fileName name of the file without directory information + * @returns {mode} A mode that can highlight the given file, or TextMode if nothing matched + */ + function getMode (fileName) { + var extension = fileName.match(/\.(\w+)$/)[1]; + + switch (extension) { + case "js": + var JavascriptMode = require("ace/mode/javascript").Mode; + return new JavascriptMode(); + default: + var TextMode = require("ace/mode/text").Mode; + return new TextMode(); + } + } + + /** 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 + */ + function render (input, mode, theme) { + var session = new EditSession(""); + session.setMode(mode);// || new JavaScriptMode()); + + var editor = new Editor(new MockRenderer(), session); + var textLayer = new TextLayer(document.createElement("div")); + textLayer.setSession(session); + textLayer.config = { + characterWidth: 10, + lineHeight: 20 + }; + + session.setValue(input); + + var stringBuilder = [], length = session.getLength(); + var tokens = session.getTokens(0, length - 1); + + for(var ix = 0; ix < length; ix++) { + var lineTokens = tokens[ix].tokens; + stringBuilder.push("" + (ix+1) + ""); + textLayer.$renderLine(stringBuilder, 0, lineTokens, true); + stringBuilder.push("
"); + } + + // let's prepare the whole html + var html = "
\ +
\ + :code\ +
\ +
".replace(/:cssClass/, theme.cssClass).replace(/:code/, stringBuilder.join("")); + + return { + css: theme.cssText, + html: html + }; + } + + this.getMode = getMode; + this.render = render; +}).call(ServerSideHighlighter.prototype); + +//"/**\n\ +// * juhu\n\ +// * kinner \n\ +// */\n\ +// function a(b) {\n\ +// return b;\n\ +// }" \ No newline at end of file diff --git a/lib/ace/serversidehighlighter_test.js b/lib/ace/serversidehighlighter_test.js new file mode 100644 index 00000000..cf461bfb --- /dev/null +++ b/lib/ace/serversidehighlighter_test.js @@ -0,0 +1,101 @@ +require("../../support/paths"); + +var assert = require("assert"); +var ServerSideHighlighter = require("./serversidehighlighter"); + +// Execution ORDER: test.setUpSuite, setUp, testFn, tearDown, test.tearDownSuite +module.exports = { + timeout: 10000, + + dispatcher: null, + req: null, + res: null, + highlighter: null, + + setUpSuite: function (next) { + this.highlighter = new ServerSideHighlighter(); + next(); + }, + + setUp: function(next) { + next(); + }, + + tearDown: function(next) { + next(); + }, + + "test extension js": function(next) { + var JavascriptMode = require("ace/mode/javascript").Mode + assert.equal(this.highlighter.getMode("jan.js") instanceof JavascriptMode, true); + next(); + }, + + "test extension unknown": function(next) { + var TextMode = require("ace/mode/text").Mode + assert.equal(this.highlighter.getMode("jan.unknown") instanceof TextMode, true); + next(); + }, + + "test simple snippet": function(next) { + var theme = require("ace/theme/tomorrow"); + var snippet = "/** this is a function\n\ +*\n\ +*/\n\ +function hello (a, b, c) {\n\ + console.log(a * b + c + 'sup?');\n\ +}"; + var mode = this.highlighter.getMode("some.js"); + + var isError = false, result; + try { + result = this.highlighter.render(snippet, mode, theme); + } + catch (e) { + console.log(e); + isError = true; + } + // todo: write something more meaningful + assert.equal(isError, false); + + next(); + }, + + "test css from theme is used": function(next) { + var theme = require("ace/theme/tomorrow"); + var snippet = "/** this is a function\n\ +*\n\ +*/\n\ +function hello (a, b, c) {\n\ + console.log(a * b + c + 'sup?');\n\ +}"; + var mode = this.highlighter.getMode("some.js"); + + var isError = false, result; + result = this.highlighter.render(snippet, mode, theme); + + assert.equal(result.css, theme.cssText); + + next(); + }, + + "test theme classname should be in output html": function (next) { + var theme = require("ace/theme/tomorrow"); + var snippet = "/** this is a function\n\ +*\n\ +*/\n\ +function hello (a, b, c) {\n\ + console.log(a * b + c + 'sup?');\n\ +}"; + var mode = this.highlighter.getMode("some.js"); + + var isError = false, result; + result = this.highlighter.render(snippet, mode, theme); + + assert.equal(!!result.html.match(/
/), true); + + next(); + } +}; + +!module.parent && require("asyncjs").test.testcase(module.exports, "ServerSideHighlighter").exec(); diff --git a/lib/ace/theme/clouds.js b/lib/ace/theme/clouds.js index b3484bf6..945323f3 100644 --- a/lib/ace/theme/clouds.js +++ b/lib/ace/theme/clouds.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssClass = "ace-clouds"; exports.cssText = ".ace-clouds .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ @@ -251,4 +253,8 @@ exports.cssText = ".ace-clouds .ace_editor {\ \ }"; + if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); + } + }); diff --git a/lib/ace/theme/clouds_midnight.js b/lib/ace/theme/clouds_midnight.js index 14c4d8e7..3234b44e 100644 --- a/lib/ace/theme/clouds_midnight.js +++ b/lib/ace/theme/clouds_midnight.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssClass = "ace-clouds-midnight"; exports.cssText = ".ace-clouds-midnight .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ @@ -252,4 +254,8 @@ background-color:#E92E2E;\ \ }"; + if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); + } + }); diff --git a/lib/ace/theme/cobalt.js b/lib/ace/theme/cobalt.js index 95da2d2e..64b9a602 100644 --- a/lib/ace/theme/cobalt.js +++ b/lib/ace/theme/cobalt.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssClass = "ace-cobalt"; exports.cssText = ".ace-cobalt .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ @@ -254,4 +256,8 @@ background-color:#001221;\ \ }"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/crimson_editor.js b/lib/ace/theme/crimson_editor.js index 52a11c1e..71e50099 100644 --- a/lib/ace/theme/crimson_editor.js +++ b/lib/ace/theme/crimson_editor.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-crimson-editor .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -195,4 +197,8 @@ exports.cssText = ".ace-crimson-editor .ace_editor {\ exports.cssClass = "ace-crimson-editor"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/dawn.js b/lib/ace/theme/dawn.js index 9a6e8a17..b5fe33ec 100644 --- a/lib/ace/theme/dawn.js +++ b/lib/ace/theme/dawn.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-dawn .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -258,4 +260,8 @@ color:#5A525F;\ exports.cssClass = "ace-dawn"; + +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} }); diff --git a/lib/ace/theme/eclipse.js b/lib/ace/theme/eclipse.js index e7d63601..52160782 100644 --- a/lib/ace/theme/eclipse.js +++ b/lib/ace/theme/eclipse.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-eclipse .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -143,4 +145,8 @@ exports.cssText = ".ace-eclipse .ace_editor {\ exports.cssClass = "ace-eclipse"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/idle_fingers.js b/lib/ace/theme/idle_fingers.js index f1d5d4fb..73590aa6 100644 --- a/lib/ace/theme/idle_fingers.js +++ b/lib/ace/theme/idle_fingers.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-idle-fingers .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -255,4 +257,8 @@ background-color:#FFF980; \ exports.cssClass = "ace-idle-fingers"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/kr_theme.js b/lib/ace/theme/kr_theme.js index 88b54cc6..5bab379f 100644 --- a/lib/ace/theme/kr_theme.js +++ b/lib/ace/theme/kr_theme.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-kr-theme .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -254,4 +256,8 @@ color:#706D5B;\ exports.cssClass = "ace-kr-theme"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/merbivore.js b/lib/ace/theme/merbivore.js index 00c2290d..73fecdc1 100644 --- a/lib/ace/theme/merbivore.js +++ b/lib/ace/theme/merbivore.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-merbivore .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -246,4 +248,8 @@ background-color:#990000;\ exports.cssClass = "ace-merbivore"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/merbivore_soft.js b/lib/ace/theme/merbivore_soft.js index dd82e044..40d0fdbe 100644 --- a/lib/ace/theme/merbivore_soft.js +++ b/lib/ace/theme/merbivore_soft.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-merbivore-soft .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -246,4 +248,8 @@ background-color:#FE3838;\ exports.cssClass = "ace-merbivore-soft"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/mono_industrial.js b/lib/ace/theme/mono_industrial.js index 596344ee..4b6f88e8 100644 --- a/lib/ace/theme/mono_industrial.js +++ b/lib/ace/theme/mono_industrial.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-mono-industrial .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -254,4 +256,8 @@ background-color:#151C19;\ exports.cssClass = "ace-mono-industrial"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/monokai.js b/lib/ace/theme/monokai.js index ad8a325f..aadd5d4b 100644 --- a/lib/ace/theme/monokai.js +++ b/lib/ace/theme/monokai.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-monokai .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -254,4 +256,8 @@ background-color:#AE81FF;\ exports.cssClass = "ace-monokai"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/pastel_on_dark.js b/lib/ace/theme/pastel_on_dark.js index 78e74b5a..e330ea43 100644 --- a/lib/ace/theme/pastel_on_dark.js +++ b/lib/ace/theme/pastel_on_dark.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-pastel-on-dark .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -195,4 +197,8 @@ color:#D2A8A1;\ exports.cssClass = "ace-pastel-on-dark"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/solarized_dark.js b/lib/ace/theme/solarized_dark.js index 2e66818d..c0a8e30d 100644 --- a/lib/ace/theme/solarized_dark.js +++ b/lib/ace/theme/solarized_dark.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-solarized-dark .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -253,4 +255,8 @@ color:#657B83;\ exports.cssClass = "ace-solarized-dark"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/solarized_light.js b/lib/ace/theme/solarized_light.js index a3b63348..59ab4207 100644 --- a/lib/ace/theme/solarized_light.js +++ b/lib/ace/theme/solarized_light.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-solarized-light .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -252,4 +254,8 @@ exports.cssText = ".ace-solarized-light .ace_editor {\ exports.cssClass = "ace-solarized-light"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/textmate.js b/lib/ace/theme/textmate.js index 66df6924..6893416f 100644 --- a/lib/ace/theme/textmate.js +++ b/lib/ace/theme/textmate.js @@ -37,6 +37,7 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); exports.cssClass = "ace-tm"; exports.cssText = ".ace-tm .ace_editor {\ @@ -206,4 +207,7 @@ exports.cssText = ".ace-tm .ace_editor {\ color: rgb(255, 0, 0)\ }"; + if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); + } }); diff --git a/lib/ace/theme/tomorrow.js b/lib/ace/theme/tomorrow.js index e91cd3c5..1dd507d3 100644 --- a/lib/ace/theme/tomorrow.js +++ b/lib/ace/theme/tomorrow.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-tomorrow .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -253,4 +255,8 @@ background-color:#8959A8;\ }"; exports.cssClass = "ace-tomorrow"; + + if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); + } }); \ No newline at end of file diff --git a/lib/ace/theme/tomorrow_night.js b/lib/ace/theme/tomorrow_night.js index 221aefcc..abd6c74b 100644 --- a/lib/ace/theme/tomorrow_night.js +++ b/lib/ace/theme/tomorrow_night.js @@ -254,8 +254,9 @@ background-color:#B798BF;\ \ }"; - // import CSS once - dom.importCssString(cssText); - exports.cssClass = "ace-tomorrow-night"; + + if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); + } }); \ No newline at end of file diff --git a/lib/ace/theme/tomorrow_night_blue.js b/lib/ace/theme/tomorrow_night_blue.js index b8766d26..dd74d761 100644 --- a/lib/ace/theme/tomorrow_night_blue.js +++ b/lib/ace/theme/tomorrow_night_blue.js @@ -254,8 +254,9 @@ background-color:#EBBBFF;\ \ }"; - // import CSS once - dom.importCssString(cssText); - exports.cssClass = "ace-tomorrow-night-blue"; + + if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); + } }); \ No newline at end of file diff --git a/lib/ace/theme/tomorrow_night_bright.js b/lib/ace/theme/tomorrow_night_bright.js index 3072559f..efe98875 100644 --- a/lib/ace/theme/tomorrow_night_bright.js +++ b/lib/ace/theme/tomorrow_night_bright.js @@ -254,8 +254,9 @@ background-color:#B798BF;\ \ }"; - // import CSS once - dom.importCssString(cssText); - exports.cssClass = "ace-tomorrow-night-bright"; + + if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); + } }); \ No newline at end of file diff --git a/lib/ace/theme/tomorrow_night_eighties.js b/lib/ace/theme/tomorrow_night_eighties.js index 6dd7dcf0..3536f67b 100644 --- a/lib/ace/theme/tomorrow_night_eighties.js +++ b/lib/ace/theme/tomorrow_night_eighties.js @@ -254,8 +254,9 @@ background-color:#CC99CC;\ \ }"; - // import CSS once - dom.importCssString(cssText); - exports.cssClass = "ace-tomorrow-night-eighties"; + + if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); + } }); \ No newline at end of file diff --git a/lib/ace/theme/twilight.js b/lib/ace/theme/twilight.js index 04c15ebb..d572309f 100644 --- a/lib/ace/theme/twilight.js +++ b/lib/ace/theme/twilight.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssClass = "ace-twilight"; exports.cssText = ".ace-twilight .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ @@ -255,4 +257,8 @@ color:#5F5A60;\ \ }"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + }); diff --git a/lib/ace/theme/vibrant_ink.js b/lib/ace/theme/vibrant_ink.js index 292a11ad..0a993f1c 100644 --- a/lib/ace/theme/vibrant_ink.js +++ b/lib/ace/theme/vibrant_ink.js @@ -37,6 +37,8 @@ define(function(require, exports, module) { +var dom = require("pilot/dom"); + exports.cssText = ".ace-vibrant-ink .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ @@ -255,4 +257,8 @@ color:#99CC99;\ exports.cssClass = "ace-vibrant-ink"; +if (dom && dom.importCssString) { + dom.importCssString(exports.cssText); +} + });