Portal/rsconcept/frontend/src/components/RefsInput/tooltip.ts

59 lines
2.0 KiB
TypeScript
Raw Normal View History

2024-06-07 20:17:03 +03:00
import { syntaxTree } from '@codemirror/language';
import { Extension } from '@codemirror/state';
import { hoverTooltip } from '@codemirror/view';
2024-06-19 12:09:10 +03:00
import { IEntityReference, ISyntacticReference } from '@/models/language';
2024-06-07 20:17:03 +03:00
import { IRSForm } from '@/models/rsform';
import {
domTooltipEntityReference,
domTooltipSyntacticReference,
findContainedNodes,
2024-06-19 12:09:10 +03:00
findReferenceAt
2024-06-07 20:17:03 +03:00
} from '@/utils/codemirror';
2024-06-19 12:09:10 +03:00
import { RefEntity } from './parse/parser.terms';
2024-06-07 20:17:03 +03:00
export const tooltipProducer = (schema: IRSForm, canClick?: boolean) => {
2024-06-07 20:17:03 +03:00
return hoverTooltip((view, pos) => {
2024-06-19 12:09:10 +03:00
const parse = findReferenceAt(pos, view.state);
if (!parse) {
2024-06-07 20:17:03 +03:00
return null;
}
2024-06-19 12:09:10 +03:00
if ('entity' in parse.ref) {
const cst = schema.cstByAlias.get(parse.ref.entity);
2024-06-07 20:17:03 +03:00
return {
2024-06-19 12:09:10 +03:00
pos: parse.start,
end: parse.end,
2024-06-07 20:17:03 +03:00
above: false,
create: () => domTooltipEntityReference(parse.ref as IEntityReference, cst, canClick)
2024-06-07 20:17:03 +03:00
};
2024-06-19 12:09:10 +03:00
} else {
2024-06-07 20:17:03 +03:00
let masterText: string | undefined = undefined;
2024-06-19 12:09:10 +03:00
if (parse.ref.offset > 0) {
const entities = findContainedNodes(parse.end, view.state.doc.length, syntaxTree(view.state), [RefEntity]);
if (parse.ref.offset <= entities.length) {
const master = entities[parse.ref.offset - 1];
2024-06-07 20:17:03 +03:00
masterText = view.state.doc.sliceString(master.from, master.to);
}
} else {
2024-06-19 12:09:10 +03:00
const entities = findContainedNodes(0, parse.start, syntaxTree(view.state), [RefEntity]);
if (-parse.ref.offset <= entities.length) {
const master = entities[-parse.ref.offset - 1];
2024-06-07 20:17:03 +03:00
masterText = view.state.doc.sliceString(master.from, master.to);
}
}
return {
2024-06-19 12:09:10 +03:00
pos: parse.start,
end: parse.end,
2024-06-07 20:17:03 +03:00
above: false,
2024-06-19 12:09:10 +03:00
create: () => domTooltipSyntacticReference(parse.ref as ISyntacticReference, masterText, canClick)
2024-06-07 20:17:03 +03:00
};
}
});
};
export function refsHoverTooltip(schema: IRSForm, canClick?: boolean): Extension {
return [tooltipProducer(schema, canClick)];
2024-06-07 20:17:03 +03:00
}