From 9c67add1d58d74698f19dcf023a8975fd80ba23f Mon Sep 17 00:00:00 2001 From: Jan Jongboom Date: Fri, 14 Oct 2011 12:39:52 +0200 Subject: [PATCH] dom reference --- lib/ace/serversidehighlighter.js | 91 +++++++++++++++++++++++ lib/ace/serversidehighlighter_test.js | 101 ++++++++++++++++++++++++++ lib/ace/theme/clouds.js | 2 + lib/ace/theme/clouds_midnight.js | 2 + lib/ace/theme/cobalt.js | 2 + lib/ace/theme/crimson_editor.js | 2 + lib/ace/theme/dawn.js | 2 + lib/ace/theme/eclipse.js | 2 + lib/ace/theme/idle_fingers.js | 2 + lib/ace/theme/kr_theme.js | 2 + lib/ace/theme/merbivore.js | 2 + lib/ace/theme/merbivore_soft.js | 2 + lib/ace/theme/mono_industrial.js | 2 + lib/ace/theme/monokai.js | 2 + lib/ace/theme/pastel_on_dark.js | 2 + lib/ace/theme/solarized_dark.js | 2 + lib/ace/theme/solarized_light.js | 2 + lib/ace/theme/textmate.js | 1 + lib/ace/theme/tomorrow.js | 2 + lib/ace/theme/twilight.js | 2 + lib/ace/theme/vibrant_ink.js | 2 + 21 files changed, 229 insertions(+) create mode 100644 lib/ace/serversidehighlighter.js create mode 100644 lib/ace/serversidehighlighter_test.js 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 1c55fb91..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);\ diff --git a/lib/ace/theme/clouds_midnight.js b/lib/ace/theme/clouds_midnight.js index 192584e8..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);\ diff --git a/lib/ace/theme/cobalt.js b/lib/ace/theme/cobalt.js index 6cbfb191..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);\ diff --git a/lib/ace/theme/crimson_editor.js b/lib/ace/theme/crimson_editor.js index 46e4e2ec..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);\ }\ diff --git a/lib/ace/theme/dawn.js b/lib/ace/theme/dawn.js index 444c1f4f..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);\ }\ diff --git a/lib/ace/theme/eclipse.js b/lib/ace/theme/eclipse.js index 4282e1b2..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);\ }\ diff --git a/lib/ace/theme/idle_fingers.js b/lib/ace/theme/idle_fingers.js index 271bbc0d..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);\ }\ diff --git a/lib/ace/theme/kr_theme.js b/lib/ace/theme/kr_theme.js index a64e11e0..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);\ }\ diff --git a/lib/ace/theme/merbivore.js b/lib/ace/theme/merbivore.js index f46f93b9..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);\ }\ diff --git a/lib/ace/theme/merbivore_soft.js b/lib/ace/theme/merbivore_soft.js index 5b3e56f4..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);\ }\ diff --git a/lib/ace/theme/mono_industrial.js b/lib/ace/theme/mono_industrial.js index 2caed103..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);\ }\ diff --git a/lib/ace/theme/monokai.js b/lib/ace/theme/monokai.js index 242efba5..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);\ }\ diff --git a/lib/ace/theme/pastel_on_dark.js b/lib/ace/theme/pastel_on_dark.js index bf17e762..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);\ }\ diff --git a/lib/ace/theme/solarized_dark.js b/lib/ace/theme/solarized_dark.js index e6612a76..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);\ }\ diff --git a/lib/ace/theme/solarized_light.js b/lib/ace/theme/solarized_light.js index 002751fc..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);\ }\ diff --git a/lib/ace/theme/textmate.js b/lib/ace/theme/textmate.js index e8164d98..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 {\ diff --git a/lib/ace/theme/tomorrow.js b/lib/ace/theme/tomorrow.js index ddbcb531..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);\ }\ diff --git a/lib/ace/theme/twilight.js b/lib/ace/theme/twilight.js index 01954694..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);\ diff --git a/lib/ace/theme/vibrant_ink.js b/lib/ace/theme/vibrant_ink.js index 71388b83..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);\ }\