Path: blob/master/web-gui/buildyourownbotnet/assets/js/codemirror/addon/lint/lint.js
1293 views
(function() {1"use strict";2var GUTTER_ID = "CodeMirror-lint-markers";3var SEVERITIES = /^(?:error|warning)$/;45function showTooltip(e, content) {6var tt = document.createElement("div");7tt.className = "CodeMirror-lint-tooltip";8tt.appendChild(content.cloneNode(true));9document.body.appendChild(tt);1011function position(e) {12if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position);13tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px";14tt.style.left = (e.clientX + 5) + "px";15}16CodeMirror.on(document, "mousemove", position);17position(e);18if (tt.style.opacity != null) tt.style.opacity = 1;19return tt;20}21function rm(elt) {22if (elt.parentNode) elt.parentNode.removeChild(elt);23}24function hideTooltip(tt) {25if (!tt.parentNode) return;26if (tt.style.opacity == null) rm(tt);27tt.style.opacity = 0;28setTimeout(function() { rm(tt); }, 600);29}3031function showTooltipFor(e, content, node) {32var tooltip = showTooltip(e, content);33function hide() {34CodeMirror.off(node, "mouseout", hide);35if (tooltip) { hideTooltip(tooltip); tooltip = null; }36}37var poll = setInterval(function() {38if (tooltip) for (var n = node;; n = n.parentNode) {39if (n == document.body) return;40if (!n) { hide(); break; }41}42if (!tooltip) return clearInterval(poll);43}, 400);44CodeMirror.on(node, "mouseout", hide);45}4647function LintState(cm, options, hasGutter) {48this.marked = [];49this.options = options;50this.timeout = null;51this.hasGutter = hasGutter;52this.onMouseOver = function(e) { onMouseOver(cm, e); };53}5455function parseOptions(cm, options) {56if (options instanceof Function) return {getAnnotations: options};57if (!options || options === true) options = {};58if (!options.getAnnotations) options.getAnnotations = cm.getHelper(CodeMirror.Pos(0, 0), "lint");59if (!options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)");60return options;61}6263function clearMarks(cm) {64var state = cm.state.lint;65if (state.hasGutter) cm.clearGutter(GUTTER_ID);66for (var i = 0; i < state.marked.length; ++i)67state.marked[i].clear();68state.marked.length = 0;69}7071function makeMarker(labels, severity, multiple, tooltips) {72var marker = document.createElement("div"), inner = marker;73marker.className = "CodeMirror-lint-marker-" + severity;74if (multiple) {75inner = marker.appendChild(document.createElement("div"));76inner.className = "CodeMirror-lint-marker-multiple";77}7879if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {80showTooltipFor(e, labels, inner);81});8283return marker;84}8586function getMaxSeverity(a, b) {87if (a == "error") return a;88else return b;89}9091function groupByLine(annotations) {92var lines = [];93for (var i = 0; i < annotations.length; ++i) {94var ann = annotations[i], line = ann.from.line;95(lines[line] || (lines[line] = [])).push(ann);96}97return lines;98}99100function annotationTooltip(ann) {101var severity = ann.severity;102if (!SEVERITIES.test(severity)) severity = "error";103var tip = document.createElement("div");104tip.className = "CodeMirror-lint-message-" + severity;105tip.appendChild(document.createTextNode(ann.message));106return tip;107}108109function startLinting(cm) {110var state = cm.state.lint, options = state.options;111if (options.async)112options.getAnnotations(cm, updateLinting, options);113else114updateLinting(cm, options.getAnnotations(cm.getValue(), options.options));115}116117function updateLinting(cm, annotationsNotSorted) {118clearMarks(cm);119var state = cm.state.lint, options = state.options;120121var annotations = groupByLine(annotationsNotSorted);122123for (var line = 0; line < annotations.length; ++line) {124var anns = annotations[line];125if (!anns) continue;126127var maxSeverity = null;128var tipLabel = state.hasGutter && document.createDocumentFragment();129130for (var i = 0; i < anns.length; ++i) {131var ann = anns[i];132var severity = ann.severity;133if (!SEVERITIES.test(severity)) severity = "error";134maxSeverity = getMaxSeverity(maxSeverity, severity);135136if (options.formatAnnotation) ann = options.formatAnnotation(ann);137if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));138139if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {140className: "CodeMirror-lint-mark-" + severity,141__annotation: ann142}));143}144145if (state.hasGutter)146cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1,147state.options.tooltips));148}149if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);150}151152function onChange(cm) {153var state = cm.state.lint;154clearTimeout(state.timeout);155state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500);156}157158function popupSpanTooltip(ann, e) {159var target = e.target || e.srcElement;160showTooltipFor(e, annotationTooltip(ann), target);161}162163// When the mouseover fires, the cursor might not actually be over164// the character itself yet. These pairs of x,y offsets are used to165// probe a few nearby points when no suitable marked range is found.166var nearby = [0, 0, 0, 5, 0, -5, 5, 0, -5, 0];167168function onMouseOver(cm, e) {169if (!/\bCodeMirror-lint-mark-/.test((e.target || e.srcElement).className)) return;170for (var i = 0; i < nearby.length; i += 2) {171var spans = cm.findMarksAt(cm.coordsChar({left: e.clientX + nearby[i],172top: e.clientY + nearby[i + 1]}));173for (var j = 0; j < spans.length; ++j) {174var span = spans[j], ann = span.__annotation;175if (ann) return popupSpanTooltip(ann, e);176}177}178}179180function optionHandler(cm, val, old) {181if (old && old != CodeMirror.Init) {182clearMarks(cm);183cm.off("change", onChange);184CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver);185delete cm.state.lint;186}187188if (val) {189var gutters = cm.getOption("gutters"), hasLintGutter = false;190for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;191var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);192cm.on("change", onChange);193if (state.options.tooltips != false)194CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);195196startLinting(cm);197}198}199200CodeMirror.defineOption("lintWith", false, optionHandler); // deprecated201CodeMirror.defineOption("lint", false, optionHandler); // deprecated202})();203204205