diff --git a/assets/plugins/codemirror/cm/lib/codemirror-compressed.js b/assets/plugins/codemirror/cm/lib/codemirror-compressed.js
index 8e9ade458c..53d55e3b6d 100755
--- a/assets/plugins/codemirror/cm/lib/codemirror-compressed.js
+++ b/assets/plugins/codemirror/cm/lib/codemirror-compressed.js
@@ -1,7624 +1,4218 @@
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var noOptions = {};
- var nonWS = /[^\s\u00a0]/;
- var Pos = CodeMirror.Pos;
-
- function firstNonWS(str) {
- var found = str.search(nonWS);
- return found == -1 ? 0 : found;
- }
- CodeMirror.commands.toggleComment = function(cm) {
- cm.toggleComment();
- };
- CodeMirror.defineExtension("toggleComment", function(options) {
- if (!options) options = noOptions;
- var cm = this;
- var minLine = Infinity,
- ranges = this.listSelections(),
- mode = null;
- for (var i = ranges.length - 1; i >= 0; i--) {
- var from = ranges[i].from(),
- to = ranges[i].to();
- if (from.line >= minLine) continue;
- if (to.line >= minLine) to = Pos(minLine, 0);
- minLine = from.line;
- if (mode == null) {
- if (cm.uncomment(from, to, options)) mode = "un";
- else {
- cm.lineComment(from, to, options);
- mode = "line";
- }
- } else if (mode == "un") {
- cm.uncomment(from, to, options);
- } else {
- cm.lineComment(from, to, options);
- }
- }
- });
-
- function probablyInsideString(cm, pos, line) {
- return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line)
- }
-
- function getMode(cm, pos) {
- var mode = cm.getMode()
- return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos)
- }
- CodeMirror.defineExtension("lineComment", function(from, to, options) {
- if (!options) options = noOptions;
- var self = this,
- mode = getMode(self, from);
- var firstLine = self.getLine(from.line);
- if (firstLine == null || probablyInsideString(self, from, firstLine)) return;
- var commentString = options.lineComment || mode.lineComment;
- if (!commentString) {
- if (options.blockCommentStart || mode.blockCommentStart) {
- options.fullLines = true;
- self.blockComment(from, to, options);
- }
- return;
- }
- var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);
- var pad = options.padding == null ? " " : options.padding;
- var blankLines = options.commentBlankLines || from.line == to.line;
- self.operation(function() {
- if (options.indent) {
- var baseString = null;
- for (var i = from.line; i < end; ++i) {
- var line = self.getLine(i);
- var whitespace = line.slice(0, firstNonWS(line));
- if (baseString == null || baseString.length > whitespace.length) {
- baseString = whitespace;
- }
- }
- for (var i = from.line; i < end; ++i) {
- var line = self.getLine(i),
- cut = baseString.length;
- if (!blankLines && !nonWS.test(line)) continue;
- if (line.slice(0, cut) != baseString) cut = firstNonWS(line);
- self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));
- }
- } else {
- for (var i = from.line; i < end; ++i) {
- if (blankLines || nonWS.test(self.getLine(i)))
- self.replaceRange(commentString + pad, Pos(i, 0));
- }
- }
- });
- });
- CodeMirror.defineExtension("blockComment", function(from, to, options) {
- if (!options) options = noOptions;
- var self = this,
- mode = getMode(self, from);
- var startString = options.blockCommentStart || mode.blockCommentStart;
- var endString = options.blockCommentEnd || mode.blockCommentEnd;
- if (!startString || !endString) {
- if ((options.lineComment || mode.lineComment) && options.fullLines != false)
- self.lineComment(from, to, options);
- return;
- }
- if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return
- var end = Math.min(to.line, self.lastLine());
- if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;
- var pad = options.padding == null ? " " : options.padding;
- if (from.line > end) return;
- self.operation(function() {
- if (options.fullLines != false) {
- var lastLineHasText = nonWS.test(self.getLine(end));
- self.replaceRange(pad + endString, Pos(end));
- self.replaceRange(startString + pad, Pos(from.line, 0));
- var lead = options.blockCommentLead || mode.blockCommentLead;
- if (lead != null)
- for (var i = from.line + 1; i <= end; ++i)
- if (i != end || lastLineHasText)
- self.replaceRange(lead + pad, Pos(i, 0));
- } else {
- self.replaceRange(endString, to);
- self.replaceRange(startString, from);
- }
- });
- });
- CodeMirror.defineExtension("uncomment", function(from, to, options) {
- if (!options) options = noOptions;
- var self = this,
- mode = getMode(self, from);
- var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()),
- start = Math.min(from.line, end);
- var lineString = options.lineComment || mode.lineComment,
- lines = [];
- var pad = options.padding == null ? " " : options.padding,
- didSomething;
- lineComment: {
- if (!lineString) break lineComment;
- for (var i = start; i <= end; ++i) {
- var line = self.getLine(i);
- var found = line.indexOf(lineString);
- if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1;
- if (found == -1 && nonWS.test(line)) break lineComment;
- if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment;
- lines.push(line);
- }
- self.operation(function() {
- for (var i = start; i <= end; ++i) {
- var line = lines[i - start];
- var pos = line.indexOf(lineString),
- endPos = pos + lineString.length;
- if (pos < 0) continue;
- if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;
- didSomething = true;
- self.replaceRange("", Pos(i, pos), Pos(i, endPos));
- }
- });
- if (didSomething) return true;
- }
- var startString = options.blockCommentStart || mode.blockCommentStart;
- var endString = options.blockCommentEnd || mode.blockCommentEnd;
- if (!startString || !endString) return false;
- var lead = options.blockCommentLead || mode.blockCommentLead;
- var startLine = self.getLine(start),
- open = startLine.indexOf(startString)
- if (open == -1) return false
- var endLine = end == start ? startLine : self.getLine(end)
- var close = endLine.indexOf(endString, end == start ? open + startString.length : 0);
- var insideStart = Pos(start, open + 1),
- insideEnd = Pos(end, close + 1)
- if (close == -1 || !/comment/.test(self.getTokenTypeAt(insideStart)) || !/comment/.test(self.getTokenTypeAt(insideEnd)) || self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1)
- return false;
- var lastStart = startLine.lastIndexOf(startString, from.ch);
- var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);
- if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;
- firstEnd = endLine.indexOf(endString, to.ch);
- var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);
- lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;
- if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;
- self.operation(function() {
- self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), Pos(end, close + endString.length));
- var openEnd = open + startString.length;
- if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;
- self.replaceRange("", Pos(start, open), Pos(start, openEnd));
- if (lead)
- for (var i = start + 1; i <= end; ++i) {
- var line = self.getLine(i),
- found = line.indexOf(lead);
- if (found == -1 || nonWS.test(line.slice(0, found))) continue;
- var foundEnd = found + lead.length;
- if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;
- self.replaceRange("", Pos(i, found), Pos(i, foundEnd));
- }
- });
- return true;
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- function continueComment(cm) {
- if (cm.getOption("disableInput")) return CodeMirror.Pass;
- var ranges = cm.listSelections(),
- mode, inserts = [];
- for (var i = 0; i < ranges.length; i++) {
- var pos = ranges[i].head
- if (!/\bcomment\b/.test(cm.getTokenTypeAt(pos))) return CodeMirror.Pass;
- var modeHere = cm.getModeAt(pos)
- if (!mode) mode = modeHere;
- else if (mode != modeHere) return CodeMirror.Pass;
- var insert = null;
- if (mode.blockCommentStart && mode.blockCommentContinue) {
- var line = cm.getLine(pos.line).slice(0, pos.ch)
- var end = line.lastIndexOf(mode.blockCommentEnd),
- found
- if (end != -1 && end == pos.ch - mode.blockCommentEnd.length) {} else if ((found = line.lastIndexOf(mode.blockCommentStart)) > -1 && found > end) {
- insert = line.slice(0, found)
- if (/\S/.test(insert)) {
- insert = ""
- for (var j = 0; j < found; ++j) insert += " "
- }
- } else if ((found = line.indexOf(mode.blockCommentContinue)) > -1 && !/\S/.test(line.slice(0, found))) {
- insert = line.slice(0, found)
- }
- if (insert != null) insert += mode.blockCommentContinue
- }
- if (insert == null && mode.lineComment && continueLineCommentEnabled(cm)) {
- var line = cm.getLine(pos.line),
- found = line.indexOf(mode.lineComment);
- if (found > -1) {
- insert = line.slice(0, found);
- if (/\S/.test(insert)) insert = null;
- else insert += mode.lineComment + line.slice(found + mode.lineComment.length).match(/^\s*/)[0];
- }
- }
- if (insert == null) return CodeMirror.Pass;
- inserts[i] = "\n" + insert;
- }
- cm.operation(function() {
- for (var i = ranges.length - 1; i >= 0; i--)
- cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert");
- });
- }
-
- function continueLineCommentEnabled(cm) {
- var opt = cm.getOption("continueComments");
- if (opt && typeof opt == "object")
- return opt.continueLineComment !== false;
- return true;
- }
- CodeMirror.defineOption("continueComments", null, function(cm, val, prev) {
- if (prev && prev != CodeMirror.Init)
- cm.removeKeyMap("continueComment");
- if (val) {
- var key = "Enter";
- if (typeof val == "string")
- key = val;
- else if (typeof val == "object" && val.key)
- key = val.key;
- var map = {
- name: "continueComment"
- };
- map[key] = continueComment;
- cm.addKeyMap(map);
- }
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- function dialogDiv(cm, template, bottom) {
- var wrap = cm.getWrapperElement();
- var dialog;
- dialog = wrap.appendChild(document.createElement("div"));
- if (bottom)
- dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom";
- else
- dialog.className = "CodeMirror-dialog CodeMirror-dialog-top";
- if (typeof template == "string") {
- dialog.innerHTML = template;
- } else {
- dialog.appendChild(template);
- }
- return dialog;
- }
-
- function closeNotification(cm, newVal) {
- if (cm.state.currentNotificationClose)
- cm.state.currentNotificationClose();
- cm.state.currentNotificationClose = newVal;
- }
- CodeMirror.defineExtension("openDialog", function(template, callback, options) {
- if (!options) options = {};
- closeNotification(this, null);
- var dialog = dialogDiv(this, template, options.bottom);
- var closed = false,
- me = this;
-
- function close(newVal) {
- if (typeof newVal == 'string') {
- inp.value = newVal;
- } else {
- if (closed) return;
- closed = true;
- dialog.parentNode.removeChild(dialog);
- me.focus();
- if (options.onClose) options.onClose(dialog);
- }
- }
- var inp = dialog.getElementsByTagName("input")[0],
- button;
- if (inp) {
- inp.focus();
- if (options.value) {
- inp.value = options.value;
- if (options.selectValueOnOpen !== false) {
- inp.select();
- }
- }
- if (options.onInput)
- CodeMirror.on(inp, "input", function(e) {
- options.onInput(e, inp.value, close);
- });
- if (options.onKeyUp)
- CodeMirror.on(inp, "keyup", function(e) {
- options.onKeyUp(e, inp.value, close);
- });
- CodeMirror.on(inp, "keydown", function(e) {
- if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) {
- return;
- }
- if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {
- inp.blur();
- CodeMirror.e_stop(e);
- close();
- }
- if (e.keyCode == 13) callback(inp.value, e);
- });
- if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close);
- } else if (button = dialog.getElementsByTagName("button")[0]) {
- CodeMirror.on(button, "click", function() {
- close();
- me.focus();
- });
- if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close);
- button.focus();
- }
- return close;
- });
- CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) {
- closeNotification(this, null);
- var dialog = dialogDiv(this, template, options && options.bottom);
- var buttons = dialog.getElementsByTagName("button");
- var closed = false,
- me = this,
- blurring = 1;
-
- function close() {
- if (closed) return;
- closed = true;
- dialog.parentNode.removeChild(dialog);
- me.focus();
- }
- buttons[0].focus();
- for (var i = 0; i < buttons.length; ++i) {
- var b = buttons[i];
- (function(callback) {
- CodeMirror.on(b, "click", function(e) {
- CodeMirror.e_preventDefault(e);
- close();
- if (callback) callback(me);
- });
- })(callbacks[i]);
- CodeMirror.on(b, "blur", function() {
- --blurring;
- setTimeout(function() {
- if (blurring <= 0) close();
- }, 200);
- });
- CodeMirror.on(b, "focus", function() {
- ++blurring;
- });
- }
- });
- CodeMirror.defineExtension("openNotification", function(template, options) {
- closeNotification(this, close);
- var dialog = dialogDiv(this, template, options && options.bottom);
- var closed = false,
- doneTimer;
- var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000;
-
- function close() {
- if (closed) return;
- closed = true;
- clearTimeout(doneTimer);
- dialog.parentNode.removeChild(dialog);
- }
- CodeMirror.on(dialog, 'click', function(e) {
- CodeMirror.e_preventDefault(e);
- close();
- });
- if (duration)
- doneTimer = setTimeout(close, duration);
- return close;
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"))
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod)
- else
- mod(CodeMirror)
-})(function(CodeMirror) {
- "use strict"
- CodeMirror.defineOption("autoRefresh", false, function(cm, val) {
- if (cm.state.autoRefresh) {
- stopListening(cm, cm.state.autoRefresh)
- cm.state.autoRefresh = null
- }
- if (val && cm.display.wrapper.offsetHeight == 0)
- startListening(cm, cm.state.autoRefresh = {
- delay: val.delay || 250
- })
- })
-
- function startListening(cm, state) {
- function check() {
- if (cm.display.wrapper.offsetHeight) {
- stopListening(cm, state)
- if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight)
- cm.refresh()
- } else {
- state.timeout = setTimeout(check, state.delay)
- }
- }
- state.timeout = setTimeout(check, state.delay)
- state.hurry = function() {
- clearTimeout(state.timeout)
- state.timeout = setTimeout(check, 50)
- }
- CodeMirror.on(window, "mouseup", state.hurry)
- CodeMirror.on(window, "keyup", state.hurry)
- }
-
- function stopListening(_cm, state) {
- clearTimeout(state.timeout)
- CodeMirror.off(window, "mouseup", state.hurry)
- CodeMirror.off(window, "keyup", state.hurry)
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
- if (old == CodeMirror.Init) old = false;
- if (!old == !val) return;
- if (val) setFullscreen(cm);
- else setNormal(cm);
- });
-
- function setFullscreen(cm) {
- var wrap = cm.getWrapperElement();
- cm.state.fullScreenRestore = {
- scrollTop: window.pageYOffset,
- scrollLeft: window.pageXOffset,
- width: wrap.style.width,
- height: wrap.style.height
- };
- wrap.style.width = "";
- wrap.style.height = "auto";
- wrap.className += " CodeMirror-fullscreen";
- document.documentElement.style.overflow = "hidden";
- cm.refresh();
- }
-
- function setNormal(cm) {
- var wrap = cm.getWrapperElement();
- wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
- document.documentElement.style.overflow = "";
- var info = cm.state.fullScreenRestore;
- wrap.style.width = info.width;
- wrap.style.height = info.height;
- window.scrollTo(info.scrollLeft, info.scrollTop);
- cm.refresh();
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- CodeMirror.defineExtension("addPanel", function(node, options) {
- options = options || {};
- if (!this.state.panels) initPanels(this);
- var info = this.state.panels;
- var wrapper = info.wrapper;
- var cmWrapper = this.getWrapperElement();
- if (options.after instanceof Panel && !options.after.cleared) {
- wrapper.insertBefore(node, options.before.node.nextSibling);
- } else if (options.before instanceof Panel && !options.before.cleared) {
- wrapper.insertBefore(node, options.before.node);
- } else if (options.replace instanceof Panel && !options.replace.cleared) {
- wrapper.insertBefore(node, options.replace.node);
- options.replace.clear();
- } else if (options.position == "bottom") {
- wrapper.appendChild(node);
- } else if (options.position == "before-bottom") {
- wrapper.insertBefore(node, cmWrapper.nextSibling);
- } else if (options.position == "after-top") {
- wrapper.insertBefore(node, cmWrapper);
- } else {
- wrapper.insertBefore(node, wrapper.firstChild);
- }
- var height = (options && options.height) || node.offsetHeight;
- this._setSize(null, info.heightLeft -= height);
- info.panels++;
- if (options.stable && isAtTop(this, node))
- this.scrollTo(null, this.getScrollInfo().top + height)
- return new Panel(this, node, options, height);
- });
-
- function Panel(cm, node, options, height) {
- this.cm = cm;
- this.node = node;
- this.options = options;
- this.height = height;
- this.cleared = false;
- }
- Panel.prototype.clear = function() {
- if (this.cleared) return;
- this.cleared = true;
- var info = this.cm.state.panels;
- this.cm._setSize(null, info.heightLeft += this.height);
- if (this.options.stable && isAtTop(this.cm, this.node))
- this.cm.scrollTo(null, this.cm.getScrollInfo().top - this.height)
- info.wrapper.removeChild(this.node);
- if (--info.panels == 0) removePanels(this.cm);
- };
- Panel.prototype.changed = function(height) {
- var newHeight = height == null ? this.node.offsetHeight : height;
- var info = this.cm.state.panels;
- this.cm._setSize(null, info.heightLeft -= (newHeight - this.height));
- this.height = newHeight;
- };
-
- function initPanels(cm) {
- var wrap = cm.getWrapperElement();
- var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle;
- var height = parseInt(style.height);
- var info = cm.state.panels = {
- setHeight: wrap.style.height,
- heightLeft: height,
- panels: 0,
- wrapper: document.createElement("div")
- };
- wrap.parentNode.insertBefore(info.wrapper, wrap);
- var hasFocus = cm.hasFocus();
- info.wrapper.appendChild(wrap);
- if (hasFocus) cm.focus();
- cm._setSize = cm.setSize;
- if (height != null) cm.setSize = function(width, newHeight) {
- if (newHeight == null) return this._setSize(width, newHeight);
- info.setHeight = newHeight;
- if (typeof newHeight != "number") {
- var px = /^(\d+\.?\d*)px$/.exec(newHeight);
- if (px) {
- newHeight = Number(px[1]);
- } else {
- info.wrapper.style.height = newHeight;
- newHeight = info.wrapper.offsetHeight;
- info.wrapper.style.height = "";
- }
- }
- cm._setSize(width, info.heightLeft += (newHeight - height));
- height = newHeight;
- };
- }
-
- function removePanels(cm) {
- var info = cm.state.panels;
- cm.state.panels = null;
- var wrap = cm.getWrapperElement();
- info.wrapper.parentNode.replaceChild(wrap, info.wrapper);
- wrap.style.height = info.setHeight;
- cm.setSize = cm._setSize;
- cm.setSize();
- }
-
- function isAtTop(cm, dom) {
- for (var sibling = dom.nextSibling; sibling; sibling = sibling.nextSibling)
- if (sibling == cm.getWrapperElement()) return true
- return false
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- CodeMirror.defineOption("placeholder", "", function(cm, val, old) {
- var prev = old && old != CodeMirror.Init;
- if (val && !prev) {
- cm.on("blur", onBlur);
- cm.on("change", onChange);
- cm.on("swapDoc", onChange);
- onChange(cm);
- } else if (!val && prev) {
- cm.off("blur", onBlur);
- cm.off("change", onChange);
- cm.off("swapDoc", onChange);
- clearPlaceholder(cm);
- var wrapper = cm.getWrapperElement();
- wrapper.className = wrapper.className.replace(" CodeMirror-empty", "");
- }
- if (val && !cm.hasFocus()) onBlur(cm);
- });
-
- function clearPlaceholder(cm) {
- if (cm.state.placeholder) {
- cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);
- cm.state.placeholder = null;
- }
- }
-
- function setPlaceholder(cm) {
- clearPlaceholder(cm);
- var elt = cm.state.placeholder = document.createElement("pre");
- elt.style.cssText = "height: 0; overflow: visible";
- elt.className = "CodeMirror-placeholder";
- var placeHolder = cm.getOption("placeholder")
- if (typeof placeHolder == "string") placeHolder = document.createTextNode(placeHolder)
- elt.appendChild(placeHolder)
- cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);
- }
-
- function onBlur(cm) {
- if (isEmpty(cm)) setPlaceholder(cm);
- }
-
- function onChange(cm) {
- var wrapper = cm.getWrapperElement(),
- empty = isEmpty(cm);
- wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : "");
- if (empty) setPlaceholder(cm);
- else clearPlaceholder(cm);
- }
-
- function isEmpty(cm) {
- return (cm.lineCount() === 1) && (cm.getLine(0) === "");
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.defineOption("rulers", false, function(cm, val) {
- if (cm.state.rulerDiv) {
- cm.state.rulerDiv.parentElement.removeChild(cm.state.rulerDiv)
- cm.state.rulerDiv = null
- cm.off("refresh", drawRulers)
- }
- if (val && val.length) {
- cm.state.rulerDiv = cm.display.lineSpace.parentElement.insertBefore(document.createElement("div"), cm.display.lineSpace)
- cm.state.rulerDiv.className = "CodeMirror-rulers"
- drawRulers(cm)
- cm.on("refresh", drawRulers)
- }
- });
-
- function drawRulers(cm) {
- cm.state.rulerDiv.textContent = ""
- var val = cm.getOption("rulers");
- var cw = cm.defaultCharWidth();
- var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left;
- cm.state.rulerDiv.style.minHeight = (cm.display.scroller.offsetHeight + 30) + "px";
- for (var i = 0; i < val.length; i++) {
- var elt = document.createElement("div");
- elt.className = "CodeMirror-ruler";
- var col, conf = val[i];
- if (typeof conf == "number") {
- col = conf;
- } else {
- col = conf.column;
- if (conf.className) elt.className += " " + conf.className;
- if (conf.color) elt.style.borderColor = conf.color;
- if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle;
- if (conf.width) elt.style.borderLeftWidth = conf.width;
- }
- elt.style.left = (left + col * cw) + "px";
- cm.state.rulerDiv.appendChild(elt)
- }
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- var defaults = {
- pairs: "()[]{}''\"\"",
- 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 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 && (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != ch)) {
- 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 && (cm.getLine(cur.line).length == cur.ch || isClosingBracket(next, pairs) || /\s/.test(next))) {
- 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 isClosingBracket(ch, pairs) {
- var pos = pairs.lastIndexOf(ch);
- return pos > -1 && pos % 2 == 1;
- }
-
- 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)))
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror", "../fold/xml-fold"], mod);
- else
- 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)
- map["'/'"] = function(cm) {
- return autoCloseSlash(cm);
- };
- if (typeof val != "object" || val.whenOpening)
- 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;
- if (inner.mode.name != "xml" || !state.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);
- var tagName = state.tagName;
- if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
- var lowerTagName = tagName.toLowerCase();
- if (!tagName || tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) || tok.type == "tag" && state.type == "closeTag" || tok.string.indexOf("/") == (tok.string.length - 1) || dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 || closingTagExists(cm, tagName, pos, state, true))
- return CodeMirror.Pass;
- 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;
- var replacement;
- if (inner.mode.name != "xml") {
- if (cm.getMode().name == "htmlmixed" && inner.mode.name == "javascript")
- replacement = head + "script";
- else if (cm.getMode().name == "htmlmixed" && inner.mode.name == "css")
- replacement = head + "style";
- else
- return CodeMirror.Pass;
- } else {
- if (!state.context || !state.context.tagName || closingTagExists(cm, state.context.tagName, pos, state))
- return CodeMirror.Pass;
- replacement = head + state.context.tagName;
- }
- 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;
- }
-
- function closingTagExists(cm, tagName, pos, state, 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;
- var cx = state.context;
- for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx;
- 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;
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var listRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/,
- emptyListRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/,
- unorderedListRE = /[*+-]\s/;
- CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {
- if (cm.getOption("disableInput")) return CodeMirror.Pass;
- var ranges = cm.listSelections(),
- replacements = [];
- for (var i = 0; i < ranges.length; i++) {
- var pos = ranges[i].head;
- var eolState = cm.getStateAfter(pos.line);
- var inList = eolState.list !== false;
- var inQuote = eolState.quote !== 0;
- var line = cm.getLine(pos.line),
- match = listRE.exec(line);
- var cursorBeforeBullet = /^\s*$/.test(line.slice(0, pos.ch));
- if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) {
- cm.execCommand("newlineAndIndent");
- return;
- }
- if (emptyListRE.test(line)) {
- if (!/>\s*$/.test(line)) cm.replaceRange("", {
- line: pos.line,
- ch: 0
- }, {
- line: pos.line,
- ch: pos.ch + 1
- });
- replacements[i] = "\n";
- } else {
- var indent = match[1],
- after = match[5];
- var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0);
- var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace("x", " ");
- replacements[i] = "\n" + indent + bullet + after;
- if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);
- }
- }
- cm.replaceSelections(replacements);
- };
-
- function incrementRemainingMarkdownListNumbers(cm, pos) {
- var startLine = pos.line,
- lookAhead = 0,
- skipCount = 0;
- var startItem = listRE.exec(cm.getLine(startLine)),
- startIndent = startItem[1];
- do {
- lookAhead += 1;
- var nextLineNumber = startLine + lookAhead;
- var nextLine = cm.getLine(nextLineNumber),
- nextItem = listRE.exec(nextLine);
- if (nextItem) {
- var nextIndent = nextItem[1];
- var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount);
- var nextNumber = (parseInt(nextItem[3], 10)),
- itemNumber = nextNumber;
- if (startIndent === nextIndent) {
- if (newNumber === nextNumber) itemNumber = nextNumber + 1;
- if (newNumber > nextNumber) itemNumber = newNumber + 1;
- cm.replaceRange(nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]), {
- line: nextLineNumber,
- ch: 0
- }, {
- line: nextLineNumber,
- ch: nextLine.length
- });
- } else {
- if (startIndent.length > nextIndent.length) return;
- if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;
- skipCount += 1;
- }
- }
- } while (nextItem);
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && (document.documentMode == null || document.documentMode < 8);
- var Pos = CodeMirror.Pos;
- var matching = {
- "(": ")>",
- ")": "(<",
- "[": "]>",
- "]": "[<",
- "{": "}>",
- "}": "{<"
- };
-
- function findMatchingBracket(cm, where, config) {
- var line = cm.getLineHandle(where.line),
- pos = where.ch - 1;
- var afterCursor = config && config.afterCursor
- if (afterCursor == null)
- afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className)
- var match = (!afterCursor && pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
- if (!match) return null;
- var dir = match.charAt(1) == ">" ? 1 : -1;
- if (config && config.strict && (dir > 0) != (pos == where.ch)) return null;
- var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));
- var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);
- if (found == null) return null;
- return {
- from: Pos(where.line, pos),
- to: found && found.pos,
- match: found && found.ch == match.charAt(0),
- forward: dir > 0
- };
- }
-
- function scanForBracket(cm, where, dir, style, config) {
- var maxScanLen = (config && config.maxScanLineLength) || 10000;
- var maxScanLines = (config && config.maxScanLines) || 1000;
- var stack = [];
- var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/;
- var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) : Math.max(cm.firstLine() - 1, where.line - maxScanLines);
- for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {
- var line = cm.getLine(lineNo);
- if (!line) continue;
- var pos = dir > 0 ? 0 : line.length - 1,
- end = dir > 0 ? line.length : -1;
- if (line.length > maxScanLen) continue;
- if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
- for (; pos != end; pos += dir) {
- var ch = line.charAt(pos);
- if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {
- var match = matching[ch];
- if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
- else if (!stack.length) return {
- pos: Pos(lineNo, pos),
- ch: ch
- };
- else stack.pop();
- }
- }
- }
- return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;
- }
-
- function matchBrackets(cm, autoclear, config) {
- var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;
- var marks = [],
- ranges = cm.listSelections();
- for (var i = 0; i < ranges.length; i++) {
- var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config);
- if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {
- var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
- marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {
- className: style
- }));
- if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)
- marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {
- className: style
- }));
- }
- }
- if (marks.length) {
- if (ie_lt8 && cm.state.focused) cm.focus();
- var clear = function() {
- cm.operation(function() {
- for (var i = 0; i < marks.length; i++) marks[i].clear();
- });
- };
- if (autoclear) setTimeout(clear, 800);
- else return clear;
- }
- }
- var currentlyHighlighted = null;
-
- function doMatchBrackets(cm) {
- cm.operation(function() {
- if (currentlyHighlighted) {
- currentlyHighlighted();
- currentlyHighlighted = null;
- }
- currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);
- });
- }
- CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {
- if (old && old != CodeMirror.Init) {
- cm.off("cursorActivity", doMatchBrackets);
- if (currentlyHighlighted) {
- currentlyHighlighted();
- currentlyHighlighted = null;
- }
- }
- if (val) {
- cm.state.matchBrackets = typeof val == "object" ? val : {};
- cm.on("cursorActivity", doMatchBrackets);
- }
- });
- CodeMirror.defineExtension("matchBrackets", function() {
- matchBrackets(this, true);
- });
- CodeMirror.defineExtension("findMatchingBracket", function(pos, config, oldConfig) {
- if (oldConfig || typeof config == "boolean") {
- if (!oldConfig) {
- config = config ? {
- strict: true
- } : null
- } else {
- oldConfig.strict = config
- config = oldConfig
- }
- }
- return findMatchingBracket(this, pos, config)
- });
- CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config) {
- return scanForBracket(this, pos, dir, style, config);
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror", "../fold/xml-fold"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.defineOption("matchTags", false, function(cm, val, old) {
- if (old && old != CodeMirror.Init) {
- cm.off("cursorActivity", doMatchTags);
- cm.off("viewportChange", maybeUpdateMatch);
- clear(cm);
- }
- if (val) {
- cm.state.matchBothTags = typeof val == "object" && val.bothTags;
- cm.on("cursorActivity", doMatchTags);
- cm.on("viewportChange", maybeUpdateMatch);
- doMatchTags(cm);
- }
- });
-
- function clear(cm) {
- if (cm.state.tagHit) cm.state.tagHit.clear();
- if (cm.state.tagOther) cm.state.tagOther.clear();
- cm.state.tagHit = cm.state.tagOther = null;
- }
-
- function doMatchTags(cm) {
- cm.state.failedTagMatch = false;
- cm.operation(function() {
- clear(cm);
- if (cm.somethingSelected()) return;
- var cur = cm.getCursor(),
- range = cm.getViewport();
- range.from = Math.min(range.from, cur.line);
- range.to = Math.max(cur.line + 1, range.to);
- var match = CodeMirror.findMatchingTag(cm, cur, range);
- if (!match) return;
- if (cm.state.matchBothTags) {
- var hit = match.at == "open" ? match.open : match.close;
- if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {
- className: "CodeMirror-matchingtag"
- });
- }
- var other = match.at == "close" ? match.open : match.close;
- if (other)
- cm.state.tagOther = cm.markText(other.from, other.to, {
- className: "CodeMirror-matchingtag"
- });
- else
- cm.state.failedTagMatch = true;
- });
- }
-
- function maybeUpdateMatch(cm) {
- if (cm.state.failedTagMatch) doMatchTags(cm);
- }
- CodeMirror.commands.toMatchingTag = function(cm) {
- var found = CodeMirror.findMatchingTag(cm, cm.getCursor());
- if (found) {
- var other = found.at == "close" ? found.open : found.close;
- if (other) cm.extendSelection(other.to, other.from);
- }
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) {
- if (prev == CodeMirror.Init) prev = false;
- if (prev && !val)
- cm.removeOverlay("trailingspace");
- else if (!prev && val)
- cm.addOverlay({
- token: function(stream) {
- for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {}
- if (i > stream.pos) {
- stream.pos = i;
- return null;
- }
- stream.pos = l;
- return "trailingspace";
- },
- name: "trailingspace"
- });
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- 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 && endCh == startCh) 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;
- 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))
- };
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.registerGlobalHelper("fold", "comment", function(mode) {
- return mode.blockCommentStart && mode.blockCommentEnd;
- }, function(cm, start) {
- var mode = cm.getModeAt(start),
- startToken = mode.blockCommentStart,
- endToken = mode.blockCommentEnd;
- if (!startToken || !endToken) return;
- var line = start.line,
- lineText = cm.getLine(line);
- var startCh;
- for (var at = start.ch, pass = 0;;) {
- var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1);
- if (found == -1) {
- if (pass == 1) return;
- pass = 1;
- at = lineText.length;
- continue;
- }
- if (pass == 1 && found < start.ch) return;
- if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) && (found == 0 || lineText.slice(found - endToken.length, found) == endToken || !/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))) {
- startCh = found + startToken.length;
- break;
- }
- at = found - 1;
- }
- var depth = 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 (pos == nextOpen) ++depth;
- else if (!--depth) {
- end = i;
- endCh = pos;
- break outer;
- }
- ++pos;
- }
- }
- if (end == null || line == end && endCh == startCh) return;
- return {
- from: CodeMirror.Pos(line, startCh),
- to: CodeMirror.Pos(end, endCh)
- };
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
-
- function doFold(cm, pos, options, force) {
- if (options && options.call) {
- var finder = options;
- options = null;
- } else {
- var finder = getOption(cm, options, "rangeFinder");
- }
- if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
- var minSize = getOption(cm, options, "minFoldSize");
-
- function getRange(allowFolded) {
- var range = finder(cm, pos);
- if (!range || range.to.line - range.from.line < minSize) return null;
- var marks = cm.findMarksAt(range.from);
- for (var i = 0; i < marks.length; ++i) {
- if (marks[i].__isFold && force !== "fold") {
- if (!allowFolded) return null;
- range.cleared = true;
- marks[i].clear();
- }
- }
- return range;
- }
- var range = getRange(true);
- if (getOption(cm, options, "scanUp"))
- while (!range && pos.line > cm.firstLine()) {
- pos = CodeMirror.Pos(pos.line - 1, 0);
- range = getRange(false);
- }
- if (!range || range.cleared || force === "unfold") return;
- var myWidget = makeWidget(cm, options);
- CodeMirror.on(myWidget, "mousedown", function(e) {
- myRange.clear();
- CodeMirror.e_preventDefault(e);
- });
- var myRange = cm.markText(range.from, range.to, {
- replacedWith: myWidget,
- clearOnEnter: getOption(cm, options, "clearOnEnter"),
- __isFold: true
- });
- myRange.on("clear", function(from, to) {
- CodeMirror.signal(cm, "unfold", cm, from, to);
- });
- CodeMirror.signal(cm, "fold", cm, range.from, range.to);
- }
-
- function makeWidget(cm, options) {
- var widget = getOption(cm, options, "widget");
- if (typeof widget == "string") {
- var text = document.createTextNode(widget);
- widget = document.createElement("span");
- widget.appendChild(text);
- widget.className = "CodeMirror-foldmarker";
- } else if (widget) {
- widget = widget.cloneNode(true)
- }
- return widget;
- }
- CodeMirror.newFoldFunction = function(rangeFinder, widget) {
- return function(cm, pos) {
- doFold(cm, pos, {
- rangeFinder: rangeFinder,
- widget: widget
- });
- };
- };
- CodeMirror.defineExtension("foldCode", function(pos, options, force) {
- doFold(this, pos, options, force);
- });
- CodeMirror.defineExtension("isFolded", function(pos) {
- var marks = this.findMarksAt(pos);
- for (var i = 0; i < marks.length; ++i)
- if (marks[i].__isFold) return true;
- });
- CodeMirror.commands.toggleFold = function(cm) {
- cm.foldCode(cm.getCursor());
- };
- CodeMirror.commands.fold = function(cm) {
- cm.foldCode(cm.getCursor(), null, "fold");
- };
- CodeMirror.commands.unfold = function(cm) {
- cm.foldCode(cm.getCursor(), null, "unfold");
- };
- CodeMirror.commands.foldAll = function(cm) {
- cm.operation(function() {
- for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
- cm.foldCode(CodeMirror.Pos(i, 0), null, "fold");
- });
- };
- CodeMirror.commands.unfoldAll = function(cm) {
- cm.operation(function() {
- for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
- cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold");
- });
- };
- CodeMirror.registerHelper("fold", "combine", function() {
- var funcs = Array.prototype.slice.call(arguments, 0);
- return function(cm, start) {
- for (var i = 0; i < funcs.length; ++i) {
- var found = funcs[i](cm, start);
- if (found) return found;
- }
- };
- });
- CodeMirror.registerHelper("fold", "auto", function(cm, start) {
- var helpers = cm.getHelpers(start, "fold");
- for (var i = 0; i < helpers.length; i++) {
- var cur = helpers[i](cm, start);
- if (cur) return cur;
- }
- });
- var defaultOptions = {
- rangeFinder: CodeMirror.fold.auto,
- widget: "\u2194",
- minFoldSize: 0,
- scanUp: false,
- clearOnEnter: true
- };
- CodeMirror.defineOption("foldOptions", null);
-
- function getOption(cm, options, name) {
- if (options && options[name] !== undefined)
- return options[name];
- var editorOptions = cm.options.foldOptions;
- if (editorOptions && editorOptions[name] !== undefined)
- return editorOptions[name];
- return defaultOptions[name];
- }
- CodeMirror.defineExtension("foldOption", function(options, name) {
- return getOption(this, options, name);
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"), require("./foldcode"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror", "./foldcode"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.defineOption("foldGutter", false, function(cm, val, old) {
- if (old && old != CodeMirror.Init) {
- cm.clearGutter(cm.state.foldGutter.options.gutter);
- cm.state.foldGutter = null;
- cm.off("gutterClick", onGutterClick);
- cm.off("change", onChange);
- cm.off("viewportChange", onViewportChange);
- cm.off("fold", onFold);
- cm.off("unfold", onFold);
- cm.off("swapDoc", onChange);
- }
- if (val) {
- cm.state.foldGutter = new State(parseOptions(val));
- updateInViewport(cm);
- cm.on("gutterClick", onGutterClick);
- cm.on("change", onChange);
- cm.on("viewportChange", onViewportChange);
- cm.on("fold", onFold);
- cm.on("unfold", onFold);
- cm.on("swapDoc", onChange);
- }
- });
- var Pos = CodeMirror.Pos;
-
- function State(options) {
- this.options = options;
- this.from = this.to = 0;
- }
-
- function parseOptions(opts) {
- if (opts === true) opts = {};
- if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter";
- if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open";
- if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded";
- return opts;
- }
-
- function isFolded(cm, line) {
- var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));
- for (var i = 0; i < marks.length; ++i)
- if (marks[i].__isFold && marks[i].find().from.line == line) return marks[i];
- }
-
- function marker(spec) {
- if (typeof spec == "string") {
- var elt = document.createElement("div");
- elt.className = spec + " CodeMirror-guttermarker-subtle";
- return elt;
- } else {
- return spec.cloneNode(true);
- }
- }
-
- function updateFoldInfo(cm, from, to) {
- var opts = cm.state.foldGutter.options,
- cur = from;
- var minSize = cm.foldOption(opts, "minFoldSize");
- var func = cm.foldOption(opts, "rangeFinder");
- cm.eachLine(from, to, function(line) {
- var mark = null;
- if (isFolded(cm, cur)) {
- mark = marker(opts.indicatorFolded);
- } else {
- var pos = Pos(cur, 0);
- var range = func && func(cm, pos);
- if (range && range.to.line - range.from.line >= minSize)
- mark = marker(opts.indicatorOpen);
- }
- cm.setGutterMarker(line, opts.gutter, mark);
- ++cur;
- });
- }
-
- function updateInViewport(cm) {
- var vp = cm.getViewport(),
- state = cm.state.foldGutter;
- if (!state) return;
- cm.operation(function() {
- updateFoldInfo(cm, vp.from, vp.to);
- });
- state.from = vp.from;
- state.to = vp.to;
- }
-
- function onGutterClick(cm, line, gutter) {
- var state = cm.state.foldGutter;
- if (!state) return;
- var opts = state.options;
- if (gutter != opts.gutter) return;
- var folded = isFolded(cm, line);
- if (folded) folded.clear();
- else cm.foldCode(Pos(line, 0), opts.rangeFinder);
- }
-
- function onChange(cm) {
- var state = cm.state.foldGutter;
- if (!state) return;
- var opts = state.options;
- state.from = state.to = 0;
- clearTimeout(state.changeUpdate);
- state.changeUpdate = setTimeout(function() {
- updateInViewport(cm);
- }, opts.foldOnChangeTimeSpan || 600);
- }
-
- function onViewportChange(cm) {
- var state = cm.state.foldGutter;
- if (!state) return;
- var opts = state.options;
- clearTimeout(state.changeUpdate);
- state.changeUpdate = setTimeout(function() {
- var vp = cm.getViewport();
- if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
- updateInViewport(cm);
- } else {
- cm.operation(function() {
- if (vp.from < state.from) {
- updateFoldInfo(cm, vp.from, state.from);
- state.from = vp.from;
- }
- if (vp.to > state.to) {
- updateFoldInfo(cm, state.to, vp.to);
- state.to = vp.to;
- }
- });
- }
- }, opts.updateViewportTimeSpan || 400);
- }
-
- function onFold(cm, from) {
- var state = cm.state.foldGutter;
- if (!state) return;
- var line = from.line;
- if (line >= state.from && line < state.to)
- updateFoldInfo(cm, line, line + 1);
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
-
- function lineIndent(cm, lineNo) {
- var text = cm.getLine(lineNo)
- var spaceTo = text.search(/\S/)
- if (spaceTo == -1 || /\bcomment\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1))))
- return -1
- return CodeMirror.countColumn(text, null, cm.getOption("tabSize"))
- }
- CodeMirror.registerHelper("fold", "indent", function(cm, start) {
- var myIndent = lineIndent(cm, start.line)
- if (myIndent < 0) return
- var lastLineInFold = null
- for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) {
- var indent = lineIndent(cm, i)
- if (indent == -1) {} else if (indent > myIndent) {
- lastLineInFold = i;
- } else {
- break;
- }
- }
- if (lastLineInFold) return {
- from: CodeMirror.Pos(start.line, cm.getLine(start.line).length),
- to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length)
- };
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.registerHelper("fold", "markdown", function(cm, start) {
- var maxDepth = 100;
-
- function isHeader(lineNo) {
- var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0));
- return tokentype && /\bheader\b/.test(tokentype);
- }
-
- function headerLevel(lineNo, line, nextLine) {
- var match = line && line.match(/^#+/);
- if (match && isHeader(lineNo)) return match[0].length;
- match = nextLine && nextLine.match(/^[=\-]+\s*$/);
- if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2;
- return maxDepth;
- }
- var firstLine = cm.getLine(start.line),
- nextLine = cm.getLine(start.line + 1);
- var level = headerLevel(start.line, firstLine, nextLine);
- if (level === maxDepth) return undefined;
- var lastLineNo = cm.lastLine();
- var end = start.line,
- nextNextLine = cm.getLine(end + 2);
- while (end < lastLineNo) {
- if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break;
- ++end;
- nextLine = nextNextLine;
- nextNextLine = cm.getLine(end + 2);
- }
- return {
- from: CodeMirror.Pos(start.line, firstLine.length),
- to: CodeMirror.Pos(end, cm.getLine(end).length)
- };
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var Pos = CodeMirror.Pos;
-
- function cmp(a, b) {
- return a.line - b.line || a.ch - b.ch;
- }
- var nameStartChar = "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";
- var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
- var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g");
-
- function Iter(cm, line, ch, range) {
- this.line = line;
- this.ch = ch;
- this.cm = cm;
- this.text = cm.getLine(line);
- this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine();
- this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine();
- }
-
- function tagAt(iter, ch) {
- var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch));
- return type && /\btag\b/.test(type);
- }
-
- function nextLine(iter) {
- if (iter.line >= iter.max) return;
- iter.ch = 0;
- iter.text = iter.cm.getLine(++iter.line);
- return true;
- }
-
- function prevLine(iter) {
- if (iter.line <= iter.min) return;
- iter.text = iter.cm.getLine(--iter.line);
- iter.ch = iter.text.length;
- return true;
- }
-
- function toTagEnd(iter) {
- for (;;) {
- var gt = iter.text.indexOf(">", iter.ch);
- if (gt == -1) {
- if (nextLine(iter)) continue;
- else return;
- }
- if (!tagAt(iter, gt + 1)) {
- iter.ch = gt + 1;
- continue;
- }
- var lastSlash = iter.text.lastIndexOf("/", gt);
- var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt));
- iter.ch = gt + 1;
- return selfClose ? "selfClose" : "regular";
- }
- }
-
- function toTagStart(iter) {
- for (;;) {
- var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1;
- if (lt == -1) {
- if (prevLine(iter)) continue;
- else return;
- }
- if (!tagAt(iter, lt + 1)) {
- iter.ch = lt;
- continue;
- }
- xmlTagStart.lastIndex = lt;
- iter.ch = lt;
- var match = xmlTagStart.exec(iter.text);
- if (match && match.index == lt) return match;
- }
- }
-
- function toNextTag(iter) {
- for (;;) {
- xmlTagStart.lastIndex = iter.ch;
- var found = xmlTagStart.exec(iter.text);
- if (!found) {
- if (nextLine(iter)) continue;
- else return;
- }
- if (!tagAt(iter, found.index + 1)) {
- iter.ch = found.index + 1;
- continue;
- }
- iter.ch = found.index + found[0].length;
- return found;
- }
- }
-
- function toPrevTag(iter) {
- for (;;) {
- var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1;
- if (gt == -1) {
- if (prevLine(iter)) continue;
- else return;
- }
- if (!tagAt(iter, gt + 1)) {
- iter.ch = gt;
- continue;
- }
- var lastSlash = iter.text.lastIndexOf("/", gt);
- var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt));
- iter.ch = gt + 1;
- return selfClose ? "selfClose" : "regular";
- }
- }
-
- function findMatchingClose(iter, tag) {
- var stack = [];
- for (;;) {
- var next = toNextTag(iter),
- end, startLine = iter.line,
- startCh = iter.ch - (next ? next[0].length : 0);
- if (!next || !(end = toTagEnd(iter))) return;
- if (end == "selfClose") continue;
- if (next[1]) {
- for (var i = stack.length - 1; i >= 0; --i)
- if (stack[i] == next[2]) {
- stack.length = i;
- break;
- }
- if (i < 0 && (!tag || tag == next[2])) return {
- tag: next[2],
- from: Pos(startLine, startCh),
- to: Pos(iter.line, iter.ch)
- };
- } else {
- stack.push(next[2]);
- }
- }
- }
-
- function findMatchingOpen(iter, tag) {
- var stack = [];
- for (;;) {
- var prev = toPrevTag(iter);
- if (!prev) return;
- if (prev == "selfClose") {
- toTagStart(iter);
- continue;
- }
- var endLine = iter.line,
- endCh = iter.ch;
- var start = toTagStart(iter);
- if (!start) return;
- if (start[1]) {
- stack.push(start[2]);
- } else {
- for (var i = stack.length - 1; i >= 0; --i)
- if (stack[i] == start[2]) {
- stack.length = i;
- break;
- }
- if (i < 0 && (!tag || tag == start[2])) return {
- tag: start[2],
- from: Pos(iter.line, iter.ch),
- to: Pos(endLine, endCh)
- };
- }
- }
- }
- CodeMirror.registerHelper("fold", "xml", function(cm, start) {
- var iter = new Iter(cm, start.line, 0);
- for (;;) {
- var openTag = toNextTag(iter),
- end;
- if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return;
- if (!openTag[1] && end != "selfClose") {
- var startPos = Pos(iter.line, iter.ch);
- var endPos = findMatchingClose(iter, openTag[2]);
- return endPos && {
- from: startPos,
- to: endPos.from
- };
- }
- }
- });
- CodeMirror.findMatchingTag = function(cm, pos, range) {
- var iter = new Iter(cm, pos.line, pos.ch, range);
- if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return;
- var end = toTagEnd(iter),
- to = end && Pos(iter.line, iter.ch);
- var start = end && toTagStart(iter);
- if (!end || !start || cmp(iter, pos) > 0) return;
- var here = {
- from: Pos(iter.line, iter.ch),
- to: to,
- tag: start[2]
- };
- if (end == "selfClose") return {
- open: here,
- close: null,
- at: "open"
- };
- if (start[1]) {
- return {
- open: findMatchingOpen(iter, start[2]),
- close: here,
- at: "close"
- };
- } else {
- iter = new Iter(cm, to.line, to.ch, range);
- return {
- open: here,
- close: findMatchingClose(iter, start[2]),
- at: "open"
- };
- }
- };
- CodeMirror.findEnclosingTag = function(cm, pos, range, tag) {
- var iter = new Iter(cm, pos.line, pos.ch, range);
- for (;;) {
- var open = findMatchingOpen(iter, tag);
- if (!open) break;
- var forward = new Iter(cm, pos.line, pos.ch, range);
- var close = findMatchingClose(forward, open.tag);
- if (close) return {
- open: open,
- close: close
- };
- }
- };
- CodeMirror.scanForClosingTag = function(cm, pos, name, end) {
- var iter = new Iter(cm, pos.line, pos.ch, end ? {
- from: 0,
- to: end
- } : null);
- return findMatchingClose(iter, name);
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var WORD = /[\w$]+/,
- RANGE = 500;
- CodeMirror.registerHelper("hint", "anyword", function(editor, options) {
- var word = options && options.word || WORD;
- var range = options && options.range || RANGE;
- var cur = editor.getCursor(),
- curLine = editor.getLine(cur.line);
- var end = cur.ch,
- start = end;
- while (start && word.test(curLine.charAt(start - 1))) --start;
- var curWord = start != end && curLine.slice(start, end);
- var list = options && options.list || [],
- seen = {};
- var re = new RegExp(word.source, "g");
- for (var dir = -1; dir <= 1; dir += 2) {
- var line = cur.line,
- endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir;
- for (; line != endLine; line += dir) {
- var text = editor.getLine(line),
- m;
- while (m = re.exec(text)) {
- if (line == cur.line && m[0] === curWord) continue;
- if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) {
- seen[m[0]] = true;
- list.push(m[0]);
- }
- }
- }
- }
- return {
- list: list,
- from: CodeMirror.Pos(cur.line, start),
- to: CodeMirror.Pos(cur.line, end)
- };
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"), require("../../mode/css/css"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror", "../../mode/css/css"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var pseudoClasses = {
- link: 1,
- visited: 1,
- active: 1,
- hover: 1,
- focus: 1,
- "first-letter": 1,
- "first-line": 1,
- "first-child": 1,
- before: 1,
- after: 1,
- lang: 1
- };
- CodeMirror.registerHelper("hint", "css", function(cm) {
- var cur = cm.getCursor(),
- token = cm.getTokenAt(cur);
- var inner = CodeMirror.innerMode(cm.getMode(), token.state);
- if (inner.mode.name != "css") return;
- if (token.type == "keyword" && "!important".indexOf(token.string) == 0)
- return {
- list: ["!important"],
- from: CodeMirror.Pos(cur.line, token.start),
- to: CodeMirror.Pos(cur.line, token.end)
- };
- var start = token.start,
- end = cur.ch,
- word = token.string.slice(0, end - start);
- if (/[^\w$_-]/.test(word)) {
- word = "";
- start = end = cur.ch;
- }
- var spec = CodeMirror.resolveMode("text/css");
- var result = [];
-
- function add(keywords) {
- for (var name in keywords)
- if (!word || name.lastIndexOf(word, 0) == 0)
- result.push(name);
- }
- var st = inner.state.state;
- if (st == "pseudo" || token.type == "variable-3") {
- add(pseudoClasses);
- } else if (st == "block" || st == "maybeprop") {
- add(spec.propertyKeywords);
- } else if (st == "prop" || st == "parens" || st == "at" || st == "params") {
- add(spec.valueKeywords);
- add(spec.colorKeywords);
- } else if (st == "media" || st == "media_parens") {
- add(spec.mediaTypes);
- add(spec.mediaFeatures);
- }
- if (result.length) return {
- list: result,
- from: CodeMirror.Pos(cur.line, start),
- to: CodeMirror.Pos(cur.line, end)
- };
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"), require("./xml-hint"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror", "./xml-hint"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var langs = "ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" ");
- var targets = ["_blank", "_self", "_top", "_parent"];
- var charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"];
- var methods = ["get", "post", "put", "delete"];
- var encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"];
- var media = ["all", "screen", "print", "embossed", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "speech", "3d-glasses", "resolution [>][<][=] [X]", "device-aspect-ratio: X/Y", "orientation:portrait", "orientation:landscape", "device-height: [X]", "device-width: [X]"];
- var s = {
- attrs: {}
- };
- var data = {
- a: {
- attrs: {
- href: null,
- ping: null,
- type: null,
- media: media,
- target: targets,
- hreflang: langs
- }
- },
- abbr: s,
- acronym: s,
- address: s,
- applet: s,
- area: {
- attrs: {
- alt: null,
- coords: null,
- href: null,
- target: null,
- ping: null,
- media: media,
- hreflang: langs,
- type: null,
- shape: ["default", "rect", "circle", "poly"]
- }
- },
- article: s,
- aside: s,
- audio: {
- attrs: {
- src: null,
- mediagroup: null,
- crossorigin: ["anonymous", "use-credentials"],
- preload: ["none", "metadata", "auto"],
- autoplay: ["", "autoplay"],
- loop: ["", "loop"],
- controls: ["", "controls"]
- }
- },
- b: s,
- base: {
- attrs: {
- href: null,
- target: targets
- }
- },
- basefont: s,
- bdi: s,
- bdo: s,
- big: s,
- blockquote: {
- attrs: {
- cite: null
- }
- },
- body: s,
- br: s,
- button: {
- attrs: {
- form: null,
- formaction: null,
- name: null,
- value: null,
- autofocus: ["", "autofocus"],
- disabled: ["", "autofocus"],
- formenctype: encs,
- formmethod: methods,
- formnovalidate: ["", "novalidate"],
- formtarget: targets,
- type: ["submit", "reset", "button"]
- }
- },
- canvas: {
- attrs: {
- width: null,
- height: null
- }
- },
- caption: s,
- center: s,
- cite: s,
- code: s,
- col: {
- attrs: {
- span: null
- }
- },
- colgroup: {
- attrs: {
- span: null
- }
- },
- command: {
- attrs: {
- type: ["command", "checkbox", "radio"],
- label: null,
- icon: null,
- radiogroup: null,
- command: null,
- title: null,
- disabled: ["", "disabled"],
- checked: ["", "checked"]
- }
- },
- data: {
- attrs: {
- value: null
- }
- },
- datagrid: {
- attrs: {
- disabled: ["", "disabled"],
- multiple: ["", "multiple"]
- }
- },
- datalist: {
- attrs: {
- data: null
- }
- },
- dd: s,
- del: {
- attrs: {
- cite: null,
- datetime: null
- }
- },
- details: {
- attrs: {
- open: ["", "open"]
- }
- },
- dfn: s,
- dir: s,
- div: s,
- dl: s,
- dt: s,
- em: s,
- embed: {
- attrs: {
- src: null,
- type: null,
- width: null,
- height: null
- }
- },
- eventsource: {
- attrs: {
- src: null
- }
- },
- fieldset: {
- attrs: {
- disabled: ["", "disabled"],
- form: null,
- name: null
- }
- },
- figcaption: s,
- figure: s,
- font: s,
- footer: s,
- form: {
- attrs: {
- action: null,
- name: null,
- "accept-charset": charsets,
- autocomplete: ["on", "off"],
- enctype: encs,
- method: methods,
- novalidate: ["", "novalidate"],
- target: targets
- }
- },
- frame: s,
- frameset: s,
- h1: s,
- h2: s,
- h3: s,
- h4: s,
- h5: s,
- h6: s,
- head: {
- attrs: {},
- children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"]
- },
- header: s,
- hgroup: s,
- hr: s,
- html: {
- attrs: {
- manifest: null
- },
- children: ["head", "body"]
- },
- i: s,
- iframe: {
- attrs: {
- src: null,
- srcdoc: null,
- name: null,
- width: null,
- height: null,
- sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"],
- seamless: ["", "seamless"]
- }
- },
- img: {
- attrs: {
- alt: null,
- src: null,
- ismap: null,
- usemap: null,
- width: null,
- height: null,
- crossorigin: ["anonymous", "use-credentials"]
- }
- },
- input: {
- attrs: {
- alt: null,
- dirname: null,
- form: null,
- formaction: null,
- height: null,
- list: null,
- max: null,
- maxlength: null,
- min: null,
- name: null,
- pattern: null,
- placeholder: null,
- size: null,
- src: null,
- step: null,
- value: null,
- width: null,
- accept: ["audio/*", "video/*", "image/*"],
- autocomplete: ["on", "off"],
- autofocus: ["", "autofocus"],
- checked: ["", "checked"],
- disabled: ["", "disabled"],
- formenctype: encs,
- formmethod: methods,
- formnovalidate: ["", "novalidate"],
- formtarget: targets,
- multiple: ["", "multiple"],
- readonly: ["", "readonly"],
- required: ["", "required"],
- type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month", "week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio", "file", "submit", "image", "reset", "button"]
- }
- },
- ins: {
- attrs: {
- cite: null,
- datetime: null
- }
- },
- kbd: s,
- keygen: {
- attrs: {
- challenge: null,
- form: null,
- name: null,
- autofocus: ["", "autofocus"],
- disabled: ["", "disabled"],
- keytype: ["RSA"]
- }
- },
- label: {
- attrs: {
- "for": null,
- form: null
- }
- },
- legend: s,
- li: {
- attrs: {
- value: null
- }
- },
- link: {
- attrs: {
- href: null,
- type: null,
- hreflang: langs,
- media: media,
- sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"]
- }
- },
- map: {
- attrs: {
- name: null
- }
- },
- mark: s,
- menu: {
- attrs: {
- label: null,
- type: ["list", "context", "toolbar"]
- }
- },
- meta: {
- attrs: {
- content: null,
- charset: charsets,
- name: ["viewport", "application-name", "author", "description", "generator", "keywords"],
- "http-equiv": ["content-language", "content-type", "default-style", "refresh"]
- }
- },
- meter: {
- attrs: {
- value: null,
- min: null,
- low: null,
- high: null,
- max: null,
- optimum: null
- }
- },
- nav: s,
- noframes: s,
- noscript: s,
- object: {
- attrs: {
- data: null,
- type: null,
- name: null,
- usemap: null,
- form: null,
- width: null,
- height: null,
- typemustmatch: ["", "typemustmatch"]
- }
- },
- ol: {
- attrs: {
- reversed: ["", "reversed"],
- start: null,
- type: ["1", "a", "A", "i", "I"]
- }
- },
- optgroup: {
- attrs: {
- disabled: ["", "disabled"],
- label: null
- }
- },
- option: {
- attrs: {
- disabled: ["", "disabled"],
- label: null,
- selected: ["", "selected"],
- value: null
- }
- },
- output: {
- attrs: {
- "for": null,
- form: null,
- name: null
- }
- },
- p: s,
- param: {
- attrs: {
- name: null,
- value: null
- }
- },
- pre: s,
- progress: {
- attrs: {
- value: null,
- max: null
- }
- },
- q: {
- attrs: {
- cite: null
- }
- },
- rp: s,
- rt: s,
- ruby: s,
- s: s,
- samp: s,
- script: {
- attrs: {
- type: ["text/javascript"],
- src: null,
- async: ["", "async"],
- defer: ["", "defer"],
- charset: charsets
- }
- },
- section: s,
- select: {
- attrs: {
- form: null,
- name: null,
- size: null,
- autofocus: ["", "autofocus"],
- disabled: ["", "disabled"],
- multiple: ["", "multiple"]
- }
- },
- small: s,
- source: {
- attrs: {
- src: null,
- type: null,
- media: null
- }
- },
- span: s,
- strike: s,
- strong: s,
- style: {
- attrs: {
- type: ["text/css"],
- media: media,
- scoped: null
- }
- },
- sub: s,
- summary: s,
- sup: s,
- table: s,
- tbody: s,
- td: {
- attrs: {
- colspan: null,
- rowspan: null,
- headers: null
- }
- },
- textarea: {
- attrs: {
- dirname: null,
- form: null,
- maxlength: null,
- name: null,
- placeholder: null,
- rows: null,
- cols: null,
- autofocus: ["", "autofocus"],
- disabled: ["", "disabled"],
- readonly: ["", "readonly"],
- required: ["", "required"],
- wrap: ["soft", "hard"]
- }
- },
- tfoot: s,
- th: {
- attrs: {
- colspan: null,
- rowspan: null,
- headers: null,
- scope: ["row", "col", "rowgroup", "colgroup"]
- }
- },
- thead: s,
- time: {
- attrs: {
- datetime: null
- }
- },
- title: s,
- tr: s,
- track: {
- attrs: {
- src: null,
- label: null,
- "default": null,
- kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"],
- srclang: langs
- }
- },
- tt: s,
- u: s,
- ul: s,
- "var": s,
- video: {
- attrs: {
- src: null,
- poster: null,
- width: null,
- height: null,
- crossorigin: ["anonymous", "use-credentials"],
- preload: ["auto", "metadata", "none"],
- autoplay: ["", "autoplay"],
- mediagroup: ["movie"],
- muted: ["", "muted"],
- controls: ["", "controls"]
- }
- },
- wbr: s
- };
- var globalAttrs = {
- accesskey: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],
- "class": null,
- contenteditable: ["true", "false"],
- contextmenu: null,
- dir: ["ltr", "rtl", "auto"],
- draggable: ["true", "false", "auto"],
- dropzone: ["copy", "move", "link", "string:", "file:"],
- hidden: ["hidden"],
- id: null,
- inert: ["inert"],
- itemid: null,
- itemprop: null,
- itemref: null,
- itemscope: ["itemscope"],
- itemtype: null,
- lang: ["en", "es"],
- spellcheck: ["true", "false"],
- style: null,
- tabindex: ["1", "2", "3", "4", "5", "6", "7", "8", "9"],
- title: null,
- translate: ["yes", "no"],
- onclick: null,
- rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"]
- };
-
- function populate(obj) {
- for (var attr in globalAttrs)
- if (globalAttrs.hasOwnProperty(attr))
- obj.attrs[attr] = globalAttrs[attr];
- }
- populate(s);
- for (var tag in data)
- if (data.hasOwnProperty(tag) && data[tag] != s)
- populate(data[tag]);
- CodeMirror.htmlSchema = data;
-
- function htmlHint(cm, options) {
- var local = {
- schemaInfo: data
- };
- if (options)
- for (var opt in options) local[opt] = options[opt];
- return CodeMirror.hint.xml(cm, local);
- }
- CodeMirror.registerHelper("hint", "html", htmlHint);
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- var Pos = CodeMirror.Pos;
-
- function forEach(arr, f) {
- for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
- }
-
- function arrayContains(arr, item) {
- if (!Array.prototype.indexOf) {
- var i = arr.length;
- while (i--) {
- if (arr[i] === item) {
- return true;
- }
- }
- return false;
- }
- return arr.indexOf(item) != -1;
- }
-
- function scriptHint(editor, keywords, getToken, options) {
- var cur = editor.getCursor(),
- token = getToken(editor, cur);
- if (/\b(?:string|comment)\b/.test(token.type)) return;
- token.state = CodeMirror.innerMode(editor.getMode(), token.state).state;
- if (!/^[\w$_]*$/.test(token.string)) {
- token = {
- start: cur.ch,
- end: cur.ch,
- string: "",
- state: token.state,
- type: token.string == "." ? "property" : null
- };
- } else if (token.end > cur.ch) {
- token.end = cur.ch;
- token.string = token.string.slice(0, cur.ch - token.start);
- }
- var tprop = token;
- while (tprop.type == "property") {
- tprop = getToken(editor, Pos(cur.line, tprop.start));
- if (tprop.string != ".") return;
- tprop = getToken(editor, Pos(cur.line, tprop.start));
- if (!context) var context = [];
- context.push(tprop);
- }
- return {
- list: getCompletions(token, context, keywords, options),
- from: Pos(cur.line, token.start),
- to: Pos(cur.line, token.end)
- };
- }
-
- function javascriptHint(editor, options) {
- return scriptHint(editor, javascriptKeywords, function(e, cur) {
- return e.getTokenAt(cur);
- }, options);
- };
- CodeMirror.registerHelper("hint", "javascript", javascriptHint);
-
- function getCoffeeScriptToken(editor, cur) {
- var token = editor.getTokenAt(cur);
- if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
- token.end = token.start;
- token.string = '.';
- token.type = "property";
- } else if (/^\.[\w$_]*$/.test(token.string)) {
- token.type = "property";
- token.start++;
- token.string = token.string.replace(/\./, '');
- }
- return token;
- }
-
- function coffeescriptHint(editor, options) {
- return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);
- }
- CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint);
- var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + "toUpperCase toLowerCase split concat match replace search").split(" ");
- var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + "lastIndexOf every some filter forEach map reduce reduceRight ").split(" ");
- var funcProps = "prototype apply call bind".split(" ");
- var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " + "if in instanceof new null return switch throw true try typeof var void while with").split(" ");
- var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" ");
-
- function forAllProps(obj, callback) {
- if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {
- for (var name in obj) callback(name)
- } else {
- for (var o = obj; o; o = Object.getPrototypeOf(o))
- Object.getOwnPropertyNames(o).forEach(callback)
- }
- }
-
- function getCompletions(token, context, keywords, options) {
- var found = [],
- start = token.string,
- global = options && options.globalScope || window;
-
- function maybeAdd(str) {
- if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str);
- }
-
- function gatherCompletions(obj) {
- if (typeof obj == "string") forEach(stringProps, maybeAdd);
- else if (obj instanceof Array) forEach(arrayProps, maybeAdd);
- else if (obj instanceof Function) forEach(funcProps, maybeAdd);
- forAllProps(obj, maybeAdd)
- }
- if (context && context.length) {
- var obj = context.pop(),
- base;
- if (obj.type && obj.type.indexOf("variable") === 0) {
- if (options && options.additionalContext)
- base = options.additionalContext[obj.string];
- if (!options || options.useGlobalScope !== false)
- base = base || global[obj.string];
- } else if (obj.type == "string") {
- base = "";
- } else if (obj.type == "atom") {
- base = 1;
- } else if (obj.type == "function") {
- if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && (typeof global.jQuery == 'function'))
- base = global.jQuery();
- else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))
- base = global._();
- }
- while (base != null && context.length)
- base = base[context.pop().string];
- if (base != null) gatherCompletions(base);
- } else {
- for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
- for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);
- if (!options || options.useGlobalScope !== false)
- gatherCompletions(global);
- forEach(keywords, maybeAdd);
- }
- return found;
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var HINT_ELEMENT_CLASS = "CodeMirror-hint";
- var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active";
- CodeMirror.showHint = function(cm, getHints, options) {
- if (!getHints) return cm.showHint(options);
- if (options && options.async) getHints.async = true;
- var newOpts = {
- hint: getHints
- };
- if (options)
- for (var prop in options) newOpts[prop] = options[prop];
- return cm.showHint(newOpts);
- };
- CodeMirror.defineExtension("showHint", function(options) {
- options = parseOptions(this, this.getCursor("start"), options);
- var selections = this.listSelections()
- if (selections.length > 1) return;
- if (this.somethingSelected()) {
- if (!options.hint.supportsSelection) return;
- for (var i = 0; i < selections.length; i++)
- if (selections[i].head.line != selections[i].anchor.line) return;
- }
- if (this.state.completionActive) this.state.completionActive.close();
- var completion = this.state.completionActive = new Completion(this, options);
- if (!completion.options.hint) return;
- CodeMirror.signal(this, "startCompletion", this);
- completion.update(true);
- });
-
- function Completion(cm, options) {
- this.cm = cm;
- this.options = options;
- this.widget = null;
- this.debounce = 0;
- this.tick = 0;
- this.startPos = this.cm.getCursor("start");
- this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;
- var self = this;
- cm.on("cursorActivity", this.activityFunc = function() {
- self.cursorActivity();
- });
- }
- var requestAnimationFrame = window.requestAnimationFrame || function(fn) {
- return setTimeout(fn, 1000 / 60);
- };
- var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;
- Completion.prototype = {
- close: function() {
- if (!this.active()) return;
- this.cm.state.completionActive = null;
- this.tick = null;
- this.cm.off("cursorActivity", this.activityFunc);
- if (this.widget && this.data) CodeMirror.signal(this.data, "close");
- if (this.widget) this.widget.close();
- CodeMirror.signal(this.cm, "endCompletion", this.cm);
- },
- active: function() {
- return this.cm.state.completionActive == this;
- },
- pick: function(data, i) {
- var completion = data.list[i];
- if (completion.hint) completion.hint(this.cm, data, completion);
- else this.cm.replaceRange(getText(completion), completion.from || data.from, completion.to || data.to, "complete");
- CodeMirror.signal(data, "pick", completion);
- this.close();
- },
- cursorActivity: function() {
- if (this.debounce) {
- cancelAnimationFrame(this.debounce);
- this.debounce = 0;
- }
- var pos = this.cm.getCursor(),
- line = this.cm.getLine(pos.line);
- if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || pos.ch < this.startPos.ch || this.cm.somethingSelected() || (pos.ch && this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {
- this.close();
- } else {
- var self = this;
- this.debounce = requestAnimationFrame(function() {
- self.update();
- });
- if (this.widget) this.widget.disable();
- }
- },
- update: function(first) {
- if (this.tick == null) return
- var self = this,
- myTick = ++this.tick
- fetchHints(this.options.hint, this.cm, this.options, function(data) {
- if (self.tick == myTick) self.finishUpdate(data, first)
- })
- },
- finishUpdate: function(data, first) {
- if (this.data) CodeMirror.signal(this.data, "update");
- var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle);
- if (this.widget) this.widget.close();
- this.data = data;
- if (data && data.list.length) {
- if (picked && data.list.length == 1) {
- this.pick(data, 0);
- } else {
- this.widget = new Widget(this, data);
- CodeMirror.signal(data, "shown");
- }
- }
- }
- };
-
- function parseOptions(cm, pos, options) {
- var editor = cm.options.hintOptions;
- var out = {};
- for (var prop in defaultOptions) out[prop] = defaultOptions[prop];
- if (editor)
- for (var prop in editor)
- if (editor[prop] !== undefined) out[prop] = editor[prop];
- if (options)
- for (var prop in options)
- if (options[prop] !== undefined) out[prop] = options[prop];
- if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos)
- return out;
- }
-
- function getText(completion) {
- if (typeof completion == "string") return completion;
- else return completion.text;
- }
-
- function buildKeyMap(completion, handle) {
- var baseMap = {
- Up: function() {
- handle.moveFocus(-1);
- },
- Down: function() {
- handle.moveFocus(1);
- },
- PageUp: function() {
- handle.moveFocus(-handle.menuSize() + 1, true);
- },
- PageDown: function() {
- handle.moveFocus(handle.menuSize() - 1, true);
- },
- Home: function() {
- handle.setFocus(0);
- },
- End: function() {
- handle.setFocus(handle.length - 1);
- },
- Enter: handle.pick,
- Tab: handle.pick,
- Esc: handle.close
- };
- var custom = completion.options.customKeys;
- var ourMap = custom ? {} : baseMap;
-
- function addBinding(key, val) {
- var bound;
- if (typeof val != "string")
- bound = function(cm) {
- return val(cm, handle);
- };
- else if (baseMap.hasOwnProperty(val))
- bound = baseMap[val];
- else
- bound = val;
- ourMap[key] = bound;
- }
- if (custom)
- for (var key in custom)
- if (custom.hasOwnProperty(key))
- addBinding(key, custom[key]);
- var extra = completion.options.extraKeys;
- if (extra)
- for (var key in extra)
- if (extra.hasOwnProperty(key))
- addBinding(key, extra[key]);
- return ourMap;
- }
-
- function getHintElement(hintsElement, el) {
- while (el && el != hintsElement) {
- if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el;
- el = el.parentNode;
- }
- }
-
- function Widget(completion, data) {
- this.completion = completion;
- this.data = data;
- this.picked = false;
- var widget = this,
- cm = completion.cm;
- var hints = this.hints = document.createElement("ul");
- hints.className = "CodeMirror-hints";
- this.selectedHint = data.selectedHint || 0;
- var completions = data.list;
- for (var i = 0; i < completions.length; ++i) {
- var elt = hints.appendChild(document.createElement("li")),
- cur = completions[i];
- var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS);
- if (cur.className != null) className = cur.className + " " + className;
- elt.className = className;
- if (cur.render) cur.render(elt, data, cur);
- else elt.appendChild(document.createTextNode(cur.displayText || getText(cur)));
- elt.hintId = i;
- }
- var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null);
- var left = pos.left,
- top = pos.bottom,
- below = true;
- hints.style.left = left + "px";
- hints.style.top = top + "px";
- var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
- var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
- (completion.options.container || document.body).appendChild(hints);
- var box = hints.getBoundingClientRect(),
- overlapY = box.bottom - winH;
- var scrolls = hints.scrollHeight > hints.clientHeight + 1
- var startScroll = cm.getScrollInfo();
- if (overlapY > 0) {
- var height = box.bottom - box.top,
- curTop = pos.top - (pos.bottom - box.top);
- if (curTop - height > 0) {
- hints.style.top = (top = pos.top - height) + "px";
- below = false;
- } else if (height > winH) {
- hints.style.height = (winH - 5) + "px";
- hints.style.top = (top = pos.bottom - box.top) + "px";
- var cursor = cm.getCursor();
- if (data.from.ch != cursor.ch) {
- pos = cm.cursorCoords(cursor);
- hints.style.left = (left = pos.left) + "px";
- box = hints.getBoundingClientRect();
- }
- }
- }
- var overlapX = box.right - winW;
- if (overlapX > 0) {
- if (box.right - box.left > winW) {
- hints.style.width = (winW - 5) + "px";
- overlapX -= (box.right - box.left) - winW;
- }
- hints.style.left = (left = pos.left - overlapX) + "px";
- }
- if (scrolls)
- for (var node = hints.firstChild; node; node = node.nextSibling)
- node.style.paddingRight = cm.display.nativeBarWidth + "px"
- cm.addKeyMap(this.keyMap = buildKeyMap(completion, {
- moveFocus: function(n, avoidWrap) {
- widget.changeActive(widget.selectedHint + n, avoidWrap);
- },
- setFocus: function(n) {
- widget.changeActive(n);
- },
- menuSize: function() {
- return widget.screenAmount();
- },
- length: completions.length,
- close: function() {
- completion.close();
- },
- pick: function() {
- widget.pick();
- },
- data: data
- }));
- if (completion.options.closeOnUnfocus) {
- var closingOnBlur;
- cm.on("blur", this.onBlur = function() {
- closingOnBlur = setTimeout(function() {
- completion.close();
- }, 100);
- });
- cm.on("focus", this.onFocus = function() {
- clearTimeout(closingOnBlur);
- });
- }
- cm.on("scroll", this.onScroll = function() {
- var curScroll = cm.getScrollInfo(),
- editor = cm.getWrapperElement().getBoundingClientRect();
- var newTop = top + startScroll.top - curScroll.top;
- var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop);
- if (!below) point += hints.offsetHeight;
- if (point <= editor.top || point >= editor.bottom) return completion.close();
- hints.style.top = newTop + "px";
- hints.style.left = (left + startScroll.left - curScroll.left) + "px";
- });
- CodeMirror.on(hints, "dblclick", function(e) {
- var t = getHintElement(hints, e.target || e.srcElement);
- if (t && t.hintId != null) {
- widget.changeActive(t.hintId);
- widget.pick();
- }
- });
- CodeMirror.on(hints, "click", function(e) {
- var t = getHintElement(hints, e.target || e.srcElement);
- if (t && t.hintId != null) {
- widget.changeActive(t.hintId);
- if (completion.options.completeOnSingleClick) widget.pick();
- }
- });
- CodeMirror.on(hints, "mousedown", function() {
- setTimeout(function() {
- cm.focus();
- }, 20);
- });
- CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]);
- return true;
- }
- Widget.prototype = {
- close: function() {
- if (this.completion.widget != this) return;
- this.completion.widget = null;
- this.hints.parentNode.removeChild(this.hints);
- this.completion.cm.removeKeyMap(this.keyMap);
- var cm = this.completion.cm;
- if (this.completion.options.closeOnUnfocus) {
- cm.off("blur", this.onBlur);
- cm.off("focus", this.onFocus);
- }
- cm.off("scroll", this.onScroll);
- },
- disable: function() {
- this.completion.cm.removeKeyMap(this.keyMap);
- var widget = this;
- this.keyMap = {
- Enter: function() {
- widget.picked = true;
- }
- };
- this.completion.cm.addKeyMap(this.keyMap);
- },
- pick: function() {
- this.completion.pick(this.data, this.selectedHint);
- },
- changeActive: function(i, avoidWrap) {
- if (i >= this.data.list.length)
- i = avoidWrap ? this.data.list.length - 1 : 0;
- else if (i < 0)
- i = avoidWrap ? 0 : this.data.list.length - 1;
- if (this.selectedHint == i) return;
- var node = this.hints.childNodes[this.selectedHint];
- node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, "");
- node = this.hints.childNodes[this.selectedHint = i];
- node.className += " " + ACTIVE_HINT_ELEMENT_CLASS;
- if (node.offsetTop < this.hints.scrollTop)
- this.hints.scrollTop = node.offsetTop - 3;
- else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)
- this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3;
- CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node);
- },
- screenAmount: function() {
- return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;
- }
- };
-
- function applicableHelpers(cm, helpers) {
- if (!cm.somethingSelected()) return helpers
- var result = []
- for (var i = 0; i < helpers.length; i++)
- if (helpers[i].supportsSelection) result.push(helpers[i])
- return result
- }
-
- function fetchHints(hint, cm, options, callback) {
- if (hint.async) {
- hint(cm, callback, options)
- } else {
- var result = hint(cm, options)
- if (result && result.then) result.then(callback)
- else callback(result)
- }
- }
-
- function resolveAutoHints(cm, pos) {
- var helpers = cm.getHelpers(pos, "hint"),
- words
- if (helpers.length) {
- var resolved = function(cm, callback, options) {
- var app = applicableHelpers(cm, helpers);
-
- function run(i) {
- if (i == app.length) return callback(null)
- fetchHints(app[i], cm, options, function(result) {
- if (result && result.list.length > 0) callback(result)
- else run(i + 1)
- })
- }
- run(0)
- }
- resolved.async = true
- resolved.supportsSelection = true
- return resolved
- } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) {
- return function(cm) {
- return CodeMirror.hint.fromList(cm, {
- words: words
- })
- }
- } else if (CodeMirror.hint.anyword) {
- return function(cm, options) {
- return CodeMirror.hint.anyword(cm, options)
- }
- } else {
- return function() {}
- }
- }
- CodeMirror.registerHelper("hint", "auto", {
- resolve: resolveAutoHints
- });
- CodeMirror.registerHelper("hint", "fromList", function(cm, options) {
- var cur = cm.getCursor(),
- token = cm.getTokenAt(cur);
- var to = CodeMirror.Pos(cur.line, token.end);
- if (token.string && /\w/.test(token.string[token.string.length - 1])) {
- var term = token.string,
- from = CodeMirror.Pos(cur.line, token.start);
- } else {
- var term = "",
- from = to;
- }
- var found = [];
- for (var i = 0; i < options.words.length; i++) {
- var word = options.words[i];
- if (word.slice(0, term.length) == term)
- found.push(word);
- }
- if (found.length) return {
- list: found,
- from: from,
- to: to
- };
- });
- CodeMirror.commands.autocomplete = CodeMirror.showHint;
- var defaultOptions = {
- hint: CodeMirror.hint.auto,
- completeSingle: true,
- alignWithWord: true,
- closeCharacters: /[\s()\[\]{};:>,]/,
- closeOnUnfocus: true,
- completeOnSingleClick: true,
- container: null,
- customKeys: null,
- extraKeys: null
- };
- CodeMirror.defineOption("hintOptions", null);
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"), require("../../mode/sql/sql"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror", "../../mode/sql/sql"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var tables;
- var defaultTable;
- var keywords;
- var identifierQuote;
- var CONS = {
- QUERY_DIV: ";",
- ALIAS_KEYWORD: "AS"
- };
- var Pos = CodeMirror.Pos,
- cmpPos = CodeMirror.cmpPos;
-
- function isArray(val) {
- return Object.prototype.toString.call(val) == "[object Array]"
- }
-
- function getKeywords(editor) {
- var mode = editor.doc.modeOption;
- if (mode === "sql") mode = "text/x-sql";
- return CodeMirror.resolveMode(mode).keywords;
- }
-
- function getIdentifierQuote(editor) {
- var mode = editor.doc.modeOption;
- if (mode === "sql") mode = "text/x-sql";
- return CodeMirror.resolveMode(mode).identifierQuote || "`";
- }
-
- function getText(item) {
- return typeof item == "string" ? item : item.text;
- }
-
- function wrapTable(name, value) {
- if (isArray(value)) value = {
- columns: value
- }
- if (!value.text) value.text = name
- return value
- }
-
- function parseTables(input) {
- var result = {}
- if (isArray(input)) {
- for (var i = input.length - 1; i >= 0; i--) {
- var item = input[i]
- result[getText(item).toUpperCase()] = wrapTable(getText(item), item)
- }
- } else if (input) {
- for (var name in input)
- result[name.toUpperCase()] = wrapTable(name, input[name])
- }
- return result
- }
-
- function getTable(name) {
- return tables[name.toUpperCase()]
- }
-
- function shallowClone(object) {
- var result = {};
- for (var key in object)
- if (object.hasOwnProperty(key))
- result[key] = object[key];
- return result;
- }
-
- function match(string, word) {
- var len = string.length;
- var sub = getText(word).substr(0, len);
- return string.toUpperCase() === sub.toUpperCase();
- }
-
- function addMatches(result, search, wordlist, formatter) {
- if (isArray(wordlist)) {
- for (var i = 0; i < wordlist.length; i++)
- if (match(search, wordlist[i])) result.push(formatter(wordlist[i]))
- } else {
- for (var word in wordlist)
- if (wordlist.hasOwnProperty(word)) {
- var val = wordlist[word]
- if (!val || val === true)
- val = word
- else
- val = val.displayText ? {
- text: val.text,
- displayText: val.displayText
- } : val.text
- if (match(search, val)) result.push(formatter(val))
- }
- }
- }
-
- function cleanName(name) {
- if (name.charAt(0) == ".") {
- name = name.substr(1);
- }
- var nameParts = name.split(identifierQuote + identifierQuote);
- for (var i = 0; i < nameParts.length; i++)
- nameParts[i] = nameParts[i].replace(new RegExp(identifierQuote, "g"), "");
- return nameParts.join(identifierQuote);
- }
-
- function insertIdentifierQuotes(name) {
- var nameParts = getText(name).split(".");
- for (var i = 0; i < nameParts.length; i++)
- nameParts[i] = identifierQuote +
- nameParts[i].replace(new RegExp(identifierQuote, "g"), identifierQuote + identifierQuote) +
- identifierQuote;
- var escaped = nameParts.join(".");
- if (typeof name == "string") return escaped;
- name = shallowClone(name);
- name.text = escaped;
- return name;
- }
-
- function nameCompletion(cur, token, result, editor) {
- var useIdentifierQuotes = false;
- var nameParts = [];
- var start = token.start;
- var cont = true;
- while (cont) {
- cont = (token.string.charAt(0) == ".");
- useIdentifierQuotes = useIdentifierQuotes || (token.string.charAt(0) == identifierQuote);
- start = token.start;
- nameParts.unshift(cleanName(token.string));
- token = editor.getTokenAt(Pos(cur.line, token.start));
- if (token.string == ".") {
- cont = true;
- token = editor.getTokenAt(Pos(cur.line, token.start));
- }
- }
- var string = nameParts.join(".");
- addMatches(result, string, tables, function(w) {
- return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;
- });
- addMatches(result, string, defaultTable, function(w) {
- return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;
- });
- string = nameParts.pop();
- var table = nameParts.join(".");
- var alias = false;
- var aliasTable = table;
- if (!getTable(table)) {
- var oldTable = table;
- table = findTableByAlias(table, editor);
- if (table !== oldTable) alias = true;
- }
- var columns = getTable(table);
- if (columns && columns.columns)
- columns = columns.columns;
- if (columns) {
- addMatches(result, string, columns, function(w) {
- var tableInsert = table;
- if (alias == true) tableInsert = aliasTable;
- if (typeof w == "string") {
- w = tableInsert + "." + w;
- } else {
- w = shallowClone(w);
- w.text = tableInsert + "." + w.text;
- }
- return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;
- });
- }
- return start;
- }
-
- function eachWord(lineText, f) {
- var words = lineText.split(/\s+/)
- for (var i = 0; i < words.length; i++)
- if (words[i]) f(words[i].replace(/[,;]/g, ''))
- }
-
- function findTableByAlias(alias, editor) {
- var doc = editor.doc;
- var fullQuery = doc.getValue();
- var aliasUpperCase = alias.toUpperCase();
- var previousWord = "";
- var table = "";
- var separator = [];
- var validRange = {
- start: Pos(0, 0),
- end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length)
- };
- var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV);
- while (indexOfSeparator != -1) {
- separator.push(doc.posFromIndex(indexOfSeparator));
- indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator + 1);
- }
- separator.unshift(Pos(0, 0));
- separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length));
- var prevItem = null;
- var current = editor.getCursor()
- for (var i = 0; i < separator.length; i++) {
- if ((prevItem == null || cmpPos(current, prevItem) > 0) && cmpPos(current, separator[i]) <= 0) {
- validRange = {
- start: prevItem,
- end: separator[i]
- };
- break;
- }
- prevItem = separator[i];
- }
- var query = doc.getRange(validRange.start, validRange.end, false);
- for (var i = 0; i < query.length; i++) {
- var lineText = query[i];
- eachWord(lineText, function(word) {
- var wordUpperCase = word.toUpperCase();
- if (wordUpperCase === aliasUpperCase && getTable(previousWord))
- table = previousWord;
- if (wordUpperCase !== CONS.ALIAS_KEYWORD)
- previousWord = word;
- });
- if (table) break;
- }
- return table;
- }
- CodeMirror.registerHelper("hint", "sql", function(editor, options) {
- tables = parseTables(options && options.tables)
- var defaultTableName = options && options.defaultTable;
- var disableKeywords = options && options.disableKeywords;
- defaultTable = defaultTableName && getTable(defaultTableName);
- keywords = getKeywords(editor);
- identifierQuote = getIdentifierQuote(editor);
- if (defaultTableName && !defaultTable)
- defaultTable = findTableByAlias(defaultTableName, editor);
- defaultTable = defaultTable || [];
- if (defaultTable.columns)
- defaultTable = defaultTable.columns;
- var cur = editor.getCursor();
- var result = [];
- var token = editor.getTokenAt(cur),
- start, end, search;
- if (token.end > cur.ch) {
- token.end = cur.ch;
- token.string = token.string.slice(0, cur.ch - token.start);
- }
- if (token.string.match(/^[.`"\w@]\w*$/)) {
- search = token.string;
- start = token.start;
- end = token.end;
- } else {
- start = end = cur.ch;
- search = "";
- }
- if (search.charAt(0) == "." || search.charAt(0) == identifierQuote) {
- start = nameCompletion(cur, token, result, editor);
- } else {
- addMatches(result, search, tables, function(w) {
- return w;
- });
- addMatches(result, search, defaultTable, function(w) {
- return w;
- });
- if (!disableKeywords)
- addMatches(result, search, keywords, function(w) {
- return w.toUpperCase();
- });
- }
- return {
- list: result,
- from: Pos(cur.line, start),
- to: Pos(cur.line, end)
- };
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var Pos = CodeMirror.Pos;
-
- function getHints(cm, options) {
- var tags = options && options.schemaInfo;
- var quote = (options && options.quoteChar) || '"';
- if (!tags) return;
- var cur = cm.getCursor(),
- token = cm.getTokenAt(cur);
- if (token.end > cur.ch) {
- token.end = cur.ch;
- token.string = token.string.slice(0, cur.ch - token.start);
- }
- var inner = CodeMirror.innerMode(cm.getMode(), token.state);
- if (inner.mode.name != "xml") return;
- var result = [],
- replaceToken = false,
- prefix;
- var tag = /\btag\b/.test(token.type) && !/>$/.test(token.string);
- var tagName = tag && /^\w/.test(token.string),
- tagStart;
- if (tagName) {
- var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start);
- var tagType = /<\/$/.test(before) ? "close" : /<$/.test(before) ? "open" : null;
- if (tagType) tagStart = token.start - (tagType == "close" ? 2 : 1);
- } else if (tag && token.string == "<") {
- tagType = "open";
- } else if (tag && token.string == "") {
- tagType = "close";
- }
- if (!tag && !inner.state.tagName || tagType) {
- if (tagName)
- prefix = token.string;
- replaceToken = tagType;
- var cx = inner.state.context,
- curTag = cx && tags[cx.tagName];
- var childList = cx ? curTag && curTag.children : tags["!top"];
- if (childList && tagType != "close") {
- for (var i = 0; i < childList.length; ++i)
- if (!prefix || childList[i].lastIndexOf(prefix, 0) == 0)
- result.push("<" + childList[i]);
- } else if (tagType != "close") {
- for (var name in tags)
- if (tags.hasOwnProperty(name) && name != "!top" && name != "!attrs" && (!prefix || name.lastIndexOf(prefix, 0) == 0))
- result.push("<" + name);
- }
- if (cx && (!prefix || tagType == "close" && cx.tagName.lastIndexOf(prefix, 0) == 0))
- result.push("" + cx.tagName + ">");
- } else {
- var curTag = tags[inner.state.tagName],
- attrs = curTag && curTag.attrs;
- var globalAttrs = tags["!attrs"];
- if (!attrs && !globalAttrs) return;
- if (!attrs) {
- attrs = globalAttrs;
- } else if (globalAttrs) {
- var set = {};
- for (var nm in globalAttrs)
- if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm];
- for (var nm in attrs)
- if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm];
- attrs = set;
- }
- if (token.type == "string" || token.string == "=") {
- var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)), Pos(cur.line, token.type == "string" ? token.start : token.end));
- var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/),
- atValues;
- if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return;
- if (typeof atValues == 'function') atValues = atValues.call(this, cm);
- if (token.type == "string") {
- prefix = token.string;
- var n = 0;
- if (/['"]/.test(token.string.charAt(0))) {
- quote = token.string.charAt(0);
- prefix = token.string.slice(1);
- n++;
- }
- var len = token.string.length;
- if (/['"]/.test(token.string.charAt(len - 1))) {
- quote = token.string.charAt(len - 1);
- prefix = token.string.substr(n, len - 2);
- }
- replaceToken = true;
- }
- for (var i = 0; i < atValues.length; ++i)
- if (!prefix || atValues[i].lastIndexOf(prefix, 0) == 0)
- result.push(quote + atValues[i] + quote);
- } else {
- if (token.type == "attribute") {
- prefix = token.string;
- replaceToken = true;
- }
- for (var attr in attrs)
- if (attrs.hasOwnProperty(attr) && (!prefix || attr.lastIndexOf(prefix, 0) == 0))
- result.push(attr);
- }
- }
- return {
- list: result,
- from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur,
- to: replaceToken ? Pos(cur.line, token.end) : cur
- };
- }
- CodeMirror.registerHelper("hint", "xml", getHints);
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.registerHelper("lint", "coffeescript", function(text) {
- var found = [];
- if (!window.coffeelint) {
- if (window.console) {
- window.console.error("Error: window.coffeelint not defined, CodeMirror CoffeeScript linting cannot run.");
- }
- return found;
- }
- var parseError = function(err) {
- var loc = err.lineNumber;
- found.push({
- from: CodeMirror.Pos(loc - 1, 0),
- to: CodeMirror.Pos(loc, 0),
- severity: err.level,
- message: err.message
- });
- };
- try {
- var res = coffeelint.lint(text);
- for (var i = 0; i < res.length; i++) {
- parseError(res[i]);
- }
- } catch (e) {
- found.push({
- from: CodeMirror.Pos(e.location.first_line, 0),
- to: CodeMirror.Pos(e.location.last_line, e.location.last_column),
- severity: 'error',
- message: e.message
- });
- }
- return found;
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.registerHelper("lint", "css", function(text, options) {
- var found = [];
- if (!window.CSSLint) {
- if (window.console) {
- window.console.error("Error: window.CSSLint not defined, CodeMirror CSS linting cannot run.");
- }
- return found;
- }
- var results = CSSLint.verify(text, options),
- messages = results.messages,
- message = null;
- for (var i = 0; i < messages.length; i++) {
- message = messages[i];
- var startLine = message.line - 1,
- endLine = message.line - 1,
- startCol = message.col - 1,
- endCol = message.col;
- found.push({
- from: CodeMirror.Pos(startLine, startCol),
- to: CodeMirror.Pos(endLine, endCol),
- message: message.message,
- severity: message.type
- });
- }
- return found;
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"), require("htmlhint"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror", "htmlhint"], mod);
- else
- mod(CodeMirror, window.HTMLHint);
-})(function(CodeMirror, HTMLHint) {
- "use strict";
- var defaultRules = {
- "tagname-lowercase": true,
- "attr-lowercase": true,
- "attr-value-double-quotes": true,
- "doctype-first": false,
- "tag-pair": true,
- "spec-char-escape": true,
- "id-unique": true,
- "src-not-empty": true,
- "attr-no-duplication": true
- };
- CodeMirror.registerHelper("lint", "html", function(text, options) {
- var found = [];
- if (HTMLHint && !HTMLHint.verify) HTMLHint = HTMLHint.HTMLHint;
- if (!HTMLHint) HTMLHint = window.HTMLHint;
- if (!HTMLHint) {
- if (window.console) {
- window.console.error("Error: HTMLHint not found, not defined on window, or not available through define/require, CodeMirror HTML linting cannot run.");
- }
- return found;
- }
- var messages = HTMLHint.verify(text, options && options.rules || defaultRules);
- for (var i = 0; i < messages.length; i++) {
- var message = messages[i];
- var startLine = message.line - 1,
- endLine = message.line - 1,
- startCol = message.col - 1,
- endCol = message.col;
- found.push({
- from: CodeMirror.Pos(startLine, startCol),
- to: CodeMirror.Pos(endLine, endCol),
- message: message.message,
- severity: message.type
- });
- }
- return found;
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var bogus = ["Dangerous comment"];
- var warnings = [
- ["Expected '{'", "Statement body should be inside '{ }' braces."]
- ];
- var errors = ["Missing semicolon", "Extra comma", "Missing property name", "Unmatched ", " and instead saw", " is not defined", "Unclosed string", "Stopping, unable to continue"];
-
- function validator(text, options) {
- if (!window.JSHINT) {
- if (window.console) {
- window.console.error("Error: window.JSHINT not defined, CodeMirror JavaScript linting cannot run.");
- }
- return [];
- }
- JSHINT(text, options, options.globals);
- var errors = JSHINT.data().errors,
- result = [];
- if (errors) parseErrors(errors, result);
- return result;
- }
- CodeMirror.registerHelper("lint", "javascript", validator);
-
- function cleanup(error) {
- fixWith(error, warnings, "warning", true);
- fixWith(error, errors, "error");
- return isBogus(error) ? null : error;
- }
-
- function fixWith(error, fixes, severity, force) {
- var description, fix, find, replace, found;
- description = error.description;
- for (var i = 0; i < fixes.length; i++) {
- fix = fixes[i];
- find = (typeof fix === "string" ? fix : fix[0]);
- replace = (typeof fix === "string" ? null : fix[1]);
- found = description.indexOf(find) !== -1;
- if (force || found) {
- error.severity = severity;
- }
- if (found && replace) {
- error.description = replace;
- }
- }
- }
-
- function isBogus(error) {
- var description = error.description;
- for (var i = 0; i < bogus.length; i++) {
- if (description.indexOf(bogus[i]) !== -1) {
- return true;
- }
- }
- return false;
- }
-
- function parseErrors(errors, output) {
- for (var i = 0; i < errors.length; i++) {
- var error = errors[i];
- if (error) {
- var linetabpositions, index;
- linetabpositions = [];
- if (error.evidence) {
- var tabpositions = linetabpositions[error.line];
- if (!tabpositions) {
- var evidence = error.evidence;
- tabpositions = [];
- Array.prototype.forEach.call(evidence, function(item, index) {
- if (item === '\t') {
- tabpositions.push(index + 1);
- }
- });
- linetabpositions[error.line] = tabpositions;
- }
- if (tabpositions.length > 0) {
- var pos = error.character;
- tabpositions.forEach(function(tabposition) {
- if (pos > tabposition) pos -= 1;
- });
- error.character = pos;
- }
- }
- var start = error.character - 1,
- end = start + 1;
- if (error.evidence) {
- index = error.evidence.substring(start).search(/.\b/);
- if (index > -1) {
- end += index;
- }
- }
- error.description = error.reason;
- error.start = error.character;
- error.end = end;
- error = cleanup(error);
- if (error)
- output.push({
- message: error.description,
- severity: error.severity,
- from: CodeMirror.Pos(error.line - 1, start),
- to: CodeMirror.Pos(error.line - 1, end)
- });
- }
- }
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.registerHelper("lint", "json", function(text) {
- var found = [];
- if (!window.jsonlint) {
- if (window.console) {
- window.console.error("Error: window.jsonlint not defined, CodeMirror JSON linting cannot run.");
- }
- return found;
- }
- jsonlint.parseError = function(str, hash) {
- var loc = hash.loc;
- found.push({
- from: CodeMirror.Pos(loc.first_line - 1, loc.first_column),
- to: CodeMirror.Pos(loc.last_line - 1, loc.last_column),
- message: str
- });
- };
- try {
- jsonlint.parse(text);
- } catch (e) {}
- return found;
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var GUTTER_ID = "CodeMirror-lint-markers";
-
- function showTooltip(e, content) {
- var tt = document.createElement("div");
- tt.className = "CodeMirror-lint-tooltip";
- tt.appendChild(content.cloneNode(true));
- document.body.appendChild(tt);
-
- function position(e) {
- if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position);
- tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px";
- tt.style.left = (e.clientX + 5) + "px";
- }
- CodeMirror.on(document, "mousemove", position);
- position(e);
- if (tt.style.opacity != null) tt.style.opacity = 1;
- return tt;
- }
-
- function rm(elt) {
- if (elt.parentNode) elt.parentNode.removeChild(elt);
- }
-
- function hideTooltip(tt) {
- if (!tt.parentNode) return;
- if (tt.style.opacity == null) rm(tt);
- tt.style.opacity = 0;
- setTimeout(function() {
- rm(tt);
- }, 600);
- }
-
- function showTooltipFor(e, content, node) {
- var tooltip = showTooltip(e, content);
-
- function hide() {
- CodeMirror.off(node, "mouseout", hide);
- if (tooltip) {
- hideTooltip(tooltip);
- tooltip = null;
- }
- }
- var poll = setInterval(function() {
- if (tooltip)
- for (var n = node;; n = n.parentNode) {
- if (n && n.nodeType == 11) n = n.host;
- if (n == document.body) return;
- if (!n) {
- hide();
- break;
- }
- }
- if (!tooltip) return clearInterval(poll);
- }, 400);
- CodeMirror.on(node, "mouseout", hide);
- }
-
- function LintState(cm, options, hasGutter) {
- this.marked = [];
- this.options = options;
- this.timeout = null;
- this.hasGutter = hasGutter;
- this.onMouseOver = function(e) {
- onMouseOver(cm, e);
- };
- this.waitingFor = 0
- }
-
- function parseOptions(_cm, options) {
- if (options instanceof Function) return {
- getAnnotations: options
- };
- if (!options || options === true) options = {};
- return options;
- }
-
- function clearMarks(cm) {
- var state = cm.state.lint;
- if (state.hasGutter) cm.clearGutter(GUTTER_ID);
- for (var i = 0; i < state.marked.length; ++i)
- state.marked[i].clear();
- state.marked.length = 0;
- }
-
- function makeMarker(labels, severity, multiple, tooltips) {
- var marker = document.createElement("div"),
- inner = marker;
- marker.className = "CodeMirror-lint-marker-" + severity;
- if (multiple) {
- inner = marker.appendChild(document.createElement("div"));
- inner.className = "CodeMirror-lint-marker-multiple";
- }
- if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {
- showTooltipFor(e, labels, inner);
- });
- return marker;
- }
-
- function getMaxSeverity(a, b) {
- if (a == "error") return a;
- else return b;
- }
-
- function groupByLine(annotations) {
- var lines = [];
- for (var i = 0; i < annotations.length; ++i) {
- var ann = annotations[i],
- line = ann.from.line;
- (lines[line] || (lines[line] = [])).push(ann);
- }
- return lines;
- }
-
- function annotationTooltip(ann) {
- var severity = ann.severity;
- if (!severity) severity = "error";
- var tip = document.createElement("div");
- tip.className = "CodeMirror-lint-message-" + severity;
- if (typeof ann.messageHTML != 'undefined') {
- tip.innerHTML = ann.messageHTML;
- } else {
- tip.appendChild(document.createTextNode(ann.message));
- }
- return tip;
- }
-
- function lintAsync(cm, getAnnotations, passOptions) {
- var state = cm.state.lint
- var id = ++state.waitingFor
-
- function abort() {
- id = -1
- cm.off("change", abort)
- }
- cm.on("change", abort)
- getAnnotations(cm.getValue(), function(annotations, arg2) {
- cm.off("change", abort)
- if (state.waitingFor != id) return
- if (arg2 && annotations instanceof CodeMirror) annotations = arg2
- cm.operation(function() {
- updateLinting(cm, annotations)
- })
- }, passOptions, cm);
- }
-
- function startLinting(cm) {
- var state = cm.state.lint,
- options = state.options;
- var passOptions = options.options || options;
- var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint");
- if (!getAnnotations) return;
- if (options.async || getAnnotations.async) {
- lintAsync(cm, getAnnotations, passOptions)
- } else {
- var annotations = getAnnotations(cm.getValue(), passOptions, cm);
- if (!annotations) return;
- if (annotations.then) annotations.then(function(issues) {
- cm.operation(function() {
- updateLinting(cm, issues)
- })
- });
- else cm.operation(function() {
- updateLinting(cm, annotations)
- })
- }
- }
-
- function updateLinting(cm, annotationsNotSorted) {
- clearMarks(cm);
- var state = cm.state.lint,
- options = state.options;
- var annotations = groupByLine(annotationsNotSorted);
- for (var line = 0; line < annotations.length; ++line) {
- var anns = annotations[line];
- if (!anns) continue;
- var maxSeverity = null;
- var tipLabel = state.hasGutter && document.createDocumentFragment();
- for (var i = 0; i < anns.length; ++i) {
- var ann = anns[i];
- var severity = ann.severity;
- if (!severity) severity = "error";
- maxSeverity = getMaxSeverity(maxSeverity, severity);
- if (options.formatAnnotation) ann = options.formatAnnotation(ann);
- if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
- if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
- className: "CodeMirror-lint-mark-" + severity,
- __annotation: ann
- }));
- }
- if (state.hasGutter)
- cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1, state.options.tooltips));
- }
- if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);
- }
-
- function onChange(cm) {
- var state = cm.state.lint;
- if (!state) return;
- clearTimeout(state.timeout);
- state.timeout = setTimeout(function() {
- startLinting(cm);
- }, state.options.delay || 500);
- }
-
- function popupTooltips(annotations, e) {
- var target = e.target || e.srcElement;
- var tooltip = document.createDocumentFragment();
- for (var i = 0; i < annotations.length; i++) {
- var ann = annotations[i];
- tooltip.appendChild(annotationTooltip(ann));
- }
- showTooltipFor(e, tooltip, target);
- }
-
- function onMouseOver(cm, e) {
- var target = e.target || e.srcElement;
- if (!/\bCodeMirror-lint-mark-/.test(target.className)) return;
- var box = target.getBoundingClientRect(),
- x = (box.left + box.right) / 2,
- y = (box.top + box.bottom) / 2;
- var spans = cm.findMarksAt(cm.coordsChar({
- left: x,
- top: y
- }, "client"));
- var annotations = [];
- for (var i = 0; i < spans.length; ++i) {
- var ann = spans[i].__annotation;
- if (ann) annotations.push(ann);
- }
- if (annotations.length) popupTooltips(annotations, e);
- }
- CodeMirror.defineOption("lint", false, function(cm, val, old) {
- if (old && old != CodeMirror.Init) {
- clearMarks(cm);
- if (cm.state.lint.options.lintOnChange !== false)
- cm.off("change", onChange);
- CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver);
- clearTimeout(cm.state.lint.timeout);
- delete cm.state.lint;
- }
- if (val) {
- var gutters = cm.getOption("gutters"),
- hasLintGutter = false;
- for (var i = 0; i < gutters.length; ++i)
- if (gutters[i] == GUTTER_ID) hasLintGutter = true;
- var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);
- if (state.options.lintOnChange !== false)
- cm.on("change", onChange);
- if (state.options.tooltips != false && state.options.tooltips != "gutter")
- CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);
- startLinting(cm);
- }
- });
- CodeMirror.defineExtension("performLint", function() {
- if (this.state.lint) startLinting(this);
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.registerHelper("lint", "yaml", function(text) {
- var found = [];
- if (!window.jsyaml) {
- if (window.console) {
- window.console.error("Error: window.jsyaml not defined, CodeMirror YAML linting cannot run.");
- }
- return found;
- }
- try {
- jsyaml.load(text);
- } catch (e) {
- var loc = e.mark,
- from = loc ? CodeMirror.Pos(loc.line, loc.column) : CodeMirror.Pos(0, 0),
- to = from;
- found.push({
- from: from,
- to: to,
- message: e.message
- });
- }
- return found;
- });
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror", "diff_match_patch"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var Pos = CodeMirror.Pos;
- var svgNS = "http://www.w3.org/2000/svg";
-
- function DiffView(mv, type) {
- this.mv = mv;
- this.type = type;
- this.classes = type == "left" ? {
- chunk: "CodeMirror-merge-l-chunk",
- start: "CodeMirror-merge-l-chunk-start",
- end: "CodeMirror-merge-l-chunk-end",
- insert: "CodeMirror-merge-l-inserted",
- del: "CodeMirror-merge-l-deleted",
- connect: "CodeMirror-merge-l-connect"
- } : {
- chunk: "CodeMirror-merge-r-chunk",
- start: "CodeMirror-merge-r-chunk-start",
- end: "CodeMirror-merge-r-chunk-end",
- insert: "CodeMirror-merge-r-inserted",
- del: "CodeMirror-merge-r-deleted",
- connect: "CodeMirror-merge-r-connect"
- };
- }
- DiffView.prototype = {
- constructor: DiffView,
- init: function(pane, orig, options) {
- this.edit = this.mv.edit;;
- (this.edit.state.diffViews || (this.edit.state.diffViews = [])).push(this);
- this.orig = CodeMirror(pane, copyObj({
- value: orig,
- readOnly: !this.mv.options.allowEditingOriginals
- }, copyObj(options)));
- if (this.mv.options.connect == "align") {
- if (!this.edit.state.trackAlignable) this.edit.state.trackAlignable = new TrackAlignable(this.edit)
- this.orig.state.trackAlignable = new TrackAlignable(this.orig)
- }
- this.orig.state.diffViews = [this];
- var classLocation = options.chunkClassLocation || "background";
- if (Object.prototype.toString.call(classLocation) != "[object Array]") classLocation = [classLocation]
- this.classes.classLocation = classLocation
- this.diff = getDiff(asString(orig), asString(options.value), this.mv.options.ignoreWhitespace);
- this.chunks = getChunks(this.diff);
- this.diffOutOfDate = this.dealigned = false;
- this.needsScrollSync = null
- this.showDifferences = options.showDifferences !== false;
- },
- registerEvents: function(otherDv) {
- this.forceUpdate = registerUpdate(this);
- setScrollLock(this, true, false);
- registerScroll(this, otherDv);
- },
- setShowDifferences: function(val) {
- val = val !== false;
- if (val != this.showDifferences) {
- this.showDifferences = val;
- this.forceUpdate("full");
- }
- }
- };
-
- function ensureDiff(dv) {
- if (dv.diffOutOfDate) {
- dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue(), dv.mv.options.ignoreWhitespace);
- dv.chunks = getChunks(dv.diff);
- dv.diffOutOfDate = false;
- CodeMirror.signal(dv.edit, "updateDiff", dv.diff);
- }
- }
- var updating = false;
-
- function registerUpdate(dv) {
- var edit = {
- from: 0,
- to: 0,
- marked: []
- };
- var orig = {
- from: 0,
- to: 0,
- marked: []
- };
- var debounceChange, updatingFast = false;
-
- function update(mode) {
- updating = true;
- updatingFast = false;
- if (mode == "full") {
- if (dv.svg) clear(dv.svg);
- if (dv.copyButtons) clear(dv.copyButtons);
- clearMarks(dv.edit, edit.marked, dv.classes);
- clearMarks(dv.orig, orig.marked, dv.classes);
- edit.from = edit.to = orig.from = orig.to = 0;
- }
- ensureDiff(dv);
- if (dv.showDifferences) {
- updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes);
- updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes);
- }
- if (dv.mv.options.connect == "align")
- alignChunks(dv);
- makeConnections(dv);
- if (dv.needsScrollSync != null) syncScroll(dv, dv.needsScrollSync)
- updating = false;
- }
-
- function setDealign(fast) {
- if (updating) return;
- dv.dealigned = true;
- set(fast);
- }
-
- function set(fast) {
- if (updating || updatingFast) return;
- clearTimeout(debounceChange);
- if (fast === true) updatingFast = true;
- debounceChange = setTimeout(update, fast === true ? 20 : 250);
- }
-
- function change(_cm, change) {
- if (!dv.diffOutOfDate) {
- dv.diffOutOfDate = true;
- edit.from = edit.to = orig.from = orig.to = 0;
- }
- setDealign(change.text.length - 1 != change.to.line - change.from.line);
- }
-
- function swapDoc() {
- dv.diffOutOfDate = true;
- dv.dealigned = true;
- update("full");
- }
- dv.edit.on("change", change);
- dv.orig.on("change", change);
- dv.edit.on("swapDoc", swapDoc);
- dv.orig.on("swapDoc", swapDoc);
- if (dv.mv.options.connect == "align") {
- CodeMirror.on(dv.edit.state.trackAlignable, "realign", setDealign)
- CodeMirror.on(dv.orig.state.trackAlignable, "realign", setDealign)
- }
- dv.edit.on("viewportChange", function() {
- set(false);
- });
- dv.orig.on("viewportChange", function() {
- set(false);
- });
- update();
- return update;
- }
-
- function registerScroll(dv, otherDv) {
- dv.edit.on("scroll", function() {
- syncScroll(dv, true) && makeConnections(dv);
- });
- dv.orig.on("scroll", function() {
- syncScroll(dv, false) && makeConnections(dv);
- if (otherDv) syncScroll(otherDv, true) && makeConnections(otherDv);
- });
- }
-
- function syncScroll(dv, toOrig) {
- if (dv.diffOutOfDate) {
- if (dv.lockScroll && dv.needsScrollSync == null) dv.needsScrollSync = toOrig
- return false
- }
- dv.needsScrollSync = null
- if (!dv.lockScroll) return true;
- var editor, other, now = +new Date;
- if (toOrig) {
- editor = dv.edit;
- other = dv.orig;
- } else {
- editor = dv.orig;
- other = dv.edit;
- }
- if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 250 > now) return false;
- var sInfo = editor.getScrollInfo();
- if (dv.mv.options.connect == "align") {
- targetPos = sInfo.top;
- } else {
- var halfScreen = .5 * sInfo.clientHeight,
- midY = sInfo.top + halfScreen;
- var mid = editor.lineAtHeight(midY, "local");
- var around = chunkBoundariesAround(dv.chunks, mid, toOrig);
- var off = getOffsets(editor, toOrig ? around.edit : around.orig);
- var offOther = getOffsets(other, toOrig ? around.orig : around.edit);
- var ratio = (midY - off.top) / (off.bot - off.top);
- var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top);
- var botDist, mix;
- if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) {
- targetPos = targetPos * mix + sInfo.top * (1 - mix);
- } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) {
- var otherInfo = other.getScrollInfo();
- var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos;
- if (botDistOther > botDist && (mix = botDist / halfScreen) < 1)
- targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix);
- }
- }
- other.scrollTo(sInfo.left, targetPos);
- other.state.scrollSetAt = now;
- other.state.scrollSetBy = dv;
- return true;
- }
-
- function getOffsets(editor, around) {
- var bot = around.after;
- if (bot == null) bot = editor.lastLine() + 1;
- return {
- top: editor.heightAtLine(around.before || 0, "local"),
- bot: editor.heightAtLine(bot, "local")
- };
- }
-
- function setScrollLock(dv, val, action) {
- dv.lockScroll = val;
- if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv);
- dv.lockButton.innerHTML = val ? "\u21db\u21da" : "\u21db \u21da";
- }
-
- function removeClass(editor, line, classes) {
- var locs = classes.classLocation
- for (var i = 0; i < locs.length; i++) {
- editor.removeLineClass(line, locs[i], classes.chunk);
- editor.removeLineClass(line, locs[i], classes.start);
- editor.removeLineClass(line, locs[i], classes.end);
- }
- }
-
- function clearMarks(editor, arr, classes) {
- for (var i = 0; i < arr.length; ++i) {
- var mark = arr[i];
- if (mark instanceof CodeMirror.TextMarker)
- mark.clear();
- else if (mark.parent)
- removeClass(editor, mark, classes);
- }
- arr.length = 0;
- }
-
- function updateMarks(editor, diff, state, type, classes) {
- var vp = editor.getViewport();
- editor.operation(function() {
- if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
- clearMarks(editor, state.marked, classes);
- markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes);
- state.from = vp.from;
- state.to = vp.to;
- } else {
- if (vp.from < state.from) {
- markChanges(editor, diff, type, state.marked, vp.from, state.from, classes);
- state.from = vp.from;
- }
- if (vp.to > state.to) {
- markChanges(editor, diff, type, state.marked, state.to, vp.to, classes);
- state.to = vp.to;
- }
- }
- });
- }
-
- function addClass(editor, lineNr, classes, main, start, end) {
- var locs = classes.classLocation,
- line = editor.getLineHandle(lineNr);
- for (var i = 0; i < locs.length; i++) {
- if (main) editor.addLineClass(line, locs[i], classes.chunk);
- if (start) editor.addLineClass(line, locs[i], classes.start);
- if (end) editor.addLineClass(line, locs[i], classes.end);
- }
- return line;
- }
-
- function markChanges(editor, diff, type, marks, from, to, classes) {
- var pos = Pos(0, 0);
- var top = Pos(from, 0),
- bot = editor.clipPos(Pos(to - 1));
- var cls = type == DIFF_DELETE ? classes.del : classes.insert;
-
- function markChunk(start, end) {
- var bfrom = Math.max(from, start),
- bto = Math.min(to, end);
- for (var i = bfrom; i < bto; ++i)
- marks.push(addClass(editor, i, classes, true, i == start, i == end - 1));
- if (start == end && bfrom == end && bto == end) {
- if (bfrom)
- marks.push(addClass(editor, bfrom - 1, classes, false, false, true));
- else
- marks.push(addClass(editor, bfrom, classes, false, true, false));
- }
- }
- var chunkStart = 0,
- pending = false;
- for (var i = 0; i < diff.length; ++i) {
- var part = diff[i],
- tp = part[0],
- str = part[1];
- if (tp == DIFF_EQUAL) {
- var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1);
- moveOver(pos, str);
- var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0);
- if (cleanTo > cleanFrom) {
- if (pending) {
- markChunk(chunkStart, cleanFrom);
- pending = false
- }
- chunkStart = cleanTo;
- }
- } else {
- pending = true
- if (tp == type) {
- var end = moveOver(pos, str, true);
- var a = posMax(top, pos),
- b = posMin(bot, end);
- if (!posEq(a, b))
- marks.push(editor.markText(a, b, {
- className: cls
- }));
- pos = end;
- }
- }
- }
- if (pending) markChunk(chunkStart, pos.line + 1);
- }
-
- function makeConnections(dv) {
- if (!dv.showDifferences) return;
- if (dv.svg) {
- clear(dv.svg);
- var w = dv.gap.offsetWidth;
- attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight);
- }
- if (dv.copyButtons) clear(dv.copyButtons);
- var vpEdit = dv.edit.getViewport(),
- vpOrig = dv.orig.getViewport();
- var outerTop = dv.mv.wrap.getBoundingClientRect().top
- var sTopEdit = outerTop - dv.edit.getScrollerElement().getBoundingClientRect().top + dv.edit.getScrollInfo().top
- var sTopOrig = outerTop - dv.orig.getScrollerElement().getBoundingClientRect().top + dv.orig.getScrollInfo().top;
- for (var i = 0; i < dv.chunks.length; i++) {
- var ch = dv.chunks[i];
- if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from && ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from)
- drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w);
- }
- }
-
- function getMatchingOrigLine(editLine, chunks) {
- var editStart = 0,
- origStart = 0;
- for (var i = 0; i < chunks.length; i++) {
- var chunk = chunks[i];
- if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null;
- if (chunk.editFrom > editLine) break;
- editStart = chunk.editTo;
- origStart = chunk.origTo;
- }
- return origStart + (editLine - editStart);
- }
-
- function alignableFor(cm, chunks, isOrig) {
- var tracker = cm.state.trackAlignable
- var start = cm.firstLine(),
- trackI = 0
- var result = []
- for (var i = 0;; i++) {
- var chunk = chunks[i]
- var chunkStart = !chunk ? 1e9 : isOrig ? chunk.origFrom : chunk.editFrom
- for (; trackI < tracker.alignable.length; trackI += 2) {
- var n = tracker.alignable[trackI] + 1
- if (n <= start) continue
- if (n <= chunkStart) result.push(n)
- else break
- }
- if (!chunk) break
- result.push(start = isOrig ? chunk.origTo : chunk.editTo)
- }
- return result
- }
-
- function mergeAlignable(result, origAlignable, chunks, setIndex) {
- var rI = 0,
- origI = 0,
- chunkI = 0,
- diff = 0
- outer: for (;; rI++) {
- var nextR = result[rI],
- nextO = origAlignable[origI]
- if (!nextR && nextO == null) break
- var rLine = nextR ? nextR[0] : 1e9,
- oLine = nextO == null ? 1e9 : nextO
- while (chunkI < chunks.length) {
- var chunk = chunks[chunkI]
- if (chunk.origFrom <= oLine && chunk.origTo > oLine) {
- origI++
- rI--
- continue outer;
- }
- if (chunk.editTo > rLine) {
- if (chunk.editFrom <= rLine) continue outer;
- break
- }
- diff += (chunk.origTo - chunk.origFrom) - (chunk.editTo - chunk.editFrom)
- chunkI++
- }
- if (rLine == oLine - diff) {
- nextR[setIndex] = oLine
- origI++
- } else if (rLine < oLine - diff) {
- nextR[setIndex] = rLine + diff
- } else {
- var record = [oLine - diff, null, null]
- record[setIndex] = oLine
- result.splice(rI, 0, record)
- origI++
- }
- }
- }
-
- function findAlignedLines(dv, other) {
- var alignable = alignableFor(dv.edit, dv.chunks, false),
- result = []
- if (other)
- for (var i = 0, j = 0; i < other.chunks.length; i++) {
- var n = other.chunks[i].editTo
- while (j < alignable.length && alignable[j] < n) j++
- if (j == alignable.length || alignable[j] != n) alignable.splice(j++, 0, n)
- }
- for (var i = 0; i < alignable.length; i++)
- result.push([alignable[i], null, null])
- mergeAlignable(result, alignableFor(dv.orig, dv.chunks, true), dv.chunks, 1)
- if (other)
- mergeAlignable(result, alignableFor(other.orig, other.chunks, true), other.chunks, 2)
- return result
- }
-
- function alignChunks(dv, force) {
- if (!dv.dealigned && !force) return;
- if (!dv.orig.curOp) return dv.orig.operation(function() {
- alignChunks(dv, force);
- });
- dv.dealigned = false;
- var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left;
- if (other) {
- ensureDiff(other);
- other.dealigned = false;
- }
- var linesToAlign = findAlignedLines(dv, other);
- var aligners = dv.mv.aligners;
- for (var i = 0; i < aligners.length; i++)
- aligners[i].clear();
- aligners.length = 0;
- var cm = [dv.edit, dv.orig],
- scroll = [];
- if (other) cm.push(other.orig);
- for (var i = 0; i < cm.length; i++)
- scroll.push(cm[i].getScrollInfo().top);
- for (var ln = 0; ln < linesToAlign.length; ln++)
- alignLines(cm, linesToAlign[ln], aligners);
- for (var i = 0; i < cm.length; i++)
- cm[i].scrollTo(null, scroll[i]);
- }
-
- function alignLines(cm, lines, aligners) {
- var maxOffset = 0,
- offset = [];
- for (var i = 0; i < cm.length; i++)
- if (lines[i] != null) {
- var off = cm[i].heightAtLine(lines[i], "local");
- offset[i] = off;
- maxOffset = Math.max(maxOffset, off);
- }
- for (var i = 0; i < cm.length; i++)
- if (lines[i] != null) {
- var diff = maxOffset - offset[i];
- if (diff > 1)
- aligners.push(padAbove(cm[i], lines[i], diff));
- }
- }
-
- function padAbove(cm, line, size) {
- var above = true;
- if (line > cm.lastLine()) {
- line--;
- above = false;
- }
- var elt = document.createElement("div");
- elt.className = "CodeMirror-merge-spacer";
- elt.style.height = size + "px";
- elt.style.minWidth = "1px";
- return cm.addLineWidget(line, elt, {
- height: size,
- above: above,
- mergeSpacer: true,
- handleMouseEvents: true
- });
- }
-
- function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) {
- var flip = dv.type == "left";
- var top = dv.orig.heightAtLine(chunk.origFrom, "local", true) - sTopOrig;
- if (dv.svg) {
- var topLpx = top;
- var topRpx = dv.edit.heightAtLine(chunk.editFrom, "local", true) - sTopEdit;
- if (flip) {
- var tmp = topLpx;
- topLpx = topRpx;
- topRpx = tmp;
- }
- var botLpx = dv.orig.heightAtLine(chunk.origTo, "local", true) - sTopOrig;
- var botRpx = dv.edit.heightAtLine(chunk.editTo, "local", true) - sTopEdit;
- if (flip) {
- var tmp = botLpx;
- botLpx = botRpx;
- botRpx = tmp;
- }
- var curveTop = " C " + w / 2 + " " + topRpx + " " + w / 2 + " " + topLpx + " " + (w + 2) + " " + topLpx;
- var curveBot = " C " + w / 2 + " " + botLpx + " " + w / 2 + " " + botRpx + " -1 " + botRpx;
- attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")), "d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z", "class", dv.classes.connect);
- }
- if (dv.copyButtons) {
- var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc", "CodeMirror-merge-copy"));
- var editOriginals = dv.mv.options.allowEditingOriginals;
- copy.title = editOriginals ? "Push to left" : "Revert chunk";
- copy.chunk = chunk;
- copy.style.top = (chunk.origTo > chunk.origFrom ? top : dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit) + "px";
- if (editOriginals) {
- var topReverse = dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit;
- var copyReverse = dv.copyButtons.appendChild(elt("div", dv.type == "right" ? "\u21dd" : "\u21dc", "CodeMirror-merge-copy-reverse"));
- copyReverse.title = "Push to right";
- copyReverse.chunk = {
- editFrom: chunk.origFrom,
- editTo: chunk.origTo,
- origFrom: chunk.editFrom,
- origTo: chunk.editTo
- };
- copyReverse.style.top = topReverse + "px";
- dv.type == "right" ? copyReverse.style.left = "2px" : copyReverse.style.right = "2px";
- }
- }
- }
-
- function copyChunk(dv, to, from, chunk) {
- if (dv.diffOutOfDate) return;
- var origStart = chunk.origTo > from.lastLine() ? Pos(chunk.origFrom - 1) : Pos(chunk.origFrom, 0)
- var origEnd = Pos(chunk.origTo, 0)
- var editStart = chunk.editTo > to.lastLine() ? Pos(chunk.editFrom - 1) : Pos(chunk.editFrom, 0)
- var editEnd = Pos(chunk.editTo, 0)
- var handler = dv.mv.options.revertChunk
- if (handler)
- handler(dv.mv, from, origStart, origEnd, to, editStart, editEnd)
- else
- to.replaceRange(from.getRange(origStart, origEnd), editStart, editEnd)
- }
- var MergeView = CodeMirror.MergeView = function(node, options) {
- if (!(this instanceof MergeView)) return new MergeView(node, options);
- this.options = options;
- var origLeft = options.origLeft,
- origRight = options.origRight == null ? options.orig : options.origRight;
- var hasLeft = origLeft != null,
- hasRight = origRight != null;
- var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0);
- var wrap = [],
- left = this.left = null,
- right = this.right = null;
- var self = this;
- if (hasLeft) {
- left = this.left = new DiffView(this, "left");
- var leftPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-left");
- wrap.push(leftPane);
- wrap.push(buildGap(left));
- }
- var editPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-editor");
- wrap.push(editPane);
- if (hasRight) {
- right = this.right = new DiffView(this, "right");
- wrap.push(buildGap(right));
- var rightPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-right");
- wrap.push(rightPane);
- }
- (hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost";
- wrap.push(elt("div", null, null, "height: 0; clear: both;"));
- var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane"));
- this.edit = CodeMirror(editPane, copyObj(options));
- if (left) left.init(leftPane, origLeft, options);
- if (right) right.init(rightPane, origRight, options);
- if (options.collapseIdentical)
- this.editor().operation(function() {
- collapseIdenticalStretches(self, options.collapseIdentical);
- });
- if (options.connect == "align") {
- this.aligners = [];
- alignChunks(this.left || this.right, true);
- }
- if (left) left.registerEvents(right)
- if (right) right.registerEvents(left)
- var onResize = function() {
- if (left) makeConnections(left);
- if (right) makeConnections(right);
- };
- CodeMirror.on(window, "resize", onResize);
- var resizeInterval = setInterval(function() {
- for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {}
- if (!p) {
- clearInterval(resizeInterval);
- CodeMirror.off(window, "resize", onResize);
- }
- }, 5000);
- };
-
- function buildGap(dv) {
- var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock");
- lock.title = "Toggle locked scrolling";
- var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap");
- CodeMirror.on(lock, "click", function() {
- setScrollLock(dv, !dv.lockScroll);
- });
- var gapElts = [lockWrap];
- if (dv.mv.options.revertButtons !== false) {
- dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type);
- CodeMirror.on(dv.copyButtons, "click", function(e) {
- var node = e.target || e.srcElement;
- if (!node.chunk) return;
- if (node.className == "CodeMirror-merge-copy-reverse") {
- copyChunk(dv, dv.orig, dv.edit, node.chunk);
- return;
- }
- copyChunk(dv, dv.edit, dv.orig, node.chunk);
- });
- gapElts.unshift(dv.copyButtons);
- }
- if (dv.mv.options.connect != "align") {
- var svg = document.createElementNS && document.createElementNS(svgNS, "svg");
- if (svg && !svg.createSVGRect) svg = null;
- dv.svg = svg;
- if (svg) gapElts.push(svg);
- }
- return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap");
- }
- MergeView.prototype = {
- constructor: MergeView,
- editor: function() {
- return this.edit;
- },
- rightOriginal: function() {
- return this.right && this.right.orig;
- },
- leftOriginal: function() {
- return this.left && this.left.orig;
- },
- setShowDifferences: function(val) {
- if (this.right) this.right.setShowDifferences(val);
- if (this.left) this.left.setShowDifferences(val);
- },
- rightChunks: function() {
- if (this.right) {
- ensureDiff(this.right);
- return this.right.chunks;
- }
- },
- leftChunks: function() {
- if (this.left) {
- ensureDiff(this.left);
- return this.left.chunks;
- }
- }
- };
-
- function asString(obj) {
- if (typeof obj == "string") return obj;
- else return obj.getValue();
- }
- var dmp;
-
- function getDiff(a, b, ignoreWhitespace) {
- if (!dmp) dmp = new diff_match_patch();
- var diff = dmp.diff_main(a, b);
- for (var i = 0; i < diff.length; ++i) {
- var part = diff[i];
- if (ignoreWhitespace ? !/[^ \t]/.test(part[1]) : !part[1]) {
- diff.splice(i--, 1);
- } else if (i && diff[i - 1][0] == part[0]) {
- diff.splice(i--, 1);
- diff[i][1] += part[1];
- }
- }
- return diff;
- }
-
- function getChunks(diff) {
- var chunks = [];
- var startEdit = 0,
- startOrig = 0;
- var edit = Pos(0, 0),
- orig = Pos(0, 0);
- for (var i = 0; i < diff.length; ++i) {
- var part = diff[i],
- tp = part[0];
- if (tp == DIFF_EQUAL) {
- var startOff = !startOfLineClean(diff, i) || edit.line < startEdit || orig.line < startOrig ? 1 : 0;
- var cleanFromEdit = edit.line + startOff,
- cleanFromOrig = orig.line + startOff;
- moveOver(edit, part[1], null, orig);
- var endOff = endOfLineClean(diff, i) ? 1 : 0;
- var cleanToEdit = edit.line + endOff,
- cleanToOrig = orig.line + endOff;
- if (cleanToEdit > cleanFromEdit) {
- if (i) chunks.push({
- origFrom: startOrig,
- origTo: cleanFromOrig,
- editFrom: startEdit,
- editTo: cleanFromEdit
- });
- startEdit = cleanToEdit;
- startOrig = cleanToOrig;
- }
- } else {
- moveOver(tp == DIFF_INSERT ? edit : orig, part[1]);
- }
- }
- if (startEdit <= edit.line || startOrig <= orig.line)
- chunks.push({
- origFrom: startOrig,
- origTo: orig.line + 1,
- editFrom: startEdit,
- editTo: edit.line + 1
- });
- return chunks;
- }
-
- function endOfLineClean(diff, i) {
- if (i == diff.length - 1) return true;
- var next = diff[i + 1][1];
- if ((next.length == 1 && i < diff.length - 2) || next.charCodeAt(0) != 10) return false;
- if (i == diff.length - 2) return true;
- next = diff[i + 2][1];
- return (next.length > 1 || i == diff.length - 3) && next.charCodeAt(0) == 10;
- }
-
- function startOfLineClean(diff, i) {
- if (i == 0) return true;
- var last = diff[i - 1][1];
- if (last.charCodeAt(last.length - 1) != 10) return false;
- if (i == 1) return true;
- last = diff[i - 2][1];
- return last.charCodeAt(last.length - 1) == 10;
- }
-
- function chunkBoundariesAround(chunks, n, nInEdit) {
- var beforeE, afterE, beforeO, afterO;
- for (var i = 0; i < chunks.length; i++) {
- var chunk = chunks[i];
- var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom;
- var toLocal = nInEdit ? chunk.editTo : chunk.origTo;
- if (afterE == null) {
- if (fromLocal > n) {
- afterE = chunk.editFrom;
- afterO = chunk.origFrom;
- } else if (toLocal > n) {
- afterE = chunk.editTo;
- afterO = chunk.origTo;
- }
- }
- if (toLocal <= n) {
- beforeE = chunk.editTo;
- beforeO = chunk.origTo;
- } else if (fromLocal <= n) {
- beforeE = chunk.editFrom;
- beforeO = chunk.origFrom;
- }
- }
- return {
- edit: {
- before: beforeE,
- after: afterE
- },
- orig: {
- before: beforeO,
- after: afterO
- }
- };
- }
-
- function collapseSingle(cm, from, to) {
- cm.addLineClass(from, "wrap", "CodeMirror-merge-collapsed-line");
- var widget = document.createElement("span");
- widget.className = "CodeMirror-merge-collapsed-widget";
- widget.title = "Identical text collapsed. Click to expand.";
- var mark = cm.markText(Pos(from, 0), Pos(to - 1), {
- inclusiveLeft: true,
- inclusiveRight: true,
- replacedWith: widget,
- clearOnEnter: true
- });
-
- function clear() {
- mark.clear();
- cm.removeLineClass(from, "wrap", "CodeMirror-merge-collapsed-line");
- }
- if (mark.explicitlyCleared) clear();
- CodeMirror.on(widget, "click", clear);
- mark.on("clear", clear);
- CodeMirror.on(widget, "click", clear);
- return {
- mark: mark,
- clear: clear
- };
- }
-
- function collapseStretch(size, editors) {
- var marks = [];
-
- function clear() {
- for (var i = 0; i < marks.length; i++) marks[i].clear();
- }
- for (var i = 0; i < editors.length; i++) {
- var editor = editors[i];
- var mark = collapseSingle(editor.cm, editor.line, editor.line + size);
- marks.push(mark);
- mark.mark.on("clear", clear);
- }
- return marks[0].mark;
- }
-
- function unclearNearChunks(dv, margin, off, clear) {
- for (var i = 0; i < dv.chunks.length; i++) {
- var chunk = dv.chunks[i];
- for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) {
- var pos = l + off;
- if (pos >= 0 && pos < clear.length) clear[pos] = false;
- }
- }
- }
-
- function collapseIdenticalStretches(mv, margin) {
- if (typeof margin != "number") margin = 2;
- var clear = [],
- edit = mv.editor(),
- off = edit.firstLine();
- for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true);
- if (mv.left) unclearNearChunks(mv.left, margin, off, clear);
- if (mv.right) unclearNearChunks(mv.right, margin, off, clear);
- for (var i = 0; i < clear.length; i++) {
- if (clear[i]) {
- var line = i + off;
- for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {}
- if (size > margin) {
- var editors = [{
- line: line,
- cm: edit
- }];
- if (mv.left) editors.push({
- line: getMatchingOrigLine(line, mv.left.chunks),
- cm: mv.left.orig
- });
- if (mv.right) editors.push({
- line: getMatchingOrigLine(line, mv.right.chunks),
- cm: mv.right.orig
- });
- var mark = collapseStretch(size, editors);
- if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark);
- }
- }
- }
- }
-
- 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;
- }
-
- function clear(node) {
- for (var count = node.childNodes.length; count > 0; --count)
- node.removeChild(node.firstChild);
- }
-
- function attrs(elt) {
- for (var i = 1; i < arguments.length; i += 2)
- elt.setAttribute(arguments[i], arguments[i + 1]);
- }
-
- function copyObj(obj, target) {
- if (!target) target = {};
- for (var prop in obj)
- if (obj.hasOwnProperty(prop)) target[prop] = obj[prop];
- return target;
- }
-
- function moveOver(pos, str, copy, other) {
- var out = copy ? Pos(pos.line, pos.ch) : pos,
- at = 0;
- for (;;) {
- var nl = str.indexOf("\n", at);
- if (nl == -1) break;
- ++out.line;
- if (other) ++other.line;
- at = nl + 1;
- }
- out.ch = (at ? 0 : out.ch) + (str.length - at);
- if (other) other.ch = (at ? 0 : other.ch) + (str.length - at);
- return out;
- }
- var F_WIDGET = 1,
- F_WIDGET_BELOW = 2,
- F_MARKER = 4
-
- function TrackAlignable(cm) {
- this.cm = cm
- this.alignable = []
- this.height = cm.doc.height
- var self = this
- cm.on("markerAdded", function(_, marker) {
- if (!marker.collapsed) return
- var found = marker.find(1)
- if (found != null) self.set(found.line, F_MARKER)
- })
- cm.on("markerCleared", function(_, marker, _min, max) {
- if (max != null && marker.collapsed)
- self.check(max, F_MARKER, self.hasMarker)
- })
- cm.on("markerChanged", this.signal.bind(this))
- cm.on("lineWidgetAdded", function(_, widget, lineNo) {
- if (widget.mergeSpacer) return
- if (widget.above) self.set(lineNo - 1, F_WIDGET_BELOW)
- else self.set(lineNo, F_WIDGET)
- })
- cm.on("lineWidgetCleared", function(_, widget, lineNo) {
- if (widget.mergeSpacer) return
- if (widget.above) self.check(lineNo - 1, F_WIDGET_BELOW, self.hasWidgetBelow)
- else self.check(lineNo, F_WIDGET, self.hasWidget)
- })
- cm.on("lineWidgetChanged", this.signal.bind(this))
- cm.on("change", function(_, change) {
- var start = change.from.line,
- nBefore = change.to.line - change.from.line
- var nAfter = change.text.length - 1,
- end = start + nAfter
- if (nBefore || nAfter) self.map(start, nBefore, nAfter)
- self.check(end, F_MARKER, self.hasMarker)
- if (nBefore || nAfter) self.check(change.from.line, F_MARKER, self.hasMarker)
- })
- cm.on("viewportChange", function() {
- if (self.cm.doc.height != self.height) self.signal()
- })
- }
- TrackAlignable.prototype = {
- signal: function() {
- CodeMirror.signal(this, "realign")
- this.height = this.cm.doc.height
- },
- set: function(n, flags) {
- var pos = -1
- for (; pos < this.alignable.length; pos += 2) {
- var diff = this.alignable[pos] - n
- if (diff == 0) {
- if ((this.alignable[pos + 1] & flags) == flags) return
- this.alignable[pos + 1] |= flags
- this.signal()
- return
- }
- if (diff > 0) break
- }
- this.signal()
- this.alignable.splice(pos, 0, n, flags)
- },
- find: function(n) {
- for (var i = 0; i < this.alignable.length; i += 2)
- if (this.alignable[i] == n) return i
- return -1
- },
- check: function(n, flag, pred) {
- var found = this.find(n)
- if (found == -1 || !(this.alignable[found + 1] & flag)) return
- if (!pred.call(this, n)) {
- this.signal()
- var flags = this.alignable[found + 1] & ~flag
- if (flags) this.alignable[found + 1] = flags
- else this.alignable.splice(found, 2)
- }
- },
- hasMarker: function(n) {
- var handle = this.cm.getLineHandle(n)
- if (handle.markedSpans)
- for (var i = 0; i < handle.markedSpans.length; i++)
- if (handle.markedSpans[i].mark.collapsed && handle.markedSpans[i].to != null)
- return true
- return false
- },
- hasWidget: function(n) {
- var handle = this.cm.getLineHandle(n)
- if (handle.widgets)
- for (var i = 0; i < handle.widgets.length; i++)
- if (!handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true
- return false
- },
- hasWidgetBelow: function(n) {
- if (n == this.cm.lastLine()) return false
- var handle = this.cm.getLineHandle(n + 1)
- if (handle.widgets)
- for (var i = 0; i < handle.widgets.length; i++)
- if (handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true
- return false
- },
- map: function(from, nBefore, nAfter) {
- var diff = nAfter - nBefore,
- to = from + nBefore,
- widgetFrom = -1,
- widgetTo = -1
- for (var i = 0; i < this.alignable.length; i += 2) {
- var n = this.alignable[i]
- if (n == from && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetFrom = i
- if (n == to && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetTo = i
- if (n <= from) continue
- else if (n < to) this.alignable.splice(i--, 2)
- else this.alignable[i] += diff
- }
- if (widgetFrom > -1) {
- var flags = this.alignable[widgetFrom + 1]
- if (flags == F_WIDGET_BELOW) this.alignable.splice(widgetFrom, 2)
- else this.alignable[widgetFrom + 1] = flags & ~F_WIDGET_BELOW
- }
- if (widgetTo > -1 && nAfter)
- this.set(from + nAfter, F_WIDGET_BELOW)
- }
- }
-
- function posMin(a, b) {
- return (a.line - b.line || a.ch - b.ch) < 0 ? a : b;
- }
-
- function posMax(a, b) {
- return (a.line - b.line || a.ch - b.ch) > 0 ? a : b;
- }
-
- function posEq(a, b) {
- return a.line == b.line && a.ch == b.ch;
- }
-
- function findPrevDiff(chunks, start, isOrig) {
- for (var i = chunks.length - 1; i >= 0; i--) {
- var chunk = chunks[i];
- var to = (isOrig ? chunk.origTo : chunk.editTo) - 1;
- if (to < start) return to;
- }
- }
-
- function findNextDiff(chunks, start, isOrig) {
- for (var i = 0; i < chunks.length; i++) {
- var chunk = chunks[i];
- var from = (isOrig ? chunk.origFrom : chunk.editFrom);
- if (from > start) return from;
- }
- }
-
- function goNearbyDiff(cm, dir) {
- var found = null,
- views = cm.state.diffViews,
- line = cm.getCursor().line;
- if (views)
- for (var i = 0; i < views.length; i++) {
- var dv = views[i],
- isOrig = cm == dv.orig;
- ensureDiff(dv);
- var pos = dir < 0 ? findPrevDiff(dv.chunks, line, isOrig) : findNextDiff(dv.chunks, line, isOrig);
- if (pos != null && (found == null || (dir < 0 ? pos > found : pos < found)))
- found = pos;
- }
- if (found != null)
- cm.setCursor(found, 0);
- else
- return CodeMirror.Pass;
- }
- CodeMirror.commands.goNextDiff = function(cm) {
- return goNearbyDiff(cm, 1);
- };
- CodeMirror.commands.goPrevDiff = function(cm) {
- return goNearbyDiff(cm, -1);
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"), "cjs");
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], function(CM) {
- mod(CM, "amd");
- });
- else
- mod(CodeMirror, "plain");
-})(function(CodeMirror, env) {
- if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js";
- var loading = {};
-
- function splitCallback(cont, n) {
- var countDown = n;
- return function() {
- if (--countDown == 0) cont();
- };
- }
-
- function ensureDeps(mode, cont) {
- var deps = CodeMirror.modes[mode].dependencies;
- if (!deps) return cont();
- var missing = [];
- for (var i = 0; i < deps.length; ++i) {
- if (!CodeMirror.modes.hasOwnProperty(deps[i]))
- missing.push(deps[i]);
- }
- if (!missing.length) return cont();
- var split = splitCallback(cont, missing.length);
- for (var i = 0; i < missing.length; ++i)
- CodeMirror.requireMode(missing[i], split);
- }
- CodeMirror.requireMode = function(mode, cont) {
- if (typeof mode != "string") mode = mode.name;
- if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont);
- if (loading.hasOwnProperty(mode)) return loading[mode].push(cont);
- var file = CodeMirror.modeURL.replace(/%N/g, mode);
- if (env == "plain") {
- var script = document.createElement("script");
- script.src = file;
- var others = document.getElementsByTagName("script")[0];
- var list = loading[mode] = [cont];
- CodeMirror.on(script, "load", function() {
- ensureDeps(mode, function() {
- for (var i = 0; i < list.length; ++i) list[i]();
- });
- });
- others.parentNode.insertBefore(script, others);
- } else if (env == "cjs") {
- require(file);
- cont();
- } else if (env == "amd") {
- requirejs([file], cont);
- }
- };
- CodeMirror.autoLoadMode = function(instance, mode) {
- if (!CodeMirror.modes.hasOwnProperty(mode))
- CodeMirror.requireMode(mode, function() {
- instance.setOption("mode", instance.getOption("mode"));
- });
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.multiplexingMode = function(outer) {
- var others = Array.prototype.slice.call(arguments, 1);
-
- function indexOf(string, pattern, from, returnEnd) {
- if (typeof pattern == "string") {
- var found = string.indexOf(pattern, from);
- return returnEnd && found > -1 ? found + pattern.length : found;
- }
- var m = pattern.exec(from ? string.slice(from) : string);
- return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;
- }
- return {
- startState: function() {
- return {
- outer: CodeMirror.startState(outer),
- innerActive: null,
- inner: null
- };
- },
- copyState: function(state) {
- return {
- outer: CodeMirror.copyState(outer, state.outer),
- innerActive: state.innerActive,
- inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)
- };
- },
- token: function(stream, state) {
- if (!state.innerActive) {
- var cutOff = Infinity,
- oldContent = stream.string;
- for (var i = 0; i < others.length; ++i) {
- var other = others[i];
- var found = indexOf(oldContent, other.open, stream.pos);
- if (found == stream.pos) {
- if (!other.parseDelimiters) stream.match(other.open);
- state.innerActive = other;
- state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0);
- return other.delimStyle && (other.delimStyle + " " + other.delimStyle + "-open");
- } else if (found != -1 && found < cutOff) {
- cutOff = found;
- }
- }
- if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);
- var outerToken = outer.token(stream, state.outer);
- if (cutOff != Infinity) stream.string = oldContent;
- return outerToken;
- } else {
- var curInner = state.innerActive,
- oldContent = stream.string;
- if (!curInner.close && stream.sol()) {
- state.innerActive = state.inner = null;
- return this.token(stream, state);
- }
- var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;
- if (found == stream.pos && !curInner.parseDelimiters) {
- stream.match(curInner.close);
- state.innerActive = state.inner = null;
- return curInner.delimStyle && (curInner.delimStyle + " " + curInner.delimStyle + "-close");
- }
- if (found > -1) stream.string = oldContent.slice(0, found);
- var innerToken = curInner.mode.token(stream, state.inner);
- if (found > -1) stream.string = oldContent;
- if (found == stream.pos && curInner.parseDelimiters)
- state.innerActive = state.inner = null;
- if (curInner.innerStyle) {
- if (innerToken) innerToken = innerToken + " " + curInner.innerStyle;
- else innerToken = curInner.innerStyle;
- }
- return innerToken;
- }
- },
- indent: function(state, textAfter) {
- var mode = state.innerActive ? state.innerActive.mode : outer;
- if (!mode.indent) return CodeMirror.Pass;
- return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);
- },
- blankLine: function(state) {
- var mode = state.innerActive ? state.innerActive.mode : outer;
- if (mode.blankLine) {
- mode.blankLine(state.innerActive ? state.inner : state.outer);
- }
- if (!state.innerActive) {
- for (var i = 0; i < others.length; ++i) {
- var other = others[i];
- if (other.open === "\n") {
- state.innerActive = other;
- state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0);
- }
- }
- } else if (state.innerActive.close === "\n") {
- state.innerActive = state.inner = null;
- }
- },
- electricChars: outer.electricChars,
- innerMode: function(state) {
- return state.inner ? {
- state: state.inner,
- mode: state.innerActive.mode
- } : {
- state: state.outer,
- mode: outer
- };
- }
- };
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.overlayMode = function(base, overlay, combine) {
- return {
- startState: function() {
- return {
- base: CodeMirror.startState(base),
- overlay: CodeMirror.startState(overlay),
- basePos: 0,
- baseCur: null,
- overlayPos: 0,
- overlayCur: null,
- streamSeen: null
- };
- },
- copyState: function(state) {
- return {
- base: CodeMirror.copyState(base, state.base),
- overlay: CodeMirror.copyState(overlay, state.overlay),
- basePos: state.basePos,
- baseCur: null,
- overlayPos: state.overlayPos,
- overlayCur: null
- };
- },
- token: function(stream, state) {
- if (stream != state.streamSeen || Math.min(state.basePos, state.overlayPos) < stream.start) {
- state.streamSeen = stream;
- state.basePos = state.overlayPos = stream.start;
- }
- if (stream.start == state.basePos) {
- state.baseCur = base.token(stream, state.base);
- state.basePos = stream.pos;
- }
- if (stream.start == state.overlayPos) {
- stream.pos = stream.start;
- state.overlayCur = overlay.token(stream, state.overlay);
- state.overlayPos = stream.pos;
- }
- stream.pos = Math.min(state.basePos, state.overlayPos);
- if (state.overlayCur == null) return state.baseCur;
- else if (state.baseCur != null && state.overlay.combineTokens || combine && state.overlay.combineTokens == null)
- return state.baseCur + " " + state.overlayCur;
- else return state.overlayCur;
- },
- indent: base.indent && function(state, textAfter) {
- return base.indent(state.base, textAfter);
- },
- electricChars: base.electricChars,
- innerMode: function(state) {
- return {
- state: state.base,
- mode: base
- };
- },
- blankLine: function(state) {
- var baseToken, overlayToken;
- if (base.blankLine) baseToken = base.blankLine(state.base);
- if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay);
- return overlayToken == null ? baseToken : (combine && baseToken != null ? baseToken + " " + overlayToken : overlayToken);
- }
- };
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.defineSimpleMode = function(name, states) {
- CodeMirror.defineMode(name, function(config) {
- return CodeMirror.simpleMode(config, states);
- });
- };
- CodeMirror.simpleMode = function(config, states) {
- ensureState(states, "start");
- var states_ = {},
- meta = states.meta || {},
- hasIndentation = false;
- for (var state in states)
- if (state != meta && states.hasOwnProperty(state)) {
- var list = states_[state] = [],
- orig = states[state];
- for (var i = 0; i < orig.length; i++) {
- var data = orig[i];
- list.push(new Rule(data, states));
- if (data.indent || data.dedent) hasIndentation = true;
- }
- }
- var mode = {
- startState: function() {
- return {
- state: "start",
- pending: null,
- local: null,
- localState: null,
- indent: hasIndentation ? [] : null
- };
- },
- copyState: function(state) {
- var s = {
- state: state.state,
- pending: state.pending,
- local: state.local,
- localState: null,
- indent: state.indent && state.indent.slice(0)
- };
- if (state.localState)
- s.localState = CodeMirror.copyState(state.local.mode, state.localState);
- if (state.stack)
- s.stack = state.stack.slice(0);
- for (var pers = state.persistentStates; pers; pers = pers.next)
- s.persistentStates = {
- mode: pers.mode,
- spec: pers.spec,
- state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),
- next: s.persistentStates
- };
- return s;
- },
- token: tokenFunction(states_, config),
- innerMode: function(state) {
- return state.local && {
- mode: state.local.mode,
- state: state.localState
- };
- },
- indent: indentFunction(states_, meta)
- };
- if (meta)
- for (var prop in meta)
- if (meta.hasOwnProperty(prop))
- mode[prop] = meta[prop];
- return mode;
- };
-
- function ensureState(states, name) {
- if (!states.hasOwnProperty(name))
- throw new Error("Undefined state " + name + " in simple mode");
- }
-
- function toRegex(val, caret) {
- if (!val) return /(?:)/;
- var flags = "";
- if (val instanceof RegExp) {
- if (val.ignoreCase) flags = "i";
- val = val.source;
- } else {
- val = String(val);
- }
- return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags);
- }
-
- function asToken(val) {
- if (!val) return null;
- if (val.apply) return val
- if (typeof val == "string") return val.replace(/\./g, " ");
- var result = [];
- for (var i = 0; i < val.length; i++)
- result.push(val[i] && val[i].replace(/\./g, " "));
- return result;
- }
-
- function Rule(data, states) {
- if (data.next || data.push) ensureState(states, data.next || data.push);
- this.regex = toRegex(data.regex);
- this.token = asToken(data.token);
- this.data = data;
- }
-
- function tokenFunction(states, config) {
- return function(stream, state) {
- if (state.pending) {
- var pend = state.pending.shift();
- if (state.pending.length == 0) state.pending = null;
- stream.pos += pend.text.length;
- return pend.token;
- }
- if (state.local) {
- if (state.local.end && stream.match(state.local.end)) {
- var tok = state.local.endToken || null;
- state.local = state.localState = null;
- return tok;
- } else {
- var tok = state.local.mode.token(stream, state.localState),
- m;
- if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))
- stream.pos = stream.start + m.index;
- return tok;
- }
- }
- var curState = states[state.state];
- for (var i = 0; i < curState.length; i++) {
- var rule = curState[i];
- var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex);
- if (matches) {
- if (rule.data.next) {
- state.state = rule.data.next;
- } else if (rule.data.push) {
- (state.stack || (state.stack = [])).push(state.state);
- state.state = rule.data.push;
- } else if (rule.data.pop && state.stack && state.stack.length) {
- state.state = state.stack.pop();
- }
- if (rule.data.mode)
- enterLocalMode(config, state, rule.data.mode, rule.token);
- if (rule.data.indent)
- state.indent.push(stream.indentation() + config.indentUnit);
- if (rule.data.dedent)
- state.indent.pop();
- var token = rule.token
- if (token && token.apply) token = token(matches)
- if (matches.length > 2 && rule.token && typeof rule.token != "string") {
- state.pending = [];
- for (var j = 2; j < matches.length; j++)
- if (matches[j])
- state.pending.push({
- text: matches[j],
- token: rule.token[j - 1]
- });
- stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));
- return token[0];
- } else if (token && token.join) {
- return token[0];
- } else {
- return token;
- }
- }
- }
- stream.next();
- return null;
- };
- }
-
- function cmp(a, b) {
- if (a === b) return true;
- if (!a || typeof a != "object" || !b || typeof b != "object") return false;
- var props = 0;
- for (var prop in a)
- if (a.hasOwnProperty(prop)) {
- if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;
- props++;
- }
- for (var prop in b)
- if (b.hasOwnProperty(prop)) props--;
- return props == 0;
- }
-
- function enterLocalMode(config, state, spec, token) {
- var pers;
- if (spec.persistent)
- for (var p = state.persistentStates; p && !pers; p = p.next)
- if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;
- var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);
- var lState = pers ? pers.state : CodeMirror.startState(mode);
- if (spec.persistent && !pers)
- state.persistentStates = {
- mode: mode,
- spec: spec.spec,
- state: lState,
- next: state.persistentStates
- };
- state.localState = lState;
- state.local = {
- mode: mode,
- end: spec.end && toRegex(spec.end),
- endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),
- endToken: token && token.join ? token[token.length - 1] : token
- };
- }
-
- function indexOf(val, arr) {
- for (var i = 0; i < arr.length; i++)
- if (arr[i] === val) return true;
- }
-
- function indentFunction(states, meta) {
- return function(state, textAfter, line) {
- if (state.local && state.local.mode.indent)
- return state.local.mode.indent(state.localState, textAfter, line);
- if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)
- return CodeMirror.Pass;
- var pos = state.indent.length - 1,
- rules = states[state.state];
- scan: for (;;) {
- for (var i = 0; i < rules.length; i++) {
- var rule = rules[i];
- if (rule.data.dedent && rule.data.dedentIfLineStart !== false) {
- var m = rule.regex.exec(textAfter);
- if (m && m[0]) {
- pos--;
- if (rule.next || rule.push) rules = states[rule.next || rule.push];
- textAfter = textAfter.slice(m[0].length);
- continue scan;
- }
- }
- }
- break;
- }
- return pos < 0 ? 0 : state.indent[pos];
- };
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"), require("./runmode"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror", "./runmode"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var isBlock = /^(p|li|div|h\\d|pre|blockquote|td)$/;
-
- function textContent(node, out) {
- if (node.nodeType == 3) return out.push(node.nodeValue);
- for (var ch = node.firstChild; ch; ch = ch.nextSibling) {
- textContent(ch, out);
- if (isBlock.test(node.nodeType)) out.push("\n");
- }
- }
- CodeMirror.colorize = function(collection, defaultMode) {
- if (!collection) collection = document.body.getElementsByTagName("pre");
- for (var i = 0; i < collection.length; ++i) {
- var node = collection[i];
- var mode = node.getAttribute("data-lang") || defaultMode;
- if (!mode) continue;
- var text = [];
- textContent(node, text);
- node.innerHTML = "";
- CodeMirror.runMode(text.join(""), mode, node);
- node.className += " cm-s-default";
- }
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.runMode = function(string, modespec, callback, options) {
- var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);
- var ie = /MSIE \d/.test(navigator.userAgent);
- var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);
- if (callback.appendChild) {
- var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;
- var node = callback,
- col = 0;
- node.innerHTML = "";
- callback = function(text, style) {
- if (text == "\n") {
- node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text));
- col = 0;
- return;
- }
- var content = "";
- for (var pos = 0;;) {
- var idx = text.indexOf("\t", pos);
- if (idx == -1) {
- content += text.slice(pos);
- col += text.length - pos;
- break;
- } else {
- col += idx - pos;
- content += text.slice(pos, idx);
- var size = tabSize - col % tabSize;
- col += size;
- for (var i = 0; i < size; ++i) content += " ";
- pos = idx + 1;
- }
- }
- if (style) {
- var sp = node.appendChild(document.createElement("span"));
- sp.className = "cm-" + style.replace(/ +/g, " cm-");
- sp.appendChild(document.createTextNode(content));
- } else {
- node.appendChild(document.createTextNode(content));
- }
- };
- }
- var lines = CodeMirror.splitLines(string),
- state = (options && options.state) || CodeMirror.startState(mode);
- for (var i = 0, e = lines.length; i < e; ++i) {
- if (i) callback("\n");
- var stream = new CodeMirror.StringStream(lines[i]);
- if (!stream.string && mode.blankLine) mode.blankLine(state);
- while (!stream.eol()) {
- var style = mode.token(stream, state);
- callback(stream.current(), style, i, stream.start, state);
- stream.start = stream.pos;
- }
- }
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.defineExtension("annotateScrollbar", function(options) {
- if (typeof options == "string") options = {
- className: options
- };
- return new Annotation(this, options);
- });
- CodeMirror.defineOption("scrollButtonHeight", 0);
-
- function Annotation(cm, options) {
- this.cm = cm;
- this.options = options;
- this.buttonHeight = options.scrollButtonHeight || cm.getOption("scrollButtonHeight");
- this.annotations = [];
- this.doRedraw = this.doUpdate = null;
- this.div = cm.getWrapperElement().appendChild(document.createElement("div"));
- this.div.style.cssText = "position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none";
- this.computeScale();
-
- function scheduleRedraw(delay) {
- clearTimeout(self.doRedraw);
- self.doRedraw = setTimeout(function() {
- self.redraw();
- }, delay);
- }
- var self = this;
- cm.on("refresh", this.resizeHandler = function() {
- clearTimeout(self.doUpdate);
- self.doUpdate = setTimeout(function() {
- if (self.computeScale()) scheduleRedraw(20);
- }, 100);
- });
- cm.on("markerAdded", this.resizeHandler);
- cm.on("markerCleared", this.resizeHandler);
- if (options.listenForChanges !== false)
- cm.on("change", this.changeHandler = function() {
- scheduleRedraw(250);
- });
- }
- Annotation.prototype.computeScale = function() {
- var cm = this.cm;
- var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) /
- cm.getScrollerElement().scrollHeight
- if (hScale != this.hScale) {
- this.hScale = hScale;
- return true;
- }
- };
- Annotation.prototype.update = function(annotations) {
- this.annotations = annotations;
- this.redraw();
- };
- Annotation.prototype.redraw = function(compute) {
- if (compute !== false) this.computeScale();
- var cm = this.cm,
- hScale = this.hScale;
- var frag = document.createDocumentFragment(),
- anns = this.annotations;
- var wrapping = cm.getOption("lineWrapping");
- var singleLineH = wrapping && cm.defaultTextHeight() * 1.5;
- var curLine = null,
- curLineObj = null;
-
- function getY(pos, top) {
- if (curLine != pos.line) {
- curLine = pos.line;
- curLineObj = cm.getLineHandle(curLine);
- }
- if ((curLineObj.widgets && curLineObj.widgets.length) || (wrapping && curLineObj.height > singleLineH))
- return cm.charCoords(pos, "local")[top ? "top" : "bottom"];
- var topY = cm.heightAtLine(curLineObj, "local");
- return topY + (top ? 0 : curLineObj.height);
- }
- var lastLine = cm.lastLine()
- if (cm.display.barWidth)
- for (var i = 0, nextTop; i < anns.length; i++) {
- var ann = anns[i];
- if (ann.to.line > lastLine) continue;
- var top = nextTop || getY(ann.from, true) * hScale;
- var bottom = getY(ann.to, false) * hScale;
- while (i < anns.length - 1) {
- if (anns[i + 1].to.line > lastLine) break;
- nextTop = getY(anns[i + 1].from, true) * hScale;
- if (nextTop > bottom + .9) break;
- ann = anns[++i];
- bottom = getY(ann.to, false) * hScale;
- }
- if (bottom == top) continue;
- var height = Math.max(bottom - top, 3);
- var elt = frag.appendChild(document.createElement("div"));
- elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: " +
- (top + this.buttonHeight) + "px; height: " + height + "px";
- elt.className = this.options.className;
- if (ann.id) {
- elt.setAttribute("annotation-id", ann.id);
- }
- }
- this.div.textContent = "";
- this.div.appendChild(frag);
- };
- Annotation.prototype.clear = function() {
- this.cm.off("refresh", this.resizeHandler);
- this.cm.off("markerAdded", this.resizeHandler);
- this.cm.off("markerCleared", this.resizeHandler);
- if (this.changeHandler) this.cm.off("change", this.changeHandler);
- this.div.parentNode.removeChild(this.div);
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.defineOption("scrollPastEnd", false, function(cm, val, old) {
- if (old && old != CodeMirror.Init) {
- cm.off("change", onChange);
- cm.off("refresh", updateBottomMargin);
- cm.display.lineSpace.parentNode.style.paddingBottom = "";
- cm.state.scrollPastEndPadding = null;
- }
- if (val) {
- cm.on("change", onChange);
- cm.on("refresh", updateBottomMargin);
- updateBottomMargin(cm);
- }
- });
-
- function onChange(cm, change) {
- if (CodeMirror.changeEnd(change).line == cm.lastLine())
- updateBottomMargin(cm);
- }
-
- function updateBottomMargin(cm) {
- var padding = "";
- if (cm.lineCount() > 1) {
- var totalH = cm.display.scroller.clientHeight - 30,
- lastLineH = cm.getLineHandle(cm.lastLine()).height;
- padding = (totalH - lastLineH) + "px";
- }
- if (cm.state.scrollPastEndPadding != padding) {
- cm.state.scrollPastEndPadding = padding;
- cm.display.lineSpace.parentNode.style.paddingBottom = padding;
- cm.off("refresh", updateBottomMargin);
- cm.setSize();
- cm.on("refresh", updateBottomMargin);
- }
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
-
- function Bar(cls, orientation, scroll) {
- this.orientation = orientation;
- this.scroll = scroll;
- this.screen = this.total = this.size = 1;
- this.pos = 0;
- this.node = document.createElement("div");
- this.node.className = cls + "-" + orientation;
- this.inner = this.node.appendChild(document.createElement("div"));
- var self = this;
- CodeMirror.on(this.inner, "mousedown", function(e) {
- if (e.which != 1) return;
- CodeMirror.e_preventDefault(e);
- var axis = self.orientation == "horizontal" ? "pageX" : "pageY";
- var start = e[axis],
- startpos = self.pos;
-
- function done() {
- CodeMirror.off(document, "mousemove", move);
- CodeMirror.off(document, "mouseup", done);
- }
-
- function move(e) {
- if (e.which != 1) return done();
- self.moveTo(startpos + (e[axis] - start) * (self.total / self.size));
- }
- CodeMirror.on(document, "mousemove", move);
- CodeMirror.on(document, "mouseup", done);
- });
- CodeMirror.on(this.node, "click", function(e) {
- CodeMirror.e_preventDefault(e);
- var innerBox = self.inner.getBoundingClientRect(),
- where;
- if (self.orientation == "horizontal")
- where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0;
- else
- where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0;
- self.moveTo(self.pos + where * self.screen);
- });
-
- function onWheel(e) {
- var moved = CodeMirror.wheelEventPixels(e)[self.orientation == "horizontal" ? "x" : "y"];
- var oldPos = self.pos;
- self.moveTo(self.pos + moved);
- if (self.pos != oldPos) CodeMirror.e_preventDefault(e);
- }
- CodeMirror.on(this.node, "mousewheel", onWheel);
- CodeMirror.on(this.node, "DOMMouseScroll", onWheel);
- }
- Bar.prototype.setPos = function(pos, force) {
- if (pos < 0) pos = 0;
- if (pos > this.total - this.screen) pos = this.total - this.screen;
- if (!force && pos == this.pos) return false;
- this.pos = pos;
- this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = (pos * (this.size / this.total)) + "px";
- return true
- };
- Bar.prototype.moveTo = function(pos) {
- if (this.setPos(pos)) this.scroll(pos, this.orientation);
- }
- var minButtonSize = 10;
- Bar.prototype.update = function(scrollSize, clientSize, barSize) {
- var sizeChanged = this.screen != clientSize || this.total != scrollSize || this.size != barSize
- if (sizeChanged) {
- this.screen = clientSize;
- this.total = scrollSize;
- this.size = barSize;
- }
- var buttonSize = this.screen * (this.size / this.total);
- if (buttonSize < minButtonSize) {
- this.size -= minButtonSize - buttonSize;
- buttonSize = minButtonSize;
- }
- this.inner.style[this.orientation == "horizontal" ? "width" : "height"] = buttonSize + "px";
- this.setPos(this.pos, sizeChanged);
- };
-
- function SimpleScrollbars(cls, place, scroll) {
- this.addClass = cls;
- this.horiz = new Bar(cls, "horizontal", scroll);
- place(this.horiz.node);
- this.vert = new Bar(cls, "vertical", scroll);
- place(this.vert.node);
- this.width = null;
- }
- SimpleScrollbars.prototype.update = function(measure) {
- if (this.width == null) {
- var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle;
- if (style) this.width = parseInt(style.height);
- }
- var width = this.width || 0;
- var needsH = measure.scrollWidth > measure.clientWidth + 1;
- var needsV = measure.scrollHeight > measure.clientHeight + 1;
- this.vert.node.style.display = needsV ? "block" : "none";
- this.horiz.node.style.display = needsH ? "block" : "none";
- if (needsV) {
- this.vert.update(measure.scrollHeight, measure.clientHeight, measure.viewHeight - (needsH ? width : 0));
- this.vert.node.style.bottom = needsH ? width + "px" : "0";
- }
- if (needsH) {
- this.horiz.update(measure.scrollWidth, measure.clientWidth, measure.viewWidth - (needsV ? width : 0) - measure.barLeft);
- this.horiz.node.style.right = needsV ? width + "px" : "0";
- this.horiz.node.style.left = measure.barLeft + "px";
- }
- return {
- right: needsV ? width : 0,
- bottom: needsH ? width : 0
- };
- };
- SimpleScrollbars.prototype.setScrollTop = function(pos) {
- this.vert.setPos(pos);
- };
- SimpleScrollbars.prototype.setScrollLeft = function(pos) {
- this.horiz.setPos(pos);
- };
- SimpleScrollbars.prototype.clear = function() {
- var parent = this.horiz.node.parentNode;
- parent.removeChild(this.horiz.node);
- parent.removeChild(this.vert.node);
- };
- CodeMirror.scrollbarModel.simple = function(place, scroll) {
- return new SimpleScrollbars("CodeMirror-simplescroll", place, scroll);
- };
- CodeMirror.scrollbarModel.overlay = function(place, scroll) {
- return new SimpleScrollbars("CodeMirror-overlayscroll", place, scroll);
- };
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var WRAP_CLASS = "CodeMirror-activeline";
- var BACK_CLASS = "CodeMirror-activeline-background";
- var GUTT_CLASS = "CodeMirror-activeline-gutter";
- CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
- var prev = old == CodeMirror.Init ? false : old;
- if (val == prev) return
- if (prev) {
- cm.off("beforeSelectionChange", selectionChange);
- clearActiveLines(cm);
- delete cm.state.activeLines;
- }
- if (val) {
- cm.state.activeLines = [];
- updateActiveLines(cm, cm.listSelections());
- cm.on("beforeSelectionChange", selectionChange);
- }
- });
-
- function clearActiveLines(cm) {
- for (var i = 0; i < cm.state.activeLines.length; i++) {
- cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS);
- cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS);
- cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS);
- }
- }
-
- function sameArray(a, b) {
- if (a.length != b.length) return false;
- for (var i = 0; i < a.length; i++)
- if (a[i] != b[i]) return false;
- return true;
- }
-
- function updateActiveLines(cm, ranges) {
- var active = [];
- for (var i = 0; i < ranges.length; i++) {
- var range = ranges[i];
- var option = cm.getOption("styleActiveLine");
- if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty())
- continue
- var line = cm.getLineHandleVisualStart(range.head.line);
- if (active[active.length - 1] != line) active.push(line);
- }
- if (sameArray(cm.state.activeLines, active)) return;
- cm.operation(function() {
- clearActiveLines(cm);
- for (var i = 0; i < active.length; i++) {
- cm.addLineClass(active[i], "wrap", WRAP_CLASS);
- cm.addLineClass(active[i], "background", BACK_CLASS);
- cm.addLineClass(active[i], "gutter", GUTT_CLASS);
- }
- cm.state.activeLines = active;
- });
- }
-
- function selectionChange(cm, sel) {
- updateActiveLines(cm, sel.ranges);
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.defineOption("styleSelectedText", false, function(cm, val, old) {
- var prev = old && old != CodeMirror.Init;
- if (val && !prev) {
- cm.state.markedSelection = [];
- cm.state.markedSelectionStyle = typeof val == "string" ? val : "CodeMirror-selectedtext";
- reset(cm);
- cm.on("cursorActivity", onCursorActivity);
- cm.on("change", onChange);
- } else if (!val && prev) {
- cm.off("cursorActivity", onCursorActivity);
- cm.off("change", onChange);
- clear(cm);
- cm.state.markedSelection = cm.state.markedSelectionStyle = null;
- }
- });
-
- function onCursorActivity(cm) {
- if (cm.state.markedSelection)
- cm.operation(function() {
- update(cm);
- });
- }
-
- function onChange(cm) {
- if (cm.state.markedSelection && cm.state.markedSelection.length)
- cm.operation(function() {
- clear(cm);
- });
- }
- var CHUNK_SIZE = 8;
- var Pos = CodeMirror.Pos;
- var cmp = CodeMirror.cmpPos;
-
- function coverRange(cm, from, to, addAt) {
- if (cmp(from, to) == 0) return;
- var array = cm.state.markedSelection;
- var cls = cm.state.markedSelectionStyle;
- for (var line = from.line;;) {
- var start = line == from.line ? from : Pos(line, 0);
- var endLine = line + CHUNK_SIZE,
- atEnd = endLine >= to.line;
- var end = atEnd ? to : Pos(endLine, 0);
- var mark = cm.markText(start, end, {
- className: cls
- });
- if (addAt == null) array.push(mark);
- else array.splice(addAt++, 0, mark);
- if (atEnd) break;
- line = endLine;
- }
- }
-
- function clear(cm) {
- var array = cm.state.markedSelection;
- for (var i = 0; i < array.length; ++i) array[i].clear();
- array.length = 0;
- }
-
- function reset(cm) {
- clear(cm);
- var ranges = cm.listSelections();
- for (var i = 0; i < ranges.length; i++)
- coverRange(cm, ranges[i].from(), ranges[i].to());
- }
-
- function update(cm) {
- if (!cm.somethingSelected()) return clear(cm);
- if (cm.listSelections().length > 1) return reset(cm);
- var from = cm.getCursor("start"),
- to = cm.getCursor("end");
- var array = cm.state.markedSelection;
- if (!array.length) return coverRange(cm, from, to);
- var coverStart = array[0].find(),
- coverEnd = array[array.length - 1].find();
- if (!coverStart || !coverEnd || to.line - from.line <= CHUNK_SIZE || cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0)
- return reset(cm);
- while (cmp(from, coverStart.from) > 0) {
- array.shift().clear();
- coverStart = array[0].find();
- }
- if (cmp(from, coverStart.from) < 0) {
- if (coverStart.to.line - from.line < CHUNK_SIZE) {
- array.shift().clear();
- coverRange(cm, from, coverStart.to, 0);
- } else {
- coverRange(cm, from, coverStart.from, 0);
- }
- }
- while (cmp(to, coverEnd.to) < 0) {
- array.pop().clear();
- coverEnd = array[array.length - 1].find();
- }
- if (cmp(to, coverEnd.to) > 0) {
- if (to.line - coverEnd.from.line < CHUNK_SIZE) {
- array.pop().clear();
- coverRange(cm, coverEnd.from, to);
- } else {
- coverRange(cm, coverEnd.to, to);
- }
- }
- }
-});
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- CodeMirror.defineOption("selectionPointer", false, function(cm, val) {
- var data = cm.state.selectionPointer;
- if (data) {
- CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove);
- CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout);
- CodeMirror.off(window, "scroll", data.windowScroll);
- cm.off("cursorActivity", reset);
- cm.off("scroll", reset);
- cm.state.selectionPointer = null;
- cm.display.lineDiv.style.cursor = "";
- }
- if (val) {
- data = cm.state.selectionPointer = {
- value: typeof val == "string" ? val : "default",
- mousemove: function(event) {
- mousemove(cm, event);
- },
- mouseout: function(event) {
- mouseout(cm, event);
- },
- windowScroll: function() {
- reset(cm);
- },
- rects: null,
- mouseX: null,
- mouseY: null,
- willUpdate: false
- };
- CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove);
- CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout);
- CodeMirror.on(window, "scroll", data.windowScroll);
- cm.on("cursorActivity", reset);
- cm.on("scroll", reset);
- }
- });
-
- function mousemove(cm, event) {
- var data = cm.state.selectionPointer;
- if (event.buttons == null ? event.which : event.buttons) {
- data.mouseX = data.mouseY = null;
- } else {
- data.mouseX = event.clientX;
- data.mouseY = event.clientY;
- }
- scheduleUpdate(cm);
- }
-
- function mouseout(cm, event) {
- if (!cm.getWrapperElement().contains(event.relatedTarget)) {
- var data = cm.state.selectionPointer;
- data.mouseX = data.mouseY = null;
- scheduleUpdate(cm);
- }
- }
-
- function reset(cm) {
- cm.state.selectionPointer.rects = null;
- scheduleUpdate(cm);
- }
-
- function scheduleUpdate(cm) {
- if (!cm.state.selectionPointer.willUpdate) {
- cm.state.selectionPointer.willUpdate = true;
- setTimeout(function() {
- update(cm);
- cm.state.selectionPointer.willUpdate = false;
- }, 50);
- }
- }
-
- function update(cm) {
- var data = cm.state.selectionPointer;
- if (!data) return;
- if (data.rects == null && data.mouseX != null) {
- data.rects = [];
- if (cm.somethingSelected()) {
- for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling)
- data.rects.push(sel.getBoundingClientRect());
- }
- }
- var inside = false;
- if (data.mouseX != null)
- for (var i = 0; i < data.rects.length; i++) {
- var rect = data.rects[i];
- if (rect.left <= data.mouseX && rect.right >= data.mouseX && rect.top <= data.mouseY && rect.bottom >= data.mouseY)
- inside = true;
- }
- var cursor = inside ? data.value : "";
- if (cm.display.lineDiv.style.cursor != cursor)
- cm.display.lineDiv.style.cursor = cursor;
- }
-});
-// (function(mod) {
-// if (typeof exports == "object" && typeof module == "object")
-// mod(require("../../lib/codemirror"));
-// else if (typeof define == "function" && define.amd)
-// define(["../../lib/codemirror"], mod);
-// else
-// mod(CodeMirror);
-// })(function(CodeMirror) {
-// "use strict";
-// CodeMirror.TernServer = function(options) {
-// var self = this;
-// this.options = options || {};
-// var plugins = this.options.plugins || (this.options.plugins = {});
-// if (!plugins.doc_comment) plugins.doc_comment = true;
-// this.docs = Object.create(null);
-// if (this.options.useWorker) {
-// this.server = new WorkerServer(this);
-// } else {
-// this.server = new tern.Server({
-// getFile: function(name, c) {
-// return getFile(self, name, c);
-// },
-// async: true,
-// defs: this.options.defs || [],
-// plugins: plugins
-// });
-// }
-// this.trackChange = function(doc, change) {
-// trackChange(self, doc, change);
-// };
-// this.cachedArgHints = null;
-// this.activeArgHints = null;
-// this.jumpStack = [];
-// this.getHint = function(cm, c) {
-// return hint(self, cm, c);
-// };
-// this.getHint.async = true;
-// };
-// CodeMirror.TernServer.prototype = {
-// addDoc: function(name, doc) {
-// var data = {
-// doc: doc,
-// name: name,
-// changed: null
-// };
-// this.server.addFile(name, docValue(this, data));
-// CodeMirror.on(doc, "change", this.trackChange);
-// return this.docs[name] = data;
-// },
-// delDoc: function(id) {
-// var found = resolveDoc(this, id);
-// if (!found) return;
-// CodeMirror.off(found.doc, "change", this.trackChange);
-// delete this.docs[found.name];
-// this.server.delFile(found.name);
-// },
-// hideDoc: function(id) {
-// closeArgHints(this);
-// var found = resolveDoc(this, id);
-// if (found && found.changed) sendDoc(this, found);
-// },
-// complete: function(cm) {
-// cm.showHint({
-// hint: this.getHint
-// });
-// },
-// showType: function(cm, pos, c) {
-// showContextInfo(this, cm, pos, "type", c);
-// },
-// showDocs: function(cm, pos, c) {
-// showContextInfo(this, cm, pos, "documentation", c);
-// },
-// updateArgHints: function(cm) {
-// updateArgHints(this, cm);
-// },
-// jumpToDef: function(cm) {
-// jumpToDef(this, cm);
-// },
-// jumpBack: function(cm) {
-// jumpBack(this, cm);
-// },
-// rename: function(cm) {
-// rename(this, cm);
-// },
-// selectName: function(cm) {
-// selectName(this, cm);
-// },
-// request: function(cm, query, c, pos) {
-// var self = this;
-// var doc = findDoc(this, cm.getDoc());
-// var request = buildRequest(this, doc, query, pos);
-// var extraOptions = request.query && this.options.queryOptions && this.options.queryOptions[request.query.type]
-// if (extraOptions)
-// for (var prop in extraOptions) request.query[prop] = extraOptions[prop];
-// this.server.request(request, function(error, data) {
-// if (!error && self.options.responseFilter)
-// data = self.options.responseFilter(doc, query, request, error, data);
-// c(error, data);
-// });
-// },
-// destroy: function() {
-// closeArgHints(this)
-// if (this.worker) {
-// this.worker.terminate();
-// this.worker = null;
-// }
-// }
-// };
-// var Pos = CodeMirror.Pos;
-// var cls = "CodeMirror-Tern-";
-// var bigDoc = 250;
-//
-// function getFile(ts, name, c) {
-// var buf = ts.docs[name];
-// if (buf)
-// c(docValue(ts, buf));
-// else if (ts.options.getFile)
-// ts.options.getFile(name, c);
-// else
-// c(null);
-// }
-//
-// function findDoc(ts, doc, name) {
-// for (var n in ts.docs) {
-// var cur = ts.docs[n];
-// if (cur.doc == doc) return cur;
-// }
-// if (!name)
-// for (var i = 0;; ++i) {
-// n = "[doc" + (i || "") + "]";
-// if (!ts.docs[n]) {
-// name = n;
-// break;
-// }
-// }
-// return ts.addDoc(name, doc);
-// }
-//
-// function resolveDoc(ts, id) {
-// if (typeof id == "string") return ts.docs[id];
-// if (id instanceof CodeMirror) id = id.getDoc();
-// if (id instanceof CodeMirror.Doc) return findDoc(ts, id);
-// }
-//
-// function trackChange(ts, doc, change) {
-// var data = findDoc(ts, doc);
-// var argHints = ts.cachedArgHints;
-// if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) >= 0)
-// ts.cachedArgHints = null;
-// var changed = data.changed;
-// if (changed == null)
-// data.changed = changed = {
-// from: change.from.line,
-// to: change.from.line
-// };
-// var end = change.from.line + (change.text.length - 1);
-// if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end);
-// if (end >= changed.to) changed.to = end + 1;
-// if (changed.from > change.from.line) changed.from = change.from.line;
-// if (doc.lineCount() > bigDoc && change.to - changed.from > 100) setTimeout(function() {
-// if (data.changed && data.changed.to - data.changed.from > 100) sendDoc(ts, data);
-// }, 200);
-// }
-//
-// function sendDoc(ts, doc) {
-// ts.server.request({
-// files: [{
-// type: "full",
-// name: doc.name,
-// text: docValue(ts, doc)
-// }]
-// }, function(error) {
-// if (error) window.console.error(error);
-// else doc.changed = null;
-// });
-// }
-//
-// function hint(ts, cm, c) {
-// ts.request(cm, {
-// type: "completions",
-// types: true,
-// docs: true,
-// urls: true
-// }, function(error, data) {
-// if (error) return showError(ts, cm, error);
-// var completions = [],
-// after = "";
-// var from = data.start,
-// to = data.end;
-// if (cm.getRange(Pos(from.line, from.ch - 2), from) == "[\"" && cm.getRange(to, Pos(to.line, to.ch + 2)) != "\"]")
-// after = "\"]";
-// for (var i = 0; i < data.completions.length; ++i) {
-// var completion = data.completions[i],
-// className = typeToIcon(completion.type);
-// if (data.guess) className += " " + cls + "guess";
-// completions.push({
-// text: completion.name + after,
-// displayText: completion.displayName || completion.name,
-// className: className,
-// data: completion
-// });
-// }
-// var obj = {
-// from: from,
-// to: to,
-// list: completions
-// };
-// var tooltip = null;
-// CodeMirror.on(obj, "close", function() {
-// remove(tooltip);
-// });
-// CodeMirror.on(obj, "update", function() {
-// remove(tooltip);
-// });
-// CodeMirror.on(obj, "select", function(cur, node) {
-// remove(tooltip);
-// var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc;
-// if (content) {
-// tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset, node.getBoundingClientRect().top + window.pageYOffset, content);
-// tooltip.className += " " + cls + "hint-doc";
-// }
-// });
-// c(obj);
-// });
-// }
-//
-// function typeToIcon(type) {
-// var suffix;
-// if (type == "?") suffix = "unknown";
-// else if (type == "number" || type == "string" || type == "bool") suffix = type;
-// else if (/^fn\(/.test(type)) suffix = "fn";
-// else if (/^\[/.test(type)) suffix = "array";
-// else suffix = "object";
-// return cls + "completion " + cls + "completion-" + suffix;
-// }
-//
-// function showContextInfo(ts, cm, pos, queryName, c) {
-// ts.request(cm, queryName, function(error, data) {
-// if (error) return showError(ts, cm, error);
-// if (ts.options.typeTip) {
-// var tip = ts.options.typeTip(data);
-// } else {
-// var tip = elt("span", null, elt("strong", null, data.type || "not found"));
-// if (data.doc)
-// tip.appendChild(document.createTextNode(" — " + data.doc));
-// if (data.url) {
-// tip.appendChild(document.createTextNode(" "));
-// var child = tip.appendChild(elt("a", null, "[docs]"));
-// child.href = data.url;
-// child.target = "_blank";
-// }
-// }
-// tempTooltip(cm, tip, ts);
-// if (c) c();
-// }, pos);
-// }
-//
-// function updateArgHints(ts, cm) {
-// closeArgHints(ts);
-// if (cm.somethingSelected()) return;
-// var state = cm.getTokenAt(cm.getCursor()).state;
-// var inner = CodeMirror.innerMode(cm.getMode(), state);
-// if (inner.mode.name != "javascript") return;
-// var lex = inner.state.lexical;
-// if (lex.info != "call") return;
-// var ch, argPos = lex.pos || 0,
-// tabSize = cm.getOption("tabSize");
-// for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) {
-// var str = cm.getLine(line),
-// extra = 0;
-// for (var pos = 0;;) {
-// var tab = str.indexOf("\t", pos);
-// if (tab == -1) break;
-// extra += tabSize - (tab + extra) % tabSize - 1;
-// pos = tab + 1;
-// }
-// ch = lex.column - extra;
-// if (str.charAt(ch) == "(") {
-// found = true;
-// break;
-// }
-// }
-// if (!found) return;
-// var start = Pos(line, ch);
-// var cache = ts.cachedArgHints;
-// if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0)
-// return showArgHints(ts, cm, argPos);
-// ts.request(cm, {
-// type: "type",
-// preferFunction: true,
-// end: start
-// }, function(error, data) {
-// if (error || !data.type || !(/^fn\(/).test(data.type)) return;
-// ts.cachedArgHints = {
-// start: start,
-// type: parseFnType(data.type),
-// name: data.exprName || data.name || "fn",
-// guess: data.guess,
-// doc: cm.getDoc()
-// };
-// showArgHints(ts, cm, argPos);
-// });
-// }
-//
-// function showArgHints(ts, cm, pos) {
-// closeArgHints(ts);
-// var cache = ts.cachedArgHints,
-// tp = cache.type;
-// var tip = elt("span", cache.guess ? cls + "fhint-guess" : null, elt("span", cls + "fname", cache.name), "(");
-// for (var i = 0; i < tp.args.length; ++i) {
-// if (i) tip.appendChild(document.createTextNode(", "));
-// var arg = tp.args[i];
-// tip.appendChild(elt("span", cls + "farg" + (i == pos ? " " + cls + "farg-current" : ""), arg.name || "?"));
-// if (arg.type != "?") {
-// tip.appendChild(document.createTextNode(":\u00a0"));
-// tip.appendChild(elt("span", cls + "type", arg.type));
-// }
-// }
-// tip.appendChild(document.createTextNode(tp.rettype ? ") ->\u00a0" : ")"));
-// if (tp.rettype) tip.appendChild(elt("span", cls + "type", tp.rettype));
-// var place = cm.cursorCoords(null, "page");
-// var tooltip = ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip)
-// setTimeout(function() {
-// tooltip.clear = onEditorActivity(cm, function() {
-// if (ts.activeArgHints == tooltip) closeArgHints(ts)
-// })
-// }, 20)
-// }
-//
-// function parseFnType(text) {
-// var args = [],
-// pos = 3;
-//
-// function skipMatching(upto) {
-// var depth = 0,
-// start = pos;
-// for (;;) {
-// var next = text.charAt(pos);
-// if (upto.test(next) && !depth) return text.slice(start, pos);
-// if (/[{\[\(]/.test(next)) ++depth;
-// else if (/[}\]\)]/.test(next)) --depth;
-// ++pos;
-// }
-// }
-// if (text.charAt(pos) != ")")
-// for (;;) {
-// var name = text.slice(pos).match(/^([^, \(\[\{]+): /);
-// if (name) {
-// pos += name[0].length;
-// name = name[1];
-// }
-// args.push({
-// name: name,
-// type: skipMatching(/[\),]/)
-// });
-// if (text.charAt(pos) == ")") break;
-// pos += 2;
-// }
-// var rettype = text.slice(pos).match(/^\) -> (.*)$/);
-// return {
-// args: args,
-// rettype: rettype && rettype[1]
-// };
-// }
-//
-// function jumpToDef(ts, cm) {
-// function inner(varName) {
-// var req = {
-// type: "definition",
-// variable: varName || null
-// };
-// var doc = findDoc(ts, cm.getDoc());
-// ts.server.request(buildRequest(ts, doc, req), function(error, data) {
-// if (error) return showError(ts, cm, error);
-// if (!data.file && data.url) {
-// window.open(data.url);
-// return;
-// }
-// if (data.file) {
-// var localDoc = ts.docs[data.file],
-// found;
-// if (localDoc && (found = findContext(localDoc.doc, data))) {
-// ts.jumpStack.push({
-// file: doc.name,
-// start: cm.getCursor("from"),
-// end: cm.getCursor("to")
-// });
-// moveTo(ts, doc, localDoc, found.start, found.end);
-// return;
-// }
-// }
-// showError(ts, cm, "Could not find a definition.");
-// });
-// }
-// if (!atInterestingExpression(cm))
-// dialog(cm, "Jump to variable", function(name) {
-// if (name) inner(name);
-// });
-// else
-// inner();
-// }
-//
-// function jumpBack(ts, cm) {
-// var pos = ts.jumpStack.pop(),
-// doc = pos && ts.docs[pos.file];
-// if (!doc) return;
-// moveTo(ts, findDoc(ts, cm.getDoc()), doc, pos.start, pos.end);
-// }
-//
-// function moveTo(ts, curDoc, doc, start, end) {
-// doc.doc.setSelection(start, end);
-// if (curDoc != doc && ts.options.switchToDoc) {
-// closeArgHints(ts);
-// ts.options.switchToDoc(doc.name, doc.doc);
-// }
-// }
-//
-// function findContext(doc, data) {
-// var before = data.context.slice(0, data.contextOffset).split("\n");
-// var startLine = data.start.line - (before.length - 1);
-// var start = Pos(startLine, (before.length == 1 ? data.start.ch : doc.getLine(startLine).length) - before[0].length);
-// var text = doc.getLine(startLine).slice(start.ch);
-// for (var cur = startLine + 1; cur < doc.lineCount() && text.length < data.context.length; ++cur)
-// text += "\n" + doc.getLine(cur);
-// if (text.slice(0, data.context.length) == data.context) return data;
-// var cursor = doc.getSearchCursor(data.context, 0, false);
-// var nearest, nearestDist = Infinity;
-// while (cursor.findNext()) {
-// var from = cursor.from(),
-// dist = Math.abs(from.line - start.line) * 10000;
-// if (!dist) dist = Math.abs(from.ch - start.ch);
-// if (dist < nearestDist) {
-// nearest = from;
-// nearestDist = dist;
-// }
-// }
-// if (!nearest) return null;
-// if (before.length == 1)
-// nearest.ch += before[0].length;
-// else
-// nearest = Pos(nearest.line + (before.length - 1), before[before.length - 1].length);
-// if (data.start.line == data.end.line)
-// var end = Pos(nearest.line, nearest.ch + (data.end.ch - data.start.ch));
-// else
-// var end = Pos(nearest.line + (data.end.line - data.start.line), data.end.ch);
-// return {
-// start: nearest,
-// end: end
-// };
-// }
-//
-// function atInterestingExpression(cm) {
-// var pos = cm.getCursor("end"),
-// tok = cm.getTokenAt(pos);
-// if (tok.start < pos.ch && tok.type == "comment") return false;
-// return /[\w)\]]/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1));
-// }
-//
-// function rename(ts, cm) {
-// var token = cm.getTokenAt(cm.getCursor());
-// if (!/\w/.test(token.string)) return showError(ts, cm, "Not at a variable");
-// dialog(cm, "New name for " + token.string, function(newName) {
-// ts.request(cm, {
-// type: "rename",
-// newName: newName,
-// fullDocs: true
-// }, function(error, data) {
-// if (error) return showError(ts, cm, error);
-// applyChanges(ts, data.changes);
-// });
-// });
-// }
-//
-// function selectName(ts, cm) {
-// var name = findDoc(ts, cm.doc).name;
-// ts.request(cm, {
-// type: "refs"
-// }, function(error, data) {
-// if (error) return showError(ts, cm, error);
-// var ranges = [],
-// cur = 0;
-// var curPos = cm.getCursor();
-// for (var i = 0; i < data.refs.length; i++) {
-// var ref = data.refs[i];
-// if (ref.file == name) {
-// ranges.push({
-// anchor: ref.start,
-// head: ref.end
-// });
-// if (cmpPos(curPos, ref.start) >= 0 && cmpPos(curPos, ref.end) <= 0)
-// cur = ranges.length - 1;
-// }
-// }
-// cm.setSelections(ranges, cur);
-// });
-// }
-// var nextChangeOrig = 0;
-//
-// function applyChanges(ts, changes) {
-// var perFile = Object.create(null);
-// for (var i = 0; i < changes.length; ++i) {
-// var ch = changes[i];
-// (perFile[ch.file] || (perFile[ch.file] = [])).push(ch);
-// }
-// for (var file in perFile) {
-// var known = ts.docs[file],
-// chs = perFile[file];;
-// if (!known) continue;
-// chs.sort(function(a, b) {
-// return cmpPos(b.start, a.start);
-// });
-// var origin = "*rename" + (++nextChangeOrig);
-// for (var i = 0; i < chs.length; ++i) {
-// var ch = chs[i];
-// known.doc.replaceRange(ch.text, ch.start, ch.end, origin);
-// }
-// }
-// }
-//
-// function buildRequest(ts, doc, query, pos) {
-// var files = [],
-// offsetLines = 0,
-// allowFragments = !query.fullDocs;
-// if (!allowFragments) delete query.fullDocs;
-// if (typeof query == "string") query = {
-// type: query
-// };
-// query.lineCharPositions = true;
-// if (query.end == null) {
-// query.end = pos || doc.doc.getCursor("end");
-// if (doc.doc.somethingSelected())
-// query.start = doc.doc.getCursor("start");
-// }
-// var startPos = query.start || query.end;
-// if (doc.changed) {
-// if (doc.doc.lineCount() > bigDoc && allowFragments !== false && doc.changed.to - doc.changed.from < 100 && doc.changed.from <= startPos.line && doc.changed.to > query.end.line) {
-// files.push(getFragmentAround(doc, startPos, query.end));
-// query.file = "#0";
-// var offsetLines = files[0].offsetLines;
-// if (query.start != null) query.start = Pos(query.start.line - -offsetLines, query.start.ch);
-// query.end = Pos(query.end.line - offsetLines, query.end.ch);
-// } else {
-// files.push({
-// type: "full",
-// name: doc.name,
-// text: docValue(ts, doc)
-// });
-// query.file = doc.name;
-// doc.changed = null;
-// }
-// } else {
-// query.file = doc.name;
-// }
-// for (var name in ts.docs) {
-// var cur = ts.docs[name];
-// if (cur.changed && cur != doc) {
-// files.push({
-// type: "full",
-// name: cur.name,
-// text: docValue(ts, cur)
-// });
-// cur.changed = null;
-// }
-// }
-// return {
-// query: query,
-// files: files
-// };
-// }
-//
-// function getFragmentAround(data, start, end) {
-// var doc = data.doc;
-// var minIndent = null,
-// minLine = null,
-// endLine, tabSize = 4;
-// for (var p = start.line - 1, min = Math.max(0, p - 50); p >= min; --p) {
-// var line = doc.getLine(p),
-// fn = line.search(/\bfunction\b/);
-// if (fn < 0) continue;
-// var indent = CodeMirror.countColumn(line, null, tabSize);
-// if (minIndent != null && minIndent <= indent) continue;
-// minIndent = indent;
-// minLine = p;
-// }
-// if (minLine == null) minLine = min;
-// var max = Math.min(doc.lastLine(), end.line + 20);
-// if (minIndent == null || minIndent == CodeMirror.countColumn(doc.getLine(start.line), null, tabSize))
-// endLine = max;
-// else
-// for (endLine = end.line + 1; endLine < max; ++endLine) {
-// var indent = CodeMirror.countColumn(doc.getLine(endLine), null, tabSize);
-// if (indent <= minIndent) break;
-// }
-// var from = Pos(minLine, 0);
-// return {
-// type: "part",
-// name: data.name,
-// offsetLines: from.line,
-// text: doc.getRange(from, Pos(endLine, end.line == endLine ? null : 0))
-// };
-// }
-// var cmpPos = CodeMirror.cmpPos;
-//
-// function elt(tagname, cls) {
-// var e = document.createElement(tagname);
-// if (cls) e.className = cls;
-// for (var i = 2; i < arguments.length; ++i) {
-// var elt = arguments[i];
-// if (typeof elt == "string") elt = document.createTextNode(elt);
-// e.appendChild(elt);
-// }
-// return e;
-// }
-//
-// function dialog(cm, text, f) {
-// if (cm.openDialog)
-// cm.openDialog(text + ": ", f);
-// else
-// f(prompt(text, ""));
-// }
-//
-// function tempTooltip(cm, content, ts) {
-// if (cm.state.ternTooltip) remove(cm.state.ternTooltip);
-// var where = cm.cursorCoords();
-// var tip = cm.state.ternTooltip = makeTooltip(where.right + 1, where.bottom, content);
-//
-// function maybeClear() {
-// old = true;
-// if (!mouseOnTip) clear();
-// }
-//
-// function clear() {
-// cm.state.ternTooltip = null;
-// if (tip.parentNode) fadeOut(tip)
-// clearActivity()
-// }
-// var mouseOnTip = false,
-// old = false;
-// CodeMirror.on(tip, "mousemove", function() {
-// mouseOnTip = true;
-// });
-// CodeMirror.on(tip, "mouseout", function(e) {
-// var related = e.relatedTarget || e.toElement
-// if (!related || !CodeMirror.contains(tip, related)) {
-// if (old) clear();
-// else mouseOnTip = false;
-// }
-// });
-// setTimeout(maybeClear, ts.options.hintDelay ? ts.options.hintDelay : 1700);
-// var clearActivity = onEditorActivity(cm, clear)
-// }
-//
-// function onEditorActivity(cm, f) {
-// cm.on("cursorActivity", f)
-// cm.on("blur", f)
-// cm.on("scroll", f)
-// cm.on("setDoc", f)
-// return function() {
-// cm.off("cursorActivity", f)
-// cm.off("blur", f)
-// cm.off("scroll", f)
-// cm.off("setDoc", f)
-// }
-// }
-//
-// function makeTooltip(x, y, content) {
-// var node = elt("div", cls + "tooltip", content);
-// node.style.left = x + "px";
-// node.style.top = y + "px";
-// document.body.appendChild(node);
-// return node;
-// }
-//
-// function remove(node) {
-// var p = node && node.parentNode;
-// if (p) p.removeChild(node);
-// }
-//
-// function fadeOut(tooltip) {
-// tooltip.style.opacity = "0";
-// setTimeout(function() {
-// remove(tooltip);
-// }, 1100);
-// }
-//
-// function showError(ts, cm, msg) {
-// if (ts.options.showError)
-// ts.options.showError(cm, msg);
-// else
-// tempTooltip(cm, String(msg), ts);
-// }
-//
-// function closeArgHints(ts) {
-// if (ts.activeArgHints) {
-// if (ts.activeArgHints.clear) ts.activeArgHints.clear()
-// remove(ts.activeArgHints)
-// ts.activeArgHints = null
-// }
-// }
-//
-// function docValue(ts, doc) {
-// var val = doc.doc.getValue();
-// if (ts.options.fileFilter) val = ts.options.fileFilter(val, doc.name, doc.doc);
-// return val;
-// }
-//
-// function WorkerServer(ts) {
-// var worker = ts.worker = new Worker(ts.options.workerScript);
-// worker.postMessage({
-// type: "init",
-// defs: ts.options.defs,
-// plugins: ts.options.plugins,
-// scripts: ts.options.workerDeps
-// });
-// var msgId = 0,
-// pending = {};
-//
-// function send(data, c) {
-// if (c) {
-// data.id = ++msgId;
-// pending[msgId] = c;
-// }
-// worker.postMessage(data);
-// }
-// worker.onmessage = function(e) {
-// var data = e.data;
-// if (data.type == "getFile") {
-// getFile(ts, data.name, function(err, text) {
-// send({
-// type: "getFile",
-// err: String(err),
-// text: text,
-// id: data.id
-// });
-// });
-// } else if (data.type == "debug") {
-// window.console.log(data.message);
-// } else if (data.id && pending[data.id]) {
-// pending[data.id](data.err, data.body);
-// delete pending[data.id];
-// }
-// };
-// worker.onerror = function(e) {
-// for (var id in pending) pending[id](e);
-// pending = {};
-// };
-// this.addFile = function(name, text) {
-// send({
-// type: "add",
-// name: name,
-// text: text
-// });
-// };
-// this.delFile = function(name) {
-// send({
-// type: "del",
-// name: name
-// });
-// };
-// this.request = function(body, c) {
-// send({
-// type: "req",
-// body: body
-// }, c);
-// };
-// }
-// });
-// var server;
-// this.onmessage = function(e) {
-// var data = e.data;
-// switch (data.type) {
-// case "init":
-// return startServer(data.defs, data.plugins, data.scripts);
-// case "add":
-// return server.addFile(data.name, data.text);
-// case "del":
-// return server.delFile(data.name);
-// case "req":
-// return server.request(data.body, function(err, reqData) {
-// postMessage({
-// id: data.id,
-// body: reqData,
-// err: err && String(err)
-// });
-// });
-// case "getFile":
-// var c = pending[data.id];
-// delete pending[data.id];
-// return c(data.err, data.text);
-// default:
-// throw new Error("Unknown message type: " + data.type);
-// }
-// };
-// var nextId = 0,
-// pending = {};
-//
-// function getFile(file, c) {
-// postMessage({
-// type: "getFile",
-// name: file,
-// id: ++nextId
-// });
-// pending[nextId] = c;
-// }
-//
-// function startServer(defs, plugins, scripts) {
-// if (scripts) importScripts.apply(null, scripts);
-// server = new tern.Server({
-// getFile: getFile,
-// async: true,
-// defs: defs,
-// plugins: plugins
-// });
-// }
-// this.console = {
-// log: function(v) {
-// postMessage({
-// type: "debug",
-// message: v
-// });
-// }
-// };
-(function(mod) {
- if (typeof exports == "object" && typeof module == "object")
- mod(require("../../lib/codemirror"));
- else if (typeof define == "function" && define.amd)
- define(["../../lib/codemirror"], mod);
- else
- mod(CodeMirror);
-})(function(CodeMirror) {
- "use strict";
- var Pos = CodeMirror.Pos;
-
- function findParagraph(cm, pos, options) {
- var startRE = options.paragraphStart || cm.getHelper(pos, "paragraphStart");
- for (var start = pos.line, first = cm.firstLine(); start > first; --start) {
- var line = cm.getLine(start);
- if (startRE && startRE.test(line)) break;
- if (!/\S/.test(line)) {
- ++start;
- break;
- }
- }
- var endRE = options.paragraphEnd || cm.getHelper(pos, "paragraphEnd");
- for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) {
- var line = cm.getLine(end);
- if (endRE && endRE.test(line)) {
- ++end;
- break;
- }
- if (!/\S/.test(line)) break;
- }
- return {
- from: start,
- to: end
- };
- }
-
- function findBreakPoint(text, column, wrapOn, killTrailingSpace) {
- var at = column
- while (at < text.length && text.charAt(at) == " ") at++
- for (; at > 0; --at)
- if (wrapOn.test(text.slice(at - 1, at + 1))) break;
- for (var first = true;; first = false) {
- var endOfText = at;
- if (killTrailingSpace)
- while (text.charAt(endOfText - 1) == " ") --endOfText;
- if (endOfText == 0 && first) at = column;
- else return {
- from: endOfText,
- to: at
- };
- }
- }
-
- function wrapRange(cm, from, to, options) {
- from = cm.clipPos(from);
- to = cm.clipPos(to);
- var column = options.column || 80;
- var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/;
- var killTrailing = options.killTrailingSpace !== false;
- var changes = [],
- curLine = "",
- curNo = from.line;
- var lines = cm.getRange(from, to, false);
- if (!lines.length) return null;
- var leadingSpace = lines[0].match(/^[ \t]*/)[0];
- for (var i = 0; i < lines.length; ++i) {
- var text = lines[i],
- oldLen = curLine.length,
- spaceInserted = 0;
- if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) {
- curLine += " ";
- spaceInserted = 1;
- }
- var spaceTrimmed = "";
- if (i) {
- spaceTrimmed = text.match(/^\s*/)[0];
- text = text.slice(spaceTrimmed.length);
- }
- curLine += text;
- if (i) {
- var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed && findBreakPoint(curLine, column, wrapOn, killTrailing);
- if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) {
- changes.push({
- text: [spaceInserted ? " " : ""],
- from: Pos(curNo, oldLen),
- to: Pos(curNo + 1, spaceTrimmed.length)
- });
- } else {
- curLine = leadingSpace + text;
- ++curNo;
- }
- }
- while (curLine.length > column) {
- var bp = findBreakPoint(curLine, column, wrapOn, killTrailing);
- changes.push({
- text: ["", leadingSpace],
- from: Pos(curNo, bp.from),
- to: Pos(curNo, bp.to)
- });
- curLine = leadingSpace + curLine.slice(bp.to);
- ++curNo;
- }
- }
- if (changes.length) cm.operation(function() {
- for (var i = 0; i < changes.length; ++i) {
- var change = changes[i];
- if (change.text || CodeMirror.cmpPos(change.from, change.to))
- cm.replaceRange(change.text, change.from, change.to);
- }
- });
- return changes.length ? {
- from: changes[0].from,
- to: CodeMirror.changeEnd(changes[changes.length - 1])
- } : null;
- }
- CodeMirror.defineExtension("wrapParagraph", function(pos, options) {
- options = options || {};
- if (!pos) pos = this.getCursor();
- var para = findParagraph(this, pos, options);
- return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options);
- });
- CodeMirror.commands.wrapLines = function(cm) {
- cm.operation(function() {
- var ranges = cm.listSelections(),
- at = cm.lastLine() + 1;
- for (var i = ranges.length - 1; i >= 0; i--) {
- var range = ranges[i],
- span;
- if (range.empty()) {
- var para = findParagraph(cm, range.head, {});
- span = {
- from: Pos(para.from, 0),
- to: Pos(para.to - 1)
- };
- } else {
- span = {
- from: range.from(),
- to: range.to()
- };
- }
- if (span.to.line >= at) continue;
- at = span.from.line;
- wrapRange(cm, span.from, span.to, {});
- }
- });
- };
- CodeMirror.defineExtension("wrapRange", function(from, to, options) {
- return wrapRange(this, from, to, options || {});
- });
- CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) {
- options = options || {};
- var cm = this,
- paras = [];
- for (var line = from.line; line <= to.line;) {
- var para = findParagraph(cm, Pos(line, 0), options);
- paras.push(para);
- line = para.to;
- }
- var madeChange = false;
- if (paras.length) cm.operation(function() {
- for (var i = paras.length - 1; i >= 0; --i)
- madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options);
- });
- return madeChange;
- });
-});
+(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?module.exports=factory():typeof define==='function'&&define.amd?define(factory):(global.CodeMirror=factory());}(this,(function(){'use strict';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)
+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}
+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=end)
+{return n+(end-i)}
+n+=nextTab-i
+n+=tabSize-(n%tabSize)
+i=nextTab+1}}
+var Delayed=function(){this.id=null};Delayed.prototype.set=function(ms,f){clearTimeout(this.id)
+this.id=setTimeout(f,ms)};function indexOf(array,elt){for(var i=0;i=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"\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}
+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)}
+function skipExtendingChars(str,pos,dir){while((dir<0?pos>0:posto?-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}}}
+function Display(place,doc,input){var d=this
+this.input=input
+d.scrollbarFiller=elt("div",null,"CodeMirror-scrollbar-filler")
+d.scrollbarFiller.setAttribute("cm-not-content","true")
+d.gutterFiller=elt("div",null,"CodeMirror-gutter-filler")
+d.gutterFiller.setAttribute("cm-not-content","true")
+d.lineDiv=eltP("div",null,"CodeMirror-code")
+d.selectionDiv=elt("div",null,null,"position: relative; z-index: 1")
+d.cursorDiv=elt("div",null,"CodeMirror-cursors")
+d.measure=elt("div",null,"CodeMirror-measure")
+d.lineMeasure=elt("div",null,"CodeMirror-measure")
+d.lineSpace=eltP("div",[d.measure,d.lineMeasure,d.selectionDiv,d.cursorDiv,d.lineDiv],null,"position: relative; outline: none")
+var lines=eltP("div",[d.lineSpace],"CodeMirror-lines")
+d.mover=elt("div",[lines],null,"position: relative")
+d.sizer=elt("div",[d.mover],"CodeMirror-sizer")
+d.sizerWidth=null
+d.heightForcer=elt("div",null,null,"position: absolute; height: "+scrollerGap+"px; width: 1px;")
+d.gutters=elt("div",null,"CodeMirror-gutters")
+d.lineGutter=null
+d.scroller=elt("div",[d.sizer,d.heightForcer,d.gutters],"CodeMirror-scroll")
+d.scroller.setAttribute("tabIndex","-1")
+d.wrapper=elt("div",[d.scrollbarFiller,d.gutterFiller,d.scroller],"CodeMirror")
+if(ie&&ie_version<8){d.gutters.style.zIndex=-1;d.scroller.style.paddingRight=0}
+if(!webkit&&!(gecko&&mobile)){d.scroller.draggable=true}
+if(place){if(place.appendChild){place.appendChild(d.wrapper)}
+else{place(d.wrapper)}}
+d.viewFrom=d.viewTo=doc.first
+d.reportedViewFrom=d.reportedViewTo=doc.first
+d.view=[]
+d.renderedView=null
+d.externalMeasured=null
+d.viewOffset=0
+d.lastWrapHeight=d.lastWrapWidth=0
+d.updateLineNumbers=null
+d.nativeBarWidth=d.barHeight=d.barWidth=0
+d.scrollbarsClipped=false
+d.lineNumWidth=d.lineNumInnerWidth=d.lineNumChars=null
+d.alignWidgets=false
+d.cachedCharWidth=d.cachedTextHeight=d.cachedPaddingH=null
+d.maxLine=null
+d.maxLineLength=0
+d.maxLineChanged=false
+d.wheelDX=d.wheelDY=d.wheelStartX=d.wheelStartY=null
+d.shift=false
+d.selForContextMenu=null
+d.activeTouch=null
+input.init(d)}
+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=doc.first&&llast){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=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=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.from0&&first)
+{for(var i$2=0;i$20){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}
+function detachMarkedSpans(line){var spans=line.markedSpans
+if(!spans){return}
+for(var i=0;i=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}}}}
+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}
+function visualLineContinued(line){var merged,lines
+while(merged=collapsedSpanAtEnd(line)){line=merged.find(1,true).line;(lines||(lines=[])).push(line)}
+return lines}
+function visualLineNo(doc,lineN){var line=getLine(doc,lineN),vis=visualLine(line)
+if(line==vis){return lineN}
+return lineNo(vis)}
+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}
+function lineIsHidden(doc,line){var sps=sawCollapsedSpans&&line.markedSpans
+if(sps){for(var sp=(void 0),i=0;id.maxLineLength){d.maxLineLength=len
+d.maxLine=line}})}
+function iterateBidiSections(order,from,to,f){if(!order){return f(from,to,"ltr",0)}
+var found=false
+for(var i=0;ifrom||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;ich){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}
+var bidiOrdering=(function(){var lowTypes="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"
+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-1)
+{map[type]=arr.slice(0,index).concat(arr.slice(index+1))}}}}
+function signal(emitter,type){var handlers=getHandlers(emitter,type)
+if(!handlers.length){return}
+var args=Array.prototype.slice.call(arguments,2)
+for(var i=0;i0}
+function eventMixin(ctor){ctor.prototype.on=function(type,f){on(this,type,f)}
+ctor.prototype.off=function(type,f){off(this,type,f)}}
+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}
+var dragAndDrop=function(){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}
+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}
+return badBidiRects=(r1.right-r0.right<3)}
+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}
+var modes={};var mimeModes={};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}
+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"}}}
+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}
+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}
+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}
+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.posstart};StringStream.prototype.eatSpace=function(){var this$1=this;var start=this.pos
+while(/[\s\u00a0]/.test(this.string.charAt(this.pos))){++this$1.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.lastColumnPos0){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)};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){var this$1=this;if(!this.baseTokens){return null}
+while(this.baseTokens[this.baseTokenPos]<=n)
+{this$1.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};function highlightLine(cm,line,context,forceToEnd){var st=[cm.state.modeGen],lineClasses={}
+runMode(cm,line.text,cm.doc.mode,context,function(end,style){return st.push(end,style);},lineClasses,forceToEnd)
+var state=context.state
+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
+while(atend)
+{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(;startcm.options.maxHighlightLength&©State(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&&posstream.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};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.poscm.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(curStartlim;--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.highlightFrontierstart;line--){var saved=getLine(doc,line).stateAfter
+if(saved&&(!(saved instanceof SavedContext)||line+saved.lookAhead1&&!/ /.test(text)){return text}
+var spaceBefore=trailingBefore,result=""
+for(var i=0;istart&&part.from<=start){break}}
+if(part.to>=end){return inner(builder,text,style,startStyle,endStyle,title,css)}
+inner(builder,text.slice(0,part.to-start),style,startStyle,null,title,css)
+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}
+function insertLineContent(line,builder,styles){var spans=line.markedSpans,allText=line.text,at=0
+if(!spans){for(var i$1=1;i$1pos||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)}
+if(m.title&&!title){title=m.title}
+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=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:"",title,css)}
+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)}}}
+function LineView(doc,line,lineN){this.line=line
+this.rest=visualLineContinued(line)
+this.size=this.rest?lineNo(lst(this.rest))-lineN+1:1
+this.node=this.text=null
+this.hidden=lineIsHidden(doc,line)}
+function buildViewArray(cm,from,to){var array=[],nextPos
+for(var pos=from;pos2)
+{heights.push((cur.bottom+next.top)/ 2-rect.top)}}}
+heights.push(rect.bottom-rect.top)}}
+function mapFromLineView(lineView,line,lineN){if(lineView.line==line)
+{return{map:lineView.measure.map,cache:lineView.measure.cache}}
+for(var i=0;ilineN)
+{return{map:lineView.measure.maps[i$1],cache:lineView.measure.caches[i$1],before:true}}}}
+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}
+function measureChar(cm,line,ch,bias){return measureCharPrepared(cm,prepareMeasureForLine(cm,line),ch,bias)}
+function findViewForLine(cm,lineN){if(lineN>=cm.display.viewFrom&&lineN=ext.lineN&&lineNch){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=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){for(var i$1=0;i$1<4;i$1++){while(start&&isExtendingChar(prepared.line.text.charAt(place.coverStart+start))){--start}
+while(place.coverStart+end0){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=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}
+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}}
+function PosWithInfo(line,ch,sticky,outside,xRel){var pos=Pos(line,ch,sticky)
+pos.xRel=xRel
+if(outside){pos.outside=true}
+return pos}
+function coordsChar(cm,x,y){var doc=cm.doc
+y+=cm.display.viewOffset
+if(y<0){return PosWithInfo(doc.first,0,null,true,-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,true,1)}
+if(x<0){x=0}
+var lineObj=getLine(doc,lineN)
+for(;;){var found=coordsCharInner(cm,lineObj,lineN,x,y)
+var merged=collapsedSpanAtEnd(lineObj)
+var mergedPos=merged&&merged.find(0,true)
+if(merged&&(found.ch>mergedPos.from.ch||found.ch==mergedPos.from.ch&&found.xRel>0))
+{lineN=lineNo(lineObj=mergedPos.to.line)}
+else
+{return found}}}
+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)}
+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){y-=heightAtLine(lineObj)
+var preparedMeasure=prepareMeasureForLine(cm,lineObj)
+var widgetHeight=widgetTopHeight(lineObj)
+var begin=0,end=lineObj.text.length,ltr=true
+var order=getOrder(lineObj,cm.doc.direction)
+if(order){var part=(cm.options.lineWrapping?coordsBidiPartWrapped:coordsBidiPart)
+(cm,lineObj,lineNo,preparedMeasure,order,x,y)
+ltr=part.level!=1
+begin=ltr?part.from:part.to-1
+end=ltr?part.to:part.from-1}
+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(boxAround){var atLeft=x-boxAround.left=coords.bottom}
+ch=skipExtendingChars(lineObj.text,ch,1)
+return PosWithInfo(lineNo,ch,sticky,outside,x-baseX)}
+function coordsBidiPart(cm,lineObj,lineNo,preparedMeasure,order,x,y){var index=findFirst(function(i){var part=order[i],ltr=part.level!=1
+return boxIsAfter(cursorCoords(cm,Pos(lineNo,ltr?part.to:part.from,ltr?"before":"after"),"line",lineObj,preparedMeasure),x,y,true)},0,order.length-1)
+var part=order[index]
+if(index>0){var ltr=part.level!=1
+var start=cursorCoords(cm,Pos(lineNo,ltr?part.from:part.to,ltr?"after":"before"),"line",lineObj,preparedMeasure)
+if(boxIsAfter(start,x,y,true)&&start.top>y)
+{part=order[index-1]}}
+return part}
+function coordsBidiPartWrapped(cm,lineObj,_lineNo,preparedMeasure,order,x,y){var ref=wrappedLineExtent(cm,lineObj,preparedMeasure,y);var begin=ref.begin;var end=ref.end;if(/\s/.test(lineObj.text.charAt(end-1))){end--}
+var part=null,closestDist=null
+for(var i=0;i=end||p.to<=begin){continue}
+var ltr=p.level!=1
+var endX=measureCharPrepared(cm,preparedMeasure,ltr?Math.min(end,p.to)-1:Math.max(begin,p.from)).right
+var dist=endXdist){part=p
+closestDist=dist}}
+if(!part){part=order[order.length-1]}
+if(part.fromend){part={from:part.from,to:end,level:part.level}}
+return part}
+var measureText
+function textHeight(display){if(display.cachedTextHeight!=null){return display.cachedTextHeight}
+if(measureText==null){measureText=elt("pre")
+for(var i=0;i<49;++i){measureText.appendChild(document.createTextNode("x"))
+measureText.appendChild(elt("br"))}
+measureText.appendChild(document.createTextNode("x"))}
+removeChildrenAndAdd(display.measure,measureText)
+var height=measureText.offsetHeight / 50
+if(height>3){display.cachedTextHeight=height}
+removeChildren(display.measure)
+return height||1}
+function charWidth(display){if(display.cachedCharWidth!=null){return display.cachedCharWidth}
+var anchor=elt("span","xxxxxxxxxx")
+var pre=elt("pre",[anchor])
+removeChildrenAndAdd(display.measure,pre)
+var rect=anchor.getBoundingClientRect(),width=(rect.right-rect.left)/ 10
+if(width>2){display.cachedCharWidth=width}
+return width||10}
+function getDimensions(cm){var d=cm.display,left={},width={}
+var gutterLeft=d.gutters.clientLeft
+for(var n=d.gutters.firstChild,i=0;n;n=n.nextSibling,++i){left[cm.options.gutters[i]]=n.offsetLeft+n.clientLeft+gutterLeft
+width[cm.options.gutters[i]]=n.clientWidth}
+return{fixedPos:compensateForHScroll(d),gutterTotalWidth:d.gutters.offsetWidth,gutterLeft:left,gutterWidth:width,wrapperWidth:d.wrapper.clientWidth}}
+function compensateForHScroll(display){return display.scroller.getBoundingClientRect().left-display.sizer.getBoundingClientRect().left}
+function estimateHeight(cm){var th=textHeight(cm.display),wrapping=cm.options.lineWrapping
+var perLine=wrapping&&Math.max(5,cm.display.scroller.clientWidth / charWidth(cm.display)-3)
+return function(line){if(lineIsHidden(cm.doc,line)){return 0}
+var widgetsHeight=0
+if(line.widgets){for(var i=0;i=cm.display.viewTo){return null}
+n-=cm.display.viewFrom
+if(n<0){return null}
+var view=cm.display.view
+for(var i=0;i=cm.display.viewTo||range.to().line0)
+{display.blinker=setInterval(function(){return display.cursorDiv.style.visibility=(on=!on)?"":"hidden";},cm.options.cursorBlinkRate)}
+else if(cm.options.cursorBlinkRate<0)
+{display.cursorDiv.style.visibility="hidden"}}
+function ensureFocus(cm){if(!cm.state.focused){cm.display.input.focus();onFocus(cm)}}
+function delayBlurEvent(cm){cm.state.delayingBlurEvent=true
+setTimeout(function(){if(cm.state.delayingBlurEvent){cm.state.delayingBlurEvent=false
+onBlur(cm)}},100)}
+function onFocus(cm,e){if(cm.state.delayingBlurEvent){cm.state.delayingBlurEvent=false}
+if(cm.options.readOnly=="nocursor"){return}
+if(!cm.state.focused){signal(cm,"focus",cm,e)
+cm.state.focused=true
+addClass(cm.display.wrapper,"CodeMirror-focused")
+if(!cm.curOp&&cm.display.selForContextMenu!=cm.doc.sel){cm.display.input.reset()
+if(webkit){setTimeout(function(){return cm.display.input.reset(true);},20)}}
+cm.display.input.receivedFocus()}
+restartBlink(cm)}
+function onBlur(cm,e){if(cm.state.delayingBlurEvent){return}
+if(cm.state.focused){signal(cm,"blur",cm,e)
+cm.state.focused=false
+rmClass(cm.display.wrapper,"CodeMirror-focused")}
+clearInterval(cm.display.blinker)
+setTimeout(function(){if(!cm.state.focused){cm.display.shift=false}},150)}
+function updateHeightsInViewport(cm){var display=cm.display
+var prevBottom=display.lineDiv.offsetTop
+for(var i=0;i.005||diff<-.005){updateLineHeight(cur.line,height)
+updateWidgetHeight(cur.line)
+if(cur.rest){for(var j=0;j=to){from=lineAtHeight(doc,heightAtLine(getLine(doc,ensureTo))-display.wrapper.clientHeight)
+to=ensureTo}}
+return{from:from,to:Math.max(to,from+1)}}
+function alignHorizontally(cm){var display=cm.display,view=display.view
+if(!display.alignWidgets&&(!display.gutters.firstChild||!cm.options.fixedGutter)){return}
+var comp=compensateForHScroll(display)-display.scroller.scrollLeft+cm.doc.scrollLeft
+var gutterW=display.gutters.offsetWidth,left=comp+"px"
+for(var i=0;i(window.innerHeight||document.documentElement.clientHeight)){doScroll=false}
+if(doScroll!=null&&!phantom){var scrollNode=elt("div","\u200b",null,("position: absolute;\n top: "+(rect.top-display.viewOffset-paddingTop(cm.display))+"px;\n height: "+(rect.bottom-rect.top+scrollGap(cm)+display.barHeight)+"px;\n left: "+(rect.left)+"px; width: "+(Math.max(2,rect.right-rect.left))+"px;"))
+cm.display.lineSpace.appendChild(scrollNode)
+scrollNode.scrollIntoView(doScroll)
+cm.display.lineSpace.removeChild(scrollNode)}}
+function scrollPosIntoView(cm,pos,end,margin){if(margin==null){margin=0}
+var rect
+if(!cm.options.lineWrapping&&pos==end){pos=pos.ch?Pos(pos.line,pos.sticky=="before"?pos.ch-1:pos.ch,"after"):pos
+end=pos.sticky=="before"?Pos(pos.line,pos.ch+1,"before"):pos}
+for(var limit=0;limit<5;limit++){var changed=false
+var coords=cursorCoords(cm,pos)
+var endCoords=!end||end==pos?coords:cursorCoords(cm,end)
+rect={left:Math.min(coords.left,endCoords.left),top:Math.min(coords.top,endCoords.top)-margin,right:Math.max(coords.left,endCoords.left),bottom:Math.max(coords.bottom,endCoords.bottom)+margin}
+var scrollPos=calculateScrollPos(cm,rect)
+var startTop=cm.doc.scrollTop,startLeft=cm.doc.scrollLeft
+if(scrollPos.scrollTop!=null){updateScrollTop(cm,scrollPos.scrollTop)
+if(Math.abs(cm.doc.scrollTop-startTop)>1){changed=true}}
+if(scrollPos.scrollLeft!=null){setScrollLeft(cm,scrollPos.scrollLeft)
+if(Math.abs(cm.doc.scrollLeft-startLeft)>1){changed=true}}
+if(!changed){break}}
+return rect}
+function scrollIntoView(cm,rect){var scrollPos=calculateScrollPos(cm,rect)
+if(scrollPos.scrollTop!=null){updateScrollTop(cm,scrollPos.scrollTop)}
+if(scrollPos.scrollLeft!=null){setScrollLeft(cm,scrollPos.scrollLeft)}}
+function calculateScrollPos(cm,rect){var display=cm.display,snapMargin=textHeight(cm.display)
+if(rect.top<0){rect.top=0}
+var screentop=cm.curOp&&cm.curOp.scrollTop!=null?cm.curOp.scrollTop:display.scroller.scrollTop
+var screen=displayHeight(cm),result={}
+if(rect.bottom-rect.top>screen){rect.bottom=rect.top+screen}
+var docBottom=cm.doc.height+paddingVert(display)
+var atTop=rect.topdocBottom-snapMargin
+if(rect.topscreentop+screen){var newTop=Math.min(rect.top,(atBottom?docBottom:rect.bottom)-screen)
+if(newTop!=screentop){result.scrollTop=newTop}}
+var screenleft=cm.curOp&&cm.curOp.scrollLeft!=null?cm.curOp.scrollLeft:display.scroller.scrollLeft
+var screenw=displayWidth(cm)-(cm.options.fixedGutter?display.gutters.offsetWidth:0)
+var tooWide=rect.right-rect.left>screenw
+if(tooWide){rect.right=rect.left+screenw}
+if(rect.left<10)
+{result.scrollLeft=0}
+else if(rect.leftscreenw+screenleft-3)
+{result.scrollLeft=rect.right+(tooWide?0:10)-screenw}
+return result}
+function addToScrollTop(cm,top){if(top==null){return}
+resolveScrollToPos(cm)
+cm.curOp.scrollTop=(cm.curOp.scrollTop==null?cm.doc.scrollTop:cm.curOp.scrollTop)+top}
+function ensureCursorVisible(cm){resolveScrollToPos(cm)
+var cur=cm.getCursor()
+cm.curOp.scrollToPos={from:cur,to:cur,margin:cm.options.cursorScrollMargin}}
+function scrollToCoords(cm,x,y){if(x!=null||y!=null){resolveScrollToPos(cm)}
+if(x!=null){cm.curOp.scrollLeft=x}
+if(y!=null){cm.curOp.scrollTop=y}}
+function scrollToRange(cm,range){resolveScrollToPos(cm)
+cm.curOp.scrollToPos=range}
+function resolveScrollToPos(cm){var range=cm.curOp.scrollToPos
+if(range){cm.curOp.scrollToPos=null
+var from=estimateCoords(cm,range.from),to=estimateCoords(cm,range.to)
+scrollToCoordsRange(cm,from,to,range.margin)}}
+function scrollToCoordsRange(cm,from,to,margin){var sPos=calculateScrollPos(cm,{left:Math.min(from.left,to.left),top:Math.min(from.top,to.top)-margin,right:Math.max(from.right,to.right),bottom:Math.max(from.bottom,to.bottom)+margin})
+scrollToCoords(cm,sPos.scrollLeft,sPos.scrollTop)}
+function updateScrollTop(cm,val){if(Math.abs(cm.doc.scrollTop-val)<2){return}
+if(!gecko){updateDisplaySimple(cm,{top:val})}
+setScrollTop(cm,val,true)
+if(gecko){updateDisplaySimple(cm)}
+startWorker(cm,100)}
+function setScrollTop(cm,val,forceScroll){val=Math.min(cm.display.scroller.scrollHeight-cm.display.scroller.clientHeight,val)
+if(cm.display.scroller.scrollTop==val&&!forceScroll){return}
+cm.doc.scrollTop=val
+cm.display.scrollbars.setScrollTop(val)
+if(cm.display.scroller.scrollTop!=val){cm.display.scroller.scrollTop=val}}
+function setScrollLeft(cm,val,isScroller,forceScroll){val=Math.min(val,cm.display.scroller.scrollWidth-cm.display.scroller.clientWidth)
+if((isScroller?val==cm.doc.scrollLeft:Math.abs(cm.doc.scrollLeft-val)<2)&&!forceScroll){return}
+cm.doc.scrollLeft=val
+alignHorizontally(cm)
+if(cm.display.scroller.scrollLeft!=val){cm.display.scroller.scrollLeft=val}
+cm.display.scrollbars.setScrollLeft(val)}
+function measureForScrollbars(cm){var d=cm.display,gutterW=d.gutters.offsetWidth
+var docH=Math.round(cm.doc.height+paddingVert(cm.display))
+return{clientHeight:d.scroller.clientHeight,viewHeight:d.wrapper.clientHeight,scrollWidth:d.scroller.scrollWidth,clientWidth:d.scroller.clientWidth,viewWidth:d.wrapper.clientWidth,barLeft:cm.options.fixedGutter?gutterW:0,docHeight:docH,scrollHeight:docH+scrollGap(cm)+d.barHeight,nativeBarWidth:d.nativeBarWidth,gutterWidth:gutterW}}
+var NativeScrollbars=function(place,scroll,cm){this.cm=cm
+var vert=this.vert=elt("div",[elt("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar")
+var horiz=this.horiz=elt("div",[elt("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar")
+place(vert);place(horiz)
+on(vert,"scroll",function(){if(vert.clientHeight){scroll(vert.scrollTop,"vertical")}})
+on(horiz,"scroll",function(){if(horiz.clientWidth){scroll(horiz.scrollLeft,"horizontal")}})
+this.checkedZeroWidth=false
+if(ie&&ie_version<8){this.horiz.style.minHeight=this.vert.style.minWidth="18px"}};NativeScrollbars.prototype.update=function(measure){var needsH=measure.scrollWidth>measure.clientWidth+1
+var needsV=measure.scrollHeight>measure.clientHeight+1
+var sWidth=measure.nativeBarWidth
+if(needsV){this.vert.style.display="block"
+this.vert.style.bottom=needsH?sWidth+"px":"0"
+var totalHeight=measure.viewHeight-(needsH?sWidth:0)
+this.vert.firstChild.style.height=Math.max(0,measure.scrollHeight-measure.clientHeight+totalHeight)+"px"}else{this.vert.style.display=""
+this.vert.firstChild.style.height="0"}
+if(needsH){this.horiz.style.display="block"
+this.horiz.style.right=needsV?sWidth+"px":"0"
+this.horiz.style.left=measure.barLeft+"px"
+var totalWidth=measure.viewWidth-measure.barLeft-(needsV?sWidth:0)
+this.horiz.firstChild.style.width=Math.max(0,measure.scrollWidth-measure.clientWidth+totalWidth)+"px"}else{this.horiz.style.display=""
+this.horiz.firstChild.style.width="0"}
+if(!this.checkedZeroWidth&&measure.clientHeight>0){if(sWidth==0){this.zeroWidthHack()}
+this.checkedZeroWidth=true}
+return{right:needsV?sWidth:0,bottom:needsH?sWidth:0}};NativeScrollbars.prototype.setScrollLeft=function(pos){if(this.horiz.scrollLeft!=pos){this.horiz.scrollLeft=pos}
+if(this.disableHoriz){this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")}};NativeScrollbars.prototype.setScrollTop=function(pos){if(this.vert.scrollTop!=pos){this.vert.scrollTop=pos}
+if(this.disableVert){this.enableZeroWidthBar(this.vert,this.disableVert,"vert")}};NativeScrollbars.prototype.zeroWidthHack=function(){var w=mac&&!mac_geMountainLion?"12px":"18px"
+this.horiz.style.height=this.vert.style.width=w
+this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none"
+this.disableHoriz=new Delayed
+this.disableVert=new Delayed};NativeScrollbars.prototype.enableZeroWidthBar=function(bar,delay,type){bar.style.pointerEvents="auto"
+function maybeDisable(){var box=bar.getBoundingClientRect()
+var elt=type=="vert"?document.elementFromPoint(box.right-1,(box.top+box.bottom)/ 2):document.elementFromPoint((box.right+box.left)/ 2,box.bottom-1)
+if(elt!=bar){bar.style.pointerEvents="none"}
+else{delay.set(1000,maybeDisable)}}
+delay.set(1000,maybeDisable)};NativeScrollbars.prototype.clear=function(){var parent=this.horiz.parentNode
+parent.removeChild(this.horiz)
+parent.removeChild(this.vert)};var NullScrollbars=function(){};NullScrollbars.prototype.update=function(){return{bottom:0,right:0}};NullScrollbars.prototype.setScrollLeft=function(){};NullScrollbars.prototype.setScrollTop=function(){};NullScrollbars.prototype.clear=function(){};function updateScrollbars(cm,measure){if(!measure){measure=measureForScrollbars(cm)}
+var startWidth=cm.display.barWidth,startHeight=cm.display.barHeight
+updateScrollbarsInner(cm,measure)
+for(var i=0;i<4&&startWidth!=cm.display.barWidth||startHeight!=cm.display.barHeight;i++){if(startWidth!=cm.display.barWidth&&cm.options.lineWrapping)
+{updateHeightsInViewport(cm)}
+updateScrollbarsInner(cm,measureForScrollbars(cm))
+startWidth=cm.display.barWidth;startHeight=cm.display.barHeight}}
+function updateScrollbarsInner(cm,measure){var d=cm.display
+var sizes=d.scrollbars.update(measure)
+d.sizer.style.paddingRight=(d.barWidth=sizes.right)+"px"
+d.sizer.style.paddingBottom=(d.barHeight=sizes.bottom)+"px"
+d.heightForcer.style.borderBottom=sizes.bottom+"px solid transparent"
+if(sizes.right&&sizes.bottom){d.scrollbarFiller.style.display="block"
+d.scrollbarFiller.style.height=sizes.bottom+"px"
+d.scrollbarFiller.style.width=sizes.right+"px"}else{d.scrollbarFiller.style.display=""}
+if(sizes.bottom&&cm.options.coverGutterNextToScrollbar&&cm.options.fixedGutter){d.gutterFiller.style.display="block"
+d.gutterFiller.style.height=sizes.bottom+"px"
+d.gutterFiller.style.width=measure.gutterWidth+"px"}else{d.gutterFiller.style.display=""}}
+var scrollbarModel={"native":NativeScrollbars,"null":NullScrollbars}
+function initScrollbars(cm){if(cm.display.scrollbars){cm.display.scrollbars.clear()
+if(cm.display.scrollbars.addClass)
+{rmClass(cm.display.wrapper,cm.display.scrollbars.addClass)}}
+cm.display.scrollbars=new scrollbarModel[cm.options.scrollbarStyle](function(node){cm.display.wrapper.insertBefore(node,cm.display.scrollbarFiller)
+on(node,"mousedown",function(){if(cm.state.focused){setTimeout(function(){return cm.display.input.focus();},0)}})
+node.setAttribute("cm-not-content","true")},function(pos,axis){if(axis=="horizontal"){setScrollLeft(cm,pos)}
+else{updateScrollTop(cm,pos)}},cm)
+if(cm.display.scrollbars.addClass)
+{addClass(cm.display.wrapper,cm.display.scrollbars.addClass)}}
+var nextOpId=0
+function startOperation(cm){cm.curOp={cm:cm,viewChanged:false,startHeight:cm.doc.height,forceUpdate:false,updateInput:null,typing:false,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:false,updateMaxLine:false,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:false,id:++nextOpId}
+pushOperation(cm.curOp)}
+function endOperation(cm){var op=cm.curOp
+finishOperation(op,function(group){for(var i=0;i=display.viewTo)||display.maxLineChanged&&cm.options.lineWrapping
+op.update=op.mustUpdate&&new DisplayUpdate(cm,op.mustUpdate&&{top:op.scrollTop,ensure:op.scrollToPos},op.forceUpdate)}
+function endOperation_W1(op){op.updatedDisplay=op.mustUpdate&&updateDisplayIfNeeded(op.cm,op.update)}
+function endOperation_R2(op){var cm=op.cm,display=cm.display
+if(op.updatedDisplay){updateHeightsInViewport(cm)}
+op.barMeasure=measureForScrollbars(cm)
+if(display.maxLineChanged&&!cm.options.lineWrapping){op.adjustWidthTo=measureChar(cm,display.maxLine,display.maxLine.text.length).left+3
+cm.display.sizerWidth=op.adjustWidthTo
+op.barMeasure.scrollWidth=Math.max(display.scroller.clientWidth,display.sizer.offsetLeft+op.adjustWidthTo+scrollGap(cm)+cm.display.barWidth)
+op.maxScrollLeft=Math.max(0,display.sizer.offsetLeft+op.adjustWidthTo-displayWidth(cm))}
+if(op.updatedDisplay||op.selectionChanged)
+{op.preparedSelection=display.input.prepareSelection()}}
+function endOperation_W2(op){var cm=op.cm
+if(op.adjustWidthTo!=null){cm.display.sizer.style.minWidth=op.adjustWidthTo+"px"
+if(op.maxScrollLeftfrom))
+{display.updateLineNumbers=from}
+cm.curOp.viewChanged=true
+if(from>=display.viewTo){if(sawCollapsedSpans&&visualLineNo(cm.doc,from)display.viewFrom){resetView(cm)}else{display.viewFrom+=lendiff
+display.viewTo+=lendiff}}else if(from<=display.viewFrom&&to>=display.viewTo){resetView(cm)}else if(from<=display.viewFrom){var cut=viewCuttingPoint(cm,to,to+lendiff,1)
+if(cut){display.view=display.view.slice(cut.index)
+display.viewFrom=cut.lineN
+display.viewTo+=lendiff}else{resetView(cm)}}else if(to>=display.viewTo){var cut$1=viewCuttingPoint(cm,from,from,-1)
+if(cut$1){display.view=display.view.slice(0,cut$1.index)
+display.viewTo=cut$1.lineN}else{resetView(cm)}}else{var cutTop=viewCuttingPoint(cm,from,from,-1)
+var cutBot=viewCuttingPoint(cm,to,to+lendiff,1)
+if(cutTop&&cutBot){display.view=display.view.slice(0,cutTop.index).concat(buildViewArray(cm,cutTop.lineN,cutBot.lineN)).concat(display.view.slice(cutBot.index))
+display.viewTo+=lendiff}else{resetView(cm)}}
+var ext=display.externalMeasured
+if(ext){if(to=ext.lineN&&line=display.viewTo){return}
+var lineView=display.view[findViewIndex(cm,line)]
+if(lineView.node==null){return}
+var arr=lineView.changes||(lineView.changes=[])
+if(indexOf(arr,type)==-1){arr.push(type)}}
+function resetView(cm){cm.display.viewFrom=cm.display.viewTo=cm.doc.first
+cm.display.view=[]
+cm.display.viewOffset=0}
+function viewCuttingPoint(cm,oldN,newN,dir){var index=findViewIndex(cm,oldN),diff,view=cm.display.view
+if(!sawCollapsedSpans||newN==cm.doc.first+cm.doc.size)
+{return{index:index,lineN:newN}}
+var n=cm.display.viewFrom
+for(var i=0;i0){if(index==view.length-1){return null}
+diff=(n+view[index].size)-oldN
+index++}else{diff=n-oldN}
+oldN+=diff;newN+=diff}
+while(visualLineNo(cm.doc,newN)!=newN){if(index==(dir<0?0:view.length-1)){return null}
+newN+=dir*view[index-(dir<0?1:0)].size
+index+=dir}
+return{index:index,lineN:newN}}
+function adjustView(cm,from,to){var display=cm.display,view=display.view
+if(view.length==0||from>=display.viewTo||to<=display.viewFrom){display.view=buildViewArray(cm,from,to)
+display.viewFrom=from}else{if(display.viewFrom>from)
+{display.view=buildViewArray(cm,from,display.viewFrom).concat(display.view)}
+else if(display.viewFromto)
+{display.view=display.view.slice(0,findViewIndex(cm,to))}}
+display.viewTo=to}
+function countDirtyView(cm){var view=cm.display.view,dirty=0
+for(var i=0;i=cm.display.viewTo){return}
+var end=+new Date+cm.options.workTime
+var context=getContextBefore(cm,doc.highlightFrontier)
+var changedLines=[]
+doc.iter(context.line,Math.min(doc.first+doc.size,cm.display.viewTo+500),function(line){if(context.line>=cm.display.viewFrom){var oldStyles=line.styles
+var resetState=line.text.length>cm.options.maxHighlightLength?copyState(doc.mode,context.state):null
+var highlighted=highlightLine(cm,line,context,true)
+if(resetState){context.state=resetState}
+line.styles=highlighted.styles
+var oldCls=line.styleClasses,newCls=highlighted.classes
+if(newCls){line.styleClasses=newCls}
+else if(oldCls){line.styleClasses=null}
+var ischange=!oldStyles||oldStyles.length!=line.styles.length||oldCls!=newCls&&(!oldCls||!newCls||oldCls.bgClass!=newCls.bgClass||oldCls.textClass!=newCls.textClass)
+for(var i=0;!ischange&&iend){startWorker(cm,cm.options.workDelay)
+return true}})
+doc.highlightFrontier=context.line
+doc.modeFrontier=Math.max(doc.modeFrontier,context.line)
+if(changedLines.length){runInOp(cm,function(){for(var i=0;i=display.viewFrom&&update.visible.to<=display.viewTo&&(display.updateLineNumbers==null||display.updateLineNumbers>=display.viewTo)&&display.renderedView==display.view&&countDirtyView(cm)==0)
+{return false}
+if(maybeUpdateLineNumberWidth(cm)){resetView(cm)
+update.dims=getDimensions(cm)}
+var end=doc.first+doc.size
+var from=Math.max(update.visible.from-cm.options.viewportMargin,doc.first)
+var to=Math.min(end,update.visible.to+cm.options.viewportMargin)
+if(display.viewFromto&&display.viewTo-to<20){to=Math.min(end,display.viewTo)}
+if(sawCollapsedSpans){from=visualLineNo(cm.doc,from)
+to=visualLineEndNo(cm.doc,to)}
+var different=from!=display.viewFrom||to!=display.viewTo||display.lastWrapHeight!=update.wrapperHeight||display.lastWrapWidth!=update.wrapperWidth
+adjustView(cm,from,to)
+display.viewOffset=heightAtLine(getLine(cm.doc,display.viewFrom))
+cm.display.mover.style.top=display.viewOffset+"px"
+var toUpdate=countDirtyView(cm)
+if(!different&&toUpdate==0&&!update.force&&display.renderedView==display.view&&(display.updateLineNumbers==null||display.updateLineNumbers>=display.viewTo))
+{return false}
+var selSnapshot=selectionSnapshot(cm)
+if(toUpdate>4){display.lineDiv.style.display="none"}
+patchDisplay(cm,display.updateLineNumbers,update.dims)
+if(toUpdate>4){display.lineDiv.style.display=""}
+display.renderedView=display.view
+restoreSelection(selSnapshot)
+removeChildren(display.cursorDiv)
+removeChildren(display.selectionDiv)
+display.gutters.style.height=display.sizer.style.minHeight=0
+if(different){display.lastWrapHeight=update.wrapperHeight
+display.lastWrapWidth=update.wrapperWidth
+startWorker(cm,400)}
+display.updateLineNumbers=null
+return true}
+function postUpdateDisplay(cm,update){var viewport=update.viewport
+for(var first=true;;first=false){if(!first||!cm.options.lineWrapping||update.oldDisplayWidth==displayWidth(cm)){if(viewport&&viewport.top!=null)
+{viewport={top:Math.min(cm.doc.height+paddingVert(cm.display)-displayHeight(cm),viewport.top)}}
+update.visible=visibleLines(cm.display,cm.doc,viewport)
+if(update.visible.from>=cm.display.viewFrom&&update.visible.to<=cm.display.viewTo)
+{break}}
+if(!updateDisplayIfNeeded(cm,update)){break}
+updateHeightsInViewport(cm)
+var barMeasure=measureForScrollbars(cm)
+updateSelection(cm)
+updateScrollbars(cm,barMeasure)
+setDocumentHeight(cm,barMeasure)
+update.force=false}
+update.signal(cm,"update",cm)
+if(cm.display.viewFrom!=cm.display.reportedViewFrom||cm.display.viewTo!=cm.display.reportedViewTo){update.signal(cm,"viewportChange",cm,cm.display.viewFrom,cm.display.viewTo)
+cm.display.reportedViewFrom=cm.display.viewFrom;cm.display.reportedViewTo=cm.display.viewTo}}
+function updateDisplaySimple(cm,viewport){var update=new DisplayUpdate(cm,viewport)
+if(updateDisplayIfNeeded(cm,update)){updateHeightsInViewport(cm)
+postUpdateDisplay(cm,update)
+var barMeasure=measureForScrollbars(cm)
+updateSelection(cm)
+updateScrollbars(cm,barMeasure)
+setDocumentHeight(cm,barMeasure)
+update.finish()}}
+function patchDisplay(cm,updateNumbersFrom,dims){var display=cm.display,lineNumbers=cm.options.lineNumbers
+var container=display.lineDiv,cur=container.firstChild
+function rm(node){var next=node.nextSibling
+if(webkit&&mac&&cm.display.currentWheelTarget==node)
+{node.style.display="none"}
+else
+{node.parentNode.removeChild(node)}
+return next}
+var view=display.view,lineN=display.viewFrom
+for(var i=0;i-1){updateNumber=false}
+updateLineForChanges(cm,lineView,lineN,dims)}
+if(updateNumber){removeChildren(lineView.lineNumber)
+lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options,lineN)))}
+cur=lineView.node.nextSibling}
+lineN+=lineView.size}
+while(cur){cur=rm(cur)}}
+function updateGutterSpace(cm){var width=cm.display.gutters.offsetWidth
+cm.display.sizer.style.marginLeft=width+"px"}
+function setDocumentHeight(cm,measure){cm.display.sizer.style.minHeight=measure.docHeight+"px"
+cm.display.heightForcer.style.top=measure.docHeight+"px"
+cm.display.gutters.style.height=(measure.docHeight+cm.display.barHeight+scrollGap(cm))+"px"}
+function updateGutters(cm){var gutters=cm.display.gutters,specs=cm.options.gutters
+removeChildren(gutters)
+var i=0
+for(;i-1&&!options.lineNumbers){options.gutters=options.gutters.slice(0)
+options.gutters.splice(found,1)}}
+var wheelSamples=0;var wheelPixelsPerUnit=null;if(ie){wheelPixelsPerUnit=-.53}
+else if(gecko){wheelPixelsPerUnit=15}
+else if(chrome){wheelPixelsPerUnit=-.7}
+else if(safari){wheelPixelsPerUnit=-1/3}
+function wheelEventDelta(e){var dx=e.wheelDeltaX,dy=e.wheelDeltaY
+if(dx==null&&e.detail&&e.axis==e.HORIZONTAL_AXIS){dx=e.detail}
+if(dy==null&&e.detail&&e.axis==e.VERTICAL_AXIS){dy=e.detail}
+else if(dy==null){dy=e.wheelDelta}
+return{x:dx,y:dy}}
+function wheelEventPixels(e){var delta=wheelEventDelta(e)
+delta.x*=wheelPixelsPerUnit
+delta.y*=wheelPixelsPerUnit
+return delta}
+function onScrollWheel(cm,e){var delta=wheelEventDelta(e),dx=delta.x,dy=delta.y
+var display=cm.display,scroll=display.scroller
+var canScrollX=scroll.scrollWidth>scroll.clientWidth
+var canScrollY=scroll.scrollHeight>scroll.clientHeight
+if(!(dx&&canScrollX||dy&&canScrollY)){return}
+if(dy&&mac&&webkit){outer:for(var cur=e.target,view=display.view;cur!=scroll;cur=cur.parentNode){for(var i=0;i=0&&cmp(pos,range.to())<=0)
+{return i}}
+return-1};var Range=function(anchor,head){this.anchor=anchor;this.head=head};Range.prototype.from=function(){return minPos(this.anchor,this.head)};Range.prototype.to=function(){return maxPos(this.anchor,this.head)};Range.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch};function normalizeSelection(ranges,primIndex){var prim=ranges[primIndex]
+ranges.sort(function(a,b){return cmp(a.from(),b.from());})
+primIndex=indexOf(ranges,prim)
+for(var i=1;i=0){var from=minPos(prev.from(),cur.from()),to=maxPos(prev.to(),cur.to())
+var inv=prev.empty()?cur.from()==cur.head:prev.from()==prev.head
+if(i<=primIndex){--primIndex}
+ranges.splice(--i,2,new Range(inv?to:from,inv?from:to))}}
+return new Selection(ranges,primIndex)}
+function simpleSelection(anchor,head){return new Selection([new Range(anchor,head||anchor)],0)}
+function changeEnd(change){if(!change.text){return change.to}
+return Pos(change.from.line+change.text.length-1,lst(change.text).length+(change.text.length==1?change.from.ch:0))}
+function adjustForChange(pos,change){if(cmp(pos,change.from)<0){return pos}
+if(cmp(pos,change.to)<=0){return changeEnd(change)}
+var line=pos.line+change.text.length-(change.to.line-change.from.line)-1,ch=pos.ch
+if(pos.line==change.to.line){ch+=changeEnd(change).ch-change.to.ch}
+return Pos(line,ch)}
+function computeSelAfterChange(doc,change){var out=[]
+for(var i=0;i1){doc.remove(from.line+1,nlines-1)}
+doc.insert(from.line+1,added$2)}
+signalLater(doc,"change",doc,change)}
+function linkedDocs(doc,f,sharedHistOnly){function propagate(doc,skip,sharedHist){if(doc.linked){for(var i=0;i1&&!hist.done[hist.done.length-2].ranges){hist.done.pop()
+return lst(hist.done)}}
+function addChangeToHistory(doc,change,selAfter,opId){var hist=doc.history
+hist.undone.length=0
+var time=+new Date,cur
+var last
+if((hist.lastOp==opId||hist.lastOrigin==change.origin&&change.origin&&((change.origin.charAt(0)=="+"&&doc.cm&&hist.lastModTime>time-doc.cm.options.historyEventDelay)||change.origin.charAt(0)=="*"))&&(cur=lastChangeEvent(hist,hist.lastOp==opId))){last=lst(cur.changes)
+if(cmp(change.from,change.to)==0&&cmp(change.from,last.to)==0){last.to=changeEnd(change)}else{cur.changes.push(historyChangeFromChange(doc,change))}}else{var before=lst(hist.done)
+if(!before||!before.ranges)
+{pushSelectionToHistory(doc.sel,hist.done)}
+cur={changes:[historyChangeFromChange(doc,change)],generation:hist.generation}
+hist.done.push(cur)
+while(hist.done.length>hist.undoDepth){hist.done.shift()
+if(!hist.done[0].ranges){hist.done.shift()}}}
+hist.done.push(selAfter)
+hist.generation=++hist.maxGeneration
+hist.lastModTime=hist.lastSelTime=time
+hist.lastOp=hist.lastSelOp=opId
+hist.lastOrigin=hist.lastSelOrigin=change.origin
+if(!last){signal(doc,"historyAdded")}}
+function selectionEventCanBeMerged(doc,origin,prev,sel){var ch=origin.charAt(0)
+return ch=="*"||ch=="+"&&prev.ranges.length==sel.ranges.length&&prev.somethingSelected()==sel.somethingSelected()&&new Date-doc.history.lastSelTime<=(doc.cm?doc.cm.options.historyEventDelay:500)}
+function addSelectionToHistory(doc,sel,opId,options){var hist=doc.history,origin=options&&options.origin
+if(opId==hist.lastSelOp||(origin&&hist.lastSelOrigin==origin&&(hist.lastModTime==hist.lastSelTime&&hist.lastOrigin==origin||selectionEventCanBeMerged(doc,origin,lst(hist.done),sel))))
+{hist.done[hist.done.length-1]=sel}
+else
+{pushSelectionToHistory(sel,hist.done)}
+hist.lastSelTime=+new Date
+hist.lastSelOrigin=origin
+hist.lastSelOp=opId
+if(options&&options.clearRedo!==false)
+{clearSelectionEvents(hist.undone)}}
+function pushSelectionToHistory(sel,dest){var top=lst(dest)
+if(!(top&&top.ranges&&top.equals(sel)))
+{dest.push(sel)}}
+function attachLocalSpans(doc,change,from,to){var existing=change["spans_"+doc.id],n=0
+doc.iter(Math.max(doc.first,from),Math.min(doc.first+doc.size,to),function(line){if(line.markedSpans)
+{(existing||(existing=change["spans_"+doc.id]={}))[n]=line.markedSpans}
+++n})}
+function removeClearedSpans(spans){if(!spans){return null}
+var out
+for(var i=0;i-1){lst(newChanges)[prop]=change[prop]
+delete change[prop]}}}}}}
+return copy}
+function extendRange(range,head,other,extend){if(extend){var anchor=range.anchor
+if(other){var posBefore=cmp(head,anchor)<0
+if(posBefore!=(cmp(other,anchor)<0)){anchor=head
+head=other}else if(posBefore!=(cmp(head,other)<0)){head=other}}
+return new Range(anchor,head)}else{return new Range(other||head,head)}}
+function extendSelection(doc,head,other,options,extend){if(extend==null){extend=doc.cm&&(doc.cm.display.shift||doc.extend)}
+setSelection(doc,new Selection([extendRange(doc.sel.primary(),head,other,extend)],0),options)}
+function extendSelections(doc,heads,options){var out=[]
+var extend=doc.cm&&(doc.cm.display.shift||doc.extend)
+for(var i=0;i=pos.ch:sp.to>pos.ch))){if(mayClear){signal(m,"beforeCursorEnter")
+if(m.explicitlyCleared){if(!line.markedSpans){break}
+else{--i;continue}}}
+if(!m.atomic){continue}
+if(oldPos){var near=m.find(dir<0?1:-1),diff=(void 0)
+if(dir<0?m.inclusiveRight:m.inclusiveLeft)
+{near=movePos(doc,near,-dir,near&&near.line==pos.line?line:null)}
+if(near&&near.line==pos.line&&(diff=cmp(near,oldPos))&&(dir<0?diff<0:diff>0))
+{return skipAtomicInner(doc,near,pos,dir,mayClear)}}
+var far=m.find(dir<0?-1:1)
+if(dir<0?m.inclusiveLeft:m.inclusiveRight)
+{far=movePos(doc,far,dir,far.line==pos.line?line:null)}
+return far?skipAtomicInner(doc,far,pos,dir,mayClear):null}}}
+return pos}
+function skipAtomic(doc,pos,oldPos,bias,mayClear){var dir=bias||1
+var found=skipAtomicInner(doc,pos,oldPos,dir,mayClear)||(!mayClear&&skipAtomicInner(doc,pos,oldPos,dir,true))||skipAtomicInner(doc,pos,oldPos,-dir,mayClear)||(!mayClear&&skipAtomicInner(doc,pos,oldPos,-dir,true))
+if(!found){doc.cantEdit=true
+return Pos(doc.first,0)}
+return found}
+function movePos(doc,pos,dir,line){if(dir<0&&pos.ch==0){if(pos.line>doc.first){return clipPos(doc,Pos(pos.line-1))}
+else{return null}}else if(dir>0&&pos.ch==(line||getLine(doc,pos.line)).text.length){if(pos.line=0;--i)
+{makeChangeInner(doc,{from:split[i].from,to:split[i].to,text:i?[""]:change.text,origin:change.origin})}}else{makeChangeInner(doc,change)}}
+function makeChangeInner(doc,change){if(change.text.length==1&&change.text[0]==""&&cmp(change.from,change.to)==0){return}
+var selAfter=computeSelAfterChange(doc,change)
+addChangeToHistory(doc,change,selAfter,doc.cm?doc.cm.curOp.id:NaN)
+makeChangeSingleDoc(doc,change,selAfter,stretchSpansOverChange(doc,change))
+var rebased=[]
+linkedDocs(doc,function(doc,sharedHist){if(!sharedHist&&indexOf(rebased,doc.history)==-1){rebaseHist(doc.history,change)
+rebased.push(doc.history)}
+makeChangeSingleDoc(doc,change,null,stretchSpansOverChange(doc,change))})}
+function makeChangeFromHistory(doc,type,allowSelectionOnly){if(doc.cm&&doc.cm.state.suppressEdits&&!allowSelectionOnly){return}
+var hist=doc.history,event,selAfter=doc.sel
+var source=type=="undo"?hist.done:hist.undone,dest=type=="undo"?hist.undone:hist.done
+var i=0
+for(;i=0;--i$1){var returned=loop(i$1);if(returned)return returned.v;}}
+function shiftDoc(doc,distance){if(distance==0){return}
+doc.first+=distance
+doc.sel=new Selection(map(doc.sel.ranges,function(range){return new Range(Pos(range.anchor.line+distance,range.anchor.ch),Pos(range.head.line+distance,range.head.ch));}),doc.sel.primIndex)
+if(doc.cm){regChange(doc.cm,doc.first,doc.first-distance,distance)
+for(var d=doc.cm.display,l=d.viewFrom;ldoc.lastLine()){return}
+if(change.from.linelast){change={from:change.from,to:Pos(last,getLine(doc,last).text.length),text:[change.text[0]],origin:change.origin}}
+change.removed=getBetween(doc,change.from,change.to)
+if(!selAfter){selAfter=computeSelAfterChange(doc,change)}
+if(doc.cm){makeChangeSingleDocInEditor(doc.cm,change,spans)}
+else{updateDoc(doc,change,spans)}
+setSelectionNoUndo(doc,selAfter,sel_dontScroll)}
+function makeChangeSingleDocInEditor(cm,change,spans){var doc=cm.doc,display=cm.display,from=change.from,to=change.to
+var recomputeMaxLength=false,checkWidthStart=from.line
+if(!cm.options.lineWrapping){checkWidthStart=lineNo(visualLine(getLine(doc,from.line)))
+doc.iter(checkWidthStart,to.line+1,function(line){if(line==display.maxLine){recomputeMaxLength=true
+return true}})}
+if(doc.sel.contains(change.from,change.to)>-1)
+{signalCursorActivity(cm)}
+updateDoc(doc,change,spans,estimateHeight(cm))
+if(!cm.options.lineWrapping){doc.iter(checkWidthStart,from.line+change.text.length,function(line){var len=lineLength(line)
+if(len>display.maxLineLength){display.maxLine=line
+display.maxLineLength=len
+display.maxLineChanged=true
+recomputeMaxLength=false}})
+if(recomputeMaxLength){cm.curOp.updateMaxLine=true}}
+retreatFrontier(doc,from.line)
+startWorker(cm,400)
+var lendiff=change.text.length-(to.line-from.line)-1
+if(change.full)
+{regChange(cm)}
+else if(from.line==to.line&&change.text.length==1&&!isWholeLineUpdate(cm.doc,change))
+{regLineChange(cm,from.line,"text")}
+else
+{regChange(cm,from.line,to.line+1,lendiff)}
+var changesHandler=hasHandler(cm,"changes"),changeHandler=hasHandler(cm,"change")
+if(changeHandler||changesHandler){var obj={from:from,to:to,text:change.text,removed:change.removed,origin:change.origin}
+if(changeHandler){signalLater(cm,"change",cm,obj)}
+if(changesHandler){(cm.curOp.changeObjs||(cm.curOp.changeObjs=[])).push(obj)}}
+cm.display.selForContextMenu=null}
+function replaceRange(doc,code,from,to,origin){if(!to){to=from}
+if(cmp(to,from)<0){var assign;(assign=[to,from],from=assign[0],to=assign[1],assign)}
+if(typeof code=="string"){code=doc.splitLines(code)}
+makeChange(doc,{from:from,to:to,text:code,origin:origin})}
+function rebaseHistSelSingle(pos,from,to,diff){if(to1||!(this.children[0]instanceof LeafChunk))){var lines=[]
+this.collapse(lines)
+this.children=[new LeafChunk(lines)]
+this.children[0].parent=this}},collapse:function collapse(lines){var this$1=this;for(var i=0;i50){var remaining=child.lines.length%25+25
+for(var pos=remaining;pos10)
+me.parent.maybeSpill()},iterN:function iterN(at,n,op){var this$1=this;for(var i=0;icm.display.maxLineLength){cm.display.maxLine=visual
+cm.display.maxLineLength=len
+cm.display.maxLineChanged=true}}}
+if(min!=null&&cm&&this.collapsed){regChange(cm,min,max+1)}
+this.lines.length=0
+this.explicitlyCleared=true
+if(this.atomic&&this.doc.cantEdit){this.doc.cantEdit=false
+if(cm){reCheckSelection(cm.doc)}}
+if(cm){signalLater(cm,"markerCleared",cm,this,min,max)}
+if(withOp){endOperation(cm)}
+if(this.parent){this.parent.clear()}};TextMarker.prototype.find=function(side,lineObj){var this$1=this;if(side==null&&this.type=="bookmark"){side=1}
+var from,to
+for(var i=0;i0||diff==0&&marker.clearWhenEmpty!==false)
+{return marker}
+if(marker.replacedWith){marker.collapsed=true
+marker.widgetNode=eltP("span",[marker.replacedWith],"CodeMirror-widget")
+if(!options.handleMouseEvents){marker.widgetNode.setAttribute("cm-ignore-events","true")}
+if(options.insertLeft){marker.widgetNode.insertLeft=true}}
+if(marker.collapsed){if(conflictingCollapsedRange(doc,from.line,from,to,marker)||from.line!=to.line&&conflictingCollapsedRange(doc,to.line,from,to,marker))
+{throw new Error("Inserting collapsed marker partially overlapping an existing one")}
+seeCollapsedSpans()}
+if(marker.addToHistory)
+{addChangeToHistory(doc,{from:from,to:to,origin:"markText"},doc.sel,NaN)}
+var curLine=from.line,cm=doc.cm,updateMaxLine
+doc.iter(curLine,to.line+1,function(line){if(cm&&marker.collapsed&&!cm.options.lineWrapping&&visualLine(line)==cm.display.maxLine)
+{updateMaxLine=true}
+if(marker.collapsed&&curLine!=from.line){updateLineHeight(line,0)}
+addMarkedSpan(line,new MarkedSpan(marker,curLine==from.line?from.ch:null,curLine==to.line?to.ch:null))
+++curLine})
+if(marker.collapsed){doc.iter(from.line,to.line+1,function(line){if(lineIsHidden(doc,line)){updateLineHeight(line,0)}})}
+if(marker.clearOnEnter){on(marker,"beforeCursorEnter",function(){return marker.clear();})}
+if(marker.readOnly){seeReadOnlySpans()
+if(doc.history.done.length||doc.history.undone.length)
+{doc.clearHistory()}}
+if(marker.collapsed){marker.id=++nextMarkerId
+marker.atomic=true}
+if(cm){if(updateMaxLine){cm.curOp.updateMaxLine=true}
+if(marker.collapsed)
+{regChange(cm,from.line,to.line+1)}
+else if(marker.className||marker.title||marker.startStyle||marker.endStyle||marker.css)
+{for(var i=from.line;i<=to.line;i++){regLineChange(cm,i,"text")}}
+if(marker.atomic){reCheckSelection(cm.doc)}
+signalLater(cm,"markerAdded",cm,marker)}
+return marker}
+var SharedTextMarker=function(markers,primary){var this$1=this;this.markers=markers
+this.primary=primary
+for(var i=0;i=0;i$1--)
+{makeChange(this$1,changes[i$1])}
+if(newSel){setSelectionReplaceHistory(this,newSel)}
+else if(this.cm){ensureCursorVisible(this.cm)}}),undo:docMethodOp(function(){makeChangeFromHistory(this,"undo")}),redo:docMethodOp(function(){makeChangeFromHistory(this,"redo")}),undoSelection:docMethodOp(function(){makeChangeFromHistory(this,"undo",true)}),redoSelection:docMethodOp(function(){makeChangeFromHistory(this,"redo",true)}),setExtending:function(val){this.extend=val},getExtending:function(){return this.extend},historySize:function(){var hist=this.history,done=0,undone=0
+for(var i=0;i=pos.ch))
+{markers.push(span.marker.parent||span.marker)}}}
+return markers},findMarks:function(from,to,filter){from=clipPos(this,from);to=clipPos(this,to)
+var found=[],lineNo=from.line
+this.iter(from.line,to.line+1,function(line){var spans=line.markedSpans
+if(spans){for(var i=0;i=span.to||span.from==null&&lineNo!=from.line||span.from!=null&&lineNo==to.line&&span.from>=to.ch)&&(!filter||filter(span.marker)))
+{found.push(span.marker.parent||span.marker)}}}
+++lineNo})
+return found},getAllMarks:function(){var markers=[]
+this.iter(function(line){var sps=line.markedSpans
+if(sps){for(var i=0;ioff){ch=off;return true}
+off-=sz
+++lineNo})
+return clipPos(this,Pos(lineNo,ch))},indexFromPos:function(coords){coords=clipPos(this,coords)
+var index=coords.ch
+if(coords.linefrom){from=options.from}
+if(options.to!=null&&options.to-1){cm.state.draggingText(e)
+setTimeout(function(){return cm.display.input.focus();},20)
+return}
+try{var text$1=e.dataTransfer.getData("Text")
+if(text$1){var selected
+if(cm.state.draggingText&&!cm.state.draggingText.copy)
+{selected=cm.listSelections()}
+setSelectionNoUndo(cm.doc,simpleSelection(pos,pos))
+if(selected){for(var i$1=0;i$1=0;i--)
+{replaceRange(cm.doc,"",kill[i].from,kill[i].to,"+delete")}
+ensureCursorVisible(cm)})}
+function moveCharLogically(line,ch,dir){var target=skipExtendingChars(line.text,ch+dir,dir)
+return target<0||target>line.text.length?null:target}
+function moveLogically(line,start,dir){var ch=moveCharLogically(line,start.ch,dir)
+return ch==null?null:new Pos(start.line,ch,dir<0?"after":"before")}
+function endOfLine(visually,cm,lineObj,lineNo,dir){if(visually){var order=getOrder(lineObj,cm.doc.direction)
+if(order){var part=dir<0?lst(order):order[0]
+var moveInStorageOrder=(dir<0)==(part.level==1)
+var sticky=moveInStorageOrder?"after":"before"
+var ch
+if(part.level>0||cm.doc.direction=="rtl"){var prep=prepareMeasureForLine(cm,lineObj)
+ch=dir<0?lineObj.text.length-1:0
+var targetTop=measureCharPrepared(cm,prep,ch).top
+ch=findFirst(function(ch){return measureCharPrepared(cm,prep,ch).top==targetTop;},(dir<0)==(part.level==1)?part.from:part.to-1,ch)
+if(sticky=="before"){ch=moveCharLogically(lineObj,ch,1)}}else{ch=dir<0?part.to:part.from}
+return new Pos(lineNo,ch,sticky)}}
+return new Pos(lineNo,dir<0?lineObj.text.length:0,dir<0?"before":"after")}
+function moveVisually(cm,line,start,dir){var bidi=getOrder(line,cm.doc.direction)
+if(!bidi){return moveLogically(line,start,dir)}
+if(start.ch>=line.text.length){start.ch=line.text.length
+start.sticky="before"}else if(start.ch<=0){start.ch=0
+start.sticky="after"}
+var partPos=getBidiPartAt(bidi,start.ch,start.sticky),part=bidi[partPos]
+if(cm.doc.direction=="ltr"&&part.level%2==0&&(dir>0?part.to>start.ch:part.from=part.from&&ch>=wrappedLineExtent.begin:ch<=part.to&&ch<=wrappedLineExtent.end)){var sticky=moveInStorageOrder?"before":"after"
+return new Pos(start.line,ch,sticky)}}
+var searchInVisualLine=function(partPos,dir,wrappedLineExtent){var getRes=function(ch,moveInStorageOrder){return moveInStorageOrder?new Pos(start.line,mv(ch,1),"before"):new Pos(start.line,ch,"after");}
+for(;partPos>=0&&partPos0)==(part.level!=1)
+var ch=moveInStorageOrder?wrappedLineExtent.begin:mv(wrappedLineExtent.end,-1)
+if(part.from<=ch&&ch0?wrappedLineExtent.end:mv(wrappedLineExtent.begin,-1)
+if(nextCh!=null&&!(dir>0&&nextCh==line.text.length)){res=searchInVisualLine(dir>0?0:bidi.length-1,dir,getWrappedLineExtent(nextCh))
+if(res){return res}}
+return null}
+var commands={selectAll:selectAll,singleSelection:function(cm){return cm.setSelection(cm.getCursor("anchor"),cm.getCursor("head"),sel_dontScroll);},killLine:function(cm){return deleteNearSelection(cm,function(range){if(range.empty()){var len=getLine(cm.doc,range.head.line).text.length
+if(range.head.ch==len&&range.head.line0){cur=new Pos(cur.line,cur.ch+1)
+cm.replaceRange(line.charAt(cur.ch-1)+line.charAt(cur.ch-2),Pos(cur.line,cur.ch-2),cur,"+transpose")}else if(cur.line>cm.doc.first){var prev=getLine(cm.doc,cur.line-1).text
+if(prev){cur=new Pos(cur.line,1)
+cm.replaceRange(line.charAt(0)+cm.doc.lineSeparator()+
+prev.charAt(prev.length-1),Pos(cur.line-1,prev.length-1),cur,"+transpose")}}}
+newSel.push(new Range(cur,cur))}
+cm.setSelections(newSel)});},newlineAndIndent:function(cm){return runInOp(cm,function(){var sels=cm.listSelections()
+for(var i=sels.length-1;i>=0;i--)
+{cm.replaceRange(cm.doc.lineSeparator(),sels[i].anchor,sels[i].head,"+input")}
+sels=cm.listSelections()
+for(var i$1=0;i$1time&&cmp(pos,this.pos)==0&&button==this.button};var lastClick;var lastDoubleClick;function clickRepeat(pos,button){var now=+new Date
+if(lastDoubleClick&&lastDoubleClick.compare(now,pos,button)){lastClick=lastDoubleClick=null
+return"triple"}else if(lastClick&&lastClick.compare(now,pos,button)){lastDoubleClick=new PastClick(now,pos,button)
+lastClick=null
+return"double"}else{lastClick=new PastClick(now,pos,button)
+lastDoubleClick=null
+return"single"}}
+function onMouseDown(e){var cm=this,display=cm.display
+if(signalDOMEvent(cm,e)||display.activeTouch&&display.input.supportsTouch()){return}
+display.input.ensurePolled()
+display.shift=e.shiftKey
+if(eventInWidget(display,e)){if(!webkit){display.scroller.draggable=false
+setTimeout(function(){return display.scroller.draggable=true;},100)}
+return}
+if(clickInGutter(cm,e)){return}
+var pos=posFromMouse(cm,e),button=e_button(e),repeat=pos?clickRepeat(pos,button):"single"
+window.focus()
+if(button==1&&cm.state.selectingText)
+{cm.state.selectingText(e)}
+if(pos&&handleMappedButton(cm,button,pos,repeat,e)){return}
+if(button==1){if(pos){leftButtonDown(cm,pos,repeat,e)}
+else if(e_target(e)==display.scroller){e_preventDefault(e)}}else if(button==2){if(pos){extendSelection(cm.doc,pos)}
+setTimeout(function(){return display.input.focus();},20)}else if(button==3){if(captureRightClick){onContextMenu(cm,e)}
+else{delayBlurEvent(cm)}}}
+function handleMappedButton(cm,button,pos,repeat,event){var name="Click"
+if(repeat=="double"){name="Double"+name}
+else if(repeat=="triple"){name="Triple"+name}
+name=(button==1?"Left":button==2?"Middle":"Right")+name
+return dispatchKey(cm,addModifierNames(name,event),event,function(bound){if(typeof bound=="string"){bound=commands[bound]}
+if(!bound){return false}
+var done=false
+try{if(cm.isReadOnly()){cm.state.suppressEdits=true}
+done=bound(cm,pos)!=Pass}finally{cm.state.suppressEdits=false}
+return done})}
+function configureMouse(cm,repeat,event){var option=cm.getOption("configureMouse")
+var value=option?option(cm,repeat,event):{}
+if(value.unit==null){var rect=chromeOS?event.shiftKey&&event.metaKey:event.altKey
+value.unit=rect?"rectangle":repeat=="single"?"char":repeat=="double"?"word":"line"}
+if(value.extend==null||cm.doc.extend){value.extend=cm.doc.extend||event.shiftKey}
+if(value.addNew==null){value.addNew=mac?event.metaKey:event.ctrlKey}
+if(value.moveOnDrag==null){value.moveOnDrag=!(mac?event.altKey:event.ctrlKey)}
+return value}
+function leftButtonDown(cm,pos,repeat,event){if(ie){setTimeout(bind(ensureFocus,cm),0)}
+else{cm.curOp.focus=activeElt()}
+var behavior=configureMouse(cm,repeat,event)
+var sel=cm.doc.sel,contained
+if(cm.options.dragDrop&&dragAndDrop&&!cm.isReadOnly()&&repeat=="single"&&(contained=sel.contains(pos))>-1&&(cmp((contained=sel.ranges[contained]).from(),pos)<0||pos.xRel>0)&&(cmp(contained.to(),pos)>0||pos.xRel<0))
+{leftButtonStartDrag(cm,event,pos,behavior)}
+else
+{leftButtonSelect(cm,event,pos,behavior)}}
+function leftButtonStartDrag(cm,event,pos,behavior){var display=cm.display,moved=false
+var dragEnd=operation(cm,function(e){if(webkit){display.scroller.draggable=false}
+cm.state.draggingText=false
+off(document,"mouseup",dragEnd)
+off(document,"mousemove",mouseMove)
+off(display.scroller,"dragstart",dragStart)
+off(display.scroller,"drop",dragEnd)
+if(!moved){e_preventDefault(e)
+if(!behavior.addNew)
+{extendSelection(cm.doc,pos,null,null,behavior.extend)}
+if(webkit||ie&&ie_version==9)
+{setTimeout(function(){document.body.focus();display.input.focus()},20)}
+else
+{display.input.focus()}}})
+var mouseMove=function(e2){moved=moved||Math.abs(event.clientX-e2.clientX)+Math.abs(event.clientY-e2.clientY)>=10}
+var dragStart=function(){return moved=true;}
+if(webkit){display.scroller.draggable=true}
+cm.state.draggingText=dragEnd
+dragEnd.copy=!behavior.moveOnDrag
+if(display.scroller.dragDrop){display.scroller.dragDrop()}
+on(document,"mouseup",dragEnd)
+on(document,"mousemove",mouseMove)
+on(display.scroller,"dragstart",dragStart)
+on(display.scroller,"drop",dragEnd)
+delayBlurEvent(cm)
+setTimeout(function(){return display.input.focus();},20)}
+function rangeForUnit(cm,pos,unit){if(unit=="char"){return new Range(pos,pos)}
+if(unit=="word"){return cm.findWordAt(pos)}
+if(unit=="line"){return new Range(Pos(pos.line,0),clipPos(cm.doc,Pos(pos.line+1,0)))}
+var result=unit(cm,pos)
+return new Range(result.from,result.to)}
+function leftButtonSelect(cm,event,start,behavior){var display=cm.display,doc=cm.doc
+e_preventDefault(event)
+var ourRange,ourIndex,startSel=doc.sel,ranges=startSel.ranges
+if(behavior.addNew&&!behavior.extend){ourIndex=doc.sel.contains(start)
+if(ourIndex>-1)
+{ourRange=ranges[ourIndex]}
+else
+{ourRange=new Range(start,start)}}else{ourRange=doc.sel.primary()
+ourIndex=doc.sel.primIndex}
+if(behavior.unit=="rectangle"){if(!behavior.addNew){ourRange=new Range(start,start)}
+start=posFromMouse(cm,event,true,true)
+ourIndex=-1}else{var range=rangeForUnit(cm,start,behavior.unit)
+if(behavior.extend)
+{ourRange=extendRange(ourRange,range.anchor,range.head,behavior.extend)}
+else
+{ourRange=range}}
+if(!behavior.addNew){ourIndex=0
+setSelection(doc,new Selection([ourRange],0),sel_mouse)
+startSel=doc.sel}else if(ourIndex==-1){ourIndex=ranges.length
+setSelection(doc,normalizeSelection(ranges.concat([ourRange]),ourIndex),{scroll:false,origin:"*mouse"})}else if(ranges.length>1&&ranges[ourIndex].empty()&&behavior.unit=="char"&&!behavior.extend){setSelection(doc,normalizeSelection(ranges.slice(0,ourIndex).concat(ranges.slice(ourIndex+1)),0),{scroll:false,origin:"*mouse"})
+startSel=doc.sel}else{replaceOneSelection(doc,ourIndex,ourRange,sel_mouse)}
+var lastPos=start
+function extendTo(pos){if(cmp(lastPos,pos)==0){return}
+lastPos=pos
+if(behavior.unit=="rectangle"){var ranges=[],tabSize=cm.options.tabSize
+var startCol=countColumn(getLine(doc,start.line).text,start.ch,tabSize)
+var posCol=countColumn(getLine(doc,pos.line).text,pos.ch,tabSize)
+var left=Math.min(startCol,posCol),right=Math.max(startCol,posCol)
+for(var line=Math.min(start.line,pos.line),end=Math.min(cm.lastLine(),Math.max(start.line,pos.line));line<=end;line++){var text=getLine(doc,line).text,leftPos=findColumn(text,left,tabSize)
+if(left==right)
+{ranges.push(new Range(Pos(line,leftPos),Pos(line,leftPos)))}
+else if(text.length>leftPos)
+{ranges.push(new Range(Pos(line,leftPos),Pos(line,findColumn(text,right,tabSize))))}}
+if(!ranges.length){ranges.push(new Range(start,start))}
+setSelection(doc,normalizeSelection(startSel.ranges.slice(0,ourIndex).concat(ranges),ourIndex),{origin:"*mouse",scroll:false})
+cm.scrollIntoView(pos)}else{var oldRange=ourRange
+var range=rangeForUnit(cm,pos,behavior.unit)
+var anchor=oldRange.anchor,head
+if(cmp(range.anchor,anchor)>0){head=range.head
+anchor=minPos(oldRange.from(),range.anchor)}else{head=range.anchor
+anchor=maxPos(oldRange.to(),range.head)}
+var ranges$1=startSel.ranges.slice(0)
+ranges$1[ourIndex]=bidiSimplify(cm,new Range(clipPos(doc,anchor),head))
+setSelection(doc,normalizeSelection(ranges$1,ourIndex),sel_mouse)}}
+var editorSize=display.wrapper.getBoundingClientRect()
+var counter=0
+function extend(e){var curCount=++counter
+var cur=posFromMouse(cm,e,true,behavior.unit=="rectangle")
+if(!cur){return}
+if(cmp(cur,lastPos)!=0){cm.curOp.focus=activeElt()
+extendTo(cur)
+var visible=visibleLines(display,doc)
+if(cur.line>=visible.to||cur.lineeditorSize.bottom?20:0
+if(outside){setTimeout(operation(cm,function(){if(counter!=curCount){return}
+display.scroller.scrollTop+=outside
+extend(e)}),50)}}}
+function done(e){cm.state.selectingText=false
+counter=Infinity
+e_preventDefault(e)
+display.input.focus()
+off(document,"mousemove",move)
+off(document,"mouseup",up)
+doc.history.lastSelOrigin=null}
+var move=operation(cm,function(e){if(!e_button(e)){done(e)}
+else{extend(e)}})
+var up=operation(cm,done)
+cm.state.selectingText=up
+on(document,"mousemove",move)
+on(document,"mouseup",up)}
+function bidiSimplify(cm,range){var anchor=range.anchor;var head=range.head;var anchorLine=getLine(cm.doc,anchor.line)
+if(cmp(anchor,head)==0&&anchor.sticky==head.sticky){return range}
+var order=getOrder(anchorLine)
+if(!order){return range}
+var index=getBidiPartAt(order,anchor.ch,anchor.sticky),part=order[index]
+if(part.from!=anchor.ch&&part.to!=anchor.ch){return range}
+var boundary=index+((part.from==anchor.ch)==(part.level!=1)?0:1)
+if(boundary==0||boundary==order.length){return range}
+var leftSide
+if(head.line!=anchor.line){leftSide=(head.line-anchor.line)*(cm.doc.direction=="ltr"?1:-1)>0}else{var headIndex=getBidiPartAt(order,head.ch,head.sticky)
+var dir=headIndex-index||(head.ch-anchor.ch)*(part.level==1?-1:1)
+if(headIndex==boundary-1||headIndex==boundary)
+{leftSide=dir<0}
+else
+{leftSide=dir>0}}
+var usePart=order[boundary+(leftSide?-1:0)]
+var from=leftSide==(usePart.level==1)
+var ch=from?usePart.from:usePart.to,sticky=from?"after":"before"
+return anchor.ch==ch&&anchor.sticky==sticky?range:new Range(new Pos(anchor.line,ch,sticky),head)}
+function gutterEvent(cm,e,type,prevent){var mX,mY
+if(e.touches){mX=e.touches[0].clientX
+mY=e.touches[0].clientY}else{try{mX=e.clientX;mY=e.clientY}
+catch(e){return false}}
+if(mX>=Math.floor(cm.display.gutters.getBoundingClientRect().right)){return false}
+if(prevent){e_preventDefault(e)}
+var display=cm.display
+var lineBox=display.lineDiv.getBoundingClientRect()
+if(mY>lineBox.bottom||!hasHandler(cm,type)){return e_defaultPrevented(e)}
+mY-=lineBox.top-display.viewOffset
+for(var i=0;i=mX){var line=lineAtHeight(cm.doc,mY)
+var gutter=cm.options.gutters[i]
+signal(cm,type,cm,line,gutter,e)
+return e_defaultPrevented(e)}}}
+function clickInGutter(cm,e){return gutterEvent(cm,e,"gutterClick",true)}
+function onContextMenu(cm,e){if(eventInWidget(cm.display,e)||contextMenuInGutter(cm,e)){return}
+if(signalDOMEvent(cm,e,"contextmenu")){return}
+cm.display.input.onContextMenu(e)}
+function contextMenuInGutter(cm,e){if(!hasHandler(cm,"gutterContextMenu")){return false}
+return gutterEvent(cm,e,"gutterContextMenu",false)}
+function themeChanged(cm){cm.display.wrapper.className=cm.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+
+cm.options.theme.replace(/(^|\s)\s*/g," cm-s-")
+clearCaches(cm)}
+var Init={toString:function(){return"CodeMirror.Init"}}
+var defaults={}
+var optionHandlers={}
+function defineOptions(CodeMirror){var optionHandlers=CodeMirror.optionHandlers
+function option(name,deflt,handle,notOnInit){CodeMirror.defaults[name]=deflt
+if(handle){optionHandlers[name]=notOnInit?function(cm,val,old){if(old!=Init){handle(cm,val,old)}}:handle}}
+CodeMirror.defineOption=option
+CodeMirror.Init=Init
+option("value","",function(cm,val){return cm.setValue(val);},true)
+option("mode",null,function(cm,val){cm.doc.modeOption=val
+loadMode(cm)},true)
+option("indentUnit",2,loadMode,true)
+option("indentWithTabs",false)
+option("smartIndent",true)
+option("tabSize",4,function(cm){resetModeState(cm)
+clearCaches(cm)
+regChange(cm)},true)
+option("lineSeparator",null,function(cm,val){cm.doc.lineSep=val
+if(!val){return}
+var newBreaks=[],lineNo=cm.doc.first
+cm.doc.iter(function(line){for(var pos=0;;){var found=line.text.indexOf(val,pos)
+if(found==-1){break}
+pos=found+val.length
+newBreaks.push(Pos(lineNo,found))}
+lineNo++})
+for(var i=newBreaks.length-1;i>=0;i--)
+{replaceRange(cm.doc,val,newBreaks[i],Pos(newBreaks[i].line,newBreaks[i].ch+val.length))}})
+option("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g,function(cm,val,old){cm.state.specialChars=new RegExp(val.source+(val.test("\t")?"":"|\t"),"g")
+if(old!=Init){cm.refresh()}})
+option("specialCharPlaceholder",defaultSpecialCharPlaceholder,function(cm){return cm.refresh();},true)
+option("electricChars",true)
+option("inputStyle",mobile?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},true)
+option("spellcheck",false,function(cm,val){return cm.getInputField().spellcheck=val;},true)
+option("rtlMoveVisually",!windows)
+option("wholeLineUpdateBefore",true)
+option("theme","default",function(cm){themeChanged(cm)
+guttersChanged(cm)},true)
+option("keyMap","default",function(cm,val,old){var next=getKeyMap(val)
+var prev=old!=Init&&getKeyMap(old)
+if(prev&&prev.detach){prev.detach(cm,next)}
+if(next.attach){next.attach(cm,prev||null)}})
+option("extraKeys",null)
+option("configureMouse",null)
+option("lineWrapping",false,wrappingChanged,true)
+option("gutters",[],function(cm){setGuttersForLineNumbers(cm.options)
+guttersChanged(cm)},true)
+option("fixedGutter",true,function(cm,val){cm.display.gutters.style.left=val?compensateForHScroll(cm.display)+"px":"0"
+cm.refresh()},true)
+option("coverGutterNextToScrollbar",false,function(cm){return updateScrollbars(cm);},true)
+option("scrollbarStyle","native",function(cm){initScrollbars(cm)
+updateScrollbars(cm)
+cm.display.scrollbars.setScrollTop(cm.doc.scrollTop)
+cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft)},true)
+option("lineNumbers",false,function(cm){setGuttersForLineNumbers(cm.options)
+guttersChanged(cm)},true)
+option("firstLineNumber",1,guttersChanged,true)
+option("lineNumberFormatter",function(integer){return integer;},guttersChanged,true)
+option("showCursorWhenSelecting",false,updateSelection,true)
+option("resetSelectionOnContextMenu",true)
+option("lineWiseCopyCut",true)
+option("pasteLinesPerSelection",true)
+option("readOnly",false,function(cm,val){if(val=="nocursor"){onBlur(cm)
+cm.display.input.blur()}
+cm.display.input.readOnlyChanged(val)})
+option("disableInput",false,function(cm,val){if(!val){cm.display.input.reset()}},true)
+option("dragDrop",true,dragDropChanged)
+option("allowDropFileTypes",null)
+option("cursorBlinkRate",530)
+option("cursorScrollMargin",0)
+option("cursorHeight",1,updateSelection,true)
+option("singleCursorHeightPerLine",true,updateSelection,true)
+option("workTime",100)
+option("workDelay",100)
+option("flattenSpans",true,resetModeState,true)
+option("addModeClass",false,resetModeState,true)
+option("pollInterval",100)
+option("undoDepth",200,function(cm,val){return cm.doc.history.undoDepth=val;})
+option("historyEventDelay",1250)
+option("viewportMargin",10,function(cm){return cm.refresh();},true)
+option("maxHighlightLength",10000,resetModeState,true)
+option("moveInputWithCursor",true,function(cm,val){if(!val){cm.display.input.resetPosition()}})
+option("tabindex",null,function(cm,val){return cm.display.input.getField().tabIndex=val||"";})
+option("autofocus",null)
+option("direction","ltr",function(cm,val){return cm.doc.setDirection(val);},true)}
+function guttersChanged(cm){updateGutters(cm)
+regChange(cm)
+alignHorizontally(cm)}
+function dragDropChanged(cm,value,old){var wasOn=old&&old!=Init
+if(!value!=!wasOn){var funcs=cm.display.dragFunctions
+var toggle=value?on:off
+toggle(cm.display.scroller,"dragstart",funcs.start)
+toggle(cm.display.scroller,"dragenter",funcs.enter)
+toggle(cm.display.scroller,"dragover",funcs.over)
+toggle(cm.display.scroller,"dragleave",funcs.leave)
+toggle(cm.display.scroller,"drop",funcs.drop)}}
+function wrappingChanged(cm){if(cm.options.lineWrapping){addClass(cm.display.wrapper,"CodeMirror-wrap")
+cm.display.sizer.style.minWidth=""
+cm.display.sizerWidth=null}else{rmClass(cm.display.wrapper,"CodeMirror-wrap")
+findMaxLine(cm)}
+estimateLineHeights(cm)
+regChange(cm)
+clearCaches(cm)
+setTimeout(function(){return updateScrollbars(cm);},100)}
+function CodeMirror(place,options){var this$1=this;if(!(this instanceof CodeMirror)){return new CodeMirror(place,options)}
+this.options=options=options?copyObj(options):{}
+copyObj(defaults,options,false)
+setGuttersForLineNumbers(options)
+var doc=options.value
+if(typeof doc=="string"){doc=new Doc(doc,options.mode,null,options.lineSeparator,options.direction)}
+this.doc=doc
+var input=new CodeMirror.inputStyles[options.inputStyle](this)
+var display=this.display=new Display(place,doc,input)
+display.wrapper.CodeMirror=this
+updateGutters(this)
+themeChanged(this)
+if(options.lineWrapping)
+{this.display.wrapper.className+=" CodeMirror-wrap"}
+initScrollbars(this)
+this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:false,delayingBlurEvent:false,focused:false,suppressEdits:false,pasteIncoming:false,cutIncoming:false,selectingText:false,draggingText:false,highlight:new Delayed(),keySeq:null,specialChars:null}
+if(options.autofocus&&!mobile){display.input.focus()}
+if(ie&&ie_version<11){setTimeout(function(){return this$1.display.input.reset(true);},20)}
+registerEventHandlers(this)
+ensureGlobalHandlers()
+startOperation(this)
+this.curOp.forceUpdate=true
+attachDoc(this,doc)
+if((options.autofocus&&!mobile)||this.hasFocus())
+{setTimeout(bind(onFocus,this),20)}
+else
+{onBlur(this)}
+for(var opt in optionHandlers){if(optionHandlers.hasOwnProperty(opt))
+{optionHandlers[opt](this$1,options[opt],Init)}}
+maybeUpdateLineNumberWidth(this)
+if(options.finishInit){options.finishInit(this)}
+for(var i=0;i20*20}
+on(d.scroller,"touchstart",function(e){if(!signalDOMEvent(cm,e)&&!isMouseLikeTouchEvent(e)&&!clickInGutter(cm,e)){d.input.ensurePolled()
+clearTimeout(touchFinished)
+var now=+new Date
+d.activeTouch={start:now,moved:false,prev:now-prevTouch.end<=300?prevTouch:null}
+if(e.touches.length==1){d.activeTouch.left=e.touches[0].pageX
+d.activeTouch.top=e.touches[0].pageY}}})
+on(d.scroller,"touchmove",function(){if(d.activeTouch){d.activeTouch.moved=true}})
+on(d.scroller,"touchend",function(e){var touch=d.activeTouch
+if(touch&&!eventInWidget(d,e)&&touch.left!=null&&!touch.moved&&new Date-touch.start<300){var pos=cm.coordsChar(d.activeTouch,"page"),range
+if(!touch.prev||farAway(touch,touch.prev))
+{range=new Range(pos,pos)}
+else if(!touch.prev.prev||farAway(touch,touch.prev.prev))
+{range=cm.findWordAt(pos)}
+else
+{range=new Range(Pos(pos.line,0),clipPos(cm.doc,Pos(pos.line+1,0)))}
+cm.setSelection(range.anchor,range.head)
+cm.focus()
+e_preventDefault(e)}
+finishTouch()})
+on(d.scroller,"touchcancel",finishTouch)
+on(d.scroller,"scroll",function(){if(d.scroller.clientHeight){updateScrollTop(cm,d.scroller.scrollTop)
+setScrollLeft(cm,d.scroller.scrollLeft,true)
+signal(cm,"scroll",cm)}})
+on(d.scroller,"mousewheel",function(e){return onScrollWheel(cm,e);})
+on(d.scroller,"DOMMouseScroll",function(e){return onScrollWheel(cm,e);})
+on(d.wrapper,"scroll",function(){return d.wrapper.scrollTop=d.wrapper.scrollLeft=0;})
+d.dragFunctions={enter:function(e){if(!signalDOMEvent(cm,e)){e_stop(e)}},over:function(e){if(!signalDOMEvent(cm,e)){onDragOver(cm,e);e_stop(e)}},start:function(e){return onDragStart(cm,e);},drop:operation(cm,onDrop),leave:function(e){if(!signalDOMEvent(cm,e)){clearDragCursor(cm)}}}
+var inp=d.input.getField()
+on(inp,"keyup",function(e){return onKeyUp.call(cm,e);})
+on(inp,"keydown",operation(cm,onKeyDown))
+on(inp,"keypress",operation(cm,onKeyPress))
+on(inp,"focus",function(e){return onFocus(cm,e);})
+on(inp,"blur",function(e){return onBlur(cm,e);})}
+var initHooks=[]
+CodeMirror.defineInitHook=function(f){return initHooks.push(f);}
+function indentLine(cm,n,how,aggressive){var doc=cm.doc,state
+if(how==null){how="add"}
+if(how=="smart"){if(!doc.mode.indent){how="prev"}
+else{state=getContextBefore(cm,n).state}}
+var tabSize=cm.options.tabSize
+var line=getLine(doc,n),curSpace=countColumn(line.text,null,tabSize)
+if(line.stateAfter){line.stateAfter=null}
+var curSpaceString=line.text.match(/^\s*/)[0],indentation
+if(!aggressive&&!/\S/.test(line.text)){indentation=0
+how="not"}else if(how=="smart"){indentation=doc.mode.indent(state,line.text.slice(curSpaceString.length),line.text)
+if(indentation==Pass||indentation>150){if(!aggressive){return}
+how="prev"}}
+if(how=="prev"){if(n>doc.first){indentation=countColumn(getLine(doc,n-1).text,null,tabSize)}
+else{indentation=0}}else if(how=="add"){indentation=curSpace+cm.options.indentUnit}else if(how=="subtract"){indentation=curSpace-cm.options.indentUnit}else if(typeof how=="number"){indentation=curSpace+how}
+indentation=Math.max(0,indentation)
+var indentString="",pos=0
+if(cm.options.indentWithTabs)
+{for(var i=Math.floor(indentation / tabSize);i;--i){pos+=tabSize;indentString+="\t"}}
+if(pos1){if(lastCopied&&lastCopied.text.join("\n")==inserted){if(sel.ranges.length%lastCopied.text.length==0){multiPaste=[]
+for(var i=0;i=0;i$1--){var range=sel.ranges[i$1]
+var from=range.from(),to=range.to()
+if(range.empty()){if(deleted&&deleted>0)
+{from=Pos(from.line,from.ch-deleted)}
+else if(cm.state.overwrite&&!paste)
+{to=Pos(to.line,Math.min(getLine(doc,to.line).text.length,to.ch+lst(textLines).length))}
+else if(lastCopied&&lastCopied.lineWise&&lastCopied.text.join("\n")==inserted)
+{from=to=Pos(from.line,0)}}
+updateInput=cm.curOp.updateInput
+var changeEvent={from:from,to:to,text:multiPaste?multiPaste[i$1%multiPaste.length]:textLines,origin:origin||(paste?"paste":cm.state.cutIncoming?"cut":"+input")}
+makeChange(cm.doc,changeEvent)
+signalLater(cm,"inputRead",cm,changeEvent)}
+if(inserted&&!paste)
+{triggerElectric(cm,inserted)}
+ensureCursorVisible(cm)
+cm.curOp.updateInput=updateInput
+cm.curOp.typing=true
+cm.state.pasteIncoming=cm.state.cutIncoming=false}
+function handlePaste(e,cm){var pasted=e.clipboardData&&e.clipboardData.getData("Text")
+if(pasted){e.preventDefault()
+if(!cm.isReadOnly()&&!cm.options.disableInput)
+{runInOp(cm,function(){return applyTextInput(cm,pasted,0,null,"paste");})}
+return true}}
+function triggerElectric(cm,inserted){if(!cm.options.electricChars||!cm.options.smartIndent){return}
+var sel=cm.doc.sel
+for(var i=sel.ranges.length-1;i>=0;i--){var range=sel.ranges[i]
+if(range.head.ch>100||(i&&sel.ranges[i-1].head.line==range.head.line)){continue}
+var mode=cm.getModeAt(range.head)
+var indented=false
+if(mode.electricChars){for(var j=0;j-1){indented=indentLine(cm,range.head.line,"smart")
+break}}}else if(mode.electricInput){if(mode.electricInput.test(getLine(cm.doc,range.head.line).text.slice(0,range.head.ch)))
+{indented=indentLine(cm,range.head.line,"smart")}}
+if(indented){signalLater(cm,"electricInput",cm,range.head.line)}}}
+function copyableRanges(cm){var text=[],ranges=[]
+for(var i=0;i0)
+{replaceOneSelection(this$1.doc,i,new Range(from,newRanges[i].to()),sel_dontScroll)}}else if(range.head.line>end){indentLine(this$1,range.head.line,how,true)
+end=range.head.line
+if(i==this$1.doc.sel.primIndex){ensureCursorVisible(this$1)}}}}),getTokenAt:function(pos,precise){return takeToken(this,pos,precise)},getLineTokens:function(line,precise){return takeToken(this,Pos(line),precise,true)},getTokenTypeAt:function(pos){pos=clipPos(this.doc,pos)
+var styles=getLineStyles(this,getLine(this.doc,pos.line))
+var before=0,after=(styles.length-1)/ 2,ch=pos.ch
+var type
+if(ch==0){type=styles[2]}
+else{for(;;){var mid=(before+after)>>1
+if((mid?styles[mid*2-1]:0)>=ch){after=mid}
+else if(styles[mid*2+1]last){line=last;end=true}
+lineObj=getLine(this.doc,line)}else{lineObj=line}
+return intoCoordSystem(this,lineObj,{top:0,left:0},mode||"page",includeWidgets||end).top+
+(end?this.doc.height-heightAtLine(lineObj):0)},defaultTextHeight:function(){return textHeight(this.display)},defaultCharWidth:function(){return charWidth(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(pos,node,scroll,vert,horiz){var display=this.display
+pos=cursorCoords(this,clipPos(this.doc,pos))
+var top=pos.bottom,left=pos.left
+node.style.position="absolute"
+node.setAttribute("cm-ignore-events","true")
+this.display.input.setUneditable(node)
+display.sizer.appendChild(node)
+if(vert=="over"){top=pos.top}else if(vert=="above"||vert=="near"){var vspace=Math.max(display.wrapper.clientHeight,this.doc.height),hspace=Math.max(display.sizer.clientWidth,display.lineSpace.clientWidth)
+if((vert=='above'||pos.bottom+node.offsetHeight>vspace)&&pos.top>node.offsetHeight)
+{top=pos.top-node.offsetHeight}
+else if(pos.bottom+node.offsetHeight<=vspace)
+{top=pos.bottom}
+if(left+node.offsetWidth>hspace)
+{left=hspace-node.offsetWidth}}
+node.style.top=top+"px"
+node.style.left=node.style.right=""
+if(horiz=="right"){left=display.sizer.clientWidth-node.offsetWidth
+node.style.right="0px"}else{if(horiz=="left"){left=0}
+else if(horiz=="middle"){left=(display.sizer.clientWidth-node.offsetWidth)/ 2}
+node.style.left=left+"px"}
+if(scroll)
+{scrollIntoView(this,{left:left,top:top,right:left+node.offsetWidth,bottom:top+node.offsetHeight})}},triggerOnKeyDown:methodOp(onKeyDown),triggerOnKeyPress:methodOp(onKeyPress),triggerOnKeyUp:onKeyUp,triggerOnMouseDown:methodOp(onMouseDown),execCommand:function(cmd){if(commands.hasOwnProperty(cmd))
+{return commands[cmd].call(null,this)}},triggerElectric:methodOp(function(text){triggerElectric(this,text)}),findPosH:function(from,amount,unit,visually){var this$1=this;var dir=1
+if(amount<0){dir=-1;amount=-amount}
+var cur=clipPos(this.doc,from)
+for(var i=0;i0&&check(line.charAt(start-1))){--start}
+while(end.5)
+{estimateLineHeights(this)}
+signal(this,"refresh",this)}),swapDoc:methodOp(function(doc){var old=this.doc
+old.cm=null
+attachDoc(this,doc)
+clearCaches(this)
+this.display.input.reset()
+scrollToCoords(this,doc.scrollLeft,doc.scrollTop)
+this.curOp.forceScroll=true
+signalLater(this,"swapDoc",this,old)
+return old}),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}}
+eventMixin(CodeMirror)
+CodeMirror.registerHelper=function(type,name,value){if(!helpers.hasOwnProperty(type)){helpers[type]=CodeMirror[type]={_global:[]}}
+helpers[type][name]=value}
+CodeMirror.registerGlobalHelper=function(type,name,predicate,value){CodeMirror.registerHelper(type,name,value)
+helpers[type]._global.push({pred:predicate,val:value})}}
+function findPosH(doc,pos,dir,unit,visually){var oldPos=pos
+var origDir=dir
+var lineObj=getLine(doc,pos.line)
+function findNextLine(){var l=pos.line+dir
+if(l=doc.first+doc.size){return false}
+pos=new Pos(l,pos.ch,pos.sticky)
+return lineObj=getLine(doc,l)}
+function moveOnce(boundToLine){var next
+if(visually){next=moveVisually(doc.cm,lineObj,pos,dir)}else{next=moveLogically(lineObj,pos,dir)}
+if(next==null){if(!boundToLine&&findNextLine())
+{pos=endOfLine(visually,doc.cm,lineObj,pos.line,dir)}
+else
+{return false}}else{pos=next}
+return true}
+if(unit=="char"){moveOnce()}else if(unit=="column"){moveOnce(true)}else if(unit=="word"||unit=="group"){var sawType=null,group=unit=="group"
+var helper=doc.cm&&doc.cm.getHelper(pos,"wordChars")
+for(var first=true;;first=false){if(dir<0&&!moveOnce(!first)){break}
+var cur=lineObj.text.charAt(pos.ch)||"\n"
+var type=isWordChar(cur,helper)?"w":group&&cur=="\n"?"n":!group||/\s/.test(cur)?null:"p"
+if(group&&!first&&!type){type="s"}
+if(sawType&&sawType!=type){if(dir<0){dir=1;moveOnce();pos.sticky="after"}
+break}
+if(type){sawType=type}
+if(dir>0&&!moveOnce(!first)){break}}}
+var result=skipAtomic(doc,pos,oldPos,origDir,true)
+if(equalCursorPos(oldPos,result)){result.hitSide=true}
+return result}
+function findPosV(cm,pos,dir,unit){var doc=cm.doc,x=pos.left,y
+if(unit=="page"){var pageSize=Math.min(cm.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight)
+var moveAmount=Math.max(pageSize-.5*textHeight(cm.display),3)
+y=(dir>0?pos.bottom:pos.top)+dir*moveAmount}else if(unit=="line"){y=dir>0?pos.bottom+3:pos.top-3}
+var target
+for(;;){target=coordsChar(cm,x,y)
+if(!target.outside){break}
+if(dir<0?y<=0:y>=doc.height){target.hitSide=true;break}
+y+=dir*5}
+return target}
+var ContentEditableInput=function(cm){this.cm=cm
+this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null
+this.polling=new Delayed()
+this.composing=null
+this.gracePeriod=false
+this.readDOMTimeout=null};ContentEditableInput.prototype.init=function(display){var this$1=this;var input=this,cm=input.cm
+var div=input.div=display.lineDiv
+disableBrowserMagic(div,cm.options.spellcheck)
+on(div,"paste",function(e){if(signalDOMEvent(cm,e)||handlePaste(e,cm)){return}
+if(ie_version<=11){setTimeout(operation(cm,function(){return this$1.updateFromDOM();}),20)}})
+on(div,"compositionstart",function(e){this$1.composing={data:e.data,done:false}})
+on(div,"compositionupdate",function(e){if(!this$1.composing){this$1.composing={data:e.data,done:false}}})
+on(div,"compositionend",function(e){if(this$1.composing){if(e.data!=this$1.composing.data){this$1.readFromDOMSoon()}
+this$1.composing.done=true}})
+on(div,"touchstart",function(){return input.forceCompositionEnd();})
+on(div,"input",function(){if(!this$1.composing){this$1.readFromDOMSoon()}})
+function onCopyCut(e){if(signalDOMEvent(cm,e)){return}
+if(cm.somethingSelected()){setLastCopied({lineWise:false,text:cm.getSelections()})
+if(e.type=="cut"){cm.replaceSelection("",null,"cut")}}else if(!cm.options.lineWiseCopyCut){return}else{var ranges=copyableRanges(cm)
+setLastCopied({lineWise:true,text:ranges.text})
+if(e.type=="cut"){cm.operation(function(){cm.setSelections(ranges.ranges,0,sel_dontScroll)
+cm.replaceSelection("",null,"cut")})}}
+if(e.clipboardData){e.clipboardData.clearData()
+var content=lastCopied.text.join("\n")
+e.clipboardData.setData("Text",content)
+if(e.clipboardData.getData("Text")==content){e.preventDefault()
+return}}
+var kludge=hiddenTextarea(),te=kludge.firstChild
+cm.display.lineSpace.insertBefore(kludge,cm.display.lineSpace.firstChild)
+te.value=lastCopied.text.join("\n")
+var hadFocus=document.activeElement
+selectInput(te)
+setTimeout(function(){cm.display.lineSpace.removeChild(kludge)
+hadFocus.focus()
+if(hadFocus==div){input.showPrimarySelection()}},50)}
+on(div,"copy",onCopyCut)
+on(div,"cut",onCopyCut)};ContentEditableInput.prototype.prepareSelection=function(){var result=prepareSelection(this.cm,false)
+result.focus=this.cm.state.focused
+return result};ContentEditableInput.prototype.showSelection=function(info,takeFocus){if(!info||!this.cm.display.view.length){return}
+if(info.focus||takeFocus){this.showPrimarySelection()}
+this.showMultipleSelections(info)};ContentEditableInput.prototype.showPrimarySelection=function(){var sel=window.getSelection(),cm=this.cm,prim=cm.doc.sel.primary()
+var from=prim.from(),to=prim.to()
+if(cm.display.viewTo==cm.display.viewFrom||from.line>=cm.display.viewTo||to.line=cm.display.viewFrom&&posToDOM(cm,from))||{node:view[0].measure.map[2],offset:0}
+var end=to.linecm.firstLine())
+{from=Pos(from.line-1,getLine(cm.doc,from.line-1).length)}
+if(to.ch==getLine(cm.doc,to.line).text.length&&to.linedisplay.viewTo-1){return false}
+var fromIndex,fromLine,fromNode
+if(from.line==display.viewFrom||(fromIndex=findViewIndex(cm,from.line))==0){fromLine=lineNo(display.view[0].line)
+fromNode=display.view[0].node}else{fromLine=lineNo(display.view[fromIndex].line)
+fromNode=display.view[fromIndex-1].node.nextSibling}
+var toIndex=findViewIndex(cm,to.line)
+var toLine,toNode
+if(toIndex==display.view.length-1){toLine=display.viewTo-1
+toNode=display.lineDiv.lastChild}else{toLine=lineNo(display.view[toIndex+1].line)-1
+toNode=display.view[toIndex+1].node.previousSibling}
+if(!fromNode){return false}
+var newText=cm.doc.splitLines(domTextBetween(cm,fromNode,toNode,fromLine,toLine))
+var oldText=getBetween(cm.doc,Pos(fromLine,0),Pos(toLine,getLine(cm.doc,toLine).text.length))
+while(newText.length>1&&oldText.length>1){if(lst(newText)==lst(oldText)){newText.pop();oldText.pop();toLine--}
+else if(newText[0]==oldText[0]){newText.shift();oldText.shift();fromLine++}
+else{break}}
+var cutFront=0,cutEnd=0
+var newTop=newText[0],oldTop=oldText[0],maxCutFront=Math.min(newTop.length,oldTop.length)
+while(cutFrontfrom.ch&&newBot.charCodeAt(newBot.length-cutEnd-1)==oldBot.charCodeAt(oldBot.length-cutEnd-1)){cutFront--
+cutEnd++}}
+newText[newText.length-1]=newBot.slice(0,newBot.length-cutEnd).replace(/^\u200b+/,"")
+newText[0]=newText[0].slice(cutFront).replace(/\u200b+$/,"")
+var chFrom=Pos(fromLine,cutFront)
+var chTo=Pos(toLine,oldText.length?lst(oldText).length-cutEnd:0)
+if(newText.length>1||newText[0]||cmp(chFrom,chTo)){replaceRange(cm.doc,newText,chFrom,chTo,"+input")
+return true}};ContentEditableInput.prototype.ensurePolled=function(){this.forceCompositionEnd()};ContentEditableInput.prototype.reset=function(){this.forceCompositionEnd()};ContentEditableInput.prototype.forceCompositionEnd=function(){if(!this.composing){return}
+clearTimeout(this.readDOMTimeout)
+this.composing=null
+this.updateFromDOM()
+this.div.blur()
+this.div.focus()};ContentEditableInput.prototype.readFromDOMSoon=function(){var this$1=this;if(this.readDOMTimeout!=null){return}
+this.readDOMTimeout=setTimeout(function(){this$1.readDOMTimeout=null
+if(this$1.composing){if(this$1.composing.done){this$1.composing=null}
+else{return}}
+this$1.updateFromDOM()},80)};ContentEditableInput.prototype.updateFromDOM=function(){var this$1=this;if(this.cm.isReadOnly()||!this.pollContent())
+{runInOp(this.cm,function(){return regChange(this$1.cm);})}};ContentEditableInput.prototype.setUneditable=function(node){node.contentEditable="false"};ContentEditableInput.prototype.onKeyPress=function(e){if(e.charCode==0){return}
+e.preventDefault()
+if(!this.cm.isReadOnly())
+{operation(this.cm,applyTextInput)(this.cm,String.fromCharCode(e.charCode==null?e.keyCode:e.charCode),0)}};ContentEditableInput.prototype.readOnlyChanged=function(val){this.div.contentEditable=String(val!="nocursor")};ContentEditableInput.prototype.onContextMenu=function(){};ContentEditableInput.prototype.resetPosition=function(){};ContentEditableInput.prototype.needsContentAttribute=true
+function posToDOM(cm,pos){var view=findViewForLine(cm,pos.line)
+if(!view||view.hidden){return null}
+var line=getLine(cm.doc,pos.line)
+var info=mapFromLineView(view,line,pos.line)
+var order=getOrder(line,cm.doc.direction),side="left"
+if(order){var partPos=getBidiPartAt(order,pos.ch)
+side=partPos%2?"right":"left"}
+var result=nodeAndOffsetInLineMap(info.map,pos.ch,side)
+result.offset=result.collapse=="right"?result.end:result.start
+return result}
+function isInGutter(node){for(var scan=node;scan;scan=scan.parentNode)
+{if(/CodeMirror-gutter-wrapper/.test(scan.className)){return true}}
+return false}
+function badPos(pos,bad){if(bad){pos.bad=true;}return pos}
+function domTextBetween(cm,from,to,fromLine,toLine){var text="",closing=false,lineSep=cm.doc.lineSeparator()
+function recognizeMarker(id){return function(marker){return marker.id==id;}}
+function close(){if(closing){text+=lineSep
+closing=false}}
+function addText(str){if(str){close()
+text+=str}}
+function walk(node){if(node.nodeType==1){var cmText=node.getAttribute("cm-text")
+if(cmText!=null){addText(cmText||node.textContent.replace(/\u200b/g,""))
+return}
+var markerID=node.getAttribute("cm-marker"),range
+if(markerID){var found=cm.findMarks(Pos(fromLine,0),Pos(toLine+1,0),recognizeMarker(+markerID))
+if(found.length&&(range=found[0].find(0)))
+{addText(getBetween(cm.doc,range.from,range.to).join(lineSep))}
+return}
+if(node.getAttribute("contenteditable")=="false"){return}
+var isBlock=/^(pre|div|p)$/i.test(node.nodeName)
+if(isBlock){close()}
+for(var i=0;i=9&&this$1.hasSelection){this$1.hasSelection=null}
+input.poll()})
+on(te,"paste",function(e){if(signalDOMEvent(cm,e)||handlePaste(e,cm)){return}
+cm.state.pasteIncoming=true
+input.fastPoll()})
+function prepareCopyCut(e){if(signalDOMEvent(cm,e)){return}
+if(cm.somethingSelected()){setLastCopied({lineWise:false,text:cm.getSelections()})}else if(!cm.options.lineWiseCopyCut){return}else{var ranges=copyableRanges(cm)
+setLastCopied({lineWise:true,text:ranges.text})
+if(e.type=="cut"){cm.setSelections(ranges.ranges,null,sel_dontScroll)}else{input.prevInput=""
+te.value=ranges.text.join("\n")
+selectInput(te)}}
+if(e.type=="cut"){cm.state.cutIncoming=true}}
+on(te,"cut",prepareCopyCut)
+on(te,"copy",prepareCopyCut)
+on(display.scroller,"paste",function(e){if(eventInWidget(display,e)||signalDOMEvent(cm,e)){return}
+cm.state.pasteIncoming=true
+input.focus()})
+on(display.lineSpace,"selectstart",function(e){if(!eventInWidget(display,e)){e_preventDefault(e)}})
+on(te,"compositionstart",function(){var start=cm.getCursor("from")
+if(input.composing){input.composing.range.clear()}
+input.composing={start:start,range:cm.markText(start,cm.getCursor("to"),{className:"CodeMirror-composing"})}})
+on(te,"compositionend",function(){if(input.composing){input.poll()
+input.composing.range.clear()
+input.composing=null}})};TextareaInput.prototype.prepareSelection=function(){var cm=this.cm,display=cm.display,doc=cm.doc
+var result=prepareSelection(cm)
+if(cm.options.moveInputWithCursor){var headPos=cursorCoords(cm,doc.sel.primary().head,"div")
+var wrapOff=display.wrapper.getBoundingClientRect(),lineOff=display.lineDiv.getBoundingClientRect()
+result.teTop=Math.max(0,Math.min(display.wrapper.clientHeight-10,headPos.top+lineOff.top-wrapOff.top))
+result.teLeft=Math.max(0,Math.min(display.wrapper.clientWidth-10,headPos.left+lineOff.left-wrapOff.left))}
+return result};TextareaInput.prototype.showSelection=function(drawn){var cm=this.cm,display=cm.display
+removeChildrenAndAdd(display.cursorDiv,drawn.cursors)
+removeChildrenAndAdd(display.selectionDiv,drawn.selection)
+if(drawn.teTop!=null){this.wrapper.style.top=drawn.teTop+"px"
+this.wrapper.style.left=drawn.teLeft+"px"}};TextareaInput.prototype.reset=function(typing){if(this.contextMenuPending||this.composing){return}
+var cm=this.cm
+if(cm.somethingSelected()){this.prevInput=""
+var content=cm.getSelection()
+this.textarea.value=content
+if(cm.state.focused){selectInput(this.textarea)}
+if(ie&&ie_version>=9){this.hasSelection=content}}else if(!typing){this.prevInput=this.textarea.value=""
+if(ie&&ie_version>=9){this.hasSelection=null}}};TextareaInput.prototype.getField=function(){return this.textarea};TextareaInput.prototype.supportsTouch=function(){return false};TextareaInput.prototype.focus=function(){if(this.cm.options.readOnly!="nocursor"&&(!mobile||activeElt()!=this.textarea)){try{this.textarea.focus()}
+catch(e){}}};TextareaInput.prototype.blur=function(){this.textarea.blur()};TextareaInput.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0};TextareaInput.prototype.receivedFocus=function(){this.slowPoll()};TextareaInput.prototype.slowPoll=function(){var this$1=this;if(this.pollingFast){return}
+this.polling.set(this.cm.options.pollInterval,function(){this$1.poll()
+if(this$1.cm.state.focused){this$1.slowPoll()}})};TextareaInput.prototype.fastPoll=function(){var missed=false,input=this
+input.pollingFast=true
+function p(){var changed=input.poll()
+if(!changed&&!missed){missed=true;input.polling.set(60,p)}
+else{input.pollingFast=false;input.slowPoll()}}
+input.polling.set(20,p)};TextareaInput.prototype.poll=function(){var this$1=this;var cm=this.cm,input=this.textarea,prevInput=this.prevInput
+if(this.contextMenuPending||!cm.state.focused||(hasSelection(input)&&!prevInput&&!this.composing)||cm.isReadOnly()||cm.options.disableInput||cm.state.keySeq)
+{return false}
+var text=input.value
+if(text==prevInput&&!cm.somethingSelected()){return false}
+if(ie&&ie_version>=9&&this.hasSelection===text||mac&&/[\uf700-\uf7ff]/.test(text)){cm.display.input.reset()
+return false}
+if(cm.doc.sel==cm.display.selForContextMenu){var first=text.charCodeAt(0)
+if(first==0x200b&&!prevInput){prevInput="\u200b"}
+if(first==0x21da){this.reset();return this.cm.execCommand("undo")}}
+var same=0,l=Math.min(prevInput.length,text.length)
+while(same1000||text.indexOf("\n")>-1){input.value=this$1.prevInput=""}
+else{this$1.prevInput=text}
+if(this$1.composing){this$1.composing.range.clear()
+this$1.composing.range=cm.markText(this$1.composing.start,cm.getCursor("to"),{className:"CodeMirror-composing"})}})
+return true};TextareaInput.prototype.ensurePolled=function(){if(this.pollingFast&&this.poll()){this.pollingFast=false}};TextareaInput.prototype.onKeyPress=function(){if(ie&&ie_version>=9){this.hasSelection=null}
+this.fastPoll()};TextareaInput.prototype.onContextMenu=function(e){var input=this,cm=input.cm,display=cm.display,te=input.textarea
+var pos=posFromMouse(cm,e),scrollPos=display.scroller.scrollTop
+if(!pos||presto){return}
+var reset=cm.options.resetSelectionOnContextMenu
+if(reset&&cm.doc.sel.contains(pos)==-1)
+{operation(cm,setSelection)(cm.doc,simpleSelection(pos),sel_dontScroll)}
+var oldCSS=te.style.cssText,oldWrapperCSS=input.wrapper.style.cssText
+input.wrapper.style.cssText="position: absolute"
+var wrapperBox=input.wrapper.getBoundingClientRect()
+te.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-wrapperBox.top-5)+"px; left: "+(e.clientX-wrapperBox.left-5)+"px;\n z-index: 1000; background: "+(ie?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"
+var oldScrollY
+if(webkit){oldScrollY=window.scrollY}
+display.input.focus()
+if(webkit){window.scrollTo(null,oldScrollY)}
+display.input.reset()
+if(!cm.somethingSelected()){te.value=input.prevInput=" "}
+input.contextMenuPending=true
+display.selForContextMenu=cm.doc.sel
+clearTimeout(display.detectingSelectAll)
+function prepareSelectAllHack(){if(te.selectionStart!=null){var selected=cm.somethingSelected()
+var extval="\u200b"+(selected?te.value:"")
+te.value="\u21da"
+te.value=extval
+input.prevInput=selected?"":"\u200b"
+te.selectionStart=1;te.selectionEnd=extval.length
+display.selForContextMenu=cm.doc.sel}}
+function rehide(){input.contextMenuPending=false
+input.wrapper.style.cssText=oldWrapperCSS
+te.style.cssText=oldCSS
+if(ie&&ie_version<9){display.scrollbars.setScrollTop(display.scroller.scrollTop=scrollPos)}
+if(te.selectionStart!=null){if(!ie||(ie&&ie_version<9)){prepareSelectAllHack()}
+var i=0,poll=function(){if(display.selForContextMenu==cm.doc.sel&&te.selectionStart==0&&te.selectionEnd>0&&input.prevInput=="\u200b"){operation(cm,selectAll)(cm)}else if(i++<10){display.detectingSelectAll=setTimeout(poll,500)}else{display.selForContextMenu=null
+display.input.reset()}}
+display.detectingSelectAll=setTimeout(poll,200)}}
+if(ie&&ie_version>=9){prepareSelectAllHack()}
+if(captureRightClick){e_stop(e)
+var mouseup=function(){off(window,"mouseup",mouseup)
+setTimeout(rehide,20)}
+on(window,"mouseup",mouseup)}else{setTimeout(rehide,50)}};TextareaInput.prototype.readOnlyChanged=function(val){if(!val){this.reset()}
+this.textarea.disabled=val=="nocursor"};TextareaInput.prototype.setUneditable=function(){};TextareaInput.prototype.needsContentAttribute=false
+function fromTextArea(textarea,options){options=options?copyObj(options):{}
+options.value=textarea.value
+if(!options.tabindex&&textarea.tabIndex)
+{options.tabindex=textarea.tabIndex}
+if(!options.placeholder&&textarea.placeholder)
+{options.placeholder=textarea.placeholder}
+if(options.autofocus==null){var hasFocus=activeElt()
+options.autofocus=hasFocus==textarea||textarea.getAttribute("autofocus")!=null&&hasFocus==document.body}
+function save(){textarea.value=cm.getValue()}
+var realSubmit
+if(textarea.form){on(textarea.form,"submit",save)
+if(!options.leaveSubmitMethodAlone){var form=textarea.form
+realSubmit=form.submit
+try{var wrappedSubmit=form.submit=function(){save()
+form.submit=realSubmit
+form.submit()
+form.submit=wrappedSubmit}}catch(e){}}}
+options.finishInit=function(cm){cm.save=save
+cm.getTextArea=function(){return textarea;}
+cm.toTextArea=function(){cm.toTextArea=isNaN
+save()
+textarea.parentNode.removeChild(cm.getWrapperElement())
+textarea.style.display=""
+if(textarea.form){off(textarea.form,"submit",save)
+if(typeof textarea.form.submit=="function")
+{textarea.form.submit=realSubmit}}}}
+textarea.style.display="none"
+var cm=CodeMirror(function(node){return textarea.parentNode.insertBefore(node,textarea.nextSibling);},options)
+return cm}
+function addLegacyProps(CodeMirror){CodeMirror.off=off
+CodeMirror.on=on
+CodeMirror.wheelEventPixels=wheelEventPixels
+CodeMirror.Doc=Doc
+CodeMirror.splitLines=splitLinesAuto
+CodeMirror.countColumn=countColumn
+CodeMirror.findColumn=findColumn
+CodeMirror.isWordChar=isWordCharBasic
+CodeMirror.Pass=Pass
+CodeMirror.signal=signal
+CodeMirror.Line=Line
+CodeMirror.changeEnd=changeEnd
+CodeMirror.scrollbarModel=scrollbarModel
+CodeMirror.Pos=Pos
+CodeMirror.cmpPos=cmp
+CodeMirror.modes=modes
+CodeMirror.mimeModes=mimeModes
+CodeMirror.resolveMode=resolveMode
+CodeMirror.getMode=getMode
+CodeMirror.modeExtensions=modeExtensions
+CodeMirror.extendMode=extendMode
+CodeMirror.copyState=copyState
+CodeMirror.startState=startState
+CodeMirror.innerMode=innerMode
+CodeMirror.commands=commands
+CodeMirror.keyMap=keyMap
+CodeMirror.keyName=keyName
+CodeMirror.isModifierKey=isModifierKey
+CodeMirror.lookupKey=lookupKey
+CodeMirror.normalizeKeyMap=normalizeKeyMap
+CodeMirror.StringStream=StringStream
+CodeMirror.SharedTextMarker=SharedTextMarker
+CodeMirror.TextMarker=TextMarker
+CodeMirror.LineWidget=LineWidget
+CodeMirror.e_preventDefault=e_preventDefault
+CodeMirror.e_stopPropagation=e_stopPropagation
+CodeMirror.e_stop=e_stop
+CodeMirror.addClass=addClass
+CodeMirror.contains=contains
+CodeMirror.rmClass=rmClass
+CodeMirror.keyNames=keyNames}
+defineOptions(CodeMirror)
+addEditorMethods(CodeMirror)
+var dontDelegate="iter insert remove copy getEditor constructor".split(" ")
+for(var prop in Doc.prototype){if(Doc.prototype.hasOwnProperty(prop)&&indexOf(dontDelegate,prop)<0)
+{CodeMirror.prototype[prop]=(function(method){return function(){return method.apply(this.doc,arguments)}})(Doc.prototype[prop])}}
+eventMixin(Doc)
+CodeMirror.inputStyles={"textarea":TextareaInput,"contenteditable":ContentEditableInput}
+CodeMirror.defineMode=function(name){if(!CodeMirror.defaults.mode&&name!="null"){CodeMirror.defaults.mode=name}
+defineMode.apply(this,arguments)}
+CodeMirror.defineMIME=defineMIME
+CodeMirror.defineMode("null",function(){return({token:function(stream){return stream.skipToEnd();}});})
+CodeMirror.defineMIME("text/plain","null")
+CodeMirror.defineExtension=function(name,func){CodeMirror.prototype[name]=func}
+CodeMirror.defineDocExtension=function(name,func){Doc.prototype[name]=func}
+CodeMirror.fromTextArea=fromTextArea
+addLegacyProps(CodeMirror)
+CodeMirror.version="5.33.0"
+return CodeMirror;})));