[internal #1926343] CodeMirror updated to version 5.58.3
diff --git a/htdocs/Libs/Codemirror/brace-fold.js b/htdocs/Libs/Codemirror/brace-fold.js
new file mode 100644
index 0000000..654d1fb
--- /dev/null
+++ b/htdocs/Libs/Codemirror/brace-fold.js
@@ -0,0 +1,105 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.registerHelper("fold", "brace", function(cm, start) {
+ var line = start.line, lineText = cm.getLine(line);
+ var tokenType;
+
+ function findOpening(openCh) {
+ for (var at = start.ch, pass = 0;;) {
+ var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);
+ if (found == -1) {
+ if (pass == 1) break;
+ pass = 1;
+ at = lineText.length;
+ continue;
+ }
+ if (pass == 1 && found < start.ch) break;
+ tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));
+ if (!/^(comment|string)/.test(tokenType)) return found + 1;
+ at = found - 1;
+ }
+ }
+
+ var startToken = "{", endToken = "}", startCh = findOpening("{");
+ if (startCh == null) {
+ startToken = "[", endToken = "]";
+ startCh = findOpening("[");
+ }
+
+ if (startCh == null) return;
+ var count = 1, lastLine = cm.lastLine(), end, endCh;
+ outer: for (var i = line; i <= lastLine; ++i) {
+ var text = cm.getLine(i), pos = i == line ? startCh : 0;
+ for (;;) {
+ var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
+ if (nextOpen < 0) nextOpen = text.length;
+ if (nextClose < 0) nextClose = text.length;
+ pos = Math.min(nextOpen, nextClose);
+ if (pos == text.length) break;
+ if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {
+ if (pos == nextOpen) ++count;
+ else if (!--count) { end = i; endCh = pos; break outer; }
+ }
+ ++pos;
+ }
+ }
+ if (end == null || line == end) return;
+ return {from: CodeMirror.Pos(line, startCh),
+ to: CodeMirror.Pos(end, endCh)};
+});
+
+CodeMirror.registerHelper("fold", "import", function(cm, start) {
+ function hasImport(line) {
+ if (line < cm.firstLine() || line > cm.lastLine()) return null;
+ var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
+ if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
+ if (start.type != "keyword" || start.string != "import") return null;
+ // Now find closing semicolon, return its position
+ for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {
+ var text = cm.getLine(i), semi = text.indexOf(";");
+ if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};
+ }
+ }
+
+ var startLine = start.line, has = hasImport(startLine), prev;
+ if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))
+ return null;
+ for (var end = has.end;;) {
+ var next = hasImport(end.line + 1);
+ if (next == null) break;
+ end = next.end;
+ }
+ return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};
+});
+
+CodeMirror.registerHelper("fold", "include", function(cm, start) {
+ function hasInclude(line) {
+ if (line < cm.firstLine() || line > cm.lastLine()) return null;
+ var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
+ if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
+ if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
+ }
+
+ var startLine = start.line, has = hasInclude(startLine);
+ if (has == null || hasInclude(startLine - 1) != null) return null;
+ for (var end = startLine;;) {
+ var next = hasInclude(end + 1);
+ if (next == null) break;
+ ++end;
+ }
+ return {from: CodeMirror.Pos(startLine, has + 1),
+ to: cm.clipPos(CodeMirror.Pos(end))};
+});
+
+});
diff --git a/htdocs/Libs/Codemirror/closebrackets.js b/htdocs/Libs/Codemirror/closebrackets.js
new file mode 100644
index 0000000..4415c39
--- /dev/null
+++ b/htdocs/Libs/Codemirror/closebrackets.js
@@ -0,0 +1,191 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+ var defaults = {
+ pairs: "()[]{}''\"\"",
+ closeBefore: ")]}'\":;>",
+ triples: "",
+ explode: "[]{}"
+ };
+
+ var Pos = CodeMirror.Pos;
+
+ CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
+ if (old && old != CodeMirror.Init) {
+ cm.removeKeyMap(keyMap);
+ cm.state.closeBrackets = null;
+ }
+ if (val) {
+ ensureBound(getOption(val, "pairs"))
+ cm.state.closeBrackets = val;
+ cm.addKeyMap(keyMap);
+ }
+ });
+
+ function getOption(conf, name) {
+ if (name == "pairs" && typeof conf == "string") return conf;
+ if (typeof conf == "object" && conf[name] != null) return conf[name];
+ return defaults[name];
+ }
+
+ var keyMap = {Backspace: handleBackspace, Enter: handleEnter};
+ function ensureBound(chars) {
+ for (var i = 0; i < chars.length; i++) {
+ var ch = chars.charAt(i), key = "'" + ch + "'"
+ if (!keyMap[key]) keyMap[key] = handler(ch)
+ }
+ }
+ ensureBound(defaults.pairs + "`")
+
+ function handler(ch) {
+ return function(cm) { return handleChar(cm, ch); };
+ }
+
+ function getConfig(cm) {
+ var deflt = cm.state.closeBrackets;
+ if (!deflt || deflt.override) return deflt;
+ var mode = cm.getModeAt(cm.getCursor());
+ return mode.closeBrackets || deflt;
+ }
+
+ function handleBackspace(cm) {
+ var conf = getConfig(cm);
+ if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
+
+ var pairs = getOption(conf, "pairs");
+ var ranges = cm.listSelections();
+ for (var i = 0; i < ranges.length; i++) {
+ if (!ranges[i].empty()) return CodeMirror.Pass;
+ var around = charsAround(cm, ranges[i].head);
+ if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
+ }
+ for (var i = ranges.length - 1; i >= 0; i--) {
+ var cur = ranges[i].head;
+ cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete");
+ }
+ }
+
+ function handleEnter(cm) {
+ var conf = getConfig(cm);
+ var explode = conf && getOption(conf, "explode");
+ if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass;
+
+ var ranges = cm.listSelections();
+ for (var i = 0; i < ranges.length; i++) {
+ if (!ranges[i].empty()) return CodeMirror.Pass;
+ var around = charsAround(cm, ranges[i].head);
+ if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;
+ }
+ cm.operation(function() {
+ var linesep = cm.lineSeparator() || "\n";
+ cm.replaceSelection(linesep + linesep, null);
+ cm.execCommand("goCharLeft");
+ ranges = cm.listSelections();
+ for (var i = 0; i < ranges.length; i++) {
+ var line = ranges[i].head.line;
+ cm.indentLine(line, null, true);
+ cm.indentLine(line + 1, null, true);
+ }
+ });
+ }
+
+ function contractSelection(sel) {
+ var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;
+ return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),
+ head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))};
+ }
+
+ function handleChar(cm, ch) {
+ var conf = getConfig(cm);
+ if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
+
+ var pairs = getOption(conf, "pairs");
+ var pos = pairs.indexOf(ch);
+ if (pos == -1) return CodeMirror.Pass;
+
+ var closeBefore = getOption(conf,"closeBefore");
+
+ var triples = getOption(conf, "triples");
+
+ var identical = pairs.charAt(pos + 1) == ch;
+ var ranges = cm.listSelections();
+ var opening = pos % 2 == 0;
+
+ var type;
+ for (var i = 0; i < ranges.length; i++) {
+ var range = ranges[i], cur = range.head, curType;
+ var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
+ if (opening && !range.empty()) {
+ curType = "surround";
+ } else if ((identical || !opening) && next == ch) {
+ if (identical && stringStartsAfter(cm, cur))
+ curType = "both";
+ else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)
+ curType = "skipThree";
+ else
+ curType = "skip";
+ } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&
+ cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) {
+ if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass;
+ curType = "addFour";
+ } else if (identical) {
+ var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur)
+ if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both";
+ else return CodeMirror.Pass;
+ } else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) {
+ curType = "both";
+ } else {
+ return CodeMirror.Pass;
+ }
+ if (!type) type = curType;
+ else if (type != curType) return CodeMirror.Pass;
+ }
+
+ var left = pos % 2 ? pairs.charAt(pos - 1) : ch;
+ var right = pos % 2 ? ch : pairs.charAt(pos + 1);
+ cm.operation(function() {
+ if (type == "skip") {
+ cm.execCommand("goCharRight");
+ } else if (type == "skipThree") {
+ for (var i = 0; i < 3; i++)
+ cm.execCommand("goCharRight");
+ } else if (type == "surround") {
+ var sels = cm.getSelections();
+ for (var i = 0; i < sels.length; i++)
+ sels[i] = left + sels[i] + right;
+ cm.replaceSelections(sels, "around");
+ sels = cm.listSelections().slice();
+ for (var i = 0; i < sels.length; i++)
+ sels[i] = contractSelection(sels[i]);
+ cm.setSelections(sels);
+ } else if (type == "both") {
+ cm.replaceSelection(left + right, null);
+ cm.triggerElectric(left + right);
+ cm.execCommand("goCharLeft");
+ } else if (type == "addFour") {
+ cm.replaceSelection(left + left + left + left, "before");
+ cm.execCommand("goCharRight");
+ }
+ });
+ }
+
+ function charsAround(cm, pos) {
+ var str = cm.getRange(Pos(pos.line, pos.ch - 1),
+ Pos(pos.line, pos.ch + 1));
+ return str.length == 2 ? str : null;
+ }
+
+ function stringStartsAfter(cm, pos) {
+ var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1))
+ return /\bstring/.test(token.type) && token.start == pos.ch &&
+ (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos)))
+ }
+});
diff --git a/htdocs/Libs/Codemirror/closetag.js b/htdocs/Libs/Codemirror/closetag.js
new file mode 100644
index 0000000..7c22a50
--- /dev/null
+++ b/htdocs/Libs/Codemirror/closetag.js
@@ -0,0 +1,185 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+/**
+ * Tag-closer extension for CodeMirror.
+ *
+ * This extension adds an "autoCloseTags" option that can be set to
+ * either true to get the default behavior, or an object to further
+ * configure its behavior.
+ *
+ * These are supported options:
+ *
+ * `whenClosing` (default true)
+ * Whether to autoclose when the '/' of a closing tag is typed.
+ * `whenOpening` (default true)
+ * Whether to autoclose the tag when the final '>' of an opening
+ * tag is typed.
+ * `dontCloseTags` (default is empty tags for HTML, none for XML)
+ * An array of tag names that should not be autoclosed.
+ * `indentTags` (default is block tags for HTML, none for XML)
+ * An array of tag names that should, when opened, cause a
+ * blank line to be added inside the tag, and the blank line and
+ * closing line to be indented.
+ * `emptyTags` (default is none)
+ * An array of XML tag names that should be autoclosed with '/>'.
+ *
+ * See demos/closetag.html for a usage example.
+ */
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror", "../fold/xml-fold"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+ CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) {
+ if (old != CodeMirror.Init && old)
+ cm.removeKeyMap("autoCloseTags");
+ if (!val) return;
+ var map = {name: "autoCloseTags"};
+ if (typeof val != "object" || val.whenClosing !== false)
+ map["'/'"] = function(cm) { return autoCloseSlash(cm); };
+ if (typeof val != "object" || val.whenOpening !== false)
+ map["'>'"] = function(cm) { return autoCloseGT(cm); };
+ cm.addKeyMap(map);
+ });
+
+ var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param",
+ "source", "track", "wbr"];
+ var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4",
+ "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
+
+ function autoCloseGT(cm) {
+ if (cm.getOption("disableInput")) return CodeMirror.Pass;
+ var ranges = cm.listSelections(), replacements = [];
+ var opt = cm.getOption("autoCloseTags");
+ for (var i = 0; i < ranges.length; i++) {
+ if (!ranges[i].empty()) return CodeMirror.Pass;
+ var pos = ranges[i].head, tok = cm.getTokenAt(pos);
+ var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
+ var tagInfo = inner.mode.xmlCurrentTag && inner.mode.xmlCurrentTag(state)
+ var tagName = tagInfo && tagInfo.name
+ if (!tagName) return CodeMirror.Pass
+
+ var html = inner.mode.configuration == "html";
+ var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose);
+ var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent);
+
+ if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
+ var lowerTagName = tagName.toLowerCase();
+ // Don't process the '>' at the end of an end-tag or self-closing tag
+ if (!tagName ||
+ tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) ||
+ tok.type == "tag" && tagInfo.close ||
+ tok.string.indexOf("/") == (pos.ch - tok.start - 1) || // match something like <someTagName />
+ dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 ||
+ closingTagExists(cm, inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state) || [], tagName, pos, true))
+ return CodeMirror.Pass;
+
+ var emptyTags = typeof opt == "object" && opt.emptyTags;
+ if (emptyTags && indexOf(emptyTags, tagName) > -1) {
+ replacements[i] = { text: "/>", newPos: CodeMirror.Pos(pos.line, pos.ch + 2) };
+ continue;
+ }
+
+ var indent = indentTags && indexOf(indentTags, lowerTagName) > -1;
+ replacements[i] = {indent: indent,
+ text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">",
+ newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)};
+ }
+
+ var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnAutoClose);
+ for (var i = ranges.length - 1; i >= 0; i--) {
+ var info = replacements[i];
+ cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert");
+ var sel = cm.listSelections().slice(0);
+ sel[i] = {head: info.newPos, anchor: info.newPos};
+ cm.setSelections(sel);
+ if (!dontIndentOnAutoClose && info.indent) {
+ cm.indentLine(info.newPos.line, null, true);
+ cm.indentLine(info.newPos.line + 1, null, true);
+ }
+ }
+ }
+
+ function autoCloseCurrent(cm, typingSlash) {
+ var ranges = cm.listSelections(), replacements = [];
+ var head = typingSlash ? "/" : "</";
+ var opt = cm.getOption("autoCloseTags");
+ var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnSlash);
+ for (var i = 0; i < ranges.length; i++) {
+ if (!ranges[i].empty()) return CodeMirror.Pass;
+ var pos = ranges[i].head, tok = cm.getTokenAt(pos);
+ var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
+ if (typingSlash && (tok.type == "string" || tok.string.charAt(0) != "<" ||
+ tok.start != pos.ch - 1))
+ return CodeMirror.Pass;
+ // Kludge to get around the fact that we are not in XML mode
+ // when completing in JS/CSS snippet in htmlmixed mode. Does not
+ // work for other XML embedded languages (there is no general
+ // way to go from a mixed mode to its current XML state).
+ var replacement, mixed = inner.mode.name != "xml" && cm.getMode().name == "htmlmixed"
+ if (mixed && inner.mode.name == "javascript") {
+ replacement = head + "script";
+ } else if (mixed && inner.mode.name == "css") {
+ replacement = head + "style";
+ } else {
+ var context = inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state)
+ var top = context.length ? context[context.length - 1] : ""
+ if (!context || (context.length && closingTagExists(cm, context, top, pos)))
+ return CodeMirror.Pass;
+ replacement = head + top
+ }
+ if (cm.getLine(pos.line).charAt(tok.end) != ">") replacement += ">";
+ replacements[i] = replacement;
+ }
+ cm.replaceSelections(replacements);
+ ranges = cm.listSelections();
+ if (!dontIndentOnAutoClose) {
+ for (var i = 0; i < ranges.length; i++)
+ if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)
+ cm.indentLine(ranges[i].head.line);
+ }
+ }
+
+ function autoCloseSlash(cm) {
+ if (cm.getOption("disableInput")) return CodeMirror.Pass;
+ return autoCloseCurrent(cm, true);
+ }
+
+ CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); };
+
+ function indexOf(collection, elt) {
+ if (collection.indexOf) return collection.indexOf(elt);
+ for (var i = 0, e = collection.length; i < e; ++i)
+ if (collection[i] == elt) return i;
+ return -1;
+ }
+
+ // If xml-fold is loaded, we use its functionality to try and verify
+ // whether a given tag is actually unclosed.
+ function closingTagExists(cm, context, tagName, pos, newTag) {
+ if (!CodeMirror.scanForClosingTag) return false;
+ var end = Math.min(cm.lastLine() + 1, pos.line + 500);
+ var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end);
+ if (!nextClose || nextClose.tag != tagName) return false;
+ // If the immediate wrapping context contains onCx instances of
+ // the same tag, a closing tag only exists if there are at least
+ // that many closing tags of that type following.
+ var onCx = newTag ? 1 : 0
+ for (var i = context.length - 1; i >= 0; i--) {
+ if (context[i] == tagName) ++onCx
+ else break
+ }
+ pos = nextClose.to;
+ for (var i = 1; i < onCx; i++) {
+ var next = CodeMirror.scanForClosingTag(cm, pos, null, end);
+ if (!next || next.tag != tagName) return false;
+ pos = next.to;
+ }
+ return true;
+ }
+});
diff --git a/htdocs/Libs/Codemirror/codemirror.css b/htdocs/Libs/Codemirror/codemirror.css
index 49ec873..f1aa66d 100644
--- a/htdocs/Libs/Codemirror/codemirror.css
+++ b/htdocs/Libs/Codemirror/codemirror.css
@@ -5,6 +5,7 @@
font-family: monospace;
height: 300px;
color: black;
+ direction: ltr;
}
/* PADDING */
@@ -12,7 +13,8 @@
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
-.CodeMirror pre {
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
padding: 0 4px; /* Horizontal padding of content */
}
@@ -52,13 +54,18 @@
}
.cm-fat-cursor .CodeMirror-cursor {
width: auto;
- border: 0;
+ border: 0 !important;
background: #7e7;
}
.cm-fat-cursor div.CodeMirror-cursors {
z-index: 1;
}
-
+.cm-fat-cursor-mark {
+ background-color: rgba(20, 255, 20, 0.5);
+ -webkit-animation: blink 1.06s steps(1) infinite;
+ -moz-animation: blink 1.06s steps(1) infinite;
+ animation: blink 1.06s steps(1) infinite;
+}
.cm-animate-fat-cursor {
width: auto;
border: 0;
@@ -88,8 +95,14 @@
.cm-tab { display: inline-block; text-decoration: inherit; }
+.CodeMirror-rulers {
+ position: absolute;
+ left: 0; right: 0; top: -50px; bottom: 0;
+ overflow: hidden;
+}
.CodeMirror-ruler {
border-left: 1px solid #ccc;
+ top: 0; bottom: 0;
position: absolute;
}
@@ -113,7 +126,7 @@
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
@@ -133,8 +146,8 @@
/* Default styles for common addons */
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
@@ -151,26 +164,27 @@
.CodeMirror-scroll {
overflow: scroll !important; /* Things will break if this is overridden */
- /* 30px is the magic margin used to hide the element's real scrollbars */
+ /* 50px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
- margin-bottom: -30px; margin-right: -30px;
- padding-bottom: 30px;
+ margin-bottom: -50px; margin-right: -50px;
+ padding-bottom: 50px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
}
.CodeMirror-sizer {
position: relative;
- border-right: 30px solid transparent;
+ border-right: 50px solid transparent;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
- before actuall scrolling happens, thus preventing shaking and
+ before actual scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
+ outline: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
@@ -191,16 +205,15 @@
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
+ min-height: 100%;
z-index: 3;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
display: inline-block;
- margin-bottom: -30px;
- /* Hack to make IE7 behave */
- *zoom:1;
- *display:inline;
+ vertical-align: top;
+ margin-bottom: -50px;
}
.CodeMirror-gutter-wrapper {
position: absolute;
@@ -218,17 +231,15 @@
cursor: default;
z-index: 4;
}
-.CodeMirror-gutter-wrapper {
- -webkit-user-select: none;
- -moz-user-select: none;
- user-select: none;
-}
+.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
+.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
.CodeMirror-lines {
cursor: text;
min-height: 1px; /* prevents collapsing before first draw */
}
-.CodeMirror pre {
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
border-width: 0;
@@ -244,8 +255,11 @@
position: relative;
overflow: visible;
-webkit-tap-highlight-color: transparent;
+ -webkit-font-variant-ligatures: contextual;
+ font-variant-ligatures: contextual;
}
-.CodeMirror-wrap pre {
+.CodeMirror-wrap pre.CodeMirror-line,
+.CodeMirror-wrap pre.CodeMirror-line-like {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
@@ -260,11 +274,13 @@
.CodeMirror-linewidget {
position: relative;
z-index: 2;
- overflow: auto;
+ padding: 0.1px; /* Force widget margins to stay inside of the container */
}
.CodeMirror-widget {}
+.CodeMirror-rtl pre { direction: rtl; }
+
.CodeMirror-code {
outline: none;
}
@@ -287,7 +303,10 @@
visibility: hidden;
}
-.CodeMirror-cursor { position: absolute; }
+.CodeMirror-cursor {
+ position: absolute;
+ pointer-events: none;
+}
.CodeMirror-measure pre { position: static; }
div.CodeMirror-cursors {
@@ -310,13 +329,10 @@
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
.cm-searching {
- background: #ffa;
- background: rgba(255, 255, 0, .4);
+ background-color: #ffa;
+ background-color: rgba(255, 255, 0, .4);
}
-/* IE7 hack to prevent it from returning funny offsetTops on the spans */
-.CodeMirror span { *vertical-align: text-bottom; }
-
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
diff --git a/htdocs/Libs/Codemirror/codemirror.custom.js b/htdocs/Libs/Codemirror/codemirror.custom.js
deleted file mode 100644
index 59ec31c..0000000
--- a/htdocs/Libs/Codemirror/codemirror.custom.js
+++ /dev/null
@@ -1,9544 +0,0 @@
-/* CodeMirror - Minified & Bundled
- Generated on 2015. 08. 31. with http://codemirror.net/doc/compress.html
- Version: HEAD
-
- CodeMirror Library:
- - codemirror.js
- Modes:
- - css.js
- - htmlmixed.js
- - javascript.js
- - perl.js
- - python.js
- - shell.js
- - xml.js
- Add-ons:
- - active-line.js
- - brace-fold.js
- - closebrackets.js
- - closetag.js
- - foldcode.js
- - foldgutter.js
- - indent-fold.js
- - match-highlighter.js
- - matchbrackets.js
- - matchtags.js
- - search.js
- - xml-fold.js
- */
-
-! function (a) {
- if ("object" == typeof exports && "object" == typeof module) module.exports = a();
- else {
- if ("function" == typeof define && define.amd) return define([], a);
- this.CodeMirror = a()
- }
-}(function () {
- "use strict";
-
- function v(a, b) {
- if (!(this instanceof v)) return new v(a, b);
- this.options = b = b ? hg(b) : {}, hg(Ad, b, !1), I(b);
- var c = b.value;
- "string" == typeof c && (c = new af(c, b.mode, null, b.lineSeparator)), this.doc = c;
- var g = new v.inputStyles[b.inputStyle](this),
- h = this.display = new w(a, c, g);
- h.wrapper.CodeMirror = this, E(this), C(this), b.lineWrapping && (this.display.wrapper.className += " CodeMirror-wrap"), b.autofocus && !n && h.input.focus(), M(this), this.state = {
- keyMaps: [],
- overlays: [],
- modeGen: 0,
- overwrite: !1,
- delayingBlurEvent: !1,
- focused: !1,
- suppressEdits: !1,
- pasteIncoming: !1,
- cutIncoming: !1,
- selectingText: !1,
- draggingText: !1,
- highlight: new Yf,
- keySeq: null,
- specialChars: null
- };
- var i = this;
- d && 11 > e && setTimeout(function () {
- i.display.input.reset(!0)
- }, 20), pc(this), Bg(), Vb(this), this.curOp.forceUpdate = !0, ef(this, c), b.autofocus && !n || i.hasFocus() ? setTimeout(ig(Zc, this), 20) : $c(this);
- for (var j in Bd) Bd.hasOwnProperty(j) && Bd[j](this, b[j], Dd);
- R(this), b.finishInit && b.finishInit(this);
- for (var k = 0; k < Hd.length; ++k) Hd[k](this);
- Xb(this), f && b.lineWrapping && "optimizelegibility" == getComputedStyle(h.lineDiv)
- .textRendering && (h.lineDiv.style.textRendering = "auto")
- }
-
- function w(b, c, g) {
- var h = this;
- this.input = g, h.scrollbarFiller = pg("div", null, "CodeMirror-scrollbar-filler"), h.scrollbarFiller.setAttribute("cm-not-content", "true"), h.gutterFiller = pg("div", null, "CodeMirror-gutter-filler"), h.gutterFiller.setAttribute("cm-not-content", "true"), h.lineDiv = pg("div", null, "CodeMirror-code"), h.selectionDiv = pg("div", null, null, "position: relative; z-index: 1"), h.cursorDiv = pg("div", null, "CodeMirror-cursors"), h.measure = pg("div", null, "CodeMirror-measure"), h.lineMeasure = pg("div", null, "CodeMirror-measure"), h.lineSpace = pg("div", [h.measure, h.lineMeasure, h.selectionDiv, h.cursorDiv, h.lineDiv], null, "position: relative; outline: none"), h.mover = pg("div", [pg("div", [h.lineSpace], "CodeMirror-lines")], null, "position: relative"), h.sizer = pg("div", [h.mover], "CodeMirror-sizer"), h.sizerWidth = null, h.heightForcer = pg("div", null, null, "position: absolute; height: " + Tf + "px; width: 1px;"), h.gutters = pg("div", null, "CodeMirror-gutters"), h.lineGutter = null, h.scroller = pg("div", [h.sizer, h.heightForcer, h.gutters], "CodeMirror-scroll"), h.scroller.setAttribute("tabIndex", "-1"), h.wrapper = pg("div", [h.scrollbarFiller, h.gutterFiller, h.scroller], "CodeMirror"), d && 8 > e && (h.gutters.style.zIndex = -1, h.scroller.style.paddingRight = 0), f || a && n || (h.scroller.draggable = !0), b && (b.appendChild ? b.appendChild(h.wrapper) : b(h.wrapper)), h.viewFrom = h.viewTo = c.first, h.reportedViewFrom = h.reportedViewTo = c.first, h.view = [], h.renderedView = null, h.externalMeasured = null, h.viewOffset = 0, h.lastWrapHeight = h.lastWrapWidth = 0, h.updateLineNumbers = null, h.nativeBarWidth = h.barHeight = h.barWidth = 0, h.scrollbarsClipped = !1, h.lineNumWidth = h.lineNumInnerWidth = h.lineNumChars = null, h.alignWidgets = !1, h.cachedCharWidth = h.cachedTextHeight = h.cachedPaddingH = null, h.maxLine = null, h.maxLineLength = 0, h.maxLineChanged = !1, h.wheelDX = h.wheelDY = h.wheelStartX = h.wheelStartY = null, h.shift = !1, h.selForContextMenu = null, h.activeTouch = null, g.init(h)
- }
-
- function x(a) {
- a.doc.mode = v.getMode(a.options, a.doc.modeOption), y(a)
- }
-
- function y(a) {
- a.doc.iter(function (a) {
- a.stateAfter && (a.stateAfter = null), a.styles && (a.styles = null)
- }), a.doc.frontier = a.doc.first, ib(a, 100), a.state.modeGen++, a.curOp && ic(a)
- }
-
- function z(a) {
- a.options.lineWrapping ? (xg(a.display.wrapper, "CodeMirror-wrap"), a.display.sizer.style.minWidth = "", a.display.sizerWidth = null) : (wg(a.display.wrapper, "CodeMirror-wrap"), H(a)), B(a), ic(a), Fb(a), setTimeout(function () {
- N(a)
- }, 100)
- }
-
- function A(a) {
- var b = Rb(a.display),
- c = a.options.lineWrapping,
- d = c && Math.max(5, a.display.scroller.clientWidth / Sb(a.display) - 3);
- return function (e) {
- if (we(a.doc, e)) return 0;
- var f = 0;
- if (e.widgets)
- for (var g = 0; g < e.widgets.length; g++) e.widgets[g].height && (f += e.widgets[g].height);
- return c ? f + (Math.ceil(e.text.length / d) || 1) * b : f + b
- }
- }
-
- function B(a) {
- var b = a.doc,
- c = A(a);
- b.iter(function (a) {
- var b = c(a);
- b != a.height && jf(a, b)
- })
- }
-
- function C(a) {
- a.display.wrapper.className = a.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + a.options.theme.replace(/(^|\s)\s*/g, " cm-s-"), Fb(a)
- }
-
- function D(a) {
- E(a), ic(a), setTimeout(function () {
- Q(a)
- }, 20)
- }
-
- function E(a) {
- var b = a.display.gutters,
- c = a.options.gutters;
- rg(b);
- for (var d = 0; d < c.length; ++d) {
- var e = c[d],
- f = b.appendChild(pg("div", null, "CodeMirror-gutter " + e));
- "CodeMirror-linenumbers" == e && (a.display.lineGutter = f, f.style.width = (a.display.lineNumWidth || 1) + "px")
- }
- b.style.display = d ? "" : "none", F(a)
- }
-
- function F(a) {
- var b = a.display.gutters.offsetWidth;
- a.display.sizer.style.marginLeft = b + "px"
- }
-
- function G(a) {
- if (0 == a.height) return 0;
- for (var c, b = a.text.length, d = a; c = pe(d);) {
- var e = c.find(0, !0);
- d = e.from.line, b += e.from.ch - e.to.ch
- }
- for (d = a; c = qe(d);) {
- var e = c.find(0, !0);
- b -= d.text.length - e.from.ch, d = e.to.line, b += d.text.length - e.to.ch
- }
- return b
- }
-
- function H(a) {
- var b = a.display,
- c = a.doc;
- b.maxLine = ff(c, c.first), b.maxLineLength = G(b.maxLine), b.maxLineChanged = !0, c.iter(function (a) {
- var c = G(a);
- c > b.maxLineLength && (b.maxLineLength = c, b.maxLine = a)
- })
- }
-
- function I(a) {
- var b = dg(a.gutters, "CodeMirror-linenumbers"); - 1 == b && a.lineNumbers ? a.gutters = a.gutters.concat(["CodeMirror-linenumbers"]) : b > -1 && !a.lineNumbers && (a.gutters = a.gutters.slice(0), a.gutters.splice(b, 1))
- }
-
- function J(a) {
- var b = a.display,
- c = b.gutters.offsetWidth,
- d = Math.round(a.doc.height + nb(a.display));
- return {
- clientHeight: b.scroller.clientHeight,
- viewHeight: b.wrapper.clientHeight,
- scrollWidth: b.scroller.scrollWidth,
- clientWidth: b.scroller.clientWidth,
- viewWidth: b.wrapper.clientWidth,
- barLeft: a.options.fixedGutter ? c : 0,
- docHeight: d,
- scrollHeight: d + pb(a) + b.barHeight,
- nativeBarWidth: b.nativeBarWidth,
- gutterWidth: c
- }
- }
-
- function K(a, b, c) {
- this.cm = c;
- var f = this.vert = pg("div", [pg("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"),
- g = this.horiz = pg("div", [pg("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
- a(f), a(g), Jf(f, "scroll", function () {
- f.clientHeight && b(f.scrollTop, "vertical")
- }), Jf(g, "scroll", function () {
- g.clientWidth && b(g.scrollLeft, "horizontal")
- }), this.checkedOverlay = !1, d && 8 > e && (this.horiz.style.minHeight = this.vert.style.minWidth = "18px")
- }
-
- function L() {}
-
- function M(a) {
- a.display.scrollbars && (a.display.scrollbars.clear(), a.display.scrollbars.addClass && wg(a.display.wrapper, a.display.scrollbars.addClass)), a.display.scrollbars = new v.scrollbarModel[a.options.scrollbarStyle](function (b) {
- a.display.wrapper.insertBefore(b, a.display.scrollbarFiller), Jf(b, "mousedown", function () {
- a.state.focused && setTimeout(function () {
- a.display.input.focus()
- }, 0)
- }), b.setAttribute("cm-not-content", "true")
- }, function (b, c) {
- "horizontal" == c ? Ic(a, b) : Hc(a, b)
- }, a), a.display.scrollbars.addClass && xg(a.display.wrapper, a.display.scrollbars.addClass)
- }
-
- function N(a, b) {
- b || (b = J(a));
- var c = a.display.barWidth,
- d = a.display.barHeight;
- O(a, b);
- for (var e = 0; 4 > e && c != a.display.barWidth || d != a.display.barHeight; e++) c != a.display.barWidth && a.options.lineWrapping && $(a), O(a, J(a)), c = a.display.barWidth, d = a.display.barHeight
- }
-
- function O(a, b) {
- var c = a.display,
- d = c.scrollbars.update(b);
- c.sizer.style.paddingRight = (c.barWidth = d.right) + "px", c.sizer.style.paddingBottom = (c.barHeight = d.bottom) + "px", d.right && d.bottom ? (c.scrollbarFiller.style.display = "block", c.scrollbarFiller.style.height = d.bottom + "px", c.scrollbarFiller.style.width = d.right + "px") : c.scrollbarFiller.style.display = "", d.bottom && a.options.coverGutterNextToScrollbar && a.options.fixedGutter ? (c.gutterFiller.style.display = "block", c.gutterFiller.style.height = d.bottom + "px", c.gutterFiller.style.width = b.gutterWidth + "px") : c.gutterFiller.style.display = ""
- }
-
- function P(a, b, c) {
- var d = c && null != c.top ? Math.max(0, c.top) : a.scroller.scrollTop;
- d = Math.floor(d - mb(a));
- var e = c && null != c.bottom ? c.bottom : d + a.wrapper.clientHeight,
- f = lf(b, d),
- g = lf(b, e);
- if (c && c.ensure) {
- var h = c.ensure.from.line,
- i = c.ensure.to.line;
- f > h ? (f = h, g = lf(b, mf(ff(b, h)) + a.wrapper.clientHeight)) : Math.min(i, b.lastLine()) >= g && (f = lf(b, mf(ff(b, i)) - a.wrapper.clientHeight), g = i)
- }
- return {
- from: f,
- to: Math.max(g, f + 1)
- }
- }
-
- function Q(a) {
- var b = a.display,
- c = b.view;
- if (b.alignWidgets || b.gutters.firstChild && a.options.fixedGutter) {
- for (var d = T(b) - b.scroller.scrollLeft + a.doc.scrollLeft, e = b.gutters.offsetWidth, f = d + "px", g = 0; g < c.length; g++)
- if (!c[g].hidden) {
- a.options.fixedGutter && c[g].gutter && (c[g].gutter.style.left = f);
- var h = c[g].alignable;
- if (h)
- for (var i = 0; i < h.length; i++) h[i].style.left = f
- }
- a.options.fixedGutter && (b.gutters.style.left = d + e + "px")
- }
- }
-
- function R(a) {
- if (!a.options.lineNumbers) return !1;
- var b = a.doc,
- c = S(a.options, b.first + b.size - 1),
- d = a.display;
- if (c.length != d.lineNumChars) {
- var e = d.measure.appendChild(pg("div", [pg("div", c)], "CodeMirror-linenumber CodeMirror-gutter-elt")),
- f = e.firstChild.offsetWidth,
- g = e.offsetWidth - f;
- return d.lineGutter.style.width = "", d.lineNumInnerWidth = Math.max(f, d.lineGutter.offsetWidth - g) + 1, d.lineNumWidth = d.lineNumInnerWidth + g, d.lineNumChars = d.lineNumInnerWidth ? c.length : -1, d.lineGutter.style.width = d.lineNumWidth + "px", F(a), !0
- }
- return !1
- }
-
- function S(a, b) {
- return String(a.lineNumberFormatter(b + a.firstLineNumber))
- }
-
- function T(a) {
- return a.scroller.getBoundingClientRect()
- .left - a.sizer.getBoundingClientRect()
- .left
- }
-
- function U(a, b, c) {
- var d = a.display;
- this.viewport = b, this.visible = P(d, a.doc, b), this.editorIsHidden = !d.wrapper.offsetWidth, this.wrapperHeight = d.wrapper.clientHeight, this.wrapperWidth = d.wrapper.clientWidth, this.oldDisplayWidth = qb(a), this.force = c, this.dims = aa(a), this.events = []
- }
-
- function V(a) {
- var b = a.display;
- !b.scrollbarsClipped && b.scroller.offsetWidth && (b.nativeBarWidth = b.scroller.offsetWidth - b.scroller.clientWidth, b.heightForcer.style.height = pb(a) + "px", b.sizer.style.marginBottom = -b.nativeBarWidth + "px", b.sizer.style.borderRightWidth = pb(a) + "px", b.scrollbarsClipped = !0)
- }
-
- function W(a, b) {
- var c = a.display,
- d = a.doc;
- if (b.editorIsHidden) return kc(a), !1;
- if (!b.force && b.visible.from >= c.viewFrom && b.visible.to <= c.viewTo && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo) && c.renderedView == c.view && 0 == oc(a)) return !1;
- R(a) && (kc(a), b.dims = aa(a));
- var e = d.first + d.size,
- f = Math.max(b.visible.from - a.options.viewportMargin, d.first),
- g = Math.min(e, b.visible.to + a.options.viewportMargin);
- c.viewFrom < f && f - c.viewFrom < 20 && (f = Math.max(d.first, c.viewFrom)), c.viewTo > g && c.viewTo - g < 20 && (g = Math.min(e, c.viewTo)), u && (f = ue(a.doc, f), g = ve(a.doc, g));
- var h = f != c.viewFrom || g != c.viewTo || c.lastWrapHeight != b.wrapperHeight || c.lastWrapWidth != b.wrapperWidth;
- nc(a, f, g), c.viewOffset = mf(ff(a.doc, c.viewFrom)), a.display.mover.style.top = c.viewOffset + "px";
- var i = oc(a);
- if (!h && 0 == i && !b.force && c.renderedView == c.view && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo)) return !1;
- var j = ug();
- return i > 4 && (c.lineDiv.style.display = "none"), ba(a, c.updateLineNumbers, b.dims), i > 4 && (c.lineDiv.style.display = ""), c.renderedView = c.view, j && ug() != j && j.offsetHeight && j.focus(), rg(c.cursorDiv), rg(c.selectionDiv), c.gutters.style.height = c.sizer.style.minHeight = 0, h && (c.lastWrapHeight = b.wrapperHeight, c.lastWrapWidth = b.wrapperWidth, ib(a, 400)), c.updateLineNumbers = null, !0
- }
-
- function X(a, b) {
- for (var c = b.viewport, d = !0;
- (d && a.options.lineWrapping && b.oldDisplayWidth != qb(a) || (c && null != c.top && (c = {
- top: Math.min(a.doc.height + nb(a.display) - rb(a), c.top)
- }), b.visible = P(a.display, a.doc, c), !(b.visible.from >= a.display.viewFrom && b.visible.to <= a.display.viewTo))) && W(a, b); d = !1) {
- $(a);
- var e = J(a);
- db(a), Z(a, e), N(a, e)
- }
- b.signal(a, "update", a), (a.display.viewFrom != a.display.reportedViewFrom || a.display.viewTo != a.display.reportedViewTo) && (b.signal(a, "viewportChange", a, a.display.viewFrom, a.display.viewTo), a.display.reportedViewFrom = a.display.viewFrom, a.display.reportedViewTo = a.display.viewTo)
- }
-
- function Y(a, b) {
- var c = new U(a, b);
- if (W(a, c)) {
- $(a), X(a, c);
- var d = J(a);
- db(a), Z(a, d), N(a, d), c.finish()
- }
- }
-
- function Z(a, b) {
- a.display.sizer.style.minHeight = b.docHeight + "px";
- var c = b.docHeight + a.display.barHeight;
- a.display.heightForcer.style.top = c + "px", a.display.gutters.style.height = Math.max(c + pb(a), b.clientHeight) + "px"
- }
-
- function $(a) {
- for (var b = a.display, c = b.lineDiv.offsetTop, f = 0; f < b.view.length; f++) {
- var h, g = b.view[f];
- if (!g.hidden) {
- if (d && 8 > e) {
- var i = g.node.offsetTop + g.node.offsetHeight;
- h = i - c, c = i
- } else {
- var j = g.node.getBoundingClientRect();
- h = j.bottom - j.top
- }
- var k = g.line.height - h;
- if (2 > h && (h = Rb(b)), (k > .001 || -.001 > k) && (jf(g.line, h), _(g.line), g.rest))
- for (var l = 0; l < g.rest.length; l++) _(g.rest[l])
- }
- }
- }
-
- function _(a) {
- if (a.widgets)
- for (var b = 0; b < a.widgets.length; ++b) a.widgets[b].height = a.widgets[b].node.offsetHeight
- }
-
- function aa(a) {
- for (var b = a.display, c = {}, d = {}, e = b.gutters.clientLeft, f = b.gutters.firstChild, g = 0; f; f = f.nextSibling, ++g) c[a.options.gutters[g]] = f.offsetLeft + f.clientLeft + e, d[a.options.gutters[g]] = f.clientWidth;
- return {
- fixedPos: T(b),
- gutterTotalWidth: b.gutters.offsetWidth,
- gutterLeft: c,
- gutterWidth: d,
- wrapperWidth: b.wrapper.clientWidth
- }
- }
-
- function ba(a, b, c) {
- function i(b) {
- var c = b.nextSibling;
- return f && o && a.display.currentWheelTarget == b ? b.style.display = "none" : b.parentNode.removeChild(b), c
- }
- for (var d = a.display, e = a.options.lineNumbers, g = d.lineDiv, h = g.firstChild, j = d.view, k = d.viewFrom, l = 0; l < j.length; l++) {
- var m = j[l];
- if (m.hidden);
- else if (m.node && m.node.parentNode == g) {
- for (; h != m.node;) h = i(h);
- var p = e && null != b && k >= b && m.lineNumber;
- m.changes && (dg(m.changes, "gutter") > -1 && (p = !1), ca(a, m, k, c)), p && (rg(m.lineNumber), m.lineNumber.appendChild(document.createTextNode(S(a.options, k)))), h = m.node.nextSibling
- } else {
- var n = ka(a, m, k, c);
- g.insertBefore(n, h)
- }
- k += m.size
- }
- for (; h;) h = i(h)
- }
-
- function ca(a, b, c, d) {
- for (var e = 0; e < b.changes.length; e++) {
- var f = b.changes[e];
- "text" == f ? ga(a, b) : "gutter" == f ? ia(a, b, c, d) : "class" == f ? ha(b) : "widget" == f && ja(a, b, d)
- }
- b.changes = null
- }
-
- function da(a) {
- return a.node == a.text && (a.node = pg("div", null, null, "position: relative"), a.text.parentNode && a.text.parentNode.replaceChild(a.node, a.text), a.node.appendChild(a.text), d && 8 > e && (a.node.style.zIndex = 2)), a.node
- }
-
- function ea(a) {
- var b = a.bgClass ? a.bgClass + " " + (a.line.bgClass || "") : a.line.bgClass;
- if (b && (b += " CodeMirror-linebackground"), a.background) b ? a.background.className = b : (a.background.parentNode.removeChild(a.background), a.background = null);
- else if (b) {
- var c = da(a);
- a.background = c.insertBefore(pg("div", null, b), c.firstChild)
- }
- }
-
- function fa(a, b) {
- var c = a.display.externalMeasured;
- return c && c.line == b.line ? (a.display.externalMeasured = null, b.measure = c.measure, c.built) : Qe(a, b)
- }
-
- function ga(a, b) {
- var c = b.text.className,
- d = fa(a, b);
- b.text == b.node && (b.node = d.pre), b.text.parentNode.replaceChild(d.pre, b.text), b.text = d.pre, d.bgClass != b.bgClass || d.textClass != b.textClass ? (b.bgClass = d.bgClass, b.textClass = d.textClass, ha(b)) : c && (b.text.className = c)
- }
-
- function ha(a) {
- ea(a), a.line.wrapClass ? da(a)
- .className = a.line.wrapClass : a.node != a.text && (a.node.className = "");
- var b = a.textClass ? a.textClass + " " + (a.line.textClass || "") : a.line.textClass;
- a.text.className = b || ""
- }
-
- function ia(a, b, c, d) {
- if (b.gutter && (b.node.removeChild(b.gutter), b.gutter = null), b.gutterBackground && (b.node.removeChild(b.gutterBackground), b.gutterBackground = null), b.line.gutterClass) {
- var e = da(b);
- b.gutterBackground = pg("div", null, "CodeMirror-gutter-background " + b.line.gutterClass, "left: " + (a.options.fixedGutter ? d.fixedPos : -d.gutterTotalWidth) + "px; width: " + d.gutterTotalWidth + "px"), e.insertBefore(b.gutterBackground, b.text)
- }
- var f = b.line.gutterMarkers;
- if (a.options.lineNumbers || f) {
- var e = da(b),
- g = b.gutter = pg("div", null, "CodeMirror-gutter-wrapper", "left: " + (a.options.fixedGutter ? d.fixedPos : -d.gutterTotalWidth) + "px");
- if (a.display.input.setUneditable(g), e.insertBefore(g, b.text), b.line.gutterClass && (g.className += " " + b.line.gutterClass), !a.options.lineNumbers || f && f["CodeMirror-linenumbers"] || (b.lineNumber = g.appendChild(pg("div", S(a.options, c), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + d.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + a.display.lineNumInnerWidth + "px"))), f)
- for (var h = 0; h < a.options.gutters.length; ++h) {
- var i = a.options.gutters[h],
- j = f.hasOwnProperty(i) && f[i];
- j && g.appendChild(pg("div", [j], "CodeMirror-gutter-elt", "left: " + d.gutterLeft[i] + "px; width: " + d.gutterWidth[i] + "px"))
- }
- }
- }
-
- function ja(a, b, c) {
- b.alignable && (b.alignable = null);
- for (var e, d = b.node.firstChild; d; d = e) {
- var e = d.nextSibling;
- "CodeMirror-linewidget" == d.className && b.node.removeChild(d)
- }
- la(a, b, c)
- }
-
- function ka(a, b, c, d) {
- var e = fa(a, b);
- return b.text = b.node = e.pre, e.bgClass && (b.bgClass = e.bgClass), e.textClass && (b.textClass = e.textClass), ha(b), ia(a, b, c, d), la(a, b, d), b.node
- }
-
- function la(a, b, c) {
- if (ma(a, b.line, b, c, !0), b.rest)
- for (var d = 0; d < b.rest.length; d++) ma(a, b.rest[d], b, c, !1)
- }
-
- function ma(a, b, c, d, e) {
- if (b.widgets)
- for (var f = da(c), g = 0, h = b.widgets; g < h.length; ++g) {
- var i = h[g],
- j = pg("div", [i.node], "CodeMirror-linewidget");
- i.handleMouseEvents || j.setAttribute("cm-ignore-events", "true"), na(i, j, c, d), a.display.input.setUneditable(j), e && i.above ? f.insertBefore(j, c.gutter || c.text) : f.appendChild(j), Nf(i, "redraw")
- }
- }
-
- function na(a, b, c, d) {
- if (a.noHScroll) {
- (c.alignable || (c.alignable = []))
- .push(b);
- var e = d.wrapperWidth;
- b.style.left = d.fixedPos + "px", a.coverGutter || (e -= d.gutterTotalWidth, b.style.paddingLeft = d.gutterTotalWidth + "px"), b.style.width = e + "px"
- }
- a.coverGutter && (b.style.zIndex = 5, b.style.position = "relative", a.noHScroll || (b.style.marginLeft = -d.gutterTotalWidth + "px"))
- }
-
- function qa(a) {
- return oa(a.line, a.ch)
- }
-
- function ra(a, b) {
- return pa(a, b) < 0 ? b : a
- }
-
- function sa(a, b) {
- return pa(a, b) < 0 ? a : b
- }
-
- function ta(a) {
- a.state.focused || (a.display.input.focus(), Zc(a))
- }
-
- function ua(a) {
- return a.options.readOnly || a.doc.cantEdit
- }
-
- function wa(a, b, c, d, e) {
- var f = a.doc;
- a.display.shift = !1, d || (d = f.sel);
- var g = a.state.pasteIncoming || "paste" == e,
- h = f.splitLines(b),
- i = null;
- if (g && d.ranges.length > 1)
- if (va && va.join("\n") == b) {
- if (d.ranges.length % va.length == 0) {
- i = [];
- for (var j = 0; j < va.length; j++) i.push(f.splitLines(va[j]))
- }
- } else h.length == d.ranges.length && (i = eg(h, function (a) {
- return [a]
- }));
- for (var j = d.ranges.length - 1; j >= 0; j--) {
- var k = d.ranges[j],
- l = k.from(),
- m = k.to();
- k.empty() && (c && c > 0 ? l = oa(l.line, l.ch - c) : a.state.overwrite && !g && (m = oa(m.line, Math.min(ff(f, m.line)
- .text.length, m.ch + bg(h)
- .length))));
- var n = a.curOp.updateInput,
- o = {
- from: l,
- to: m,
- text: i ? i[j % i.length] : h,
- origin: e || (g ? "paste" : a.state.cutIncoming ? "cut" : "+input")
- };
- hd(a.doc, o), Nf(a, "inputRead", a, o)
- }
- b && !g && ya(a, b), td(a), a.curOp.updateInput = n, a.curOp.typing = !0, a.state.pasteIncoming = a.state.cutIncoming = !1
- }
-
- function xa(a, b) {
- var c = a.clipboardData && a.clipboardData.getData("text/plain");
- return c ? (a.preventDefault(), ua(b) || b.options.disableInput || cc(b, function () {
- wa(b, c, 0, null, "paste")
- }), !0) : void 0
- }
-
- function ya(a, b) {
- if (a.options.electricChars && a.options.smartIndent)
- for (var c = a.doc.sel, d = c.ranges.length - 1; d >= 0; d--) {
- var e = c.ranges[d];
- if (!(e.head.ch > 100 || d && c.ranges[d - 1].head.line == e.head.line)) {
- var f = a.getModeAt(e.head),
- g = !1;
- if (f.electricChars) {
- for (var h = 0; h < f.electricChars.length; h++)
- if (b.indexOf(f.electricChars.charAt(h)) > -1) {
- g = vd(a, e.head.line, "smart");
- break
- }
- } else f.electricInput && f.electricInput.test(ff(a.doc, e.head.line)
- .text.slice(0, e.head.ch)) && (g = vd(a, e.head.line, "smart"));
- g && Nf(a, "electricInput", a, e.head.line)
- }
- }
- }
-
- function za(a) {
- for (var b = [], c = [], d = 0; d < a.doc.sel.ranges.length; d++) {
- var e = a.doc.sel.ranges[d].head.line,
- f = {
- anchor: oa(e, 0),
- head: oa(e + 1, 0)
- };
- c.push(f), b.push(a.getRange(f.anchor, f.head))
- }
- return {
- text: b,
- ranges: c
- }
- }
-
- function Aa(a) {
- a.setAttribute("autocorrect", "off"), a.setAttribute("autocapitalize", "off"), a.setAttribute("spellcheck", "false")
- }
-
- function Ba(a) {
- this.cm = a, this.prevInput = "", this.pollingFast = !1, this.polling = new Yf, this.inaccurateSelection = !1, this.hasSelection = !1, this.composing = null
- }
-
- function Ca() {
- var a = pg("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none"),
- b = pg("div", [a], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
- return f ? a.style.width = "1000px" : a.setAttribute("wrap", "off"), m && (a.style.border = "1px solid black"), Aa(a), b
- }
-
- function Da(a) {
- this.cm = a, this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null, this.polling = new Yf, this.gracePeriod = !1
- }
-
- function Ea(a, b) {
- var c = wb(a, b.line);
- if (!c || c.hidden) return null;
- var d = ff(a.doc, b.line),
- e = tb(c, d, b.line),
- f = nf(d),
- g = "left";
- if (f) {
- var h = Yg(f, b.ch);
- g = h % 2 ? "right" : "left"
- }
- var i = Ab(e.map, b.ch, g);
- return i.offset = "right" == i.collapse ? i.end : i.start, i
- }
-
- function Fa(a, b) {
- return b && (a.bad = !0), a
- }
-
- function Ga(a, b, c) {
- var d;
- if (b == a.display.lineDiv) {
- if (d = a.display.lineDiv.childNodes[c], !d) return Fa(a.clipPos(oa(a.display.viewTo - 1)), !0);
- b = null, c = 0
- } else
- for (d = b;; d = d.parentNode) {
- if (!d || d == a.display.lineDiv) return null;
- if (d.parentNode && d.parentNode == a.display.lineDiv) break
- }
- for (var e = 0; e < a.display.view.length; e++) {
- var f = a.display.view[e];
- if (f.node == d) return Ha(f, b, c)
- }
- }
-
- function Ha(a, b, c) {
- function k(b, c, d) {
- for (var e = -1; e < (j ? j.length : 0); e++)
- for (var f = 0 > e ? i.map : j[e], g = 0; g < f.length; g += 3) {
- var h = f[g + 2];
- if (h == b || h == c) {
- var k = kf(0 > e ? a.line : a.rest[e]),
- l = f[g] + d;
- return (0 > d || h != b) && (l = f[g + (d ? 1 : 0)]), oa(k, l)
- }
- }
- }
- var d = a.text.firstChild,
- e = !1;
- if (!b || !tg(d, b)) return Fa(oa(kf(a.line), 0), !0);
- if (b == d && (e = !0, b = d.childNodes[c], c = 0, !b)) {
- var f = a.rest ? bg(a.rest) : a.line;
- return Fa(oa(kf(f), f.text.length), e)
- }
- var g = 3 == b.nodeType ? b : null,
- h = b;
- for (g || 1 != b.childNodes.length || 3 != b.firstChild.nodeType || (g = b.firstChild, c && (c = g.nodeValue.length)); h.parentNode != d;) h = h.parentNode;
- var i = a.measure,
- j = i.maps,
- l = k(g, h, c);
- if (l) return Fa(l, e);
- for (var m = h.nextSibling, n = g ? g.nodeValue.length - c : 0; m; m = m.nextSibling) {
- if (l = k(m, m.firstChild, 0)) return Fa(oa(l.line, l.ch - n), e);
- n += m.textContent.length
- }
- for (var o = h.previousSibling, n = c; o; o = o.previousSibling) {
- if (l = k(o, o.firstChild, -1)) return Fa(oa(l.line, l.ch + n), e);
- n += m.textContent.length
- }
- }
-
- function Ia(a, b, c, d, e) {
- function i(a) {
- return function (b) {
- return b.id == a
- }
- }
-
- function j(b) {
- if (1 == b.nodeType) {
- var c = b.getAttribute("cm-text");
- if (null != c) return "" == c && (c = b.textContent.replace(/\u200b/g, "")), void(f += c);
- var l, k = b.getAttribute("cm-marker");
- if (k) {
- var m = a.findMarks(oa(d, 0), oa(e + 1, 0), i(+k));
- return void(m.length && (l = m[0].find()) && (f += gf(a.doc, l.from, l.to)
- .join(h)))
- }
- if ("false" == b.getAttribute("contenteditable")) return;
- for (var n = 0; n < b.childNodes.length; n++) j(b.childNodes[n]);
- /^(pre|div|p)$/i.test(b.nodeName) && (g = !0)
- } else if (3 == b.nodeType) {
- var o = b.nodeValue;
- if (!o) return;
- g && (f += h, g = !1), f += o
- }
- }
- for (var f = "", g = !1, h = a.doc.lineSeparator(); j(b), b != c;) b = b.nextSibling;
- return f
- }
-
- function Ja(a, b) {
- this.ranges = a, this.primIndex = b
- }
-
- function Ka(a, b) {
- this.anchor = a, this.head = b
- }
-
- function La(a, b) {
- var c = a[b];
- a.sort(function (a, b) {
- return pa(a.from(), b.from())
- }), b = dg(a, c);
- for (var d = 1; d < a.length; d++) {
- var e = a[d],
- f = a[d - 1];
- if (pa(f.to(), e.from()) >= 0) {
- var g = sa(f.from(), e.from()),
- h = ra(f.to(), e.to()),
- i = f.empty() ? e.from() == e.head : f.from() == f.head;
- b >= d && --b, a.splice(--d, 2, new Ka(i ? h : g, i ? g : h))
- }
- }
- return new Ja(a, b)
- }
-
- function Ma(a, b) {
- return new Ja([new Ka(a, b || a)], 0)
- }
-
- function Na(a, b) {
- return Math.max(a.first, Math.min(b, a.first + a.size - 1))
- }
-
- function Oa(a, b) {
- if (b.line < a.first) return oa(a.first, 0);
- var c = a.first + a.size - 1;
- return b.line > c ? oa(c, ff(a, c)
- .text.length) : Pa(b, ff(a, b.line)
- .text.length)
- }
-
- function Pa(a, b) {
- var c = a.ch;
- return null == c || c > b ? oa(a.line, b) : 0 > c ? oa(a.line, 0) : a
- }
-
- function Qa(a, b) {
- return b >= a.first && b < a.first + a.size
- }
-
- function Ra(a, b) {
- for (var c = [], d = 0; d < b.length; d++) c[d] = Oa(a, b[d]);
- return c
- }
-
- function Sa(a, b, c, d) {
- if (a.cm && a.cm.display.shift || a.extend) {
- var e = b.anchor;
- if (d) {
- var f = pa(c, e) < 0;
- f != pa(d, e) < 0 ? (e = c, c = d) : f != pa(c, d) < 0 && (c = d)
- }
- return new Ka(e, c)
- }
- return new Ka(d || c, c)
- }
-
- function Ta(a, b, c, d) {
- Za(a, new Ja([Sa(a, a.sel.primary(), b, c)], 0), d)
- }
-
- function Ua(a, b, c) {
- for (var d = [], e = 0; e < a.sel.ranges.length; e++) d[e] = Sa(a, a.sel.ranges[e], b[e], null);
- var f = La(d, a.sel.primIndex);
- Za(a, f, c)
- }
-
- function Va(a, b, c, d) {
- var e = a.sel.ranges.slice(0);
- e[b] = c, Za(a, La(e, a.sel.primIndex), d)
- }
-
- function Wa(a, b, c, d) {
- Za(a, Ma(b, c), d)
- }
-
- function Xa(a, b) {
- var c = {
- ranges: b.ranges,
- update: function (b) {
- this.ranges = [];
- for (var c = 0; c < b.length; c++) this.ranges[c] = new Ka(Oa(a, b[c].anchor), Oa(a, b[c].head))
- }
- };
- return Lf(a, "beforeSelectionChange", a, c), a.cm && Lf(a.cm, "beforeSelectionChange", a.cm, c), c.ranges != b.ranges ? La(c.ranges, c.ranges.length - 1) : b
- }
-
- function Ya(a, b, c) {
- var d = a.history.done,
- e = bg(d);
- e && e.ranges ? (d[d.length - 1] = b, $a(a, b, c)) : Za(a, b, c)
- }
-
- function Za(a, b, c) {
- $a(a, b, c), uf(a, a.sel, a.cm ? a.cm.curOp.id : NaN, c)
- }
-
- function $a(a, b, c) {
- (Rf(a, "beforeSelectionChange") || a.cm && Rf(a.cm, "beforeSelectionChange")) && (b = Xa(a, b));
- var d = c && c.bias || (pa(b.primary()
- .head, a.sel.primary()
- .head) < 0 ? -1 : 1);
- _a(a, bb(a, b, d, !0)), c && c.scroll === !1 || !a.cm || td(a.cm)
- }
-
- function _a(a, b) {
- b.equals(a.sel) || (a.sel = b, a.cm && (a.cm.curOp.updateInput = a.cm.curOp.selectionChanged = !0, Qf(a.cm)), Nf(a, "cursorActivity", a))
- }
-
- function ab(a) {
- _a(a, bb(a, a.sel, null, !1), Vf)
- }
-
- function bb(a, b, c, d) {
- for (var e, f = 0; f < b.ranges.length; f++) {
- var g = b.ranges[f],
- h = cb(a, g.anchor, c, d),
- i = cb(a, g.head, c, d);
- (e || h != g.anchor || i != g.head) && (e || (e = b.ranges.slice(0, f)), e[f] = new Ka(h, i))
- }
- return e ? La(e, b.primIndex) : b
- }
-
- function cb(a, b, c, d) {
- var e = !1,
- f = b,
- g = c || 1;
- a.cantEdit = !1;
- a: for (;;) {
- var h = ff(a, f.line);
- if (h.markedSpans)
- for (var i = 0; i < h.markedSpans.length; ++i) {
- var j = h.markedSpans[i],
- k = j.marker;
- if ((null == j.from || (k.inclusiveLeft ? j.from <= f.ch : j.from < f.ch)) && (null == j.to || (k.inclusiveRight ? j.to >= f.ch : j.to > f.ch))) {
- if (d && (Lf(k, "beforeCursorEnter"), k.explicitlyCleared)) {
- if (h.markedSpans) {
- --i;
- continue
- }
- break
- }
- if (!k.atomic) continue;
- var l = k.find(0 > g ? -1 : 1);
- if (0 == pa(l, f) && (l.ch += g, l.ch < 0 ? l = l.line > a.first ? Oa(a, oa(l.line - 1)) : null : l.ch > h.text.length && (l = l.line < a.first + a.size - 1 ? oa(l.line + 1, 0) : null), !l)) {
- if (e) return d ? (a.cantEdit = !0, oa(a.first, 0)) : cb(a, b, c, !0);
- e = !0, l = b, g = -g
- }
- f = l;
- continue a
- }
- }
- return f
- }
- }
-
- function db(a) {
- a.display.input.showSelection(a.display.input.prepareSelection())
- }
-
- function eb(a, b) {
- for (var c = a.doc, d = {}, e = d.cursors = document.createDocumentFragment(), f = d.selection = document.createDocumentFragment(), g = 0; g < c.sel.ranges.length; g++)
- if (b !== !1 || g != c.sel.primIndex) {
- var h = c.sel.ranges[g],
- i = h.empty();
- (i || a.options.showCursorWhenSelecting) && fb(a, h.head, e), i || gb(a, h, f)
- }
- return d
- }
-
- function fb(a, b, c) {
- var d = Lb(a, b, "div", null, null, !a.options.singleCursorHeightPerLine),
- e = c.appendChild(pg("div", "\xa0", "CodeMirror-cursor"));
- if (e.style.left = d.left + "px", e.style.top = d.top + "px", e.style.height = Math.max(0, d.bottom - d.top) * a.options.cursorHeight + "px", d.other) {
- var f = c.appendChild(pg("div", "\xa0", "CodeMirror-cursor CodeMirror-secondarycursor"));
- f.style.display = "", f.style.left = d.other.left + "px", f.style.top = d.other.top + "px", f.style.height = .85 * (d.other.bottom - d.other.top) + "px"
- }
- }
-
- function gb(a, b, c) {
- function j(a, b, c, d) {
- 0 > b && (b = 0), b = Math.round(b), d = Math.round(d), f.appendChild(pg("div", null, "CodeMirror-selected", "position: absolute; left: " + a + "px; top: " + b + "px; width: " + (null == c ? i - a : c) + "px; height: " + (d - b) + "px"))
- }
-
- function k(b, c, d) {
- function m(c, d) {
- return Kb(a, oa(b, c), "div", f, d)
- }
- var k, l, f = ff(e, b),
- g = f.text.length;
- return Og(nf(f), c || 0, null == d ? g : d, function (a, b, e) {
- var n, o, p, f = m(a, "left");
- if (a == b) n = f, o = p = f.left;
- else {
- if (n = m(b - 1, "right"), "rtl" == e) {
- var q = f;
- f = n, n = q
- }
- o = f.left, p = n.right
- }
- null == c && 0 == a && (o = h), n.top - f.top > 3 && (j(o, f.top, null, f.bottom), o = h, f.bottom < n.top && j(o, f.bottom, null, n.top)), null == d && b == g && (p = i), (!k || f.top < k.top || f.top == k.top && f.left < k.left) && (k = f), (!l || n.bottom > l.bottom || n.bottom == l.bottom && n.right > l.right) && (l = n), h + 1 > o && (o = h), j(o, n.top, p - o, n.bottom)
- }), {
- start: k,
- end: l
- }
- }
- var d = a.display,
- e = a.doc,
- f = document.createDocumentFragment(),
- g = ob(a.display),
- h = g.left,
- i = Math.max(d.sizerWidth, qb(a) - d.sizer.offsetLeft) - g.right,
- l = b.from(),
- m = b.to();
- if (l.line == m.line) k(l.line, l.ch, m.ch);
- else {
- var n = ff(e, l.line),
- o = ff(e, m.line),
- p = se(n) == se(o),
- q = k(l.line, l.ch, p ? n.text.length + 1 : null)
- .end,
- r = k(m.line, p ? 0 : null, m.ch)
- .start;
- p && (q.top < r.top - 2 ? (j(q.right, q.top, null, q.bottom), j(h, r.top, r.left, r.bottom)) : j(q.right, q.top, r.left - q.right, q.bottom)), q.bottom < r.top && j(h, q.bottom, null, r.top)
- }
- c.appendChild(f)
- }
-
- function hb(a) {
- if (a.state.focused) {
- var b = a.display;
- clearInterval(b.blinker);
- var c = !0;
- b.cursorDiv.style.visibility = "", a.options.cursorBlinkRate > 0 ? b.blinker = setInterval(function () {
- b.cursorDiv.style.visibility = (c = !c) ? "" : "hidden"
- }, a.options.cursorBlinkRate) : a.options.cursorBlinkRate < 0 && (b.cursorDiv.style.visibility = "hidden")
- }
- }
-
- function ib(a, b) {
- a.doc.mode.startState && a.doc.frontier < a.display.viewTo && a.state.highlight.set(b, ig(jb, a))
- }
-
- function jb(a) {
- var b = a.doc;
- if (b.frontier < b.first && (b.frontier = b.first), !(b.frontier >= a.display.viewTo)) {
- var c = +new Date + a.options.workTime,
- d = Jd(b.mode, lb(a, b.frontier)),
- e = [];
- b.iter(b.frontier, Math.min(b.first + b.size, a.display.viewTo + 500), function (f) {
- if (b.frontier >= a.display.viewFrom) {
- var g = f.styles,
- h = f.text.length > a.options.maxHighlightLength,
- i = Ke(a, f, h ? Jd(b.mode, d) : d, !0);
- f.styles = i.styles;
- var j = f.styleClasses,
- k = i.classes;
- k ? f.styleClasses = k : j && (f.styleClasses = null);
- for (var l = !g || g.length != f.styles.length || j != k && (!j || !k || j.bgClass != k.bgClass || j.textClass != k.textClass), m = 0; !l && m < g.length; ++m) l = g[m] != f.styles[m];
- l && e.push(b.frontier), f.stateAfter = h ? d : Jd(b.mode, d)
- } else f.text.length <= a.options.maxHighlightLength && Me(a, f.text, d), f.stateAfter = b.frontier % 5 == 0 ? Jd(b.mode, d) : null;
- return ++b.frontier, +new Date > c ? (ib(a, a.options.workDelay), !0) : void 0
- }), e.length && cc(a, function () {
- for (var b = 0; b < e.length; b++) jc(a, e[b], "text")
- })
- }
- }
-
- function kb(a, b, c) {
- for (var d, e, f = a.doc, g = c ? -1 : b - (a.doc.mode.innerMode ? 1e3 : 100), h = b; h > g; --h) {
- if (h <= f.first) return f.first;
- var i = ff(f, h - 1);
- if (i.stateAfter && (!c || h <= f.frontier)) return h;
- var j = Zf(i.text, null, a.options.tabSize);
- (null == e || d > j) && (e = h - 1, d = j)
- }
- return e
- }
-
- function lb(a, b, c) {
- var d = a.doc,
- e = a.display;
- if (!d.mode.startState) return !0;
- var f = kb(a, b, c),
- g = f > d.first && ff(d, f - 1)
- .stateAfter;
- return g = g ? Jd(d.mode, g) : Kd(d.mode), d.iter(f, b, function (c) {
- Me(a, c.text, g);
- var h = f == b - 1 || f % 5 == 0 || f >= e.viewFrom && f < e.viewTo;
- c.stateAfter = h ? Jd(d.mode, g) : null, ++f
- }), c && (d.frontier = f), g
- }
-
- function mb(a) {
- return a.lineSpace.offsetTop
- }
-
- function nb(a) {
- return a.mover.offsetHeight - a.lineSpace.offsetHeight
- }
-
- function ob(a) {
- if (a.cachedPaddingH) return a.cachedPaddingH;
- var b = sg(a.measure, pg("pre", "x")),
- c = window.getComputedStyle ? window.getComputedStyle(b, null) : b.currentStyle, // why the null: http://bugs.jquery.com/ticket/8635
- d = {
- left: parseInt(c.paddingLeft),
- right: parseInt(c.paddingRight)
- };
- return isNaN(d.left) || isNaN(d.right) || (a.cachedPaddingH = d), d
- }
-
- function pb(a) {
- return Tf - a.display.nativeBarWidth
- }
-
- function qb(a) {
- return a.display.scroller.clientWidth - pb(a) - a.display.barWidth
- }
-
- function rb(a) {
- return a.display.scroller.clientHeight - pb(a) - a.display.barHeight
- }
-
- function sb(a, b, c) {
- var d = a.options.lineWrapping,
- e = d && qb(a);
- if (!b.measure.heights || d && b.measure.width != e) {
- var f = b.measure.heights = [];
- if (d) {
- b.measure.width = e;
- for (var g = b.text.firstChild.getClientRects(), h = 0; h < g.length - 1; h++) {
- var i = g[h],
- j = g[h + 1];
- Math.abs(i.bottom - j.bottom) > 2 && f.push((i.bottom + j.top) / 2 - c.top)
- }
- }
- f.push(c.bottom - c.top)
- }
- }
-
- function tb(a, b, c) {
- if (a.line == b) return {
- map: a.measure.map,
- cache: a.measure.cache
- };
- for (var d = 0; d < a.rest.length; d++)
- if (a.rest[d] == b) return {
- map: a.measure.maps[d],
- cache: a.measure.caches[d]
- };
- for (var d = 0; d < a.rest.length; d++)
- if (kf(a.rest[d]) > c) return {
- map: a.measure.maps[d],
- cache: a.measure.caches[d],
- before: !0
- }
- }
-
- function ub(a, b) {
- b = se(b);
- var c = kf(b),
- d = a.display.externalMeasured = new gc(a.doc, b, c);
- d.lineN = c;
- var e = d.built = Qe(a, d);
- return d.text = e.pre, sg(a.display.lineMeasure, e.pre), d
- }
-
- function vb(a, b, c, d) {
- return yb(a, xb(a, b), c, d)
- }
-
- function wb(a, b) {
- if (b >= a.display.viewFrom && b < a.display.viewTo) return a.display.view[lc(a, b)];
- var c = a.display.externalMeasured;
- return c && b >= c.lineN && b < c.lineN + c.size ? c : void 0
- }
-
- function xb(a, b) {
- var c = kf(b),
- d = wb(a, c);
- d && !d.text ? d = null : d && d.changes && (ca(a, d, c, aa(a)), a.curOp.forceUpdate = !0), d || (d = ub(a, b));
- var e = tb(d, b, c);
- return {
- line: b,
- view: d,
- rect: null,
- map: e.map,
- cache: e.cache,
- before: e.before,
- hasHeights: !1
- }
- }
-
- function yb(a, b, c, d, e) {
- b.before && (c = -1);
- var g, f = c + (d || "");
- return b.cache.hasOwnProperty(f) ? g = b.cache[f] : (b.rect || (b.rect = b.view.text.getBoundingClientRect()), b.hasHeights || (sb(a, b.view, b.rect), b.hasHeights = !0), g = Bb(a, b, c, d), g.bogus || (b.cache[f] = g)), {
- left: g.left,
- right: g.right,
- top: e ? g.rtop : g.top,
- bottom: e ? g.rbottom : g.bottom
- }
- }
-
- function Ab(a, b, c) {
- for (var d, e, f, g, h = 0; h < a.length; h += 3) {
- var i = a[h],
- j = a[h + 1];
- if (i > b ? (e = 0, f = 1, g = "left") : j > b ? (e = b - i, f = e + 1) : (h == a.length - 3 || b == j && a[h + 3] > b) && (f = j - i, e = f - 1, b >= j && (g = "right")), null != e) {
- if (d = a[h + 2], i == j && c == (d.insertLeft ? "left" : "right") && (g = c), "left" == c && 0 == e)
- for (; h && a[h - 2] == a[h - 3] && a[h - 1].insertLeft;) d = a[(h -= 3) + 2], g = "left";
- if ("right" == c && e == j - i)
- for (; h < a.length - 3 && a[h + 3] == a[h + 4] && !a[h + 5].insertLeft;) d = a[(h += 3) + 2], g = "right";
- break
- }
- }
- return {
- node: d,
- start: e,
- end: f,
- collapse: g,
- coverStart: i,
- coverEnd: j
- }
- }
-
- function Bb(a, b, c, f) {
- var l, g = Ab(b.map, c, f),
- h = g.node,
- i = g.start,
- j = g.end,
- k = g.collapse;
- if (3 == h.nodeType) {
- for (var m = 0; 4 > m; m++) {
- for (; i && og(b.line.text.charAt(g.coverStart + i));) --i;
- for (; g.coverStart + j < g.coverEnd && og(b.line.text.charAt(g.coverStart + j));) ++j;
- if (d && 9 > e && 0 == i && j == g.coverEnd - g.coverStart) l = h.parentNode.getBoundingClientRect();
- else if (d && a.options.lineWrapping) {
- var n = qg(h, i, j).getClientRects();
- l = n.length ? n["right" == f ? n.length - 1 : 0] : zb
- } else if (oldff) { // customization here
- var w = jQuery(".CodeMirror-line SPAN", b.view.node).get(0);
- if (w) {
- l = w.getClientRects()[0];
- } else {
- l = zb;
- }
- } else {
- l = qg(h, i, j).getBoundingClientRect() || zb;
- }
- if (l.left || l.right || 0 == i) break;
- j = i, i -= 1, k = "right"
- }
- d && 11 > e && (l = Cb(a.display.measure, l))
- } else {
- i > 0 && (k = f = "right");
- var n;
- l = a.options.lineWrapping && (n = h.getClientRects())
- .length > 1 ? n["right" == f ? n.length - 1 : 0] : h.getBoundingClientRect()
- }
- if (d && 9 > e && !i && (!l || !l.left && !l.right)) {
- var o = h.parentNode.getClientRects()[0];
- l = o ? {
- left: o.left,
- right: o.left + Sb(a.display),
- top: o.top,
- bottom: o.bottom
- } : zb
- }
- for (var p = l.top - b.rect.top, q = l.bottom - b.rect.top, r = (p + q) / 2, s = b.view.measure.heights, m = 0; m < s.length - 1 && !(r < s[m]); m++);
- var t = m ? s[m - 1] : 0,
- u = s[m],
- v = {
- left: ("right" == k ? l.right : l.left) - b.rect.left,
- right: ("left" == k ? l.left : l.right) - b.rect.left,
- top: t,
- bottom: u
- };
- return l.left || l.right || (v.bogus = !0), a.options.singleCursorHeightPerLine || (v.rtop = p, v.rbottom = q), v
- }
-
- function Cb(a, b) {
- if (!window.screen || null == screen.logicalXDPI || screen.logicalXDPI == screen.deviceXDPI || !Mg(a)) return b;
- var c = screen.logicalXDPI / screen.deviceXDPI,
- d = screen.logicalYDPI / screen.deviceYDPI;
- return {
- left: b.left * c,
- right: b.right * c,
- top: b.top * d,
- bottom: b.bottom * d
- }
- }
-
- function Db(a) {
- if (a.measure && (a.measure.cache = {}, a.measure.heights = null, a.rest))
- for (var b = 0; b < a.rest.length; b++) a.measure.caches[b] = {}
- }
-
- function Eb(a) {
- a.display.externalMeasure = null, rg(a.display.lineMeasure);
- for (var b = 0; b < a.display.view.length; b++) Db(a.display.view[b])
- }
-
- function Fb(a) {
- Eb(a), a.display.cachedCharWidth = a.display.cachedTextHeight = a.display.cachedPaddingH = null, a.options.lineWrapping || (a.display.maxLineChanged = !0), a.display.lineNumChars = null
- }
-
- function Gb() {
- return window.pageXOffset || (document.documentElement || document.body)
- .scrollLeft
- }
-
- function Hb() {
- return window.pageYOffset || (document.documentElement || document.body)
- .scrollTop
- }
-
- function Ib(a, b, c, d) {
- if (b.widgets)
- for (var e = 0; e < b.widgets.length; ++e)
- if (b.widgets[e].above) {
- var f = Ae(b.widgets[e]);
- c.top += f, c.bottom += f
- }
- if ("line" == d) return c;
- d || (d = "local");
- var g = mf(b);
- if ("local" == d ? g += mb(a.display) : g -= a.display.viewOffset, "page" == d || "window" == d) {
- var h = a.display.lineSpace.getBoundingClientRect();
- g += h.top + ("window" == d ? 0 : Hb());
- var i = h.left + ("window" == d ? 0 : Gb());
- c.left += i, c.right += i
- }
- return c.top += g, c.bottom += g, c
- }
-
- function Jb(a, b, c) {
- if ("div" == c) return b;
- var d = b.left,
- e = b.top;
- if ("page" == c) d -= Gb(), e -= Hb();
- else if ("local" == c || !c) {
- var f = a.display.sizer.getBoundingClientRect();
- d += f.left, e += f.top
- }
- var g = a.display.lineSpace.getBoundingClientRect();
- return {
- left: d - g.left,
- top: e - g.top
- }
- }
-
- function Kb(a, b, c, d, e) {
- return d || (d = ff(a.doc, b.line)), Ib(a, d, vb(a, d, b.ch, e), c)
- }
-
- function Lb(a, b, c, d, e, f) {
- function g(b, g) {
- var h = yb(a, e, b, g ? "right" : "left", f);
- return g ? h.left = h.right : h.right = h.left, Ib(a, d, h, c)
- }
-
- function h(a, b) {
- var c = i[b],
- d = c.level % 2;
- return a == Pg(c) && b && c.level < i[b - 1].level ? (c = i[--b], a = Qg(c) - (c.level % 2 ? 0 : 1), d = !0) : a == Qg(c) && b < i.length - 1 && c.level < i[b + 1].level && (c = i[++b], a = Pg(c) - c.level % 2, d = !1), d && a == c.to && a > c.from ? g(a - 1) : g(a, d)
- }
- d = d || ff(a.doc, b.line), e || (e = xb(a, d));
- var i = nf(d),
- j = b.ch;
- if (!i) return g(j);
- var k = Yg(i, j),
- l = h(j, k);
- return null != Xg && (l.other = h(j, Xg)), l
- }
-
- function Mb(a, b) {
- var c = 0,
- b = Oa(a.doc, b);
- a.options.lineWrapping || (c = Sb(a.display) * b.ch);
- var d = ff(a.doc, b.line),
- e = mf(d) + mb(a.display);
- return {
- left: c,
- right: c,
- top: e,
- bottom: e + d.height
- }
- }
-
- function Nb(a, b, c, d) {
- var e = oa(a, b);
- return e.xRel = d, c && (e.outside = !0), e
- }
-
- function Ob(a, b, c) {
- var d = a.doc;
- if (c += a.display.viewOffset, 0 > c) return Nb(d.first, 0, !0, -1);
- var e = lf(d, c),
- f = d.first + d.size - 1;
- if (e > f) return Nb(d.first + d.size - 1, ff(d, f)
- .text.length, !0, 1);
- 0 > b && (b = 0);
- for (var g = ff(d, e);;) {
- var h = Pb(a, g, e, b, c),
- i = qe(g),
- j = i && i.find(0, !0);
- if (!i || !(h.ch > j.from.ch || h.ch == j.from.ch && h.xRel > 0)) return h;
- e = kf(g = j.to.line)
- }
- }
-
- function Pb(a, b, c, d, e) {
- function j(d) {
- var e = Lb(a, oa(c, d), "line", b, i);
- return g = !0, f > e.bottom ? e.left - h : f < e.top ? e.left + h : (g = !1, e.left)
- }
- var f = e - mf(b),
- g = !1,
- h = 2 * a.display.wrapper.clientWidth,
- i = xb(a, b),
- k = nf(b),
- l = b.text.length,
- m = Rg(b),
- n = Sg(b),
- o = j(m),
- p = g,
- q = j(n),
- r = g;
- if (d > q) return Nb(c, n, r, 1);
- for (;;) {
- if (k ? n == m || n == $g(b, m, 1) : 1 >= n - m) {
- for (var s = o > d || q - d >= d - o ? m : n, t = d - (s == m ? o : q); og(b.text.charAt(s));) ++s;
- var u = Nb(c, s, s == m ? p : r, -1 > t ? -1 : t > 1 ? 1 : 0);
- return u
- }
- var v = Math.ceil(l / 2),
- w = m + v;
- if (k) {
- w = m;
- for (var x = 0; v > x; ++x) w = $g(b, w, 1)
- }
- var y = j(w);
- y > d ? (n = w, q = y, (r = g) && (q += 1e3), l = v) : (m = w, o = y, p = g, l -= v)
- }
- }
-
- function Rb(a) {
- if (null != a.cachedTextHeight) return a.cachedTextHeight;
- if (null == Qb) {
- Qb = pg("pre");
- for (var b = 0; 49 > b; ++b) Qb.appendChild(document.createTextNode("x")), Qb.appendChild(pg("br"));
- Qb.appendChild(document.createTextNode("x"))
- }
- sg(a.measure, Qb);
- var c = Qb.offsetHeight / 50;
- return c > 3 && (a.cachedTextHeight = c), rg(a.measure), c || 1
- }
-
- function Sb(a) {
- if (null != a.cachedCharWidth) return a.cachedCharWidth;
- var b = pg("span", "xxxxxxxxxx"),
- c = pg("pre", [b]);
- sg(a.measure, c);
- var d = b.getBoundingClientRect(),
- e = (d.right - d.left) / 10;
- return e > 2 && (a.cachedCharWidth = e), e || 10
- }
-
- function Vb(a) {
- a.curOp = {
- cm: a,
- viewChanged: !1,
- startHeight: a.doc.height,
- forceUpdate: !1,
- updateInput: null,
- typing: !1,
- changeObjs: null,
- cursorActivityHandlers: null,
- cursorActivityCalled: 0,
- selectionChanged: !1,
- updateMaxLine: !1,
- scrollLeft: null,
- scrollTop: null,
- scrollToPos: null,
- focus: !1,
- id: ++Ub
- }, Tb ? Tb.ops.push(a.curOp) : a.curOp.ownsGroup = Tb = {
- ops: [a.curOp],
- delayedCallbacks: []
- }
- }
-
- function Wb(a) {
- var b = a.delayedCallbacks,
- c = 0;
- do {
- for (; c < b.length; c++) b[c].call(null);
- for (var d = 0; d < a.ops.length; d++) {
- var e = a.ops[d];
- if (e.cursorActivityHandlers)
- for (; e.cursorActivityCalled < e.cursorActivityHandlers.length;) e.cursorActivityHandlers[e.cursorActivityCalled++].call(null, e.cm)
- }
- } while (c < b.length)
- }
-
- function Xb(a) {
- var b = a.curOp,
- c = b.ownsGroup;
- if (c) try {
- Wb(c)
- } finally {
- Tb = null;
- for (var d = 0; d < c.ops.length; d++) c.ops[d].cm.curOp = null;
- Yb(c)
- }
- }
-
- function Yb(a) {
- for (var b = a.ops, c = 0; c < b.length; c++) Zb(b[c]);
- for (var c = 0; c < b.length; c++) $b(b[c]);
- for (var c = 0; c < b.length; c++) _b(b[c]);
- for (var c = 0; c < b.length; c++) ac(b[c]);
- for (var c = 0; c < b.length; c++) bc(b[c])
- }
-
- function Zb(a) {
- var b = a.cm,
- c = b.display;
- V(b), a.updateMaxLine && H(b), a.mustUpdate = a.viewChanged || a.forceUpdate || null != a.scrollTop || a.scrollToPos && (a.scrollToPos.from.line < c.viewFrom || a.scrollToPos.to.line >= c.viewTo) || c.maxLineChanged && b.options.lineWrapping, a.update = a.mustUpdate && new U(b, a.mustUpdate && {
- top: a.scrollTop,
- ensure: a.scrollToPos
- }, a.forceUpdate)
- }
-
- function $b(a) {
- a.updatedDisplay = a.mustUpdate && W(a.cm, a.update)
- }
-
- function _b(a) {
- var b = a.cm,
- c = b.display;
- a.updatedDisplay && $(b), a.barMeasure = J(b), c.maxLineChanged && !b.options.lineWrapping && (a.adjustWidthTo = vb(b, c.maxLine, c.maxLine.text.length)
- .left + 3, b.display.sizerWidth = a.adjustWidthTo, a.barMeasure.scrollWidth = Math.max(c.scroller.clientWidth, c.sizer.offsetLeft + a.adjustWidthTo + pb(b) + b.display.barWidth), a.maxScrollLeft = Math.max(0, c.sizer.offsetLeft + a.adjustWidthTo - qb(b))), (a.updatedDisplay || a.selectionChanged) && (a.preparedSelection = c.input.prepareSelection())
- }
-
- function ac(a) {
- var b = a.cm;
- null != a.adjustWidthTo && (b.display.sizer.style.minWidth = a.adjustWidthTo + "px", a.maxScrollLeft < b.doc.scrollLeft && Ic(b, Math.min(b.display.scroller.scrollLeft, a.maxScrollLeft), !0), b.display.maxLineChanged = !1), a.preparedSelection && b.display.input.showSelection(a.preparedSelection), a.updatedDisplay && Z(b, a.barMeasure), (a.updatedDisplay || a.startHeight != b.doc.height) && N(b, a.barMeasure), a.selectionChanged && hb(b), b.state.focused && a.updateInput && b.display.input.reset(a.typing), a.focus && a.focus == ug() && ta(a.cm)
- }
-
- function bc(a) {
- var b = a.cm,
- c = b.display,
- d = b.doc;
- if (a.updatedDisplay && X(b, a.update), null == c.wheelStartX || null == a.scrollTop && null == a.scrollLeft && !a.scrollToPos || (c.wheelStartX = c.wheelStartY = null), null == a.scrollTop || c.scroller.scrollTop == a.scrollTop && !a.forceScroll || (d.scrollTop = Math.max(0, Math.min(c.scroller.scrollHeight - c.scroller.clientHeight, a.scrollTop)), c.scrollbars.setScrollTop(d.scrollTop), c.scroller.scrollTop = d.scrollTop), null == a.scrollLeft || c.scroller.scrollLeft == a.scrollLeft && !a.forceScroll || (d.scrollLeft = Math.max(0, Math.min(c.scroller.scrollWidth - qb(b), a.scrollLeft)), c.scrollbars.setScrollLeft(d.scrollLeft), c.scroller.scrollLeft = d.scrollLeft, Q(b)), a.scrollToPos) {
- var e = pd(b, Oa(d, a.scrollToPos.from), Oa(d, a.scrollToPos.to), a.scrollToPos.margin);
- a.scrollToPos.isCursor && b.state.focused && od(b, e)
- }
- var f = a.maybeHiddenMarkers,
- g = a.maybeUnhiddenMarkers;
- if (f)
- for (var h = 0; h < f.length; ++h) f[h].lines.length || Lf(f[h], "hide");
- if (g)
- for (var h = 0; h < g.length; ++h) g[h].lines.length && Lf(g[h], "unhide");
- c.wrapper.offsetHeight && (d.scrollTop = b.display.scroller.scrollTop), a.changeObjs && Lf(b, "changes", b, a.changeObjs), a.update && a.update.finish()
- }
-
- function cc(a, b) {
- if (a.curOp) return b();
- Vb(a);
- try {
- return b()
- } finally {
- Xb(a)
- }
- }
-
- function dc(a, b) {
- return function () {
- if (a.curOp) return b.apply(a, arguments);
- Vb(a);
- try {
- return b.apply(a, arguments)
- } finally {
- Xb(a)
- }
- }
- }
-
- function ec(a) {
- return function () {
- if (this.curOp) return a.apply(this, arguments);
- Vb(this);
- try {
- return a.apply(this, arguments)
- } finally {
- Xb(this)
- }
- }
- }
-
- function fc(a) {
- return function () {
- var b = this.cm;
- if (!b || b.curOp) return a.apply(this, arguments);
- Vb(b);
- try {
- return a.apply(this, arguments)
- } finally {
- Xb(b)
- }
- }
- }
-
- function gc(a, b, c) {
- this.line = b, this.rest = te(b), this.size = this.rest ? kf(bg(this.rest)) - c + 1 : 1, this.node = this.text = null, this.hidden = we(a, b)
- }
-
- function hc(a, b, c) {
- for (var e, d = [], f = b; c > f; f = e) {
- var g = new gc(a.doc, ff(a.doc, f), f);
- e = f + g.size, d.push(g)
- }
- return d
- }
-
- function ic(a, b, c, d) {
- null == b && (b = a.doc.first), null == c && (c = a.doc.first + a.doc.size), d || (d = 0);
- var e = a.display;
- if (d && c < e.viewTo && (null == e.updateLineNumbers || e.updateLineNumbers > b) && (e.updateLineNumbers = b), a.curOp.viewChanged = !0, b >= e.viewTo) u && ue(a.doc, b) < e.viewTo && kc(a);
- else if (c <= e.viewFrom) u && ve(a.doc, c + d) > e.viewFrom ? kc(a) : (e.viewFrom += d, e.viewTo += d);
- else if (b <= e.viewFrom && c >= e.viewTo) kc(a);
- else if (b <= e.viewFrom) {
- var f = mc(a, c, c + d, 1);
- f ? (e.view = e.view.slice(f.index), e.viewFrom = f.lineN, e.viewTo += d) : kc(a)
- } else if (c >= e.viewTo) {
- var f = mc(a, b, b, -1);
- f ? (e.view = e.view.slice(0, f.index), e.viewTo = f.lineN) : kc(a)
- } else {
- var g = mc(a, b, b, -1),
- h = mc(a, c, c + d, 1);
- g && h ? (e.view = e.view.slice(0, g.index)
- .concat(hc(a, g.lineN, h.lineN))
- .concat(e.view.slice(h.index)), e.viewTo += d) : kc(a)
- }
- var i = e.externalMeasured;
- i && (c < i.lineN ? i.lineN += d : b < i.lineN + i.size && (e.externalMeasured = null))
- }
-
- function jc(a, b, c) {
- a.curOp.viewChanged = !0;
- var d = a.display,
- e = a.display.externalMeasured;
- if (e && b >= e.lineN && b < e.lineN + e.size && (d.externalMeasured = null), !(b < d.viewFrom || b >= d.viewTo)) {
- var f = d.view[lc(a, b)];
- if (null != f.node) {
- var g = f.changes || (f.changes = []); - 1 == dg(g, c) && g.push(c)
- }
- }
- }
-
- function kc(a) {
- a.display.viewFrom = a.display.viewTo = a.doc.first, a.display.view = [], a.display.viewOffset = 0
- }
-
- function lc(a, b) {
- if (b >= a.display.viewTo) return null;
- if (b -= a.display.viewFrom, 0 > b) return null;
- for (var c = a.display.view, d = 0; d < c.length; d++)
- if (b -= c[d].size, 0 > b) return d
- }
-
- function mc(a, b, c, d) {
- var f, e = lc(a, b),
- g = a.display.view;
- if (!u || c == a.doc.first + a.doc.size) return {
- index: e,
- lineN: c
- };
- for (var h = 0, i = a.display.viewFrom; e > h; h++) i += g[h].size;
- if (i != b) {
- if (d > 0) {
- if (e == g.length - 1) return null;
- f = i + g[e].size - b, e++
- } else f = i - b;
- b += f, c += f
- }
- for (; ue(a.doc, c) != c;) {
- if (e == (0 > d ? 0 : g.length - 1)) return null;
- c += d * g[e - (0 > d ? 1 : 0)].size, e += d
- }
- return {
- index: e,
- lineN: c
- }
- }
-
- function nc(a, b, c) {
- var d = a.display,
- e = d.view;
- 0 == e.length || b >= d.viewTo || c <= d.viewFrom ? (d.view = hc(a, b, c), d.viewFrom = b) : (d.viewFrom > b ? d.view = hc(a, b, d.viewFrom)
- .concat(d.view) : d.viewFrom < b && (d.view = d.view.slice(lc(a, b))), d.viewFrom = b, d.viewTo < c ? d.view = d.view.concat(hc(a, d.viewTo, c)) : d.viewTo > c && (d.view = d.view.slice(0, lc(a, c)))), d.viewTo = c
- }
-
- function oc(a) {
- for (var b = a.display.view, c = 0, d = 0; d < b.length; d++) {
- var e = b[d];
- e.hidden || e.node && !e.changes || ++c
- }
- return c
- }
-
- function pc(a) {
- function g() {
- b.activeTouch && (c = setTimeout(function () {
- b.activeTouch = null
- }, 1e3), f = b.activeTouch, f.end = +new Date)
- }
-
- function h(a) {
- if (1 != a.touches.length) return !1;
- var b = a.touches[0];
- return b.radiusX <= 1 && b.radiusY <= 1
- }
-
- function i(a, b) {
- if (null == b.left) return !0;
- var c = b.left - a.left,
- d = b.top - a.top;
- return c * c + d * d > 400
- }
- var b = a.display;
- Jf(b.scroller, "mousedown", dc(a, uc)), d && 11 > e ? Jf(b.scroller, "dblclick", dc(a, function (b) {
- if (!Pf(a, b)) {
- var c = tc(a, b);
- if (c && !Bc(a, b) && !sc(a.display, b)) {
- Df(b);
- var d = a.findWordAt(c);
- Ta(a.doc, d.anchor, d.head)
- }
- }
- })) : Jf(b.scroller, "dblclick", function (b) {
- Pf(a, b) || Df(b)
- }), s || Jf(b.scroller, "contextmenu", function (b) {
- _c(a, b)
- });
- var c, f = {
- end: 0
- };
- Jf(b.scroller, "touchstart", function (a) {
- if (!h(a)) {
- clearTimeout(c);
- var d = +new Date;
- b.activeTouch = {
- start: d,
- moved: !1,
- prev: d - f.end <= 300 ? f : null
- }, 1 == a.touches.length && (b.activeTouch.left = a.touches[0].pageX, b.activeTouch.top = a.touches[0].pageY)
- }
- }), Jf(b.scroller, "touchmove", function () {
- b.activeTouch && (b.activeTouch.moved = !0)
- }), Jf(b.scroller, "touchend", function (c) {
- var d = b.activeTouch;
- if (d && !sc(b, c) && null != d.left && !d.moved && new Date - d.start < 300) {
- var f, e = a.coordsChar(b.activeTouch, "page");
- f = !d.prev || i(d, d.prev) ? new Ka(e, e) : !d.prev.prev || i(d, d.prev.prev) ? a.findWordAt(e) : new Ka(oa(e.line, 0), Oa(a.doc, oa(e.line + 1, 0))), a.setSelection(f.anchor, f.head), a.focus(), Df(c)
- }
- g()
- }), Jf(b.scroller, "touchcancel", g), Jf(b.scroller, "scroll", function () {
- b.scroller.clientHeight && (Hc(a, b.scroller.scrollTop), Ic(a, b.scroller.scrollLeft, !0), Lf(a, "scroll", a))
- }), Jf(b.scroller, "mousewheel", function (b) {
- Mc(a, b)
- }), Jf(b.scroller, "DOMMouseScroll", function (b) {
- Mc(a, b)
- }), Jf(b.wrapper, "scroll", function () {
- b.wrapper.scrollTop = b.wrapper.scrollLeft = 0
- }), b.dragFunctions = {
- enter: function (b) {
- Pf(a, b) || Gf(b)
- },
- over: function (b) {
- Pf(a, b) || (Fc(a, b), Gf(b))
- },
- start: function (b) {
- Ec(a, b)
- },
- drop: dc(a, Dc),
- leave: function () {
- Gc(a)
- }
- };
- var j = b.input.getField();
- Jf(j, "keyup", function (b) {
- Wc.call(a, b)
- }), Jf(j, "keydown", dc(a, Uc)), Jf(j, "keypress", dc(a, Xc)), Jf(j, "focus", ig(Zc, a)), Jf(j, "blur", ig($c, a))
- }
-
- function qc(a, b, c) {
- var d = c && c != v.Init;
- if (!b != !d) {
- var e = a.display.dragFunctions,
- f = b ? Jf : Kf;
- f(a.display.scroller, "dragstart", e.start), f(a.display.scroller, "dragenter", e.enter), f(a.display.scroller, "dragover", e.over), f(a.display.scroller, "dragleave", e.leave), f(a.display.scroller, "drop", e.drop)
- }
- }
-
- function rc(a) {
- var b = a.display;
- (b.lastWrapHeight != b.wrapper.clientHeight || b.lastWrapWidth != b.wrapper.clientWidth) && (b.cachedCharWidth = b.cachedTextHeight = b.cachedPaddingH = null, b.scrollbarsClipped = !1, a.setSize())
- }
-
- function sc(a, b) {
- for (var c = Hf(b); c != a.wrapper; c = c.parentNode)
- if (!c || 1 == c.nodeType && "true" == c.getAttribute("cm-ignore-events") || c.parentNode == a.sizer && c != a.mover) return !0
- }
-
- function tc(a, b, c, d) {
- var e = a.display;
- if (!c && "true" == Hf(b)
- .getAttribute("cm-not-content")) return null;
- var f, g, h = e.lineSpace.getBoundingClientRect();
- try {
- f = b.clientX - h.left, g = b.clientY - h.top
- } catch (b) {
- return null
- }
- var j, i = Ob(a, f, g);
- if (d && 1 == i.xRel && (j = ff(a.doc, i.line)
- .text)
- .length == i.ch) {
- var k = Zf(j, j.length, a.options.tabSize) - j.length;
- i = oa(i.line, Math.max(0, Math.round((f - ob(a.display)
- .left) / Sb(a.display)) - k))
- }
- return i
- }
-
- function uc(a) {
- var b = this,
- c = b.display;
- if (!(c.activeTouch && c.input.supportsTouch() || Pf(b, a))) {
- if (c.shift = a.shiftKey, sc(c, a)) return void(f || (c.scroller.draggable = !1, setTimeout(function () {
- c.scroller.draggable = !0
- }, 100)));
- if (!Bc(b, a)) {
- var d = tc(b, a);
- switch (window.focus(), If(a)) {
- case 1:
- b.state.selectingText ? b.state.selectingText(a) : d ? xc(b, a, d) : Hf(a) == c.scroller && Df(a);
- break;
- case 2:
- f && (b.state.lastMiddleDown = +new Date), d && Ta(b.doc, d), setTimeout(function () {
- c.input.focus()
- }, 20), Df(a);
- break;
- case 3:
- s ? _c(b, a) : Yc(b)
- }
- }
- }
- }
-
- function xc(a, b, c) {
- d ? setTimeout(ig(ta, a), 0) : a.curOp.focus = ug();
- var f, e = +new Date;
- wc && wc.time > e - 400 && 0 == pa(wc.pos, c) ? f = "triple" : vc && vc.time > e - 400 && 0 == pa(vc.pos, c) ? (f = "double", wc = {
- time: e,
- pos: c
- }) : (f = "single", vc = {
- time: e,
- pos: c
- });
- var i, g = a.doc.sel,
- h = o ? b.metaKey : b.ctrlKey;
- a.options.dragDrop && Dg && !ua(a) && "single" == f && (i = g.contains(c)) > -1 && (pa((i = g.ranges[i])
- .from(), c) < 0 || c.xRel > 0) && (pa(i.to(), c) > 0 || c.xRel < 0) ? yc(a, b, c, h) : zc(a, b, c, f, h)
- }
-
- function yc(a, b, c, g) {
- var h = a.display,
- i = +new Date,
- j = dc(a, function (k) {
- f && (h.scroller.draggable = !1), a.state.draggingText = !1, Kf(document, "mouseup", j), Kf(h.scroller, "drop", j), Math.abs(b.clientX - k.clientX) + Math.abs(b.clientY - k.clientY) < 10 && (Df(k), !g && +new Date - 200 < i && Ta(a.doc, c), f || d && 9 == e ? setTimeout(function () {
- document.body.focus(), h.input.focus()
- }, 20) : h.input.focus())
- });
- f && (h.scroller.draggable = !0), a.state.draggingText = j, h.scroller.dragDrop && h.scroller.dragDrop(), Jf(document, "mouseup", j), Jf(h.scroller, "drop", j)
- }
-
- function zc(a, b, c, d, e) {
- function o(b) {
- if (0 != pa(n, b))
- if (n = b, "rect" == d) {
- for (var e = [], f = a.options.tabSize, k = Zf(ff(g, c.line)
- .text, c.ch, f), l = Zf(ff(g, b.line)
- .text, b.ch, f), m = Math.min(k, l), o = Math.max(k, l), p = Math.min(c.line, b.line), q = Math.min(a.lastLine(), Math.max(c.line, b.line)); q >= p; p++) {
- var r = ff(g, p)
- .text,
- s = $f(r, m, f);
- m == o ? e.push(new Ka(oa(p, s), oa(p, s))) : r.length > s && e.push(new Ka(oa(p, s), oa(p, $f(r, o, f))))
- }
- e.length || e.push(new Ka(c, c)), Za(g, La(j.ranges.slice(0, i)
- .concat(e), i), {
- origin: "*mouse",
- scroll: !1
- }), a.scrollIntoView(b)
- } else {
- var t = h,
- u = t.anchor,
- v = b;
- if ("single" != d) {
- if ("double" == d) var w = a.findWordAt(b);
- else var w = new Ka(oa(b.line, 0), Oa(g, oa(b.line + 1, 0)));
- pa(w.anchor, u) > 0 ? (v = w.head, u = sa(t.from(), w.anchor)) : (v = w.anchor, u = ra(t.to(), w.head))
- }
- var e = j.ranges.slice(0);
- e[i] = new Ka(Oa(g, u), v), Za(g, La(e, i), Wf)
- }
- }
-
- function r(b) {
- var c = ++q,
- e = tc(a, b, !0, "rect" == d);
- if (e)
- if (0 != pa(e, n)) {
- a.curOp.focus = ug(), o(e);
- var h = P(f, g);
- (e.line >= h.to || e.line < h.from) && setTimeout(dc(a, function () {
- q == c && r(b)
- }), 150)
- } else {
- var i = b.clientY < p.top ? -20 : b.clientY > p.bottom ? 20 : 0;
- i && setTimeout(dc(a, function () {
- q == c && (f.scroller.scrollTop += i, r(b))
- }), 50)
- }
- }
-
- function s(b) {
- a.state.selectingText = !1, q = 1 / 0, Df(b), f.input.focus(), Kf(document, "mousemove", t), Kf(document, "mouseup", u), g.history.lastSelOrigin = null
- }
- var f = a.display,
- g = a.doc;
- Df(b);
- var h, i, j = g.sel,
- k = j.ranges;
- if (e && !b.shiftKey ? (i = g.sel.contains(c), h = i > -1 ? k[i] : new Ka(c, c)) : (h = g.sel.primary(), i = g.sel.primIndex), b.altKey) d = "rect", e || (h = new Ka(c, c)), c = tc(a, b, !0, !0), i = -1;
- else if ("double" == d) {
- var l = a.findWordAt(c);
- h = a.display.shift || g.extend ? Sa(g, h, l.anchor, l.head) : l
- } else if ("triple" == d) {
- var m = new Ka(oa(c.line, 0), Oa(g, oa(c.line + 1, 0)));
- h = a.display.shift || g.extend ? Sa(g, h, m.anchor, m.head) : m
- } else h = Sa(g, h, c);
- e ? -1 == i ? (i = k.length, Za(g, La(k.concat([h]), i), {
- scroll: !1,
- origin: "*mouse"
- })) : k.length > 1 && k[i].empty() && "single" == d && !b.shiftKey ? (Za(g, La(k.slice(0, i)
- .concat(k.slice(i + 1)), 0), {
- scroll: !1,
- origin: "*mouse"
- }), j = g.sel) : Va(g, i, h, Wf) : (i = 0, Za(g, new Ja([h], 0), Wf), j = g.sel);
- var n = c,
- p = f.wrapper.getBoundingClientRect(),
- q = 0,
- t = dc(a, function (a) {
- If(a) ? r(a) : s(a)
- }),
- u = dc(a, s);
- a.state.selectingText = u, Jf(document, "mousemove", t), Jf(document, "mouseup", u)
- }
-
- function Ac(a, b, c, d, e) {
- try {
- var f = b.clientX,
- g = b.clientY
- } catch (b) {
- return !1
- }
- if (f >= Math.floor(a.display.gutters.getBoundingClientRect()
- .right)) return !1;
- d && Df(b);
- var h = a.display,
- i = h.lineDiv.getBoundingClientRect();
- if (g > i.bottom || !Rf(a, c)) return Ff(b);
- g -= i.top - h.viewOffset;
- for (var j = 0; j < a.options.gutters.length; ++j) {
- var k = h.gutters.childNodes[j];
- if (k && k.getBoundingClientRect()
- .right >= f) {
- var l = lf(a.doc, g),
- m = a.options.gutters[j];
- return e(a, c, a, l, m, b), Ff(b)
- }
- }
- }
-
- function Bc(a, b) {
- return Ac(a, b, "gutterClick", !0, Nf)
- }
-
- function Dc(a) {
- var b = this;
- if (Gc(b), !Pf(b, a) && !sc(b.display, a)) {
- Df(a), d && (Cc = +new Date);
- var c = tc(b, a, !0),
- e = a.dataTransfer.files;
- if (c && !ua(b))
- if (e && e.length && window.FileReader && window.File)
- for (var f = e.length, g = Array(f), h = 0, i = function (a, d) {
- var e = new FileReader;
- e.onload = dc(b, function () {
- if (g[d] = e.result, ++h == f) {
- c = Oa(b.doc, c);
- var a = {
- from: c,
- to: c,
- text: b.doc.splitLines(g.join(b.doc.lineSeparator())),
- origin: "paste"
- };
- hd(b.doc, a), Ya(b.doc, Ma(c, bd(a)))
- }
- }), e.readAsText(a)
- }, j = 0; f > j; ++j) i(e[j], j);
- else {
- if (b.state.draggingText && b.doc.sel.contains(c) > -1) return b.state.draggingText(a), void setTimeout(function () {
- b.display.input.focus()
- }, 20);
- try {
- var g = a.dataTransfer.getData("Text");
- if (g) {
- if (b.state.draggingText && !(o ? a.altKey : a.ctrlKey)) var k = b.listSelections();
- if ($a(b.doc, Ma(c, c)), k)
- for (var j = 0; j < k.length; ++j) nd(b.doc, "", k[j].anchor, k[j].head, "drag");
- b.replaceSelection(g, "around", "paste"), b.display.input.focus()
- }
- } catch (a) {}
- }
- }
- }
-
- function Ec(a, b) {
- if (d && (!a.state.draggingText || +new Date - Cc < 100)) return void Gf(b);
- if (!Pf(a, b) && !sc(a.display, b) && (b.dataTransfer.setData("Text", a.getSelection()), b.dataTransfer.setDragImage && !j)) {
- var c = pg("img", null, null, "position: fixed; left: 0; top: 0;");
- c.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", i && (c.width = c.height = 1, a.display.wrapper.appendChild(c), c._top = c.offsetTop), b.dataTransfer.setDragImage(c, 0, 0), i && c.parentNode.removeChild(c)
- }
- }
-
- function Fc(a, b) {
- var c = tc(a, b);
- if (c) {
- var d = document.createDocumentFragment();
- fb(a, c, d), a.display.dragCursor || (a.display.dragCursor = pg("div", null, "CodeMirror-cursors CodeMirror-dragcursors"), a.display.lineSpace.insertBefore(a.display.dragCursor, a.display.cursorDiv)), sg(a.display.dragCursor, d)
- }
- }
-
- function Gc(a) {
- a.display.dragCursor && (a.display.lineSpace.removeChild(a.display.dragCursor), a.display.dragCursor = null)
- }
-
- function Hc(b, c) {
- Math.abs(b.doc.scrollTop - c) < 2 || (b.doc.scrollTop = c, a || Y(b, {
- top: c
- }), b.display.scroller.scrollTop != c && (b.display.scroller.scrollTop = c), b.display.scrollbars.setScrollTop(c), a && Y(b), ib(b, 100))
- }
-
- function Ic(a, b, c) {
- (c ? b == a.doc.scrollLeft : Math.abs(a.doc.scrollLeft - b) < 2) || (b = Math.min(b, a.display.scroller.scrollWidth - a.display.scroller.clientWidth), a.doc.scrollLeft = b, Q(a), a.display.scroller.scrollLeft != b && (a.display.scroller.scrollLeft = b), a.display.scrollbars.setScrollLeft(b))
- }
-
- function Mc(b, c) {
- var d = Lc(c),
- e = d.x,
- g = d.y,
- h = b.display,
- j = h.scroller;
- if (e && j.scrollWidth > j.clientWidth || g && j.scrollHeight > j.clientHeight) {
- if (g && o && f) a: for (var k = c.target, l = h.view; k != j; k = k.parentNode)
- for (var m = 0; m < l.length; m++)
- if (l[m].node == k) {
- b.display.currentWheelTarget = k;
- break a
- }
- if (e && !a && !i && null != Kc) return g && Hc(b, Math.max(0, Math.min(j.scrollTop + g * Kc, j.scrollHeight - j.clientHeight))), Ic(b, Math.max(0, Math.min(j.scrollLeft + e * Kc, j.scrollWidth - j.clientWidth))), Df(c), void(h.wheelStartX = null);
- if (g && null != Kc) {
- var n = g * Kc,
- p = b.doc.scrollTop,
- q = p + h.wrapper.clientHeight;
- 0 > n ? p = Math.max(0, p + n - 50) : q = Math.min(b.doc.height, q + n + 50), Y(b, {
- top: p,
- bottom: q
- })
- }
- 20 > Jc && (null == h.wheelStartX ? (h.wheelStartX = j.scrollLeft, h.wheelStartY = j.scrollTop, h.wheelDX = e, h.wheelDY = g, setTimeout(function () {
- if (null != h.wheelStartX) {
- var a = j.scrollLeft - h.wheelStartX,
- b = j.scrollTop - h.wheelStartY,
- c = b && h.wheelDY && b / h.wheelDY || a && h.wheelDX && a / h.wheelDX;
- h.wheelStartX = h.wheelStartY = null, c && (Kc = (Kc * Jc + c) / (Jc + 1), ++Jc)
- }
- }, 200)) : (h.wheelDX += e, h.wheelDY += g))
- }
- }
-
- function Nc(a, b, c) {
- if ("string" == typeof b && (b = Ld[b], !b)) return !1;
- a.display.input.ensurePolled();
- var d = a.display.shift,
- e = !1;
- try {
- ua(a) && (a.state.suppressEdits = !0), c && (a.display.shift = !1), e = b(a) != Uf
- } finally {
- a.display.shift = d, a.state.suppressEdits = !1
- }
- return e
- }
-
- function Oc(a, b, c) {
- for (var d = 0; d < a.state.keyMaps.length; d++) {
- var e = Od(b, a.state.keyMaps[d], c, a);
- if (e) return e
- }
- return a.options.extraKeys && Od(b, a.options.extraKeys, c, a) || Od(b, a.options.keyMap, c, a)
- }
-
- function Qc(a, b, c, d) {
- var e = a.state.keySeq;
- if (e) {
- if (Pd(b)) return "handled";
- Pc.set(50, function () {
- a.state.keySeq == e && (a.state.keySeq = null, a.display.input.reset())
- }), b = e + " " + b
- }
- var f = Oc(a, b, d);
- return "multi" == f && (a.state.keySeq = b), "handled" == f && Nf(a, "keyHandled", a, b, c), ("handled" == f || "multi" == f) && (Df(c), hb(a)), e && !f && /\'$/.test(b) ? (Df(c), !0) : !!f
- }
-
- function Rc(a, b) {
- var c = Qd(b, !0);
- return c ? b.shiftKey && !a.state.keySeq ? Qc(a, "Shift-" + c, b, function (b) {
- return Nc(a, b, !0)
- }) || Qc(a, c, b, function (b) {
- return ("string" == typeof b ? /^go[A-Z]/.test(b) : b.motion) ? Nc(a, b) : void 0
- }) : Qc(a, c, b, function (b) {
- return Nc(a, b)
- }) : !1
- }
-
- function Sc(a, b, c) {
- return Qc(a, "'" + c + "'", b, function (b) {
- return Nc(a, b, !0)
- })
- }
-
- function Uc(a) {
- var b = this;
- if (b.curOp.focus = ug(), !Pf(b, a)) {
- d && 11 > e && 27 == a.keyCode && (a.returnValue = !1);
- var c = a.keyCode;
- b.display.shift = 16 == c || a.shiftKey;
- var f = Rc(b, a);
- i && (Tc = f ? c : null, !f && 88 == c && !Kg && (o ? a.metaKey : a.ctrlKey) && b.replaceSelection("", null, "cut")), 18 != c || /\bCodeMirror-crosshair\b/.test(b.display.lineDiv.className) || Vc(b)
- }
- }
-
- function Vc(a) {
- function c(a) {
- 18 != a.keyCode && a.altKey || (wg(b, "CodeMirror-crosshair"), Kf(document, "keyup", c), Kf(document, "mouseover", c))
- }
- var b = a.display.lineDiv;
- xg(b, "CodeMirror-crosshair"), Jf(document, "keyup", c), Jf(document, "mouseover", c)
- }
-
- function Wc(a) {
- 16 == a.keyCode && (this.doc.sel.shift = !1), Pf(this, a)
- }
-
- function Xc(a) {
- var b = this;
- if (!(sc(b.display, a) || Pf(b, a) || a.ctrlKey && !a.altKey || o && a.metaKey)) {
- var c = a.keyCode,
- d = a.charCode;
- if (i && c == Tc) return Tc = null, void Df(a);
- if (!i || a.which && !(a.which < 10) || !Rc(b, a)) {
- var e = String.fromCharCode(null == d ? c : d);
- Sc(b, a, e) || b.display.input.onKeyPress(a)
- }
- }
- }
-
- function Yc(a) {
- a.state.delayingBlurEvent = !0, setTimeout(function () {
- a.state.delayingBlurEvent && (a.state.delayingBlurEvent = !1, $c(a))
- }, 100)
- }
-
- function Zc(a) {
- a.state.delayingBlurEvent && (a.state.delayingBlurEvent = !1), "nocursor" != a.options.readOnly && (a.state.focused || (Lf(a, "focus", a), a.state.focused = !0, xg(a.display.wrapper, "CodeMirror-focused"), a.curOp || a.display.selForContextMenu == a.doc.sel || (a.display.input.reset(), f && setTimeout(function () {
- a.display.input.reset(!0)
- }, 20)), a.display.input.receivedFocus()), hb(a))
- }
-
- function $c(a) {
- a.state.delayingBlurEvent || (a.state.focused && (Lf(a, "blur", a), a.state.focused = !1, wg(a.display.wrapper, "CodeMirror-focused")), clearInterval(a.display.blinker), setTimeout(function () {
- a.state.focused || (a.display.shift = !1)
- }, 150))
- }
-
- function _c(a, b) {
- sc(a.display, b) || ad(a, b) || a.display.input.onContextMenu(b)
- }
-
- function ad(a, b) {
- return Rf(a, "gutterContextMenu") ? Ac(a, b, "gutterContextMenu", !1, Lf) : !1
- }
-
- function cd(a, b) {
- if (pa(a, b.from) < 0) return a;
- if (pa(a, b.to) <= 0) return bd(b);
- var c = a.line + b.text.length - (b.to.line - b.from.line) - 1,
- d = a.ch;
- return a.line == b.to.line && (d += bd(b)
- .ch - b.to.ch), oa(c, d)
- }
-
- function dd(a, b) {
- for (var c = [], d = 0; d < a.sel.ranges.length; d++) {
- var e = a.sel.ranges[d];
- c.push(new Ka(cd(e.anchor, b), cd(e.head, b)))
- }
- return La(c, a.sel.primIndex)
- }
-
- function ed(a, b, c) {
- return a.line == b.line ? oa(c.line, a.ch - b.ch + c.ch) : oa(c.line + (a.line - b.line), a.ch)
- }
-
- function fd(a, b, c) {
- for (var d = [], e = oa(a.first, 0), f = e, g = 0; g < b.length; g++) {
- var h = b[g],
- i = ed(h.from, e, f),
- j = ed(bd(h), e, f);
- if (e = h.to, f = j, "around" == c) {
- var k = a.sel.ranges[g],
- l = pa(k.head, k.anchor) < 0;
- d[g] = new Ka(l ? j : i, l ? i : j)
- } else d[g] = new Ka(i, i)
- }
- return new Ja(d, a.sel.primIndex)
- }
-
- function gd(a, b, c) {
- var d = {
- canceled: !1,
- from: b.from,
- to: b.to,
- text: b.text,
- origin: b.origin,
- cancel: function () {
- this.canceled = !0
- }
- };
- return c && (d.update = function (b, c, d, e) {
- b && (this.from = Oa(a, b)), c && (this.to = Oa(a, c)), d && (this.text = d), void 0 !== e && (this.origin = e)
- }), Lf(a, "beforeChange", a, d), a.cm && Lf(a.cm, "beforeChange", a.cm, d), d.canceled ? null : {
- from: d.from,
- to: d.to,
- text: d.text,
- origin: d.origin
- }
- }
-
- function hd(a, b, c) {
- if (a.cm) {
- if (!a.cm.curOp) return dc(a.cm, hd)(a, b, c);
- if (a.cm.state.suppressEdits) return
- }
- if (!(Rf(a, "beforeChange") || a.cm && Rf(a.cm, "beforeChange")) || (b = gd(a, b, !0))) {
- var d = t && !c && ie(a, b.from, b.to);
- if (d)
- for (var e = d.length - 1; e >= 0; --e) id(a, {
- from: d[e].from,
- to: d[e].to,
- text: e ? [""] : b.text
- });
- else id(a, b)
- }
- }
-
- function id(a, b) {
- if (1 != b.text.length || "" != b.text[0] || 0 != pa(b.from, b.to)) {
- var c = dd(a, b);
- sf(a, b, c, a.cm ? a.cm.curOp.id : NaN), ld(a, b, c, fe(a, b));
- var d = [];
- df(a, function (a, c) {
- c || -1 != dg(d, a.history) || (Cf(a.history, b), d.push(a.history)), ld(a, b, null, fe(a, b))
- })
- }
- }
-
- function jd(a, b, c) {
- if (!a.cm || !a.cm.state.suppressEdits) {
- for (var e, d = a.history, f = a.sel, g = "undo" == b ? d.done : d.undone, h = "undo" == b ? d.undone : d.done, i = 0; i < g.length && (e = g[i], c ? !e.ranges || e.equals(a.sel) : e.ranges); i++);
- if (i != g.length) {
- for (d.lastOrigin = d.lastSelOrigin = null; e = g.pop(), e.ranges;) {
- if (vf(e, h), c && !e.equals(a.sel)) return void Za(a, e, {
- clearRedo: !1
- });
- f = e
- }
- var j = [];
- vf(f, h), h.push({
- changes: j,
- generation: d.generation
- }), d.generation = e.generation || ++d.maxGeneration;
- for (var k = Rf(a, "beforeChange") || a.cm && Rf(a.cm, "beforeChange"), i = e.changes.length - 1; i >= 0; --i) {
- var l = e.changes[i];
- if (l.origin = b, k && !gd(a, l, !1)) return void(g.length = 0);
- j.push(pf(a, l));
- var m = i ? dd(a, l) : bg(g);
- ld(a, l, m, he(a, l)), !i && a.cm && a.cm.scrollIntoView({
- from: l.from,
- to: bd(l)
- });
- var n = [];
- df(a, function (a, b) {
- b || -1 != dg(n, a.history) || (Cf(a.history, l), n.push(a.history)), ld(a, l, null, he(a, l))
- })
- }
- }
- }
- }
-
- function kd(a, b) {
- if (0 != b && (a.first += b, a.sel = new Ja(eg(a.sel.ranges, function (a) {
- return new Ka(oa(a.anchor.line + b, a.anchor.ch), oa(a.head.line + b, a.head.ch))
- }), a.sel.primIndex), a.cm)) {
- ic(a.cm, a.first, a.first - b, b);
- for (var c = a.cm.display, d = c.viewFrom; d < c.viewTo; d++) jc(a.cm, d, "gutter")
- }
- }
-
- function ld(a, b, c, d) {
- if (a.cm && !a.cm.curOp) return dc(a.cm, ld)(a, b, c, d);
- if (b.to.line < a.first) return void kd(a, b.text.length - 1 - (b.to.line - b.from.line));
- if (!(b.from.line > a.lastLine())) {
- if (b.from.line < a.first) {
- var e = b.text.length - 1 - (a.first - b.from.line);
- kd(a, e), b = {
- from: oa(a.first, 0),
- to: oa(b.to.line + e, b.to.ch),
- text: [bg(b.text)],
- origin: b.origin
- }
- }
- var f = a.lastLine();
- b.to.line > f && (b = {
- from: b.from,
- to: oa(f, ff(a, f)
- .text.length),
- text: [b.text[0]],
- origin: b.origin
- }), b.removed = gf(a, b.from, b.to), c || (c = dd(a, b)), a.cm ? md(a.cm, b, d) : Ye(a, b, d), $a(a, c, Vf)
- }
- }
-
- function md(a, b, c) {
- var d = a.doc,
- e = a.display,
- f = b.from,
- g = b.to,
- h = !1,
- i = f.line;
- a.options.lineWrapping || (i = kf(se(ff(d, f.line))), d.iter(i, g.line + 1, function (a) {
- return a == e.maxLine ? (h = !0, !0) : void 0
- })), d.sel.contains(b.from, b.to) > -1 && Qf(a), Ye(d, b, c, A(a)), a.options.lineWrapping || (d.iter(i, f.line + b.text.length, function (a) {
- var b = G(a);
- b > e.maxLineLength && (e.maxLine = a, e.maxLineLength = b, e.maxLineChanged = !0, h = !1)
- }), h && (a.curOp.updateMaxLine = !0)), d.frontier = Math.min(d.frontier, f.line), ib(a, 400);
- var j = b.text.length - (g.line - f.line) - 1;
- b.full ? ic(a) : f.line != g.line || 1 != b.text.length || Xe(a.doc, b) ? ic(a, f.line, g.line + 1, j) : jc(a, f.line, "text");
- var k = Rf(a, "changes"),
- l = Rf(a, "change");
- if (l || k) {
- var m = {
- from: f,
- to: g,
- text: b.text,
- removed: b.removed,
- origin: b.origin
- };
- l && Nf(a, "change", a, m), k && (a.curOp.changeObjs || (a.curOp.changeObjs = []))
- .push(m)
- }
- a.display.selForContextMenu = null
- }
-
- function nd(a, b, c, d, e) {
- if (d || (d = c), pa(d, c) < 0) {
- var f = d;
- d = c, c = f
- }
- "string" == typeof b && (b = a.splitLines(b)), hd(a, {
- from: c,
- to: d,
- text: b,
- origin: e
- })
- }
-
- function od(a, b) {
- if (!Pf(a, "scrollCursorIntoView")) {
- var c = a.display,
- d = c.sizer.getBoundingClientRect(),
- e = null;
- if (b.top + d.top < 0 ? e = !0 : b.bottom + d.top > (window.innerHeight || document.documentElement.clientHeight) && (e = !1), null != e && !l) {
- var f = pg("div", "\u200b", null, "position: absolute; top: " + (b.top - c.viewOffset - mb(a.display)) + "px; height: " + (b.bottom - b.top + pb(a) + c.barHeight) + "px; left: " + b.left + "px; width: 2px;");
- a.display.lineSpace.appendChild(f), f.scrollIntoView(e), a.display.lineSpace.removeChild(f)
- }
- }
- }
-
- function pd(a, b, c, d) {
- null == d && (d = 0);
- for (var e = 0; 5 > e; e++) {
- var f = !1,
- g = Lb(a, b),
- h = c && c != b ? Lb(a, c) : g,
- i = rd(a, Math.min(g.left, h.left), Math.min(g.top, h.top) - d, Math.max(g.left, h.left), Math.max(g.bottom, h.bottom) + d),
- j = a.doc.scrollTop,
- k = a.doc.scrollLeft;
- if (null != i.scrollTop && (Hc(a, i.scrollTop), Math.abs(a.doc.scrollTop - j) > 1 && (f = !0)), null != i.scrollLeft && (Ic(a, i.scrollLeft), Math.abs(a.doc.scrollLeft - k) > 1 && (f = !0)), !f) break
- }
- return g
- }
-
- function qd(a, b, c, d, e) {
- var f = rd(a, b, c, d, e);
- null != f.scrollTop && Hc(a, f.scrollTop), null != f.scrollLeft && Ic(a, f.scrollLeft)
- }
-
- function rd(a, b, c, d, e) {
- var f = a.display,
- g = Rb(a.display);
- 0 > c && (c = 0);
- var h = a.curOp && null != a.curOp.scrollTop ? a.curOp.scrollTop : f.scroller.scrollTop,
- i = rb(a),
- j = {};
- e - c > i && (e = c + i);
- var k = a.doc.height + nb(f),
- l = g > c,
- m = e > k - g;
- if (h > c) j.scrollTop = l ? 0 : c;
- else if (e > h + i) {
- var n = Math.min(c, (m ? k : e) - i);
- n != h && (j.scrollTop = n)
- }
- var o = a.curOp && null != a.curOp.scrollLeft ? a.curOp.scrollLeft : f.scroller.scrollLeft,
- p = qb(a) - (a.options.fixedGutter ? f.gutters.offsetWidth : 0),
- q = d - b > p;
- return q && (d = b + p), 10 > b ? j.scrollLeft = 0 : o > b ? j.scrollLeft = Math.max(0, b - (q ? 0 : 10)) : d > p + o - 3 && (j.scrollLeft = d + (q ? 0 : 10) - p), j
- }
-
- function sd(a, b, c) {
- (null != b || null != c) && ud(a), null != b && (a.curOp.scrollLeft = (null == a.curOp.scrollLeft ? a.doc.scrollLeft : a.curOp.scrollLeft) + b), null != c && (a.curOp.scrollTop = (null == a.curOp.scrollTop ? a.doc.scrollTop : a.curOp.scrollTop) + c)
- }
-
- function td(a) {
- ud(a);
- var b = a.getCursor(),
- c = b,
- d = b;
- a.options.lineWrapping || (c = b.ch ? oa(b.line, b.ch - 1) : b, d = oa(b.line, b.ch + 1)), a.curOp.scrollToPos = {
- from: c,
- to: d,
- margin: a.options.cursorScrollMargin,
- isCursor: !0
- }
- }
-
- function ud(a) {
- var b = a.curOp.scrollToPos;
- if (b) {
- a.curOp.scrollToPos = null;
- var c = Mb(a, b.from),
- d = Mb(a, b.to),
- e = rd(a, Math.min(c.left, d.left), Math.min(c.top, d.top) - b.margin, Math.max(c.right, d.right), Math.max(c.bottom, d.bottom) + b.margin);
- a.scrollTo(e.scrollLeft, e.scrollTop)
- }
- }
-
- function vd(a, b, c, d) {
- var f, e = a.doc;
- null == c && (c = "add"), "smart" == c && (e.mode.indent ? f = lb(a, b) : c = "prev");
- var g = a.options.tabSize,
- h = ff(e, b),
- i = Zf(h.text, null, g);
- h.stateAfter && (h.stateAfter = null);
- var k, j = h.text.match(/^\s*/)[0];
- if (d || /\S/.test(h.text)) {
- if ("smart" == c && (k = e.mode.indent(f, h.text.slice(j.length), h.text), k == Uf || k > 150)) {
- if (!d) return;
- c = "prev"
- }
- } else k = 0, c = "not";
- "prev" == c ? k = b > e.first ? Zf(ff(e, b - 1)
- .text, null, g) : 0 : "add" == c ? k = i + a.options.indentUnit : "subtract" == c ? k = i - a.options.indentUnit : "number" == typeof c && (k = i + c), k = Math.max(0, k);
- var l = "",
- m = 0;
- if (a.options.indentWithTabs)
- for (var n = Math.floor(k / g); n; --n) m += g, l += " ";
- if (k > m && (l += ag(k - m)), l != j) return nd(e, l, oa(b, 0), oa(b, j.length), "+input"), h.stateAfter = null, !0;
- for (var n = 0; n < e.sel.ranges.length; n++) {
- var o = e.sel.ranges[n];
- if (o.head.line == b && o.head.ch < j.length) {
- var m = oa(b, j.length);
- Va(e, n, new Ka(m, m));
- break
- }
- }
- }
-
- function wd(a, b, c, d) {
- var e = b,
- f = b;
- return "number" == typeof b ? f = ff(a, Na(a, b)) : e = kf(b), null == e ? null : (d(f, e) && a.cm && jc(a.cm, e, c), f)
- }
-
- function xd(a, b) {
- for (var c = a.doc.sel.ranges, d = [], e = 0; e < c.length; e++) {
- for (var f = b(c[e]); d.length && pa(f.from, bg(d)
- .to) <= 0;) {
- var g = d.pop();
- if (pa(g.from, f.from) < 0) {
- f.from = g.from;
- break
- }
- }
- d.push(f)
- }
- cc(a, function () {
- for (var b = d.length - 1; b >= 0; b--) nd(a.doc, "", d[b].from, d[b].to, "+delete");
- td(a)
- })
- }
-
- function yd(a, b, c, d, e) {
- function k() {
- var b = f + c;
- return b < a.first || b >= a.first + a.size ? j = !1 : (f = b, i = ff(a, b))
- }
-
- function l(a) {
- var b = (e ? $g : _g)(i, g, c, !0);
- if (null == b) {
- if (a || !k()) return j = !1;
- g = e ? (0 > c ? Sg : Rg)(i) : 0 > c ? i.text.length : 0
- } else g = b;
- return !0
- }
- var f = b.line,
- g = b.ch,
- h = c,
- i = ff(a, f),
- j = !0;
- if ("char" == d) l();
- else if ("column" == d) l(!0);
- else if ("word" == d || "group" == d)
- for (var m = null, n = "group" == d, o = a.cm && a.cm.getHelper(b, "wordChars"), p = !0; !(0 > c) || l(!p); p = !1) {
- var q = i.text.charAt(g) || "\n",
- r = lg(q, o) ? "w" : n && "\n" == q ? "n" : !n || /\s/.test(q) ? null : "p";
- if (!n || p || r || (r = "s"), m && m != r) {
- 0 > c && (c = 1, l());
- break
- }
- if (r && (m = r), c > 0 && !l(!p)) break
- }
- var s = cb(a, oa(f, g), h, !0);
- return j || (s.hitSide = !0), s
- }
-
- function zd(a, b, c, d) {
- var g, e = a.doc,
- f = b.left;
- if ("page" == d) {
- var h = Math.min(a.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
- g = b.top + c * (h - (0 > c ? 1.5 : .5) * Rb(a.display))
- } else "line" == d && (g = c > 0 ? b.bottom + 3 : b.top - 3);
- for (;;) {
- var i = Ob(a, f, g);
- if (!i.outside) break;
- if (0 > c ? 0 >= g : g >= e.height) {
- i.hitSide = !0;
- break
- }
- g += 5 * c
- }
- return i
- }
-
- function Cd(a, b, c, d) {
- v.defaults[a] = b, c && (Bd[a] = d ? function (a, b, d) {
- d != Dd && c(a, b, d)
- } : c)
- }
-
- function Nd(a) {
- for (var c, d, e, f, b = a.split(/-(?!$)/), a = b[b.length - 1], g = 0; g < b.length - 1; g++) {
- var h = b[g];
- if (/^(cmd|meta|m)$/i.test(h)) f = !0;
- else if (/^a(lt)?$/i.test(h)) c = !0;
- else if (/^(c|ctrl|control)$/i.test(h)) d = !0;
- else {
- if (!/^s(hift)$/i.test(h)) throw new Error("Unrecognized modifier name: " + h);
- e = !0
- }
- }
- return c && (a = "Alt-" + a), d && (a = "Ctrl-" + a), f && (a = "Cmd-" + a), e && (a = "Shift-" + a), a
- }
-
- function Rd(a) {
- return "string" == typeof a ? Md[a] : a
- }
-
- function Vd(a, b, c, d, e) {
- if (d && d.shared) return Xd(a, b, c, d, e);
- if (a.cm && !a.cm.curOp) return dc(a.cm, Vd)(a, b, c, d, e);
- var f = new Ud(a, e),
- g = pa(b, c);
- if (d && hg(d, f, !1), g > 0 || 0 == g && f.clearWhenEmpty !== !1) return f;
- if (f.replacedWith && (f.collapsed = !0, f.widgetNode = pg("span", [f.replacedWith], "CodeMirror-widget"), d.handleMouseEvents || f.widgetNode.setAttribute("cm-ignore-events", "true"), d.insertLeft && (f.widgetNode.insertLeft = !0)), f.collapsed) {
- if (re(a, b.line, b, c, f) || b.line != c.line && re(a, c.line, b, c, f)) throw new Error("Inserting collapsed marker partially overlapping an existing one");
- u = !0
- }
- f.addToHistory && sf(a, {
- from: b,
- to: c,
- origin: "markText"
- }, a.sel, NaN);
- var j, h = b.line,
- i = a.cm;
- if (a.iter(h, c.line + 1, function (a) {
- i && f.collapsed && !i.options.lineWrapping && se(a) == i.display.maxLine && (j = !0), f.collapsed && h != b.line && jf(a, 0), ce(a, new _d(f, h == b.line ? b.ch : null, h == c.line ? c.ch : null)), ++h
- }), f.collapsed && a.iter(b.line, c.line + 1, function (b) {
- we(a, b) && jf(b, 0)
- }), f.clearOnEnter && Jf(f, "beforeCursorEnter", function () {
- f.clear()
- }), f.readOnly && (t = !0, (a.history.done.length || a.history.undone.length) && a.clearHistory()), f.collapsed && (f.id = ++Td, f.atomic = !0), i) {
- if (j && (i.curOp.updateMaxLine = !0), f.collapsed) ic(i, b.line, c.line + 1);
- else if (f.className || f.title || f.startStyle || f.endStyle || f.css)
- for (var k = b.line; k <= c.line; k++) jc(i, k, "text");
- f.atomic && ab(i.doc), Nf(i, "markerAdded", i, f)
- }
- return f
- }
-
- function Xd(a, b, c, d, e) {
- d = hg(d), d.shared = !1;
- var f = [Vd(a, b, c, d, e)],
- g = f[0],
- h = d.widgetNode;
- return df(a, function (a) {
- h && (d.widgetNode = h.cloneNode(!0)), f.push(Vd(a, Oa(a, b), Oa(a, c), d, e));
- for (var i = 0; i < a.linked.length; ++i)
- if (a.linked[i].isParent) return;
- g = bg(f)
- }), new Wd(f, g)
- }
-
- function Yd(a) {
- return a.findMarks(oa(a.first, 0), a.clipPos(oa(a.lastLine())), function (a) {
- return a.parent
- })
- }
-
- function Zd(a, b) {
- for (var c = 0; c < b.length; c++) {
- var d = b[c],
- e = d.find(),
- f = a.clipPos(e.from),
- g = a.clipPos(e.to);
- if (pa(f, g)) {
- var h = Vd(a, f, g, d.primary, d.primary.type);
- d.markers.push(h), h.parent = d
- }
- }
- }
-
- function $d(a) {
- for (var b = 0; b < a.length; b++) {
- var c = a[b],
- d = [c.primary.doc];
- df(c.primary.doc, function (a) {
- d.push(a)
- });
- for (var e = 0; e < c.markers.length; e++) {
- var f = c.markers[e]; - 1 == dg(d, f.doc) && (f.parent = null, c.markers.splice(e--, 1))
- }
- }
- }
-
- function _d(a, b, c) {
- this.marker = a, this.from = b, this.to = c
- }
-
- function ae(a, b) {
- if (a)
- for (var c = 0; c < a.length; ++c) {
- var d = a[c];
- if (d.marker == b) return d
- }
- }
-
- function be(a, b) {
- for (var c, d = 0; d < a.length; ++d) a[d] != b && (c || (c = []))
- .push(a[d]);
- return c
- }
-
- function ce(a, b) {
- a.markedSpans = a.markedSpans ? a.markedSpans.concat([b]) : [b], b.marker.attachLine(a)
- }
-
- function de(a, b, c) {
- if (a)
- for (var e, d = 0; d < a.length; ++d) {
- var f = a[d],
- g = f.marker,
- h = null == f.from || (g.inclusiveLeft ? f.from <= b : f.from < b);
- if (h || f.from == b && "bookmark" == g.type && (!c || !f.marker.insertLeft)) {
- var i = null == f.to || (g.inclusiveRight ? f.to >= b : f.to > b);
- (e || (e = []))
- .push(new _d(g, f.from, i ? null : f.to))
- }
- }
- return e
- }
-
- function ee(a, b, c) {
- if (a)
- for (var e, d = 0; d < a.length; ++d) {
- var f = a[d],
- g = f.marker,
- h = null == f.to || (g.inclusiveRight ? f.to >= b : f.to > b);
- if (h || f.from == b && "bookmark" == g.type && (!c || f.marker.insertLeft)) {
- var i = null == f.from || (g.inclusiveLeft ? f.from <= b : f.from < b);
- (e || (e = []))
- .push(new _d(g, i ? null : f.from - b, null == f.to ? null : f.to - b))
- }
- }
- return e
- }
-
- function fe(a, b) {
- if (b.full) return null;
- var c = Qa(a, b.from.line) && ff(a, b.from.line)
- .markedSpans,
- d = Qa(a, b.to.line) && ff(a, b.to.line)
- .markedSpans;
- if (!c && !d) return null;
- var e = b.from.ch,
- f = b.to.ch,
- g = 0 == pa(b.from, b.to),
- h = de(c, e, g),
- i = ee(d, f, g),
- j = 1 == b.text.length,
- k = bg(b.text)
- .length + (j ? e : 0);
- if (h)
- for (var l = 0; l < h.length; ++l) {
- var m = h[l];
- if (null == m.to) {
- var n = ae(i, m.marker);
- n ? j && (m.to = null == n.to ? null : n.to + k) : m.to = e
- }
- }
- if (i)
- for (var l = 0; l < i.length; ++l) {
- var m = i[l];
- if (null != m.to && (m.to += k), null == m.from) {
- var n = ae(h, m.marker);
- n || (m.from = k, j && (h || (h = []))
- .push(m))
- } else m.from += k, j && (h || (h = []))
- .push(m)
- }
- h && (h = ge(h)), i && i != h && (i = ge(i));
- var o = [h];
- if (!j) {
- var q, p = b.text.length - 2;
- if (p > 0 && h)
- for (var l = 0; l < h.length; ++l) null == h[l].to && (q || (q = []))
- .push(new _d(h[l].marker, null, null));
- for (var l = 0; p > l; ++l) o.push(q);
- o.push(i)
- }
- return o
- }
-
- function ge(a) {
- for (var b = 0; b < a.length; ++b) {
- var c = a[b];
- null != c.from && c.from == c.to && c.marker.clearWhenEmpty !== !1 && a.splice(b--, 1)
- }
- return a.length ? a : null
- }
-
- function he(a, b) {
- var c = yf(a, b),
- d = fe(a, b);
- if (!c) return d;
- if (!d) return c;
- for (var e = 0; e < c.length; ++e) {
- var f = c[e],
- g = d[e];
- if (f && g) a: for (var h = 0; h < g.length; ++h) {
- for (var i = g[h], j = 0; j < f.length; ++j)
- if (f[j].marker == i.marker) continue a;
- f.push(i)
- } else g && (c[e] = g)
- }
- return c
- }
-
- function ie(a, b, c) {
- var d = null;
- if (a.iter(b.line, c.line + 1, function (a) {
- if (a.markedSpans)
- for (var b = 0; b < a.markedSpans.length; ++b) {
- var c = a.markedSpans[b].marker;
- !c.readOnly || d && -1 != dg(d, c) || (d || (d = []))
- .push(c)
- }
- }), !d) return null;
- for (var e = [{
- from: b,
- to: c
- }], f = 0; f < d.length; ++f)
- for (var g = d[f], h = g.find(0), i = 0; i < e.length; ++i) {
- var j = e[i];
- if (!(pa(j.to, h.from) < 0 || pa(j.from, h.to) > 0)) {
- var k = [i, 1],
- l = pa(j.from, h.from),
- m = pa(j.to, h.to);
- (0 > l || !g.inclusiveLeft && !l) && k.push({
- from: j.from,
- to: h.from
- }), (m > 0 || !g.inclusiveRight && !m) && k.push({
- from: h.to,
- to: j.to
- }), e.splice.apply(e, k), i += k.length - 1
- }
- }
- return e
- }
-
- function je(a) {
- var b = a.markedSpans;
- if (b) {
- for (var c = 0; c < b.length; ++c) b[c].marker.detachLine(a);
- a.markedSpans = null
- }
- }
-
- function ke(a, b) {
- if (b) {
- for (var c = 0; c < b.length; ++c) b[c].marker.attachLine(a);
- a.markedSpans = b
- }
- }
-
- function le(a) {
- return a.inclusiveLeft ? -1 : 0
- }
-
- function me(a) {
- return a.inclusiveRight ? 1 : 0
- }
-
- function ne(a, b) {
- var c = a.lines.length - b.lines.length;
- if (0 != c) return c;
- var d = a.find(),
- e = b.find(),
- f = pa(d.from, e.from) || le(a) - le(b);
- if (f) return -f;
- var g = pa(d.to, e.to) || me(a) - me(b);
- return g ? g : b.id - a.id
- }
-
- function oe(a, b) {
- var d, c = u && a.markedSpans;
- if (c)
- for (var e, f = 0; f < c.length; ++f) e = c[f], e.marker.collapsed && null == (b ? e.from : e.to) && (!d || ne(d, e.marker) < 0) && (d = e.marker);
- return d
- }
-
- function pe(a) {
- return oe(a, !0)
- }
-
- function qe(a) {
- return oe(a, !1)
- }
-
- function re(a, b, c, d, e) {
- var f = ff(a, b),
- g = u && f.markedSpans;
- if (g)
- for (var h = 0; h < g.length; ++h) {
- var i = g[h];
- if (i.marker.collapsed) {
- var j = i.marker.find(0),
- k = pa(j.from, c) || le(i.marker) - le(e),
- l = pa(j.to, d) || me(i.marker) - me(e);
- if (!(k >= 0 && 0 >= l || 0 >= k && l >= 0) && (0 >= k && (pa(j.to, c) > 0 || i.marker.inclusiveRight && e.inclusiveLeft) || k >= 0 && (pa(j.from, d) < 0 || i.marker.inclusiveLeft && e.inclusiveRight))) return !0
- }
- }
- }
-
- function se(a) {
- for (var b; b = pe(a);) a = b.find(-1, !0)
- .line;
- return a
- }
-
- function te(a) {
- for (var b, c; b = qe(a);) a = b.find(1, !0)
- .line, (c || (c = []))
- .push(a);
- return c
- }
-
- function ue(a, b) {
- var c = ff(a, b),
- d = se(c);
- return c == d ? b : kf(d)
- }
-
- function ve(a, b) {
- if (b > a.lastLine()) return b;
- var d, c = ff(a, b);
- if (!we(a, c)) return b;
- for (; d = qe(c);) c = d.find(1, !0)
- .line;
- return kf(c) + 1
- }
-
- function we(a, b) {
- var c = u && b.markedSpans;
- if (c)
- for (var d, e = 0; e < c.length; ++e)
- if (d = c[e], d.marker.collapsed) {
- if (null == d.from) return !0;
- if (!d.marker.widgetNode && 0 == d.from && d.marker.inclusiveLeft && xe(a, b, d)) return !0
- }
- }
-
- function xe(a, b, c) {
- if (null == c.to) {
- var d = c.marker.find(1, !0);
- return xe(a, d.line, ae(d.line.markedSpans, c.marker))
- }
- if (c.marker.inclusiveRight && c.to == b.text.length) return !0;
- for (var e, f = 0; f < b.markedSpans.length; ++f)
- if (e = b.markedSpans[f], e.marker.collapsed && !e.marker.widgetNode && e.from == c.to && (null == e.to || e.to != c.from) && (e.marker.inclusiveLeft || c.marker.inclusiveRight) && xe(a, b, e)) return !0
- }
-
- function ze(a, b, c) {
- mf(b) < (a.curOp && a.curOp.scrollTop || a.doc.scrollTop) && sd(a, null, c)
- }
-
- function Ae(a) {
- if (null != a.height) return a.height;
- var b = a.doc.cm;
- if (!b) return 0;
- if (!tg(document.body, a.node)) {
- var c = "position: relative;";
- a.coverGutter && (c += "margin-left: -" + b.display.gutters.offsetWidth + "px;"), a.noHScroll && (c += "width: " + b.display.wrapper.clientWidth + "px;"), sg(b.display.measure, pg("div", [a.node], null, c))
- }
- return a.height = a.node.offsetHeight
- }
-
- function Be(a, b, c, d) {
- var e = new ye(a, c, d),
- f = a.cm;
- return f && e.noHScroll && (f.display.alignWidgets = !0), wd(a, b, "widget", function (b) {
- var c = b.widgets || (b.widgets = []);
- if (null == e.insertAt ? c.push(e) : c.splice(Math.min(c.length - 1, Math.max(0, e.insertAt)), 0, e), e.line = b, f && !we(a, b)) {
- var d = mf(b) < a.scrollTop;
- jf(b, b.height + Ae(e)), d && sd(f, null, e.height), f.curOp.forceUpdate = !0
- }
- return !0
- }), e
- }
-
- function De(a, b, c, d) {
- a.text = b, a.stateAfter && (a.stateAfter = null), a.styles && (a.styles = null), null != a.order && (a.order = null), je(a), ke(a, c);
- var e = d ? d(a) : 1;
- e != a.height && jf(a, e)
- }
-
- function Ee(a) {
- a.parent = null, je(a)
- }
-
- function Fe(a, b) {
- if (a)
- for (;;) {
- var c = a.match(/(?:^|\s+)line-(background-)?(\S+)/);
- if (!c) break;
- a = a.slice(0, c.index) + a.slice(c.index + c[0].length);
- var d = c[1] ? "bgClass" : "textClass";
- null == b[d] ? b[d] = c[2] : new RegExp("(?:^|s)" + c[2] + "(?:$|s)")
- .test(b[d]) || (b[d] += " " + c[2])
- }
- return a
- }
-
- function Ge(a, b) {
- if (a.blankLine) return a.blankLine(b);
- if (a.innerMode) {
- var c = v.innerMode(a, b);
- return c.mode.blankLine ? c.mode.blankLine(c.state) : void 0
- }
- }
-
- function He(a, b, c, d) {
- for (var e = 0; 10 > e; e++) {
- d && (d[0] = v.innerMode(a, c)
- .mode);
- var f = a.token(b, c);
- if (b.pos > b.start) return f
- }
- throw new Error("Mode " + a.name + " failed to advance stream.")
- }
-
- function Ie(a, b, c, d) {
- function e(a) {
- return {
- start: k.start,
- end: k.pos,
- string: k.current(),
- type: h || null,
- state: a ? Jd(f.mode, j) : j
- }
- }
- var h, f = a.doc,
- g = f.mode;
- b = Oa(f, b);
- var l, i = ff(f, b.line),
- j = lb(a, b.line, c),
- k = new Sd(i.text, a.options.tabSize);
- for (d && (l = []);
- (d || k.pos < b.ch) && !k.eol();) k.start = k.pos, h = He(g, k, j), d && l.push(e(!0));
- return d ? l : e()
- }
-
- function Je(a, b, c, d, e, f, g) {
- var h = c.flattenSpans;
- null == h && (h = a.options.flattenSpans);
- var l, i = 0,
- j = null,
- k = new Sd(b, a.options.tabSize),
- m = a.options.addModeClass && [null];
- for ("" == b && Fe(Ge(c, d), f); !k.eol();) {
- if (k.pos > a.options.maxHighlightLength ? (h = !1, g && Me(a, b, d, k.pos), k.pos = b.length, l = null) : l = Fe(He(c, k, d, m), f), m) {
- var n = m[0].name;
- n && (l = "m-" + (l ? n + " " + l : n))
- }
- if (!h || j != l) {
- for (; i < k.start;) i = Math.min(k.start, i + 5e4), e(i, j);
- j = l
- }
- k.start = k.pos
- }
- for (; i < k.pos;) {
- var o = Math.min(k.pos, i + 5e4);
- e(o, j), i = o
- }
- }
-
- function Ke(a, b, c, d) {
- var e = [a.state.modeGen],
- f = {};
- Je(a, b.text, a.doc.mode, c, function (a, b) {
- e.push(a, b)
- }, f, d);
- for (var g = 0; g < a.state.overlays.length; ++g) {
- var h = a.state.overlays[g],
- i = 1,
- j = 0;
- Je(a, b.text, h.mode, !0, function (a, b) {
- for (var c = i; a > j;) {
- var d = e[i];
- d > a && e.splice(i, 1, a, e[i + 1], d), i += 2, j = Math.min(a, d)
- }
- if (b)
- if (h.opaque) e.splice(c, i - c, a, "cm-overlay " + b), i = c + 2;
- else
- for (; i > c; c += 2) {
- var f = e[c + 1];
- e[c + 1] = (f ? f + " " : "") + "cm-overlay " + b
- }
- }, f)
- }
- return {
- styles: e,
- classes: f.bgClass || f.textClass ? f : null
- }
- }
-
- function Le(a, b, c) {
- if (!b.styles || b.styles[0] != a.state.modeGen) {
- var d = lb(a, kf(b)),
- e = Ke(a, b, b.text.length > a.options.maxHighlightLength ? Jd(a.doc.mode, d) : d);
- b.stateAfter = d, b.styles = e.styles, e.classes ? b.styleClasses = e.classes : b.styleClasses && (b.styleClasses = null), c === a.doc.frontier && a.doc.frontier++
- }
- return b.styles
- }
-
- function Me(a, b, c, d) {
- var e = a.doc.mode,
- f = new Sd(b, a.options.tabSize);
- for (f.start = f.pos = d || 0, "" == b && Ge(e, c); !f.eol();) He(e, f, c), f.start = f.pos
- }
-
- function Pe(a, b) {
- if (!a || /^\s*$/.test(a)) return null;
- var c = b.addModeClass ? Oe : Ne;
- return c[a] || (c[a] = a.replace(/\S+/g, "cm-$&"))
- }
-
- function Qe(a, b) {
- var c = pg("span", null, null, f ? "padding-right: .1px" : null),
- e = {
- pre: pg("pre", [c], "CodeMirror-line"),
- content: c,
- col: 0,
- pos: 0,
- cm: a,
- splitSpaces: (d || f) && a.getOption("lineWrapping")
- };
- b.measure = {};
- for (var g = 0; g <= (b.rest ? b.rest.length : 0); g++) {
- var i, h = g ? b.rest[g - 1] : b.line;
- e.pos = 0, e.addToken = Se, Hg(a.display.measure) && (i = nf(h)) && (e.addToken = Ue(e.addToken, i)), e.map = [];
- var j = b != a.display.externalMeasured && kf(h);
- We(h, e, Le(a, h, j)), h.styleClasses && (h.styleClasses.bgClass && (e.bgClass = yg(h.styleClasses.bgClass, e.bgClass || "")), h.styleClasses.textClass && (e.textClass = yg(h.styleClasses.textClass, e.textClass || ""))), 0 == e.map.length && e.map.push(0, 0, e.content.appendChild(Fg(a.display.measure))), 0 == g ? (b.measure.map = e.map, b.measure.cache = {}) : ((b.measure.maps || (b.measure.maps = []))
- .push(e.map), (b.measure.caches || (b.measure.caches = []))
- .push({}))
- }
- return f && /\bcm-tab\b/.test(e.content.lastChild.className) && (e.content.className = "cm-tab-wrap-hack"), Lf(a, "renderLine", a, b.line, e.pre), e.pre.className && (e.textClass = yg(e.pre.className, e.textClass || "")), e
- }
-
- function Re(a) {
- var b = pg("span", "\u2022", "cm-invalidchar");
- return b.title = "\\u" + a.charCodeAt(0)
- .toString(16), b.setAttribute("aria-label", b.title), b
- }
-
- function Se(a, b, c, f, g, h, i) {
- if (b) {
- var j = a.splitSpaces ? b.replace(/ {3,}/g, Te) : b,
- k = a.cm.state.specialChars,
- l = !1;
- if (k.test(b))
- for (var m = document.createDocumentFragment(), n = 0;;) {
- k.lastIndex = n;
- var o = k.exec(b),
- p = o ? o.index - n : b.length - n;
- if (p) {
- var q = document.createTextNode(j.slice(n, n + p));
- d && 9 > e ? m.appendChild(pg("span", [q])) : m.appendChild(q), a.map.push(a.pos, a.pos + p, q), a.col += p, a.pos += p
- }
- if (!o) break;
- if (n += p + 1, " " == o[0]) {
- var r = a.cm.options.tabSize,
- s = r - a.col % r,
- q = m.appendChild(pg("span", ag(s), "cm-tab"));
- q.setAttribute("role", "presentation"), q.setAttribute("cm-text", " "), a.col += s
- } else if ("\r" == o[0] || "\n" == o[0]) {
- var q = m.appendChild(pg("span", "\r" == o[0] ? "\u240d" : "\u2424", "cm-invalidchar"));
- q.setAttribute("cm-text", o[0]), a.col += 1
- } else {
- var q = a.cm.options.specialCharPlaceholder(o[0]);
- q.setAttribute("cm-text", o[0]), d && 9 > e ? m.appendChild(pg("span", [q])) : m.appendChild(q), a.col += 1
- }
- a.map.push(a.pos, a.pos + 1, q), a.pos++
- } else {
- a.col += b.length;
- var m = document.createTextNode(j);
- a.map.push(a.pos, a.pos + b.length, m), d && 9 > e && (l = !0), a.pos += b.length
- }
- if (c || f || g || l || i) {
- var t = c || "";
- f && (t += f), g && (t += g);
- var u = pg("span", [m], t, i);
- return h && (u.title = h), a.content.appendChild(u)
- }
- a.content.appendChild(m)
- }
- }
-
- function Te(a) {
- for (var b = " ", c = 0; c < a.length - 2; ++c) b += c % 2 ? " " : "\xa0";
- return b += " "
- }
-
- function Ue(a, b) {
- return function (c, d, e, f, g, h, i) {
- e = e ? e + " cm-force-border" : "cm-force-border";
- for (var j = c.pos, k = j + d.length;;) {
- for (var l = 0; l < b.length; l++) {
- var m = b[l];
- if (m.to > j && m.from <= j) break
- }
- if (m.to >= k) return a(c, d, e, f, g, h, i);
- a(c, d.slice(0, m.to - j), e, f, null, h, i), f = null, d = d.slice(m.to - j), j = m.to
- }
- }
- }
-
- function Ve(a, b, c, d) {
- var e = !d && c.widgetNode;
- e && a.map.push(a.pos, a.pos + b, e), !d && a.cm.display.input.needsContentAttribute && (e || (e = a.content.appendChild(document.createElement("span"))), e.setAttribute("cm-marker", c.id)), e && (a.cm.display.input.setUneditable(e), a.content.appendChild(e)), a.pos += b
- }
-
- function We(a, b, c) {
- var d = a.markedSpans,
- e = a.text,
- f = 0;
- if (d)
- for (var k, l, n, o, p, q, r, h = e.length, i = 0, g = 1, j = "", m = 0;;) {
- if (m == i) {
- n = o = p = q = l = "", r = null, m = 1 / 0;
- for (var s = [], t = 0; t < d.length; ++t) {
- var u = d[t],
- v = u.marker;
- "bookmark" == v.type && u.from == i && v.widgetNode ? s.push(v) : u.from <= i && (null == u.to || u.to > i || v.collapsed && u.to == i && u.from == i) ? (null != u.to && u.to != i && m > u.to && (m = u.to, o = ""), v.className && (n += " " + v.className), v.css && (l = v.css), v.startStyle && u.from == i && (p += " " + v.startStyle), v.endStyle && u.to == m && (o += " " + v.endStyle), v.title && !q && (q = v.title), v.collapsed && (!r || ne(r.marker, v) < 0) && (r = u)) : u.from > i && m > u.from && (m = u.from)
- }
- if (r && (r.from || 0) == i) {
- if (Ve(b, (null == r.to ? h + 1 : r.to) - i, r.marker, null == r.from), null == r.to) return;
- r.to == i && (r = !1)
- }
- if (!r && s.length)
- for (var t = 0; t < s.length; ++t) Ve(b, 0, s[t])
- }
- if (i >= h) break;
- for (var w = Math.min(h, m);;) {
- if (j) {
- var x = i + j.length;
- if (!r) {
- var y = x > w ? j.slice(0, w - i) : j;
- b.addToken(b, y, k ? k + n : n, p, i + y.length == m ? o : "", q, l)
- }
- if (x >= w) {
- j = j.slice(w - i), i = w;
- break
- }
- i = x, p = ""
- }
- j = e.slice(f, f = c[g++]), k = Pe(c[g++], b.cm.options)
- }
- } else
- for (var g = 1; g < c.length; g += 2) b.addToken(b, e.slice(f, f = c[g]), Pe(c[g + 1], b.cm.options))
- }
-
- function Xe(a, b) {
- return 0 == b.from.ch && 0 == b.to.ch && "" == bg(b.text) && (!a.cm || a.cm.options.wholeLineUpdateBefore)
- }
-
- function Ye(a, b, c, d) {
- function e(a) {
- return c ? c[a] : null
- }
-
- function f(a, c, e) {
- De(a, c, e, d), Nf(a, "change", a, b)
- }
-
- function g(a, b) {
- for (var c = a, f = []; b > c; ++c) f.push(new Ce(j[c], e(c), d));
- return f
- }
- var h = b.from,
- i = b.to,
- j = b.text,
- k = ff(a, h.line),
- l = ff(a, i.line),
- m = bg(j),
- n = e(j.length - 1),
- o = i.line - h.line;
- if (b.full) a.insert(0, g(0, j.length)), a.remove(j.length, a.size - j.length);
- else if (Xe(a, b)) {
- var p = g(0, j.length - 1);
- f(l, l.text, n), o && a.remove(h.line, o), p.length && a.insert(h.line, p)
- } else if (k == l)
- if (1 == j.length) f(k, k.text.slice(0, h.ch) + m + k.text.slice(i.ch), n);
- else {
- var p = g(1, j.length - 1);
- p.push(new Ce(m + k.text.slice(i.ch), n, d)), f(k, k.text.slice(0, h.ch) + j[0], e(0)), a.insert(h.line + 1, p)
- } else if (1 == j.length) f(k, k.text.slice(0, h.ch) + j[0] + l.text.slice(i.ch), e(0)), a.remove(h.line + 1, o);
- else {
- f(k, k.text.slice(0, h.ch) + j[0], e(0)), f(l, m + l.text.slice(i.ch), n);
- var p = g(1, j.length - 1);
- o > 1 && a.remove(h.line + 1, o - 1), a.insert(h.line + 1, p)
- }
- Nf(a, "change", a, b)
- }
-
- function Ze(a) {
- this.lines = a, this.parent = null;
- for (var b = 0, c = 0; b < a.length; ++b) a[b].parent = this, c += a[b].height;
- this.height = c
- }
-
- function $e(a) {
- this.children = a;
- for (var b = 0, c = 0, d = 0; d < a.length; ++d) {
- var e = a[d];
- b += e.chunkSize(), c += e.height, e.parent = this
- }
- this.size = b, this.height = c, this.parent = null
- }
-
- function df(a, b, c) {
- function d(a, e, f) {
- if (a.linked)
- for (var g = 0; g < a.linked.length; ++g) {
- var h = a.linked[g];
- if (h.doc != e) {
- var i = f && h.sharedHist;
- (!c || i) && (b(h.doc, i), d(h.doc, a, i))
- }
- }
- }
- d(a, null, !0)
- }
-
- function ef(a, b) {
- if (b.cm) throw new Error("This document is already in use.");
- a.doc = b, b.cm = a, B(a), x(a), a.options.lineWrapping || H(a), a.options.mode = b.modeOption, ic(a)
- }
-
- function ff(a, b) {
- if (b -= a.first, 0 > b || b >= a.size) throw new Error("There is no line " + (b + a.first) + " in the document.");
- for (var c = a; !c.lines;)
- for (var d = 0;; ++d) {
- var e = c.children[d],
- f = e.chunkSize();
- if (f > b) {
- c = e;
- break
- }
- b -= f
- }
- return c.lines[b]
- }
-
- function gf(a, b, c) {
- var d = [],
- e = b.line;
- return a.iter(b.line, c.line + 1, function (a) {
- var f = a.text;
- e == c.line && (f = f.slice(0, c.ch)), e == b.line && (f = f.slice(b.ch)), d.push(f), ++e
- }), d
- }
-
- function hf(a, b, c) {
- var d = [];
- return a.iter(b, c, function (a) {
- d.push(a.text)
- }), d
- }
-
- function jf(a, b) {
- var c = b - a.height;
- if (c)
- for (var d = a; d; d = d.parent) d.height += c
- }
-
- function kf(a) {
- if (null == a.parent) return null;
- for (var b = a.parent, c = dg(b.lines, a), d = b.parent; d; b = d, d = d.parent)
- for (var e = 0; d.children[e] != b; ++e) c += d.children[e].chunkSize();
- return c + b.first
- }
-
- function lf(a, b) {
- var c = a.first;
- a: do {
- for (var d = 0; d < a.children.length; ++d) {
- var e = a.children[d],
- f = e.height;
- if (f > b) {
- a = e;
- continue a
- }
- b -= f, c += e.chunkSize()
- }
- return c
- } while (!a.lines);
- for (var d = 0; d < a.lines.length; ++d) {
- var g = a.lines[d],
- h = g.height;
- if (h > b) break;
- b -= h
- }
- return c + d
- }
-
- function mf(a) {
- a = se(a);
- for (var b = 0, c = a.parent, d = 0; d < c.lines.length; ++d) {
- var e = c.lines[d];
- if (e == a) break;
- b += e.height
- }
- for (var f = c.parent; f; c = f, f = c.parent)
- for (var d = 0; d < f.children.length; ++d) {
- var g = f.children[d];
- if (g == c) break;
- b += g.height
- }
- return b
- }
-
- function nf(a) {
- var b = a.order;
- return null == b && (b = a.order = ah(a.text)), b
- }
-
- function of(a) {
- this.done = [], this.undone = [], this.undoDepth = 1 / 0, this.lastModTime = this.lastSelTime = 0, this.lastOp = this.lastSelOp = null, this.lastOrigin = this.lastSelOrigin = null, this.generation = this.maxGeneration = a || 1
- }
-
- function pf(a, b) {
- var c = {
- from: qa(b.from),
- to: bd(b),
- text: gf(a, b.from, b.to)
- };
- return wf(a, c, b.from.line, b.to.line + 1), df(a, function (a) {
- wf(a, c, b.from.line, b.to.line + 1)
- }, !0), c
- }
-
- function qf(a) {
- for (; a.length;) {
- var b = bg(a);
- if (!b.ranges) break;
- a.pop()
- }
- }
-
- function rf(a, b) {
- return b ? (qf(a.done), bg(a.done)) : a.done.length && !bg(a.done)
- .ranges ? bg(a.done) : a.done.length > 1 && !a.done[a.done.length - 2].ranges ? (a.done.pop(), bg(a.done)) : void 0
- }
-
- function sf(a, b, c, d) {
- var e = a.history;
- e.undone.length = 0;
- var g, f = +new Date;
- if ((e.lastOp == d || e.lastOrigin == b.origin && b.origin && ("+" == b.origin.charAt(0) && a.cm && e.lastModTime > f - a.cm.options.historyEventDelay || "*" == b.origin.charAt(0))) && (g = rf(e, e.lastOp == d))) {
- var h = bg(g.changes);
- 0 == pa(b.from, b.to) && 0 == pa(b.from, h.to) ? h.to = bd(b) : g.changes.push(pf(a, b))
- } else {
- var i = bg(e.done);
- for (i && i.ranges || vf(a.sel, e.done), g = {
- changes: [pf(a, b)],
- generation: e.generation
- }, e.done.push(g); e.done.length > e.undoDepth;) e.done.shift(), e.done[0].ranges || e.done.shift()
- }
- e.done.push(c), e.generation = ++e.maxGeneration, e.lastModTime = e.lastSelTime = f, e.lastOp = e.lastSelOp = d, e.lastOrigin = e.lastSelOrigin = b.origin, h || Lf(a, "historyAdded")
- }
-
- function tf(a, b, c, d) {
- var e = b.charAt(0);
- return "*" == e || "+" == e && c.ranges.length == d.ranges.length && c.somethingSelected() == d.somethingSelected() && new Date - a.history.lastSelTime <= (a.cm ? a.cm.options.historyEventDelay : 500)
- }
-
- function uf(a, b, c, d) {
- var e = a.history,
- f = d && d.origin;
- c == e.lastSelOp || f && e.lastSelOrigin == f && (e.lastModTime == e.lastSelTime && e.lastOrigin == f || tf(a, f, bg(e.done), b)) ? e.done[e.done.length - 1] = b : vf(b, e.done), e.lastSelTime = +new Date, e.lastSelOrigin = f, e.lastSelOp = c, d && d.clearRedo !== !1 && qf(e.undone)
- }
-
- function vf(a, b) {
- var c = bg(b);
- c && c.ranges && c.equals(a) || b.push(a)
- }
-
- function wf(a, b, c, d) {
- var e = b["spans_" + a.id],
- f = 0;
- a.iter(Math.max(a.first, c), Math.min(a.first + a.size, d), function (c) {
- c.markedSpans && ((e || (e = b["spans_" + a.id] = {}))[f] = c.markedSpans), ++f
- })
- }
-
- function xf(a) {
- if (!a) return null;
- for (var c, b = 0; b < a.length; ++b) a[b].marker.explicitlyCleared ? c || (c = a.slice(0, b)) : c && c.push(a[b]);
- return c ? c.length ? c : null : a
- }
-
- function yf(a, b) {
- var c = b["spans_" + a.id];
- if (!c) return null;
- for (var d = 0, e = []; d < b.text.length; ++d) e.push(xf(c[d]));
- return e
- }
-
- function zf(a, b, c) {
- for (var d = 0, e = []; d < a.length; ++d) {
- var f = a[d];
- if (f.ranges) e.push(c ? Ja.prototype.deepCopy.call(f) : f);
- else {
- var g = f.changes,
- h = [];
- e.push({
- changes: h
- });
- for (var i = 0; i < g.length; ++i) {
- var k, j = g[i];
- if (h.push({
- from: j.from,
- to: j.to,
- text: j.text
- }), b)
- for (var l in j)(k = l.match(/^spans_(\d+)$/)) && dg(b, Number(k[1])) > -1 && (bg(h)[l] = j[l], delete j[l])
- }
- }
- }
- return e
- }
-
- function Af(a, b, c, d) {
- c < a.line ? a.line += d : b < a.line && (a.line = b, a.ch = 0)
- }
-
- function Bf(a, b, c, d) {
- for (var e = 0; e < a.length; ++e) {
- var f = a[e],
- g = !0;
- if (f.ranges) {
- f.copied || (f = a[e] = f.deepCopy(), f.copied = !0);
- for (var h = 0; h < f.ranges.length; h++) Af(f.ranges[h].anchor, b, c, d), Af(f.ranges[h].head, b, c, d)
- } else {
- for (var h = 0; h < f.changes.length; ++h) {
- var i = f.changes[h];
- if (c < i.from.line) i.from = oa(i.from.line + d, i.from.ch), i.to = oa(i.to.line + d, i.to.ch);
- else if (b <= i.to.line) {
- g = !1;
- break
- }
- }
- g || (a.splice(0, e + 1), e = 0)
- }
- }
- }
-
- function Cf(a, b) {
- var c = b.from.line,
- d = b.to.line,
- e = b.text.length - (d - c) - 1;
- Bf(a.done, c, d, e), Bf(a.undone, c, d, e)
- }
-
- function Ff(a) {
- return null != a.defaultPrevented ? a.defaultPrevented : 0 == a.returnValue
- }
-
- function Hf(a) {
- return a.target || a.srcElement
- }
-
- function If(a) {
- var b = a.which;
- return null == b && (1 & a.button ? b = 1 : 2 & a.button ? b = 3 : 4 & a.button && (b = 2)), o && a.ctrlKey && 1 == b && (b = 3), b
- }
-
- function Nf(a, b) {
- function f(a) {
- return function () {
- a.apply(null, d)
- }
- }
- var c = a._handlers && a._handlers[b];
- if (c) {
- var e, d = Array.prototype.slice.call(arguments, 2);
- Tb ? e = Tb.delayedCallbacks : Mf ? e = Mf : (e = Mf = [], setTimeout(Of, 0));
- for (var g = 0; g < c.length; ++g) e.push(f(c[g]))
- }
- }
-
- function Of() {
- var a = Mf;
- Mf = null;
- for (var b = 0; b < a.length; ++b) a[b]()
- }
-
- function Pf(a, b, c) {
- return "string" == typeof b && (b = {
- type: b,
- preventDefault: function () {
- this.defaultPrevented = !0
- }
- }), Lf(a, c || b.type, a, b), Ff(b) || b.codemirrorIgnore
- }
-
- function Qf(a) {
- var b = a._handlers && a._handlers.cursorActivity;
- if (b)
- for (var c = a.curOp.cursorActivityHandlers || (a.curOp.cursorActivityHandlers = []), d = 0; d < b.length; ++d) - 1 == dg(c, b[d]) && c.push(b[d])
- }
-
- function Rf(a, b) {
- var c = a._handlers && a._handlers[b];
- return c && c.length > 0
- }
-
- function Sf(a) {
- a.prototype.on = function (a, b) {
- Jf(this, a, b)
- }, a.prototype.off = function (a, b) {
- Kf(this, a, b)
- }
- }
-
- function Yf() {
- this.id = null
- }
-
- function ag(a) {
- for (; _f.length <= a;) _f.push(bg(_f) + " ");
- return _f[a]
- }
-
- function bg(a) {
- return a[a.length - 1]
- }
-
- function dg(a, b) {
- for (var c = 0; c < a.length; ++c)
- if (a[c] == b) return c;
- return -1
- }
-
- function eg(a, b) {
- for (var c = [], d = 0; d < a.length; d++) c[d] = b(a[d], d);
- return c
- }
-
- function fg() {}
-
- function gg(a, b) {
- var c;
- return Object.create ? c = Object.create(a) : (fg.prototype = a, c = new fg), b && hg(b, c), c
- }
-
- function hg(a, b, c) {
- b || (b = {});
- for (var d in a) !a.hasOwnProperty(d) || c === !1 && b.hasOwnProperty(d) || (b[d] = a[d]);
- return b
- }
-
- function ig(a) {
- var b = Array.prototype.slice.call(arguments, 1);
- return function () {
- return a.apply(null, b)
- }
- }
-
- function lg(a, b) {
- return b ? b.source.indexOf("\\w") > -1 && kg(a) ? !0 : b.test(a) : kg(a)
- }
-
- function mg(a) {
- for (var b in a)
- if (a.hasOwnProperty(b) && a[b]) return !1;
- return !0
- }
-
- function og(a) {
- return a.charCodeAt(0) >= 768 && ng.test(a)
- }
-
- function pg(a, b, c, d) {
- var e = document.createElement(a);
- if (c && (e.className = c), d && (e.style.cssText = d), "string" == typeof b) e.appendChild(document.createTextNode(b));
- else if (b)
- for (var f = 0; f < b.length; ++f) e.appendChild(b[f]);
- return e
- }
-
- function rg(a) {
- for (var b = a.childNodes.length; b > 0; --b) a.removeChild(a.firstChild);
- return a
- }
-
- function sg(a, b) {
- return rg(a)
- .appendChild(b)
- }
-
- function ug() {
- for (var a = document.activeElement; a && a.root && a.root.activeElement;) a = a.root.activeElement;
- return a
- }
-
- function vg(a) {
- return new RegExp("(^|\\s)" + a + "(?:$|\\s)\\s*")
- }
-
- function yg(a, b) {
- for (var c = a.split(" "), d = 0; d < c.length; d++) c[d] && !vg(c[d])
- .test(b) && (b += " " + c[d]);
- return b
- }
-
- function zg(a) {
- if (document.body.getElementsByClassName)
- for (var b = document.body.getElementsByClassName("CodeMirror"), c = 0; c < b.length; c++) {
- var d = b[c].CodeMirror;
- d && a(d)
- }
- }
-
- function Bg() {
- Ag || (Cg(), Ag = !0)
- }
-
- function Cg() {
- var a;
- Jf(window, "resize", function () {
- null == a && (a = setTimeout(function () {
- a = null, zg(rc)
- }, 100))
- }), Jf(window, "blur", function () {
- zg($c)
- })
- }
-
- function Fg(a) {
- if (null == Eg) {
- var b = pg("span", "\u200b");
- sg(a, pg("span", [b, document.createTextNode("x")])), 0 != a.firstChild.offsetHeight && (Eg = b.offsetWidth <= 1 && b.offsetHeight > 2 && !(d && 8 > e))
- }
- var c = Eg ? pg("span", "\u200b") : pg("span", "\xa0", null, "display: inline-block; width: 1px; margin-right: -1px");
- return c.setAttribute("cm-text", ""), c
- }
-
- function Hg(a) {
- if (oldff) return false;
- if (null != Gg) return Gg;
- var b = sg(a, document.createTextNode("A\u062eA")),
- c = qg(b, 0, 1)
- .getBoundingClientRect();
- if (!c || c.left == c.right) return !1;
- var d = qg(b, 1, 2)
- .getBoundingClientRect();
- return Gg = d.right - c.right < 3
- }
-
- function Mg(a) {
- if (null != Lg) return Lg;
- var b = sg(a, pg("span", "x")),
- c = b.getBoundingClientRect(),
- d = qg(b, 0, 1)
- .getBoundingClientRect();
- return Lg = Math.abs(c.left - d.left) > 1
- }
-
- function Og(a, b, c, d) {
- if (!a) return d(b, c, "ltr");
- for (var e = !1, f = 0; f < a.length; ++f) {
- var g = a[f];
- (g.from < c && g.to > b || b == c && g.to == b) && (d(Math.max(g.from, b), Math.min(g.to, c), 1 == g.level ? "rtl" : "ltr"), e = !0)
- }
- e || d(b, c, "ltr")
- }
-
- function Pg(a) {
- return a.level % 2 ? a.to : a.from
- }
-
- function Qg(a) {
- return a.level % 2 ? a.from : a.to
- }
-
- function Rg(a) {
- var b = nf(a);
- return b ? Pg(b[0]) : 0
- }
-
- function Sg(a) {
- var b = nf(a);
- return b ? Qg(bg(b)) : a.text.length
- }
-
- function Tg(a, b) {
- var c = ff(a.doc, b),
- d = se(c);
- d != c && (b = kf(d));
- var e = nf(d),
- f = e ? e[0].level % 2 ? Sg(d) : Rg(d) : 0;
- return oa(b, f)
- }
-
- function Ug(a, b) {
- for (var c, d = ff(a.doc, b); c = qe(d);) d = c.find(1, !0)
- .line, b = null;
- var e = nf(d),
- f = e ? e[0].level % 2 ? Rg(d) : Sg(d) : d.text.length;
- return oa(null == b ? kf(d) : b, f)
- }
-
- function Vg(a, b) {
- var c = Tg(a, b.line),
- d = ff(a.doc, c.line),
- e = nf(d);
- if (!e || 0 == e[0].level) {
- var f = Math.max(0, d.text.search(/\S/)),
- g = b.line == c.line && b.ch <= f && b.ch;
- return oa(c.line, g ? 0 : f)
- }
- return c
- }
-
- function Wg(a, b, c) {
- var d = a[0].level;
- return b == d ? !0 : c == d ? !1 : c > b
- }
-
- function Yg(a, b) {
- Xg = null;
- for (var d, c = 0; c < a.length; ++c) {
- var e = a[c];
- if (e.from < b && e.to > b) return c;
- if (e.from == b || e.to == b) {
- if (null != d) return Wg(a, e.level, a[d].level) ? (e.from != e.to && (Xg = d), c) : (e.from != e.to && (Xg = c), d);
- d = c
- }
- }
- return d
- }
-
- function Zg(a, b, c, d) {
- if (!d) return b + c;
- do b += c; while (b > 0 && og(a.text.charAt(b)));
- return b
- }
-
- function $g(a, b, c, d) {
- var e = nf(a);
- if (!e) return _g(a, b, c, d);
- for (var f = Yg(e, b), g = e[f], h = Zg(a, b, g.level % 2 ? -c : c, d);;) {
- if (h > g.from && h < g.to) return h;
- if (h == g.from || h == g.to) return Yg(e, h) == f ? h : (g = e[f += c], c > 0 == g.level % 2 ? g.to : g.from);
- if (g = e[f += c], !g) return null;
- h = c > 0 == g.level % 2 ? Zg(a, g.to, -1, d) : Zg(a, g.from, 1, d)
- }
- }
-
- function _g(a, b, c, d) {
- var e = b + c;
- if (d)
- for (; e > 0 && og(a.text.charAt(e));) e += c;
- return 0 > e || e > a.text.length ? null : e
- }
- var a = /gecko\/\d/i.test(navigator.userAgent),
- b = /MSIE \d/.test(navigator.userAgent),
- c = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),
- d = b || c,
- e = d && (b ? document.documentMode || 6 : c[1]),
- f = /WebKit\//.test(navigator.userAgent),
- g = f && /Qt\/\d+\.\d+/.test(navigator.userAgent),
- h = /Chrome\//.test(navigator.userAgent),
- i = /Opera\//.test(navigator.userAgent),
- j = /Apple Computer/.test(navigator.vendor),
- k = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),
- l = /PhantomJS/.test(navigator.userAgent),
- m = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent),
- n = m || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),
- o = m || /Mac/.test(navigator.platform),
- p = /win/i.test(navigator.platform),
- q = i && navigator.userAgent.match(/Version\/(\d*\.\d*)/),
- oldff = /Firefox\/([1-3])\./i.test(navigator.userAgent);
- q && (q = Number(q[1])), q && q >= 15 && (i = !1, f = !0);
- var r = o && (g || i && (null == q || 12.11 > q)),
- s = a || d && e >= 9,
- t = !1,
- u = !1;
- K.prototype = hg({
- update: function (a) {
- var b = a.scrollWidth > a.clientWidth + 1,
- c = a.scrollHeight > a.clientHeight + 1,
- d = a.nativeBarWidth;
- if (c) {
- this.vert.style.display = "block", this.vert.style.bottom = b ? d + "px" : "0";
- var e = a.viewHeight - (b ? d : 0);
- this.vert.firstChild.style.height = Math.max(0, a.scrollHeight - a.clientHeight + e) + "px"
- } else this.vert.style.display = "", this.vert.firstChild.style.height = "0";
- if (b) {
- this.horiz.style.display = "block", this.horiz.style.right = c ? d + "px" : "0", this.horiz.style.left = a.barLeft + "px";
- var f = a.viewWidth - a.barLeft - (c ? d : 0);
- this.horiz.firstChild.style.width = a.scrollWidth - a.clientWidth + f + "px"
- } else this.horiz.style.display = "", this.horiz.firstChild.style.width = "0";
- return !this.checkedOverlay && a.clientHeight > 0 && (0 == d && this.overlayHack(), this.checkedOverlay = !0), {
- right: c ? d : 0,
- bottom: b ? d : 0
- }
- },
- setScrollLeft: function (a) {
- this.horiz.scrollLeft != a && (this.horiz.scrollLeft = a)
- },
- setScrollTop: function (a) {
- this.vert.scrollTop != a && (this.vert.scrollTop = a)
- },
- overlayHack: function () {
- var a = o && !k ? "12px" : "18px";
- this.horiz.style.minHeight = this.vert.style.minWidth = a;
- var b = this,
- c = function (a) {
- Hf(a) != b.vert && Hf(a) != b.horiz && dc(b.cm, uc)(a)
- };
- Jf(this.vert, "mousedown", c), Jf(this.horiz, "mousedown", c)
- },
- clear: function () {
- var a = this.horiz.parentNode;
- a.removeChild(this.horiz), a.removeChild(this.vert)
- }
- }, K.prototype), L.prototype = hg({
- update: function () {
- return {
- bottom: 0,
- right: 0
- }
- },
- setScrollLeft: function () {},
- setScrollTop: function () {},
- clear: function () {}
- }, L.prototype), v.scrollbarModel = {
- "native": K,
- "null": L
- }, U.prototype.signal = function (a, b) {
- Rf(a, b) && this.events.push(arguments)
- }, U.prototype.finish = function () {
- for (var a = 0; a < this.events.length; a++) Lf.apply(null, this.events[a])
- };
- var oa = v.Pos = function (a, b) {
- return this instanceof oa ? (this.line = a, void(this.ch = b)) : new oa(a, b)
- },
- pa = v.cmpPos = function (a, b) {
- return a.line - b.line || a.ch - b.ch
- },
- va = null;
- Ba.prototype = hg({
- init: function (a) {
- function h(a) {
- if (c.somethingSelected()) va = c.getSelections(), b.inaccurateSelection && (b.prevInput = "", b.inaccurateSelection = !1, g.value = va.join("\n"), cg(g));
- else {
- if (!c.options.lineWiseCopyCut) return;
- var d = za(c);
- va = d.text, "cut" == a.type ? c.setSelections(d.ranges, null, Vf) : (b.prevInput = "", g.value = d.text.join("\n"), cg(g))
- }
- "cut" == a.type && (c.state.cutIncoming = !0)
- }
- var b = this,
- c = this.cm,
- f = this.wrapper = Ca(),
- g = this.textarea = f.firstChild;
- a.wrapper.insertBefore(f, a.wrapper.firstChild), m && (g.style.width = "0px"), Jf(g, "input", function () {
- d && e >= 9 && b.hasSelection && (b.hasSelection = null), b.poll()
- }), Jf(g, "paste", function (a) {
- return xa(a, c) ? !0 : (c.state.pasteIncoming = !0, void b.fastPoll())
- }), Jf(g, "cut", h), Jf(g, "copy", h), Jf(a.scroller, "paste", function (d) {
- sc(a, d) || (c.state.pasteIncoming = !0, b.focus())
- }), Jf(a.lineSpace, "selectstart", function (b) {
- sc(a, b) || Df(b)
- }), Jf(g, "compositionstart", function () {
- var a = c.getCursor("from");
- b.composing = {
- start: a,
- range: c.markText(a, c.getCursor("to"), {
- className: "CodeMirror-composing"
- })
- }
- }), Jf(g, "compositionend", function () {
- b.composing && (b.poll(), b.composing.range.clear(), b.composing = null)
- })
- },
- prepareSelection: function () {
- var a = this.cm,
- b = a.display,
- c = a.doc,
- d = eb(a);
- if (a.options.moveInputWithCursor) {
- var e = Lb(a, c.sel.primary()
- .head, "div"),
- f = b.wrapper.getBoundingClientRect(),
- g = b.lineDiv.getBoundingClientRect();
- d.teTop = Math.max(0, Math.min(b.wrapper.clientHeight - 10, e.top + g.top - f.top)), d.teLeft = Math.max(0, Math.min(b.wrapper.clientWidth - 10, e.left + g.left - f.left))
- }
- return d
- },
- showSelection: function (a) {
- var b = this.cm,
- c = b.display;
- sg(c.cursorDiv, a.cursors), sg(c.selectionDiv, a.selection), null != a.teTop && (this.wrapper.style.top = a.teTop + "px", this.wrapper.style.left = a.teLeft + "px")
- },
- reset: function (a) {
- if (!this.contextMenuPending) {
- var b, c, f = this.cm,
- g = f.doc;
- if (f.somethingSelected()) {
- this.prevInput = "";
- var h = g.sel.primary();
- b = Kg && (h.to()
- .line - h.from()
- .line > 100 || (c = f.getSelection())
- .length > 1e3);
- var i = b ? "-" : c || f.getSelection();
- this.textarea.value = i, f.state.focused && cg(this.textarea), d && e >= 9 && (this.hasSelection = i)
- } else a || (this.prevInput = this.textarea.value = "", d && e >= 9 && (this.hasSelection = null));
- this.inaccurateSelection = b
- }
- },
- getField: function () {
- return this.textarea
- },
- supportsTouch: function () {
- return !1
- },
- focus: function () {
- if ("nocursor" != this.cm.options.readOnly && (!n || ug() != this.textarea)) try {
- this.textarea.focus()
- } catch (a) {}
- },
- blur: function () {
- this.textarea.blur()
- },
- resetPosition: function () {
- this.wrapper.style.top = this.wrapper.style.left = 0
- },
- receivedFocus: function () {
- this.slowPoll()
- },
- slowPoll: function () {
- var a = this;
- a.pollingFast || a.polling.set(this.cm.options.pollInterval, function () {
- a.poll(), a.cm.state.focused && a.slowPoll()
- })
- },
- fastPoll: function () {
- function c() {
- var d = b.poll();
- d || a ? (b.pollingFast = !1, b.slowPoll()) : (a = !0, b.polling.set(60, c))
- }
- var a = !1,
- b = this;
- b.pollingFast = !0, b.polling.set(20, c)
- },
- poll: function () {
- var a = this.cm,
- b = this.textarea,
- c = this.prevInput;
- if (this.contextMenuPending || !a.state.focused || Jg(b) && !c && !this.composing || ua(a) || a.options.disableInput || a.state.keySeq) return !1;
- var f = b.value;
- if (f == c && !a.somethingSelected()) return !1;
- if (d && e >= 9 && this.hasSelection === f || o && /[\uf700-\uf7ff]/.test(f)) return a.display.input.reset(), !1;
- if (a.doc.sel == a.display.selForContextMenu) {
- var g = f.charCodeAt(0);
- if (8203 != g || c || (c = "\u200b"), 8666 == g) return this.reset(), this.cm.execCommand("undo")
- }
- for (var h = 0, i = Math.min(c.length, f.length); i > h && c.charCodeAt(h) == f.charCodeAt(h);) ++h;
- var j = this;
- return cc(a, function () {
- wa(a, f.slice(h), c.length - h, null, j.composing ? "*compose" : null), f.length > 1e3 || f.indexOf("\n") > -1 ? b.value = j.prevInput = "" : j.prevInput = f, j.composing && (j.composing.range.clear(), j.composing.range = a.markText(j.composing.start, a.getCursor("to"), {
- className: "CodeMirror-composing"
- }))
- }), !0
- },
- ensurePolled: function () {
- this.pollingFast && this.poll() && (this.pollingFast = !1)
- },
- onKeyPress: function () {
- d && e >= 9 && (this.hasSelection = null), this.fastPoll()
- },
- onContextMenu: function (a) {
- function o() {
- if (null != h.selectionStart) {
- var a = c.somethingSelected(),
- d = "\u200b" + (a ? h.value : "");
- h.value = "\u21da", h.value = d, b.prevInput = a ? "" : "\u200b", h.selectionStart = 1, h.selectionEnd = d.length, g.selForContextMenu = c.doc.sel
- }
- }
-
- function p() {
- if (b.contextMenuPending = !1, b.wrapper.style.position = "relative", h.style.cssText = m, d && 9 > e && g.scrollbars.setScrollTop(g.scroller.scrollTop = k), null != h.selectionStart) {
- (!d || d && 9 > e) && o();
- var a = 0,
- f = function () {
- g.selForContextMenu == c.doc.sel && 0 == h.selectionStart && h.selectionEnd > 0 && "\u200b" == b.prevInput ? dc(c, Ld.selectAll)(c) : a++ < 10 ? g.detectingSelectAll = setTimeout(f, 500) : g.input.reset()
- };
- g.detectingSelectAll = setTimeout(f, 200)
- }
- }
- var b = this,
- c = b.cm,
- g = c.display,
- h = b.textarea,
- j = tc(c, a),
- k = g.scroller.scrollTop;
- if (j && !i) {
- var l = c.options.resetSelectionOnContextMenu;
- l && -1 == c.doc.sel.contains(j) && dc(c, Za)(c.doc, Ma(j), Vf);
- var m = h.style.cssText;
- if (b.wrapper.style.position = "absolute", h.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (a.clientY - 5) + "px; left: " + (a.clientX - 5) + "px; z-index: 1000; background: " + (d ? "rgba(255, 255, 255, .05)" : "transparent") + "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);", f) var n = window.scrollY;
- if (g.input.focus(), f && window.scrollTo(null, n), g.input.reset(), c.somethingSelected() || (h.value = b.prevInput = " "), b.contextMenuPending = !0, g.selForContextMenu = c.doc.sel, clearTimeout(g.detectingSelectAll), d && e >= 9 && o(), s) {
- Gf(a);
- var q = function () {
- Kf(window, "mouseup", q), setTimeout(p, 20)
- };
- Jf(window, "mouseup", q)
- } else setTimeout(p, 50)
- }
- },
- setUneditable: fg,
- needsContentAttribute: !1
- }, Ba.prototype), Da.prototype = hg({
- init: function (a) {
- function e(a) {
- if (c.somethingSelected()) va = c.getSelections(), "cut" == a.type && c.replaceSelection("", null, "cut");
- else {
- if (!c.options.lineWiseCopyCut) return;
- var b = za(c);
- va = b.text, "cut" == a.type && c.operation(function () {
- c.setSelections(b.ranges, 0, Vf), c.replaceSelection("", null, "cut")
- })
- }
- if (a.clipboardData && !m) a.preventDefault(), a.clipboardData.clearData(), a.clipboardData.setData("text/plain", va.join("\n"));
- else {
- var d = Ca(),
- e = d.firstChild;
- c.display.lineSpace.insertBefore(d, c.display.lineSpace.firstChild), e.value = va.join("\n");
- var f = document.activeElement;
- cg(e), setTimeout(function () {
- c.display.lineSpace.removeChild(d), f.focus()
- }, 50)
- }
- }
- var b = this,
- c = b.cm,
- d = b.div = a.lineDiv;
- d.contentEditable = "true", Aa(d), Jf(d, "paste", function (a) {
- xa(a, c)
- }), Jf(d, "compositionstart", function (a) {
- var d = a.data;
- if (b.composing = {
- sel: c.doc.sel,
- data: d,
- startData: d
- }, d) {
- var e = c.doc.sel.primary(),
- f = c.getLine(e.head.line),
- g = f.indexOf(d, Math.max(0, e.head.ch - d.length));
- g > -1 && g <= e.head.ch && (b.composing.sel = Ma(oa(e.head.line, g), oa(e.head.line, g + d.length)))
- }
- }), Jf(d, "compositionupdate", function (a) {
- b.composing.data = a.data
- }), Jf(d, "compositionend", function (a) {
- var c = b.composing;
- c && (a.data == c.startData || /\u200b/.test(a.data) || (c.data = a.data), setTimeout(function () {
- c.handled || b.applyComposition(c), b.composing == c && (b.composing = null)
- }, 50))
- }), Jf(d, "touchstart", function () {
- b.forceCompositionEnd()
- }), Jf(d, "input", function () {
- b.composing || b.pollContent() || cc(b.cm, function () {
- ic(c)
- })
- }), Jf(d, "copy", e), Jf(d, "cut", e)
- },
- prepareSelection: function () {
- var a = eb(this.cm, !1);
- return a.focus = this.cm.state.focused, a
- },
- showSelection: function (a) {
- a && this.cm.display.view.length && (a.focus && this.showPrimarySelection(), this.showMultipleSelections(a))
- },
- showPrimarySelection: function () {
- var b = window.getSelection(),
- c = this.cm.doc.sel.primary(),
- d = Ga(this.cm, b.anchorNode, b.anchorOffset),
- e = Ga(this.cm, b.focusNode, b.focusOffset);
- if (!d || d.bad || !e || e.bad || 0 != pa(sa(d, e), c.from()) || 0 != pa(ra(d, e), c.to())) {
- var f = Ea(this.cm, c.from()),
- g = Ea(this.cm, c.to());
- if (f || g) {
- var h = this.cm.display.view,
- i = b.rangeCount && b.getRangeAt(0);
- if (f) {
- if (!g) {
- var j = h[h.length - 1].measure,
- k = j.maps ? j.maps[j.maps.length - 1] : j.map;
- g = {
- node: k[k.length - 1],
- offset: k[k.length - 2] - k[k.length - 3]
- }
- }
- } else f = {
- node: h[0].measure.map[2],
- offset: 0
- };
- try {
- var l = qg(f.node, f.offset, g.offset, g.node)
- } catch (m) {}
- l && (b.removeAllRanges(), b.addRange(l), i && null == b.anchorNode ? b.addRange(i) : a && this.startGracePeriod()), this.rememberSelection()
- }
- }
- },
- startGracePeriod: function () {
- var a = this;
- clearTimeout(this.gracePeriod), this.gracePeriod = setTimeout(function () {
- a.gracePeriod = !1, a.selectionChanged() && a.cm.operation(function () {
- a.cm.curOp.selectionChanged = !0
- })
- }, 20)
- },
- showMultipleSelections: function (a) {
- sg(this.cm.display.cursorDiv, a.cursors), sg(this.cm.display.selectionDiv, a.selection)
- },
- rememberSelection: function () {
- var a = window.getSelection();
- this.lastAnchorNode = a.anchorNode, this.lastAnchorOffset = a.anchorOffset, this.lastFocusNode = a.focusNode, this.lastFocusOffset = a.focusOffset
- },
- selectionInEditor: function () {
- var a = window.getSelection();
- if (!a.rangeCount) return !1;
- var b = a.getRangeAt(0)
- .commonAncestorContainer;
- return tg(this.div, b)
- },
- focus: function () {
- "nocursor" != this.cm.options.readOnly && this.div.focus()
- },
- blur: function () {
- this.div.blur()
- },
- getField: function () {
- return this.div
- },
- supportsTouch: function () {
- return !0
- },
- receivedFocus: function () {
- function b() {
- a.cm.state.focused && (a.pollSelection(), a.polling.set(a.cm.options.pollInterval, b))
- }
- var a = this;
- this.selectionInEditor() ? this.pollSelection() : cc(this.cm, function () {
- a.cm.curOp.selectionChanged = !0
- }), this.polling.set(this.cm.options.pollInterval, b)
- },
- selectionChanged: function () {
- var a = window.getSelection();
- return a.anchorNode != this.lastAnchorNode || a.anchorOffset != this.lastAnchorOffset || a.focusNode != this.lastFocusNode || a.focusOffset != this.lastFocusOffset
- },
- pollSelection: function () {
- if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
- var a = window.getSelection(),
- b = this.cm;
- this.rememberSelection();
- var c = Ga(b, a.anchorNode, a.anchorOffset),
- d = Ga(b, a.focusNode, a.focusOffset);
- c && d && cc(b, function () {
- Za(b.doc, Ma(c, d), Vf), (c.bad || d.bad) && (b.curOp.selectionChanged = !0)
- })
- }
- },
- pollContent: function () {
- var a = this.cm,
- b = a.display,
- c = a.doc.sel.primary(),
- d = c.from(),
- e = c.to();
- if (d.line < b.viewFrom || e.line > b.viewTo - 1) return !1;
- var f;
- if (d.line == b.viewFrom || 0 == (f = lc(a, d.line))) var g = kf(b.view[0].line),
- h = b.view[0].node;
- else var g = kf(b.view[f].line),
- h = b.view[f - 1].node.nextSibling;
- var i = lc(a, e.line);
- if (i == b.view.length - 1) var j = b.viewTo - 1,
- k = b.lineDiv.lastChild;
- else var j = kf(b.view[i + 1].line) - 1,
- k = b.view[i + 1].node.previousSibling;
- for (var l = a.doc.splitLines(Ia(a, h, k, g, j)), m = gf(a.doc, oa(g, 0), oa(j, ff(a.doc, j)
- .text.length)); l.length > 1 && m.length > 1;)
- if (bg(l) == bg(m)) l.pop(), m.pop(), j--;
- else {
- if (l[0] != m[0]) break;
- l.shift(), m.shift(), g++
- }
- for (var n = 0, o = 0, p = l[0], q = m[0], r = Math.min(p.length, q.length); r > n && p.charCodeAt(n) == q.charCodeAt(n);) ++n;
- for (var s = bg(l), t = bg(m), u = Math.min(s.length - (1 == l.length ? n : 0), t.length - (1 == m.length ? n : 0)); u > o && s.charCodeAt(s.length - o - 1) == t.charCodeAt(t.length - o - 1);) ++o;
- l[l.length - 1] = s.slice(0, s.length - o), l[0] = l[0].slice(n);
- var v = oa(g, n),
- w = oa(j, m.length ? bg(m)
- .length - o : 0);
- return l.length > 1 || l[0] || pa(v, w) ? (nd(a.doc, l, v, w, "+input"), !0) : void 0
- },
- ensurePolled: function () {
- this.forceCompositionEnd()
- },
- reset: function () {
- this.forceCompositionEnd()
- },
- forceCompositionEnd: function () {
- this.composing && !this.composing.handled && (this.applyComposition(this.composing), this.composing.handled = !0, this.div.blur(), this.div.focus())
- },
- applyComposition: function (a) {
- a.data && a.data != a.startData && dc(this.cm, wa)(this.cm, a.data, 0, a.sel)
- },
- setUneditable: function (a) {
- a.setAttribute("contenteditable", "false")
- },
- onKeyPress: function (a) {
- a.preventDefault(), dc(this.cm, wa)(this.cm, String.fromCharCode(null == a.charCode ? a.keyCode : a.charCode), 0)
- },
- onContextMenu: fg,
- resetPosition: fg,
- needsContentAttribute: !0
- }, Da.prototype), v.inputStyles = {
- textarea: Ba,
- contenteditable: Da
- }, Ja.prototype = {
- primary: function () {
- return this.ranges[this.primIndex]
- },
- equals: function (a) {
- if (a == this) return !0;
- if (a.primIndex != this.primIndex || a.ranges.length != this.ranges.length) return !1;
- for (var b = 0; b < this.ranges.length; b++) {
- var c = this.ranges[b],
- d = a.ranges[b];
- if (0 != pa(c.anchor, d.anchor) || 0 != pa(c.head, d.head)) return !1
- }
- return !0
- },
- deepCopy: function () {
- for (var a = [], b = 0; b < this.ranges.length; b++) a[b] = new Ka(qa(this.ranges[b].anchor), qa(this.ranges[b].head));
- return new Ja(a, this.primIndex)
- },
- somethingSelected: function () {
- for (var a = 0; a < this.ranges.length; a++)
- if (!this.ranges[a].empty()) return !0;
- return !1
- },
- contains: function (a, b) {
- b || (b = a);
- for (var c = 0; c < this.ranges.length; c++) {
- var d = this.ranges[c];
- if (pa(b, d.from()) >= 0 && pa(a, d.to()) <= 0) return c
- }
- return -1
- }
- }, Ka.prototype = {
- from: function () {
- return sa(this.anchor, this.head)
- },
- to: function () {
- return ra(this.anchor, this.head)
- },
- empty: function () {
- return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch
- }
- };
- var Qb, vc, wc, zb = {
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- },
- Tb = null,
- Ub = 0,
- Cc = 0,
- Jc = 0,
- Kc = null;
- d ? Kc = -.53 : a ? Kc = 15 : h ? Kc = -.7 : j && (Kc = -1 / 3);
- var Lc = function (a) {
- var b = a.wheelDeltaX,
- c = a.wheelDeltaY;
- return null == b && a.detail && a.axis == a.HORIZONTAL_AXIS && (b = a.detail), null == c && a.detail && a.axis == a.VERTICAL_AXIS ? c = a.detail : null == c && (c = a.wheelDelta), {
- x: b,
- y: c
- }
- };
- v.wheelEventPixels = function (a) {
- var b = Lc(a);
- return b.x *= Kc, b.y *= Kc, b
- };
- var Pc = new Yf,
- Tc = null,
- bd = v.changeEnd = function (a) {
- return a.text ? oa(a.from.line + a.text.length - 1, bg(a.text)
- .length + (1 == a.text.length ? a.from.ch : 0)) : a.to
- };
- v.prototype = {
- constructor: v,
- focus: function () {
- window.focus(), this.display.input.focus()
- },
- setOption: function (a, b) {
- var c = this.options,
- d = c[a];
- (c[a] != b || "mode" == a) && (c[a] = b, Bd.hasOwnProperty(a) && dc(this, Bd[a])(this, b, d))
- },
- getOption: function (a) {
- return this.options[a]
- },
- getDoc: function () {
- return this.doc
- },
- addKeyMap: function (a, b) {
- this.state.keyMaps[b ? "push" : "unshift"](Rd(a))
- },
- removeKeyMap: function (a) {
- for (var b = this.state.keyMaps, c = 0; c < b.length; ++c)
- if (b[c] == a || b[c].name == a) return b.splice(c, 1), !0
- },
- addOverlay: ec(function (a, b) {
- var c = a.token ? a : v.getMode(this.options, a);
- if (c.startState) throw new Error("Overlays may not be stateful.");
- this.state.overlays.push({
- mode: c,
- modeSpec: a,
- opaque: b && b.opaque
- }), this.state.modeGen++, ic(this)
- }),
- removeOverlay: ec(function (a) {
- for (var b = this.state.overlays, c = 0; c < b.length; ++c) {
- var d = b[c].modeSpec;
- if (d == a || "string" == typeof a && d.name == a) return b.splice(c, 1), this.state.modeGen++, void ic(this)
- }
- }),
- indentLine: ec(function (a, b, c) {
- "string" != typeof b && "number" != typeof b && (b = null == b ? this.options.smartIndent ? "smart" : "prev" : b ? "add" : "subtract"), Qa(this.doc, a) && vd(this, a, b, c)
- }),
- indentSelection: ec(function (a) {
- for (var b = this.doc.sel.ranges, c = -1, d = 0; d < b.length; d++) {
- var e = b[d];
- if (e.empty()) e.head.line > c && (vd(this, e.head.line, a, !0), c = e.head.line, d == this.doc.sel.primIndex && td(this));
- else {
- var f = e.from(),
- g = e.to(),
- h = Math.max(c, f.line);
- c = Math.min(this.lastLine(), g.line - (g.ch ? 0 : 1)) + 1;
- for (var i = h; c > i; ++i) vd(this, i, a);
- var j = this.doc.sel.ranges;
- 0 == f.ch && b.length == j.length && j[d].from()
- .ch > 0 && Va(this.doc, d, new Ka(f, j[d].to()), Vf)
- }
- }
- }),
- getTokenAt: function (a, b) {
- return Ie(this, a, b)
- },
- getLineTokens: function (a, b) {
- return Ie(this, oa(a), b, !0)
- },
- getTokenTypeAt: function (a) {
- a = Oa(this.doc, a);
- var f, b = Le(this, ff(this.doc, a.line)),
- c = 0,
- d = (b.length - 1) / 2,
- e = a.ch;
- if (0 == e) f = b[2];
- else
- for (;;) {
- var g = c + d >> 1;
- if ((g ? b[2 * g - 1] : 0) >= e) d = g;
- else {
- if (!(b[2 * g + 1] < e)) {
- f = b[2 * g + 2];
- break
- }
- c = g + 1
- }
- }
- var h = f ? f.indexOf("cm-overlay ") : -1;
- return 0 > h ? f : 0 == h ? null : f.slice(0, h - 1)
- },
- getModeAt: function (a) {
- var b = this.doc.mode;
- return b.innerMode ? v.innerMode(b, this.getTokenAt(a)
- .state)
- .mode : b
- },
- getHelper: function (a, b) {
- return this.getHelpers(a, b)[0]
- },
- getHelpers: function (a, b) {
- var c = [];
- if (!Id.hasOwnProperty(b)) return c;
- var d = Id[b],
- e = this.getModeAt(a);
- if ("string" == typeof e[b]) d[e[b]] && c.push(d[e[b]]);
- else if (e[b])
- for (var f = 0; f < e[b].length; f++) {
- var g = d[e[b][f]];
- g && c.push(g)
- } else e.helperType && d[e.helperType] ? c.push(d[e.helperType]) : d[e.name] && c.push(d[e.name]);
- for (var f = 0; f < d._global.length; f++) {
- var h = d._global[f];
- h.pred(e, this) && -1 == dg(c, h.val) && c.push(h.val)
- }
- return c
- },
- getStateAfter: function (a, b) {
- var c = this.doc;
- return a = Na(c, null == a ? c.first + c.size - 1 : a), lb(this, a + 1, b)
- },
- cursorCoords: function (a, b) {
- var c, d = this.doc.sel.primary();
- return c = null == a ? d.head : "object" == typeof a ? Oa(this.doc, a) : a ? d.from() : d.to(), Lb(this, c, b || "page")
- },
- charCoords: function (a, b) {
- return Kb(this, Oa(this.doc, a), b || "page")
- },
- coordsChar: function (a, b) {
- return a = Jb(this, a, b || "page"), Ob(this, a.left, a.top)
- },
- lineAtHeight: function (a, b) {
- return a = Jb(this, {
- top: a,
- left: 0
- }, b || "page")
- .top, lf(this.doc, a + this.display.viewOffset)
- },
- heightAtLine: function (a, b) {
- var d, c = !1;
- if ("number" == typeof a) {
- var e = this.doc.first + this.doc.size - 1;
- a < this.doc.first ? a = this.doc.first : a > e && (a = e, c = !0), d = ff(this.doc, a)
- } else d = a;
- return Ib(this, d, {
- top: 0,
- left: 0
- }, b || "page")
- .top + (c ? this.doc.height - mf(d) : 0)
- },
- defaultTextHeight: function () {
- return Rb(this.display)
- },
- defaultCharWidth: function () {
- return Sb(this.display)
- },
- setGutterMarker: ec(function (a, b, c) {
- return wd(this.doc, a, "gutter", function (a) {
- var d = a.gutterMarkers || (a.gutterMarkers = {});
- return d[b] = c, !c && mg(d) && (a.gutterMarkers = null), !0
- })
- }),
- clearGutter: ec(function (a) {
- var b = this,
- c = b.doc,
- d = c.first;
- c.iter(function (c) {
- c.gutterMarkers && c.gutterMarkers[a] && (c.gutterMarkers[a] = null, jc(b, d, "gutter"), mg(c.gutterMarkers) && (c.gutterMarkers = null)), ++d
- })
- }),
- lineInfo: function (a) {
- if ("number" == typeof a) {
- if (!Qa(this.doc, a)) return null;
- var b = a;
- if (a = ff(this.doc, a), !a) return null
- } else {
- var b = kf(a);
- if (null == b) return null
- }
- return {
- line: b,
- handle: a,
- text: a.text,
- gutterMarkers: a.gutterMarkers,
- textClass: a.textClass,
- bgClass: a.bgClass,
- wrapClass: a.wrapClass,
- widgets: a.widgets
- }
- },
- getViewport: function () {
- return {
- from: this.display.viewFrom,
- to: this.display.viewTo
- }
- },
- addWidget: function (a, b, c, d, e) {
- var f = this.display;
- a = Lb(this, Oa(this.doc, a));
- var g = a.bottom,
- h = a.left;
- if (b.style.position = "absolute", b.setAttribute("cm-ignore-events", "true"), this.display.input.setUneditable(b), f.sizer.appendChild(b), "over" == d) g = a.top;
- else if ("above" == d || "near" == d) {
- var i = Math.max(f.wrapper.clientHeight, this.doc.height),
- j = Math.max(f.sizer.clientWidth, f.lineSpace.clientWidth);
- ("above" == d || a.bottom + b.offsetHeight > i) && a.top > b.offsetHeight ? g = a.top - b.offsetHeight : a.bottom + b.offsetHeight <= i && (g = a.bottom), h + b.offsetWidth > j && (h = j - b.offsetWidth)
- }
- b.style.top = g + "px", b.style.left = b.style.right = "", "right" == e ? (h = f.sizer.clientWidth - b.offsetWidth, b.style.right = "0px") : ("left" == e ? h = 0 : "middle" == e && (h = (f.sizer.clientWidth - b.offsetWidth) / 2), b.style.left = h + "px"), c && qd(this, h, g, h + b.offsetWidth, g + b.offsetHeight)
- },
- triggerOnKeyDown: ec(Uc),
- triggerOnKeyPress: ec(Xc),
- triggerOnKeyUp: Wc,
- execCommand: function (a) {
- return Ld.hasOwnProperty(a) ? Ld[a].call(null, this) : void 0
- },
- triggerElectric: ec(function (a) {
- ya(this, a)
- }),
- findPosH: function (a, b, c, d) {
- var e = 1;
- 0 > b && (e = -1, b = -b);
- for (var f = 0, g = Oa(this.doc, a); b > f && (g = yd(this.doc, g, e, c, d), !g.hitSide); ++f);
- return g
- },
- moveH: ec(function (a, b) {
- var c = this;
- c.extendSelectionsBy(function (d) {
- return c.display.shift || c.doc.extend || d.empty() ? yd(c.doc, d.head, a, b, c.options.rtlMoveVisually) : 0 > a ? d.from() : d.to()
- }, Xf)
- }),
- deleteH: ec(function (a, b) {
- var c = this.doc.sel,
- d = this.doc;
- c.somethingSelected() ? d.replaceSelection("", null, "+delete") : xd(this, function (c) {
- var e = yd(d, c.head, a, b, !1);
- return 0 > a ? {
- from: e,
- to: c.head
- } : {
- from: c.head,
- to: e
- }
- })
- }),
- findPosV: function (a, b, c, d) {
- var e = 1,
- f = d;
- 0 > b && (e = -1, b = -b);
- for (var g = 0, h = Oa(this.doc, a); b > g; ++g) {
- var i = Lb(this, h, "div");
- if (null == f ? f = i.left : i.left = f, h = zd(this, i, e, c), h.hitSide) break
- }
- return h
- },
- moveV: ec(function (a, b) {
- var c = this,
- d = this.doc,
- e = [],
- f = !c.display.shift && !d.extend && d.sel.somethingSelected();
- if (d.extendSelectionsBy(function (g) {
- if (f) return 0 > a ? g.from() : g.to();
- var h = Lb(c, g.head, "div");
- null != g.goalColumn && (h.left = g.goalColumn), e.push(h.left);
- var i = zd(c, h, a, b);
- return "page" == b && g == d.sel.primary() && sd(c, null, Kb(c, i, "div")
- .top - h.top), i
- }, Xf), e.length)
- for (var g = 0; g < d.sel.ranges.length; g++) d.sel.ranges[g].goalColumn = e[g]
- }),
- findWordAt: function (a) {
- var b = this.doc,
- c = ff(b, a.line)
- .text,
- d = a.ch,
- e = a.ch;
- if (c) {
- var f = this.getHelper(a, "wordChars");
- (a.xRel < 0 || e == c.length) && d ? --d : ++e;
- for (var g = c.charAt(d), h = lg(g, f) ? function (a) {
- return lg(a, f)
- } : /\s/.test(g) ? function (a) {
- return /\s/.test(a)
- } : function (a) {
- return !/\s/.test(a) && !lg(a)
- }; d > 0 && h(c.charAt(d - 1));) --d;
- for (; e < c.length && h(c.charAt(e));) ++e
- }
- return new Ka(oa(a.line, d), oa(a.line, e))
- },
- toggleOverwrite: function (a) {
- (null == a || a != this.state.overwrite) && ((this.state.overwrite = !this.state.overwrite) ? xg(this.display.cursorDiv, "CodeMirror-overwrite") : wg(this.display.cursorDiv, "CodeMirror-overwrite"), Lf(this, "overwriteToggle", this, this.state.overwrite))
- },
- hasFocus: function () {
- return this.display.input.getField() == ug()
- },
- scrollTo: ec(function (a, b) {
- (null != a || null != b) && ud(this), null != a && (this.curOp.scrollLeft = a), null != b && (this.curOp.scrollTop = b)
- }),
- getScrollInfo: function () {
- var a = this.display.scroller;
- return {
- left: a.scrollLeft,
- top: a.scrollTop,
- height: a.scrollHeight - pb(this) - this.display.barHeight,
- width: a.scrollWidth - pb(this) - this.display.barWidth,
- clientHeight: rb(this),
- clientWidth: qb(this)
- }
- },
- scrollIntoView: ec(function (a, b) {
- if (null == a ? (a = {
- from: this.doc.sel.primary()
- .head,
- to: null
- }, null == b && (b = this.options.cursorScrollMargin)) : "number" == typeof a ? a = {
- from: oa(a, 0),
- to: null
- } : null == a.from && (a = {
- from: a,
- to: null
- }), a.to || (a.to = a.from), a.margin = b || 0, null != a.from.line) ud(this), this.curOp.scrollToPos = a;
- else {
- var c = rd(this, Math.min(a.from.left, a.to.left), Math.min(a.from.top, a.to.top) - a.margin, Math.max(a.from.right, a.to.right), Math.max(a.from.bottom, a.to.bottom) + a.margin);
- this.scrollTo(c.scrollLeft, c.scrollTop)
- }
- }),
- setSize: ec(function (a, b) {
- function d(a) {
- return "number" == typeof a || /^\d+$/.test(String(a)) ? a + "px" : a
- }
- var c = this;
- null != a && (c.display.wrapper.style.width = d(a)), null != b && (c.display.wrapper.style.height = d(b)), c.options.lineWrapping && Eb(this);
- var e = c.display.viewFrom;
- c.doc.iter(e, c.display.viewTo, function (a) {
- if (a.widgets)
- for (var b = 0; b < a.widgets.length; b++)
- if (a.widgets[b].noHScroll) {
- jc(c, e, "widget");
- break
- }++e
- }), c.curOp.forceUpdate = !0, Lf(c, "refresh", this)
- }),
- operation: function (a) {
- return cc(this, a)
- },
- refresh: ec(function () {
- var a = this.display.cachedTextHeight;
- ic(this), this.curOp.forceUpdate = !0, Fb(this), this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop), F(this), (null == a || Math.abs(a - Rb(this.display)) > .5) && B(this), Lf(this, "refresh", this)
- }),
- swapDoc: ec(function (a) {
- var b = this.doc;
- return b.cm = null, ef(this, a), Fb(this), this.display.input.reset(), this.scrollTo(a.scrollLeft, a.scrollTop), this.curOp.forceScroll = !0, Nf(this, "swapDoc", this, b), b
- }),
- getInputField: function () {
- return this.display.input.getField()
- },
- getWrapperElement: function () {
- return this.display.wrapper
- },
- getScrollerElement: function () {
- return this.display.scroller
- },
- getGutterElement: function () {
- return this.display.gutters
- }
- }, Sf(v);
- var Ad = v.defaults = {},
- Bd = v.optionHandlers = {},
- Dd = v.Init = {
- toString: function () {
- return "CodeMirror.Init"
- }
- };
- Cd("value", "", function (a, b) {
- a.setValue(b)
- }, !0), Cd("mode", null, function (a, b) {
- a.doc.modeOption = b, x(a)
- }, !0), Cd("indentUnit", 2, x, !0), Cd("indentWithTabs", !1), Cd("smartIndent", !0), Cd("tabSize", 4, function (a) {
- y(a), Fb(a), ic(a)
- }, !0), Cd("lineSeparator", null, function (a, b) {
- if (a.doc.lineSep = b, b) {
- var c = [],
- d = a.doc.first;
- a.doc.iter(function (a) {
- for (var e = 0;;) {
- var f = a.text.indexOf(b, e);
- if (-1 == f) break;
- e = f + b.length, c.push(oa(d, f))
- }
- d++
- });
- for (var e = c.length - 1; e >= 0; e--) nd(a.doc, b, c[e], oa(c[e].line, c[e].ch + b.length))
- }
- }), Cd("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function (a, b, c) {
- a.state.specialChars = new RegExp(b.source + (b.test(" ") ? "" : "| "), "g"), c != v.Init && a.refresh()
- }), Cd("specialCharPlaceholder", Re, function (a) {
- a.refresh()
- }, !0), Cd("electricChars", !0), Cd("inputStyle", n ? "contenteditable" : "textarea", function () {
- throw new Error("inputStyle can not (yet) be changed in a running editor")
- }, !0), Cd("rtlMoveVisually", !p), Cd("wholeLineUpdateBefore", !0), Cd("theme", "default", function (a) {
- C(a), D(a)
- }, !0), Cd("keyMap", "default", function (a, b, c) {
- var d = Rd(b),
- e = c != v.Init && Rd(c);
- e && e.detach && e.detach(a, d), d.attach && d.attach(a, e || null)
- }), Cd("extraKeys", null), Cd("lineWrapping", !1, z, !0), Cd("gutters", [], function (a) {
- I(a.options), D(a)
- }, !0), Cd("fixedGutter", !0, function (a, b) {
- a.display.gutters.style.left = b ? T(a.display) + "px" : "0", a.refresh()
- }, !0), Cd("coverGutterNextToScrollbar", !1, function (a) {
- N(a)
- }, !0), Cd("scrollbarStyle", "native", function (a) {
- M(a), N(a), a.display.scrollbars.setScrollTop(a.doc.scrollTop), a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)
- }, !0), Cd("lineNumbers", !1, function (a) {
- I(a.options), D(a)
- }, !0), Cd("firstLineNumber", 1, D, !0), Cd("lineNumberFormatter", function (a) {
- return a
- }, D, !0), Cd("showCursorWhenSelecting", !1, db, !0), Cd("resetSelectionOnContextMenu", !0), Cd("lineWiseCopyCut", !0), Cd("readOnly", !1, function (a, b) {
- "nocursor" == b ? ($c(a), a.display.input.blur(), a.display.disabled = !0) : (a.display.disabled = !1, b || a.display.input.reset())
- }), Cd("disableInput", !1, function (a, b) {
- b || a.display.input.reset()
- }, !0), Cd("dragDrop", !0, qc), Cd("cursorBlinkRate", 530), Cd("cursorScrollMargin", 0), Cd("cursorHeight", 1, db, !0), Cd("singleCursorHeightPerLine", !0, db, !0), Cd("workTime", 100), Cd("workDelay", 100), Cd("flattenSpans", !0, y, !0), Cd("addModeClass", !1, y, !0), Cd("pollInterval", 100), Cd("undoDepth", 200, function (a, b) {
- a.doc.history.undoDepth = b
- }), Cd("historyEventDelay", 1250), Cd("viewportMargin", 10, function (a) {
- a.refresh()
- }, !0), Cd("maxHighlightLength", 1e4, y, !0), Cd("moveInputWithCursor", !0, function (a, b) {
- b || a.display.input.resetPosition()
- }), Cd("tabindex", null, function (a, b) {
- a.display.input.getField()
- .tabIndex = b || ""
- }), Cd("autofocus", null);
- var Ed = v.modes = {},
- Fd = v.mimeModes = {};
- v.defineMode = function (a, b) {
- v.defaults.mode || "null" == a || (v.defaults.mode = a), arguments.length > 2 && (b.dependencies = Array.prototype.slice.call(arguments, 2)), Ed[a] = b
- }, v.defineMIME = function (a, b) {
- Fd[a] = b
- }, v.resolveMode = function (a) {
- if ("string" == typeof a && Fd.hasOwnProperty(a)) a = Fd[a];
- else if (a && "string" == typeof a.name && Fd.hasOwnProperty(a.name)) {
- var b = Fd[a.name];
- "string" == typeof b && (b = {
- name: b
- }), a = gg(b, a), a.name = b.name
- } else if ("string" == typeof a && /^[\w\-]+\/[\w\-]+\+xml$/.test(a)) return v.resolveMode("application/xml");
- return "string" == typeof a ? {
- name: a
- } : a || {
- name: "null"
- }
- }, v.getMode = function (a, b) {
- var b = v.resolveMode(b),
- c = Ed[b.name];
- if (!c) return v.getMode(a, "text/plain");
- var d = c(a, b);
- if (Gd.hasOwnProperty(b.name)) {
- var e = Gd[b.name];
- for (var f in e) e.hasOwnProperty(f) && (d.hasOwnProperty(f) && (d["_" + f] = d[f]), d[f] = e[f])
- }
- if (d.name = b.name, b.helperType && (d.helperType = b.helperType), b.modeProps)
- for (var f in b.modeProps) d[f] = b.modeProps[f];
- return d
- }, v.defineMode("null", function () {
- return {
- token: function (a) {
- a.skipToEnd()
- }
- }
- }), v.defineMIME("text/plain", "null");
- var Gd = v.modeExtensions = {};
- v.extendMode = function (a, b) {
- var c = Gd.hasOwnProperty(a) ? Gd[a] : Gd[a] = {};
- hg(b, c)
- }, v.defineExtension = function (a, b) {
- v.prototype[a] = b
- }, v.defineDocExtension = function (a, b) {
- af.prototype[a] = b
- }, v.defineOption = Cd;
- var Hd = [];
- v.defineInitHook = function (a) {
- Hd.push(a)
- };
- var Id = v.helpers = {};
- v.registerHelper = function (a, b, c) {
- Id.hasOwnProperty(a) || (Id[a] = v[a] = {
- _global: []
- }), Id[a][b] = c
- }, v.registerGlobalHelper = function (a, b, c, d) {
- v.registerHelper(a, b, d), Id[a]._global.push({
- pred: c,
- val: d
- })
- };
- var Jd = v.copyState = function (a, b) {
- if (b === !0) return b;
- if (a.copyState) return a.copyState(b);
- var c = {};
- for (var d in b) {
- var e = b[d];
- e instanceof Array && (e = e.concat([])), c[d] = e
- }
- return c
- },
- Kd = v.startState = function (a, b, c) {
- return a.startState ? a.startState(b, c) : !0
- };
- v.innerMode = function (a, b) {
- for (; a.innerMode;) {
- var c = a.innerMode(b);
- if (!c || c.mode == a) break;
- b = c.state, a = c.mode
- }
- return c || {
- mode: a,
- state: b
- }
- };
- var Ld = v.commands = {
- selectAll: function (a) {
- a.setSelection(oa(a.firstLine(), 0), oa(a.lastLine()), Vf)
- },
- singleSelection: function (a) {
- a.setSelection(a.getCursor("anchor"), a.getCursor("head"), Vf)
- },
- killLine: function (a) {
- xd(a, function (b) {
- if (b.empty()) {
- var c = ff(a.doc, b.head.line)
- .text.length;
- return b.head.ch == c && b.head.line < a.lastLine() ? {
- from: b.head,
- to: oa(b.head.line + 1, 0)
- } : {
- from: b.head,
- to: oa(b.head.line, c)
- }
- }
- return {
- from: b.from(),
- to: b.to()
- }
- })
- },
- deleteLine: function (a) {
- xd(a, function (b) {
- return {
- from: oa(b.from()
- .line, 0),
- to: Oa(a.doc, oa(b.to()
- .line + 1, 0))
- }
- })
- },
- delLineLeft: function (a) {
- xd(a, function (a) {
- return {
- from: oa(a.from()
- .line, 0),
- to: a.from()
- }
- })
- },
- delWrappedLineLeft: function (a) {
- xd(a, function (b) {
- var c = a.charCoords(b.head, "div")
- .top + 5,
- d = a.coordsChar({
- left: 0,
- top: c
- }, "div");
- return {
- from: d,
- to: b.from()
- }
- })
- },
- delWrappedLineRight: function (a) {
- xd(a, function (b) {
- var c = a.charCoords(b.head, "div")
- .top + 5,
- d = a.coordsChar({
- left: a.display.lineDiv.offsetWidth + 100,
- top: c
- }, "div");
- return {
- from: b.from(),
- to: d
- }
- })
- },
- undo: function (a) {
- a.undo()
- },
- redo: function (a) {
- a.redo()
- },
- undoSelection: function (a) {
- a.undoSelection()
- },
- redoSelection: function (a) {
- a.redoSelection()
- },
- goDocStart: function (a) {
- a.extendSelection(oa(a.firstLine(), 0))
- },
- goDocEnd: function (a) {
- a.extendSelection(oa(a.lastLine()))
- },
- goLineStart: function (a) {
- a.extendSelectionsBy(function (b) {
- return Tg(a, b.head.line)
- }, {
- origin: "+move",
- bias: 1
- })
- },
- goLineStartSmart: function (a) {
- a.extendSelectionsBy(function (b) {
- return Vg(a, b.head)
- }, {
- origin: "+move",
- bias: 1
- })
- },
- goLineEnd: function (a) {
- a.extendSelectionsBy(function (b) {
- return Ug(a, b.head.line)
- }, {
- origin: "+move",
- bias: -1
- })
- },
- goLineRight: function (a) {
- a.extendSelectionsBy(function (b) {
- var c = a.charCoords(b.head, "div")
- .top + 5;
- return a.coordsChar({
- left: a.display.lineDiv.offsetWidth + 100,
- top: c
- }, "div")
- }, Xf)
- },
- goLineLeft: function (a) {
- a.extendSelectionsBy(function (b) {
- var c = a.charCoords(b.head, "div")
- .top + 5;
- return a.coordsChar({
- left: 0,
- top: c
- }, "div")
- }, Xf)
- },
- goLineLeftSmart: function (a) {
- a.extendSelectionsBy(function (b) {
- var c = a.charCoords(b.head, "div")
- .top + 5,
- d = a.coordsChar({
- left: 0,
- top: c
- }, "div");
- return d.ch < a.getLine(d.line)
- .search(/\S/) ? Vg(a, b.head) : d
- }, Xf)
- },
- goLineUp: function (a) {
- a.moveV(-1, "line")
- },
- goLineDown: function (a) {
- a.moveV(1, "line")
- },
- goPageUp: function (a) {
- a.moveV(-1, "page")
- },
- goPageDown: function (a) {
- a.moveV(1, "page")
- },
- goCharLeft: function (a) {
- a.moveH(-1, "char")
- },
- goCharRight: function (a) {
- a.moveH(1, "char")
- },
- goColumnLeft: function (a) {
- a.moveH(-1, "column")
- },
- goColumnRight: function (a) {
- a.moveH(1, "column")
- },
- goWordLeft: function (a) {
- a.moveH(-1, "word")
- },
- goGroupRight: function (a) {
- a.moveH(1, "group")
- },
- goGroupLeft: function (a) {
- a.moveH(-1, "group")
- },
- goWordRight: function (a) {
- a.moveH(1, "word")
- },
- delCharBefore: function (a) {
- a.deleteH(-1, "char")
- },
- delCharAfter: function (a) {
- a.deleteH(1, "char")
- },
- delWordBefore: function (a) {
- a.deleteH(-1, "word")
- },
- delWordAfter: function (a) {
- a.deleteH(1, "word")
- },
- delGroupBefore: function (a) {
- a.deleteH(-1, "group")
- },
- delGroupAfter: function (a) {
- a.deleteH(1, "group")
- },
- indentAuto: function (a) {
- a.indentSelection("smart")
- },
- indentMore: function (a) {
- a.indentSelection("add")
- },
- indentLess: function (a) {
- a.indentSelection("subtract")
- },
- insertTab: function (a) {
- a.replaceSelection(" ")
- },
- insertSoftTab: function (a) {
- for (var b = [], c = a.listSelections(), d = a.options.tabSize, e = 0; e < c.length; e++) {
- var f = c[e].from(),
- g = Zf(a.getLine(f.line), f.ch, d);
- b.push(new Array(d - g % d + 1)
- .join(" "))
- }
- a.replaceSelections(b)
- },
- defaultTab: function (a) {
- a.somethingSelected() ? a.indentSelection("add") : a.execCommand("insertTab")
- },
- transposeChars: function (a) {
- cc(a, function () {
- for (var b = a.listSelections(), c = [], d = 0; d < b.length; d++) {
- var e = b[d].head,
- f = ff(a.doc, e.line)
- .text;
- if (f)
- if (e.ch == f.length && (e = new oa(e.line, e.ch - 1)), e.ch > 0) e = new oa(e.line, e.ch + 1), a.replaceRange(f.charAt(e.ch - 1) + f.charAt(e.ch - 2), oa(e.line, e.ch - 2), e, "+transpose");
- else if (e.line > a.doc.first) {
- var g = ff(a.doc, e.line - 1)
- .text;
- g && a.replaceRange(f.charAt(0) + a.doc.lineSeparator() + g.charAt(g.length - 1), oa(e.line - 1, g.length - 1), oa(e.line, 1), "+transpose")
- }
- c.push(new Ka(e, e))
- }
- a.setSelections(c)
- })
- },
- newlineAndIndent: function (a) {
- cc(a, function () {
- for (var b = a.listSelections()
- .length, c = 0; b > c; c++) {
- var d = a.listSelections()[c];
- a.replaceRange(a.doc.lineSeparator(), d.anchor, d.head, "+input"), a.indentLine(d.from()
- .line + 1, null, !0), td(a)
- }
- })
- },
- toggleOverwrite: function (a) {
- a.toggleOverwrite()
- }
- },
- Md = v.keyMap = {};
- Md.basic = {
- Left: "goCharLeft",
- Right: "goCharRight",
- Up: "goLineUp",
- Down: "goLineDown",
- End: "goLineEnd",
- Home: "goLineStartSmart",
- PageUp: "goPageUp",
- PageDown: "goPageDown",
- Delete: "delCharAfter",
- Backspace: "delCharBefore",
- "Shift-Backspace": "delCharBefore",
- Tab: "defaultTab",
- "Shift-Tab": "indentAuto",
- Enter: "newlineAndIndent",
- Insert: "toggleOverwrite",
- Esc: "singleSelection"
- }, Md.pcDefault = {
- "Ctrl-A": "selectAll",
- "Ctrl-D": "deleteLine",
- "Ctrl-Z": "undo",
- "Shift-Ctrl-Z": "redo",
- "Ctrl-Y": "redo",
- "Ctrl-Home": "goDocStart",
- "Ctrl-End": "goDocEnd",
- "Ctrl-Up": "goLineUp",
- "Ctrl-Down": "goLineDown",
- "Ctrl-Left": "goGroupLeft",
- "Ctrl-Right": "goGroupRight",
- "Alt-Left": "goLineStart",
- "Alt-Right": "goLineEnd",
- "Ctrl-Backspace": "delGroupBefore",
- "Ctrl-Delete": "delGroupAfter",
- "Ctrl-S": "save",
- "Ctrl-F": "find",
- "Ctrl-G": "findNext",
- "Shift-Ctrl-G": "findPrev",
- "Shift-Ctrl-F": "replace",
- "Shift-Ctrl-R": "replaceAll",
- "Ctrl-[": "indentLess",
- "Ctrl-]": "indentMore",
- "Ctrl-U": "undoSelection",
- "Shift-Ctrl-U": "redoSelection",
- "Alt-U": "redoSelection",
- fallthrough: "basic"
- }, Md.emacsy = {
- "Ctrl-F": "goCharRight",
- "Ctrl-B": "goCharLeft",
- "Ctrl-P": "goLineUp",
- "Ctrl-N": "goLineDown",
- "Alt-F": "goWordRight",
- "Alt-B": "goWordLeft",
- "Ctrl-A": "goLineStart",
- "Ctrl-E": "goLineEnd",
- "Ctrl-V": "goPageDown",
- "Shift-Ctrl-V": "goPageUp",
- "Ctrl-D": "delCharAfter",
- "Ctrl-H": "delCharBefore",
- "Alt-D": "delWordAfter",
- "Alt-Backspace": "delWordBefore",
- "Ctrl-K": "killLine",
- "Ctrl-T": "transposeChars"
- }, Md.macDefault = {
- "Cmd-A": "selectAll",
- "Cmd-D": "deleteLine",
- "Cmd-Z": "undo",
- "Shift-Cmd-Z": "redo",
- "Cmd-Y": "redo",
- "Cmd-Home": "goDocStart",
- "Cmd-Up": "goDocStart",
- "Cmd-End": "goDocEnd",
- "Cmd-Down": "goDocEnd",
- "Alt-Left": "goGroupLeft",
- "Alt-Right": "goGroupRight",
- "Cmd-Left": "goLineLeft",
- "Cmd-Right": "goLineRight",
- "Alt-Backspace": "delGroupBefore",
- "Ctrl-Alt-Backspace": "delGroupAfter",
- "Alt-Delete": "delGroupAfter",
- "Cmd-S": "save",
- "Cmd-F": "find",
- "Cmd-G": "findNext",
- "Shift-Cmd-G": "findPrev",
- "Cmd-Alt-F": "replace",
- "Shift-Cmd-Alt-F": "replaceAll",
- "Cmd-[": "indentLess",
- "Cmd-]": "indentMore",
- "Cmd-Backspace": "delWrappedLineLeft",
- "Cmd-Delete": "delWrappedLineRight",
- "Cmd-U": "undoSelection",
- "Shift-Cmd-U": "redoSelection",
- "Ctrl-Up": "goDocStart",
- "Ctrl-Down": "goDocEnd",
- fallthrough: ["basic", "emacsy"]
- }, Md["default"] = o ? Md.macDefault : Md.pcDefault, v.normalizeKeyMap = function (a) {
- var b = {};
- for (var c in a)
- if (a.hasOwnProperty(c)) {
- var d = a[c];
- if (/^(name|fallthrough|(de|at)tach)$/.test(c)) continue;
- if ("..." == d) {
- delete a[c];
- continue
- }
- for (var e = eg(c.split(" "), Nd), f = 0; f < e.length; f++) {
- var g, h;
- f == e.length - 1 ? (h = e.join(" "), g = d) : (h = e.slice(0, f + 1)
- .join(" "), g = "...");
- var i = b[h];
- if (i) {
- if (i != g) throw new Error("Inconsistent bindings for " + h)
- } else b[h] = g
- }
- delete a[c]
- }
- for (var j in b) a[j] = b[j];
- return a
- };
- var Od = v.lookupKey = function (a, b, c, d) {
- b = Rd(b);
- var e = b.call ? b.call(a, d) : b[a];
- if (e === !1) return "nothing";
- if ("..." === e) return "multi";
- if (null != e && c(e)) return "handled";
- if (b.fallthrough) {
- if ("[object Array]" != Object.prototype.toString.call(b.fallthrough)) return Od(a, b.fallthrough, c, d);
- for (var f = 0; f < b.fallthrough.length; f++) {
- var g = Od(a, b.fallthrough[f], c, d);
- if (g) return g
- }
- }
- },
- Pd = v.isModifierKey = function (a) {
- var b = "string" == typeof a ? a : Ng[a.keyCode];
- return "Ctrl" == b || "Alt" == b || "Shift" == b || "Mod" == b
- },
- Qd = v.keyName = function (a, b) {
- if (i && 34 == a.keyCode && a["char"]) return !1;
- var c = Ng[a.keyCode],
- d = c;
- return null == d || a.altGraphKey ? !1 : (a.altKey && "Alt" != c && (d = "Alt-" + d), (r ? a.metaKey : a.ctrlKey) && "Ctrl" != c && (d = "Ctrl-" + d), (r ? a.ctrlKey : a.metaKey) && "Cmd" != c && (d = "Cmd-" + d), !b && a.shiftKey && "Shift" != c && (d = "Shift-" + d), d)
- };
- v.fromTextArea = function (a, b) {
- function d() {
- a.value = i.getValue()
- }
- if (b = b ? hg(b) : {}, b.value = a.value, !b.tabindex && a.tabIndex && (b.tabindex = a.tabIndex), !b.placeholder && a.placeholder && (b.placeholder = a.placeholder), null == b.autofocus) {
- var c = ug();
- b.autofocus = c == a || null != a.getAttribute("autofocus") && c == document.body
- }
- if (a.form && (Jf(a.form, "submit", d), !b.leaveSubmitMethodAlone)) {
- var e = a.form,
- f = e.submit;
- try {
- var g = e.submit = function () {
- d(), e.submit = f, e.submit(), e.submit = g
- }
- } catch (h) {}
- }
- b.finishInit = function (b) {
- b.save = d, b.getTextArea = function () {
- return a
- }, b.toTextArea = function () {
- b.toTextArea = isNaN, d(), a.parentNode.removeChild(b.getWrapperElement()), a.style.display = "", a.form && (Kf(a.form, "submit", d), "function" == typeof a.form.submit && (a.form.submit = f))
- }
- }, a.style.display = "none";
- var i = v(function (b) {
- a.parentNode.insertBefore(b, a.nextSibling)
- }, b);
- return i
- };
- var Sd = v.StringStream = function (a, b) {
- this.pos = this.start = 0, this.string = a, this.tabSize = b || 8, this.lastColumnPos = this.lastColumnValue = 0, this.lineStart = 0
- };
- Sd.prototype = {
- eol: function () {
- return this.pos >= this.string.length
- },
- sol: function () {
- return this.pos == this.lineStart
- },
- peek: function () {
- return this.string.charAt(this.pos) || void 0
- },
- next: function () {
- return this.pos < this.string.length ? this.string.charAt(this.pos++) : void 0
- },
- eat: function (a) {
- var b = this.string.charAt(this.pos);
- if ("string" == typeof a) var c = b == a;
- else var c = b && (a.test ? a.test(b) : a(b));
- return c ? (++this.pos, b) : void 0
- },
- eatWhile: function (a) {
- for (var b = this.pos; this.eat(a););
- return this.pos > b
- },
- eatSpace: function () {
- for (var a = this.pos;
- /[\s\u00a0]/.test(this.string.charAt(this.pos));) ++this.pos;
- return this.pos > a
- },
- skipToEnd: function () {
- this.pos = this.string.length
- },
- skipTo: function (a) {
- var b = this.string.indexOf(a, this.pos);
- return b > -1 ? (this.pos = b, !0) : void 0
- },
- backUp: function (a) {
- this.pos -= a
- },
- column: function () {
- return this.lastColumnPos < this.start && (this.lastColumnValue = Zf(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue), this.lastColumnPos = this.start), this.lastColumnValue - (this.lineStart ? Zf(this.string, this.lineStart, this.tabSize) : 0)
- },
- indentation: function () {
- return Zf(this.string, null, this.tabSize) - (this.lineStart ? Zf(this.string, this.lineStart, this.tabSize) : 0)
- },
- match: function (a, b, c) {
- if ("string" != typeof a) {
- var f = this.string.slice(this.pos)
- .match(a);
- return f && f.index > 0 ? null : (f && b !== !1 && (this.pos += f[0].length), f)
- }
- var d = function (a) {
- return c ? a.toLowerCase() : a
- },
- e = this.string.substr(this.pos, a.length);
- return d(e) == d(a) ? (b !== !1 && (this.pos += a.length), !0) : void 0
- },
- current: function () {
- return this.string.slice(this.start, this.pos)
- },
- hideFirstChars: function (a, b) {
- this.lineStart += a;
- try {
- return b()
- } finally {
- this.lineStart -= a
- }
- }
- };
- var Td = 0,
- Ud = v.TextMarker = function (a, b) {
- this.lines = [], this.type = b, this.doc = a, this.id = ++Td
- };
- Sf(Ud), Ud.prototype.clear = function () {
- if (!this.explicitlyCleared) {
- var a = this.doc.cm,
- b = a && !a.curOp;
- if (b && Vb(a), Rf(this, "clear")) {
- var c = this.find();
- c && Nf(this, "clear", c.from, c.to)
- }
- for (var d = null, e = null, f = 0; f < this.lines.length; ++f) {
- var g = this.lines[f],
- h = ae(g.markedSpans, this);
- a && !this.collapsed ? jc(a, kf(g), "text") : a && (null != h.to && (e = kf(g)), null != h.from && (d = kf(g))), g.markedSpans = be(g.markedSpans, h), null == h.from && this.collapsed && !we(this.doc, g) && a && jf(g, Rb(a.display))
- }
- if (a && this.collapsed && !a.options.lineWrapping)
- for (var f = 0; f < this.lines.length; ++f) {
- var i = se(this.lines[f]),
- j = G(i);
- j > a.display.maxLineLength && (a.display.maxLine = i, a.display.maxLineLength = j, a.display.maxLineChanged = !0)
- }
- null != d && a && this.collapsed && ic(a, d, e + 1), this.lines.length = 0, this.explicitlyCleared = !0, this.atomic && this.doc.cantEdit && (this.doc.cantEdit = !1, a && ab(a.doc)), a && Nf(a, "markerCleared", a, this), b && Xb(a), this.parent && this.parent.clear()
- }
- }, Ud.prototype.find = function (a, b) {
- null == a && "bookmark" == this.type && (a = 1);
- for (var c, d, e = 0; e < this.lines.length; ++e) {
- var f = this.lines[e],
- g = ae(f.markedSpans, this);
- if (null != g.from && (c = oa(b ? f : kf(f), g.from), -1 == a)) return c;
- if (null != g.to && (d = oa(b ? f : kf(f), g.to), 1 == a)) return d
- }
- return c && {
- from: c,
- to: d
- }
- }, Ud.prototype.changed = function () {
- var a = this.find(-1, !0),
- b = this,
- c = this.doc.cm;
- a && c && cc(c, function () {
- var d = a.line,
- e = kf(a.line),
- f = wb(c, e);
- if (f && (Db(f), c.curOp.selectionChanged = c.curOp.forceUpdate = !0), c.curOp.updateMaxLine = !0, !we(b.doc, d) && null != b.height) {
- var g = b.height;
- b.height = null;
- var h = Ae(b) - g;
- h && jf(d, d.height + h)
- }
- })
- }, Ud.prototype.attachLine = function (a) {
- if (!this.lines.length && this.doc.cm) {
- var b = this.doc.cm.curOp;
- b.maybeHiddenMarkers && -1 != dg(b.maybeHiddenMarkers, this) || (b.maybeUnhiddenMarkers || (b.maybeUnhiddenMarkers = []))
- .push(this)
- }
- this.lines.push(a)
- }, Ud.prototype.detachLine = function (a) {
- if (this.lines.splice(dg(this.lines, a), 1), !this.lines.length && this.doc.cm) {
- var b = this.doc.cm.curOp;
- (b.maybeHiddenMarkers || (b.maybeHiddenMarkers = []))
- .push(this)
- }
- };
- var Td = 0,
- Wd = v.SharedTextMarker = function (a, b) {
- this.markers = a, this.primary = b;
- for (var c = 0; c < a.length; ++c) a[c].parent = this
- };
- Sf(Wd), Wd.prototype.clear = function () {
- if (!this.explicitlyCleared) {
- this.explicitlyCleared = !0;
- for (var a = 0; a < this.markers.length; ++a) this.markers[a].clear();
- Nf(this, "clear")
- }
- }, Wd.prototype.find = function (a, b) {
- return this.primary.find(a, b)
- };
- var ye = v.LineWidget = function (a, b, c) {
- if (c)
- for (var d in c) c.hasOwnProperty(d) && (this[d] = c[d]);
- this.doc = a, this.node = b
- };
- Sf(ye), ye.prototype.clear = function () {
- var a = this.doc.cm,
- b = this.line.widgets,
- c = this.line,
- d = kf(c);
- if (null != d && b) {
- for (var e = 0; e < b.length; ++e) b[e] == this && b.splice(e--, 1);
- b.length || (c.widgets = null);
- var f = Ae(this);
- jf(c, Math.max(0, c.height - f)), a && cc(a, function () {
- ze(a, c, -f), jc(a, d, "widget")
- })
- }
- }, ye.prototype.changed = function () {
- var a = this.height,
- b = this.doc.cm,
- c = this.line;
- this.height = null;
- var d = Ae(this) - a;
- d && (jf(c, c.height + d), b && cc(b, function () {
- b.curOp.forceUpdate = !0, ze(b, c, d)
- }))
- };
- var Ce = v.Line = function (a, b, c) {
- this.text = a, ke(this, b), this.height = c ? c(this) : 1
- };
- Sf(Ce), Ce.prototype.lineNo = function () {
- return kf(this)
- };
- var Ne = {},
- Oe = {};
- Ze.prototype = {
- chunkSize: function () {
- return this.lines.length
- },
- removeInner: function (a, b) {
- for (var c = a, d = a + b; d > c; ++c) {
- var e = this.lines[c];
- this.height -= e.height, Ee(e), Nf(e, "delete")
- }
- this.lines.splice(a, b)
- },
- collapse: function (a) {
- a.push.apply(a, this.lines)
- },
- insertInner: function (a, b, c) {
- this.height += c, this.lines = this.lines.slice(0, a)
- .concat(b)
- .concat(this.lines.slice(a));
- for (var d = 0; d < b.length; ++d) b[d].parent = this
- },
- iterN: function (a, b, c) {
- for (var d = a + b; d > a; ++a)
- if (c(this.lines[a])) return !0
- }
- }, $e.prototype = {
- chunkSize: function () {
- return this.size
- },
- removeInner: function (a, b) {
- this.size -= b;
- for (var c = 0; c < this.children.length; ++c) {
- var d = this.children[c],
- e = d.chunkSize();
- if (e > a) {
- var f = Math.min(b, e - a),
- g = d.height;
- if (d.removeInner(a, f), this.height -= g - d.height, e == f && (this.children.splice(c--, 1), d.parent = null), 0 == (b -= f)) break;
- a = 0
- } else a -= e
- }
- if (this.size - b < 25 && (this.children.length > 1 || !(this.children[0] instanceof Ze))) {
- var h = [];
- this.collapse(h), this.children = [new Ze(h)], this.children[0].parent = this
- }
- },
- collapse: function (a) {
- for (var b = 0; b < this.children.length; ++b) this.children[b].collapse(a)
- },
- insertInner: function (a, b, c) {
- this.size += b.length, this.height += c;
- for (var d = 0; d < this.children.length; ++d) {
- var e = this.children[d],
- f = e.chunkSize();
- if (f >= a) {
- if (e.insertInner(a, b, c), e.lines && e.lines.length > 50) {
- for (; e.lines.length > 50;) {
- var g = e.lines.splice(e.lines.length - 25, 25),
- h = new Ze(g);
- e.height -= h.height, this.children.splice(d + 1, 0, h), h.parent = this
- }
- this.maybeSpill()
- }
- break
- }
- a -= f
- }
- },
- maybeSpill: function () {
- if (!(this.children.length <= 10)) {
- var a = this;
- do {
- var b = a.children.splice(a.children.length - 5, 5),
- c = new $e(b);
- if (a.parent) {
- a.size -= c.size, a.height -= c.height;
- var e = dg(a.parent.children, a);
- a.parent.children.splice(e + 1, 0, c)
- } else {
- var d = new $e(a.children);
- d.parent = a, a.children = [d, c], a = d
- }
- c.parent = a.parent
- } while (a.children.length > 10);
- a.parent.maybeSpill()
- }
- },
- iterN: function (a, b, c) {
- for (var d = 0; d < this.children.length; ++d) {
- var e = this.children[d],
- f = e.chunkSize();
- if (f > a) {
- var g = Math.min(b, f - a);
- if (e.iterN(a, g, c)) return !0;
- if (0 == (b -= g)) break;
- a = 0
- } else a -= f
- }
- }
- };
- var _e = 0,
- af = v.Doc = function (a, b, c, d) {
- if (!(this instanceof af)) return new af(a, b, c, d);
- null == c && (c = 0), $e.call(this, [new Ze([new Ce("", null)])]), this.first = c, this.scrollTop = this.scrollLeft = 0, this.cantEdit = !1, this.cleanGeneration = 1, this.frontier = c;
- var e = oa(c, 0);
- this.sel = Ma(e), this.history = new of(null), this.id = ++_e, this.modeOption = b, this.lineSep = d, "string" == typeof a && (a = this.splitLines(a)), Ye(this, {
- from: e,
- to: e,
- text: a
- }), Za(this, Ma(e), Vf)
- };
- af.prototype = gg($e.prototype, {
- constructor: af,
- iter: function (a, b, c) {
- c ? this.iterN(a - this.first, b - a, c) : this.iterN(this.first, this.first + this.size, a)
- },
- insert: function (a, b) {
- for (var c = 0, d = 0; d < b.length; ++d) c += b[d].height;
- this.insertInner(a - this.first, b, c)
- },
- remove: function (a, b) {
- this.removeInner(a - this.first, b)
- },
- getValue: function (a) {
- var b = hf(this, this.first, this.first + this.size);
- return a === !1 ? b : b.join(a || this.lineSeparator())
- },
- setValue: fc(function (a) {
- var b = oa(this.first, 0),
- c = this.first + this.size - 1;
- hd(this, {
- from: b,
- to: oa(c, ff(this, c)
- .text.length),
- text: this.splitLines(a),
- origin: "setValue",
- full: !0
- }, !0), Za(this, Ma(b))
- }),
- replaceRange: function (a, b, c, d) {
- b = Oa(this, b), c = c ? Oa(this, c) : b, nd(this, a, b, c, d)
- },
- getRange: function (a, b, c) {
- var d = gf(this, Oa(this, a), Oa(this, b));
- return c === !1 ? d : d.join(c || this.lineSeparator())
- },
- getLine: function (a) {
- var b = this.getLineHandle(a);
- return b && b.text
- },
- getLineHandle: function (a) {
- return Qa(this, a) ? ff(this, a) : void 0
- },
- getLineNumber: function (a) {
- return kf(a)
- },
- getLineHandleVisualStart: function (a) {
- return "number" == typeof a && (a = ff(this, a)), se(a)
- },
- lineCount: function () {
- return this.size
- },
- firstLine: function () {
- return this.first
- },
- lastLine: function () {
- return this.first + this.size - 1
- },
- clipPos: function (a) {
- return Oa(this, a)
- },
- getCursor: function (a) {
- var c, b = this.sel.primary();
- return c = null == a || "head" == a ? b.head : "anchor" == a ? b.anchor : "end" == a || "to" == a || a === !1 ? b.to() : b.from()
- },
- listSelections: function () {
- return this.sel.ranges
- },
- somethingSelected: function () {
- return this.sel.somethingSelected()
- },
- setCursor: fc(function (a, b, c) {
- Wa(this, Oa(this, "number" == typeof a ? oa(a, b || 0) : a), null, c)
- }),
- setSelection: fc(function (a, b, c) {
- Wa(this, Oa(this, a), Oa(this, b || a), c)
- }),
- extendSelection: fc(function (a, b, c) {
- Ta(this, Oa(this, a), b && Oa(this, b), c)
- }),
- extendSelections: fc(function (a, b) {
- Ua(this, Ra(this, a, b))
- }),
- extendSelectionsBy: fc(function (a, b) {
- Ua(this, eg(this.sel.ranges, a), b)
- }),
- setSelections: fc(function (a, b, c) {
- if (a.length) {
- for (var d = 0, e = []; d < a.length; d++) e[d] = new Ka(Oa(this, a[d].anchor), Oa(this, a[d].head));
- null == b && (b = Math.min(a.length - 1, this.sel.primIndex)), Za(this, La(e, b), c)
- }
- }),
- addSelection: fc(function (a, b, c) {
- var d = this.sel.ranges.slice(0);
- d.push(new Ka(Oa(this, a), Oa(this, b || a))), Za(this, La(d, d.length - 1), c)
- }),
- getSelection: function (a) {
- for (var c, b = this.sel.ranges, d = 0; d < b.length; d++) {
- var e = gf(this, b[d].from(), b[d].to());
- c = c ? c.concat(e) : e
- }
- return a === !1 ? c : c.join(a || this.lineSeparator())
- },
- getSelections: function (a) {
- for (var b = [], c = this.sel.ranges, d = 0; d < c.length; d++) {
- var e = gf(this, c[d].from(), c[d].to());
- a !== !1 && (e = e.join(a || this.lineSeparator())), b[d] = e
- }
- return b
- },
- replaceSelection: function (a, b, c) {
- for (var d = [], e = 0; e < this.sel.ranges.length; e++) d[e] = a;
- this.replaceSelections(d, b, c || "+input")
- },
- replaceSelections: fc(function (a, b, c) {
- for (var d = [], e = this.sel, f = 0; f < e.ranges.length; f++) {
- var g = e.ranges[f];
- d[f] = {
- from: g.from(),
- to: g.to(),
- text: this.splitLines(a[f]),
- origin: c
- }
- }
- for (var h = b && "end" != b && fd(this, d, b), f = d.length - 1; f >= 0; f--) hd(this, d[f]);
- h ? Ya(this, h) : this.cm && td(this.cm)
- }),
- undo: fc(function () {
- jd(this, "undo")
- }),
- redo: fc(function () {
- jd(this, "redo")
- }),
- undoSelection: fc(function () {
- jd(this, "undo", !0)
- }),
- redoSelection: fc(function () {
- jd(this, "redo", !0)
- }),
- setExtending: function (a) {
- this.extend = a
- },
- getExtending: function () {
- return this.extend
- },
- historySize: function () {
- for (var a = this.history, b = 0, c = 0, d = 0; d < a.done.length; d++) a.done[d].ranges || ++b;
- for (var d = 0; d < a.undone.length; d++) a.undone[d].ranges || ++c;
- return {
- undo: b,
- redo: c
- }
- },
- clearHistory: function () {
- this.history = new of(this.history.maxGeneration)
- },
- markClean: function () {
- this.cleanGeneration = this.changeGeneration(!0)
- },
- changeGeneration: function (a) {
- return a && (this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null), this.history.generation
- },
- isClean: function (a) {
- return this.history.generation == (a || this.cleanGeneration)
- },
- getHistory: function () {
- return {
- done: zf(this.history.done),
- undone: zf(this.history.undone)
- }
- },
- setHistory: function (a) {
- var b = this.history = new of(this.history.maxGeneration);
- b.done = zf(a.done.slice(0), null, !0), b.undone = zf(a.undone.slice(0), null, !0)
- },
- addLineClass: fc(function (a, b, c) {
- return wd(this, a, "gutter" == b ? "gutter" : "class", function (a) {
- var d = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass";
- if (a[d]) {
- if (vg(c)
- .test(a[d])) return !1;
- a[d] += " " + c
- } else a[d] = c;
- return !0
- })
- }),
- removeLineClass: fc(function (a, b, c) {
- return wd(this, a, "gutter" == b ? "gutter" : "class", function (a) {
- var d = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass",
- e = a[d];
- if (!e) return !1;
- if (null == c) a[d] = null;
- else {
- var f = e.match(vg(c));
- if (!f) return !1;
- var g = f.index + f[0].length;
- a[d] = e.slice(0, f.index) + (f.index && g != e.length ? " " : "") + e.slice(g) || null
- }
- return !0
- })
- }),
- addLineWidget: fc(function (a, b, c) {
- return Be(this, a, b, c)
- }),
- removeLineWidget: function (a) {
- a.clear()
- },
- markText: function (a, b, c) {
- return Vd(this, Oa(this, a), Oa(this, b), c, "range")
- },
- setBookmark: function (a, b) {
- var c = {
- replacedWith: b && (null == b.nodeType ? b.widget : b),
- insertLeft: b && b.insertLeft,
- clearWhenEmpty: !1,
- shared: b && b.shared,
- handleMouseEvents: b && b.handleMouseEvents
- };
- return a = Oa(this, a), Vd(this, a, a, c, "bookmark")
- },
- findMarksAt: function (a) {
- a = Oa(this, a);
- var b = [],
- c = ff(this, a.line)
- .markedSpans;
- if (c)
- for (var d = 0; d < c.length; ++d) {
- var e = c[d];
- (null == e.from || e.from <= a.ch) && (null == e.to || e.to >= a.ch) && b.push(e.marker.parent || e.marker)
- }
- return b
- },
- findMarks: function (a, b, c) {
- a = Oa(this, a), b = Oa(this, b);
- var d = [],
- e = a.line;
- return this.iter(a.line, b.line + 1, function (f) {
- var g = f.markedSpans;
- if (g)
- for (var h = 0; h < g.length; h++) {
- var i = g[h];
- e == a.line && a.ch > i.to || null == i.from && e != a.line || e == b.line && i.from > b.ch || c && !c(i.marker) || d.push(i.marker.parent || i.marker)
- }++e
- }), d
- },
- getAllMarks: function () {
- var a = [];
- return this.iter(function (b) {
- var c = b.markedSpans;
- if (c)
- for (var d = 0; d < c.length; ++d) null != c[d].from && a.push(c[d].marker)
- }), a
- },
- posFromIndex: function (a) {
- var b, c = this.first;
- return this.iter(function (d) {
- var e = d.text.length + 1;
- return e > a ? (b = a, !0) : (a -= e, void++c)
- }), Oa(this, oa(c, b))
- },
- indexFromPos: function (a) {
- a = Oa(this, a);
- var b = a.ch;
- return a.line < this.first || a.ch < 0 ? 0 : (this.iter(this.first, a.line, function (a) {
- b += a.text.length + 1
- }), b)
- },
- copy: function (a) {
- var b = new af(hf(this, this.first, this.first + this.size), this.modeOption, this.first, this.lineSep);
- return b.scrollTop = this.scrollTop, b.scrollLeft = this.scrollLeft, b.sel = this.sel, b.extend = !1, a && (b.history.undoDepth = this.history.undoDepth, b.setHistory(this.getHistory())), b
- },
- linkedDoc: function (a) {
- a || (a = {});
- var b = this.first,
- c = this.first + this.size;
- null != a.from && a.from > b && (b = a.from), null != a.to && a.to < c && (c = a.to);
- var d = new af(hf(this, b, c), a.mode || this.modeOption, b, this.lineSep);
- return a.sharedHist && (d.history = this.history), (this.linked || (this.linked = []))
- .push({
- doc: d,
- sharedHist: a.sharedHist
- }), d.linked = [{
- doc: this,
- isParent: !0,
- sharedHist: a.sharedHist
- }], Zd(d, Yd(this)), d
- },
- unlinkDoc: function (a) {
- if (a instanceof v && (a = a.doc), this.linked)
- for (var b = 0; b < this.linked.length; ++b) {
- var c = this.linked[b];
- if (c.doc == a) {
- this.linked.splice(b, 1), a.unlinkDoc(this), $d(Yd(this));
- break
- }
- }
- if (a.history == this.history) {
- var d = [a.id];
- df(a, function (a) {
- d.push(a.id)
- }, !0), a.history = new of(null), a.history.done = zf(this.history.done, d), a.history.undone = zf(this.history.undone, d)
- }
- },
- iterLinkedDocs: function (a) {
- df(this, a)
- },
- getMode: function () {
- return this.mode
- },
- getEditor: function () {
- return this.cm
- },
- splitLines: function (a) {
- return this.lineSep ? a.split(this.lineSep) : Ig(a)
- },
- lineSeparator: function () {
- return this.lineSep || "\n"
- }
- }), af.prototype.eachLine = af.prototype.iter;
- var bf = "iter insert remove copy getEditor constructor".split(" ");
- for (var cf in af.prototype) af.prototype.hasOwnProperty(cf) && dg(bf, cf) < 0 && (v.prototype[cf] = function (a) {
- return function () {
- return a.apply(this.doc, arguments)
- }
- }(af.prototype[cf]));
- Sf(af);
- var Df = v.e_preventDefault = function (a) {
- a.preventDefault ? a.preventDefault() : a.returnValue = !1
- },
- Ef = v.e_stopPropagation = function (a) {
- a.stopPropagation ? a.stopPropagation() : a.cancelBubble = !0
- },
- Gf = v.e_stop = function (a) {
- Df(a), Ef(a)
- },
- Jf = v.on = function (a, b, c) {
- if (a.addEventListener) a.addEventListener(b, c, !1);
- else if (a.attachEvent) a.attachEvent("on" + b, c);
- else {
- var d = a._handlers || (a._handlers = {}),
- e = d[b] || (d[b] = []);
- e.push(c)
- }
- },
- Kf = v.off = function (a, b, c) {
- if (a.removeEventListener) a.removeEventListener(b, c, !1);
- else if (a.detachEvent) a.detachEvent("on" + b, c);
- else {
- var d = a._handlers && a._handlers[b];
- if (!d) return;
- for (var e = 0; e < d.length; ++e)
- if (d[e] == c) {
- d.splice(e, 1);
- break
- }
- }
- },
- Lf = v.signal = function (a, b) {
- var c = a._handlers && a._handlers[b];
- if (c)
- for (var d = Array.prototype.slice.call(arguments, 2), e = 0; e < c.length; ++e) c[e].apply(null, d)
- },
- Mf = null,
- Tf = 30,
- Uf = v.Pass = {
- toString: function () {
- return "CodeMirror.Pass"
- }
- },
- Vf = {
- scroll: !1
- },
- Wf = {
- origin: "*mouse"
- },
- Xf = {
- origin: "+move"
- };
- Yf.prototype.set = function (a, b) {
- clearTimeout(this.id), this.id = setTimeout(b, a)
- };
- var Zf = v.countColumn = function (a, b, c, d, e) {
- null == b && (b = a.search(/[^\s\u00a0]/), -1 == b && (b = a.length));
- for (var f = d || 0, g = e || 0;;) {
- var h = a.indexOf(" ", f);
- if (0 > h || h >= b) return g + (b - f);
- g += h - f, g += c - g % c, f = h + 1
- }
- },
- $f = v.findColumn = function (a, b, c) {
- for (var d = 0, e = 0;;) {
- var f = a.indexOf(" ", d); - 1 == f && (f = a.length);
- var g = f - d;
- if (f == a.length || e + g >= b) return d + Math.min(g, b - e);
- if (e += f - d, e += c - e % c, d = f + 1, e >= b) return d
- }
- },
- _f = [""],
- cg = function (a) {
- a.select()
- };
- m ? cg = function (a) {
- a.selectionStart = 0, a.selectionEnd = a.value.length
- } : d && (cg = function (a) {
- try {
- a.select()
- } catch (b) {}
- });
- var qg, jg = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,
- kg = v.isWordChar = function (a) {
- return /\w/.test(a) || a > "\x80" && (a.toUpperCase() != a.toLowerCase() || jg.test(a))
- },
- ng = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
- qg = document.createRange ? function (a, b, c, d) {
- var e = document.createRange();
- return e.setEnd(d || a, c), e.setStart(a, b), e
- } : function (a, b, c) {
- var d = document.body.createTextRange();
- try {
- d.moveToElementText(a.parentNode)
- } catch (e) {
- return d
- }
- return d.collapse(!0), d.moveEnd("character", c), d.moveStart("character", b), d
- };
- var tg = v.contains = function (a, b) {
- if (3 == b.nodeType && (b = b.parentNode), a.contains) return a.contains(b);
- do
- if (11 == b.nodeType && (b = b.host), b == a) return !0;
- while (b = b.parentNode)
- };
- d && 11 > e && (ug = function () {
- try {
- return document.activeElement
- } catch (a) {
- return document.body
- }
- });
- var Eg, Gg, wg = v.rmClass = function (a, b) {
- var c = a.className,
- d = vg(b)
- .exec(c);
- if (d) {
- var e = c.slice(d.index + d[0].length);
- a.className = c.slice(0, d.index) + (e ? d[1] + e : "")
- }
- },
- xg = v.addClass = function (a, b) {
- var c = a.className;
- vg(b)
- .test(c) || (a.className += (c ? " " : "") + b)
- },
- Ag = !1,
- Dg = function () {
- if (d && 9 > e) return !1;
- var a = pg("div");
- return "draggable" in a || "dragDrop" in a
- }(),
- Ig = v.splitLines = 3 != "\n\nb".split(/\n/)
- .length ? function (a) {
- for (var b = 0, c = [], d = a.length; d >= b;) {
- var e = a.indexOf("\n", b); - 1 == e && (e = a.length);
- var f = a.slice(b, "\r" == a.charAt(e - 1) ? e - 1 : e),
- g = f.indexOf("\r"); - 1 != g ? (c.push(f.slice(0, g)), b += g + 1) : (c.push(f), b = e + 1)
- }
- return c
- } : function (a) {
- return a.split(/\r\n?|\n/)
- },
- Jg = window.getSelection ? function (a) {
- try {
- return a.selectionStart != a.selectionEnd
- } catch (b) {
- return !1
- }
- } : function (a) {
- try {
- var b = a.ownerDocument.selection.createRange()
- } catch (c) {}
- return b && b.parentElement() == a ? 0 != b.compareEndPoints("StartToEnd", b) : !1
- },
- Kg = function () {
- var a = pg("div");
- return "oncopy" in a ? !0 : (a.setAttribute("oncopy", "return;"), "function" == typeof a.oncopy)
- }(),
- Lg = null,
- Ng = {
- 3: "Enter",
- 8: "Backspace",
- 9: "Tab",
- 13: "Enter",
- 16: "Shift",
- 17: "Ctrl",
- 18: "Alt",
- 19: "Pause",
- 20: "CapsLock",
- 27: "Esc",
- 32: "Space",
- 33: "PageUp",
- 34: "PageDown",
- 35: "End",
- 36: "Home",
- 37: "Left",
- 38: "Up",
- 39: "Right",
- 40: "Down",
- 44: "PrintScrn",
- 45: "Insert",
- 46: "Delete",
- 59: ";",
- 61: "=",
- 91: "Mod",
- 92: "Mod",
- 93: "Mod",
- 107: "=",
- 109: "-",
- 127: "Delete",
- 173: "-",
- 186: ";",
- 187: "=",
- 188: ",",
- 189: "-",
- 190: ".",
- 191: "/",
- 192: "`",
- 219: "[",
- 220: "\\",
- 221: "]",
- 222: "'",
- 63232: "Up",
- 63233: "Down",
- 63234: "Left",
- 63235: "Right",
- 63272: "Delete",
- 63273: "Home",
- 63275: "End",
- 63276: "PageUp",
- 63277: "PageDown",
- 63302: "Insert"
- };
- v.keyNames = Ng,
- function () {
- for (var a = 0; 10 > a; a++) Ng[a + 48] = Ng[a + 96] = String(a);
- for (var a = 65; 90 >= a; a++) Ng[a] = String.fromCharCode(a);
- for (var a = 1; 12 >= a; a++) Ng[a + 111] = Ng[a + 63235] = "F" + a
- }();
- var Xg, ah = function () {
- function c(c) {
- return 247 >= c ? a.charAt(c) : c >= 1424 && 1524 >= c ? "R" : c >= 1536 && 1773 >= c ? b.charAt(c - 1536) : c >= 1774 && 2220 >= c ? "r" : c >= 8192 && 8203 >= c ? "w" : 8204 == c ? "b" : "L"
- }
-
- function j(a, b, c) {
- this.level = a, this.from = b, this.to = c
- }
- var a = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",
- b = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",
- d = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,
- e = /[stwN]/,
- f = /[LRr]/,
- g = /[Lb1n]/,
- h = /[1n]/,
- i = "L";
- return function (a) {
- if (!d.test(a)) return !1;
- for (var m, b = a.length, k = [], l = 0; b > l; ++l) k.push(m = c(a.charCodeAt(l)));
- for (var l = 0, n = i; b > l; ++l) {
- var m = k[l];
- "m" == m ? k[l] = n : n = m
- }
- for (var l = 0, o = i; b > l; ++l) {
- var m = k[l];
- "1" == m && "r" == o ? k[l] = "n" : f.test(m) && (o = m, "r" == m && (k[l] = "R"))
- }
- for (var l = 1, n = k[0]; b - 1 > l; ++l) {
- var m = k[l];
- "+" == m && "1" == n && "1" == k[l + 1] ? k[l] = "1" : "," != m || n != k[l + 1] || "1" != n && "n" != n || (k[l] = n), n = m
- }
- for (var l = 0; b > l; ++l) {
- var m = k[l];
- if ("," == m) k[l] = "N";
- else if ("%" == m) {
- for (var p = l + 1; b > p && "%" == k[p]; ++p);
- for (var q = l && "!" == k[l - 1] || b > p && "1" == k[p] ? "1" : "N", r = l; p > r; ++r) k[r] = q;
- l = p - 1
- }
- }
- for (var l = 0, o = i; b > l; ++l) {
- var m = k[l];
- "L" == o && "1" == m ? k[l] = "L" : f.test(m) && (o = m)
- }
- for (var l = 0; b > l; ++l)
- if (e.test(k[l])) {
- for (var p = l + 1; b > p && e.test(k[p]); ++p);
- for (var s = "L" == (l ? k[l - 1] : i), t = "L" == (b > p ? k[p] : i), q = s || t ? "L" : "R", r = l; p > r; ++r) k[r] = q;
- l = p - 1
- }
- for (var v, u = [], l = 0; b > l;)
- if (g.test(k[l])) {
- var w = l;
- for (++l; b > l && g.test(k[l]); ++l);
- u.push(new j(0, w, l))
- } else {
- var x = l,
- y = u.length;
- for (++l; b > l && "L" != k[l]; ++l);
- for (var r = x; l > r;)
- if (h.test(k[r])) {
- r > x && u.splice(y, 0, new j(1, x, r));
- var z = r;
- for (++r; l > r && h.test(k[r]); ++r);
- u.splice(y, 0, new j(2, z, r)), x = r
- } else ++r;
- l > x && u.splice(y, 0, new j(1, x, l))
- }
- return 1 == u[0].level && (v = a.match(/^\s+/)) && (u[0].from = v[0].length, u.unshift(new j(0, 0, v[0].length))), 1 == bg(u)
- .level && (v = a.match(/\s+$/)) && (bg(u)
- .to -= v[0].length, u.push(new j(0, b - v[0].length, b))), 2 == u[0].level && u.unshift(new j(1, u[0].to, u[0].to)), u[0].level != bg(u)
- .level && u.push(new j(u[0].level, b, b)), u
- }
- }();
- return v.version = "5.6.1", v
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function b(a) {
- for (var b = {}, c = 0; c < a.length; ++c) b[a[c]] = !0;
- return b
- }
-
- function x(a, b) {
- for (var d, c = !1; null != (d = a.next());) {
- if (c && "/" == d) {
- b.tokenize = null;
- break
- }
- c = "*" == d
- }
- return ["comment", "comment"]
- }
- a.defineMode("css", function (b, c) {
- function u(a, b) {
- return s = b, a
- }
-
- function v(a, b) {
- var c = a.next();
- if (f[c]) {
- var d = f[c](a, b);
- if (d !== !1) return d
- }
- return "@" == c ? (a.eatWhile(/[\w\\\-]/), u("def", a.current())) : "=" == c || ("~" == c || "|" == c) && a.eat("=") ? u(null, "compare") : '"' == c || "'" == c ? (b.tokenize = w(c), b.tokenize(a, b)) : "#" == c ? (a.eatWhile(/[\w\\\-]/), u("atom", "hash")) : "!" == c ? (a.match(/^\s*\w*/), u("keyword", "important")) : /\d/.test(c) || "." == c && a.eat(/\d/) ? (a.eatWhile(/[\w.%]/), u("number", "unit")) : "-" !== c ? /[,+>*\/]/.test(c) ? u(null, "select-op") : "." == c && a.match(/^-?[_a-z][_a-z0-9-]*/i) ? u("qualifier", "qualifier") : /[:;{}\[\]\(\)]/.test(c) ? u(null, c) : "u" == c && a.match(/rl(-prefix)?\(/) || "d" == c && a.match("omain(") || "r" == c && a.match("egexp(") ? (a.backUp(1), b.tokenize = x, u("property", "word")) : /[\w\\\-]/.test(c) ? (a.eatWhile(/[\w\\\-]/), u("property", "word")) : u(null, null) : /[\d.]/.test(a.peek()) ? (a.eatWhile(/[\w.%]/), u("number", "unit")) : a.match(/^-[\w\\\-]+/) ? (a.eatWhile(/[\w\\\-]/), a.match(/^\s*:/, !1) ? u("variable-2", "variable-definition") : u("variable-2", "variable")) : a.match(/^\w+-/) ? u("meta", "meta") : void 0
- }
-
- function w(a) {
- return function (b, c) {
- for (var e, d = !1; null != (e = b.next());) {
- if (e == a && !d) {
- ")" == a && b.backUp(1);
- break
- }
- d = !d && "\\" == e
- }
- return (e == a || !d && ")" != a) && (c.tokenize = null), u("string", "string")
- }
- }
-
- function x(a, b) {
- return a.next(), a.match(/\s*[\"\')]/, !1) ? b.tokenize = null : b.tokenize = w(")"), u(null, "(")
- }
-
- function y(a, b, c) {
- this.type = a, this.indent = b, this.prev = c
- }
-
- function z(a, b, c, d) {
- return a.context = new y(c, b.indentation() + (d === !1 ? 0 : e), a.context), c
- }
-
- function A(a) {
- return a.context.prev && (a.context = a.context.prev), a.context.type
- }
-
- function B(a, b, c) {
- return E[c.context.type](a, b, c)
- }
-
- function C(a, b, c, d) {
- for (var e = d || 1; e > 0; e--) c.context = c.context.prev;
- return B(a, b, c)
- }
-
- function D(a) {
- var b = a.current()
- .toLowerCase();
- t = p.hasOwnProperty(b) ? "atom" : o.hasOwnProperty(b) ? "keyword" : "variable"
- }
- var d = c;
- c.propertyKeywords || (c = a.resolveMode("text/css")), c.inline = d.inline;
- var s, t, e = b.indentUnit,
- f = c.tokenHooks,
- g = c.documentTypes || {},
- h = c.mediaTypes || {},
- i = c.mediaFeatures || {},
- j = c.mediaValueKeywords || {},
- k = c.propertyKeywords || {},
- l = c.nonStandardPropertyKeywords || {},
- m = c.fontProperties || {},
- n = c.counterDescriptors || {},
- o = c.colorKeywords || {},
- p = c.valueKeywords || {},
- q = c.allowNested,
- r = c.supportsAtComponent === !0,
- E = {};
- return E.top = function (a, b, c) {
- if ("{" == a) return z(c, b, "block");
- if ("}" == a && c.context.prev) return A(c);
- if (r && /@component/.test(a)) return z(c, b, "atComponentBlock");
- if (/^@(-moz-)?document$/.test(a)) return z(c, b, "documentTypes");
- if (/^@(media|supports|(-moz-)?document|import)$/.test(a)) return z(c, b, "atBlock");
- if (/^@(font-face|counter-style)/.test(a)) return c.stateArg = a, "restricted_atBlock_before";
- if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(a)) return "keyframes";
- if (a && "@" == a.charAt(0)) return z(c, b, "at");
- if ("hash" == a) t = "builtin";
- else if ("word" == a) t = "tag";
- else {
- if ("variable-definition" == a) return "maybeprop";
- if ("interpolation" == a) return z(c, b, "interpolation");
- if (":" == a) return "pseudo";
- if (q && "(" == a) return z(c, b, "parens")
- }
- return c.context.type
- }, E.block = function (a, b, c) {
- if ("word" == a) {
- var d = b.current()
- .toLowerCase();
- return k.hasOwnProperty(d) ? (t = "property", "maybeprop") : l.hasOwnProperty(d) ? (t = "string-2", "maybeprop") : q ? (t = b.match(/^\s*:(?:\s|$)/, !1) ? "property" : "tag", "block") : (t += " error", "maybeprop")
- }
- return "meta" == a ? "block" : q || "hash" != a && "qualifier" != a ? E.top(a, b, c) : (t = "error", "block")
- }, E.maybeprop = function (a, b, c) {
- return ":" == a ? z(c, b, "prop") : B(a, b, c)
- }, E.prop = function (a, b, c) {
- if (";" == a) return A(c);
- if ("{" == a && q) return z(c, b, "propBlock");
- if ("}" == a || "{" == a) return C(a, b, c);
- if ("(" == a) return z(c, b, "parens");
- if ("hash" != a || /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(b.current())) {
- if ("word" == a) D(b);
- else if ("interpolation" == a) return z(c, b, "interpolation")
- } else t += " error";
- return "prop"
- }, E.propBlock = function (a, b, c) {
- return "}" == a ? A(c) : "word" == a ? (t = "property", "maybeprop") : c.context.type
- }, E.parens = function (a, b, c) {
- return "{" == a || "}" == a ? C(a, b, c) : ")" == a ? A(c) : "(" == a ? z(c, b, "parens") : "interpolation" == a ? z(c, b, "interpolation") : ("word" == a && D(b), "parens")
- }, E.pseudo = function (a, b, c) {
- return "word" == a ? (t = "variable-3", c.context.type) : B(a, b, c)
- }, E.documentTypes = function (a, b, c) {
- return "word" == a && g.hasOwnProperty(b.current()) ? (t = "tag", c.context.type) : E.atBlock(a, b, c)
- }, E.atBlock = function (a, b, c) {
- if ("(" == a) return z(c, b, "atBlock_parens");
- if ("}" == a || ";" == a) return C(a, b, c);
- if ("{" == a) return A(c) && z(c, b, q ? "block" : "top");
- if ("word" == a) {
- var d = b.current()
- .toLowerCase();
- t = "only" == d || "not" == d || "and" == d || "or" == d ? "keyword" : h.hasOwnProperty(d) ? "attribute" : i.hasOwnProperty(d) ? "property" : j.hasOwnProperty(d) ? "keyword" : k.hasOwnProperty(d) ? "property" : l.hasOwnProperty(d) ? "string-2" : p.hasOwnProperty(d) ? "atom" : o.hasOwnProperty(d) ? "keyword" : "error"
- }
- return c.context.type
- }, E.atComponentBlock = function (a, b, c) {
- return "}" == a ? C(a, b, c) : "{" == a ? A(c) && z(c, b, q ? "block" : "top", !1) : ("word" == a && (t = "error"), c.context.type)
- }, E.atBlock_parens = function (a, b, c) {
- return ")" == a ? A(c) : "{" == a || "}" == a ? C(a, b, c, 2) : E.atBlock(a, b, c)
- }, E.restricted_atBlock_before = function (a, b, c) {
- return "{" == a ? z(c, b, "restricted_atBlock") : "word" == a && "@counter-style" == c.stateArg ? (t = "variable", "restricted_atBlock_before") : B(a, b, c)
- }, E.restricted_atBlock = function (a, b, c) {
- return "}" == a ? (c.stateArg = null, A(c)) : "word" == a ? (t = "@font-face" == c.stateArg && !m.hasOwnProperty(b.current()
- .toLowerCase()) || "@counter-style" == c.stateArg && !n.hasOwnProperty(b.current()
- .toLowerCase()) ? "error" : "property", "maybeprop") : "restricted_atBlock"
- }, E.keyframes = function (a, b, c) {
- return "word" == a ? (t = "variable", "keyframes") : "{" == a ? z(c, b, "top") : B(a, b, c)
- }, E.at = function (a, b, c) {
- return ";" == a ? A(c) : "{" == a || "}" == a ? C(a, b, c) : ("word" == a ? t = "tag" : "hash" == a && (t = "builtin"), "at")
- }, E.interpolation = function (a, b, c) {
- return "}" == a ? A(c) : "{" == a || ";" == a ? C(a, b, c) : ("word" == a ? t = "variable" : "variable" != a && "(" != a && ")" != a && (t = "error"), "interpolation")
- }, {
- startState: function (a) {
- return {
- tokenize: null,
- state: c.inline ? "block" : "top",
- stateArg: null,
- context: new y(c.inline ? "block" : "top", a || 0, null)
- }
- },
- token: function (a, b) {
- if (!b.tokenize && a.eatSpace()) return null;
- var c = (b.tokenize || v)(a, b);
- return c && "object" == typeof c && (s = c[1], c = c[0]), t = c, b.state = E[b.state](s, a, b), t
- },
- indent: function (a, b) {
- var c = a.context,
- d = b && b.charAt(0),
- f = c.indent;
- return "prop" != c.type || "}" != d && ")" != d || (c = c.prev), c.prev && ("}" != d || "block" != c.type && "top" != c.type && "interpolation" != c.type && "restricted_atBlock" != c.type ? (")" == d && ("parens" == c.type || "atBlock_parens" == c.type) || "{" == d && ("at" == c.type || "atBlock" == c.type)) && (f = Math.max(0, c.indent - e), c = c.prev) : (c = c.prev, f = c.indent)), f
- },
- electricChars: "}",
- blockCommentStart: "/*",
- blockCommentEnd: "*/",
- fold: "brace"
- }
- });
- var c = ["domain", "regexp", "url", "url-prefix"],
- d = b(c),
- e = ["all", "aural", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "embossed"],
- f = b(e),
- g = ["width", "min-width", "max-width", "height", "min-height", "max-height", "device-width", "min-device-width", "max-device-width", "device-height", "min-device-height", "max-device-height", "aspect-ratio", "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", "max-color", "color-index", "min-color-index", "max-color-index", "monochrome", "min-monochrome", "max-monochrome", "resolution", "min-resolution", "max-resolution", "scan", "grid", "orientation", "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", "pointer", "any-pointer", "hover", "any-hover"],
- h = b(g),
- i = ["landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", "interlace", "progressive"],
- j = b(i),
- k = ["align-content", "align-items", "align-self", "alignment-adjust", "alignment-baseline", "anchor-point", "animation", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "appearance", "azimuth", "backface-visibility", "background", "background-attachment", "background-clip", "background-color", "background-image", "background-origin", "background-position", "background-repeat", "background-size", "baseline-shift", "binding", "bleed", "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target", "border", "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-image", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-left", "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right", "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style", "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", "caption-side", "clear", "clip", "color", "color-profile", "column-count", "column-fill", "column-gap", "column-rule", "column-rule-color", "column-rule-style", "column-rule-width", "column-span", "column-width", "columns", "content", "counter-increment", "counter-reset", "crop", "cue", "cue-after", "cue-before", "cursor", "direction", "display", "dominant-baseline", "drop-initial-after-adjust", "drop-initial-after-align", "drop-initial-before-adjust", "drop-initial-before-align", "drop-initial-size", "drop-initial-value", "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-position", "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-start", "grid-row", "grid-row-end", "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns", "grid-template-rows", "hanging-punctuation", "height", "hyphens", "icon", "image-orientation", "image-rendering", "image-resolution", "inline-box-align", "justify-content", "left", "letter-spacing", "line-break", "line-height", "line-stacking", "line-stacking-ruby", "line-stacking-shift", "line-stacking-strategy", "list-style", "list-style-image", "list-style-position", "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "marks", "marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed", "marquee-style", "max-height", "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", "nav-left", "nav-right", "nav-up", "object-fit", "object-position", "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", "outline-style", "outline-width", "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before", "page-break-inside", "page-policy", "pause", "pause-after", "pause-before", "perspective", "perspective-origin", "pitch", "pitch-range", "play-during", "position", "presentation-level", "punctuation-trim", "quotes", "region-break-after", "region-break-before", "region-break-inside", "region-fragment", "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin", "shape-outside", "size", "speak", "speak-as", "speak-header", "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size", "table-layout", "target", "target-name", "target-new", "target-position", "text-align", "text-align-last", "text-decoration", "text-decoration-color", "text-decoration-line", "text-decoration-skip", "text-decoration-style", "text-emphasis", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "text-height", "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", "text-wrap", "top", "transform", "transform-origin", "transform-style", "transition", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "unicode-bidi", "vertical-align", "visibility", "voice-balance", "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", "voice-volume", "volume", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", "color-interpolation", "color-interpolation-filters", "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", "glyph-orientation-vertical", "text-anchor", "writing-mode"],
- l = b(k),
- m = ["scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "zoom"],
- n = b(m),
- o = ["font-family", "src", "unicode-range", "font-variant", "font-feature-settings", "font-stretch", "font-weight", "font-style"],
- p = b(o),
- q = ["additive-symbols", "fallback", "negative", "pad", "prefix", "range", "speak-as", "suffix", "symbols", "system"],
- r = b(q),
- s = ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen"],
- t = b(s),
- u = ["above", "absolute", "activeborder", "additive", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page", "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", "col-resize", "collapse", "column", "column-reverse", "compact", "condensed", "contain", "content", "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "cyclic", "dashed", "decimal", "decimal-leading-zero", "default", "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "disclosure-closed", "disclosure-open", "document", "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ethiopic-numeric", "ew-resize", "expanded", "extends", "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help", "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore", "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-flex", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "japanese-formal", "japanese-informal", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer", "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", "landscape", "lao", "large", "larger", "left", "level", "lighter", "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "match", "matrix", "matrix3d", "media-controls-background", "media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button", "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize", "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter", "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "radial-gradient", "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", "relative", "repeat", "repeating-linear-gradient", "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", "s-resize", "sans-serif", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "simp-chinese-formal", "simp-chinese-informal", "single", "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "spell-out", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tamil", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", "trad-chinese-formal", "trad-chinese-informal", "translate", "translate3d", "translateX", "translateY", "translateZ", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", "xx-large", "xx-small"],
- v = b(u),
- w = c.concat(e)
- .concat(g)
- .concat(i)
- .concat(k)
- .concat(m)
- .concat(s)
- .concat(u);
- a.registerHelper("hintWords", "css", w), a.defineMIME("text/css", {
- documentTypes: d,
- mediaTypes: f,
- mediaFeatures: h,
- mediaValueKeywords: j,
- propertyKeywords: l,
- nonStandardPropertyKeywords: n,
- fontProperties: p,
- counterDescriptors: r,
- colorKeywords: t,
- valueKeywords: v,
- tokenHooks: {
- "/": function (a, b) {
- return a.eat("*") ? (b.tokenize = x, x(a, b)) : !1
- }
- },
- name: "css"
- }), a.defineMIME("text/x-scss", {
- mediaTypes: f,
- mediaFeatures: h,
- mediaValueKeywords: j,
- propertyKeywords: l,
- nonStandardPropertyKeywords: n,
- colorKeywords: t,
- valueKeywords: v,
- fontProperties: p,
- allowNested: !0,
- tokenHooks: {
- "/": function (a, b) {
- return a.eat("/") ? (a.skipToEnd(), ["comment", "comment"]) : a.eat("*") ? (b.tokenize = x, x(a, b)) : ["operator", "operator"]
- },
- ":": function (a) {
- return a.match(/\s*\{/) ? [null, "{"] : !1
- },
- $: function (a) {
- return a.match(/^[\w-]+/), a.match(/^\s*:/, !1) ? ["variable-2", "variable-definition"] : ["variable-2", "variable"]
- },
- "#": function (a) {
- return a.eat("{") ? [null, "interpolation"] : !1
- }
- },
- name: "css",
- helperType: "scss"
- }), a.defineMIME("text/x-less", {
- mediaTypes: f,
- mediaFeatures: h,
- mediaValueKeywords: j,
- propertyKeywords: l,
- nonStandardPropertyKeywords: n,
- colorKeywords: t,
- valueKeywords: v,
- fontProperties: p,
- allowNested: !0,
- tokenHooks: {
- "/": function (a, b) {
- return a.eat("/") ? (a.skipToEnd(), ["comment", "comment"]) : a.eat("*") ? (b.tokenize = x, x(a, b)) : ["operator", "operator"]
- },
- "@": function (a) {
- return a.eat("{") ? [null, "interpolation"] : a.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, !1) ? !1 : (a.eatWhile(/[\w\\\-]/), a.match(/^\s*:/, !1) ? ["variable-2", "variable-definition"] : ["variable-2", "variable"])
- },
- "&": function () {
- return ["atom", "atom"]
- }
- },
- name: "css",
- helperType: "less"
- }), a.defineMIME("text/x-gss", {
- documentTypes: d,
- mediaTypes: f,
- mediaFeatures: h,
- propertyKeywords: l,
- nonStandardPropertyKeywords: n,
- fontProperties: p,
- counterDescriptors: r,
- colorKeywords: t,
- valueKeywords: v,
- supportsAtComponent: !0,
- tokenHooks: {
- "/": function (a, b) {
- return a.eat("*") ? (b.tokenize = x, x(a, b)) : !1
- }
- },
- name: "css",
- helperType: "gss"
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function c(a, b, c) {
- var d = a.current(),
- e = d.search(b);
- return e > -1 ? a.backUp(d.length - e) : d.match(/<\/?$/) && (a.backUp(d.length), a.match(b, !1) || a.match(d)), c
- }
-
- function e(a) {
- var b = d[a];
- return b ? b : d[a] = new RegExp("\\s+" + a + "\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*")
- }
-
- function f(a, b) {
- for (var d, c = a.pos; c >= 0 && "<" !== a.string.charAt(c);) c--;
- return 0 > c ? c : (d = a.string.slice(c, a.pos)
- .match(e(b))) ? d[2] : ""
- }
-
- function g(a, b) {
- return new RegExp((b ? "^" : "") + "</s*" + a + "s*>", "i")
- }
-
- function h(a, b) {
- for (var c in a)
- for (var d = b[c] || (b[c] = []), e = a[c], f = e.length - 1; f >= 0; f--) d.unshift(e[f])
- }
-
- function i(a, b) {
- for (var c = 0; c < a.length; c++) {
- var d = a[c];
- if (!d[0] || d[1].test(f(b, d[0]))) return d[2]
- }
- }
- var b = {
- script: [["lang", /(javascript|babel)/i, "javascript"], ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, "javascript"], ["type", /./, "text/plain"], [null, null, "javascript"]],
- style: [["lang", /^css$/i, "css"], ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"], ["type", /./, "text/plain"], [null, null, "css"]]
- },
- d = {};
- a.defineMode("htmlmixed", function (d, e) {
- function n(b, e) {
- var m, h = e.htmlState.tagName,
- k = h && j[h.toLowerCase()],
- l = f.token(b, e.htmlState);
- if (k && /\btag\b/.test(l) && ">" === b.current() && (m = i(k, b))) {
- var o = a.getMode(d, m),
- p = g(h, !0),
- q = g(h, !1);
- e.token = function (a, b) {
- return a.match(p, !1) ? (b.token = n, b.localState = b.localMode = null, null) : c(a, q, b.localMode.token(a, b.localState))
- }, e.localMode = o, e.localState = a.startState(o, f.indent(e.htmlState, ""))
- }
- return l
- }
- var f = a.getMode(d, {
- name: "xml",
- htmlMode: !0,
- multilineTagIndentFactor: e.multilineTagIndentFactor,
- multilineTagIndentPastTag: e.multilineTagIndentPastTag
- }),
- j = {},
- k = e && e.tags,
- l = e && e.scriptTypes;
- if (h(b, j), k && h(k, j), l)
- for (var m = l.length - 1; m >= 0; m--) j.script.unshift(["type", l[m].matches, l[m].mode]);
- return {
- startState: function () {
- var a = f.startState();
- return {
- token: n,
- localMode: null,
- localState: null,
- htmlState: a
- }
- },
- copyState: function (b) {
- var c;
- return b.localState && (c = a.copyState(b.localMode, b.localState)), {
- token: b.token,
- localMode: b.localMode,
- localState: c,
- htmlState: a.copyState(f, b.htmlState)
- }
- },
- token: function (a, b) {
- return b.token(a, b)
- },
- indent: function (b, c) {
- return !b.localMode || /^\s*<\//.test(c) ? f.indent(b.htmlState, c) : b.localMode.indent ? b.localMode.indent(b.localState, c) : a.Pass
- },
- innerMode: function (a) {
- return {
- state: a.localState || a.htmlState,
- mode: a.localMode || f
- }
- }
- }
- }, "xml", "javascript", "css"), a.defineMIME("text/html", "htmlmixed")
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
- a.defineMode("javascript", function (b, c) {
- function m(a) {
- for (var c, b = !1, d = !1; null != (c = a.next());) {
- if (!b) {
- if ("/" == c && !d) return;
- "[" == c ? d = !0 : d && "]" == c && (d = !1)
- }
- b = !b && "\\" == c
- }
- }
-
- function p(a, b, c) {
- return n = a, o = c, b
- }
-
- function q(a, b) {
- var c = a.next();
- if ('"' == c || "'" == c) return b.tokenize = r(c), b.tokenize(a, b);
- if ("." == c && a.match(/^\d+(?:[eE][+\-]?\d+)?/)) return p("number", "number");
- if ("." == c && a.match("..")) return p("spread", "meta");
- if (/[\[\]{}\(\),;\:\.]/.test(c)) return p(c);
- if ("=" == c && a.eat(">")) return p("=>", "operator");
- if ("0" == c && a.eat(/x/i)) return a.eatWhile(/[\da-f]/i), p("number", "number");
- if (/\d/.test(c)) return a.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/), p("number", "number");
- if ("/" == c) return a.eat("*") ? (b.tokenize = s, s(a, b)) : a.eat("/") ? (a.skipToEnd(), p("comment", "comment")) : "operator" == b.lastType || "keyword c" == b.lastType || "sof" == b.lastType || /^[\[{}\(,;:]$/.test(b.lastType) ? (m(a), a.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/), p("regexp", "string-2")) : (a.eatWhile(k), p("operator", "operator", a.current()));
- if ("`" == c) return b.tokenize = t, t(a, b);
- if ("#" == c) return a.skipToEnd(), p("error", "error");
- if (k.test(c)) return a.eatWhile(k), p("operator", "operator", a.current());
- if (i.test(c)) {
- a.eatWhile(i);
- var d = a.current(),
- e = j.propertyIsEnumerable(d) && j[d];
- return e && "." != b.lastType ? p(e.type, e.style, d) : p("variable", "variable", d)
- }
- }
-
- function r(a) {
- return function (b, c) {
- var e, d = !1;
- if (f && "@" == b.peek() && b.match(l)) return c.tokenize = q, p("jsonld-keyword", "meta");
- for (; null != (e = b.next()) && (e != a || d);) d = !d && "\\" == e;
- return d || (c.tokenize = q), p("string", "string")
- }
- }
-
- function s(a, b) {
- for (var d, c = !1; d = a.next();) {
- if ("/" == d && c) {
- b.tokenize = q;
- break
- }
- c = "*" == d
- }
- return p("comment", "comment")
- }
-
- function t(a, b) {
- for (var d, c = !1; null != (d = a.next());) {
- if (!c && ("`" == d || "$" == d && a.eat("{"))) {
- b.tokenize = q;
- break
- }
- c = !c && "\\" == d
- }
- return p("quasi", "string-2", a.current())
- }
-
- function v(a, b) {
- b.fatArrowAt && (b.fatArrowAt = null);
- var c = a.string.indexOf("=>", a.start);
- if (!(0 > c)) {
- for (var d = 0, e = !1, f = c - 1; f >= 0; --f) {
- var g = a.string.charAt(f),
- h = u.indexOf(g);
- if (h >= 0 && 3 > h) {
- if (!d) {
- ++f;
- break
- }
- if (0 == --d) break
- } else if (h >= 3 && 6 > h) ++d;
- else if (i.test(g)) e = !0;
- else {
- if (/["'\/]/.test(g)) return;
- if (e && !d) {
- ++f;
- break
- }
- }
- }
- e && !d && (b.fatArrowAt = f)
- }
- }
-
- function x(a, b, c, d, e, f) {
- this.indented = a, this.column = b, this.type = c, this.prev = e, this.info = f, null != d && (this.align = d)
- }
-
- function y(a, b) {
- for (var c = a.localVars; c; c = c.next)
- if (c.name == b) return !0;
- for (var d = a.context; d; d = d.prev)
- for (var c = d.vars; c; c = c.next)
- if (c.name == b) return !0
- }
-
- function z(a, b, c, d, e) {
- var f = a.cc;
- for (A.state = a, A.stream = e, A.marked = null, A.cc = f, A.style = b, a.lexical.hasOwnProperty("align") || (a.lexical.align = !0);;) {
- var h = f.length ? f.pop() : g ? L : K;
- if (h(c, d)) {
- for (; f.length && f[f.length - 1].lex;) f.pop()();
- return A.marked ? A.marked : "variable" == c && y(a, d) ? "variable-2" : b
- }
- }
- }
-
- function B() {
- for (var a = arguments.length - 1; a >= 0; a--) A.cc.push(arguments[a])
- }
-
- function C() {
- return B.apply(null, arguments), !0
- }
-
- function D(a) {
- function b(b) {
- for (var c = b; c; c = c.next)
- if (c.name == a) return !0;
- return !1
- }
- var d = A.state;
- if (d.context) {
- if (A.marked = "def", b(d.localVars)) return;
- d.localVars = {
- name: a,
- next: d.localVars
- }
- } else {
- if (b(d.globalVars)) return;
- c.globalVars && (d.globalVars = {
- name: a,
- next: d.globalVars
- })
- }
- }
-
- function F() {
- A.state.context = {
- prev: A.state.context,
- vars: A.state.localVars
- }, A.state.localVars = E
- }
-
- function G() {
- A.state.localVars = A.state.context.vars, A.state.context = A.state.context.prev
- }
-
- function H(a, b) {
- var c = function () {
- var c = A.state,
- d = c.indented;
- if ("stat" == c.lexical.type) d = c.lexical.indented;
- else
- for (var e = c.lexical; e && ")" == e.type && e.align; e = e.prev) d = e.indented;
- c.lexical = new x(d, A.stream.column(), a, null, c.lexical, b)
- };
- return c.lex = !0, c
- }
-
- function I() {
- var a = A.state;
- a.lexical.prev && (")" == a.lexical.type && (a.indented = a.lexical.indented), a.lexical = a.lexical.prev)
- }
-
- function J(a) {
- function b(c) {
- return c == a ? C() : ";" == a ? B() : C(b)
- }
- return b
- }
-
- function K(a, b) {
- return "var" == a ? C(H("vardef", b.length), fa, J(";"), I) : "keyword a" == a ? C(H("form"), L, K, I) : "keyword b" == a ? C(H("form"), K, I) : "{" == a ? C(H("}"), ba, I) : ";" == a ? C() : "if" == a ? ("else" == A.state.lexical.info && A.state.cc[A.state.cc.length - 1] == I && A.state.cc.pop()(), C(H("form"), L, K, I, ka)) : "function" == a ? C(qa) : "for" == a ? C(H("form"), la, K, I) : "variable" == a ? C(H("stat"), W) : "switch" == a ? C(H("form"), L, H("}", "switch"), J("{"), ba, I, I) : "case" == a ? C(L, J(":")) : "default" == a ? C(J(":")) : "catch" == a ? C(H("form"), F, J("("), ra, J(")"), K, I, G) : "class" == a ? C(H("form"), sa, I) : "export" == a ? C(H("form"), wa, I) : "import" == a ? C(H("form"), xa, I) : B(H("stat"), L, J(";"), I)
- }
-
- function L(a) {
- return N(a, !1)
- }
-
- function M(a) {
- return N(a, !0)
- }
-
- function N(a, b) {
- if (A.state.fatArrowAt == A.stream.start) {
- var c = b ? V : U;
- if ("(" == a) return C(F, H(")"), _(ga, ")"), I, J("=>"), c, G);
- if ("variable" == a) return B(F, ga, J("=>"), c, G)
- }
- var d = b ? R : Q;
- return w.hasOwnProperty(a) ? C(d) : "async" == a ? C(L) : "function" == a ? C(qa, d) : "keyword c" == a ? C(b ? P : O) : "(" == a ? C(H(")"), O, Da, J(")"), I, d) : "operator" == a || "spread" == a ? C(b ? M : L) : "[" == a ? C(H("]"), Ba, I, d) : "{" == a ? aa(Y, "}", null, d) : "quasi" == a ? B(S, d) : C()
- }
-
- function O(a) {
- return a.match(/[;\}\)\],]/) ? B() : B(L)
- }
-
- function P(a) {
- return a.match(/[;\}\)\],]/) ? B() : B(M)
- }
-
- function Q(a, b) {
- return "," == a ? C(L) : R(a, b, !1)
- }
-
- function R(a, b, c) {
- var d = 0 == c ? Q : R,
- e = 0 == c ? L : M;
- return "=>" == a ? C(F, c ? V : U, G) : "operator" == a ? /\+\+|--/.test(b) ? C(d) : "?" == b ? C(L, J(":"), e) : C(e) : "quasi" == a ? B(S, d) : ";" != a ? "(" == a ? aa(M, ")", "call", d) : "." == a ? C(X, d) : "[" == a ? C(H("]"), O, J("]"), I, d) : void 0 : void 0
- }
-
- function S(a, b) {
- return "quasi" != a ? B() : "${" != b.slice(b.length - 2) ? C(S) : C(L, T)
- }
-
- function T(a) {
- return "}" == a ? (A.marked = "string-2", A.state.tokenize = t, C(S)) : void 0
- }
-
- function U(a) {
- return v(A.stream, A.state), B("{" == a ? K : L)
- }
-
- function V(a) {
- return v(A.stream, A.state), B("{" == a ? K : M)
- }
-
- function W(a) {
- return ":" == a ? C(I, K) : B(Q, J(";"), I)
- }
-
- function X(a) {
- return "variable" == a ? (A.marked = "property", C()) : void 0
- }
-
- function Y(a, b) {
- return "async" == a ? C(Y) : "variable" == a || "keyword" == A.style ? (A.marked = "property", C("get" == b || "set" == b ? Z : $)) : "number" == a || "string" == a ? (A.marked = f ? "property" : A.style + " property", C($)) : "jsonld-keyword" == a ? C($) : "[" == a ? C(L, J("]"), $) : void 0
- }
-
- function Z(a) {
- return "variable" != a ? B($) : (A.marked = "property", C(qa))
- }
-
- function $(a) {
- return ":" == a ? C(M) : "(" == a ? B(qa) : void 0
- }
-
- function _(a, b) {
- function c(d) {
- if ("," == d) {
- var e = A.state.lexical;
- return "call" == e.info && (e.pos = (e.pos || 0) + 1), C(a, c)
- }
- return d == b ? C() : C(J(b))
- }
- return function (d) {
- return d == b ? C() : B(a, c)
- }
- }
-
- function aa(a, b, c) {
- for (var d = 3; d < arguments.length; d++) A.cc.push(arguments[d]);
- return C(H(b, c), _(a, b), I)
- }
-
- function ba(a) {
- return "}" == a ? C() : B(K, ba)
- }
-
- function ca(a) {
- return h && ":" == a ? C(ea) : void 0
- }
-
- function da(a, b) {
- return "=" == b ? C(M) : void 0
- }
-
- function ea(a) {
- return "variable" == a ? (A.marked = "variable-3", C()) : void 0
- }
-
- function fa() {
- return B(ga, ca, ia, ja)
- }
-
- function ga(a, b) {
- return "variable" == a ? (D(b), C()) : "[" == a ? aa(ga, "]") : "{" == a ? aa(ha, "}") : void 0
- }
-
- function ha(a, b) {
- return "variable" != a || A.stream.match(/^\s*:/, !1) ? ("variable" == a && (A.marked = "property"), C(J(":"), ga, ia)) : (D(b), C(ia))
- }
-
- function ia(a, b) {
- return "=" == b ? C(M) : void 0
- }
-
- function ja(a) {
- return "," == a ? C(fa) : void 0
- }
-
- function ka(a, b) {
- return "keyword b" == a && "else" == b ? C(H("form", "else"), K, I) : void 0
- }
-
- function la(a) {
- return "(" == a ? C(H(")"), ma, J(")"), I) : void 0
- }
-
- function ma(a) {
- return "var" == a ? C(fa, J(";"), oa) : ";" == a ? C(oa) : "variable" == a ? C(na) : B(L, J(";"), oa)
- }
-
- function na(a, b) {
- return "in" == b || "of" == b ? (A.marked = "keyword", C(L)) : C(Q, oa)
- }
-
- function oa(a, b) {
- return ";" == a ? C(pa) : "in" == b || "of" == b ? (A.marked = "keyword", C(L)) : B(L, J(";"), pa)
- }
-
- function pa(a) {
- ")" != a && C(L)
- }
-
- function qa(a, b) {
- return "*" == b ? (A.marked = "keyword", C(qa)) : "variable" == a ? (D(b), C(qa)) : "(" == a ? C(F, H(")"), _(ra, ")"), I, K, G) : void 0
- }
-
- function ra(a) {
- return "spread" == a ? C(ra) : B(ga, ca, da)
- }
-
- function sa(a, b) {
- return "variable" == a ? (D(b), C(ta)) : void 0
- }
-
- function ta(a, b) {
- return "extends" == b ? C(L, ta) : "{" == a ? C(H("}"), ua, I) : void 0
- }
-
- function ua(a, b) {
- return "variable" == a || "keyword" == A.style ? "static" == b ? (A.marked = "keyword", C(ua)) : (A.marked = "property", "get" == b || "set" == b ? C(va, qa, ua) : C(qa, ua)) : "*" == b ? (A.marked = "keyword", C(ua)) : ";" == a ? C(ua) : "}" == a ? C() : void 0
- }
-
- function va(a) {
- return "variable" != a ? B() : (A.marked = "property", C())
- }
-
- function wa(a, b) {
- return "*" == b ? (A.marked = "keyword", C(Aa, J(";"))) : "default" == b ? (A.marked = "keyword", C(L, J(";"))) : B(K)
- }
-
- function xa(a) {
- return "string" == a ? C() : B(ya, Aa)
- }
-
- function ya(a, b) {
- return "{" == a ? aa(ya, "}") : ("variable" == a && D(b), "*" == b && (A.marked = "keyword"), C(za))
- }
-
- function za(a, b) {
- return "as" == b ? (A.marked = "keyword", C(ya)) : void 0
- }
-
- function Aa(a, b) {
- return "from" == b ? (A.marked = "keyword", C(L)) : void 0
- }
-
- function Ba(a) {
- return "]" == a ? C() : B(M, Ca)
- }
-
- function Ca(a) {
- return "for" == a ? B(Da, J("]")) : "," == a ? C(_(P, "]")) : B(_(M, "]"))
- }
-
- function Da(a) {
- return "for" == a ? C(la, Da) : "if" == a ? C(L, Da) : void 0
- }
-
- function Ea(a, b) {
- return "operator" == a.lastType || "," == a.lastType || k.test(b.charAt(0)) || /[,.]/.test(b.charAt(0))
- }
- var n, o, d = b.indentUnit,
- e = c.statementIndent,
- f = c.jsonld,
- g = c.json || f,
- h = c.typescript,
- i = c.wordCharacters || /[\w$\xa1-\uffff]/,
- j = function () {
- function a(a) {
- return {
- type: a,
- style: "keyword"
- }
- }
- var b = a("keyword a"),
- c = a("keyword b"),
- d = a("keyword c"),
- e = a("operator"),
- f = {
- type: "atom",
- style: "atom"
- },
- g = {
- "if": a("if"),
- "while": b,
- "with": b,
- "else": c,
- "do": c,
- "try": c,
- "finally": c,
- "return": d,
- "break": d,
- "continue": d,
- "new": d,
- "delete": d,
- "throw": d,
- "debugger": d,
- "var": a("var"),
- "const": a("var"),
- let: a("var"),
- async: a("async"),
- "function": a("function"),
- "catch": a("catch"),
- "for": a("for"),
- "switch": a("switch"),
- "case": a("case"),
- "default": a("default"),
- "in": e,
- "typeof": e,
- "instanceof": e,
- "true": f,
- "false": f,
- "null": f,
- undefined: f,
- NaN: f,
- Infinity: f,
- "this": a("this"),
- "class": a("class"),
- "super": a("atom"),
- await: d,
- "yield": d,
- "export": a("export"),
- "import": a("import"),
- "extends": d
- };
- if (h) {
- var i = {
- type: "variable",
- style: "variable-3"
- },
- j = {
- "interface": a("interface"),
- "extends": a("extends"),
- constructor: a("constructor"),
- "public": a("public"),
- "private": a("private"),
- "protected": a("protected"),
- "static": a("static"),
- string: i,
- number: i,
- bool: i,
- any: i
- };
- for (var k in j) g[k] = j[k]
- }
- return g
- }(),
- k = /[+\-*&%=<>!?|~^]/,
- l = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,
- u = "([{}])",
- w = {
- atom: !0,
- number: !0,
- variable: !0,
- string: !0,
- regexp: !0,
- "this": !0,
- "jsonld-keyword": !0
- },
- A = {
- state: null,
- column: null,
- marked: null,
- cc: null
- },
- E = {
- name: "this",
- next: {
- name: "arguments"
- }
- };
- return I.lex = !0, {
- startState: function (a) {
- var b = {
- tokenize: q,
- lastType: "sof",
- cc: [],
- lexical: new x((a || 0) - d, 0, "block", !1),
- localVars: c.localVars,
- context: c.localVars && {
- vars: c.localVars
- },
- indented: 0
- };
- return c.globalVars && "object" == typeof c.globalVars && (b.globalVars = c.globalVars), b
- },
- token: function (a, b) {
- if (a.sol() && (b.lexical.hasOwnProperty("align") || (b.lexical.align = !1), b.indented = a.indentation(), v(a, b)), b.tokenize != s && a.eatSpace()) return null;
- var c = b.tokenize(a, b);
- return "comment" == n ? c : (b.lastType = "operator" != n || "++" != o && "--" != o ? n : "incdec", z(b, c, n, o, a))
- },
- indent: function (b, f) {
- if (b.tokenize == s) return a.Pass;
- if (b.tokenize != q) return 0;
- var g = f && f.charAt(0),
- h = b.lexical;
- if (!/^\s*else\b/.test(f))
- for (var i = b.cc.length - 1; i >= 0; --i) {
- var j = b.cc[i];
- if (j == I) h = h.prev;
- else if (j != ka) break
- }
- "stat" == h.type && "}" == g && (h = h.prev), e && ")" == h.type && "stat" == h.prev.type && (h = h.prev);
- var k = h.type,
- l = g == k;
- return "vardef" == k ? h.indented + ("operator" == b.lastType || "," == b.lastType ? h.info + 1 : 0) : "form" == k && "{" == g ? h.indented : "form" == k ? h.indented + d : "stat" == k ? h.indented + (Ea(b, f) ? e || d : 0) : "switch" != h.info || l || 0 == c.doubleIndentSwitch ? h.align ? h.column + (l ? 0 : 1) : h.indented + (l ? 0 : d) : h.indented + (/^(?:case|default)\b/.test(f) ? d : 2 * d)
- },
- electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
- blockCommentStart: g ? null : "/*",
- blockCommentEnd: g ? null : "*/",
- lineComment: g ? null : "//",
- fold: "brace",
- closeBrackets: "()[]{}''\"\"``",
- helperType: g ? "json" : "javascript",
- jsonldMode: f,
- jsonMode: g
- }
- }), a.registerHelper("wordChars", "javascript", /[\w$]/), a.defineMIME("text/javascript", "javascript"), a.defineMIME("text/ecmascript", "javascript"), a.defineMIME("application/javascript", "javascript"),
- a.defineMIME("application/x-javascript", "javascript"), a.defineMIME("application/ecmascript", "javascript"), a.defineMIME("application/json", {
- name: "javascript",
- json: !0
- }), a.defineMIME("application/x-json", {
- name: "javascript",
- json: !0
- }), a.defineMIME("application/ld+json", {
- name: "javascript",
- jsonld: !0
- }), a.defineMIME("text/typescript", {
- name: "javascript",
- typescript: !0
- }), a.defineMIME("application/typescript", {
- name: "javascript",
- typescript: !0
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function b(a, b) {
- return a.string.charAt(a.pos + (b || 0))
- }
-
- function c(a, b) {
- if (b) {
- var c = a.pos - b;
- return a.string.substr(c >= 0 ? c : 0, b)
- }
- return a.string.substr(0, a.pos - 1)
- }
-
- function d(a, b) {
- var c = a.string.length,
- d = c - a.pos + 1;
- return a.string.substr(a.pos, b && c > b ? b : d)
- }
-
- function e(a, b) {
- var d, c = a.pos + b;
- 0 >= c ? a.pos = 0 : c >= (d = a.string.length - 1) ? a.pos = d : a.pos = c
- }
- a.defineMode("perl", function () {
- function h(a, b, c, d, e) {
- return b.chain = null, b.style = null, b.tail = null, b.tokenize = function (a, b) {
- for (var g, f = !1, h = 0; g = a.next();) {
- if (g === c[h] && !f) return void 0 !== c[++h] ? (b.chain = c[h], b.style = d, b.tail = e) : e && a.eatWhile(e), b.tokenize = j, d;
- f = !f && "\\" == g
- }
- return d
- }, b.tokenize(a, b)
- }
-
- function i(a, b, c) {
- return b.tokenize = function (a, b) {
- return a.string == c && (b.tokenize = j), a.skipToEnd(), "string"
- }, b.tokenize(a, b)
- }
-
- function j(j, k) {
- if (j.eatSpace()) return null;
- if (k.chain) return h(j, k, k.chain, k.style, k.tail);
- if (j.match(/^\-?[\d\.]/, !1) && j.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/)) return "number";
- if (j.match(/^<<(?=\w)/)) return j.eatWhile(/\w/), i(j, k, j.current()
- .substr(2));
- if (j.sol() && j.match(/^\=item(?!\w)/)) return i(j, k, "=cut");
- var l = j.next();
- if ('"' == l || "'" == l) {
- if (c(j, 3) == "<<" + l) {
- var m = j.pos;
- j.eatWhile(/\w/);
- var n = j.current()
- .substr(1);
- if (n && j.eat(l)) return i(j, k, n);
- j.pos = m
- }
- return h(j, k, [l], "string")
- }
- if ("q" == l) {
- var o = b(j, -2);
- if (!o || !/\w/.test(o))
- if (o = b(j, 0), "x" == o) {
- if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], f, g);
- if ("[" == o) return e(j, 2), h(j, k, ["]"], f, g);
- if ("{" == o) return e(j, 2), h(j, k, ["}"], f, g);
- if ("<" == o) return e(j, 2), h(j, k, [">"], f, g);
- if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], f, g)
- } else if ("q" == o) {
- if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], "string");
- if ("[" == o) return e(j, 2), h(j, k, ["]"], "string");
- if ("{" == o) return e(j, 2), h(j, k, ["}"], "string");
- if ("<" == o) return e(j, 2), h(j, k, [">"], "string");
- if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], "string")
- } else if ("w" == o) {
- if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], "bracket");
- if ("[" == o) return e(j, 2), h(j, k, ["]"], "bracket");
- if ("{" == o) return e(j, 2), h(j, k, ["}"], "bracket");
- if ("<" == o) return e(j, 2), h(j, k, [">"], "bracket");
- if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], "bracket")
- } else if ("r" == o) {
- if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], f, g);
- if ("[" == o) return e(j, 2), h(j, k, ["]"], f, g);
- if ("{" == o) return e(j, 2), h(j, k, ["}"], f, g);
- if ("<" == o) return e(j, 2), h(j, k, [">"], f, g);
- if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], f, g)
- } else if (/[\^'"!~\/(\[{<]/.test(o)) {
- if ("(" == o) return e(j, 1), h(j, k, [")"], "string");
- if ("[" == o) return e(j, 1), h(j, k, ["]"], "string");
- if ("{" == o) return e(j, 1), h(j, k, ["}"], "string");
- if ("<" == o) return e(j, 1), h(j, k, [">"], "string");
- if (/[\^'"!~\/]/.test(o)) return h(j, k, [j.eat(o)], "string")
- }
- }
- if ("m" == l) {
- var o = b(j, -2);
- if ((!o || !/\w/.test(o)) && (o = j.eat(/[(\[{<\^'"!~\/]/))) {
- if (/[\^'"!~\/]/.test(o)) return h(j, k, [o], f, g);
- if ("(" == o) return h(j, k, [")"], f, g);
- if ("[" == o) return h(j, k, ["]"], f, g);
- if ("{" == o) return h(j, k, ["}"], f, g);
- if ("<" == o) return h(j, k, [">"], f, g)
- }
- }
- if ("s" == l) {
- var o = /[\/>\]})\w]/.test(b(j, -2));
- if (!o && (o = j.eat(/[(\[{<\^'"!~\/]/))) return "[" == o ? h(j, k, ["]", "]"], f, g) : "{" == o ? h(j, k, ["}", "}"], f, g) : "<" == o ? h(j, k, [">", ">"], f, g) : "(" == o ? h(j, k, [")", ")"], f, g) : h(j, k, [o, o], f, g)
- }
- if ("y" == l) {
- var o = /[\/>\]})\w]/.test(b(j, -2));
- if (!o && (o = j.eat(/[(\[{<\^'"!~\/]/))) return "[" == o ? h(j, k, ["]", "]"], f, g) : "{" == o ? h(j, k, ["}", "}"], f, g) : "<" == o ? h(j, k, [">", ">"], f, g) : "(" == o ? h(j, k, [")", ")"], f, g) : h(j, k, [o, o], f, g)
- }
- if ("t" == l) {
- var o = /[\/>\]})\w]/.test(b(j, -2));
- if (!o && (o = j.eat("r"), o && (o = j.eat(/[(\[{<\^'"!~\/]/)))) return "[" == o ? h(j, k, ["]", "]"], f, g) : "{" == o ? h(j, k, ["}", "}"], f, g) : "<" == o ? h(j, k, [">", ">"], f, g) : "(" == o ? h(j, k, [")", ")"], f, g) : h(j, k, [o, o], f, g)
- }
- if ("`" == l) return h(j, k, [l], "variable-2");
- if ("/" == l) return /~\s*$/.test(c(j)) ? h(j, k, [l], f, g) : "operator";
- if ("$" == l) {
- var m = j.pos;
- if (j.eatWhile(/\d/) || j.eat("{") && j.eatWhile(/\d/) && j.eat("}")) return "variable-2";
- j.pos = m
- }
- if (/[$@%]/.test(l)) {
- var m = j.pos;
- if (j.eat("^") && j.eat(/[A-Z]/) || !/[@$%&]/.test(b(j, -2)) && j.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)) {
- var o = j.current();
- if (a[o]) return "variable-2"
- }
- j.pos = m
- }
- if (/[$@%&]/.test(l) && (j.eatWhile(/[\w$\[\]]/) || j.eat("{") && j.eatWhile(/[\w$\[\]]/) && j.eat("}"))) {
- var o = j.current();
- return a[o] ? "variable-2" : "variable"
- }
- if ("#" == l && "$" != b(j, -2)) return j.skipToEnd(), "comment";
- if (/[:+\-\^*$&%@=<>!?|\/~\.]/.test(l)) {
- var m = j.pos;
- if (j.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/), a[j.current()]) return "operator";
- j.pos = m
- }
- if ("_" == l && 1 == j.pos) {
- if ("_END__" == d(j, 6)) return h(j, k, ["\x00"], "comment");
- if ("_DATA__" == d(j, 7)) return h(j, k, ["\x00"], "variable-2");
- if ("_C__" == d(j, 7)) return h(j, k, ["\x00"], "string")
- }
- if (/\w/.test(l)) {
- var m = j.pos;
- if ("{" == b(j, -2) && ("}" == b(j, 0) || j.eatWhile(/\w/) && "}" == b(j, 0))) return "string";
- j.pos = m
- }
- if (/[A-Z]/.test(l)) {
- var p = b(j, -2),
- m = j.pos;
- if (j.eatWhile(/[A-Z_]/), !/[\da-z]/.test(b(j, 0))) {
- var o = a[j.current()];
- return o ? (o[1] && (o = o[0]), ":" != p ? 1 == o ? "keyword" : 2 == o ? "def" : 3 == o ? "atom" : 4 == o ? "operator" : 5 == o ? "variable-2" : "meta" : "meta") : "meta"
- }
- j.pos = m
- }
- if (/[a-zA-Z_]/.test(l)) {
- var p = b(j, -2);
- j.eatWhile(/\w/);
- var o = a[j.current()];
- return o ? (o[1] && (o = o[0]), ":" != p ? 1 == o ? "keyword" : 2 == o ? "def" : 3 == o ? "atom" : 4 == o ? "operator" : 5 == o ? "variable-2" : "meta" : "meta") : "meta"
- }
- return null
- }
- var a = {
- "->": 4,
- "++": 4,
- "--": 4,
- "**": 4,
- "=~": 4,
- "!~": 4,
- "*": 4,
- "/": 4,
- "%": 4,
- x: 4,
- "+": 4,
- "-": 4,
- ".": 4,
- "<<": 4,
- ">>": 4,
- "<": 4,
- ">": 4,
- "<=": 4,
- ">=": 4,
- lt: 4,
- gt: 4,
- le: 4,
- ge: 4,
- "==": 4,
- "!=": 4,
- "<=>": 4,
- eq: 4,
- ne: 4,
- cmp: 4,
- "~~": 4,
- "&": 4,
- "|": 4,
- "^": 4,
- "&&": 4,
- "||": 4,
- "//": 4,
- "..": 4,
- "...": 4,
- "?": 4,
- ":": 4,
- "=": 4,
- "+=": 4,
- "-=": 4,
- "*=": 4,
- ",": 4,
- "=>": 4,
- "::": 4,
- not: 4,
- and: 4,
- or: 4,
- xor: 4,
- BEGIN: [5, 1],
- END: [5, 1],
- PRINT: [5, 1],
- PRINTF: [5, 1],
- GETC: [5, 1],
- READ: [5, 1],
- READLINE: [5, 1],
- DESTROY: [5, 1],
- TIE: [5, 1],
- TIEHANDLE: [5, 1],
- UNTIE: [5, 1],
- STDIN: 5,
- STDIN_TOP: 5,
- STDOUT: 5,
- STDOUT_TOP: 5,
- STDERR: 5,
- STDERR_TOP: 5,
- $ARG: 5,
- $_: 5,
- "@ARG": 5,
- "@_": 5,
- $LIST_SEPARATOR: 5,
- '$"': 5,
- $PROCESS_ID: 5,
- $PID: 5,
- $$: 5,
- $REAL_GROUP_ID: 5,
- $GID: 5,
- "$(": 5,
- $EFFECTIVE_GROUP_ID: 5,
- $EGID: 5,
- "$)": 5,
- $PROGRAM_NAME: 5,
- $0: 5,
- $SUBSCRIPT_SEPARATOR: 5,
- $SUBSEP: 5,
- "$;": 5,
- $REAL_USER_ID: 5,
- $UID: 5,
- "$<": 5,
- $EFFECTIVE_USER_ID: 5,
- $EUID: 5,
- "$>": 5,
- $a: 5,
- $b: 5,
- $COMPILING: 5,
- "$^C": 5,
- $DEBUGGING: 5,
- "$^D": 5,
- "${^ENCODING}": 5,
- $ENV: 5,
- "%ENV": 5,
- $SYSTEM_FD_MAX: 5,
- "$^F": 5,
- "@F": 5,
- "${^GLOBAL_PHASE}": 5,
- "$^H": 5,
- "%^H": 5,
- "@INC": 5,
- "%INC": 5,
- $INPLACE_EDIT: 5,
- "$^I": 5,
- "$^M": 5,
- $OSNAME: 5,
- "$^O": 5,
- "${^OPEN}": 5,
- $PERLDB: 5,
- "$^P": 5,
- $SIG: 5,
- "%SIG": 5,
- $BASETIME: 5,
- "$^T": 5,
- "${^TAINT}": 5,
- "${^UNICODE}": 5,
- "${^UTF8CACHE}": 5,
- "${^UTF8LOCALE}": 5,
- $PERL_VERSION: 5,
- "$^V": 5,
- "${^WIN32_SLOPPY_STAT}": 5,
- $EXECUTABLE_NAME: 5,
- "$^X": 5,
- $1: 5,
- $MATCH: 5,
- "$&": 5,
- "${^MATCH}": 5,
- $PREMATCH: 5,
- "$`": 5,
- "${^PREMATCH}": 5,
- $POSTMATCH: 5,
- "$'": 5,
- "${^POSTMATCH}": 5,
- $LAST_PAREN_MATCH: 5,
- "$+": 5,
- $LAST_SUBMATCH_RESULT: 5,
- "$^N": 5,
- "@LAST_MATCH_END": 5,
- "@+": 5,
- "%LAST_PAREN_MATCH": 5,
- "%+": 5,
- "@LAST_MATCH_START": 5,
- "@-": 5,
- "%LAST_MATCH_START": 5,
- "%-": 5,
- $LAST_REGEXP_CODE_RESULT: 5,
- "$^R": 5,
- "${^RE_DEBUG_FLAGS}": 5,
- "${^RE_TRIE_MAXBUF}": 5,
- $ARGV: 5,
- "@ARGV": 5,
- ARGV: 5,
- ARGVOUT: 5,
- $OUTPUT_FIELD_SEPARATOR: 5,
- $OFS: 5,
- "$,": 5,
- $INPUT_LINE_NUMBER: 5,
- $NR: 5,
- "$.": 5,
- $INPUT_RECORD_SEPARATOR: 5,
- $RS: 5,
- "$/": 5,
- $OUTPUT_RECORD_SEPARATOR: 5,
- $ORS: 5,
- "$\\": 5,
- $OUTPUT_AUTOFLUSH: 5,
- "$|": 5,
- $ACCUMULATOR: 5,
- "$^A": 5,
- $FORMAT_FORMFEED: 5,
- "$^L": 5,
- $FORMAT_PAGE_NUMBER: 5,
- "$%": 5,
- $FORMAT_LINES_LEFT: 5,
- "$-": 5,
- $FORMAT_LINE_BREAK_CHARACTERS: 5,
- "$:": 5,
- $FORMAT_LINES_PER_PAGE: 5,
- "$=": 5,
- $FORMAT_TOP_NAME: 5,
- "$^": 5,
- $FORMAT_NAME: 5,
- "$~": 5,
- "${^CHILD_ERROR_NATIVE}": 5,
- $EXTENDED_OS_ERROR: 5,
- "$^E": 5,
- $EXCEPTIONS_BEING_CAUGHT: 5,
- "$^S": 5,
- $WARNING: 5,
- "$^W": 5,
- "${^WARNING_BITS}": 5,
- $OS_ERROR: 5,
- $ERRNO: 5,
- "$!": 5,
- "%OS_ERROR": 5,
- "%ERRNO": 5,
- "%!": 5,
- $CHILD_ERROR: 5,
- "$?": 5,
- $EVAL_ERROR: 5,
- "$@": 5,
- $OFMT: 5,
- "$#": 5,
- "$*": 5,
- $ARRAY_BASE: 5,
- "$[": 5,
- $OLD_PERL_VERSION: 5,
- "$]": 5,
- "if": [1, 1],
- elsif: [1, 1],
- "else": [1, 1],
- "while": [1, 1],
- unless: [1, 1],
- "for": [1, 1],
- foreach: [1, 1],
- abs: 1,
- accept: 1,
- alarm: 1,
- atan2: 1,
- bind: 1,
- binmode: 1,
- bless: 1,
- bootstrap: 1,
- "break": 1,
- caller: 1,
- chdir: 1,
- chmod: 1,
- chomp: 1,
- chop: 1,
- chown: 1,
- chr: 1,
- chroot: 1,
- close: 1,
- closedir: 1,
- connect: 1,
- "continue": [1, 1],
- cos: 1,
- crypt: 1,
- dbmclose: 1,
- dbmopen: 1,
- "default": 1,
- defined: 1,
- "delete": 1,
- die: 1,
- "do": 1,
- dump: 1,
- each: 1,
- endgrent: 1,
- endhostent: 1,
- endnetent: 1,
- endprotoent: 1,
- endpwent: 1,
- endservent: 1,
- eof: 1,
- eval: 1,
- exec: 1,
- exists: 1,
- exit: 1,
- exp: 1,
- fcntl: 1,
- fileno: 1,
- flock: 1,
- fork: 1,
- format: 1,
- formline: 1,
- getc: 1,
- getgrent: 1,
- getgrgid: 1,
- getgrnam: 1,
- gethostbyaddr: 1,
- gethostbyname: 1,
- gethostent: 1,
- getlogin: 1,
- getnetbyaddr: 1,
- getnetbyname: 1,
- getnetent: 1,
- getpeername: 1,
- getpgrp: 1,
- getppid: 1,
- getpriority: 1,
- getprotobyname: 1,
- getprotobynumber: 1,
- getprotoent: 1,
- getpwent: 1,
- getpwnam: 1,
- getpwuid: 1,
- getservbyname: 1,
- getservbyport: 1,
- getservent: 1,
- getsockname: 1,
- getsockopt: 1,
- given: 1,
- glob: 1,
- gmtime: 1,
- "goto": 1,
- grep: 1,
- hex: 1,
- "import": 1,
- index: 1,
- "int": 1,
- ioctl: 1,
- join: 1,
- keys: 1,
- kill: 1,
- last: 1,
- lc: 1,
- lcfirst: 1,
- length: 1,
- link: 1,
- listen: 1,
- local: 2,
- localtime: 1,
- lock: 1,
- log: 1,
- lstat: 1,
- m: null,
- map: 1,
- mkdir: 1,
- msgctl: 1,
- msgget: 1,
- msgrcv: 1,
- msgsnd: 1,
- my: 2,
- "new": 1,
- next: 1,
- no: 1,
- oct: 1,
- open: 1,
- opendir: 1,
- ord: 1,
- our: 2,
- pack: 1,
- "package": 1,
- pipe: 1,
- pop: 1,
- pos: 1,
- print: 1,
- printf: 1,
- prototype: 1,
- push: 1,
- q: null,
- qq: null,
- qr: null,
- quotemeta: null,
- qw: null,
- qx: null,
- rand: 1,
- read: 1,
- readdir: 1,
- readline: 1,
- readlink: 1,
- readpipe: 1,
- recv: 1,
- redo: 1,
- ref: 1,
- rename: 1,
- require: 1,
- reset: 1,
- "return": 1,
- reverse: 1,
- rewinddir: 1,
- rindex: 1,
- rmdir: 1,
- s: null,
- say: 1,
- scalar: 1,
- seek: 1,
- seekdir: 1,
- select: 1,
- semctl: 1,
- semget: 1,
- semop: 1,
- send: 1,
- setgrent: 1,
- sethostent: 1,
- setnetent: 1,
- setpgrp: 1,
- setpriority: 1,
- setprotoent: 1,
- setpwent: 1,
- setservent: 1,
- setsockopt: 1,
- shift: 1,
- shmctl: 1,
- shmget: 1,
- shmread: 1,
- shmwrite: 1,
- shutdown: 1,
- sin: 1,
- sleep: 1,
- socket: 1,
- socketpair: 1,
- sort: 1,
- splice: 1,
- split: 1,
- sprintf: 1,
- sqrt: 1,
- srand: 1,
- stat: 1,
- state: 1,
- study: 1,
- sub: 1,
- substr: 1,
- symlink: 1,
- syscall: 1,
- sysopen: 1,
- sysread: 1,
- sysseek: 1,
- system: 1,
- syswrite: 1,
- tell: 1,
- telldir: 1,
- tie: 1,
- tied: 1,
- time: 1,
- times: 1,
- tr: null,
- truncate: 1,
- uc: 1,
- ucfirst: 1,
- umask: 1,
- undef: 1,
- unlink: 1,
- unpack: 1,
- unshift: 1,
- untie: 1,
- use: 1,
- utime: 1,
- values: 1,
- vec: 1,
- wait: 1,
- waitpid: 1,
- wantarray: 1,
- warn: 1,
- when: 1,
- write: 1,
- y: null
- },
- f = "string-2",
- g = /[goseximacplud]/;
- return {
- startState: function () {
- return {
- tokenize: j,
- chain: null,
- style: null,
- tail: null
- }
- },
- token: function (a, b) {
- return (b.tokenize || j)(a, b)
- },
- lineComment: "#"
- }
- }), a.registerHelper("wordChars", "perl", /[\w$]/), a.defineMIME("text/x-perl", "perl")
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function b(a) {
- return new RegExp("^((" + a.join(")|(") + "))\\b")
- }
-
- function h(a) {
- return a.scopes[a.scopes.length - 1]
- }
- var c = b(["and", "or", "not", "is"]),
- d = ["as", "assert", "break", "class", "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", "if", "import", "lambda", "pass", "raise", "return", "try", "while", "with", "yield", "in"],
- e = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "filter", "float", "format", "frozenset", "getattr", "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "property", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip", "__import__", "NotImplemented", "Ellipsis", "__debug__"],
- f = {
- builtins: ["apply", "basestring", "buffer", "cmp", "coerce", "execfile", "file", "intern", "long", "raw_input", "reduce", "reload", "unichr", "unicode", "xrange", "False", "True", "None"],
- keywords: ["exec", "print"]
- },
- g = {
- builtins: ["ascii", "bytes", "exec", "print"],
- keywords: ["nonlocal", "False", "True", "None", "async", "await"]
- };
- a.registerHelper("hintWords", "python", d.concat(e)), a.defineMode("python", function (i, j) {
- function x(a, b) {
- if (a.sol() && "py" == h(b)
- .type) {
- var c = h(b)
- .offset;
- if (a.eatSpace()) {
- var d = a.indentation();
- return d > c ? A(a, b, "py") : c > d && B(a, b) && (b.errorToken = !0), null
- }
- var e = y(a, b);
- return c > 0 && B(a, b) && (e += " " + k), e
- }
- return y(a, b)
- }
-
- function y(a, b) {
- if (a.eatSpace()) return null;
- var d = a.peek();
- if ("#" == d) return a.skipToEnd(), "comment";
- if (a.match(/^[0-9\.]/, !1)) {
- var e = !1;
- if (a.match(/^\d*\.\d+(e[\+\-]?\d+)?/i) && (e = !0), a.match(/^\d+\.\d*/) && (e = !0), a.match(/^\.\d+/) && (e = !0), e) return a.eat(/J/i), "number";
- var f = !1;
- if (a.match(/^0x[0-9a-f]+/i) && (f = !0), a.match(/^0b[01]+/i) && (f = !0), a.match(/^0o[0-7]+/i) && (f = !0), a.match(/^[1-9]\d*(e[\+\-]?\d+)?/) && (a.eat(/J/i), f = !0), a.match(/^0(?![\dx])/i) && (f = !0), f) return a.eat(/L/i), "number"
- }
- return a.match(u) ? (b.tokenize = z(a.current()), b.tokenize(a, b)) : a.match(o) || a.match(n) ? null : a.match(m) || a.match(p) ? "operator" : a.match(l) ? null : a.match(v) || a.match(c) ? "keyword" : a.match(w) ? "builtin" : a.match(/^(self|cls)\b/) ? "variable-2" : a.match(q) ? "def" == b.lastToken || "class" == b.lastToken ? "def" : "variable" : (a.next(), k)
- }
-
- function z(a) {
- function d(d, e) {
- for (; !d.eol();)
- if (d.eatWhile(/[^'"\\]/), d.eat("\\")) {
- if (d.next(), b && d.eol()) return c
- } else {
- if (d.match(a)) return e.tokenize = x, c;
- d.eat(/['"]/)
- }
- if (b) {
- if (j.singleLineStringErrors) return k;
- e.tokenize = x
- }
- return c
- }
- for (;
- "rub".indexOf(a.charAt(0)
- .toLowerCase()) >= 0;) a = a.substr(1);
- var b = 1 == a.length,
- c = "string";
- return d.isString = !0, d
- }
-
- function A(a, b, c) {
- var d = 0,
- e = null;
- if ("py" == c)
- for (;
- "py" != h(b)
- .type;) b.scopes.pop();
- d = h(b)
- .offset + ("py" == c ? i.indentUnit : r), "py" == c || a.match(/^(\s|#.*)*$/, !1) || (e = a.column() + 1), b.scopes.push({
- offset: d,
- type: c,
- align: e
- })
- }
-
- function B(a, b) {
- for (var c = a.indentation(); h(b)
- .offset > c;) {
- if ("py" != h(b)
- .type) return !0;
- b.scopes.pop()
- }
- return h(b)
- .offset != c
- }
-
- function C(a, b) {
- var c = b.tokenize(a, b),
- d = a.current();
- if ("." == d) return c = a.match(q, !1) ? null : k, null == c && "meta" == b.lastStyle && (c = "meta"), c;
- if ("@" == d) return j.version && 3 == parseInt(j.version, 10) ? a.match(q, !1) ? "meta" : "operator" : a.match(q, !1) ? "meta" : k;
- "variable" != c && "builtin" != c || "meta" != b.lastStyle || (c = "meta"), ("pass" == d || "return" == d) && (b.dedent += 1), "lambda" == d && (b.lambda = !0), ":" != d || b.lambda || "py" != h(b)
- .type || A(a, b, "py");
- var e = 1 == d.length ? "[({".indexOf(d) : -1;
- if (-1 != e && A(a, b, "])}".slice(e, e + 1)), e = "])}".indexOf(d), -1 != e) {
- if (h(b)
- .type != d) return k;
- b.scopes.pop()
- }
- return b.dedent > 0 && a.eol() && "py" == h(b)
- .type && (b.scopes.length > 1 && b.scopes.pop(), b.dedent -= 1), c
- }
- var k = "error",
- l = j.singleDelimiters || new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]"),
- m = j.doubleOperators || new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"),
- n = j.doubleDelimiters || new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"),
- o = j.tripleDelimiters || new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");
- if (j.version && 3 == parseInt(j.version, 10)) var p = j.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]"),
- q = j.identifiers || new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*");
- else var p = j.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!]"),
- q = j.identifiers || new RegExp("^[_A-Za-z][_A-Za-z0-9]*");
- var r = j.hangingIndent || i.indentUnit,
- s = d,
- t = e;
- if (void 0 != j.extra_keywords && (s = s.concat(j.extra_keywords)), void 0 != j.extra_builtins && (t = t.concat(j.extra_builtins)), j.version && 3 == parseInt(j.version, 10)) {
- s = s.concat(g.keywords), t = t.concat(g.builtins);
- var u = new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))", "i")
- } else {
- s = s.concat(f.keywords), t = t.concat(f.builtins);
- var u = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i")
- }
- var v = b(s),
- w = b(t),
- D = {
- startState: function (a) {
- return {
- tokenize: x,
- scopes: [{
- offset: a || 0,
- type: "py",
- align: null
- }],
- lastStyle: null,
- lastToken: null,
- lambda: !1,
- dedent: 0
- }
- },
- token: function (a, b) {
- var c = b.errorToken;
- c && (b.errorToken = !1);
- var d = C(a, b);
- b.lastStyle = d;
- var e = a.current();
- return e && d && (b.lastToken = e), a.eol() && b.lambda && (b.lambda = !1), c ? d + " " + k : d
- },
- indent: function (b, c) {
- if (b.tokenize != x) return b.tokenize.isString ? a.Pass : 0;
- var d = h(b),
- e = c && c.charAt(0) == d.type;
- return null != d.align ? d.align - (e ? 1 : 0) : e && b.scopes.length > 1 ? b.scopes[b.scopes.length - 2].offset : d.offset
- },
- closeBrackets: {
- triples: "'\""
- },
- lineComment: "#",
- fold: "indent"
- };
- return D
- }), a.defineMIME("text/x-python", "python");
- var i = function (a) {
- return a.split(" ")
- };
- a.defineMIME("text/x-cython", {
- name: "python",
- extra_keywords: i("by cdef cimport cpdef ctypedef enum exceptextern gil include nogil property publicreadonly struct union DEF IF ELIF ELSE")
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
- a.defineMode("shell", function () {
- function b(b, c) {
- for (var d = c.split(" "), e = 0; e < d.length; e++) a[d[e]] = b
- }
-
- function c(b, c) {
- if (b.eatSpace()) return null;
- var g = b.sol(),
- h = b.next();
- if ("\\" === h) return b.next(), null;
- if ("'" === h || '"' === h || "`" === h) return c.tokens.unshift(d(h)), f(b, c);
- if ("#" === h) return g && b.eat("!") ? (b.skipToEnd(), "meta") : (b.skipToEnd(), "comment");
- if ("$" === h) return c.tokens.unshift(e), f(b, c);
- if ("+" === h || "=" === h) return "operator";
- if ("-" === h) return b.eat("-"), b.eatWhile(/\w/), "attribute";
- if (/\d/.test(h) && (b.eatWhile(/\d/), b.eol() || !/\w/.test(b.peek()))) return "number";
- b.eatWhile(/[\w-]/);
- var i = b.current();
- return "=" === b.peek() && /\w+/.test(i) ? "def" : a.hasOwnProperty(i) ? a[i] : null
- }
-
- function d(a) {
- return function (b, c) {
- for (var d, f = !1, g = !1; null != (d = b.next());) {
- if (d === a && !g) {
- f = !0;
- break
- }
- if ("$" === d && !g && "'" !== a) {
- g = !0, b.backUp(1), c.tokens.unshift(e);
- break
- }
- g = !g && "\\" === d
- }
- return (f || !g) && c.tokens.shift(), "`" === a || ")" === a ? "quote" : "string"
- }
- }
-
- function f(a, b) {
- return (b.tokens[0] || c)(a, b)
- }
- var a = {};
- b("atom", "true false"), b("keyword", "if then do else elif while until for in esac fi fin fil done exit set unset export function"), b("builtin", "ab awk bash beep cat cc cd chown chmod chroot clear cp curl cut diff echo find gawk gcc get git grep kill killall ln ls make mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh shopt shred source sort sleep ssh start stop su sudo tee telnet top touch vi vim wall wc wget who write yes zsh");
- var e = function (a, b) {
- b.tokens.length > 1 && a.eat("$");
- var c = a.next(),
- e = /\w/;
- return "{" === c && (e = /[^}]/), "(" === c ? (b.tokens[0] = d(")"), f(a, b)) : (/\d/.test(c) || (a.eatWhile(e), a.eat("}")), b.tokens.shift(), "def")
- };
- return {
- startState: function () {
- return {
- tokens: []
- }
- },
- token: function (a, b) {
- return f(a, b)
- },
- lineComment: "#",
- fold: "brace"
- }
- }), a.defineMIME("text/x-sh", "shell")
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
- a.defineMode("xml", function (b, c) {
- function k(a, b) {
- function c(c) {
- return b.tokenize = c, c(a, b)
- }
- var d = a.next();
- if ("<" == d) return a.eat("!") ? a.eat("[") ? a.match("CDATA[") ? c(n("atom", "]]>")) : null : a.match("--") ? c(n("comment", "-->")) : a.match("DOCTYPE", !0, !0) ? (a.eatWhile(/[\w\._\-]/), c(o(1))) : null : a.eat("?") ? (a.eatWhile(/[\w\._\-]/), b.tokenize = n("meta", "?>"), "meta") : (i = a.eat("/") ? "closeTag" : "openTag", b.tokenize = l, "tag bracket");
- if ("&" == d) {
- var e;
- return e = a.eat("#") ? a.eat("x") ? a.eatWhile(/[a-fA-F\d]/) && a.eat(";") : a.eatWhile(/[\d]/) && a.eat(";") : a.eatWhile(/[\w\.\-:]/) && a.eat(";"), e ? "atom" : "error"
- }
- return a.eatWhile(/[^&<]/), null
- }
-
- function l(a, b) {
- var c = a.next();
- if (">" == c || "/" == c && a.eat(">")) return b.tokenize = k, i = ">" == c ? "endTag" : "selfcloseTag", "tag bracket";
- if ("=" == c) return i = "equals", null;
- if ("<" == c) {
- b.tokenize = k, b.state = s, b.tagName = b.tagStart = null;
- var d = b.tokenize(a, b);
- return d ? d + " tag error" : "tag error"
- }
- return /[\'\"]/.test(c) ? (b.tokenize = m(c), b.stringStartCol = a.column(), b.tokenize(a, b)) : (a.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/), "word")
- }
-
- function m(a) {
- var b = function (b, c) {
- for (; !b.eol();)
- if (b.next() == a) {
- c.tokenize = l;
- break
- }
- return "string"
- };
- return b.isInAttribute = !0, b
- }
-
- function n(a, b) {
- return function (c, d) {
- for (; !c.eol();) {
- if (c.match(b)) {
- d.tokenize = k;
- break
- }
- c.next()
- }
- return a
- }
- }
-
- function o(a) {
- return function (b, c) {
- for (var d; null != (d = b.next());) {
- if ("<" == d) return c.tokenize = o(a + 1), c.tokenize(b, c);
- if (">" == d) {
- if (1 == a) {
- c.tokenize = k;
- break
- }
- return c.tokenize = o(a - 1), c.tokenize(b, c)
- }
- }
- return "meta"
- }
- }
-
- function p(a, b, c) {
- this.prev = a.context, this.tagName = b, this.indent = a.indented, this.startOfLine = c, (g.doNotIndent.hasOwnProperty(b) || a.context && a.context.noIndent) && (this.noIndent = !0)
- }
-
- function q(a) {
- a.context && (a.context = a.context.prev)
- }
-
- function r(a, b) {
- for (var c;;) {
- if (!a.context) return;
- if (c = a.context.tagName, !g.contextGrabbers.hasOwnProperty(c) || !g.contextGrabbers[c].hasOwnProperty(b)) return;
- q(a)
- }
- }
-
- function s(a, b, c) {
- return "openTag" == a ? (c.tagStart = b.column(), t) : "closeTag" == a ? u : s
- }
-
- function t(a, b, c) {
- return "word" == a ? (c.tagName = b.current(), j = "tag", x) : (j = "error", t)
- }
-
- function u(a, b, c) {
- if ("word" == a) {
- var d = b.current();
- return c.context && c.context.tagName != d && g.implicitlyClosed.hasOwnProperty(c.context.tagName) && q(c), c.context && c.context.tagName == d ? (j = "tag", v) : (j = "tag error", w)
- }
- return j = "error", w
- }
-
- function v(a, b, c) {
- return "endTag" != a ? (j = "error", v) : (q(c), s)
- }
-
- function w(a, b, c) {
- return j = "error", v(a, b, c)
- }
-
- function x(a, b, c) {
- if ("word" == a) return j = "attribute", y;
- if ("endTag" == a || "selfcloseTag" == a) {
- var d = c.tagName,
- e = c.tagStart;
- return c.tagName = c.tagStart = null, "selfcloseTag" == a || g.autoSelfClosers.hasOwnProperty(d) ? r(c, d) : (r(c, d), c.context = new p(c, d, e == c.indented)), s
- }
- return j = "error", x
- }
-
- function y(a, b, c) {
- return "equals" == a ? z : (g.allowMissing || (j = "error"), x(a, b, c))
- }
-
- function z(a, b, c) {
- return "string" == a ? A : "word" == a && g.allowUnquoted ? (j = "string", x) : (j = "error", x(a, b, c))
- }
-
- function A(a, b, c) {
- return "string" == a ? A : x(a, b, c)
- }
- var d = b.indentUnit,
- e = c.multilineTagIndentFactor || 1,
- f = c.multilineTagIndentPastTag;
- null == f && (f = !0);
- var i, j, g = c.htmlMode ? {
- autoSelfClosers: {
- area: !0,
- base: !0,
- br: !0,
- col: !0,
- command: !0,
- embed: !0,
- frame: !0,
- hr: !0,
- img: !0,
- input: !0,
- keygen: !0,
- link: !0,
- meta: !0,
- param: !0,
- source: !0,
- track: !0,
- wbr: !0,
- menuitem: !0
- },
- implicitlyClosed: {
- dd: !0,
- li: !0,
- optgroup: !0,
- option: !0,
- p: !0,
- rp: !0,
- rt: !0,
- tbody: !0,
- td: !0,
- tfoot: !0,
- th: !0,
- tr: !0
- },
- contextGrabbers: {
- dd: {
- dd: !0,
- dt: !0
- },
- dt: {
- dd: !0,
- dt: !0
- },
- li: {
- li: !0
- },
- option: {
- option: !0,
- optgroup: !0
- },
- optgroup: {
- optgroup: !0
- },
- p: {
- address: !0,
- article: !0,
- aside: !0,
- blockquote: !0,
- dir: !0,
- div: !0,
- dl: !0,
- fieldset: !0,
- footer: !0,
- form: !0,
- h1: !0,
- h2: !0,
- h3: !0,
- h4: !0,
- h5: !0,
- h6: !0,
- header: !0,
- hgroup: !0,
- hr: !0,
- menu: !0,
- nav: !0,
- ol: !0,
- p: !0,
- pre: !0,
- section: !0,
- table: !0,
- ul: !0
- },
- rp: {
- rp: !0,
- rt: !0
- },
- rt: {
- rp: !0,
- rt: !0
- },
- tbody: {
- tbody: !0,
- tfoot: !0
- },
- td: {
- td: !0,
- th: !0
- },
- tfoot: {
- tbody: !0
- },
- th: {
- td: !0,
- th: !0
- },
- thead: {
- tbody: !0,
- tfoot: !0
- },
- tr: {
- tr: !0
- }
- },
- doNotIndent: {
- pre: !0
- },
- allowUnquoted: !0,
- allowMissing: !0,
- caseFold: !0
- } : {
- autoSelfClosers: {},
- implicitlyClosed: {},
- contextGrabbers: {},
- doNotIndent: {},
- allowUnquoted: !1,
- allowMissing: !1,
- caseFold: !1
- },
- h = c.alignCDATA;
- return k.isInText = !0, {
- startState: function () {
- return {
- tokenize: k,
- state: s,
- indented: 0,
- tagName: null,
- tagStart: null,
- context: null
- }
- },
- token: function (a, b) {
- if (!b.tagName && a.sol() && (b.indented = a.indentation()), a.eatSpace()) return null;
- i = null;
- var c = b.tokenize(a, b);
- return (c || i) && "comment" != c && (j = null, b.state = b.state(i || c, a, b), j && (c = "error" == j ? c + " error" : j)), c
- },
- indent: function (b, c, i) {
- var j = b.context;
- if (b.tokenize.isInAttribute) return b.tagStart == b.indented ? b.stringStartCol + 1 : b.indented + d;
- if (j && j.noIndent) return a.Pass;
- if (b.tokenize != l && b.tokenize != k) return i ? i.match(/^(\s*)/)[0].length : 0;
- if (b.tagName) return f ? b.tagStart + b.tagName.length + 2 : b.tagStart + d * e;
- if (h && /<!\[CDATA\[/.test(c)) return 0;
- var m = c && /^<(\/)?([\w_:\.-]*)/.exec(c);
- if (m && m[1])
- for (; j;) {
- if (j.tagName == m[2]) {
- j = j.prev;
- break
- }
- if (!g.implicitlyClosed.hasOwnProperty(j.tagName)) break;
- j = j.prev
- } else if (m)
- for (; j;) {
- var n = g.contextGrabbers[j.tagName];
- if (!n || !n.hasOwnProperty(m[2])) break;
- j = j.prev
- }
- for (; j && !j.startOfLine;) j = j.prev;
- return j ? j.indent + d : 0
- },
- electricInput: /<\/[\s\w:]+>$/,
- blockCommentStart: "<!--",
- blockCommentEnd: "-->",
- configuration: c.htmlMode ? "html" : "xml",
- helperType: c.htmlMode ? "html" : "xml"
- }
- }), a.defineMIME("text/xml", "xml"), a.defineMIME("application/xml", "xml"), a.mimeModes.hasOwnProperty("text/html") || a.defineMIME("text/html", {
- name: "xml",
- htmlMode: !0
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function d(a) {
- for (var d = 0; d < a.state.activeLines.length; d++) a.removeLineClass(a.state.activeLines[d], "wrap", b), a.removeLineClass(a.state.activeLines[d], "background", c)
- }
-
- function e(a, b) {
- if (a.length != b.length) return !1;
- for (var c = 0; c < a.length; c++)
- if (a[c] != b[c]) return !1;
- return !0
- }
-
- function f(a, f) {
- for (var g = [], h = 0; h < f.length; h++) {
- var i = f[h];
- if (i.empty()) {
- var j = a.getLineHandleVisualStart(i.head.line);
- g[g.length - 1] != j && g.push(j)
- }
- }
- e(a.state.activeLines, g) || a.operation(function () {
- d(a);
- for (var e = 0; e < g.length; e++) a.addLineClass(g[e], "wrap", b), a.addLineClass(g[e], "background", c);
- a.state.activeLines = g
- })
- }
-
- function g(a, b) {
- f(a, b.ranges)
- }
- var b = "CodeMirror-activeline",
- c = "CodeMirror-activeline-background";
- a.defineOption("styleActiveLine", !1, function (b, c, e) {
- var h = e && e != a.Init;
- c && !h ? (b.state.activeLines = [], f(b, b.listSelections()), b.on("beforeSelectionChange", g)) : !c && h && (b.off("beforeSelectionChange", g), d(b), delete b.state.activeLines)
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
- a.registerHelper("fold", "brace", function (b, c) {
- function h(f) {
- for (var h = c.ch, i = 0;;) {
- var j = 0 >= h ? -1 : e.lastIndexOf(f, h - 1);
- if (-1 != j) {
- if (1 == i && j < c.ch) break;
- if (g = b.getTokenTypeAt(a.Pos(d, j + 1)), !/^(comment|string)/.test(g)) return j + 1;
- h = j - 1
- } else {
- if (1 == i) break;
- i = 1, h = e.length
- }
- }
- }
- var f, g, d = c.line,
- e = b.getLine(d),
- i = "{",
- j = "}",
- f = h("{");
- if (null == f && (i = "[", j = "]", f = h("[")), null != f) {
- var m, n, k = 1,
- l = b.lastLine();
- a: for (var o = d; l >= o; ++o)
- for (var p = b.getLine(o), q = o == d ? f : 0;;) {
- var r = p.indexOf(i, q),
- s = p.indexOf(j, q);
- if (0 > r && (r = p.length), 0 > s && (s = p.length), q = Math.min(r, s), q == p.length) break;
- if (b.getTokenTypeAt(a.Pos(o, q + 1)) == g)
- if (q == r) ++k;
- else if (!--k) {
- m = o, n = q;
- break a
- }++q
- }
- if (null != m && (d != m || n != f)) return {
- from: a.Pos(d, f),
- to: a.Pos(m, n)
- }
- }
- }), a.registerHelper("fold", "import", function (b, c) {
- function d(c) {
- if (c < b.firstLine() || c > b.lastLine()) return null;
- var d = b.getTokenAt(a.Pos(c, 1));
- if (/\S/.test(d.string) || (d = b.getTokenAt(a.Pos(c, d.end + 1))), "keyword" != d.type || "import" != d.string) return null;
- for (var e = c, f = Math.min(b.lastLine(), c + 10); f >= e; ++e) {
- var g = b.getLine(e),
- h = g.indexOf(";");
- if (-1 != h) return {
- startCh: d.end,
- end: a.Pos(e, h)
- }
- }
- }
- var f, c = c.line,
- e = d(c);
- if (!e || d(c - 1) || (f = d(c - 2)) && f.end.line == c - 1) return null;
- for (var g = e.end;;) {
- var h = d(g.line + 1);
- if (null == h) break;
- g = h.end
- }
- return {
- from: b.clipPos(a.Pos(c, e.startCh + 1)),
- to: g
- }
- }), a.registerHelper("fold", "include", function (b, c) {
- function d(c) {
- if (c < b.firstLine() || c > b.lastLine()) return null;
- var d = b.getTokenAt(a.Pos(c, 1));
- return /\S/.test(d.string) || (d = b.getTokenAt(a.Pos(c, d.end + 1))), "meta" == d.type && "#include" == d.string.slice(0, 8) ? d.start + 8 : void 0
- }
- var c = c.line,
- e = d(c);
- if (null == e || null != d(c - 1)) return null;
- for (var f = c;;) {
- var g = d(f + 1);
- if (null == g) break;
- ++f
- }
- return {
- from: a.Pos(c, e + 1),
- to: b.clipPos(a.Pos(f))
- }
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- function d(a, c) {
- return "pairs" == c && "string" == typeof a ? a : "object" == typeof a && null != a[c] ? a[c] : b[c]
- }
-
- function h(a) {
- return function (b) {
- return l(b, a)
- }
- }
-
- function i(a) {
- var b = a.state.closeBrackets;
- if (!b) return null;
- var c = a.getModeAt(a.getCursor());
- return c.closeBrackets || b
- }
-
- function j(b) {
- var e = i(b);
- if (!e || b.getOption("disableInput")) return a.Pass;
- for (var f = d(e, "pairs"), g = b.listSelections(), h = 0; h < g.length; h++) {
- if (!g[h].empty()) return a.Pass;
- var j = n(b, g[h].head);
- if (!j || f.indexOf(j) % 2 != 0) return a.Pass
- }
- for (var h = g.length - 1; h >= 0; h--) {
- var k = g[h].head;
- b.replaceRange("", c(k.line, k.ch - 1), c(k.line, k.ch + 1))
- }
- }
-
- function k(b) {
- var c = i(b),
- e = c && d(c, "explode");
- if (!e || b.getOption("disableInput")) return a.Pass;
- for (var f = b.listSelections(), g = 0; g < f.length; g++) {
- if (!f[g].empty()) return a.Pass;
- var h = n(b, f[g].head);
- if (!h || e.indexOf(h) % 2 != 0) return a.Pass
- }
- b.operation(function () {
- b.replaceSelection("\n\n", null), b.execCommand("goCharLeft"), f = b.listSelections();
- for (var a = 0; a < f.length; a++) {
- var c = f[a].head.line;
- b.indentLine(c, null, !0), b.indentLine(c + 1, null, !0)
- }
- })
- }
-
- function l(b, e) {
- var f = i(b);
- if (!f || b.getOption("disableInput")) return a.Pass;
- var g = d(f, "pairs"),
- h = g.indexOf(e);
- if (-1 == h) return a.Pass;
- for (var p, q, j = d(f, "triples"), k = g.charAt(h + 1) == e, l = b.listSelections(), n = h % 2 == 0, r = 0; r < l.length; r++) {
- var u, s = l[r],
- t = s.head,
- q = b.getRange(t, c(t.line, t.ch + 1));
- if (n && !s.empty()) u = "surround";
- else if (!k && n || q != e)
- if (k && t.ch > 1 && j.indexOf(e) >= 0 && b.getRange(c(t.line, t.ch - 2), t) == e + e && (t.ch <= 2 || b.getRange(c(t.line, t.ch - 3), c(t.line, t.ch - 2)) != e)) u = "addFour";
- else if (k) {
- if (a.isWordChar(q) || !o(b, t, e)) return a.Pass;
- u = "both"
- } else {
- if (!n || b.getLine(t.line)
- .length != t.ch && !m(q, g) && !/\s/.test(q)) return a.Pass;
- u = "both"
- } else u = j.indexOf(e) >= 0 && b.getRange(t, c(t.line, t.ch + 3)) == e + e + e ? "skipThree" : "skip";
- if (p) {
- if (p != u) return a.Pass
- } else p = u
- }
- var v = h % 2 ? g.charAt(h - 1) : e,
- w = h % 2 ? e : g.charAt(h + 1);
- b.operation(function () {
- if ("skip" == p) b.execCommand("goCharRight");
- else if ("skipThree" == p)
- for (var a = 0; 3 > a; a++) b.execCommand("goCharRight");
- else if ("surround" == p) {
- for (var c = b.getSelections(), a = 0; a < c.length; a++) c[a] = v + c[a] + w;
- b.replaceSelections(c, "around")
- } else "both" == p ? (b.replaceSelection(v + w, null), b.triggerElectric(v + w), b.execCommand("goCharLeft")) : "addFour" == p && (b.replaceSelection(v + v + v + v, "before"), b.execCommand("goCharRight"))
- })
- }
-
- function m(a, b) {
- var c = b.lastIndexOf(a);
- return c > -1 && c % 2 == 1
- }
-
- function n(a, b) {
- var d = a.getRange(c(b.line, b.ch - 1), c(b.line, b.ch + 1));
- return 2 == d.length ? d : null
- }
-
- function o(b, c, d) {
- var e = b.getLine(c.line),
- f = b.getTokenAt(c);
- if (/\bstring2?\b/.test(f.type)) return !1;
- var g = new a.StringStream(e.slice(0, c.ch) + d + e.slice(c.ch), 4);
- for (g.pos = g.start = f.start;;) {
- var h = b.getMode()
- .token(g, f.state);
- if (g.pos >= c.ch + 1) return /\bstring2?\b/.test(h);
- g.start = g.pos
- }
- }
- var b = {
- pairs: "()[]{}''\"\"",
- triples: "",
- explode: "[]{}"
- },
- c = a.Pos;
- a.defineOption("autoCloseBrackets", !1, function (b, c, d) {
- d && d != a.Init && (b.removeKeyMap(f), b.state.closeBrackets = null), c && (b.state.closeBrackets = c, b.addKeyMap(f))
- });
- for (var e = b.pairs + "`", f = {
- Backspace: j,
- Enter: k
- }, g = 0; g < e.length; g++) f["'" + e.charAt(g) + "'"] = h(e.charAt(g))
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("../fold/xml-fold")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../fold/xml-fold"], a) : a(CodeMirror)
-}(function (a) {
- function d(d) {
- if (d.getOption("disableInput")) return a.Pass;
- for (var e = d.listSelections(), f = [], i = 0; i < e.length; i++) {
- if (!e[i].empty()) return a.Pass;
- var j = e[i].head,
- k = d.getTokenAt(j),
- l = a.innerMode(d.getMode(), k.state),
- m = l.state;
- if ("xml" != l.mode.name || !m.tagName) return a.Pass;
- var n = d.getOption("autoCloseTags"),
- o = "html" == l.mode.configuration,
- p = "object" == typeof n && n.dontCloseTags || o && b,
- q = "object" == typeof n && n.indentTags || o && c,
- r = m.tagName;
- k.end > j.ch && (r = r.slice(0, r.length - k.end + j.ch));
- var s = r.toLowerCase();
- if (!r || "string" == k.type && (k.end != j.ch || !/[\"\']/.test(k.string.charAt(k.string.length - 1)) || 1 == k.string.length) || "tag" == k.type && "closeTag" == m.type || k.string.indexOf("/") == k.string.length - 1 || p && g(p, s) > -1 || h(d, r, j, m, !0)) return a.Pass;
- var t = q && g(q, s) > -1;
- f[i] = {
- indent: t,
- text: ">" + (t ? "\n\n" : "") + "</" + r + ">",
- newPos: t ? a.Pos(j.line + 1, 0) : a.Pos(j.line, j.ch + 1)
- }
- }
- for (var i = e.length - 1; i >= 0; i--) {
- var u = f[i];
- d.replaceRange(u.text, e[i].head, e[i].anchor, "+insert");
- var v = d.listSelections()
- .slice(0);
- v[i] = {
- head: u.newPos,
- anchor: u.newPos
- }, d.setSelections(v), u.indent && (d.indentLine(u.newPos.line, null, !0), d.indentLine(u.newPos.line + 1, null, !0))
- }
- }
-
- function e(b, c) {
- for (var d = b.listSelections(), e = [], f = c ? "/" : "</", g = 0; g < d.length; g++) {
- if (!d[g].empty()) return a.Pass;
- var i = d[g].head,
- j = b.getTokenAt(i),
- k = a.innerMode(b.getMode(), j.state),
- l = k.state;
- if (c && ("string" == j.type || "<" != j.string.charAt(0) || j.start != i.ch - 1)) return a.Pass;
- var m;
- if ("xml" != k.mode.name)
- if ("htmlmixed" == b.getMode()
- .name && "javascript" == k.mode.name) m = f + "script";
- else {
- if ("htmlmixed" != b.getMode()
- .name || "css" != k.mode.name) return a.Pass;
- m = f + "style"
- } else {
- if (!l.context || !l.context.tagName || h(b, l.context.tagName, i, l)) return a.Pass;
- m = f + l.context.tagName;
- }
- ">" != b.getLine(i.line)
- .charAt(j.end) && (m += ">"), e[g] = m
- }
- b.replaceSelections(e), d = b.listSelections();
- for (var g = 0; g < d.length; g++)(g == d.length - 1 || d[g].head.line < d[g + 1].head.line) && b.indentLine(d[g].head.line)
- }
-
- function f(b) {
- return b.getOption("disableInput") ? a.Pass : e(b, !0)
- }
-
- function g(a, b) {
- if (a.indexOf) return a.indexOf(b);
- for (var c = 0, d = a.length; d > c; ++c)
- if (a[c] == b) return c;
- return -1
- }
-
- function h(b, c, d, e, f) {
- if (!a.scanForClosingTag) return !1;
- var g = Math.min(b.lastLine() + 1, d.line + 500),
- h = a.scanForClosingTag(b, d, null, g);
- if (!h || h.tag != c) return !1;
- for (var i = e.context, j = f ? 1 : 0; i && i.tagName == c; i = i.prev) ++j;
- d = h.to;
- for (var k = 1; j > k; k++) {
- var l = a.scanForClosingTag(b, d, null, g);
- if (!l || l.tag != c) return !1;
- d = l.to
- }
- return !0
- }
- a.defineOption("autoCloseTags", !1, function (b, c, e) {
- if (e != a.Init && e && b.removeKeyMap("autoCloseTags"), c) {
- var g = {
- name: "autoCloseTags"
- };
- ("object" != typeof c || c.whenClosing) && (g["'/'"] = function (a) {
- return f(a)
- }), ("object" != typeof c || c.whenOpening) && (g["'>'"] = function (a) {
- return d(a)
- }), b.addKeyMap(g)
- }
- });
- var b = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"],
- c = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
- a.commands.closeTag = function (a) {
- return e(a)
- }
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function b(b, d, f, g) {
- function j(a) {
- var c = h(b, d);
- if (!c || c.to.line - c.from.line < i) return null;
- for (var e = b.findMarksAt(c.from), f = 0; f < e.length; ++f)
- if (e[f].__isFold && "fold" !== g) {
- if (!a) return null;
- c.cleared = !0, e[f].clear()
- }
- return c
- }
- if (f && f.call) {
- var h = f;
- f = null
- } else var h = e(b, f, "rangeFinder");
- "number" == typeof d && (d = a.Pos(d, 0));
- var i = e(b, f, "minFoldSize"),
- k = j(!0);
- if (e(b, f, "scanUp"))
- for (; !k && d.line > b.firstLine();) d = a.Pos(d.line - 1, 0), k = j(!1);
- if (k && !k.cleared && "unfold" !== g) {
- var l = c(b, f);
- a.on(l, "mousedown", function (b) {
- m.clear(), a.e_preventDefault(b)
- });
- var m = b.markText(k.from, k.to, {
- replacedWith: l,
- clearOnEnter: !0,
- __isFold: !0
- });
- m.on("clear", function (c, d) {
- a.signal(b, "unfold", b, c, d)
- }), a.signal(b, "fold", b, k.from, k.to)
- }
- }
-
- function c(a, b) {
- var c = e(a, b, "widget");
- if ("string" == typeof c) {
- var d = document.createTextNode(c);
- c = document.createElement("span"), c.appendChild(d), c.className = "CodeMirror-foldmarker"
- }
- return c
- }
-
- function e(a, b, c) {
- if (b && void 0 !== b[c]) return b[c];
- var e = a.options.foldOptions;
- return e && void 0 !== e[c] ? e[c] : d[c]
- }
- a.newFoldFunction = function (a, c) {
- return function (d, e) {
- b(d, e, {
- rangeFinder: a,
- widget: c
- })
- }
- }, a.defineExtension("foldCode", function (a, c, d) {
- b(this, a, c, d)
- }), a.defineExtension("isFolded", function (a) {
- for (var b = this.findMarksAt(a), c = 0; c < b.length; ++c)
- if (b[c].__isFold) return !0
- }), a.commands.toggleFold = function (a) {
- a.foldCode(a.getCursor())
- }, a.commands.fold = function (a) {
- a.foldCode(a.getCursor(), null, "fold")
- }, a.commands.unfold = function (a) {
- a.foldCode(a.getCursor(), null, "unfold")
- }, a.commands.foldAll = function (b) {
- b.operation(function () {
- for (var c = b.firstLine(), d = b.lastLine(); d >= c; c++) b.foldCode(a.Pos(c, 0), null, "fold")
- })
- }, a.commands.unfoldAll = function (b) {
- b.operation(function () {
- for (var c = b.firstLine(), d = b.lastLine(); d >= c; c++) b.foldCode(a.Pos(c, 0), null, "unfold")
- })
- }, a.registerHelper("fold", "combine", function () {
- var a = Array.prototype.slice.call(arguments, 0);
- return function (b, c) {
- for (var d = 0; d < a.length; ++d) {
- var e = a[d](b, c);
- if (e) return e
- }
- }
- }), a.registerHelper("fold", "auto", function (a, b) {
- for (var c = a.getHelpers(b, "fold"), d = 0; d < c.length; d++) {
- var e = c[d](a, b);
- if (e) return e
- }
- });
- var d = {
- rangeFinder: a.fold.auto,
- widget: "\u2194",
- minFoldSize: 0,
- scanUp: !1
- };
- a.defineOption("foldOptions", null), a.defineExtension("foldOption", function (a, b) {
- return e(this, a, b)
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("./foldcode")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "./foldcode"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function c(a) {
- this.options = a, this.from = this.to = 0
- }
-
- function d(a) {
- return a === !0 && (a = {}), null == a.gutter && (a.gutter = "CodeMirror-foldgutter"), null == a.indicatorOpen && (a.indicatorOpen = "CodeMirror-foldgutter-open"), null == a.indicatorFolded && (a.indicatorFolded = "CodeMirror-foldgutter-folded"), a
- }
-
- function e(a, c) {
- for (var d = a.findMarksAt(b(c)), e = 0; e < d.length; ++e)
- if (d[e].__isFold && d[e].find()
- .from.line == c) return d[e]
- }
-
- function f(a) {
- if ("string" == typeof a) {
- var b = document.createElement("div");
- return b.className = a + " CodeMirror-guttermarker-subtle", b
- }
- return a.cloneNode(!0)
- }
-
- function g(a, c, d) {
- var g = a.state.foldGutter.options,
- h = c,
- i = a.foldOption(g, "minFoldSize"),
- j = a.foldOption(g, "rangeFinder");
- a.eachLine(c, d, function (c) {
- var d = null;
- if (e(a, h)) d = f(g.indicatorFolded);
- else {
- var k = b(h, 0),
- l = j && j(a, k);
- l && l.to.line - l.from.line >= i && (d = f(g.indicatorOpen))
- }
- a.setGutterMarker(c, g.gutter, d), ++h
- })
- }
-
- function h(a) {
- var b = a.getViewport(),
- c = a.state.foldGutter;
- c && (a.operation(function () {
- g(a, b.from, b.to)
- }), c.from = b.from, c.to = b.to)
- }
-
- function i(a, c, d) {
- var f = a.state.foldGutter;
- if (f) {
- var g = f.options;
- if (d == g.gutter) {
- var h = e(a, c);
- h ? h.clear() : a.foldCode(b(c, 0), g.rangeFinder)
- }
- }
- }
-
- function j(a) {
- var b = a.state.foldGutter;
- if (b) {
- var c = b.options;
- b.from = b.to = 0, clearTimeout(b.changeUpdate), b.changeUpdate = setTimeout(function () {
- h(a)
- }, c.foldOnChangeTimeSpan || 600)
- }
- }
-
- function k(a) {
- var b = a.state.foldGutter;
- if (b) {
- var c = b.options;
- clearTimeout(b.changeUpdate), b.changeUpdate = setTimeout(function () {
- var c = a.getViewport();
- b.from == b.to || c.from - b.to > 20 || b.from - c.to > 20 ? h(a) : a.operation(function () {
- c.from < b.from && (g(a, c.from, b.from), b.from = c.from), c.to > b.to && (g(a, b.to, c.to), b.to = c.to)
- })
- }, c.updateViewportTimeSpan || 400)
- }
- }
-
- function l(a, b) {
- var c = a.state.foldGutter;
- if (c) {
- var d = b.line;
- d >= c.from && d < c.to && g(a, d, d + 1)
- }
- }
- a.defineOption("foldGutter", !1, function (b, e, f) {
- f && f != a.Init && (b.clearGutter(b.state.foldGutter.options.gutter), b.state.foldGutter = null, b.off("gutterClick", i), b.off("change", j), b.off("viewportChange", k), b.off("fold", l), b.off("unfold", l), b.off("swapDoc", h)), e && (b.state.foldGutter = new c(d(e)), h(b), b.on("gutterClick", i), b.on("change", j), b.on("viewportChange", k), b.on("fold", l), b.on("unfold", l), b.on("swapDoc", h))
- });
- var b = a.Pos
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
- a.registerHelper("fold", "indent", function (b, c) {
- var d = b.getOption("tabSize"),
- e = b.getLine(c.line);
- if (/\S/.test(e)) {
- for (var f = function (b) {
- return a.countColumn(b, null, d)
- }, g = f(e), h = null, i = c.line + 1, j = b.lastLine(); j >= i; ++i) {
- var k = b.getLine(i),
- l = f(k);
- if (l > g) h = i;
- else if (/\S/.test(k)) break
- }
- return h ? {
- from: a.Pos(c.line, e.length),
- to: a.Pos(h, b.getLine(h)
- .length)
- } : void 0
- }
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function f(a) {
- "object" == typeof a && (this.minChars = a.minChars, this.style = a.style, this.showToken = a.showToken, this.delay = a.delay, this.wordsOnly = a.wordsOnly), null == this.style && (this.style = c), null == this.minChars && (this.minChars = b), null == this.delay && (this.delay = d), null == this.wordsOnly && (this.wordsOnly = e), this.overlay = this.timeout = null
- }
-
- function g(a) {
- var b = a.state.matchHighlighter;
- clearTimeout(b.timeout), b.timeout = setTimeout(function () {
- h(a)
- }, b.delay)
- }
-
- function h(a) {
- a.operation(function () {
- var b = a.state.matchHighlighter;
- if (b.overlay && (a.removeOverlay(b.overlay), b.overlay = null), !a.somethingSelected() && b.showToken) {
- for (var c = b.showToken === !0 ? /[\w$]/ : b.showToken, d = a.getCursor(), e = a.getLine(d.line), f = d.ch, g = f; f && c.test(e.charAt(f - 1));) --f;
- for (; g < e.length && c.test(e.charAt(g));) ++g;
- return void(g > f && a.addOverlay(b.overlay = k(e.slice(f, g), c, b.style)))
- }
- var h = a.getCursor("from"),
- j = a.getCursor("to");
- if (h.line == j.line && (!b.wordsOnly || i(a, h, j))) {
- var l = a.getRange(h, j)
- .replace(/^\s+|\s+$/g, "");
- l.length >= b.minChars && a.addOverlay(b.overlay = k(l, !1, b.style))
- }
- })
- }
-
- function i(a, b, c) {
- var d = a.getRange(b, c);
- if (null !== d.match(/^\w+$/)) {
- if (b.ch > 0) {
- var e = {
- line: b.line,
- ch: b.ch - 1
- },
- f = a.getRange(e, b);
- if (null === f.match(/\W/)) return !1
- }
- if (c.ch < a.getLine(b.line)
- .length) {
- var e = {
- line: c.line,
- ch: c.ch + 1
- },
- f = a.getRange(c, e);
- if (null === f.match(/\W/)) return !1
- }
- return !0
- }
- return !1
- }
-
- function j(a, b) {
- return !(a.start && b.test(a.string.charAt(a.start - 1)) || a.pos != a.string.length && b.test(a.string.charAt(a.pos)))
- }
-
- function k(a, b, c) {
- return {
- token: function (d) {
- return !d.match(a) || b && !j(d, b) ? (d.next(), void(d.skipTo(a.charAt(0)) || d.skipToEnd())) : c
- }
- }
- }
- var b = 2,
- c = "matchhighlight",
- d = 100,
- e = !1;
- a.defineOption("highlightSelectionMatches", !1, function (b, c, d) {
- if (d && d != a.Init) {
- var e = b.state.matchHighlighter.overlay;
- e && b.removeOverlay(e), clearTimeout(b.state.matchHighlighter.timeout), b.state.matchHighlighter = null, b.off("cursorActivity", g)
- }
- c && (b.state.matchHighlighter = new f(c), h(b), b.on("cursorActivity", g))
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- function e(a, b, e, g) {
- var h = a.getLineHandle(b.line),
- i = b.ch - 1,
- j = i >= 0 && d[h.text.charAt(i)] || d[h.text.charAt(++i)];
- if (!j) return null;
- var k = ">" == j.charAt(1) ? 1 : -1;
- if (e && k > 0 != (i == b.ch)) return null;
- var l = a.getTokenTypeAt(c(b.line, i + 1)),
- m = f(a, c(b.line, i + (k > 0 ? 1 : 0)), k, l || null, g);
- return null == m ? null : {
- from: c(b.line, i),
- to: m && m.pos,
- match: m && m.ch == j.charAt(0),
- forward: k > 0
- }
- }
-
- function f(a, b, e, f, g) {
- for (var h = g && g.maxScanLineLength || 1e4, i = g && g.maxScanLines || 1e3, j = [], k = g && g.bracketRegex ? g.bracketRegex : /[(){}[\]]/, l = e > 0 ? Math.min(b.line + i, a.lastLine() + 1) : Math.max(a.firstLine() - 1, b.line - i), m = b.line; m != l; m += e) {
- var n = a.getLine(m);
- if (n) {
- var o = e > 0 ? 0 : n.length - 1,
- p = e > 0 ? n.length : -1;
- if (!(n.length > h))
- for (m == b.line && (o = b.ch - (0 > e ? 1 : 0)); o != p; o += e) {
- var q = n.charAt(o);
- if (k.test(q) && (void 0 === f || a.getTokenTypeAt(c(m, o + 1)) == f)) {
- var r = d[q];
- if (">" == r.charAt(1) == e > 0) j.push(q);
- else {
- if (!j.length) return {
- pos: c(m, o),
- ch: q
- };
- j.pop()
- }
- }
- }
- }
- }
- return m - e == (e > 0 ? a.lastLine() : a.firstLine()) ? !1 : null
- }
-
- function g(a, d, f) {
- for (var g = a.state.matchBrackets.maxHighlightLineLength || 1e3, h = [], i = a.listSelections(), j = 0; j < i.length; j++) {
- var k = i[j].empty() && e(a, i[j].head, !1, f);
- if (k && a.getLine(k.from.line)
- .length <= g) {
- var l = k.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
- h.push(a.markText(k.from, c(k.from.line, k.from.ch + 1), {
- className: l
- })), k.to && a.getLine(k.to.line)
- .length <= g && h.push(a.markText(k.to, c(k.to.line, k.to.ch + 1), {
- className: l
- }))
- }
- }
- if (h.length) {
- b && a.state.focused && a.focus();
- var m = function () {
- a.operation(function () {
- for (var a = 0; a < h.length; a++) h[a].clear()
- })
- };
- if (!d) return m;
- setTimeout(m, 800)
- }
- }
-
- function i(a) {
- a.operation(function () {
- h && (h(), h = null), h = g(a, !1, a.state.matchBrackets)
- })
- }
- var b = /MSIE \d/.test(navigator.userAgent) && (null == document.documentMode || document.documentMode < 8),
- c = a.Pos,
- d = {
- "(": ")>",
- ")": "(<",
- "[": "]>",
- "]": "[<",
- "{": "}>",
- "}": "{<"
- },
- h = null;
- a.defineOption("matchBrackets", !1, function (b, c, d) {
- d && d != a.Init && b.off("cursorActivity", i), c && (b.state.matchBrackets = "object" == typeof c ? c : {}, b.on("cursorActivity", i))
- }), a.defineExtension("matchBrackets", function () {
- g(this, !0)
- }), a.defineExtension("findMatchingBracket", function (a, b, c) {
- return e(this, a, b, c)
- }), a.defineExtension("scanForBracket", function (a, b, c, d) {
- return f(this, a, b, c, d)
- })
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("../fold/xml-fold")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../fold/xml-fold"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function b(a) {
- a.state.tagHit && a.state.tagHit.clear(), a.state.tagOther && a.state.tagOther.clear(), a.state.tagHit = a.state.tagOther = null
- }
-
- function c(c) {
- c.state.failedTagMatch = !1, c.operation(function () {
- if (b(c), !c.somethingSelected()) {
- var d = c.getCursor(),
- e = c.getViewport();
- e.from = Math.min(e.from, d.line), e.to = Math.max(d.line + 1, e.to);
- var f = a.findMatchingTag(c, d, e);
- if (f) {
- if (c.state.matchBothTags) {
- var g = "open" == f.at ? f.open : f.close;
- g && (c.state.tagHit = c.markText(g.from, g.to, {
- className: "CodeMirror-matchingtag"
- }))
- }
- var h = "close" == f.at ? f.open : f.close;
- h ? c.state.tagOther = c.markText(h.from, h.to, {
- className: "CodeMirror-matchingtag"
- }) : c.state.failedTagMatch = !0
- }
- }
- })
- }
-
- function d(a) {
- a.state.failedTagMatch && c(a)
- }
- a.defineOption("matchTags", !1, function (e, f, g) {
- g && g != a.Init && (e.off("cursorActivity", c), e.off("viewportChange", d), b(e)), f && (e.state.matchBothTags = "object" == typeof f && f.bothTags, e.on("cursorActivity", c), e.on("viewportChange", d), c(e))
- }), a.commands.toMatchingTag = function (b) {
- var c = a.findMatchingTag(b, b.getCursor());
- if (c) {
- var d = "close" == c.at ? c.open : c.close;
- d && b.extendSelection(d.to, d.from)
- }
- }
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function b(a, b) {
- return "string" == typeof a ? a = new RegExp(a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), b ? "gi" : "g") : a.global || (a = new RegExp(a.source, a.ignoreCase ? "gi" : "g")), {
- token: function (b) {
- a.lastIndex = b.pos;
- var c = a.exec(b.string);
- return c && c.index == b.pos ? (b.pos += c[0].length, "searching") : void(c ? b.pos = c.index : b.skipToEnd())
- }
- }
- }
-
- function c() {
- this.posFrom = this.posTo = this.lastQuery = this.query = null, this.overlay = null
- }
-
- function d(a) {
- return a.state.search || (a.state.search = new c)
- }
-
- function e(a) {
- return "string" == typeof a && a == a.toLowerCase()
- }
-
- function f(a, b, c) {
- return a.getSearchCursor(b, c, e(b))
- }
-
- function g(a, b, c, d) {
- a.openDialog(b, d, {
- value: c,
- selectValueOnOpen: !0,
- closeOnEnter: !1,
- onClose: function () {
- p(a)
- }
- })
- }
-
- function h(a, b, c, d, e) {
- a.openDialog ? a.openDialog(b, e, {
- value: d,
- selectValueOnOpen: !0
- }) : e(prompt(c, d))
- }
-
- function i(a, b, c, d) {
- a.openConfirm ? a.openConfirm(b, d) : confirm(c) && d[0]()
- }
-
- function j(a) {
- return a.replace(/\\(.)/g, function (a, b) {
- return "n" == b ? "\n" : "r" == b ? "\r" : b
- })
- }
-
- function k(a) {
- var b = a.match(/^\/(.*)\/([a-z]*)$/);
- if (b) try {
- a = new RegExp(b[1], -1 == b[2].indexOf("i") ? "" : "i")
- } catch (c) {} else a = j(a);
- return ("string" == typeof a ? "" == a : a.test("")) && (a = /x^/), a
- }
-
- function m(a, c, d) {
- c.queryText = d, c.query = k(d), a.removeOverlay(c.overlay, e(c.query)), c.overlay = b(c.query, e(c.query)), a.addOverlay(c.overlay), a.showMatchesOnScrollbar && (c.annotate && (c.annotate.clear(), c.annotate = null), c.annotate = a.showMatchesOnScrollbar(c.query, e(c.query)))
- }
-
- function n(b, c, e) {
- var f = d(b);
- if (f.query) return o(b, c);
- var i = b.getSelection() || f.lastQuery;
- e && b.openDialog ? g(b, l, i, function (c, d) {
- a.e_stop(d), c && (c != f.queryText && m(b, f, c), o(b, d.shiftKey))
- }) : h(b, l, "Search for:", i, function (a) {
- a && !f.query && b.operation(function () {
- m(b, f, a), f.posFrom = f.posTo = b.getCursor(), o(b, c)
- })
- })
- }
-
- function o(b, c) {
- b.operation(function () {
- var e = d(b),
- g = f(b, e.query, c ? e.posFrom : e.posTo);
- (g.find(c) || (g = f(b, e.query, c ? a.Pos(b.lastLine()) : a.Pos(b.firstLine(), 0)), g.find(c))) && (b.setSelection(g.from(), g.to()), b.scrollIntoView({
- from: g.from(),
- to: g.to()
- }, 20), e.posFrom = g.from(), e.posTo = g.to())
- })
- }
-
- function p(a) {
- a.operation(function () {
- var b = d(a);
- b.lastQuery = b.query, b.query && (b.query = b.queryText = null, a.removeOverlay(b.overlay), b.annotate && (b.annotate.clear(), b.annotate = null))
- })
- }
-
- function t(a, b) {
- if (!a.getOption("readOnly")) {
- var c = a.getSelection() || d(a)
- .lastQuery;
- h(a, q, "Replace:", c, function (c) {
- c && (c = k(c), h(a, r, "Replace with:", "", function (d) {
- if (d = j(d), b) a.operation(function () {
- for (var b = f(a, c); b.findNext();)
- if ("string" != typeof c) {
- var e = a.getRange(b.from(), b.to())
- .match(c);
- b.replace(d.replace(/\$(\d)/g, function (a, b) {
- return e[b]
- }))
- } else b.replace(d)
- });
- else {
- p(a);
- var e = f(a, c, a.getCursor()),
- g = function () {
- var d, b = e.from();
- !(d = e.findNext()) && (e = f(a, c), !(d = e.findNext()) || b && e.from()
- .line == b.line && e.from()
- .ch == b.ch) || (a.setSelection(e.from(), e.to()), a.scrollIntoView({
- from: e.from(),
- to: e.to()
- }), i(a, s, "Replace?", [function () {
- h(d)
- }, g]))
- },
- h = function (a) {
- e.replace("string" == typeof c ? d : d.replace(/\$(\d)/g, function (b, c) {
- return a[c]
- })), g()
- };
- g()
- }
- }))
- })
- }
- }
- var l = 'Search: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>',
- q = 'Replace: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>',
- r = 'With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>',
- s = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
- a.commands.find = function (a) {
- p(a), n(a)
- }, a.commands.findPersistent = function (a) {
- p(a), n(a, !1, !0)
- }, a.commands.findNext = n, a.commands.findPrev = function (a) {
- n(a, !0)
- }, a.commands.clearSearch = p, a.commands.replace = t, a.commands.replaceAll = function (a) {
- t(a, !0)
- }
-}),
-function (a) {
- "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
- "use strict";
-
- function c(a, b) {
- return a.line - b.line || a.ch - b.ch
- }
-
- function g(a, b, c, d) {
- this.line = b, this.ch = c, this.cm = a, this.text = a.getLine(b), this.min = d ? d.from : a.firstLine(), this.max = d ? d.to - 1 : a.lastLine()
- }
-
- function h(a, c) {
- var d = a.cm.getTokenTypeAt(b(a.line, c));
- return d && /\btag\b/.test(d)
- }
-
- function i(a) {
- return a.line >= a.max ? void 0 : (a.ch = 0, a.text = a.cm.getLine(++a.line), !0)
- }
-
- function j(a) {
- return a.line <= a.min ? void 0 : (a.text = a.cm.getLine(--a.line), a.ch = a.text.length, !0)
- }
-
- function k(a) {
- for (;;) {
- var b = a.text.indexOf(">", a.ch);
- if (-1 == b) {
- if (i(a)) continue;
- return
- } {
- if (h(a, b + 1)) {
- var c = a.text.lastIndexOf("/", b),
- d = c > -1 && !/\S/.test(a.text.slice(c + 1, b));
- return a.ch = b + 1, d ? "selfClose" : "regular"
- }
- a.ch = b + 1
- }
- }
- }
-
- function l(a) {
- for (;;) {
- var b = a.ch ? a.text.lastIndexOf("<", a.ch - 1) : -1;
- if (-1 == b) {
- if (j(a)) continue;
- return
- }
- if (h(a, b + 1)) {
- f.lastIndex = b, a.ch = b;
- var c = f.exec(a.text);
- if (c && c.index == b) return c
- } else a.ch = b
- }
- }
-
- function m(a) {
- for (;;) {
- f.lastIndex = a.ch;
- var b = f.exec(a.text);
- if (!b) {
- if (i(a)) continue;
- return
- } {
- if (h(a, b.index + 1)) return a.ch = b.index + b[0].length, b;
- a.ch = b.index + 1
- }
- }
- }
-
- function n(a) {
- for (;;) {
- var b = a.ch ? a.text.lastIndexOf(">", a.ch - 1) : -1;
- if (-1 == b) {
- if (j(a)) continue;
- return
- } {
- if (h(a, b + 1)) {
- var c = a.text.lastIndexOf("/", b),
- d = c > -1 && !/\S/.test(a.text.slice(c + 1, b));
- return a.ch = b + 1, d ? "selfClose" : "regular"
- }
- a.ch = b
- }
- }
- }
-
- function o(a, c) {
- for (var d = [];;) {
- var f, e = m(a),
- g = a.line,
- h = a.ch - (e ? e[0].length : 0);
- if (!e || !(f = k(a))) return;
- if ("selfClose" != f)
- if (e[1]) {
- for (var i = d.length - 1; i >= 0; --i)
- if (d[i] == e[2]) {
- d.length = i;
- break
- }
- if (0 > i && (!c || c == e[2])) return {
- tag: e[2],
- from: b(g, h),
- to: b(a.line, a.ch)
- }
- } else d.push(e[2])
- }
- }
-
- function p(a, c) {
- for (var d = [];;) {
- var e = n(a);
- if (!e) return;
- if ("selfClose" != e) {
- var f = a.line,
- g = a.ch,
- h = l(a);
- if (!h) return;
- if (h[1]) d.push(h[2]);
- else {
- for (var i = d.length - 1; i >= 0; --i)
- if (d[i] == h[2]) {
- d.length = i;
- break
- }
- if (0 > i && (!c || c == h[2])) return {
- tag: h[2],
- from: b(a.line, a.ch),
- to: b(f, g)
- }
- }
- } else l(a)
- }
- }
- var b = a.Pos,
- d = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",
- e = d + "-:.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040",
- f = new RegExp("<(/?)([" + d + "][" + e + "]*)", "g");
- a.registerHelper("fold", "xml", function (a, c) {
- for (var d = new g(a, c.line, 0);;) {
- var f, e = m(d);
- if (!e || d.line != c.line || !(f = k(d))) return;
- if (!e[1] && "selfClose" != f) {
- var c = b(d.line, d.ch),
- h = o(d, e[2]);
- return h && {
- from: c,
- to: h.from
- }
- }
- }
- }), a.findMatchingTag = function (a, d, e) {
- var f = new g(a, d.line, d.ch, e);
- if (-1 != f.text.indexOf(">") || -1 != f.text.indexOf("<")) {
- var h = k(f),
- i = h && b(f.line, f.ch),
- j = h && l(f);
- if (h && j && !(c(f, d) > 0)) {
- var m = {
- from: b(f.line, f.ch),
- to: i,
- tag: j[2]
- };
- return "selfClose" == h ? {
- open: m,
- close: null,
- at: "open"
- } : j[1] ? {
- open: p(f, j[2]),
- close: m,
- at: "close"
- } : (f = new g(a, i.line, i.ch, e), {
- open: m,
- close: o(f, j[2]),
- at: "open"
- })
- }
- }
- }, a.findEnclosingTag = function (a, b, c) {
- for (var d = new g(a, b.line, b.ch, c);;) {
- var e = p(d);
- if (!e) break;
- var f = new g(a, b.line, b.ch, c),
- h = o(f, e.tag);
- if (h) return {
- open: e,
- close: h
- }
- }
- }, a.scanForClosingTag = function (a, b, c, d) {
- var e = new g(a, b.line, b.ch, d ? {
- from: 0,
- to: d
- } : null);
- return o(e, c)
- }
-});
diff --git a/htdocs/Libs/Codemirror/codemirror.js b/htdocs/Libs/Codemirror/codemirror.js
new file mode 100644
index 0000000..0436a99
--- /dev/null
+++ b/htdocs/Libs/Codemirror/codemirror.js
@@ -0,0 +1,9797 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+// This is CodeMirror (https://codemirror.net), a code editor
+// implemented in JavaScript on top of the browser's DOM.
+//
+// You can find some technical background for some of the code below
+// at http://marijnhaverbeke.nl/blog/#cm-internals .
+
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global.CodeMirror = factory());
+}(this, (function () { 'use strict';
+
+ // Kludges for bugs and behavior differences that can't be feature
+ // detected are enabled based on userAgent etc sniffing.
+ var userAgent = navigator.userAgent;
+ var platform = navigator.platform;
+
+ var gecko = /gecko\/\d/i.test(userAgent);
+ var ie_upto10 = /MSIE \d/.test(userAgent);
+ var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
+ var edge = /Edge\/(\d+)/.exec(userAgent);
+ var ie = ie_upto10 || ie_11up || edge;
+ var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);
+ var webkit = !edge && /WebKit\//.test(userAgent);
+ var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
+ var chrome = !edge && /Chrome\//.test(userAgent);
+ var presto = /Opera\//.test(userAgent);
+ var safari = /Apple Computer/.test(navigator.vendor);
+ var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
+ var phantom = /PhantomJS/.test(userAgent);
+
+ var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
+ var android = /Android/.test(userAgent);
+ // This is woefully incomplete. Suggestions for alternative methods welcome.
+ var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
+ var mac = ios || /Mac/.test(platform);
+ var chromeOS = /\bCrOS\b/.test(userAgent);
+ var windows = /win/i.test(platform);
+
+ var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
+ if (presto_version) { presto_version = Number(presto_version[1]); }
+ if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
+ // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
+ var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
+ var captureRightClick = gecko || (ie && ie_version >= 9);
+
+ function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }
+
+ var rmClass = function(node, cls) {
+ var current = node.className;
+ var match = classTest(cls).exec(current);
+ if (match) {
+ var after = current.slice(match.index + match[0].length);
+ node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
+ }
+ };
+
+ function removeChildren(e) {
+ for (var count = e.childNodes.length; count > 0; --count)
+ { e.removeChild(e.firstChild); }
+ return e
+ }
+
+ function removeChildrenAndAdd(parent, e) {
+ return removeChildren(parent).appendChild(e)
+ }
+
+ function elt(tag, content, className, style) {
+ var e = document.createElement(tag);
+ if (className) { e.className = className; }
+ if (style) { e.style.cssText = style; }
+ if (typeof content == "string") { e.appendChild(document.createTextNode(content)); }
+ else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }
+ return e
+ }
+ // wrapper for elt, which removes the elt from the accessibility tree
+ function eltP(tag, content, className, style) {
+ var e = elt(tag, content, className, style);
+ e.setAttribute("role", "presentation");
+ return e
+ }
+
+ var range;
+ if (document.createRange) { range = function(node, start, end, endNode) {
+ var r = document.createRange();
+ r.setEnd(endNode || node, end);
+ r.setStart(node, start);
+ return r
+ }; }
+ else { range = function(node, start, end) {
+ var r = document.body.createTextRange();
+ try { r.moveToElementText(node.parentNode); }
+ catch(e) { return r }
+ r.collapse(true);
+ r.moveEnd("character", end);
+ r.moveStart("character", start);
+ return r
+ }; }
+
+ function contains(parent, child) {
+ if (child.nodeType == 3) // Android browser always returns false when child is a textnode
+ { child = child.parentNode; }
+ if (parent.contains)
+ { return parent.contains(child) }
+ do {
+ if (child.nodeType == 11) { child = child.host; }
+ if (child == parent) { return true }
+ } while (child = child.parentNode)
+ }
+
+ function activeElt() {
+ // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement.
+ // IE < 10 will throw when accessed while the page is loading or in an iframe.
+ // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.
+ var activeElement;
+ try {
+ activeElement = document.activeElement;
+ } catch(e) {
+ activeElement = document.body || null;
+ }
+ while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)
+ { activeElement = activeElement.shadowRoot.activeElement; }
+ return activeElement
+ }
+
+ function addClass(node, cls) {
+ var current = node.className;
+ if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; }
+ }
+ function joinClasses(a, b) {
+ var as = a.split(" ");
+ for (var i = 0; i < as.length; i++)
+ { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } }
+ return b
+ }
+
+ var selectInput = function(node) { node.select(); };
+ if (ios) // Mobile Safari apparently has a bug where select() is broken.
+ { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }
+ else if (ie) // Suppress mysterious IE10 errors
+ { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }
+
+ function bind(f) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ return function(){return f.apply(null, args)}
+ }
+
+ function copyObj(obj, target, overwrite) {
+ if (!target) { target = {}; }
+ for (var prop in obj)
+ { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
+ { target[prop] = obj[prop]; } }
+ return target
+ }
+
+ // Counts the column offset in a string, taking tabs into account.
+ // Used mostly to find indentation.
+ function countColumn(string, end, tabSize, startIndex, startValue) {
+ if (end == null) {
+ end = string.search(/[^\s\u00a0]/);
+ if (end == -1) { end = string.length; }
+ }
+ for (var i = startIndex || 0, n = startValue || 0;;) {
+ var nextTab = string.indexOf("\t", i);
+ if (nextTab < 0 || nextTab >= end)
+ { return n + (end - i) }
+ n += nextTab - i;
+ n += tabSize - (n % tabSize);
+ i = nextTab + 1;
+ }
+ }
+
+ var Delayed = function() {
+ this.id = null;
+ this.f = null;
+ this.time = 0;
+ this.handler = bind(this.onTimeout, this);
+ };
+ Delayed.prototype.onTimeout = function (self) {
+ self.id = 0;
+ if (self.time <= +new Date) {
+ self.f();
+ } else {
+ setTimeout(self.handler, self.time - +new Date);
+ }
+ };
+ Delayed.prototype.set = function (ms, f) {
+ this.f = f;
+ var time = +new Date + ms;
+ if (!this.id || time < this.time) {
+ clearTimeout(this.id);
+ this.id = setTimeout(this.handler, ms);
+ this.time = time;
+ }
+ };
+
+ function indexOf(array, elt) {
+ for (var i = 0; i < array.length; ++i)
+ { if (array[i] == elt) { return i } }
+ return -1
+ }
+
+ // Number of pixels added to scroller and sizer to hide scrollbar
+ var scrollerGap = 50;
+
+ // Returned or thrown by various protocols to signal 'I'm not
+ // handling this'.
+ var Pass = {toString: function(){return "CodeMirror.Pass"}};
+
+ // Reused option objects for setSelection & friends
+ var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};
+
+ // The inverse of countColumn -- find the offset that corresponds to
+ // a particular column.
+ function findColumn(string, goal, tabSize) {
+ for (var pos = 0, col = 0;;) {
+ var nextTab = string.indexOf("\t", pos);
+ if (nextTab == -1) { nextTab = string.length; }
+ var skipped = nextTab - pos;
+ if (nextTab == string.length || col + skipped >= goal)
+ { return pos + Math.min(skipped, goal - col) }
+ col += nextTab - pos;
+ col += tabSize - (col % tabSize);
+ pos = nextTab + 1;
+ if (col >= goal) { return pos }
+ }
+ }
+
+ var spaceStrs = [""];
+ function spaceStr(n) {
+ while (spaceStrs.length <= n)
+ { spaceStrs.push(lst(spaceStrs) + " "); }
+ return spaceStrs[n]
+ }
+
+ function lst(arr) { return arr[arr.length-1] }
+
+ function map(array, f) {
+ var out = [];
+ for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }
+ return out
+ }
+
+ function insertSorted(array, value, score) {
+ var pos = 0, priority = score(value);
+ while (pos < array.length && score(array[pos]) <= priority) { pos++; }
+ array.splice(pos, 0, value);
+ }
+
+ function nothing() {}
+
+ function createObj(base, props) {
+ var inst;
+ if (Object.create) {
+ inst = Object.create(base);
+ } else {
+ nothing.prototype = base;
+ inst = new nothing();
+ }
+ if (props) { copyObj(props, inst); }
+ return inst
+ }
+
+ var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
+ function isWordCharBasic(ch) {
+ return /\w/.test(ch) || ch > "\x80" &&
+ (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))
+ }
+ function isWordChar(ch, helper) {
+ if (!helper) { return isWordCharBasic(ch) }
+ if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true }
+ return helper.test(ch)
+ }
+
+ function isEmpty(obj) {
+ for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }
+ return true
+ }
+
+ // Extending unicode characters. A series of a non-extending char +
+ // any number of extending chars is treated as a single unit as far
+ // as editing and measuring is concerned. This is not fully correct,
+ // since some scripts/fonts/browsers also treat other configurations
+ // of code points as a group.
+ var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
+ function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }
+
+ // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.
+ function skipExtendingChars(str, pos, dir) {
+ while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }
+ return pos
+ }
+
+ // Returns the value from the range [`from`; `to`] that satisfies
+ // `pred` and is closest to `from`. Assumes that at least `to`
+ // satisfies `pred`. Supports `from` being greater than `to`.
+ function findFirst(pred, from, to) {
+ // At any point we are certain `to` satisfies `pred`, don't know
+ // whether `from` does.
+ var dir = from > to ? -1 : 1;
+ for (;;) {
+ if (from == to) { return from }
+ var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);
+ if (mid == from) { return pred(mid) ? from : to }
+ if (pred(mid)) { to = mid; }
+ else { from = mid + dir; }
+ }
+ }
+
+ // BIDI HELPERS
+
+ function iterateBidiSections(order, from, to, f) {
+ if (!order) { return f(from, to, "ltr", 0) }
+ var found = false;
+ for (var i = 0; i < order.length; ++i) {
+ var part = order[i];
+ if (part.from < to && part.to > from || from == to && part.to == from) {
+ f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i);
+ found = true;
+ }
+ }
+ if (!found) { f(from, to, "ltr"); }
+ }
+
+ var bidiOther = null;
+ function getBidiPartAt(order, ch, sticky) {
+ var found;
+ bidiOther = null;
+ for (var i = 0; i < order.length; ++i) {
+ var cur = order[i];
+ if (cur.from < ch && cur.to > ch) { return i }
+ if (cur.to == ch) {
+ if (cur.from != cur.to && sticky == "before") { found = i; }
+ else { bidiOther = i; }
+ }
+ if (cur.from == ch) {
+ if (cur.from != cur.to && sticky != "before") { found = i; }
+ else { bidiOther = i; }
+ }
+ }
+ return found != null ? found : bidiOther
+ }
+
+ // Bidirectional ordering algorithm
+ // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
+ // that this (partially) implements.
+
+ // One-char codes used for character types:
+ // L (L): Left-to-Right
+ // R (R): Right-to-Left
+ // r (AL): Right-to-Left Arabic
+ // 1 (EN): European Number
+ // + (ES): European Number Separator
+ // % (ET): European Number Terminator
+ // n (AN): Arabic Number
+ // , (CS): Common Number Separator
+ // m (NSM): Non-Spacing Mark
+ // b (BN): Boundary Neutral
+ // s (B): Paragraph Separator
+ // t (S): Segment Separator
+ // w (WS): Whitespace
+ // N (ON): Other Neutrals
+
+ // Returns null if characters are ordered as they appear
+ // (left-to-right), or an array of sections ({from, to, level}
+ // objects) in the order in which they occur visually.
+ var bidiOrdering = (function() {
+ // Character types for codepoints 0 to 0xff
+ var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
+ // Character types for codepoints 0x600 to 0x6f9
+ var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";
+ function charType(code) {
+ if (code <= 0xf7) { return lowTypes.charAt(code) }
+ else if (0x590 <= code && code <= 0x5f4) { return "R" }
+ else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }
+ else if (0x6ee <= code && code <= 0x8ac) { return "r" }
+ else if (0x2000 <= code && code <= 0x200b) { return "w" }
+ else if (code == 0x200c) { return "b" }
+ else { return "L" }
+ }
+
+ var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
+ var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
+
+ function BidiSpan(level, from, to) {
+ this.level = level;
+ this.from = from; this.to = to;
+ }
+
+ return function(str, direction) {
+ var outerType = direction == "ltr" ? "L" : "R";
+
+ if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false }
+ var len = str.length, types = [];
+ for (var i = 0; i < len; ++i)
+ { types.push(charType(str.charCodeAt(i))); }
+
+ // W1. Examine each non-spacing mark (NSM) in the level run, and
+ // change the type of the NSM to the type of the previous
+ // character. If the NSM is at the start of the level run, it will
+ // get the type of sor.
+ for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {
+ var type = types[i$1];
+ if (type == "m") { types[i$1] = prev; }
+ else { prev = type; }
+ }
+
+ // W2. Search backwards from each instance of a European number
+ // until the first strong type (R, L, AL, or sor) is found. If an
+ // AL is found, change the type of the European number to Arabic
+ // number.
+ // W3. Change all ALs to R.
+ for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {
+ var type$1 = types[i$2];
+ if (type$1 == "1" && cur == "r") { types[i$2] = "n"; }
+ else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } }
+ }
+
+ // W4. A single European separator between two European numbers
+ // changes to a European number. A single common separator between
+ // two numbers of the same type changes to that type.
+ for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {
+ var type$2 = types[i$3];
+ if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; }
+ else if (type$2 == "," && prev$1 == types[i$3+1] &&
+ (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; }
+ prev$1 = type$2;
+ }
+
+ // W5. A sequence of European terminators adjacent to European
+ // numbers changes to all European numbers.
+ // W6. Otherwise, separators and terminators change to Other
+ // Neutral.
+ for (var i$4 = 0; i$4 < len; ++i$4) {
+ var type$3 = types[i$4];
+ if (type$3 == ",") { types[i$4] = "N"; }
+ else if (type$3 == "%") {
+ var end = (void 0);
+ for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {}
+ var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
+ for (var j = i$4; j < end; ++j) { types[j] = replace; }
+ i$4 = end - 1;
+ }
+ }
+
+ // W7. Search backwards from each instance of a European number
+ // until the first strong type (R, L, or sor) is found. If an L is
+ // found, then change the type of the European number to L.
+ for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {
+ var type$4 = types[i$5];
+ if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; }
+ else if (isStrong.test(type$4)) { cur$1 = type$4; }
+ }
+
+ // N1. A sequence of neutrals takes the direction of the
+ // surrounding strong text if the text on both sides has the same
+ // direction. European and Arabic numbers act as if they were R in
+ // terms of their influence on neutrals. Start-of-level-run (sor)
+ // and end-of-level-run (eor) are used at level run boundaries.
+ // N2. Any remaining neutrals take the embedding direction.
+ for (var i$6 = 0; i$6 < len; ++i$6) {
+ if (isNeutral.test(types[i$6])) {
+ var end$1 = (void 0);
+ for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}
+ var before = (i$6 ? types[i$6-1] : outerType) == "L";
+ var after = (end$1 < len ? types[end$1] : outerType) == "L";
+ var replace$1 = before == after ? (before ? "L" : "R") : outerType;
+ for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }
+ i$6 = end$1 - 1;
+ }
+ }
+
+ // Here we depart from the documented algorithm, in order to avoid
+ // building up an actual levels array. Since there are only three
+ // levels (0, 1, 2) in an implementation that doesn't take
+ // explicit embedding into account, we can build up the order on
+ // the fly, without following the level-based algorithm.
+ var order = [], m;
+ for (var i$7 = 0; i$7 < len;) {
+ if (countsAsLeft.test(types[i$7])) {
+ var start = i$7;
+ for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}
+ order.push(new BidiSpan(0, start, i$7));
+ } else {
+ var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0;
+ for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {}
+ for (var j$2 = pos; j$2 < i$7;) {
+ if (countsAsNum.test(types[j$2])) {
+ if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }
+ var nstart = j$2;
+ for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}
+ order.splice(at, 0, new BidiSpan(2, nstart, j$2));
+ at += isRTL;
+ pos = j$2;
+ } else { ++j$2; }
+ }
+ if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }
+ }
+ }
+ if (direction == "ltr") {
+ if (order[0].level == 1 && (m = str.match(/^\s+/))) {
+ order[0].from = m[0].length;
+ order.unshift(new BidiSpan(0, 0, m[0].length));
+ }
+ if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
+ lst(order).to -= m[0].length;
+ order.push(new BidiSpan(0, len - m[0].length, len));
+ }
+ }
+
+ return direction == "rtl" ? order.reverse() : order
+ }
+ })();
+
+ // Get the bidi ordering for the given line (and cache it). Returns
+ // false for lines that are fully left-to-right, and an array of
+ // BidiSpan objects otherwise.
+ function getOrder(line, direction) {
+ var order = line.order;
+ if (order == null) { order = line.order = bidiOrdering(line.text, direction); }
+ return order
+ }
+
+ // EVENT HANDLING
+
+ // Lightweight event framework. on/off also work on DOM nodes,
+ // registering native DOM handlers.
+
+ var noHandlers = [];
+
+ var on = function(emitter, type, f) {
+ if (emitter.addEventListener) {
+ emitter.addEventListener(type, f, false);
+ } else if (emitter.attachEvent) {
+ emitter.attachEvent("on" + type, f);
+ } else {
+ var map = emitter._handlers || (emitter._handlers = {});
+ map[type] = (map[type] || noHandlers).concat(f);
+ }
+ };
+
+ function getHandlers(emitter, type) {
+ return emitter._handlers && emitter._handlers[type] || noHandlers
+ }
+
+ function off(emitter, type, f) {
+ if (emitter.removeEventListener) {
+ emitter.removeEventListener(type, f, false);
+ } else if (emitter.detachEvent) {
+ emitter.detachEvent("on" + type, f);
+ } else {
+ var map = emitter._handlers, arr = map && map[type];
+ if (arr) {
+ var index = indexOf(arr, f);
+ if (index > -1)
+ { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }
+ }
+ }
+ }
+
+ function signal(emitter, type /*, values...*/) {
+ var handlers = getHandlers(emitter, type);
+ if (!handlers.length) { return }
+ var args = Array.prototype.slice.call(arguments, 2);
+ for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }
+ }
+
+ // The DOM events that CodeMirror handles can be overridden by
+ // registering a (non-DOM) handler on the editor for the event name,
+ // and preventDefault-ing the event in that handler.
+ function signalDOMEvent(cm, e, override) {
+ if (typeof e == "string")
+ { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }
+ signal(cm, override || e.type, cm, e);
+ return e_defaultPrevented(e) || e.codemirrorIgnore
+ }
+
+ function signalCursorActivity(cm) {
+ var arr = cm._handlers && cm._handlers.cursorActivity;
+ if (!arr) { return }
+ var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+ for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)
+ { set.push(arr[i]); } }
+ }
+
+ function hasHandler(emitter, type) {
+ return getHandlers(emitter, type).length > 0
+ }
+
+ // Add on and off methods to a constructor's prototype, to make
+ // registering events on such objects more convenient.
+ function eventMixin(ctor) {
+ ctor.prototype.on = function(type, f) {on(this, type, f);};
+ ctor.prototype.off = function(type, f) {off(this, type, f);};
+ }
+
+ // Due to the fact that we still support jurassic IE versions, some
+ // compatibility wrappers are needed.
+
+ function e_preventDefault(e) {
+ if (e.preventDefault) { e.preventDefault(); }
+ else { e.returnValue = false; }
+ }
+ function e_stopPropagation(e) {
+ if (e.stopPropagation) { e.stopPropagation(); }
+ else { e.cancelBubble = true; }
+ }
+ function e_defaultPrevented(e) {
+ return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false
+ }
+ function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
+
+ function e_target(e) {return e.target || e.srcElement}
+ function e_button(e) {
+ var b = e.which;
+ if (b == null) {
+ if (e.button & 1) { b = 1; }
+ else if (e.button & 2) { b = 3; }
+ else if (e.button & 4) { b = 2; }
+ }
+ if (mac && e.ctrlKey && b == 1) { b = 3; }
+ return b
+ }
+
+ // Detect drag-and-drop
+ var dragAndDrop = function() {
+ // There is *some* kind of drag-and-drop support in IE6-8, but I
+ // couldn't get it to work yet.
+ if (ie && ie_version < 9) { return false }
+ var div = elt('div');
+ return "draggable" in div || "dragDrop" in div
+ }();
+
+ var zwspSupported;
+ function zeroWidthElement(measure) {
+ if (zwspSupported == null) {
+ var test = elt("span", "\u200b");
+ removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
+ if (measure.firstChild.offsetHeight != 0)
+ { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }
+ }
+ var node = zwspSupported ? elt("span", "\u200b") :
+ elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
+ node.setAttribute("cm-text", "");
+ return node
+ }
+
+ // Feature-detect IE's crummy client rect reporting for bidi text
+ var badBidiRects;
+ function hasBadBidiRects(measure) {
+ if (badBidiRects != null) { return badBidiRects }
+ var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
+ var r0 = range(txt, 0, 1).getBoundingClientRect();
+ var r1 = range(txt, 1, 2).getBoundingClientRect();
+ removeChildren(measure);
+ if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)
+ return badBidiRects = (r1.right - r0.right < 3)
+ }
+
+ // See if "".split is the broken IE version, if so, provide an
+ // alternative way to split lines.
+ var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) {
+ var pos = 0, result = [], l = string.length;
+ while (pos <= l) {
+ var nl = string.indexOf("\n", pos);
+ if (nl == -1) { nl = string.length; }
+ var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
+ var rt = line.indexOf("\r");
+ if (rt != -1) {
+ result.push(line.slice(0, rt));
+ pos += rt + 1;
+ } else {
+ result.push(line);
+ pos = nl + 1;
+ }
+ }
+ return result
+ } : function (string) { return string.split(/\r\n?|\n/); };
+
+ var hasSelection = window.getSelection ? function (te) {
+ try { return te.selectionStart != te.selectionEnd }
+ catch(e) { return false }
+ } : function (te) {
+ var range;
+ try {range = te.ownerDocument.selection.createRange();}
+ catch(e) {}
+ if (!range || range.parentElement() != te) { return false }
+ return range.compareEndPoints("StartToEnd", range) != 0
+ };
+
+ var hasCopyEvent = (function () {
+ var e = elt("div");
+ if ("oncopy" in e) { return true }
+ e.setAttribute("oncopy", "return;");
+ return typeof e.oncopy == "function"
+ })();
+
+ var badZoomedRects = null;
+ function hasBadZoomedRects(measure) {
+ if (badZoomedRects != null) { return badZoomedRects }
+ var node = removeChildrenAndAdd(measure, elt("span", "x"));
+ var normal = node.getBoundingClientRect();
+ var fromRange = range(node, 0, 1).getBoundingClientRect();
+ return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1
+ }
+
+ // Known modes, by name and by MIME
+ var modes = {}, mimeModes = {};
+
+ // Extra arguments are stored as the mode's dependencies, which is
+ // used by (legacy) mechanisms like loadmode.js to automatically
+ // load a mode. (Preferred mechanism is the require/define calls.)
+ function defineMode(name, mode) {
+ if (arguments.length > 2)
+ { mode.dependencies = Array.prototype.slice.call(arguments, 2); }
+ modes[name] = mode;
+ }
+
+ function defineMIME(mime, spec) {
+ mimeModes[mime] = spec;
+ }
+
+ // Given a MIME type, a {name, ...options} config object, or a name
+ // string, return a mode config object.
+ function resolveMode(spec) {
+ if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
+ spec = mimeModes[spec];
+ } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
+ var found = mimeModes[spec.name];
+ if (typeof found == "string") { found = {name: found}; }
+ spec = createObj(found, spec);
+ spec.name = found.name;
+ } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
+ return resolveMode("application/xml")
+ } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) {
+ return resolveMode("application/json")
+ }
+ if (typeof spec == "string") { return {name: spec} }
+ else { return spec || {name: "null"} }
+ }
+
+ // Given a mode spec (anything that resolveMode accepts), find and
+ // initialize an actual mode object.
+ function getMode(options, spec) {
+ spec = resolveMode(spec);
+ var mfactory = modes[spec.name];
+ if (!mfactory) { return getMode(options, "text/plain") }
+ var modeObj = mfactory(options, spec);
+ if (modeExtensions.hasOwnProperty(spec.name)) {
+ var exts = modeExtensions[spec.name];
+ for (var prop in exts) {
+ if (!exts.hasOwnProperty(prop)) { continue }
+ if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; }
+ modeObj[prop] = exts[prop];
+ }
+ }
+ modeObj.name = spec.name;
+ if (spec.helperType) { modeObj.helperType = spec.helperType; }
+ if (spec.modeProps) { for (var prop$1 in spec.modeProps)
+ { modeObj[prop$1] = spec.modeProps[prop$1]; } }
+
+ return modeObj
+ }
+
+ // This can be used to attach properties to mode objects from
+ // outside the actual mode definition.
+ var modeExtensions = {};
+ function extendMode(mode, properties) {
+ var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
+ copyObj(properties, exts);
+ }
+
+ function copyState(mode, state) {
+ if (state === true) { return state }
+ if (mode.copyState) { return mode.copyState(state) }
+ var nstate = {};
+ for (var n in state) {
+ var val = state[n];
+ if (val instanceof Array) { val = val.concat([]); }
+ nstate[n] = val;
+ }
+ return nstate
+ }
+
+ // Given a mode and a state (for that mode), find the inner mode and
+ // state at the position that the state refers to.
+ function innerMode(mode, state) {
+ var info;
+ while (mode.innerMode) {
+ info = mode.innerMode(state);
+ if (!info || info.mode == mode) { break }
+ state = info.state;
+ mode = info.mode;
+ }
+ return info || {mode: mode, state: state}
+ }
+
+ function startState(mode, a1, a2) {
+ return mode.startState ? mode.startState(a1, a2) : true
+ }
+
+ // STRING STREAM
+
+ // Fed to the mode parsers, provides helper functions to make
+ // parsers more succinct.
+
+ var StringStream = function(string, tabSize, lineOracle) {
+ this.pos = this.start = 0;
+ this.string = string;
+ this.tabSize = tabSize || 8;
+ this.lastColumnPos = this.lastColumnValue = 0;
+ this.lineStart = 0;
+ this.lineOracle = lineOracle;
+ };
+
+ StringStream.prototype.eol = function () {return this.pos >= this.string.length};
+ StringStream.prototype.sol = function () {return this.pos == this.lineStart};
+ StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};
+ StringStream.prototype.next = function () {
+ if (this.pos < this.string.length)
+ { return this.string.charAt(this.pos++) }
+ };
+ StringStream.prototype.eat = function (match) {
+ var ch = this.string.charAt(this.pos);
+ var ok;
+ if (typeof match == "string") { ok = ch == match; }
+ else { ok = ch && (match.test ? match.test(ch) : match(ch)); }
+ if (ok) {++this.pos; return ch}
+ };
+ StringStream.prototype.eatWhile = function (match) {
+ var start = this.pos;
+ while (this.eat(match)){}
+ return this.pos > start
+ };
+ StringStream.prototype.eatSpace = function () {
+ var start = this.pos;
+ while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }
+ return this.pos > start
+ };
+ StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};
+ StringStream.prototype.skipTo = function (ch) {
+ var found = this.string.indexOf(ch, this.pos);
+ if (found > -1) {this.pos = found; return true}
+ };
+ StringStream.prototype.backUp = function (n) {this.pos -= n;};
+ StringStream.prototype.column = function () {
+ if (this.lastColumnPos < this.start) {
+ this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
+ this.lastColumnPos = this.start;
+ }
+ return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+ };
+ StringStream.prototype.indentation = function () {
+ return countColumn(this.string, null, this.tabSize) -
+ (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+ };
+ StringStream.prototype.match = function (pattern, consume, caseInsensitive) {
+ if (typeof pattern == "string") {
+ var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };
+ var substr = this.string.substr(this.pos, pattern.length);
+ if (cased(substr) == cased(pattern)) {
+ if (consume !== false) { this.pos += pattern.length; }
+ return true
+ }
+ } else {
+ var match = this.string.slice(this.pos).match(pattern);
+ if (match && match.index > 0) { return null }
+ if (match && consume !== false) { this.pos += match[0].length; }
+ return match
+ }
+ };
+ StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};
+ StringStream.prototype.hideFirstChars = function (n, inner) {
+ this.lineStart += n;
+ try { return inner() }
+ finally { this.lineStart -= n; }
+ };
+ StringStream.prototype.lookAhead = function (n) {
+ var oracle = this.lineOracle;
+ return oracle && oracle.lookAhead(n)
+ };
+ StringStream.prototype.baseToken = function () {
+ var oracle = this.lineOracle;
+ return oracle && oracle.baseToken(this.pos)
+ };
+
+ // Find the line object corresponding to the given line number.
+ function getLine(doc, n) {
+ n -= doc.first;
+ if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") }
+ var chunk = doc;
+ while (!chunk.lines) {
+ for (var i = 0;; ++i) {
+ var child = chunk.children[i], sz = child.chunkSize();
+ if (n < sz) { chunk = child; break }
+ n -= sz;
+ }
+ }
+ return chunk.lines[n]
+ }
+
+ // Get the part of a document between two positions, as an array of
+ // strings.
+ function getBetween(doc, start, end) {
+ var out = [], n = start.line;
+ doc.iter(start.line, end.line + 1, function (line) {
+ var text = line.text;
+ if (n == end.line) { text = text.slice(0, end.ch); }
+ if (n == start.line) { text = text.slice(start.ch); }
+ out.push(text);
+ ++n;
+ });
+ return out
+ }
+ // Get the lines between from and to, as array of strings.
+ function getLines(doc, from, to) {
+ var out = [];
+ doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value
+ return out
+ }
+
+ // Update the height of a line, propagating the height change
+ // upwards to parent nodes.
+ function updateLineHeight(line, height) {
+ var diff = height - line.height;
+ if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }
+ }
+
+ // Given a line object, find its line number by walking up through
+ // its parent links.
+ function lineNo(line) {
+ if (line.parent == null) { return null }
+ var cur = line.parent, no = indexOf(cur.lines, line);
+ for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
+ for (var i = 0;; ++i) {
+ if (chunk.children[i] == cur) { break }
+ no += chunk.children[i].chunkSize();
+ }
+ }
+ return no + cur.first
+ }
+
+ // Find the line at the given vertical position, using the height
+ // information in the document tree.
+ function lineAtHeight(chunk, h) {
+ var n = chunk.first;
+ outer: do {
+ for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {
+ var child = chunk.children[i$1], ch = child.height;
+ if (h < ch) { chunk = child; continue outer }
+ h -= ch;
+ n += child.chunkSize();
+ }
+ return n
+ } while (!chunk.lines)
+ var i = 0;
+ for (; i < chunk.lines.length; ++i) {
+ var line = chunk.lines[i], lh = line.height;
+ if (h < lh) { break }
+ h -= lh;
+ }
+ return n + i
+ }
+
+ function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
+
+ function lineNumberFor(options, i) {
+ return String(options.lineNumberFormatter(i + options.firstLineNumber))
+ }
+
+ // A Pos instance represents a position within the text.
+ function Pos(line, ch, sticky) {
+ if ( sticky === void 0 ) sticky = null;
+
+ if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }
+ this.line = line;
+ this.ch = ch;
+ this.sticky = sticky;
+ }
+
+ // Compare two positions, return 0 if they are the same, a negative
+ // number when a is less, and a positive number otherwise.
+ function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
+
+ function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }
+
+ function copyPos(x) {return Pos(x.line, x.ch)}
+ function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
+ function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
+
+ // Most of the external API clips given positions to make sure they
+ // actually exist within the document.
+ function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}
+ function clipPos(doc, pos) {
+ if (pos.line < doc.first) { return Pos(doc.first, 0) }
+ var last = doc.first + doc.size - 1;
+ if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }
+ return clipToLen(pos, getLine(doc, pos.line).text.length)
+ }
+ function clipToLen(pos, linelen) {
+ var ch = pos.ch;
+ if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }
+ else if (ch < 0) { return Pos(pos.line, 0) }
+ else { return pos }
+ }
+ function clipPosArray(doc, array) {
+ var out = [];
+ for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }
+ return out
+ }
+
+ var SavedContext = function(state, lookAhead) {
+ this.state = state;
+ this.lookAhead = lookAhead;
+ };
+
+ var Context = function(doc, state, line, lookAhead) {
+ this.state = state;
+ this.doc = doc;
+ this.line = line;
+ this.maxLookAhead = lookAhead || 0;
+ this.baseTokens = null;
+ this.baseTokenPos = 1;
+ };
+
+ Context.prototype.lookAhead = function (n) {
+ var line = this.doc.getLine(this.line + n);
+ if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }
+ return line
+ };
+
+ Context.prototype.baseToken = function (n) {
+ if (!this.baseTokens) { return null }
+ while (this.baseTokens[this.baseTokenPos] <= n)
+ { this.baseTokenPos += 2; }
+ var type = this.baseTokens[this.baseTokenPos + 1];
+ return {type: type && type.replace(/( |^)overlay .*/, ""),
+ size: this.baseTokens[this.baseTokenPos] - n}
+ };
+
+ Context.prototype.nextLine = function () {
+ this.line++;
+ if (this.maxLookAhead > 0) { this.maxLookAhead--; }
+ };
+
+ Context.fromSaved = function (doc, saved, line) {
+ if (saved instanceof SavedContext)
+ { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }
+ else
+ { return new Context(doc, copyState(doc.mode, saved), line) }
+ };
+
+ Context.prototype.save = function (copy) {
+ var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;
+ return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state
+ };
+
+
+ // Compute a style array (an array starting with a mode generation
+ // -- for invalidation -- followed by pairs of end positions and
+ // style strings), which is used to highlight the tokens on the
+ // line.
+ function highlightLine(cm, line, context, forceToEnd) {
+ // A styles array always starts with a number identifying the
+ // mode/overlays that it is based on (for easy invalidation).
+ var st = [cm.state.modeGen], lineClasses = {};
+ // Compute the base array of styles
+ runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },
+ lineClasses, forceToEnd);
+ var state = context.state;
+
+ // Run overlays, adjust style array.
+ var loop = function ( o ) {
+ context.baseTokens = st;
+ var overlay = cm.state.overlays[o], i = 1, at = 0;
+ context.state = true;
+ runMode(cm, line.text, overlay.mode, context, function (end, style) {
+ var start = i;
+ // Ensure there's a token end at the current position, and that i points at it
+ while (at < end) {
+ var i_end = st[i];
+ if (i_end > end)
+ { st.splice(i, 1, end, st[i+1], i_end); }
+ i += 2;
+ at = Math.min(end, i_end);
+ }
+ if (!style) { return }
+ if (overlay.opaque) {
+ st.splice(start, i - start, end, "overlay " + style);
+ i = start + 2;
+ } else {
+ for (; start < i; start += 2) {
+ var cur = st[start+1];
+ st[start+1] = (cur ? cur + " " : "") + "overlay " + style;
+ }
+ }
+ }, lineClasses);
+ context.state = state;
+ context.baseTokens = null;
+ context.baseTokenPos = 1;
+ };
+
+ for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );
+
+ return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}
+ }
+
+ function getLineStyles(cm, line, updateFrontier) {
+ if (!line.styles || line.styles[0] != cm.state.modeGen) {
+ var context = getContextBefore(cm, lineNo(line));
+ var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);
+ var result = highlightLine(cm, line, context);
+ if (resetState) { context.state = resetState; }
+ line.stateAfter = context.save(!resetState);
+ line.styles = result.styles;
+ if (result.classes) { line.styleClasses = result.classes; }
+ else if (line.styleClasses) { line.styleClasses = null; }
+ if (updateFrontier === cm.doc.highlightFrontier)
+ { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }
+ }
+ return line.styles
+ }
+
+ function getContextBefore(cm, n, precise) {
+ var doc = cm.doc, display = cm.display;
+ if (!doc.mode.startState) { return new Context(doc, true, n) }
+ var start = findStartLine(cm, n, precise);
+ var saved = start > doc.first && getLine(doc, start - 1).stateAfter;
+ var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);
+
+ doc.iter(start, n, function (line) {
+ processLine(cm, line.text, context);
+ var pos = context.line;
+ line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;
+ context.nextLine();
+ });
+ if (precise) { doc.modeFrontier = context.line; }
+ return context
+ }
+
+ // Lightweight form of highlight -- proceed over this line and
+ // update state, but don't save a style array. Used for lines that
+ // aren't currently visible.
+ function processLine(cm, text, context, startAt) {
+ var mode = cm.doc.mode;
+ var stream = new StringStream(text, cm.options.tabSize, context);
+ stream.start = stream.pos = startAt || 0;
+ if (text == "") { callBlankLine(mode, context.state); }
+ while (!stream.eol()) {
+ readToken(mode, stream, context.state);
+ stream.start = stream.pos;
+ }
+ }
+
+ function callBlankLine(mode, state) {
+ if (mode.blankLine) { return mode.blankLine(state) }
+ if (!mode.innerMode) { return }
+ var inner = innerMode(mode, state);
+ if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }
+ }
+
+ function readToken(mode, stream, state, inner) {
+ for (var i = 0; i < 10; i++) {
+ if (inner) { inner[0] = innerMode(mode, state).mode; }
+ var style = mode.token(stream, state);
+ if (stream.pos > stream.start) { return style }
+ }
+ throw new Error("Mode " + mode.name + " failed to advance stream.")
+ }
+
+ var Token = function(stream, type, state) {
+ this.start = stream.start; this.end = stream.pos;
+ this.string = stream.current();
+ this.type = type || null;
+ this.state = state;
+ };
+
+ // Utility for getTokenAt and getLineTokens
+ function takeToken(cm, pos, precise, asArray) {
+ var doc = cm.doc, mode = doc.mode, style;
+ pos = clipPos(doc, pos);
+ var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);
+ var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;
+ if (asArray) { tokens = []; }
+ while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
+ stream.start = stream.pos;
+ style = readToken(mode, stream, context.state);
+ if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }
+ }
+ return asArray ? tokens : new Token(stream, style, context.state)
+ }
+
+ function extractLineClasses(type, output) {
+ if (type) { for (;;) {
+ var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
+ if (!lineClass) { break }
+ type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
+ var prop = lineClass[1] ? "bgClass" : "textClass";
+ if (output[prop] == null)
+ { output[prop] = lineClass[2]; }
+ else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop]))
+ { output[prop] += " " + lineClass[2]; }
+ } }
+ return type
+ }
+
+ // Run the given mode's parser over a line, calling f for each token.
+ function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
+ var flattenSpans = mode.flattenSpans;
+ if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }
+ var curStart = 0, curStyle = null;
+ var stream = new StringStream(text, cm.options.tabSize, context), style;
+ var inner = cm.options.addModeClass && [null];
+ if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }
+ while (!stream.eol()) {
+ if (stream.pos > cm.options.maxHighlightLength) {
+ flattenSpans = false;
+ if (forceToEnd) { processLine(cm, text, context, stream.pos); }
+ stream.pos = text.length;
+ style = null;
+ } else {
+ style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);
+ }
+ if (inner) {
+ var mName = inner[0].name;
+ if (mName) { style = "m-" + (style ? mName + " " + style : mName); }
+ }
+ if (!flattenSpans || curStyle != style) {
+ while (curStart < stream.start) {
+ curStart = Math.min(stream.start, curStart + 5000);
+ f(curStart, curStyle);
+ }
+ curStyle = style;
+ }
+ stream.start = stream.pos;
+ }
+ while (curStart < stream.pos) {
+ // Webkit seems to refuse to render text nodes longer than 57444
+ // characters, and returns inaccurate measurements in nodes
+ // starting around 5000 chars.
+ var pos = Math.min(stream.pos, curStart + 5000);
+ f(pos, curStyle);
+ curStart = pos;
+ }
+ }
+
+ // Finds the line to start with when starting a parse. Tries to
+ // find a line with a stateAfter, so that it can start with a
+ // valid state. If that fails, it returns the line with the
+ // smallest indentation, which tends to need the least context to
+ // parse correctly.
+ function findStartLine(cm, n, precise) {
+ var minindent, minline, doc = cm.doc;
+ var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
+ for (var search = n; search > lim; --search) {
+ if (search <= doc.first) { return doc.first }
+ var line = getLine(doc, search - 1), after = line.stateAfter;
+ if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))
+ { return search }
+ var indented = countColumn(line.text, null, cm.options.tabSize);
+ if (minline == null || minindent > indented) {
+ minline = search - 1;
+ minindent = indented;
+ }
+ }
+ return minline
+ }
+
+ function retreatFrontier(doc, n) {
+ doc.modeFrontier = Math.min(doc.modeFrontier, n);
+ if (doc.highlightFrontier < n - 10) { return }
+ var start = doc.first;
+ for (var line = n - 1; line > start; line--) {
+ var saved = getLine(doc, line).stateAfter;
+ // change is on 3
+ // state on line 1 looked ahead 2 -- so saw 3
+ // test 1 + 2 < 3 should cover this
+ if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {
+ start = line + 1;
+ break
+ }
+ }
+ doc.highlightFrontier = Math.min(doc.highlightFrontier, start);
+ }
+
+ // Optimize some code when these features are not used.
+ var sawReadOnlySpans = false, sawCollapsedSpans = false;
+
+ function seeReadOnlySpans() {
+ sawReadOnlySpans = true;
+ }
+
+ function seeCollapsedSpans() {
+ sawCollapsedSpans = true;
+ }
+
+ // TEXTMARKER SPANS
+
+ function MarkedSpan(marker, from, to) {
+ this.marker = marker;
+ this.from = from; this.to = to;
+ }
+
+ // Search an array of spans for a span matching the given marker.
+ function getMarkedSpanFor(spans, marker) {
+ if (spans) { for (var i = 0; i < spans.length; ++i) {
+ var span = spans[i];
+ if (span.marker == marker) { return span }
+ } }
+ }
+ // Remove a span from an array, returning undefined if no spans are
+ // left (we don't store arrays for lines without spans).
+ function removeMarkedSpan(spans, span) {
+ var r;
+ for (var i = 0; i < spans.length; ++i)
+ { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }
+ return r
+ }
+ // Add a span to a line.
+ function addMarkedSpan(line, span) {
+ line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
+ span.marker.attachLine(line);
+ }
+
+ // Used for the algorithm that adjusts markers for a change in the
+ // document. These functions cut an array of spans at a given
+ // character position, returning an array of remaining chunks (or
+ // undefined if nothing remains).
+ function markedSpansBefore(old, startCh, isInsert) {
+ var nw;
+ if (old) { for (var i = 0; i < old.length; ++i) {
+ var span = old[i], marker = span.marker;
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
+ if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)
+ ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
+ }
+ } }
+ return nw
+ }
+ function markedSpansAfter(old, endCh, isInsert) {
+ var nw;
+ if (old) { for (var i = 0; i < old.length; ++i) {
+ var span = old[i], marker = span.marker;
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
+ if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)
+ ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
+ span.to == null ? null : span.to - endCh));
+ }
+ } }
+ return nw
+ }
+
+ // Given a change object, compute the new set of marker spans that
+ // cover the line in which the change took place. Removes spans
+ // entirely within the change, reconnects spans belonging to the
+ // same marker that appear on both sides of the change, and cuts off
+ // spans partially within the change. Returns an array of span
+ // arrays with one element for each line in (after) the change.
+ function stretchSpansOverChange(doc, change) {
+ if (change.full) { return null }
+ var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
+ var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
+ if (!oldFirst && !oldLast) { return null }
+
+ var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
+ // Get the spans that 'stick out' on both sides
+ var first = markedSpansBefore(oldFirst, startCh, isInsert);
+ var last = markedSpansAfter(oldLast, endCh, isInsert);
+
+ // Next, merge those two ends
+ var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
+ if (first) {
+ // Fix up .to properties of first
+ for (var i = 0; i < first.length; ++i) {
+ var span = first[i];
+ if (span.to == null) {
+ var found = getMarkedSpanFor(last, span.marker);
+ if (!found) { span.to = startCh; }
+ else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }
+ }
+ }
+ }
+ if (last) {
+ // Fix up .from in last (or move them into first in case of sameLine)
+ for (var i$1 = 0; i$1 < last.length; ++i$1) {
+ var span$1 = last[i$1];
+ if (span$1.to != null) { span$1.to += offset; }
+ if (span$1.from == null) {
+ var found$1 = getMarkedSpanFor(first, span$1.marker);
+ if (!found$1) {
+ span$1.from = offset;
+ if (sameLine) { (first || (first = [])).push(span$1); }
+ }
+ } else {
+ span$1.from += offset;
+ if (sameLine) { (first || (first = [])).push(span$1); }
+ }
+ }
+ }
+ // Make sure we didn't create any zero-length spans
+ if (first) { first = clearEmptySpans(first); }
+ if (last && last != first) { last = clearEmptySpans(last); }
+
+ var newMarkers = [first];
+ if (!sameLine) {
+ // Fill gap with whole-line-spans
+ var gap = change.text.length - 2, gapMarkers;
+ if (gap > 0 && first)
+ { for (var i$2 = 0; i$2 < first.length; ++i$2)
+ { if (first[i$2].to == null)
+ { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }
+ for (var i$3 = 0; i$3 < gap; ++i$3)
+ { newMarkers.push(gapMarkers); }
+ newMarkers.push(last);
+ }
+ return newMarkers
+ }
+
+ // Remove spans that are empty and don't have a clearWhenEmpty
+ // option of false.
+ function clearEmptySpans(spans) {
+ for (var i = 0; i < spans.length; ++i) {
+ var span = spans[i];
+ if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
+ { spans.splice(i--, 1); }
+ }
+ if (!spans.length) { return null }
+ return spans
+ }
+
+ // Used to 'clip' out readOnly ranges when making a change.
+ function removeReadOnlyRanges(doc, from, to) {
+ var markers = null;
+ doc.iter(from.line, to.line + 1, function (line) {
+ if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
+ var mark = line.markedSpans[i].marker;
+ if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
+ { (markers || (markers = [])).push(mark); }
+ } }
+ });
+ if (!markers) { return null }
+ var parts = [{from: from, to: to}];
+ for (var i = 0; i < markers.length; ++i) {
+ var mk = markers[i], m = mk.find(0);
+ for (var j = 0; j < parts.length; ++j) {
+ var p = parts[j];
+ if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }
+ var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
+ if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
+ { newParts.push({from: p.from, to: m.from}); }
+ if (dto > 0 || !mk.inclusiveRight && !dto)
+ { newParts.push({from: m.to, to: p.to}); }
+ parts.splice.apply(parts, newParts);
+ j += newParts.length - 3;
+ }
+ }
+ return parts
+ }
+
+ // Connect or disconnect spans from a line.
+ function detachMarkedSpans(line) {
+ var spans = line.markedSpans;
+ if (!spans) { return }
+ for (var i = 0; i < spans.length; ++i)
+ { spans[i].marker.detachLine(line); }
+ line.markedSpans = null;
+ }
+ function attachMarkedSpans(line, spans) {
+ if (!spans) { return }
+ for (var i = 0; i < spans.length; ++i)
+ { spans[i].marker.attachLine(line); }
+ line.markedSpans = spans;
+ }
+
+ // Helpers used when computing which overlapping collapsed span
+ // counts as the larger one.
+ function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
+ function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
+
+ // Returns a number indicating which of two overlapping collapsed
+ // spans is larger (and thus includes the other). Falls back to
+ // comparing ids when the spans cover exactly the same range.
+ function compareCollapsedMarkers(a, b) {
+ var lenDiff = a.lines.length - b.lines.length;
+ if (lenDiff != 0) { return lenDiff }
+ var aPos = a.find(), bPos = b.find();
+ var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
+ if (fromCmp) { return -fromCmp }
+ var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
+ if (toCmp) { return toCmp }
+ return b.id - a.id
+ }
+
+ // Find out whether a line ends or starts in a collapsed span. If
+ // so, return the marker for that span.
+ function collapsedSpanAtSide(line, start) {
+ var sps = sawCollapsedSpans && line.markedSpans, found;
+ if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+ sp = sps[i];
+ if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
+ (!found || compareCollapsedMarkers(found, sp.marker) < 0))
+ { found = sp.marker; }
+ } }
+ return found
+ }
+ function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }
+ function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }
+
+ function collapsedSpanAround(line, ch) {
+ var sps = sawCollapsedSpans && line.markedSpans, found;
+ if (sps) { for (var i = 0; i < sps.length; ++i) {
+ var sp = sps[i];
+ if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&
+ (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }
+ } }
+ return found
+ }
+
+ // Test whether there exists a collapsed span that partially
+ // overlaps (covers the start or end, but not both) of a new span.
+ // Such overlap is not allowed.
+ function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
+ var line = getLine(doc, lineNo);
+ var sps = sawCollapsedSpans && line.markedSpans;
+ if (sps) { for (var i = 0; i < sps.length; ++i) {
+ var sp = sps[i];
+ if (!sp.marker.collapsed) { continue }
+ var found = sp.marker.find(0);
+ var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
+ var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
+ if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }
+ if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
+ fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
+ { return true }
+ } }
+ }
+
+ // A visual line is a line as drawn on the screen. Folding, for
+ // example, can cause multiple logical lines to appear on the same
+ // visual line. This finds the start of the visual line that the
+ // given line is part of (usually that is the line itself).
+ function visualLine(line) {
+ var merged;
+ while (merged = collapsedSpanAtStart(line))
+ { line = merged.find(-1, true).line; }
+ return line
+ }
+
+ function visualLineEnd(line) {
+ var merged;
+ while (merged = collapsedSpanAtEnd(line))
+ { line = merged.find(1, true).line; }
+ return line
+ }
+
+ // Returns an array of logical lines that continue the visual line
+ // started by the argument, or undefined if there are no such lines.
+ function visualLineContinued(line) {
+ var merged, lines;
+ while (merged = collapsedSpanAtEnd(line)) {
+ line = merged.find(1, true).line
+ ;(lines || (lines = [])).push(line);
+ }
+ return lines
+ }
+
+ // Get the line number of the start of the visual line that the
+ // given line number is part of.
+ function visualLineNo(doc, lineN) {
+ var line = getLine(doc, lineN), vis = visualLine(line);
+ if (line == vis) { return lineN }
+ return lineNo(vis)
+ }
+
+ // Get the line number of the start of the next visual line after
+ // the given line.
+ function visualLineEndNo(doc, lineN) {
+ if (lineN > doc.lastLine()) { return lineN }
+ var line = getLine(doc, lineN), merged;
+ if (!lineIsHidden(doc, line)) { return lineN }
+ while (merged = collapsedSpanAtEnd(line))
+ { line = merged.find(1, true).line; }
+ return lineNo(line) + 1
+ }
+
+ // Compute whether a line is hidden. Lines count as hidden when they
+ // are part of a visual line that starts with another line, or when
+ // they are entirely covered by collapsed, non-widget span.
+ function lineIsHidden(doc, line) {
+ var sps = sawCollapsedSpans && line.markedSpans;
+ if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+ sp = sps[i];
+ if (!sp.marker.collapsed) { continue }
+ if (sp.from == null) { return true }
+ if (sp.marker.widgetNode) { continue }
+ if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
+ { return true }
+ } }
+ }
+ function lineIsHiddenInner(doc, line, span) {
+ if (span.to == null) {
+ var end = span.marker.find(1, true);
+ return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))
+ }
+ if (span.marker.inclusiveRight && span.to == line.text.length)
+ { return true }
+ for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {
+ sp = line.markedSpans[i];
+ if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
+ (sp.to == null || sp.to != span.from) &&
+ (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
+ lineIsHiddenInner(doc, line, sp)) { return true }
+ }
+ }
+
+ // Find the height above the given line.
+ function heightAtLine(lineObj) {
+ lineObj = visualLine(lineObj);
+
+ var h = 0, chunk = lineObj.parent;
+ for (var i = 0; i < chunk.lines.length; ++i) {
+ var line = chunk.lines[i];
+ if (line == lineObj) { break }
+ else { h += line.height; }
+ }
+ for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
+ for (var i$1 = 0; i$1 < p.children.length; ++i$1) {
+ var cur = p.children[i$1];
+ if (cur == chunk) { break }
+ else { h += cur.height; }
+ }
+ }
+ return h
+ }
+
+ // Compute the character length of a line, taking into account
+ // collapsed ranges (see markText) that might hide parts, and join
+ // other lines onto it.
+ function lineLength(line) {
+ if (line.height == 0) { return 0 }
+ var len = line.text.length, merged, cur = line;
+ while (merged = collapsedSpanAtStart(cur)) {
+ var found = merged.find(0, true);
+ cur = found.from.line;
+ len += found.from.ch - found.to.ch;
+ }
+ cur = line;
+ while (merged = collapsedSpanAtEnd(cur)) {
+ var found$1 = merged.find(0, true);
+ len -= cur.text.length - found$1.from.ch;
+ cur = found$1.to.line;
+ len += cur.text.length - found$1.to.ch;
+ }
+ return len
+ }
+
+ // Find the longest line in the document.
+ function findMaxLine(cm) {
+ var d = cm.display, doc = cm.doc;
+ d.maxLine = getLine(doc, doc.first);
+ d.maxLineLength = lineLength(d.maxLine);
+ d.maxLineChanged = true;
+ doc.iter(function (line) {
+ var len = lineLength(line);
+ if (len > d.maxLineLength) {
+ d.maxLineLength = len;
+ d.maxLine = line;
+ }
+ });
+ }
+
+ // LINE DATA STRUCTURE
+
+ // Line objects. These hold state related to a line, including
+ // highlighting info (the styles array).
+ var Line = function(text, markedSpans, estimateHeight) {
+ this.text = text;
+ attachMarkedSpans(this, markedSpans);
+ this.height = estimateHeight ? estimateHeight(this) : 1;
+ };
+
+ Line.prototype.lineNo = function () { return lineNo(this) };
+ eventMixin(Line);
+
+ // Change the content (text, markers) of a line. Automatically
+ // invalidates cached information and tries to re-estimate the
+ // line's height.
+ function updateLine(line, text, markedSpans, estimateHeight) {
+ line.text = text;
+ if (line.stateAfter) { line.stateAfter = null; }
+ if (line.styles) { line.styles = null; }
+ if (line.order != null) { line.order = null; }
+ detachMarkedSpans(line);
+ attachMarkedSpans(line, markedSpans);
+ var estHeight = estimateHeight ? estimateHeight(line) : 1;
+ if (estHeight != line.height) { updateLineHeight(line, estHeight); }
+ }
+
+ // Detach a line from the document tree and its markers.
+ function cleanUpLine(line) {
+ line.parent = null;
+ detachMarkedSpans(line);
+ }
+
+ // Convert a style as returned by a mode (either null, or a string
+ // containing one or more styles) to a CSS style. This is cached,
+ // and also looks for line-wide styles.
+ var styleToClassCache = {}, styleToClassCacheWithMode = {};
+ function interpretTokenStyle(style, options) {
+ if (!style || /^\s*$/.test(style)) { return null }
+ var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
+ return cache[style] ||
+ (cache[style] = style.replace(/\S+/g, "cm-$&"))
+ }
+
+ // Render the DOM representation of the text of a line. Also builds
+ // up a 'line map', which points at the DOM nodes that represent
+ // specific stretches of text, and is used by the measuring code.
+ // The returned object contains the DOM node, this map, and
+ // information about line-wide styles that were set by the mode.
+ function buildLineContent(cm, lineView) {
+ // The padding-right forces the element to have a 'border', which
+ // is needed on Webkit to be able to get line-level bounding
+ // rectangles for it (in measureChar).
+ var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null);
+ var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content,
+ col: 0, pos: 0, cm: cm,
+ trailingSpace: false,
+ splitSpaces: cm.getOption("lineWrapping")};
+ lineView.measure = {};
+
+ // Iterate over the logical lines that make up this visual line.
+ for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
+ var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);
+ builder.pos = 0;
+ builder.addToken = buildToken;
+ // Optionally wire in some hacks into the token-rendering
+ // algorithm, to deal with browser quirks.
+ if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))
+ { builder.addToken = buildTokenBadBidi(builder.addToken, order); }
+ builder.map = [];
+ var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
+ insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
+ if (line.styleClasses) {
+ if (line.styleClasses.bgClass)
+ { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); }
+ if (line.styleClasses.textClass)
+ { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); }
+ }
+
+ // Ensure at least a single node is present, for measuring.
+ if (builder.map.length == 0)
+ { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }
+
+ // Store the map and a cache object for the current logical line
+ if (i == 0) {
+ lineView.measure.map = builder.map;
+ lineView.measure.cache = {};
+ } else {
+ (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)
+ ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});
+ }
+ }
+
+ // See issue #2901
+ if (webkit) {
+ var last = builder.content.lastChild;
+ if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
+ { builder.content.className = "cm-tab-wrap-hack"; }
+ }
+
+ signal(cm, "renderLine", cm, lineView.line, builder.pre);
+ if (builder.pre.className)
+ { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); }
+
+ return builder
+ }
+
+ function defaultSpecialCharPlaceholder(ch) {
+ var token = elt("span", "\u2022", "cm-invalidchar");
+ token.title = "\\u" + ch.charCodeAt(0).toString(16);
+ token.setAttribute("aria-label", token.title);
+ return token
+ }
+
+ // Build up the DOM representation for a single token, and add it to
+ // the line map. Takes care to render special characters separately.
+ function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {
+ if (!text) { return }
+ var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;
+ var special = builder.cm.state.specialChars, mustWrap = false;
+ var content;
+ if (!special.test(text)) {
+ builder.col += text.length;
+ content = document.createTextNode(displayText);
+ builder.map.push(builder.pos, builder.pos + text.length, content);
+ if (ie && ie_version < 9) { mustWrap = true; }
+ builder.pos += text.length;
+ } else {
+ content = document.createDocumentFragment();
+ var pos = 0;
+ while (true) {
+ special.lastIndex = pos;
+ var m = special.exec(text);
+ var skipped = m ? m.index - pos : text.length - pos;
+ if (skipped) {
+ var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
+ if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); }
+ else { content.appendChild(txt); }
+ builder.map.push(builder.pos, builder.pos + skipped, txt);
+ builder.col += skipped;
+ builder.pos += skipped;
+ }
+ if (!m) { break }
+ pos += skipped + 1;
+ var txt$1 = (void 0);
+ if (m[0] == "\t") {
+ var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
+ txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
+ txt$1.setAttribute("role", "presentation");
+ txt$1.setAttribute("cm-text", "\t");
+ builder.col += tabWidth;
+ } else if (m[0] == "\r" || m[0] == "\n") {
+ txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
+ txt$1.setAttribute("cm-text", m[0]);
+ builder.col += 1;
+ } else {
+ txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);
+ txt$1.setAttribute("cm-text", m[0]);
+ if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); }
+ else { content.appendChild(txt$1); }
+ builder.col += 1;
+ }
+ builder.map.push(builder.pos, builder.pos + 1, txt$1);
+ builder.pos++;
+ }
+ }
+ builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;
+ if (style || startStyle || endStyle || mustWrap || css || attributes) {
+ var fullStyle = style || "";
+ if (startStyle) { fullStyle += startStyle; }
+ if (endStyle) { fullStyle += endStyle; }
+ var token = elt("span", [content], fullStyle, css);
+ if (attributes) {
+ for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class")
+ { token.setAttribute(attr, attributes[attr]); } }
+ }
+ return builder.content.appendChild(token)
+ }
+ builder.content.appendChild(content);
+ }
+
+ // Change some spaces to NBSP to prevent the browser from collapsing
+ // trailing spaces at the end of a line when rendering text (issue #1362).
+ function splitSpaces(text, trailingBefore) {
+ if (text.length > 1 && !/ /.test(text)) { return text }
+ var spaceBefore = trailingBefore, result = "";
+ for (var i = 0; i < text.length; i++) {
+ var ch = text.charAt(i);
+ if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))
+ { ch = "\u00a0"; }
+ result += ch;
+ spaceBefore = ch == " ";
+ }
+ return result
+ }
+
+ // Work around nonsense dimensions being reported for stretches of
+ // right-to-left text.
+ function buildTokenBadBidi(inner, order) {
+ return function (builder, text, style, startStyle, endStyle, css, attributes) {
+ style = style ? style + " cm-force-border" : "cm-force-border";
+ var start = builder.pos, end = start + text.length;
+ for (;;) {
+ // Find the part that overlaps with the start of this text
+ var part = (void 0);
+ for (var i = 0; i < order.length; i++) {
+ part = order[i];
+ if (part.to > start && part.from <= start) { break }
+ }
+ if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }
+ inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);
+ startStyle = null;
+ text = text.slice(part.to - start);
+ start = part.to;
+ }
+ }
+ }
+
+ function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
+ var widget = !ignoreWidget && marker.widgetNode;
+ if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }
+ if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
+ if (!widget)
+ { widget = builder.content.appendChild(document.createElement("span")); }
+ widget.setAttribute("cm-marker", marker.id);
+ }
+ if (widget) {
+ builder.cm.display.input.setUneditable(widget);
+ builder.content.appendChild(widget);
+ }
+ builder.pos += size;
+ builder.trailingSpace = false;
+ }
+
+ // Outputs a number of spans to make up a line, taking highlighting
+ // and marked text into account.
+ function insertLineContent(line, builder, styles) {
+ var spans = line.markedSpans, allText = line.text, at = 0;
+ if (!spans) {
+ for (var i$1 = 1; i$1 < styles.length; i$1+=2)
+ { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }
+ return
+ }
+
+ var len = allText.length, pos = 0, i = 1, text = "", style, css;
+ var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;
+ for (;;) {
+ if (nextChange == pos) { // Update current marker set
+ spanStyle = spanEndStyle = spanStartStyle = css = "";
+ attributes = null;
+ collapsed = null; nextChange = Infinity;
+ var foundBookmarks = [], endStyles = (void 0);
+ for (var j = 0; j < spans.length; ++j) {
+ var sp = spans[j], m = sp.marker;
+ if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
+ foundBookmarks.push(m);
+ } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
+ if (sp.to != null && sp.to != pos && nextChange > sp.to) {
+ nextChange = sp.to;
+ spanEndStyle = "";
+ }
+ if (m.className) { spanStyle += " " + m.className; }
+ if (m.css) { css = (css ? css + ";" : "") + m.css; }
+ if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; }
+ if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }
+ // support for the old title property
+ // https://github.com/codemirror/CodeMirror/pull/5673
+ if (m.title) { (attributes || (attributes = {})).title = m.title; }
+ if (m.attributes) {
+ for (var attr in m.attributes)
+ { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }
+ }
+ if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
+ { collapsed = sp; }
+ } else if (sp.from > pos && nextChange > sp.from) {
+ nextChange = sp.from;
+ }
+ }
+ if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)
+ { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } }
+
+ if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)
+ { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }
+ if (collapsed && (collapsed.from || 0) == pos) {
+ buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
+ collapsed.marker, collapsed.from == null);
+ if (collapsed.to == null) { return }
+ if (collapsed.to == pos) { collapsed = false; }
+ }
+ }
+ if (pos >= len) { break }
+
+ var upto = Math.min(len, nextChange);
+ while (true) {
+ if (text) {
+ var end = pos + text.length;
+ if (!collapsed) {
+ var tokenText = end > upto ? text.slice(0, upto - pos) : text;
+ builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
+ spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes);
+ }
+ if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}
+ pos = end;
+ spanStartStyle = "";
+ }
+ text = allText.slice(at, at = styles[i++]);
+ style = interpretTokenStyle(styles[i++], builder.cm.options);
+ }
+ }
+ }
+
+
+ // These objects are used to represent the visible (currently drawn)
+ // part of the document. A LineView may correspond to multiple
+ // logical lines, if those are connected by collapsed ranges.
+ function LineView(doc, line, lineN) {
+ // The starting line
+ this.line = line;
+ // Continuing lines, if any
+ this.rest = visualLineContinued(line);
+ // Number of logical lines in this visual line
+ this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
+ this.node = this.text = null;
+ this.hidden = lineIsHidden(doc, line);
+ }
+
+ // Create a range of LineView objects for the given lines.
+ function buildViewArray(cm, from, to) {
+ var array = [], nextPos;
+ for (var pos = from; pos < to; pos = nextPos) {
+ var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
+ nextPos = pos + view.size;
+ array.push(view);
+ }
+ return array
+ }
+
+ var operationGroup = null;
+
+ function pushOperation(op) {
+ if (operationGroup) {
+ operationGroup.ops.push(op);
+ } else {
+ op.ownsGroup = operationGroup = {
+ ops: [op],
+ delayedCallbacks: []
+ };
+ }
+ }
+
+ function fireCallbacksForOps(group) {
+ // Calls delayed callbacks and cursorActivity handlers until no
+ // new ones appear
+ var callbacks = group.delayedCallbacks, i = 0;
+ do {
+ for (; i < callbacks.length; i++)
+ { callbacks[i].call(null); }
+ for (var j = 0; j < group.ops.length; j++) {
+ var op = group.ops[j];
+ if (op.cursorActivityHandlers)
+ { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
+ { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }
+ }
+ } while (i < callbacks.length)
+ }
+
+ function finishOperation(op, endCb) {
+ var group = op.ownsGroup;
+ if (!group) { return }
+
+ try { fireCallbacksForOps(group); }
+ finally {
+ operationGroup = null;
+ endCb(group);
+ }
+ }
+
+ var orphanDelayedCallbacks = null;
+
+ // Often, we want to signal events at a point where we are in the
+ // middle of some work, but don't want the handler to start calling
+ // other methods on the editor, which might be in an inconsistent
+ // state or simply not expect any other events to happen.
+ // signalLater looks whether there are any handlers, and schedules
+ // them to be executed when the last operation ends, or, if no
+ // operation is active, when a timeout fires.
+ function signalLater(emitter, type /*, values...*/) {
+ var arr = getHandlers(emitter, type);
+ if (!arr.length) { return }
+ var args = Array.prototype.slice.call(arguments, 2), list;
+ if (operationGroup) {
+ list = operationGroup.delayedCallbacks;
+ } else if (orphanDelayedCallbacks) {
+ list = orphanDelayedCallbacks;
+ } else {
+ list = orphanDelayedCallbacks = [];
+ setTimeout(fireOrphanDelayed, 0);
+ }
+ var loop = function ( i ) {
+ list.push(function () { return arr[i].apply(null, args); });
+ };
+
+ for (var i = 0; i < arr.length; ++i)
+ loop( i );
+ }
+
+ function fireOrphanDelayed() {
+ var delayed = orphanDelayedCallbacks;
+ orphanDelayedCallbacks = null;
+ for (var i = 0; i < delayed.length; ++i) { delayed[i](); }
+ }
+
+ // When an aspect of a line changes, a string is added to
+ // lineView.changes. This updates the relevant part of the line's
+ // DOM structure.
+ function updateLineForChanges(cm, lineView, lineN, dims) {
+ for (var j = 0; j < lineView.changes.length; j++) {
+ var type = lineView.changes[j];
+ if (type == "text") { updateLineText(cm, lineView); }
+ else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); }
+ else if (type == "class") { updateLineClasses(cm, lineView); }
+ else if (type == "widget") { updateLineWidgets(cm, lineView, dims); }
+ }
+ lineView.changes = null;
+ }
+
+ // Lines with gutter elements, widgets or a background class need to
+ // be wrapped, and have the extra elements added to the wrapper div
+ function ensureLineWrapped(lineView) {
+ if (lineView.node == lineView.text) {
+ lineView.node = elt("div", null, null, "position: relative");
+ if (lineView.text.parentNode)
+ { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }
+ lineView.node.appendChild(lineView.text);
+ if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }
+ }
+ return lineView.node
+ }
+
+ function updateLineBackground(cm, lineView) {
+ var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
+ if (cls) { cls += " CodeMirror-linebackground"; }
+ if (lineView.background) {
+ if (cls) { lineView.background.className = cls; }
+ else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
+ } else if (cls) {
+ var wrap = ensureLineWrapped(lineView);
+ lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
+ cm.display.input.setUneditable(lineView.background);
+ }
+ }
+
+ // Wrapper around buildLineContent which will reuse the structure
+ // in display.externalMeasured when possible.
+ function getLineContent(cm, lineView) {
+ var ext = cm.display.externalMeasured;
+ if (ext && ext.line == lineView.line) {
+ cm.display.externalMeasured = null;
+ lineView.measure = ext.measure;
+ return ext.built
+ }
+ return buildLineContent(cm, lineView)
+ }
+
+ // Redraw the line's text. Interacts with the background and text
+ // classes because the mode may output tokens that influence these
+ // classes.
+ function updateLineText(cm, lineView) {
+ var cls = lineView.text.className;
+ var built = getLineContent(cm, lineView);
+ if (lineView.text == lineView.node) { lineView.node = built.pre; }
+ lineView.text.parentNode.replaceChild(built.pre, lineView.text);
+ lineView.text = built.pre;
+ if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
+ lineView.bgClass = built.bgClass;
+ lineView.textClass = built.textClass;
+ updateLineClasses(cm, lineView);
+ } else if (cls) {
+ lineView.text.className = cls;
+ }
+ }
+
+ function updateLineClasses(cm, lineView) {
+ updateLineBackground(cm, lineView);
+ if (lineView.line.wrapClass)
+ { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }
+ else if (lineView.node != lineView.text)
+ { lineView.node.className = ""; }
+ var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
+ lineView.text.className = textClass || "";
+ }
+
+ function updateLineGutter(cm, lineView, lineN, dims) {
+ if (lineView.gutter) {
+ lineView.node.removeChild(lineView.gutter);
+ lineView.gutter = null;
+ }
+ if (lineView.gutterBackground) {
+ lineView.node.removeChild(lineView.gutterBackground);
+ lineView.gutterBackground = null;
+ }
+ if (lineView.line.gutterClass) {
+ var wrap = ensureLineWrapped(lineView);
+ lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
+ ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px"));
+ cm.display.input.setUneditable(lineView.gutterBackground);
+ wrap.insertBefore(lineView.gutterBackground, lineView.text);
+ }
+ var markers = lineView.line.gutterMarkers;
+ if (cm.options.lineNumbers || markers) {
+ var wrap$1 = ensureLineWrapped(lineView);
+ var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"));
+ cm.display.input.setUneditable(gutterWrap);
+ wrap$1.insertBefore(gutterWrap, lineView.text);
+ if (lineView.line.gutterClass)
+ { gutterWrap.className += " " + lineView.line.gutterClass; }
+ if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
+ { lineView.lineNumber = gutterWrap.appendChild(
+ elt("div", lineNumberFor(cm.options, lineN),
+ "CodeMirror-linenumber CodeMirror-gutter-elt",
+ ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); }
+ if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {
+ var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];
+ if (found)
+ { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt",
+ ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); }
+ } }
+ }
+ }
+
+ function updateLineWidgets(cm, lineView, dims) {
+ if (lineView.alignable) { lineView.alignable = null; }
+ var isWidget = classTest("CodeMirror-linewidget");
+ for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {
+ next = node.nextSibling;
+ if (isWidget.test(node.className)) { lineView.node.removeChild(node); }
+ }
+ insertLineWidgets(cm, lineView, dims);
+ }
+
+ // Build a line's DOM representation from scratch
+ function buildLineElement(cm, lineView, lineN, dims) {
+ var built = getLineContent(cm, lineView);
+ lineView.text = lineView.node = built.pre;
+ if (built.bgClass) { lineView.bgClass = built.bgClass; }
+ if (built.textClass) { lineView.textClass = built.textClass; }
+
+ updateLineClasses(cm, lineView);
+ updateLineGutter(cm, lineView, lineN, dims);
+ insertLineWidgets(cm, lineView, dims);
+ return lineView.node
+ }
+
+ // A lineView may contain multiple logical lines (when merged by
+ // collapsed spans). The widgets for all of them need to be drawn.
+ function insertLineWidgets(cm, lineView, dims) {
+ insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
+ if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+ { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }
+ }
+
+ function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
+ if (!line.widgets) { return }
+ var wrap = ensureLineWrapped(lineView);
+ for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
+ var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : ""));
+ if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); }
+ positionLineWidget(widget, node, lineView, dims);
+ cm.display.input.setUneditable(node);
+ if (allowAbove && widget.above)
+ { wrap.insertBefore(node, lineView.gutter || lineView.text); }
+ else
+ { wrap.appendChild(node); }
+ signalLater(widget, "redraw");
+ }
+ }
+
+ function positionLineWidget(widget, node, lineView, dims) {
+ if (widget.noHScroll) {
+ (lineView.alignable || (lineView.alignable = [])).push(node);
+ var width = dims.wrapperWidth;
+ node.style.left = dims.fixedPos + "px";
+ if (!widget.coverGutter) {
+ width -= dims.gutterTotalWidth;
+ node.style.paddingLeft = dims.gutterTotalWidth + "px";
+ }
+ node.style.width = width + "px";
+ }
+ if (widget.coverGutter) {
+ node.style.zIndex = 5;
+ node.style.position = "relative";
+ if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; }
+ }
+ }
+
+ function widgetHeight(widget) {
+ if (widget.height != null) { return widget.height }
+ var cm = widget.doc.cm;
+ if (!cm) { return 0 }
+ if (!contains(document.body, widget.node)) {
+ var parentStyle = "position: relative;";
+ if (widget.coverGutter)
+ { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; }
+ if (widget.noHScroll)
+ { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; }
+ removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
+ }
+ return widget.height = widget.node.parentNode.offsetHeight
+ }
+
+ // Return true when the given mouse event happened in a widget
+ function eventInWidget(display, e) {
+ for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
+ if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
+ (n.parentNode == display.sizer && n != display.mover))
+ { return true }
+ }
+ }
+
+ // POSITION MEASUREMENT
+
+ function paddingTop(display) {return display.lineSpace.offsetTop}
+ function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}
+ function paddingH(display) {
+ if (display.cachedPaddingH) { return display.cachedPaddingH }
+ var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like"));
+ var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
+ var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
+ if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }
+ return data
+ }
+
+ function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
+ function displayWidth(cm) {
+ return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth
+ }
+ function displayHeight(cm) {
+ return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight
+ }
+
+ // Ensure the lineView.wrapping.heights array is populated. This is
+ // an array of bottom offsets for the lines that make up a drawn
+ // line. When lineWrapping is on, there might be more than one
+ // height.
+ function ensureLineHeights(cm, lineView, rect) {
+ var wrapping = cm.options.lineWrapping;
+ var curWidth = wrapping && displayWidth(cm);
+ if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
+ var heights = lineView.measure.heights = [];
+ if (wrapping) {
+ lineView.measure.width = curWidth;
+ var rects = lineView.text.firstChild.getClientRects();
+ for (var i = 0; i < rects.length - 1; i++) {
+ var cur = rects[i], next = rects[i + 1];
+ if (Math.abs(cur.bottom - next.bottom) > 2)
+ { heights.push((cur.bottom + next.top) / 2 - rect.top); }
+ }
+ }
+ heights.push(rect.bottom - rect.top);
+ }
+ }
+
+ // Find a line map (mapping character offsets to text nodes) and a
+ // measurement cache for the given line number. (A line view might
+ // contain multiple lines when collapsed ranges are present.)
+ function mapFromLineView(lineView, line, lineN) {
+ if (lineView.line == line)
+ { return {map: lineView.measure.map, cache: lineView.measure.cache} }
+ for (var i = 0; i < lineView.rest.length; i++)
+ { if (lineView.rest[i] == line)
+ { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }
+ for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)
+ { if (lineNo(lineView.rest[i$1]) > lineN)
+ { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }
+ }
+
+ // Render a line into the hidden node display.externalMeasured. Used
+ // when measurement is needed for a line that's not in the viewport.
+ function updateExternalMeasurement(cm, line) {
+ line = visualLine(line);
+ var lineN = lineNo(line);
+ var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
+ view.lineN = lineN;
+ var built = view.built = buildLineContent(cm, view);
+ view.text = built.pre;
+ removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
+ return view
+ }
+
+ // Get a {top, bottom, left, right} box (in line-local coordinates)
+ // for a given character.
+ function measureChar(cm, line, ch, bias) {
+ return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)
+ }
+
+ // Find a line view that corresponds to the given line number.
+ function findViewForLine(cm, lineN) {
+ if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
+ { return cm.display.view[findViewIndex(cm, lineN)] }
+ var ext = cm.display.externalMeasured;
+ if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
+ { return ext }
+ }
+
+ // Measurement can be split in two steps, the set-up work that
+ // applies to the whole line, and the measurement of the actual
+ // character. Functions like coordsChar, that need to do a lot of
+ // measurements in a row, can thus ensure that the set-up work is
+ // only done once.
+ function prepareMeasureForLine(cm, line) {
+ var lineN = lineNo(line);
+ var view = findViewForLine(cm, lineN);
+ if (view && !view.text) {
+ view = null;
+ } else if (view && view.changes) {
+ updateLineForChanges(cm, view, lineN, getDimensions(cm));
+ cm.curOp.forceUpdate = true;
+ }
+ if (!view)
+ { view = updateExternalMeasurement(cm, line); }
+
+ var info = mapFromLineView(view, line, lineN);
+ return {
+ line: line, view: view, rect: null,
+ map: info.map, cache: info.cache, before: info.before,
+ hasHeights: false
+ }
+ }
+
+ // Given a prepared measurement object, measures the position of an
+ // actual character (or fetches it from the cache).
+ function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
+ if (prepared.before) { ch = -1; }
+ var key = ch + (bias || ""), found;
+ if (prepared.cache.hasOwnProperty(key)) {
+ found = prepared.cache[key];
+ } else {
+ if (!prepared.rect)
+ { prepared.rect = prepared.view.text.getBoundingClientRect(); }
+ if (!prepared.hasHeights) {
+ ensureLineHeights(cm, prepared.view, prepared.rect);
+ prepared.hasHeights = true;
+ }
+ found = measureCharInner(cm, prepared, ch, bias);
+ if (!found.bogus) { prepared.cache[key] = found; }
+ }
+ return {left: found.left, right: found.right,
+ top: varHeight ? found.rtop : found.top,
+ bottom: varHeight ? found.rbottom : found.bottom}
+ }
+
+ var nullRect = {left: 0, right: 0, top: 0, bottom: 0};
+
+ function nodeAndOffsetInLineMap(map, ch, bias) {
+ var node, start, end, collapse, mStart, mEnd;
+ // First, search the line map for the text node corresponding to,
+ // or closest to, the target character.
+ for (var i = 0; i < map.length; i += 3) {
+ mStart = map[i];
+ mEnd = map[i + 1];
+ if (ch < mStart) {
+ start = 0; end = 1;
+ collapse = "left";
+ } else if (ch < mEnd) {
+ start = ch - mStart;
+ end = start + 1;
+ } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
+ end = mEnd - mStart;
+ start = end - 1;
+ if (ch >= mEnd) { collapse = "right"; }
+ }
+ if (start != null) {
+ node = map[i + 2];
+ if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
+ { collapse = bias; }
+ if (bias == "left" && start == 0)
+ { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
+ node = map[(i -= 3) + 2];
+ collapse = "left";
+ } }
+ if (bias == "right" && start == mEnd - mStart)
+ { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
+ node = map[(i += 3) + 2];
+ collapse = "right";
+ } }
+ break
+ }
+ }
+ return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}
+ }
+
+ function getUsefulRect(rects, bias) {
+ var rect = nullRect;
+ if (bias == "left") { for (var i = 0; i < rects.length; i++) {
+ if ((rect = rects[i]).left != rect.right) { break }
+ } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {
+ if ((rect = rects[i$1]).left != rect.right) { break }
+ } }
+ return rect
+ }
+
+ function measureCharInner(cm, prepared, ch, bias) {
+ var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
+ var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
+
+ var rect;
+ if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
+ for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned
+ while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }
+ while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }
+ if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
+ { rect = node.parentNode.getBoundingClientRect(); }
+ else
+ { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }
+ if (rect.left || rect.right || start == 0) { break }
+ end = start;
+ start = start - 1;
+ collapse = "right";
+ }
+ if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }
+ } else { // If it is a widget, simply get the box for the whole widget.
+ if (start > 0) { collapse = bias = "right"; }
+ var rects;
+ if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
+ { rect = rects[bias == "right" ? rects.length - 1 : 0]; }
+ else
+ { rect = node.getBoundingClientRect(); }
+ }
+ if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
+ var rSpan = node.parentNode.getClientRects()[0];
+ if (rSpan)
+ { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }
+ else
+ { rect = nullRect; }
+ }
+
+ var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
+ var mid = (rtop + rbot) / 2;
+ var heights = prepared.view.measure.heights;
+ var i = 0;
+ for (; i < heights.length - 1; i++)
+ { if (mid < heights[i]) { break } }
+ var top = i ? heights[i - 1] : 0, bot = heights[i];
+ var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
+ right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
+ top: top, bottom: bot};
+ if (!rect.left && !rect.right) { result.bogus = true; }
+ if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }
+
+ return result
+ }
+
+ // Work around problem with bounding client rects on ranges being
+ // returned incorrectly when zoomed on IE10 and below.
+ function maybeUpdateRectForZooming(measure, rect) {
+ if (!window.screen || screen.logicalXDPI == null ||
+ screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
+ { return rect }
+ var scaleX = screen.logicalXDPI / screen.deviceXDPI;
+ var scaleY = screen.logicalYDPI / screen.deviceYDPI;
+ return {left: rect.left * scaleX, right: rect.right * scaleX,
+ top: rect.top * scaleY, bottom: rect.bottom * scaleY}
+ }
+
+ function clearLineMeasurementCacheFor(lineView) {
+ if (lineView.measure) {
+ lineView.measure.cache = {};
+ lineView.measure.heights = null;
+ if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+ { lineView.measure.caches[i] = {}; } }
+ }
+ }
+
+ function clearLineMeasurementCache(cm) {
+ cm.display.externalMeasure = null;
+ removeChildren(cm.display.lineMeasure);
+ for (var i = 0; i < cm.display.view.length; i++)
+ { clearLineMeasurementCacheFor(cm.display.view[i]); }
+ }
+
+ function clearCaches(cm) {
+ clearLineMeasurementCache(cm);
+ cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
+ if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }
+ cm.display.lineNumChars = null;
+ }
+
+ function pageScrollX() {
+ // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206
+ // which causes page_Offset and bounding client rects to use
+ // different reference viewports and invalidate our calculations.
+ if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }
+ return window.pageXOffset || (document.documentElement || document.body).scrollLeft
+ }
+ function pageScrollY() {
+ if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }
+ return window.pageYOffset || (document.documentElement || document.body).scrollTop
+ }
+
+ function widgetTopHeight(lineObj) {
+ var height = 0;
+ if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)
+ { height += widgetHeight(lineObj.widgets[i]); } } }
+ return height
+ }
+
+ // Converts a {top, bottom, left, right} box from line-local
+ // coordinates into another coordinate system. Context may be one of
+ // "line", "div" (display.lineDiv), "local"./null (editor), "window",
+ // or "page".
+ function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
+ if (!includeWidgets) {
+ var height = widgetTopHeight(lineObj);
+ rect.top += height; rect.bottom += height;
+ }
+ if (context == "line") { return rect }
+ if (!context) { context = "local"; }
+ var yOff = heightAtLine(lineObj);
+ if (context == "local") { yOff += paddingTop(cm.display); }
+ else { yOff -= cm.display.viewOffset; }
+ if (context == "page" || context == "window") {
+ var lOff = cm.display.lineSpace.getBoundingClientRect();
+ yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
+ var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
+ rect.left += xOff; rect.right += xOff;
+ }
+ rect.top += yOff; rect.bottom += yOff;
+ return rect
+ }
+
+ // Coverts a box from "div" coords to another coordinate system.
+ // Context may be "window", "page", "div", or "local"./null.
+ function fromCoordSystem(cm, coords, context) {
+ if (context == "div") { return coords }
+ var left = coords.left, top = coords.top;
+ // First move into "page" coordinate system
+ if (context == "page") {
+ left -= pageScrollX();
+ top -= pageScrollY();
+ } else if (context == "local" || !context) {
+ var localBox = cm.display.sizer.getBoundingClientRect();
+ left += localBox.left;
+ top += localBox.top;
+ }
+
+ var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
+ return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}
+ }
+
+ function charCoords(cm, pos, context, lineObj, bias) {
+ if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }
+ return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)
+ }
+
+ // Returns a box for a given cursor position, which may have an
+ // 'other' property containing the position of the secondary cursor
+ // on a bidi boundary.
+ // A cursor Pos(line, char, "before") is on the same visual line as `char - 1`
+ // and after `char - 1` in writing order of `char - 1`
+ // A cursor Pos(line, char, "after") is on the same visual line as `char`
+ // and before `char` in writing order of `char`
+ // Examples (upper-case letters are RTL, lower-case are LTR):
+ // Pos(0, 1, ...)
+ // before after
+ // ab a|b a|b
+ // aB a|B aB|
+ // Ab |Ab A|b
+ // AB B|A B|A
+ // Every position after the last character on a line is considered to stick
+ // to the last character on the line.
+ function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
+ lineObj = lineObj || getLine(cm.doc, pos.line);
+ if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
+ function get(ch, right) {
+ var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
+ if (right) { m.left = m.right; } else { m.right = m.left; }
+ return intoCoordSystem(cm, lineObj, m, context)
+ }
+ var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;
+ if (ch >= lineObj.text.length) {
+ ch = lineObj.text.length;
+ sticky = "before";
+ } else if (ch <= 0) {
+ ch = 0;
+ sticky = "after";
+ }
+ if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") }
+
+ function getBidi(ch, partPos, invert) {
+ var part = order[partPos], right = part.level == 1;
+ return get(invert ? ch - 1 : ch, right != invert)
+ }
+ var partPos = getBidiPartAt(order, ch, sticky);
+ var other = bidiOther;
+ var val = getBidi(ch, partPos, sticky == "before");
+ if (other != null) { val.other = getBidi(ch, other, sticky != "before"); }
+ return val
+ }
+
+ // Used to cheaply estimate the coordinates for a position. Used for
+ // intermediate scroll updates.
+ function estimateCoords(cm, pos) {
+ var left = 0;
+ pos = clipPos(cm.doc, pos);
+ if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }
+ var lineObj = getLine(cm.doc, pos.line);
+ var top = heightAtLine(lineObj) + paddingTop(cm.display);
+ return {left: left, right: left, top: top, bottom: top + lineObj.height}
+ }
+
+ // Positions returned by coordsChar contain some extra information.
+ // xRel is the relative x position of the input coordinates compared
+ // to the found position (so xRel > 0 means the coordinates are to
+ // the right of the character position, for example). When outside
+ // is true, that means the coordinates lie outside the line's
+ // vertical range.
+ function PosWithInfo(line, ch, sticky, outside, xRel) {
+ var pos = Pos(line, ch, sticky);
+ pos.xRel = xRel;
+ if (outside) { pos.outside = outside; }
+ return pos
+ }
+
+ // Compute the character position closest to the given coordinates.
+ // Input must be lineSpace-local ("div" coordinate system).
+ function coordsChar(cm, x, y) {
+ var doc = cm.doc;
+ y += cm.display.viewOffset;
+ if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }
+ var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
+ if (lineN > last)
+ { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }
+ if (x < 0) { x = 0; }
+
+ var lineObj = getLine(doc, lineN);
+ for (;;) {
+ var found = coordsCharInner(cm, lineObj, lineN, x, y);
+ var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));
+ if (!collapsed) { return found }
+ var rangeEnd = collapsed.find(1);
+ if (rangeEnd.line == lineN) { return rangeEnd }
+ lineObj = getLine(doc, lineN = rangeEnd.line);
+ }
+ }
+
+ function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
+ y -= widgetTopHeight(lineObj);
+ var end = lineObj.text.length;
+ var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);
+ end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);
+ return {begin: begin, end: end}
+ }
+
+ function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
+ if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
+ var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top;
+ return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)
+ }
+
+ // Returns true if the given side of a box is after the given
+ // coordinates, in top-to-bottom, left-to-right order.
+ function boxIsAfter(box, x, y, left) {
+ return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x
+ }
+
+ function coordsCharInner(cm, lineObj, lineNo, x, y) {
+ // Move y into line-local coordinate space
+ y -= heightAtLine(lineObj);
+ var preparedMeasure = prepareMeasureForLine(cm, lineObj);
+ // When directly calling `measureCharPrepared`, we have to adjust
+ // for the widgets at this line.
+ var widgetHeight = widgetTopHeight(lineObj);
+ var begin = 0, end = lineObj.text.length, ltr = true;
+
+ var order = getOrder(lineObj, cm.doc.direction);
+ // If the line isn't plain left-to-right text, first figure out
+ // which bidi section the coordinates fall into.
+ if (order) {
+ var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)
+ (cm, lineObj, lineNo, preparedMeasure, order, x, y);
+ ltr = part.level != 1;
+ // The awkward -1 offsets are needed because findFirst (called
+ // on these below) will treat its first bound as inclusive,
+ // second as exclusive, but we want to actually address the
+ // characters in the part's range
+ begin = ltr ? part.from : part.to - 1;
+ end = ltr ? part.to : part.from - 1;
+ }
+
+ // A binary search to find the first character whose bounding box
+ // starts after the coordinates. If we run across any whose box wrap
+ // the coordinates, store that.
+ var chAround = null, boxAround = null;
+ var ch = findFirst(function (ch) {
+ var box = measureCharPrepared(cm, preparedMeasure, ch);
+ box.top += widgetHeight; box.bottom += widgetHeight;
+ if (!boxIsAfter(box, x, y, false)) { return false }
+ if (box.top <= y && box.left <= x) {
+ chAround = ch;
+ boxAround = box;
+ }
+ return true
+ }, begin, end);
+
+ var baseX, sticky, outside = false;
+ // If