This commit is contained in:
Fabian Jakobs 2011-12-02 13:21:29 +01:00
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

View file

@ -11,7 +11,7 @@
Ace
version 0.2.0
commit 5db6824f28f04b8b4df2566dada92b58d307dec8
commit 829c24c7806dacf34eb239760ab458dc868c6086
-->

View file

@ -2416,12 +2416,11 @@ exports.getOS = function() {
*
* ***** 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");
var oop = require("./lib/oop");
var event = require("./lib/event");
var lang = require("./lib/lang");
var useragent = require("./lib/useragent");
var TextInput = require("./keyboard/textinput").TextInput;
@ -2674,9 +2673,10 @@ var Editor = function(renderer, session) {
this.onDocumentChange = function(e) {
var delta = e.data;
var range = delta.range;
var lastRow;
if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines")
var lastRow = range.end.row;
lastRow = range.end.row;
else
lastRow = Infinity;
this.renderer.updateLines(range.start.row, lastRow);
@ -2823,7 +2823,7 @@ var Editor = function(renderer, session) {
// remove selected text
if (!this.selection.isEmpty()) {
var cursor = this.session.remove(this.getSelectionRange());
cursor = this.session.remove(this.getSelectionRange());
this.clearSelection();
}
else if (this.session.getOverwrite()) {
@ -2926,7 +2926,7 @@ var Editor = function(renderer, session) {
};
this.getScrollSpeed = function() {
return this.$mouseHandler.getScrollSpeed()
return this.$mouseHandler.getScrollSpeed();
};
this.$selectionStyle = "line";
@ -3182,7 +3182,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())
if (rows.first === 0 || rows.last+1 < this.session.getLength())
range = new Range(rows.first, 0, rows.last+1, 0);
else
range = new Range(
@ -3240,7 +3240,8 @@ var Editor = function(renderer, session) {
range.start.row += linesMoved;
range.end.row += linesMoved;
selection.setSelectionRange(range, reverse);
} else {
}
else {
selection.setSelectionAnchor(rows.last+linesMoved+1, 0);
selection.$moveSelection(function() {
selection.moveCursorTo(rows.first+linesMoved, 0);
@ -3395,7 +3396,7 @@ var Editor = function(renderer, session) {
this.gotoLine = function(lineNumber, column) {
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.moveCursorTo(lineNumber-1, column || 0);
@ -4227,7 +4228,7 @@ function DefaultHandlers(editor) {
editor.moveCursorToPosition(pos);
}
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);
}
return;
@ -4711,6 +4712,9 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
this.pageX = event.getDocumentX(domEvent);
this.pageY = event.getDocumentY(domEvent);
this.clientX = domEvent.clientX;
this.clientY = domEvent.clientY;
this.$pos = null;
this.$inSelection = null;
@ -4794,7 +4798,8 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
}).call(MouseEvent.prototype);
});/* ***** BEGIN LICENSE BLOCK *****
});
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* 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.nonTokenRe = mode.nonTokenRe;
this.$setFolding(mode);
this.$setFolding(mode.foldingRules);
this._dispatchEvent("changeMode");
};
@ -5948,7 +5953,7 @@ var EditSession = function(text, mode) {
this.$fromUndo = true;
var lastUndoRange = null;
for (var i = deltas.length - 1; i != -1; i--) {
delta = deltas[i];
var delta = deltas[i];
if (delta.group == "doc") {
this.doc.revertDeltas(delta.deltas);
lastUndoRange =
@ -5973,7 +5978,7 @@ var EditSession = function(text, mode) {
this.$fromUndo = true;
var lastUndoRange = null;
for (var i = 0; i < deltas.length; i++) {
delta = deltas[i];
var delta = deltas[i];
if (delta.group == "doc") {
this.doc.applyDeltas(delta.deltas);
lastUndoRange =
@ -6215,7 +6220,7 @@ var EditSession = function(text, mode) {
if (useWrapMode) {
var len = this.getLength();
this.$wrapData = [];
for (i = 0; i < len; i++) {
for (var i = 0; i < len; i++) {
this.$wrapData.push([]);
}
this.$updateWrapData(0, len - 1);
@ -6377,7 +6382,6 @@ 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.
var column;
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
if (action.indexOf("remove") != -1) {
// Get all the folds in the change range and remove them.
@ -6465,7 +6469,6 @@ var EditSession = function(text, mode) {
return [];
}
var tabSize = this.getTabSize();
var splits = [];
var displayLength = tokens.length;
var lastSplit = 0, lastDocSplit = 0;
@ -6721,7 +6724,6 @@ var EditSession = function(text, mode) {
var docRow = 0;
var docColumn = 0;
var column;
var foldLineRowLength;
var row = 0;
var rowLength = 0;
@ -6821,8 +6823,6 @@ var EditSession = function(text, mode) {
docRow = pos.row;
docColumn = pos.column;
var LL = this.$rowCache.length;
var wrapData;
// Special case in wrapMode if the doc is at the end of the document.
if (this.$useWrapMode) {
@ -6838,7 +6838,6 @@ var EditSession = function(text, mode) {
}
var screenRow = 0;
var screenColumn = 0;
var foldStartRow = null;
var fold = null;
@ -9390,7 +9389,30 @@ function Folding() {
}
}
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.
@ -9410,7 +9432,7 @@ function Folding() {
* fo|o<fold>bar<fold>wolrd -trim=00> "foo"
*/
this.getFoldStringAt = function(row, column, trim, foldLine) {
var foldLine = foldLine || this.getFoldLine(row);
foldLine = foldLine || this.getFoldLine(row);
if (!foldLine)
return null;
@ -9418,16 +9440,17 @@ function Folding() {
end: { column: 0 }
};
// TODO: Refactor to use getNextFoldTo function.
var str, fold;
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);
if (cmp == -1) {
var str = this
str = this
.getLine(fold.start.row)
.substring(lastFold.end.column, fold.start.column);
break;
}
else if (cmp == 0) {
else if (cmp === 0) {
return null;
}
lastFold = fold;
@ -9438,10 +9461,10 @@ function Folding() {
if (trim == -1)
return str.substring(0, column - lastFold.end.column);
else if (trim == 1)
return str.substring(column - lastFold.end.column)
return str.substring(column - lastFold.end.column);
else
return str;
}
};
this.getFoldLine = function(docRow, startFoldLine) {
var foldData = this.$foldData;
@ -9459,11 +9482,11 @@ function Folding() {
}
}
return null;
}
};
// returns the fold which starts after or contains docRow
this.getNextFoldLine = function(docRow, startFoldLine) {
var foldData = this.$foldData, ans;
var foldData = this.$foldData;
var i = 0;
if (startFoldLine)
i = foldData.indexOf(startFoldLine);
@ -9476,7 +9499,7 @@ function Folding() {
}
}
return null;
}
};
this.getFoldedRowCount = function(first, last) {
var foldData = this.$foldData, rowCount = last-first+1;
@ -9500,7 +9523,7 @@ function Folding() {
}
}
return rowCount;
}
};
this.$addFoldLine = function(foldLine) {
this.$foldData.push(foldLine);
@ -9508,7 +9531,7 @@ function Folding() {
return a.start.row - b.start.row;
});
return foldLine;
}
};
/**
* Adds a new fold.
@ -9520,9 +9543,10 @@ function Folding() {
this.addFold = function(placeholder, range) {
var foldData = this.$foldData;
var added = false;
var fold;
if (placeholder instanceof Fold)
var fold = placeholder;
fold = placeholder;
else
fold = new Fold(range, placeholder);
@ -9573,7 +9597,7 @@ function Folding() {
added = true;
if (!fold.sameRow) {
// Check if we might have to merge two FoldLines.
foldLineNext = foldData[i + 1];
var foldLineNext = foldData[i + 1];
if (foldLineNext && foldLineNext.start.row == endRow) {
// We need to merge!
foldLine.merge(foldLineNext);
@ -9654,7 +9678,7 @@ function Folding() {
// Notify that fold data has changed.
this.$modified = true;
this._dispatchEvent("changeFold", { data: fold });
}
};
this.removeFolds = function(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()){
this.expandFold(fold);
return
return;
}
var placeholder = "...";
@ -9835,7 +9859,7 @@ function Folding() {
placeholder = this.getTextRange(range);
if(placeholder.length < 4)
return;
placeholder = placeholder.trim().substring(0, 2) + ".."
placeholder = placeholder.trim().substring(0, 2) + "..";
}
this.addFold(placeholder, range);
@ -9846,10 +9870,10 @@ function Folding() {
var token = iterator.getCurrentToken();
if (token && /^comment|string/.test(token.type)) {
var range = new Range();
var t;
var re = new RegExp(token.type.replace(/\..*/, "\\."));
do {
t = iterator.stepBackward();
} while(t && t.type == token.type)
token = iterator.stepBackward();
} while(token && re.test(token.type))
iterator.stepForward();
range.start.row = iterator.getCurrentTokenRow();
@ -9858,342 +9882,109 @@ function Folding() {
var iterator = new TokenIterator(this, row, column);
do {
t = iterator.stepForward();
} while(t && t.type == token.type)
t = iterator.stepBackward();
token = iterator.stepForward();
} while(token && re.test(token.type))
token = iterator.stepBackward();
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
}
};
this.foldAll = function() {
var foldWidgets = this.foldWidgets
for (var row = foldWidgets.length; row--; ) {
this.foldAll = function(startRow, endRow) {
var foldWidgets = this.foldWidgets;
endRow = endRow || foldWidgets.length;
for (var row = startRow || 0; row < endRow; row++) {
if (foldWidgets[row] == null)
foldWidgets[row] = this.getFoldWidget(row)
foldWidgets[row] = this.getFoldWidget(row);
if (foldWidgets[row] != "start")
continue
continue;
var range = this.getFoldWidgetRange(row);
if (range)
this.addFold("...", range)
// sometimes range can be incompatible with existing fold
// 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
this.$setFolding = function(mode) {
mode = mode && mode.foldingRules;
var foldRules = Folding.commonFoldingRules
if (typeof mode == "string")
mode = foldRules[mode];
if (mode) {
this.foldWidgets = [];
this.removeListener('change', this.$updateFoldWidgets);
if (mode.getFoldWidget)
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.$setFolding = function(foldMode) {
if (this.$foldMode == foldMode)
return;
this.$foldMode = foldMode;
this.removeListener('change', this.$updateFoldWidgets);
if (!foldMode) {
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 line = this.getLine(row);
var onlySubfolds = e.shiftKey;
var addSubfolds = onlySubfolds || e.ctrlKey || e.altKey || e.metaKey;
var fold;
if (type == "end")
var fold = this.getFoldAt(row, 0, -1);
fold = this.getFoldAt(row, 0, -1);
else
var fold = this.getFoldAt(row, line.length, 1);
fold = this.getFoldAt(row, line.length, 1);
if (fold) {
this.expandFold(fold);
if (addSubfolds)
this.removeFold(fold);
else
this.expandFold(fold);
return;
}
var range = this.getFoldWidgetRange(row);
if (range)
this.addFold("...", range);
}
}
if (range) {
if (!onlySubfolds)
this.addFold("...", range);
Folding.commonFoldingRules = {
$testStart: function(row) {
if(this.foldingStartMarker.test(this.getLine(row)))
return "start";
return "";
},
$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) {
if (addSubfolds)
this.foldAll(range.start.row + 1, range.end.row);
}
};
this.updateFoldWidgets = function(e) {
var delta = e.data;
var range = delta.range;
var firstRow = range.start.row;
var len = range.end.row - firstRow;
if (len == 0) {
if (len === 0) {
this.foldWidgets[firstRow] = null;
} else if (delta.action == "removeText" || delta.action == "removeLines") {
this.foldWidgets.splice(firstRow, len + 1, null);
} else {
var args = Array(len + 1);
args.unshift(firstRow, 1)
args.unshift(firstRow, 1);
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;
});/* vim:ts=4:sts=4:sw=4:
});
/* vim:ts=4:sts=4:sw=4:
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -12498,7 +12289,8 @@ var Gutter = function(parentEl) {
if (foldWidgets) {
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);
if (c)
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

View file

@ -2370,12 +2370,11 @@ exports.getOS = function() {
*
* ***** 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");
var oop = require("./lib/oop");
var event = require("./lib/event");
var lang = require("./lib/lang");
var useragent = require("./lib/useragent");
var TextInput = require("./keyboard/textinput").TextInput;
@ -2628,9 +2627,10 @@ var Editor = function(renderer, session) {
this.onDocumentChange = function(e) {
var delta = e.data;
var range = delta.range;
var lastRow;
if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines")
var lastRow = range.end.row;
lastRow = range.end.row;
else
lastRow = Infinity;
this.renderer.updateLines(range.start.row, lastRow);
@ -2777,7 +2777,7 @@ var Editor = function(renderer, session) {
// remove selected text
if (!this.selection.isEmpty()) {
var cursor = this.session.remove(this.getSelectionRange());
cursor = this.session.remove(this.getSelectionRange());
this.clearSelection();
}
else if (this.session.getOverwrite()) {
@ -2880,7 +2880,7 @@ var Editor = function(renderer, session) {
};
this.getScrollSpeed = function() {
return this.$mouseHandler.getScrollSpeed()
return this.$mouseHandler.getScrollSpeed();
};
this.$selectionStyle = "line";
@ -3136,7 +3136,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())
if (rows.first === 0 || rows.last+1 < this.session.getLength())
range = new Range(rows.first, 0, rows.last+1, 0);
else
range = new Range(
@ -3194,7 +3194,8 @@ var Editor = function(renderer, session) {
range.start.row += linesMoved;
range.end.row += linesMoved;
selection.setSelectionRange(range, reverse);
} else {
}
else {
selection.setSelectionAnchor(rows.last+linesMoved+1, 0);
selection.$moveSelection(function() {
selection.moveCursorTo(rows.first+linesMoved, 0);
@ -3349,7 +3350,7 @@ var Editor = function(renderer, session) {
this.gotoLine = function(lineNumber, column) {
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.moveCursorTo(lineNumber-1, column || 0);
@ -4181,7 +4182,7 @@ function DefaultHandlers(editor) {
editor.moveCursorToPosition(pos);
}
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);
}
return;
@ -4665,6 +4666,9 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
this.pageX = event.getDocumentX(domEvent);
this.pageY = event.getDocumentY(domEvent);
this.clientX = domEvent.clientX;
this.clientY = domEvent.clientY;
this.$pos = null;
this.$inSelection = null;
@ -4748,7 +4752,8 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
}).call(MouseEvent.prototype);
});/* ***** BEGIN LICENSE BLOCK *****
});
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* 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.nonTokenRe = mode.nonTokenRe;
this.$setFolding(mode);
this.$setFolding(mode.foldingRules);
this._dispatchEvent("changeMode");
};
@ -5902,7 +5907,7 @@ var EditSession = function(text, mode) {
this.$fromUndo = true;
var lastUndoRange = null;
for (var i = deltas.length - 1; i != -1; i--) {
delta = deltas[i];
var delta = deltas[i];
if (delta.group == "doc") {
this.doc.revertDeltas(delta.deltas);
lastUndoRange =
@ -5927,7 +5932,7 @@ var EditSession = function(text, mode) {
this.$fromUndo = true;
var lastUndoRange = null;
for (var i = 0; i < deltas.length; i++) {
delta = deltas[i];
var delta = deltas[i];
if (delta.group == "doc") {
this.doc.applyDeltas(delta.deltas);
lastUndoRange =
@ -6169,7 +6174,7 @@ var EditSession = function(text, mode) {
if (useWrapMode) {
var len = this.getLength();
this.$wrapData = [];
for (i = 0; i < len; i++) {
for (var i = 0; i < len; i++) {
this.$wrapData.push([]);
}
this.$updateWrapData(0, len - 1);
@ -6331,7 +6336,6 @@ 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.
var column;
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
if (action.indexOf("remove") != -1) {
// Get all the folds in the change range and remove them.
@ -6419,7 +6423,6 @@ var EditSession = function(text, mode) {
return [];
}
var tabSize = this.getTabSize();
var splits = [];
var displayLength = tokens.length;
var lastSplit = 0, lastDocSplit = 0;
@ -6675,7 +6678,6 @@ var EditSession = function(text, mode) {
var docRow = 0;
var docColumn = 0;
var column;
var foldLineRowLength;
var row = 0;
var rowLength = 0;
@ -6775,8 +6777,6 @@ var EditSession = function(text, mode) {
docRow = pos.row;
docColumn = pos.column;
var LL = this.$rowCache.length;
var wrapData;
// Special case in wrapMode if the doc is at the end of the document.
if (this.$useWrapMode) {
@ -6792,7 +6792,6 @@ var EditSession = function(text, mode) {
}
var screenRow = 0;
var screenColumn = 0;
var foldStartRow = null;
var fold = null;
@ -9344,7 +9343,30 @@ function Folding() {
}
}
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.
@ -9364,7 +9386,7 @@ function Folding() {
* fo|o<fold>bar<fold>wolrd -trim=00> "foo"
*/
this.getFoldStringAt = function(row, column, trim, foldLine) {
var foldLine = foldLine || this.getFoldLine(row);
foldLine = foldLine || this.getFoldLine(row);
if (!foldLine)
return null;
@ -9372,16 +9394,17 @@ function Folding() {
end: { column: 0 }
};
// TODO: Refactor to use getNextFoldTo function.
var str, fold;
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);
if (cmp == -1) {
var str = this
str = this
.getLine(fold.start.row)
.substring(lastFold.end.column, fold.start.column);
break;
}
else if (cmp == 0) {
else if (cmp === 0) {
return null;
}
lastFold = fold;
@ -9392,10 +9415,10 @@ function Folding() {
if (trim == -1)
return str.substring(0, column - lastFold.end.column);
else if (trim == 1)
return str.substring(column - lastFold.end.column)
return str.substring(column - lastFold.end.column);
else
return str;
}
};
this.getFoldLine = function(docRow, startFoldLine) {
var foldData = this.$foldData;
@ -9413,11 +9436,11 @@ function Folding() {
}
}
return null;
}
};
// returns the fold which starts after or contains docRow
this.getNextFoldLine = function(docRow, startFoldLine) {
var foldData = this.$foldData, ans;
var foldData = this.$foldData;
var i = 0;
if (startFoldLine)
i = foldData.indexOf(startFoldLine);
@ -9430,7 +9453,7 @@ function Folding() {
}
}
return null;
}
};
this.getFoldedRowCount = function(first, last) {
var foldData = this.$foldData, rowCount = last-first+1;
@ -9454,7 +9477,7 @@ function Folding() {
}
}
return rowCount;
}
};
this.$addFoldLine = function(foldLine) {
this.$foldData.push(foldLine);
@ -9462,7 +9485,7 @@ function Folding() {
return a.start.row - b.start.row;
});
return foldLine;
}
};
/**
* Adds a new fold.
@ -9474,9 +9497,10 @@ function Folding() {
this.addFold = function(placeholder, range) {
var foldData = this.$foldData;
var added = false;
var fold;
if (placeholder instanceof Fold)
var fold = placeholder;
fold = placeholder;
else
fold = new Fold(range, placeholder);
@ -9527,7 +9551,7 @@ function Folding() {
added = true;
if (!fold.sameRow) {
// Check if we might have to merge two FoldLines.
foldLineNext = foldData[i + 1];
var foldLineNext = foldData[i + 1];
if (foldLineNext && foldLineNext.start.row == endRow) {
// We need to merge!
foldLine.merge(foldLineNext);
@ -9608,7 +9632,7 @@ function Folding() {
// Notify that fold data has changed.
this.$modified = true;
this._dispatchEvent("changeFold", { data: fold });
}
};
this.removeFolds = function(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()){
this.expandFold(fold);
return
return;
}
var placeholder = "...";
@ -9789,7 +9813,7 @@ function Folding() {
placeholder = this.getTextRange(range);
if(placeholder.length < 4)
return;
placeholder = placeholder.trim().substring(0, 2) + ".."
placeholder = placeholder.trim().substring(0, 2) + "..";
}
this.addFold(placeholder, range);
@ -9800,10 +9824,10 @@ function Folding() {
var token = iterator.getCurrentToken();
if (token && /^comment|string/.test(token.type)) {
var range = new Range();
var t;
var re = new RegExp(token.type.replace(/\..*/, "\\."));
do {
t = iterator.stepBackward();
} while(t && t.type == token.type)
token = iterator.stepBackward();
} while(token && re.test(token.type))
iterator.stepForward();
range.start.row = iterator.getCurrentTokenRow();
@ -9812,342 +9836,109 @@ function Folding() {
var iterator = new TokenIterator(this, row, column);
do {
t = iterator.stepForward();
} while(t && t.type == token.type)
t = iterator.stepBackward();
token = iterator.stepForward();
} while(token && re.test(token.type))
token = iterator.stepBackward();
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
}
};
this.foldAll = function() {
var foldWidgets = this.foldWidgets
for (var row = foldWidgets.length; row--; ) {
this.foldAll = function(startRow, endRow) {
var foldWidgets = this.foldWidgets;
endRow = endRow || foldWidgets.length;
for (var row = startRow || 0; row < endRow; row++) {
if (foldWidgets[row] == null)
foldWidgets[row] = this.getFoldWidget(row)
foldWidgets[row] = this.getFoldWidget(row);
if (foldWidgets[row] != "start")
continue
continue;
var range = this.getFoldWidgetRange(row);
if (range)
this.addFold("...", range)
// sometimes range can be incompatible with existing fold
// 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
this.$setFolding = function(mode) {
mode = mode && mode.foldingRules;
var foldRules = Folding.commonFoldingRules
if (typeof mode == "string")
mode = foldRules[mode];
if (mode) {
this.foldWidgets = [];
this.removeListener('change', this.$updateFoldWidgets);
if (mode.getFoldWidget)
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.$setFolding = function(foldMode) {
if (this.$foldMode == foldMode)
return;
this.$foldMode = foldMode;
this.removeListener('change', this.$updateFoldWidgets);
if (!foldMode) {
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 line = this.getLine(row);
var onlySubfolds = e.shiftKey;
var addSubfolds = onlySubfolds || e.ctrlKey || e.altKey || e.metaKey;
var fold;
if (type == "end")
var fold = this.getFoldAt(row, 0, -1);
fold = this.getFoldAt(row, 0, -1);
else
var fold = this.getFoldAt(row, line.length, 1);
fold = this.getFoldAt(row, line.length, 1);
if (fold) {
this.expandFold(fold);
if (addSubfolds)
this.removeFold(fold);
else
this.expandFold(fold);
return;
}
var range = this.getFoldWidgetRange(row);
if (range)
this.addFold("...", range);
}
}
if (range) {
if (!onlySubfolds)
this.addFold("...", range);
Folding.commonFoldingRules = {
$testStart: function(row) {
if(this.foldingStartMarker.test(this.getLine(row)))
return "start";
return "";
},
$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) {
if (addSubfolds)
this.foldAll(range.start.row + 1, range.end.row);
}
};
this.updateFoldWidgets = function(e) {
var delta = e.data;
var range = delta.range;
var firstRow = range.start.row;
var len = range.end.row - firstRow;
if (len == 0) {
if (len === 0) {
this.foldWidgets[firstRow] = null;
} else if (delta.action == "removeText" || delta.action == "removeLines") {
this.foldWidgets.splice(firstRow, len + 1, null);
} else {
var args = Array(len + 1);
args.unshift(firstRow, 1)
args.unshift(firstRow, 1);
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;
});/* vim:ts=4:sts=4:sw=4:
});
/* vim:ts=4:sts=4:sw=4:
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -12452,7 +12243,8 @@ var Gutter = function(parentEl) {
if (foldWidgets) {
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);
if (c)
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