From 920bdc40ae333ecd572186954b07b1e855aeb2b8 Mon Sep 17 00:00:00 2001 From: Tom Tasche Date: Fri, 28 Jan 2011 13:09:40 +0100 Subject: [PATCH 1/7] forked javascript_highlight_rules and adapt it for java --- lib/ace/mode/java_highlight_rules.js | 142 +++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 lib/ace/mode/java_highlight_rules.js diff --git a/lib/ace/mode/java_highlight_rules.js b/lib/ace/mode/java_highlight_rules.js new file mode 100644 index 00000000..a4c84567 --- /dev/null +++ b/lib/ace/mode/java_highlight_rules.js @@ -0,0 +1,142 @@ +define(function(require, exports, module) { + +var oop = require("pilot/oop"); +var lang = require("pilot/lang"); +var DocCommentHighlightRules = require("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightRules; + +JavaHighlightRules = function() { + + var docComment = new DocCommentHighlightRules(); + + // taken from http://download.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html + var keywords = lang.arrayToMap( + ("abstract|continue|for|new|switch|" + + "assert|default|goto|package|synchronized" + + "boolean|do|if|private|this" + + "break|double|implements|protected|throw" + + "byte|else|import|public|throws" + + "case|enum|instanceof|return|transient" + + "catch|extends|int|short|try" + + "char|final|interface|static|void" + + "class|finally|long|strictfp|volatile|" + + "const|float|native|super|while").split("|") + ); + + var buildinConstants = lang.arrayToMap( + ("null|Infinity|NaN|undefined").split("|") + ); + + + // regexp must not have capturing parentheses. Use (?:) instead. + // regexps are ordered -> the first match is used + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + docComment.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : function(value) { + if (value == "this") + return "variable.language"; + else if (keywords[value]) + return "keyword"; + else if (buildinConstants[value]) + return "constant.language"; + else if (futureReserved[value]) + return "invalid.illegal"; + else if (value == "debugger") + return "invalid.deprecated"; + else + return "identifier"; + }, + // TODO: Unicode escape sequences + // TODO: Unicode identifiers + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; + + this.addRules(docComment.getRules(), "doc-"); + this.$rules["doc-start"][0].next = "start"; +}; + +oop.inherits(JavaHighlightRules, TextHighlightRules); + +exports.JavaHighlightRules = JavaHighlightRules; +}); From 53a4f1eacbea871700f953a8d688063ae56bcfde Mon Sep 17 00:00:00 2001 From: Tom Tasche Date: Mon, 31 Jan 2011 18:23:41 +0100 Subject: [PATCH 2/7] inspired by SunboX s PHP support and Fabian Jakobs - thanks! --- .c9settings.xml | 1 + demo/startup.js | 13 ++++- editor.html | 2 + lib/ace/mode/java.js | 95 +++++++++++++++++++++++++++++++++++++ lib/ace/mode/java_worker.js | 46 ++++++++++++++++++ 5 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 .c9settings.xml create mode 100644 lib/ace/mode/java.js create mode 100644 lib/ace/mode/java_worker.js diff --git a/.c9settings.xml b/.c9settings.xml new file mode 100644 index 00000000..160c1757 --- /dev/null +++ b/.c9settings.xml @@ -0,0 +1 @@ +{"ext/editors/editors":{"parent":{"visible":2,"flex":1},"visible":2,"flex":1},"ext/tree/tree":{"parent":{"visible":2,"width":323},"visible":true,"flex":3,"state":"normal"},"ext/console/console":{"parent":{"visible":2,"height":"41"},"visible":false,"flex":1}}["folder[1]","folder[1]/file[3]","folder[1]/folder[2]","folder[1]/folder[2]/folder[1]","folder[1]/folder[2]/folder[1]/folder[4]","folder[1]/folder[2]/folder[1]/folder[4]/file[18]","folder[1]/folder[2]/folder[1]/folder[4]/file[2]","folder[1]/folder[2]/folder[1]/folder[4]/file[3]"] \ No newline at end of file diff --git a/demo/startup.js b/demo/startup.js index c56a8dc6..cd929dfb 100644 --- a/demo/startup.js +++ b/demo/startup.js @@ -52,6 +52,7 @@ exports.launch = function(env) { var XmlMode = require("ace/mode/xml").Mode; var PythonMode = require("ace/mode/python").Mode; var PhpMode = require("ace/mode/php").Mode; + var JavaMode = require("ace/mode/java").Mode; var TextMode = require("ace/mode/text").Mode; var UndoManager = require("ace/undomanager").UndoManager; @@ -101,6 +102,10 @@ exports.launch = function(env) { docs.php = new EditSession(document.getElementById("phptext").innerHTML); docs.php.setMode(new PhpMode()); docs.php.setUndoManager(new UndoManager()); + + docs.java = new EditSession(document.getElementById("javatext").innerHTML); + docs.java.setMode(new JavaMode()); + docs.java.setUndoManager(new UndoManager()); var container = document.getElementById("editor"); @@ -113,7 +118,8 @@ exports.launch = function(env) { css: new CssMode(), javascript: new JavaScriptMode(), python: new PythonMode(), - php: new PhpMode() + php: new PhpMode(), + java: new JavaMode() }; function getMode() { @@ -146,6 +152,9 @@ exports.launch = function(env) { else if (mode instanceof PhpMode) { modeEl.value = "php"; } + else if (mode instanceof JavaMode) { + modeEl.value = "java"; + } else { modeEl.value = "text"; } @@ -271,6 +280,8 @@ exports.launch = function(env) { mode = "python"; } else if (/^.*\.php$/i.test(file.name)) { mode = "php"; + } else if (/^.*\.java$/i.test(file.name)) { + mode = "java"; } env.editor.onTextInput(reader.result); diff --git a/editor.html b/editor.html index be7968b2..c003214e 100644 --- a/editor.html +++ b/editor.html @@ -19,6 +19,7 @@ + @@ -72,6 +73,7 @@ + diff --git a/lib/ace/mode/java.js b/lib/ace/mode/java.js new file mode 100644 index 00000000..0d9d5fb3 --- /dev/null +++ b/lib/ace/mode/java.js @@ -0,0 +1,95 @@ +define(function(require, exports, module) { + +var oop = require("pilot/oop"); +var TextMode = require("ace/mode/text").Mode; +var Tokenizer = require("ace/tokenizer").Tokenizer; +var JavaHighlightRules = require("ace/mode/java_highlight_rules").JavaHighlightRules; +var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent; +var Range = require("ace/range").Range; +var WorkerClient = require("ace/worker/worker_client").WorkerClient; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + var outdent = true; + var outentedRows = []; + var re = /^(\s*)\/\//; + + for (var i=startRow; i<= endRow; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + if (outdent) { + var deleteRange = new Range(0, 0, 0, 0); + for (var i=startRow; i<= endRow; i++) + { + var line = doc.getLine(i).replace(re, "$1"); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length + 2; + doc.replace(deleteRange, line); + } + return -2; + } + else { + return doc.indentRows(startRow, endRow, "//"); + } + }; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + return this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + return null; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/lib/ace/mode/java_worker.js b/lib/ace/mode/java_worker.js new file mode 100644 index 00000000..c8ac4894 --- /dev/null +++ b/lib/ace/mode/java_worker.js @@ -0,0 +1,46 @@ +define(function(require, exports, module) { + +var oop = require("pilot/oop"); +var Mirror = require("ace/worker/mirror").Mirror; +var lint = require("ace/worker/jslint").JSLINT; + +var JavaScriptWorker = exports.JavaScriptWorker = function(sender) { + Mirror.call(this, sender); + this.setTimeout(500); +}; + +oop.inherits(JavaScriptWorker, Mirror); + +(function() { + + this.onUpdate = function() { + var value = this.doc.getValue(); + +// var start = new Date(); + var parser = require("ace/narcissus/jsparse"); + try { + parser.parse(value); + } catch(e) { +// console.log("narcissus") +// console.log(e); + sender.emit("narcissus", { + row: e.lineno-1, + column: null, // TODO convert e.cursor + text: e.message, + type: "error" + }); + return; + } finally { +// console.log("parse time: " + (new Date() - start)); + } + +// var start = new Date(); +// console.log("jslint") + lint(value, {undef: false, onevar: false, passfail: false}); + this.sender.emit("jslint", lint.errors); +// console.log("lint time: " + (new Date() - start)); + } + +}).call(JavaScriptWorker.prototype); + +}); \ No newline at end of file From f10d7598341f8a4f1d4fbb27c697fdc26c9f303e Mon Sep 17 00:00:00 2001 From: Tom Tasche Date: Tue, 1 Feb 2011 11:37:26 +0100 Subject: [PATCH 3/7] remove java_worker, fix mistakes mentioned by fjakobs --- lib/ace/mode/java.js | 76 +--------------------------- lib/ace/mode/java_highlight_rules.js | 12 ----- lib/ace/mode/java_worker.js | 46 ----------------- 3 files changed, 2 insertions(+), 132 deletions(-) delete mode 100644 lib/ace/mode/java_worker.js diff --git a/lib/ace/mode/java.js b/lib/ace/mode/java.js index 0d9d5fb3..8d224c3e 100644 --- a/lib/ace/mode/java.js +++ b/lib/ace/mode/java.js @@ -1,89 +1,17 @@ define(function(require, exports, module) { var oop = require("pilot/oop"); -var TextMode = require("ace/mode/text").Mode; +var JavaScriptMode = require("ace/mode/javascript").Mode; var Tokenizer = require("ace/tokenizer").Tokenizer; var JavaHighlightRules = require("ace/mode/java_highlight_rules").JavaHighlightRules; -var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent; -var Range = require("ace/range").Range; -var WorkerClient = require("ace/worker/worker_client").WorkerClient; var Mode = function() { this.$tokenizer = new Tokenizer(new JavaHighlightRules().getRules()); this.$outdent = new MatchingBraceOutdent(); }; -oop.inherits(Mode, TextMode); +oop.inherits(Mode, JavaScriptMode); (function() { - - this.toggleCommentLines = function(state, doc, startRow, endRow) { - var outdent = true; - var outentedRows = []; - var re = /^(\s*)\/\//; - - for (var i=startRow; i<= endRow; i++) { - if (!re.test(doc.getLine(i))) { - outdent = false; - break; - } - } - - if (outdent) { - var deleteRange = new Range(0, 0, 0, 0); - for (var i=startRow; i<= endRow; i++) - { - var line = doc.getLine(i).replace(re, "$1"); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = line.length + 2; - doc.replace(deleteRange, line); - } - return -2; - } - else { - return doc.indentRows(startRow, endRow, "//"); - } - }; - - this.getNextLineIndent = function(state, line, tab) { - var indent = this.$getIndent(line); - - var tokenizedLine = this.$tokenizer.getLineTokens(line, state); - var tokens = tokenizedLine.tokens; - var endState = tokenizedLine.state; - - if (tokens.length && tokens[tokens.length-1].type == "comment") { - return indent; - } - - if (state == "start") { - var match = line.match(/^.*[\{\(\[]\s*$/); - if (match) { - indent += tab; - } - } else if (state == "doc-start") { - if (endState == "start") { - return ""; - } - var match = line.match(/^\s*(\/?)\*/); - if (match) { - if (match[1]) { - indent += " "; - } - indent += "* "; - } - } - - return indent; - }; - - this.checkOutdent = function(state, line, input) { - return this.$outdent.checkOutdent(line, input); - }; - - this.autoOutdent = function(state, doc, row) { - return this.$outdent.autoOutdent(doc, row); - }; this.createWorker = function(session) { return null; diff --git a/lib/ace/mode/java_highlight_rules.js b/lib/ace/mode/java_highlight_rules.js index a4c84567..712f8839 100644 --- a/lib/ace/mode/java_highlight_rules.js +++ b/lib/ace/mode/java_highlight_rules.js @@ -48,17 +48,9 @@ JavaHighlightRules = function() { }, { token : "string", // single line regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' - }, { - token : "string", // multi line string start - regex : '["].*\\\\$', - next : "qqstring" }, { token : "string", // single line regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" - }, { - token : "string", // multi line string start - regex : "['].*\\\\$", - next : "qstring" }, { token : "constant.numeric", // hex regex : "0[xX][0-9a-fA-F]+\\b" @@ -76,10 +68,6 @@ JavaHighlightRules = function() { return "keyword"; else if (buildinConstants[value]) return "constant.language"; - else if (futureReserved[value]) - return "invalid.illegal"; - else if (value == "debugger") - return "invalid.deprecated"; else return "identifier"; }, diff --git a/lib/ace/mode/java_worker.js b/lib/ace/mode/java_worker.js deleted file mode 100644 index c8ac4894..00000000 --- a/lib/ace/mode/java_worker.js +++ /dev/null @@ -1,46 +0,0 @@ -define(function(require, exports, module) { - -var oop = require("pilot/oop"); -var Mirror = require("ace/worker/mirror").Mirror; -var lint = require("ace/worker/jslint").JSLINT; - -var JavaScriptWorker = exports.JavaScriptWorker = function(sender) { - Mirror.call(this, sender); - this.setTimeout(500); -}; - -oop.inherits(JavaScriptWorker, Mirror); - -(function() { - - this.onUpdate = function() { - var value = this.doc.getValue(); - -// var start = new Date(); - var parser = require("ace/narcissus/jsparse"); - try { - parser.parse(value); - } catch(e) { -// console.log("narcissus") -// console.log(e); - sender.emit("narcissus", { - row: e.lineno-1, - column: null, // TODO convert e.cursor - text: e.message, - type: "error" - }); - return; - } finally { -// console.log("parse time: " + (new Date() - start)); - } - -// var start = new Date(); -// console.log("jslint") - lint(value, {undef: false, onevar: false, passfail: false}); - this.sender.emit("jslint", lint.errors); -// console.log("lint time: " + (new Date() - start)); - } - -}).call(JavaScriptWorker.prototype); - -}); \ No newline at end of file From 1420d358a3e930b7f905fb886483d91f5b4280e2 Mon Sep 17 00:00:00 2001 From: Tom Tasche Date: Wed, 2 Feb 2011 14:18:51 +0100 Subject: [PATCH 4/7] add missing code --- editor.html | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/editor.html b/editor.html index f0078dc6..adca4870 100644 --- a/editor.html +++ b/editor.html @@ -138,6 +138,22 @@ + +