import { Extension } from "@codemirror/state"; import { hoverTooltip } from "@codemirror/view"; import { IConstituenta } from '../../utils/models'; import { getCstTypificationLabel } from '../../utils/staticUI'; function createTooltipFor(cst: IConstituenta) { const dom = document.createElement('div'); dom.className = 'overflow-y-auto border shadow-md max-h-[25rem] max-w-[25rem] min-w-[10rem] w-fit z-20 text-sm'; const alias = document.createElement('h1'); alias.className = 'text-sm text-left'; alias.textContent = `${cst.alias}: ${getCstTypificationLabel(cst)}`; dom.appendChild(alias); if (cst.term.resolved) { const term = document.createElement('p'); term.innerHTML = `Термин: ${cst.term.resolved}`; dom.appendChild(term); } if (cst.definition.formal) { const expression = document.createElement('p'); expression.innerHTML = `Выражение: ${cst.definition.formal}`; dom.appendChild(expression); } if (cst.definition.text.resolved) { const definition = document.createElement('p'); definition.innerHTML = `Определение: ${cst.definition.text.resolved}`; dom.appendChild(definition); } if (cst.convention) { const convention = document.createElement('p'); convention.innerHTML = `Конвенция: ${cst.convention}`; dom.appendChild(convention); } return { dom: dom } } 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++; if (start == pos && side < 0 || end == pos && side > 0) { return null; } const alias = text.slice(start - from, end - from); const cst = items.find(cst => cst.alias === alias); if (!cst) { return null; } return { pos: start, end: end, above: false, create: () => createTooltipFor(cst) } }); } export function rshoverTooltip(items: IConstituenta[]): Extension { return [getHoverTooltip(items)]; }