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" : "") + "", - 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 ? "/" : "") 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 == ""); - } 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.maxScrollLeft