0)
this.$blockScrolling--;
- if (command && command.scrollIntoView) {
- switch (command.scrollIntoView) {
+ var scrollIntoView = command && command.scrollIntoView;
+ if (scrollIntoView) {
+ switch (scrollIntoView) {
+ case "center-animate":
+ scrollIntoView = "animate";
+ /* fall through */
case "center":
this.renderer.scrollCursorIntoView(null, 0.5);
break;
@@ -181,7 +185,7 @@ var Editor = function(renderer, session) {
default:
break;
}
- if (command.scrollIntoView == "animate")
+ if (scrollIntoView == "animate")
this.renderer.animateScrolling(this.curOp.scrollTop);
}
@@ -274,6 +278,10 @@ var Editor = function(renderer, session) {
this.setSession = function(session) {
if (this.session == session)
return;
+
+ // make sure operationEnd events are not emitted to wrong session
+ if (this.curOp) this.endOperation();
+ this.curOp = {};
var oldSession = this.session;
if (oldSession) {
@@ -373,6 +381,8 @@ var Editor = function(renderer, session) {
oldSession: oldSession
});
+ this.curOp = null;
+
oldSession && oldSession._signal("changeEditor", {oldEditor: this});
session && session._signal("changeEditor", {editor: this});
};
@@ -905,14 +915,16 @@ var Editor = function(renderer, session) {
*
*
**/
- this.onPaste = function(text) {
- // todo this should change when paste becomes a command
- if (this.$readOnly)
- return;
-
- var e = {text: text};
+ this.onPaste = function(text, event) {
+ 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 {
@@ -930,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/emmet.js b/lib/ace/ext/emmet.js
index ceb155ef..4faacef2 100644
--- a/lib/ace/ext/emmet.js
+++ b/lib/ace/ext/emmet.js
@@ -393,7 +393,7 @@ exports.updateCommands = function(editor, enabled) {
};
exports.isSupportedMode = function(modeId) {
- return modeId && /css|less|scss|sass|stylus|html|php|twig|ejs/.test(modeId);
+ return modeId && /css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(modeId);
};
var onChangeMode = function(e, target) {
diff --git a/lib/ace/ext/language_tools.js b/lib/ace/ext/language_tools.js
index f02390ee..563fe58a 100644
--- a/lib/ace/ext/language_tools.js
+++ b/lib/ace/ext/language_tools.js
@@ -155,7 +155,6 @@ function getCompletionPrefix(editor) {
var doLiveAutocomplete = function(e) {
var editor = e.editor;
- var text = e.args || "";
var hasCompleter = editor.completer && editor.completer.activated;
// We don't want to autocomplete with no prefix
diff --git a/lib/ace/ext/modelist.js b/lib/ace/ext/modelist.js
index 7a5a1e9c..675a4b85 100644
--- a/lib/ace/ext/modelist.js
+++ b/lib/ace/ext/modelist.js
@@ -117,12 +117,13 @@ var supportedModes = {
MUSHCode: ["mc|mush"],
MySQL: ["mysql"],
Nix: ["nix"],
+ Nim: ["nim"],
ObjectiveC: ["m|mm"],
OCaml: ["ml|mli"],
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/ext/static_highlight.js b/lib/ace/ext/static_highlight.js
index b2287f15..2acb3ac5 100644
--- a/lib/ace/ext/static_highlight.js
+++ b/lib/ace/ext/static_highlight.js
@@ -37,6 +37,10 @@ var baseStyles = require("../requirejs/text!./static.css");
var config = require("../config");
var dom = require("../lib/dom");
+var SimpleTextLayer = function() {
+ this.config = {};
+};
+SimpleTextLayer.prototype = TextLayer.prototype;
var highlight = function(el, opts, callback) {
var m = el.className.match(/lang-(\w+)/);
@@ -149,12 +153,8 @@ highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) {
session.setUseWorker(false);
session.setMode(mode);
- var textLayer = new TextLayer(document.createElement("div"));
+ var textLayer = new SimpleTextLayer();
textLayer.setSession(session);
- textLayer.config = {
- characterWidth: 10,
- lineHeight: 20
- };
session.setValue(input);
diff --git a/lib/ace/ext/themelist.js b/lib/ace/ext/themelist.js
index 2350a2e2..0df76b02 100644
--- a/lib/ace/ext/themelist.js
+++ b/lib/ace/ext/themelist.js
@@ -73,6 +73,7 @@ var themeData = [
["Solarized Dark" ,"solarized_dark" , "dark"],
["Terminal" ,"terminal" , "dark"],
["Tomorrow Night" ,"tomorrow_night" , "dark"],
+ ["The Night After Tomorrow" ,"the_night_after_tomorrow" , "dark"],
["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"],
["Tomorrow Night Bright","tomorrow_night_bright" , "dark"],
["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"],
diff --git a/lib/ace/incremental_search.js b/lib/ace/incremental_search.js
index a64e1857..e4c1bdf8 100644
--- a/lib/ace/incremental_search.js
+++ b/lib/ace/incremental_search.js
@@ -105,7 +105,7 @@ function objectToRegExp(obj) {
this.$mousedownHandler = ed.addEventListener('mousedown', this.onMouseDown.bind(this));
this.selectionFix(ed);
this.statusMessage(true);
- }
+ };
this.deactivate = function(reset) {
this.cancelSearch(reset);
@@ -117,7 +117,7 @@ function objectToRegExp(obj) {
}
ed.onPaste = this.$originalEditorOnPaste;
this.message('');
- }
+ };
this.selectionFix = function(editor) {
// Fix selection bug: When clicked inside the editor
@@ -128,7 +128,7 @@ function objectToRegExp(obj) {
if (editor.selection.isEmpty() && !editor.session.$emacsMark) {
editor.clearSelection();
}
- }
+ };
this.highlight = function(regexp) {
var sess = this.$editor.session,
@@ -136,7 +136,7 @@ function objectToRegExp(obj) {
new SearchHighlight(null, "ace_isearch-result", "text"));
hl.setRegexp(regexp);
sess._emit("changeBackMarker"); // force highlight layer redraw
- }
+ };
this.cancelSearch = function(reset) {
var e = this.$editor;
@@ -150,7 +150,7 @@ function objectToRegExp(obj) {
}
this.highlight(null);
return Range.fromPoints(this.$currentPos, this.$currentPos);
- }
+ };
this.highlightAndFindWithNeedle = function(moveToNext, needleUpdateFunc) {
if (!this.$editor) return null;
@@ -163,7 +163,7 @@ function objectToRegExp(obj) {
if (options.needle.length === 0) {
this.statusMessage(true);
return this.cancelSearch(true);
- };
+ }
// try to find the next occurence and enable highlighting marker
options.start = this.$currentPos;
@@ -176,13 +176,13 @@ function objectToRegExp(obj) {
this.$editor.selection.setRange(Range.fromPoints(shouldSelect ? this.$startPos : found.end, found.end));
if (moveToNext) this.$currentPos = found.end;
// highlight after cursor move, so selection works properly
- this.highlight(options.re)
+ this.highlight(options.re);
}
this.statusMessage(found);
return found;
- }
+ };
this.addString = function(s) {
return this.highlightAndFindWithNeedle(false, function(needle) {
@@ -192,7 +192,7 @@ function objectToRegExp(obj) {
reObj.expression += s;
return objectToRegExp(reObj);
});
- }
+ };
this.removeChar = function(c) {
return this.highlightAndFindWithNeedle(false, function(needle) {
@@ -202,7 +202,7 @@ function objectToRegExp(obj) {
reObj.expression = reObj.expression.substring(0, reObj.expression.length-1);
return objectToRegExp(reObj);
});
- }
+ };
this.next = function(options) {
// try to find the next occurence of whatever we have searched for
@@ -215,29 +215,29 @@ function objectToRegExp(obj) {
return options.useCurrentOrPrevSearch && needle.length === 0 ?
this.$prevNeedle || '' : needle;
});
- }
+ };
this.onMouseDown = function(evt) {
// when mouse interaction happens then we quit incremental search
this.deactivate();
return true;
- }
+ };
this.onPaste = function(text) {
this.addString(text);
- }
+ };
this.convertNeedleToRegExp = function() {
return this.highlightAndFindWithNeedle(false, function(needle) {
return isRegExp(needle) ? needle : stringToRegExp(needle, 'ig');
});
- }
+ };
this.convertNeedleToString = function() {
return this.highlightAndFindWithNeedle(false, function(needle) {
return isRegExp(needle) ? regExpToObject(needle).expression : needle;
});
- }
+ };
this.statusMessage = function(found) {
var options = this.$options, msg = '';
@@ -245,7 +245,7 @@ function objectToRegExp(obj) {
msg += 'isearch: ' + options.needle;
msg += found ? '' : ' (not found)';
this.message(msg);
- }
+ };
this.message = function(msg) {
if (this.$editor.showCommandLine) {
@@ -254,7 +254,7 @@ function objectToRegExp(obj) {
} else {
console.log(msg);
}
- }
+ };
}).call(IncrementalSearch.prototype);
diff --git a/lib/ace/keyboard/emacs.js b/lib/ace/keyboard/emacs.js
index 945eddf3..8cecad1b 100644
--- a/lib/ace/keyboard/emacs.js
+++ b/lib/ace/keyboard/emacs.js
@@ -428,7 +428,7 @@ exports.emacsKeys = {
"M-;": "togglecomment",
"C-/|C-x u|S-C--|C-z": "undo",
- "S-C-/|S-C-x u|C--|S-C-z": "redo", //infinite undo?
+ "S-C-/|S-C-x u|C--|S-C-z": "redo", // infinite undo?
// vertical editing
"C-x r": "selectRectangularRegion",
"M-x": {command: "focusCommandLine", args: "M-x "}
@@ -483,7 +483,7 @@ exports.handler.addCommands({
// different. Deactivate the mark when setMark is run with active
// mark
if (transientMarkModeActive && (mark || !hasNoSelection)) {
- if (editor.inMultiSelectMode) editor.forEachSelection({exec: editor.clearSelection.bind(editor)})
+ if (editor.inMultiSelectMode) editor.forEachSelection({exec: editor.clearSelection.bind(editor)});
else editor.clearSelection();
if (mark) editor.pushEmacsMark(null);
return;
diff --git a/lib/ace/keyboard/hash_handler.js b/lib/ace/keyboard/hash_handler.js
index 06badccd..a7dc1a93 100644
--- a/lib/ace/keyboard/hash_handler.js
+++ b/lib/ace/keyboard/hash_handler.js
@@ -87,9 +87,12 @@ MultiHashHandler.prototype = HashHandler.prototype;
}
};
- this.bindKey = function(key, command, asDefault) {
- if (typeof key == "object")
+ this.bindKey = function(key, command, position) {
+ if (typeof key == "object") {
+ if (position == undefined)
+ position = key.position;
key = key[this.platform];
+ }
if (!key)
return;
if (typeof command == "function")
@@ -110,11 +113,15 @@ MultiHashHandler.prototype = HashHandler.prototype;
}
var binding = this.parseKeys(keyPart);
var id = KEY_MODS[binding.hashId] + binding.key;
- this._addCommandToBinding(chain + id, command, asDefault);
+ this._addCommandToBinding(chain + id, command, position);
}, this);
};
- this._addCommandToBinding = function(keyId, command, asDefault) {
+ function getPosition(command) {
+ return typeof command == "object" && command.bindKey
+ && command.bindKey.position || 0;
+ }
+ this._addCommandToBinding = function(keyId, command, position) {
var ckb = this.commandKeyBinding, i;
if (!command) {
delete ckb[keyId];
@@ -126,11 +133,21 @@ MultiHashHandler.prototype = HashHandler.prototype;
} else if ((i = ckb[keyId].indexOf(command)) != -1) {
ckb[keyId].splice(i, 1);
}
-
- if (asDefault || command.isDefault)
- ckb[keyId].unshift(command);
- else
- ckb[keyId].push(command);
+
+ if (typeof position != "number") {
+ if (position || command.isDefault)
+ position = -100;
+ else
+ position = getPosition(command);
+ }
+ var commands = ckb[keyId];
+ for (i = 0; i < commands.length; i++) {
+ var other = commands[i];
+ var otherPos = getPosition(other);
+ if (otherPos > position)
+ break;
+ }
+ commands.splice(i, 0, command);
}
};
@@ -219,10 +236,18 @@ MultiHashHandler.prototype = HashHandler.prototype;
}
}
- if (data.$keyChain && keyCode > 0)
- data.$keyChain = "";
+ if (data.$keyChain) {
+ if ((!hashId || hashId == 4) && keyString.length == 1)
+ data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input
+ else if (hashId == -1 || keyCode > 0)
+ data.$keyChain = ""; // reset keyChain
+ }
return {command: command};
};
+
+ this.getStatusText = function(editor, data) {
+ return data.$keyChain || "";
+ };
}).call(HashHandler.prototype);
diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js
index 0bd57eed..4a2bb72c 100644
--- a/lib/ace/keyboard/textinput.js
+++ b/lib/ace/keyboard/textinput.js
@@ -306,7 +306,7 @@ var TextInput = function(parentNode, host) {
var data = handleClipboardData(e);
if (typeof data == "string") {
if (data)
- host.onPaste(data);
+ host.onPaste(data, e);
if (useragent.isIE)
setTimeout(resetSelection);
event.preventDefault(e);
diff --git a/lib/ace/keyboard/vim.js b/lib/ace/keyboard/vim.js
index f3aafe6a..17c26c16 100644
--- a/lib/ace/keyboard/vim.js
+++ b/lib/ace/keyboard/vim.js
@@ -257,6 +257,7 @@ define(function(require, exports, module) {
}
if (!this.ace.inVirtualSelectionMode)
this.ace.exitMultiSelectMode();
+ this.ace.session.unfold({row: line, column: ch});
this.ace.selection.moveTo(line, ch);
};
this.getCursor = function(p) {
@@ -729,10 +730,14 @@ CodeMirror.defineExtension = function(name, fn) {
CodeMirror.prototype[name] = fn;
};
dom.importCssString(".normal-mode .ace_cursor{\
- border: 0!important;\
+ border: 1px solid red;\
background-color: red;\
opacity: 0.5;\
-}.ace_dialog {\
+}\
+.normal-mode .ace_hidden-cursors .ace_cursor{\
+ background-color: transparent;\
+}\
+.ace_dialog {\
position: absolute;\
left: 0; right: 0;\
background: white;\
@@ -758,23 +763,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
font-family: monospace;\
}", "vimMode");
(function() {
- function dialogDiv(cm, template, bottom) {
- var wrap = cm.ace.container;
- var dialog;
- dialog = wrap.appendChild(document.createElement("div"));
- if (bottom)
- dialog.className = "ace_dialog ace_dialog-bottom";
- else
- dialog.className = "ace_dialog ace_dialog-top";
-
- if (typeof template == "string") {
- dialog.innerHTML = template;
- } else { // Assuming it's a detached DOM element.
- dialog.appendChild(template);
- }
- return dialog;
- }
-
function closeNotification(cm, newVal) {
if (cm.state.currentNotificationClose)
cm.state.currentNotificationClose();
@@ -2196,6 +2184,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
return;
}
if (motionArgs.toJumplist) {
+ if (!operator)
+ cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace patch
var jumpList = vimGlobalState.jumpList;
// if the current motion is # or *, use cachedCursor
var cachedCursor = jumpList.cachedCursor;
@@ -2882,6 +2872,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
var markPos = mark ? mark.find() : undefined;
markPos = markPos ? markPos : cm.getCursor();
cm.setCursor(markPos);
+ cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace patch
},
scroll: function(cm, actionArgs, vim) {
if (vim.visualMode) {
@@ -5932,7 +5923,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
}, true);
}
return isHandled;
- };
+ }
exports.CodeMirror = CodeMirror;
var getVim = Vim.maybeInitVimState_;
exports.handler = {
@@ -5946,9 +5937,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
if (!vim.insertMode) {
var isbackwards = !sel.cursor
? session.selection.isBackwards() || session.selection.isEmpty()
- : Range.comparePoints(sel.cursor, sel.start) <= 0
+ : Range.comparePoints(sel.cursor, sel.start) <= 0;
if (!isbackwards && left > w)
- left -= w
+ left -= w;
}
if (!vim.insertMode && vim.status) {
h = h / 2;
@@ -6112,13 +6103,13 @@ dom.importCssString(".normal-mode .ace_cursor{\
};
var renderVirtualNumbers = {
getText: function(session, row) {
- return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9? "\xb7" : "" ))) + ""
+ return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9? "\xb7" : "" ))) + "";
},
getWidth: function(session, lastLineNumber, config) {
return session.getLength().toString().length * config.characterWidth;
},
update: function(e, editor) {
- editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER)
+ editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER);
},
attach: function(editor) {
editor.renderer.$gutterLayer.$renderer = this;
@@ -6163,7 +6154,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
if (cm.ace.inVirtualSelectionMode)
cm.ace.on("beforeEndOperation", delayedExecAceCommand);
else
- delayedExecAceCommand(null, cm.ace)
+ delayedExecAceCommand(null, cm.ace);
};
function delayedExecAceCommand(op, ace) {
ace.off("beforeEndOperation", delayedExecAceCommand);
@@ -6182,5 +6173,5 @@ dom.importCssString(".normal-mode .ace_cursor{\
exports.handler.actions = actions;
exports.Vim = Vim;
- Vim.map("Y", "yy");
+ Vim.map("Y", "yy", "normal");
});
diff --git a/lib/ace/layer/font_metrics.js b/lib/ace/layer/font_metrics.js
index 7e71f8a8..715c6cf3 100644
--- a/lib/ace/layer/font_metrics.js
+++ b/lib/ace/layer/font_metrics.js
@@ -120,9 +120,9 @@ var FontMetrics = exports.FontMetrics = function(parentEl, interval) {
this.setPolling = function(val) {
if (val) {
this.$pollSizeChanges();
- } else {
- if (this.$pollSizeChangesTimer)
- this.$pollSizeChangesTimer;
+ } else if (this.$pollSizeChangesTimer) {
+ clearInterval(this.$pollSizeChangesTimer);
+ this.$pollSizeChangesTimer = 0;
}
};
diff --git a/lib/ace/layer/marker.js b/lib/ace/layer/marker.js
index 26f38447..9818d225 100644
--- a/lib/ace/layer/marker.js
+++ b/lib/ace/layer/marker.js
@@ -90,7 +90,7 @@ var Marker = function(parentEl) {
else
this.drawMultiLineMarker(html, range, marker.clazz, config);
} else {
- this.drawSingleLineMarker(html, range, marker.clazz + " ace_start", config);
+ this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config);
}
}
this.element.innerHTML = html.join("");
@@ -100,29 +100,30 @@ var Marker = function(parentEl) {
return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;
};
+ function getBorderClass(tl, tr, br, bl) {
+ return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);
+ }
// Draws a marker, which spans a range of text on multiple lines
this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {
- // selection start
- var row = range.start.row;
var session = this.session;
-
- var lineRange = new Range(
- row, range.start.column,
- row, session.getScreenLastRowColumn(row)
- );
- this.drawSingleLineMarker(stringBuilder, lineRange, clazz + " ace_start", layerConfig, 1, extraStyle);
-
- // selection end
- row = range.end.row;
- lineRange = new Range(row, session.getRowWrapIndent(row), row, range.end.column);
- this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, extraStyle);
-
- for (row = range.start.row + 1; row < range.end.row; row++) {
- lineRange.start.row = row;
- lineRange.start.column = session.getRowWrapIndent(row);
- lineRange.end.row = row;
- lineRange.end.column = session.getScreenLastRowColumn(row);
- this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, extraStyle);
+ var start = range.start.row;
+ var end = range.end.row;
+ var row = start;
+ var prev = 0;
+ var curr = 0;
+ var next = session.getScreenLastRowColumn(row);
+ var lineRange = new Range(row, range.start.column, row, curr);
+ for (; row <= end; row++) {
+ lineRange.start.row = lineRange.end.row = row;
+ lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);
+ lineRange.end.column = next;
+ prev = curr;
+ curr = next;
+ next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;
+ this.drawSingleLineMarker(stringBuilder, lineRange,
+ clazz + (row == start ? " ace_start" : "") + " ace_br"
+ + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end),
+ layerConfig, row == end ? 0 : 1, extraStyle);
}
};
@@ -136,7 +137,7 @@ var Marker = function(parentEl) {
extraStyle = extraStyle || "";
stringBuilder.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/lib/dom.js b/lib/ace/lib/dom.js
index ef2f7caa..2cbfe23e 100644
--- a/lib/ace/lib/dom.js
+++ b/lib/ace/lib/dom.js
@@ -91,6 +91,11 @@ exports.toggleCssClass = function(el, name) {
return add;
};
+if (typeof document == "undefined") {
+ exports.importCssString = function() {};
+ return;
+}
+
/*
* Add or remove a CSS class from the list of classes on the given node
* depending on the value of include
@@ -173,9 +178,6 @@ exports.getInnerHeight = function(element) {
};
-if (typeof document == "undefined")
- return;
-
if (window.pageYOffset !== undefined) {
exports.getPageScrollTop = function() {
return window.pageYOffset;
diff --git a/lib/ace/lib/event.js b/lib/ace/lib/event.js
index 06932d3c..57924056 100644
--- a/lib/ace/lib/event.js
+++ b/lib/ace/lib/event.js
@@ -244,7 +244,7 @@ function normalizeCommandKeys(callback, e, keyCode) {
if (pressedKeys[keyCode] == 1)
ts = e.timeStamp;
} else if (keyCode === 18 && hashId === 3 && location === 2) {
- var dt = e.timestamp - ts;
+ var dt = e.timeStamp - ts;
if (dt < 50)
pressedKeys.altGr = true;
}
@@ -326,13 +326,14 @@ exports.addCommandKeyListener = function(el, callback) {
});
if (!pressedKeys) {
- pressedKeys = Object.create(null);
- addListener(window, "focus", function(e) {
- pressedKeys = Object.create(null);
- });
+ resetPressedKeys();
+ addListener(window, "focus", resetPressedKeys);
}
}
};
+function resetPressedKeys(e) {
+ pressedKeys = Object.create(null);
+}
if (window.postMessage && !useragent.isOldIE) {
var postMessageId = 1;
diff --git a/lib/ace/mode/_test/tokens_gherkin.json b/lib/ace/mode/_test/tokens_gherkin.json
index d16ffc6c..173d9798 100644
--- a/lib/ace/mode/_test/tokens_gherkin.json
+++ b/lib/ace/mode/_test/tokens_gherkin.json
@@ -56,34 +56,34 @@
],[
"start",
["text"," "],
- ["comment","| "],
- ["string","start "],
- ["comment","| "],
- ["string","eat "],
- ["comment","| "],
- ["string","left "],
+ ["comment","|"],
+ ["string"," start "],
+ ["comment","|"],
+ ["string"," eat "],
+ ["comment","|"],
+ ["string"," left "],
["comment","|"]
],[
"start",
["text"," "],
- ["comment","| "],
- ["string"," 12 "],
- ["comment","| "],
- ["string"," 5 "],
- ["comment","| "],
- ["string"," 7 "],
+ ["comment","|"],
+ ["string"," 12 "],
+ ["comment","|"],
+ ["string"," 5 "],
+ ["comment","|"],
+ ["string"," 7 "],
["comment","|"]
],[
"start",
["text"," "],
- ["comment","| "],
- ["string"," 20 "],
- ["comment","| "],
- ["string"," 5 "],
- ["comment","| "],
- ["string"," 15 "],
- ["comment","| "],
- ["string"," "]
+ ["comment","|"],
+ ["string"," 20 "],
+ ["comment","|"],
+ ["string"," 5 "],
+ ["comment","|"],
+ ["string"," 15 "],
+ ["comment","|"],
+ ["string"," "]
],[
"start"
],[
diff --git a/lib/ace/mode/_test/tokens_rust.json b/lib/ace/mode/_test/tokens_rust.json
index 6592575b..8c59a3aa 100644
--- a/lib/ace/mode/_test/tokens_rust.json
+++ b/lib/ace/mode/_test/tokens_rust.json
@@ -10,10 +10,9 @@
],[
"start",
["keyword.source.rust","fn"],
- ["meta.function.source.rust"," "],
+ ["text"," "],
["entity.name.function.source.rust","main"],
- ["meta.function.source.rust","("],
- ["text",") {"]
+ ["text","() {"]
],[
"start",
["text"," "],
@@ -88,10 +87,14 @@
],[
"start",
["keyword.source.rust","fn"],
- ["meta.function.source.rust"," "],
- ["entity.name.function.source.rust","map"],
- ["meta.function.source.rust","("],
- ["text","vector: &[T]"],
+ ["text"," "],
+ ["entity.name.function.source.rust","map"],
+ ["keyword.operator","<"],
+ ["text","T"],
+ ["keyword.operator",","],
+ ["text"," U"],
+ ["keyword.operator",">"],
+ ["text","(vector: &[T]"],
["keyword.operator",","],
["text"," function: &fn(v: &T) "],
["keyword.operator","->"],
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/gherkin_highlight_rules.js b/lib/ace/mode/gherkin_highlight_rules.js
index d54db204..04ce877c 100644
--- a/lib/ace/mode/gherkin_highlight_rules.js
+++ b/lib/ace/mode/gherkin_highlight_rules.js
@@ -36,18 +36,18 @@ var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]
var GherkinHighlightRules = function() {
- // need to include constant ints
+ // need to include constant ints
this.$rules = {
- start : [{
+ start : [{
token: 'constant.numeric',
regex: "(?:(?:[1-9]\\d*)|(?:0))"
- }, {
- token : "comment",
- regex : "#.*$"
- }, {
- token : "keyword",
- regex : "Feature:|Background:|Scenario:|Scenario\ Outline:|Examples:|Given|When|Then|And|But|\\*",
- }, {
+ }, {
+ token : "comment",
+ regex : "#.*$"
+ }, {
+ token : "keyword",
+ regex : "Feature:|Background:|Scenario:|Scenario\ Outline:|Examples:|Given|When|Then|And|But|\\*",
+ }, {
token : "string", // multi line """ string start
regex : '"{3}',
next : "qqstring3"
@@ -56,22 +56,22 @@ var GherkinHighlightRules = function() {
regex : '"',
next : "qqstring"
}, {
- token : "comment",
- regex : "@[A-Za-z0-9]+",
- next : "start"
+ token : "comment",
+ regex : "@[A-Za-z0-9]+",
+ next : "start"
}, {
- token : "comment",
- regex : "<.+>"
+ token : "comment",
+ regex : "<.+>"
}, {
- token : "comment",
- regex : "\\| ",
- next : "table-item"
+ token : "comment",
+ regex : "\\|(?=.)",
+ next : "table-item"
}, {
- token : "comment",
- regex : "\\|$",
- next : "start"
+ token : "comment",
+ regex : "\\|$",
+ next : "start"
}],
- "qqstring3" : [ {
+ "qqstring3" : [ {
token : "constant.language.escape",
regex : stringEscape
}, {
@@ -81,7 +81,7 @@ var GherkinHighlightRules = function() {
}, {
defaultToken : "string"
}],
- "qqstring" : [{
+ "qqstring" : [{
token : "constant.language.escape",
regex : stringEscape
}, {
@@ -96,15 +96,19 @@ var GherkinHighlightRules = function() {
defaultToken: "string"
}],
"table-item" : [{
+ token : "comment",
+ regex : /$/,
+ next : "start"
+ }, {
+ token : "comment",
+ regex : /\|/
+ }, {
token : "string",
- regex : "[A-Za-z0-9 ]*",
- next : "start"
- }],
+ regex : /\\./
+ }, {
+ defaultToken : "string"
+ }]
};
-
-
- //new TextHighlightRules().getRules();
-
}
oop.inherits(GherkinHighlightRules, TextHighlightRules);
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/html_highlight_rules.js b/lib/ace/mode/html_highlight_rules.js
index 9c9cc36f..4effa2aa 100644
--- a/lib/ace/mode/html_highlight_rules.js
+++ b/lib/ace/mode/html_highlight_rules.js
@@ -65,7 +65,7 @@ var HtmlHighlightRules = function() {
include : "tag_whitespace"
}, {
token : "entity.other.attribute-name.xml",
- regex : "[-_a-zA-Z0-9:]+"
+ regex : "[-_a-zA-Z0-9:.]+"
}, {
token : "keyword.operator.attribute-equals.xml",
regex : "=",
@@ -89,7 +89,7 @@ var HtmlHighlightRules = function() {
return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml",
"meta.tag" + (group ? "." + group : "") + ".tag-name.xml"];
},
- regex : "(?)([-_a-zA-Z0-9:]+)",
+ regex : "(?)([-_a-zA-Z0-9:.]+)",
next: "tag_stuff"
}],
tag_stuff: [
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/mode/nim.js b/lib/ace/mode/nim.js
new file mode 100644
index 00000000..cbf48ef2
--- /dev/null
+++ b/lib/ace/mode/nim.js
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2010, Ajax.org B.V.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+define(function(require, exports, module) {
+"use strict";
+
+var oop = require("../lib/oop");
+var TextMode = require("./text").Mode;
+var NimHighlightRules = require("./nim_highlight_rules").NimHighlightRules;
+var NimFoldMode = require("./folding/pythonic").FoldMode;
+var Range = require("../range").Range;
+
+var Mode = function() {
+ this.HighlightRules = NimHighlightRules;
+ this.foldingRules = new NimFoldMode("\\:|=");
+};
+oop.inherits(Mode, TextMode);
+
+(function() {
+
+ this.lineCommentStart = "#";
+
+ this.getNextLineIndent = function(state, line, tab) {
+ var indent = this.$getIndent(line);
+
+ var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
+ var tokens = tokenizedLine.tokens;
+
+ if (tokens.length && tokens[tokens.length-1].type == "comment") {
+ return indent;
+ }
+
+ if (state == "start") {
+ var match = line.match(/^.*[\{\(\[\:=]\s*$/);
+ if (match) {
+ indent += tab;
+ }
+ }
+
+ return indent;
+ };
+
+ var outdents = {
+ "discard": 1,
+ "return": 1,
+ "raise": 1,
+ "break": 1,
+ "continue": 1
+ };
+
+ this.checkOutdent = function(state, line, input) {
+ if (input !== "\r\n" && input !== "\r" && input !== "\n")
+ return false;
+
+ var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;
+
+ if (!tokens)
+ return false;
+
+ // ignore trailing comments
+ do {
+ var last = tokens.pop();
+ } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/))));
+
+ if (!last)
+ return false;
+
+ return (last.type == "keyword" && outdents[last.value]);
+ };
+
+ this.autoOutdent = function(state, doc, row) {
+ // outdenting in python is slightly different because it always applies
+ // to the next line and only of a new line is inserted
+
+ row += 1;
+ var indent = this.$getIndent(doc.getLine(row));
+ var tab = doc.getTabString();
+ if (indent.slice(-tab.length) == tab)
+ doc.remove(new Range(row, indent.length-tab.length, row, indent.length));
+ };
+
+ this.$id = "ace/mode/nim";
+}).call(Mode.prototype);
+
+exports.Mode = Mode;
+});
diff --git a/lib/ace/mode/nim_highlight_rules.js b/lib/ace/mode/nim_highlight_rules.js
new file mode 100644
index 00000000..e762a636
--- /dev/null
+++ b/lib/ace/mode/nim_highlight_rules.js
@@ -0,0 +1,238 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2010, Ajax.org B.V.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+/*
+ * TODO: nim delimiters
+ */
+
+define(function(require, exports, module) {
+"use strict";
+
+var oop = require("../lib/oop");
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
+var num_suffix = "(\'[Ff]32|\'[Ff]64|\'[IiUu]8|\'[IiUu]16|\'[IiUu]32|\'[IiUu]64)";
+
+var NimHighlightRules = function() {
+
+ var keywords = (
+ "addr|and|as|asm|atomic|bind|block|break|case|cast|const|continue|" +
+ "converter|defer|discard|distinct|div|do|elif|else|end|enum|except|" +
+ "export|finally|for|from|func|generic|if|import|in|include|interface|" +
+ "is|isnot|iterator|let|macro|method|mixin|mod|nil|not|notin|object|of|" +
+ "or|out|proc|ptr|raise|ref|return|shl|shr|static|template|try|tuple|" +
+ "type|using|var|when|while|with|without|xor|yield"
+ );
+
+ var builtinConstants = (
+ "true|false|nil|NotImplemented|Ellipsis"
+ );
+
+ var storageType = (
+ "string|seq|array|expr|stmt|typed|untyped|any|auto|bool|cdouble|cfloat|"+
+ "cchar|clongdouble|clong|clonglong|cshort|csize|cstring|cstringarray|"+
+ "culong|culonglong|cushort|guarded|natural|openarray|ordinal|pointer|"+
+ "range|set|shared|static|typedesc|varargs|void"
+ );
+
+ var builtinFunctions = (
+ "defined|declared|declaredInScope|echo|$"
+ );
+
+ //var futureReserved = "";
+ var keywordMapper = this.createKeywordMapper({
+ "invalid.deprecated": "debugger",
+ "support.function": builtinFunctions,
+ //"invalid.illegal": futureReserved,
+ "constant.language": builtinConstants,
+ "storage.type" : storageType,
+ "keyword": keywords
+ }, "identifier");
+
+ var strPre = "(?:r|R)?";
+
+ var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))";
+ var octInteger = "(?:0[o]?[0-7]+)";
+ var hexInteger = "(?:0[xX][\\dA-Fa-f]+)";
+ var binInteger = "(?:0[bB][01]+)";
+ var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")";
+
+ var exponent = "(?:[eE][+-]?\\d+)";
+ var fraction = "(?:\\.\\d+)";
+ var intPart = "(?:\\d+)";
+ var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))";
+ var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")";
+ var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")";
+
+ var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})";
+
+ this.$rules = {
+ "start" : [ {
+ token : "comment",
+ regex : "#.*$"
+ }, {
+ token : "keyword",
+ regex : "(proc|method|temdplate|macro|macromethod|converter|func|iterator) ",
+ next : "qproc_name"
+ }, {
+ token : "storage.type",
+ regex : "(c|cu|u)?int(8|16|32|64)?",
+ }, {
+ token : "storage.type",
+ regex : "(c|cu|u|cs)?char",
+ }, {
+ token : "storage.type",
+ regex : "float(32|64)?",
+ }, {
+ token : "docstring",
+ regex : "##.*$"
+ }, {
+ token : "string", // multi line """ string start
+ regex : strPre + '"{3}',
+ next : "qqstring3"
+ }, {
+ token : "string", // " string
+ regex : strPre + '"(?=.)',
+ next : "qqstring"
+ }, {
+ token : "string", // multi line ''' string start
+ regex : strPre + "'{3}",
+ next : "qstring3"
+ }, {
+ token : "backtick", // ` string
+ regex : strPre + "`(?=.)",
+ next : "qxstring"
+ }, {
+ token : "string", // ' string
+ regex : strPre + "'(?=.)",
+ next : "qstring"
+ }, {
+ token : "constant.numeric", // imaginary
+ regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b"
+ }, {
+ token : "constant.numeric", // float
+ regex : floatNumber
+ }, {
+ token : "constant.numeric", // long integer
+ regex : integer + "[lL]\\b"
+ }, {
+ token : "constant.numeric", // integer
+ regex : integer + "\\b"
+ }, {
+ token : keywordMapper,
+ regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
+ }, {
+ token : "keyword.operator",
+ regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|="
+ }, {
+ token : "paren.lparen",
+ regex : "[\\[\\(\\{]"
+ }, {
+ token : "paren.rparen",
+ regex : "[\\]\\)\\}]"
+ }, {
+ token : "text",
+ regex : "\\s+"
+ } ],
+ "qqstring3" : [ {
+ token : "constant.language.escape",
+ regex : stringEscape
+ }, {
+ token : "string", // multi line """ string end
+ regex : '"{3}',
+ next : "start"
+ }, {
+ defaultToken : "string"
+ } ],
+ "qstring3" : [ {
+ token : "constant.language.escape",
+ regex : stringEscape
+ }, {
+ token : "string", // multi line ''' string end
+ regex : "'{3}",
+ next : "start"
+ }, {
+ defaultToken : "string"
+ } ],
+ "qqstring" : [{
+ token : "constant.language.escape",
+ regex : stringEscape
+ }, {
+ token : "string",
+ regex : "\\\\$",
+ next : "qqstring"
+ }, {
+ token : "string",
+ regex : '"|$',
+ next : "start"
+ }, {
+ defaultToken: "string"
+ }],
+ "qstring" : [{
+ token : "constant.language.escape",
+ regex : stringEscape
+ }, {
+ token : "string",
+ regex : "\\\\$",
+ next : "qstring"
+ }, {
+ token : "string",
+ regex : "'|$",
+ next : "start"
+ }, {
+ defaultToken: "string"
+ }],
+ "qxstring" : [{
+ token : "constant.language.escape",
+ regex : stringEscape
+ }, {
+ token : "backtick",
+ regex : "\\\\$",
+ next : "qxstring"
+ }, {
+ token : "backtick",
+ regex : "`|$",
+ next : "start"
+ }, {
+ defaultToken: "backtick"
+ }],
+ "qproc_name":[{
+ token : "proc_name",
+ regex : "\\w+",
+ },{
+ token : "start_bracket",
+ regex : "(\\(|=|$)",
+ next : "start"
+ }],
+ };
+};
+
+oop.inherits(NimHighlightRules, TextHighlightRules);
+
+exports.NimHighlightRules = NimHighlightRules;
+});
diff --git a/lib/ace/mode/rust_highlight_rules.js b/lib/ace/mode/rust_highlight_rules.js
index 181cf11a..056e7a55 100644
--- a/lib/ace/mode/rust_highlight_rules.js
+++ b/lib/ace/mode/rust_highlight_rules.js
@@ -84,9 +84,8 @@ var RustHighlightRules = function() {
{ token: 'constant.character.escape.source.rust',
regex: stringEscape },
{ defaultToken: 'string.quoted.double.source.rust' } ] },
- { token: [ 'keyword.source.rust', 'meta.function.source.rust',
- 'entity.name.function.source.rust', 'meta.function.source.rust' ],
- regex: '\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_][\\w\\:,+ \\\'<>]*)(\\s*\\()' },
+ { token: [ 'keyword.source.rust', 'text', 'entity.name.function.source.rust' ],
+ regex: '\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)' },
{ token: 'support.constant', regex: '\\b[a-zA-Z_][\\w\\d]*::' },
{ token: 'keyword.source.rust',
regex: '\\b(?:as|assert|break|claim|const|do|drop|else|extern|fail|for|if|impl|in|let|log|loop|match|mod|module|move|mut|Owned|priv|pub|pure|ref|return|unchecked|unsafe|use|while|mod|Send|static|trait|class|struct|enum|type)\\b' },
diff --git a/lib/ace/mode/scheme.js b/lib/ace/mode/scheme.js
index aa462a10..2360b3da 100644
--- a/lib/ace/mode/scheme.js
+++ b/lib/ace/mode/scheme.js
@@ -39,15 +39,92 @@ define(function(require, exports, module) {
var oop = require("../lib/oop");
var TextMode = require("./text").Mode;
var SchemeHighlightRules = require("./scheme_highlight_rules").SchemeHighlightRules;
+var MatchingParensOutdent = require("./matching_parens_outdent").MatchingParensOutdent;
var Mode = function() {
this.HighlightRules = SchemeHighlightRules;
+ this.$outdent = new MatchingParensOutdent();
};
oop.inherits(Mode, TextMode);
(function() {
this.lineCommentStart = ";";
+ this.minorIndentFunctions = ["define", "lambda", "define-macro", "define-syntax", "syntax-rules", "define-record-type", "define-structure"];
+
+ this.$toIndent = function(str) {
+ return str.split('').map(function(ch) {
+ if (/\s/.exec(ch)) {
+ return ch;
+ } else {
+ return ' ';
+ }
+ }).join('');
+ };
+
+ this.$calculateIndent = function(line, tab) {
+ var baseIndent = this.$getIndent(line);
+ var delta = 0;
+ var isParen, ch;
+ // Walk back from end of line, find matching braces
+ for (var i = line.length - 1; i >= 0; i--) {
+ ch = line[i];
+ if (ch === '(') {
+ delta--;
+ isParen = true;
+ } else if (ch === '(' || ch === '[' || ch === '{') {
+ delta--;
+ isParen = false;
+ } else if (ch === ')' || ch === ']' || ch === '}') {
+ delta++;
+ }
+ if (delta < 0) {
+ break;
+ }
+ }
+ if (delta < 0 && isParen) {
+ // Were more brackets opened than closed and was a ( left open?
+ i += 1;
+ var iBefore = i;
+ var fn = '';
+ while (true) {
+ ch = line[i];
+ if (ch === ' ' || ch === '\t') {
+ if(this.minorIndentFunctions.indexOf(fn) !== -1) {
+ return this.$toIndent(line.substring(0, iBefore - 1) + tab);
+ } else {
+ return this.$toIndent(line.substring(0, i + 1));
+ }
+ } else if (ch === undefined) {
+ return this.$toIndent(line.substring(0, iBefore - 1) + tab);
+ }
+ fn += line[i];
+ i++;
+ }
+ } else if(delta < 0 && !isParen) {
+ // Were more brackets openend than closed and was it not a (?
+ return this.$toIndent(line.substring(0, i+1));
+ } else if(delta > 0) {
+ // Mere more brackets closed than opened? Outdent.
+ baseIndent = baseIndent.substring(0, baseIndent.length - tab.length);
+ return baseIndent;
+ } else {
+ // Were they nicely matched? Just indent like line before.
+ return baseIndent;
+ }
+ };
+
+ this.getNextLineIndent = function(state, line, tab) {
+ return this.$calculateIndent(line, tab);
+ };
+
+ this.checkOutdent = function(state, line, input) {
+ return this.$outdent.checkOutdent(line, input);
+ };
+
+ this.autoOutdent = function(state, doc, row) {
+ this.$outdent.autoOutdent(doc, row);
+ };
this.$id = "ace/mode/scheme";
}).call(Mode.prototype);
diff --git a/lib/ace/mode/sqlserver.js b/lib/ace/mode/sqlserver.js
index 0f66c1e5..5f24730c 100644
--- a/lib/ace/mode/sqlserver.js
+++ b/lib/ace/mode/sqlserver.js
@@ -46,7 +46,14 @@ oop.inherits(Mode, TextMode);
(function() {
this.lineCommentStart = "--";
this.blockComment = {start: "/*", end: "*/"};
-
+
+ /**
+ * Override keyword completions using list created in highlight rules
+ */
+ this.getCompletions = function(state, session, pos, prefix) {
+ return session.$mode.$highlightRules.completions;
+ };
+
this.$id = "ace/mode/sql";
}).call(Mode.prototype);
diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js
index 42e193d7..c914c0ae 100644
--- a/lib/ace/mode/sqlserver_highlight_rules.js
+++ b/lib/ace/mode/sqlserver_highlight_rules.js
@@ -77,22 +77,24 @@ var SqlServerHighlightRules = function() {
/* https://msdn.microsoft.com/en-us/library/ms177520.aspx */
"@@CONNECTIONS|@@CPU_BUSY|@@IDLE|@@IO_BUSY|@@PACKET_ERRORS|@@PACK_RECEIVED|@@PACK_SENT|@@TIMETICKS|@@TOTAL_ERRORS|@@TOTAL_READ|@@TOTAL_WRITE|FN_VIRTUALFILESTATS|" +
/* https://msdn.microsoft.com/en-us/library/ms188353.aspx */
- "PATINDEX|TEXTPTR|TEXTVALID"
+ "PATINDEX|TEXTPTR|TEXTVALID|" +
+ /* other */
+ "COALESCE|NULLIF"
);
// https://msdn.microsoft.com/en-us/library/ms187752.aspx
var dataTypes = ("BIGINT|BINARY|BIT|CHAR|CURSOR|DATE|DATETIME|DATETIME2|DATETIMEOFFSET|DECIMAL|FLOAT|HIERARCHYID|IMAGE|INTEGER|INT|MONEY|NCHAR|NTEXT|NUMERIC|NVARCHAR|REAL|SMALLDATETIME|SMALLINT|SMALLMONEY|SQL_VARIANT|TABLE|TEXT|TIME|TIMESTAMP|TINYINT|UNIQUEIDENTIFIER|VARBINARY|VARCHAR|XML");
-
+
//https://msdn.microsoft.com/en-us/library/ms176007.aspx (these are lower case!)
var builtInStoredProcedures = "sp_addextendedproc|sp_addextendedproperty|sp_addmessage|sp_addtype|sp_addumpdevice|sp_add_data_file_recover_suspect_db|sp_add_log_file_recover_suspect_db|sp_altermessage|sp_attach_db|sp_attach_single_file_db|sp_autostats|sp_bindefault|sp_bindrule|sp_bindsession|sp_certify_removable|sp_clean_db_file_free_space|sp_clean_db_free_space|sp_configure|sp_control_plan_guide|sp_createstats|sp_create_plan_guide|sp_create_plan_guide_from_handle|sp_create_removable|sp_cycle_errorlog|sp_datatype_info|sp_dbcmptlevel|sp_dbmmonitoraddmonitoring|sp_dbmmonitorchangealert|sp_dbmmonitorchangemonitoring|sp_dbmmonitordropalert|sp_dbmmonitordropmonitoring|sp_dbmmonitorhelpalert|sp_dbmmonitorhelpmonitoring|sp_dbmmonitorresults|sp_db_increased_partitions|sp_delete_backuphistory|sp_depends|sp_describe_first_result_set|sp_describe_undeclared_parameters|sp_detach_db|sp_dropdevice|sp_dropextendedproc|sp_dropextendedproperty|sp_dropmessage|sp_droptype|sp_execute|sp_executesql|sp_getapplock|sp_getbindtoken|sp_help|sp_helpconstraint|sp_helpdb|sp_helpdevice|sp_helpextendedproc|sp_helpfile|sp_helpfilegroup|sp_helpindex|sp_helplanguage|sp_helpserver|sp_helpsort|sp_helpstats|sp_helptext|sp_helptrigger|sp_indexoption|sp_invalidate_textptr|sp_lock|sp_monitor|sp_prepare|sp_prepexec|sp_prepexecrpc|sp_procoption|sp_recompile|sp_refreshview|sp_releaseapplock|sp_rename|sp_renamedb|sp_resetstatus|sp_sequence_get_range|sp_serveroption|sp_setnetname|sp_settriggerorder|sp_spaceused|sp_tableoption|sp_unbindefault|sp_unbindrule|sp_unprepare|sp_updateextendedproperty|sp_updatestats|sp_validname|sp_who|sys.sp_merge_xtp_checkpoint_files|sys.sp_xtp_bind_db_resource_pool|sys.sp_xtp_checkpoint_force_garbage_collection|sys.sp_xtp_control_proc_exec_stats|sys.sp_xtp_control_query_exec_stats|sys.sp_xtp_unbind_db_resource_pool";
-
+
// https://msdn.microsoft.com/en-us/library/ms189822.aspx
var keywords = "ABSOLUTE|ACTION|ADA|ADD|ADMIN|AFTER|AGGREGATE|ALIAS|ALL|ALLOCATE|ALTER|AND|ANY|ARE|ARRAY|AS|ASC|ASENSITIVE|ASSERTION|ASYMMETRIC|AT|ATOMIC|AUTHORIZATION|BACKUP|BEFORE|BEGIN|BETWEEN|BIT_LENGTH|BLOB|BOOLEAN|BOTH|BREADTH|BREAK|BROWSE|BULK|BY|CALL|CALLED|CARDINALITY|CASCADE|CASCADED|CASE|CATALOG|CHARACTER|CHARACTER_LENGTH|CHAR_LENGTH|CHECK|CHECKPOINT|CLASS|CLOB|CLOSE|CLUSTERED|COALESCE|COLLATE|COLLATION|COLLECT|COLUMN|COMMIT|COMPLETION|COMPUTE|CONDITION|CONNECT|CONNECTION|CONSTRAINT|CONSTRAINTS|CONSTRUCTOR|CONTAINS|CONTAINSTABLE|CONTINUE|CORR|CORRESPONDING|COVAR_POP|COVAR_SAMP|CREATE|CROSS|CUBE|CUME_DIST|CURRENT|CURRENT_CATALOG|CURRENT_DATE|CURRENT_DEFAULT_TRANSFORM_GROUP|CURRENT_PATH|CURRENT_ROLE|CURRENT_SCHEMA|CURRENT_TIME|CURRENT_TRANSFORM_GROUP_FOR_TYPE|CYCLE|DATA|DATABASE|DBCC|DEALLOCATE|DEC|DECLARE|DEFAULT|DEFERRABLE|DEFERRED|DELETE|DENY|DEPTH|DEREF|DESC|DESCRIBE|DESCRIPTOR|DESTROY|DESTRUCTOR|DETERMINISTIC|DIAGNOSTICS|DICTIONARY|DISCONNECT|DISK|DISTINCT|DISTRIBUTED|DOMAIN|DOUBLE|DROP|DUMP|DYNAMIC|EACH|ELEMENT|ELSE|END|END-EXEC|EQUALS|ERRLVL|ESCAPE|EVERY|EXCEPT|EXCEPTION|EXEC|EXECUTE|EXISTS|EXIT|EXTERNAL|EXTRACT|FETCH|FILE|FILLFACTOR|FILTER|FIRST|FOR|FOREIGN|FORTRAN|FOUND|FREE|FREETEXT|FREETEXTTABLE|FROM|FULL|FULLTEXTTABLE|FUNCTION|FUSION|GENERAL|GET|GLOBAL|GO|GOTO|GRANT|GROUP|HAVING|HOLD|HOLDLOCK|HOST|HOUR|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IGNORE|IMMEDIATE|IN|INCLUDE|INDEX|INDICATOR|INITIALIZE|INITIALLY|INNER|INOUT|INPUT|INSENSITIVE|INSERT|INTEGER|INTERSECT|INTERSECTION|INTERVAL|INTO|IS|ISOLATION|ITERATE|JOIN|KEY|KILL|LANGUAGE|LARGE|LAST|LATERAL|LEADING|LESS|LEVEL|LIKE|LIKE_REGEX|LIMIT|LINENO|LN|LOAD|LOCAL|LOCALTIME|LOCALTIMESTAMP|LOCATOR|MAP|MATCH|MEMBER|MERGE|METHOD|MINUTE|MOD|MODIFIES|MODIFY|MODULE|MULTISET|NAMES|NATIONAL|NATURAL|NCLOB|NEW|NEXT|NO|NOCHECK|NONCLUSTERED|NONE|NORMALIZE|NOT|NULL|NULLIF|OBJECT|OCCURRENCES_REGEX|OCTET_LENGTH|OF|OFF|OFFSETS|OLD|ON|ONLY|OPEN|OPERATION|OPTION|OR|ORDER|ORDINALITY|OUT|OUTER|OUTPUT|OVER|OVERLAPS|OVERLAY|PAD|PARAMETER|PARAMETERS|PARTIAL|PARTITION|PASCAL|PATH|PERCENT|PERCENTILE_CONT|PERCENTILE_DISC|PERCENT_RANK|PIVOT|PLAN|POSITION|POSITION_REGEX|POSTFIX|PRECISION|PREFIX|PREORDER|PREPARE|PRESERVE|PRIMARY|PRINT|PRIOR|PRIVILEGES|PROC|PROCEDURE|PUBLIC|RAISERROR|RANGE|READ|READS|READTEXT|RECONFIGURE|RECURSIVE|REF|REFERENCES|REFERENCING|REGR_AVGX|REGR_AVGY|REGR_COUNT|REGR_INTERCEPT|REGR_R2|REGR_SLOPE|REGR_SXX|REGR_SXY|REGR_SYY|RELATIVE|RELEASE|REPLICATION|RESTORE|RESTRICT|RESULT|RETURN|RETURNS|REVERT|REVOKE|ROLE|ROLLBACK|ROLLUP|ROUTINE|ROW|ROWCOUNT|ROWGUIDCOL|ROWS|RULE|SAVE|SAVEPOINT|SCHEMA|SCOPE|SCROLL|SEARCH|SECOND|SECTION|SECURITYAUDIT|SELECT|SEMANTICKEYPHRASETABLE|SEMANTICSIMILARITYDETAILSTABLE|SEMANTICSIMILARITYTABLE|SENSITIVE|SEQUENCE|SESSION|SET|SETS|SETUSER|SHUTDOWN|SIMILAR|SIZE|SOME|SPECIFIC|SPECIFICTYPE|SQL|SQLCA|SQLCODE|SQLERROR|SQLEXCEPTION|SQLSTATE|SQLWARNING|START|STATE|STATEMENT|STATIC|STATISTICS|STDDEV_POP|STDDEV_SAMP|STRUCTURE|SUBMULTISET|SUBSTRING_REGEX|SYMMETRIC|SYSTEM|TABLESAMPLE|TEMPORARY|TERMINATE|TEXTSIZE|THAN|THEN|TIMEZONE_HOUR|TIMEZONE_MINUTE|TO|TOP|TRAILING|TRAN|TRANSACTION|TRANSLATE|TRANSLATE_REGEX|TRANSLATION|TREAT|TRIGGER|TRIM|TRUNCATE|TSEQUAL|UESCAPE|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNPIVOT|UPDATE|UPDATETEXT|USAGE|USE|USER|USING|VALUE|VALUES|VARIABLE|VARYING|VAR_POP|VAR_SAMP|VIEW|WAITFOR|WHEN|WHENEVER|WHERE|WHILE|WIDTH_BUCKET|WINDOW|WITH|WITHIN|WITHIN GROUP|WITHOUT|WORK|WRITE|WRITETEXT|XMLAGG|XMLATTRIBUTES|XMLBINARY|XMLCAST|XMLCOMMENT|XMLCONCAT|XMLDOCUMENT|XMLELEMENT|XMLEXISTS|XMLFOREST|XMLITERATE|XMLNAMESPACES|XMLPARSE|XMLPI|XMLQUERY|XMLSERIALIZE|XMLTABLE|XMLTEXT|XMLVALIDATE|ZONE";
-
+
// Microsoft's keyword list is missing a lot of things that are located on various other pages
// https://msdn.microsoft.com/en-us/library/ms187373.aspx, https://msdn.microsoft.com/en-us/library/ms181714.aspx
keywords += "|KEEPIDENTITY|KEEPDEFAULTS|IGNORE_CONSTRAINTS|IGNORE_TRIGGERS|XLOCK|FORCESCAN|FORCESEEK|HOLDLOCK|NOLOCK|NOWAIT|PAGLOCK|READCOMMITTED|READCOMMITTEDLOCK|READPAST|READUNCOMMITTED|REPEATABLEREAD|ROWLOCK|SERIALIZABLE|SNAPSHOT|SPATIAL_WINDOW_MAX_CELLS|TABLOCK|TABLOCKX|UPDLOCK|XLOCK|IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX|EXPAND|VIEWS|FAST|FORCE|KEEP|KEEPFIXED|MAXDOP|MAXRECURSION|OPTIMIZE|PARAMETERIZATION|SIMPLE|FORCED|RECOMPILE|ROBUST|PLAN|SPATIAL_WINDOW_MAX_CELLS|NOEXPAND|HINT";
@@ -103,13 +105,15 @@ var SqlServerHighlightRules = function() {
// highlighted words in SSMS that I'm not even sure where they come from
keywords += "|TYPE";
-
- //remove any other built in things from key word list
+
+ //remove specific built in types from keyword list
keywords = keywords.split('|');
keywords = keywords.filter(function(value, index, self) {
return logicalOperators.split('|').indexOf(value) === -1 && builtinFunctions.split('|').indexOf(value) === -1 && dataTypes.split('|').indexOf(value) === -1;
});
keywords = keywords.sort().join('|');
+
+
var keywordMapper = this.createKeywordMapper({
"constant.language": logicalOperators,
"storage.type": dataTypes,
@@ -117,37 +121,23 @@ var SqlServerHighlightRules = function() {
"support.storedprocedure": builtInStoredProcedures,
"keyword": keywords,
}, "identifier", true);
-
-
- // createKeywordMapper ignores case which we want because SqlServer keywords are not case sensitive which causes our keywords to get changed to lowercase.
- // However, the preferred standard for keywords is uppercase, so this transforms them back to uppercase for code completion
- // EXCEPTION: build in stored procedures are lower case
- for (var i = 0; i < this.$keywordList.length; i++) {
- var keyword = this.$keywordList[i];
- if (builtInStoredProcedures.indexOf(keyword) !== -1) continue;
- this.$keywordList[i] = keyword.toUpperCase();
- }
-
-
+
+
//https://msdn.microsoft.com/en-us/library/ms190356.aspx
var setStatements = "SET ANSI_DEFAULTS|SET ANSI_NULLS|SET ANSI_NULL_DFLT_OFF|SET ANSI_NULL_DFLT_ON|SET ANSI_PADDING|SET ANSI_WARNINGS|SET ARITHABORT|SET ARITHIGNORE|SET CONCAT_NULL_YIELDS_NULL|SET CURSOR_CLOSE_ON_COMMIT|SET DATEFIRST|SET DATEFORMAT|SET DEADLOCK_PRIORITY|SET FIPS_FLAGGER|SET FMTONLY|SET FORCEPLAN|SET IDENTITY_INSERT|SET IMPLICIT_TRANSACTIONS|SET LANGUAGE|SET LOCK_TIMEOUT|SET NOCOUNT|SET NOEXEC|SET NUMERIC_ROUNDABORT|SET OFFSETS|SET PARSEONLY|SET QUERY_GOVERNOR_COST_LIMIT|SET QUOTED_IDENTIFIER|SET REMOTE_PROC_TRANSACTIONS|SET ROWCOUNT|SET SHOWPLAN_ALL|SET SHOWPLAN_TEXT|SET SHOWPLAN_XML|SET STATISTICS IO|SET STATISTICS PROFILE|SET STATISTICS TIME|SET STATISTICS XML|SET TEXTSIZE|SET XACT_ABORT".split('|');
var isolationLevels = "READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SNAPSHOP|SERIALIZABLE".split('|');
for (var i = 0; i < isolationLevels.length; i++) {
setStatements.push('SET TRANSACTION ISOLATION LEVEL ' + isolationLevels[i]);
}
- //add set statements to keywordList for completions
- for (var i = 0; i < setStatements.length; i++) {
- this.$keywordList.push(setStatements[i]);
- }
-
+
this.$rules = {
start: [{
token: "string.start",
regex: "'",
next: [{
token: "constant.language.escape",
- regex: /\\'/
+ regex: /''/
}, {
token: "string.end",
next: "start",
@@ -163,15 +153,12 @@ var SqlServerHighlightRules = function() {
token: "comment",
start: "/\\*",
end: "\\*/"
- }, {
- token: "string", // ' string
- regex: "'.*?'"
}, {
token: "constant.numeric", // float
regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
}, {
token: keywordMapper,
- regex: "@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\b" //up to 2 @symbols for some build in functions
+ regex: "@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\b(?!])" //up to 2 @symbols for some built in functions
}, {
token: "constant.class",
regex: "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
@@ -202,20 +189,41 @@ var SqlServerHighlightRules = function() {
caseInsensitive: true
}],
};
-
+
//add each set statment as regex at top of rules so that they are processed first because they require multiple words
- //note, this makes the statements not match if they are not upper case.. which is not ideal but I don't know of an easy way to fix this
+ //note: this makes the statements not match if they are not upper case.. which is not ideal but I don't know of an easy way to fix this
for (var i = 0; i < setStatements.length; i++) {
- var statement = setStatements[i];
this.$rules.start.unshift({
token: "set.statement",
- regex: statement
+ regex: setStatements[i]
});
}
-
+
this.embedRules(DocCommentHighlightRules, "doc-", [DocCommentHighlightRules.getEndRule("start")]);
-
this.normalizeRules();
+
+
+ //prepare custom keyword completions used by mode to override default completor
+ //this allows for custom 'meta' and proper case of completions
+ var completions = [];
+ var addCompletions = function(arr, meta) {
+ arr.forEach(function(v) {
+ completions.push({
+ name: v,
+ value: v,
+ score: 0,
+ meta: meta,
+ });
+ });
+ };
+ addCompletions(builtInStoredProcedures.split('|'), 'procedure');
+ addCompletions(logicalOperators.split('|'), 'operator');
+ addCompletions(builtinFunctions.split('|'), 'function');
+ addCompletions(dataTypes.split('|'), 'type');
+ addCompletions(setStatements, 'statement');
+ addCompletions(keywords.split('|'), 'keyword');
+
+ this.completions = completions;
};
oop.inherits(SqlServerHighlightRules, TextHighlightRules);
diff --git a/lib/ace/mode/toml_highlight_rules.js b/lib/ace/mode/toml_highlight_rules.js
index 686ffae2..1a7871ab 100644
--- a/lib/ace/mode/toml_highlight_rules.js
+++ b/lib/ace/mode/toml_highlight_rules.js
@@ -57,6 +57,10 @@ var TomlHighlightRules = function() {
regex : '"(?=.)',
next : "qqstring"
},
+ {
+ token: ["variable.keygroup.toml"],
+ regex: "(?:^\\s*)(\\[\\[([^\\]]+)\\]\\])"
+ },
{
token: ["variable.keygroup.toml"],
regex: "(?:^\\s*)(\\[([^\\]]+)\\])"
@@ -100,4 +104,4 @@ var TomlHighlightRules = function() {
oop.inherits(TomlHighlightRules, TextHighlightRules);
exports.TomlHighlightRules = TomlHighlightRules;
-});
\ No newline at end of file
+});
diff --git a/lib/ace/mode/xml.js b/lib/ace/mode/xml.js
index 8c7033f1..38861eee 100644
--- a/lib/ace/mode/xml.js
+++ b/lib/ace/mode/xml.js
@@ -53,7 +53,7 @@ oop.inherits(Mode, TextMode);
this.blockComment = {start: ""};
- this.createWorker = function(session) {
+ this.createWorker = function(session) {
var worker = new WorkerClient(["ace"], "ace/mode/xml_worker", "Worker");
worker.attachToDocument(session.getDocument());
diff --git a/lib/ace/mode/xml_highlight_rules.js b/lib/ace/mode/xml_highlight_rules.js
index 91da0e70..8e39cae5 100644
--- a/lib/ace/mode/xml_highlight_rules.js
+++ b/lib/ace/mode/xml_highlight_rules.js
@@ -35,8 +35,10 @@ var oop = require("../lib/oop");
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
var XmlHighlightRules = function(normalize) {
-
- var tagRegex = "[a-zA-Z][-_a-zA-Z0-9]*";
+ // http://www.w3.org/TR/REC-xml/#NT-NameChar
+ // NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
+ // NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
+ var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*";
this.$rules = {
start : [
diff --git a/lib/ace/mouse/multi_select_handler.js b/lib/ace/mouse/multi_select_handler.js
index 45704b39..649043fa 100644
--- a/lib/ace/mouse/multi_select_handler.js
+++ b/lib/ace/mouse/multi_select_handler.js
@@ -83,7 +83,7 @@ function onMouseDown(e) {
var selectionMode;
if (editor.$mouseHandler.$enableJumpToDef) {
if (ctrl && alt || accel && alt)
- selectionMode = "add";
+ selectionMode = shift ? "block" : "add";
else if (alt && editor.$blockSelectEnabled)
selectionMode = "block";
} else {
@@ -117,7 +117,7 @@ function onMouseDown(e) {
if (shift) {
oldRange = null;
- range = selection.ranges[0];
+ range = selection.ranges[0] || range;
editor.removeSelectionMarker(range);
}
editor.once("mouseup", function() {
diff --git a/lib/ace/multi_select_test.js b/lib/ace/multi_select_test.js
index f860cd79..7fd504fb 100644
--- a/lib/ace/multi_select_test.js
+++ b/lib/ace/multi_select_test.js
@@ -84,11 +84,11 @@ function setSelection(editor, data) {
return isBackwards ? {
start: end,
end: start,
- isBackwards: true
+ isBackwards: isBackwards
} : {
start: start,
end: end,
- isBackwards: true
+ isBackwards: isBackwards
};
}));
}
@@ -225,19 +225,19 @@ module.exports = {
assert.equal(editor.getValue(),"l1\nl1\nl2\nl2\nl3\nl3\nl4\nl4");
testSelection(editor, [[1,0],[3,0],[5,0],[7,0]]);
- setSelection(editor, [[1,2],[1,0,1,1],[3,0,3,1],[5,0,5,1],[7,0,7,1]]);
+ setSelection(editor, [[1,2],[1,1,1,0],[3,0,3,1],[5,0,5,1],[7,0,7,1]]);
exec("copylinesdown");
exec("copylinesup");
assert.equal(editor.getValue(),"l1\nl1\nl1\nl1\nl2\nl2\nl2\nl2\nl3\nl3\nl3\nl3\nl4\nl4\nl4\nl4");
- testSelection(editor, [[2,2],[2,0,2,1],[6,0,6,1],[10,0,10,1],[14,0,14,1]]);
+ testSelection(editor, [[2,2],[2,1,2,0],[6,0,6,1],[10,0,10,1],[14,0,14,1]]);
exec("movelinesdown", 12);
assert.equal(editor.getValue(),"l1\nl1\nl1\nl2\nl2\nl2\nl3\nl3\nl3\nl4\nl4\nl4\nl1\nl2\nl3\nl4");
- testSelection(editor, [[12,2],[12,0,12,1],[13,0,13,1],[14,0,14,1],[15,0,15,1]]);
+ testSelection(editor, [[12,2],[12,1,12,0],[13,0,13,1],[14,0,14,1],[15,0,15,1]]);
exec("movelinesup", 12);
assert.equal(editor.getValue(),"l1\nl2\nl3\nl4\nl1\nl1\nl1\nl2\nl2\nl2\nl3\nl3\nl3\nl4\nl4\nl4");
- testSelection(editor, [[0,2],[0,0,0,1],[1,0,1,1],[2,0,2,1],[3,0,3,1]]);
+ testSelection(editor, [[0,2],[0,1,0,0],[1,0,1,1],[2,0,2,1],[3,0,3,1]]);
},
"test multiselect fromJSON/toJSON": function() {
diff --git a/lib/ace/selection.js b/lib/ace/selection.js
index b712fc6b..ed57682f 100644
--- a/lib/ace/selection.js
+++ b/lib/ace/selection.js
@@ -923,7 +923,7 @@ var Selection = function(session) {
this.toSingleRange(data[0]);
for (var i = data.length; i--; ) {
var r = Range.fromPoints(data[i].start, data[i].end);
- if (data.isBackwards)
+ if (data[i].isBackwards)
r.cursor = r.start;
this.addRange(r, true);
}
diff --git a/lib/ace/snippets/mask.js b/lib/ace/snippets/mask.js
new file mode 100644
index 00000000..7fbca678
--- /dev/null
+++ b/lib/ace/snippets/mask.js
@@ -0,0 +1,7 @@
+define(function(require, exports, module) {
+"use strict";
+
+exports.snippetText = require("../requirejs/text!./mask.snippets");
+exports.scope = "mask";
+
+});
diff --git a/lib/ace/snippets/mask.snippets b/lib/ace/snippets/mask.snippets
new file mode 100644
index 00000000..e69de29b
diff --git a/lib/ace/snippets/nim.js b/lib/ace/snippets/nim.js
new file mode 100644
index 00000000..6e6d02bb
--- /dev/null
+++ b/lib/ace/snippets/nim.js
@@ -0,0 +1,7 @@
+define(function(require, exports, module) {
+"use strict";
+
+exports.snippetText = require("../requirejs/text!./nim.snippets");
+exports.scope = "nim";
+
+});
diff --git a/lib/ace/snippets/nim.snippets b/lib/ace/snippets/nim.snippets
new file mode 100644
index 00000000..a8a20a00
--- /dev/null
+++ b/lib/ace/snippets/nim.snippets
@@ -0,0 +1,130 @@
+snippet #!
+ #!/usr/bin/env nim
+snippet imp
+ import ${1:module}
+snippet from
+ from ${1:package} import ${2:module}
+# Module Docstring
+snippet docs
+ ## File: ${1:FILENAME:file_name}
+ ## Author: ${2:author}
+ ## Description: ${3}
+snippet wh
+ while ${1:condition}:
+ ${2:# TODO: write code...}
+# dowh - does the same as do...while in other languages
+snippet dowh
+ while true:
+ ${1:# TODO: write code...}
+ if ${2:condition}:
+ break
+snippet with
+ with ${1:expr} as ${2:var}:
+ ${3:# TODO: write code...}
+# New Function
+snippet proc
+ proc ${1:fname}(${2:`indent('.') ? 'self' : ''`}): ${3: return type} =
+ ##${4:docstring for $1}
+ ${5:# TODO: write code...}
+snippet deff
+ def ${1:fname}(${2:`indent('.') ? 'self' : ''`}):
+ ${3:# TODO: write code...}
+# New Method
+snippet defs
+ def ${1:mname}(self, ${2:arg}):
+ ${3:# TODO: write code...}
+# New Property
+snippet property
+ def ${1:foo}():
+ doc = "${2:The $1 property.}"
+ def fget(self):
+ ${3:return self._$1}
+ def fset(self, value):
+ ${4:self._$1 = value}
+# Ifs
+snippet if
+ if ${1:condition}:
+ ${2:# TODO: write code...}
+snippet el
+ else:
+ ${1:# TODO: write code...}
+snippet ei
+ elif ${1:condition}:
+ ${2:# TODO: write code...}
+# For
+snippet for
+ for ${1:item} in ${2:items}:
+ ${3:# TODO: write code...}
+# Encodes
+snippet cutf8
+ # -*- coding: utf-8 -*-
+snippet clatin1
+ # -*- coding: latin-1 -*-
+snippet cascii
+ # -*- coding: ascii -*-
+# Lambda
+snippet ld
+ ${1:var} = lambda ${2:vars} : ${3:action}
+snippet .
+ self.
+snippet try Try/Except
+ try:
+ ${1:# TODO: write code...}
+ except ${2:Exception}, ${3:e}:
+ ${4:raise $3}
+snippet try Try/Except/Else
+ try:
+ ${1:# TODO: write code...}
+ except ${2:Exception}, ${3:e}:
+ ${4:raise $3}
+ else:
+ ${5:# TODO: write code...}
+snippet try Try/Except/Finally
+ try:
+ ${1:# TODO: write code...}
+ except ${2:Exception}, ${3:e}:
+ ${4:raise $3}
+ finally:
+ ${5:# TODO: write code...}
+snippet try Try/Except/Else/Finally
+ try:
+ ${1:# TODO: write code...}
+ except ${2:Exception}, ${3:e}:
+ ${4:raise $3}
+ else:
+ ${5:# TODO: write code...}
+ finally:
+ ${6:# TODO: write code...}
+# if __name__ == '__main__':
+snippet ifmain
+ if isMainModule:
+ ${1:main()}
+snippet "
+ ## ${1:doc}
+# test function/method
+snippet test
+ def test_${1:description}(${2:self}):
+ ${3:# TODO: write code...}
+# test case
+snippet testcase
+ class ${1:ExampleCase}(unittest.TestCase):
+
+ def test_${2:description}(self):
+ ${3:# TODO: write code...}
+#getopt
+snippet getopt
+ try:
+ # Short option syntax: "hv:"
+ # Long option syntax: "help" or "verbose="
+ opts, args = getopt.getopt(sys.argv[1:], "${1:short_options}", [${2:long_options}])
+
+ except getopt.GetoptError, err:
+ # Print debug info
+ print str(err)
+ ${3:error_action}
+
+ for option, argument in opts:
+ if option in ("-h", "--help"):
+ ${4}
+ elif option in ("-v", "--verbose"):
+ verbose = argument
diff --git a/lib/ace/snippets/sqlserver.snippets b/lib/ace/snippets/sqlserver.snippets
index 51c00ae4..403bd6bc 100644
--- a/lib/ace/snippets/sqlserver.snippets
+++ b/lib/ace/snippets/sqlserver.snippets
@@ -22,6 +22,16 @@ snippet dateadd
# DATEFROMPARTS
snippet datefromparts
DATEFROMPARTS(${1:year}, ${2:month}, ${3:day})
+# OBJECT_DEFINITION
+snippet objectdef
+ SELECT OBJECT_DEFINITION(OBJECT_ID('${1:sys.server_permissions /*object name*/}'))
+# STUFF XML
+snippet stuffxml
+ STUFF((SELECT ', ' + ${1:ColumnName}
+ FROM ${2:TableName}
+ WHERE ${3:WhereClause}
+ FOR XML PATH('')), 1, 1, '') AS ${4:Alias}
+ ${5:/*https://msdn.microsoft.com/en-us/library/ms188043.aspx*/}
# Create Procedure
snippet createproc
-- =============================================
@@ -30,12 +40,14 @@ snippet createproc
-- Description: ${3:Description}
-- =============================================
CREATE PROCEDURE ${4:Procedure_Name}
- -- Add the parameters for the stored procedure here
+ ${5:/*Add the parameters for the stored procedure here*/}
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON;
+ ${6:/*Add the T-SQL statements to compute the return value here*/}
+
END
GO
# Create Scalar Function
@@ -52,5 +64,7 @@ snippet createfn
BEGIN
DECLARE @Result ${5:Function_Data_Type}
+ ${6:/*Add the T-SQL statements to compute the return value here*/}
+
END
GO
\ No newline at end of file
diff --git a/lib/ace/theme/clouds.css b/lib/ace/theme/clouds.css
index e3884e02..c11308d4 100644
--- a/lib/ace/theme/clouds.css
+++ b/lib/ace/theme/clouds.css
@@ -23,7 +23,6 @@
.ace-clouds.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #FFFFFF;
- border-radius: 2px
}
.ace-clouds .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/clouds_midnight.css b/lib/ace/theme/clouds_midnight.css
index 3b932996..08ee089d 100644
--- a/lib/ace/theme/clouds_midnight.css
+++ b/lib/ace/theme/clouds_midnight.css
@@ -23,7 +23,6 @@
.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #191919;
- border-radius: 2px
}
.ace-clouds-midnight .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/cobalt.css b/lib/ace/theme/cobalt.css
index 73140082..b883ba97 100644
--- a/lib/ace/theme/cobalt.css
+++ b/lib/ace/theme/cobalt.css
@@ -23,7 +23,6 @@
.ace-cobalt.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #002240;
- border-radius: 2px
}
.ace-cobalt .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/dawn.css b/lib/ace/theme/dawn.css
index 719f4877..3c2884e1 100644
--- a/lib/ace/theme/dawn.css
+++ b/lib/ace/theme/dawn.css
@@ -23,7 +23,6 @@
.ace-dawn.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #F9F9F9;
- border-radius: 2px
}
.ace-dawn .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/idle_fingers.css b/lib/ace/theme/idle_fingers.css
index f507ec10..b5e1bff2 100644
--- a/lib/ace/theme/idle_fingers.css
+++ b/lib/ace/theme/idle_fingers.css
@@ -23,7 +23,6 @@
.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #323232;
- border-radius: 2px
}
.ace-idle-fingers .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/katzenmilch.css b/lib/ace/theme/katzenmilch.css
index 0b5a7a23..bf1569fb 100644
--- a/lib/ace/theme/katzenmilch.css
+++ b/lib/ace/theme/katzenmilch.css
@@ -31,7 +31,6 @@
.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #f3f2f3;
- border-radius: 2px
}
.ace-katzenmilch .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/kr_theme.css b/lib/ace/theme/kr_theme.css
index 339786ad..e232de47 100644
--- a/lib/ace/theme/kr_theme.css
+++ b/lib/ace/theme/kr_theme.css
@@ -23,7 +23,6 @@
.ace-kr-theme.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #0B0A09;
- border-radius: 2px
}
.ace-kr-theme .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/merbivore.css b/lib/ace/theme/merbivore.css
index a84ec3a6..9be25c66 100644
--- a/lib/ace/theme/merbivore.css
+++ b/lib/ace/theme/merbivore.css
@@ -23,7 +23,6 @@
.ace-merbivore.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #161616;
- border-radius: 2px
}
.ace-merbivore .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/merbivore_soft.css b/lib/ace/theme/merbivore_soft.css
index f0ad0bac..0d615376 100644
--- a/lib/ace/theme/merbivore_soft.css
+++ b/lib/ace/theme/merbivore_soft.css
@@ -23,7 +23,6 @@
.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #1C1C1C;
- border-radius: 2px
}
.ace-merbivore-soft .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/mono_industrial.css b/lib/ace/theme/mono_industrial.css
index 7e40a3b9..6630e4a2 100644
--- a/lib/ace/theme/mono_industrial.css
+++ b/lib/ace/theme/mono_industrial.css
@@ -23,7 +23,6 @@
.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #222C28;
- border-radius: 2px
}
.ace-mono-industrial .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/monokai.css b/lib/ace/theme/monokai.css
index a3a063df..bcc26ef4 100644
--- a/lib/ace/theme/monokai.css
+++ b/lib/ace/theme/monokai.css
@@ -23,7 +23,6 @@
.ace-monokai.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #272822;
- border-radius: 2px
}
.ace-monokai .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/pastel_on_dark.css b/lib/ace/theme/pastel_on_dark.css
index 8cab16a1..0b637174 100644
--- a/lib/ace/theme/pastel_on_dark.css
+++ b/lib/ace/theme/pastel_on_dark.css
@@ -23,7 +23,6 @@
.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #2C2828;
- border-radius: 2px
}
.ace-pastel-on-dark .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/solarized_dark.css b/lib/ace/theme/solarized_dark.css
index ea8ec8aa..09740e69 100644
--- a/lib/ace/theme/solarized_dark.css
+++ b/lib/ace/theme/solarized_dark.css
@@ -30,7 +30,6 @@
.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #002B36;
- border-radius: 2px
}
.ace-solarized-dark .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/solarized_light.css b/lib/ace/theme/solarized_light.css
index 64c4bac9..65399fda 100644
--- a/lib/ace/theme/solarized_light.css
+++ b/lib/ace/theme/solarized_light.css
@@ -23,7 +23,6 @@
.ace-solarized-light.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #FDF6E3;
- border-radius: 2px
}
.ace-solarized-light .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/terminal.css b/lib/ace/theme/terminal.css
index 3636a03d..f23a9ad6 100644
--- a/lib/ace/theme/terminal.css
+++ b/lib/ace/theme/terminal.css
@@ -23,7 +23,6 @@
.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px black;
- border-radius: 2px
}
.ace-terminal-theme .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/textmate.css b/lib/ace/theme/textmate.css
index 6cb159ba..18e2b4ee 100644
--- a/lib/ace/theme/textmate.css
+++ b/lib/ace/theme/textmate.css
@@ -122,7 +122,6 @@
}
.ace-tm.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px white;
- border-radius: 2px;
}
.ace-tm .ace_marker-layer .ace_step {
background: rgb(252, 255, 0);
diff --git a/lib/ace/theme/the_night_after_tomorrow.css b/lib/ace/theme/the_night_after_tomorrow.css
new file mode 100644
index 00000000..48d2602c
--- /dev/null
+++ b/lib/ace/theme/the_night_after_tomorrow.css
@@ -0,0 +1,139 @@
+.ace-tomorrow-night .ace_gutter {
+ background: #25282c;
+ color: #C5C8C6
+}
+
+.ace-tomorrow-night .ace_print-margin {
+ width: 1px;
+ background: #25282c
+}
+
+.ace-tomorrow-night {
+ background-color: #1D1F21;
+ color: #C5C8C6
+}
+
+.ace-tomorrow-night .ace_cursor {
+ color: #FFFFFF
+}
+
+.ace-tomorrow-night .ace_marker-layer .ace_selection {
+ background: #373B41
+}
+
+.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {
+ box-shadow: 0 0 3px 0px #1D1F21;
+ border-radius: 2px
+}
+
+.ace-tomorrow-night .ace_marker-layer .ace_step {
+ background: rgb(102, 82, 0)
+}
+
+.ace-tomorrow-night .ace_marker-layer .ace_bracket {
+ margin: -1px 0 0 -1px;
+ border: 1px solid #4B4E55
+}
+
+.ace-tomorrow-night .ace_marker-layer .ace_active-line {
+ background: #282A2E
+}
+
+.ace-tomorrow-night .ace_gutter-active-line {
+ background-color: #282A2E
+}
+
+.ace-tomorrow-night .ace_marker-layer .ace_selected-word {
+ border: 1px solid #373B41
+}
+
+.ace-tomorrow-night .ace_invisible {
+ color: #4B4E55
+}
+
+.ace-tomorrow-night .ace_keyword,
+.ace-tomorrow-night .ace_meta,
+.ace-tomorrow-night .ace_support.ace_type {
+ color: #C4A400
+}
+
+.ace-tomorrow-night .ace_storage,
+.ace-tomorrow-night .ace_storage.ace_type {
+ color: #327FD7
+}
+
+.ace-tomorrow-night .ace_keyword.ace_operator {
+ color: #8ABEB7
+}
+
+.ace-tomorrow-night .ace_constant.ace_language{
+ color: #934B9F
+}
+
+.ace-tomorrow-night .ace_constant.ace_character,
+.ace-tomorrow-night .ace_constant.ace_numeric,
+.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,
+.ace-tomorrow-night .ace_support.ace_constant,
+.ace-tomorrow-night .ace_variable.ace_parameter {
+ color: #37BC9B
+}
+
+.ace-tomorrow-night .ace_constant.ace_other {
+ color: #CED1CF
+}
+
+.ace-tomorrow-night .ace_invalid {
+ color: #CED2CF;
+ background-color: #DF5F5F
+}
+
+.ace-tomorrow-night .ace_invalid.ace_deprecated {
+ color: #CED2CF;
+ background-color: #B798BF
+}
+
+.ace-tomorrow-night .ace_fold {
+ background-color: #62A5D6;
+ border-color: #C5C8C6
+}
+
+.ace-tomorrow-night .ace_entity.ace_name.ace_function,
+.ace-tomorrow-night .ace_support.ace_function,
+.ace-tomorrow-night .ace_variable {
+ color: #62A5D6
+}
+
+.ace-tomorrow-night .ace_support.ace_class,
+.ace-tomorrow-night .ace_support.ace_type {
+ color: #F0C674
+}
+
+.ace-tomorrow-night .ace_heading,
+.ace-tomorrow-night .ace_markup.ace_heading,
+.ace-tomorrow-night .ace_string {
+ color: #CD0000
+}
+
+.ace-tomorrow-night .ace_proc_name {
+ color: #04939A
+}
+
+.ace-tomorrow-night .ace_backtick {
+ color: #1DAA49
+}
+
+.ace-tomorrow-night .ace_entity.ace_name.ace_tag,
+.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,
+.ace-tomorrow-night .ace_meta.ace_tag,
+.ace-tomorrow-night .ace_string.ace_regexp,
+.ace-tomorrow-night .ace_variable {
+ color: #FFFFFF
+}
+
+.ace-tomorrow-night .ace_comment {
+ color: #3465A4
+}
+
+.ace-tomorrow-night .ace_indent-guide {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y
+}
diff --git a/lib/ace/theme/the_night_after_tomorrow.js b/lib/ace/theme/the_night_after_tomorrow.js
new file mode 100644
index 00000000..3108e2a9
--- /dev/null
+++ b/lib/ace/theme/the_night_after_tomorrow.js
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2010, Ajax.org B.V.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+define(function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-tomorrow-night";
+exports.cssText = require("../requirejs/text!./the_night_after_tomorrow.css");
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/lib/ace/theme/tomorrow.css b/lib/ace/theme/tomorrow.css
index 20975004..77407e66 100644
--- a/lib/ace/theme/tomorrow.css
+++ b/lib/ace/theme/tomorrow.css
@@ -23,7 +23,6 @@
.ace-tomorrow.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #FFFFFF;
- border-radius: 2px
}
.ace-tomorrow .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/tomorrow_night.css b/lib/ace/theme/tomorrow_night.css
index aafceab6..e98a6580 100644
--- a/lib/ace/theme/tomorrow_night.css
+++ b/lib/ace/theme/tomorrow_night.css
@@ -23,7 +23,6 @@
.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #1D1F21;
- border-radius: 2px
}
.ace-tomorrow-night .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/tomorrow_night_blue.css b/lib/ace/theme/tomorrow_night_blue.css
index e717be0a..907eef35 100644
--- a/lib/ace/theme/tomorrow_night_blue.css
+++ b/lib/ace/theme/tomorrow_night_blue.css
@@ -24,7 +24,6 @@
.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #002451;
- border-radius: 2px
}
.ace-tomorrow-night-blue .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/tomorrow_night_bright.css b/lib/ace/theme/tomorrow_night_bright.css
index 5c896fb9..c0c33739 100644
--- a/lib/ace/theme/tomorrow_night_bright.css
+++ b/lib/ace/theme/tomorrow_night_bright.css
@@ -23,7 +23,6 @@
.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #000000;
- border-radius: 2px
}
.ace-tomorrow-night-bright .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/tomorrow_night_eighties.css b/lib/ace/theme/tomorrow_night_eighties.css
index 85d7b089..69277fb1 100644
--- a/lib/ace/theme/tomorrow_night_eighties.css
+++ b/lib/ace/theme/tomorrow_night_eighties.css
@@ -24,7 +24,6 @@
.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #2D2D2D;
- border-radius: 2px
}
.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/twilight.css b/lib/ace/theme/twilight.css
index 0ca694fb..ae353dae 100644
--- a/lib/ace/theme/twilight.css
+++ b/lib/ace/theme/twilight.css
@@ -23,7 +23,6 @@
.ace-twilight.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #141414;
- border-radius: 2px
}
.ace-twilight .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/vibrant_ink.css b/lib/ace/theme/vibrant_ink.css
index e2901156..a3a89402 100644
--- a/lib/ace/theme/vibrant_ink.css
+++ b/lib/ace/theme/vibrant_ink.css
@@ -23,7 +23,6 @@
.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #0F0F0F;
- border-radius: 2px
}
.ace-vibrant-ink .ace_marker-layer .ace_step {
diff --git a/lib/ace/theme/xcode.css b/lib/ace/theme/xcode.css
index 56eb9a89..a22bd169 100644
--- a/lib/ace/theme/xcode.css
+++ b/lib/ace/theme/xcode.css
@@ -25,7 +25,6 @@
.ace-xcode.ace_multiselect .ace_selection.ace_start {
box-shadow: 0 0 3px 0px #FFFFFF;
- border-radius: 2px
}
.ace-xcode .ace_marker-layer .ace_step {
diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js
index 5696745c..45226a1d 100644
--- a/lib/ace/virtual_renderer.js
+++ b/lib/ace/virtual_renderer.js
@@ -615,7 +615,7 @@ var VirtualRenderer = function(container, theme) {
* @returns {DOMElement}
**/
this.getMouseEventTarget = function() {
- return this.content;
+ return this.scroller;
};
/**
@@ -919,6 +919,8 @@ var VirtualRenderer = function(container, theme) {
(this.$minLines||1) * this.lineHeight,
Math.min(maxHeight, height)
) + this.scrollMargin.v + (this.$extraHeight || 0);
+ if (this.$horizScroll)
+ desiredHeight += this.scrollBarH.getHeight();
var vScroll = height > maxHeight;
if (desiredHeight != this.desiredHeight ||
@@ -939,9 +941,6 @@ var VirtualRenderer = function(container, theme) {
};
this.$computeLayerConfig = function() {
- if (this.$maxLines && this.lineHeight > 1)
- this.$autosize();
-
var session = this.session;
var size = this.$size;
@@ -949,9 +948,6 @@ var VirtualRenderer = function(container, theme) {
var screenLines = this.session.getScreenLength();
var maxHeight = screenLines * this.lineHeight;
- var offset = this.scrollTop % this.lineHeight;
- var minHeight = size.scrollerHeight + this.lineHeight;
-
var longestLine = this.$getLongestLine();
var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||
@@ -962,20 +958,27 @@ var VirtualRenderer = function(container, theme) {
this.$horizScroll = horizScroll;
this.scrollBarH.setVisible(horizScroll);
}
+ // autoresize only after updating hscroll to include scrollbar height in desired height
+ if (this.$maxLines && this.lineHeight > 1)
+ this.$autosize();
+
+ var offset = this.scrollTop % this.lineHeight;
+ var minHeight = size.scrollerHeight + this.lineHeight;
var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd
? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd
: 0;
maxHeight += scrollPastEnd;
- this.session.setScrollTop(Math.max(-this.scrollMargin.top,
- Math.min(this.scrollTop, maxHeight - size.scrollerHeight + this.scrollMargin.bottom)));
+ var sm = this.scrollMargin;
+ this.session.setScrollTop(Math.max(-sm.top,
+ Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));
- this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft,
- longestLine + 2 * this.$padding - size.scrollerWidth + this.scrollMargin.right)));
+ this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft,
+ longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));
var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||
- size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop);
+ size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);
var vScrollChanged = this.$vScroll !== vScroll;
if (vScrollChanged) {
this.$vScroll = vScroll;
diff --git a/lib/ace/virtual_renderer_test.js b/lib/ace/virtual_renderer_test.js
index e8a8fcbd..9b1ed866 100644
--- a/lib/ace/virtual_renderer_test.js
+++ b/lib/ace/virtual_renderer_test.js
@@ -36,26 +36,40 @@ if (typeof process !== "undefined") {
define(function(require, exports, module) {
"use strict";
+var Editor = require("./edit_session").Editor;
var EditSession = require("./edit_session").EditSession;
var VirtualRenderer = require("./virtual_renderer").VirtualRenderer;
var assert = require("./test/assertions");
+var editor = null;
module.exports = {
- "test: screen2text the column should be rounded to the next character edge" : function() {
+ setUp: function() {
+ if (editor)
+ editor.destroy()
var el = document.createElement("div");
-
if (!el.getBoundingClientRect) {
console.log("Skipping test: This test only runs in the browser");
return;
}
-
el.style.left = "20px";
el.style.top = "30px";
el.style.width = "300px";
el.style.height = "100px";
document.body.appendChild(el);
-
var renderer = new VirtualRenderer(el);
+ var editor = new Editor(renderer);
+ editor.on("destroy", function() {
+ document.body.removeChild(el);
+ });
+ },
+ tearDown: function() {
+ editor && editor.destroy();
+ editor = null;
+ },
+ "test: screen2text the column should be rounded to the next character edge" : function(done) {
+ if (!editor) return done();
+ var renderer = editor.renderer;
+
renderer.setPadding(0);
renderer.setSession(new EditSession("1234"));
@@ -73,7 +87,23 @@ module.exports = {
testPixelToText(10, 0, 0, 1);
testPixelToText(14, 0, 0, 1);
testPixelToText(15, 0, 0, 2);
- document.body.removeChild(el);
+ done();
+ },
+
+ "test scrollmargin + autosize": function(done) {
+ if (!editor) return done();
+ editor.setOptions({
+ maxLines: 100,
+ useWrapMode: true
+ });
+ editor.renderer.setScrollMargin(10, 10);
+ editor.setValue("\n\n");
+ editor.setValue("\n\n\n\n");
+ editor.renderer.once("afterRender", function() {
+ setTimeout(function() {
+ done();
+ }, 0);
+ });
}
// change tab size after setDocument (for text layer)
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
diff --git a/static.js b/static.js
index a711715e..3b75c2b6 100755
--- a/static.js
+++ b/static.js
@@ -21,7 +21,7 @@ http.createServer(function(req, res) {
if (req.method == "PUT") {
if (!allowSave)
return error(res, 404, "Saving not allowed pass --allow-save to enable");
- save(req, res, filename);
+ return save(req, res, filename);
}
fs.exists(filename, function(exists) {
@@ -86,6 +86,7 @@ function save(req, res, filePath) {
}
res.statusCode = 200;
res.end("OK");
+ console.log("saved ", filePath);
});
}
diff --git a/tool/lib.js b/tool/lib.js
index e72194d7..3d57b6e0 100644
--- a/tool/lib.js
+++ b/tool/lib.js
@@ -1,6 +1,7 @@
var plist = require("plist");
var util = require("util");
var url = require("url");
+var cson = require("cson");
var https = require("https");
var http = require("http");
@@ -12,17 +13,120 @@ exports.parsePlist = function(xmlOrJSON, callback) {
json = result[0];
});
} else {
- xmlOrJSON = xmlOrJSON.replace(/^\s*\/\/.*/gm, "");
- json = JSON.parse(xmlOrJSON)
+ try {
+ xmlOrJSON = xmlOrJSON.replace(
+ /("(?:\\.|[^"])*")|(?:,\s*)+([\]\}])|(\w+)\s*:|([\]\}]\s*[\[\{])|(\/\/.*|\/\*(?:[^\*]|\*(?=[^\/]))*?\*\/)/g,
+ function(_, str, extraComma, noQuote, missingComma, comment) {
+ if (comment)
+ return "";
+ if (missingComma)
+ return missingComma[0] + "," + missingComma.slice(1);
+ return str || extraComma || '"' + noQuote + '":';
+ });
+ json = JSON.parse(xmlOrJSON);
+ } catch(e) {
+ json = cson.parse(xmlOrJSON);
+ }
}
callback && callback(json);
return json;
};
+
exports.formatJSON = function(object, initialIndent) {
- return util.inspect(object, false, 40).replace(/^/gm, initialIndent||"");
+ return JSON.stringify(object, null, 4).replace(/^/gm, initialIndent||"");
};
+exports.formatJS = function(object, initialIndent) {
+ return formatJS(object, 4, initialIndent);
+};
+
+function formatJS(object, indent, initialIndent) {
+ if (typeof indent == "number")
+ indent = Array(indent + 1).join(" ");
+
+ function $format(buffer, totalIndent, state, o) {
+ if (typeof o != "object" || !o) {
+ if (typeof o == "string")
+ buffer.push(JSON.stringify(o));
+ else
+ buffer.push("" + o);
+ }
+ else if (Array.isArray(o)) {
+ buffer.push("[")
+
+ var len = totalIndent.length
+ var oneLine = true;
+ for (var i = 0; i < o.length; i++) {
+ if (typeof o[i] == "string") {
+ len += o[i].length + 2
+ } else if (!o[i]) {
+ len += (o[i] + "").length
+ } else {
+ oneLine = false;
+ break;
+ }
+ len += 2;
+ if (len > 60) {
+ oneLine = false;
+ break;
+ }
+ }
+
+ for (var i = 0; i < o.length; i++) {
+ if (o[i] && typeof o[i] == "object") {
+ $format(buffer, totalIndent, state, o[i]);
+ if (i < o.length - 1)
+ buffer.push(", ");
+ } else {
+ if (oneLine)
+ i && buffer.push(" ");
+ else
+ buffer.push("\n", totalIndent + indent)
+ $format(buffer, totalIndent + indent, state, o[i]);
+ if (i < o.length - 1)
+ buffer.push(",");
+ }
+
+ }
+ if (!oneLine && buffer[buffer.length - 1] != "}")
+ buffer.push("\n" + totalIndent)
+ buffer.push("]")
+ }
+ else {
+ var keys = Object.keys(o);
+ buffer.push("{", "\n");
+ for (var i = 0; i < keys.length; i++) {
+ buffer.push(totalIndent + indent);
+ if (/^\w+$/.test(keys[i]))
+ buffer.push(keys[i]);
+ else
+ buffer.push(JSON.stringify(keys[i]));
+ buffer.push(": ")
+
+ if (keys[i] == "regex" && typeof o[keys[i]] == "string") {
+ try {
+ var re = new RegExp(o[keys[i]]);
+ buffer.push("/" + re.source.replace(/\\.|\//g, function(f) {
+ return f.length == 1 ? "\\" + f : f;
+ }) + "/");
+ } catch(e) {
+ $format(buffer, totalIndent + indent, state, o[keys[i]]);
+ }
+ } else {
+ $format(buffer, totalIndent + indent, state, o[keys[i]]);
+ }
+
+ if (i < keys.length - 1)
+ buffer.push(",", "\n");
+ }
+ buffer.push("\n", totalIndent, "}");
+ }
+ }
+ var buffer = [];
+ $format(buffer, initialIndent || "", {}, object);
+ return buffer.join("");
+}
exports.fillTemplate = function(template, replacements) {
return template.replace(/%(.+?)%/g, function(str, m) {
diff --git a/tool/mode_creator.js b/tool/mode_creator.js
index 7a2aea59..44aa67d0 100644
--- a/tool/mode_creator.js
+++ b/tool/mode_creator.js
@@ -126,8 +126,8 @@ function handleSaveResult(err, editor) {
return log(
"Write access to this file is disabled.\n"+
"To enable saving your changes to disk, clone the Ace repository\n"+
- "and run the included web server with the --allow-write option\n"+
- "`node static.js --allow-write` or `static.py --puttable=*`"
+ "and run the included web server with the --allow-save option\n"+
+ "`node static.js --allow-save` or `static.py --puttable=*`"
);
}
editor.session.getUndoManager().markClean();
diff --git a/tool/package.json b/tool/package.json
index 2d33713a..974673c6 100644
--- a/tool/package.json
+++ b/tool/package.json
@@ -1,9 +1,10 @@
{
- "name": "ace-tools",
- "version": "0.1.0",
- "dependencies": {
- "plist": "",
- "css-parse": "1.0.3",
- "css-stringify": "1.0.3"
- }
+ "name": "ace-tools",
+ "version": "0.1.0",
+ "dependencies": {
+ "cson": "^3.0.1",
+ "css-parse": "1.0.3",
+ "css-stringify": "1.0.3",
+ "plist": ""
+ }
}
diff --git a/tool/tmlanguage.js b/tool/tmlanguage.js
index 0e458330..b5d8b851 100644
--- a/tool/tmlanguage.js
+++ b/tool/tmlanguage.js
@@ -662,10 +662,10 @@ function convertTmLanguage(name, langStr) {
var languageHighlightRules = lib.fillTemplate(modeHighlightTemplate, {
language: languageNameSanitized,
- languageTokens: lib.formatJSON(patterns, " ").trim(),
+ languageTokens: lib.formatJS(patterns, " ").trim(),
uuid: language.uuid,
name: name,
- metaData: lib.formatJSON(language, " ").trim()
+ metaData: lib.formatJS(language, "").trim()
});
if (devMode) {