Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50675 views
1
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2
// Distributed under an MIT license: http://codemirror.net/LICENSE
3
4
(function(mod) {
5
if (typeof exports == "object" && typeof module == "object") // CommonJS
6
mod(require("../../lib/codemirror"));
7
else if (typeof define == "function" && define.amd) // AMD
8
define(["../../lib/codemirror"], mod);
9
else // Plain browser env
10
mod(CodeMirror);
11
})(function(CodeMirror) {
12
"use strict";
13
var GUTTER_ID = "CodeMirror-lint-markers";
14
15
function showTooltip(e, content) {
16
var tt = document.createElement("div");
17
tt.className = "CodeMirror-lint-tooltip";
18
tt.appendChild(content.cloneNode(true));
19
document.body.appendChild(tt);
20
21
function position(e) {
22
if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position);
23
tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px";
24
tt.style.left = (e.clientX + 5) + "px";
25
}
26
CodeMirror.on(document, "mousemove", position);
27
position(e);
28
if (tt.style.opacity != null) tt.style.opacity = 1;
29
return tt;
30
}
31
function rm(elt) {
32
if (elt.parentNode) elt.parentNode.removeChild(elt);
33
}
34
function hideTooltip(tt) {
35
if (!tt.parentNode) return;
36
if (tt.style.opacity == null) rm(tt);
37
tt.style.opacity = 0;
38
setTimeout(function() { rm(tt); }, 600);
39
}
40
41
function showTooltipFor(e, content, node) {
42
var tooltip = showTooltip(e, content);
43
function hide() {
44
CodeMirror.off(node, "mouseout", hide);
45
if (tooltip) { hideTooltip(tooltip); tooltip = null; }
46
}
47
var poll = setInterval(function() {
48
if (tooltip) for (var n = node;; n = n.parentNode) {
49
if (n == document.body) return;
50
if (!n) { hide(); break; }
51
}
52
if (!tooltip) return clearInterval(poll);
53
}, 400);
54
CodeMirror.on(node, "mouseout", hide);
55
}
56
57
function LintState(cm, options, hasGutter) {
58
this.marked = [];
59
this.options = options;
60
this.timeout = null;
61
this.hasGutter = hasGutter;
62
this.onMouseOver = function(e) { onMouseOver(cm, e); };
63
}
64
65
function parseOptions(cm, options) {
66
if (options instanceof Function) return {getAnnotations: options};
67
if (!options || options === true) options = {};
68
if (!options.getAnnotations) options.getAnnotations = cm.getHelper(CodeMirror.Pos(0, 0), "lint");
69
if (!options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)");
70
return options;
71
}
72
73
function clearMarks(cm) {
74
var state = cm.state.lint;
75
if (state.hasGutter) cm.clearGutter(GUTTER_ID);
76
for (var i = 0; i < state.marked.length; ++i)
77
state.marked[i].clear();
78
state.marked.length = 0;
79
}
80
81
function makeMarker(labels, severity, multiple, tooltips) {
82
var marker = document.createElement("div"), inner = marker;
83
marker.className = "CodeMirror-lint-marker-" + severity;
84
if (multiple) {
85
inner = marker.appendChild(document.createElement("div"));
86
inner.className = "CodeMirror-lint-marker-multiple";
87
}
88
89
if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {
90
showTooltipFor(e, labels, inner);
91
});
92
93
return marker;
94
}
95
96
function getMaxSeverity(a, b) {
97
if (a == "error") return a;
98
else return b;
99
}
100
101
function groupByLine(annotations) {
102
var lines = [];
103
for (var i = 0; i < annotations.length; ++i) {
104
var ann = annotations[i], line = ann.from.line;
105
(lines[line] || (lines[line] = [])).push(ann);
106
}
107
return lines;
108
}
109
110
function annotationTooltip(ann) {
111
var severity = ann.severity;
112
if (!severity) severity = "error";
113
var tip = document.createElement("div");
114
tip.className = "CodeMirror-lint-message-" + severity;
115
tip.appendChild(document.createTextNode(ann.message));
116
return tip;
117
}
118
119
function startLinting(cm) {
120
var state = cm.state.lint, options = state.options;
121
var passOptions = options.options || options; // Support deprecated passing of `options` property in options
122
if (options.async)
123
options.getAnnotations(cm.getValue(), updateLinting, passOptions, cm);
124
else
125
updateLinting(cm, options.getAnnotations(cm.getValue(), passOptions, cm));
126
}
127
128
function updateLinting(cm, annotationsNotSorted) {
129
clearMarks(cm);
130
var state = cm.state.lint, options = state.options;
131
132
var annotations = groupByLine(annotationsNotSorted);
133
134
for (var line = 0; line < annotations.length; ++line) {
135
var anns = annotations[line];
136
if (!anns) continue;
137
138
var maxSeverity = null;
139
var tipLabel = state.hasGutter && document.createDocumentFragment();
140
141
for (var i = 0; i < anns.length; ++i) {
142
var ann = anns[i];
143
var severity = ann.severity;
144
if (!severity) severity = "error";
145
maxSeverity = getMaxSeverity(maxSeverity, severity);
146
147
if (options.formatAnnotation) ann = options.formatAnnotation(ann);
148
if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
149
150
if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
151
className: "CodeMirror-lint-mark-" + severity,
152
__annotation: ann
153
}));
154
}
155
156
if (state.hasGutter)
157
cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1,
158
state.options.tooltips));
159
}
160
if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);
161
}
162
163
function onChange(cm) {
164
var state = cm.state.lint;
165
clearTimeout(state.timeout);
166
state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500);
167
}
168
169
function popupSpanTooltip(ann, e) {
170
var target = e.target || e.srcElement;
171
showTooltipFor(e, annotationTooltip(ann), target);
172
}
173
174
function onMouseOver(cm, e) {
175
var target = e.target || e.srcElement;
176
if (!/\bCodeMirror-lint-mark-/.test(target.className)) return;
177
var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;
178
var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client"));
179
for (var i = 0; i < spans.length; ++i) {
180
var ann = spans[i].__annotation;
181
if (ann) return popupSpanTooltip(ann, e);
182
}
183
}
184
185
CodeMirror.defineOption("lint", false, function(cm, val, old) {
186
if (old && old != CodeMirror.Init) {
187
clearMarks(cm);
188
cm.off("change", onChange);
189
CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver);
190
delete cm.state.lint;
191
}
192
193
if (val) {
194
var gutters = cm.getOption("gutters"), hasLintGutter = false;
195
for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;
196
var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);
197
cm.on("change", onChange);
198
if (state.options.tooltips != false)
199
CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);
200
201
startLinting(cm);
202
}
203
});
204
});
205
206