Compare commits
190 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ca8da0a3f3 | ||
|
|
f10da4cdb0 | ||
|
|
d953740339 | ||
|
|
6cec0b28b2 | ||
|
|
3f31ca57ed | ||
|
|
fb7144b622 | ||
|
|
2249d06337 | ||
|
|
1514d5f374 | ||
|
|
446e3e1bf9 | ||
|
|
652dd7009c | ||
|
|
3d23e1e98f | ||
|
|
cafc7e7ce1 | ||
|
|
abdc4c7510 | ||
|
|
8c1d0ab7cf | ||
|
|
9f57989043 | ||
|
|
2a089863e2 | ||
|
|
386c508042 | ||
|
|
dc7643db8d | ||
|
|
5705a7c2c1 | ||
|
|
2e2d9bcdc9 | ||
|
|
a799a4086f | ||
|
|
af5c7a9c3b | ||
|
|
fe96eef206 | ||
|
|
0a3b002e28 | ||
|
|
60439d927f | ||
|
|
95bb17d04b | ||
|
|
2c1b565591 | ||
|
|
53ea1a8665 | ||
|
|
9534e4ea92 | ||
|
|
fa86327b3d | ||
|
|
a68e8bea01 | ||
|
|
88d8cf3447 | ||
|
|
9e9aa8f328 | ||
|
|
93c39ca5b0 | ||
|
|
0db985a3d7 | ||
|
|
ad5802be06 | ||
|
|
0abd9ec30e | ||
|
|
6d205a8f7e | ||
|
|
d2dc26f5a5 | ||
|
|
ef4537a099 | ||
|
|
46f76b4b06 | ||
|
|
71d1ca9d20 | ||
|
|
263a45db02 | ||
|
|
9323a2616b | ||
|
|
ad22b71cfe | ||
|
|
cd8099b0ad | ||
|
|
a61d304cbb | ||
|
|
e72f1d8337 | ||
|
|
d080fe51d4 | ||
|
|
32cb8c6b0e | ||
|
|
3ce8d76c89 | ||
|
|
a842dcdee3 | ||
|
|
0dcb1281cd | ||
|
|
65ad04082f | ||
|
|
b6f7e5d6a1 | ||
|
|
5a3bf2570f | ||
|
|
2d7ebc34b6 | ||
|
|
87044e8816 | ||
|
|
82453d884b | ||
|
|
636ace5178 | ||
|
|
3673aabe2a | ||
|
|
694d7431b7 | ||
|
|
89b9a8ac72 | ||
|
|
67c7da75b6 | ||
|
|
662cd11975 | ||
|
|
68d531ecb2 | ||
|
|
e58fa3e6d7 | ||
|
|
e610365e67 | ||
|
|
65b2cf2855 | ||
|
|
2008ab813f | ||
|
|
ecb699aa11 | ||
|
|
63687f693b | ||
|
|
685ba18451 | ||
|
|
1ec6eb7b5d | ||
|
|
1027dcea7c | ||
|
|
961f8c4893 | ||
|
|
27284cd29f | ||
|
|
04f4292fbc | ||
|
|
4e6d48bf2e | ||
|
|
80f43beb73 | ||
|
|
cf0c81a25f | ||
|
|
ee90854917 | ||
|
|
ff4429dd5a | ||
|
|
487408e84d | ||
|
|
2713d0a8db | ||
|
|
b0ce5630c9 | ||
|
|
d89311e596 | ||
|
|
5482db1c4d | ||
|
|
eb70d5a6c8 | ||
|
|
abe0286420 | ||
|
|
094b8a147a | ||
|
|
f0d01b93d4 | ||
|
|
ef9cc542e7 | ||
|
|
73808101cd | ||
|
|
0753f9aa12 | ||
|
|
f270b4ae69 | ||
|
|
121e0e51f4 | ||
|
|
846c2fb3d3 | ||
|
|
cd1c5a42c9 | ||
|
|
282331b133 | ||
|
|
db0313f2ad | ||
|
|
37a80b35da | ||
|
|
75f66697f6 | ||
|
|
32847a6761 | ||
|
|
0d0b0b4356 | ||
|
|
a0a31e16a2 | ||
|
|
295ae4dc81 | ||
|
|
d38849ef9f | ||
|
|
184df6d18e | ||
|
|
ff0cc12efc | ||
|
|
1b9c8bfc88 | ||
|
|
e42bc9a265 | ||
|
|
12be220297 | ||
|
|
7ae5c862c2 | ||
|
|
d8f7003fb8 | ||
|
|
76ac79f116 | ||
|
|
1a6e2f83f2 | ||
|
|
6b62974118 | ||
|
|
461faa9184 | ||
|
|
ede82e7137 | ||
|
|
f0b3aa0a6f | ||
|
|
fb5f272f81 | ||
|
|
c458f96d3a | ||
|
|
6070fe96f7 | ||
|
|
6a2d3fcb09 | ||
|
|
8b29f7f3c9 | ||
|
|
48de4711eb | ||
|
|
bb3fa62824 | ||
|
|
6bdc0d6cbb | ||
|
|
510d060cb2 | ||
|
|
da8d545985 | ||
|
|
4f655e71d9 | ||
|
|
0bf729d88f | ||
|
|
cc40177114 | ||
|
|
fcb4023e52 | ||
|
|
22f802a9ff | ||
|
|
14a8e1f5d9 | ||
|
|
9c6720edca | ||
|
|
4dd8eda928 | ||
|
|
cb83a974b4 | ||
|
|
0216e8bbfd | ||
|
|
38e3452313 | ||
|
|
fb7b23e627 | ||
|
|
8c4173ba11 | ||
|
|
56cb246c78 | ||
|
|
60dd224d96 | ||
|
|
067a1ee68b | ||
|
|
eec012b24e | ||
|
|
004a19855a | ||
|
|
d619e4e746 | ||
|
|
27264bb9d9 | ||
|
|
a4532dd8b9 | ||
|
|
64f2fc4015 | ||
|
|
ffaf44ec0b | ||
|
|
bacaeb07d8 | ||
|
|
525fe1ffe3 | ||
|
|
bb827051a6 | ||
|
|
6502a3d2cb | ||
|
|
f625dfeea3 | ||
|
|
60367772a9 | ||
|
|
29023787e5 | ||
|
|
ad54d2c46c | ||
|
|
1f7582b5a6 | ||
|
|
ec97ad7904 | ||
|
|
27b6d6dcd3 | ||
|
|
6b60bcbbd6 | ||
|
|
46f3d77068 | ||
|
|
c8d1df203e | ||
|
|
4299db01bd | ||
|
|
b5af2c898c | ||
|
|
c8fca3053c | ||
|
|
8d57d8765f | ||
|
|
7f1bc7af2f | ||
|
|
6b280bf6bb | ||
|
|
35a27fd1ba | ||
|
|
ddd695ee3f | ||
|
|
f59708a5ba | ||
|
|
ef0e8da522 | ||
|
|
08edcdfc98 | ||
|
|
3a048cdf61 | ||
|
|
f2a2e4e1a8 | ||
|
|
6fe381f633 | ||
|
|
91df7cd663 | ||
|
|
8624ab8dcb | ||
|
|
b503e65e03 | ||
|
|
612478e39f | ||
|
|
810e196cc6 | ||
|
|
026af74016 | ||
|
|
27768230c8 | ||
|
|
2e6f12725b |
123 changed files with 3532 additions and 971 deletions
|
|
@ -1,5 +1,16 @@
|
|||
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
|
||||
|
|
|
|||
2
build
2
build
|
|
@ -1 +1 @@
|
|||
Subproject commit e3ccd2c654cf45ee41ffb09d0e7fa5b40cf91a8f
|
||||
Subproject commit a4e495d8901876c6bafe3870a35cb8e32c827e97
|
||||
|
|
@ -7,14 +7,13 @@
|
|||
<style type="text/css" media="screen">
|
||||
|
||||
.ace_editor {
|
||||
position: relative !important;
|
||||
border: 1px solid lightgray;
|
||||
margin: auto;
|
||||
height: 200px;
|
||||
width: 80%;
|
||||
}
|
||||
.scrollmargin {
|
||||
height: 100px;
|
||||
height: 80px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -24,6 +23,8 @@
|
|||
<div class="scrollmargin"></div>
|
||||
<pre id="editor2">minHeight = 2 lines</pre>
|
||||
<div class="scrollmargin"></div>
|
||||
<pre id="editor3" style="width: 40%;"></pre>
|
||||
<div class="scrollmargin"></div>
|
||||
<pre id="editor"></pre>
|
||||
|
||||
<script src="kitchen-sink/require.js"></script>
|
||||
|
|
@ -46,6 +47,13 @@ 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");
|
||||
|
|
|
|||
|
|
@ -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}/.test(s)) {
|
||||
if (!/at Object.InjectedScript.|@debugger eval|snippets:\/{3}|\(<anonymous>:\d+:\d+\)/.test(s)) {
|
||||
console.error("trying to access to global variable");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
72
demo/kitchen-sink/docs/sqlserver.sqlserver
Normal file
72
demo/kitchen-sink/docs/sqlserver.sqlserver
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
-- =============================================
|
||||
-- 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
|
||||
|
|
@ -2,15 +2,13 @@
|
|||
* 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");
|
||||
|
|
@ -20,15 +18,22 @@ 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(__dirname + "/../../build/src/ace.js", "utf8", function(err, data) {
|
||||
fs.readFile(path, "utf8", function(err, data) {
|
||||
if (err) data = err.message;
|
||||
var highlighted = highlighter.render(data, new JavaScriptMode(), theme);
|
||||
res.end(
|
||||
'<html><body>\n' +
|
||||
'<style type="text/css" media="screen">\n' +
|
||||
highlighted.css +
|
||||
'</style>\n' +
|
||||
highlighted.html +
|
||||
highlighted.html +
|
||||
'</body></html>'
|
||||
);
|
||||
});
|
||||
|
|
|
|||
59
experiments/debug_mem_leak.html
Normal file
59
experiments/debug_mem_leak.html
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<script src="../demo/kitchen-sink/require.js"></script>
|
||||
<script type="text/javascript">
|
||||
require.config({
|
||||
paths: { ace: "../lib/ace" },
|
||||
waitSeconds: 0
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<p><button onclick="toggleEditor()">Toggle editor</button></p>
|
||||
|
||||
<div id="container"></div>
|
||||
<script>
|
||||
var editor;
|
||||
var counter = 0
|
||||
|
||||
function toggleEditor() {
|
||||
if (!editor) {
|
||||
var root = document.createElement("div");
|
||||
root.style.height = "100px";
|
||||
root.setAttribute("id", "editor");
|
||||
root.textContent = "function foo(items) {\nvar x = 'All this is syntax highlighted';\nreturn x;\n}";
|
||||
|
||||
document.getElementById("container").appendChild(root);
|
||||
|
||||
editor = ace.edit(root);
|
||||
|
||||
if (counter++ % 2)
|
||||
editor.setTheme("ace/theme/monokai");
|
||||
else
|
||||
editor.setTheme("ace/theme/clouds");
|
||||
|
||||
editor.session.setMode("ace/mode/javascript");
|
||||
} else {
|
||||
editor.destroy();
|
||||
var el = editor.container;
|
||||
el.parentNode.removeChild(el);
|
||||
|
||||
editor.container = null
|
||||
editor.renderer = null
|
||||
|
||||
editor = null;
|
||||
|
||||
var root = document.getElementById("editor")
|
||||
if (root)
|
||||
root.parentNode.removeChild(root);
|
||||
}
|
||||
}
|
||||
require(["ace/ace"], function(ace) {
|
||||
window.ace = ace;
|
||||
toggleEditor();
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -99,72 +99,54 @@ var Anchor = exports.Anchor = function(doc, row, column) {
|
|||
* - `value`: An object describing the new Anchor position
|
||||
*
|
||||
**/
|
||||
this.onChange = function(e) {
|
||||
var delta = e.data;
|
||||
var range = delta.range;
|
||||
|
||||
if (range.start.row == range.end.row && range.start.row != this.row)
|
||||
this.onChange = function(delta) {
|
||||
if (delta.start.row == delta.end.row && delta.start.row != this.row)
|
||||
return;
|
||||
|
||||
if (range.start.row > this.row)
|
||||
if (delta.start.row > this.row)
|
||||
return;
|
||||
|
||||
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);
|
||||
|
||||
var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);
|
||||
this.setPosition(point.row, point.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.
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ module.exports = {
|
|||
var doc = new Document("juhu\nkinners");
|
||||
var anchor = new Anchor(doc, 1, 4);
|
||||
|
||||
doc.insertLines(1, ["123", "456"]);
|
||||
doc.insertFullLines(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.insertNewLine({row: 0, column: 0});
|
||||
doc.insertMergedLines({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.insertNewLine({row: 1, column: 2});
|
||||
doc.insertMergedLines({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.removeLines(1, 2);
|
||||
doc.removeFullLines(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.removeLines(1, 1);
|
||||
doc.removeFullLines(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.removeLines(0, 3);
|
||||
doc.removeFullLines(0, 3);
|
||||
assert.position(anchor.getPosition(), 0, 0);
|
||||
doc.insertLines(0, ["a", "b", "c"]);
|
||||
doc.insertFullLines(0, ["a", "b", "c"]);
|
||||
assert.position(anchor.getPosition(), 3, 0);
|
||||
assert.equal(doc.getValue(), "a\nb\nc\n");
|
||||
}
|
||||
|
|
|
|||
108
lib/ace/apply_delta.js
Normal file
108
lib/ace/apply_delta.js
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
/* ***** 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;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
@ -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.$gutterLayer.gutterWidth;
|
||||
pos.left += renderer.gutterWidth;
|
||||
|
||||
this.popup.show(pos, lineHeight);
|
||||
} else if (keepPopupPosition && !prefix) {
|
||||
|
|
@ -142,10 +142,11 @@ 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()
|
||||
if (el != text && ( !this.popup || el.parentNode != this.popup.container )
|
||||
&& el != this.tooltipNode && e.relatedTarget != this.tooltipNode
|
||||
&& e.relatedTarget != text
|
||||
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
|
||||
) {
|
||||
this.detach();
|
||||
}
|
||||
|
|
@ -349,7 +350,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);
|
||||
|
|
@ -416,7 +417,7 @@ Autocomplete.startCommand = {
|
|||
bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space"
|
||||
};
|
||||
|
||||
var FilteredList = function(array, filterText, mutateData) {
|
||||
var FilteredList = function(array, filterText) {
|
||||
this.all = array;
|
||||
this.filtered = array;
|
||||
this.filterText = filterText || "";
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
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;
|
||||
|
|
@ -221,8 +220,8 @@ var AcePopup = function(parentNode) {
|
|||
|
||||
popup.data = [];
|
||||
popup.setData = function(list) {
|
||||
popup.data = list || [];
|
||||
popup.setValue(lang.stringRepeat("\n", list.length), -1);
|
||||
popup.data = list || [];
|
||||
popup.setRow(0);
|
||||
};
|
||||
popup.getData = function(row) {
|
||||
|
|
|
|||
|
|
@ -68,11 +68,10 @@ 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;
|
||||
|
|
@ -172,13 +171,12 @@ var BackgroundTokenizer = function(tokenizer, editor) {
|
|||
}
|
||||
|
||||
this.$updateOnChange = function(delta) {
|
||||
var range = delta.range;
|
||||
var startRow = range.start.row;
|
||||
var len = range.end.row - startRow;
|
||||
var startRow = delta.start.row;
|
||||
var len = delta.end.row - startRow;
|
||||
|
||||
if (len === 0) {
|
||||
this.lines[startRow] = null;
|
||||
} else if (delta.action == "removeText" || delta.action == "removeLines") {
|
||||
} else if (delta.action == "remove") {
|
||||
this.lines.splice(startRow, len + 1, null);
|
||||
this.states.splice(startRow, len + 1, null);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -75,6 +75,49 @@ 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"]);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -423,6 +423,12 @@ exports.commands = [{
|
|||
exec: function() {},
|
||||
passEvent: true,
|
||||
readOnly: true
|
||||
}, {
|
||||
name: "copy",
|
||||
exec: function(editor) {
|
||||
// placeholder for replay macro
|
||||
},
|
||||
readOnly: true
|
||||
},
|
||||
|
||||
// commands disabled in readOnly mode
|
||||
|
|
@ -439,6 +445,12 @@ exports.commands = [{
|
|||
},
|
||||
scrollIntoView: "cursor",
|
||||
multiSelectAction: "forEach"
|
||||
}, {
|
||||
name: "paste",
|
||||
exec: function(editor, args) {
|
||||
editor.$handlePaste(args);
|
||||
},
|
||||
scrollIntoView: "cursor"
|
||||
}, {
|
||||
name: "removeline",
|
||||
bindKey: bindKey("Ctrl-D", "Command-D"),
|
||||
|
|
|
|||
|
|
@ -69,18 +69,14 @@ 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"},
|
||||
|
|
@ -88,42 +84,30 @@ 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(' '); },
|
||||
readOnly: true,
|
||||
isIncrementalSearchCommand: true
|
||||
exec: function(iSearch) { iSearch.addString(' '); }
|
||||
}, {
|
||||
name: "shrinkSearchTerm",
|
||||
bindKey: "backspace",
|
||||
exec: function(iSearch) {
|
||||
iSearch.removeChar();
|
||||
},
|
||||
readOnly: true,
|
||||
isIncrementalSearchCommand: true
|
||||
}
|
||||
}, {
|
||||
name: 'confirmSearch',
|
||||
bindKey: 'return',
|
||||
exec: function(iSearch) { iSearch.deactivate(); },
|
||||
readOnly: true,
|
||||
isIncrementalSearchCommand: true
|
||||
exec: function(iSearch) { iSearch.deactivate(); }
|
||||
}, {
|
||||
name: 'cancelSearch',
|
||||
bindKey: 'esc|Ctrl-G',
|
||||
exec: function(iSearch) { iSearch.deactivate(true); },
|
||||
readOnly: true,
|
||||
isIncrementalSearchCommand: true
|
||||
exec: function(iSearch) { iSearch.deactivate(true); }
|
||||
}, {
|
||||
name: 'occurisearch',
|
||||
bindKey: 'Ctrl-O',
|
||||
|
|
@ -131,9 +115,7 @@ exports.iSearchCommands = [{
|
|||
var options = oop.mixin({}, iSearch.$options);
|
||||
iSearch.deactivate();
|
||||
occurStartCommand.exec(iSearch.$editor, options);
|
||||
},
|
||||
readOnly: true,
|
||||
isIncrementalSearchCommand: true
|
||||
}
|
||||
}, {
|
||||
name: "yankNextWord",
|
||||
bindKey: "Ctrl-w",
|
||||
|
|
@ -142,9 +124,7 @@ 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",
|
||||
|
|
@ -153,15 +133,11 @@ 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'); },
|
||||
readOnly: true,
|
||||
isIncrementalSearchCommand: true
|
||||
exec: function(iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); }
|
||||
}, {
|
||||
name: 'selectAllMatches',
|
||||
bindKey: 'Ctrl-space',
|
||||
|
|
@ -173,18 +149,19 @@ 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();
|
||||
},
|
||||
readOnly: true,
|
||||
isIncrementalSearchCommand: true
|
||||
}];
|
||||
}
|
||||
}].map(function(cmd) {
|
||||
cmd.readOnly = true;
|
||||
cmd.isIncrementalSearchCommand = true;
|
||||
cmd.scrollIntoView = "animate-cursor";
|
||||
return cmd;
|
||||
});
|
||||
|
||||
function IncrementalSearchKeyboardHandler(iSearch) {
|
||||
this.$iSearch = iSearch;
|
||||
|
|
@ -192,7 +169,7 @@ function IncrementalSearchKeyboardHandler(iSearch) {
|
|||
|
||||
oop.inherits(IncrementalSearchKeyboardHandler, HashHandler);
|
||||
|
||||
;(function() {
|
||||
(function() {
|
||||
|
||||
this.attach = function(editor) {
|
||||
var iSearch = this.$iSearch;
|
||||
|
|
@ -201,15 +178,19 @@ oop.inherits(IncrementalSearchKeyboardHandler, HashHandler);
|
|||
if (!e.command.isIncrementalSearchCommand) return undefined;
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
return e.command.exec(iSearch, e.args || {});
|
||||
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;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
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) {
|
||||
|
|
@ -222,7 +203,7 @@ oop.inherits(IncrementalSearchKeyboardHandler, HashHandler);
|
|||
if (extendCmd) { return {command: extendCmd, args: key}; }
|
||||
}
|
||||
return {command: "null", passEvent: hashId == 0 || hashId == 4};
|
||||
}
|
||||
};
|
||||
|
||||
}).call(IncrementalSearchKeyboardHandler.prototype);
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ var AppConfig = require("./lib/app_config").AppConfig;
|
|||
module.exports = exports = new AppConfig();
|
||||
|
||||
var global = (function() {
|
||||
return this;
|
||||
return this || typeof window != "undefined" && window;
|
||||
})();
|
||||
|
||||
var options = {
|
||||
|
|
|
|||
|
|
@ -422,3 +422,30 @@
|
|||
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<<j) ? "border-" + x + "-radius: 3px;" : ""
|
||||
}).filter(Boolean).join(" ") + "}")
|
||||
}
|
||||
styles.join("\n")
|
||||
*/
|
||||
.ace_br1 {border-top-left-radius : 3px;}
|
||||
.ace_br2 {border-top-right-radius : 3px;}
|
||||
.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}
|
||||
.ace_br4 {border-bottom-right-radius: 3px;}
|
||||
.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}
|
||||
.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}
|
||||
.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}
|
||||
.ace_br8 {border-bottom-left-radius : 3px;}
|
||||
.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}
|
||||
.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}
|
||||
.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}
|
||||
.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}
|
||||
.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}
|
||||
.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}
|
||||
.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}
|
||||
|
|
|
|||
|
|
@ -32,36 +32,36 @@ define(function(require, exports, module) {
|
|||
"use strict";
|
||||
|
||||
var oop = require("./lib/oop");
|
||||
var applyDelta = require("./apply_delta").applyDelta;
|
||||
var EventEmitter = require("./lib/event_emitter").EventEmitter;
|
||||
var Range = require("./range").Range;
|
||||
var Anchor = require("./anchor").Anchor;
|
||||
|
||||
/**
|
||||
* Contains the text of the document. Document can be attached to several [[EditSession `EditSession`]]s.
|
||||
*
|
||||
* At its core, `Document`s are just an array of strings, with each row in the document matching up to the array index.
|
||||
*
|
||||
* @class Document
|
||||
**/
|
||||
|
||||
/**
|
||||
/**
|
||||
*
|
||||
* Creates a new `Document`. If `text` is included, the `Document` contains those strings; otherwise, it's empty.
|
||||
* @param {String | Array} text The starting text
|
||||
* @constructor
|
||||
**/
|
||||
|
||||
var Document = function(text) {
|
||||
this.$lines = [];
|
||||
var Document = function(textOrLines) {
|
||||
this.$lines = [""];
|
||||
|
||||
// There has to be one line at least in the document. If you pass an empty
|
||||
// string to the insert function, nothing will happen. Workaround.
|
||||
if (text.length === 0) {
|
||||
if (textOrLines.length === 0) {
|
||||
this.$lines = [""];
|
||||
} else if (Array.isArray(text)) {
|
||||
this._insertLines(0, text);
|
||||
} else if (Array.isArray(textOrLines)) {
|
||||
this.insertMergedLines({row: 0, column: 0}, textOrLines);
|
||||
} else {
|
||||
this.insert({row: 0, column:0}, text);
|
||||
this.insert({row: 0, column:0}, textOrLines);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -75,9 +75,9 @@ var Document = function(text) {
|
|||
* @param {String} text The text to use
|
||||
**/
|
||||
this.setValue = function(text) {
|
||||
var len = this.getLength();
|
||||
this.remove(new Range(0, 0, len, this.getLine(len-1).length));
|
||||
this.insert({row: 0, column:0}, text);
|
||||
var len = this.getLength() - 1;
|
||||
this.remove(new Range(0, 0, len, this.getLine(len).length));
|
||||
this.insert({row: 0, column: 0}, text);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -98,7 +98,7 @@ var Document = function(text) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Splits a string of text on any newline (`\n`) or carriage-return ('\r') characters.
|
||||
* Splits a string of text on any newline (`\n`) or carriage-return (`\r`) characters.
|
||||
*
|
||||
* @method $split
|
||||
* @param {String} text The text to work with
|
||||
|
|
@ -107,14 +107,15 @@ var Document = function(text) {
|
|||
**/
|
||||
|
||||
// check for IE split bug
|
||||
if ("aaa".split(/a/).length === 0)
|
||||
if ("aaa".split(/a/).length === 0) {
|
||||
this.$split = function(text) {
|
||||
return text.replace(/\r\n|\r/g, "\n").split("\n");
|
||||
};
|
||||
else
|
||||
} else {
|
||||
this.$split = function(text) {
|
||||
return text.split(/\r\n|\r|\n/);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
this.$detectNewLine = function(text) {
|
||||
|
|
@ -207,32 +208,49 @@ var Document = function(text) {
|
|||
};
|
||||
|
||||
/**
|
||||
* [Given a range within the document, this function returns all the text within that range as a single string.]{: #Document.getTextRange.desc}
|
||||
* @param {Range} range The range to work with
|
||||
* Returns all the text within `range` as a single string.
|
||||
* @param {Range} range The range to work with.
|
||||
*
|
||||
* @returns {String}
|
||||
**/
|
||||
this.getTextRange = function(range) {
|
||||
if (range.start.row == range.end.row) {
|
||||
return this.getLine(range.start.row)
|
||||
.substring(range.start.column, range.end.column);
|
||||
return this.getLinesForRange(range).join(this.getNewLineCharacter());
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns all the text within `range` as an array of lines.
|
||||
* @param {Range} range The range to work with.
|
||||
*
|
||||
* @returns {Array}
|
||||
**/
|
||||
this.getLinesForRange = function(range) {
|
||||
var lines;
|
||||
if (range.start.row === range.end.row) {
|
||||
// Handle a single-line range.
|
||||
lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];
|
||||
} else {
|
||||
// Handle a multi-line range.
|
||||
lines = this.getLines(range.start.row, range.end.row);
|
||||
lines[0] = (lines[0] || "").substring(range.start.column);
|
||||
var l = lines.length - 1;
|
||||
if (range.end.row - range.start.row == l)
|
||||
lines[l] = lines[l].substring(0, range.end.column);
|
||||
}
|
||||
var lines = this.getLines(range.start.row, range.end.row);
|
||||
lines[0] = (lines[0] || "").substring(range.start.column);
|
||||
var l = lines.length - 1;
|
||||
if (range.end.row - range.start.row == l)
|
||||
lines[l] = lines[l].substring(0, range.end.column);
|
||||
return lines.join(this.getNewLineCharacter());
|
||||
return lines;
|
||||
};
|
||||
|
||||
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 if (position.row < 0)
|
||||
position.row = 0;
|
||||
return position;
|
||||
// Deprecated methods retained for backwards compatibility.
|
||||
this.insertLines = function(row, lines) {
|
||||
console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead.");
|
||||
return this.insertFullLines(row, lines);
|
||||
};
|
||||
this.removeLines = function(firstRow, lastRow) {
|
||||
console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead.");
|
||||
return this.removeFullLines(firstRow, lastRow);
|
||||
};
|
||||
this.insertNewLine = function(position) {
|
||||
console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead.");
|
||||
return this.insertMergedLines(position, ["", ""]);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -243,53 +261,97 @@ var Document = function(text) {
|
|||
*
|
||||
**/
|
||||
this.insert = function(position, text) {
|
||||
if (!text || text.length === 0)
|
||||
return position;
|
||||
|
||||
position = this.$clipPosition(position);
|
||||
|
||||
// only detect new lines if the document has no line break yet
|
||||
// Only detect new lines if the document has no line break yet.
|
||||
if (this.getLength() <= 1)
|
||||
this.$detectNewLine(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 this.insertMergedLines(position, this.$split(text));
|
||||
};
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @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;
|
||||
};
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
**/
|
||||
* 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, starting at the row index given by `row`. This method also triggers the `'change'` event.
|
||||
* 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:
|
||||
|
|
@ -302,101 +364,57 @@ var Document = function(text) {
|
|||
* ```
|
||||
*
|
||||
**/
|
||||
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;
|
||||
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 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,
|
||||
/**
|
||||
* 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
|
||||
};
|
||||
|
||||
this.applyDelta({
|
||||
start: start,
|
||||
end: end,
|
||||
action: "insert",
|
||||
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:<br/>
|
||||
* ```
|
||||
* {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) {
|
||||
if (text.length == 0)
|
||||
return position;
|
||||
|
||||
var line = this.$lines[position.row] || "";
|
||||
|
||||
this.$lines[position.row] = line.substring(0, position.column) + text
|
||||
+ line.substring(position.column);
|
||||
|
||||
var end = {
|
||||
row : position.row,
|
||||
column : position.column + text.length
|
||||
};
|
||||
|
||||
var delta = {
|
||||
action: "insertText",
|
||||
range: Range.fromPoints(position, end),
|
||||
text: text
|
||||
};
|
||||
this._signal("change", { data: delta });
|
||||
|
||||
return end;
|
||||
});
|
||||
|
||||
return this.clonePos(end);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -406,113 +424,90 @@ var Document = function(text) {
|
|||
*
|
||||
**/
|
||||
this.remove = function(range) {
|
||||
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;
|
||||
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);
|
||||
};
|
||||
|
||||
/**
|
||||
* 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.<br/>If `startColumn` is equal to `endColumn`, this function returns nothing.
|
||||
*
|
||||
**/
|
||||
* 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.<br/>If `startColumn` is equal to `endColumn`, this function returns nothing.
|
||||
*
|
||||
**/
|
||||
this.removeInLine = function(row, startColumn, endColumn) {
|
||||
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;
|
||||
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);
|
||||
};
|
||||
|
||||
/**
|
||||
* 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.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;
|
||||
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;
|
||||
};
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
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 });
|
||||
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: ["", ""]
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -526,9 +521,9 @@ var Document = function(text) {
|
|||
*
|
||||
**/
|
||||
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
|
||||
|
|
@ -537,55 +532,106 @@ var Document = function(text) {
|
|||
return range.end;
|
||||
|
||||
this.remove(range);
|
||||
var end;
|
||||
if (text) {
|
||||
var end = this.insert(range.start, text);
|
||||
end = this.insert(range.start, text);
|
||||
}
|
||||
else {
|
||||
end = range.start;
|
||||
}
|
||||
|
||||
|
||||
return end;
|
||||
};
|
||||
|
||||
/**
|
||||
* Applies all the changes previously accumulated. These can be either `'insertText'`, `'insertLines'`, `'removeText'`, and `'removeLines'`.
|
||||
* Applies all changes in `deltas` to the document.
|
||||
* @param {Array} deltas An array of delta objects (can include "insert" and "remove" actions)
|
||||
**/
|
||||
this.applyDeltas = function(deltas) {
|
||||
for (var i=0; i<deltas.length; i++) {
|
||||
var delta = deltas[i];
|
||||
var range = Range.fromPoints(delta.range.start, delta.range.end);
|
||||
|
||||
if (delta.action == "insertLines")
|
||||
this.insertLines(range.start.row, delta.lines);
|
||||
else if (delta.action == "insertText")
|
||||
this.insert(range.start, delta.text);
|
||||
else if (delta.action == "removeLines")
|
||||
this._removeLines(range.start.row, range.end.row - 1);
|
||||
else if (delta.action == "removeText")
|
||||
this.remove(range);
|
||||
this.applyDelta(deltas[i]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Reverts any changes previously applied. These can be either `'insertText'`, `'insertLines'`, `'removeText'`, and `'removeLines'`.
|
||||
* Reverts all changes in `deltas` from the document.
|
||||
* @param {Array} deltas An array of delta objects (can include "insert" and "remove" actions)
|
||||
**/
|
||||
this.revertDeltas = function(deltas) {
|
||||
for (var i=deltas.length-1; i>=0; 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);
|
||||
this.revertDelta(deltas[i]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ module.exports = {
|
|||
var doc = new Document(["12", "34"]);
|
||||
|
||||
var deltas = [];
|
||||
doc.on("change", function(e) { deltas.push(e.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
doc.insertNewLine({row: 0, column: 1});
|
||||
doc.insertMergedLines({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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
doc.insertLines(0, ["aa", "bb"]);
|
||||
doc.insertFullLines(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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
doc.insertLines(2, ["aa", "bb"]);
|
||||
doc.insertFullLines(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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
doc.insertLines(1, ["aa", "bb"]);
|
||||
doc.insertFullLines(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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
doc.insert({row: 2, column: 0}, "aa\nbb\ncc");
|
||||
doc.insert({row: 1, column: 2}, "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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
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.data); });
|
||||
doc.on("change", function(e) { deltas.push(e); });
|
||||
|
||||
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.removeLines(1, 2);
|
||||
var removed = doc.removeFullLines(1, 2);
|
||||
assert.equal(removed.join("\n"), ["5678", "abcd"].join("\n"));
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -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,13 +249,12 @@ var EditSession = function(text, mode) {
|
|||
this.$resetRowCache(fold.start.row);
|
||||
};
|
||||
|
||||
this.onChange = function(e) {
|
||||
var delta = e.data;
|
||||
this.onChange = function(delta) {
|
||||
this.$modified = true;
|
||||
|
||||
this.$resetRowCache(delta.range.start.row);
|
||||
this.$resetRowCache(delta.start.row);
|
||||
|
||||
var removedFolds = this.$updateInternalDataOnChange(e);
|
||||
var removedFolds = this.$updateInternalDataOnChange(delta);
|
||||
if (!this.$fromUndo && this.$undoManager && !delta.ignore) {
|
||||
this.$deltasDoc.push(delta);
|
||||
if (removedFolds && removedFolds.length != 0) {
|
||||
|
|
@ -269,7 +268,7 @@ var EditSession = function(text, mode) {
|
|||
}
|
||||
|
||||
this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);
|
||||
this._signal("change", e);
|
||||
this._signal("change", delta);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -679,10 +678,10 @@ var EditSession = function(text, mode) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Returns an array containing the IDs of all the markers, either front or back.
|
||||
* Returns an object containing all of the markers, either front or back.
|
||||
* @param {Boolean} inFront If `true`, indicates you only want front markers; `false` indicates only back markers
|
||||
*
|
||||
* @returns {Array}
|
||||
* @returns {Object}
|
||||
**/
|
||||
this.getMarkers = function(inFront) {
|
||||
return inFront ? this.$frontMarkers : this.$backMarkers;
|
||||
|
|
@ -1146,6 +1145,19 @@ 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.
|
||||
|
|
@ -1222,39 +1234,36 @@ var EditSession = function(text, mode) {
|
|||
|
||||
this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {
|
||||
function isInsert(delta) {
|
||||
var insert =
|
||||
delta.action === "insertText" || delta.action === "insertLines";
|
||||
return isUndo ? !insert : insert;
|
||||
return isUndo ? delta.action !== "insert" : delta.action === "insert";
|
||||
}
|
||||
|
||||
var delta = deltas[0];
|
||||
var range, point;
|
||||
var lastDeltaIsInsert = false;
|
||||
if (isInsert(delta)) {
|
||||
range = Range.fromPoints(delta.range.start, delta.range.end);
|
||||
range = Range.fromPoints(delta.start, delta.end);
|
||||
lastDeltaIsInsert = true;
|
||||
} else {
|
||||
range = Range.fromPoints(delta.range.start, delta.range.start);
|
||||
range = Range.fromPoints(delta.start, delta.start);
|
||||
lastDeltaIsInsert = false;
|
||||
}
|
||||
|
||||
for (var i = 1; i < deltas.length; i++) {
|
||||
delta = deltas[i];
|
||||
if (isInsert(delta)) {
|
||||
point = delta.range.start;
|
||||
point = delta.start;
|
||||
if (range.compare(point.row, point.column) == -1) {
|
||||
range.setStart(delta.range.start);
|
||||
range.setStart(point);
|
||||
}
|
||||
point = delta.range.end;
|
||||
point = delta.end;
|
||||
if (range.compare(point.row, point.column) == 1) {
|
||||
range.setEnd(delta.range.end);
|
||||
range.setEnd(point);
|
||||
}
|
||||
lastDeltaIsInsert = true;
|
||||
} else {
|
||||
point = delta.range.start;
|
||||
point = delta.start;
|
||||
if (range.compare(point.row, point.column) == -1) {
|
||||
range =
|
||||
Range.fromPoints(delta.range.start, delta.range.start);
|
||||
range = Range.fromPoints(delta.start, delta.start);
|
||||
}
|
||||
lastDeltaIsInsert = false;
|
||||
}
|
||||
|
|
@ -1368,7 +1377,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.insert({row: row, column:0}, indentString);
|
||||
this.doc.insertInLine({row: row, column: 0}, indentString);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1425,11 +1434,11 @@ var EditSession = function(text, mode) {
|
|||
x.end.row += diff;
|
||||
return x;
|
||||
});
|
||||
|
||||
|
||||
var lines = dir == 0
|
||||
? this.doc.getLines(firstRow, lastRow)
|
||||
: this.doc.removeLines(firstRow, lastRow);
|
||||
this.doc.insertLines(firstRow+diff, lines);
|
||||
: this.doc.removeFullLines(firstRow, lastRow);
|
||||
this.doc.insertFullLines(firstRow+diff, lines);
|
||||
folds.length && this.addFolds(folds);
|
||||
return diff;
|
||||
};
|
||||
|
|
@ -1439,8 +1448,6 @@ 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);
|
||||
|
|
@ -1451,8 +1458,6 @@ 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);
|
||||
|
|
@ -1656,34 +1661,23 @@ var EditSession = function(text, mode) {
|
|||
};
|
||||
};
|
||||
|
||||
this.$updateInternalDataOnChange = function(e) {
|
||||
this.$updateInternalDataOnChange = function(delta) {
|
||||
var useWrapMode = this.$useWrapMode;
|
||||
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 action = delta.action;
|
||||
var start = delta.start;
|
||||
var end = delta.end;
|
||||
var firstRow = start.row;
|
||||
var lastRow = end.row;
|
||||
var len = lastRow - firstRow;
|
||||
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.indexOf("remove") != -1) {
|
||||
if (action === "remove") {
|
||||
this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len);
|
||||
|
||||
var foldLines = this.$foldData;
|
||||
removedFolds = this.getFoldsInRange(e.data.range);
|
||||
removedFolds = this.getFoldsInRange(delta);
|
||||
this.removeFolds(removedFolds);
|
||||
|
||||
var foldLine = this.getFoldLine(end.row);
|
||||
|
|
@ -1748,10 +1742,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(e.data.range.start.column - e.data.range.end.column);
|
||||
if (action.indexOf("remove") != -1) {
|
||||
len = Math.abs(delta.start.column - delta.end.column);
|
||||
if (action === "remove") {
|
||||
// Get all the folds in the change range and remove them.
|
||||
removedFolds = this.getFoldsInRange(e.data.range);
|
||||
removedFolds = this.getFoldsInRange(delta);
|
||||
this.removeFolds(removedFolds);
|
||||
|
||||
len = -len;
|
||||
|
|
@ -1835,7 +1829,7 @@ var EditSession = function(text, mode) {
|
|||
TAB_SPACE = 12;
|
||||
|
||||
|
||||
this.$computeWrapSplits = function(tokens, wrapLimit) {
|
||||
this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) {
|
||||
if (tokens.length == 0) {
|
||||
return [];
|
||||
}
|
||||
|
|
@ -1846,6 +1840,31 @@ 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);
|
||||
|
||||
|
|
@ -1862,14 +1881,18 @@ var EditSession = function(text, mode) {
|
|||
len -= 1;
|
||||
});
|
||||
|
||||
if (!splits.length) {
|
||||
indent = getWrapIndent();
|
||||
splits.indent = indent;
|
||||
}
|
||||
lastDocSplit += len;
|
||||
splits.push(lastDocSplit);
|
||||
lastSplit = screenPos;
|
||||
}
|
||||
|
||||
while (displayLength - lastSplit > wrapLimit) {
|
||||
var indent = 0;
|
||||
while (displayLength - lastSplit > wrapLimit - indent) {
|
||||
// This is, where the split should be.
|
||||
var split = lastSplit + wrapLimit;
|
||||
var split = lastSplit + wrapLimit - indent;
|
||||
|
||||
// If there is a space or tab at this split position, then making
|
||||
// a split is simple.
|
||||
|
|
@ -1929,7 +1952,7 @@ var EditSession = function(text, mode) {
|
|||
|
||||
// === ELSE ===
|
||||
// Search for the first non space/tab/placeholder/punctuation token backwards.
|
||||
var minSplit = Math.max(split - (isCode ? 10 : wrapLimit-(wrapLimit>>2)), lastSplit - 1);
|
||||
var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1);
|
||||
while (split > minSplit && tokens[split] < PLACEHOLDER_START) {
|
||||
split --;
|
||||
}
|
||||
|
|
@ -1957,7 +1980,7 @@ var EditSession = function(text, mode) {
|
|||
// around -> force a split.
|
||||
if (tokens[split] == CHAR_EXT)
|
||||
split--;
|
||||
addSplit(split);
|
||||
addSplit(split - indent);
|
||||
}
|
||||
return splits;
|
||||
};
|
||||
|
|
@ -2064,6 +2087,16 @@ 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
|
||||
|
|
@ -2201,20 +2234,21 @@ 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)[1];
|
||||
docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1];
|
||||
|
||||
// We remove one character at the end so that the docColumn
|
||||
// position returned is not associated to the next row on the screen.
|
||||
|
|
@ -2306,6 +2340,7 @@ 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];
|
||||
|
|
@ -2318,12 +2353,13 @@ var EditSession = function(text, mode) {
|
|||
textLine = textLine.substring(
|
||||
wrapRow[screenRowOffset - 1] || 0, textLine.length
|
||||
);
|
||||
wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
row: screenRow,
|
||||
column: this.$getStringScreenWidth(textLine)[0]
|
||||
column: wrapIndent + this.$getStringScreenWidth(textLine)[0]
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -2503,6 +2539,7 @@ config.defineOptions(EditSession.prototype, "session", {
|
|||
},
|
||||
initialValue: "auto"
|
||||
},
|
||||
indentedSoftWrap: { initialValue: true },
|
||||
firstLineNumber: {
|
||||
set: function() {this._signal("changeBreakpoint");},
|
||||
initialValue: 1
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ function BracketMatch() {
|
|||
typeRe = new RegExp(
|
||||
"(\\.?" +
|
||||
token.type.replace(".", "\\.").replace("rparen", ".paren")
|
||||
.replace(/\b(?:end|start|begin)\b/, "")
|
||||
.replace(/\b(?:end)\b/, "(?:start|begin|end)")
|
||||
+ ")+"
|
||||
);
|
||||
}
|
||||
|
|
@ -174,7 +174,7 @@ function BracketMatch() {
|
|||
typeRe = new RegExp(
|
||||
"(\\.?" +
|
||||
token.type.replace(".", "\\.").replace("lparen", ".paren")
|
||||
.replace(/\b(?:end|start|begin)\b/, "")
|
||||
.replace(/\b(?:start|begin)\b/, "(?:start|begin|end)")
|
||||
+ ")+"
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -829,15 +829,13 @@ function Folding() {
|
|||
}
|
||||
};
|
||||
|
||||
this.updateFoldWidgets = function(e) {
|
||||
var delta = e.data;
|
||||
var range = delta.range;
|
||||
var firstRow = range.start.row;
|
||||
var len = range.end.row - firstRow;
|
||||
this.updateFoldWidgets = function(delta) {
|
||||
var firstRow = delta.start.row;
|
||||
var len = delta.end.row - firstRow;
|
||||
|
||||
if (len === 0) {
|
||||
this.foldWidgets[firstRow] = null;
|
||||
} else if (delta.action == "removeText" || delta.action == "removeLines") {
|
||||
} else if (delta.action == 'remove') {
|
||||
this.foldWidgets.splice(firstRow, len + 1, null);
|
||||
} else {
|
||||
var args = Array(len + 1);
|
||||
|
|
|
|||
|
|
@ -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,7 +380,8 @@ 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]);
|
||||
|
|
@ -388,6 +389,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
EditSession.prototype.$wrapAsCode = true;
|
||||
EditSession.prototype.$indentedSoftWrap = false;
|
||||
// Basic splitting.
|
||||
computeAndAssert("foo bar foo bar", [ 12 ]);
|
||||
computeAndAssert("foo bar f bar", [ 12 ]);
|
||||
|
|
@ -413,16 +415,26 @@ module.exports = {
|
|||
computeAndAssert("ぁぁ", [1], 2);
|
||||
computeAndAssert(" ぁぁ", [1, 2], 2);
|
||||
computeAndAssert(" ぁ\tぁ", [1, 3], 2);
|
||||
computeAndAssert(" ぁぁ\tぁ", [1, 4], 4);
|
||||
computeAndAssert(" ぁぁ\tぁ", [2, 4], 4);
|
||||
computeAndAssert("ぁぁ ぁぁ\tぁ", [3, 6], 6);
|
||||
|
||||
// Test wrapping for punctuation.
|
||||
computeAndAssert(" ab.c;ef++", [1, 3, 5, 7, 8], 2);
|
||||
computeAndAssert(" ab.c;ef++", [2, 4, 6, 8], 2);
|
||||
computeAndAssert(" ab.c;ef++", [3, 5, 8], 3);
|
||||
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() {
|
||||
|
|
@ -430,12 +442,12 @@ module.exports = {
|
|||
session.setTabSize(4);
|
||||
assert.equal(session.getScreenWidth(), 2);
|
||||
|
||||
session.doc.insertNewLine({row: 0, column: Infinity});
|
||||
session.doc.insertLines(1, ["123"]);
|
||||
session.doc.insertMergedLines({row: 0, column: Infinity}, ['', '']);
|
||||
session.doc.insertFullLines(1, ["123"]);
|
||||
assert.equal(session.getScreenWidth(), 3);
|
||||
|
||||
session.doc.insertNewLine({row: 0, column: Infinity});
|
||||
session.doc.insertLines(1, ["\t\t"]);
|
||||
session.doc.insertMergedLines({row: 0, column: Infinity}, ['', '']);
|
||||
session.doc.insertFullLines(1, ["\t\t"]);
|
||||
|
||||
assert.equal(session.getScreenWidth(), 8);
|
||||
|
||||
|
|
@ -459,9 +471,9 @@ module.exports = {
|
|||
|
||||
session.setUseWrapMode(true);
|
||||
|
||||
document.insertLines(0, ["a", "b"]);
|
||||
document.insertLines(2, ["c", "d"]);
|
||||
document.removeLines(1, 2);
|
||||
document.insertFullLines(0, ["a", "b"]);
|
||||
document.insertFullLines(2, ["c", "d"]);
|
||||
document.removeFullLines(1, 2);
|
||||
},
|
||||
|
||||
"test wrapMode init has to create wrapData array": function() {
|
||||
|
|
|
|||
|
|
@ -162,8 +162,12 @@ var Editor = function(renderer, session) {
|
|||
var command = this.curOp.command;
|
||||
if (command.name && this.$blockScrolling > 0)
|
||||
this.$blockScrolling--;
|
||||
if (command && command.scrollIntoView) {
|
||||
switch (command.scrollIntoView) {
|
||||
var scrollIntoView = command && command.scrollIntoView;
|
||||
if (scrollIntoView) {
|
||||
switch (scrollIntoView) {
|
||||
case "center-animate":
|
||||
scrollIntoView = "animate";
|
||||
/* fall through */
|
||||
case "center":
|
||||
this.renderer.scrollCursorIntoView(null, 0.5);
|
||||
break;
|
||||
|
|
@ -181,7 +185,7 @@ var Editor = function(renderer, session) {
|
|||
default:
|
||||
break;
|
||||
}
|
||||
if (command.scrollIntoView == "animate")
|
||||
if (scrollIntoView == "animate")
|
||||
this.renderer.animateScrolling(this.curOp.scrollTop);
|
||||
}
|
||||
|
||||
|
|
@ -274,6 +278,10 @@ var Editor = function(renderer, session) {
|
|||
this.setSession = function(session) {
|
||||
if (this.session == session)
|
||||
return;
|
||||
|
||||
// make sure operationEnd events are not emitted to wrong session
|
||||
if (this.curOp) this.endOperation();
|
||||
this.curOp = {};
|
||||
|
||||
var oldSession = this.session;
|
||||
if (oldSession) {
|
||||
|
|
@ -373,6 +381,8 @@ var Editor = function(renderer, session) {
|
|||
oldSession: oldSession
|
||||
});
|
||||
|
||||
this.curOp = null;
|
||||
|
||||
oldSession && oldSession._signal("changeEditor", {oldEditor: this});
|
||||
session && session._signal("changeEditor", {editor: this});
|
||||
};
|
||||
|
|
@ -682,20 +692,15 @@ var Editor = function(renderer, session) {
|
|||
*
|
||||
*
|
||||
**/
|
||||
this.onDocumentChange = function(e) {
|
||||
var delta = e.data;
|
||||
var range = delta.range;
|
||||
var lastRow;
|
||||
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);
|
||||
|
||||
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._signal("change", delta);
|
||||
|
||||
// Update cursor because tab characters can influence the cursor position.
|
||||
this.$cursorChange();
|
||||
this.$updateHighlightActiveLine();
|
||||
};
|
||||
|
|
@ -910,14 +915,16 @@ var Editor = function(renderer, session) {
|
|||
*
|
||||
*
|
||||
**/
|
||||
this.onPaste = function(text) {
|
||||
// todo this should change when paste becomes a command
|
||||
if (this.$readOnly)
|
||||
return;
|
||||
|
||||
var e = {text: text};
|
||||
this.onPaste = function(text, event) {
|
||||
var e = {text: text, event: event};
|
||||
this.commands.exec("paste", this, e);
|
||||
};
|
||||
|
||||
this.$handlePaste = function(e) {
|
||||
if (typeof e == "string")
|
||||
e = {text: e};
|
||||
this._signal("paste", e);
|
||||
text = e.text;
|
||||
var text = e.text;
|
||||
if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {
|
||||
this.insert(text);
|
||||
} else {
|
||||
|
|
@ -935,7 +942,6 @@ var Editor = function(renderer, session) {
|
|||
this.session.insert(range.start, lines[i]);
|
||||
}
|
||||
}
|
||||
this.renderer.scrollCursorIntoView();
|
||||
};
|
||||
|
||||
this.execCommand = function(command, args) {
|
||||
|
|
@ -1623,15 +1629,7 @@ var Editor = function(renderer, session) {
|
|||
**/
|
||||
this.removeLines = function() {
|
||||
var rows = this.$getSelectedRows();
|
||||
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.session.removeFullLines(rows.first, rows.last);
|
||||
this.clearSelection();
|
||||
};
|
||||
|
||||
|
|
@ -2684,6 +2682,7 @@ config.defineOptions(Editor.prototype, "editor", {
|
|||
useSoftTabs: "session",
|
||||
tabSize: "session",
|
||||
wrap: "session",
|
||||
indentedSoftWrap: "session",
|
||||
foldStyle: "session",
|
||||
mode: "session"
|
||||
});
|
||||
|
|
|
|||
|
|
@ -578,15 +578,14 @@ var onSelectionChange = function(evt) {
|
|||
* and deleting text.
|
||||
* @param {!Event} evt The event.
|
||||
*/
|
||||
var onChange = function(evt) {
|
||||
var data = evt.data;
|
||||
var onChange = function(delta) {
|
||||
switch (data.action) {
|
||||
case 'removeText':
|
||||
case 'remove':
|
||||
cvox.Api.speak(data.text, 0, DELETED_PROP);
|
||||
/* Let the future cursor change event know it's from text change. */
|
||||
changed = true;
|
||||
break;
|
||||
case 'insertText':
|
||||
case 'insert':
|
||||
cvox.Api.speak(data.text, 0);
|
||||
/* Let the future cursor change event know it's from text change. */
|
||||
changed = true;
|
||||
|
|
|
|||
|
|
@ -44,13 +44,12 @@ var ElasticTabstopsLite = function(editor) {
|
|||
this.onExec = function() {
|
||||
recordChanges = true;
|
||||
};
|
||||
this.onChange = function(e) {
|
||||
var range = e.data.range
|
||||
this.onChange = function(delta) {
|
||||
if (recordChanges) {
|
||||
if (changedRows.indexOf(range.start.row) == -1)
|
||||
changedRows.push(range.start.row);
|
||||
if (range.end.row != range.start.row)
|
||||
changedRows.push(range.end.row);
|
||||
if (changedRows.indexOf(delta.start.row) == -1)
|
||||
changedRows.push(delta.start.row);
|
||||
if (delta.end.row != delta.start.row)
|
||||
changedRows.push(delta.end.row);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -393,7 +393,7 @@ exports.updateCommands = function(editor, enabled) {
|
|||
};
|
||||
|
||||
exports.isSupportedMode = function(modeId) {
|
||||
return modeId && /css|less|scss|sass|stylus|html|php|twig|ejs/.test(modeId);
|
||||
return modeId && /css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(modeId);
|
||||
};
|
||||
|
||||
var onChangeMode = function(e, target) {
|
||||
|
|
|
|||
|
|
@ -155,7 +155,6 @@ function getCompletionPrefix(editor) {
|
|||
|
||||
var doLiveAutocomplete = function(e) {
|
||||
var editor = e.editor;
|
||||
var text = e.args || "";
|
||||
var hasCompleter = editor.completer && editor.completer.activated;
|
||||
|
||||
// We don't want to autocomplete with no prefix
|
||||
|
|
|
|||
|
|
@ -117,12 +117,13 @@ var supportedModes = {
|
|||
MUSHCode: ["mc|mush"],
|
||||
MySQL: ["mysql"],
|
||||
Nix: ["nix"],
|
||||
Nim: ["nim"],
|
||||
ObjectiveC: ["m|mm"],
|
||||
OCaml: ["ml|mli"],
|
||||
Pascal: ["pas|p"],
|
||||
Perl: ["pl|pm"],
|
||||
pgSQL: ["pgsql"],
|
||||
PHP: ["php|phtml"],
|
||||
PHP: ["php|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp"],
|
||||
Powershell: ["ps1"],
|
||||
Praat: ["praat|praatscript|psc|proc"],
|
||||
Prolog: ["plg|prolog"],
|
||||
|
|
@ -146,6 +147,7 @@ var supportedModes = {
|
|||
Soy_Template:["soy"],
|
||||
Space: ["space"],
|
||||
SQL: ["sql"],
|
||||
SQLServer: ["sqlserver"],
|
||||
Stylus: ["styl|stylus"],
|
||||
SVG: ["svg"],
|
||||
Tcl: ["tcl"],
|
||||
|
|
|
|||
|
|
@ -37,6 +37,10 @@ var baseStyles = require("../requirejs/text!./static.css");
|
|||
var config = require("../config");
|
||||
var dom = require("../lib/dom");
|
||||
|
||||
var SimpleTextLayer = function() {
|
||||
this.config = {};
|
||||
};
|
||||
SimpleTextLayer.prototype = TextLayer.prototype;
|
||||
|
||||
var highlight = function(el, opts, callback) {
|
||||
var m = el.className.match(/lang-(\w+)/);
|
||||
|
|
@ -149,12 +153,8 @@ highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) {
|
|||
session.setUseWorker(false);
|
||||
session.setMode(mode);
|
||||
|
||||
var textLayer = new TextLayer(document.createElement("div"));
|
||||
var textLayer = new SimpleTextLayer();
|
||||
textLayer.setSession(session);
|
||||
textLayer.config = {
|
||||
characterWidth: 10,
|
||||
lineHeight: 20
|
||||
};
|
||||
|
||||
session.setValue(input);
|
||||
|
||||
|
|
|
|||
|
|
@ -51,12 +51,14 @@ 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"],
|
||||
|
|
@ -71,6 +73,7 @@ var themeData = [
|
|||
["Solarized Dark" ,"solarized_dark" , "dark"],
|
||||
["Terminal" ,"terminal" , "dark"],
|
||||
["Tomorrow Night" ,"tomorrow_night" , "dark"],
|
||||
["The Night After Tomorrow" ,"the_night_after_tomorrow" , "dark"],
|
||||
["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"],
|
||||
["Tomorrow Night Bright","tomorrow_night_bright" , "dark"],
|
||||
["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"],
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -87,9 +87,12 @@ MultiHashHandler.prototype = HashHandler.prototype;
|
|||
}
|
||||
};
|
||||
|
||||
this.bindKey = function(key, command, asDefault) {
|
||||
if (typeof key == "object")
|
||||
this.bindKey = function(key, command, position) {
|
||||
if (typeof key == "object") {
|
||||
if (position == undefined)
|
||||
position = key.position;
|
||||
key = key[this.platform];
|
||||
}
|
||||
if (!key)
|
||||
return;
|
||||
if (typeof command == "function")
|
||||
|
|
@ -110,11 +113,15 @@ MultiHashHandler.prototype = HashHandler.prototype;
|
|||
}
|
||||
var binding = this.parseKeys(keyPart);
|
||||
var id = KEY_MODS[binding.hashId] + binding.key;
|
||||
this._addCommandToBinding(chain + id, command, asDefault);
|
||||
this._addCommandToBinding(chain + id, command, position);
|
||||
}, this);
|
||||
};
|
||||
|
||||
this._addCommandToBinding = function(keyId, command, asDefault) {
|
||||
function getPosition(command) {
|
||||
return typeof command == "object" && command.bindKey
|
||||
&& command.bindKey.position || 0;
|
||||
}
|
||||
this._addCommandToBinding = function(keyId, command, position) {
|
||||
var ckb = this.commandKeyBinding, i;
|
||||
if (!command) {
|
||||
delete ckb[keyId];
|
||||
|
|
@ -126,11 +133,21 @@ MultiHashHandler.prototype = HashHandler.prototype;
|
|||
} else if ((i = ckb[keyId].indexOf(command)) != -1) {
|
||||
ckb[keyId].splice(i, 1);
|
||||
}
|
||||
|
||||
if (asDefault || command.isDefault)
|
||||
ckb[keyId].unshift(command);
|
||||
else
|
||||
ckb[keyId].push(command);
|
||||
|
||||
if (typeof position != "number") {
|
||||
if (position || command.isDefault)
|
||||
position = -100;
|
||||
else
|
||||
position = getPosition(command);
|
||||
}
|
||||
var commands = ckb[keyId];
|
||||
for (i = 0; i < commands.length; i++) {
|
||||
var other = commands[i];
|
||||
var otherPos = getPosition(other);
|
||||
if (otherPos > position)
|
||||
break;
|
||||
}
|
||||
commands.splice(i, 0, command);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -219,10 +236,18 @@ MultiHashHandler.prototype = HashHandler.prototype;
|
|||
}
|
||||
}
|
||||
|
||||
if (data.$keyChain && keyCode > 0)
|
||||
data.$keyChain = "";
|
||||
if (data.$keyChain) {
|
||||
if ((!hashId || hashId == 4) && keyString.length == 1)
|
||||
data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input
|
||||
else if (hashId == -1 || keyCode > 0)
|
||||
data.$keyChain = ""; // reset keyChain
|
||||
}
|
||||
return {command: command};
|
||||
};
|
||||
|
||||
this.getStatusText = function(editor, data) {
|
||||
return data.$keyChain || "";
|
||||
};
|
||||
|
||||
}).call(HashHandler.prototype);
|
||||
|
||||
|
|
|
|||
|
|
@ -306,7 +306,7 @@ var TextInput = function(parentNode, host) {
|
|||
var data = handleClipboardData(e);
|
||||
if (typeof data == "string") {
|
||||
if (data)
|
||||
host.onPaste(data);
|
||||
host.onPaste(data, e);
|
||||
if (useragent.isIE)
|
||||
setTimeout(resetSelection);
|
||||
event.preventDefault(e);
|
||||
|
|
|
|||
|
|
@ -178,13 +178,6 @@ 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 || {};
|
||||
|
|
@ -264,6 +257,7 @@ define(function(require, exports, module) {
|
|||
}
|
||||
if (!this.ace.inVirtualSelectionMode)
|
||||
this.ace.exitMultiSelectMode();
|
||||
this.ace.session.unfold({row: line, column: ch});
|
||||
this.ace.selection.moveTo(line, ch);
|
||||
};
|
||||
this.getCursor = function(p) {
|
||||
|
|
@ -577,7 +571,6 @@ 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);
|
||||
|
|
@ -654,6 +647,9 @@ 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};
|
||||
|
|
@ -734,10 +730,14 @@ CodeMirror.defineExtension = function(name, fn) {
|
|||
CodeMirror.prototype[name] = fn;
|
||||
};
|
||||
dom.importCssString(".normal-mode .ace_cursor{\
|
||||
border: 0!important;\
|
||||
border: 1px solid red;\
|
||||
background-color: red;\
|
||||
opacity: 0.5;\
|
||||
}.ace_dialog {\
|
||||
}\
|
||||
.normal-mode .ace_hidden-cursors .ace_cursor{\
|
||||
background-color: transparent;\
|
||||
}\
|
||||
.ace_dialog {\
|
||||
position: absolute;\
|
||||
left: 0; right: 0;\
|
||||
background: white;\
|
||||
|
|
@ -763,23 +763,6 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
font-family: monospace;\
|
||||
}", "vimMode");
|
||||
(function() {
|
||||
function dialogDiv(cm, template, bottom) {
|
||||
var wrap = cm.ace.container;
|
||||
var dialog;
|
||||
dialog = wrap.appendChild(document.createElement("div"));
|
||||
if (bottom)
|
||||
dialog.className = "ace_dialog ace_dialog-bottom";
|
||||
else
|
||||
dialog.className = "ace_dialog ace_dialog-top";
|
||||
|
||||
if (typeof template == "string") {
|
||||
dialog.innerHTML = template;
|
||||
} else { // Assuming it's a detached DOM element.
|
||||
dialog.appendChild(template);
|
||||
}
|
||||
return dialog;
|
||||
}
|
||||
|
||||
function closeNotification(cm, newVal) {
|
||||
if (cm.state.currentNotificationClose)
|
||||
cm.state.currentNotificationClose();
|
||||
|
|
@ -1185,18 +1168,30 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
}
|
||||
|
||||
var options = {};
|
||||
function defineOption(name, defaultValue, type) {
|
||||
if (defaultValue === undefined) { throw Error('defaultValue is required'); }
|
||||
function defineOption(name, defaultValue, type, aliases, callback) {
|
||||
if (defaultValue === undefined && !callback) {
|
||||
throw Error('defaultValue is required unless callback is provided');
|
||||
}
|
||||
if (!type) { type = 'string'; }
|
||||
options[name] = {
|
||||
type: type,
|
||||
defaultValue: defaultValue
|
||||
defaultValue: defaultValue,
|
||||
callback: callback
|
||||
};
|
||||
setOption(name, defaultValue);
|
||||
if (aliases) {
|
||||
for (var i = 0; i < aliases.length; i++) {
|
||||
options[aliases[i]] = options[name];
|
||||
}
|
||||
}
|
||||
if (defaultValue) {
|
||||
setOption(name, defaultValue);
|
||||
}
|
||||
}
|
||||
|
||||
function setOption(name, value, cm) {
|
||||
function setOption(name, value, cm, cfg) {
|
||||
var option = options[name];
|
||||
cfg = cfg || {};
|
||||
var scope = cfg.scope;
|
||||
if (!option) {
|
||||
throw Error('Unknown option: ' + name);
|
||||
}
|
||||
|
|
@ -1208,17 +1203,60 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
value = true;
|
||||
}
|
||||
}
|
||||
option.value = option.type == 'boolean' ? !!value : value;
|
||||
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};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getOption(name) {
|
||||
function getOption(name, cm, cfg) {
|
||||
var option = options[name];
|
||||
cfg = cfg || {};
|
||||
var scope = cfg.scope;
|
||||
if (!option) {
|
||||
throw Error('Unknown option: ' + name);
|
||||
}
|
||||
return option.value;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
@ -1371,8 +1409,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
visualBlock: false,
|
||||
lastSelection: null,
|
||||
lastPastedText: null,
|
||||
sel: {
|
||||
}
|
||||
sel: {},
|
||||
// Buffer-local/window-local values of vim options.
|
||||
options: {}
|
||||
};
|
||||
}
|
||||
return cm.state.vim;
|
||||
|
|
@ -1434,6 +1473,8 @@ 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,
|
||||
|
|
@ -1985,7 +2026,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
}
|
||||
function onPromptKeyDown(e, query, close) {
|
||||
var keyName = CodeMirror.keyName(e);
|
||||
if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {
|
||||
if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||
|
||||
(keyName == 'Backspace' && query == '')) {
|
||||
vimGlobalState.searchHistoryController.pushInput(query);
|
||||
vimGlobalState.searchHistoryController.reset();
|
||||
updateSearchQuery(cm, originalQuery);
|
||||
|
|
@ -1995,6 +2037,10 @@ 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) {
|
||||
|
|
@ -2055,7 +2101,8 @@ 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-[') {
|
||||
if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' ||
|
||||
(keyName == 'Backspace' && input == '')) {
|
||||
vimGlobalState.exCommandHistoryController.pushInput(input);
|
||||
vimGlobalState.exCommandHistoryController.reset();
|
||||
CodeMirror.e_stop(e);
|
||||
|
|
@ -2067,6 +2114,10 @@ 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();
|
||||
|
|
@ -2096,8 +2147,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 ? sel.head: cm.getCursor('head'));
|
||||
var origAnchor = copyCursor(vim.visualMode ? sel.anchor : cm.getCursor('anchor'));
|
||||
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 oldHead = copyCursor(origHead);
|
||||
var oldAnchor = copyCursor(origAnchor);
|
||||
var newHead, newAnchor;
|
||||
|
|
@ -2133,6 +2184,8 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
return;
|
||||
}
|
||||
if (motionArgs.toJumplist) {
|
||||
if (!operator)
|
||||
cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace patch
|
||||
var jumpList = vimGlobalState.jumpList;
|
||||
// if the current motion is # or *, use cachedCursor
|
||||
var cachedCursor = jumpList.cachedCursor;
|
||||
|
|
@ -2672,10 +2725,11 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
var anchor = ranges[0].anchor,
|
||||
head = ranges[0].head;
|
||||
text = cm.getRange(anchor, head);
|
||||
if (!isWhiteSpaceString(text)) {
|
||||
var lastState = vim.lastEditInputState || {};
|
||||
if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) {
|
||||
// Exclude trailing whitespace if the range is not all whitespace.
|
||||
var match = (/\s+$/).exec(text);
|
||||
if (match) {
|
||||
if (match && lastState.motionArgs && lastState.motionArgs.forward) {
|
||||
head = offsetCursor(head, 0, - match[0].length);
|
||||
text = text.slice(0, - match[0].length);
|
||||
}
|
||||
|
|
@ -2818,6 +2872,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
var markPos = mark ? mark.find() : undefined;
|
||||
markPos = markPos ? markPos : cm.getCursor();
|
||||
cm.setCursor(markPos);
|
||||
cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace patch
|
||||
},
|
||||
scroll: function(cm, actionArgs, vim) {
|
||||
if (vim.visualMode) {
|
||||
|
|
@ -4307,7 +4362,8 @@ 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, select: options.select });
|
||||
onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp,
|
||||
selectValueOnOpen: false});
|
||||
}
|
||||
else {
|
||||
onClose(prompt(shortText, ''));
|
||||
|
|
@ -4662,6 +4718,7 @@ 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' },
|
||||
|
|
@ -4670,7 +4727,10 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
{ name: 'write', shortName: 'w' },
|
||||
{ name: 'undo', shortName: 'u' },
|
||||
{ name: 'redo', shortName: 'red' },
|
||||
{ name: 'set', shortName: 'set' },
|
||||
{ name: 'set', shortName: 'se' },
|
||||
{ name: 'set', shortName: 'se' },
|
||||
{ name: 'setlocal', shortName: 'setl' },
|
||||
{ name: 'setglobal', shortName: 'setg' },
|
||||
{ name: 'sort', shortName: 'sor' },
|
||||
{ name: 'substitute', shortName: 's', possiblyAsync: true },
|
||||
{ name: 'nohlsearch', shortName: 'noh' },
|
||||
|
|
@ -4683,6 +4743,13 @@ 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();
|
||||
|
|
@ -4895,6 +4962,13 @@ 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) {
|
||||
|
|
@ -4928,6 +5002,9 @@ 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);
|
||||
|
|
@ -4951,24 +5028,35 @@ 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 (!optionIsBoolean && !value || forceGet) {
|
||||
var oldValue = getOption(optionName);
|
||||
// If no value is provided, then we assume this is a get.
|
||||
// If no value is provided, then we assume this is a get.
|
||||
if (!optionIsBoolean && value === undefined || forceGet) {
|
||||
var oldValue = getOption(optionName, cm, setCfg);
|
||||
if (oldValue === true || oldValue === false) {
|
||||
showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);
|
||||
} else {
|
||||
showConfirm(cm, ' ' + optionName + '=' + oldValue);
|
||||
}
|
||||
} else {
|
||||
setOption(optionName, value, cm);
|
||||
setOption(optionName, value, cm, setCfg);
|
||||
}
|
||||
},
|
||||
registers: function(cm,params) {
|
||||
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) {
|
||||
var regArgs = params.args;
|
||||
var registers = vimGlobalState.registerController.registers;
|
||||
var regInfo = '----------Registers----------<br><br>';
|
||||
|
|
@ -5590,7 +5678,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
}
|
||||
function updateFakeCursor(cm) {
|
||||
var vim = cm.state.vim;
|
||||
var from = copyCursor(vim.sel.head);
|
||||
var from = clipCursorToContent(cm, copyCursor(vim.sel.head));
|
||||
var to = offsetCursor(from, 0, 1);
|
||||
if (vim.fakeCursor) {
|
||||
vim.fakeCursor.clear();
|
||||
|
|
@ -5601,7 +5689,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 && cursorEqual(head, anchor) && lineLength(cm, head.line) > head.ch) {
|
||||
if (vim.visualMode && !cm.somethingSelected()) {
|
||||
exitVisualMode(cm, false);
|
||||
} else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) {
|
||||
vim.visualMode = true;
|
||||
|
|
@ -5835,7 +5923,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
}, true);
|
||||
}
|
||||
return isHandled;
|
||||
};
|
||||
}
|
||||
exports.CodeMirror = CodeMirror;
|
||||
var getVim = Vim.maybeInitVimState_;
|
||||
exports.handler = {
|
||||
|
|
@ -5849,9 +5937,9 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
if (!vim.insertMode) {
|
||||
var isbackwards = !sel.cursor
|
||||
? session.selection.isBackwards() || session.selection.isEmpty()
|
||||
: Range.comparePoints(sel.cursor, sel.start) <= 0
|
||||
: Range.comparePoints(sel.cursor, sel.start) <= 0;
|
||||
if (!isbackwards && left > w)
|
||||
left -= w
|
||||
left -= w;
|
||||
}
|
||||
if (!vim.insertMode && vim.status) {
|
||||
h = h / 2;
|
||||
|
|
@ -6015,13 +6103,13 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
};
|
||||
var renderVirtualNumbers = {
|
||||
getText: function(session, row) {
|
||||
return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9? "\xb7" : "" ))) + ""
|
||||
return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9? "\xb7" : "" ))) + "";
|
||||
},
|
||||
getWidth: function(session, lastLineNumber, config) {
|
||||
return session.getLength().toString().length * config.characterWidth;
|
||||
},
|
||||
update: function(e, editor) {
|
||||
editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER)
|
||||
editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER);
|
||||
},
|
||||
attach: function(editor) {
|
||||
editor.renderer.$gutterLayer.$renderer = this;
|
||||
|
|
@ -6066,7 +6154,7 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
if (cm.ace.inVirtualSelectionMode)
|
||||
cm.ace.on("beforeEndOperation", delayedExecAceCommand);
|
||||
else
|
||||
delayedExecAceCommand(null, cm.ace)
|
||||
delayedExecAceCommand(null, cm.ace);
|
||||
};
|
||||
function delayedExecAceCommand(op, ace) {
|
||||
ace.off("beforeEndOperation", delayedExecAceCommand);
|
||||
|
|
@ -6085,5 +6173,5 @@ dom.importCssString(".normal-mode .ace_cursor{\
|
|||
exports.handler.actions = actions;
|
||||
exports.Vim = Vim;
|
||||
|
||||
Vim.map("Y", "yy");
|
||||
Vim.map("Y", "yy", "normal");
|
||||
});
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ 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);
|
||||
|
|
@ -58,6 +59,7 @@ 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;
|
||||
|
|
@ -595,7 +597,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);
|
||||
|
|
@ -1075,6 +1077,17 @@ 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('<Esc>', 'c', '|');
|
||||
eq(' word3', cm.getValue());
|
||||
helpers.assertCursorAt(0, 0);
|
||||
helpers.doKeys('<Esc>', '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);
|
||||
|
|
@ -1975,7 +1988,11 @@ testVim('visual_block_move_to_eol', function(cm, vim, helpers) {
|
|||
cm.setCursor(0, 0);
|
||||
helpers.doKeys('<C-v>', 'G', '$');
|
||||
var selections = cm.getSelections().join();
|
||||
eq("123,45,6", selections);
|
||||
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);
|
||||
}, {value: '123\n45\n6'});
|
||||
testVim('visual_block_different_line_lengths', function(cm, vim, helpers) {
|
||||
// test the block selection with lines of different length
|
||||
|
|
@ -2803,6 +2820,44 @@ 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');
|
||||
|
|
@ -3753,17 +3808,111 @@ testVim('set_string', function(cm, vim, helpers) {
|
|||
eq('c', CodeMirror.Vim.getOption('testoption'));
|
||||
});
|
||||
testVim('ex_set_string', function(cm, vim, helpers) {
|
||||
CodeMirror.Vim.defineOption('testoption', 'a', 'string');
|
||||
CodeMirror.Vim.defineOption('testopt', 'a', 'string');
|
||||
// Test default value is set.
|
||||
eq('a', CodeMirror.Vim.getOption('testoption'));
|
||||
eq('a', CodeMirror.Vim.getOption('testopt'));
|
||||
try {
|
||||
// Test fail to set 'notestoption'
|
||||
helpers.doEx('set notestoption=b');
|
||||
// Test fail to set 'notestopt'
|
||||
helpers.doEx('set notestopt=b');
|
||||
fail();
|
||||
} catch (expected) {};
|
||||
// Test setOption
|
||||
helpers.doEx('set testoption=c')
|
||||
eq('c', CodeMirror.Vim.getOption('testoption'));
|
||||
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);
|
||||
});
|
||||
// TODO: Reset key maps after each test.
|
||||
testVim('ex_map_key2key', function(cm, vim, helpers) {
|
||||
|
|
|
|||
|
|
@ -120,9 +120,9 @@ var FontMetrics = exports.FontMetrics = function(parentEl, interval) {
|
|||
this.setPolling = function(val) {
|
||||
if (val) {
|
||||
this.$pollSizeChanges();
|
||||
} else {
|
||||
if (this.$pollSizeChangesTimer)
|
||||
this.$pollSizeChangesTimer;
|
||||
} else if (this.$pollSizeChangesTimer) {
|
||||
clearInterval(this.$pollSizeChangesTimer);
|
||||
this.$pollSizeChangesTimer = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -100,16 +100,14 @@ var Gutter = function(parentEl) {
|
|||
}
|
||||
};
|
||||
|
||||
this.$updateAnnotations = function (e) {
|
||||
this.$updateAnnotations = function (delta) {
|
||||
if (!this.$annotations.length)
|
||||
return;
|
||||
var delta = e.data;
|
||||
var range = delta.range;
|
||||
var firstRow = range.start.row;
|
||||
var len = range.end.row - firstRow;
|
||||
var firstRow = delta.start.row;
|
||||
var len = delta.end.row - firstRow;
|
||||
if (len === 0) {
|
||||
// do nothing
|
||||
} else if (delta.action == "removeText" || delta.action == "removeLines") {
|
||||
} else if (delta.action == 'remove') {
|
||||
this.$annotations.splice(firstRow, len + 1, null);
|
||||
} else {
|
||||
var args = new Array(len + 1);
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ var Marker = function(parentEl) {
|
|||
else
|
||||
this.drawMultiLineMarker(html, range, marker.clazz, config);
|
||||
} else {
|
||||
this.drawSingleLineMarker(html, range, marker.clazz + " ace_start", config);
|
||||
this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config);
|
||||
}
|
||||
}
|
||||
this.element.innerHTML = html.join("");
|
||||
|
|
@ -100,27 +100,30 @@ var Marker = function(parentEl) {
|
|||
return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;
|
||||
};
|
||||
|
||||
function getBorderClass(tl, tr, br, bl) {
|
||||
return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);
|
||||
}
|
||||
// Draws a marker, which spans a range of text on multiple lines
|
||||
this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {
|
||||
// selection start
|
||||
var row = range.start.row;
|
||||
|
||||
var 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);
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -134,7 +137,7 @@ var Marker = function(parentEl) {
|
|||
extraStyle = extraStyle || "";
|
||||
|
||||
stringBuilder.push(
|
||||
"<div class='", clazz, " ace_start' style='",
|
||||
"<div class='", clazz, " ace_br1 ace_start' style='",
|
||||
"height:", height, "px;",
|
||||
"right:0;",
|
||||
"top:", top, "px;",
|
||||
|
|
@ -146,7 +149,7 @@ var Marker = function(parentEl) {
|
|||
var width = range.end.column * config.characterWidth;
|
||||
|
||||
stringBuilder.push(
|
||||
"<div class='", clazz, "' style='",
|
||||
"<div class='", clazz, " ace_br12' style='",
|
||||
"height:", height, "px;",
|
||||
"width:", width, "px;",
|
||||
"top:", top, "px;",
|
||||
|
|
@ -155,12 +158,14 @@ var Marker = function(parentEl) {
|
|||
|
||||
// all the complete lines
|
||||
height = (range.end.row - range.start.row - 1) * config.lineHeight;
|
||||
if (height < 0)
|
||||
if (height <= 0)
|
||||
return;
|
||||
top = this.$getTop(range.start.row + 1, config);
|
||||
|
||||
var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);
|
||||
|
||||
stringBuilder.push(
|
||||
"<div class='", clazz, "' style='",
|
||||
"<div class='", clazz, (radiusClass ? " ace_br" + radiusClass : ""), "' style='",
|
||||
"height:", height, "px;",
|
||||
"right:0;",
|
||||
"top:", top, "px;",
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ var Text = function(parentEl) {
|
|||
this.EOL_CHAR_LF = "\xAC";
|
||||
this.EOL_CHAR_CRLF = "\xa4";
|
||||
this.EOL_CHAR = this.EOL_CHAR_LF;
|
||||
this.TAB_CHAR = "\u2192"; //"\u21E5";
|
||||
this.TAB_CHAR = "\u2014"; //"\u21E5";
|
||||
this.SPACE_CHAR = "\xB7";
|
||||
this.$padding = 0;
|
||||
|
||||
|
|
@ -128,8 +128,7 @@ var Text = function(parentEl) {
|
|||
for (var i = 1; i < tabSize + 1; i++) {
|
||||
if (this.showInvisibles) {
|
||||
tabStr.push("<span class='ace_invisible ace_invisible_tab'>"
|
||||
+ this.TAB_CHAR
|
||||
+ lang.stringRepeat(" ", i - 1)
|
||||
+ lang.stringRepeat(this.TAB_CHAR, i)
|
||||
+ "</span>");
|
||||
} else {
|
||||
tabStr.push(lang.stringRepeat(" ", i));
|
||||
|
|
@ -145,7 +144,7 @@ var Text = function(parentEl) {
|
|||
spaceClass = " ace_invisible_space";
|
||||
tabClass = " ace_invisible_tab";
|
||||
var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);
|
||||
var tabContent = this.TAB_CHAR + lang.stringRepeat(" ", this.tabSize - 1);
|
||||
var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);
|
||||
} else{
|
||||
var spaceContent = lang.stringRepeat(" ", this.tabSize);
|
||||
var tabContent = spaceContent;
|
||||
|
|
@ -420,6 +419,8 @@ var Text = function(parentEl) {
|
|||
);
|
||||
}
|
||||
|
||||
stringBuilder.push(lang.stringRepeat("\xa0", splits.indent));
|
||||
|
||||
split ++;
|
||||
screenColumn = 0;
|
||||
splitChars = splits[split] || Number.MAX_VALUE;
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ module.exports = {
|
|||
var EOL = "<span class='ace_invisible ace_invisible_eol'>" + textLayer.EOL_CHAR + "</span>";
|
||||
var SPACE = function(i) {return Array(i+1).join(" ")}
|
||||
var DOT = function(i) {return Array(i+1).join(textLayer.SPACE_CHAR)}
|
||||
var TAB = function(i) {return textLayer.TAB_CHAR + SPACE(i-1)}
|
||||
var TAB = function(i) {return Array(i+1).join(textLayer.TAB_CHAR)}
|
||||
function testRender(results) {
|
||||
for (var i = results.length; i--; ) {
|
||||
var stringBuilder = [];
|
||||
|
|
|
|||
|
|
@ -91,6 +91,11 @@ exports.toggleCssClass = function(el, name) {
|
|||
return add;
|
||||
};
|
||||
|
||||
if (typeof document == "undefined") {
|
||||
exports.importCssString = function() {};
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add or remove a CSS class from the list of classes on the given node
|
||||
* depending on the value of <tt>include</tt>
|
||||
|
|
@ -173,9 +178,6 @@ exports.getInnerHeight = function(element) {
|
|||
};
|
||||
|
||||
|
||||
if (typeof document == "undefined")
|
||||
return;
|
||||
|
||||
if (window.pageYOffset !== undefined) {
|
||||
exports.getPageScrollTop = function() {
|
||||
return window.pageYOffset;
|
||||
|
|
|
|||
|
|
@ -244,7 +244,7 @@ function normalizeCommandKeys(callback, e, keyCode) {
|
|||
if (pressedKeys[keyCode] == 1)
|
||||
ts = e.timeStamp;
|
||||
} else if (keyCode === 18 && hashId === 3 && location === 2) {
|
||||
var dt = e.timestamp - ts;
|
||||
var dt = e.timeStamp - ts;
|
||||
if (dt < 50)
|
||||
pressedKeys.altGr = true;
|
||||
}
|
||||
|
|
@ -326,13 +326,14 @@ exports.addCommandKeyListener = function(el, callback) {
|
|||
});
|
||||
|
||||
if (!pressedKeys) {
|
||||
pressedKeys = Object.create(null);
|
||||
addListener(window, "focus", function(e) {
|
||||
pressedKeys = Object.create(null);
|
||||
});
|
||||
resetPressedKeys();
|
||||
addListener(window, "focus", resetPressedKeys);
|
||||
}
|
||||
}
|
||||
};
|
||||
function resetPressedKeys(e) {
|
||||
pressedKeys = Object.create(null);
|
||||
}
|
||||
|
||||
if (window.postMessage && !useragent.isOldIE) {
|
||||
var postMessageId = 1;
|
||||
|
|
|
|||
|
|
@ -81,20 +81,24 @@ exports.copyArray = function(array){
|
|||
return copy;
|
||||
};
|
||||
|
||||
exports.deepCopy = function (obj) {
|
||||
exports.deepCopy = function deepCopy(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;
|
||||
|
||||
var copy = cons();
|
||||
copy = cons();
|
||||
for (var key in obj) {
|
||||
if (typeof obj[key] === "object") {
|
||||
copy[key] = exports.deepCopy(obj[key]);
|
||||
} else {
|
||||
copy[key] = obj[key];
|
||||
}
|
||||
copy[key] = deepCopy(obj[key]);
|
||||
}
|
||||
return copy;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -113,18 +113,16 @@ function LineWidgets(session) {
|
|||
});
|
||||
};
|
||||
|
||||
this.updateOnChange = function(e) {
|
||||
this.updateOnChange = function(delta) {
|
||||
var lineWidgets = this.session.lineWidgets;
|
||||
if (!lineWidgets) return;
|
||||
|
||||
var delta = e.data;
|
||||
var range = delta.range;
|
||||
var startRow = range.start.row;
|
||||
var len = range.end.row - startRow;
|
||||
|
||||
var startRow = delta.start.row;
|
||||
var len = delta.end.row - startRow;
|
||||
|
||||
if (len === 0) {
|
||||
// return
|
||||
} else if (delta.action == "removeText" || delta.action == "removeLines") {
|
||||
} else if (delta.action == 'remove') {
|
||||
var removed = lineWidgets.splice(startRow + 1, len);
|
||||
removed.forEach(function(w) {
|
||||
w && this.removeLineWidget(w);
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
],[
|
||||
|
|
|
|||
|
|
@ -10,10 +10,9 @@
|
|||
],[
|
||||
"start",
|
||||
["keyword.source.rust","fn"],
|
||||
["meta.function.source.rust"," "],
|
||||
["text"," "],
|
||||
["entity.name.function.source.rust","main"],
|
||||
["meta.function.source.rust","("],
|
||||
["text",") {"]
|
||||
["text","() {"]
|
||||
],[
|
||||
"start",
|
||||
["text"," "],
|
||||
|
|
@ -88,10 +87,14 @@
|
|||
],[
|
||||
"start",
|
||||
["keyword.source.rust","fn"],
|
||||
["meta.function.source.rust"," "],
|
||||
["entity.name.function.source.rust","map<T, U>"],
|
||||
["meta.function.source.rust","("],
|
||||
["text","vector: &[T]"],
|
||||
["text"," "],
|
||||
["entity.name.function.source.rust","map"],
|
||||
["keyword.operator","<"],
|
||||
["text","T"],
|
||||
["keyword.operator",","],
|
||||
["text"," U"],
|
||||
["keyword.operator",">"],
|
||||
["text","(vector: &[T]"],
|
||||
["keyword.operator",","],
|
||||
["text"," function: &fn(v: &T) "],
|
||||
["keyword.operator","->"],
|
||||
|
|
|
|||
|
|
@ -199,7 +199,5 @@
|
|||
["string.quoted.double.asp"," ... updated.\""]
|
||||
],[
|
||||
"start",
|
||||
["support.function.asp","End"],
|
||||
["text"," "],
|
||||
["storage.type.asp","Sub"]
|
||||
["storage.type.asp","End Sub"]
|
||||
]]
|
||||
|
|
@ -144,6 +144,16 @@ module.exports = {
|
|||
exec("selectleft", 1);
|
||||
exec("insertstring", 1, '"');
|
||||
assert.equal(editor.getValue(), '("foo")');
|
||||
|
||||
editor.setValue("", 1);
|
||||
exec("selectleft", 1);
|
||||
exec("insertstring", 1, '"');
|
||||
assert.equal(editor.getValue(), '""');
|
||||
exec("insertstring", 1, '\\');
|
||||
exec("insertstring", 1, 'n');
|
||||
exec("insertstring", 1, '"');
|
||||
assert.equal(editor.getValue(), '"\\n"');
|
||||
|
||||
},
|
||||
"test: xml": function() {
|
||||
editor = new Editor(new MockRenderer());
|
||||
|
|
|
|||
|
|
@ -269,8 +269,8 @@ var CstyleBehaviour = function() {
|
|||
if (leftChar == "\\" && token && /escape/.test(token.type))
|
||||
return null;
|
||||
|
||||
var stringBefore = token && /string/.test(token.type);
|
||||
var stringAfter = !rightToken || /string/.test(rightToken.type);
|
||||
var stringBefore = token && /string|escape/.test(token.type);
|
||||
var stringAfter = !rightToken || /string|escape/.test(rightToken.type);
|
||||
|
||||
var pair;
|
||||
if (rightChar == quote) {
|
||||
|
|
|
|||
|
|
@ -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,6 +69,8 @@ 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);
|
||||
|
|
@ -158,12 +160,16 @@ 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);
|
||||
|
|
|
|||
111
lib/ace/mode/folding/sqlserver.js
Normal file
111
lib/ace/mode/folding/sqlserver.js
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
/* ***** 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);
|
||||
|
||||
});
|
||||
|
|
@ -36,18 +36,18 @@ var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]
|
|||
|
||||
var GherkinHighlightRules = function() {
|
||||
|
||||
// need to include constant ints
|
||||
// need to include constant ints
|
||||
this.$rules = {
|
||||
start : [{
|
||||
start : [{
|
||||
token: 'constant.numeric',
|
||||
regex: "(?:(?:[1-9]\\d*)|(?:0))"
|
||||
}, {
|
||||
token : "comment",
|
||||
regex : "#.*$"
|
||||
}, {
|
||||
token : "keyword",
|
||||
regex : "Feature:|Background:|Scenario:|Scenario\ Outline:|Examples:|Given|When|Then|And|But|\\*",
|
||||
}, {
|
||||
}, {
|
||||
token : "comment",
|
||||
regex : "#.*$"
|
||||
}, {
|
||||
token : "keyword",
|
||||
regex : "Feature:|Background:|Scenario:|Scenario\ Outline:|Examples:|Given|When|Then|And|But|\\*",
|
||||
}, {
|
||||
token : "string", // multi line """ string start
|
||||
regex : '"{3}',
|
||||
next : "qqstring3"
|
||||
|
|
@ -56,22 +56,22 @@ var GherkinHighlightRules = function() {
|
|||
regex : '"',
|
||||
next : "qqstring"
|
||||
}, {
|
||||
token : "comment",
|
||||
regex : "@[A-Za-z0-9]+",
|
||||
next : "start"
|
||||
token : "comment",
|
||||
regex : "@[A-Za-z0-9]+",
|
||||
next : "start"
|
||||
}, {
|
||||
token : "comment",
|
||||
regex : "<.+>"
|
||||
token : "comment",
|
||||
regex : "<.+>"
|
||||
}, {
|
||||
token : "comment",
|
||||
regex : "\\| ",
|
||||
next : "table-item"
|
||||
token : "comment",
|
||||
regex : "\\|(?=.)",
|
||||
next : "table-item"
|
||||
}, {
|
||||
token : "comment",
|
||||
regex : "\\|$",
|
||||
next : "start"
|
||||
token : "comment",
|
||||
regex : "\\|$",
|
||||
next : "start"
|
||||
}],
|
||||
"qqstring3" : [ {
|
||||
"qqstring3" : [ {
|
||||
token : "constant.language.escape",
|
||||
regex : stringEscape
|
||||
}, {
|
||||
|
|
@ -81,7 +81,7 @@ var GherkinHighlightRules = function() {
|
|||
}, {
|
||||
defaultToken : "string"
|
||||
}],
|
||||
"qqstring" : [{
|
||||
"qqstring" : [{
|
||||
token : "constant.language.escape",
|
||||
regex : stringEscape
|
||||
}, {
|
||||
|
|
@ -96,15 +96,19 @@ var GherkinHighlightRules = function() {
|
|||
defaultToken: "string"
|
||||
}],
|
||||
"table-item" : [{
|
||||
token : "comment",
|
||||
regex : /$/,
|
||||
next : "start"
|
||||
}, {
|
||||
token : "comment",
|
||||
regex : /\|/
|
||||
}, {
|
||||
token : "string",
|
||||
regex : "[A-Za-z0-9 ]*",
|
||||
next : "start"
|
||||
}],
|
||||
regex : /\\./
|
||||
}, {
|
||||
defaultToken : "string"
|
||||
}]
|
||||
};
|
||||
|
||||
|
||||
//new TextHighlightRules().getRules();
|
||||
|
||||
}
|
||||
|
||||
oop.inherits(GherkinHighlightRules, TextHighlightRules);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ var Mode = function() {
|
|||
HtmlMode.call(this);
|
||||
this.HighlightRules = HandlebarsHighlightRules;
|
||||
this.$behaviour = new HtmlBehaviour();
|
||||
|
||||
|
||||
this.foldingRules = new HtmlFoldMode();
|
||||
};
|
||||
|
|
@ -21,7 +20,7 @@ var Mode = function() {
|
|||
oop.inherits(Mode, HtmlMode);
|
||||
|
||||
(function() {
|
||||
this.blockComment = {start: "{!--", end: "--}"};
|
||||
this.blockComment = {start: "{{!--", end: "--}}"};
|
||||
this.$id = "ace/mode/handlebars";
|
||||
}).call(Mode.prototype);
|
||||
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ var HtmlHighlightRules = function() {
|
|||
include : "tag_whitespace"
|
||||
}, {
|
||||
token : "entity.other.attribute-name.xml",
|
||||
regex : "[-_a-zA-Z0-9:]+"
|
||||
regex : "[-_a-zA-Z0-9:.]+"
|
||||
}, {
|
||||
token : "keyword.operator.attribute-equals.xml",
|
||||
regex : "=",
|
||||
|
|
@ -89,7 +89,7 @@ var HtmlHighlightRules = function() {
|
|||
return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml",
|
||||
"meta.tag" + (group ? "." + group : "") + ".tag-name.xml"];
|
||||
},
|
||||
regex : "(</?)([-_a-zA-Z0-9:]+)",
|
||||
regex : "(</?)([-_a-zA-Z0-9:.]+)",
|
||||
next: "tag_stuff"
|
||||
}],
|
||||
tag_stuff: [
|
||||
|
|
|
|||
|
|
@ -231,7 +231,7 @@ var LessHighlightRules = function() {
|
|||
regex: "\\.[a-z0-9-_]+"
|
||||
}, {
|
||||
token: "variable.language",
|
||||
regex: ":[a-z0-9-_]+"
|
||||
regex: ":[a-z_][a-z0-9-_]*"
|
||||
}, {
|
||||
token: "constant",
|
||||
regex: "[a-z0-9-_]+"
|
||||
|
|
|
|||
113
lib/ace/mode/nim.js
Normal file
113
lib/ace/mode/nim.js
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Distributed under the BSD license:
|
||||
*
|
||||
* Copyright (c) 2010, Ajax.org B.V.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of Ajax.org B.V. nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("../lib/oop");
|
||||
var TextMode = require("./text").Mode;
|
||||
var NimHighlightRules = require("./nim_highlight_rules").NimHighlightRules;
|
||||
var NimFoldMode = require("./folding/pythonic").FoldMode;
|
||||
var Range = require("../range").Range;
|
||||
|
||||
var Mode = function() {
|
||||
this.HighlightRules = NimHighlightRules;
|
||||
this.foldingRules = new NimFoldMode("\\:|=");
|
||||
};
|
||||
oop.inherits(Mode, TextMode);
|
||||
|
||||
(function() {
|
||||
|
||||
this.lineCommentStart = "#";
|
||||
|
||||
this.getNextLineIndent = function(state, line, tab) {
|
||||
var indent = this.$getIndent(line);
|
||||
|
||||
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
|
||||
var tokens = tokenizedLine.tokens;
|
||||
|
||||
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||||
return indent;
|
||||
}
|
||||
|
||||
if (state == "start") {
|
||||
var match = line.match(/^.*[\{\(\[\:=]\s*$/);
|
||||
if (match) {
|
||||
indent += tab;
|
||||
}
|
||||
}
|
||||
|
||||
return indent;
|
||||
};
|
||||
|
||||
var outdents = {
|
||||
"discard": 1,
|
||||
"return": 1,
|
||||
"raise": 1,
|
||||
"break": 1,
|
||||
"continue": 1
|
||||
};
|
||||
|
||||
this.checkOutdent = function(state, line, input) {
|
||||
if (input !== "\r\n" && input !== "\r" && input !== "\n")
|
||||
return false;
|
||||
|
||||
var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;
|
||||
|
||||
if (!tokens)
|
||||
return false;
|
||||
|
||||
// ignore trailing comments
|
||||
do {
|
||||
var last = tokens.pop();
|
||||
} while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/))));
|
||||
|
||||
if (!last)
|
||||
return false;
|
||||
|
||||
return (last.type == "keyword" && outdents[last.value]);
|
||||
};
|
||||
|
||||
this.autoOutdent = function(state, doc, row) {
|
||||
// outdenting in python is slightly different because it always applies
|
||||
// to the next line and only of a new line is inserted
|
||||
|
||||
row += 1;
|
||||
var indent = this.$getIndent(doc.getLine(row));
|
||||
var tab = doc.getTabString();
|
||||
if (indent.slice(-tab.length) == tab)
|
||||
doc.remove(new Range(row, indent.length-tab.length, row, indent.length));
|
||||
};
|
||||
|
||||
this.$id = "ace/mode/nim";
|
||||
}).call(Mode.prototype);
|
||||
|
||||
exports.Mode = Mode;
|
||||
});
|
||||
238
lib/ace/mode/nim_highlight_rules.js
Normal file
238
lib/ace/mode/nim_highlight_rules.js
Normal file
|
|
@ -0,0 +1,238 @@
|
|||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Distributed under the BSD license:
|
||||
*
|
||||
* Copyright (c) 2010, Ajax.org B.V.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of Ajax.org B.V. nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
/*
|
||||
* TODO: nim delimiters
|
||||
*/
|
||||
|
||||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("../lib/oop");
|
||||
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||
var num_suffix = "(\'[Ff]32|\'[Ff]64|\'[IiUu]8|\'[IiUu]16|\'[IiUu]32|\'[IiUu]64)";
|
||||
|
||||
var NimHighlightRules = function() {
|
||||
|
||||
var keywords = (
|
||||
"addr|and|as|asm|atomic|bind|block|break|case|cast|const|continue|" +
|
||||
"converter|defer|discard|distinct|div|do|elif|else|end|enum|except|" +
|
||||
"export|finally|for|from|func|generic|if|import|in|include|interface|" +
|
||||
"is|isnot|iterator|let|macro|method|mixin|mod|nil|not|notin|object|of|" +
|
||||
"or|out|proc|ptr|raise|ref|return|shl|shr|static|template|try|tuple|" +
|
||||
"type|using|var|when|while|with|without|xor|yield"
|
||||
);
|
||||
|
||||
var builtinConstants = (
|
||||
"true|false|nil|NotImplemented|Ellipsis"
|
||||
);
|
||||
|
||||
var storageType = (
|
||||
"string|seq|array|expr|stmt|typed|untyped|any|auto|bool|cdouble|cfloat|"+
|
||||
"cchar|clongdouble|clong|clonglong|cshort|csize|cstring|cstringarray|"+
|
||||
"culong|culonglong|cushort|guarded|natural|openarray|ordinal|pointer|"+
|
||||
"range|set|shared|static|typedesc|varargs|void"
|
||||
);
|
||||
|
||||
var builtinFunctions = (
|
||||
"defined|declared|declaredInScope|echo|$"
|
||||
);
|
||||
|
||||
//var futureReserved = "";
|
||||
var keywordMapper = this.createKeywordMapper({
|
||||
"invalid.deprecated": "debugger",
|
||||
"support.function": builtinFunctions,
|
||||
//"invalid.illegal": futureReserved,
|
||||
"constant.language": builtinConstants,
|
||||
"storage.type" : storageType,
|
||||
"keyword": keywords
|
||||
}, "identifier");
|
||||
|
||||
var strPre = "(?:r|R)?";
|
||||
|
||||
var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))";
|
||||
var octInteger = "(?:0[o]?[0-7]+)";
|
||||
var hexInteger = "(?:0[xX][\\dA-Fa-f]+)";
|
||||
var binInteger = "(?:0[bB][01]+)";
|
||||
var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")";
|
||||
|
||||
var exponent = "(?:[eE][+-]?\\d+)";
|
||||
var fraction = "(?:\\.\\d+)";
|
||||
var intPart = "(?:\\d+)";
|
||||
var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))";
|
||||
var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")";
|
||||
var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")";
|
||||
|
||||
var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})";
|
||||
|
||||
this.$rules = {
|
||||
"start" : [ {
|
||||
token : "comment",
|
||||
regex : "#.*$"
|
||||
}, {
|
||||
token : "keyword",
|
||||
regex : "(proc|method|temdplate|macro|macromethod|converter|func|iterator) ",
|
||||
next : "qproc_name"
|
||||
}, {
|
||||
token : "storage.type",
|
||||
regex : "(c|cu|u)?int(8|16|32|64)?",
|
||||
}, {
|
||||
token : "storage.type",
|
||||
regex : "(c|cu|u|cs)?char",
|
||||
}, {
|
||||
token : "storage.type",
|
||||
regex : "float(32|64)?",
|
||||
}, {
|
||||
token : "docstring",
|
||||
regex : "##.*$"
|
||||
}, {
|
||||
token : "string", // multi line """ string start
|
||||
regex : strPre + '"{3}',
|
||||
next : "qqstring3"
|
||||
}, {
|
||||
token : "string", // " string
|
||||
regex : strPre + '"(?=.)',
|
||||
next : "qqstring"
|
||||
}, {
|
||||
token : "string", // multi line ''' string start
|
||||
regex : strPre + "'{3}",
|
||||
next : "qstring3"
|
||||
}, {
|
||||
token : "backtick", // ` string
|
||||
regex : strPre + "`(?=.)",
|
||||
next : "qxstring"
|
||||
}, {
|
||||
token : "string", // ' string
|
||||
regex : strPre + "'(?=.)",
|
||||
next : "qstring"
|
||||
}, {
|
||||
token : "constant.numeric", // imaginary
|
||||
regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b"
|
||||
}, {
|
||||
token : "constant.numeric", // float
|
||||
regex : floatNumber
|
||||
}, {
|
||||
token : "constant.numeric", // long integer
|
||||
regex : integer + "[lL]\\b"
|
||||
}, {
|
||||
token : "constant.numeric", // integer
|
||||
regex : integer + "\\b"
|
||||
}, {
|
||||
token : keywordMapper,
|
||||
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
||||
}, {
|
||||
token : "keyword.operator",
|
||||
regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|="
|
||||
}, {
|
||||
token : "paren.lparen",
|
||||
regex : "[\\[\\(\\{]"
|
||||
}, {
|
||||
token : "paren.rparen",
|
||||
regex : "[\\]\\)\\}]"
|
||||
}, {
|
||||
token : "text",
|
||||
regex : "\\s+"
|
||||
} ],
|
||||
"qqstring3" : [ {
|
||||
token : "constant.language.escape",
|
||||
regex : stringEscape
|
||||
}, {
|
||||
token : "string", // multi line """ string end
|
||||
regex : '"{3}',
|
||||
next : "start"
|
||||
}, {
|
||||
defaultToken : "string"
|
||||
} ],
|
||||
"qstring3" : [ {
|
||||
token : "constant.language.escape",
|
||||
regex : stringEscape
|
||||
}, {
|
||||
token : "string", // multi line ''' string end
|
||||
regex : "'{3}",
|
||||
next : "start"
|
||||
}, {
|
||||
defaultToken : "string"
|
||||
} ],
|
||||
"qqstring" : [{
|
||||
token : "constant.language.escape",
|
||||
regex : stringEscape
|
||||
}, {
|
||||
token : "string",
|
||||
regex : "\\\\$",
|
||||
next : "qqstring"
|
||||
}, {
|
||||
token : "string",
|
||||
regex : '"|$',
|
||||
next : "start"
|
||||
}, {
|
||||
defaultToken: "string"
|
||||
}],
|
||||
"qstring" : [{
|
||||
token : "constant.language.escape",
|
||||
regex : stringEscape
|
||||
}, {
|
||||
token : "string",
|
||||
regex : "\\\\$",
|
||||
next : "qstring"
|
||||
}, {
|
||||
token : "string",
|
||||
regex : "'|$",
|
||||
next : "start"
|
||||
}, {
|
||||
defaultToken: "string"
|
||||
}],
|
||||
"qxstring" : [{
|
||||
token : "constant.language.escape",
|
||||
regex : stringEscape
|
||||
}, {
|
||||
token : "backtick",
|
||||
regex : "\\\\$",
|
||||
next : "qxstring"
|
||||
}, {
|
||||
token : "backtick",
|
||||
regex : "`|$",
|
||||
next : "start"
|
||||
}, {
|
||||
defaultToken: "backtick"
|
||||
}],
|
||||
"qproc_name":[{
|
||||
token : "proc_name",
|
||||
regex : "\\w+",
|
||||
},{
|
||||
token : "start_bracket",
|
||||
regex : "(\\(|=|$)",
|
||||
next : "start"
|
||||
}],
|
||||
};
|
||||
};
|
||||
|
||||
oop.inherits(NimHighlightRules, TextHighlightRules);
|
||||
|
||||
exports.NimHighlightRules = NimHighlightRules;
|
||||
});
|
||||
|
|
@ -84,9 +84,8 @@ var RustHighlightRules = function() {
|
|||
{ token: 'constant.character.escape.source.rust',
|
||||
regex: stringEscape },
|
||||
{ defaultToken: 'string.quoted.double.source.rust' } ] },
|
||||
{ token: [ 'keyword.source.rust', 'meta.function.source.rust',
|
||||
'entity.name.function.source.rust', 'meta.function.source.rust' ],
|
||||
regex: '\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_][\\w\\:,+ \\\'<>]*)(\\s*\\()' },
|
||||
{ token: [ 'keyword.source.rust', 'text', 'entity.name.function.source.rust' ],
|
||||
regex: '\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)' },
|
||||
{ token: 'support.constant', regex: '\\b[a-zA-Z_][\\w\\d]*::' },
|
||||
{ token: 'keyword.source.rust',
|
||||
regex: '\\b(?:as|assert|break|claim|const|do|drop|else|extern|fail|for|if|impl|in|let|log|loop|match|mod|module|move|mut|Owned|priv|pub|pure|ref|return|unchecked|unsafe|use|while|mod|Send|static|trait|class|struct|enum|type)\\b' },
|
||||
|
|
|
|||
|
|
@ -39,15 +39,92 @@ define(function(require, exports, module) {
|
|||
var oop = require("../lib/oop");
|
||||
var TextMode = require("./text").Mode;
|
||||
var SchemeHighlightRules = require("./scheme_highlight_rules").SchemeHighlightRules;
|
||||
var MatchingParensOutdent = require("./matching_parens_outdent").MatchingParensOutdent;
|
||||
|
||||
var Mode = function() {
|
||||
this.HighlightRules = SchemeHighlightRules;
|
||||
this.$outdent = new MatchingParensOutdent();
|
||||
};
|
||||
oop.inherits(Mode, TextMode);
|
||||
|
||||
(function() {
|
||||
|
||||
this.lineCommentStart = ";";
|
||||
this.minorIndentFunctions = ["define", "lambda", "define-macro", "define-syntax", "syntax-rules", "define-record-type", "define-structure"];
|
||||
|
||||
this.$toIndent = function(str) {
|
||||
return str.split('').map(function(ch) {
|
||||
if (/\s/.exec(ch)) {
|
||||
return ch;
|
||||
} else {
|
||||
return ' ';
|
||||
}
|
||||
}).join('');
|
||||
};
|
||||
|
||||
this.$calculateIndent = function(line, tab) {
|
||||
var baseIndent = this.$getIndent(line);
|
||||
var delta = 0;
|
||||
var isParen, ch;
|
||||
// Walk back from end of line, find matching braces
|
||||
for (var i = line.length - 1; i >= 0; i--) {
|
||||
ch = line[i];
|
||||
if (ch === '(') {
|
||||
delta--;
|
||||
isParen = true;
|
||||
} else if (ch === '(' || ch === '[' || ch === '{') {
|
||||
delta--;
|
||||
isParen = false;
|
||||
} else if (ch === ')' || ch === ']' || ch === '}') {
|
||||
delta++;
|
||||
}
|
||||
if (delta < 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (delta < 0 && isParen) {
|
||||
// Were more brackets opened than closed and was a ( left open?
|
||||
i += 1;
|
||||
var iBefore = i;
|
||||
var fn = '';
|
||||
while (true) {
|
||||
ch = line[i];
|
||||
if (ch === ' ' || ch === '\t') {
|
||||
if(this.minorIndentFunctions.indexOf(fn) !== -1) {
|
||||
return this.$toIndent(line.substring(0, iBefore - 1) + tab);
|
||||
} else {
|
||||
return this.$toIndent(line.substring(0, i + 1));
|
||||
}
|
||||
} else if (ch === undefined) {
|
||||
return this.$toIndent(line.substring(0, iBefore - 1) + tab);
|
||||
}
|
||||
fn += line[i];
|
||||
i++;
|
||||
}
|
||||
} else if(delta < 0 && !isParen) {
|
||||
// Were more brackets openend than closed and was it not a (?
|
||||
return this.$toIndent(line.substring(0, i+1));
|
||||
} else if(delta > 0) {
|
||||
// Mere more brackets closed than opened? Outdent.
|
||||
baseIndent = baseIndent.substring(0, baseIndent.length - tab.length);
|
||||
return baseIndent;
|
||||
} else {
|
||||
// Were they nicely matched? Just indent like line before.
|
||||
return baseIndent;
|
||||
}
|
||||
};
|
||||
|
||||
this.getNextLineIndent = function(state, line, tab) {
|
||||
return this.$calculateIndent(line, tab);
|
||||
};
|
||||
|
||||
this.checkOutdent = function(state, line, input) {
|
||||
return this.$outdent.checkOutdent(line, input);
|
||||
};
|
||||
|
||||
this.autoOutdent = function(state, doc, row) {
|
||||
this.$outdent.autoOutdent(doc, row);
|
||||
};
|
||||
|
||||
this.$id = "ace/mode/scheme";
|
||||
}).call(Mode.prototype);
|
||||
|
|
|
|||
|
|
@ -38,21 +38,28 @@ 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"
|
||||
"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"
|
||||
);
|
||||
|
||||
var builtinConstants = (
|
||||
"true|false|null"
|
||||
"true|false"
|
||||
);
|
||||
|
||||
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
|
||||
"constant.language": builtinConstants,
|
||||
"storage.type": dataTypes
|
||||
}, "identifier", true);
|
||||
|
||||
this.$rules = {
|
||||
|
|
|
|||
62
lib/ace/mode/sqlserver.js
Normal file
62
lib/ace/mode/sqlserver.js
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/* ***** 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;
|
||||
|
||||
});
|
||||
232
lib/ace/mode/sqlserver_highlight_rules.js
Normal file
232
lib/ace/mode/sqlserver_highlight_rules.js
Normal file
|
|
@ -0,0 +1,232 @@
|
|||
/* ***** 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;
|
||||
});
|
||||
|
|
@ -57,6 +57,10 @@ var TomlHighlightRules = function() {
|
|||
regex : '"(?=.)',
|
||||
next : "qqstring"
|
||||
},
|
||||
{
|
||||
token: ["variable.keygroup.toml"],
|
||||
regex: "(?:^\\s*)(\\[\\[([^\\]]+)\\]\\])"
|
||||
},
|
||||
{
|
||||
token: ["variable.keygroup.toml"],
|
||||
regex: "(?:^\\s*)(\\[([^\\]]+)\\])"
|
||||
|
|
@ -100,4 +104,4 @@ var TomlHighlightRules = function() {
|
|||
oop.inherits(TomlHighlightRules, TextHighlightRules);
|
||||
|
||||
exports.TomlHighlightRules = TomlHighlightRules;
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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,29 +85,35 @@ var VBScriptHighlightRules = function() {
|
|||
{
|
||||
token: "punctuation.definition.comment.asp",
|
||||
regex: "'|REM",
|
||||
next: "comment"
|
||||
next: "comment",
|
||||
caseInsensitive: true
|
||||
},
|
||||
{
|
||||
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"
|
||||
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
|
||||
},
|
||||
{
|
||||
token: "keyword.operator.asp",
|
||||
regex: "\\b(?:Mod|And|Not|Or|Xor|as)\\b"
|
||||
regex: "\\b(?:Mod|And|Not|Or|Xor|as)\\b",
|
||||
caseInsensitive: true
|
||||
},
|
||||
{
|
||||
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"
|
||||
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
|
||||
},
|
||||
{
|
||||
token: "storage.modifier.asp",
|
||||
regex: "\\b(?:Private|Public|Default)\\b"
|
||||
regex: "\\b(?:Private|Public|Default)\\b",
|
||||
caseInsensitive: true
|
||||
},
|
||||
{
|
||||
token: "constant.language.asp",
|
||||
regex: "\\b(?:Empty|False|Nothing|Null|True)\\b"
|
||||
regex: "\\b(?:Empty|False|Nothing|Null|True)\\b",
|
||||
caseInsensitive: true
|
||||
},
|
||||
{
|
||||
token: "punctuation.definition.string.begin.asp",
|
||||
|
|
@ -122,23 +128,28 @@ var VBScriptHighlightRules = function() {
|
|||
},
|
||||
{
|
||||
token: "support.class.asp",
|
||||
regex: "\\b(?:Application|ObjectContext|Request|Response|Server|Session)\\b"
|
||||
regex: "\\b(?:Application|ObjectContext|Request|Response|Server|Session)\\b",
|
||||
caseInsensitive: true
|
||||
},
|
||||
{
|
||||
token: "support.class.collection.asp",
|
||||
regex: "\\b(?:Contents|StaticObjects|ClientCertificate|Cookies|Form|QueryString|ServerVariables)\\b"
|
||||
regex: "\\b(?:Contents|StaticObjects|ClientCertificate|Cookies|Form|QueryString|ServerVariables)\\b",
|
||||
caseInsensitive: true
|
||||
},
|
||||
{
|
||||
token: "support.constant.asp",
|
||||
regex: "\\b(?:TotalBytes|Buffer|CacheControl|Charset|ContentType|Expires|ExpiresAbsolute|IsClientConnected|PICS|Status|ScriptTimeout|CodePage|LCID|SessionID|Timeout)\\b"
|
||||
regex: "\\b(?:TotalBytes|Buffer|CacheControl|Charset|ContentType|Expires|ExpiresAbsolute|IsClientConnected|PICS|Status|ScriptTimeout|CodePage|LCID|SessionID|Timeout)\\b",
|
||||
caseInsensitive: true
|
||||
},
|
||||
{
|
||||
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"
|
||||
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
|
||||
},
|
||||
{
|
||||
token: "support.function.event.asp",
|
||||
regex: "\\b(?:Application_OnEnd|Application_OnStart|OnTransactionAbort|OnTransactionCommit|Session_OnEnd|Session_OnStart)\\b"
|
||||
regex: "\\b(?:Application_OnEnd|Application_OnStart|OnTransactionAbort|OnTransactionCommit|Session_OnEnd|Session_OnStart)\\b",
|
||||
caseInsensitive: true
|
||||
},
|
||||
// {
|
||||
// token: [
|
||||
|
|
@ -148,7 +159,8 @@ 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"
|
||||
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
|
||||
},
|
||||
{
|
||||
token: [
|
||||
|
|
@ -158,7 +170,8 @@ 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"
|
||||
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
|
||||
},
|
||||
{
|
||||
token: [
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ oop.inherits(Mode, TextMode);
|
|||
|
||||
this.blockComment = {start: "<!--", end: "-->"};
|
||||
|
||||
this.createWorker = function(session) {
|
||||
this.createWorker = function(session) {
|
||||
var worker = new WorkerClient(["ace"], "ace/mode/xml_worker", "Worker");
|
||||
worker.attachToDocument(session.getDocument());
|
||||
|
||||
|
|
|
|||
|
|
@ -35,8 +35,10 @@ var oop = require("../lib/oop");
|
|||
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||
|
||||
var XmlHighlightRules = function(normalize) {
|
||||
|
||||
var tagRegex = "[a-zA-Z][-_a-zA-Z0-9]*";
|
||||
// http://www.w3.org/TR/REC-xml/#NT-NameChar
|
||||
// NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
|
||||
// NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
|
||||
var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*";
|
||||
|
||||
this.$rules = {
|
||||
start : [
|
||||
|
|
|
|||
|
|
@ -83,15 +83,15 @@ function onMouseDown(e) {
|
|||
var selectionMode;
|
||||
if (editor.$mouseHandler.$enableJumpToDef) {
|
||||
if (ctrl && alt || accel && alt)
|
||||
selectionMode = "add";
|
||||
else if (alt)
|
||||
selectionMode = shift ? "block" : "add";
|
||||
else if (alt && editor.$blockSelectEnabled)
|
||||
selectionMode = "block";
|
||||
} else {
|
||||
if (accel && !alt) {
|
||||
selectionMode = "add";
|
||||
if (!isMultiSelect && shift)
|
||||
return;
|
||||
} else if (alt) {
|
||||
} else if (alt && editor.$blockSelectEnabled) {
|
||||
selectionMode = "block";
|
||||
}
|
||||
}
|
||||
|
|
@ -117,7 +117,7 @@ function onMouseDown(e) {
|
|||
|
||||
if (shift) {
|
||||
oldRange = null;
|
||||
range = selection.ranges[0];
|
||||
range = selection.ranges[0] || range;
|
||||
editor.removeSelectionMarker(range);
|
||||
}
|
||||
editor.once("mouseup", function() {
|
||||
|
|
|
|||
|
|
@ -754,9 +754,9 @@ var Editor = require("./editor").Editor;
|
|||
if (fr < 0) fr = 0;
|
||||
if (lr >= max) lr = max - 1;
|
||||
}
|
||||
var lines = this.session.doc.removeLines(fr, lr);
|
||||
var lines = this.session.removeFullLines(fr, lr);
|
||||
lines = this.$reAlignText(lines, guessRange);
|
||||
this.session.doc.insert({row: fr, column: 0}, lines.join("\n") + "\n");
|
||||
this.session.insert({row: fr, column: 0}, lines.join("\n") + "\n");
|
||||
if (!guessRange) {
|
||||
range.start.column = 0;
|
||||
range.end.column = lines[lines.length - 1].length;
|
||||
|
|
@ -924,7 +924,8 @@ function addAltCursorListeners(editor){
|
|||
var el = editor.textInput.getElement();
|
||||
var altCursor = false;
|
||||
event.addListener(el, "keydown", function(e) {
|
||||
if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) {
|
||||
var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);
|
||||
if (editor.$blockSelectEnabled && altDown) {
|
||||
if (!altCursor) {
|
||||
editor.renderer.setMouseCursor("crosshair");
|
||||
altCursor = true;
|
||||
|
|
@ -962,6 +963,12 @@ require("./config").defineOptions(Editor.prototype, "editor", {
|
|||
}
|
||||
},
|
||||
value: true
|
||||
},
|
||||
enableBlockSelect: {
|
||||
set: function(val) {
|
||||
this.$blockSelectEnabled = val;
|
||||
},
|
||||
value: true
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
if (typeof process !== "undefined") {
|
||||
require("amd-loader");
|
||||
require("./test/mockdom");
|
||||
}
|
||||
|
||||
define(function(require, exports, module) {
|
||||
|
|
@ -41,6 +42,7 @@ 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) {
|
||||
|
|
@ -82,11 +84,11 @@ function setSelection(editor, data) {
|
|||
return isBackwards ? {
|
||||
start: end,
|
||||
end: start,
|
||||
isBackwards: true
|
||||
isBackwards: isBackwards
|
||||
} : {
|
||||
start: start,
|
||||
end: end,
|
||||
isBackwards: true
|
||||
isBackwards: isBackwards
|
||||
};
|
||||
}));
|
||||
}
|
||||
|
|
@ -223,19 +225,19 @@ module.exports = {
|
|||
assert.equal(editor.getValue(),"l1\nl1\nl2\nl2\nl3\nl3\nl4\nl4");
|
||||
testSelection(editor, [[1,0],[3,0],[5,0],[7,0]]);
|
||||
|
||||
setSelection(editor, [[1,2],[1,0,1,1],[3,0,3,1],[5,0,5,1],[7,0,7,1]]);
|
||||
setSelection(editor, [[1,2],[1,1,1,0],[3,0,3,1],[5,0,5,1],[7,0,7,1]]);
|
||||
exec("copylinesdown");
|
||||
exec("copylinesup");
|
||||
assert.equal(editor.getValue(),"l1\nl1\nl1\nl1\nl2\nl2\nl2\nl2\nl3\nl3\nl3\nl3\nl4\nl4\nl4\nl4");
|
||||
testSelection(editor, [[2,2],[2,0,2,1],[6,0,6,1],[10,0,10,1],[14,0,14,1]]);
|
||||
testSelection(editor, [[2,2],[2,1,2,0],[6,0,6,1],[10,0,10,1],[14,0,14,1]]);
|
||||
|
||||
exec("movelinesdown", 12);
|
||||
assert.equal(editor.getValue(),"l1\nl1\nl1\nl2\nl2\nl2\nl3\nl3\nl3\nl4\nl4\nl4\nl1\nl2\nl3\nl4");
|
||||
testSelection(editor, [[12,2],[12,0,12,1],[13,0,13,1],[14,0,14,1],[15,0,15,1]]);
|
||||
testSelection(editor, [[12,2],[12,1,12,0],[13,0,13,1],[14,0,14,1],[15,0,15,1]]);
|
||||
|
||||
exec("movelinesup", 12);
|
||||
assert.equal(editor.getValue(),"l1\nl2\nl3\nl4\nl1\nl1\nl1\nl2\nl2\nl2\nl3\nl3\nl3\nl4\nl4\nl4");
|
||||
testSelection(editor, [[0,2],[0,0,0,1],[1,0,1,1],[2,0,2,1],[3,0,3,1]]);
|
||||
testSelection(editor, [[0,2],[0,1,0,0],[1,0,1,1],[2,0,2,1],[3,0,3,1]]);
|
||||
},
|
||||
|
||||
"test multiselect fromJSON/toJSON": function() {
|
||||
|
|
@ -259,6 +261,20 @@ 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());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -150,28 +150,27 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass)
|
|||
* Emitted when the place holder updates.
|
||||
*
|
||||
**/
|
||||
this.onUpdate = function(event) {
|
||||
var delta = event.data;
|
||||
var range = delta.range;
|
||||
this.onUpdate = function(delta) {
|
||||
var range = delta;
|
||||
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 === "insertText" ? range.end.column - range.start.column : range.start.column - range.end.column;
|
||||
var lengthDiff = delta.action === "insert" ? 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 === "insertText") {
|
||||
if(delta.action === 'insert') {
|
||||
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.insert(newPos, delta.text);
|
||||
this.doc.insertMergedLines(newPos, delta.lines);
|
||||
}
|
||||
} else if(delta.action === "removeText") {
|
||||
} else if(delta.action === 'remove') {
|
||||
for (var i = this.others.length - 1; i >= 0; i--) {
|
||||
var otherPos = this.others[i];
|
||||
var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};
|
||||
|
|
@ -181,7 +180,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass)
|
|||
}
|
||||
}
|
||||
// Special case: insert in beginning
|
||||
if(range.start.column === this.pos.column && delta.action === "insertText") {
|
||||
if(range.start.column === this.pos.column && delta.action === 'insert') {
|
||||
setTimeout(function() {
|
||||
this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff);
|
||||
for (var i = 0; i < this.others.length; i++) {
|
||||
|
|
@ -193,7 +192,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass)
|
|||
}
|
||||
}.bind(this), 0);
|
||||
}
|
||||
else if(range.start.column === this.pos.column && delta.action === "removeText") {
|
||||
else if(range.start.column === this.pos.column && delta.action === 'remove') {
|
||||
setTimeout(function() {
|
||||
for (var i = 0; i < this.others.length; i++) {
|
||||
var other = this.others[i];
|
||||
|
|
|
|||
|
|
@ -180,14 +180,13 @@ var RangeList = function() {
|
|||
this.session = null;
|
||||
};
|
||||
|
||||
this.$onChange = function(e) {
|
||||
var changeRange = e.data.range;
|
||||
if (e.data.action[0] == "i"){
|
||||
var start = changeRange.start;
|
||||
var end = changeRange.end;
|
||||
this.$onChange = function(delta) {
|
||||
if (delta.action == "insert"){
|
||||
var start = delta.start;
|
||||
var end = delta.end;
|
||||
} else {
|
||||
var end = changeRange.start;
|
||||
var start = changeRange.end;
|
||||
var end = delta.start;
|
||||
var start = delta.end;
|
||||
}
|
||||
var startRow = start.row;
|
||||
var endRow = end.row;
|
||||
|
|
|
|||
|
|
@ -923,7 +923,7 @@ var Selection = function(session) {
|
|||
this.toSingleRange(data[0]);
|
||||
for (var i = data.length; i--; ) {
|
||||
var r = Range.fromPoints(data[i].start, data[i].end);
|
||||
if (data.isBackwards)
|
||||
if (data[i].isBackwards)
|
||||
r.cursor = r.start;
|
||||
this.addRange(r, true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -667,11 +667,11 @@ var TabstopManager = function(editor) {
|
|||
this.editor = null;
|
||||
};
|
||||
|
||||
this.onChange = function(e) {
|
||||
var changeRange = e.data.range;
|
||||
var isRemove = e.data.action[0] == "r";
|
||||
var start = changeRange.start;
|
||||
var end = changeRange.end;
|
||||
this.onChange = function(delta) {
|
||||
var changeRange = delta;
|
||||
var isRemove = delta.action[0] == "r";
|
||||
var start = delta.start;
|
||||
var end = delta.end;
|
||||
var startRow = start.row;
|
||||
var endRow = end.row;
|
||||
var lineDif = endRow - startRow;
|
||||
|
|
|
|||
7
lib/ace/snippets/mask.js
Normal file
7
lib/ace/snippets/mask.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
exports.snippetText = require("../requirejs/text!./mask.snippets");
|
||||
exports.scope = "mask";
|
||||
|
||||
});
|
||||
0
lib/ace/snippets/mask.snippets
Normal file
0
lib/ace/snippets/mask.snippets
Normal file
7
lib/ace/snippets/nim.js
Normal file
7
lib/ace/snippets/nim.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
exports.snippetText = require("../requirejs/text!./nim.snippets");
|
||||
exports.scope = "nim";
|
||||
|
||||
});
|
||||
130
lib/ace/snippets/nim.snippets
Normal file
130
lib/ace/snippets/nim.snippets
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
snippet #!
|
||||
#!/usr/bin/env nim
|
||||
snippet imp
|
||||
import ${1:module}
|
||||
snippet from
|
||||
from ${1:package} import ${2:module}
|
||||
# Module Docstring
|
||||
snippet docs
|
||||
## File: ${1:FILENAME:file_name}
|
||||
## Author: ${2:author}
|
||||
## Description: ${3}
|
||||
snippet wh
|
||||
while ${1:condition}:
|
||||
${2:# TODO: write code...}
|
||||
# dowh - does the same as do...while in other languages
|
||||
snippet dowh
|
||||
while true:
|
||||
${1:# TODO: write code...}
|
||||
if ${2:condition}:
|
||||
break
|
||||
snippet with
|
||||
with ${1:expr} as ${2:var}:
|
||||
${3:# TODO: write code...}
|
||||
# New Function
|
||||
snippet proc
|
||||
proc ${1:fname}(${2:`indent('.') ? 'self' : ''`}): ${3: return type} =
|
||||
##${4:docstring for $1}
|
||||
${5:# TODO: write code...}
|
||||
snippet deff
|
||||
def ${1:fname}(${2:`indent('.') ? 'self' : ''`}):
|
||||
${3:# TODO: write code...}
|
||||
# New Method
|
||||
snippet defs
|
||||
def ${1:mname}(self, ${2:arg}):
|
||||
${3:# TODO: write code...}
|
||||
# New Property
|
||||
snippet property
|
||||
def ${1:foo}():
|
||||
doc = "${2:The $1 property.}"
|
||||
def fget(self):
|
||||
${3:return self._$1}
|
||||
def fset(self, value):
|
||||
${4:self._$1 = value}
|
||||
# Ifs
|
||||
snippet if
|
||||
if ${1:condition}:
|
||||
${2:# TODO: write code...}
|
||||
snippet el
|
||||
else:
|
||||
${1:# TODO: write code...}
|
||||
snippet ei
|
||||
elif ${1:condition}:
|
||||
${2:# TODO: write code...}
|
||||
# For
|
||||
snippet for
|
||||
for ${1:item} in ${2:items}:
|
||||
${3:# TODO: write code...}
|
||||
# Encodes
|
||||
snippet cutf8
|
||||
# -*- coding: utf-8 -*-
|
||||
snippet clatin1
|
||||
# -*- coding: latin-1 -*-
|
||||
snippet cascii
|
||||
# -*- coding: ascii -*-
|
||||
# Lambda
|
||||
snippet ld
|
||||
${1:var} = lambda ${2:vars} : ${3:action}
|
||||
snippet .
|
||||
self.
|
||||
snippet try Try/Except
|
||||
try:
|
||||
${1:# TODO: write code...}
|
||||
except ${2:Exception}, ${3:e}:
|
||||
${4:raise $3}
|
||||
snippet try Try/Except/Else
|
||||
try:
|
||||
${1:# TODO: write code...}
|
||||
except ${2:Exception}, ${3:e}:
|
||||
${4:raise $3}
|
||||
else:
|
||||
${5:# TODO: write code...}
|
||||
snippet try Try/Except/Finally
|
||||
try:
|
||||
${1:# TODO: write code...}
|
||||
except ${2:Exception}, ${3:e}:
|
||||
${4:raise $3}
|
||||
finally:
|
||||
${5:# TODO: write code...}
|
||||
snippet try Try/Except/Else/Finally
|
||||
try:
|
||||
${1:# TODO: write code...}
|
||||
except ${2:Exception}, ${3:e}:
|
||||
${4:raise $3}
|
||||
else:
|
||||
${5:# TODO: write code...}
|
||||
finally:
|
||||
${6:# TODO: write code...}
|
||||
# if __name__ == '__main__':
|
||||
snippet ifmain
|
||||
if isMainModule:
|
||||
${1:main()}
|
||||
snippet "
|
||||
## ${1:doc}
|
||||
# test function/method
|
||||
snippet test
|
||||
def test_${1:description}(${2:self}):
|
||||
${3:# TODO: write code...}
|
||||
# test case
|
||||
snippet testcase
|
||||
class ${1:ExampleCase}(unittest.TestCase):
|
||||
|
||||
def test_${2:description}(self):
|
||||
${3:# TODO: write code...}
|
||||
#getopt
|
||||
snippet getopt
|
||||
try:
|
||||
# Short option syntax: "hv:"
|
||||
# Long option syntax: "help" or "verbose="
|
||||
opts, args = getopt.getopt(sys.argv[1:], "${1:short_options}", [${2:long_options}])
|
||||
|
||||
except getopt.GetoptError, err:
|
||||
# Print debug info
|
||||
print str(err)
|
||||
${3:error_action}
|
||||
|
||||
for option, argument in opts:
|
||||
if option in ("-h", "--help"):
|
||||
${4}
|
||||
elif option in ("-v", "--verbose"):
|
||||
verbose = argument
|
||||
7
lib/ace/snippets/sqlserver.js
Normal file
7
lib/ace/snippets/sqlserver.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
define(function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
exports.snippetText = require("../requirejs/text!./sqlserver.snippets");
|
||||
exports.scope = "sqlserver";
|
||||
|
||||
});
|
||||
70
lib/ace/snippets/sqlserver.snippets
Normal file
70
lib/ace/snippets/sqlserver.snippets
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
# 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
|
||||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-clouds.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #FFFFFF;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-clouds .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #191919;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-clouds-midnight .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
.ace-cobalt .ace_print-margin {
|
||||
width: 1px;
|
||||
background: #011e3a
|
||||
background: #555555
|
||||
}
|
||||
|
||||
.ace-cobalt {
|
||||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-cobalt.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #002240;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-cobalt .ace_marker-layer .ace_step {
|
||||
|
|
@ -131,4 +130,4 @@
|
|||
|
||||
.ace-cobalt .ace_indent-guide {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-dawn.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #F9F9F9;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-dawn .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #323232;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-idle-fingers .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
140
lib/ace/theme/iplastic.css
Normal file
140
lib/ace/theme/iplastic.css
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
.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
|
||||
}
|
||||
40
lib/ace/theme/iplastic.js
Normal file
40
lib/ace/theme/iplastic.js
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
|
||||
/* ***** 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);
|
||||
});
|
||||
|
|
@ -31,7 +31,6 @@
|
|||
|
||||
.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #f3f2f3;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-katzenmilch .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-kr-theme.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #0B0A09;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-kr-theme .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-merbivore.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #161616;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-merbivore .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #1C1C1C;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-merbivore-soft .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #222C28;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-mono-industrial .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-monokai.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #272822;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-monokai .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #2C2828;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-pastel-on-dark .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@
|
|||
|
||||
.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #002B36;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-solarized-dark .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
.ace-solarized-light.ace_multiselect .ace_selection.ace_start {
|
||||
box-shadow: 0 0 3px 0px #FDF6E3;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.ace-solarized-light .ace_marker-layer .ace_step {
|
||||
|
|
|
|||
171
lib/ace/theme/sqlserver.css
Normal file
171
lib/ace/theme/sqlserver.css
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
.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;
|
||||
}
|
||||
39
lib/ace/theme/sqlserver.js
Normal file
39
lib/ace/theme/sqlserver.js
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Distributed under the BSD license:
|
||||
*
|
||||
* Copyright (c) 2010, Ajax.org B.V.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of Ajax.org B.V. nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
define(function(require, exports, module) {
|
||||
|
||||
exports.isDark = false;
|
||||
exports.cssClass = "ace-sqlserver";
|
||||
exports.cssText = require("../requirejs/text!./sqlserver.css");
|
||||
|
||||
var dom = require("../lib/dom");
|
||||
dom.importCssString(exports.cssText, exports.cssClass);
|
||||
});
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue