mirror of
https://github.com/eliasstepanik/strudel.git
synced 2026-01-11 21:58:37 +00:00
79 lines
1.9 KiB
JavaScript
79 lines
1.9 KiB
JavaScript
import { hoverTooltip } from '@codemirror/view';
|
|
import jsdoc from '../../doc.json';
|
|
import { Autocomplete } from './autocomplete.mjs';
|
|
|
|
const getDocLabel = (doc) => doc.name || doc.longname;
|
|
|
|
let ctrlDown = false;
|
|
|
|
if (typeof window !== 'undefined') {
|
|
// Record Control key event to trigger or block the tooltip depending on the state
|
|
window.addEventListener(
|
|
'keyup',
|
|
function (e) {
|
|
if (e.key == 'Control') {
|
|
ctrlDown = false;
|
|
}
|
|
},
|
|
true,
|
|
);
|
|
|
|
window.addEventListener(
|
|
'keydown',
|
|
function (e) {
|
|
if (e.key == 'Control') {
|
|
ctrlDown = true;
|
|
}
|
|
},
|
|
true,
|
|
);
|
|
}
|
|
|
|
export const strudelTooltip = hoverTooltip(
|
|
(view, pos, side) => {
|
|
// Word selection from CodeMirror Hover Tooltip example https://codemirror.net/examples/tooltip/#hover-tooltips
|
|
if (!ctrlDown) {
|
|
return null;
|
|
}
|
|
let { from, to, text } = view.state.doc.lineAt(pos);
|
|
let start = pos,
|
|
end = pos;
|
|
while (start > from && /\w/.test(text[start - from - 1])) {
|
|
start--;
|
|
}
|
|
while (end < to && /\w/.test(text[end - from])) {
|
|
end++;
|
|
}
|
|
if ((start == pos && side < 0) || (end == pos && side > 0)) {
|
|
return null;
|
|
}
|
|
let word = text.slice(start - from, end - from);
|
|
// Get entry from Strudel documentation
|
|
let entry = jsdoc.docs.filter((doc) => getDocLabel(doc) === word)[0];
|
|
if (!entry) {
|
|
// Try for synonyms
|
|
entry = jsdoc.docs.filter((doc) => doc.synonyms && doc.synonyms.includes(word))[0];
|
|
if (!entry) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
return {
|
|
pos: start,
|
|
end,
|
|
above: false,
|
|
arrow: true,
|
|
create(view) {
|
|
let dom = document.createElement('div');
|
|
dom.className = 'strudel-tooltip';
|
|
const ac = Autocomplete({ doc: entry, label: word });
|
|
dom.appendChild(ac);
|
|
return { dom };
|
|
},
|
|
};
|
|
},
|
|
{ hoverTime: 10 },
|
|
);
|
|
|
|
export const isTooltipEnabled = (on) => (on ? strudelTooltip : []);
|