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