nicely integrate the worker code
This commit is contained in:
parent
30975d5b0d
commit
8238e36ca1
8 changed files with 114 additions and 61 deletions
|
|
@ -59,48 +59,42 @@ exports.launch = function(env) {
|
|||
var emacs = require("ace/keyboard/keybinding/emacs").Emacs;
|
||||
var HashHandler = require("ace/keyboard/hash_handler").HashHandler;
|
||||
|
||||
var WorkerClient = require("ace/worker/worker_client").WorkerClient;
|
||||
|
||||
var docs = {};
|
||||
|
||||
docs.js = new EditSession(document.getElementById("jstext").innerHTML);
|
||||
docs.js.setMode(new JavaScriptMode());
|
||||
docs.js.setUndoManager(new UndoManager());
|
||||
|
||||
var worker = new WorkerClient("../..", ["ace", "pilot"], "ace/worker/mirror", "Mirror");
|
||||
worker.call("setValue", [docs.js.getValue()]);
|
||||
|
||||
docs.js.getDocument().on("change", function(e) {
|
||||
e.range = {
|
||||
start: e.data.range.start,
|
||||
end: e.data.range.end
|
||||
};
|
||||
worker.emit("change", e);
|
||||
});
|
||||
if (false && window.Worker) {
|
||||
var worker = new WorkerClient("../..", ["ace", "pilot"], "ace/worker/mirror", "Mirror");
|
||||
worker.call("setValue", [docs.js.getValue()]);
|
||||
|
||||
worker.on("jslint", function(results) {
|
||||
var errors = [];
|
||||
for (var i=0; i<results.data.length; i++) {
|
||||
var error = results.data[i];
|
||||
if (error)
|
||||
errors.push({
|
||||
row: error.line-1,
|
||||
column: error.character-1,
|
||||
text: error.reason,
|
||||
type: "error",
|
||||
lint: error
|
||||
})
|
||||
}
|
||||
|
||||
docs.js.setAnnotations(errors)
|
||||
});
|
||||
|
||||
window.mirror = function() {
|
||||
worker.call("getValue", [], function(value) {
|
||||
console.log(value)
|
||||
docs.js.getDocument().on("change", function(e) {
|
||||
e.range = {
|
||||
start: e.data.range.start,
|
||||
end: e.data.range.end
|
||||
};
|
||||
worker.emit("change", e);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
worker.on("jslint", function(results) {
|
||||
var errors = [];
|
||||
for (var i=0; i<results.data.length; i++) {
|
||||
var error = results.data[i];
|
||||
if (error)
|
||||
errors.push({
|
||||
row: error.line-1,
|
||||
column: error.character-1,
|
||||
text: error.reason,
|
||||
type: "error",
|
||||
lint: error
|
||||
})
|
||||
}
|
||||
|
||||
docs.js.setAnnotations(errors)
|
||||
});
|
||||
};
|
||||
|
||||
docs.css = new EditSession(document.getElementById("csstext").innerHTML);
|
||||
docs.css.setMode(new CssMode());
|
||||
docs.css.setUndoManager(new UndoManager());
|
||||
|
|
|
|||
|
|
@ -52,16 +52,14 @@ var EditSession = function(text, mode) {
|
|||
this.selection = new Selection(this);
|
||||
this.$breakpoints = [];
|
||||
|
||||
this.listeners = [];
|
||||
if (mode) {
|
||||
this.setMode(mode);
|
||||
}
|
||||
|
||||
if (text instanceof Document) {
|
||||
this.setDocument(text)
|
||||
} else {
|
||||
this.setDocument(new Document(text));
|
||||
}
|
||||
|
||||
if (mode)
|
||||
this.setMode(mode);
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -288,6 +286,12 @@ var EditSession = function(text, mode) {
|
|||
this.setMode = function(mode) {
|
||||
if (this.$mode === mode) return;
|
||||
|
||||
if (this.$worker)
|
||||
this.$worker.terminate();
|
||||
|
||||
if (window.Worker)
|
||||
this.$worker = mode.createWorker(this);
|
||||
|
||||
this.$mode = mode;
|
||||
this._dispatchEvent("changeMode");
|
||||
};
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ var Tokenizer = require("ace/tokenizer").Tokenizer;
|
|||
var JavaScriptHighlightRules = require("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules;
|
||||
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 JavaScriptHighlightRules().getRules());
|
||||
|
|
@ -120,6 +121,39 @@ oop.inherits(Mode, TextMode);
|
|||
this.autoOutdent = function(state, doc, row) {
|
||||
return this.$outdent.autoOutdent(doc, row);
|
||||
};
|
||||
|
||||
this.createWorker = function(session) {
|
||||
var doc = session.getDocument();
|
||||
var worker = new WorkerClient("../..", ["ace", "pilot"], "ace/mode/javascript_worker", "JavaScriptWorker");
|
||||
worker.call("setValue", [doc.getValue()]);
|
||||
|
||||
doc.on("change", function(e) {
|
||||
e.range = {
|
||||
start: e.data.range.start,
|
||||
end: e.data.range.end
|
||||
};
|
||||
worker.emit("change", e);
|
||||
});
|
||||
|
||||
worker.on("jslint", function(results) {
|
||||
var errors = [];
|
||||
for (var i=0; i<results.data.length; i++) {
|
||||
var error = results.data[i];
|
||||
if (error)
|
||||
errors.push({
|
||||
row: error.line-1,
|
||||
column: error.character-1,
|
||||
text: error.reason,
|
||||
type: "error",
|
||||
lint: error
|
||||
})
|
||||
}
|
||||
|
||||
session.setAnnotations(errors)
|
||||
});
|
||||
|
||||
return worker;
|
||||
};
|
||||
|
||||
}).call(Mode.prototype);
|
||||
|
||||
|
|
|
|||
24
lib/ace/mode/javascript_worker.js
Normal file
24
lib/ace/mode/javascript_worker.js
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
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() {
|
||||
lint(this.doc.getValue(), {undef: false, onevar: false, passfail: false});
|
||||
this.sender.emit("jslint", lint.errors);
|
||||
}
|
||||
|
||||
}).call(JavaScriptWorker.prototype);
|
||||
|
||||
});
|
||||
|
|
@ -73,6 +73,10 @@ var Mode = function() {
|
|||
|
||||
return "";
|
||||
};
|
||||
|
||||
this.createWorker = function(session) {
|
||||
return null;
|
||||
};
|
||||
|
||||
}).call(Mode.prototype);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
|
||||
define(function(require, exports, module) {
|
||||
|
||||
var Demo = exports.Demo = function(sender) {
|
||||
this.sender = sender;
|
||||
};
|
||||
|
||||
(function() {
|
||||
|
||||
this.juhu = function() {
|
||||
console.log("JUHU")
|
||||
}
|
||||
|
||||
}).call(Demo.prototype);
|
||||
|
||||
});
|
||||
|
|
@ -2,7 +2,6 @@
|
|||
define(function(require, exports, module) {
|
||||
|
||||
var Document = require("ace/document").Document;
|
||||
var lint = require("ace/worker/jslint").JSLINT;
|
||||
var lang = require("pilot/lang");
|
||||
|
||||
var Mirror = exports.Mirror = function(sender) {
|
||||
|
|
@ -11,17 +10,24 @@ var Mirror = exports.Mirror = function(sender) {
|
|||
|
||||
var deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this));
|
||||
|
||||
var _self = this;
|
||||
sender.on("change", function(e) {
|
||||
doc.applyDeltas([e.data]);
|
||||
deferredUpdate.schedule(500);
|
||||
deferredUpdate.schedule(_self.$timeout);
|
||||
})
|
||||
};
|
||||
|
||||
(function() {
|
||||
|
||||
this.$timeout = 500;
|
||||
|
||||
this.setTimeout = function(timeout) {
|
||||
this.$timeout = timeout;
|
||||
};
|
||||
|
||||
this.setValue = function(value) {
|
||||
this.doc.setValue(value);
|
||||
this.deferredUpdate.schedule(500);
|
||||
this.deferredUpdate.schedule(this.$timeout);
|
||||
};
|
||||
|
||||
this.getValue = function(callbackId) {
|
||||
|
|
@ -29,9 +35,8 @@ var Mirror = exports.Mirror = function(sender) {
|
|||
};
|
||||
|
||||
this.onUpdate = function() {
|
||||
lint(this.doc.getValue(), {undef: false, onevar: false, passfail: false});
|
||||
this.sender.emit("jslint", lint.errors);
|
||||
}
|
||||
// abstract method
|
||||
};
|
||||
|
||||
}).call(Mirror.prototype);
|
||||
|
||||
|
|
|
|||
|
|
@ -64,6 +64,10 @@ var WorkerClient = function(baseUrl, topLevelNamespaces, module, classname) {
|
|||
|
||||
oop.implement(this, EventEmitter);
|
||||
|
||||
this.terminate = function() {
|
||||
this.$worker.terminate();
|
||||
};
|
||||
|
||||
this.send = function(cmd, args) {
|
||||
this.$worker.postMessage({command: cmd, args: args});
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue