diff --git a/ChangeLog.txt b/ChangeLog.txt index 3077d171..e9c41e4c 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,16 +1,5 @@ -Version 1.2.0-pre - -* New Features - - Indented soft wrap (danyaPostfactum) - -* API Changes - - unified delta types `{start, end, action, lines}` (Alden Daniels https://github.com/ajaxorg/ace/pull/1745) - - "change" event listeners on session and editor get delta objects directly - 2015.04.03 Version 1.1.9 - - Small Enhancements and Bugfixes - 2014.11.08 Version 1.1.8 * API Changes diff --git a/build b/build index a4e495d8..e3ccd2c6 160000 --- a/build +++ b/build @@ -1 +1 @@ -Subproject commit a4e495d8901876c6bafe3870a35cb8e32c827e97 +Subproject commit e3ccd2c654cf45ee41ffb09d0e7fa5b40cf91a8f diff --git a/demo/autoresize.html b/demo/autoresize.html index b0464ecd..73a87599 100644 --- a/demo/autoresize.html +++ b/demo/autoresize.html @@ -7,13 +7,14 @@ @@ -23,8 +24,6 @@
minHeight = 2 lines
-

-

 
 
@@ -47,13 +46,6 @@ require(["ace/ace"], function(ace) {
     editor2.setOption("maxLines", 30);
     editor2.setOption("minLines", 2);
 
-    var editor = ace.edit("editor3");
-    editor.setOptions({
-        autoScrollEditorIntoView: true,
-        maxLines: 8
-    });
-    editor.renderer.setScrollMargin(10, 10, 10, 10);
-    
     var editor = ace.edit("editor");
     editor.setTheme("ace/theme/tomorrow");
     editor.session.setMode("ace/mode/html");
diff --git a/demo/kitchen-sink/dev_util.js b/demo/kitchen-sink/dev_util.js
index f466285d..8dab857c 100644
--- a/demo/kitchen-sink/dev_util.js
+++ b/demo/kitchen-sink/dev_util.js
@@ -39,7 +39,7 @@ function warn() {
     s.shift(); // remove the getter
     s = s.join("\n");
     // allow easy access to ace in console, but not in ace code
-    if (!/at Object.InjectedScript.|@debugger eval|snippets:\/{3}|\(:\d+:\d+\)/.test(s)) {
+    if (!/at Object.InjectedScript.|@debugger eval|snippets:\/{3}/.test(s)) {
         console.error("trying to access to global variable");
     }
 }
diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver
deleted file mode 100644
index 7efd2b7e..00000000
--- a/demo/kitchen-sink/docs/sqlserver.sqlserver
+++ /dev/null
@@ -1,72 +0,0 @@
--- =============================================
--- Author:		Morgan Yarbrough
--- Create date: 4/27/2015
--- Description:	Test procedure that shows off language features.
--- 				Includes non-standard folding with region comments using either
--- 				line comments or block comments (both are demonstrated below).
---				This mode imitates SSMS and it designed to be used with SQL Server theme.
--- =============================================
-CREATE PROCEDURE dbo.TestProcedure
-	
---#region parameters
-	@vint INT = 1
-	,@vdate DATE = NULL
-	,@vdatetime DATETIME = DATEADD(dd, 1, GETDATE())
-	,@vvarchar VARCHAR(MAX) = ''
---#endregion
-
-AS
-BEGIN
-
-	/*#region set statements */
-	SET NOCOUNT ON;
-	SET XACT_ABORT ON;
-	SET QUOTED_IDENTIFIER ON;
-	/*#endregion*/
-	
-	/**
-	 * These comments will produce a fold widget
-	 */
-	
-	-- folding demonstration
-	SET @vint = CASE
-					WHEN @vdate IS NULL
-						THEN 1
-					ELSE 2
-				END
-	
-	-- another folding demonstration
-	IF @vint = 1 
-	BEGIN
-		SET @vvarchar = 'one'
-		SET @vint = DATEDIFF(dd, @vdate, @vdatetime)
-	END
-	
-	-- this mode handles strings properly
-	DECLARE @sql NVARCHAR(4000) = N'SELECT TOP(1) OrderID 
-									FROM Orders
-									WHERE @OrderDate > GETDATE()'
-								
-	-- this mode is aware of built in stored procedures 
-	EXECUTE sp_executesql @sql
-	
-	-- demonstrating some syntax highlighting
-	SELECT Orders.OrderID
-		,Customers.CompanyName
-		,DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear
-	FROM Orders
-	INNER JOIN Customers
-		ON Orders.CustomerID = Customers.CustomerID
-	WHERE CompanyName NOT LIKE '%something'
-		OR CompanyName IS NULL
-		OR CompanyName IN ('bla', 'nothing')
-		
-	-- this mode includes snippets
-	-- place your cusor at the end of the line below and trigger auto complete (Ctrl+Space)
-	createpr
-	
-	-- SQL Server allows using keywords as object names (not recommended) as long as they are wrapped in brackets
-	DATABASE -- keyword
-	[DATABASE] -- not a keyword
-	
-END
diff --git a/demo/static-highlighter/server.js b/demo/static-highlighter/server.js
index ea8361d4..0878fec2 100644
--- a/demo/static-highlighter/server.js
+++ b/demo/static-highlighter/server.js
@@ -2,13 +2,15 @@
  * Simple node.js server, which generates the synax highlighted version of itself 
  * using the Ace modes and themes on the server and serving a static web page.
  */
-
+// $'
 // include ace search path and modules
 require("amd-loader");
 
+// load jsdom, which is required by Ace
+require("../../lib/ace/test/mockdom");
+
 var http = require("http");
 var fs = require("fs");
-var resolve = require("path").resolve;
 
 // load the highlighter and the desired mode and theme
 var highlighter = require("../../lib/ace/ext/static_highlight");
@@ -18,22 +20,15 @@ var theme = require("../../lib/ace/theme/twilight");
 var port = process.env.PORT || 2222;
 
 http.createServer(function(req, res) {
-    var url = req.url;
-    var path = /[^#?\x00]*/.exec(url)[0];
-    var root = resolve(__dirname + "/../../").replace(/\\/g, "/");
-    path = resolve(root + "/" + path).replace(/\\/g, "/");
-    if (path.indexOf(root + "/") != 0)
-        path = __filename;
     res.writeHead(200, {"Content-Type": "text/html; charset=utf-8"});
-    fs.readFile(path, "utf8", function(err, data) {
-        if (err) data = err.message;
+    fs.readFile(__dirname + "/../../build/src/ace.js", "utf8", function(err, data) {
         var highlighted = highlighter.render(data, new JavaScriptMode(), theme);
         res.end(
             '\n' +
                 '\n' + 
-                highlighted.html +
+                highlighted.html +            
             ''
         );
     });
diff --git a/experiments/debug_mem_leak.html b/experiments/debug_mem_leak.html
deleted file mode 100644
index b8ee8726..00000000
--- a/experiments/debug_mem_leak.html
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-    
-        
-        
-        
-    
-    
-        

- -
- - - \ No newline at end of file diff --git a/lib/ace/anchor.js b/lib/ace/anchor.js index 39b78e0f..9f5e159d 100644 --- a/lib/ace/anchor.js +++ b/lib/ace/anchor.js @@ -99,54 +99,72 @@ var Anchor = exports.Anchor = function(doc, row, column) { * - `value`: An object describing the new Anchor position * **/ - this.onChange = function(delta) { - if (delta.start.row == delta.end.row && delta.start.row != this.row) + this.onChange = function(e) { + var delta = e.data; + var range = delta.range; + + if (range.start.row == range.end.row && range.start.row != this.row) return; - if (delta.start.row > this.row) + if (range.start.row > this.row) return; - - var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); - this.setPosition(point.row, point.column, true); + + if (range.start.row == this.row && range.start.column > this.column) + return; + + var row = this.row; + var column = this.column; + var start = range.start; + var end = range.end; + + if (delta.action === "insertText") { + if (start.row === row && start.column <= column) { + if (start.column === column && this.$insertRight) { + // do nothing + } else if (start.row === end.row) { + column += end.column - start.column; + } else { + column -= start.column; + row += end.row - start.row; + } + } else if (start.row !== end.row && start.row < row) { + row += end.row - start.row; + } + } else if (delta.action === "insertLines") { + if (start.row === row && column === 0 && this.$insertRight) { + // do nothing + } + else if (start.row <= row) { + row += end.row - start.row; + } + } else if (delta.action === "removeText") { + if (start.row === row && start.column < column) { + if (end.column >= column) + column = start.column; + else + column = Math.max(0, column - (end.column - start.column)); + + } else if (start.row !== end.row && start.row < row) { + if (end.row === row) + column = Math.max(0, column - end.column) + start.column; + row -= (end.row - start.row); + } else if (end.row === row) { + row -= end.row - start.row; + column = Math.max(0, column - end.column) + start.column; + } + } else if (delta.action == "removeLines") { + if (start.row <= row) { + if (end.row <= row) + row -= end.row - start.row; + else { + row = start.row; + column = 0; + } + } + } + + this.setPosition(row, column, true); }; - - function $pointsInOrder(point1, point2, equalPointsInOrder) { - var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; - return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); - } - - function $getTransformedPoint(delta, point, moveIfEqual) { - // Get delta info. - var deltaIsInsert = delta.action == "insert"; - var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); - var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); - var deltaStart = delta.start; - var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. - - // DELTA AFTER POINT: No change needed. - if ($pointsInOrder(point, deltaStart, moveIfEqual)) { - return { - row: point.row, - column: point.column - }; - } - - // DELTA BEFORE POINT: Move point by delta shift. - if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { - return { - row: point.row + deltaRowShift, - column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) - }; - } - - // DELTA ENVELOPS POINT (delete only): Move point to delta start. - // TODO warn if delta.action != "remove" ? - - return { - row: deltaStart.row, - column: deltaStart.column - }; - } /** * Sets the anchor position to the specified row and column. If `noClip` is `true`, the position is not clipped. diff --git a/lib/ace/anchor_test.js b/lib/ace/anchor_test.js index c0b97273..b5c62941 100644 --- a/lib/ace/anchor_test.js +++ b/lib/ace/anchor_test.js @@ -71,7 +71,7 @@ module.exports = { var doc = new Document("juhu\nkinners"); var anchor = new Anchor(doc, 1, 4); - doc.insertFullLines(1, ["123", "456"]); + doc.insertLines(1, ["123", "456"]); assert.position(anchor.getPosition(), 3, 4); }, @@ -105,7 +105,7 @@ module.exports = { var doc = new Document("juhu\nkinners"); var anchor = new Anchor(doc, 1, 4); - doc.insertMergedLines({row: 0, column: 0}, ['', '']); + doc.insertNewLine({row: 0, column: 0}); assert.position(anchor.getPosition(), 2, 4); }, @@ -113,7 +113,7 @@ module.exports = { var doc = new Document("juhu\nkinners"); var anchor = new Anchor(doc, 1, 4); - doc.insertMergedLines({row: 1, column: 2}, ['', '']); + doc.insertNewLine({row: 1, column: 2}); assert.position(anchor.getPosition(), 2, 2); }, @@ -145,7 +145,7 @@ module.exports = { var doc = new Document("juhu\n1\n2\nkinners"); var anchor = new Anchor(doc, 3, 4); - doc.removeFullLines(1, 2); + doc.removeLines(1, 2); assert.position(anchor.getPosition(), 1, 4); }, @@ -169,7 +169,7 @@ module.exports = { var doc = new Document("juhu\nkinners\n123"); var anchor = new Anchor(doc, 1, 5); - doc.removeFullLines(1, 1); + doc.removeLines(1, 1); assert.position(anchor.getPosition(), 1, 0); }, @@ -208,9 +208,9 @@ module.exports = { var doc = new Document("juhu\nkinners\n123"); var anchor = new Anchor(doc, 2, 4); - doc.removeFullLines(0, 3); + doc.removeLines(0, 3); assert.position(anchor.getPosition(), 0, 0); - doc.insertFullLines(0, ["a", "b", "c"]); + doc.insertLines(0, ["a", "b", "c"]); assert.position(anchor.getPosition(), 3, 0); assert.equal(doc.getValue(), "a\nb\nc\n"); } diff --git a/lib/ace/apply_delta.js b/lib/ace/apply_delta.js deleted file mode 100644 index 98bfe148..00000000 --- a/lib/ace/apply_delta.js +++ /dev/null @@ -1,108 +0,0 @@ -/* ***** 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"; - -function throwDeltaError(delta, errorText){ - console.log("Invalid Delta:", delta); - throw "Invalid Delta: " + errorText; -} - -function positionInDocument(docLines, position) { - return position.row >= 0 && position.row < docLines.length && - position.column >= 0 && position.column <= docLines[position.row].length; -} - -function validateDelta(docLines, delta) { - // Validate action string. - if (delta.action != "insert" && delta.action != "remove") - throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); - - // Validate lines type. - if (!(delta.lines instanceof Array)) - throwDeltaError(delta, "delta.lines must be an Array"); - - // Validate range type. - if (!delta.start || !delta.end) - throwDeltaError(delta, "delta.start/end must be an present"); - - // Validate that the start point is contained in the document. - var start = delta.start; - if (!positionInDocument(docLines, delta.start)) - throwDeltaError(delta, "delta.start must be contained in document"); - - // Validate that the end point is contained in the document (remove deltas only). - var end = delta.end; - if (delta.action == "remove" && !positionInDocument(docLines, end)) - throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); - - // Validate that the .range size matches the .lines size. - var numRangeRows = end.row - start.row; - var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); - if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) - throwDeltaError(delta, "delta.range must match delta lines"); -} - -exports.applyDelta = function(docLines, delta, doNotValidate) { - // disabled validation since it breaks autocompletion popup - // if (!doNotValidate) - // validateDelta(docLines, delta); - - var row = delta.start.row; - var startColumn = delta.start.column; - var line = docLines[row] || ""; - switch (delta.action) { - case "insert": - var lines = delta.lines; - if (lines.length === 1) { - docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); - } else { - var args = [row, 1].concat(delta.lines); - docLines.splice.apply(docLines, args); - docLines[row] = line.substring(0, startColumn) + docLines[row]; - docLines[row + delta.lines.length - 1] += line.substring(startColumn); - } - break; - case "remove": - var endColumn = delta.end.column; - var endRow = delta.end.row; - if (row === endRow) { - docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); - } else { - docLines.splice( - row, endRow - row + 1, - line.substring(0, startColumn) + docLines[endRow].substring(endColumn) - ); - } - break; - } -} -}); diff --git a/lib/ace/autocomplete.js b/lib/ace/autocomplete.js index 8e121f35..7e5674ae 100644 --- a/lib/ace/autocomplete.js +++ b/lib/ace/autocomplete.js @@ -100,7 +100,7 @@ var Autocomplete = function() { var rect = editor.container.getBoundingClientRect(); pos.top += rect.top - renderer.layerConfig.offset; pos.left += rect.left - editor.renderer.scrollLeft; - pos.left += renderer.gutterWidth; + pos.left += renderer.$gutterLayer.gutterWidth; this.popup.show(pos, lineHeight); } else if (keepPopupPosition && !prefix) { @@ -142,11 +142,10 @@ var Autocomplete = function() { // we have to check if activeElement is a child of popup because // on IE preventDefault doesn't stop scrollbar from being focussed var el = document.activeElement; - var text = this.editor.textInput.getElement(); - var fromTooltip = e.relatedTarget && e.relatedTarget == this.tooltipNode; - var container = this.popup && this.popup.container; - if (el != text && el.parentNode != container && !fromTooltip - && el != this.tooltipNode && e.relatedTarget != text + var text = this.editor.textInput.getElement() + if (el != text && ( !this.popup || el.parentNode != this.popup.container ) + && el != this.tooltipNode && e.relatedTarget != this.tooltipNode + && e.relatedTarget != text ) { this.detach(); } @@ -350,7 +349,7 @@ var Autocomplete = function() { doc = selected; if (typeof doc == "string") - doc = {docText: doc}; + doc = {docText: doc} if (!doc || !(doc.docHTML || doc.docText)) return this.hideDocTooltip(); this.showDocTooltip(doc); @@ -417,7 +416,7 @@ Autocomplete.startCommand = { bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" }; -var FilteredList = function(array, filterText) { +var FilteredList = function(array, filterText, mutateData) { this.all = array; this.filtered = array; this.filterText = filterText || ""; diff --git a/lib/ace/autocomplete/popup.js b/lib/ace/autocomplete/popup.js index 6c480b38..a151c746 100644 --- a/lib/ace/autocomplete/popup.js +++ b/lib/ace/autocomplete/popup.js @@ -31,6 +31,7 @@ define(function(require, exports, module) { "use strict"; +var EditSession = require("../edit_session").EditSession; var Renderer = require("../virtual_renderer").VirtualRenderer; var Editor = require("../editor").Editor; var Range = require("../range").Range; @@ -220,8 +221,8 @@ var AcePopup = function(parentNode) { popup.data = []; popup.setData = function(list) { - popup.setValue(lang.stringRepeat("\n", list.length), -1); popup.data = list || []; + popup.setValue(lang.stringRepeat("\n", list.length), -1); popup.setRow(0); }; popup.getData = function(row) { diff --git a/lib/ace/background_tokenizer.js b/lib/ace/background_tokenizer.js index ea4ddd0f..da8008bd 100644 --- a/lib/ace/background_tokenizer.js +++ b/lib/ace/background_tokenizer.js @@ -68,10 +68,11 @@ var BackgroundTokenizer = function(tokenizer, editor) { var endLine = -1; var doc = self.doc; - var startLine = currentLine; while (self.lines[currentLine]) currentLine++; - + + var startLine = currentLine; + var len = doc.getLength(); var processedLines = 0; self.running = false; @@ -171,12 +172,13 @@ var BackgroundTokenizer = function(tokenizer, editor) { } this.$updateOnChange = function(delta) { - var startRow = delta.start.row; - var len = delta.end.row - startRow; + var range = delta.range; + var startRow = range.start.row; + var len = range.end.row - startRow; if (len === 0) { this.lines[startRow] = null; - } else if (delta.action == "remove") { + } else if (delta.action == "removeText" || delta.action == "removeLines") { this.lines.splice(startRow, len + 1, null); this.states.splice(startRow, len + 1, null); } else { diff --git a/lib/ace/background_tokenizer_test.js b/lib/ace/background_tokenizer_test.js index fd738d06..7a4cc78c 100644 --- a/lib/ace/background_tokenizer_test.js +++ b/lib/ace/background_tokenizer_test.js @@ -75,49 +75,6 @@ module.exports = { forceTokenize(doc) testStates(doc, ["comment_regex_allowed", "start", "no_regex"]) - }, - "test background tokenizer sends update event" : function() { - var doc = new EditSession([ - "/*", - "var", - "juhu", - "*/" - ]); - doc.setMode("./mode/javascript"); - - var updateEvent = null; - doc.bgTokenizer.on("update", function(e) { - updateEvent = e.data; - }); - function checkEvent(first, last) { - assert.ok(!updateEvent, "unneccessary update event"); - doc.bgTokenizer.running = 1; - doc.bgTokenizer.$worker(); - assert.ok(updateEvent); - assert.equal([first, last] + "", - [updateEvent.first, updateEvent.last] + "") - updateEvent = null; - } - - forceTokenize(doc); - var comment = "comment_regex_allowed"; - testStates(doc, [comment, comment, comment, "start"]); - - doc.remove(new Range(0,0,0,2)); - testStates(doc, [comment, comment, comment, "start"]); - - checkEvent(0, 3); - testStates(doc, ["start", "no_regex", "no_regex", "regex"]); - - // insert /* and and press down several times quickly - doc.insert({row:0, column:0}, "/*"); - doc.getTokens(0); - doc.getTokens(1); - doc.getTokens(2); - checkEvent(0, 3); - - forceTokenize(doc); - testStates(doc, [comment, comment, comment, "start"]); } }; diff --git a/lib/ace/commands/default_commands.js b/lib/ace/commands/default_commands.js index de14df85..f1e267c1 100644 --- a/lib/ace/commands/default_commands.js +++ b/lib/ace/commands/default_commands.js @@ -423,12 +423,6 @@ exports.commands = [{ exec: function() {}, passEvent: true, readOnly: true -}, { - name: "copy", - exec: function(editor) { - // placeholder for replay macro - }, - readOnly: true }, // commands disabled in readOnly mode @@ -445,12 +439,6 @@ exports.commands = [{ }, scrollIntoView: "cursor", multiSelectAction: "forEach" -}, { - name: "paste", - exec: function(editor, args) { - editor.$handlePaste(args); - }, - scrollIntoView: "cursor" }, { name: "removeline", bindKey: bindKey("Ctrl-D", "Command-D"), diff --git a/lib/ace/commands/incremental_search_commands.js b/lib/ace/commands/incremental_search_commands.js index 59083a85..a0a0fe5f 100644 --- a/lib/ace/commands/incremental_search_commands.js +++ b/lib/ace/commands/incremental_search_commands.js @@ -69,14 +69,18 @@ exports.iSearchCommands = [{ bindKey: {win: "Ctrl-F", mac: "Command-F"}, exec: function(iSearch) { iSearch.cancelSearch(true); - } + }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: "searchForward", bindKey: {win: "Ctrl-S|Ctrl-K", mac: "Ctrl-S|Command-G"}, exec: function(iSearch, options) { options.useCurrentOrPrevSearch = true; iSearch.next(options); - } + }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: "searchBackward", bindKey: {win: "Ctrl-R|Ctrl-Shift-K", mac: "Ctrl-R|Command-Shift-G"}, @@ -84,30 +88,42 @@ exports.iSearchCommands = [{ options.useCurrentOrPrevSearch = true; options.backwards = true; iSearch.next(options); - } + }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: "extendSearchTerm", exec: function(iSearch, string) { iSearch.addString(string); - } + }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: "extendSearchTermSpace", bindKey: "space", - exec: function(iSearch) { iSearch.addString(' '); } + exec: function(iSearch) { iSearch.addString(' '); }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: "shrinkSearchTerm", bindKey: "backspace", exec: function(iSearch) { iSearch.removeChar(); - } + }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: 'confirmSearch', bindKey: 'return', - exec: function(iSearch) { iSearch.deactivate(); } + exec: function(iSearch) { iSearch.deactivate(); }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: 'cancelSearch', bindKey: 'esc|Ctrl-G', - exec: function(iSearch) { iSearch.deactivate(true); } + exec: function(iSearch) { iSearch.deactivate(true); }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: 'occurisearch', bindKey: 'Ctrl-O', @@ -115,7 +131,9 @@ exports.iSearchCommands = [{ var options = oop.mixin({}, iSearch.$options); iSearch.deactivate(); occurStartCommand.exec(iSearch.$editor, options); - } + }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: "yankNextWord", bindKey: "Ctrl-w", @@ -124,7 +142,9 @@ exports.iSearchCommands = [{ range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorWordRight(); }), string = ed.session.getTextRange(range); iSearch.addString(string); - } + }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: "yankNextChar", bindKey: "Ctrl-Alt-y", @@ -133,11 +153,15 @@ exports.iSearchCommands = [{ range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorRight(); }), string = ed.session.getTextRange(range); iSearch.addString(string); - } + }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: 'recenterTopBottom', bindKey: 'Ctrl-l', - exec: function(iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); } + exec: function(iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: 'selectAllMatches', bindKey: 'Ctrl-space', @@ -149,19 +173,18 @@ exports.iSearchCommands = [{ return ranges.concat(ea ? ea : []); }, []) : []; iSearch.deactivate(false); ranges.forEach(ed.selection.addRange.bind(ed.selection)); - } + }, + readOnly: true, + isIncrementalSearchCommand: true }, { name: 'searchAsRegExp', bindKey: 'Alt-r', exec: function(iSearch) { iSearch.convertNeedleToRegExp(); - } -}].map(function(cmd) { - cmd.readOnly = true; - cmd.isIncrementalSearchCommand = true; - cmd.scrollIntoView = "animate-cursor"; - return cmd; -}); + }, + readOnly: true, + isIncrementalSearchCommand: true +}]; function IncrementalSearchKeyboardHandler(iSearch) { this.$iSearch = iSearch; @@ -169,7 +192,7 @@ function IncrementalSearchKeyboardHandler(iSearch) { oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); -(function() { +;(function() { this.attach = function(editor) { var iSearch = this.$iSearch; @@ -178,19 +201,15 @@ oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); if (!e.command.isIncrementalSearchCommand) return undefined; e.stopPropagation(); e.preventDefault(); - var scrollTop = editor.session.getScrollTop(); - var result = e.command.exec(iSearch, e.args || {}); - editor.renderer.scrollCursorIntoView(null, 0.5); - editor.renderer.animateScrolling(scrollTop); - return result; + return e.command.exec(iSearch, e.args || {}); }); - }; + } this.detach = function(editor) { if (!this.$commandExecHandler) return; editor.commands.removeEventListener('exec', this.$commandExecHandler); delete this.$commandExecHandler; - }; + } var handleKeyboard$super = this.handleKeyboard; this.handleKeyboard = function(data, hashId, key, keyCode) { @@ -203,7 +222,7 @@ oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); if (extendCmd) { return {command: extendCmd, args: key}; } } return {command: "null", passEvent: hashId == 0 || hashId == 4}; - }; + } }).call(IncrementalSearchKeyboardHandler.prototype); diff --git a/lib/ace/config.js b/lib/ace/config.js index fe9312fd..34bf50fd 100644 --- a/lib/ace/config.js +++ b/lib/ace/config.js @@ -39,7 +39,7 @@ var AppConfig = require("./lib/app_config").AppConfig; module.exports = exports = new AppConfig(); var global = (function() { - return this || typeof window != "undefined" && window; + return this; })(); var options = { diff --git a/lib/ace/css/editor.css b/lib/ace/css/editor.css index 87eb67b3..cef995c8 100644 --- a/lib/ace/css/editor.css +++ b/lib/ace/css/editor.css @@ -422,30 +422,3 @@ position: absolute; z-index: 8; } - -/* -styles = [] -for (var i = 1; i < 16; i++) { - styles.push(".ace_br" + i + "{" + ( - ["top-left", "top-right", "bottom-right", "bottom-left"] - ).map(function(x, j) { - return i & (1<= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length-1).length; + } else if (position.row < 0) + position.row = 0; + return position; }; /** @@ -261,160 +243,160 @@ var Document = function(textOrLines) { * **/ this.insert = function(position, text) { - // Only detect new lines if the document has no line break yet. + if (!text || text.length === 0) + return position; + + position = this.$clipPosition(position); + + // only detect new lines if the document has no line break yet if (this.getLength() <= 1) this.$detectNewLine(text); - - return this.insertMergedLines(position, this.$split(text)); + + var lines = this.$split(text); + var firstLine = lines.splice(0, 1)[0]; + var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; + + position = this.insertInLine(position, firstLine); + if (lastLine !== null) { + position = this.insertNewLine(position); // terminate first line + position = this._insertLines(position.row, lines); + position = this.insertInLine(position, lastLine || ""); + } + return position; }; - + /** - * Inserts `text` into the `position` at the current row. This method also triggers the `"change"` event. - * - * This differs from the `insert` method in two ways: - * 1. This does NOT handle newline characters (single-line text only). - * 2. This is faster than the `insert` method for single-line text insertions. - * + * Fires whenever the document changes. + * + * Several methods trigger different `"change"` events. Below is a list of each action type, followed by each property that's also available: + * + * * `"insertLines"` (emitted by [[Document.insertLines]]) + * * `range`: the [[Range]] of the change within the document + * * `lines`: the lines in the document that are changing + * * `"insertText"` (emitted by [[Document.insertNewLine]]) + * * `range`: the [[Range]] of the change within the document + * * `text`: the text that's being added + * * `"removeLines"` (emitted by [[Document.insertLines]]) + * * `range`: the [[Range]] of the change within the document + * * `lines`: the lines in the document that were removed + * * `nl`: the new line character (as defined by [[Document.getNewLineCharacter]]) + * * `"removeText"` (emitted by [[Document.removeInLine]] and [[Document.removeNewLine]]) + * * `range`: the [[Range]] of the change within the document + * * `text`: the text that's being removed + * + * @event change + * @param {Object} e Contains at least one property called `"action"`. `"action"` indicates the action that triggered the change. Each action also has a set of additional properties. + * + **/ + /** + * Inserts the elements in `lines` into the document, starting at the row index given by `row`. This method also triggers the `'change'` event. + * @param {Number} row The index of the row to insert at + * @param {Array} lines An array of strings + * @returns {Object} Contains the final row and column, like this: + * ``` + * {row: endRow, column: 0} + * ``` + * If `lines` is empty, this function returns an object containing the current row, and column, like this: + * ``` + * {row: row, column: 0} + * ``` + * + **/ + this.insertLines = function(row, lines) { + if (row >= this.getLength()) + return this.insert({row: row, column: 0}, "\n" + lines.join("\n")); + return this._insertLines(Math.max(row, 0), lines); + }; + this._insertLines = function(row, lines) { + if (lines.length == 0) + return {row: row, column: 0}; + + // Apply doesn't work for big arrays due to max call stack detection. + // Chrome 64 bit requires threshold smaller than 32k, using a safe value of 20k. + // To circumvent that we have to break huge inserts into smaller chunks here. + while (lines.length > 20000) { + var end = this._insertLines(row, lines.slice(0, 20000)); + lines = lines.slice(20000); + row = end.row; + } + + var args = [row, 0]; + args.push.apply(args, lines); + this.$lines.splice.apply(this.$lines, args); + + var range = new Range(row, 0, row + lines.length, 0); + var delta = { + action: "insertLines", + range: range, + lines: lines + }; + this._signal("change", { data: delta }); + return range.end; + }; + + /** + * Inserts a new line into the document at the current row's `position`. This method also triggers the `'change'` event. + * @param {Object} position The position to insert at + * @returns {Object} Returns an object containing the final row and column, like this:
+ * ``` + * {row: endRow, column: 0} + * ``` + * + **/ + this.insertNewLine = function(position) { + position = this.$clipPosition(position); + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column); + this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); + + var end = { + row : position.row + 1, + column : 0 + }; + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: this.getNewLineCharacter() + }; + this._signal("change", { data: delta }); + + return end; + }; + + /** + * Inserts `text` into the `position` at the current row. This method also triggers the `'change'` event. * @param {Object} position The position to insert at; it's an object that looks like `{ row: row, column: column}` * @param {String} text A chunk of text * @returns {Object} Returns an object containing the final row and column, like this: * ``` * {row: endRow, column: 0} * ``` + * **/ this.insertInLine = function(position, text) { - var start = this.clippedPos(position.row, position.column); - var end = this.pos(position.row, position.column + text.length); - - this.applyDelta({ - start: start, - end: end, - action: "insert", - lines: [text] - }, true); - - return this.clonePos(end); - }; - - this.clippedPos = function(row, column) { - var length = this.getLength(); - if (row === undefined) { - row = length; - } else if (row < 0) { - row = 0; - } else if (row >= length) { - row = length - 1; - column = undefined; - } - var line = this.getLine(row); - if (column == undefined) - column = line.length; - column = Math.min(Math.max(column, 0), line.length); - return {row: row, column: column}; - }; - - this.clonePos = function(pos) { - return {row: pos.row, column: pos.column}; - }; - - this.pos = function(row, column) { - return {row: row, column: column}; - }; - - this.$clipPosition = function(position) { - var length = this.getLength(); - if (position.row >= length) { - position.row = Math.max(0, length - 1); - position.column = this.getLine(length - 1).length; - } else { - position.row = Math.max(0, position.row); - position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); - } - return position; - }; + if (text.length == 0) + return position; - /** - * Fires whenever the document changes. - * - * Several methods trigger different `"change"` events. Below is a list of each action type, followed by each property that's also available: - * - * * `"insert"` - * * `range`: the [[Range]] of the change within the document - * * `lines`: the lines being added - * * `"remove"` - * * `range`: the [[Range]] of the change within the document - * * `lines`: the lines being removed - * - * @event change - * @param {Object} e Contains at least one property called `"action"`. `"action"` indicates the action that triggered the change. Each action also has a set of additional properties. - * - **/ - - /** - * Inserts the elements in `lines` into the document as full lines (does not merge with existing line), starting at the row index given by `row`. This method also triggers the `"change"` event. - * @param {Number} row The index of the row to insert at - * @param {Array} lines An array of strings - * @returns {Object} Contains the final row and column, like this: - * ``` - * {row: endRow, column: 0} - * ``` - * If `lines` is empty, this function returns an object containing the current row, and column, like this: - * ``` - * {row: row, column: 0} - * ``` - * - **/ - this.insertFullLines = function(row, lines) { - // Clip to document. - // Allow one past the document end. - row = Math.min(Math.max(row, 0), this.getLength()); - - // Calculate insertion point. - var column = 0; - if (row < this.getLength()) { - // Insert before the specified row. - lines = lines.concat([""]); - column = 0; - } else { - // Insert after the last row in the document. - lines = [""].concat(lines); - row--; - column = this.$lines[row].length; - } - - // Insert. - this.insertMergedLines({row: row, column: column}, lines); - }; + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column) + text + + line.substring(position.column); - /** - * Inserts the elements in `lines` into the document, starting at the position index given by `row`. This method also triggers the `"change"` event. - * @param {Number} row The index of the row to insert at - * @param {Array} lines An array of strings - * @returns {Object} Contains the final row and column, like this: - * ``` - * {row: endRow, column: 0} - * ``` - * If `lines` is empty, this function returns an object containing the current row, and column, like this: - * ``` - * {row: row, column: 0} - * ``` - * - **/ - this.insertMergedLines = function(position, lines) { - var start = this.clippedPos(position.row, position.column); var end = { - row: start.row + lines.length - 1, - column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + row : position.row, + column : position.column + text.length }; - - this.applyDelta({ - start: start, - end: end, - action: "insert", - lines: lines - }); - - return this.clonePos(end); + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: text + }; + this._signal("change", { data: delta }); + + return end; }; /** @@ -424,90 +406,113 @@ var Document = function(textOrLines) { * **/ this.remove = function(range) { - var start = this.clippedPos(range.start.row, range.start.column); - var end = this.clippedPos(range.end.row, range.end.column); - this.applyDelta({ - start: start, - end: end, - action: "remove", - lines: this.getLinesForRange({start: start, end: end}) - }); - return this.clonePos(start); + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + // clip to document + range.start = this.$clipPosition(range.start); + range.end = this.$clipPosition(range.end); + + if (range.isEmpty()) + return range.start; + + var firstRow = range.start.row; + var lastRow = range.end.row; + + if (range.isMultiLine()) { + var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; + var lastFullRow = lastRow - 1; + + if (range.end.column > 0) + this.removeInLine(lastRow, 0, range.end.column); + + if (lastFullRow >= firstFullRow) + this._removeLines(firstFullRow, lastFullRow); + + if (firstFullRow != firstRow) { + this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); + this.removeNewLine(range.start.row); + } + } + else { + this.removeInLine(firstRow, range.start.column, range.end.column); + } + return range.start; }; /** - * Removes the specified columns from the `row`. This method also triggers a `"change"` event. - * @param {Number} row The row to remove from - * @param {Number} startColumn The column to start removing at - * @param {Number} endColumn The column to stop removing at - * @returns {Object} Returns an object containing `startRow` and `startColumn`, indicating the new row and column values.
If `startColumn` is equal to `endColumn`, this function returns nothing. - * - **/ + * Removes the specified columns from the `row`. This method also triggers the `'change'` event. + * @param {Number} row The row to remove from + * @param {Number} startColumn The column to start removing at + * @param {Number} endColumn The column to stop removing at + * @returns {Object} Returns an object containing `startRow` and `startColumn`, indicating the new row and column values.
If `startColumn` is equal to `endColumn`, this function returns nothing. + * + **/ this.removeInLine = function(row, startColumn, endColumn) { - var start = this.clippedPos(row, startColumn); - var end = this.clippedPos(row, endColumn); - - this.applyDelta({ - start: start, - end: end, - action: "remove", - lines: this.getLinesForRange({start: start, end: end}) - }, true); - - return this.clonePos(start); + if (startColumn == endColumn) + return; + + var range = new Range(row, startColumn, row, endColumn); + var line = this.getLine(row); + var removed = line.substring(startColumn, endColumn); + var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); + this.$lines.splice(row, 1, newLine); + + var delta = { + action: "removeText", + range: range, + text: removed + }; + this._signal("change", { data: delta }); + return range.start; }; /** - * Removes a range of full lines. This method also triggers the `"change"` event. + * Removes a range of full lines. This method also triggers the `'change'` event. * @param {Number} firstRow The first row to be removed * @param {Number} lastRow The last row to be removed * @returns {[String]} Returns all the removed lines. * **/ - this.removeFullLines = function(firstRow, lastRow) { - // Clip to document. - firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); - lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); - - // Calculate deletion range. - // Delete the ending new line unless we're at the end of the document. - // If we're at the end of the document, delete the starting new line. - var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; - var deleteLastNewLine = lastRow < this.getLength() - 1; - var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); - var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); - var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); - var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); - var range = new Range(startRow, startCol, endRow, endCol); - - // Store delelted lines with bounding newlines ommitted (maintains previous behavior). - var deletedLines = this.$lines.slice(firstRow, lastRow + 1); - - this.applyDelta({ - start: range.start, - end: range.end, - action: "remove", - lines: this.getLinesForRange(range) - }); - - // Return the deleted lines. - return deletedLines; + this.removeLines = function(firstRow, lastRow) { + if (firstRow < 0 || lastRow >= this.getLength()) + return this.remove(new Range(firstRow, 0, lastRow + 1, 0)); + return this._removeLines(firstRow, lastRow); + }; + + this._removeLines = function(firstRow, lastRow) { + var range = new Range(firstRow, 0, lastRow + 1, 0); + var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); + + var delta = { + action: "removeLines", + range: range, + nl: this.getNewLineCharacter(), + lines: removed + }; + this._signal("change", { data: delta }); + return removed; }; /** - * Removes the new line between `row` and the row immediately following it. This method also triggers the `"change"` event. + * Removes the new line between `row` and the row immediately following it. This method also triggers the `'change'` event. * @param {Number} row The row to check * **/ this.removeNewLine = function(row) { - if (row < this.getLength() - 1 && row >= 0) { - this.applyDelta({ - start: this.pos(row, this.getLine(row).length), - end: this.pos(row + 1, 0), - action: "remove", - lines: ["", ""] - }); - } + var firstLine = this.getLine(row); + var secondLine = this.getLine(row+1); + + var range = new Range(row, firstLine.length, row+1, 0); + var line = firstLine + secondLine; + + this.$lines.splice(row, 2, line); + + var delta = { + action: "removeText", + range: range, + text: this.getNewLineCharacter() + }; + this._signal("change", { data: delta }); }; /** @@ -521,9 +526,9 @@ var Document = function(textOrLines) { * **/ this.replace = function(range, text) { - if (!range instanceof Range) + if (!(range instanceof Range)) range = Range.fromPoints(range.start, range.end); - if (text.length === 0 && range.isEmpty()) + if (text.length == 0 && range.isEmpty()) return range.start; // Shortcut: If the text we want to insert is the same as it is already @@ -532,106 +537,55 @@ var Document = function(textOrLines) { return range.end; this.remove(range); - var end; if (text) { - end = this.insert(range.start, text); + var end = this.insert(range.start, text); } else { end = range.start; } - + return end; }; /** - * Applies all changes in `deltas` to the document. - * @param {Array} deltas An array of delta objects (can include "insert" and "remove" actions) + * Applies all the changes previously accumulated. These can be either `'insertText'`, `'insertLines'`, `'removeText'`, and `'removeLines'`. **/ this.applyDeltas = function(deltas) { for (var i=0; i=0; i--) { - this.revertDelta(deltas[i]); + var delta = deltas[i]; + + var range = Range.fromPoints(delta.range.start, delta.range.end); + + if (delta.action == "insertLines") + this._removeLines(range.start.row, range.end.row - 1); + else if (delta.action == "insertText") + this.remove(range); + else if (delta.action == "removeLines") + this._insertLines(range.start.row, delta.lines); + else if (delta.action == "removeText") + this.insert(range.start, delta.text); } }; - - /** - * Applies `delta` to the document. - * @param {Object} delta A delta object (can include "insert" and "remove" actions) - **/ - this.applyDelta = function(delta, doNotValidate) { - var isInsert = delta.action == "insert"; - // An empty range is a NOOP. - if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] - : !Range.comparePoints(delta.start, delta.end)) { - return; - } - - if (isInsert && delta.lines.length > 20000) - this.$splitAndapplyLargeDelta(delta, 20000); - - // Apply. - applyDelta(this.$lines, delta, doNotValidate); - this._signal("change", delta); - }; - - this.$splitAndapplyLargeDelta = function(delta, MAX) { - // Split large insert deltas. This is necessary because: - // 1. We need to support splicing delta lines into the document via $lines.splice.apply(...) - // 2. fn.apply() doesn't work for a large number of params. The smallest threshold is on chrome 40 ~42000. - // we use 20000 to leave some space for actual stack - // - // To Do: Ideally we'd be consistent and also split 'delete' deltas. We don't do this now, because delete - // delta handling is too slow. If we make delete delta handling faster we can split all large deltas - // as shown in https://gist.github.com/aldendaniels/8367109#file-document-snippet-js - // If we do this, update validateDelta() to limit the number of lines in a delete delta. - var lines = delta.lines; - var l = lines.length; - var row = delta.start.row; - var column = delta.start.column; - var from = 0, to = 0; - do { - from = to; - to += MAX - 1; - var chunk = lines.slice(from, to); - if (to > l) { - // Update remaining delta. - delta.lines = chunk; - delta.start.row = row + from; - delta.start.column = column; - break; - } - chunk.push(""); - this.applyDelta({ - start: this.pos(row + from, column), - end: this.pos(row + to, column = 0), - action: delta.action, - lines: chunk - }, true); - } while(true); - }; - - /** - * Reverts `delta` from the document. - * @param {Object} delta A delta object (can include "insert" and "remove" actions) - **/ - this.revertDelta = function(delta) { - this.applyDelta({ - start: this.clonePos(delta.start), - end: this.clonePos(delta.end), - action: (delta.action == "insert" ? "remove" : "insert"), - lines: delta.lines.slice() - }); - }; - + /** * Converts an index position in a document to a `{row, column}` object. * diff --git a/lib/ace/document_test.js b/lib/ace/document_test.js index ada56cd2..051434b4 100644 --- a/lib/ace/document_test.js +++ b/lib/ace/document_test.js @@ -46,7 +46,7 @@ module.exports = { var doc = new Document(["12", "34"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); doc.insert({row: 0, column: 1}, "juhu"); assert.equal(doc.getValue(), ["1juhu2", "34"].join("\n")); @@ -63,9 +63,9 @@ module.exports = { var doc = new Document(["12", "34"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); - doc.insertMergedLines({row: 0, column: 1}, ['', '']); + doc.insertNewLine({row: 0, column: 1}); assert.equal(doc.getValue(), ["1", "2", "34"].join("\n")); var d = deltas.concat(); @@ -80,9 +80,9 @@ module.exports = { var doc = new Document(["12", "34"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); - doc.insertFullLines(0, ["aa", "bb"]); + doc.insertLines(0, ["aa", "bb"]); assert.equal(doc.getValue(), ["aa", "bb", "12", "34"].join("\n")); var d = deltas.concat(); @@ -97,9 +97,9 @@ module.exports = { var doc = new Document(["12", "34"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); - doc.insertFullLines(2, ["aa", "bb"]); + doc.insertLines(2, ["aa", "bb"]); assert.equal(doc.getValue(), ["12", "34", "aa", "bb"].join("\n")); }, @@ -107,9 +107,9 @@ module.exports = { var doc = new Document(["12", "34"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); - doc.insertFullLines(1, ["aa", "bb"]); + doc.insertLines(1, ["aa", "bb"]); assert.equal(doc.getValue(), ["12", "aa", "bb", "34"].join("\n")); var d = deltas.concat(); @@ -124,7 +124,7 @@ module.exports = { var doc = new Document(["12", "34"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); doc.insert({row: 0, column: 0}, "aa\nbb\ncc"); assert.equal(doc.getValue(), ["aa", "bb", "cc12", "34"].join("\n")); @@ -141,9 +141,9 @@ module.exports = { var doc = new Document(["12", "34"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); - doc.insert({row: 1, column: 2}, "aa\nbb\ncc"); + doc.insert({row: 2, column: 0}, "aa\nbb\ncc"); assert.equal(doc.getValue(), ["12", "34aa", "bb", "cc"].join("\n")); var d = deltas.concat(); @@ -158,7 +158,7 @@ module.exports = { var doc = new Document(["12", "34"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); doc.insert({row: 0, column: 1}, "aa\nbb\ncc"); assert.equal(doc.getValue(), ["1aa", "bb", "cc2", "34"].join("\n")); @@ -175,7 +175,7 @@ module.exports = { var doc = new Document(["1234", "5678"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); doc.remove(new Range(0, 1, 0, 3)); assert.equal(doc.getValue(), ["14", "5678"].join("\n")); @@ -192,7 +192,7 @@ module.exports = { var doc = new Document(["1234", "5678"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); doc.remove(new Range(0, 4, 1, 0)); assert.equal(doc.getValue(), ["12345678"].join("\n")); @@ -209,7 +209,7 @@ module.exports = { var doc = new Document(["1234", "5678", "abcd"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); doc.remove(new Range(0, 2, 2, 2)); assert.equal(doc.getValue(), ["12cd"].join("\n")); @@ -226,7 +226,7 @@ module.exports = { var doc = new Document(["1234", "5678", "abcd"]); var deltas = []; - doc.on("change", function(e) { deltas.push(e); }); + doc.on("change", function(e) { deltas.push(e.data); }); doc.remove(new Range(1, 0, 3, 0)); assert.equal(doc.getValue(), ["1234", ""].join("\n")); @@ -235,7 +235,7 @@ module.exports = { "test: remove lines should return the removed lines" : function() { var doc = new Document(["1234", "5678", "abcd"]); - var removed = doc.removeFullLines(1, 2); + var removed = doc.removeLines(1, 2); assert.equal(removed.join("\n"), ["5678", "abcd"].join("\n")); }, diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index 2aa9b378..b35ea4e0 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -151,7 +151,7 @@ var EditSession = function(text, mode) { this.$foldData = []; this.$foldData.toString = function() { return this.join("\n"); - }; + } this.on("changeFold", this.onChangeFold.bind(this)); this.$onChange = this.onChange.bind(this); @@ -249,12 +249,13 @@ var EditSession = function(text, mode) { this.$resetRowCache(fold.start.row); }; - this.onChange = function(delta) { + this.onChange = function(e) { + var delta = e.data; this.$modified = true; - this.$resetRowCache(delta.start.row); + this.$resetRowCache(delta.range.start.row); - var removedFolds = this.$updateInternalDataOnChange(delta); + var removedFolds = this.$updateInternalDataOnChange(e); if (!this.$fromUndo && this.$undoManager && !delta.ignore) { this.$deltasDoc.push(delta); if (removedFolds && removedFolds.length != 0) { @@ -268,7 +269,7 @@ var EditSession = function(text, mode) { } this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta); - this._signal("change", delta); + this._signal("change", e); }; /** @@ -678,10 +679,10 @@ var EditSession = function(text, mode) { }; /** - * Returns an object containing all of the markers, either front or back. + * Returns an array containing the IDs of all the markers, either front or back. * @param {Boolean} inFront If `true`, indicates you only want front markers; `false` indicates only back markers * - * @returns {Object} + * @returns {Array} **/ this.getMarkers = function(inFront) { return inFront ? this.$frontMarkers : this.$backMarkers; @@ -1145,19 +1146,6 @@ var EditSession = function(text, mode) { this.remove = function(range) { return this.doc.remove(range); }; - - /** - * Removes a range of full lines. This method also triggers the `'change'` event. - * @param {Number} firstRow The first row to be removed - * @param {Number} lastRow The last row to be removed - * @returns {[String]} Returns all the removed lines. - * - * @related Document.removeFullLines - * - **/ - this.removeFullLines = function(firstRow, lastRow){ - return this.doc.removeFullLines(firstRow, lastRow); - }; /** * Reverts previous changes to your document. @@ -1234,36 +1222,39 @@ var EditSession = function(text, mode) { this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) { function isInsert(delta) { - return isUndo ? delta.action !== "insert" : delta.action === "insert"; + var insert = + delta.action === "insertText" || delta.action === "insertLines"; + return isUndo ? !insert : insert; } var delta = deltas[0]; var range, point; var lastDeltaIsInsert = false; if (isInsert(delta)) { - range = Range.fromPoints(delta.start, delta.end); + range = Range.fromPoints(delta.range.start, delta.range.end); lastDeltaIsInsert = true; } else { - range = Range.fromPoints(delta.start, delta.start); + range = Range.fromPoints(delta.range.start, delta.range.start); lastDeltaIsInsert = false; } for (var i = 1; i < deltas.length; i++) { delta = deltas[i]; if (isInsert(delta)) { - point = delta.start; + point = delta.range.start; if (range.compare(point.row, point.column) == -1) { - range.setStart(point); + range.setStart(delta.range.start); } - point = delta.end; + point = delta.range.end; if (range.compare(point.row, point.column) == 1) { - range.setEnd(point); + range.setEnd(delta.range.end); } lastDeltaIsInsert = true; } else { - point = delta.start; + point = delta.range.start; if (range.compare(point.row, point.column) == -1) { - range = Range.fromPoints(delta.start, delta.start); + range = + Range.fromPoints(delta.range.start, delta.range.start); } lastDeltaIsInsert = false; } @@ -1377,7 +1368,7 @@ var EditSession = function(text, mode) { this.indentRows = function(startRow, endRow, indentString) { indentString = indentString.replace(/\t/g, this.getTabString()); for (var row=startRow; row<=endRow; row++) - this.doc.insertInLine({row: row, column: 0}, indentString); + this.insert({row: row, column:0}, indentString); }; /** @@ -1434,11 +1425,11 @@ var EditSession = function(text, mode) { x.end.row += diff; return x; }); - + var lines = dir == 0 ? this.doc.getLines(firstRow, lastRow) - : this.doc.removeFullLines(firstRow, lastRow); - this.doc.insertFullLines(firstRow+diff, lines); + : this.doc.removeLines(firstRow, lastRow); + this.doc.insertLines(firstRow+diff, lines); folds.length && this.addFolds(folds); return diff; }; @@ -1448,6 +1439,8 @@ var EditSession = function(text, mode) { * @param {Number} lastRow The final row to move up * @returns {Number} If `firstRow` is less-than or equal to 0, this function returns 0. Otherwise, on success, it returns -1. * + * @related Document.insertLines + * **/ this.moveLinesUp = function(firstRow, lastRow) { return this.$moveLines(firstRow, lastRow, -1); @@ -1458,6 +1451,8 @@ var EditSession = function(text, mode) { * @param {Number} firstRow The starting row to move down * @param {Number} lastRow The final row to move down * @returns {Number} If `firstRow` is less-than or equal to 0, this function returns 0. Otherwise, on success, it returns -1. + * + * @related Document.insertLines **/ this.moveLinesDown = function(firstRow, lastRow) { return this.$moveLines(firstRow, lastRow, 1); @@ -1661,23 +1656,34 @@ var EditSession = function(text, mode) { }; }; - this.$updateInternalDataOnChange = function(delta) { + this.$updateInternalDataOnChange = function(e) { var useWrapMode = this.$useWrapMode; - var action = delta.action; - var start = delta.start; - var end = delta.end; - var firstRow = start.row; - var lastRow = end.row; - var len = lastRow - firstRow; + var len; + var action = e.data.action; + var firstRow = e.data.range.start.row; + var lastRow = e.data.range.end.row; + var start = e.data.range.start; + var end = e.data.range.end; var removedFolds = null; - + + if (action.indexOf("Lines") != -1) { + if (action == "insertLines") { + lastRow = firstRow + (e.data.lines.length); + } else { + lastRow = firstRow; + } + len = e.data.lines ? e.data.lines.length : lastRow - firstRow; + } else { + len = lastRow - firstRow; + } + this.$updating = true; if (len != 0) { - if (action === "remove") { + if (action.indexOf("remove") != -1) { this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); var foldLines = this.$foldData; - removedFolds = this.getFoldsInRange(delta); + removedFolds = this.getFoldsInRange(e.data.range); this.removeFolds(removedFolds); var foldLine = this.getFoldLine(end.row); @@ -1742,10 +1748,10 @@ var EditSession = function(text, mode) { } else { // Realign folds. E.g. if you add some new chars before a fold, the // fold should "move" to the right. - len = Math.abs(delta.start.column - delta.end.column); - if (action === "remove") { + len = Math.abs(e.data.range.start.column - e.data.range.end.column); + if (action.indexOf("remove") != -1) { // Get all the folds in the change range and remove them. - removedFolds = this.getFoldsInRange(delta); + removedFolds = this.getFoldsInRange(e.data.range); this.removeFolds(removedFolds); len = -len; @@ -1829,7 +1835,7 @@ var EditSession = function(text, mode) { TAB_SPACE = 12; - this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) { + this.$computeWrapSplits = function(tokens, wrapLimit) { if (tokens.length == 0) { return []; } @@ -1840,31 +1846,6 @@ var EditSession = function(text, mode) { var isCode = this.$wrapAsCode; - var indentedSoftWrap = this.$indentedSoftWrap; - var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) - || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); - - function getWrapIndent() { - var indentation = 0; - if (maxIndent === 0) - return indentation; - if (indentedSoftWrap) { - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - if (token == SPACE) - indentation += 1; - else if (token == TAB) - indentation += tabSize; - else if (token == TAB_SPACE) - continue; - else - break; - } - } - if (isCode && indentedSoftWrap !== false) - indentation += tabSize; - return Math.min(indentation, maxIndent); - } function addSplit(screenPos) { var displayed = tokens.slice(lastSplit, screenPos); @@ -1881,18 +1862,14 @@ var EditSession = function(text, mode) { len -= 1; }); - if (!splits.length) { - indent = getWrapIndent(); - splits.indent = indent; - } lastDocSplit += len; splits.push(lastDocSplit); lastSplit = screenPos; } - var indent = 0; - while (displayLength - lastSplit > wrapLimit - indent) { + + while (displayLength - lastSplit > wrapLimit) { // This is, where the split should be. - var split = lastSplit + wrapLimit - indent; + var split = lastSplit + wrapLimit; // If there is a space or tab at this split position, then making // a split is simple. @@ -1952,7 +1929,7 @@ var EditSession = function(text, mode) { // === ELSE === // Search for the first non space/tab/placeholder/punctuation token backwards. - var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1); + var minSplit = Math.max(split - (isCode ? 10 : wrapLimit-(wrapLimit>>2)), lastSplit - 1); while (split > minSplit && tokens[split] < PLACEHOLDER_START) { split --; } @@ -1980,7 +1957,7 @@ var EditSession = function(text, mode) { // around -> force a split. if (tokens[split] == CHAR_EXT) split--; - addSplit(split - indent); + addSplit(split); } return splits; }; @@ -2087,16 +2064,6 @@ var EditSession = function(text, mode) { } }; - this.getRowWrapIndent = function(screenRow) { - if (this.$useWrapMode) { - var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); - var splits = this.$wrapData[pos.row]; - return splits.length && splits[0] < pos.column ? splits.indent : 0; - } else { - return 0; - } - } - /** * Returns the position (on screen) for the last character in the provided screen row. * @param {Number} screenRow The screen row to check @@ -2234,21 +2201,20 @@ var EditSession = function(text, mode) { line = this.getLine(docRow); foldLine = null; } - var wrapIndent = 0; + if (this.$useWrapMode) { var splits = this.$wrapData[docRow]; if (splits) { var splitIndex = Math.floor(screenRow - row); column = splits[splitIndex]; if(splitIndex > 0 && splits.length) { - wrapIndent = splits.indent; docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; line = line.substring(docColumn); } } } - docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; + docColumn += this.$getStringScreenWidth(line, screenColumn)[1]; // We remove one character at the end so that the docColumn // position returned is not associated to the next row on the screen. @@ -2340,7 +2306,6 @@ var EditSession = function(text, mode) { textLine = this.getLine(docRow).substring(0, docColumn); foldStartRow = docRow; } - var wrapIndent = 0; // Clamp textLine if in wrapMode. if (this.$useWrapMode) { var wrapRow = this.$wrapData[foldStartRow]; @@ -2353,13 +2318,12 @@ var EditSession = function(text, mode) { textLine = textLine.substring( wrapRow[screenRowOffset - 1] || 0, textLine.length ); - wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; } } return { row: screenRow, - column: wrapIndent + this.$getStringScreenWidth(textLine)[0] + column: this.$getStringScreenWidth(textLine)[0] }; }; @@ -2539,7 +2503,6 @@ config.defineOptions(EditSession.prototype, "session", { }, initialValue: "auto" }, - indentedSoftWrap: { initialValue: true }, firstLineNumber: { set: function() {this._signal("changeBreakpoint");}, initialValue: 1 diff --git a/lib/ace/edit_session/bracket_match.js b/lib/ace/edit_session/bracket_match.js index 62a8499c..064ee3dc 100644 --- a/lib/ace/edit_session/bracket_match.js +++ b/lib/ace/edit_session/bracket_match.js @@ -117,7 +117,7 @@ function BracketMatch() { typeRe = new RegExp( "(\\.?" + token.type.replace(".", "\\.").replace("rparen", ".paren") - .replace(/\b(?:end)\b/, "(?:start|begin|end)") + .replace(/\b(?:end|start|begin)\b/, "") + ")+" ); } @@ -174,7 +174,7 @@ function BracketMatch() { typeRe = new RegExp( "(\\.?" + token.type.replace(".", "\\.").replace("lparen", ".paren") - .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") + .replace(/\b(?:end|start|begin)\b/, "") + ")+" ); } diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index 77c0f22d..53071dda 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -829,13 +829,15 @@ function Folding() { } }; - this.updateFoldWidgets = function(delta) { - var firstRow = delta.start.row; - var len = delta.end.row - firstRow; + this.updateFoldWidgets = function(e) { + var delta = e.data; + var range = delta.range; + var firstRow = range.start.row; + var len = range.end.row - firstRow; if (len === 0) { this.foldWidgets[firstRow] = null; - } else if (delta.action == 'remove') { + } else if (delta.action == "removeText" || delta.action == "removeLines") { this.foldWidgets.splice(firstRow, len + 1, null); } else { var args = Array(len + 1); diff --git a/lib/ace/edit_session_test.js b/lib/ace/edit_session_test.js index 0b904b63..87cc9567 100644 --- a/lib/ace/edit_session_test.js +++ b/lib/ace/edit_session_test.js @@ -280,7 +280,7 @@ module.exports = { session.setUseWrapMode(true); session.setWrapLimitRange(12, 12); session.adjustWrapLimit(80); - session.setOption("wrapMethod", "text"); + assert.position(session.documentToScreenPosition(0, 11), 0, 11); assert.position(session.documentToScreenPosition(0, 12), 1, 0); }, @@ -380,8 +380,7 @@ module.exports = { line = lang.stringTrimRight(line); var tokens = EditSession.prototype.$getDisplayTokens(line); var splits = EditSession.prototype.$computeWrapSplits(tokens, wrapLimit, tabSize); - console.log("String:", line, "Result:", splits, "Expected:", assertEqual); - + // console.log("String:", line, "Result:", splits, "Expected:", assertEqual); assert.ok(splits.length == assertEqual.length); for (var i = 0; i < splits.length; i++) { assert.ok(splits[i] == assertEqual[i]); @@ -389,7 +388,6 @@ module.exports = { } EditSession.prototype.$wrapAsCode = true; - EditSession.prototype.$indentedSoftWrap = false; // Basic splitting. computeAndAssert("foo bar foo bar", [ 12 ]); computeAndAssert("foo bar f bar", [ 12 ]); @@ -415,26 +413,16 @@ module.exports = { computeAndAssert("ぁぁ", [1], 2); computeAndAssert(" ぁぁ", [1, 2], 2); computeAndAssert(" ぁ\tぁ", [1, 3], 2); - computeAndAssert(" ぁぁ\tぁ", [2, 4], 4); - computeAndAssert("ぁぁ ぁぁ\tぁ", [3, 6], 6); + computeAndAssert(" ぁぁ\tぁ", [1, 4], 4); // Test wrapping for punctuation. - computeAndAssert(" ab.c;ef++", [2, 4, 6, 8], 2); - computeAndAssert(" ab.c;ef++", [3, 5, 8], 3); + computeAndAssert(" ab.c;ef++", [1, 3, 5, 7, 8], 2); computeAndAssert(" a.b", [1, 2, 3], 1); computeAndAssert("#>>", [1, 2], 1); // Test wrapping for punctuation in EditSession.prototype.$wrapAsCode = false; computeAndAssert("ab cde, Juhu kinners", [3, 8, 13, 19], 6); - - // test indented wrapping - EditSession.prototype.$indentedSoftWrap = true; - computeAndAssert("foo bar foo bar foo bara foo", [12, 25]); - computeAndAssert("fooooooooooooooooooooooooooo", [12, 24]); - computeAndAssert("\t\tfoo bar fooooooooooobooooooo", [6, 10, 16, 22, 28]); - computeAndAssert("\t\t\tfoo bar fooooooooooobooooooo", [3, 7, 11, 17, 23, 29]); - computeAndAssert("\tfoo \t \t \t \t bar", [6, 12]); // 14 }, "test get longest line" : function() { @@ -442,12 +430,12 @@ module.exports = { session.setTabSize(4); assert.equal(session.getScreenWidth(), 2); - session.doc.insertMergedLines({row: 0, column: Infinity}, ['', '']); - session.doc.insertFullLines(1, ["123"]); + session.doc.insertNewLine({row: 0, column: Infinity}); + session.doc.insertLines(1, ["123"]); assert.equal(session.getScreenWidth(), 3); - session.doc.insertMergedLines({row: 0, column: Infinity}, ['', '']); - session.doc.insertFullLines(1, ["\t\t"]); + session.doc.insertNewLine({row: 0, column: Infinity}); + session.doc.insertLines(1, ["\t\t"]); assert.equal(session.getScreenWidth(), 8); @@ -471,9 +459,9 @@ module.exports = { session.setUseWrapMode(true); - document.insertFullLines(0, ["a", "b"]); - document.insertFullLines(2, ["c", "d"]); - document.removeFullLines(1, 2); + document.insertLines(0, ["a", "b"]); + document.insertLines(2, ["c", "d"]); + document.removeLines(1, 2); }, "test wrapMode init has to create wrapData array": function() { diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 5da8a961..1a3eed0a 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -162,12 +162,8 @@ var Editor = function(renderer, session) { var command = this.curOp.command; if (command.name && this.$blockScrolling > 0) this.$blockScrolling--; - var scrollIntoView = command && command.scrollIntoView; - if (scrollIntoView) { - switch (scrollIntoView) { - case "center-animate": - scrollIntoView = "animate"; - /* fall through */ + if (command && command.scrollIntoView) { + switch (command.scrollIntoView) { case "center": this.renderer.scrollCursorIntoView(null, 0.5); break; @@ -185,7 +181,7 @@ var Editor = function(renderer, session) { default: break; } - if (scrollIntoView == "animate") + if (command.scrollIntoView == "animate") this.renderer.animateScrolling(this.curOp.scrollTop); } @@ -278,10 +274,6 @@ 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) { @@ -381,8 +373,6 @@ var Editor = function(renderer, session) { oldSession: oldSession }); - this.curOp = null; - oldSession && oldSession._signal("changeEditor", {oldEditor: this}); session && session._signal("changeEditor", {editor: this}); }; @@ -692,15 +682,20 @@ var Editor = function(renderer, session) { * * **/ - this.onDocumentChange = function(delta) { - // Rerender and emit "change" event. - var wrap = this.session.$useWrapMode; - var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity); - this.renderer.updateLines(delta.start.row, lastRow, wrap); + this.onDocumentChange = function(e) { + var delta = e.data; + var range = delta.range; + var lastRow; - this._signal("change", delta); - - // Update cursor because tab characters can influence the cursor position. + if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines") + lastRow = range.end.row; + else + lastRow = Infinity; + this.renderer.updateLines(range.start.row, lastRow, this.session.$useWrapMode); + + this._signal("change", e); + + // update cursor because tab characters can influence the cursor position this.$cursorChange(); this.$updateHighlightActiveLine(); }; @@ -915,16 +910,14 @@ var Editor = function(renderer, session) { * * **/ - 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.onPaste = function(text) { + // todo this should change when paste becomes a command + if (this.$readOnly) + return; + + var e = {text: text}; this._signal("paste", e); - var text = e.text; + text = e.text; if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { this.insert(text); } else { @@ -942,6 +935,7 @@ var Editor = function(renderer, session) { this.session.insert(range.start, lines[i]); } } + this.renderer.scrollCursorIntoView(); }; this.execCommand = function(command, args) { @@ -1629,7 +1623,15 @@ var Editor = function(renderer, session) { **/ this.removeLines = function() { var rows = this.$getSelectedRows(); - this.session.removeFullLines(rows.first, rows.last); + var range; + if (rows.first === 0 || rows.last+1 < this.session.getLength()) + range = new Range(rows.first, 0, rows.last+1, 0); + else + range = new Range( + rows.first-1, this.session.getLine(rows.first-1).length, + rows.last, this.session.getLine(rows.last).length + ); + this.session.remove(range); this.clearSelection(); }; @@ -2682,7 +2684,6 @@ config.defineOptions(Editor.prototype, "editor", { useSoftTabs: "session", tabSize: "session", wrap: "session", - indentedSoftWrap: "session", foldStyle: "session", mode: "session" }); diff --git a/lib/ace/ext/chromevox.js b/lib/ace/ext/chromevox.js index 52a180d4..9f7a7996 100644 --- a/lib/ace/ext/chromevox.js +++ b/lib/ace/ext/chromevox.js @@ -578,14 +578,15 @@ var onSelectionChange = function(evt) { * and deleting text. * @param {!Event} evt The event. */ -var onChange = function(delta) { +var onChange = function(evt) { + var data = evt.data; switch (data.action) { - case 'remove': + case 'removeText': cvox.Api.speak(data.text, 0, DELETED_PROP); /* Let the future cursor change event know it's from text change. */ changed = true; break; - case 'insert': + case 'insertText': cvox.Api.speak(data.text, 0); /* Let the future cursor change event know it's from text change. */ changed = true; diff --git a/lib/ace/ext/elastic_tabstops_lite.js b/lib/ace/ext/elastic_tabstops_lite.js index 0f89423a..9901c5df 100644 --- a/lib/ace/ext/elastic_tabstops_lite.js +++ b/lib/ace/ext/elastic_tabstops_lite.js @@ -44,12 +44,13 @@ var ElasticTabstopsLite = function(editor) { this.onExec = function() { recordChanges = true; }; - this.onChange = function(delta) { + this.onChange = function(e) { + var range = e.data.range if (recordChanges) { - if (changedRows.indexOf(delta.start.row) == -1) - changedRows.push(delta.start.row); - if (delta.end.row != delta.start.row) - changedRows.push(delta.end.row); + if (changedRows.indexOf(range.start.row) == -1) + changedRows.push(range.start.row); + if (range.end.row != range.start.row) + changedRows.push(range.end.row); } }; }; diff --git a/lib/ace/ext/emmet.js b/lib/ace/ext/emmet.js index 4faacef2..ceb155ef 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|handlebars/.test(modeId); + return modeId && /css|less|scss|sass|stylus|html|php|twig|ejs/.test(modeId); }; var onChangeMode = function(e, target) { diff --git a/lib/ace/ext/language_tools.js b/lib/ace/ext/language_tools.js index 563fe58a..f02390ee 100644 --- a/lib/ace/ext/language_tools.js +++ b/lib/ace/ext/language_tools.js @@ -155,6 +155,7 @@ 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 675a4b85..0351567b 100644 --- a/lib/ace/ext/modelist.js +++ b/lib/ace/ext/modelist.js @@ -117,13 +117,12 @@ 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|shtml|php3|php4|php5|phps|phpt|aw|ctp"], + PHP: ["php|phtml"], Powershell: ["ps1"], Praat: ["praat|praatscript|psc|proc"], Prolog: ["plg|prolog"], @@ -147,7 +146,6 @@ var supportedModes = { Soy_Template:["soy"], Space: ["space"], SQL: ["sql"], - SQLServer: ["sqlserver"], Stylus: ["styl|stylus"], SVG: ["svg"], Tcl: ["tcl"], diff --git a/lib/ace/ext/static_highlight.js b/lib/ace/ext/static_highlight.js index 2acb3ac5..b2287f15 100644 --- a/lib/ace/ext/static_highlight.js +++ b/lib/ace/ext/static_highlight.js @@ -37,10 +37,6 @@ 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+)/); @@ -153,8 +149,12 @@ highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) { session.setUseWorker(false); session.setMode(mode); - var textLayer = new SimpleTextLayer(); + var textLayer = new TextLayer(document.createElement("div")); 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 0df76b02..8914c776 100644 --- a/lib/ace/ext/themelist.js +++ b/lib/ace/ext/themelist.js @@ -51,14 +51,12 @@ var themeData = [ ["Dreamweaver" ], ["Eclipse" ], ["GitHub" ], - ["IPlastic" ], ["Solarized Light"], ["TextMate" ], ["Tomorrow" ], ["XCode" ], ["Kuroir"], ["KatzenMilch"], - ["SQL Server" ,"sqlserver" , "light"], ["Ambiance" ,"ambiance" , "dark"], ["Chaos" ,"chaos" , "dark"], ["Clouds Midnight" ,"clouds_midnight" , "dark"], @@ -73,7 +71,6 @@ 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 e4c1bdf8..a64e1857 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 8cecad1b..945eddf3 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 a7dc1a93..06badccd 100644 --- a/lib/ace/keyboard/hash_handler.js +++ b/lib/ace/keyboard/hash_handler.js @@ -87,12 +87,9 @@ MultiHashHandler.prototype = HashHandler.prototype; } }; - this.bindKey = function(key, command, position) { - if (typeof key == "object") { - if (position == undefined) - position = key.position; + this.bindKey = function(key, command, asDefault) { + if (typeof key == "object") key = key[this.platform]; - } if (!key) return; if (typeof command == "function") @@ -113,15 +110,11 @@ MultiHashHandler.prototype = HashHandler.prototype; } var binding = this.parseKeys(keyPart); var id = KEY_MODS[binding.hashId] + binding.key; - this._addCommandToBinding(chain + id, command, position); + this._addCommandToBinding(chain + id, command, asDefault); }, this); }; - function getPosition(command) { - return typeof command == "object" && command.bindKey - && command.bindKey.position || 0; - } - this._addCommandToBinding = function(keyId, command, position) { + this._addCommandToBinding = function(keyId, command, asDefault) { var ckb = this.commandKeyBinding, i; if (!command) { delete ckb[keyId]; @@ -133,21 +126,11 @@ MultiHashHandler.prototype = HashHandler.prototype; } else if ((i = ckb[keyId].indexOf(command)) != -1) { ckb[keyId].splice(i, 1); } - - 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); + + if (asDefault || command.isDefault) + ckb[keyId].unshift(command); + else + ckb[keyId].push(command); } }; @@ -236,18 +219,10 @@ MultiHashHandler.prototype = HashHandler.prototype; } } - 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 - } + if (data.$keyChain && keyCode > 0) + data.$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 4a2bb72c..0bd57eed 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, e); + host.onPaste(data); if (useragent.isIE) setTimeout(resetSelection); event.preventDefault(e); diff --git a/lib/ace/keyboard/vim.js b/lib/ace/keyboard/vim.js index 17c26c16..2eae6b28 100644 --- a/lib/ace/keyboard/vim.js +++ b/lib/ace/keyboard/vim.js @@ -178,6 +178,13 @@ define(function(require, exports, module) { return this.ace.inVirtualSelectionMode && this.ace.selection.index; }; this.onChange = function(delta) { + var oldDelta = delta.data; + delta = { + start: oldDelta.range.start, + end: oldDelta.range.end, + action: oldDelta.action, + lines: oldDelta.lines || [oldDelta.text] + };// v1.2 api compatibility if (delta.action[0] == 'i') { var change = { text: delta.lines }; var curOp = this.curOp = this.curOp || {}; @@ -257,7 +264,6 @@ 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) { @@ -571,6 +577,7 @@ define(function(require, exports, module) { highlight.session = null; }; highlight.updateOnChange = function(delta) { + delta = delta.data.range;// v1.2 api compatibility var row = delta.start.row; if (row == delta.end.row) highlight.cache[row] = undefined; else highlight.cache.splice(row, highlight.cache.length); @@ -647,9 +654,6 @@ define(function(require, exports, module) { this.refresh = function() { return this.ace.resize(true); }; - this.getMode = function() { - return { name : this.getOption("mode") }; - } }).call(CodeMirror.prototype); function toAcePos(cmPos) { return {row: cmPos.line, column: cmPos.ch}; @@ -730,14 +734,10 @@ CodeMirror.defineExtension = function(name, fn) { CodeMirror.prototype[name] = fn; }; dom.importCssString(".normal-mode .ace_cursor{\ - border: 1px solid red;\ + border: 0!important;\ background-color: red;\ opacity: 0.5;\ -}\ -.normal-mode .ace_hidden-cursors .ace_cursor{\ - background-color: transparent;\ -}\ -.ace_dialog {\ +}.ace_dialog {\ position: absolute;\ left: 0; right: 0;\ background: white;\ @@ -763,6 +763,23 @@ 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(); @@ -1168,30 +1185,18 @@ dom.importCssString(".normal-mode .ace_cursor{\ } var options = {}; - function defineOption(name, defaultValue, type, aliases, callback) { - if (defaultValue === undefined && !callback) { - throw Error('defaultValue is required unless callback is provided'); - } + function defineOption(name, defaultValue, type) { + if (defaultValue === undefined) { throw Error('defaultValue is required'); } if (!type) { type = 'string'; } options[name] = { type: type, - defaultValue: defaultValue, - callback: callback + defaultValue: defaultValue }; - if (aliases) { - for (var i = 0; i < aliases.length; i++) { - options[aliases[i]] = options[name]; - } - } - if (defaultValue) { - setOption(name, defaultValue); - } + setOption(name, defaultValue); } - function setOption(name, value, cm, cfg) { + function setOption(name, value, cm) { var option = options[name]; - cfg = cfg || {}; - var scope = cfg.scope; if (!option) { throw Error('Unknown option: ' + name); } @@ -1203,60 +1208,17 @@ dom.importCssString(".normal-mode .ace_cursor{\ value = true; } } - if (option.callback) { - if (scope !== 'local') { - option.callback(value, undefined); - } - if (scope !== 'global' && cm) { - option.callback(value, cm); - } - } else { - if (scope !== 'local') { - option.value = option.type == 'boolean' ? !!value : value; - } - if (scope !== 'global' && cm) { - cm.state.vim.options[name] = {value: value}; - } - } + option.value = option.type == 'boolean' ? !!value : value; } - function getOption(name, cm, cfg) { + function getOption(name) { var option = options[name]; - cfg = cfg || {}; - var scope = cfg.scope; if (!option) { throw Error('Unknown option: ' + name); } - if (option.callback) { - var local = cm && option.callback(undefined, cm); - if (scope !== 'global' && local !== undefined) { - return local; - } - if (scope !== 'local') { - return option.callback(); - } - return; - } else { - var local = (scope !== 'global') && (cm && cm.state.vim.options[name]); - return (local || (scope !== 'local') && option || {}).value; - } + return option.value; } - defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) { - // Option is local. Do nothing for global. - if (cm === undefined) { - return; - } - // The 'filetype' option proxies to the CodeMirror 'mode' option. - if (name === undefined) { - var mode = cm.getMode().name; - return mode == 'null' ? '' : mode; - } else { - var mode = name == '' ? 'null' : name; - cm.setOption('mode', mode); - } - }); - var createCircularJumpList = function() { var size = 100; var pointer = -1; @@ -1409,9 +1371,8 @@ dom.importCssString(".normal-mode .ace_cursor{\ visualBlock: false, lastSelection: null, lastPastedText: null, - sel: {}, - // Buffer-local/window-local values of vim options. - options: {} + sel: { + } }; } return cm.state.vim; @@ -1473,8 +1434,6 @@ dom.importCssString(".normal-mode .ace_cursor{\ // remove user defined key bindings. exCommandDispatcher.unmap(lhs, ctx); }, - // TODO: Expose setOption and getOption as instance methods. Need to decide how to namespace - // them, or somehow make them work with the existing CodeMirror setOption/getOption API. setOption: setOption, getOption: getOption, defineOption: defineOption, @@ -2026,8 +1985,7 @@ dom.importCssString(".normal-mode .ace_cursor{\ } function onPromptKeyDown(e, query, close) { var keyName = CodeMirror.keyName(e); - if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || - (keyName == 'Backspace' && query == '')) { + if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') { vimGlobalState.searchHistoryController.pushInput(query); vimGlobalState.searchHistoryController.reset(); updateSearchQuery(cm, originalQuery); @@ -2037,10 +1995,6 @@ dom.importCssString(".normal-mode .ace_cursor{\ clearInputState(cm); close(); cm.focus(); - } else if (keyName == 'Ctrl-U') { - // Ctrl-U clears input. - CodeMirror.e_stop(e); - close(''); } } switch (command.searchArgs.querySrc) { @@ -2101,8 +2055,7 @@ dom.importCssString(".normal-mode .ace_cursor{\ } function onPromptKeyDown(e, input, close) { var keyName = CodeMirror.keyName(e), up; - if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || - (keyName == 'Backspace' && input == '')) { + if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') { vimGlobalState.exCommandHistoryController.pushInput(input); vimGlobalState.exCommandHistoryController.reset(); CodeMirror.e_stop(e); @@ -2114,10 +2067,6 @@ dom.importCssString(".normal-mode .ace_cursor{\ up = keyName == 'Up' ? true : false; input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; close(input); - } else if (keyName == 'Ctrl-U') { - // Ctrl-U clears input. - CodeMirror.e_stop(e); - close(''); } else { if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') vimGlobalState.exCommandHistoryController.reset(); @@ -2147,8 +2096,8 @@ dom.importCssString(".normal-mode .ace_cursor{\ var registerName = inputState.registerName; var sel = vim.sel; // TODO: Make sure cm and vim selections are identical outside visual mode. - var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head): cm.getCursor('head')); - var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor')); + var origHead = copyCursor(vim.visualMode ? sel.head: cm.getCursor('head')); + var origAnchor = copyCursor(vim.visualMode ? sel.anchor : cm.getCursor('anchor')); var oldHead = copyCursor(origHead); var oldAnchor = copyCursor(origAnchor); var newHead, newAnchor; @@ -2184,8 +2133,6 @@ 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; @@ -2725,11 +2672,10 @@ dom.importCssString(".normal-mode .ace_cursor{\ var anchor = ranges[0].anchor, head = ranges[0].head; text = cm.getRange(anchor, head); - var lastState = vim.lastEditInputState || {}; - if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) { + if (!isWhiteSpaceString(text)) { // Exclude trailing whitespace if the range is not all whitespace. var match = (/\s+$/).exec(text); - if (match && lastState.motionArgs && lastState.motionArgs.forward) { + if (match) { head = offsetCursor(head, 0, - match[0].length); text = text.slice(0, - match[0].length); } @@ -2872,7 +2818,6 @@ 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) { @@ -4362,8 +4307,7 @@ dom.importCssString(".normal-mode .ace_cursor{\ function dialog(cm, template, shortText, onClose, options) { if (cm.openDialog) { cm.openDialog(template, onClose, { bottom: true, value: options.value, - onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, - selectValueOnOpen: false}); + onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, select: options.select }); } else { onClose(prompt(shortText, '')); @@ -4718,7 +4662,6 @@ dom.importCssString(".normal-mode .ace_cursor{\ // pair of commands that have a shared prefix, at least one of their // shortNames must not match the prefix of the other command. var defaultExCommandMap = [ - { name: 'colorscheme', shortName: 'colo' }, { name: 'map' }, { name: 'imap', shortName: 'im' }, { name: 'nmap', shortName: 'nm' }, @@ -4727,10 +4670,7 @@ dom.importCssString(".normal-mode .ace_cursor{\ { name: 'write', shortName: 'w' }, { name: 'undo', shortName: 'u' }, { name: 'redo', shortName: 'red' }, - { name: 'set', shortName: 'se' }, - { name: 'set', shortName: 'se' }, - { name: 'setlocal', shortName: 'setl' }, - { name: 'setglobal', shortName: 'setg' }, + { name: 'set', shortName: 'set' }, { name: 'sort', shortName: 'sor' }, { name: 'substitute', shortName: 's', possiblyAsync: true }, { name: 'nohlsearch', shortName: 'noh' }, @@ -4743,13 +4683,6 @@ dom.importCssString(".normal-mode .ace_cursor{\ }; ExCommandDispatcher.prototype = { processCommand: function(cm, input, opt_params) { - var that = this; - cm.operation(function () { - cm.curOp.isVimOp = true; - that._processCommand(cm, input, opt_params); - }); - }, - _processCommand: function(cm, input, opt_params) { var vim = cm.state.vim; var commandHistoryRegister = vimGlobalState.registerController.getRegister(':'); var previousCommand = commandHistoryRegister.toString(); @@ -4962,13 +4895,6 @@ dom.importCssString(".normal-mode .ace_cursor{\ }; var exCommands = { - colorscheme: function(cm, params) { - if (!params.args || params.args.length < 1) { - showConfirm(cm, cm.getOption('theme')); - return; - } - cm.setOption('theme', params.args[0]); - }, map: function(cm, params, ctx) { var mapArgs = params.args; if (!mapArgs || mapArgs.length < 2) { @@ -5002,9 +4928,6 @@ dom.importCssString(".normal-mode .ace_cursor{\ }, set: function(cm, params) { var setArgs = params.args; - // Options passed through to the setOption/getOption calls. May be passed in by the - // local/global versions of the set command - var setCfg = params.setCfg || {}; if (!setArgs || setArgs.length < 1) { if (cm) { showConfirm(cm, 'Invalid mapping: ' + params.input); @@ -5028,35 +4951,24 @@ dom.importCssString(".normal-mode .ace_cursor{\ optionName = optionName.substring(2); value = false; } - var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean'; if (optionIsBoolean && value == undefined) { // Calling set with a boolean option sets it to true. value = true; } - // If no value is provided, then we assume this is a get. - if (!optionIsBoolean && value === undefined || forceGet) { - var oldValue = getOption(optionName, cm, setCfg); + if (!optionIsBoolean && !value || forceGet) { + var oldValue = getOption(optionName); + // If no value is provided, then we assume this is a get. if (oldValue === true || oldValue === false) { showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); } else { showConfirm(cm, ' ' + optionName + '=' + oldValue); } } else { - setOption(optionName, value, cm, setCfg); + setOption(optionName, value, cm); } }, - setlocal: function (cm, params) { - // setCfg is passed through to setOption - params.setCfg = {scope: 'local'}; - this.set(cm, params); - }, - setglobal: function (cm, params) { - // setCfg is passed through to setOption - params.setCfg = {scope: 'global'}; - this.set(cm, params); - }, - registers: function(cm, params) { + registers: function(cm,params) { var regArgs = params.args; var registers = vimGlobalState.registerController.registers; var regInfo = '----------Registers----------

'; @@ -5678,7 +5590,7 @@ dom.importCssString(".normal-mode .ace_cursor{\ } function updateFakeCursor(cm) { var vim = cm.state.vim; - var from = clipCursorToContent(cm, copyCursor(vim.sel.head)); + var from = copyCursor(vim.sel.head); var to = offsetCursor(from, 0, 1); if (vim.fakeCursor) { vim.fakeCursor.clear(); @@ -5689,7 +5601,7 @@ dom.importCssString(".normal-mode .ace_cursor{\ var anchor = cm.getCursor('anchor'); var head = cm.getCursor('head'); // Enter or exit visual mode to match mouse selection. - if (vim.visualMode && !cm.somethingSelected()) { + if (vim.visualMode && cursorEqual(head, anchor) && lineLength(cm, head.line) > head.ch) { exitVisualMode(cm, false); } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { vim.visualMode = true; @@ -5923,7 +5835,7 @@ dom.importCssString(".normal-mode .ace_cursor{\ }, true); } return isHandled; - } + }; exports.CodeMirror = CodeMirror; var getVim = Vim.maybeInitVimState_; exports.handler = { @@ -5937,9 +5849,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; @@ -6103,13 +6015,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; @@ -6154,7 +6066,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); @@ -6173,5 +6085,5 @@ dom.importCssString(".normal-mode .ace_cursor{\ exports.handler.actions = actions; exports.Vim = Vim; - Vim.map("Y", "yy", "normal"); + Vim.map("Y", "yy"); }); diff --git a/lib/ace/keyboard/vim_test.js b/lib/ace/keyboard/vim_test.js index 127f0706..788cfccb 100644 --- a/lib/ace/keyboard/vim_test.js +++ b/lib/ace/keyboard/vim_test.js @@ -34,7 +34,6 @@ editor.session.setMode(new JavaScriptMode()); function CodeMirror(place, opts) { if (opts.value != null) editor.session.setValue(opts.value); - editor.setOption("indentedSoftWrap", false); editor.setOption("wrap", opts.lineWrapping); editor.setOption("useSoftTabs", !opts.indentWithTabs); editor.setKeyboardHandler(null); @@ -59,7 +58,6 @@ function CodeMirror(place, opts) { cm.setSize(500, 300); return cm; } -CodeMirror.defineMode = function() {} for (var key in vim.CodeMirror) CodeMirror[key] = vim.CodeMirror[key]; var editor; @@ -597,7 +595,7 @@ testVim('{', function(cm, vim, helpers) { helpers.doKeys('6', '{'); helpers.assertCursorAt(0, 0); }, { value: 'a\n\nb\nc\n\nd' }); -testVim('paragraph_motions', function(cm, vim, helpers) { +testVim('paragraph motions', function(cm, vim, helpers) { cm.setCursor(10, 0); helpers.doKeys('{'); helpers.assertCursorAt(4, 0); @@ -1077,17 +1075,6 @@ testVim('cc_multiply_repeat', function(cm, vim, helpers) { is(register.linewise); eq('vim-insert', cm.getOption('keyMap')); }); -testVim('ct', function(cm, vim, helpers) { - cm.setCursor(0, 9); - helpers.doKeys('c', 't', 'w'); - eq(' word1 word3', cm.getValue()); - helpers.doKeys('', 'c', '|'); - eq(' word3', cm.getValue()); - helpers.assertCursorAt(0, 0); - helpers.doKeys('', '2', 'u', 'w', 'h'); - helpers.doKeys('c', '2', 'g', 'e'); - eq(' wordword3', cm.getValue()); -}, { value: ' word1 word2 word3'}); testVim('cc_should_not_append_to_document', function(cm, vim, helpers) { var expectedLineCount = cm.lineCount(); cm.setCursor(cm.lastLine(), 0); @@ -1988,11 +1975,7 @@ testVim('visual_block_move_to_eol', function(cm, vim, helpers) { cm.setCursor(0, 0); helpers.doKeys('', 'G', '$'); var selections = cm.getSelections().join(); - eq('123,45,6', selections); - // Checks that with cursor at Infinity, finding words backwards still works. - helpers.doKeys('2', 'k', 'b'); - selections = cm.getSelections().join(); - eq('1', selections); + eq("123,45,6", selections); }, {value: '123\n45\n6'}); testVim('visual_block_different_line_lengths', function(cm, vim, helpers) { // test the block selection with lines of different length @@ -2820,44 +2803,6 @@ testVim('exCommand_history', function(cm, vim, helpers) { onKeyDown({keyCode: keyCodes.Up}, input, close); eq(input, 'sort'); }, {value: ''}); -testVim('search_clear', function(cm, vim, helpers) { - var onKeyDown; - var input = ''; - var keyCodes = { - Ctrl: 17, - u: 85 - }; - cm.openDialog = function(template, callback, options) { - onKeyDown = options.onKeyDown; - }; - var close = function(newVal) { - if (typeof newVal == 'string') input = newVal; - } - helpers.doKeys('/'); - input = 'foo'; - onKeyDown({keyCode: keyCodes.Ctrl}, input, close); - onKeyDown({keyCode: keyCodes.u, ctrlKey: true}, input, close); - eq(input, ''); -}); -testVim('exCommand_clear', function(cm, vim, helpers) { - var onKeyDown; - var input = ''; - var keyCodes = { - Ctrl: 17, - u: 85 - }; - cm.openDialog = function(template, callback, options) { - onKeyDown = options.onKeyDown; - }; - var close = function(newVal) { - if (typeof newVal == 'string') input = newVal; - } - helpers.doKeys(':'); - input = 'foo'; - onKeyDown({keyCode: keyCodes.Ctrl}, input, close); - onKeyDown({keyCode: keyCodes.u, ctrlKey: true}, input, close); - eq(input, ''); -}); testVim('.', function(cm, vim, helpers) { cm.setCursor(0, 0); helpers.doKeys('2', 'd', 'w'); @@ -3808,111 +3753,17 @@ testVim('set_string', function(cm, vim, helpers) { eq('c', CodeMirror.Vim.getOption('testoption')); }); testVim('ex_set_string', function(cm, vim, helpers) { - CodeMirror.Vim.defineOption('testopt', 'a', 'string'); + CodeMirror.Vim.defineOption('testoption', 'a', 'string'); // Test default value is set. - eq('a', CodeMirror.Vim.getOption('testopt')); + eq('a', CodeMirror.Vim.getOption('testoption')); try { - // Test fail to set 'notestopt' - helpers.doEx('set notestopt=b'); + // Test fail to set 'notestoption' + helpers.doEx('set notestoption=b'); fail(); } catch (expected) {}; // Test setOption - helpers.doEx('set testopt=c') - eq('c', CodeMirror.Vim.getOption('testopt')); - helpers.doEx('set testopt=c') - eq('c', CodeMirror.Vim.getOption('testopt', cm)); //local || global - eq('c', CodeMirror.Vim.getOption('testopt', cm, {scope: 'local'})); // local - eq('c', CodeMirror.Vim.getOption('testopt', cm, {scope: 'global'})); // global - eq('c', CodeMirror.Vim.getOption('testopt')); // global - // Test setOption global - helpers.doEx('setg testopt=d') - eq('c', CodeMirror.Vim.getOption('testopt', cm)); - eq('c', CodeMirror.Vim.getOption('testopt', cm, {scope: 'local'})); - eq('d', CodeMirror.Vim.getOption('testopt', cm, {scope: 'global'})); - eq('d', CodeMirror.Vim.getOption('testopt')); - // Test setOption local - helpers.doEx('setl testopt=e') - eq('e', CodeMirror.Vim.getOption('testopt', cm)); - eq('e', CodeMirror.Vim.getOption('testopt', cm, {scope: 'local'})); - eq('d', CodeMirror.Vim.getOption('testopt', cm, {scope: 'global'})); - eq('d', CodeMirror.Vim.getOption('testopt')); -}); -testVim('ex_set_callback', function(cm, vim, helpers) { - var global; - - function cb(val, cm, cfg) { - if (val === undefined) { - // Getter - if (cm) { - return cm._local; - } else { - return global; - } - } else { - // Setter - if (cm) { - cm._local = val; - } else { - global = val; - } - } - } - - CodeMirror.Vim.defineOption('testopt', 'a', 'string', cb); - // Test default value is set. - eq('a', CodeMirror.Vim.getOption('testopt')); - try { - // Test fail to set 'notestopt' - helpers.doEx('set notestopt=b'); - fail(); - } catch (expected) {}; - // Test setOption (Identical to the string tests, but via callback instead) - helpers.doEx('set testopt=c') - eq('c', CodeMirror.Vim.getOption('testopt', cm)); //local || global - eq('c', CodeMirror.Vim.getOption('testopt', cm, {scope: 'local'})); // local - eq('c', CodeMirror.Vim.getOption('testopt', cm, {scope: 'global'})); // global - eq('c', CodeMirror.Vim.getOption('testopt')); // global - // Test setOption global - helpers.doEx('setg testopt=d') - eq('c', CodeMirror.Vim.getOption('testopt', cm)); - eq('c', CodeMirror.Vim.getOption('testopt', cm, {scope: 'local'})); - eq('d', CodeMirror.Vim.getOption('testopt', cm, {scope: 'global'})); - eq('d', CodeMirror.Vim.getOption('testopt')); - // Test setOption local - helpers.doEx('setl testopt=e') - eq('e', CodeMirror.Vim.getOption('testopt', cm)); - eq('e', CodeMirror.Vim.getOption('testopt', cm, {scope: 'local'})); - eq('d', CodeMirror.Vim.getOption('testopt', cm, {scope: 'global'})); - eq('d', CodeMirror.Vim.getOption('testopt')); -}) -testVim('ex_set_filetype', function(cm, vim, helpers) { - CodeMirror.defineMode('test_mode', function() { - return {token: function(stream) { - stream.match(/^\s+|^\S+/); - }}; - }); - CodeMirror.defineMode('test_mode_2', function() { - return {token: function(stream) { - stream.match(/^\s+|^\S+/); - }}; - }); - // Test mode is set. - helpers.doEx('set filetype=test_mode'); - eq('test_mode', cm.getMode().name); - // Test 'ft' alias also sets mode. - helpers.doEx('set ft=test_mode_2'); - eq('test_mode_2', cm.getMode().name); -}); -testVim('ex_set_filetype_null', function(cm, vim, helpers) { - CodeMirror.defineMode('test_mode', function() { - return {token: function(stream) { - stream.match(/^\s+|^\S+/); - }}; - }); - cm.setOption('mode', 'test_mode'); - // Test mode is set to null. - helpers.doEx('set filetype='); - eq('null', cm.getMode().name); + helpers.doEx('set testoption=c') + eq('c', CodeMirror.Vim.getOption('testoption')); }); // TODO: Reset key maps after each test. testVim('ex_map_key2key', function(cm, vim, helpers) { diff --git a/lib/ace/layer/font_metrics.js b/lib/ace/layer/font_metrics.js index 715c6cf3..7e71f8a8 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) { - clearInterval(this.$pollSizeChangesTimer); - this.$pollSizeChangesTimer = 0; + } else { + if (this.$pollSizeChangesTimer) + this.$pollSizeChangesTimer; } }; diff --git a/lib/ace/layer/gutter.js b/lib/ace/layer/gutter.js index dc1055c2..13ee8a25 100644 --- a/lib/ace/layer/gutter.js +++ b/lib/ace/layer/gutter.js @@ -100,14 +100,16 @@ var Gutter = function(parentEl) { } }; - this.$updateAnnotations = function (delta) { + this.$updateAnnotations = function (e) { if (!this.$annotations.length) return; - var firstRow = delta.start.row; - var len = delta.end.row - firstRow; + var delta = e.data; + var range = delta.range; + var firstRow = range.start.row; + var len = range.end.row - firstRow; if (len === 0) { // do nothing - } else if (delta.action == 'remove') { + } else if (delta.action == "removeText" || delta.action == "removeLines") { this.$annotations.splice(firstRow, len + 1, null); } else { var args = new Array(len + 1); diff --git a/lib/ace/layer/marker.js b/lib/ace/layer/marker.js index 9818d225..37e038b5 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" + " ace_br15", config); + this.drawSingleLineMarker(html, range, marker.clazz + " ace_start", config); } } this.element.innerHTML = html.join(""); @@ -100,30 +100,27 @@ 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) { - var session = this.session; - 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); + // selection start + var row = range.start.row; + + var lineRange = new Range( + row, range.start.column, + row, this.session.getScreenLastRowColumn(row) + ); + this.drawSingleLineMarker(stringBuilder, lineRange, clazz + " ace_start", layerConfig, 1, extraStyle); + + // selection end + row = range.end.row; + lineRange = new Range(row, 0, 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.end.row = row; + lineRange.end.column = this.session.getScreenLastRowColumn(row); + this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, extraStyle); } }; @@ -137,7 +134,7 @@ var Marker = function(parentEl) { extraStyle = extraStyle || ""; stringBuilder.push( - "
" - + lang.stringRepeat(this.TAB_CHAR, i) + + this.TAB_CHAR + + lang.stringRepeat(" ", i - 1) + ""); } else { tabStr.push(lang.stringRepeat(" ", i)); @@ -144,7 +145,7 @@ var Text = function(parentEl) { spaceClass = " ace_invisible_space"; tabClass = " ace_invisible_tab"; var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize); - var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize); + var tabContent = this.TAB_CHAR + lang.stringRepeat(" ", this.tabSize - 1); } else{ var spaceContent = lang.stringRepeat(" ", this.tabSize); var tabContent = spaceContent; @@ -419,8 +420,6 @@ var Text = function(parentEl) { ); } - stringBuilder.push(lang.stringRepeat("\xa0", splits.indent)); - split ++; screenColumn = 0; splitChars = splits[split] || Number.MAX_VALUE; diff --git a/lib/ace/layer/text_test.js b/lib/ace/layer/text_test.js index 3946ec66..e3403ca4 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 Array(i+1).join(textLayer.TAB_CHAR)} + var TAB = function(i) {return textLayer.TAB_CHAR + SPACE(i-1)} 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 2cbfe23e..ef2f7caa 100644 --- a/lib/ace/lib/dom.js +++ b/lib/ace/lib/dom.js @@ -91,11 +91,6 @@ 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 @@ -178,6 +173,9 @@ 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 57924056..06932d3c 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,14 +326,13 @@ exports.addCommandKeyListener = function(el, callback) { }); if (!pressedKeys) { - resetPressedKeys(); - addListener(window, "focus", resetPressedKeys); + pressedKeys = Object.create(null); + addListener(window, "focus", function(e) { + pressedKeys = Object.create(null); + }); } } }; -function resetPressedKeys(e) { - pressedKeys = Object.create(null); -} if (window.postMessage && !useragent.isOldIE) { var postMessageId = 1; diff --git a/lib/ace/lib/lang.js b/lib/ace/lib/lang.js index 921dee1d..863bbb55 100644 --- a/lib/ace/lib/lang.js +++ b/lib/ace/lib/lang.js @@ -81,24 +81,20 @@ exports.copyArray = function(array){ return copy; }; -exports.deepCopy = function deepCopy(obj) { +exports.deepCopy = function (obj) { if (typeof obj !== "object" || !obj) return obj; - var copy; - if (Array.isArray(obj)) { - copy = []; - for (var key = 0; key < obj.length; key++) { - copy[key] = deepCopy(obj[key]); - } - return copy; - } var cons = obj.constructor; if (cons === RegExp) return obj; - copy = cons(); + var copy = cons(); for (var key in obj) { - copy[key] = deepCopy(obj[key]); + if (typeof obj[key] === "object") { + copy[key] = exports.deepCopy(obj[key]); + } else { + copy[key] = obj[key]; + } } return copy; }; diff --git a/lib/ace/line_widgets.js b/lib/ace/line_widgets.js index ba87d857..d4080b53 100644 --- a/lib/ace/line_widgets.js +++ b/lib/ace/line_widgets.js @@ -113,16 +113,18 @@ function LineWidgets(session) { }); }; - this.updateOnChange = function(delta) { + this.updateOnChange = function(e) { var lineWidgets = this.session.lineWidgets; if (!lineWidgets) return; - - var startRow = delta.start.row; - var len = delta.end.row - startRow; + + var delta = e.data; + var range = delta.range; + var startRow = range.start.row; + var len = range.end.row - startRow; if (len === 0) { // return - } else if (delta.action == 'remove') { + } else if (delta.action == "removeText" || delta.action == "removeLines") { var removed = lineWidgets.splice(startRow + 1, len); removed.forEach(function(w) { w && this.removeLineWidget(w); diff --git a/lib/ace/mode/_test/tokens_gherkin.json b/lib/ace/mode/_test/tokens_gherkin.json index 173d9798..d16ffc6c 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 8c59a3aa..6592575b 100644 --- a/lib/ace/mode/_test/tokens_rust.json +++ b/lib/ace/mode/_test/tokens_rust.json @@ -10,9 +10,10 @@ ],[ "start", ["keyword.source.rust","fn"], - ["text"," "], + ["meta.function.source.rust"," "], ["entity.name.function.source.rust","main"], - ["text","() {"] + ["meta.function.source.rust","("], + ["text",") {"] ],[ "start", ["text"," "], @@ -87,14 +88,10 @@ ],[ "start", ["keyword.source.rust","fn"], - ["text"," "], - ["entity.name.function.source.rust","map"], - ["keyword.operator","<"], - ["text","T"], - ["keyword.operator",","], - ["text"," U"], - ["keyword.operator",">"], - ["text","(vector: &[T]"], + ["meta.function.source.rust"," "], + ["entity.name.function.source.rust","map"], + ["meta.function.source.rust","("], + ["text","vector: &[T]"], ["keyword.operator",","], ["text"," function: &fn(v: &T) "], ["keyword.operator","->"], diff --git a/lib/ace/mode/_test/tokens_vbscript.json b/lib/ace/mode/_test/tokens_vbscript.json index 05d5dd22..a49f976d 100644 --- a/lib/ace/mode/_test/tokens_vbscript.json +++ b/lib/ace/mode/_test/tokens_vbscript.json @@ -199,5 +199,7 @@ ["string.quoted.double.asp"," ... updated.\""] ],[ "start", - ["storage.type.asp","End Sub"] + ["support.function.asp","End"], + ["text"," "], + ["storage.type.asp","Sub"] ]] \ No newline at end of file diff --git a/lib/ace/mode/behaviour/behaviour_test.js b/lib/ace/mode/behaviour/behaviour_test.js index 245edf99..9dc27bf8 100644 --- a/lib/ace/mode/behaviour/behaviour_test.js +++ b/lib/ace/mode/behaviour/behaviour_test.js @@ -144,16 +144,6 @@ 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 dd1b0d14..a1dce91e 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|escape/.test(token.type); - var stringAfter = !rightToken || /string|escape/.test(rightToken.type); + var stringBefore = token && /string/.test(token.type); + var stringAfter = !rightToken || /string/.test(rightToken.type); var pair; if (rightChar == quote) { diff --git a/lib/ace/mode/folding/cstyle.js b/lib/ace/mode/folding/cstyle.js index 6a6abca7..a98807ab 100644 --- a/lib/ace/mode/folding/cstyle.js +++ b/lib/ace/mode/folding/cstyle.js @@ -53,7 +53,7 @@ oop.inherits(FoldMode, BaseFoldMode); this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; - this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this.startRegionRe = /^\s*(\/\*|\/\/)#region\b/; //prevent naming conflict with any modes that inherit from cstyle and override this (like csharp) this._getFoldWidgetBase = this.getFoldWidget; @@ -69,8 +69,6 @@ oop.inherits(FoldMode, BaseFoldMode); * * @example tripleStarFoldingSection * /*** this folds even though 1 line because it has 3 stars ***[/] - * - * @note the pound symbol for region tags is optional */ this.getFoldWidget = function(session, foldStyle, row) { var line = session.getLine(row); @@ -160,16 +158,12 @@ oop.inherits(FoldMode, BaseFoldMode); return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); }; - /** - * gets comment region block with end region assumed to be start of comment in any cstyle mode or SQL mode (--) which inherits from this. - * There may optionally be a pound symbol before the region/endregion statement - */ this.getCommentRegionBlock = function(session, line, row) { var startColumn = line.search(/\s*$/); var maxRow = session.getLength(); var startRow = row; - var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var re = /^\s*(?:\/\*|\/\/)#(end)?region\b/; var depth = 1; while (++row < maxRow) { line = session.getLine(row); diff --git a/lib/ace/mode/folding/sqlserver.js b/lib/ace/mode/folding/sqlserver.js deleted file mode 100644 index b3fd4e93..00000000 --- a/lib/ace/mode/folding/sqlserver.js +++ /dev/null @@ -1,111 +0,0 @@ -/* ***** 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 Range = require("../../range").Range; -var BaseFoldMode = require("./cstyle").FoldMode; - -var FoldMode = exports.FoldMode = function() {}; - -oop.inherits(FoldMode, BaseFoldMode); - -(function() { - /** - * Inheriting cstyle folding because it handles the region comment folding - * and special block comment folding appropriately. - * - * Cstyle's getCommentRegionBlock() contains the sql comment characters '--' for end region block. - */ - - this.foldingStartMarker = /(\bCASE\b|\bBEGIN\b)|^\s*(\/\*)/i; - // this.foldingStopMarker = /(\bEND\b)|^[\s\*]*(\*\/)/i; - this.startRegionRe = /^\s*(\/\*|--)#?region\b/; - - this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { - var line = session.getLine(row); - - if (this.startRegionRe.test(line)) return this.getCommentRegionBlock(session, line, row); - - var match = line.match(this.foldingStartMarker); - if (match) { - var i = match.index; - if (match[1]) return this.getBeginEndBlock(session, row, i, match[1]); - - var range = session.getCommentFoldRange(row, i + match[0].length, 1); - if (range && !range.isMultiLine()) { - if (forceMultiline) { - range = this.getSectionRange(session, row); - } - else if (foldStyle != "all") range = null; - } - - return range; - } - - if (foldStyle === "markbegin") return; - //TODO: add support for end folding markers - return; - }; - - /** - * @returns {range} folding block for sequence that starts with 'CASE' or 'BEGIN' and ends with 'END' - * @param {string} matchSequence - the sequence of charaters that started the fold widget, which should remain visible when the fold widget is folded - */ - this.getBeginEndBlock = function(session, row, column, matchSequence) { - var start = { - row: row, - column: column + matchSequence.length - }; - var maxRow = session.getLength(); - var line; - - var depth = 1; - var re = /(\bCASE\b|\bBEGIN\b)|(\bEND\b)/i; - while (++row < maxRow) { - line = session.getLine(row); - var m = re.exec(line); - if (!m) continue; - if (m[1]) depth++; - else depth--; - - if (!depth) break; - } - var endRow = row; - if (endRow > start.row) { - return new Range(start.row, start.column, endRow, line.length); - } - }; - -}).call(FoldMode.prototype); - -}); diff --git a/lib/ace/mode/gherkin_highlight_rules.js b/lib/ace/mode/gherkin_highlight_rules.js index 04ce877c..d54db204 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,19 +96,15 @@ var GherkinHighlightRules = function() { defaultToken: "string" }], "table-item" : [{ - token : "comment", - regex : /$/, - next : "start" - }, { - token : "comment", - regex : /\|/ - }, { token : "string", - regex : /\\./ - }, { - defaultToken : "string" - }] + regex : "[A-Za-z0-9 ]*", + next : "start" + }], }; + + + //new TextHighlightRules().getRules(); + } oop.inherits(GherkinHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/handlebars.js b/lib/ace/mode/handlebars.js index 164ad43f..3f2e7179 100644 --- a/lib/ace/mode/handlebars.js +++ b/lib/ace/mode/handlebars.js @@ -13,6 +13,7 @@ var Mode = function() { HtmlMode.call(this); this.HighlightRules = HandlebarsHighlightRules; this.$behaviour = new HtmlBehaviour(); + this.foldingRules = new HtmlFoldMode(); }; @@ -20,7 +21,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 4effa2aa..9c9cc36f 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 : "(>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" - }, { - 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 056e7a55..181cf11a 100644 --- a/lib/ace/mode/rust_highlight_rules.js +++ b/lib/ace/mode/rust_highlight_rules.js @@ -84,8 +84,9 @@ var RustHighlightRules = function() { { token: 'constant.character.escape.source.rust', regex: stringEscape }, { defaultToken: 'string.quoted.double.source.rust' } ] }, - { token: [ 'keyword.source.rust', 'text', 'entity.name.function.source.rust' ], - regex: '\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)' }, + { 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: '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 2360b3da..aa462a10 100644 --- a/lib/ace/mode/scheme.js +++ b/lib/ace/mode/scheme.js @@ -39,92 +39,15 @@ 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/sql_highlight_rules.js b/lib/ace/mode/sql_highlight_rules.js index 31e77c82..f9ff39d9 100644 --- a/lib/ace/mode/sql_highlight_rules.js +++ b/lib/ace/mode/sql_highlight_rules.js @@ -38,28 +38,21 @@ var SqlHighlightRules = function() { var keywords = ( "select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|" + - "when|else|end|type|left|right|join|on|outer|desc|asc|union|create|table|primary|key|if|" + - "foreign|not|references|default|null|inner|cross|natural|database|drop|grant" + "when|else|end|type|left|right|join|on|outer|desc|asc|union" ); var builtinConstants = ( - "true|false" + "true|false|null" ); var builtinFunctions = ( "count|min|max|avg|sum|rank|now|coalesce" ); - var dataTypes = ( - "int|numeric|decimal|date|varchar|char|bigint|float|double|bit|binary|text|set|timestamp|" + - "money|real|number|integer" - ); - var keywordMapper = this.createKeywordMapper({ "support.function": builtinFunctions, "keyword": keywords, - "constant.language": builtinConstants, - "storage.type": dataTypes + "constant.language": builtinConstants }, "identifier", true); this.$rules = { diff --git a/lib/ace/mode/sqlserver.js b/lib/ace/mode/sqlserver.js deleted file mode 100644 index 5f24730c..00000000 --- a/lib/ace/mode/sqlserver.js +++ /dev/null @@ -1,62 +0,0 @@ -/* ***** 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 SqlServerHighlightRules = require("./sqlserver_highlight_rules").SqlHighlightRules; -var Range = require("../range").Range; -var SqlServerFoldMode = require("./folding/sqlserver").FoldMode; - -var Mode = function() { - this.HighlightRules = SqlServerHighlightRules; - this.foldingRules = new SqlServerFoldMode(); -}; -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); - -exports.Mode = Mode; - -}); diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js deleted file mode 100644 index c914c0ae..00000000 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ /dev/null @@ -1,232 +0,0 @@ -/* ***** 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 DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; -var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; - -var SqlServerHighlightRules = function() { - /** - * Transact-SQL Syntax Conventions: https://msdn.microsoft.com/en-us/library/ms177563.aspx - * Goal: make this imitate SSMS (SQL Server Managment Studio) - */ - - // https://msdn.microsoft.com/en-us/library/ms189773.aspx - var logicalOperators = "ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|SOME"; - logicalOperators += "|NULL|IS|APPLY|INNER|OUTER|LEFT|RIGHT|JOIN|CROSS"; //SSMS colors these gray too - //note: manually removed LEFT and RIGHT from built in functions below to color it same way SSMS does - - - var builtinFunctions = ( - /* https://msdn.microsoft.com/en-us/library/ms187957.aspx */ - "OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|" + - /* https://msdn.microsoft.com/en-us/library/ms173454.aspx */ - "AVG|CHECKSUM_AGG|COUNT|COUNT_BIG|GROUPING|GROUPING_ID|MAX|MIN|STDEV|STDEVP|SUM|VAR|VARP|" + - /* https://msdn.microsoft.com/en-us/library/ms189798.aspx */ - "DENSE_RANK|NTILE|RANK|ROW_NUMBER" + - /* https://msdn.microsoft.com/en-us/library/ms173823.aspx */ - "@@DATEFIRST|@@DBTS|@@LANGID|@@LANGUAGE|@@LOCK_TIMEOUT|@@MAX_CONNECTIONS|@@MAX_PRECISION|@@NESTLEVEL|@@OPTIONS|@@REMSERVER|@@SERVERNAME|@@SERVICENAME|@@SPID|@@TEXTSIZE|@@VERSION|" + - /* https://msdn.microsoft.com/en-us/library/hh231076.aspx */ - "CAST|CONVERT|PARSE|TRY_CAST|TRY_CONVERT|TRY_PARSE" + - /* https://msdn.microsoft.com/en-us/library/ms186285.aspx */ - "@@CURSOR_ROWS|@@FETCH_STATUS|CURSOR_STATUS|" + - /* https://msdn.microsoft.com/en-us/library/ms186724.aspx */ - "@@DATEFIRST|@@LANGUAGE|CURRENT_TIMESTAMP|DATEADD|DATEDIFF|DATEFROMPARTS|DATENAME|DATEPART|DATETIME2FROMPARTS|DATETIMEFROMPARTS|DATETIMEOFFSETFROMPARTS|DAY|EOMONTH|GETDATE|GETUTCDATE|ISDATE|MONTH|SET DATEFIRST|SET DATEFORMAT|SET LANGUAGE|SMALLDATETIMEFROMPARTS|SP_HELPLANGUAGE|SWITCHOFFSET|SYSDATETIME|SYSDATETIMEOFFSET|SYSUTCDATETIME|TIMEFROMPARTS|TODATETIMEOFFSET|YEAR|" + - /* https://msdn.microsoft.com/en-us/library/hh213226.aspx */ - "CHOOSE|IIF|" + - /* https://msdn.microsoft.com/en-us/library/ms177516.aspx */ - "ABS|ACOS|ASIN|ATAN|ATN2|CEILING|COS|COT|DEGREES|EXP|FLOOR|LOG|LOG10|PI|POWER|RADIANS|RAND|ROUND|SIGN|SIN|SQRT|SQUARE|TAN|" + - /* https://msdn.microsoft.com/en-us/library/ms187812.aspx */ - "@@PROCID|APPLOCK_MODE|APPLOCK_TEST|APP_NAME|ASSEMBLYPROPERTY|COLUMNPROPERTY|COL_LENGTH|COL_NAME|DATABASEPROPERTYEX|DATABASE_PRINCIPAL_ID|DB_ID|DB_NAME|FILEGROUPPROPERTY|FILEGROUP_ID|FILEGROUP_NAME|FILEPROPERTY|FILE_ID|FILE_IDEX|FILE_NAME|FULLTEXTCATALOGPROPERTY|FULLTEXTSERVICEPROPERTY|INDEXKEY_PROPERTY|INDEXPROPERTY|INDEX_COL|OBJECTPROPERTY|OBJECTPROPERTYEX|OBJECT_DEFINITION|OBJECT_ID|OBJECT_NAME|OBJECT_SCHEMA_NAME|ORIGINAL_DB_NAME|PARSENAME|SCHEMA_ID|SCHEMA_NAME|SCOPE_IDENTITY|SERVERPROPERTY|STATS_DATE|TYPEPROPERTY|TYPE_ID|TYPE_NAME|" + - /* https://msdn.microsoft.com/en-us/library/ms186236.aspx */ - "CERTENCODED|CERTPRIVATEKEY|CURRENT_USER|DATABASE_PRINCIPAL_ID|HAS_PERMS_BY_NAME|IS_MEMBER|IS_ROLEMEMBER|IS_SRVROLEMEMBER|ORIGINAL_LOGIN|PERMISSIONS|PWDCOMPARE|PWDENCRYPT|SCHEMA_ID|SCHEMA_NAME|SESSION_USER|SUSER_ID|SUSER_NAME|SUSER_SID|SUSER_SNAME|SYS.FN_BUILTIN_PERMISSIONS|SYS.FN_GET_AUDIT_FILE|SYS.FN_MY_PERMISSIONS|SYSTEM_USER|USER_ID|USER_NAME|" + - /* https://msdn.microsoft.com/en-us/library/ms181984.aspx */ - "ASCII|CHAR|CHARINDEX|CONCAT|DIFFERENCE|FORMAT|LEN|LOWER|LTRIM|NCHAR|PATINDEX|QUOTENAME|REPLACE|REPLICATE|REVERSE|RTRIM|SOUNDEX|SPACE|STR|STUFF|SUBSTRING|UNICODE|UPPER|" + - /* https://msdn.microsoft.com/en-us/library/ms187786.aspx */ - "$PARTITION|@@ERROR|@@IDENTITY|@@PACK_RECEIVED|@@ROWCOUNT|@@TRANCOUNT|BINARY_CHECKSUM|CHECKSUM|CONNECTIONPROPERTY|CONTEXT_INFO|CURRENT_REQUEST_ID|ERROR_LINE|ERROR_MESSAGE|ERROR_NUMBER|ERROR_PROCEDURE|ERROR_SEVERITY|ERROR_STATE|FORMATMESSAGE|GETANSINULL|GET_FILESTREAM_TRANSACTION_CONTEXT|HOST_ID|HOST_NAME|ISNULL|ISNUMERIC|MIN_ACTIVE_ROWVERSION|NEWID|NEWSEQUENTIALID|ROWCOUNT_BIG|XACT_STATE|" + - /* 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|" + - /* 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"; - // https://msdn.microsoft.com/en-us/library/ms173815.aspx - keywords += "|LOOP|HASH|MERGE|REMOTE"; - // https://msdn.microsoft.com/en-us/library/ms175976.aspx - keywords += "|TRY|CATCH|THROW"; - // highlighted words in SSMS that I'm not even sure where they come from - keywords += "|TYPE"; - - - //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, - "support.function": builtinFunctions, - "support.storedprocedure": builtInStoredProcedures, - "keyword": keywords, - }, "identifier", true); - - - //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]); - } - - - this.$rules = { - start: [{ - token: "string.start", - regex: "'", - next: [{ - token: "constant.language.escape", - regex: /''/ - }, { - token: "string.end", - next: "start", - regex: "'" - }, { - defaultToken: "string" - }] - }, - DocCommentHighlightRules.getStartRule("doc-start"), { - token: "comment", - regex: "--.*$" - }, { - token: "comment", - start: "/\\*", - end: "\\*/" - }, { - 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 built in functions - }, { - token: "constant.class", - regex: "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" - }, { - //https://msdn.microsoft.com/en-us/library/ms174986.aspx - token: "keyword.operator", - regex: "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=|\\*" - }, { - token: "paren.lparen", - regex: "[\\(]" - }, { - token: "paren.rparen", - regex: "[\\)]" - }, { - token: "punctuation", - regex: ",|;" - }, { - token: "text", - regex: "\\s+" - }], - comment: [ - DocCommentHighlightRules.getTagRule(), { - token: "comment", - regex: "\\*\\/", - next: "no_regex" - }, { - defaultToken: "comment", - 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 - for (var i = 0; i < setStatements.length; i++) { - this.$rules.start.unshift({ - token: "set.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); - -exports.SqlHighlightRules = SqlServerHighlightRules; -}); diff --git a/lib/ace/mode/toml_highlight_rules.js b/lib/ace/mode/toml_highlight_rules.js index 1a7871ab..686ffae2 100644 --- a/lib/ace/mode/toml_highlight_rules.js +++ b/lib/ace/mode/toml_highlight_rules.js @@ -57,10 +57,6 @@ var TomlHighlightRules = function() { regex : '"(?=.)', next : "qqstring" }, - { - token: ["variable.keygroup.toml"], - regex: "(?:^\\s*)(\\[\\[([^\\]]+)\\]\\])" - }, { token: ["variable.keygroup.toml"], regex: "(?:^\\s*)(\\[([^\\]]+)\\])" @@ -104,4 +100,4 @@ var TomlHighlightRules = function() { oop.inherits(TomlHighlightRules, TextHighlightRules); exports.TomlHighlightRules = TomlHighlightRules; -}); +}); \ No newline at end of file diff --git a/lib/ace/mode/vbscript_highlight_rules.js b/lib/ace/mode/vbscript_highlight_rules.js index ef829922..c706002d 100644 --- a/lib/ace/mode/vbscript_highlight_rules.js +++ b/lib/ace/mode/vbscript_highlight_rules.js @@ -3,7 +3,7 @@ * * Copyright (c) 2012, 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 @@ -14,7 +14,7 @@ * * 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 @@ -85,35 +85,29 @@ var VBScriptHighlightRules = function() { { token: "punctuation.definition.comment.asp", regex: "'|REM", - next: "comment", - caseInsensitive: true + next: "comment" }, { token: [ "keyword.control.asp" ], - regex: "\\b(?:If|Then|Else|ElseIf|Else If|End If|While|Wend|For|To|Each|Case|Select|End Select|Return|Continue|Do|Until|Loop|Next|With|Exit Do|Exit For|Exit Function|Exit Property|Exit Sub|IIf)\\b", - caseInsensitive: true + regex: "\\b(?:If|Then|Else|ElseIf|Else If|End If|While|Wend|For|To|Each|Case|Select|End Select|Return|Continue|Do|Until|Loop|Next|With|Exit Do|Exit For|Exit Function|Exit Property|Exit Sub|IIf)\\b" }, { token: "keyword.operator.asp", - regex: "\\b(?:Mod|And|Not|Or|Xor|as)\\b", - caseInsensitive: true + regex: "\\b(?:Mod|And|Not|Or|Xor|as)\\b" }, { token: "storage.type.asp", - regex: "Dim|Call|Class|Const|Dim|Redim|Function|Sub|Private Sub|Public Sub|End sub|End Function|Set|Let|Get|New|Randomize|Option Explicit|On Error Resume Next|On Error GoTo", - caseInsensitive: true + regex: "Dim|Call|Class|Const|Dim|Redim|Function|Sub|Private Sub|Public Sub|End sub|End Function|Set|Let|Get|New|Randomize|Option Explicit|On Error Resume Next|On Error GoTo" }, { token: "storage.modifier.asp", - regex: "\\b(?:Private|Public|Default)\\b", - caseInsensitive: true + regex: "\\b(?:Private|Public|Default)\\b" }, { token: "constant.language.asp", - regex: "\\b(?:Empty|False|Nothing|Null|True)\\b", - caseInsensitive: true + regex: "\\b(?:Empty|False|Nothing|Null|True)\\b" }, { token: "punctuation.definition.string.begin.asp", @@ -128,28 +122,23 @@ var VBScriptHighlightRules = function() { }, { token: "support.class.asp", - regex: "\\b(?:Application|ObjectContext|Request|Response|Server|Session)\\b", - caseInsensitive: true + regex: "\\b(?:Application|ObjectContext|Request|Response|Server|Session)\\b" }, { token: "support.class.collection.asp", - regex: "\\b(?:Contents|StaticObjects|ClientCertificate|Cookies|Form|QueryString|ServerVariables)\\b", - caseInsensitive: true + regex: "\\b(?:Contents|StaticObjects|ClientCertificate|Cookies|Form|QueryString|ServerVariables)\\b" }, { token: "support.constant.asp", - regex: "\\b(?:TotalBytes|Buffer|CacheControl|Charset|ContentType|Expires|ExpiresAbsolute|IsClientConnected|PICS|Status|ScriptTimeout|CodePage|LCID|SessionID|Timeout)\\b", - caseInsensitive: true + regex: "\\b(?:TotalBytes|Buffer|CacheControl|Charset|ContentType|Expires|ExpiresAbsolute|IsClientConnected|PICS|Status|ScriptTimeout|CodePage|LCID|SessionID|Timeout)\\b" }, { token: "support.function.asp", - regex: "\\b(?:Lock|Unlock|SetAbort|SetComplete|BinaryRead|AddHeader|AppendToLog|BinaryWrite|Clear|End|Flush|Redirect|Write|CreateObject|HTMLEncode|MapPath|URLEncode|Abandon|Convert|Regex)\\b", - caseInsensitive: true + regex: "\\b(?:Lock|Unlock|SetAbort|SetComplete|BinaryRead|AddHeader|AppendToLog|BinaryWrite|Clear|End|Flush|Redirect|Write|CreateObject|HTMLEncode|MapPath|URLEncode|Abandon|Convert|Regex)\\b" }, { token: "support.function.event.asp", - regex: "\\b(?:Application_OnEnd|Application_OnStart|OnTransactionAbort|OnTransactionCommit|Session_OnEnd|Session_OnStart)\\b", - caseInsensitive: true + regex: "\\b(?:Application_OnEnd|Application_OnStart|OnTransactionAbort|OnTransactionCommit|Session_OnEnd|Session_OnStart)\\b" }, // { // token: [ @@ -159,8 +148,7 @@ var VBScriptHighlightRules = function() { // }, { token: "support.function.vb.asp", - regex: "\\b(?:Array|Add|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng|Conversions|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial|DateValue|Day|Derived|Math|Escape|Eval|Exists|Exp|Filter|FormatCurrency|FormatDateTime|FormatNumber|FormatPercent|GetLocale|GetObject|GetRef|Hex|Hour|InputBox|InStr|InStrRev|Int|Fix|IsArray|IsDate|IsEmpty|IsNull|IsNumeric|IsObject|Item|Items|Join|Keys|LBound|LCase|Left|Len|LoadPicture|Log|LTrim|RTrim|Trim|Maths|Mid|Minute|Month|MonthName|MsgBox|Now|Oct|Remove|RemoveAll|Replace|RGB|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion|ScriptEngineMinorVersion|Second|SetLocale|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse|Tan|Time|Timer|TimeSerial|TimeValue|TypeName|UBound|UCase|Unescape|VarType|Weekday|WeekdayName|Year)\\b", - caseInsensitive: true + regex: "\\b(?:Array|Add|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng|Conversions|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial|DateValue|Day|Derived|Math|Escape|Eval|Exists|Exp|Filter|FormatCurrency|FormatDateTime|FormatNumber|FormatPercent|GetLocale|GetObject|GetRef|Hex|Hour|InputBox|InStr|InStrRev|Int|Fix|IsArray|IsDate|IsEmpty|IsNull|IsNumeric|IsObject|Item|Items|Join|Keys|LBound|LCase|Left|Len|LoadPicture|Log|LTrim|RTrim|Trim|Maths|Mid|Minute|Month|MonthName|MsgBox|Now|Oct|Remove|RemoveAll|Replace|RGB|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion|ScriptEngineMinorVersion|Second|SetLocale|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse|Tan|Time|Timer|TimeSerial|TimeValue|TypeName|UBound|UCase|Unescape|VarType|Weekday|WeekdayName|Year)\\b" }, { token: [ @@ -170,8 +158,7 @@ var VBScriptHighlightRules = function() { }, { token: "support.type.vb.asp", - regex: "\\b(?:vbtrue|vbfalse|vbcr|vbcrlf|vbformfeed|vblf|vbnewline|vbnullchar|vbnullstring|int32|vbtab|vbverticaltab|vbbinarycompare|vbtextcomparevbsunday|vbmonday|vbtuesday|vbwednesday|vbthursday|vbfriday|vbsaturday|vbusesystemdayofweek|vbfirstjan1|vbfirstfourdays|vbfirstfullweek|vbgeneraldate|vblongdate|vbshortdate|vblongtime|vbshorttime|vbobjecterror|vbEmpty|vbNull|vbInteger|vbLong|vbSingle|vbDouble|vbCurrency|vbDate|vbString|vbObject|vbError|vbBoolean|vbVariant|vbDataObject|vbDecimal|vbByte|vbArray)\\b", - caseInsensitive: true + regex: "\\b(?:vbtrue|vbfalse|vbcr|vbcrlf|vbformfeed|vblf|vbnewline|vbnullchar|vbnullstring|int32|vbtab|vbverticaltab|vbbinarycompare|vbtextcomparevbsunday|vbmonday|vbtuesday|vbwednesday|vbthursday|vbfriday|vbsaturday|vbusesystemdayofweek|vbfirstjan1|vbfirstfourdays|vbfirstfullweek|vbgeneraldate|vblongdate|vbshortdate|vblongtime|vbshorttime|vbobjecterror|vbEmpty|vbNull|vbInteger|vbLong|vbSingle|vbDouble|vbCurrency|vbDate|vbString|vbObject|vbError|vbBoolean|vbVariant|vbDataObject|vbDecimal|vbByte|vbArray)\\b" }, { token: [ diff --git a/lib/ace/mode/xml.js b/lib/ace/mode/xml.js index 38861eee..8c7033f1 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 8e39cae5..91da0e70 100644 --- a/lib/ace/mode/xml_highlight_rules.js +++ b/lib/ace/mode/xml_highlight_rules.js @@ -35,10 +35,8 @@ var oop = require("../lib/oop"); var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var XmlHighlightRules = function(normalize) { - // 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]*"; + + var tagRegex = "[a-zA-Z][-_a-zA-Z0-9]*"; this.$rules = { start : [ diff --git a/lib/ace/mouse/multi_select_handler.js b/lib/ace/mouse/multi_select_handler.js index 649043fa..9b52e237 100644 --- a/lib/ace/mouse/multi_select_handler.js +++ b/lib/ace/mouse/multi_select_handler.js @@ -83,15 +83,15 @@ function onMouseDown(e) { var selectionMode; if (editor.$mouseHandler.$enableJumpToDef) { if (ctrl && alt || accel && alt) - selectionMode = shift ? "block" : "add"; - else if (alt && editor.$blockSelectEnabled) + selectionMode = "add"; + else if (alt) selectionMode = "block"; } else { if (accel && !alt) { selectionMode = "add"; if (!isMultiSelect && shift) return; - } else if (alt && editor.$blockSelectEnabled) { + } else if (alt) { selectionMode = "block"; } } @@ -117,7 +117,7 @@ function onMouseDown(e) { if (shift) { oldRange = null; - range = selection.ranges[0] || range; + range = selection.ranges[0]; editor.removeSelectionMarker(range); } editor.once("mouseup", function() { diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index 1d0b69e7..0635afc2 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -754,9 +754,9 @@ var Editor = require("./editor").Editor; if (fr < 0) fr = 0; if (lr >= max) lr = max - 1; } - var lines = this.session.removeFullLines(fr, lr); + var lines = this.session.doc.removeLines(fr, lr); lines = this.$reAlignText(lines, guessRange); - this.session.insert({row: fr, column: 0}, lines.join("\n") + "\n"); + this.session.doc.insert({row: fr, column: 0}, lines.join("\n") + "\n"); if (!guessRange) { range.start.column = 0; range.end.column = lines[lines.length - 1].length; @@ -924,8 +924,7 @@ function addAltCursorListeners(editor){ var el = editor.textInput.getElement(); var altCursor = false; event.addListener(el, "keydown", function(e) { - var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); - if (editor.$blockSelectEnabled && altDown) { + if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) { if (!altCursor) { editor.renderer.setMouseCursor("crosshair"); altCursor = true; @@ -963,12 +962,6 @@ require("./config").defineOptions(Editor.prototype, "editor", { } }, value: true - }, - enableBlockSelect: { - set: function(val) { - this.$blockSelectEnabled = val; - }, - value: true } }); diff --git a/lib/ace/multi_select_test.js b/lib/ace/multi_select_test.js index 7fd504fb..1eccc4ce 100644 --- a/lib/ace/multi_select_test.js +++ b/lib/ace/multi_select_test.js @@ -30,7 +30,6 @@ if (typeof process !== "undefined") { require("amd-loader"); - require("./test/mockdom"); } define(function(require, exports, module) { @@ -42,7 +41,6 @@ var Range = require("./range").Range; var Editor = require("./editor").Editor; var EditSession = require("./edit_session").EditSession; var MockRenderer = require("./test/mockrenderer").MockRenderer; -var UndoManager = require("./undomanager").UndoManager; var editor; var exec = function(name, times, args) { @@ -84,11 +82,11 @@ function setSelection(editor, data) { return isBackwards ? { start: end, end: start, - isBackwards: isBackwards + isBackwards: true } : { start: start, end: end, - isBackwards: isBackwards + isBackwards: true }; })); } @@ -225,19 +223,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,1,1,0],[3,0,3,1],[5,0,5,1],[7,0,7,1]]); + setSelection(editor, [[1,2],[1,0,1,1],[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,1,2,0],[6,0,6,1],[10,0,10,1],[14,0,14,1]]); + testSelection(editor, [[2,2],[2,0,2,1],[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,1,12,0],[13,0,13,1],[14,0,14,1],[15,0,15,1]]); + testSelection(editor, [[12,2],[12,0,12,1],[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,1,0,0],[1,0,1,1],[2,0,2,1],[3,0,3,1]]); + testSelection(editor, [[0,2],[0,0,0,1],[1,0,1,1],[2,0,2,1],[3,0,3,1]]); }, "test multiselect fromJSON/toJSON": function() { @@ -261,20 +259,6 @@ module.exports = { selection.fromJSON(after); assert.ok(!selection.isEqual(before)); assert.ok(selection.isEqual(after)); - }, - - "test multiselect align": function() { - var doc = new EditSession(["l1", "l2", "l3"]); - doc.setUndoManager(new UndoManager()); - editor = new Editor(new MockRenderer(), doc); - var selection = editor.selection; - selection.addRange(new Range(1,0,1,0)) - selection.addRange(new Range(2,2,2,2)) - editor.execCommand("alignCursors"); - assert.equal(' l1\n l2\nl3', editor.getValue()); - doc.markUndoGroup(); - editor.execCommand("undo"); - assert.equal('l1\nl2\nl3', editor.getValue()); } }; diff --git a/lib/ace/placeholder.js b/lib/ace/placeholder.js index 0e299594..582e2c2b 100644 --- a/lib/ace/placeholder.js +++ b/lib/ace/placeholder.js @@ -150,27 +150,28 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) * Emitted when the place holder updates. * **/ - this.onUpdate = function(delta) { - var range = delta; + this.onUpdate = function(event) { + var delta = event.data; + var range = delta.range; if(range.start.row !== range.end.row) return; if(range.start.row !== this.pos.row) return; if (this.$updating) return; this.$updating = true; - var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; + var lengthDiff = delta.action === "insertText" ? range.end.column - range.start.column : range.start.column - range.end.column; if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) { var distanceFromStart = range.start.column - this.pos.column; this.length += lengthDiff; if(!this.session.$fromUndo) { - if(delta.action === 'insert') { + if(delta.action === "insertText") { for (var i = this.others.length - 1; i >= 0; i--) { var otherPos = this.others[i]; var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; if(otherPos.row === range.start.row && range.start.column < otherPos.column) newPos.column += lengthDiff; - this.doc.insertMergedLines(newPos, delta.lines); + this.doc.insert(newPos, delta.text); } - } else if(delta.action === 'remove') { + } else if(delta.action === "removeText") { for (var i = this.others.length - 1; i >= 0; i--) { var otherPos = this.others[i]; var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; @@ -180,7 +181,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) } } // Special case: insert in beginning - if(range.start.column === this.pos.column && delta.action === 'insert') { + if(range.start.column === this.pos.column && delta.action === "insertText") { setTimeout(function() { this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff); for (var i = 0; i < this.others.length; i++) { @@ -192,7 +193,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) } }.bind(this), 0); } - else if(range.start.column === this.pos.column && delta.action === 'remove') { + else if(range.start.column === this.pos.column && delta.action === "removeText") { setTimeout(function() { for (var i = 0; i < this.others.length; i++) { var other = this.others[i]; diff --git a/lib/ace/range_list.js b/lib/ace/range_list.js index 326bc41b..0cbcc394 100644 --- a/lib/ace/range_list.js +++ b/lib/ace/range_list.js @@ -180,13 +180,14 @@ var RangeList = function() { this.session = null; }; - this.$onChange = function(delta) { - if (delta.action == "insert"){ - var start = delta.start; - var end = delta.end; + this.$onChange = function(e) { + var changeRange = e.data.range; + if (e.data.action[0] == "i"){ + var start = changeRange.start; + var end = changeRange.end; } else { - var end = delta.start; - var start = delta.end; + var end = changeRange.start; + var start = changeRange.end; } var startRow = start.row; var endRow = end.row; diff --git a/lib/ace/selection.js b/lib/ace/selection.js index ed57682f..b712fc6b 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[i].isBackwards) + if (data.isBackwards) r.cursor = r.start; this.addRange(r, true); } diff --git a/lib/ace/snippets.js b/lib/ace/snippets.js index 699cd6e9..10c34bf0 100644 --- a/lib/ace/snippets.js +++ b/lib/ace/snippets.js @@ -667,11 +667,11 @@ var TabstopManager = function(editor) { this.editor = null; }; - this.onChange = function(delta) { - var changeRange = delta; - var isRemove = delta.action[0] == "r"; - var start = delta.start; - var end = delta.end; + this.onChange = function(e) { + var changeRange = e.data.range; + var isRemove = e.data.action[0] == "r"; + var start = changeRange.start; + var end = changeRange.end; var startRow = start.row; var endRow = end.row; var lineDif = endRow - startRow; diff --git a/lib/ace/snippets/mask.js b/lib/ace/snippets/mask.js deleted file mode 100644 index 7fbca678..00000000 --- a/lib/ace/snippets/mask.js +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/ace/snippets/nim.js b/lib/ace/snippets/nim.js deleted file mode 100644 index 6e6d02bb..00000000 --- a/lib/ace/snippets/nim.js +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index a8a20a00..00000000 --- a/lib/ace/snippets/nim.snippets +++ /dev/null @@ -1,130 +0,0 @@ -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.js b/lib/ace/snippets/sqlserver.js deleted file mode 100644 index f84694dc..00000000 --- a/lib/ace/snippets/sqlserver.js +++ /dev/null @@ -1,7 +0,0 @@ -define(function(require, exports, module) { -"use strict"; - -exports.snippetText = require("../requirejs/text!./sqlserver.snippets"); -exports.scope = "sqlserver"; - -}); diff --git a/lib/ace/snippets/sqlserver.snippets b/lib/ace/snippets/sqlserver.snippets deleted file mode 100644 index 403bd6bc..00000000 --- a/lib/ace/snippets/sqlserver.snippets +++ /dev/null @@ -1,70 +0,0 @@ -# ISNULL -snippet isnull - ISNULL(${1:check_expression}, ${2:replacement_value}) -# FORMAT -snippet format - FORMAT(${1:value}, ${2:format}) -# CAST -snippet cast - CAST(${1:expression} AS ${2:data_type}) -# CONVERT -snippet convert - CONVERT(${1:data_type}, ${2:expression}) -# DATEPART -snippet datepart - DATEPART(${1:datepart}, ${2:date}) -# DATEDIFF -snippet datediff - DATEDIFF(${1:datepart}, ${2:startdate}, ${3:enddate}) -# DATEADD -snippet dateadd - DATEADD(${1:datepart}, ${2:number}, ${3:date}) -# 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 - -- ============================================= - -- Author: ${1:Author} - -- Create date: ${2:Date} - -- Description: ${3:Description} - -- ============================================= - CREATE PROCEDURE ${4:Procedure_Name} - ${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 -snippet createfn - -- ============================================= - -- Author: ${1:Author} - -- Create date: ${2:Date} - -- Description: ${3:Description} - -- ============================================= - CREATE FUNCTION ${4:Scalar_Function_Name} - -- Add the parameters for the function here - RETURNS ${5:Function_Data_Type} - AS - 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 c11308d4..e3884e02 100644 --- a/lib/ace/theme/clouds.css +++ b/lib/ace/theme/clouds.css @@ -23,6 +23,7 @@ .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 08ee089d..3b932996 100644 --- a/lib/ace/theme/clouds_midnight.css +++ b/lib/ace/theme/clouds_midnight.css @@ -23,6 +23,7 @@ .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 b883ba97..16568fc3 100644 --- a/lib/ace/theme/cobalt.css +++ b/lib/ace/theme/cobalt.css @@ -5,7 +5,7 @@ .ace-cobalt .ace_print-margin { width: 1px; - background: #555555 + background: #011e3a } .ace-cobalt { @@ -23,6 +23,7 @@ .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 { @@ -130,4 +131,4 @@ .ace-cobalt .ace_indent-guide { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y -} +} \ No newline at end of file diff --git a/lib/ace/theme/dawn.css b/lib/ace/theme/dawn.css index 3c2884e1..719f4877 100644 --- a/lib/ace/theme/dawn.css +++ b/lib/ace/theme/dawn.css @@ -23,6 +23,7 @@ .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 b5e1bff2..f507ec10 100644 --- a/lib/ace/theme/idle_fingers.css +++ b/lib/ace/theme/idle_fingers.css @@ -23,6 +23,7 @@ .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/iplastic.css b/lib/ace/theme/iplastic.css deleted file mode 100644 index b07dc8f9..00000000 --- a/lib/ace/theme/iplastic.css +++ /dev/null @@ -1,140 +0,0 @@ -.ace-iplastic .ace_gutter { - background: #dddddd; - color: #666666 -} - -.ace-iplastic .ace_print-margin { - width: 1px; - background: #bbbbbb -} - -.ace-iplastic { - background-color: #eeeeee; - color: #333333 -} - -.ace-iplastic .ace_cursor { - color: #333 -} - -.ace-iplastic .ace_marker-layer .ace_selection { - background: #BAD6FD; -} - -.ace-iplastic.ace_multiselect .ace_selection.ace_start { - border-radius: 4px -} - -.ace-iplastic .ace_marker-layer .ace_step { - background: #444444 -} - -.ace-iplastic .ace_marker-layer .ace_bracket { - margin: -1px 0 0 -1px; - border: 1px solid #49483E; - background: #FFF799 -} - -.ace-iplastic .ace_marker-layer .ace_active-line { - background: #e5e5e5 -} - -.ace-iplastic .ace_gutter-active-line { - background-color: #eeeeee -} - -.ace-iplastic .ace_marker-layer .ace_selected-word { - border: 1px solid #555555; - border-radius:4px -} - -.ace-iplastic .ace_invisible { - color: #999999 -} - -.ace-iplastic .ace_entity.ace_name.ace_tag, -.ace-iplastic .ace_keyword, -.ace-iplastic .ace_meta.ace_tag, -.ace-iplastic .ace_storage { - color: #0000FF -} - -.ace-iplastic .ace_punctuation, -.ace-iplastic .ace_punctuation.ace_tag { - color: #000 -} - -.ace-iplastic .ace_constant { - color: #333333; - font-weight: 700 -} - -.ace-iplastic .ace_constant.ace_character, -.ace-iplastic .ace_constant.ace_language, -.ace-iplastic .ace_constant.ace_numeric, -.ace-iplastic .ace_constant.ace_other { - color: #0066FF; - font-weight: 700 -} - -.ace-iplastic .ace_constant.ace_numeric{ - font-weight: 100 -} - -.ace-iplastic .ace_invalid { - color: #F8F8F0; - background-color: #F92672 -} - -.ace-iplastic .ace_invalid.ace_deprecated { - color: #F8F8F0; - background-color: #AE81FF -} - -.ace-iplastic .ace_support.ace_constant, -.ace-iplastic .ace_support.ace_function { - color: #333333; - font-weight: 700 -} - -.ace-iplastic .ace_fold { - background-color: #464646; - border-color: #F8F8F2 -} - -.ace-iplastic .ace_storage.ace_type, -.ace-iplastic .ace_support.ace_class, -.ace-iplastic .ace_support.ace_type { - color: #3333fc; - font-weight: 700 -} - -.ace-iplastic .ace_entity.ace_name.ace_function, -.ace-iplastic .ace_entity.ace_other, -.ace-iplastic .ace_entity.ace_other.ace_attribute-name, -.ace-iplastic .ace_variable { - color: #3366cc; - font-style: italic -} - -.ace-iplastic .ace_variable.ace_parameter { - font-style: italic; - color: #2469E0 -} - -.ace-iplastic .ace_string { - color: #a55f03 -} - -.ace-iplastic .ace_comment { - color: #777777; - font-style: italic -} - -.ace-iplastic .ace_fold-widget { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==); -} - -.ace-iplastic .ace_indent-guide { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAABlJREFUeNpi+P//PwMzMzPzfwAAAAD//wMAGRsECSML/RIAAAAASUVORK5CYII=) right repeat-y -} \ No newline at end of file diff --git a/lib/ace/theme/iplastic.js b/lib/ace/theme/iplastic.js deleted file mode 100644 index ff784196..00000000 --- a/lib/ace/theme/iplastic.js +++ /dev/null @@ -1,40 +0,0 @@ - -/* ***** 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 = false; -exports.cssClass = "ace-iplastic"; -exports.cssText = require("../requirejs/text!./iplastic.css"); - -var dom = require("../lib/dom"); -dom.importCssString(exports.cssText, exports.cssClass); -}); diff --git a/lib/ace/theme/katzenmilch.css b/lib/ace/theme/katzenmilch.css index bf1569fb..0b5a7a23 100644 --- a/lib/ace/theme/katzenmilch.css +++ b/lib/ace/theme/katzenmilch.css @@ -31,6 +31,7 @@ .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 e232de47..339786ad 100644 --- a/lib/ace/theme/kr_theme.css +++ b/lib/ace/theme/kr_theme.css @@ -23,6 +23,7 @@ .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 9be25c66..a84ec3a6 100644 --- a/lib/ace/theme/merbivore.css +++ b/lib/ace/theme/merbivore.css @@ -23,6 +23,7 @@ .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 0d615376..f0ad0bac 100644 --- a/lib/ace/theme/merbivore_soft.css +++ b/lib/ace/theme/merbivore_soft.css @@ -23,6 +23,7 @@ .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 6630e4a2..7e40a3b9 100644 --- a/lib/ace/theme/mono_industrial.css +++ b/lib/ace/theme/mono_industrial.css @@ -23,6 +23,7 @@ .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 bcc26ef4..a3a063df 100644 --- a/lib/ace/theme/monokai.css +++ b/lib/ace/theme/monokai.css @@ -23,6 +23,7 @@ .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 0b637174..8cab16a1 100644 --- a/lib/ace/theme/pastel_on_dark.css +++ b/lib/ace/theme/pastel_on_dark.css @@ -23,6 +23,7 @@ .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 09740e69..ea8ec8aa 100644 --- a/lib/ace/theme/solarized_dark.css +++ b/lib/ace/theme/solarized_dark.css @@ -30,6 +30,7 @@ .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 65399fda..64c4bac9 100644 --- a/lib/ace/theme/solarized_light.css +++ b/lib/ace/theme/solarized_light.css @@ -23,6 +23,7 @@ .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/sqlserver.css b/lib/ace/theme/sqlserver.css deleted file mode 100644 index ff6d1e1c..00000000 --- a/lib/ace/theme/sqlserver.css +++ /dev/null @@ -1,171 +0,0 @@ -.ace_line { - font-family: Consolas; -} - -.ace-sqlserver .ace_gutter { - background: #ebebeb; - color: #333; - overflow: hidden; -} - -.ace-sqlserver .ace_print-margin { - width: 1px; - background: #e8e8e8; -} - -.ace-sqlserver { - background-color: #FFFFFF; - color: black; -} - -.ace-sqlserver .ace_identifier { - color: black; -} - -.ace-sqlserver .ace_keyword { - color: #0000FF; -} - -.ace-sqlserver .ace_numeric { - color: black; -} - -.ace-sqlserver .ace_storage { - color: #11B7BE; -} - -.ace-sqlserver .ace_keyword.ace_operator, -.ace-sqlserver .ace_lparen, -.ace-sqlserver .ace_rparen, -.ace-sqlserver .ace_punctuation { - color: #808080; -} - -.ace-sqlserver .ace_set.ace_statement { - color: #0000FF; - text-decoration: underline; -} - -.ace-sqlserver .ace_cursor { - color: black; -} - -.ace-sqlserver .ace_invisible { - color: rgb(191, 191, 191); -} - -.ace-sqlserver .ace_constant.ace_buildin { - color: rgb(88, 72, 246); -} - -.ace-sqlserver .ace_constant.ace_language { - color: #979797; -} - -.ace-sqlserver .ace_constant.ace_library { - color: rgb(6, 150, 14); -} - -.ace-sqlserver .ace_invalid { - background-color: rgb(153, 0, 0); - color: white; -} - -.ace-sqlserver .ace_support.ace_function { - color: #FF00FF; -} - -.ace-sqlserver .ace_support.ace_constant { - color: rgb(6, 150, 14); -} - -.ace-sqlserver .ace_class { - color: #008080; -} - -.ace-sqlserver .ace_support.ace_other { - color: #6D79DE; -} - -.ace-sqlserver .ace_variable.ace_parameter { - font-style: italic; - color: #FD971F; -} - -.ace-sqlserver .ace_comment { - color: #008000; -} - -.ace-sqlserver .ace_constant.ace_numeric { - color: black; -} - -.ace-sqlserver .ace_variable { - color: rgb(49, 132, 149); -} - -.ace-sqlserver .ace_xml-pe { - color: rgb(104, 104, 91); -} - -.ace-sqlserver .ace_support.ace_storedprocedure { - color: #800000; -} - -.ace-sqlserver .ace_heading { - color: rgb(12, 7, 255); -} - -.ace-sqlserver .ace_list { - color: rgb(185, 6, 144); -} - -.ace-sqlserver .ace_marker-layer .ace_selection { - background: rgb(181, 213, 255); -} - -.ace-sqlserver .ace_marker-layer .ace_step { - background: rgb(252, 255, 0); -} - -.ace-sqlserver .ace_marker-layer .ace_stack { - background: rgb(164, 229, 101); -} - -.ace-sqlserver .ace_marker-layer .ace_bracket { - margin: -1px 0 0 -1px; - border: 1px solid rgb(192, 192, 192); -} - -.ace-sqlserver .ace_marker-layer .ace_active-line { - background: rgba(0, 0, 0, 0.07); -} - -.ace-sqlserver .ace_gutter-active-line { - background-color: #dcdcdc; -} - -.ace-sqlserver .ace_marker-layer .ace_selected-word { - background: rgb(250, 250, 255); - border: 1px solid rgb(200, 200, 250); -} - -.ace-sqlserver .ace_meta.ace_tag { - color: #0000FF; -} - -.ace-sqlserver .ace_string.ace_regex { - color: #FF0000; -} - -.ace-sqlserver .ace_string { - color: #FF0000; -} - -.ace-sqlserver .ace_entity.ace_other.ace_attribute-name { - color: #994409; -} - -.ace-sqlserver .ace_indent-guide { - background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; -} diff --git a/lib/ace/theme/sqlserver.js b/lib/ace/theme/sqlserver.js deleted file mode 100644 index ab657483..00000000 --- a/lib/ace/theme/sqlserver.js +++ /dev/null @@ -1,39 +0,0 @@ -/* ***** 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 = false; -exports.cssClass = "ace-sqlserver"; -exports.cssText = require("../requirejs/text!./sqlserver.css"); - -var dom = require("../lib/dom"); -dom.importCssString(exports.cssText, exports.cssClass); -}); diff --git a/lib/ace/theme/terminal.css b/lib/ace/theme/terminal.css index f23a9ad6..3636a03d 100644 --- a/lib/ace/theme/terminal.css +++ b/lib/ace/theme/terminal.css @@ -23,6 +23,7 @@ .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 18e2b4ee..6cb159ba 100644 --- a/lib/ace/theme/textmate.css +++ b/lib/ace/theme/textmate.css @@ -122,6 +122,7 @@ } .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 deleted file mode 100644 index 48d2602c..00000000 --- a/lib/ace/theme/the_night_after_tomorrow.css +++ /dev/null @@ -1,139 +0,0 @@ -.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 deleted file mode 100644 index 3108e2a9..00000000 --- a/lib/ace/theme/the_night_after_tomorrow.js +++ /dev/null @@ -1,39 +0,0 @@ -/* ***** 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 77407e66..20975004 100644 --- a/lib/ace/theme/tomorrow.css +++ b/lib/ace/theme/tomorrow.css @@ -23,6 +23,7 @@ .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 e98a6580..aafceab6 100644 --- a/lib/ace/theme/tomorrow_night.css +++ b/lib/ace/theme/tomorrow_night.css @@ -23,6 +23,7 @@ .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 907eef35..e717be0a 100644 --- a/lib/ace/theme/tomorrow_night_blue.css +++ b/lib/ace/theme/tomorrow_night_blue.css @@ -24,6 +24,7 @@ .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 c0c33739..5c896fb9 100644 --- a/lib/ace/theme/tomorrow_night_bright.css +++ b/lib/ace/theme/tomorrow_night_bright.css @@ -23,6 +23,7 @@ .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 69277fb1..85d7b089 100644 --- a/lib/ace/theme/tomorrow_night_eighties.css +++ b/lib/ace/theme/tomorrow_night_eighties.css @@ -24,6 +24,7 @@ .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 ae353dae..0ca694fb 100644 --- a/lib/ace/theme/twilight.css +++ b/lib/ace/theme/twilight.css @@ -23,6 +23,7 @@ .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 a3a89402..e2901156 100644 --- a/lib/ace/theme/vibrant_ink.css +++ b/lib/ace/theme/vibrant_ink.css @@ -23,6 +23,7 @@ .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 a22bd169..56eb9a89 100644 --- a/lib/ace/theme/xcode.css +++ b/lib/ace/theme/xcode.css @@ -25,6 +25,7 @@ .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/undomanager.js b/lib/ace/undomanager.js index 6da50a8b..4411ae8b 100644 --- a/lib/ace/undomanager.js +++ b/lib/ace/undomanager.js @@ -61,19 +61,15 @@ var UndoManager = function() { * **/ this.execute = function(options) { - // Normalize deltas for storage. - // var deltaSets = this.$serializeDeltas(options.args[0]); - var deltaSets = options.args[0]; - // Add deltas to undo stack. + var deltas = options.args[0]; this.$doc = options.args[1]; if (options.merge && this.hasUndo()){ this.dirtyCounter--; - deltaSets = this.$undoStack.pop().concat(deltaSets); + deltas = this.$undoStack.pop().concat(deltas); } - this.$undoStack.push(deltaSets); - - // Reset redo stack. + this.$undoStack.push(deltas); this.$redoStack = []; + if (this.dirtyCounter < 0) { // The user has made a change after undoing past the last clean state. // We can never get back to a clean state now until markClean() is called. @@ -90,11 +86,12 @@ var UndoManager = function() { * @returns {Range} The range of the undo. **/ this.undo = function(dontSelect) { - var deltaSets = this.$undoStack.pop(); + var deltas = this.$undoStack.pop(); var undoSelectionRange = null; - if (deltaSets) { - undoSelectionRange = this.$doc.undoChanges(this.$deserializeDeltas(deltaSets), dontSelect); - this.$redoStack.push(deltaSets); + if (deltas) { + undoSelectionRange = + this.$doc.undoChanges(deltas, dontSelect); + this.$redoStack.push(deltas); this.dirtyCounter--; } @@ -108,14 +105,15 @@ var UndoManager = function() { * **/ this.redo = function(dontSelect) { - var deltaSets = this.$redoStack.pop(); + var deltas = this.$redoStack.pop(); var redoSelectionRange = null; - if (deltaSets) { + if (deltas) { redoSelectionRange = - this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect); - this.$undoStack.push(deltaSets); + this.$doc.redoChanges(deltas, dontSelect); + this.$undoStack.push(deltas); this.dirtyCounter++; } + return redoSelectionRange; }; @@ -163,52 +161,7 @@ var UndoManager = function() { this.isClean = function() { return this.dirtyCounter === 0; }; - - // Serializes deltaSets to reduce memory usage. - this.$serializeDeltas = function(deltaSets) { - return cloneDeltaSetsObj(deltaSets, $serializeDelta); - }; - - // Deserializes deltaSets to allow application to the document. - this.$deserializeDeltas = function(deltaSets) { - return cloneDeltaSetsObj(deltaSets, $deserializeDelta); - }; - - function $serializeDelta(delta){ - return { - action: delta.action, - start: delta.start, - end: delta.end, - lines: delta.lines.length == 1 ? null : delta.lines, - text: delta.lines.length == 1 ? delta.lines[0] : null, - }; - } - - function $deserializeDelta(delta) { - return { - action: delta.action, - start: delta.start, - end: delta.end, - lines: delta.lines || [delta.text] - }; - } - - function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) { - var deltaSets_new = new Array(deltaSets_old.length); - for (var i = 0; i < deltaSets_old.length; i++) { - var deltaSet_old = deltaSets_old[i]; - var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)}; - - for (var j = 0; j < deltaSet_old.deltas.length; j++) { - var delta_old = deltaSet_old.deltas[j]; - deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old); - } - - deltaSets_new[i] = deltaSet_new; - } - return deltaSets_new; - } - + }).call(UndoManager.prototype); exports.UndoManager = UndoManager; diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 45226a1d..5696745c 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.scroller; + return this.content; }; /** @@ -919,8 +919,6 @@ 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 || @@ -941,6 +939,9 @@ var VirtualRenderer = function(container, theme) { }; this.$computeLayerConfig = function() { + if (this.$maxLines && this.lineHeight > 1) + this.$autosize(); + var session = this.session; var size = this.$size; @@ -948,6 +949,9 @@ 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 || @@ -958,27 +962,20 @@ 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; - var sm = this.scrollMargin; - this.session.setScrollTop(Math.max(-sm.top, - Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); + this.session.setScrollTop(Math.max(-this.scrollMargin.top, + Math.min(this.scrollTop, maxHeight - size.scrollerHeight + this.scrollMargin.bottom))); - this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, - longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); + this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft, + longestLine + 2 * this.$padding - size.scrollerWidth + this.scrollMargin.right))); var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || - size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top); + size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop); 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 9b1ed866..e8a8fcbd 100644 --- a/lib/ace/virtual_renderer_test.js +++ b/lib/ace/virtual_renderer_test.js @@ -36,40 +36,26 @@ 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 = { - setUp: function() { - if (editor) - editor.destroy() + "test: screen2text the column should be rounded to the next character edge" : function() { 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; + var renderer = new VirtualRenderer(el); renderer.setPadding(0); renderer.setSession(new EditSession("1234")); @@ -87,23 +73,7 @@ module.exports = { testPixelToText(10, 0, 0, 1); testPixelToText(14, 0, 0, 1); testPixelToText(15, 0, 0, 2); - 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); - }); + document.body.removeChild(el); } // change tab size after setDocument (for text layer) diff --git a/lib/ace/worker/mirror.js b/lib/ace/worker/mirror.js index ef6e2aa3..7a3318fb 100644 --- a/lib/ace/worker/mirror.js +++ b/lib/ace/worker/mirror.js @@ -1,7 +1,6 @@ define(function(require, exports, module) { "use strict"; -var Range = require("../range").Range; var Document = require("../document").Document; var lang = require("../lib/lang"); @@ -13,19 +12,7 @@ var Mirror = exports.Mirror = function(sender) { var _self = this; sender.on("change", function(e) { - var data = e.data; - if (data[0].start) { - doc.applyDeltas(data); - } else { - for (var i = 0; i < data.length; i += 2) { - if (Array.isArray(data[i+1])) { - var d = {action: "insert", start: data[i], lines: data[i+1]}; - } else { - var d = {action: "remove", start: data[i], end: data[i+1]}; - } - doc.applyDelta(d, true); - } - } + doc.applyDeltas(e.data); if (_self.$timeout) return deferredUpdate.schedule(_self.$timeout); _self.onUpdate(); diff --git a/lib/ace/worker/worker.js b/lib/ace/worker/worker.js index 28fc0fe2..928000dd 100644 --- a/lib/ace/worker/worker.js +++ b/lib/ace/worker/worker.js @@ -1,9 +1,8 @@ "no use strict"; ;(function(window) { -if (typeof window.window != "undefined" && window.document) - return; -if (window.require && window.define) +if (typeof window.window != "undefined" && window.document) { return; +} window.console = function() { var msgs = Array.prototype.slice.call(arguments, 0); @@ -20,7 +19,6 @@ 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, @@ -39,7 +37,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(/[^\/]+\/\.\.\//, ""); } @@ -48,7 +46,7 @@ window.normalizeModule = function(parentId, moduleName) { return moduleName; }; -window.require = function require(parentId, id) { +window.require = function(parentId, id) { if (!id) { id = parentId; parentId = null; @@ -66,36 +64,17 @@ window.require = function require(parentId, id) { } return module.exports; } - + + var chunks = id.split("/"); if (!window.require.tlns) return console.log("unable to load " + id); - - var path = resolveModuleId(id, window.require.tlns); - if (path.slice(-3) != ".js") path += ".js"; + chunks[0] = window.require.tlns[chunks[0]] || chunks[0]; + var path = chunks.join("/") + ".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 = {}; @@ -121,9 +100,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); @@ -134,16 +113,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; @@ -152,10 +131,9 @@ window.define = function(id, deps, factory) { }; }; window.define.amd = {}; -require.tlns = {}; + window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { - for (var i in topLevelNamespaces) - require.tlns[i] = topLevelNamespaces[i]; + require.tlns = topLevelNamespaces; }; window.initSender = function initSender() { @@ -195,23 +173,21 @@ var sender = window.sender = null; window.onmessage = function(e) { var msg = e.data; - if (msg.event && sender) { - sender._signal(msg.event, msg.data); - } - else if (msg.command) { + 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) { - window.initBaseUrls(msg.tlns); + else if (msg.init) { + initBaseUrls(msg.tlns); require("ace/lib/es5-shim"); - sender = window.sender = window.initSender(); + sender = window.sender = 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/lib/ace/worker/worker_client.js b/lib/ace/worker/worker_client.js index ba4f20a0..ad445287 100644 --- a/lib/ace/worker/worker_client.js +++ b/lib/ace/worker/worker_client.js @@ -162,22 +162,19 @@ var WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) { doc.on("change", this.changeListener); }; - this.changeListener = function(delta) { + this.changeListener = function(e) { if (!this.deltaQueue) { - this.deltaQueue = []; + this.deltaQueue = [e.data]; setTimeout(this.$sendDeltaQueue, 0); - } - if (delta.action == "insert") - this.deltaQueue.push(delta.start, delta.lines); - else - this.deltaQueue.push(delta.start, delta.end); + } else + this.deltaQueue.push(e.data); }; this.$sendDeltaQueue = function() { var q = this.deltaQueue; if (!q) return; this.deltaQueue = null; - if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { + if (q.length > 20 && q.length > this.$doc.getLength() >> 1) { this.call("setValue", [this.$doc.getValue()]); } else this.emit("change", {data: q}); diff --git a/static.js b/static.js index 3b75c2b6..a711715e 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"); - return save(req, res, filename); + save(req, res, filename); } fs.exists(filename, function(exists) { @@ -86,7 +86,6 @@ 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 3d57b6e0..e72194d7 100644 --- a/tool/lib.js +++ b/tool/lib.js @@ -1,7 +1,6 @@ var plist = require("plist"); var util = require("util"); var url = require("url"); -var cson = require("cson"); var https = require("https"); var http = require("http"); @@ -13,120 +12,17 @@ exports.parsePlist = function(xmlOrJSON, callback) { json = result[0]; }); } else { - 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); - } + xmlOrJSON = xmlOrJSON.replace(/^\s*\/\/.*/gm, ""); + json = JSON.parse(xmlOrJSON) } callback && callback(json); return json; }; - exports.formatJSON = function(object, initialIndent) { - return JSON.stringify(object, null, 4).replace(/^/gm, initialIndent||""); + return util.inspect(object, false, 40).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 44aa67d0..7a2aea59 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-save option\n"+ - "`node static.js --allow-save` or `static.py --puttable=*`" + "and run the included web server with the --allow-write option\n"+ + "`node static.js --allow-write` or `static.py --puttable=*`" ); } editor.session.getUndoManager().markClean(); diff --git a/tool/package.json b/tool/package.json index 974673c6..2d33713a 100644 --- a/tool/package.json +++ b/tool/package.json @@ -1,10 +1,9 @@ { - "name": "ace-tools", - "version": "0.1.0", - "dependencies": { - "cson": "^3.0.1", - "css-parse": "1.0.3", - "css-stringify": "1.0.3", - "plist": "" - } + "name": "ace-tools", + "version": "0.1.0", + "dependencies": { + "plist": "", + "css-parse": "1.0.3", + "css-stringify": "1.0.3" + } } diff --git a/tool/tmlanguage.js b/tool/tmlanguage.js index b5d8b851..0e458330 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.formatJS(patterns, " ").trim(), + languageTokens: lib.formatJSON(patterns, " ").trim(), uuid: language.uuid, name: name, - metaData: lib.formatJS(language, "").trim() + metaData: lib.formatJSON(language, " ").trim() }); if (devMode) {