зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1456143 - Update Codemirror to 5.37.0. r=bgrins
This commit is contained in:
Родитель
ff279da3a5
Коммит
7331bdb85a
|
@ -5,7 +5,7 @@ code, and optionally help with indentation.
|
|||
|
||||
# Upgrade
|
||||
|
||||
Currently used version is 5.36.0. To upgrade: download a new version of
|
||||
Currently used version is 5.37.0. To upgrade: download a new version of
|
||||
CodeMirror from the project's page [1] and replace all JavaScript and
|
||||
CSS files inside the codemirror directory [2].
|
||||
|
||||
|
|
|
@ -137,12 +137,14 @@
|
|||
CodeMirror.registerHelper("fold", "xml", function(cm, start) {
|
||||
var iter = new Iter(cm, start.line, 0);
|
||||
for (;;) {
|
||||
var openTag = toNextTag(iter), end;
|
||||
if (!openTag || !(end = toTagEnd(iter)) || iter.line != start.line) return;
|
||||
var openTag = toNextTag(iter)
|
||||
if (!openTag || iter.line != start.line) return
|
||||
var end = toTagEnd(iter)
|
||||
if (!end) return
|
||||
if (!openTag[1] && end != "selfClose") {
|
||||
var startPos = Pos(iter.line, iter.ch);
|
||||
var endPos = findMatchingClose(iter, openTag[2]);
|
||||
return endPos && {from: startPos, to: endPos.from};
|
||||
return endPos && cmp(endPos.from, startPos) > 0 ? {from: startPos, to: endPos.from} : null
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -90,7 +90,7 @@
|
|||
var state = cm.state.matchHighlighter;
|
||||
cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style));
|
||||
if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) {
|
||||
var searchFor = hasBoundary ? new RegExp("\\b" + query.replace(/[\\\[+*?(){|^$]/g, "\\$&") + "\\b") : query;
|
||||
var searchFor = hasBoundary ? new RegExp("\\b" + query.replace(/[\\\[.+*?(){|^$]/g, "\\$&") + "\\b") : query;
|
||||
state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, false,
|
||||
{className: "CodeMirror-selection-highlight-scrollbar"});
|
||||
}
|
||||
|
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -307,6 +307,7 @@
|
|||
"Backspace": function(cm) { killRegion(cm, false) || killTo(cm, byChar, -1, false); },
|
||||
|
||||
"Alt-F": move(byWord, 1), "Alt-B": move(byWord, -1),
|
||||
"Alt-Right": move(byWord, 1), "Alt-Left": move(byWord, -1),
|
||||
"Alt-D": function(cm) { killTo(cm, byWord, 1, "grow"); },
|
||||
"Alt-Backspace": function(cm) { killTo(cm, byWord, -1, "grow"); },
|
||||
|
||||
|
|
|
@ -93,6 +93,8 @@
|
|||
{ keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }},
|
||||
{ keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }},
|
||||
{ keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }},
|
||||
{ keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false }},
|
||||
{ keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true }},
|
||||
{ keys: '<C-f>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }},
|
||||
{ keys: '<C-b>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }},
|
||||
{ keys: '<C-d>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }},
|
||||
|
@ -423,6 +425,9 @@
|
|||
function isWhiteSpaceString(k) {
|
||||
return (/^\s*$/).test(k);
|
||||
}
|
||||
function isEndOfSentenceSymbol(k) {
|
||||
return '.?!'.indexOf(k) != -1;
|
||||
}
|
||||
function inArray(val, arr) {
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
if (arr[i] == val) {
|
||||
|
@ -866,7 +871,7 @@
|
|||
if (vim.insertMode) { command = handleKeyInsertMode(); }
|
||||
else { command = handleKeyNonInsertMode(); }
|
||||
if (command === false) {
|
||||
return undefined;
|
||||
return !vim.insertMode && key.length === 1 ? function() { return true; } : undefined;
|
||||
} else if (command === true) {
|
||||
// TODO: Look into using CodeMirror's multi-key handling.
|
||||
// Return no-op since we are caching the key. Counts as handled, but
|
||||
|
@ -1811,6 +1816,10 @@
|
|||
var dir = motionArgs.forward ? 1 : -1;
|
||||
return findParagraph(cm, head, motionArgs.repeat, dir);
|
||||
},
|
||||
moveBySentence: function(cm, head, motionArgs) {
|
||||
var dir = motionArgs.forward ? 1 : -1;
|
||||
return findSentence(cm, head, motionArgs.repeat, dir);
|
||||
},
|
||||
moveByScroll: function(cm, head, motionArgs, vim) {
|
||||
var scrollbox = cm.getScrollInfo();
|
||||
var curEnd = null;
|
||||
|
@ -3534,6 +3543,179 @@
|
|||
return { start: start, end: end };
|
||||
}
|
||||
|
||||
function findSentence(cm, cur, repeat, dir) {
|
||||
|
||||
/*
|
||||
Takes an index object
|
||||
{
|
||||
line: the line string,
|
||||
ln: line number,
|
||||
pos: index in line,
|
||||
dir: direction of traversal (-1 or 1)
|
||||
}
|
||||
and modifies the line, ln, and pos members to represent the
|
||||
next valid position or sets them to null if there are
|
||||
no more valid positions.
|
||||
*/
|
||||
function nextChar(cm, idx) {
|
||||
if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) {
|
||||
idx.ln += idx.dir;
|
||||
if (!isLine(cm, idx.ln)) {
|
||||
idx.line = null;
|
||||
idx.ln = null;
|
||||
idx.pos = null;
|
||||
return;
|
||||
}
|
||||
idx.line = cm.getLine(idx.ln);
|
||||
idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1;
|
||||
}
|
||||
else {
|
||||
idx.pos += idx.dir;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Performs one iteration of traversal in forward direction
|
||||
Returns an index object of the new location
|
||||
*/
|
||||
function forward(cm, ln, pos, dir) {
|
||||
var line = cm.getLine(ln);
|
||||
var stop = (line === "");
|
||||
|
||||
var curr = {
|
||||
line: line,
|
||||
ln: ln,
|
||||
pos: pos,
|
||||
dir: dir,
|
||||
}
|
||||
|
||||
var last_valid = {
|
||||
ln: curr.ln,
|
||||
pos: curr.pos,
|
||||
}
|
||||
|
||||
var skip_empty_lines = (curr.line === "");
|
||||
|
||||
// Move one step to skip character we start on
|
||||
nextChar(cm, curr);
|
||||
|
||||
while (curr.line !== null) {
|
||||
last_valid.ln = curr.ln;
|
||||
last_valid.pos = curr.pos;
|
||||
|
||||
if (curr.line === "" && !skip_empty_lines) {
|
||||
return { ln: curr.ln, pos: curr.pos, };
|
||||
}
|
||||
else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) {
|
||||
return { ln: curr.ln, pos: curr.pos, };
|
||||
}
|
||||
else if (isEndOfSentenceSymbol(curr.line[curr.pos])
|
||||
&& !stop
|
||||
&& (curr.pos === curr.line.length - 1
|
||||
|| isWhiteSpaceString(curr.line[curr.pos + 1]))) {
|
||||
stop = true;
|
||||
}
|
||||
|
||||
nextChar(cm, curr);
|
||||
}
|
||||
|
||||
/*
|
||||
Set the position to the last non whitespace character on the last
|
||||
valid line in the case that we reach the end of the document.
|
||||
*/
|
||||
var line = cm.getLine(last_valid.ln);
|
||||
last_valid.pos = 0;
|
||||
for(var i = line.length - 1; i >= 0; --i) {
|
||||
if (!isWhiteSpaceString(line[i])) {
|
||||
last_valid.pos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return last_valid;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
Performs one iteration of traversal in reverse direction
|
||||
Returns an index object of the new location
|
||||
*/
|
||||
function reverse(cm, ln, pos, dir) {
|
||||
var line = cm.getLine(ln);
|
||||
|
||||
var curr = {
|
||||
line: line,
|
||||
ln: ln,
|
||||
pos: pos,
|
||||
dir: dir,
|
||||
}
|
||||
|
||||
var last_valid = {
|
||||
ln: curr.ln,
|
||||
pos: null,
|
||||
};
|
||||
|
||||
var skip_empty_lines = (curr.line === "");
|
||||
|
||||
// Move one step to skip character we start on
|
||||
nextChar(cm, curr);
|
||||
|
||||
while (curr.line !== null) {
|
||||
|
||||
if (curr.line === "" && !skip_empty_lines) {
|
||||
if (last_valid.pos !== null) {
|
||||
return last_valid;
|
||||
}
|
||||
else {
|
||||
return { ln: curr.ln, pos: curr.pos };
|
||||
}
|
||||
}
|
||||
else if (isEndOfSentenceSymbol(curr.line[curr.pos])
|
||||
&& last_valid.pos !== null
|
||||
&& !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) {
|
||||
return last_valid;
|
||||
}
|
||||
else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) {
|
||||
skip_empty_lines = false;
|
||||
last_valid = { ln: curr.ln, pos: curr.pos }
|
||||
}
|
||||
|
||||
nextChar(cm, curr);
|
||||
}
|
||||
|
||||
/*
|
||||
Set the position to the first non whitespace character on the last
|
||||
valid line in the case that we reach the beginning of the document.
|
||||
*/
|
||||
var line = cm.getLine(last_valid.ln);
|
||||
last_valid.pos = 0;
|
||||
for(var i = 0; i < line.length; ++i) {
|
||||
if (!isWhiteSpaceString(line[i])) {
|
||||
last_valid.pos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return last_valid;
|
||||
}
|
||||
|
||||
var curr_index = {
|
||||
ln: cur.line,
|
||||
pos: cur.ch,
|
||||
};
|
||||
|
||||
while (repeat > 0) {
|
||||
if (dir < 0) {
|
||||
curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir);
|
||||
}
|
||||
else {
|
||||
curr_index = forward(cm, curr_index.ln, curr_index.pos, dir);
|
||||
}
|
||||
repeat--;
|
||||
}
|
||||
|
||||
return Pos(curr_index.ln, curr_index.pos);
|
||||
}
|
||||
|
||||
// TODO: perhaps this finagling of start and end positions belonds
|
||||
// in codemirror/replaceRange?
|
||||
function selectCompanionObject(cm, head, symb, inclusive) {
|
||||
|
@ -3552,8 +3734,8 @@
|
|||
// cursor is on a matching open bracket.
|
||||
var offset = curChar === openSym ? 1 : 0;
|
||||
|
||||
start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, null, {'bracketRegex': bracketRegexp});
|
||||
end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, null, {'bracketRegex': bracketRegexp});
|
||||
start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp});
|
||||
end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp});
|
||||
|
||||
if (!start || !end) {
|
||||
return { start: cur, end: cur };
|
||||
|
|
|
@ -9005,7 +9005,7 @@ ContentEditableInput.prototype.setUneditable = function (node) {
|
|||
};
|
||||
|
||||
ContentEditableInput.prototype.onKeyPress = function (e) {
|
||||
if (e.charCode == 0) { return }
|
||||
if (e.charCode == 0 || this.composing) { return }
|
||||
e.preventDefault()
|
||||
if (!this.cm.isReadOnly())
|
||||
{ operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0) }
|
||||
|
@ -9658,7 +9658,7 @@ CodeMirror.fromTextArea = fromTextArea
|
|||
|
||||
addLegacyProps(CodeMirror)
|
||||
|
||||
CodeMirror.version = "5.36.0"
|
||||
CodeMirror.version = "5.37.0"
|
||||
|
||||
return CodeMirror;
|
||||
|
||||
|
|
|
@ -624,6 +624,10 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
|
|||
defKeywords: words("class val var object interface fun"),
|
||||
atoms: words("true false null this"),
|
||||
hooks: {
|
||||
"@": function(stream) {
|
||||
stream.eatWhile(/[\w\$_]/);
|
||||
return "meta";
|
||||
},
|
||||
'"': function(stream, state) {
|
||||
state.tokenize = tokenKotlinString(stream.match('""'));
|
||||
return state.tokenize(stream, state);
|
||||
|
|
|
@ -126,7 +126,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|||
var kw = keywords[word]
|
||||
return ret(kw.type, kw.style, word)
|
||||
}
|
||||
if (word == "async" && stream.match(/^(\s|\/\*.*?\*\/)*[\(\w]/, false))
|
||||
if (word == "async" && stream.match(/^(\s|\/\*.*?\*\/)*[\[\(\w]/, false))
|
||||
return ret("async", "keyword", word)
|
||||
}
|
||||
return ret("variable", "variable", word)
|
||||
|
@ -356,6 +356,9 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|||
} else if (isTS && value == "namespace") {
|
||||
cx.marked = "keyword"
|
||||
return cont(pushlex("form"), expression, block, poplex)
|
||||
} else if (isTS && value == "abstract") {
|
||||
cx.marked = "keyword"
|
||||
return cont(statement)
|
||||
} else {
|
||||
return cont(pushlex("stat"), maybelabel);
|
||||
}
|
||||
|
@ -562,7 +565,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|||
function typeexpr(type, value) {
|
||||
if (value == "keyof" || value == "typeof") {
|
||||
cx.marked = "keyword"
|
||||
return cont(value == "keyof" ? typeexpr : expression)
|
||||
return cont(value == "keyof" ? typeexpr : expressionNoComma)
|
||||
}
|
||||
if (type == "variable" || value == "void") {
|
||||
cx.marked = "type"
|
||||
|
@ -572,6 +575,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|||
if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType)
|
||||
if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType)
|
||||
if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType)
|
||||
if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr)
|
||||
}
|
||||
function maybeReturnType(type) {
|
||||
if (type == "=>") return cont(typeexpr)
|
||||
|
@ -588,9 +592,10 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|||
return cont(expression, maybetype, expect("]"), typeprop)
|
||||
}
|
||||
}
|
||||
function typearg(type) {
|
||||
if (type == "variable") return cont(typearg)
|
||||
else if (type == ":") return cont(typeexpr)
|
||||
function typearg(type, value) {
|
||||
if (type == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg)
|
||||
if (type == ":") return cont(typeexpr)
|
||||
return pass(typeexpr)
|
||||
}
|
||||
function afterType(type, value) {
|
||||
if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType)
|
||||
|
|
|
@ -402,6 +402,15 @@
|
|||
" [def META],",
|
||||
"}")
|
||||
|
||||
TS("parenthesized type",
|
||||
"[keyword class] [def Foo] {",
|
||||
" [property x] [operator =] [keyword new] [variable A][operator <][type B], [type string][operator |](() [operator =>] [type void])[operator >]();",
|
||||
" [keyword private] [property bar]();",
|
||||
"}")
|
||||
|
||||
TS("abstract class",
|
||||
"[keyword export] [keyword abstract] [keyword class] [def Foo] {}")
|
||||
|
||||
var jsonld_mode = CodeMirror.getMode(
|
||||
{indentUnit: 2},
|
||||
{name: "javascript", jsonld: true}
|
||||
|
|
|
@ -509,6 +509,40 @@ testVim('{', function(cm, vim, helpers) {
|
|||
helpers.doKeys('6', '{');
|
||||
helpers.assertCursorAt(0, 0);
|
||||
}, { value: 'a\n\nb\nc\n\nd' });
|
||||
testVim('(', function(cm, vim, helpers) {
|
||||
cm.setCursor(6, 23);
|
||||
helpers.doKeys('(');
|
||||
helpers.assertCursorAt(6, 14);
|
||||
helpers.doKeys('2', '(');
|
||||
helpers.assertCursorAt(5, 0);
|
||||
helpers.doKeys('(');
|
||||
helpers.assertCursorAt(4, 0);
|
||||
helpers.doKeys('(');
|
||||
helpers.assertCursorAt(3, 0);
|
||||
helpers.doKeys('(');
|
||||
helpers.assertCursorAt(2, 0);
|
||||
helpers.doKeys('(');
|
||||
helpers.assertCursorAt(0, 0);
|
||||
helpers.doKeys('(');
|
||||
helpers.assertCursorAt(0, 0);
|
||||
}, { value: 'sentence1.\n\n\nsentence2\n\nsentence3. sentence4\n sentence5? sentence6!' });
|
||||
testVim(')', function(cm, vim, helpers) {
|
||||
cm.setCursor(0, 0);
|
||||
helpers.doKeys('2', ')');
|
||||
helpers.assertCursorAt(3, 0);
|
||||
helpers.doKeys(')');
|
||||
helpers.assertCursorAt(4, 0);
|
||||
helpers.doKeys(')');
|
||||
helpers.assertCursorAt(5, 0);
|
||||
helpers.doKeys(')');
|
||||
helpers.assertCursorAt(5, 11);
|
||||
helpers.doKeys(')');
|
||||
helpers.assertCursorAt(6, 14);
|
||||
helpers.doKeys(')');
|
||||
helpers.assertCursorAt(6, 23);
|
||||
helpers.doKeys(')');
|
||||
helpers.assertCursorAt(6, 23);
|
||||
}, { value: 'sentence1.\n\n\nsentence2\n\nsentence3. sentence4\n sentence5? sentence6!' });
|
||||
testVim('paragraph_motions', function(cm, vim, helpers) {
|
||||
cm.setCursor(10, 0);
|
||||
helpers.doKeys('{');
|
||||
|
|
Загрузка…
Ссылка в новой задаче