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 = "
".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);
+}
+
});