CodeMirror 5.58.0 (#1037)
This commit is contained in:
parent
30983db679
commit
2b149f97a5
6
package-lock.json
generated
6
package-lock.json
generated
|
@ -1917,9 +1917,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"codemirror": {
|
||||
"version": "5.57.0",
|
||||
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.57.0.tgz",
|
||||
"integrity": "sha512-WGc6UL7Hqt+8a6ZAsj/f1ApQl3NPvHY/UQSzG6fB6l4BjExgVdhFaxd7mRTw1UCiYe/6q86zHP+kfvBQcZGvUg=="
|
||||
"version": "5.58.0",
|
||||
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.58.0.tgz",
|
||||
"integrity": "sha512-OUK+7EgaYnLyC0F09UWjckLWvviy02IDDGTW5Zmj60a3gdGnFtUM6rVsqrfl5+YSylQVQBNfAGG4KF7tQOb4/Q=="
|
||||
},
|
||||
"collection-visit": {
|
||||
"version": "1.0.0",
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
"repository": "openstyles/stylus",
|
||||
"author": "Stylus Team",
|
||||
"dependencies": {
|
||||
"codemirror": "^5.57.0",
|
||||
"codemirror": "^5.58.0",
|
||||
"db-to-cloud": "^0.4.5",
|
||||
"jsonlint": "^1.6.3",
|
||||
"less-bundle": "github:openstyles/less-bundle#v0.1.0",
|
||||
|
|
2
vendor/codemirror/README.md
vendored
2
vendor/codemirror/README.md
vendored
|
@ -1,4 +1,4 @@
|
|||
## codemirror v5.57.0
|
||||
## codemirror v5.58.0
|
||||
|
||||
Following files are copied from npm (node_modules):
|
||||
|
||||
|
|
24
vendor/codemirror/addon/lint/lint.css
vendored
24
vendor/codemirror/addon/lint/lint.css
vendored
|
@ -25,22 +25,20 @@
|
|||
-ms-transition: opacity .4s;
|
||||
}
|
||||
|
||||
.CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning {
|
||||
.CodeMirror-lint-mark {
|
||||
background-position: left bottom;
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
.CodeMirror-lint-mark-error {
|
||||
background-image:
|
||||
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")
|
||||
;
|
||||
}
|
||||
|
||||
.CodeMirror-lint-mark-warning {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=");
|
||||
}
|
||||
|
||||
.CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning {
|
||||
.CodeMirror-lint-mark-error {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==");
|
||||
}
|
||||
|
||||
.CodeMirror-lint-marker {
|
||||
background-position: center center;
|
||||
background-repeat: no-repeat;
|
||||
cursor: pointer;
|
||||
|
@ -51,20 +49,20 @@
|
|||
position: relative;
|
||||
}
|
||||
|
||||
.CodeMirror-lint-message-error, .CodeMirror-lint-message-warning {
|
||||
.CodeMirror-lint-message {
|
||||
padding-left: 18px;
|
||||
background-position: top left;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
|
||||
}
|
||||
|
||||
.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=");
|
||||
}
|
||||
|
||||
.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
|
||||
}
|
||||
|
||||
.CodeMirror-lint-marker-multiple {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");
|
||||
background-repeat: no-repeat;
|
||||
|
|
8
vendor/codemirror/addon/lint/lint.js
vendored
8
vendor/codemirror/addon/lint/lint.js
vendored
|
@ -83,10 +83,10 @@
|
|||
|
||||
function makeMarker(cm, labels, severity, multiple, tooltips) {
|
||||
var marker = document.createElement("div"), inner = marker;
|
||||
marker.className = "CodeMirror-lint-marker-" + severity;
|
||||
marker.className = "CodeMirror-lint-marker CodeMirror-lint-marker-" + severity;
|
||||
if (multiple) {
|
||||
inner = marker.appendChild(document.createElement("div"));
|
||||
inner.className = "CodeMirror-lint-marker-multiple";
|
||||
inner.className = "CodeMirror-lint-marker CodeMirror-lint-marker-multiple";
|
||||
}
|
||||
|
||||
if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {
|
||||
|
@ -114,7 +114,7 @@
|
|||
var severity = ann.severity;
|
||||
if (!severity) severity = "error";
|
||||
var tip = document.createElement("div");
|
||||
tip.className = "CodeMirror-lint-message-" + severity;
|
||||
tip.className = "CodeMirror-lint-message CodeMirror-lint-message-" + severity;
|
||||
if (typeof ann.messageHTML != 'undefined') {
|
||||
tip.innerHTML = ann.messageHTML;
|
||||
} else {
|
||||
|
@ -183,7 +183,7 @@
|
|||
if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
|
||||
|
||||
if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
|
||||
className: "CodeMirror-lint-mark-" + severity,
|
||||
className: "CodeMirror-lint-mark CodeMirror-lint-mark-" + severity,
|
||||
__annotation: ann
|
||||
}));
|
||||
}
|
||||
|
|
155
vendor/codemirror/keymap/vim.js
vendored
155
vendor/codemirror/keymap/vim.js
vendored
|
@ -8,7 +8,7 @@
|
|||
* Supported Ex commands:
|
||||
* Refer to defaultExCommandMap below.
|
||||
*
|
||||
* Registers: unnamed, -, a-z, A-Z, 0-9
|
||||
* Registers: unnamed, -, ., :, /, _, a-z, A-Z, 0-9
|
||||
* (Does not respect the special case for number registers when delete
|
||||
* operator is made with these commands: %, (, ), , /, ?, n, N, {, } )
|
||||
* TODO: Implement the remaining registers.
|
||||
|
@ -141,6 +141,8 @@
|
|||
{ keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true },
|
||||
{ keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }},
|
||||
{ keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }},
|
||||
{ keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true }},
|
||||
{ keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false }},
|
||||
// Operator-Motion dual commands
|
||||
{ keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }},
|
||||
{ keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }},
|
||||
|
@ -416,7 +418,7 @@
|
|||
var lowerCaseAlphabet = makeKeyRange(97, 26);
|
||||
var numbers = makeKeyRange(48, 10);
|
||||
var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']);
|
||||
var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '/']);
|
||||
var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '_', '/']);
|
||||
|
||||
function isLine(cm, line) {
|
||||
return line >= cm.firstLine() && line <= cm.lastLine();
|
||||
|
@ -1128,6 +1130,8 @@
|
|||
}
|
||||
RegisterController.prototype = {
|
||||
pushText: function(registerName, operator, text, linewise, blockwise) {
|
||||
// The black hole register, "_, means delete/yank to nowhere.
|
||||
if (registerName === '_') return;
|
||||
if (linewise && text.charAt(text.length - 1) !== '\n'){
|
||||
text += '\n';
|
||||
}
|
||||
|
@ -1574,7 +1578,7 @@
|
|||
motionArgs.repeat = repeat;
|
||||
clearInputState(cm);
|
||||
if (motion) {
|
||||
var motionResult = motions[motion](cm, origHead, motionArgs, vim);
|
||||
var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState);
|
||||
vim.lastMotion = motions[motion];
|
||||
if (!motionResult) {
|
||||
return;
|
||||
|
@ -1772,6 +1776,87 @@
|
|||
highlightSearchMatches(cm, query);
|
||||
return findNext(cm, prev/** prev */, query, motionArgs.repeat);
|
||||
},
|
||||
/**
|
||||
* Find and select the next occurrence of the search query. If the cursor is currently
|
||||
* within a match, then find and select the current match. Otherwise, find the next occurrence in the
|
||||
* appropriate direction.
|
||||
*
|
||||
* This differs from `findNext` in the following ways:
|
||||
*
|
||||
* 1. Instead of only returning the "from", this returns a "from", "to" range.
|
||||
* 2. If the cursor is currently inside a search match, this selects the current match
|
||||
* instead of the next match.
|
||||
* 3. If there is no associated operator, this will turn on visual mode.
|
||||
*/
|
||||
findAndSelectNextInclusive: function(cm, _head, motionArgs, vim, prevInputState) {
|
||||
var state = getSearchState(cm);
|
||||
var query = state.getQuery();
|
||||
|
||||
if (!query) {
|
||||
return;
|
||||
}
|
||||
|
||||
var prev = !motionArgs.forward;
|
||||
prev = (state.isReversed()) ? !prev : prev;
|
||||
|
||||
// next: [from, to] | null
|
||||
var next = findNextFromAndToInclusive(cm, prev, query, motionArgs.repeat, vim);
|
||||
|
||||
// No matches.
|
||||
if (!next) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If there's an operator that will be executed, return the selection.
|
||||
if (prevInputState.operator) {
|
||||
return next;
|
||||
}
|
||||
|
||||
// At this point, we know that there is no accompanying operator -- let's
|
||||
// deal with visual mode in order to select an appropriate match.
|
||||
|
||||
var from = next[0];
|
||||
// For whatever reason, when we use the "to" as returned by searchcursor.js directly,
|
||||
// the resulting selection is extended by 1 char. Let's shrink it so that only the
|
||||
// match is selected.
|
||||
var to = Pos(next[1].line, next[1].ch - 1);
|
||||
|
||||
if (vim.visualMode) {
|
||||
// If we were in visualLine or visualBlock mode, get out of it.
|
||||
if (vim.visualLine || vim.visualBlock) {
|
||||
vim.visualLine = false;
|
||||
vim.visualBlock = false;
|
||||
CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""});
|
||||
}
|
||||
|
||||
// If we're currently in visual mode, we should extend the selection to include
|
||||
// the search result.
|
||||
var anchor = vim.sel.anchor;
|
||||
if (anchor) {
|
||||
if (state.isReversed()) {
|
||||
if (motionArgs.forward) {
|
||||
return [anchor, from];
|
||||
}
|
||||
|
||||
return [anchor, to];
|
||||
} else {
|
||||
if (motionArgs.forward) {
|
||||
return [anchor, to];
|
||||
}
|
||||
|
||||
return [anchor, from];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Let's turn visual mode on.
|
||||
vim.visualMode = true;
|
||||
vim.visualLine = false;
|
||||
vim.visualBlock = false;
|
||||
CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""});
|
||||
}
|
||||
|
||||
return prev ? [to, from] : [from, to];
|
||||
},
|
||||
goToMark: function(cm, _head, motionArgs, vim) {
|
||||
var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter);
|
||||
if (pos) {
|
||||
|
@ -1867,8 +1952,8 @@
|
|||
// move to previous/next line is triggered.
|
||||
if (line < first && cur.line == first){
|
||||
return this.moveToStartOfLine(cm, head, motionArgs, vim);
|
||||
}else if (line > last && cur.line == last){
|
||||
return this.moveToEol(cm, head, motionArgs, vim, true);
|
||||
} else if (line > last && cur.line == last){
|
||||
return moveToEol(cm, head, motionArgs, vim, true);
|
||||
}
|
||||
if (motionArgs.toFirstChar){
|
||||
endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));
|
||||
|
@ -1970,16 +2055,8 @@
|
|||
vim.lastHSPos = cm.charCoords(head,'div').left;
|
||||
return moveToColumn(cm, repeat);
|
||||
},
|
||||
moveToEol: function(cm, head, motionArgs, vim, keepHPos) {
|
||||
var cur = head;
|
||||
var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity);
|
||||
var end=cm.clipPos(retval);
|
||||
end.ch--;
|
||||
if (!keepHPos) {
|
||||
vim.lastHPos = Infinity;
|
||||
vim.lastHSPos = cm.charCoords(end,'div').left;
|
||||
}
|
||||
return retval;
|
||||
moveToEol: function(cm, head, motionArgs, vim) {
|
||||
return moveToEol(cm, head, motionArgs, vim, false);
|
||||
},
|
||||
moveToFirstNonWhiteSpaceCharacter: function(cm, head) {
|
||||
// Go to the start of the line where the text begins, or the end for
|
||||
|
@ -3607,6 +3684,18 @@
|
|||
}
|
||||
}
|
||||
|
||||
function moveToEol(cm, head, motionArgs, vim, keepHPos) {
|
||||
var cur = head;
|
||||
var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity);
|
||||
var end=cm.clipPos(retval);
|
||||
end.ch--;
|
||||
if (!keepHPos) {
|
||||
vim.lastHPos = Infinity;
|
||||
vim.lastHSPos = cm.charCoords(end,'div').left;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
function moveToCharacter(cm, repeat, forward, character) {
|
||||
var cur = cm.getCursor();
|
||||
var start = cur.ch;
|
||||
|
@ -4348,6 +4437,42 @@
|
|||
return cursor.from();
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Pretty much the same as `findNext`, except for the following differences:
|
||||
*
|
||||
* 1. Before starting the search, move to the previous search. This way if our cursor is
|
||||
* already inside a match, we should return the current match.
|
||||
* 2. Rather than only returning the cursor's from, we return the cursor's from and to as a tuple.
|
||||
*/
|
||||
function findNextFromAndToInclusive(cm, prev, query, repeat, vim) {
|
||||
if (repeat === undefined) { repeat = 1; }
|
||||
return cm.operation(function() {
|
||||
var pos = cm.getCursor();
|
||||
var cursor = cm.getSearchCursor(query, pos);
|
||||
|
||||
// Go back one result to ensure that if the cursor is currently a match, we keep it.
|
||||
var found = cursor.find(!prev);
|
||||
|
||||
// If we haven't moved, go back one more (similar to if i==0 logic in findNext).
|
||||
if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) {
|
||||
cursor.find(!prev);
|
||||
}
|
||||
|
||||
for (var i = 0; i < repeat; i++) {
|
||||
found = cursor.find(prev);
|
||||
if (!found) {
|
||||
// SearchCursor may have returned null because it hit EOF, wrap
|
||||
// around and try again.
|
||||
cursor = cm.getSearchCursor(query,
|
||||
(prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) );
|
||||
if (!cursor.find(prev)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
return [cursor.from(), cursor.to()];
|
||||
});
|
||||
}
|
||||
function clearSearchHighlight(cm) {
|
||||
var state = getSearchState(cm);
|
||||
cm.removeOverlay(getSearchState(cm).getOverlay());
|
||||
|
|
1
vendor/codemirror/lib/codemirror.css
vendored
1
vendor/codemirror/lib/codemirror.css
vendored
|
@ -184,6 +184,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
|
|||
position: absolute;
|
||||
z-index: 6;
|
||||
display: none;
|
||||
outline: none;
|
||||
}
|
||||
.CodeMirror-vscrollbar {
|
||||
right: 0; top: 0;
|
||||
|
|
42
vendor/codemirror/lib/codemirror.js
vendored
42
vendor/codemirror/lib/codemirror.js
vendored
|
@ -1841,7 +1841,7 @@
|
|||
}
|
||||
}
|
||||
builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;
|
||||
if (style || startStyle || endStyle || mustWrap || css) {
|
||||
if (style || startStyle || endStyle || mustWrap || css || attributes) {
|
||||
var fullStyle = style || "";
|
||||
if (startStyle) { fullStyle += startStyle; }
|
||||
if (endStyle) { fullStyle += endStyle; }
|
||||
|
@ -3276,8 +3276,10 @@
|
|||
var on = true;
|
||||
display.cursorDiv.style.visibility = "";
|
||||
if (cm.options.cursorBlinkRate > 0)
|
||||
{ display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; },
|
||||
cm.options.cursorBlinkRate); }
|
||||
{ display.blinker = setInterval(function () {
|
||||
if (!cm.hasFocus()) { onBlur(cm); }
|
||||
display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";
|
||||
}, cm.options.cursorBlinkRate); }
|
||||
else if (cm.options.cursorBlinkRate < 0)
|
||||
{ display.cursorDiv.style.visibility = "hidden"; }
|
||||
}
|
||||
|
@ -7002,7 +7004,7 @@
|
|||
goGroupRight: function (cm) { return cm.moveH(1, "group"); },
|
||||
goGroupLeft: function (cm) { return cm.moveH(-1, "group"); },
|
||||
goWordRight: function (cm) { return cm.moveH(1, "word"); },
|
||||
delCharBefore: function (cm) { return cm.deleteH(-1, "char"); },
|
||||
delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); },
|
||||
delCharAfter: function (cm) { return cm.deleteH(1, "char"); },
|
||||
delWordBefore: function (cm) { return cm.deleteH(-1, "word"); },
|
||||
delWordAfter: function (cm) { return cm.deleteH(1, "word"); },
|
||||
|
@ -7877,7 +7879,9 @@
|
|||
attachDoc(this, doc);
|
||||
|
||||
if ((options.autofocus && !mobile) || this.hasFocus())
|
||||
{ setTimeout(bind(onFocus, this), 20); }
|
||||
{ setTimeout(function () {
|
||||
if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }
|
||||
}, 20); }
|
||||
else
|
||||
{ onBlur(this); }
|
||||
|
||||
|
@ -8640,14 +8644,14 @@
|
|||
}
|
||||
|
||||
// Used for horizontal relative motion. Dir is -1 or 1 (left or
|
||||
// right), unit can be "char", "column" (like char, but doesn't
|
||||
// cross line boundaries), "word" (across next word), or "group" (to
|
||||
// the start of next group of word or non-word-non-whitespace
|
||||
// chars). The visually param controls whether, in right-to-left
|
||||
// text, direction 1 means to move towards the next index in the
|
||||
// string, or towards the character to the right of the current
|
||||
// position. The resulting position will have a hitSide=true
|
||||
// property if it reached the end of the document.
|
||||
// right), unit can be "codepoint", "char", "column" (like char, but
|
||||
// doesn't cross line boundaries), "word" (across next word), or
|
||||
// "group" (to the start of next group of word or
|
||||
// non-word-non-whitespace chars). The visually param controls
|
||||
// whether, in right-to-left text, direction 1 means to move towards
|
||||
// the next index in the string, or towards the character to the right
|
||||
// of the current position. The resulting position will have a
|
||||
// hitSide=true property if it reached the end of the document.
|
||||
function findPosH(doc, pos, dir, unit, visually) {
|
||||
var oldPos = pos;
|
||||
var origDir = dir;
|
||||
|
@ -8661,7 +8665,12 @@
|
|||
}
|
||||
function moveOnce(boundToLine) {
|
||||
var next;
|
||||
if (visually) {
|
||||
if (unit == "codepoint") {
|
||||
var ch = lineObj.text.charCodeAt(pos.ch + (unit > 0 ? 0 : -1));
|
||||
if (isNaN(ch)) { next = null; }
|
||||
else { next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (ch >= 0xD800 && ch < 0xDC00 ? 2 : 1))),
|
||||
-dir); }
|
||||
} else if (visually) {
|
||||
next = moveVisually(doc.cm, lineObj, pos, dir);
|
||||
} else {
|
||||
next = moveLogically(lineObj, pos, dir);
|
||||
|
@ -8677,7 +8686,7 @@
|
|||
return true
|
||||
}
|
||||
|
||||
if (unit == "char") {
|
||||
if (unit == "char" || unit == "codepoint") {
|
||||
moveOnce();
|
||||
} else if (unit == "column") {
|
||||
moveOnce(true);
|
||||
|
@ -9621,6 +9630,7 @@
|
|||
TextareaInput.prototype.readOnlyChanged = function (val) {
|
||||
if (!val) { this.reset(); }
|
||||
this.textarea.disabled = val == "nocursor";
|
||||
this.textarea.readOnly = !!val;
|
||||
};
|
||||
|
||||
TextareaInput.prototype.setUneditable = function () {};
|
||||
|
@ -9771,7 +9781,7 @@
|
|||
|
||||
addLegacyProps(CodeMirror);
|
||||
|
||||
CodeMirror.version = "5.57.0";
|
||||
CodeMirror.version = "5.58.0";
|
||||
|
||||
return CodeMirror;
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
|
|||
if (ch != ">" || !state.lexical || state.lexical.type != ">") {
|
||||
if (stream.eat("=")) {
|
||||
if (ch == "!" || ch == "=") stream.eat("=")
|
||||
} else if (/[<>*+\-]/.test(ch)) {
|
||||
} else if (/[<>*+\-|&?]/.test(ch)) {
|
||||
stream.eat(ch)
|
||||
if (ch == ">") stream.eat(ch)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user