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 emacs = require("ace/keyboard/keybinding/emacs").Emacs;
|
||||||
var HashHandler = require("ace/keyboard/hash_handler").HashHandler;
|
var HashHandler = require("ace/keyboard/hash_handler").HashHandler;
|
||||||
|
|
||||||
var WorkerClient = require("ace/worker/worker_client").WorkerClient;
|
|
||||||
|
|
||||||
var docs = {};
|
var docs = {};
|
||||||
|
|
||||||
docs.js = new EditSession(document.getElementById("jstext").innerHTML);
|
docs.js = new EditSession(document.getElementById("jstext").innerHTML);
|
||||||
docs.js.setMode(new JavaScriptMode());
|
docs.js.setMode(new JavaScriptMode());
|
||||||
docs.js.setUndoManager(new UndoManager());
|
docs.js.setUndoManager(new UndoManager());
|
||||||
|
|
||||||
var worker = new WorkerClient("../..", ["ace", "pilot"], "ace/worker/mirror", "Mirror");
|
if (false && window.Worker) {
|
||||||
worker.call("setValue", [docs.js.getValue()]);
|
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);
|
|
||||||
});
|
|
||||||
|
|
||||||
worker.on("jslint", function(results) {
|
docs.js.getDocument().on("change", function(e) {
|
||||||
var errors = [];
|
e.range = {
|
||||||
for (var i=0; i<results.data.length; i++) {
|
start: e.data.range.start,
|
||||||
var error = results.data[i];
|
end: e.data.range.end
|
||||||
if (error)
|
};
|
||||||
errors.push({
|
worker.emit("change", e);
|
||||||
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)
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
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 = new EditSession(document.getElementById("csstext").innerHTML);
|
||||||
docs.css.setMode(new CssMode());
|
docs.css.setMode(new CssMode());
|
||||||
docs.css.setUndoManager(new UndoManager());
|
docs.css.setUndoManager(new UndoManager());
|
||||||
|
|
|
||||||
|
|
@ -52,16 +52,14 @@ var EditSession = function(text, mode) {
|
||||||
this.selection = new Selection(this);
|
this.selection = new Selection(this);
|
||||||
this.$breakpoints = [];
|
this.$breakpoints = [];
|
||||||
|
|
||||||
this.listeners = [];
|
|
||||||
if (mode) {
|
|
||||||
this.setMode(mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (text instanceof Document) {
|
if (text instanceof Document) {
|
||||||
this.setDocument(text)
|
this.setDocument(text)
|
||||||
} else {
|
} else {
|
||||||
this.setDocument(new Document(text));
|
this.setDocument(new Document(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mode)
|
||||||
|
this.setMode(mode);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -288,6 +286,12 @@ var EditSession = function(text, mode) {
|
||||||
this.setMode = function(mode) {
|
this.setMode = function(mode) {
|
||||||
if (this.$mode === mode) return;
|
if (this.$mode === mode) return;
|
||||||
|
|
||||||
|
if (this.$worker)
|
||||||
|
this.$worker.terminate();
|
||||||
|
|
||||||
|
if (window.Worker)
|
||||||
|
this.$worker = mode.createWorker(this);
|
||||||
|
|
||||||
this.$mode = mode;
|
this.$mode = mode;
|
||||||
this._dispatchEvent("changeMode");
|
this._dispatchEvent("changeMode");
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ var Tokenizer = require("ace/tokenizer").Tokenizer;
|
||||||
var JavaScriptHighlightRules = require("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules;
|
var JavaScriptHighlightRules = require("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules;
|
||||||
var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent;
|
var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent;
|
||||||
var Range = require("ace/range").Range;
|
var Range = require("ace/range").Range;
|
||||||
|
var WorkerClient = require("ace/worker/worker_client").WorkerClient;
|
||||||
|
|
||||||
var Mode = function() {
|
var Mode = function() {
|
||||||
this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());
|
this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());
|
||||||
|
|
@ -120,6 +121,39 @@ oop.inherits(Mode, TextMode);
|
||||||
this.autoOutdent = function(state, doc, row) {
|
this.autoOutdent = function(state, doc, row) {
|
||||||
return this.$outdent.autoOutdent(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);
|
}).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 "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.createWorker = function(session) {
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
}).call(Mode.prototype);
|
}).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) {
|
define(function(require, exports, module) {
|
||||||
|
|
||||||
var Document = require("ace/document").Document;
|
var Document = require("ace/document").Document;
|
||||||
var lint = require("ace/worker/jslint").JSLINT;
|
|
||||||
var lang = require("pilot/lang");
|
var lang = require("pilot/lang");
|
||||||
|
|
||||||
var Mirror = exports.Mirror = function(sender) {
|
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 deferredUpdate = this.deferredUpdate = lang.deferredCall(this.onUpdate.bind(this));
|
||||||
|
|
||||||
|
var _self = this;
|
||||||
sender.on("change", function(e) {
|
sender.on("change", function(e) {
|
||||||
doc.applyDeltas([e.data]);
|
doc.applyDeltas([e.data]);
|
||||||
deferredUpdate.schedule(500);
|
deferredUpdate.schedule(_self.$timeout);
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
|
this.$timeout = 500;
|
||||||
|
|
||||||
|
this.setTimeout = function(timeout) {
|
||||||
|
this.$timeout = timeout;
|
||||||
|
};
|
||||||
|
|
||||||
this.setValue = function(value) {
|
this.setValue = function(value) {
|
||||||
this.doc.setValue(value);
|
this.doc.setValue(value);
|
||||||
this.deferredUpdate.schedule(500);
|
this.deferredUpdate.schedule(this.$timeout);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getValue = function(callbackId) {
|
this.getValue = function(callbackId) {
|
||||||
|
|
@ -29,9 +35,8 @@ var Mirror = exports.Mirror = function(sender) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.onUpdate = function() {
|
this.onUpdate = function() {
|
||||||
lint(this.doc.getValue(), {undef: false, onevar: false, passfail: false});
|
// abstract method
|
||||||
this.sender.emit("jslint", lint.errors);
|
};
|
||||||
}
|
|
||||||
|
|
||||||
}).call(Mirror.prototype);
|
}).call(Mirror.prototype);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,10 @@ var WorkerClient = function(baseUrl, topLevelNamespaces, module, classname) {
|
||||||
|
|
||||||
oop.implement(this, EventEmitter);
|
oop.implement(this, EventEmitter);
|
||||||
|
|
||||||
|
this.terminate = function() {
|
||||||
|
this.$worker.terminate();
|
||||||
|
};
|
||||||
|
|
||||||
this.send = function(cmd, args) {
|
this.send = function(cmd, args) {
|
||||||
this.$worker.postMessage({command: cmd, args: args});
|
this.$worker.postMessage({command: cmd, args: args});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue