From 9c612d2329109e0ad4d20b7daef172e3df0e87f8 Mon Sep 17 00:00:00 2001 From: Jan Jongboom Date: Wed, 12 Oct 2011 16:24:31 +0200 Subject: [PATCH 1/6] initial checkin --- lib/ace/test/mockrenderer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/ace/test/mockrenderer.js b/lib/ace/test/mockrenderer.js index 3c0c4342..ad8a24d7 100644 --- a/lib/ace/test/mockrenderer.js +++ b/lib/ace/test/mockrenderer.js @@ -161,4 +161,8 @@ MockRenderer.prototype.textToScreenCoordinates = function() { } }; +MockRenderer.prototype.adjustWrapLimit = function () { + +}; + }); From 5a808ac6a8d5658d9e68d1541cab1bd6975fdd74 Mon Sep 17 00:00:00 2001 From: Jan Jongboom Date: Wed, 12 Oct 2011 18:14:38 +0200 Subject: [PATCH 2/6] Highlighting feature of ace as a server side node module! --- lib/ace/serversidehighlighter.js | 91 +++++++++++++++++++++++ lib/ace/serversidehighlighter_test.js | 101 ++++++++++++++++++++++++++ lib/ace/theme/tomorrow.js | 7 +- 3 files changed, 193 insertions(+), 6 deletions(-) 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/tomorrow.js b/lib/ace/theme/tomorrow.js index 977c4d33..e91cd3c5 100644 --- a/lib/ace/theme/tomorrow.js +++ b/lib/ace/theme/tomorrow.js @@ -37,9 +37,7 @@ define(function(require, exports, module) { - var dom = require("pilot/dom"); - - var cssText = ".ace-tomorrow .ace_editor {\ + exports.cssText = ".ace-tomorrow .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ \ @@ -254,8 +252,5 @@ background-color:#8959A8;\ \ }"; - // import CSS once - dom.importCssString(cssText); - exports.cssClass = "ace-tomorrow"; }); \ No newline at end of file From 606963f424e584a4af2b03e1ad0acbe9666fdf0f Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Thu, 13 Oct 2011 11:22:19 +0200 Subject: [PATCH 3/6] move kitchen-sink demo into a separate directory --- Makefile | 6 +- Makefile.dryice.js | 14 ++--- demo/{ => kitchen-sink}/boot.js | 4 +- demo/{ => kitchen-sink}/demo.js | 54 +++++++++--------- demo/{ => kitchen-sink}/docs/clojure.clj | 0 .../docs/coffeescript.coffee | 0 demo/{ => kitchen-sink}/docs/coldfusion.cfm | 0 demo/{ => kitchen-sink}/docs/cpp.cpp | 0 demo/{ => kitchen-sink}/docs/csharp.cs | 0 demo/{ => kitchen-sink}/docs/css.css | 0 demo/{ => kitchen-sink}/docs/groovy.groovy | 0 demo/{ => kitchen-sink}/docs/html.html | 0 demo/{ => kitchen-sink}/docs/java.java | 0 demo/{ => kitchen-sink}/docs/javascript.js | 0 demo/{ => kitchen-sink}/docs/json.json | 0 demo/{ => kitchen-sink}/docs/latex.tex | 0 demo/{ => kitchen-sink}/docs/lua.lua | 0 demo/{ => kitchen-sink}/docs/markdown.md | 0 demo/{ => kitchen-sink}/docs/ocaml.ml | 0 demo/{ => kitchen-sink}/docs/perl.pl | 0 demo/{ => kitchen-sink}/docs/php.php | 0 demo/{ => kitchen-sink}/docs/plaintext.txt | 0 demo/{ => kitchen-sink}/docs/powershell.ps1 | 0 demo/{ => kitchen-sink}/docs/python.py | 0 demo/{ => kitchen-sink}/docs/ruby.rb | 0 demo/{ => kitchen-sink}/docs/scala.scala | 0 demo/{ => kitchen-sink}/docs/scss.scss | 0 demo/{ => kitchen-sink}/docs/sql.sql | 0 demo/{ => kitchen-sink}/docs/svg.svg | 0 demo/{ => kitchen-sink}/docs/textile.textile | 0 demo/{ => kitchen-sink}/docs/xml.xml | 0 demo/{ => kitchen-sink}/icons/Readme.txt | 0 demo/{ => kitchen-sink}/icons/epl.html | 0 demo/{ => kitchen-sink}/icons/error_obj.gif | Bin demo/{ => kitchen-sink}/icons/warning_obj.gif | Bin demo/{ => kitchen-sink}/logo.png | Bin demo/{ => kitchen-sink}/require.js | 0 demo/{ => kitchen-sink}/styles.css | 0 kitchen-sink.html | 18 +++--- 39 files changed, 47 insertions(+), 49 deletions(-) rename demo/{ => kitchen-sink}/boot.js (96%) rename demo/{ => kitchen-sink}/demo.js (90%) rename demo/{ => kitchen-sink}/docs/clojure.clj (100%) rename demo/{ => kitchen-sink}/docs/coffeescript.coffee (100%) rename demo/{ => kitchen-sink}/docs/coldfusion.cfm (100%) rename demo/{ => kitchen-sink}/docs/cpp.cpp (100%) rename demo/{ => kitchen-sink}/docs/csharp.cs (100%) rename demo/{ => kitchen-sink}/docs/css.css (100%) rename demo/{ => kitchen-sink}/docs/groovy.groovy (100%) rename demo/{ => kitchen-sink}/docs/html.html (100%) rename demo/{ => kitchen-sink}/docs/java.java (100%) rename demo/{ => kitchen-sink}/docs/javascript.js (100%) rename demo/{ => kitchen-sink}/docs/json.json (100%) rename demo/{ => kitchen-sink}/docs/latex.tex (100%) rename demo/{ => kitchen-sink}/docs/lua.lua (100%) rename demo/{ => kitchen-sink}/docs/markdown.md (100%) rename demo/{ => kitchen-sink}/docs/ocaml.ml (100%) rename demo/{ => kitchen-sink}/docs/perl.pl (100%) rename demo/{ => kitchen-sink}/docs/php.php (100%) rename demo/{ => kitchen-sink}/docs/plaintext.txt (100%) rename demo/{ => kitchen-sink}/docs/powershell.ps1 (100%) rename demo/{ => kitchen-sink}/docs/python.py (100%) rename demo/{ => kitchen-sink}/docs/ruby.rb (100%) rename demo/{ => kitchen-sink}/docs/scala.scala (100%) rename demo/{ => kitchen-sink}/docs/scss.scss (100%) rename demo/{ => kitchen-sink}/docs/sql.sql (100%) rename demo/{ => kitchen-sink}/docs/svg.svg (100%) rename demo/{ => kitchen-sink}/docs/textile.textile (100%) rename demo/{ => kitchen-sink}/docs/xml.xml (100%) rename demo/{ => kitchen-sink}/icons/Readme.txt (100%) rename demo/{ => kitchen-sink}/icons/epl.html (100%) rename demo/{ => kitchen-sink}/icons/error_obj.gif (100%) rename demo/{ => kitchen-sink}/icons/warning_obj.gif (100%) rename demo/{ => kitchen-sink}/logo.png (100%) rename demo/{ => kitchen-sink}/require.js (100%) rename demo/{ => kitchen-sink}/styles.css (100%) diff --git a/Makefile b/Makefile index dcedcb78..c3f94cde 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ build: git rev-parse HEAD > .git-ref mkdir -p build/src - mkdir -p build/demo + mkdir -p build/demo/kitchen-sink mkdir -p build/textarea/src - cp demo/styles.css build/demo/styles.css - cp demo/logo.png build/demo/logo.png + cp -r demo/kitchen-sink/styles.css build/demo/kitchen-sink/styles.css + cp demo/kitchen-sink/logo.png build/demo/kitchen-sink/logo.png ./Makefile.dryice.js normal ./Makefile.dryice.js bm diff --git a/Makefile.dryice.js b/Makefile.dryice.js index a2877f0c..a705fcf4 100755 --- a/Makefile.dryice.js +++ b/Makefile.dryice.js @@ -95,7 +95,7 @@ var aceProject = [ ]; if (target == "normal") { - aceProject.push(aceHome + '/demo'); + //aceProject.push(aceHome + '/demo'); copy({ source: "build_support/editor.html", @@ -349,7 +349,7 @@ function demo() { source: [ copy.source.commonjs({ project: project, - require: [ "pilot/index", "ace/defaults", "demo/boot" ] + require: [ "pilot/index", "ace/defaults", "demo/kitchen-sink/boot" ] }) ], filter: [ copy.filter.moduleDefines ], @@ -358,8 +358,7 @@ function demo() { copy({ source: { root: project, - include: /demo\/docs\/.*$/, - exclude: /tests?\// + include: /demo\/kitchen-sink\/docs\/.*$/, }, filter: [ copy.filter.addDefines ], dest: demo @@ -367,8 +366,7 @@ function demo() { copy({ source: { root: project, - include: /.*\.css$/, - exclude: /tests?\// + include: /ace\/.*\.css$/, }, filter: [ copy.filter.addDefines ], dest: demo @@ -377,11 +375,11 @@ function demo() { copy({ source: demo, filter: [ filterTextPlugin ], - dest: 'build/demo/kitchen-sink-uncompressed.js' + dest: 'build/demo/kitchen-sink/kitchen-sink-uncompressed.js' }); copy({ source: demo, filter: [ copy.filter.uglifyjs, filterTextPlugin ], - dest: 'build/demo/kitchen-sink.js' + dest: 'build/demo/kitchen-sink/kitchen-sink.js' }); } diff --git a/demo/boot.js b/demo/kitchen-sink/boot.js similarity index 96% rename from demo/boot.js rename to demo/kitchen-sink/boot.js index 93d9badb..a91c37e7 100644 --- a/demo/boot.js +++ b/demo/kitchen-sink/boot.js @@ -40,7 +40,7 @@ define(function(require, exports, module) { require("pilot/fixoldbrowsers"); require("pilot/plugin_manager"); require("pilot/environment"); -require("demo/demo"); +require("demo/kitchen-sink/demo"); require("pilot/index"); require("ace/defaults"); @@ -50,7 +50,7 @@ var catalog = require("pilot/plugin_manager").catalog; catalog.registerPlugins(plugins).then(function() { var env = require("pilot/environment").create(); catalog.startupPlugins({ env: env }).then(function() { - require("demo/demo").launch(env); + require("demo/kitchen-sink/demo").launch(env); }); }); diff --git a/demo/demo.js b/demo/kitchen-sink/demo.js similarity index 90% rename from demo/demo.js rename to demo/kitchen-sink/demo.js index 4723dff0..ab059f20 100644 --- a/demo/demo.js +++ b/demo/kitchen-sink/demo.js @@ -125,7 +125,7 @@ exports.launch = function(env) { modesByName[m.name] = m; }); - var loreIpsum = require("ace/requirejs/text!demo/docs/plaintext.txt"); + var loreIpsum = require("ace/requirejs/text!demo/kitchen-sink/docs/plaintext.txt"); for (var i = 0; i < 5; i++) { loreIpsum += loreIpsum; } @@ -133,108 +133,108 @@ exports.launch = function(env) { var docs = [ new Doc( "javascript", "JavaScript", - require("ace/requirejs/text!demo/docs/javascript.js") + require("ace/requirejs/text!demo/kitchen-sink/docs/javascript.js") ), new WrappedDoc("text", "Plain Text", loreIpsum), new Doc( "coffee", "Coffeescript", - require("ace/requirejs/text!demo/docs/coffeescript.coffee") + require("ace/requirejs/text!demo/kitchen-sink/docs/coffeescript.coffee") ), new Doc( "json", "JSON", - require("ace/requirejs/text!demo/docs/json.json") + require("ace/requirejs/text!demo/kitchen-sink/docs/json.json") ), new Doc( "css", "CSS", - require("ace/requirejs/text!demo/docs/css.css") + require("ace/requirejs/text!demo/kitchen-sink/docs/css.css") ), new Doc( "scss", "SCSS", - require("ace/requirejs/text!demo/docs/scss.scss") + require("ace/requirejs/text!demo/kitchen-sink/docs/scss.scss") ), new Doc( "html", "HTML", - require("ace/requirejs/text!demo/docs/html.html") + require("ace/requirejs/text!demo/kitchen-sink/docs/html.html") ), new Doc( "xml", "XML", - require("ace/requirejs/text!demo/docs/xml.xml") + require("ace/requirejs/text!demo/kitchen-sink/docs/xml.xml") ), new Doc( "svg", "SVG", - require("ace/requirejs/text!demo/docs/svg.svg") + require("ace/requirejs/text!demo/kitchen-sink/docs/svg.svg") ), new Doc( "php", "PHP", - require("ace/requirejs/text!demo/docs/php.php") + require("ace/requirejs/text!demo/kitchen-sink/docs/php.php") ), new Doc( "coldfusion", "ColdFusion", - require("ace/requirejs/text!demo/docs/coldfusion.cfm") + require("ace/requirejs/text!demo/kitchen-sink/docs/coldfusion.cfm") ), new Doc( "python", "Python", - require("ace/requirejs/text!demo/docs/python.py") + require("ace/requirejs/text!demo/kitchen-sink/docs/python.py") ), new Doc( "ruby", "Ruby", - require("ace/requirejs/text!demo/docs/ruby.rb") + require("ace/requirejs/text!demo/kitchen-sink/docs/ruby.rb") ), new Doc( "perl", "Perl", - require("ace/requirejs/text!demo/docs/perl.pl") + require("ace/requirejs/text!demo/kitchen-sink/docs/perl.pl") ), new Doc( "ocaml", "OCaml", - require("ace/requirejs/text!demo/docs/ocaml.ml") + require("ace/requirejs/text!demo/kitchen-sink/docs/ocaml.ml") ), new Doc( "lua", "Lua", - require("ace/requirejs/text!demo/docs/lua.lua") + require("ace/requirejs/text!demo/kitchen-sink/docs/lua.lua") ), new Doc( "java", "Java", - require("ace/requirejs/text!demo/docs/java.java") + require("ace/requirejs/text!demo/kitchen-sink/docs/java.java") ), new Doc( "clojure", "Clojure", - require("ace/requirejs/text!demo/docs/clojure.clj") + require("ace/requirejs/text!demo/kitchen-sink/docs/clojure.clj") ), new Doc( "groovy", "Groovy", - require("ace/requirejs/text!demo/docs/groovy.groovy") + require("ace/requirejs/text!demo/kitchen-sink/docs/groovy.groovy") ), new Doc( "scala", "Scala", - require("ace/requirejs/text!demo/docs/scala.scala") + require("ace/requirejs/text!demo/kitchen-sink/docs/scala.scala") ), new Doc( "csharp", "C#", - require("ace/requirejs/text!demo/docs/csharp.cs") + require("ace/requirejs/text!demo/kitchen-sink/docs/csharp.cs") ), new Doc( "powershell", "Powershell", - require("ace/requirejs/text!demo/docs/powershell.ps1") + require("ace/requirejs/text!demo/kitchen-sink/docs/powershell.ps1") ), new Doc( "c_cpp", "C/C++", - require("ace/requirejs/text!demo/docs/cpp.cpp") + require("ace/requirejs/text!demo/kitchen-sink/docs/cpp.cpp") ), new Doc( "markdown", "Markdown", - require("ace/requirejs/text!demo/docs/markdown.md") + require("ace/requirejs/text!demo/kitchen-sink/docs/markdown.md") ), new WrappedDoc( "markdown", "Markdown", - require("ace/requirejs/text!demo/docs/markdown.md") + require("ace/requirejs/text!demo/kitchen-sink/docs/markdown.md") ), new WrappedDoc( "textile", "Textile", - require("ace/requirejs/text!demo/docs/textile.textile") + require("ace/requirejs/text!demo/kitchen-sink/docs/textile.textile") ), new WrappedDoc( "latex", "LaTeX", - require("ace/requirejs/text!demo/docs/latex.tex") + require("ace/requirejs/text!demo/kitchen-sink/docs/latex.tex") ) ]; diff --git a/demo/docs/clojure.clj b/demo/kitchen-sink/docs/clojure.clj similarity index 100% rename from demo/docs/clojure.clj rename to demo/kitchen-sink/docs/clojure.clj diff --git a/demo/docs/coffeescript.coffee b/demo/kitchen-sink/docs/coffeescript.coffee similarity index 100% rename from demo/docs/coffeescript.coffee rename to demo/kitchen-sink/docs/coffeescript.coffee diff --git a/demo/docs/coldfusion.cfm b/demo/kitchen-sink/docs/coldfusion.cfm similarity index 100% rename from demo/docs/coldfusion.cfm rename to demo/kitchen-sink/docs/coldfusion.cfm diff --git a/demo/docs/cpp.cpp b/demo/kitchen-sink/docs/cpp.cpp similarity index 100% rename from demo/docs/cpp.cpp rename to demo/kitchen-sink/docs/cpp.cpp diff --git a/demo/docs/csharp.cs b/demo/kitchen-sink/docs/csharp.cs similarity index 100% rename from demo/docs/csharp.cs rename to demo/kitchen-sink/docs/csharp.cs diff --git a/demo/docs/css.css b/demo/kitchen-sink/docs/css.css similarity index 100% rename from demo/docs/css.css rename to demo/kitchen-sink/docs/css.css diff --git a/demo/docs/groovy.groovy b/demo/kitchen-sink/docs/groovy.groovy similarity index 100% rename from demo/docs/groovy.groovy rename to demo/kitchen-sink/docs/groovy.groovy diff --git a/demo/docs/html.html b/demo/kitchen-sink/docs/html.html similarity index 100% rename from demo/docs/html.html rename to demo/kitchen-sink/docs/html.html diff --git a/demo/docs/java.java b/demo/kitchen-sink/docs/java.java similarity index 100% rename from demo/docs/java.java rename to demo/kitchen-sink/docs/java.java diff --git a/demo/docs/javascript.js b/demo/kitchen-sink/docs/javascript.js similarity index 100% rename from demo/docs/javascript.js rename to demo/kitchen-sink/docs/javascript.js diff --git a/demo/docs/json.json b/demo/kitchen-sink/docs/json.json similarity index 100% rename from demo/docs/json.json rename to demo/kitchen-sink/docs/json.json diff --git a/demo/docs/latex.tex b/demo/kitchen-sink/docs/latex.tex similarity index 100% rename from demo/docs/latex.tex rename to demo/kitchen-sink/docs/latex.tex diff --git a/demo/docs/lua.lua b/demo/kitchen-sink/docs/lua.lua similarity index 100% rename from demo/docs/lua.lua rename to demo/kitchen-sink/docs/lua.lua diff --git a/demo/docs/markdown.md b/demo/kitchen-sink/docs/markdown.md similarity index 100% rename from demo/docs/markdown.md rename to demo/kitchen-sink/docs/markdown.md diff --git a/demo/docs/ocaml.ml b/demo/kitchen-sink/docs/ocaml.ml similarity index 100% rename from demo/docs/ocaml.ml rename to demo/kitchen-sink/docs/ocaml.ml diff --git a/demo/docs/perl.pl b/demo/kitchen-sink/docs/perl.pl similarity index 100% rename from demo/docs/perl.pl rename to demo/kitchen-sink/docs/perl.pl diff --git a/demo/docs/php.php b/demo/kitchen-sink/docs/php.php similarity index 100% rename from demo/docs/php.php rename to demo/kitchen-sink/docs/php.php diff --git a/demo/docs/plaintext.txt b/demo/kitchen-sink/docs/plaintext.txt similarity index 100% rename from demo/docs/plaintext.txt rename to demo/kitchen-sink/docs/plaintext.txt diff --git a/demo/docs/powershell.ps1 b/demo/kitchen-sink/docs/powershell.ps1 similarity index 100% rename from demo/docs/powershell.ps1 rename to demo/kitchen-sink/docs/powershell.ps1 diff --git a/demo/docs/python.py b/demo/kitchen-sink/docs/python.py similarity index 100% rename from demo/docs/python.py rename to demo/kitchen-sink/docs/python.py diff --git a/demo/docs/ruby.rb b/demo/kitchen-sink/docs/ruby.rb similarity index 100% rename from demo/docs/ruby.rb rename to demo/kitchen-sink/docs/ruby.rb diff --git a/demo/docs/scala.scala b/demo/kitchen-sink/docs/scala.scala similarity index 100% rename from demo/docs/scala.scala rename to demo/kitchen-sink/docs/scala.scala diff --git a/demo/docs/scss.scss b/demo/kitchen-sink/docs/scss.scss similarity index 100% rename from demo/docs/scss.scss rename to demo/kitchen-sink/docs/scss.scss diff --git a/demo/docs/sql.sql b/demo/kitchen-sink/docs/sql.sql similarity index 100% rename from demo/docs/sql.sql rename to demo/kitchen-sink/docs/sql.sql diff --git a/demo/docs/svg.svg b/demo/kitchen-sink/docs/svg.svg similarity index 100% rename from demo/docs/svg.svg rename to demo/kitchen-sink/docs/svg.svg diff --git a/demo/docs/textile.textile b/demo/kitchen-sink/docs/textile.textile similarity index 100% rename from demo/docs/textile.textile rename to demo/kitchen-sink/docs/textile.textile diff --git a/demo/docs/xml.xml b/demo/kitchen-sink/docs/xml.xml similarity index 100% rename from demo/docs/xml.xml rename to demo/kitchen-sink/docs/xml.xml diff --git a/demo/icons/Readme.txt b/demo/kitchen-sink/icons/Readme.txt similarity index 100% rename from demo/icons/Readme.txt rename to demo/kitchen-sink/icons/Readme.txt diff --git a/demo/icons/epl.html b/demo/kitchen-sink/icons/epl.html similarity index 100% rename from demo/icons/epl.html rename to demo/kitchen-sink/icons/epl.html diff --git a/demo/icons/error_obj.gif b/demo/kitchen-sink/icons/error_obj.gif similarity index 100% rename from demo/icons/error_obj.gif rename to demo/kitchen-sink/icons/error_obj.gif diff --git a/demo/icons/warning_obj.gif b/demo/kitchen-sink/icons/warning_obj.gif similarity index 100% rename from demo/icons/warning_obj.gif rename to demo/kitchen-sink/icons/warning_obj.gif diff --git a/demo/logo.png b/demo/kitchen-sink/logo.png similarity index 100% rename from demo/logo.png rename to demo/kitchen-sink/logo.png diff --git a/demo/require.js b/demo/kitchen-sink/require.js similarity index 100% rename from demo/require.js rename to demo/kitchen-sink/require.js diff --git a/demo/styles.css b/demo/kitchen-sink/styles.css similarity index 100% rename from demo/styles.css rename to demo/kitchen-sink/styles.css diff --git a/kitchen-sink.html b/kitchen-sink.html index 572e71c4..9c7a90d7 100644 --- a/kitchen-sink.html +++ b/kitchen-sink.html @@ -6,7 +6,7 @@ Ace Kitchen Sink - + - +
@@ -189,20 +189,20 @@ - + From 08de8b4aa1a0acf56fba18a82cc955cd4a4a00ca Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Thu, 13 Oct 2011 12:38:34 +0200 Subject: [PATCH 4/6] add static highlighter demos --- demo/static-highlighter/client.html | 48 ++++++++++ demo/static-highlighter/server.js | 36 +++++++ lib/ace/ext/static.css | 19 ++++ lib/ace/ext/static_highlight.js | 94 +++++++++++++++++++ .../static_highlight_test.js} | 53 +++-------- lib/ace/serversidehighlighter.js | 91 ------------------ 6 files changed, 210 insertions(+), 131 deletions(-) create mode 100644 demo/static-highlighter/client.html create mode 100644 demo/static-highlighter/server.js create mode 100644 lib/ace/ext/static.css create mode 100644 lib/ace/ext/static_highlight.js rename lib/ace/{serversidehighlighter_test.js => ext/static_highlight_test.js} (54%) delete mode 100644 lib/ace/serversidehighlighter.js diff --git a/demo/static-highlighter/client.html b/demo/static-highlighter/client.html new file mode 100644 index 00000000..561add80 --- /dev/null +++ b/demo/static-highlighter/client.html @@ -0,0 +1,48 @@ + + + + + + Static Code highlighter using Ace + + + + +

Client Side Syntax Highlighting

+ +

Syntax highlighting using Ace language modes and themes.

+ +
+ + + + + + diff --git a/demo/static-highlighter/server.js b/demo/static-highlighter/server.js new file mode 100644 index 00000000..a58b00b6 --- /dev/null +++ b/demo/static-highlighter/server.js @@ -0,0 +1,36 @@ +/** + * Simple node.js server, which generates the synax highlighted version of itself + * using the Ace modes and themes on the server and serving a static web page. + */ + +// include ace search path and modules +require("../../support/paths"); + +// load jsdom, which is required by Ace +require("ace/test/mockdom"); + +var http = require("http"); +var fs = require("fs"); + +// load the highlighter and the desired mode and theme +var highlighter = require("ace/ext/static_highlight"); +var JavaScriptMode = require("ace/mode/javascript").Mode; +var theme = require("ace/theme/twilight"); + +var port = process.env.PORT || 2222; + +http.createServer(function(req, res) { + res.writeHead(200, {"Content-Type": "text/html"}); + + fs.readFile(__filename, "utf8", function(err, data) { + var highlighted = highlighter.render(data, new JavaScriptMode(), theme); + res.end('\n\ +\n\ +:html:\n\ +'.replace(":css:", highlighted.css).replace(":html:", highlighted.html)); + }); +}).listen(port); + +console.log("Listening on port " + port); \ No newline at end of file diff --git a/lib/ace/ext/static.css b/lib/ace/ext/static.css new file mode 100644 index 00000000..c2842bf4 --- /dev/null +++ b/lib/ace/ext/static.css @@ -0,0 +1,19 @@ +.ace_editor { + font-family: 'Monaco', 'Menlo', 'Droid Sans Mono', 'Courier New', monospace; + font-size: 12px; +} + +.ace_editor .ace_gutter { + width: 20px; + display: inline-block; + text-align: right; + padding: 0 3px 0 0; + margin-right: 3px; +} + +*.ace_gutter-cell { + -moz-user-select: -moz-none; + -khtml-user-select: none; + -webkit-user-select: none; + user-select: none; +} \ No newline at end of file diff --git a/lib/ace/ext/static_highlight.js b/lib/ace/ext/static_highlight.js new file mode 100644 index 00000000..cec33bf4 --- /dev/null +++ b/lib/ace/ext/static_highlight.js @@ -0,0 +1,94 @@ +/* vim:ts=4:sts=4:sw=4: + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Jan Jongboom + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { + +var EditSession = require("ace/edit_session").EditSession; +var TextLayer = require("ace/layer/text").Text; +var baseStyles = require("ace/requirejs/text!ace/ext/static.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.render = function(input, mode, theme) { + var session = new EditSession(""); + session.setMode(mode); + session.setUseWorker(false); + + var textLayer = new TextLayer(document.createElement("div")); + textLayer.setSession(session); + textLayer.config = { + characterWidth: 10, + lineHeight: 20 + }; + + session.setValue(input); + + var stringBuilder = []; + var 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("")); + + textLayer.destroy(); + + return { + css: baseStyles + theme.cssText, + html: html + }; +}; + +}); \ No newline at end of file diff --git a/lib/ace/serversidehighlighter_test.js b/lib/ace/ext/static_highlight_test.js similarity index 54% rename from lib/ace/serversidehighlighter_test.js rename to lib/ace/ext/static_highlight_test.js index cf461bfb..e2658073 100644 --- a/lib/ace/serversidehighlighter_test.js +++ b/lib/ace/ext/static_highlight_test.js @@ -1,42 +1,16 @@ -require("../../support/paths"); +if (typeof process !== "undefined") { + require("../../../support/paths"); + require("ace/test/mockdom"); +} var assert = require("assert"); -var ServerSideHighlighter = require("./serversidehighlighter"); +var highlighter = require("./static_highlight"); +var JavaScriptMode = require("ace/mode/javascript").Mode; // 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\ @@ -45,11 +19,11 @@ module.exports = { function hello (a, b, c) {\n\ console.log(a * b + c + 'sup?');\n\ }"; - var mode = this.highlighter.getMode("some.js"); + var mode = new JavaScriptMode(); var isError = false, result; try { - result = this.highlighter.render(snippet, mode, theme); + result = highlighter.render(snippet, mode, theme); } catch (e) { console.log(e); @@ -69,10 +43,10 @@ function hello (a, b, c) {\n\ function hello (a, b, c) {\n\ console.log(a * b + c + 'sup?');\n\ }"; - var mode = this.highlighter.getMode("some.js"); + var mode = new JavaScriptMode(); var isError = false, result; - result = this.highlighter.render(snippet, mode, theme); + result = highlighter.render(snippet, mode, theme); assert.equal(result.css, theme.cssText); @@ -87,15 +61,14 @@ function hello (a, b, c) {\n\ function hello (a, b, c) {\n\ console.log(a * b + c + 'sup?');\n\ }"; - var mode = this.highlighter.getMode("some.js"); + var mode = new JavaScriptMode(); var isError = false, result; - result = this.highlighter.render(snippet, mode, theme); - + result = highlighter.render(snippet, mode, theme); assert.equal(!!result.html.match(/
/), true); next(); } }; -!module.parent && require("asyncjs").test.testcase(module.exports, "ServerSideHighlighter").exec(); +!module.parent && require("asyncjs").test.testcase(module.exports).exec(); diff --git a/lib/ace/serversidehighlighter.js b/lib/ace/serversidehighlighter.js deleted file mode 100644 index c1ef873a..00000000 --- a/lib/ace/serversidehighlighter.js +++ /dev/null @@ -1,91 +0,0 @@ -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 From 75ce4e33dd3bf7aa337f3a1ac2cb5dd49d8b8b2a Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Thu, 13 Oct 2011 12:50:20 +0200 Subject: [PATCH 5/6] pilot --- support/pilot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/pilot b/support/pilot index c720ab56..f1ac22a9 160000 --- a/support/pilot +++ b/support/pilot @@ -1 +1 @@ -Subproject commit c720ab56a80ba8cc10d0c86a9c4f1fa9cfc83b1b +Subproject commit f1ac22a9bc806772ae68fd67d800fc0625518346 From aa0d6e935eedcb03773736001b12d92dbf7ef5d7 Mon Sep 17 00:00:00 2001 From: Jan Jongboom Date: Thu, 13 Oct 2011 13:14:31 +0200 Subject: [PATCH 6/6] fixed styling in firefox --- lib/ace/ext/static.css | 7 +++++-- lib/ace/ext/static_highlight.js | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/ace/ext/static.css b/lib/ace/ext/static.css index c2842bf4..d048034f 100644 --- a/lib/ace/ext/static.css +++ b/lib/ace/ext/static.css @@ -4,13 +4,16 @@ } .ace_editor .ace_gutter { - width: 20px; - display: inline-block; + width: 25px !important; + display: block; + float: left; text-align: right; padding: 0 3px 0 0; margin-right: 3px; } +.ace-row { clear: both; } + *.ace_gutter-cell { -moz-user-select: -moz-none; -khtml-user-select: none; diff --git a/lib/ace/ext/static_highlight.js b/lib/ace/ext/static_highlight.js index cec33bf4..bcdf10eb 100644 --- a/lib/ace/ext/static_highlight.js +++ b/lib/ace/ext/static_highlight.js @@ -71,9 +71,10 @@ exports.render = function(input, mode, theme) { for(var ix = 0; ix < length; ix++) { var lineTokens = tokens[ix].tokens; + stringBuilder.push("
"); stringBuilder.push("" + (ix+1) + ""); textLayer.$renderLine(stringBuilder, 0, lineTokens, true); - stringBuilder.push("
"); + stringBuilder.push("
"); } // let's prepare the whole html