package
This commit is contained in:
parent
829c24c780
commit
8a6bfe2d24
49 changed files with 1368 additions and 1538 deletions
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
Ace
|
Ace
|
||||||
version 0.2.0
|
version 0.2.0
|
||||||
commit 5db6824f28f04b8b4df2566dada92b58d307dec8
|
commit 829c24c7806dacf34eb239760ab458dc868c6086
|
||||||
|
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
|
||||||
|
|
@ -2416,12 +2416,11 @@ exports.getOS = function() {
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/event', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands'], function(require, exports, module) {
|
define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands'], function(require, exports, module) {
|
||||||
|
|
||||||
require("./lib/fixoldbrowsers");
|
require("./lib/fixoldbrowsers");
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
var event = require("./lib/event");
|
|
||||||
var lang = require("./lib/lang");
|
var lang = require("./lib/lang");
|
||||||
var useragent = require("./lib/useragent");
|
var useragent = require("./lib/useragent");
|
||||||
var TextInput = require("./keyboard/textinput").TextInput;
|
var TextInput = require("./keyboard/textinput").TextInput;
|
||||||
|
|
@ -2674,9 +2673,10 @@ var Editor = function(renderer, session) {
|
||||||
this.onDocumentChange = function(e) {
|
this.onDocumentChange = function(e) {
|
||||||
var delta = e.data;
|
var delta = e.data;
|
||||||
var range = delta.range;
|
var range = delta.range;
|
||||||
|
var lastRow;
|
||||||
|
|
||||||
if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines")
|
if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines")
|
||||||
var lastRow = range.end.row;
|
lastRow = range.end.row;
|
||||||
else
|
else
|
||||||
lastRow = Infinity;
|
lastRow = Infinity;
|
||||||
this.renderer.updateLines(range.start.row, lastRow);
|
this.renderer.updateLines(range.start.row, lastRow);
|
||||||
|
|
@ -2823,7 +2823,7 @@ var Editor = function(renderer, session) {
|
||||||
|
|
||||||
// remove selected text
|
// remove selected text
|
||||||
if (!this.selection.isEmpty()) {
|
if (!this.selection.isEmpty()) {
|
||||||
var cursor = this.session.remove(this.getSelectionRange());
|
cursor = this.session.remove(this.getSelectionRange());
|
||||||
this.clearSelection();
|
this.clearSelection();
|
||||||
}
|
}
|
||||||
else if (this.session.getOverwrite()) {
|
else if (this.session.getOverwrite()) {
|
||||||
|
|
@ -2926,7 +2926,7 @@ var Editor = function(renderer, session) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getScrollSpeed = function() {
|
this.getScrollSpeed = function() {
|
||||||
return this.$mouseHandler.getScrollSpeed()
|
return this.$mouseHandler.getScrollSpeed();
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$selectionStyle = "line";
|
this.$selectionStyle = "line";
|
||||||
|
|
@ -3182,7 +3182,7 @@ var Editor = function(renderer, session) {
|
||||||
this.removeLines = function() {
|
this.removeLines = function() {
|
||||||
var rows = this.$getSelectedRows();
|
var rows = this.$getSelectedRows();
|
||||||
var range;
|
var range;
|
||||||
if (rows.first == 0 || rows.last+1 < this.session.getLength())
|
if (rows.first === 0 || rows.last+1 < this.session.getLength())
|
||||||
range = new Range(rows.first, 0, rows.last+1, 0);
|
range = new Range(rows.first, 0, rows.last+1, 0);
|
||||||
else
|
else
|
||||||
range = new Range(
|
range = new Range(
|
||||||
|
|
@ -3240,7 +3240,8 @@ var Editor = function(renderer, session) {
|
||||||
range.start.row += linesMoved;
|
range.start.row += linesMoved;
|
||||||
range.end.row += linesMoved;
|
range.end.row += linesMoved;
|
||||||
selection.setSelectionRange(range, reverse);
|
selection.setSelectionRange(range, reverse);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
selection.setSelectionAnchor(rows.last+linesMoved+1, 0);
|
selection.setSelectionAnchor(rows.last+linesMoved+1, 0);
|
||||||
selection.$moveSelection(function() {
|
selection.$moveSelection(function() {
|
||||||
selection.moveCursorTo(rows.first+linesMoved, 0);
|
selection.moveCursorTo(rows.first+linesMoved, 0);
|
||||||
|
|
@ -3395,7 +3396,7 @@ var Editor = function(renderer, session) {
|
||||||
|
|
||||||
this.gotoLine = function(lineNumber, column) {
|
this.gotoLine = function(lineNumber, column) {
|
||||||
this.selection.clearSelection();
|
this.selection.clearSelection();
|
||||||
this.session.unfold({row: lineNumber - 1, column: column || 0})
|
this.session.unfold({row: lineNumber - 1, column: column || 0});
|
||||||
|
|
||||||
this.$blockScrolling += 1;
|
this.$blockScrolling += 1;
|
||||||
this.moveCursorTo(lineNumber-1, column || 0);
|
this.moveCursorTo(lineNumber-1, column || 0);
|
||||||
|
|
@ -4227,7 +4228,7 @@ function DefaultHandlers(editor) {
|
||||||
editor.moveCursorToPosition(pos);
|
editor.moveCursorToPosition(pos);
|
||||||
}
|
}
|
||||||
if(button == 2) {
|
if(button == 2) {
|
||||||
editor.textInput.onContextMenu({x: pageX, y: pageY}, selectionEmpty);
|
editor.textInput.onContextMenu({x: ev.clientX, y: ev.clientY}, selectionEmpty);
|
||||||
event.capture(editor.container, function(){}, editor.textInput.onContextMenuClose);
|
event.capture(editor.container, function(){}, editor.textInput.onContextMenuClose);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
@ -4711,6 +4712,9 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
|
||||||
this.pageX = event.getDocumentX(domEvent);
|
this.pageX = event.getDocumentX(domEvent);
|
||||||
this.pageY = event.getDocumentY(domEvent);
|
this.pageY = event.getDocumentY(domEvent);
|
||||||
|
|
||||||
|
this.clientX = domEvent.clientX;
|
||||||
|
this.clientY = domEvent.clientY;
|
||||||
|
|
||||||
this.$pos = null;
|
this.$pos = null;
|
||||||
this.$inSelection = null;
|
this.$inSelection = null;
|
||||||
|
|
||||||
|
|
@ -4794,7 +4798,8 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
|
||||||
|
|
||||||
}).call(MouseEvent.prototype);
|
}).call(MouseEvent.prototype);
|
||||||
|
|
||||||
});/* ***** BEGIN LICENSE BLOCK *****
|
});
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
*
|
*
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
|
@ -5823,7 +5828,7 @@ var EditSession = function(text, mode) {
|
||||||
this.tokenRe = mode.tokenRe;
|
this.tokenRe = mode.tokenRe;
|
||||||
this.nonTokenRe = mode.nonTokenRe;
|
this.nonTokenRe = mode.nonTokenRe;
|
||||||
|
|
||||||
this.$setFolding(mode);
|
this.$setFolding(mode.foldingRules);
|
||||||
|
|
||||||
this._dispatchEvent("changeMode");
|
this._dispatchEvent("changeMode");
|
||||||
};
|
};
|
||||||
|
|
@ -5948,7 +5953,7 @@ var EditSession = function(text, mode) {
|
||||||
this.$fromUndo = true;
|
this.$fromUndo = true;
|
||||||
var lastUndoRange = null;
|
var lastUndoRange = null;
|
||||||
for (var i = deltas.length - 1; i != -1; i--) {
|
for (var i = deltas.length - 1; i != -1; i--) {
|
||||||
delta = deltas[i];
|
var delta = deltas[i];
|
||||||
if (delta.group == "doc") {
|
if (delta.group == "doc") {
|
||||||
this.doc.revertDeltas(delta.deltas);
|
this.doc.revertDeltas(delta.deltas);
|
||||||
lastUndoRange =
|
lastUndoRange =
|
||||||
|
|
@ -5973,7 +5978,7 @@ var EditSession = function(text, mode) {
|
||||||
this.$fromUndo = true;
|
this.$fromUndo = true;
|
||||||
var lastUndoRange = null;
|
var lastUndoRange = null;
|
||||||
for (var i = 0; i < deltas.length; i++) {
|
for (var i = 0; i < deltas.length; i++) {
|
||||||
delta = deltas[i];
|
var delta = deltas[i];
|
||||||
if (delta.group == "doc") {
|
if (delta.group == "doc") {
|
||||||
this.doc.applyDeltas(delta.deltas);
|
this.doc.applyDeltas(delta.deltas);
|
||||||
lastUndoRange =
|
lastUndoRange =
|
||||||
|
|
@ -6215,7 +6220,7 @@ var EditSession = function(text, mode) {
|
||||||
if (useWrapMode) {
|
if (useWrapMode) {
|
||||||
var len = this.getLength();
|
var len = this.getLength();
|
||||||
this.$wrapData = [];
|
this.$wrapData = [];
|
||||||
for (i = 0; i < len; i++) {
|
for (var i = 0; i < len; i++) {
|
||||||
this.$wrapData.push([]);
|
this.$wrapData.push([]);
|
||||||
}
|
}
|
||||||
this.$updateWrapData(0, len - 1);
|
this.$updateWrapData(0, len - 1);
|
||||||
|
|
@ -6377,7 +6382,6 @@ var EditSession = function(text, mode) {
|
||||||
} else {
|
} else {
|
||||||
// Realign folds. E.g. if you add some new chars before a fold, the
|
// Realign folds. E.g. if you add some new chars before a fold, the
|
||||||
// fold should "move" to the right.
|
// fold should "move" to the right.
|
||||||
var column;
|
|
||||||
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
|
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
|
||||||
if (action.indexOf("remove") != -1) {
|
if (action.indexOf("remove") != -1) {
|
||||||
// Get all the folds in the change range and remove them.
|
// Get all the folds in the change range and remove them.
|
||||||
|
|
@ -6465,7 +6469,6 @@ var EditSession = function(text, mode) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
var tabSize = this.getTabSize();
|
|
||||||
var splits = [];
|
var splits = [];
|
||||||
var displayLength = tokens.length;
|
var displayLength = tokens.length;
|
||||||
var lastSplit = 0, lastDocSplit = 0;
|
var lastSplit = 0, lastDocSplit = 0;
|
||||||
|
|
@ -6721,7 +6724,6 @@ var EditSession = function(text, mode) {
|
||||||
var docRow = 0;
|
var docRow = 0;
|
||||||
var docColumn = 0;
|
var docColumn = 0;
|
||||||
var column;
|
var column;
|
||||||
var foldLineRowLength;
|
|
||||||
var row = 0;
|
var row = 0;
|
||||||
var rowLength = 0;
|
var rowLength = 0;
|
||||||
|
|
||||||
|
|
@ -6821,8 +6823,6 @@ var EditSession = function(text, mode) {
|
||||||
docRow = pos.row;
|
docRow = pos.row;
|
||||||
docColumn = pos.column;
|
docColumn = pos.column;
|
||||||
|
|
||||||
var LL = this.$rowCache.length;
|
|
||||||
|
|
||||||
var wrapData;
|
var wrapData;
|
||||||
// Special case in wrapMode if the doc is at the end of the document.
|
// Special case in wrapMode if the doc is at the end of the document.
|
||||||
if (this.$useWrapMode) {
|
if (this.$useWrapMode) {
|
||||||
|
|
@ -6838,7 +6838,6 @@ var EditSession = function(text, mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var screenRow = 0;
|
var screenRow = 0;
|
||||||
var screenColumn = 0;
|
|
||||||
var foldStartRow = null;
|
var foldStartRow = null;
|
||||||
var fold = null;
|
var fold = null;
|
||||||
|
|
||||||
|
|
@ -9390,8 +9389,31 @@ function Folding() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return foundFolds;
|
return foundFolds;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all folds in the document
|
||||||
|
*/
|
||||||
|
this.getAllFolds = function() {
|
||||||
|
var folds = [];
|
||||||
|
var foldLines = this.$foldData;
|
||||||
|
|
||||||
|
function addFold(fold) {
|
||||||
|
folds.push(fold);
|
||||||
|
if (!fold.subFolds)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (var i = 0; i < fold.subFolds.length; i++)
|
||||||
|
addFold(fold.subFolds[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < foldLines.length; i++)
|
||||||
|
for (var j = 0; j < foldLines[i].folds.length; j++)
|
||||||
|
addFold(foldLines[i].folds[j]);
|
||||||
|
|
||||||
|
return folds;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the string between folds at the given position.
|
* Returns the string between folds at the given position.
|
||||||
* E.g.
|
* E.g.
|
||||||
|
|
@ -9410,7 +9432,7 @@ function Folding() {
|
||||||
* fo|o<fold>bar<fold>wolrd -trim=00> "foo"
|
* fo|o<fold>bar<fold>wolrd -trim=00> "foo"
|
||||||
*/
|
*/
|
||||||
this.getFoldStringAt = function(row, column, trim, foldLine) {
|
this.getFoldStringAt = function(row, column, trim, foldLine) {
|
||||||
var foldLine = foldLine || this.getFoldLine(row);
|
foldLine = foldLine || this.getFoldLine(row);
|
||||||
if (!foldLine)
|
if (!foldLine)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
|
@ -9418,16 +9440,17 @@ function Folding() {
|
||||||
end: { column: 0 }
|
end: { column: 0 }
|
||||||
};
|
};
|
||||||
// TODO: Refactor to use getNextFoldTo function.
|
// TODO: Refactor to use getNextFoldTo function.
|
||||||
|
var str, fold;
|
||||||
for (var i = 0; i < foldLine.folds.length; i++) {
|
for (var i = 0; i < foldLine.folds.length; i++) {
|
||||||
var fold = foldLine.folds[i];
|
fold = foldLine.folds[i];
|
||||||
var cmp = fold.range.compareEnd(row, column);
|
var cmp = fold.range.compareEnd(row, column);
|
||||||
if (cmp == -1) {
|
if (cmp == -1) {
|
||||||
var str = this
|
str = this
|
||||||
.getLine(fold.start.row)
|
.getLine(fold.start.row)
|
||||||
.substring(lastFold.end.column, fold.start.column);
|
.substring(lastFold.end.column, fold.start.column);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (cmp == 0) {
|
else if (cmp === 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
lastFold = fold;
|
lastFold = fold;
|
||||||
|
|
@ -9438,10 +9461,10 @@ function Folding() {
|
||||||
if (trim == -1)
|
if (trim == -1)
|
||||||
return str.substring(0, column - lastFold.end.column);
|
return str.substring(0, column - lastFold.end.column);
|
||||||
else if (trim == 1)
|
else if (trim == 1)
|
||||||
return str.substring(column - lastFold.end.column)
|
return str.substring(column - lastFold.end.column);
|
||||||
else
|
else
|
||||||
return str;
|
return str;
|
||||||
}
|
};
|
||||||
|
|
||||||
this.getFoldLine = function(docRow, startFoldLine) {
|
this.getFoldLine = function(docRow, startFoldLine) {
|
||||||
var foldData = this.$foldData;
|
var foldData = this.$foldData;
|
||||||
|
|
@ -9459,11 +9482,11 @@ function Folding() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
};
|
||||||
|
|
||||||
// returns the fold which starts after or contains docRow
|
// returns the fold which starts after or contains docRow
|
||||||
this.getNextFoldLine = function(docRow, startFoldLine) {
|
this.getNextFoldLine = function(docRow, startFoldLine) {
|
||||||
var foldData = this.$foldData, ans;
|
var foldData = this.$foldData;
|
||||||
var i = 0;
|
var i = 0;
|
||||||
if (startFoldLine)
|
if (startFoldLine)
|
||||||
i = foldData.indexOf(startFoldLine);
|
i = foldData.indexOf(startFoldLine);
|
||||||
|
|
@ -9476,7 +9499,7 @@ function Folding() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
};
|
||||||
|
|
||||||
this.getFoldedRowCount = function(first, last) {
|
this.getFoldedRowCount = function(first, last) {
|
||||||
var foldData = this.$foldData, rowCount = last-first+1;
|
var foldData = this.$foldData, rowCount = last-first+1;
|
||||||
|
|
@ -9500,7 +9523,7 @@ function Folding() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rowCount;
|
return rowCount;
|
||||||
}
|
};
|
||||||
|
|
||||||
this.$addFoldLine = function(foldLine) {
|
this.$addFoldLine = function(foldLine) {
|
||||||
this.$foldData.push(foldLine);
|
this.$foldData.push(foldLine);
|
||||||
|
|
@ -9508,7 +9531,7 @@ function Folding() {
|
||||||
return a.start.row - b.start.row;
|
return a.start.row - b.start.row;
|
||||||
});
|
});
|
||||||
return foldLine;
|
return foldLine;
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a new fold.
|
* Adds a new fold.
|
||||||
|
|
@ -9520,9 +9543,10 @@ function Folding() {
|
||||||
this.addFold = function(placeholder, range) {
|
this.addFold = function(placeholder, range) {
|
||||||
var foldData = this.$foldData;
|
var foldData = this.$foldData;
|
||||||
var added = false;
|
var added = false;
|
||||||
|
var fold;
|
||||||
|
|
||||||
if (placeholder instanceof Fold)
|
if (placeholder instanceof Fold)
|
||||||
var fold = placeholder;
|
fold = placeholder;
|
||||||
else
|
else
|
||||||
fold = new Fold(range, placeholder);
|
fold = new Fold(range, placeholder);
|
||||||
|
|
||||||
|
|
@ -9573,7 +9597,7 @@ function Folding() {
|
||||||
added = true;
|
added = true;
|
||||||
if (!fold.sameRow) {
|
if (!fold.sameRow) {
|
||||||
// Check if we might have to merge two FoldLines.
|
// Check if we might have to merge two FoldLines.
|
||||||
foldLineNext = foldData[i + 1];
|
var foldLineNext = foldData[i + 1];
|
||||||
if (foldLineNext && foldLineNext.start.row == endRow) {
|
if (foldLineNext && foldLineNext.start.row == endRow) {
|
||||||
// We need to merge!
|
// We need to merge!
|
||||||
foldLine.merge(foldLineNext);
|
foldLine.merge(foldLineNext);
|
||||||
|
|
@ -9654,7 +9678,7 @@ function Folding() {
|
||||||
// Notify that fold data has changed.
|
// Notify that fold data has changed.
|
||||||
this.$modified = true;
|
this.$modified = true;
|
||||||
this._dispatchEvent("changeFold", { data: fold });
|
this._dispatchEvent("changeFold", { data: fold });
|
||||||
}
|
};
|
||||||
|
|
||||||
this.removeFolds = function(folds) {
|
this.removeFolds = function(folds) {
|
||||||
// We need to clone the folds array passed in as it might be the folds
|
// We need to clone the folds array passed in as it might be the folds
|
||||||
|
|
@ -9827,7 +9851,7 @@ function Folding() {
|
||||||
|
|
||||||
if (fold && fold.range.toString() == range.toString()){
|
if (fold && fold.range.toString() == range.toString()){
|
||||||
this.expandFold(fold);
|
this.expandFold(fold);
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var placeholder = "...";
|
var placeholder = "...";
|
||||||
|
|
@ -9835,7 +9859,7 @@ function Folding() {
|
||||||
placeholder = this.getTextRange(range);
|
placeholder = this.getTextRange(range);
|
||||||
if(placeholder.length < 4)
|
if(placeholder.length < 4)
|
||||||
return;
|
return;
|
||||||
placeholder = placeholder.trim().substring(0, 2) + ".."
|
placeholder = placeholder.trim().substring(0, 2) + "..";
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addFold(placeholder, range);
|
this.addFold(placeholder, range);
|
||||||
|
|
@ -9846,10 +9870,10 @@ function Folding() {
|
||||||
var token = iterator.getCurrentToken();
|
var token = iterator.getCurrentToken();
|
||||||
if (token && /^comment|string/.test(token.type)) {
|
if (token && /^comment|string/.test(token.type)) {
|
||||||
var range = new Range();
|
var range = new Range();
|
||||||
var t;
|
var re = new RegExp(token.type.replace(/\..*/, "\\."));
|
||||||
do {
|
do {
|
||||||
t = iterator.stepBackward();
|
token = iterator.stepBackward();
|
||||||
} while(t && t.type == token.type)
|
} while(token && re.test(token.type))
|
||||||
|
|
||||||
iterator.stepForward();
|
iterator.stepForward();
|
||||||
range.start.row = iterator.getCurrentTokenRow();
|
range.start.row = iterator.getCurrentTokenRow();
|
||||||
|
|
@ -9858,342 +9882,109 @@ function Folding() {
|
||||||
var iterator = new TokenIterator(this, row, column);
|
var iterator = new TokenIterator(this, row, column);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
t = iterator.stepForward();
|
token = iterator.stepForward();
|
||||||
} while(t && t.type == token.type)
|
} while(token && re.test(token.type))
|
||||||
t = iterator.stepBackward();
|
token = iterator.stepBackward();
|
||||||
|
|
||||||
range.end.row = iterator.getCurrentTokenRow();
|
range.end.row = iterator.getCurrentTokenRow();
|
||||||
range.end.column = iterator.getCurrentTokenColumn() + t.value.length - 1;
|
range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 1;
|
||||||
return range
|
return range
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.foldAll = function() {
|
this.foldAll = function(startRow, endRow) {
|
||||||
var foldWidgets = this.foldWidgets
|
var foldWidgets = this.foldWidgets;
|
||||||
for (var row = foldWidgets.length; row--; ) {
|
endRow = endRow || foldWidgets.length;
|
||||||
|
for (var row = startRow || 0; row < endRow; row++) {
|
||||||
if (foldWidgets[row] == null)
|
if (foldWidgets[row] == null)
|
||||||
foldWidgets[row] = this.getFoldWidget(row)
|
foldWidgets[row] = this.getFoldWidget(row);
|
||||||
if (foldWidgets[row] != "start")
|
if (foldWidgets[row] != "start")
|
||||||
continue
|
continue;
|
||||||
|
|
||||||
var range = this.getFoldWidgetRange(row);
|
var range = this.getFoldWidgetRange(row);
|
||||||
if (range)
|
// sometimes range can be incompatible with existing fold
|
||||||
this.addFold("...", range)
|
// wouldn't it be better for addFold to return null istead of throwing?
|
||||||
|
if (range && range.end.row < endRow) try {
|
||||||
|
this.addFold("...", range);
|
||||||
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// structured folding
|
// structured folding
|
||||||
this.$setFolding = function(mode) {
|
this.$setFolding = function(foldMode) {
|
||||||
mode = mode && mode.foldingRules;
|
|
||||||
var foldRules = Folding.commonFoldingRules
|
if (this.$foldMode == foldMode)
|
||||||
if (typeof mode == "string")
|
return;
|
||||||
mode = foldRules[mode];
|
this.$foldMode = foldMode;
|
||||||
|
|
||||||
if (mode) {
|
|
||||||
this.foldWidgets = [];
|
|
||||||
this.removeListener('change', this.$updateFoldWidgets);
|
this.removeListener('change', this.$updateFoldWidgets);
|
||||||
|
|
||||||
if (mode.getFoldWidget)
|
if (!foldMode) {
|
||||||
this.getFoldWidget = mode.getFoldWidget;
|
|
||||||
else if (mode.foldingStopMarker)
|
|
||||||
this.getFoldWidget = foldRules.$testBoth;
|
|
||||||
else
|
|
||||||
this.getFoldWidget = foldRules.$testStart;
|
|
||||||
|
|
||||||
this.foldingStopMarker = mode.foldingStopMarker;
|
|
||||||
this.foldingStartMarker = mode.foldingStartMarker;
|
|
||||||
|
|
||||||
if (typeof mode.getFoldWidgetRange == "string")
|
|
||||||
this.getFoldWidgetRange = foldRules[mode.getFoldWidgetRange];
|
|
||||||
else
|
|
||||||
this.getFoldWidgetRange = mode.getFoldWidgetRange;
|
|
||||||
|
|
||||||
|
|
||||||
this.$updateFoldWidgets = (mode.onChange || foldRules.onChange).bind(this);
|
|
||||||
|
|
||||||
this.on('change', this.$updateFoldWidgets);
|
|
||||||
} else {
|
|
||||||
this.foldWidgets = null;
|
this.foldWidgets = null;
|
||||||
this.removeListener('change', this.$updateFoldWidgets);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.foldWidgets = [];
|
||||||
|
this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this);
|
||||||
|
this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this);
|
||||||
|
|
||||||
|
this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);
|
||||||
|
this.on('change', this.$updateFoldWidgets);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.onFoldWidgetClick = function(row, htmlEvent) {
|
this.onFoldWidgetClick = function(row, e) {
|
||||||
var type = this.getFoldWidget(row);
|
var type = this.getFoldWidget(row);
|
||||||
var line = this.getLine(row);
|
var line = this.getLine(row);
|
||||||
|
var onlySubfolds = e.shiftKey;
|
||||||
|
var addSubfolds = onlySubfolds || e.ctrlKey || e.altKey || e.metaKey;
|
||||||
|
var fold;
|
||||||
|
|
||||||
if (type == "end")
|
if (type == "end")
|
||||||
var fold = this.getFoldAt(row, 0, -1);
|
fold = this.getFoldAt(row, 0, -1);
|
||||||
else
|
else
|
||||||
var fold = this.getFoldAt(row, line.length, 1);
|
fold = this.getFoldAt(row, line.length, 1);
|
||||||
|
|
||||||
if (fold) {
|
if (fold) {
|
||||||
|
if (addSubfolds)
|
||||||
|
this.removeFold(fold);
|
||||||
|
else
|
||||||
this.expandFold(fold);
|
this.expandFold(fold);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var range = this.getFoldWidgetRange(row);
|
var range = this.getFoldWidgetRange(row);
|
||||||
if (range)
|
if (range) {
|
||||||
|
if (!onlySubfolds)
|
||||||
this.addFold("...", range);
|
this.addFold("...", range);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Folding.commonFoldingRules = {
|
if (addSubfolds)
|
||||||
$testStart: function(row) {
|
this.foldAll(range.start.row + 1, range.end.row);
|
||||||
if(this.foldingStartMarker.test(this.getLine(row)))
|
}
|
||||||
return "start";
|
};
|
||||||
return "";
|
|
||||||
},
|
this.updateFoldWidgets = function(e) {
|
||||||
$testBoth: function(row) {
|
|
||||||
var line = this.getLine(row);
|
|
||||||
if(this.foldingStartMarker.test(line))
|
|
||||||
return "start";
|
|
||||||
if(this.foldingStopMarker.test(line))
|
|
||||||
return "end";
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
onChange: function(e) {
|
|
||||||
var delta = e.data;
|
var delta = e.data;
|
||||||
var range = delta.range;
|
var range = delta.range;
|
||||||
var firstRow = range.start.row;
|
var firstRow = range.start.row;
|
||||||
var len = range.end.row - firstRow;
|
var len = range.end.row - firstRow;
|
||||||
|
|
||||||
if (len == 0) {
|
if (len === 0) {
|
||||||
this.foldWidgets[firstRow] = null;
|
this.foldWidgets[firstRow] = null;
|
||||||
} else if (delta.action == "removeText" || delta.action == "removeLines") {
|
} else if (delta.action == "removeText" || delta.action == "removeLines") {
|
||||||
this.foldWidgets.splice(firstRow, len + 1, null);
|
this.foldWidgets.splice(firstRow, len + 1, null);
|
||||||
} else {
|
} else {
|
||||||
var args = Array(len + 1);
|
var args = Array(len + 1);
|
||||||
args.unshift(firstRow, 1)
|
args.unshift(firstRow, 1);
|
||||||
this.foldWidgets.splice.apply(this.foldWidgets, args);
|
this.foldWidgets.splice.apply(this.foldWidgets, args);
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
indentationBlock: function(row) {
|
|
||||||
var re = /^\s*/;
|
|
||||||
var startRow = row, endRow = row;
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var startColumn = line.length - 1;
|
|
||||||
var startLevel = line.match(re)[0].length;
|
|
||||||
|
|
||||||
while (line = this.getLine(++row)) {
|
|
||||||
var level = line.match(re)[0].length;
|
|
||||||
|
|
||||||
if (level == line.length)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (level <= startLevel)
|
|
||||||
break;
|
|
||||||
|
|
||||||
endRow = row;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (endRow > startRow) {
|
|
||||||
var endColumn = this.getLine(endRow).length;
|
|
||||||
return new Range(startRow, startColumn, endRow, endColumn);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"cStyle": {
|
|
||||||
foldingStartMarker : /(\{|\[)[^\}\]]*$|^\s*(\/\*)/,
|
|
||||||
foldingStopMarker : /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,
|
|
||||||
getFoldWidgetRange: function(row) {
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var match = line.match(this.foldingStartMarker);
|
|
||||||
if (match) {
|
|
||||||
var i = match.index;
|
|
||||||
|
|
||||||
if (match[2])
|
|
||||||
return this.getCommentFoldRange(row, i + match[0].length);
|
|
||||||
|
|
||||||
var start = {row: row, column: i+1};
|
|
||||||
var end = this.$findClosingBracket(match[1], start);
|
|
||||||
if (end) {
|
|
||||||
var fw = this.foldWidgets[end.row];
|
|
||||||
if (fw == null)
|
|
||||||
fw = this.getFoldWidget(end.row);
|
|
||||||
|
|
||||||
if (fw == "start"){
|
|
||||||
end.row --;
|
|
||||||
end.column = this.getLine(end.row).length;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
end = {row: this.getLength(), column: 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
return Range.fromPoints(start, end);
|
|
||||||
}
|
|
||||||
|
|
||||||
var match = line.match(this.foldingStopMarker);
|
|
||||||
if (match) {
|
|
||||||
var i = match.index + match[0].length;
|
|
||||||
|
|
||||||
if (match[2])
|
|
||||||
return this.getCommentFoldRange(row, i);
|
|
||||||
|
|
||||||
var end = {row: row, column: i};
|
|
||||||
var start = this.$findOpeningBracket(match[1], end)
|
|
||||||
if (start){
|
|
||||||
start.column++;
|
|
||||||
end.column--;
|
|
||||||
} else {
|
|
||||||
start = {row: 0, column: this.getLine(0).length}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Range.fromPoints(start, end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// TODO: folding based only on indentation
|
|
||||||
"indentation": null,
|
|
||||||
|
|
||||||
"xml": {
|
|
||||||
|
|
||||||
voidElements: {
|
|
||||||
"area": 1,
|
|
||||||
"base": 1,
|
|
||||||
"br": 1,
|
|
||||||
"col": 1,
|
|
||||||
"command": 1,
|
|
||||||
"embed": 1,
|
|
||||||
"hr": 1,
|
|
||||||
"img": 1,
|
|
||||||
"input": 1,
|
|
||||||
"keygen": 1,
|
|
||||||
"link": 1,
|
|
||||||
"meta": 1,
|
|
||||||
"param": 1,
|
|
||||||
"source": 1,
|
|
||||||
"track": 1,
|
|
||||||
"wbr": 1
|
|
||||||
},
|
|
||||||
|
|
||||||
getFoldWidget: function(row) {
|
|
||||||
var tags = this.getTokens(row, row)[0].tokens
|
|
||||||
.filter(function(token) {
|
|
||||||
return token.type === "meta.tag"
|
|
||||||
})
|
|
||||||
.map(function(token) {
|
|
||||||
return token.value;
|
|
||||||
}).
|
|
||||||
join("")
|
|
||||||
.trim()
|
|
||||||
.replace(/^<|>$|\s+/g, "")
|
|
||||||
.split("><")
|
|
||||||
|
|
||||||
var fold = tags[0];
|
|
||||||
|
|
||||||
if (!fold || Folding.commonFoldingRules.xml.voidElements[fold])
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (fold.charAt(0) == "/")
|
|
||||||
return "end";
|
|
||||||
|
|
||||||
if (tags.indexOf("/" + fold) !== -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
return "start";
|
|
||||||
},
|
|
||||||
|
|
||||||
getFoldWidgetRange: function(row) {
|
|
||||||
var start, end;
|
|
||||||
var stack = [];
|
|
||||||
|
|
||||||
var iterator = new TokenIterator(this, row, 0);
|
|
||||||
var step = "stepForward";
|
|
||||||
var isBack = false;
|
|
||||||
|
|
||||||
// http://dev.w3.org/html5/spec/syntax.html#optional-tags
|
|
||||||
// TODO
|
|
||||||
// var optionalTags = {
|
|
||||||
// "html": 1,
|
|
||||||
// "head": 1,
|
|
||||||
// "body": 1,
|
|
||||||
// "li": 1,
|
|
||||||
// "dt": 1,
|
|
||||||
// "dd": 1,
|
|
||||||
// "p": 1,
|
|
||||||
// "rt": 1,
|
|
||||||
// "rp": 1,
|
|
||||||
// "optgroup": 1,
|
|
||||||
// "option": 1,
|
|
||||||
// "colgroup": 1,
|
|
||||||
// "thead": 1,
|
|
||||||
// "tbody": 1,
|
|
||||||
// "tfoot": 1,
|
|
||||||
// "tr": 1,
|
|
||||||
// "td": 1,
|
|
||||||
// "th": 1
|
|
||||||
// };
|
|
||||||
|
|
||||||
// limited XML parsing to find matching tag
|
|
||||||
do {
|
|
||||||
var token = iterator.getCurrentToken();
|
|
||||||
|
|
||||||
var value = token.value.trim();
|
|
||||||
if (token && token.type == "meta.tag" && token.value !== ">") {
|
|
||||||
var tagName = value.replace(/^[<\s]*|[\s*>]$/g, "");
|
|
||||||
if (Folding.commonFoldingRules.xml.voidElements[tagName])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!start) {
|
|
||||||
if (tagName.charAt(0) == "/") {
|
|
||||||
tagName = tagName.slice(1);
|
|
||||||
step = "stepBackward";
|
|
||||||
isBack = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
start = {
|
|
||||||
row: row,
|
|
||||||
column: iterator.getCurrentTokenColumn() + (isBack ? 0 : value.length + 1)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// console.log("push", tagName)
|
|
||||||
stack.push(tagName);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (tagName.charAt(0) == "/") {
|
|
||||||
tagName = tagName.slice(1);
|
|
||||||
var close = !isBack;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
close = isBack;
|
|
||||||
|
|
||||||
if (close) {
|
|
||||||
if (stack[stack.length-1] == tagName) {
|
|
||||||
// console.log("pop", tagName)
|
|
||||||
stack.pop();
|
|
||||||
if (stack.length == 0) {
|
|
||||||
end = {
|
|
||||||
row: iterator.getCurrentTokenRow(),
|
|
||||||
column: iterator.getCurrentTokenColumn() + (isBack ? value.length : 0)
|
|
||||||
};
|
|
||||||
if (isBack)
|
|
||||||
return Range.fromPoints(end, start);
|
|
||||||
else
|
|
||||||
return Range.fromPoints(start, end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// console.error("unmatched tags!", tagName, stack)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// console.log("push", tagName)
|
|
||||||
stack.push(tagName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} while(token = iterator[step]());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.Folding = Folding;
|
exports.Folding = Folding;
|
||||||
|
|
||||||
});/* vim:ts=4:sts=4:sw=4:
|
});
|
||||||
|
/* vim:ts=4:sts=4:sw=4:
|
||||||
* ***** BEGIN LICENSE BLOCK *****
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
*
|
*
|
||||||
|
|
@ -12498,7 +12289,8 @@ var Gutter = function(parentEl) {
|
||||||
|
|
||||||
if (foldWidgets) {
|
if (foldWidgets) {
|
||||||
var c = foldWidgets[i];
|
var c = foldWidgets[i];
|
||||||
if (!c)
|
// check if cached value is invalidated and we need to recompute
|
||||||
|
if (c == null)
|
||||||
c = foldWidgets[i] = this.session.getFoldWidget(i);
|
c = foldWidgets[i] = this.session.getFoldWidget(i);
|
||||||
if (c)
|
if (c)
|
||||||
html.push(
|
html.push(
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -2370,12 +2370,11 @@ exports.getOS = function() {
|
||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
__ace_shadowed__.define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/event', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands'], function(require, exports, module) {
|
__ace_shadowed__.define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands'], function(require, exports, module) {
|
||||||
|
|
||||||
require("./lib/fixoldbrowsers");
|
require("./lib/fixoldbrowsers");
|
||||||
|
|
||||||
var oop = require("./lib/oop");
|
var oop = require("./lib/oop");
|
||||||
var event = require("./lib/event");
|
|
||||||
var lang = require("./lib/lang");
|
var lang = require("./lib/lang");
|
||||||
var useragent = require("./lib/useragent");
|
var useragent = require("./lib/useragent");
|
||||||
var TextInput = require("./keyboard/textinput").TextInput;
|
var TextInput = require("./keyboard/textinput").TextInput;
|
||||||
|
|
@ -2628,9 +2627,10 @@ var Editor = function(renderer, session) {
|
||||||
this.onDocumentChange = function(e) {
|
this.onDocumentChange = function(e) {
|
||||||
var delta = e.data;
|
var delta = e.data;
|
||||||
var range = delta.range;
|
var range = delta.range;
|
||||||
|
var lastRow;
|
||||||
|
|
||||||
if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines")
|
if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines")
|
||||||
var lastRow = range.end.row;
|
lastRow = range.end.row;
|
||||||
else
|
else
|
||||||
lastRow = Infinity;
|
lastRow = Infinity;
|
||||||
this.renderer.updateLines(range.start.row, lastRow);
|
this.renderer.updateLines(range.start.row, lastRow);
|
||||||
|
|
@ -2777,7 +2777,7 @@ var Editor = function(renderer, session) {
|
||||||
|
|
||||||
// remove selected text
|
// remove selected text
|
||||||
if (!this.selection.isEmpty()) {
|
if (!this.selection.isEmpty()) {
|
||||||
var cursor = this.session.remove(this.getSelectionRange());
|
cursor = this.session.remove(this.getSelectionRange());
|
||||||
this.clearSelection();
|
this.clearSelection();
|
||||||
}
|
}
|
||||||
else if (this.session.getOverwrite()) {
|
else if (this.session.getOverwrite()) {
|
||||||
|
|
@ -2880,7 +2880,7 @@ var Editor = function(renderer, session) {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getScrollSpeed = function() {
|
this.getScrollSpeed = function() {
|
||||||
return this.$mouseHandler.getScrollSpeed()
|
return this.$mouseHandler.getScrollSpeed();
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$selectionStyle = "line";
|
this.$selectionStyle = "line";
|
||||||
|
|
@ -3136,7 +3136,7 @@ var Editor = function(renderer, session) {
|
||||||
this.removeLines = function() {
|
this.removeLines = function() {
|
||||||
var rows = this.$getSelectedRows();
|
var rows = this.$getSelectedRows();
|
||||||
var range;
|
var range;
|
||||||
if (rows.first == 0 || rows.last+1 < this.session.getLength())
|
if (rows.first === 0 || rows.last+1 < this.session.getLength())
|
||||||
range = new Range(rows.first, 0, rows.last+1, 0);
|
range = new Range(rows.first, 0, rows.last+1, 0);
|
||||||
else
|
else
|
||||||
range = new Range(
|
range = new Range(
|
||||||
|
|
@ -3194,7 +3194,8 @@ var Editor = function(renderer, session) {
|
||||||
range.start.row += linesMoved;
|
range.start.row += linesMoved;
|
||||||
range.end.row += linesMoved;
|
range.end.row += linesMoved;
|
||||||
selection.setSelectionRange(range, reverse);
|
selection.setSelectionRange(range, reverse);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
selection.setSelectionAnchor(rows.last+linesMoved+1, 0);
|
selection.setSelectionAnchor(rows.last+linesMoved+1, 0);
|
||||||
selection.$moveSelection(function() {
|
selection.$moveSelection(function() {
|
||||||
selection.moveCursorTo(rows.first+linesMoved, 0);
|
selection.moveCursorTo(rows.first+linesMoved, 0);
|
||||||
|
|
@ -3349,7 +3350,7 @@ var Editor = function(renderer, session) {
|
||||||
|
|
||||||
this.gotoLine = function(lineNumber, column) {
|
this.gotoLine = function(lineNumber, column) {
|
||||||
this.selection.clearSelection();
|
this.selection.clearSelection();
|
||||||
this.session.unfold({row: lineNumber - 1, column: column || 0})
|
this.session.unfold({row: lineNumber - 1, column: column || 0});
|
||||||
|
|
||||||
this.$blockScrolling += 1;
|
this.$blockScrolling += 1;
|
||||||
this.moveCursorTo(lineNumber-1, column || 0);
|
this.moveCursorTo(lineNumber-1, column || 0);
|
||||||
|
|
@ -4181,7 +4182,7 @@ function DefaultHandlers(editor) {
|
||||||
editor.moveCursorToPosition(pos);
|
editor.moveCursorToPosition(pos);
|
||||||
}
|
}
|
||||||
if(button == 2) {
|
if(button == 2) {
|
||||||
editor.textInput.onContextMenu({x: pageX, y: pageY}, selectionEmpty);
|
editor.textInput.onContextMenu({x: ev.clientX, y: ev.clientY}, selectionEmpty);
|
||||||
event.capture(editor.container, function(){}, editor.textInput.onContextMenuClose);
|
event.capture(editor.container, function(){}, editor.textInput.onContextMenuClose);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
@ -4665,6 +4666,9 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
|
||||||
this.pageX = event.getDocumentX(domEvent);
|
this.pageX = event.getDocumentX(domEvent);
|
||||||
this.pageY = event.getDocumentY(domEvent);
|
this.pageY = event.getDocumentY(domEvent);
|
||||||
|
|
||||||
|
this.clientX = domEvent.clientX;
|
||||||
|
this.clientY = domEvent.clientY;
|
||||||
|
|
||||||
this.$pos = null;
|
this.$pos = null;
|
||||||
this.$inSelection = null;
|
this.$inSelection = null;
|
||||||
|
|
||||||
|
|
@ -4748,7 +4752,8 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
|
||||||
|
|
||||||
}).call(MouseEvent.prototype);
|
}).call(MouseEvent.prototype);
|
||||||
|
|
||||||
});/* ***** BEGIN LICENSE BLOCK *****
|
});
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
*
|
*
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
|
@ -5777,7 +5782,7 @@ var EditSession = function(text, mode) {
|
||||||
this.tokenRe = mode.tokenRe;
|
this.tokenRe = mode.tokenRe;
|
||||||
this.nonTokenRe = mode.nonTokenRe;
|
this.nonTokenRe = mode.nonTokenRe;
|
||||||
|
|
||||||
this.$setFolding(mode);
|
this.$setFolding(mode.foldingRules);
|
||||||
|
|
||||||
this._dispatchEvent("changeMode");
|
this._dispatchEvent("changeMode");
|
||||||
};
|
};
|
||||||
|
|
@ -5902,7 +5907,7 @@ var EditSession = function(text, mode) {
|
||||||
this.$fromUndo = true;
|
this.$fromUndo = true;
|
||||||
var lastUndoRange = null;
|
var lastUndoRange = null;
|
||||||
for (var i = deltas.length - 1; i != -1; i--) {
|
for (var i = deltas.length - 1; i != -1; i--) {
|
||||||
delta = deltas[i];
|
var delta = deltas[i];
|
||||||
if (delta.group == "doc") {
|
if (delta.group == "doc") {
|
||||||
this.doc.revertDeltas(delta.deltas);
|
this.doc.revertDeltas(delta.deltas);
|
||||||
lastUndoRange =
|
lastUndoRange =
|
||||||
|
|
@ -5927,7 +5932,7 @@ var EditSession = function(text, mode) {
|
||||||
this.$fromUndo = true;
|
this.$fromUndo = true;
|
||||||
var lastUndoRange = null;
|
var lastUndoRange = null;
|
||||||
for (var i = 0; i < deltas.length; i++) {
|
for (var i = 0; i < deltas.length; i++) {
|
||||||
delta = deltas[i];
|
var delta = deltas[i];
|
||||||
if (delta.group == "doc") {
|
if (delta.group == "doc") {
|
||||||
this.doc.applyDeltas(delta.deltas);
|
this.doc.applyDeltas(delta.deltas);
|
||||||
lastUndoRange =
|
lastUndoRange =
|
||||||
|
|
@ -6169,7 +6174,7 @@ var EditSession = function(text, mode) {
|
||||||
if (useWrapMode) {
|
if (useWrapMode) {
|
||||||
var len = this.getLength();
|
var len = this.getLength();
|
||||||
this.$wrapData = [];
|
this.$wrapData = [];
|
||||||
for (i = 0; i < len; i++) {
|
for (var i = 0; i < len; i++) {
|
||||||
this.$wrapData.push([]);
|
this.$wrapData.push([]);
|
||||||
}
|
}
|
||||||
this.$updateWrapData(0, len - 1);
|
this.$updateWrapData(0, len - 1);
|
||||||
|
|
@ -6331,7 +6336,6 @@ var EditSession = function(text, mode) {
|
||||||
} else {
|
} else {
|
||||||
// Realign folds. E.g. if you add some new chars before a fold, the
|
// Realign folds. E.g. if you add some new chars before a fold, the
|
||||||
// fold should "move" to the right.
|
// fold should "move" to the right.
|
||||||
var column;
|
|
||||||
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
|
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
|
||||||
if (action.indexOf("remove") != -1) {
|
if (action.indexOf("remove") != -1) {
|
||||||
// Get all the folds in the change range and remove them.
|
// Get all the folds in the change range and remove them.
|
||||||
|
|
@ -6419,7 +6423,6 @@ var EditSession = function(text, mode) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
var tabSize = this.getTabSize();
|
|
||||||
var splits = [];
|
var splits = [];
|
||||||
var displayLength = tokens.length;
|
var displayLength = tokens.length;
|
||||||
var lastSplit = 0, lastDocSplit = 0;
|
var lastSplit = 0, lastDocSplit = 0;
|
||||||
|
|
@ -6675,7 +6678,6 @@ var EditSession = function(text, mode) {
|
||||||
var docRow = 0;
|
var docRow = 0;
|
||||||
var docColumn = 0;
|
var docColumn = 0;
|
||||||
var column;
|
var column;
|
||||||
var foldLineRowLength;
|
|
||||||
var row = 0;
|
var row = 0;
|
||||||
var rowLength = 0;
|
var rowLength = 0;
|
||||||
|
|
||||||
|
|
@ -6775,8 +6777,6 @@ var EditSession = function(text, mode) {
|
||||||
docRow = pos.row;
|
docRow = pos.row;
|
||||||
docColumn = pos.column;
|
docColumn = pos.column;
|
||||||
|
|
||||||
var LL = this.$rowCache.length;
|
|
||||||
|
|
||||||
var wrapData;
|
var wrapData;
|
||||||
// Special case in wrapMode if the doc is at the end of the document.
|
// Special case in wrapMode if the doc is at the end of the document.
|
||||||
if (this.$useWrapMode) {
|
if (this.$useWrapMode) {
|
||||||
|
|
@ -6792,7 +6792,6 @@ var EditSession = function(text, mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var screenRow = 0;
|
var screenRow = 0;
|
||||||
var screenColumn = 0;
|
|
||||||
var foldStartRow = null;
|
var foldStartRow = null;
|
||||||
var fold = null;
|
var fold = null;
|
||||||
|
|
||||||
|
|
@ -9344,8 +9343,31 @@ function Folding() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return foundFolds;
|
return foundFolds;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all folds in the document
|
||||||
|
*/
|
||||||
|
this.getAllFolds = function() {
|
||||||
|
var folds = [];
|
||||||
|
var foldLines = this.$foldData;
|
||||||
|
|
||||||
|
function addFold(fold) {
|
||||||
|
folds.push(fold);
|
||||||
|
if (!fold.subFolds)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (var i = 0; i < fold.subFolds.length; i++)
|
||||||
|
addFold(fold.subFolds[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < foldLines.length; i++)
|
||||||
|
for (var j = 0; j < foldLines[i].folds.length; j++)
|
||||||
|
addFold(foldLines[i].folds[j]);
|
||||||
|
|
||||||
|
return folds;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the string between folds at the given position.
|
* Returns the string between folds at the given position.
|
||||||
* E.g.
|
* E.g.
|
||||||
|
|
@ -9364,7 +9386,7 @@ function Folding() {
|
||||||
* fo|o<fold>bar<fold>wolrd -trim=00> "foo"
|
* fo|o<fold>bar<fold>wolrd -trim=00> "foo"
|
||||||
*/
|
*/
|
||||||
this.getFoldStringAt = function(row, column, trim, foldLine) {
|
this.getFoldStringAt = function(row, column, trim, foldLine) {
|
||||||
var foldLine = foldLine || this.getFoldLine(row);
|
foldLine = foldLine || this.getFoldLine(row);
|
||||||
if (!foldLine)
|
if (!foldLine)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
|
@ -9372,16 +9394,17 @@ function Folding() {
|
||||||
end: { column: 0 }
|
end: { column: 0 }
|
||||||
};
|
};
|
||||||
// TODO: Refactor to use getNextFoldTo function.
|
// TODO: Refactor to use getNextFoldTo function.
|
||||||
|
var str, fold;
|
||||||
for (var i = 0; i < foldLine.folds.length; i++) {
|
for (var i = 0; i < foldLine.folds.length; i++) {
|
||||||
var fold = foldLine.folds[i];
|
fold = foldLine.folds[i];
|
||||||
var cmp = fold.range.compareEnd(row, column);
|
var cmp = fold.range.compareEnd(row, column);
|
||||||
if (cmp == -1) {
|
if (cmp == -1) {
|
||||||
var str = this
|
str = this
|
||||||
.getLine(fold.start.row)
|
.getLine(fold.start.row)
|
||||||
.substring(lastFold.end.column, fold.start.column);
|
.substring(lastFold.end.column, fold.start.column);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (cmp == 0) {
|
else if (cmp === 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
lastFold = fold;
|
lastFold = fold;
|
||||||
|
|
@ -9392,10 +9415,10 @@ function Folding() {
|
||||||
if (trim == -1)
|
if (trim == -1)
|
||||||
return str.substring(0, column - lastFold.end.column);
|
return str.substring(0, column - lastFold.end.column);
|
||||||
else if (trim == 1)
|
else if (trim == 1)
|
||||||
return str.substring(column - lastFold.end.column)
|
return str.substring(column - lastFold.end.column);
|
||||||
else
|
else
|
||||||
return str;
|
return str;
|
||||||
}
|
};
|
||||||
|
|
||||||
this.getFoldLine = function(docRow, startFoldLine) {
|
this.getFoldLine = function(docRow, startFoldLine) {
|
||||||
var foldData = this.$foldData;
|
var foldData = this.$foldData;
|
||||||
|
|
@ -9413,11 +9436,11 @@ function Folding() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
};
|
||||||
|
|
||||||
// returns the fold which starts after or contains docRow
|
// returns the fold which starts after or contains docRow
|
||||||
this.getNextFoldLine = function(docRow, startFoldLine) {
|
this.getNextFoldLine = function(docRow, startFoldLine) {
|
||||||
var foldData = this.$foldData, ans;
|
var foldData = this.$foldData;
|
||||||
var i = 0;
|
var i = 0;
|
||||||
if (startFoldLine)
|
if (startFoldLine)
|
||||||
i = foldData.indexOf(startFoldLine);
|
i = foldData.indexOf(startFoldLine);
|
||||||
|
|
@ -9430,7 +9453,7 @@ function Folding() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
};
|
||||||
|
|
||||||
this.getFoldedRowCount = function(first, last) {
|
this.getFoldedRowCount = function(first, last) {
|
||||||
var foldData = this.$foldData, rowCount = last-first+1;
|
var foldData = this.$foldData, rowCount = last-first+1;
|
||||||
|
|
@ -9454,7 +9477,7 @@ function Folding() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rowCount;
|
return rowCount;
|
||||||
}
|
};
|
||||||
|
|
||||||
this.$addFoldLine = function(foldLine) {
|
this.$addFoldLine = function(foldLine) {
|
||||||
this.$foldData.push(foldLine);
|
this.$foldData.push(foldLine);
|
||||||
|
|
@ -9462,7 +9485,7 @@ function Folding() {
|
||||||
return a.start.row - b.start.row;
|
return a.start.row - b.start.row;
|
||||||
});
|
});
|
||||||
return foldLine;
|
return foldLine;
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a new fold.
|
* Adds a new fold.
|
||||||
|
|
@ -9474,9 +9497,10 @@ function Folding() {
|
||||||
this.addFold = function(placeholder, range) {
|
this.addFold = function(placeholder, range) {
|
||||||
var foldData = this.$foldData;
|
var foldData = this.$foldData;
|
||||||
var added = false;
|
var added = false;
|
||||||
|
var fold;
|
||||||
|
|
||||||
if (placeholder instanceof Fold)
|
if (placeholder instanceof Fold)
|
||||||
var fold = placeholder;
|
fold = placeholder;
|
||||||
else
|
else
|
||||||
fold = new Fold(range, placeholder);
|
fold = new Fold(range, placeholder);
|
||||||
|
|
||||||
|
|
@ -9527,7 +9551,7 @@ function Folding() {
|
||||||
added = true;
|
added = true;
|
||||||
if (!fold.sameRow) {
|
if (!fold.sameRow) {
|
||||||
// Check if we might have to merge two FoldLines.
|
// Check if we might have to merge two FoldLines.
|
||||||
foldLineNext = foldData[i + 1];
|
var foldLineNext = foldData[i + 1];
|
||||||
if (foldLineNext && foldLineNext.start.row == endRow) {
|
if (foldLineNext && foldLineNext.start.row == endRow) {
|
||||||
// We need to merge!
|
// We need to merge!
|
||||||
foldLine.merge(foldLineNext);
|
foldLine.merge(foldLineNext);
|
||||||
|
|
@ -9608,7 +9632,7 @@ function Folding() {
|
||||||
// Notify that fold data has changed.
|
// Notify that fold data has changed.
|
||||||
this.$modified = true;
|
this.$modified = true;
|
||||||
this._dispatchEvent("changeFold", { data: fold });
|
this._dispatchEvent("changeFold", { data: fold });
|
||||||
}
|
};
|
||||||
|
|
||||||
this.removeFolds = function(folds) {
|
this.removeFolds = function(folds) {
|
||||||
// We need to clone the folds array passed in as it might be the folds
|
// We need to clone the folds array passed in as it might be the folds
|
||||||
|
|
@ -9781,7 +9805,7 @@ function Folding() {
|
||||||
|
|
||||||
if (fold && fold.range.toString() == range.toString()){
|
if (fold && fold.range.toString() == range.toString()){
|
||||||
this.expandFold(fold);
|
this.expandFold(fold);
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var placeholder = "...";
|
var placeholder = "...";
|
||||||
|
|
@ -9789,7 +9813,7 @@ function Folding() {
|
||||||
placeholder = this.getTextRange(range);
|
placeholder = this.getTextRange(range);
|
||||||
if(placeholder.length < 4)
|
if(placeholder.length < 4)
|
||||||
return;
|
return;
|
||||||
placeholder = placeholder.trim().substring(0, 2) + ".."
|
placeholder = placeholder.trim().substring(0, 2) + "..";
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addFold(placeholder, range);
|
this.addFold(placeholder, range);
|
||||||
|
|
@ -9800,10 +9824,10 @@ function Folding() {
|
||||||
var token = iterator.getCurrentToken();
|
var token = iterator.getCurrentToken();
|
||||||
if (token && /^comment|string/.test(token.type)) {
|
if (token && /^comment|string/.test(token.type)) {
|
||||||
var range = new Range();
|
var range = new Range();
|
||||||
var t;
|
var re = new RegExp(token.type.replace(/\..*/, "\\."));
|
||||||
do {
|
do {
|
||||||
t = iterator.stepBackward();
|
token = iterator.stepBackward();
|
||||||
} while(t && t.type == token.type)
|
} while(token && re.test(token.type))
|
||||||
|
|
||||||
iterator.stepForward();
|
iterator.stepForward();
|
||||||
range.start.row = iterator.getCurrentTokenRow();
|
range.start.row = iterator.getCurrentTokenRow();
|
||||||
|
|
@ -9812,342 +9836,109 @@ function Folding() {
|
||||||
var iterator = new TokenIterator(this, row, column);
|
var iterator = new TokenIterator(this, row, column);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
t = iterator.stepForward();
|
token = iterator.stepForward();
|
||||||
} while(t && t.type == token.type)
|
} while(token && re.test(token.type))
|
||||||
t = iterator.stepBackward();
|
token = iterator.stepBackward();
|
||||||
|
|
||||||
range.end.row = iterator.getCurrentTokenRow();
|
range.end.row = iterator.getCurrentTokenRow();
|
||||||
range.end.column = iterator.getCurrentTokenColumn() + t.value.length - 1;
|
range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 1;
|
||||||
return range
|
return range
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.foldAll = function() {
|
this.foldAll = function(startRow, endRow) {
|
||||||
var foldWidgets = this.foldWidgets
|
var foldWidgets = this.foldWidgets;
|
||||||
for (var row = foldWidgets.length; row--; ) {
|
endRow = endRow || foldWidgets.length;
|
||||||
|
for (var row = startRow || 0; row < endRow; row++) {
|
||||||
if (foldWidgets[row] == null)
|
if (foldWidgets[row] == null)
|
||||||
foldWidgets[row] = this.getFoldWidget(row)
|
foldWidgets[row] = this.getFoldWidget(row);
|
||||||
if (foldWidgets[row] != "start")
|
if (foldWidgets[row] != "start")
|
||||||
continue
|
continue;
|
||||||
|
|
||||||
var range = this.getFoldWidgetRange(row);
|
var range = this.getFoldWidgetRange(row);
|
||||||
if (range)
|
// sometimes range can be incompatible with existing fold
|
||||||
this.addFold("...", range)
|
// wouldn't it be better for addFold to return null istead of throwing?
|
||||||
|
if (range && range.end.row < endRow) try {
|
||||||
|
this.addFold("...", range);
|
||||||
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// structured folding
|
// structured folding
|
||||||
this.$setFolding = function(mode) {
|
this.$setFolding = function(foldMode) {
|
||||||
mode = mode && mode.foldingRules;
|
|
||||||
var foldRules = Folding.commonFoldingRules
|
if (this.$foldMode == foldMode)
|
||||||
if (typeof mode == "string")
|
return;
|
||||||
mode = foldRules[mode];
|
this.$foldMode = foldMode;
|
||||||
|
|
||||||
if (mode) {
|
|
||||||
this.foldWidgets = [];
|
|
||||||
this.removeListener('change', this.$updateFoldWidgets);
|
this.removeListener('change', this.$updateFoldWidgets);
|
||||||
|
|
||||||
if (mode.getFoldWidget)
|
if (!foldMode) {
|
||||||
this.getFoldWidget = mode.getFoldWidget;
|
|
||||||
else if (mode.foldingStopMarker)
|
|
||||||
this.getFoldWidget = foldRules.$testBoth;
|
|
||||||
else
|
|
||||||
this.getFoldWidget = foldRules.$testStart;
|
|
||||||
|
|
||||||
this.foldingStopMarker = mode.foldingStopMarker;
|
|
||||||
this.foldingStartMarker = mode.foldingStartMarker;
|
|
||||||
|
|
||||||
if (typeof mode.getFoldWidgetRange == "string")
|
|
||||||
this.getFoldWidgetRange = foldRules[mode.getFoldWidgetRange];
|
|
||||||
else
|
|
||||||
this.getFoldWidgetRange = mode.getFoldWidgetRange;
|
|
||||||
|
|
||||||
|
|
||||||
this.$updateFoldWidgets = (mode.onChange || foldRules.onChange).bind(this);
|
|
||||||
|
|
||||||
this.on('change', this.$updateFoldWidgets);
|
|
||||||
} else {
|
|
||||||
this.foldWidgets = null;
|
this.foldWidgets = null;
|
||||||
this.removeListener('change', this.$updateFoldWidgets);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.foldWidgets = [];
|
||||||
|
this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this);
|
||||||
|
this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this);
|
||||||
|
|
||||||
|
this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);
|
||||||
|
this.on('change', this.$updateFoldWidgets);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.onFoldWidgetClick = function(row, htmlEvent) {
|
this.onFoldWidgetClick = function(row, e) {
|
||||||
var type = this.getFoldWidget(row);
|
var type = this.getFoldWidget(row);
|
||||||
var line = this.getLine(row);
|
var line = this.getLine(row);
|
||||||
|
var onlySubfolds = e.shiftKey;
|
||||||
|
var addSubfolds = onlySubfolds || e.ctrlKey || e.altKey || e.metaKey;
|
||||||
|
var fold;
|
||||||
|
|
||||||
if (type == "end")
|
if (type == "end")
|
||||||
var fold = this.getFoldAt(row, 0, -1);
|
fold = this.getFoldAt(row, 0, -1);
|
||||||
else
|
else
|
||||||
var fold = this.getFoldAt(row, line.length, 1);
|
fold = this.getFoldAt(row, line.length, 1);
|
||||||
|
|
||||||
if (fold) {
|
if (fold) {
|
||||||
|
if (addSubfolds)
|
||||||
|
this.removeFold(fold);
|
||||||
|
else
|
||||||
this.expandFold(fold);
|
this.expandFold(fold);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var range = this.getFoldWidgetRange(row);
|
var range = this.getFoldWidgetRange(row);
|
||||||
if (range)
|
if (range) {
|
||||||
|
if (!onlySubfolds)
|
||||||
this.addFold("...", range);
|
this.addFold("...", range);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Folding.commonFoldingRules = {
|
if (addSubfolds)
|
||||||
$testStart: function(row) {
|
this.foldAll(range.start.row + 1, range.end.row);
|
||||||
if(this.foldingStartMarker.test(this.getLine(row)))
|
}
|
||||||
return "start";
|
};
|
||||||
return "";
|
|
||||||
},
|
this.updateFoldWidgets = function(e) {
|
||||||
$testBoth: function(row) {
|
|
||||||
var line = this.getLine(row);
|
|
||||||
if(this.foldingStartMarker.test(line))
|
|
||||||
return "start";
|
|
||||||
if(this.foldingStopMarker.test(line))
|
|
||||||
return "end";
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
onChange: function(e) {
|
|
||||||
var delta = e.data;
|
var delta = e.data;
|
||||||
var range = delta.range;
|
var range = delta.range;
|
||||||
var firstRow = range.start.row;
|
var firstRow = range.start.row;
|
||||||
var len = range.end.row - firstRow;
|
var len = range.end.row - firstRow;
|
||||||
|
|
||||||
if (len == 0) {
|
if (len === 0) {
|
||||||
this.foldWidgets[firstRow] = null;
|
this.foldWidgets[firstRow] = null;
|
||||||
} else if (delta.action == "removeText" || delta.action == "removeLines") {
|
} else if (delta.action == "removeText" || delta.action == "removeLines") {
|
||||||
this.foldWidgets.splice(firstRow, len + 1, null);
|
this.foldWidgets.splice(firstRow, len + 1, null);
|
||||||
} else {
|
} else {
|
||||||
var args = Array(len + 1);
|
var args = Array(len + 1);
|
||||||
args.unshift(firstRow, 1)
|
args.unshift(firstRow, 1);
|
||||||
this.foldWidgets.splice.apply(this.foldWidgets, args);
|
this.foldWidgets.splice.apply(this.foldWidgets, args);
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
indentationBlock: function(row) {
|
|
||||||
var re = /^\s*/;
|
|
||||||
var startRow = row, endRow = row;
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var startColumn = line.length - 1;
|
|
||||||
var startLevel = line.match(re)[0].length;
|
|
||||||
|
|
||||||
while (line = this.getLine(++row)) {
|
|
||||||
var level = line.match(re)[0].length;
|
|
||||||
|
|
||||||
if (level == line.length)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (level <= startLevel)
|
|
||||||
break;
|
|
||||||
|
|
||||||
endRow = row;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (endRow > startRow) {
|
|
||||||
var endColumn = this.getLine(endRow).length;
|
|
||||||
return new Range(startRow, startColumn, endRow, endColumn);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"cStyle": {
|
|
||||||
foldingStartMarker : /(\{|\[)[^\}\]]*$|^\s*(\/\*)/,
|
|
||||||
foldingStopMarker : /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,
|
|
||||||
getFoldWidgetRange: function(row) {
|
|
||||||
var line = this.getLine(row);
|
|
||||||
var match = line.match(this.foldingStartMarker);
|
|
||||||
if (match) {
|
|
||||||
var i = match.index;
|
|
||||||
|
|
||||||
if (match[2])
|
|
||||||
return this.getCommentFoldRange(row, i + match[0].length);
|
|
||||||
|
|
||||||
var start = {row: row, column: i+1};
|
|
||||||
var end = this.$findClosingBracket(match[1], start);
|
|
||||||
if (end) {
|
|
||||||
var fw = this.foldWidgets[end.row];
|
|
||||||
if (fw == null)
|
|
||||||
fw = this.getFoldWidget(end.row);
|
|
||||||
|
|
||||||
if (fw == "start"){
|
|
||||||
end.row --;
|
|
||||||
end.column = this.getLine(end.row).length;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
end = {row: this.getLength(), column: 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
return Range.fromPoints(start, end);
|
|
||||||
}
|
|
||||||
|
|
||||||
var match = line.match(this.foldingStopMarker);
|
|
||||||
if (match) {
|
|
||||||
var i = match.index + match[0].length;
|
|
||||||
|
|
||||||
if (match[2])
|
|
||||||
return this.getCommentFoldRange(row, i);
|
|
||||||
|
|
||||||
var end = {row: row, column: i};
|
|
||||||
var start = this.$findOpeningBracket(match[1], end)
|
|
||||||
if (start){
|
|
||||||
start.column++;
|
|
||||||
end.column--;
|
|
||||||
} else {
|
|
||||||
start = {row: 0, column: this.getLine(0).length}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Range.fromPoints(start, end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// TODO: folding based only on indentation
|
|
||||||
"indentation": null,
|
|
||||||
|
|
||||||
"xml": {
|
|
||||||
|
|
||||||
voidElements: {
|
|
||||||
"area": 1,
|
|
||||||
"base": 1,
|
|
||||||
"br": 1,
|
|
||||||
"col": 1,
|
|
||||||
"command": 1,
|
|
||||||
"embed": 1,
|
|
||||||
"hr": 1,
|
|
||||||
"img": 1,
|
|
||||||
"input": 1,
|
|
||||||
"keygen": 1,
|
|
||||||
"link": 1,
|
|
||||||
"meta": 1,
|
|
||||||
"param": 1,
|
|
||||||
"source": 1,
|
|
||||||
"track": 1,
|
|
||||||
"wbr": 1
|
|
||||||
},
|
|
||||||
|
|
||||||
getFoldWidget: function(row) {
|
|
||||||
var tags = this.getTokens(row, row)[0].tokens
|
|
||||||
.filter(function(token) {
|
|
||||||
return token.type === "meta.tag"
|
|
||||||
})
|
|
||||||
.map(function(token) {
|
|
||||||
return token.value;
|
|
||||||
}).
|
|
||||||
join("")
|
|
||||||
.trim()
|
|
||||||
.replace(/^<|>$|\s+/g, "")
|
|
||||||
.split("><")
|
|
||||||
|
|
||||||
var fold = tags[0];
|
|
||||||
|
|
||||||
if (!fold || Folding.commonFoldingRules.xml.voidElements[fold])
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (fold.charAt(0) == "/")
|
|
||||||
return "end";
|
|
||||||
|
|
||||||
if (tags.indexOf("/" + fold) !== -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
return "start";
|
|
||||||
},
|
|
||||||
|
|
||||||
getFoldWidgetRange: function(row) {
|
|
||||||
var start, end;
|
|
||||||
var stack = [];
|
|
||||||
|
|
||||||
var iterator = new TokenIterator(this, row, 0);
|
|
||||||
var step = "stepForward";
|
|
||||||
var isBack = false;
|
|
||||||
|
|
||||||
// http://dev.w3.org/html5/spec/syntax.html#optional-tags
|
|
||||||
// TODO
|
|
||||||
// var optionalTags = {
|
|
||||||
// "html": 1,
|
|
||||||
// "head": 1,
|
|
||||||
// "body": 1,
|
|
||||||
// "li": 1,
|
|
||||||
// "dt": 1,
|
|
||||||
// "dd": 1,
|
|
||||||
// "p": 1,
|
|
||||||
// "rt": 1,
|
|
||||||
// "rp": 1,
|
|
||||||
// "optgroup": 1,
|
|
||||||
// "option": 1,
|
|
||||||
// "colgroup": 1,
|
|
||||||
// "thead": 1,
|
|
||||||
// "tbody": 1,
|
|
||||||
// "tfoot": 1,
|
|
||||||
// "tr": 1,
|
|
||||||
// "td": 1,
|
|
||||||
// "th": 1
|
|
||||||
// };
|
|
||||||
|
|
||||||
// limited XML parsing to find matching tag
|
|
||||||
do {
|
|
||||||
var token = iterator.getCurrentToken();
|
|
||||||
|
|
||||||
var value = token.value.trim();
|
|
||||||
if (token && token.type == "meta.tag" && token.value !== ">") {
|
|
||||||
var tagName = value.replace(/^[<\s]*|[\s*>]$/g, "");
|
|
||||||
if (Folding.commonFoldingRules.xml.voidElements[tagName])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!start) {
|
|
||||||
if (tagName.charAt(0) == "/") {
|
|
||||||
tagName = tagName.slice(1);
|
|
||||||
step = "stepBackward";
|
|
||||||
isBack = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
start = {
|
|
||||||
row: row,
|
|
||||||
column: iterator.getCurrentTokenColumn() + (isBack ? 0 : value.length + 1)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// console.log("push", tagName)
|
|
||||||
stack.push(tagName);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (tagName.charAt(0) == "/") {
|
|
||||||
tagName = tagName.slice(1);
|
|
||||||
var close = !isBack;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
close = isBack;
|
|
||||||
|
|
||||||
if (close) {
|
|
||||||
if (stack[stack.length-1] == tagName) {
|
|
||||||
// console.log("pop", tagName)
|
|
||||||
stack.pop();
|
|
||||||
if (stack.length == 0) {
|
|
||||||
end = {
|
|
||||||
row: iterator.getCurrentTokenRow(),
|
|
||||||
column: iterator.getCurrentTokenColumn() + (isBack ? value.length : 0)
|
|
||||||
};
|
|
||||||
if (isBack)
|
|
||||||
return Range.fromPoints(end, start);
|
|
||||||
else
|
|
||||||
return Range.fromPoints(start, end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// console.error("unmatched tags!", tagName, stack)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// console.log("push", tagName)
|
|
||||||
stack.push(tagName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} while(token = iterator[step]());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.Folding = Folding;
|
exports.Folding = Folding;
|
||||||
|
|
||||||
});/* vim:ts=4:sts=4:sw=4:
|
});
|
||||||
|
/* vim:ts=4:sts=4:sw=4:
|
||||||
* ***** BEGIN LICENSE BLOCK *****
|
* ***** BEGIN LICENSE BLOCK *****
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
*
|
*
|
||||||
|
|
@ -12452,7 +12243,8 @@ var Gutter = function(parentEl) {
|
||||||
|
|
||||||
if (foldWidgets) {
|
if (foldWidgets) {
|
||||||
var c = foldWidgets[i];
|
var c = foldWidgets[i];
|
||||||
if (!c)
|
// check if cached value is invalidated and we need to recompute
|
||||||
|
if (c == null)
|
||||||
c = foldWidgets[i] = this.session.getFoldWidget(i);
|
c = foldWidgets[i] = this.session.getFoldWidget(i);
|
||||||
if (c)
|
if (c)
|
||||||
html.push(
|
html.push(
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue