2023-08-15 00:41:09 +03:00
|
|
|
import { Extension } from "@codemirror/state";
|
|
|
|
import { hoverTooltip } from "@codemirror/view";
|
2023-08-13 21:25:59 +03:00
|
|
|
|
2023-08-15 00:41:09 +03:00
|
|
|
import { IConstituenta } from '../../utils/models';
|
|
|
|
import { getCstTypificationLabel } from '../../utils/staticUI';
|
|
|
|
|
|
|
|
function createTooltipFor(cst: IConstituenta) {
|
|
|
|
const dom = document.createElement('div');
|
2023-08-31 17:25:42 +03:00
|
|
|
dom.className = 'overflow-y-auto border shadow-md max-h-[25rem] max-w-[25rem] min-w-[10rem] w-fit z-20 text-sm clr-border px-2 py-2';
|
|
|
|
const alias = document.createElement('p');
|
|
|
|
alias.innerHTML = `<b>${cst.alias}:</b> ${getCstTypificationLabel(cst)}`;
|
2023-08-15 00:41:09 +03:00
|
|
|
dom.appendChild(alias);
|
2023-08-29 15:17:16 +03:00
|
|
|
if (cst.term_resolved) {
|
2023-08-15 00:41:09 +03:00
|
|
|
const term = document.createElement('p');
|
2023-08-29 15:17:16 +03:00
|
|
|
term.innerHTML = `<b>Термин:</b> ${cst.term_resolved}`;
|
2023-08-15 00:41:09 +03:00
|
|
|
dom.appendChild(term);
|
|
|
|
}
|
2023-08-29 15:17:16 +03:00
|
|
|
if (cst.definition_formal) {
|
2023-08-15 00:41:09 +03:00
|
|
|
const expression = document.createElement('p');
|
2023-08-29 15:17:16 +03:00
|
|
|
expression.innerHTML = `<b>Выражение:</b> ${cst.definition_formal}`;
|
2023-08-15 00:41:09 +03:00
|
|
|
dom.appendChild(expression);
|
|
|
|
}
|
2023-08-29 15:17:16 +03:00
|
|
|
if (cst.definition_resolved) {
|
2023-08-15 00:41:09 +03:00
|
|
|
const definition = document.createElement('p');
|
2023-08-29 15:17:16 +03:00
|
|
|
definition.innerHTML = `<b>Определение:</b> ${cst.definition_resolved}`;
|
2023-08-15 00:41:09 +03:00
|
|
|
dom.appendChild(definition);
|
|
|
|
}
|
|
|
|
if (cst.convention) {
|
|
|
|
const convention = document.createElement('p');
|
|
|
|
convention.innerHTML = `<b>Конвенция:</b> ${cst.convention}`;
|
|
|
|
dom.appendChild(convention);
|
|
|
|
}
|
|
|
|
return { dom: dom }
|
2023-08-13 21:25:59 +03:00
|
|
|
}
|
|
|
|
|
2023-08-15 00:41:09 +03:00
|
|
|
export const getHoverTooltip = (items: IConstituenta[]) => {
|
|
|
|
return hoverTooltip((view, pos, side) => {
|
|
|
|
const {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++;
|
2023-08-22 20:29:07 +03:00
|
|
|
if (start === pos && side < 0 || end === pos && side > 0) {
|
2023-08-15 00:41:09 +03:00
|
|
|
return null;
|
2023-08-13 21:25:59 +03:00
|
|
|
}
|
2023-08-15 00:41:09 +03:00
|
|
|
const alias = text.slice(start - from, end - from);
|
|
|
|
const cst = items.find(cst => cst.alias === alias);
|
|
|
|
if (!cst) {
|
|
|
|
return null;
|
2023-08-13 21:25:59 +03:00
|
|
|
}
|
2023-08-15 00:41:09 +03:00
|
|
|
return {
|
|
|
|
pos: start,
|
|
|
|
end: end,
|
|
|
|
above: false,
|
|
|
|
create: () => createTooltipFor(cst)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2023-08-13 21:25:59 +03:00
|
|
|
|
2023-08-15 00:41:09 +03:00
|
|
|
export function rshoverTooltip(items: IConstituenta[]): Extension {
|
|
|
|
return [getHoverTooltip(items)];
|
2023-08-13 21:25:59 +03:00
|
|
|
}
|