119 lines
3.9 KiB
JavaScript
119 lines
3.9 KiB
JavaScript
define(['react', 'lodash', 'jquery', './libs/codemirror-4.8/lib/codemirror'], function (React, _, $, CodeMirror) {
|
|
'use strict'
|
|
|
|
function annotationTooltip(ann) {
|
|
var severity = ann.severity
|
|
if (!severity) {
|
|
severity = 'error'
|
|
}
|
|
var tip = document.createElement('div')
|
|
tip.className = 'CodeMirror-lint-message-' + severity
|
|
tip.appendChild(document.createTextNode(ann.message))
|
|
return tip
|
|
}
|
|
|
|
var GUTTER_ID = 'rt-annotations'
|
|
|
|
function annotate(editor, annot) {
|
|
//if (annot.index) {
|
|
// //posFromIndex
|
|
// var pos = editor.findPosH({line: 0, ch: 0}, 25, 'char');
|
|
// var range = editor.findWordAt(pos);
|
|
// editor.markText(range.anchor, range.head, {className: 'editor-error'});
|
|
//}
|
|
var tipLabel = document.createDocumentFragment() /*state.hasGutter &&*/
|
|
var ann = {severity: 'error', message: annot.message}
|
|
tipLabel.appendChild(annotationTooltip(ann))
|
|
editor.setGutterMarker(Math.max(annot.line, 0), GUTTER_ID, makeMarker(tipLabel, 'error', false, 'state.options.tooltips'))
|
|
}
|
|
|
|
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;
|
|
cm.clearGutter(GUTTER_ID)
|
|
}
|
|
|
|
function makeMarker(labels, severity, multiple, tooltips) {
|
|
var marker = document.createElement('div')
|
|
var 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 showTooltip(e, content) {
|
|
var tt = document.createElement('div')
|
|
tt.className = 'CodeMirror-lint-tooltip'
|
|
tt.appendChild(content.cloneNode(true))
|
|
document.body.appendChild(tt)
|
|
|
|
function position(ev) {
|
|
if (!tt.parentNode) {
|
|
return CodeMirror.off(document, 'mousemove', position)
|
|
}
|
|
tt.style.top = Math.max(0, ev.clientY - tt.offsetHeight - 5) + 'px'
|
|
tt.style.left = (ev.clientX + 5) + 'px' //eslint-disable-line no-extra-parens
|
|
}
|
|
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) { //eslint-disable-line no-restricted-syntax
|
|
if (n === document.body) {
|
|
return undefined
|
|
}
|
|
if (!n) { hide(); break }
|
|
}
|
|
}
|
|
if (!tooltip) {
|
|
return clearInterval(poll)
|
|
}
|
|
}, 400)
|
|
CodeMirror.on(node, 'mouseout', hide)
|
|
}
|
|
|
|
return {
|
|
GUTTER_ID: GUTTER_ID,
|
|
annotate: annotate,
|
|
clearMarks: clearMarks
|
|
}
|
|
})
|