diff --git a/services/web/frontend/js/features/source-editor/languages/typst/index.ts b/services/web/frontend/js/features/source-editor/languages/typst/index.ts index 1ee40eb856..bcdd507e60 100644 --- a/services/web/frontend/js/features/source-editor/languages/typst/index.ts +++ b/services/web/frontend/js/features/source-editor/languages/typst/index.ts @@ -49,11 +49,11 @@ export const TypstLanguage = LRLanguage.define({ CodeBool: t.atom, // Identifiers: - // CallExpr/CodeIdent — top-level #func or after keywords (#set text) → function style - // FuncExpr/CodeIdent — func call inside a value expr (has args/method) → function style + // CodeExpr/CodeIdent — bare #func (no args) → function style + // FuncExpr/CodeIdent — func call with args/method (#func(...), link.with(url)) → function style // CodeArgKey — named arg key (tokenizer pre-disambiguates on ':') → attributeName // CodeIdent — plain variable/constant reference (e.g. 'left', 'center') → variable - 'CallExpr/CodeIdent': t.function(t.variableName), + 'CodeExpr/CodeIdent': t.function(t.variableName), 'FuncExpr/CodeIdent': t.function(t.variableName), CodeArgKey: t.attributeName, CodeIdent: t.variableName, diff --git a/services/web/frontend/js/features/source-editor/lezer-typst/tokens.mjs b/services/web/frontend/js/features/source-editor/lezer-typst/tokens.mjs index 922f6827cc..2575e579a5 100644 --- a/services/web/frontend/js/features/source-editor/lezer-typst/tokens.mjs +++ b/services/web/frontend/js/features/source-editor/lezer-typst/tokens.mjs @@ -8,7 +8,6 @@ import { RawBlockBody, RawBlockClose, RawInlineContent, - CodeBlockBody, BlockCommentBody, LineCommentContent, MathContent, @@ -35,6 +34,7 @@ const DOT = 46 // . const OPEN_PAREN = 40 // ( const COMMA = 44 // , const COLON = 58 // : +const SEMICOLON = 59 // ; const OPEN_ANGLE = 60 // < const CLOSE_ANGLE = 62 // > @@ -188,36 +188,6 @@ export const rawInlineTokenizer = new ExternalTokenizer( { contextual: false } ) -// ── codeBlockTokenizer ────────────────────────────────────────────────── -// Emits CodeBlockBody — the interior of a #{ ... } code block. -// Tracks brace nesting depth so that inner braces (e.g. #{ f({ x }) }) -// are included in the body rather than closing the outer block. -export const codeBlockTokenizer = new ExternalTokenizer( - (input, _stack) => { - // The opening '{' has already been consumed by the grammar rule. - let depth = 1 - let hasContent = false - while (input.next !== -1) { - const ch = input.next - if (ch === OPEN_BRACE) { - depth++ - input.advance() - hasContent = true - } else if (ch === CLOSE_BRACE) { - if (depth === 1) break // leave this '}' for the grammar rule - depth-- - input.advance() - hasContent = true - } else { - input.advance() - hasContent = true - } - } - if (hasContent) input.acceptToken(CodeBlockBody) - }, - { contextual: false } -) - // ── blockCommentTokenizer ─────────────────────────────────────────────── // Emits BlockCommentBody — the interior of a /* ... */ comment. // Typst supports nested block comments (/* /* inner */ outer */), so this @@ -298,12 +268,12 @@ export const mathContentTokenizer = new ExternalTokenizer( export const codeKeywordTokenizer = new ExternalTokenizer( (input, stack) => { if (!stack.canShift(CodeKeyword)) return - // Valid positions: immediately after '#' (normal #set, #show) or after ':' - // (show-body: '#show sel: set text(...)'). Walk back past optional whitespace. + // Valid positions: after '#', ':', '{' (code block start), or ';'. + // Walk back past optional whitespace. let back = -1 while (input.peek(back) === SPACE || input.peek(back) === TAB || input.peek(back) === NEWLINE) back-- const kwPrev = input.peek(back) - if (kwPrev !== HASH && kwPrev !== COLON) return + if (kwPrev !== HASH && kwPrev !== COLON && kwPrev !== OPEN_BRACE && kwPrev !== SEMICOLON) return // Peek ahead to read the full identifier without advancing. let len = 0 @@ -355,16 +325,24 @@ export const codeIdentTokenizer = new ExternalTokenizer( const prev = input.peek(back) if (prev !== HASH && prev !== DOT && prev !== OPEN_PAREN && prev !== COMMA && prev !== EQUALS && prev !== COLON) { - // May be after a keyword chain like '#set text' or (in show body) 'set body': - // scan back through the preceding identifier word, skip whitespace, and - // verify '#' or ':' precedes it. Accepting ':' lets multi-word chains - // like '#show sel: set text' find ':' before 'set'. - if (!isIdentTail(prev)) return - let b = back - while (isIdentTail(input.peek(b))) b-- - while (input.peek(b) === SPACE || input.peek(b) === TAB || input.peek(b) === NEWLINE) b-- - const chainEnd = input.peek(b) - if (chainEnd !== HASH && chainEnd !== COLON) return + if (!isIdentTail(prev)) { + // prev is a structural delimiter (e.g. ')' after a function call, '{' at + // block start, '}' after a nested block). These are valid statement-start + // positions inside a CodeBlock's codeStatement* list. Trust canShift — + // it's reliable in the grammar-parsed code-block states. + if (!couldBeIdent) return + } else { + // prev looks like the tail of a preceding word — scan back to find '#' or ':'. + // Accepting ':' lets multi-word chains like 'show sel: set text' work. + let b = back + while (isIdentTail(input.peek(b))) b-- + while (input.peek(b) === SPACE || input.peek(b) === TAB || input.peek(b) === NEWLINE) b-- + const chainEnd = input.peek(b) + if (chainEnd !== HASH && chainEnd !== COLON) { + // Could be second+ statement in a code block (e.g. after 'let x = 1'). + if (!couldBeIdent) return + } + } } // In arg-delimiter positions ('(' or ',') we may emit CodeArgKey regardless diff --git a/services/web/frontend/js/features/source-editor/lezer-typst/typst.grammar b/services/web/frontend/js/features/source-editor/lezer-typst/typst.grammar index d6161344a7..093007a010 100644 --- a/services/web/frontend/js/features/source-editor/lezer-typst/typst.grammar +++ b/services/web/frontend/js/features/source-editor/lezer-typst/typst.grammar @@ -5,7 +5,6 @@ // headingTitleTokenizer — HeadingTitle: the title text to end of line // rawTokenizer — triple-backtick raw block open/body/close // rawInlineTokenizer — single-backtick raw inline content -// codeBlockTokenizer — brace-depth tracking inside #{ ... } // blockCommentTokenizer — depth-tracked nested /* ... */ comments // codeIdentTokenizer — CodeIdent: identifier, only fires in code context // strongBodyTokenizer — StrongBody: content inside *...* @@ -62,10 +61,16 @@ RawInline { "`" RawInlineContent? "`" } // #[ ... ] — content block (re-parses as markup items) CodeExpr { "#" codeExprBody } +// codeExprBody: forms valid after '#' in markup, or after ':' / '=' in a +// keyword-body. FuncExpr handles ident+callSuffix(s); bare CodeIdent handles +// a plain variable reference (#x). No CallExpr with callSuffix* here — that +// *-quantifier makes both shift and reduce carry !call precedence (a tie that +// @right cannot resolve reliably once codeStatement* state-merging is in play). codeExprBody { KeywordExpr | AtomExpr | - CallExpr | + FuncExpr | + CodeIdent | CodeBlock | ContentBlock } @@ -73,18 +78,59 @@ codeExprBody { // callOrValue covers the subject of a keyword expression (#set text, #show link, // #import "pkg", #let name). keywordBody is exclusive: ':' for show-rule bodies // and '=' for let-binding values (a keyword expression never has both). -KeywordExpr { CodeKeyword callOrValue? keywordBody? } -callOrValue { CallExpr | CodeString } +// Two precedences: +// call @right — prefer extending callSuffixes (FuncExpr) over completing the +// FuncExpr and letting '(' start a new statement. The `!call` marker +// encodes the shift as (call << 2) and the FuncExpr reduce as +// (call << 2) - 1 (due to @right); shift > reduce, so callSuffix +// chains are greedily extended. Without @right both actions have +// the same numeric precedence and the conflict is unresolved. +// kw — prefer CodeKeyword !kw callOrValueAndBody over CodeKeyword keywordBody? +// when an identifier follows the keyword. shift = kw << 2, reduce +// (second alternative) = 0; kw > 0, no @right needed. +@precedence { call @right, kw } + +// KeywordExpr: used in markup-level code (#show, #let, #set …) AND nested +// inside codeExprBody (e.g. the RHS after ':' in a show-rule). +// Same two-alternative structure as codeStatement: the !kw on the first +// alternative gives the shift prec kw > 0 over the unannotated reduce of the +// second alternative (prec 0). This avoids the call-vs-call tie that arises +// from the old `callOrValue?` optional pattern. +KeywordExpr { + CodeKeyword !kw callOrValueAndBody | + CodeKeyword keywordBody? +} + +// callOrValue: FuncExpr for "ident(args)" / "ident.method", bare CodeIdent for +// a plain name, CodeString for string subjects like #import "pkg". +// FuncExpr requires at least one callSuffix, so at [CodeIdent ·] seeing '(': +// SHIFT (start callSuffixes, prec call) vs REDUCE bare CodeIdent (prec 0). +// call > 0 → shift wins cleanly. +callOrValue { FuncExpr | CodeIdent | CodeString } keywordBody { ":" codeExprBody | "=" codeValue } AtomExpr { CodeBool } -// CallExpr allows zero suffixes — used at top level (#x) and after keywords -// (#set text(...)) where even a bare identifier is valid as a named reference. -CallExpr { CodeIdent callSuffix* } -// FuncExpr requires at least one suffix — used inside codeValue so that -// 'table(...)' gets tok-function while plain identifiers like 'left'/'center' -// get tok-variableName instead of being false-positively styled as functions. -FuncExpr { CodeIdent callSuffix+ } +// codeStatement is the unit inside a CodeBlock's brace body. +// Two explicit alternatives for the keyword case avoid the LALR ambiguity +// that arises from codeStatement* merging when callOrValue? is optional. +// The !kw annotation on the first alternative (shift callOrValueAndBody) has +// higher precedence than the bare reduce of the second alternative (prec 0), +// so 'show strong: …' grabs 'strong' as callOrValue rather than completing +// KeywordExpr early with empty callOrValue. +codeStatement { + CodeKeyword !kw callOrValueAndBody | + CodeKeyword keywordBody? | + codeValue | + ";" +} +callOrValueAndBody { callOrValue keywordBody? } + +// FuncExpr: identifier followed by one-or-more call suffixes. +// callSuffixes uses explicit left-recursion (not +) so the !call annotation +// on the recursive extension point gives the shift prec call vs the unannotated +// reduce of codeValue → FuncExpr (prec 0) — shift wins, no @right tie. +callSuffixes { callSuffix | callSuffixes !call callSuffix } +FuncExpr { CodeIdent !call callSuffixes } callSuffix { CodeArgs | "." CodeIdent | @@ -114,8 +160,9 @@ codeValue { // Reuses codeArgList so named-key entries like (auto, 1fr) work too. CodeArray { "(" codeArgList? ")" } -// CodeBlockBody depth-tracks braces so #{ let x = { 1 } } parses correctly. -CodeBlock { "{" CodeBlockBody? "}" } +// CodeBlock parses its content as a codeStatement* list so that keywords +// (show, let, set…) and identifiers inside braces receive proper highlighting. +CodeBlock { "{" codeStatement* "}" } // ContentBlock re-enters markup mode, allowing #[*bold* text]. ContentBlock { "[" item* "]" } @@ -162,10 +209,6 @@ Escape { "\\" EscapeChar } RawInlineContent } -@external tokens codeBlockTokenizer from "./tokens.mjs" { - CodeBlockBody -} - @external tokens blockCommentTokenizer from "./tokens.mjs" { BlockCommentBody } diff --git a/services/web/frontend/js/features/source-editor/lezer-typst/typst.mjs b/services/web/frontend/js/features/source-editor/lezer-typst/typst.mjs index 5d96b9903e..3d772d7471 100644 --- a/services/web/frontend/js/features/source-editor/lezer-typst/typst.mjs +++ b/services/web/frontend/js/features/source-editor/lezer-typst/typst.mjs @@ -1,17 +1,17 @@ // This file was generated by lezer-generator. You probably shouldn't edit it. import {LRParser} from "@lezer/lr" -import {headingTokenizer, headingTitleTokenizer, rawTokenizer, rawInlineTokenizer, codeBlockTokenizer, blockCommentTokenizer, lineCommentContentTokenizer, mathContentTokenizer, codeKeywordTokenizer, codeIdentTokenizer, strongBodyTokenizer, emphBodyTokenizer} from "./tokens.mjs" +import {headingTokenizer, headingTitleTokenizer, rawTokenizer, rawInlineTokenizer, blockCommentTokenizer, lineCommentContentTokenizer, mathContentTokenizer, codeKeywordTokenizer, codeIdentTokenizer, strongBodyTokenizer, emphBodyTokenizer} from "./tokens.mjs" export const parser = LRParser.deserialize({ version: 14, - states: "-UQVQ!LVOOO!WQ!LXO'#CmO#bQ!MiO'#CnO$lQ$ItO'#CoO$tQ!LUO'#CpO$|Q!LYO'#CqO%UQ!NvO'#C|O%^Q%+tO'#CrO%oQ#4^O'#DPO%wQ#JjO'#DQO&PQ(CWO'#DRO&UQ07`O'#DTO&ZQ?MpO'#DVOOQT'#Dc'#DcOOQT'#D['#D[QVQ!LVOOOOQT,59X,59XOOQT,59Y,59YOOQT,59Z,59ZO&`Q$ISO,59ZOOQT,59[,59[O&eQ!LUO,59[OOQT,59],59]O&jQ!LQO,59]OOQ#t'#D^'#D^O&oQ!NvO,59hOOQT,59h,59hO&wQ!LVO'#CzO'OQ$IdO'#C{O'WQ!LVO'#CtO(nQ#)]O'#CsOOQT'#DO'#DOOOQT'#Di'#DiOOQT,59^,59^OOQT,59k,59kO*RQ!LQO,59kOOQT,59l,59lO*WQ!LQO,59lO*]Q$ISO,59mOOQT,59o,59oOOQT,59q,59qOOQT-E7Y-E7YOOQT1G.u1G.uOOQT1G.v1G.vOOQT1G.w1G.wOOQ#t-E7[-E7[OOQT1G/S1G/SOOQT,59f,59fO*bQ!LVO,59fOOQT,59g,59gO*iQ$ISO,59gO+]Q%&YO'#CuOOQT'#Dk'#DkO+dQ#)WO'#DkOOQT'#D]'#D]O+iQ!LVO,59`OOQT'#Dj'#DjO%^Q%+tO'#DyO-PQ%&YO'#DyOOQT,59_,59_O-WQ!LVO,59_OOQT1G/V1G/VOOQT1G/W1G/WOOQT1G/X1G/XOOQT1G/Q1G/QOOQT1G/R1G/RO.eQ$ISO'#DpO.vQ%&YO'#C}OOQT'#Dp'#DpO.}Q!LQO'#DnOOQO'#Dn'#DnO/SQ$ISO'#DmOOQT,59a,59aO/[Q$ISO,59aOOQT,5:V,5:VOOQT-E7Z-E7ZOOQT,5:e,5:eO/aQ!LVO'#DpOOQT1G.y1G.yO0qQ$ISO,59eOOQT,59i,59iO1SQ$ISO,59iO1XQ%&YO,5:YO1`Q%&YO,5:XO1gQ$ISO,5:XOOQT1G.{1G.{O1oQ!LVO,59eOOQT1G/T1G/TOOQO1G/t1G/tOOQO,59y,59yO3PQ%&YO1G/sOOQO-E7]-E7]P*nQ%&YO'#D_", - stateData: "3g~O!UOS~OPPORSO{]O|]O}]O!WQO!XRO!ZTO![VO!iUO!oWO!pXO!qYO!sZO!t[O~OQ`OPaXRaX{aX|aX}aX!SaX!WaX!XaX!ZaX![aX!iaX!oaX!paX!qaX!saX!taX!faX~OXaOPbXRbX{bX|bX}bX!SbX!WbX!XbX!ZbX![bX!ibX!obX!pbX!qbX!sbX!tbX!fbX~OWcO!YbO~OSeOTdO~OUgO!ZfO~OYhO!ijO~OZnO[mOloO!ekO!glO~O^sO!orO~O_uO!ptO~OvvO~OxwO~OzxO~O!YzO~OT{O~O!Z|O~OYhO!i!OO~O!f!PO~PVOV!SO!h!RO~O!`!TO!ekO!l!VOPhXRhX{hX|hX}hX!ShX!WhX!XhX!ZhX![hX!ihX!ohX!phX!qhX!shX!thX!chX!nhX!fhX~O[mOj!YO!c!ZO!n![OPgXRgX{gX|gX}gX!SgX!WgX!XgX!ZgX![gX!igX!ogX!pgX!qgX!sgX!tgX!fgX~O!o!_O~O!p!`O~O!r!aO~O!f!bO~PVO!h!cO~O[!dO]!gOj!fOk!fOl!fO!`!eO!ekO!glO!iUO~O!j!jO~P*nO[!lO~O!`!TO!ekO!l!VOPhaRha{ha|ha}ha!Sha!Wha!Xha!Zha![ha!iha!oha!pha!qha!sha!tha!cha!nha!fha~O[!oO~P*tO!c!ZO!n![OPgaRga{ga|ga}ga!Sga!Wga!Xga!Zga![ga!iga!oga!pga!qga!sga!tga!fga~O!`!TO!ekO!l!VO!j!dX!k!dX~O!j!rO~P*nO!c!tO~O!k!uO!j!aX~O!j!wO~O!`!TO!ekO!l!VOP!dXR!dX{!dX|!dX}!dX!S!dX!W!dX!X!dX!Z!dX![!dX!i!dX!o!dX!p!dX!q!dX!s!dX!t!dX!f!dX~O!`!TO!ekO!l!VO!jma!kma~O!j!yO~O[!dO~P*tO!j!aa~P*nO!k!|O!j!aa~O!`!TO!ekO!l!VOPmaRma{ma|ma}ma!Sma!Wma!Xma!Zma![ma!ima!oma!pma!qma!sma!tma!fma~O!j!ai~P*nOlzj{!e!c!`!l!f}!p!U|!`~", - goto: "&g!nPPPPPPPPPPPPPPPPP!o!o!o!o!o!o!u!y#QPPP#Y#c#x$V#Y!u!o!o!oP!oP!oPPPP$f$p%O%UPPP%[PPPPP%b%h%kP%s%yP&SPPPPPPPP&aX]O_k!QTpV!ZSpV!ZR!Yn]!Um!X!d!o!q!x_!f!T![!e!t!u!|#OSpV!Z[!Um!X!d!o!q!x_!f!T![!e!t!u!|#OSpV!Z_!f!T![!e!t!u!|#OW]O_k!Q_!f!T![!e!t!u!|#OQ_OSy_!QR!QkQ!XmU!m!X!q!xQ!q!dR!x!oQiUR}iQ!v!iR!}!vX^O_k!QQqVR!n!ZR!^n]!Wm!X!d!o!q!xQ!k!TR!s!eS!i!T!eV!{!u!|#OY!h!T!e!u!|#OQ!n![R!z!tQ!]nR!p!^", - nodeNames: "⚠ HeadingMark HeadingTitle RawBlockOpen RawBlockBody RawBlockClose RawInlineContent CodeBlockBody BlockCommentBody LineCommentContent MathContent CodeKeyword CodeIdent CodeArgKey StrongBody EmphBody Document Heading LineComment BlockComment RawBlock RawInline CodeExpr KeywordExpr CallExpr CodeArgs CodeString CodeNumber CodeBool FuncExpr ContentBlock CodeBlock InlineMath CodeArray AtomExpr Strong Emphasis Label LabelName Ref RefName Escape EscapeChar URL MarkupContent ClosingSquare", - maxTerm: 82, + states: ".jQVQMmOOO!WQMoO'#ClO#bQN_O'#CmO$lQ!LbO'#CnO$tQMlO'#CoO$|QMpO'#CpO%UQNzO'#CzO%^Q#&bO'#CqO%oQ!*nO'#C}O%wQ!5tO'#DOO&PQ$ISO'#DPO&UQ(CWO'#DRO&ZQ07`O'#DTOOQT'#Da'#DaOOQT'#DY'#DYQVQMmOOOOQT,59W,59WOOQT,59X,59XOOQT,59Y,59YO&`Q!LQO,59YOOQT,59Z,59ZO&eQMlO,59ZOOQT,59[,59[O&jQMhO,59[OOQ!b'#D['#D[O&oQNzO,59fOOQ)e,59f,59fO&wQMmO'#CxO'pQ#&bO'#CyO'wQMmO'#DgO)XQ!%XO'#CrOOQ)e'#C|'#C|OOQ)e'#Dg'#DgOOQT,59],59]OOQT,59i,59iO*lQMhO,59iOOQT,59j,59jO*qQMhO,59jO*vQ!LQO,59kOOQT,59m,59mOOQT,59o,59oOOQT-E7W-E7WOOQT1G.t1G.tOOQT1G.u1G.uOOQT1G.v1G.vOOQ!b-E7Y-E7YOOQ)e1G/Q1G/QOOQ)e,59d,59dO*{QMmO,59dO+SQ#&bO'#DtOOQ)`'#Dt'#DtOOQ)`'#DZ'#DZO+}Q#&bO,59eOOQ)e,59e,59eO,sQ##lO'#C{OOQ)e'#Dp'#DpO,zQ#&bO'#DpO-xQ##lO'#CtOOQ)e'#Dk'#DkO.PQ!%SO'#DkOOQ)e'#Dj'#DjO.jQMmO,59_O%^Q#&bO'#DuO/pQ##lO'#DuO0]QMmO'#DiOOQ)e'#Di'#DiO1cQMmO'#DhOOQ)e,59^,59^OOQT1G/T1G/TOOQT1G/U1G/UOOQT1G/V1G/VOOQ)e1G/O1G/OOOQ)`,5:`,5:`O2pQ#&bO'#DiO3^Q#&bO'#DhOOQ)`-E7X-E7XOOQ)e1G/P1G/POOQ)e,59g,59gO4XQ!LQO,59gO4^QMhO'#DnOOQO'#Dn'#DnO4cQ!LQO'#DmO4kQ#&bO,59_OOQ)e,59`,59`O5_Q!LQO,59`OOQ)e,5:V,5:VOOQ)e,5:U,5:UOOQ)e,5:a,5:aO5dQMmO'#DpOOQ)e,5:S,5:SO6tQ#&bO'#DgO7lQ#&bO'#CrOOQ)e1G/R1G/RO8gQ##lO,5:YO8nQ##lO,5:XO8uQ!LQO,5:XOOQ)e1G.z1G.zOOQO1G/t1G/tOOQO,59w,59wO8}Q##lO1G/sOOQO-E7Z-E7ZP,UQ##lO'#D]O9UQ#&bO'#DuO8gQ##lO'#Du", + stateData: "9v~O!SOS~OPPORSOy]Oz]O{]O!UQO!VRO!XTO!YVO!mUO!qWO!rXO!sYO!uZO!v[O~OQ`OP`XR`Xy`Xz`X{`X!Q`X!U`X!V`X!X`X!Y`X!m`X!q`X!r`X!s`X!u`X!v`X!f`X~OWaOPaXRaXyaXzaX{aX!QaX!UaX!VaX!XaX!YaX!maX!qaX!raX!saX!uaX!vaX!faX~OVcO!WbO~OSeOTdO~OUgO!XfO~OXhO!mjO~OYnOZmOkoO!ekO!glO~O]sO!qrO~O^uO!rtO~OtvO~OvwO~OxxO~O!WzO~OT{O~O!X|O~OXhO!m!OO~O!f!PO~PVOY!ROZ!YOi!XOj!XOk!XO!`!WO!ekO!glO!k!SO!mUO~O!l!VO~P'OO!`!ZO!ekO!p!]OP!ZXR!ZXy!ZXz!ZX{!ZX!Q!ZX!U!ZX!V!ZX!X!ZX!Y!ZX!m!ZX!q!ZX!r!ZX!s!ZX!u!ZX!v!ZX!f!ZX~OZ!bOi!cO!c!`O!j!aOPfXRfXyfXzfX{fX!QfX!UfX!VfX!XfX!YfX!mfX!qfX!rfX!sfX!ufX!vfX!ffX~O!q!fO~O!r!gO~O!t!hO~O!f!iO~PVOZ!kOi!cO!c#YO!j#ZOY!hXj!hXk!hX!`!hX!e!hX!g!hX!k!hX!l!hX!m!hX~O!l!nO~P'OOZ!YO[!qOi!XOj!XOk!XO!`!WO!ekO!glO!mUO~O!n!oO~P,UO!`!ZO!ekO!p!]OY!dXZ!dXi!dXj!dXk!dX!g!dX!k!dX!l!dX!m!dX!n!dX!o!dX~O!n!uO~P,UOZ!wO~O!`!ZO!ekO!p!]O!mga!cga!jga~OPgaRgaygazga{ga!Qga!Uga!Vga!Xga!Yga!qga!rga!sga!uga!vga!fga~P.UOZ!zO~P,[O!`!ZO!ekO!p!]O!c!]X!j!]X!m!]X~OP!]XR!]Xy!]Xz!]X{!]X!Q!]X!U!]X!V!]X!X!]X!Y!]X!q!]X!r!]X!s!]X!u!]X!v!]X!f!]X~P/wO!c!`O!j!aOP![XR![Xy![Xz![X{![X!Q![X!U![X!V![X!X![X!Y![X!m![X!q![X!r![X!s![X!u![X!v![X!f![X~OY!]XZ!]Xi!]Xj!]Xk!]X!g!]X!k!]X!l!]X~P/wO!c#YO!j#ZOY![XZ![Xi![Xj![Xk![X!`![X!e![X!g![X!k![X!l![X!m![X~O!n#OO~O!c#PO~O!o#QO!n!aX~OYgaZgaigajgakga!gga!kga!lga!nga!oga~P.UO!n#SO~O!`!ZO!ekO!p!]OP!dXR!dXy!dXz!dX{!dX!Q!dX!U!dX!V!dX!X!dX!Y!dX!m!dX!q!dX!r!dX!s!dX!u!dX!v!dX!f!dX~O!`!ZO!ekO!p!]OY!ZXZ!ZXi!ZXj!ZXk!ZX!g!ZX!k!ZX!l!ZX!m!ZX~OZ!kOi!cO!c#YO!j#ZOYfXjfXkfX!`fX!efX!gfX!kfX!lfX!mfX~OZ!YO~P,[O!n!aa~P,UO!o#VO!n!aa~O!n!ai~P,UOY!}OZ!|OkoO!ekO!glO~Okxiy!e!c!`!p!f{!r!Sz!`~", + goto: "'k!jPPPPPPPPPPPPPPPP!k!k!k!k!k!k!q!v#^PPP#h$T$f$Y!q!k!k!kP!kP!kPPPP$x%S%Y%`PPP%fPPPPP%l%s%z&R&]P&i&oP&xPPP'['`X]O_k!QVpV!`#YUpV!`#Yd!Xl!U!W!Z!a#P#Q#V#X#ZV!cn!R!}a![m!Y!_!b!k!t!z!|UpV!`#Yd!Xl!U!W!Z!a#P#Q#V#X#Za![m!Y!_!b!k!t!z!|UpV!`#Ye!Xl!U!W!Z!a#P#Q#V#X#ZW]O_k!Qe!Xl!U!W!Z!a#P#Q#V#X#ZQ_OSy_!QR!QkQ!UlR!m!UQiUR}iQ#R!sR#W#RX^O_k!QQqVT!y!`#YS!en!}R!j!RQ!dnT!l!R!}U!_m!b!zV!t!Y!k!|[!^m!Y!b!k!z!|T!x!_!tQ!p!WR!v!ZS!s!W!ZV#U#Q#V#XS!Sl!UY!r!W!Z#Q#V#XS!y!a#ZR#T#PT!Tl!US!en!}Q!j!RT!{!d!l", + nodeNames: "⚠ HeadingMark HeadingTitle RawBlockOpen RawBlockBody RawBlockClose RawInlineContent BlockCommentBody LineCommentContent MathContent CodeKeyword CodeIdent CodeArgKey StrongBody EmphBody Document Heading LineComment BlockComment RawBlock RawInline CodeExpr KeywordExpr FuncExpr CodeArgs CodeString CodeNumber CodeBool ContentBlock CodeBlock InlineMath CodeArray AtomExpr Strong Emphasis Label LabelName Ref RefName Escape EscapeChar URL MarkupContent ClosingSquare", + maxTerm: 84, skippedNodes: [0], repeatNodeCount: 4, - tokenData: "!GQ~R!UOX$eXY&cYZ&cZ]$e]^'X^p$epq&cqr$ers)sst/vtu/}ux$exy0Uyz1Tz{2S{|$e|}2c}!O$e!O!P3b!P!Q4a!Q![4v![!]Mx!]!^$e!^!_Nw!_!`! O!`!a! V!a!b$e!b!c!!U!c!}!!]!}#O!%u#O#P!&t#P#Q!&{#Q#R$e#R#S!'U#S#T!'v#T#U!'}#U#Y!!]#Y#Z!.X#Z#[!!]#[#]!4d#]#b!!]#b#c!>e#c#h!!]#h#i!Am#i#o!!]#o#p!Du#p#q$e#q#r!Et#r;'S$e;'S;=`!Fs;=`<%l!F{<%lO$ea$l[z`|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bP%g[|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bP&`P;=`<%l%b~&jSz`!U~XY&vYZ&v]^&vpq&v~&{S!U~XY&vYZ&v]^&vpq&v~'baz`!U~|POX%bXY&vYZ&vZ]%b]^(g^p%bpq&vqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%b~(na!U~|POX%bXY&vYZ&vZ]%b]^(g^p%bpq&vqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%b~)zgz`|POX+cXY-PZp+cpq-Pqr+crs.ssu-Puz+cz{-P{!P+c!P!Q-P!Q!^+c!^!`-P!`!b+c!b!c-P!c#O+c#O#P-q#P#Q-P#Q#R+c#R#T-P#T;'S+c;'S;=`/p<%lO+c~+hg|POX+cXY-PZp+cpq-Pqr+crs.ssu-Puz+cz{-P{!P+c!P!Q-P!Q!^+c!^!`-P!`!b+c!b!c-P!c#O+c#O#P-q#P#Q-P#Q#R+c#R#T-P#T;'S+c;'S;=`/p<%lO+c~-SWOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.m<%lO-P~-qOj~~-tRO;'S-P;'S;=`-};=`O-P~.QXOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.m;=`<%l-P<%lO-P~.pP;=`<%l-P~.z[j~|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%b~/sP;=`<%l+ca/}O![Pz`c0UO!iRz`~0_[z`!`~|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bc1^[!jQz`|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bc2ZP!oPz`!P!Q2^Q2cO!YQc2l[!kQz`|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%b~3k[z`!l~|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba4fQz`z{4l!P!Q4qP4qO!XPP4vO!WPg5RqkQvSz`|POX%bZp%bqs%buv7Yvz%b{}%b}!O8V!O!P:T!Q![Kh![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#V8V#V#W=w#W#X@u#X#Y=w#Y#ZCw#Z#]8V#]#^Ea#^#a8V#a#b=w#b#d8V#d#eFy#e#f8V#f#gHc#g#o8V#o;'S%b;'S;=`&]<%lO%bR7a[kQ|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bT8^cvS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#o8V#o;'S%b;'S;=`&]<%lO%bS9nVvS}!O9i!O!P9i!Q![9i![!]9i!c!}9i#R#S9i#T#o9iV:[cvS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![;g![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#o8V#o;'S%b;'S;=`&]<%lO%bV;pqkQvS|POX%bZp%bqs%buv7Yvz%b{}%b}!O8V!O!P8V!Q![;g![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#V8V#V#W=w#W#X@u#X#Y=w#Y#ZCw#Z#]8V#]#^Ea#^#a8V#a#b=w#b#d8V#d#eFy#e#f8V#f#gHc#g#o8V#o;'S%b;'S;=`&]<%lO%bV>OevS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#a8V#a#b?a#b#o8V#o;'S%b;'S;=`&]<%lO%bV?jckQvS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#o8V#o;'S%b;'S;=`&]<%lO%bV@|evS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#X8V#X#YB_#Y#o8V#o;'S%b;'S;=`&]<%lO%bVBfevS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#Z8V#Z#[?a#[#o8V#o;'S%b;'S;=`&]<%lO%bVDOevS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#f8V#f#g?a#g#o8V#o;'S%b;'S;=`&]<%lO%bVEhevS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#b8V#b#c?a#c#o8V#o;'S%b;'S;=`&]<%lO%bVGQevS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#h8V#h#i?a#i#o8V#o;'S%b;'S;=`&]<%lO%bVHjfvS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#UJO#U#X8V#X#Y=w#Y#o8V#o;'S%b;'S;=`&]<%lO%bVJVevS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#W8V#W#X?a#X#o8V#o;'S%b;'S;=`&]<%lO%bVKqqkQvS|POX%bZp%bqs%buv7Yvz%b{}%b}!O8V!O!P:T!Q![Kh![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#V8V#V#W=w#W#X@u#X#Y=w#Y#ZCw#Z#]8V#]#^Ea#^#a8V#a#b=w#b#d8V#d#eFy#e#f8V#f#gHc#g#o8V#o;'S%b;'S;=`&]<%lO%b~NR[z`!c~|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba! OO!qPz`a! VO!nPz`c! `[!rQz`|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba!!]O!sPz`m!!hcvSxWz`|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#o!#s#o;'S%b;'S;=`&]<%lO%b]!#|cvSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#o!#s#o;'S%b;'S;=`&]<%lO%b[!%`VvSxW}!O!%X!O!P9i!Q![!%X![!]9i!c!}!%X#R#S!%X#T#o!%X~!&O[z`!e~|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba!&{O!tPz`~!'UOz`!f~}~m!'aVvSxWz`!pP}!O!%X!O!P9i!Q![!%X![!]9i!c!}!%X#R#S!%X#T#o!%Xa!'}O!ZPz`o!(YevSxWz`|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#i!#s#i#j!)k#j#o!#s#o;'S%b;'S;=`&]<%lO%b_!)tevSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#h!#s#h#i!+V#i#o!#s#o;'S%b;'S;=`&]<%lO%b_!+`evSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#c!#s#c#d!,q#d#o!#s#o;'S%b;'S;=`&]<%lO%b_!,|cvSxWlQ|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#o!#s#o;'S%b;'S;=`&]<%lO%bo!.ddvSxWz`|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#U!/r#U#o!#s#o;'S%b;'S;=`&]<%lO%b_!/{evSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#`!#s#`#a!1^#a#o!#s#o;'S%b;'S;=`&]<%lO%b_!1gevSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#g!#s#g#h!2x#h#o!#s#o;'S%b;'S;=`&]<%lO%b_!3RevSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#X!#s#X#Y!,q#Y#o!#s#o;'S%b;'S;=`&]<%lO%bm!4oevSxWz`|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#h!#s#h#i!6Q#i#o!#s#o;'S%b;'S;=`&]<%lO%b]!6ZevSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#h!#s#h#i!7l#i#o!#s#o;'S%b;'S;=`&]<%lO%b]!7uevSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#d!#s#d#e!9W#e#o!#s#o;'S%b;'S;=`&]<%lO%b]!9aevSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]!:r!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#g!#s#g#h!=P#h#o!#s#o;'S%b;'S;=`&]<%lO%bT!:ydvS|POX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!P!Q!pevSxWz`|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#c!#s#c#d!@R#d#o!#s#o;'S%b;'S;=`&]<%lO%b_!@[evSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#b!#s#b#c!2x#c#o!#s#o;'S%b;'S;=`&]<%lO%bo!AxevSxWz`|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#f!#s#f#g!CZ#g#o!#s#o;'S%b;'S;=`&]<%lO%b_!CdevSxW|POX%bZp%bqs%buz%b{}%b}!O!#s!O!P8V!Q![!#s![!]8V!]!^%b!`!b%b!c!}!#s!}#O%b#Q#R%b#R#S!%X#T#i!#s#i#j!2x#j#o!#s#o;'S%b;'S;=`&]<%lO%bc!EO[!gQz`|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bc!E}[!hQz`|POX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba!FxPz`;=`<%l$e`!GQOz`", - tokenizers: [headingTokenizer, headingTitleTokenizer, rawTokenizer, rawInlineTokenizer, codeBlockTokenizer, blockCommentTokenizer, lineCommentContentTokenizer, mathContentTokenizer, codeKeywordTokenizer, codeIdentTokenizer, strongBodyTokenizer, emphBodyTokenizer, 0, 1, 2, 3, 4], - topRules: {"Document":[0,16]}, - tokenPrec: 836 + tokenData: "!HP~R!UOX$eXY&cYZ&cZ]$e]^'X^p$epq&cqr$ers)sst/vtu/}ux$exy0Uyz1Tz{2S{|$e|}2c}!O$e!O!P3b!P!Q4a!Q![4v![!]Mx!]!^Nw!^!_! v!_!`! }!`!a!!U!a!b$e!b!c!#T!c!}!#[!}#O!&t#O#P!'s#P#Q!'z#Q#R$e#R#S!(T#S#T!(u#T#U!(|#U#Y!#[#Y#Z!/W#Z#[!#[#[#]!5c#]#b!#[#b#c!?d#c#h!#[#h#i!Bl#i#o!#[#o#p!Et#p#q$e#q#r!Fs#r;'S$e;'S;=`!Gr;=`<%l!Gz<%lO$ea$l[x`zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bP%g[zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bP&`P;=`<%l%b~&jSx`!S~XY&vYZ&v]^&vpq&v~&{S!S~XY&vYZ&v]^&vpq&v~'bax`!S~zPOX%bXY&vYZ&vZ]%b]^(g^p%bpq&vqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%b~(na!S~zPOX%bXY&vYZ&vZ]%b]^(g^p%bpq&vqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%b~)zgx`zPOX+cXY-PZp+cpq-Pqr+crs.ssu-Puz+cz{-P{!P+c!P!Q-P!Q!^+c!^!`-P!`!b+c!b!c-P!c#O+c#O#P-q#P#Q-P#Q#R+c#R#T-P#T;'S+c;'S;=`/p<%lO+c~+hgzPOX+cXY-PZp+cpq-Pqr+crs.ssu-Puz+cz{-P{!P+c!P!Q-P!Q!^+c!^!`-P!`!b+c!b!c-P!c#O+c#O#P-q#P#Q-P#Q#R+c#R#T-P#T;'S+c;'S;=`/p<%lO+c~-SWOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.m<%lO-P~-qOi~~-tRO;'S-P;'S;=`-};=`O-P~.QXOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.m;=`<%l-P<%lO-P~.pP;=`<%l-P~.z[i~zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%b~/sP;=`<%l+ca/}O!YPx`c0UO!mRx`~0_[x`!`~zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bc1^[!nQx`zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bc2ZP!qPx`!P!Q2^Q2cO!WQc2l[!oQx`zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%b~3k[x`!p~zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba4fQx`z{4l!P!Q4qP4qO!VPP4vO!UPg5RqjQtSx`zPOX%bZp%bqs%buv7Yvz%b{}%b}!O8V!O!P:T!Q![Kh![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#V8V#V#W=w#W#X@u#X#Y=w#Y#ZCw#Z#]8V#]#^Ea#^#a8V#a#b=w#b#d8V#d#eFy#e#f8V#f#gHc#g#o8V#o;'S%b;'S;=`&]<%lO%bR7a[jQzPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bT8^ctSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#o8V#o;'S%b;'S;=`&]<%lO%bS9nVtS}!O9i!O!P9i!Q![9i![!]9i!c!}9i#R#S9i#T#o9iV:[ctSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![;g![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#o8V#o;'S%b;'S;=`&]<%lO%bV;pqjQtSzPOX%bZp%bqs%buv7Yvz%b{}%b}!O8V!O!P8V!Q![;g![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#V8V#V#W=w#W#X@u#X#Y=w#Y#ZCw#Z#]8V#]#^Ea#^#a8V#a#b=w#b#d8V#d#eFy#e#f8V#f#gHc#g#o8V#o;'S%b;'S;=`&]<%lO%bV>OetSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#a8V#a#b?a#b#o8V#o;'S%b;'S;=`&]<%lO%bV?jcjQtSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#o8V#o;'S%b;'S;=`&]<%lO%bV@|etSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#X8V#X#YB_#Y#o8V#o;'S%b;'S;=`&]<%lO%bVBfetSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#Z8V#Z#[?a#[#o8V#o;'S%b;'S;=`&]<%lO%bVDOetSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#f8V#f#g?a#g#o8V#o;'S%b;'S;=`&]<%lO%bVEhetSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#b8V#b#c?a#c#o8V#o;'S%b;'S;=`&]<%lO%bVGQetSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#h8V#h#i?a#i#o8V#o;'S%b;'S;=`&]<%lO%bVHjftSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#UJO#U#X8V#X#Y=w#Y#o8V#o;'S%b;'S;=`&]<%lO%bVJVetSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#W8V#W#X?a#X#o8V#o;'S%b;'S;=`&]<%lO%bVKqqjQtSzPOX%bZp%bqs%buv7Yvz%b{}%b}!O8V!O!P:T!Q![Kh![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#V8V#V#W=w#W#X@u#X#Y=w#Y#ZCw#Z#]8V#]#^Ea#^#a8V#a#b=w#b#d8V#d#eFy#e#f8V#f#gHc#g#o8V#o;'S%b;'S;=`&]<%lO%b~NR[x`!c~zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bc! Q[!kQx`zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba! }O!sPx`c!!UO!jRx`c!!_[!tQx`zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba!#[O!uPx`m!#gctSvWx`zPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#o!$r#o;'S%b;'S;=`&]<%lO%b]!${ctSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#o!$r#o;'S%b;'S;=`&]<%lO%b[!&_VtSvW}!O!&W!O!P9i!Q![!&W![!]9i!c!}!&W#R#S!&W#T#o!&W~!&}[x`!e~zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba!'zO!vPx`~!(TOx`!f~{~m!(`VtSvWx`!rP}!O!&W!O!P9i!Q![!&W![!]9i!c!}!&W#R#S!&W#T#o!&Wa!(|O!XPx`o!)XetSvWx`zPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#i!$r#i#j!*j#j#o!$r#o;'S%b;'S;=`&]<%lO%b_!*setSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#h!$r#h#i!,U#i#o!$r#o;'S%b;'S;=`&]<%lO%b_!,_etSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#c!$r#c#d!-p#d#o!$r#o;'S%b;'S;=`&]<%lO%b_!-{ctSvWkQzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#o!$r#o;'S%b;'S;=`&]<%lO%bo!/cdtSvWx`zPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#U!0q#U#o!$r#o;'S%b;'S;=`&]<%lO%b_!0zetSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#`!$r#`#a!2]#a#o!$r#o;'S%b;'S;=`&]<%lO%b_!2fetSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#g!$r#g#h!3w#h#o!$r#o;'S%b;'S;=`&]<%lO%b_!4QetSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#X!$r#X#Y!-p#Y#o!$r#o;'S%b;'S;=`&]<%lO%bm!5netSvWx`zPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#h!$r#h#i!7P#i#o!$r#o;'S%b;'S;=`&]<%lO%b]!7YetSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#h!$r#h#i!8k#i#o!$r#o;'S%b;'S;=`&]<%lO%b]!8tetSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#d!$r#d#e!:V#e#o!$r#o;'S%b;'S;=`&]<%lO%b]!:`etSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]!;q!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#g!$r#g#h!>O#h#o!$r#o;'S%b;'S;=`&]<%lO%bT!;xdtSzPOX%bZp%bqs%buz%b{}%b}!O8V!O!P8V!P!Q!=W!Q![8V![!]8V!]!^%b!`!b%b!c!}8V!}#O%b#Q#R%b#R#S9i#T#o8V#o;'S%b;'S;=`&]<%lO%bP!=ZP!P!Q!=^P!=cVyPOX!=^Zp!=^q!^!=^!_!`!=^!a;'S!=^;'S;=`!=x<%lO!=^P!={P;=`<%l!=^]!>XctSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]!;q!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#o!$r#o;'S%b;'S;=`&]<%lO%bo!?oetSvWx`zPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#c!$r#c#d!AQ#d#o!$r#o;'S%b;'S;=`&]<%lO%b_!AZetSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#b!$r#b#c!3w#c#o!$r#o;'S%b;'S;=`&]<%lO%bo!BwetSvWx`zPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#f!$r#f#g!DY#g#o!$r#o;'S%b;'S;=`&]<%lO%b_!DcetSvWzPOX%bZp%bqs%buz%b{}%b}!O!$r!O!P8V!Q![!$r![!]8V!]!^%b!`!b%b!c!}!$r!}#O%b#Q#R%b#R#S!&W#T#i!$r#i#j!3w#j#o!$r#o;'S%b;'S;=`&]<%lO%bc!E}[!gQx`zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%bc!F|[!lQx`zPOX%bZp%bqs%buz%b{!P%b!Q!^%b!`!b%b!c#O%b#Q#R%b#T;'S%b;'S;=`&]<%lO%ba!GwPx`;=`<%l$e`!HPOx`", + tokenizers: [headingTokenizer, headingTitleTokenizer, rawTokenizer, rawInlineTokenizer, blockCommentTokenizer, lineCommentContentTokenizer, mathContentTokenizer, codeKeywordTokenizer, codeIdentTokenizer, strongBodyTokenizer, emphBodyTokenizer, 0, 1, 2, 3, 4], + topRules: {"Document":[0,15]}, + tokenPrec: 1127 }) diff --git a/services/web/frontend/js/features/source-editor/lezer-typst/typst.terms.mjs b/services/web/frontend/js/features/source-editor/lezer-typst/typst.terms.mjs index 524f8f1e9f..5148dd64bc 100644 --- a/services/web/frontend/js/features/source-editor/lezer-typst/typst.terms.mjs +++ b/services/web/frontend/js/features/source-editor/lezer-typst/typst.terms.mjs @@ -6,42 +6,40 @@ export const RawBlockBody = 4, RawBlockClose = 5, RawInlineContent = 6, - CodeBlockBody = 7, - BlockCommentBody = 8, - LineCommentContent = 9, - MathContent = 10, - CodeKeyword = 11, - CodeIdent = 12, - CodeArgKey = 13, - StrongBody = 14, - EmphBody = 15, - Document = 16, - Heading = 17, - LineComment = 18, - BlockComment = 19, - RawBlock = 20, - RawInline = 21, - CodeExpr = 22, - KeywordExpr = 23, - CallExpr = 24, - CodeArgs = 25, - CodeString = 26, - CodeNumber = 27, - CodeBool = 28, - FuncExpr = 29, - ContentBlock = 30, - CodeBlock = 31, - InlineMath = 32, - CodeArray = 33, - AtomExpr = 34, - Strong = 35, - Emphasis = 36, - Label = 37, - LabelName = 38, - Ref = 39, - RefName = 40, - Escape = 41, - EscapeChar = 42, - URL = 43, - MarkupContent = 44, - ClosingSquare = 45 + BlockCommentBody = 7, + LineCommentContent = 8, + MathContent = 9, + CodeKeyword = 10, + CodeIdent = 11, + CodeArgKey = 12, + StrongBody = 13, + EmphBody = 14, + Document = 15, + Heading = 16, + LineComment = 17, + BlockComment = 18, + RawBlock = 19, + RawInline = 20, + CodeExpr = 21, + KeywordExpr = 22, + FuncExpr = 23, + CodeArgs = 24, + CodeString = 25, + CodeNumber = 26, + CodeBool = 27, + ContentBlock = 28, + CodeBlock = 29, + InlineMath = 30, + CodeArray = 31, + AtomExpr = 32, + Strong = 33, + Emphasis = 34, + Label = 35, + LabelName = 36, + Ref = 37, + RefName = 38, + Escape = 39, + EscapeChar = 40, + URL = 41, + MarkupContent = 42, + ClosingSquare = 43