diff --git a/lib/ace/commands/default_commands.js b/lib/ace/commands/default_commands.js
index f1e267c1..de14df85 100644
--- a/lib/ace/commands/default_commands.js
+++ b/lib/ace/commands/default_commands.js
@@ -423,6 +423,12 @@ exports.commands = [{
exec: function() {},
passEvent: true,
readOnly: true
+}, {
+ name: "copy",
+ exec: function(editor) {
+ // placeholder for replay macro
+ },
+ readOnly: true
},
// commands disabled in readOnly mode
@@ -439,6 +445,12 @@ exports.commands = [{
},
scrollIntoView: "cursor",
multiSelectAction: "forEach"
+}, {
+ name: "paste",
+ exec: function(editor, args) {
+ editor.$handlePaste(args);
+ },
+ scrollIntoView: "cursor"
}, {
name: "removeline",
bindKey: bindKey("Ctrl-D", "Command-D"),
diff --git a/lib/ace/editor.js b/lib/ace/editor.js
index 22b43dd2..5da8a961 100644
--- a/lib/ace/editor.js
+++ b/lib/ace/editor.js
@@ -916,13 +916,15 @@ var Editor = function(renderer, session) {
*
**/
this.onPaste = function(text, event) {
- // todo this should change when paste becomes a command
- if (this.$readOnly)
- return;
-
var e = {text: text, event: event};
+ this.commands.exec("paste", this, e);
+ };
+
+ this.$handlePaste = function(e) {
+ if (typeof e == "string")
+ e = {text: e};
this._signal("paste", e);
- text = e.text;
+ var text = e.text;
if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {
this.insert(text);
} else {
@@ -940,7 +942,6 @@ var Editor = function(renderer, session) {
this.session.insert(range.start, lines[i]);
}
}
- this.renderer.scrollCursorIntoView();
};
this.execCommand = function(command, args) {
diff --git a/lib/ace/ext/modelist.js b/lib/ace/ext/modelist.js
index 7a5a1e9c..6bc79c8b 100644
--- a/lib/ace/ext/modelist.js
+++ b/lib/ace/ext/modelist.js
@@ -122,7 +122,7 @@ var supportedModes = {
Pascal: ["pas|p"],
Perl: ["pl|pm"],
pgSQL: ["pgsql"],
- PHP: ["php|phtml"],
+ PHP: ["php|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp"],
Powershell: ["ps1"],
Praat: ["praat|praatscript|psc|proc"],
Prolog: ["plg|prolog"],
diff --git a/lib/ace/layer/text.js b/lib/ace/layer/text.js
index a105768d..01afb9f3 100644
--- a/lib/ace/layer/text.js
+++ b/lib/ace/layer/text.js
@@ -52,7 +52,7 @@ var Text = function(parentEl) {
this.EOL_CHAR_LF = "\xAC";
this.EOL_CHAR_CRLF = "\xa4";
this.EOL_CHAR = this.EOL_CHAR_LF;
- this.TAB_CHAR = "\u2192"; //"\u21E5";
+ this.TAB_CHAR = "\u2014"; //"\u21E5";
this.SPACE_CHAR = "\xB7";
this.$padding = 0;
@@ -128,8 +128,7 @@ var Text = function(parentEl) {
for (var i = 1; i < tabSize + 1; i++) {
if (this.showInvisibles) {
tabStr.push(""
- + this.TAB_CHAR
- + lang.stringRepeat(" ", i - 1)
+ + lang.stringRepeat(this.TAB_CHAR, i)
+ "");
} else {
tabStr.push(lang.stringRepeat(" ", i));
@@ -145,7 +144,7 @@ var Text = function(parentEl) {
spaceClass = " ace_invisible_space";
tabClass = " ace_invisible_tab";
var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);
- var tabContent = this.TAB_CHAR + lang.stringRepeat(" ", this.tabSize - 1);
+ var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);
} else{
var spaceContent = lang.stringRepeat(" ", this.tabSize);
var tabContent = spaceContent;
diff --git a/lib/ace/layer/text_test.js b/lib/ace/layer/text_test.js
index e3403ca4..3946ec66 100644
--- a/lib/ace/layer/text_test.js
+++ b/lib/ace/layer/text_test.js
@@ -91,7 +91,7 @@ module.exports = {
var EOL = "" + textLayer.EOL_CHAR + "";
var SPACE = function(i) {return Array(i+1).join(" ")}
var DOT = function(i) {return Array(i+1).join(textLayer.SPACE_CHAR)}
- var TAB = function(i) {return textLayer.TAB_CHAR + SPACE(i-1)}
+ var TAB = function(i) {return Array(i+1).join(textLayer.TAB_CHAR)}
function testRender(results) {
for (var i = results.length; i--; ) {
var stringBuilder = [];
diff --git a/lib/ace/mode/behaviour/behaviour_test.js b/lib/ace/mode/behaviour/behaviour_test.js
index 9dc27bf8..245edf99 100644
--- a/lib/ace/mode/behaviour/behaviour_test.js
+++ b/lib/ace/mode/behaviour/behaviour_test.js
@@ -144,6 +144,16 @@ module.exports = {
exec("selectleft", 1);
exec("insertstring", 1, '"');
assert.equal(editor.getValue(), '("foo")');
+
+ editor.setValue("", 1);
+ exec("selectleft", 1);
+ exec("insertstring", 1, '"');
+ assert.equal(editor.getValue(), '""');
+ exec("insertstring", 1, '\\');
+ exec("insertstring", 1, 'n');
+ exec("insertstring", 1, '"');
+ assert.equal(editor.getValue(), '"\\n"');
+
},
"test: xml": function() {
editor = new Editor(new MockRenderer());
diff --git a/lib/ace/mode/behaviour/cstyle.js b/lib/ace/mode/behaviour/cstyle.js
index a1dce91e..dd1b0d14 100644
--- a/lib/ace/mode/behaviour/cstyle.js
+++ b/lib/ace/mode/behaviour/cstyle.js
@@ -269,8 +269,8 @@ var CstyleBehaviour = function() {
if (leftChar == "\\" && token && /escape/.test(token.type))
return null;
- var stringBefore = token && /string/.test(token.type);
- var stringAfter = !rightToken || /string/.test(rightToken.type);
+ var stringBefore = token && /string|escape/.test(token.type);
+ var stringAfter = !rightToken || /string|escape/.test(rightToken.type);
var pair;
if (rightChar == quote) {
diff --git a/lib/ace/mode/handlebars.js b/lib/ace/mode/handlebars.js
index 3f2e7179..164ad43f 100644
--- a/lib/ace/mode/handlebars.js
+++ b/lib/ace/mode/handlebars.js
@@ -13,7 +13,6 @@ var Mode = function() {
HtmlMode.call(this);
this.HighlightRules = HandlebarsHighlightRules;
this.$behaviour = new HtmlBehaviour();
-
this.foldingRules = new HtmlFoldMode();
};
@@ -21,7 +20,7 @@ var Mode = function() {
oop.inherits(Mode, HtmlMode);
(function() {
- this.blockComment = {start: "{!--", end: "--}"};
+ this.blockComment = {start: "{{!--", end: "--}}"};
this.$id = "ace/mode/handlebars";
}).call(Mode.prototype);
diff --git a/lib/ace/mode/less_highlight_rules.js b/lib/ace/mode/less_highlight_rules.js
index d39bdeae..a0162765 100644
--- a/lib/ace/mode/less_highlight_rules.js
+++ b/lib/ace/mode/less_highlight_rules.js
@@ -231,7 +231,7 @@ var LessHighlightRules = function() {
regex: "\\.[a-z0-9-_]+"
}, {
token: "variable.language",
- regex: ":[a-z0-9-_]+"
+ regex: ":[a-z_][a-z0-9-_]*"
}, {
token: "constant",
regex: "[a-z0-9-_]+"
diff --git a/lib/ace/worker/worker.js b/lib/ace/worker/worker.js
index 928000dd..28fc0fe2 100644
--- a/lib/ace/worker/worker.js
+++ b/lib/ace/worker/worker.js
@@ -1,8 +1,9 @@
"no use strict";
;(function(window) {
-if (typeof window.window != "undefined" && window.document) {
+if (typeof window.window != "undefined" && window.document)
+ return;
+if (window.require && window.define)
return;
-}
window.console = function() {
var msgs = Array.prototype.slice.call(arguments, 0);
@@ -19,6 +20,7 @@ window.ace = window;
window.onerror = function(message, file, line, col, err) {
postMessage({type: "error", data: {
message: message,
+ data: err.data,
file: file,
line: line,
col: col,
@@ -37,7 +39,7 @@ window.normalizeModule = function(parentId, moduleName) {
var base = parentId.split("/").slice(0, -1).join("/");
moduleName = (base ? base + "/" : "") + moduleName;
- while(moduleName.indexOf(".") !== -1 && previous != moduleName) {
+ while (moduleName.indexOf(".") !== -1 && previous != moduleName) {
var previous = moduleName;
moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
}
@@ -46,7 +48,7 @@ window.normalizeModule = function(parentId, moduleName) {
return moduleName;
};
-window.require = function(parentId, id) {
+window.require = function require(parentId, id) {
if (!id) {
id = parentId;
parentId = null;
@@ -64,17 +66,36 @@ window.require = function(parentId, id) {
}
return module.exports;
}
-
- var chunks = id.split("/");
+
if (!window.require.tlns)
return console.log("unable to load " + id);
- chunks[0] = window.require.tlns[chunks[0]] || chunks[0];
- var path = chunks.join("/") + ".js";
+
+ var path = resolveModuleId(id, window.require.tlns);
+ if (path.slice(-3) != ".js") path += ".js";
window.require.id = id;
+ window.require.modules[id] = {}; // prevent infinite loop on broken modules
importScripts(path);
return window.require(parentId, id);
};
+function resolveModuleId(id, paths) {
+ var testPath = id, tail = "";
+ while (testPath) {
+ var alias = paths[testPath];
+ if (typeof alias == "string") {
+ return alias + tail;
+ } else if (alias) {
+ return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name);
+ } else if (alias === false) {
+ return "";
+ }
+ var i = testPath.lastIndexOf("/");
+ if (i === -1) break;
+ tail = testPath.substr(i) + tail;
+ testPath = testPath.slice(0, i);
+ }
+ return id;
+}
window.require.modules = {};
window.require.tlns = {};
@@ -100,9 +121,9 @@ window.define = function(id, deps, factory) {
}
if (!deps.length)
- // If there is no dependencies, we inject 'require', 'exports' and
- // 'module' as dependencies, to provide CommonJS compatibility.
- deps = ['require', 'exports', 'module'];
+ // If there is no dependencies, we inject "require", "exports" and
+ // "module" as dependencies, to provide CommonJS compatibility.
+ deps = ["require", "exports", "module"];
var req = function(childId) {
return window.require(id, childId);
@@ -113,16 +134,16 @@ window.define = function(id, deps, factory) {
factory: function() {
var module = this;
var returnExports = factory.apply(this, deps.map(function(dep) {
- switch(dep) {
- // Because 'require', 'exports' and 'module' aren't actual
- // dependencies, we must handle them seperately.
- case 'require': return req;
- case 'exports': return module.exports;
- case 'module': return module;
- // But for all other dependencies, we can just go ahead and
- // require them.
- default: return req(dep);
- }
+ switch (dep) {
+ // Because "require", "exports" and "module" aren't actual
+ // dependencies, we must handle them seperately.
+ case "require": return req;
+ case "exports": return module.exports;
+ case "module": return module;
+ // But for all other dependencies, we can just go ahead and
+ // require them.
+ default: return req(dep);
+ }
}));
if (returnExports)
module.exports = returnExports;
@@ -131,9 +152,10 @@ window.define = function(id, deps, factory) {
};
};
window.define.amd = {};
-
+require.tlns = {};
window.initBaseUrls = function initBaseUrls(topLevelNamespaces) {
- require.tlns = topLevelNamespaces;
+ for (var i in topLevelNamespaces)
+ require.tlns[i] = topLevelNamespaces[i];
};
window.initSender = function initSender() {
@@ -173,21 +195,23 @@ var sender = window.sender = null;
window.onmessage = function(e) {
var msg = e.data;
- if (msg.command) {
+ if (msg.event && sender) {
+ sender._signal(msg.event, msg.data);
+ }
+ else if (msg.command) {
if (main[msg.command])
main[msg.command].apply(main, msg.args);
+ else if (window[msg.command])
+ window[msg.command].apply(window, msg.args);
else
throw new Error("Unknown command:" + msg.command);
}
- else if (msg.init) {
- initBaseUrls(msg.tlns);
+ else if (msg.init) {
+ window.initBaseUrls(msg.tlns);
require("ace/lib/es5-shim");
- sender = window.sender = initSender();
+ sender = window.sender = window.initSender();
var clazz = require(msg.module)[msg.classname];
main = window.main = new clazz(sender);
- }
- else if (msg.event && sender) {
- sender._signal(msg.event, msg.data);
}
};
})(this);
\ No newline at end of file