mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
Improve reference info
This commit is contained in:
parent
78c6a2306e
commit
1054db3a8a
|
@ -87,8 +87,9 @@ function RefsInput({
|
|||
selection: colors.bgHover
|
||||
},
|
||||
styles: [
|
||||
{ tag: tags.name, color: colors.fgPurple, cursor: 'pointer' }, // GlobalID
|
||||
{ tag: tags.literal, color: colors.fgTeal }, // literals
|
||||
{ tag: tags.name, color: colors.fgPurple, cursor: 'default' }, // EntityReference
|
||||
{ tag: tags.literal, color: colors.fgTeal, cursor: 'default' }, // SyntacticReference
|
||||
{ tag: tags.comment, color: colors.fgRed }, // Error
|
||||
]
|
||||
}), [editable, colors, darkMode]);
|
||||
|
||||
|
|
|
@ -8,4 +8,6 @@ export const highlighting = styleTags({
|
|||
RefSyntactic: tags.literal,
|
||||
Offset: tags.literal,
|
||||
Nominal: tags.literal,
|
||||
|
||||
Error: tags.comment
|
||||
});
|
|
@ -7,4 +7,5 @@ export const
|
|||
RefSyntactic = 5,
|
||||
Offset = 6,
|
||||
Nominal = 7,
|
||||
Filler = 8
|
||||
Error = 8,
|
||||
Filler = 9
|
||||
|
|
|
@ -3,16 +3,16 @@ import {LRParser} from "@lezer/lr"
|
|||
import {highlighting} from "./highlight.ts"
|
||||
export const parser = LRParser.deserialize({
|
||||
version: 14,
|
||||
states: "$[QVQPOOO_QQO'#C^OOQO'#Ck'#CkOgQPO'#CsOOQO'#Cd'#CdOOQO'#Cj'#CjOOQO'#Ce'#CeQVQPOOOrQPO,58xOwQPO,58{OOQO,59_,59_OOQO-E6c-E6cO|QSO1G.dO!RQPO1G.gO!WQQO'#CoOOQO'#C`'#C`O!`QPO7+$OOOQO'#Cf'#CfO!eQPO'#CcO!mQPO7+$RO|QSO,59ZOOQO<<Gj<<GjOOQO-E6d-E6dOOQO<<Gm<<GmOOQO1G.u1G.u",
|
||||
stateData: "!u~O]OS~OaPOfRO~ORWOUXO~OfROZgXagX~Ob[O~Ob]O~Od^O~OfaO~OedO`cX~O`eO~OfaO`VX~O`gO~Of]~",
|
||||
goto: "!fhPPiPmiPpsw}PPP!TsPPP!XPPP!_TQOVR`[Rc]TTOVQVORZVQb]RfbTUOVQ_[RhdSSOVRYR",
|
||||
nodeNames: "⚠ Text RefEntity Global Grams RefSyntactic Offset Nominal Filler",
|
||||
maxTerm: 23,
|
||||
states: "$nQVQPOOObQQO'#C^OOQO'#Cl'#ClOjQPO'#CuOxQPO'#CdOOQO'#Ce'#CeOOQO'#Ck'#CkOOQO'#Cf'#CfQVQPOOO}QPO,58xO!SQPO,58{OOQO,59a,59aO!XQPO,59OOOQO-E6d-E6dO!^QSO1G.dO!cQPO1G.gOOQO1G.j1G.jO!hQQO'#CpOOQO'#C`'#C`O!pQPO7+$OOOQO'#Cg'#CgO!uQPO'#CcO!}QPO7+$RO!^QSO,59[OOQO<<Gj<<GjOOQO-E6e-E6eOOQO<<Gm<<GmOOQO1G.v1G.v",
|
||||
stateData: "#V~O^OS~ObPOgROhSO~ORXOUYO~OgRO[iXbiXhiX~OgRO~Oc^O~Oc_O~Oh`O~OeaO~OgdO~OfgOadX~OahO~OgdOaVX~OajO~Og^~",
|
||||
goto: "!kjPPkPokPruuy!PPPP!VuPPP!ZPPPP!aTQOWRc^Rf_TUOWQWOR]WQe_RieTVOWQb^RkgSTOWQZRR[S",
|
||||
nodeNames: "⚠ Text RefEntity Global Grams RefSyntactic Offset Nominal Error Filler",
|
||||
maxTerm: 25,
|
||||
propSources: [highlighting],
|
||||
skippedNodes: [0],
|
||||
repeatNodeCount: 2,
|
||||
tokenData: "-}~R!TOX$bXZ%SZ^%w^p$bpq%Sq|$b|}'p}!O(^!O!Q$b!Q!R)a!R![*a![!b$b!b!c+c!c!d+n!d!e)a!e!f+n!f!g+n!g!h)a!h!i+n!i!r)a!r!s+n!s!t)a!t!u+n!u!v+n!v!w+n!w!z)a!z!{+n!{!})a!}#T$b#T#o)a#p#q-s#q#r-x#r#y$b#y#z%w#z$f$b$f$g%w$g#BY$b#BY#BZ%w#BZ$IS$b$IS$I_%w$I_$I|$b$I|$JO%w$JO$JT$b$JT$JU%w$JU$KV$b$KV$KW%w$KW&FU$b&FU&FV%w&FV;'S$b;'S;=`$|<%lO$bP$gVfPOX$bZp$bq!b$b!c#o$b#r;'S$b;'S;=`$|<%lO$bP%PP;=`<%l$b~%XY]~X^%Spq%S#y#z%S$f$g%S#BY#BZ%S$IS$I_%S$I|$JO%S$JT$JU%S$KV$KW%S&FU&FV%S~&OjfP]~OX$bXZ%SZ^%w^p$bpq%Sq!b$b!c#o$b#r#y$b#y#z%w#z$f$b$f$g%w$g#BY$b#BY#BZ%w#BZ$IS$b$IS$I_%w$I_$I|$b$I|$JO%w$JO$JT$b$JT$JU%w$JU$KV$b$KV$KW%w$KW&FU$b&FU&FV%w&FV;'S$b;'S;=`$|<%lO$bR'wVeQfPOX$bZp$bq!b$b!c#o$b#r;'S$b;'S;=`$|<%lO$bV(e^dSfPOX$bZp$bq}$b}!O)a!O!Q$b!Q!R)a!R![*a![!b$b!c!})a!}#T$b#T#o)a#r;'S$b;'S;=`$|<%lO$bT)h]dSfPOX$bZp$bq}$b}!O)a!O!Q$b!Q![)a![!b$b!c!})a!}#T$b#T#o)a#r;'S$b;'S;=`$|<%lO$bV*j]UQdSfPOX$bZp$bq}$b}!O)a!O!Q$b!Q![*a![!b$b!c!})a!}#T$b#T#o)a#r;'S$b;'S;=`$|<%lO$b~+fP#o#p+i~+nOa~V+u^dSfPOX$bZp$bq}$b}!O)a!O!Q$b!Q!R)a!R![,q![!b$b!c!})a!}#T$b#T#o)a#r;'S$b;'S;=`$|<%lO$bV,z]RQdSfPOX$bZp$bq}$b}!O)a!O!Q$b!Q![,q![!b$b!c!})a!}#T$b#T#o)a#r;'S$b;'S;=`$|<%lO$b~-xOb~~-}O`~",
|
||||
tokenData: ".V~R!UOX$eXZ%VZ^%z^p$epq%Vqr'sr|$e|}'x}!O(f!O!Q$e!Q!R)i!R![*i![!b$e!b!c+k!c!d+v!d!e)i!e!f+v!f!g+v!g!h)i!h!i+v!i!r)i!r!s+v!s!t)i!t!u+v!u!v+v!v!w+v!w!z)i!z!{+v!{!})i!}#T$e#T#o)i#p#q-{#q#r.Q#r#y$e#y#z%z#z$f$e$f$g%z$g#BY$e#BY#BZ%z#BZ$IS$e$IS$I_%z$I_$I|$e$I|$JO%z$JO$JT$e$JT$JU%z$JU$KV$e$KV$KW%z$KW&FU$e&FU&FV%z&FV;'S$e;'S;=`%P<%lO$eP$jVgPOX$eZp$er!b$e!c#o$e#r;'S$e;'S;=`%P<%lO$eP%SP;=`<%l$e~%[Y^~X^%Vpq%V#y#z%V$f$g%V#BY#BZ%V$IS$I_%V$I|$JO%V$JT$JU%V$KV$KW%V&FU&FV%V~&RjgP^~OX$eXZ%VZ^%z^p$epq%Vr!b$e!c#o$e#r#y$e#y#z%z#z$f$e$f$g%z$g#BY$e#BY#BZ%z#BZ$IS$e$IS$I_%z$I_$I|$e$I|$JO%z$JO$JT$e$JT$JU%z$JU$KV$e$KV$KW%z$KW&FU$e&FU&FV%z&FV;'S$e;'S;=`%P<%lO$e~'xOh~R(PVfQgPOX$eZp$er!b$e!c#o$e#r;'S$e;'S;=`%P<%lO$eV(m^eSgPOX$eZp$er}$e}!O)i!O!Q$e!Q!R)i!R![*i![!b$e!c!})i!}#T$e#T#o)i#r;'S$e;'S;=`%P<%lO$eT)p]eSgPOX$eZp$er}$e}!O)i!O!Q$e!Q![)i![!b$e!c!})i!}#T$e#T#o)i#r;'S$e;'S;=`%P<%lO$eV*r]UQeSgPOX$eZp$er}$e}!O)i!O!Q$e!Q![*i![!b$e!c!})i!}#T$e#T#o)i#r;'S$e;'S;=`%P<%lO$e~+nP#o#p+q~+vOb~V+}^eSgPOX$eZp$er}$e}!O)i!O!Q$e!Q!R)i!R![,y![!b$e!c!})i!}#T$e#T#o)i#r;'S$e;'S;=`%P<%lO$eV-S]RQeSgPOX$eZp$er}$e}!O)i!O!Q$e!Q![,y![!b$e!c!})i!}#T$e#T#o)i#r;'S$e;'S;=`%P<%lO$e~.QOc~~.VOa~",
|
||||
tokenizers: [0, 1, 2],
|
||||
topRules: {"Text":[0,1]},
|
||||
tokenPrec: 80
|
||||
tokenPrec: 96
|
||||
})
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
text @right
|
||||
p1
|
||||
p2
|
||||
p3
|
||||
}
|
||||
|
||||
@top Text { textItem* }
|
||||
|
@ -14,7 +15,7 @@
|
|||
Offset { $[-]?$[1-9]$[0-9]* }
|
||||
Global { $[XCSDATFPR]$[1-9]$[0-9]* }
|
||||
|
||||
word { ![@{|} \t\n]+ }
|
||||
word { ![@{|}! \t\n]+ }
|
||||
|
||||
gram { $[-a-zA-Z0-9]+ }
|
||||
|
||||
|
@ -23,10 +24,12 @@
|
|||
|
||||
textItem {
|
||||
!p1 ref |
|
||||
!p2 Filler
|
||||
!p2 Error |
|
||||
!p3 Filler
|
||||
}
|
||||
|
||||
Filler { word_enum }
|
||||
Error { "!" word_enum "!" }
|
||||
word_enum {
|
||||
word |
|
||||
word !text word_enum
|
||||
|
|
|
@ -4,7 +4,7 @@ import { hoverTooltip } from '@codemirror/view';
|
|||
|
||||
import { parseEntityReference, parseSyntacticReference } from '../../models/language';
|
||||
import { IConstituenta } from '../../models/rsform';
|
||||
import { domTooltipEntityReference, domTooltipSyntacticReference, findEnvelopingNodes } from '../../utils/codemirror';
|
||||
import { domTooltipEntityReference, domTooltipSyntacticReference, findContainedNodes, findEnvelopingNodes } from '../../utils/codemirror';
|
||||
import { IColorTheme } from '../../utils/color';
|
||||
import { RefEntity, RefSyntactic } from './parse/parser.terms';
|
||||
|
||||
|
@ -28,11 +28,26 @@ export const globalsHoverTooltip = (items: IConstituenta[], colors: IColorTheme)
|
|||
}
|
||||
} else {
|
||||
const ref = parseSyntacticReference(text);
|
||||
let masterText: string | undefined = undefined;
|
||||
if (ref.offset > 0) {
|
||||
const entities = findContainedNodes(end, view.state.doc.length, syntaxTree(view.state), [RefEntity]);
|
||||
console.log(end);
|
||||
if (ref.offset <= entities.length) {
|
||||
const master = entities[ref.offset - 1];
|
||||
masterText = view.state.doc.sliceString(master.from, master.to);
|
||||
}
|
||||
} else {
|
||||
const entities = findContainedNodes(0, start, syntaxTree(view.state), [RefEntity]);
|
||||
if (-ref.offset <= entities.length) {
|
||||
const master = entities[-ref.offset - 1];
|
||||
masterText = view.state.doc.sliceString(master.from, master.to);
|
||||
}
|
||||
}
|
||||
return {
|
||||
pos: start,
|
||||
end: end,
|
||||
above: false,
|
||||
create: () => domTooltipSyntacticReference(ref)
|
||||
create: () => domTooltipSyntacticReference(ref, masterText)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -110,7 +110,7 @@ export function findContainedNodes(start: number, finish: number, tree: Tree, fi
|
|||
node => {
|
||||
if (
|
||||
(!filter || filter.includes(node.type.id)) &&
|
||||
node.to <= start && node.from >= finish
|
||||
node.to <= finish && node.from >= start
|
||||
) {
|
||||
result.push({
|
||||
type: node.type,
|
||||
|
@ -164,17 +164,21 @@ export function domTooltipConstituenta(cst: IConstituenta) {
|
|||
*/
|
||||
export function domTooltipEntityReference(ref: IEntityReference, cst: IConstituenta | undefined, colors: IColorTheme) {
|
||||
const DIMENSIONS = 'max-h-[25rem] max-w-[25rem] min-w-[10rem] w-fit z-tooltip px-2 py-2';
|
||||
const LAYOUT = 'flex flex-col gap-1 overflow-y-auto'
|
||||
const LAYOUT = 'flex flex-col overflow-y-auto';
|
||||
|
||||
const dom = document.createElement('div');
|
||||
dom.className = `${DIMENSIONS} ${LAYOUT} border shadow-md text-sm select-none cursor-auto`;
|
||||
|
||||
const title = document.createElement('p');
|
||||
title.innerHTML = '<b>Ссылка на конституенту</b>';
|
||||
dom.appendChild(title);
|
||||
|
||||
const term = document.createElement('p');
|
||||
term.innerHTML = `<b>${ref.entity}:</b> ${describeConstituentaTerm(cst)}`;
|
||||
dom.appendChild(term);
|
||||
|
||||
const grams = document.createElement('div');
|
||||
grams.className = 'flex flex-wrap gap-1';
|
||||
grams.className = 'flex flex-wrap gap-1 mt-1';
|
||||
parseGrammemes(ref.form).forEach(
|
||||
gramStr => {
|
||||
const gram = document.createElement('div');
|
||||
|
@ -196,9 +200,9 @@ export function domTooltipEntityReference(ref: IEntityReference, cst: IConstitue
|
|||
/**
|
||||
* Create DOM tooltip for {@link ISyntacticReference}.
|
||||
*/
|
||||
export function domTooltipSyntacticReference(ref: ISyntacticReference) {
|
||||
export function domTooltipSyntacticReference(ref: ISyntacticReference, masterRef: string | undefined) {
|
||||
const DIMENSIONS = 'max-h-[25rem] max-w-[25rem] min-w-[10rem] w-fit z-tooltip px-2 py-2';
|
||||
const LAYOUT = 'flex flex-col gap-1 overflow-y-auto'
|
||||
const LAYOUT = 'flex flex-col overflow-y-auto'
|
||||
|
||||
const dom = document.createElement('div');
|
||||
dom.className = `${DIMENSIONS} ${LAYOUT} border shadow-md text-sm select-none cursor-auto`;
|
||||
|
@ -211,6 +215,10 @@ export function domTooltipSyntacticReference(ref: ISyntacticReference) {
|
|||
offset.innerHTML = `<b>Смещение:</b> ${ref.offset}`;
|
||||
dom.appendChild(offset);
|
||||
|
||||
const master = document.createElement('p');
|
||||
master.innerHTML = `<b>Основная ссылка: </b> ${masterRef ?? 'не определена'}`;
|
||||
dom.appendChild(master);
|
||||
|
||||
const nominal = document.createElement('p');
|
||||
nominal.innerHTML = `<b>Начальная форма:</b> ${ref.nominal}`;
|
||||
dom.appendChild(nominal);
|
||||
|
|
Loading…
Reference in New Issue
Block a user