@diagrammo/dgmo 0.96.0 → 0.97.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advanced.d.ts +172 -8
- package/dist/advanced.js +225 -243
- package/dist/block.d.ts +8 -0
- package/dist/block.js +138 -66
- package/dist/{calculator-GIB7POFX.js → calculator-CIGGTURF.js} +2 -2
- package/dist/{chart-meta-uImk4eTn.d.ts → chart-meta-B7niEd52.d.ts} +3 -1
- package/dist/chart-meta.d.ts +2 -2
- package/dist/chart-meta.js +19 -19
- package/dist/{chart-types-CBVYiLqy.d.ts → chart-types-Dxtv4XSz.d.ts} +3 -0
- package/dist/{charts-d3-IRP5VANE.js → charts-d3-INWEGMSD.js} +14 -14
- package/dist/{chunk-MVUNMJKO.js → chunk-2FMOLWX4.js} +71 -57
- package/dist/{chunk-2BYFNZVM.js → chunk-2SZILMQT.js} +57 -15
- package/dist/{chunk-VLI6AWS3.js → chunk-3C4OXVZJ.js} +2 -2
- package/dist/{chunk-OO4GUE4E.js → chunk-3HL6NSSQ.js} +63 -18
- package/dist/{chunk-RGFVHYDP.js → chunk-3IUMSK72.js} +2 -2
- package/dist/{chunk-LRHPBWOY.js → chunk-44RLIAYC.js} +17 -10
- package/dist/{chunk-H7AXCRO7.js → chunk-453IWXZ3.js} +0 -11
- package/dist/{chunk-FHX373L5.js → chunk-47INRTZ6.js} +2 -2
- package/dist/{chunk-IN7XI6NO.js → chunk-4NMRS6HW.js} +1 -1
- package/dist/{chunk-HH3DHNQA.js → chunk-4TK26YHH.js} +2 -2
- package/dist/{chunk-5LG526X7.js → chunk-5TGZBHEJ.js} +1 -1
- package/dist/{chunk-BD4O4D2A.js → chunk-5WZYJC2P.js} +2 -2
- package/dist/{chunk-DPNSDCR3.js → chunk-65JFUANT.js} +1 -1
- package/dist/{chunk-EZ6BI5LL.js → chunk-6OUMYNAJ.js} +1 -1
- package/dist/{chunk-U6N547QA.js → chunk-6PUBFB6D.js} +24 -3
- package/dist/{chunk-5GU6C5WB.js → chunk-6S2H6EKN.js} +3 -3
- package/dist/{chunk-OYGJZA24.js → chunk-6SDEXSJY.js} +39 -19
- package/dist/{chunk-IKXQ6NVR.js → chunk-6YBZFOTA.js} +13 -13
- package/dist/{chunk-4B45SNZH.js → chunk-74XR7Z3I.js} +13 -13
- package/dist/{chunk-VNAPEZX2.js → chunk-7ASVGFW3.js} +1 -1
- package/dist/{chunk-RTRORHSP.js → chunk-7QKWU7FX.js} +3 -3
- package/dist/{chunk-A6YINTY6.js → chunk-7RACGVUY.js} +1 -1
- package/dist/{chunk-5G4DOOX2.js → chunk-7TEAFIEJ.js} +9 -5
- package/dist/{chunk-UNCCZ3NU.js → chunk-A3V72YIL.js} +14 -1
- package/dist/{chunk-VJ7NLYFE.js → chunk-A5LFM62B.js} +3 -3
- package/dist/{chunk-P3PSLC2K.js → chunk-AULFF7L2.js} +2 -2
- package/dist/{chunk-SCYVGPLI.js → chunk-B7ZH5EQ2.js} +2 -2
- package/dist/{chunk-VGAMBOOC.js → chunk-C6ME2L4T.js} +2 -2
- package/dist/{chunk-B2YVZ3QU.js → chunk-CGP7RGLJ.js} +1 -1
- package/dist/{chunk-67N26CER.js → chunk-CLW45YKE.js} +2 -1
- package/dist/{chunk-THTYCJGF.js → chunk-CUOMNKYW.js} +4 -4
- package/dist/{chunk-34JOHSVE.js → chunk-CUTEHGXO.js} +2 -2
- package/dist/{chunk-NERQSSYD.js → chunk-D67YE4LR.js} +1 -1
- package/dist/{chunk-DKCVAQU3.js → chunk-D7KZE2XJ.js} +39 -17
- package/dist/{chunk-PGD6CNWO.js → chunk-DFEVFLEG.js} +3 -3
- package/dist/{chunk-VVTCUIPN.js → chunk-DKMZ4VMV.js} +1 -1
- package/dist/{chunk-H7JVKUA5.js → chunk-DRY4W4W6.js} +36 -15
- package/dist/{chunk-IQZSKWE5.js → chunk-E6GHXMH2.js} +8 -8
- package/dist/{chunk-I2I2FKAK.js → chunk-EBJLT7PH.js} +1 -1
- package/dist/{chunk-GEHK4UD5.js → chunk-EEIGHOJR.js} +92 -23
- package/dist/{chunk-FKJWZWNU.js → chunk-EUPUVYWO.js} +1 -1
- package/dist/{chunk-3W73ZP6W.js → chunk-F2OAZHOX.js} +3 -3
- package/dist/{chunk-IU7XKZA6.js → chunk-FK6HZYGK.js} +4 -14
- package/dist/{chunk-2M3K6GD2.js → chunk-FTW2E2YH.js} +6 -6
- package/dist/{chunk-5P2L5QXE.js → chunk-FZVCS2XY.js} +4 -2
- package/dist/chunk-G24NSISJ.js +69 -0
- package/dist/{chunk-5H7SA5ZD.js → chunk-GFQFLLP3.js} +2 -2
- package/dist/{chunk-BUVLLK3D.js → chunk-GLLYHYGT.js} +27 -17
- package/dist/{chunk-VLC6WNRD.js → chunk-GULGSH2Z.js} +4 -0
- package/dist/{chunk-H5NVCOEJ.js → chunk-GXBH7WNN.js} +2 -2
- package/dist/{chunk-7UWVHNPM.js → chunk-H242TVAE.js} +9 -9
- package/dist/{chunk-M4ZUIW3J.js → chunk-H7DZYHQF.js} +3 -3
- package/dist/{chunk-GLCMUTO5.js → chunk-HQNZJMNS.js} +1 -1
- package/dist/{chunk-H7RQG4PH.js → chunk-IAM3IDL4.js} +2 -2
- package/dist/{chunk-WTPS73RM.js → chunk-II6D6NWX.js} +8 -8
- package/dist/{chunk-5ARANBIE.js → chunk-IUFTAFGN.js} +2 -2
- package/dist/{chunk-AQRSEQZV.js → chunk-IZEKHIV6.js} +3 -3
- package/dist/{chunk-WGNP5ND2.js → chunk-J3YM6RA5.js} +3 -3
- package/dist/{chunk-YFIUABSF.js → chunk-J467QBZF.js} +23 -3
- package/dist/{chunk-CD7VQCDL.js → chunk-J7JF4QKA.js} +40 -30
- package/dist/{chunk-MYHR3PMH.js → chunk-JULBDTNU.js} +7 -7
- package/dist/{chunk-EPDBWATV.js → chunk-K7RRXZHS.js} +4 -2
- package/dist/{chunk-YVIPJGFG.js → chunk-KMB754DO.js} +33 -6
- package/dist/chunk-KNKZGRRB.js +439 -0
- package/dist/{chunk-SIABEREK.js → chunk-KTGJQJB3.js} +2 -2
- package/dist/{chunk-LGUFJ7Y2.js → chunk-KW3CC7SB.js} +1 -1
- package/dist/{chunk-ITDF3MWD.js → chunk-L3K5O3Z5.js} +3 -3
- package/dist/chunk-LRTSTDJ6.js +126 -0
- package/dist/{chunk-NI4L6HEU.js → chunk-LZATSXAA.js} +1 -1
- package/dist/{chunk-RVOSA4RR.js → chunk-MJ725XHD.js} +441 -267
- package/dist/{chunk-EPB3UEMD.js → chunk-NBISN6FH.js} +2 -2
- package/dist/{chunk-IZFJZCF6.js → chunk-NN5RUHXV.js} +84 -16
- package/dist/{chunk-KDWEOT54.js → chunk-NOZMRPXI.js} +96 -153
- package/dist/{chunk-EM5SA7NC.js → chunk-NQFZ7LXC.js} +4 -4
- package/dist/chunk-NTDWVTEY.js +12 -0
- package/dist/{chunk-AUXUNV73.js → chunk-O3HRF25Z.js} +1 -1
- package/dist/{chunk-GLL237AP.js → chunk-OSSA5UWA.js} +3 -3
- package/dist/{chunk-UOCWYLYT.js → chunk-OZXKW5NA.js} +1 -1
- package/dist/{chunk-QEU6VM4O.js → chunk-PLQZJZ2K.js} +1 -1
- package/dist/chunk-PRG7NIUU.js +272 -0
- package/dist/{chunk-MAYTYF5S.js → chunk-PSNRB75I.js} +3 -3
- package/dist/{chunk-B5CEV7IR.js → chunk-PT5VFY3B.js} +38 -14
- package/dist/{chunk-KAO7JL4I.js → chunk-PU5X3P3T.js} +6 -5
- package/dist/{chunk-B7BSRVNC.js → chunk-PZ5LAAO3.js} +2 -2
- package/dist/{chunk-TOHTKLKE.js → chunk-Q5Q5JLRT.js} +1 -1
- package/dist/{chunk-TUOZ6AXC.js → chunk-Q6V342WS.js} +16 -4
- package/dist/{chunk-ZOKD5F7M.js → chunk-QDPTOIG7.js} +5 -5
- package/dist/{chunk-ERT7XDQW.js → chunk-QIITSGI5.js} +1 -1
- package/dist/{chunk-K2WXMXI2.js → chunk-QLIZ7SB7.js} +1 -1
- package/dist/chunk-QLNLRZ37.js +181 -0
- package/dist/{chunk-P6LKX3IQ.js → chunk-QOLRTPGH.js} +6 -6
- package/dist/{chunk-FBK32S4D.js → chunk-R4SXMBGF.js} +1 -1
- package/dist/chunk-R4U7IIRX.js +178 -0
- package/dist/{chunk-DWMQ24JR.js → chunk-RC6PISCK.js} +4 -2
- package/dist/{chunk-R5L5E3TC.js → chunk-REKLKGR6.js} +3 -3
- package/dist/{chunk-FUYEXLAN.js → chunk-RFGQDIOI.js} +837 -220
- package/dist/{chunk-W5MMPPGX.js → chunk-ROFSIFSY.js} +4 -4
- package/dist/{chunk-JCC3B2GS.js → chunk-ROH4LYBL.js} +65 -21
- package/dist/{chunk-OAZ6BIIB.js → chunk-SNDCXT5R.js} +9 -7
- package/dist/{chunk-JRN2CRXJ.js → chunk-TDUBTDXS.js} +1 -1
- package/dist/{chunk-GM2SLMQW.js → chunk-TMB4YY3J.js} +34 -4
- package/dist/{chunk-ZBOIYC2G.js → chunk-V3ICBS2O.js} +5 -5
- package/dist/{chunk-HZX4QZGR.js → chunk-V65EDV6S.js} +3 -3
- package/dist/{chunk-67RKJEKF.js → chunk-VKT3BVRO.js} +35 -11
- package/dist/{chunk-5BG4OSWJ.js → chunk-VOO65FKC.js} +12 -12
- package/dist/{chunk-KQAPFIYF.js → chunk-VQWLASDC.js} +2 -2
- package/dist/{chunk-JILEYZ2V.js → chunk-VVL2KKG4.js} +1 -1
- package/dist/{chunk-D7DGLJ7N.js → chunk-VVZDBUHA.js} +2 -2
- package/dist/{chunk-JBAFAKGX.js → chunk-W46OMHOK.js} +23 -27
- package/dist/{chunk-XCKNFFKM.js → chunk-WH6E6SHC.js} +2 -4
- package/dist/{chunk-P2GNNEMN.js → chunk-WPYJAHRP.js} +1 -1
- package/dist/{chunk-TPCP2UOI.js → chunk-WXGFB2O2.js} +3 -3
- package/dist/{chunk-RIK6WUMO.js → chunk-XCYGOCMS.js} +43 -26
- package/dist/{chunk-I3ZRIMR7.js → chunk-XEMCNQQW.js} +15 -15
- package/dist/{chunk-PWZEJNO6.js → chunk-XMUFXJI2.js} +6 -6
- package/dist/{chunk-EMGNCG5C.js → chunk-XZGXVN4T.js} +5 -5
- package/dist/{chunk-WLGOIMTI.js → chunk-YCIBBVI2.js} +2 -2
- package/dist/{chunk-V2NQV7VL.js → chunk-YFIDR7JH.js} +2 -2
- package/dist/{chunk-K2SFH3GJ.js → chunk-YFWIFKRQ.js} +3 -3
- package/dist/{chunk-6XLMTAEX.js → chunk-YIHRLY55.js} +33 -6
- package/dist/{chunk-CYRB2JTN.js → chunk-YLKPRT6U.js} +1 -1
- package/dist/{chunk-KMU65FYM.js → chunk-YSDSFXQD.js} +1 -1
- package/dist/{chunk-ZI6WC24V.js → chunk-ZBJV4KNU.js} +1 -1
- package/dist/{chunk-TIPNNOZC.js → chunk-ZCKVTZHD.js} +41 -19
- package/dist/{chunk-YSGOXZBB.js → chunk-ZMVMGZAJ.js} +1 -1
- package/dist/{chunk-CP73WWLN.js → chunk-ZRW4B4KF.js} +48 -14
- package/dist/{chunk-O2HNVNKO.js → chunk-ZTKO2RD4.js} +5 -5
- package/dist/collapse-6IGH2B24.js +31 -0
- package/dist/collapse-GOWNCVHZ.js +7 -0
- package/dist/collapse-HNTPLB2Q.js +11 -0
- package/dist/collapse-NUM7DPJA.js +10 -0
- package/dist/completion-registry.js +27 -4
- package/dist/dgmo-router-RSYWR5IS.js +101 -0
- package/dist/dimensions-KXAI7U2B.js +21 -0
- package/dist/editor.js +882 -215
- package/dist/{flowchart-parser-SM5LHF2D.js → flowchart-parser-UI5VZNGJ.js} +5 -5
- package/dist/{flowchart-renderer-PPS2GTTD.js → flowchart-renderer-IYWPKPCF.js} +18 -18
- package/dist/fold-at-line-DmSAa1eU.d.ts +11 -0
- package/dist/highlight.js +883 -216
- package/dist/index.d.ts +52 -5
- package/dist/index.js +79 -63
- package/dist/{layout-AF4KA5B2.js → layout-6VY3DHYD.js} +6 -6
- package/dist/{layout-FCFUVCRI.js → layout-7C2QZCEZ.js} +10 -10
- package/dist/{layout-2WESJYRE.js → layout-7E7BNOGO.js} +3 -2
- package/dist/layout-BSK374N6.js +11 -0
- package/dist/{layout-R6G4MEO3.js → layout-FJDBY3WG.js} +5 -5
- package/dist/{layout-KELSNWBD.js → layout-G3RVKEC4.js} +10 -10
- package/dist/{layout-H2KP5A6M.js → layout-GC5XX2RH.js} +2 -2
- package/dist/{layout-LNVIH45F.js → layout-R6ULGQJK.js} +6 -6
- package/dist/{layout-PPIVGJXD.js → layout-ROI5KVSO.js} +3 -3
- package/dist/{layout-3TSVAGWH.js → layout-SPPS225I.js} +3 -3
- package/dist/{layout-HF3PMI4H.js → layout-VTGOYGRC.js} +2 -2
- package/dist/{layout-MPSH3YWE.js → layout-WBH5IHYK.js} +10 -10
- package/dist/layout-WTHBGTH2.js +15 -0
- package/dist/layout-ZCCABSV7.js +15 -0
- package/dist/{layout-search-C2TYUH4L.js → layout-search-DSIDKKQO.js} +8 -8
- package/dist/{legend-constants-55MFBXYF.js → legend-constants-KF3MKWL2.js} +2 -2
- package/dist/{parser-DGLKH4NT.js → parser-3PMYAVFL.js} +2 -2
- package/dist/{parser-OHBBDCG4.js → parser-5KVFS4RN.js} +2 -2
- package/dist/{parser-UHKROC7Z.js → parser-BA43YPIQ.js} +3 -3
- package/dist/{parser-F75WNYMK.js → parser-CFAYEWLF.js} +3 -3
- package/dist/{parser-MWINQNQW.js → parser-DRFEX6OX.js} +3 -3
- package/dist/{parser-W6NX3AIV.js → parser-DWVBRBB2.js} +3 -3
- package/dist/{parser-6WURFLOB.js → parser-E4B7HJT2.js} +3 -3
- package/dist/{parser-DRUGM3R6.js → parser-FWQY3HJX.js} +2 -2
- package/dist/{parser-GBQY3WOZ.js → parser-GMCXCJSP.js} +3 -3
- package/dist/{parser-BPYHIG24.js → parser-IHFHPFL7.js} +3 -3
- package/dist/{parser-QWTECQEC.js → parser-IU6425JW.js} +6 -6
- package/dist/{parser-ZV756RMP.js → parser-IZYIXDJX.js} +6 -6
- package/dist/{parser-TTGZYLYD.js → parser-JQGUTDSX.js} +3 -3
- package/dist/{parser-BNRX35NT.js → parser-JRKPOO2Z.js} +3 -3
- package/dist/{parser-B7SCN7FG.js → parser-KI2XYB2R.js} +2 -2
- package/dist/parser-LDVVBP7S.js +12 -0
- package/dist/{parser-L7SI3PW4.js → parser-MAGFK6OK.js} +4 -4
- package/dist/{parser-722KLLAQ.js → parser-MH5BDN7X.js} +3 -3
- package/dist/{parser-5RUD4A3X.js → parser-MUHFEM4G.js} +3 -3
- package/dist/{parser-Y7QXD2UR.js → parser-P375HO7Q.js} +2 -2
- package/dist/{parser-LUJX7AXO.js → parser-PYY5BRLQ.js} +2 -2
- package/dist/parser-QEMFMVF5.js +12 -0
- package/dist/{parser-WIKXZP4X.js → parser-QIPDBT5M.js} +2 -2
- package/dist/{parser-2AXU2MHJ.js → parser-RNBDDEGL.js} +3 -3
- package/dist/{parser-4GHAYZKZ.js → parser-RSWZGQA7.js} +6 -6
- package/dist/{parser-H6HT2WFQ.js → parser-SGX2PVR5.js} +2 -2
- package/dist/{parser-ZWWQZ4XZ.js → parser-SJUEFKNM.js} +3 -3
- package/dist/{parser-4BOP77CD.js → parser-UMNBPXG2.js} +2 -2
- package/dist/{parser-GM5B2EPW.js → parser-WE4VSBBY.js} +3 -3
- package/dist/{parser-XEJP37GQ.js → parser-WKEYS7N3.js} +3 -3
- package/dist/{parser-DWV2CYBS.js → parser-WPXUUNA2.js} +3 -3
- package/dist/{parser-5HQPPVHJ.js → parser-XP3RCOTN.js} +3 -3
- package/dist/{parser-F3JJNIFC.js → parser-YV4RBHG7.js} +3 -3
- package/dist/{parser-CRJYLOHA.js → parser-YZ3J542U.js} +2 -2
- package/dist/{renderer-BYLQ37T2.js → renderer-2V5NVI3V.js} +15 -15
- package/dist/renderer-4PKYVOYL.js +39 -0
- package/dist/{renderer-ONENGXFQ.js → renderer-66SCERH7.js} +14 -12
- package/dist/renderer-6IAXRZLK.js +85 -0
- package/dist/{renderer-GKY55M4Z.js → renderer-6O5SV5YE.js} +10 -10
- package/dist/{renderer-F7YGMEGQ.js → renderer-7OXMSF4R.js} +4 -4
- package/dist/{renderer-6HU44IGJ.js → renderer-A36NL2SS.js} +8 -8
- package/dist/{renderer-66NCRXSC.js → renderer-ASPBBACI.js} +13 -11
- package/dist/{renderer-5GP7YUS4.js → renderer-BXVTYE27.js} +7 -6
- package/dist/renderer-CC6O6GQK.js +18 -0
- package/dist/{renderer-VNJOZPSH.js → renderer-CNDB4JTZ.js} +17 -17
- package/dist/renderer-COV2DXTM.js +41 -0
- package/dist/renderer-DXCATVLO.js +30 -0
- package/dist/{renderer-VUXAAGUG.js → renderer-E5E3OJ42.js} +12 -11
- package/dist/{renderer-MGF2NNGG.js → renderer-E7LC7HCU.js} +5 -5
- package/dist/{renderer-PEJF6R2I.js → renderer-F3JYZERE.js} +4 -4
- package/dist/{renderer-CVCCW7UT.js → renderer-FAFSRFGR.js} +9 -9
- package/dist/renderer-HIB6LZWZ.js +26 -0
- package/dist/renderer-HLDRRFZB.js +28 -0
- package/dist/renderer-INQMQPNN.js +22 -0
- package/dist/renderer-ITJ67HXO.js +27 -0
- package/dist/{renderer-SYRH3B62.js → renderer-JLOKFKOZ.js} +14 -13
- package/dist/{renderer-LJPUCG3U.js → renderer-KOPJ76GS.js} +10 -10
- package/dist/{renderer-N6PM5CSG.js → renderer-M2467III.js} +14 -13
- package/dist/{renderer-MVBAQP3M.js → renderer-MYKL6VG6.js} +6 -6
- package/dist/{renderer-YJVQT7QG.js → renderer-S6L3JR6C.js} +11 -11
- package/dist/{renderer-NOYLNVTI.js → renderer-SYWVZ4CY.js} +3 -3
- package/dist/renderer-TCTZZ5Y6.js +32 -0
- package/dist/{renderer-D6EH5UQ6.js → renderer-UIHCYXBY.js} +12 -12
- package/dist/{renderer-QZJZIAT3.js → renderer-WIBVOPRC.js} +6 -4
- package/dist/{renderer-TS5NHOQD.js → renderer-XMJ6XZGL.js} +12 -11
- package/dist/{renderer-2V2XY2V7.js → renderer-ZTHXOBXW.js} +8 -8
- package/dist/{renderer-radial-4R7AKETK.js → renderer-radial-FC25BDCZ.js} +8 -8
- package/dist/{state-parser-EQBBEKHR.js → state-parser-2PQRH5JE.js} +6 -6
- package/dist/state-renderer-YP6HWLJR.js +43 -0
- package/dist/{themes-CbJL3w8L.d.ts → themes-DoLdhUXV.d.ts} +1 -1
- package/docs/ai-integration.md +4 -3
- package/docs/language-reference.md +99 -13
- package/gallery/fixtures/swot-relabel.dgmo +19 -0
- package/gallery/fixtures/swot-tags.dgmo +16 -0
- package/gallery/fixtures/swot.dgmo +13 -0
- package/package.json +1 -1
- package/dist/chunk-R2K5L4UA.js +0 -49
- package/dist/collapse-TCVK3RPO.js +0 -8
- package/dist/dgmo-router-EPBQKQW2.js +0 -100
- package/dist/dimensions-DBCRBZIU.js +0 -21
- package/dist/layout-3J72UULM.js +0 -15
- package/dist/layout-IXQNVRBE.js +0 -15
- package/dist/layout-VDCJOZSH.js +0 -11
- package/dist/parser-HM6FEX5K.js +0 -14
- package/dist/renderer-2MCV75JQ.js +0 -41
- package/dist/renderer-5AEDVLAA.js +0 -31
- package/dist/renderer-7C76HP5W.js +0 -30
- package/dist/renderer-7RAMBMTH.js +0 -22
- package/dist/renderer-E3334XLT.js +0 -84
- package/dist/renderer-LFZKG2GR.js +0 -26
- package/dist/renderer-MZIWP55B.js +0 -28
- package/dist/renderer-N75E3UVY.js +0 -25
- package/dist/renderer-VNUDN6F5.js +0 -39
- package/dist/state-renderer-SOGZ2CNN.js +0 -42
package/dist/highlight.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
// src/editor/dgmo.grammar.js
|
|
2
2
|
import { LRParser } from "@lezer/lr";
|
|
3
3
|
|
|
4
|
+
// src/editor/tokens.ts
|
|
5
|
+
import { ContextTracker } from "@lezer/lr";
|
|
6
|
+
|
|
4
7
|
// src/editor/dgmo.grammar.terms.js
|
|
5
8
|
var ChartType = 1;
|
|
6
9
|
var TagKeyword = 2;
|
|
7
10
|
var DirectiveKeyword = 3;
|
|
8
11
|
var ControlKeyword = 4;
|
|
9
12
|
var ModifierKeyword = 5;
|
|
13
|
+
var Comment = 7;
|
|
10
14
|
|
|
11
15
|
// src/directives-registry.ts
|
|
12
16
|
var DIRECTIVES_REGISTRY = [
|
|
@@ -14,9 +18,21 @@ var DIRECTIVES_REGISTRY = [
|
|
|
14
18
|
// Accepted in every date-bearing chart (gantt, pert, countdown, timeline,
|
|
15
19
|
// event-line). Handled inline by each parser's prescan — no parser-Set
|
|
16
20
|
// membership here — so they only contribute highlighting (DIRECTIVE_KEYWORDS).
|
|
17
|
-
{
|
|
18
|
-
|
|
19
|
-
|
|
21
|
+
{
|
|
22
|
+
token: "year",
|
|
23
|
+
category: "directive",
|
|
24
|
+
chartTypes: ["countdown", "event-line", "gantt", "pert", "timeline"]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
token: "date-order",
|
|
28
|
+
category: "directive",
|
|
29
|
+
chartTypes: ["countdown", "event-line", "gantt", "pert", "timeline"]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
token: "no-current-year",
|
|
33
|
+
category: "directive",
|
|
34
|
+
chartTypes: ["countdown", "event-line", "gantt", "pert", "timeline"]
|
|
35
|
+
},
|
|
20
36
|
// ── Infra ────────────────────────────────────────────────
|
|
21
37
|
// Top-level SLO options that are ALSO accepted as node colon-properties
|
|
22
38
|
// (dual membership). Highlight bare (kept in DIRECTIVE_KEYWORDS) — their
|
|
@@ -24,92 +40,413 @@ var DIRECTIVES_REGISTRY = [
|
|
|
24
40
|
{
|
|
25
41
|
token: "slo-availability",
|
|
26
42
|
category: "directive",
|
|
27
|
-
infra: ["top-level", "behavior"]
|
|
43
|
+
infra: ["top-level", "behavior"],
|
|
44
|
+
chartTypes: ["infra"]
|
|
28
45
|
},
|
|
29
46
|
{
|
|
30
47
|
token: "slo-p90-latency-ms",
|
|
31
48
|
category: "directive",
|
|
32
|
-
infra: ["top-level", "behavior"]
|
|
49
|
+
infra: ["top-level", "behavior"],
|
|
50
|
+
chartTypes: ["infra"]
|
|
33
51
|
},
|
|
34
52
|
{
|
|
35
53
|
token: "slo-warning-margin",
|
|
36
54
|
category: "directive",
|
|
37
|
-
infra: ["top-level", "behavior"]
|
|
55
|
+
infra: ["top-level", "behavior"],
|
|
56
|
+
chartTypes: ["infra"]
|
|
38
57
|
},
|
|
39
58
|
// Top-level-only options (space-separated, bare).
|
|
40
|
-
{
|
|
41
|
-
|
|
42
|
-
|
|
59
|
+
{
|
|
60
|
+
token: "default-latency-ms",
|
|
61
|
+
category: "directive",
|
|
62
|
+
infra: ["top-level"],
|
|
63
|
+
chartTypes: ["infra"]
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
token: "default-uptime",
|
|
67
|
+
category: "directive",
|
|
68
|
+
infra: ["top-level"],
|
|
69
|
+
chartTypes: ["infra"]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
token: "default-rps",
|
|
73
|
+
category: "directive",
|
|
74
|
+
infra: ["top-level"],
|
|
75
|
+
chartTypes: ["infra"]
|
|
76
|
+
},
|
|
43
77
|
// `active-tag` is shared with gantt + map (see below).
|
|
44
78
|
// Node behavior colon-keys — highlight as propertyName.
|
|
45
|
-
{
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
{
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
{
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
79
|
+
{
|
|
80
|
+
token: "latency-ms",
|
|
81
|
+
colonKey: true,
|
|
82
|
+
infra: ["behavior"],
|
|
83
|
+
chartTypes: ["infra"]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
token: "uptime",
|
|
87
|
+
colonKey: true,
|
|
88
|
+
infra: ["behavior"],
|
|
89
|
+
chartTypes: ["infra"]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
token: "instances",
|
|
93
|
+
colonKey: true,
|
|
94
|
+
infra: ["behavior"],
|
|
95
|
+
chartTypes: ["infra"]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
token: "max-rps",
|
|
99
|
+
colonKey: true,
|
|
100
|
+
infra: ["behavior"],
|
|
101
|
+
chartTypes: ["infra"]
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
token: "cache-hit",
|
|
105
|
+
colonKey: true,
|
|
106
|
+
infra: ["behavior"],
|
|
107
|
+
chartTypes: ["infra"]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
token: "firewall-block",
|
|
111
|
+
colonKey: true,
|
|
112
|
+
infra: ["behavior"],
|
|
113
|
+
chartTypes: ["infra"]
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
token: "ratelimit-rps",
|
|
117
|
+
colonKey: true,
|
|
118
|
+
infra: ["behavior"],
|
|
119
|
+
chartTypes: ["infra"]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
token: "buffer",
|
|
123
|
+
colonKey: true,
|
|
124
|
+
infra: ["behavior"],
|
|
125
|
+
chartTypes: ["infra"]
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
token: "drain-rate",
|
|
129
|
+
colonKey: true,
|
|
130
|
+
infra: ["behavior"],
|
|
131
|
+
chartTypes: ["infra"]
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
token: "retention-hours",
|
|
135
|
+
colonKey: true,
|
|
136
|
+
infra: ["behavior"],
|
|
137
|
+
chartTypes: ["infra"]
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
token: "partitions",
|
|
141
|
+
colonKey: true,
|
|
142
|
+
infra: ["behavior"],
|
|
143
|
+
chartTypes: ["infra"]
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
token: "concurrency",
|
|
147
|
+
colonKey: true,
|
|
148
|
+
infra: ["behavior"],
|
|
149
|
+
chartTypes: ["infra"]
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
token: "duration-ms",
|
|
153
|
+
colonKey: true,
|
|
154
|
+
infra: ["behavior"],
|
|
155
|
+
chartTypes: ["infra"]
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
token: "cold-start-ms",
|
|
159
|
+
colonKey: true,
|
|
160
|
+
infra: ["behavior"],
|
|
161
|
+
chartTypes: ["infra"]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
token: "cb-error-threshold",
|
|
165
|
+
colonKey: true,
|
|
166
|
+
infra: ["behavior"],
|
|
167
|
+
chartTypes: ["infra"]
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
token: "cb-latency-threshold-ms",
|
|
171
|
+
colonKey: true,
|
|
172
|
+
infra: ["behavior"],
|
|
173
|
+
chartTypes: ["infra"]
|
|
174
|
+
},
|
|
61
175
|
// Edge-only colon-key.
|
|
62
|
-
{ token: "rps", colonKey: true, infra: ["edge"] },
|
|
176
|
+
{ token: "rps", colonKey: true, infra: ["edge"], chartTypes: ["infra"] },
|
|
63
177
|
// ── Gantt ────────────────────────────────────────────────
|
|
64
|
-
{
|
|
178
|
+
{
|
|
179
|
+
token: "start",
|
|
180
|
+
category: "directive",
|
|
181
|
+
gantt: ["option"],
|
|
182
|
+
chartTypes: ["gantt"]
|
|
183
|
+
},
|
|
65
184
|
{
|
|
66
185
|
token: "today-marker",
|
|
67
186
|
category: "directive",
|
|
68
|
-
gantt: ["option", "boolean"]
|
|
187
|
+
gantt: ["option", "boolean"],
|
|
188
|
+
chartTypes: ["gantt"]
|
|
69
189
|
},
|
|
70
190
|
{
|
|
71
191
|
token: "critical-path",
|
|
72
192
|
category: "directive",
|
|
73
|
-
gantt: ["option", "boolean"]
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
{
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
193
|
+
gantt: ["option", "boolean"],
|
|
194
|
+
chartTypes: ["gantt"]
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
token: "sprint-length",
|
|
198
|
+
category: "directive",
|
|
199
|
+
gantt: ["option"],
|
|
200
|
+
chartTypes: ["gantt", "pert"]
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
token: "sprint-number",
|
|
204
|
+
category: "directive",
|
|
205
|
+
gantt: ["option"],
|
|
206
|
+
chartTypes: ["gantt", "pert"]
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
token: "sprint-start",
|
|
210
|
+
category: "directive",
|
|
211
|
+
gantt: ["option"],
|
|
212
|
+
chartTypes: ["gantt", "pert"]
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
token: "fill-tint",
|
|
216
|
+
category: "directive",
|
|
217
|
+
gantt: ["boolean"],
|
|
218
|
+
chartTypes: [
|
|
219
|
+
"arc",
|
|
220
|
+
"bar",
|
|
221
|
+
"block",
|
|
222
|
+
"body",
|
|
223
|
+
"boxes-and-lines",
|
|
224
|
+
"bracket",
|
|
225
|
+
"c4",
|
|
226
|
+
"class",
|
|
227
|
+
"clock",
|
|
228
|
+
"countdown",
|
|
229
|
+
"cycle",
|
|
230
|
+
"er",
|
|
231
|
+
"event-line",
|
|
232
|
+
"family",
|
|
233
|
+
"flowchart",
|
|
234
|
+
"funnel",
|
|
235
|
+
"gantt",
|
|
236
|
+
"goal",
|
|
237
|
+
"heatmap",
|
|
238
|
+
"journey-map",
|
|
239
|
+
"kanban",
|
|
240
|
+
"line",
|
|
241
|
+
"mindmap",
|
|
242
|
+
"org",
|
|
243
|
+
"pert",
|
|
244
|
+
"pie",
|
|
245
|
+
"polar-area",
|
|
246
|
+
"pyramid",
|
|
247
|
+
"quadrant",
|
|
248
|
+
"raci",
|
|
249
|
+
"radar",
|
|
250
|
+
"ring",
|
|
251
|
+
"scatter",
|
|
252
|
+
"sequence",
|
|
253
|
+
"sitemap",
|
|
254
|
+
"state",
|
|
255
|
+
"swimlane",
|
|
256
|
+
"timeline",
|
|
257
|
+
"treemap",
|
|
258
|
+
"venn",
|
|
259
|
+
"wireframe"
|
|
260
|
+
]
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
token: "fill-solid",
|
|
264
|
+
category: "directive",
|
|
265
|
+
gantt: ["boolean"],
|
|
266
|
+
chartTypes: [
|
|
267
|
+
"arc",
|
|
268
|
+
"bar",
|
|
269
|
+
"block",
|
|
270
|
+
"body",
|
|
271
|
+
"boxes-and-lines",
|
|
272
|
+
"bracket",
|
|
273
|
+
"c4",
|
|
274
|
+
"class",
|
|
275
|
+
"clock",
|
|
276
|
+
"countdown",
|
|
277
|
+
"cycle",
|
|
278
|
+
"er",
|
|
279
|
+
"event-line",
|
|
280
|
+
"family",
|
|
281
|
+
"flowchart",
|
|
282
|
+
"funnel",
|
|
283
|
+
"gantt",
|
|
284
|
+
"goal",
|
|
285
|
+
"heatmap",
|
|
286
|
+
"journey-map",
|
|
287
|
+
"kanban",
|
|
288
|
+
"line",
|
|
289
|
+
"mindmap",
|
|
290
|
+
"org",
|
|
291
|
+
"pert",
|
|
292
|
+
"pie",
|
|
293
|
+
"polar-area",
|
|
294
|
+
"pyramid",
|
|
295
|
+
"quadrant",
|
|
296
|
+
"raci",
|
|
297
|
+
"radar",
|
|
298
|
+
"ring",
|
|
299
|
+
"scatter",
|
|
300
|
+
"sequence",
|
|
301
|
+
"sitemap",
|
|
302
|
+
"state",
|
|
303
|
+
"swimlane",
|
|
304
|
+
"timeline",
|
|
305
|
+
"treemap",
|
|
306
|
+
"venn",
|
|
307
|
+
"wireframe"
|
|
308
|
+
]
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
token: "fill-outline",
|
|
312
|
+
category: "directive",
|
|
313
|
+
gantt: ["boolean"],
|
|
314
|
+
chartTypes: [
|
|
315
|
+
"arc",
|
|
316
|
+
"bar",
|
|
317
|
+
"block",
|
|
318
|
+
"body",
|
|
319
|
+
"boxes-and-lines",
|
|
320
|
+
"bracket",
|
|
321
|
+
"c4",
|
|
322
|
+
"class",
|
|
323
|
+
"clock",
|
|
324
|
+
"countdown",
|
|
325
|
+
"cycle",
|
|
326
|
+
"er",
|
|
327
|
+
"event-line",
|
|
328
|
+
"family",
|
|
329
|
+
"flowchart",
|
|
330
|
+
"funnel",
|
|
331
|
+
"gantt",
|
|
332
|
+
"goal",
|
|
333
|
+
"heatmap",
|
|
334
|
+
"journey-map",
|
|
335
|
+
"kanban",
|
|
336
|
+
"line",
|
|
337
|
+
"mindmap",
|
|
338
|
+
"org",
|
|
339
|
+
"pert",
|
|
340
|
+
"pie",
|
|
341
|
+
"polar-area",
|
|
342
|
+
"pyramid",
|
|
343
|
+
"quadrant",
|
|
344
|
+
"raci",
|
|
345
|
+
"radar",
|
|
346
|
+
"ring",
|
|
347
|
+
"scatter",
|
|
348
|
+
"sequence",
|
|
349
|
+
"sitemap",
|
|
350
|
+
"state",
|
|
351
|
+
"swimlane",
|
|
352
|
+
"timeline",
|
|
353
|
+
"treemap",
|
|
354
|
+
"venn",
|
|
355
|
+
"wireframe"
|
|
356
|
+
]
|
|
357
|
+
},
|
|
81
358
|
// `chart` is a wireframe element keyword (CONTROL); gantt also accepts it as
|
|
82
359
|
// an option. Highlight family is control.
|
|
83
|
-
{
|
|
360
|
+
{
|
|
361
|
+
token: "chart",
|
|
362
|
+
category: "control",
|
|
363
|
+
gantt: ["option"],
|
|
364
|
+
chartTypes: ["gantt", "wireframe"]
|
|
365
|
+
},
|
|
84
366
|
// `dependencies` is ON by default → almost never written bare (authors write
|
|
85
367
|
// `no-dependencies`, which DOES highlight). Bare word collides with prose and
|
|
86
|
-
//
|
|
87
|
-
// Set derivation only.
|
|
88
|
-
{
|
|
368
|
+
// it would colour in every gantt task name, so it stays plain. Present for
|
|
369
|
+
// parser Set derivation only.
|
|
370
|
+
{
|
|
371
|
+
token: "dependencies",
|
|
372
|
+
noHighlight: true,
|
|
373
|
+
gantt: ["option", "boolean"],
|
|
374
|
+
chartTypes: ["gantt"]
|
|
375
|
+
},
|
|
89
376
|
// ── Map ──────────────────────────────────────────────────
|
|
90
377
|
// Per-element value→channel ramps (decision #20): the directive names the
|
|
91
378
|
// visual channel — `region-heat` (colour), `poi-size` (marker area),
|
|
92
379
|
// `flow-width` (stroke). The per-element key mirrors it (`heat:`/`size:`/`width:`).
|
|
93
|
-
{
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
{ token: "
|
|
100
|
-
{
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
{ token: "
|
|
380
|
+
{
|
|
381
|
+
token: "region-heat",
|
|
382
|
+
category: "directive",
|
|
383
|
+
map: true,
|
|
384
|
+
chartTypes: ["map"]
|
|
385
|
+
},
|
|
386
|
+
{ token: "poi-size", category: "directive", map: true, chartTypes: ["map"] },
|
|
387
|
+
{
|
|
388
|
+
token: "flow-width",
|
|
389
|
+
category: "directive",
|
|
390
|
+
map: true,
|
|
391
|
+
chartTypes: ["map"]
|
|
392
|
+
},
|
|
393
|
+
{ token: "locale", category: "directive", map: true, chartTypes: ["map"] },
|
|
394
|
+
{ token: "caption", category: "directive", map: true, chartTypes: ["map"] },
|
|
395
|
+
{
|
|
396
|
+
token: "no-coastline",
|
|
397
|
+
category: "directive",
|
|
398
|
+
map: true,
|
|
399
|
+
chartTypes: ["map"]
|
|
400
|
+
},
|
|
401
|
+
{ token: "no-relief", category: "directive", map: true, chartTypes: ["map"] },
|
|
402
|
+
{
|
|
403
|
+
token: "no-context-labels",
|
|
404
|
+
category: "directive",
|
|
405
|
+
map: true,
|
|
406
|
+
chartTypes: ["map"]
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
token: "no-region-labels",
|
|
410
|
+
category: "directive",
|
|
411
|
+
map: true,
|
|
412
|
+
chartTypes: ["map"]
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
token: "no-region-heat-value",
|
|
416
|
+
category: "directive",
|
|
417
|
+
map: true,
|
|
418
|
+
chartTypes: ["map"]
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
token: "no-poi-labels",
|
|
422
|
+
category: "directive",
|
|
423
|
+
map: true,
|
|
424
|
+
chartTypes: ["map"]
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
token: "no-colorize",
|
|
428
|
+
category: "directive",
|
|
429
|
+
map: true,
|
|
430
|
+
chartTypes: ["map"]
|
|
431
|
+
},
|
|
432
|
+
{ token: "no-cities", category: "directive", map: true, chartTypes: ["map"] },
|
|
433
|
+
{
|
|
434
|
+
token: "no-cluster-pois",
|
|
435
|
+
category: "directive",
|
|
436
|
+
map: true,
|
|
437
|
+
chartTypes: ["map"]
|
|
438
|
+
},
|
|
107
439
|
// ── Clock channel (BL-122): live local-time cards on POIs flagged `clock` ──
|
|
108
440
|
// Activation is the per-POI `clock` flag (peeled in the map parser, not a
|
|
109
441
|
// directive). `hours 9-17` / `days mon-fri` are the global availability
|
|
110
442
|
// window (reused verbatim from the clock chart type).
|
|
111
|
-
{
|
|
112
|
-
|
|
443
|
+
{
|
|
444
|
+
token: "hours",
|
|
445
|
+
category: "directive",
|
|
446
|
+
map: true,
|
|
447
|
+
chartTypes: ["clock", "map"]
|
|
448
|
+
},
|
|
449
|
+
{ token: "days", category: "directive", map: true, chartTypes: ["map"] },
|
|
113
450
|
// ── Shared across types ──────────────────────────────────
|
|
114
451
|
// `active-tag`: infra top-level option + gantt option + map directive.
|
|
115
452
|
// Treemap also accepts it (§24C.6, decision #48) — validated inline in its
|
|
@@ -120,24 +457,74 @@ var DIRECTIVES_REGISTRY = [
|
|
|
120
457
|
category: "directive",
|
|
121
458
|
infra: ["top-level"],
|
|
122
459
|
gantt: ["option"],
|
|
123
|
-
map: true
|
|
460
|
+
map: true,
|
|
461
|
+
chartTypes: [
|
|
462
|
+
"body",
|
|
463
|
+
"boxes-and-lines",
|
|
464
|
+
"c4",
|
|
465
|
+
"er",
|
|
466
|
+
"event-line",
|
|
467
|
+
"family",
|
|
468
|
+
"gantt",
|
|
469
|
+
"infra",
|
|
470
|
+
"journey-map",
|
|
471
|
+
"kanban",
|
|
472
|
+
"map",
|
|
473
|
+
"mindmap",
|
|
474
|
+
"org",
|
|
475
|
+
"pert",
|
|
476
|
+
"sequence",
|
|
477
|
+
"sitemap",
|
|
478
|
+
"state",
|
|
479
|
+
"swimlane",
|
|
480
|
+
"timeline",
|
|
481
|
+
"treemap",
|
|
482
|
+
"wireframe"
|
|
483
|
+
]
|
|
124
484
|
},
|
|
125
485
|
// `title`: gantt option. (The data-chart `title` directive was removed in
|
|
126
486
|
// decision #48 — it now raises E_TITLE_DIRECTIVE; the token stays here for
|
|
127
487
|
// gantt.)
|
|
128
|
-
{
|
|
488
|
+
{
|
|
489
|
+
token: "title",
|
|
490
|
+
category: "directive",
|
|
491
|
+
gantt: ["option"],
|
|
492
|
+
chartTypes: ["gantt"]
|
|
493
|
+
},
|
|
129
494
|
// `sort`: gantt option (also general, hand-listed).
|
|
130
|
-
{
|
|
495
|
+
{
|
|
496
|
+
token: "sort",
|
|
497
|
+
category: "directive",
|
|
498
|
+
gantt: ["option"],
|
|
499
|
+
chartTypes: "all"
|
|
500
|
+
},
|
|
131
501
|
// `lane-by <group>`: swimlane axis (view-state). NB not `swimlane` — that's a
|
|
132
502
|
// chart type. Kanban reads it via its own KNOWN_OPTIONS; gantt via the switch.
|
|
133
|
-
{
|
|
503
|
+
{
|
|
504
|
+
token: "lane-by",
|
|
505
|
+
category: "directive",
|
|
506
|
+
gantt: ["option"],
|
|
507
|
+
chartTypes: "all"
|
|
508
|
+
},
|
|
134
509
|
// `no-title`: gantt boolean + map directive (also general, hand-listed).
|
|
135
|
-
{
|
|
510
|
+
{
|
|
511
|
+
token: "no-title",
|
|
512
|
+
category: "directive",
|
|
513
|
+
gantt: ["boolean"],
|
|
514
|
+
map: true,
|
|
515
|
+
chartTypes: "all"
|
|
516
|
+
},
|
|
136
517
|
// `no-legend`: universal (decision #48) — every chart that renders a legend
|
|
137
518
|
// accepts it, and charts without one take it as a harmless no-op. Parsed for
|
|
138
519
|
// most types via GLOBAL_BOOLEANS in utils/parsing; gantt derives its boolean
|
|
139
520
|
// Set from here, and map from `map: true`.
|
|
140
|
-
{
|
|
521
|
+
{
|
|
522
|
+
token: "no-legend",
|
|
523
|
+
category: "directive",
|
|
524
|
+
gantt: ["boolean"],
|
|
525
|
+
map: true,
|
|
526
|
+
chartTypes: "all"
|
|
527
|
+
},
|
|
141
528
|
// `legend-inline`: universal §1.9 boolean (decision #50) — the top-center-
|
|
142
529
|
// legend data charts (bar/line/radar/scatter/function) render the title and
|
|
143
530
|
// legend on one line; every other chart accepts it as a harmless no-op.
|
|
@@ -145,7 +532,8 @@ var DIRECTIVES_REGISTRY = [
|
|
|
145
532
|
token: "legend-inline",
|
|
146
533
|
category: "directive",
|
|
147
534
|
gantt: ["boolean"],
|
|
148
|
-
map: true
|
|
535
|
+
map: true,
|
|
536
|
+
chartTypes: "all"
|
|
149
537
|
},
|
|
150
538
|
// ══════════════════════════════════════════════════════════
|
|
151
539
|
// Highlight-only vocab (no extractable parser Set).
|
|
@@ -155,40 +543,69 @@ var DIRECTIVES_REGISTRY = [
|
|
|
155
543
|
// simply their single declaration site for highlighting. Grouped by chart
|
|
156
544
|
// type. Categories route to the specializer-read sets in keywords.ts.
|
|
157
545
|
// ── Gantt (extras beyond the option/boolean Sets) ────────
|
|
158
|
-
{
|
|
159
|
-
|
|
160
|
-
|
|
546
|
+
{
|
|
547
|
+
token: "era",
|
|
548
|
+
category: "directive",
|
|
549
|
+
chartTypes: [
|
|
550
|
+
"bar",
|
|
551
|
+
"gantt",
|
|
552
|
+
"line",
|
|
553
|
+
"pie",
|
|
554
|
+
"polar-area",
|
|
555
|
+
"radar",
|
|
556
|
+
"timeline"
|
|
557
|
+
]
|
|
558
|
+
},
|
|
559
|
+
{ token: "marker", category: "directive", chartTypes: ["gantt", "timeline"] },
|
|
560
|
+
{ token: "holiday", category: "directive", chartTypes: ["gantt"] },
|
|
161
561
|
// `workweek` is also the canonical weekday-window directive on clock and map
|
|
162
562
|
// clock-cards (decision #48; `days` stays as the legacy alias).
|
|
163
|
-
{
|
|
164
|
-
|
|
563
|
+
{
|
|
564
|
+
token: "workweek",
|
|
565
|
+
category: "directive",
|
|
566
|
+
map: true,
|
|
567
|
+
chartTypes: ["clock", "gantt", "map"]
|
|
568
|
+
},
|
|
569
|
+
{ token: "no-dependencies", category: "directive", chartTypes: ["gantt"] },
|
|
165
570
|
// ── Tech-radar ───────────────────────────────────────────
|
|
166
|
-
{ token: "rings", category: "directive" },
|
|
571
|
+
{ token: "rings", category: "directive", chartTypes: ["tech-radar"] },
|
|
167
572
|
// Blip listing is default-on everywhere (decision #48): `no-blip-legend`
|
|
168
573
|
// suppresses it; `show-blip-legend` stays as the parse-accepted legacy no-op.
|
|
169
|
-
{
|
|
170
|
-
|
|
171
|
-
|
|
574
|
+
{
|
|
575
|
+
token: "no-blip-legend",
|
|
576
|
+
category: "directive",
|
|
577
|
+
chartTypes: ["tech-radar"]
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
token: "show-blip-legend",
|
|
581
|
+
category: "directive",
|
|
582
|
+
chartTypes: ["tech-radar"]
|
|
583
|
+
},
|
|
584
|
+
{ token: "trend", category: "directive", chartTypes: ["tech-radar"] },
|
|
172
585
|
// ── Tags / shared directives ─────────────────────────────
|
|
173
|
-
{ token: "tags", category: "directive" },
|
|
174
|
-
{ token: "import", category: "directive" },
|
|
175
|
-
{
|
|
586
|
+
{ token: "tags", category: "directive", chartTypes: "all" },
|
|
587
|
+
{ token: "import", category: "directive", chartTypes: "all" },
|
|
588
|
+
{
|
|
589
|
+
token: "hide",
|
|
590
|
+
category: "directive",
|
|
591
|
+
chartTypes: ["boxes-and-lines", "kanban", "org"]
|
|
592
|
+
},
|
|
176
593
|
// `focus <name>`: org subtree drill-down (view-state, source-backed) — the
|
|
177
594
|
// export re-roots to that person/team with the ancestor breadcrumb trail.
|
|
178
595
|
// Org reads it via its own KNOWN_OPTIONS; registered here for highlighting.
|
|
179
|
-
{ token: "focus", category: "directive" },
|
|
180
|
-
{ token: "direction", category: "directive" },
|
|
596
|
+
{ token: "focus", category: "directive", chartTypes: ["org"] },
|
|
597
|
+
{ token: "direction", category: "directive", chartTypes: "all" },
|
|
181
598
|
// ── Clock ────────────────────────────────────────────────
|
|
182
599
|
// The board's flat directives — highlight-only (the parser validates them
|
|
183
600
|
// inline, no extractable Set). `no-title` + `direction` are already listed
|
|
184
601
|
// above (shared). Values (analog is a bare flag; color-by's
|
|
185
602
|
// place|work|daylight|time|none) highlight as plain tokens.
|
|
186
|
-
{ token: "analog", category: "directive" },
|
|
187
|
-
{ token: "hours", category: "directive" },
|
|
188
|
-
{ token: "days", category: "directive" },
|
|
189
|
-
{ token: "no-sun", category: "directive" },
|
|
190
|
-
{ token: "time-24", category: "directive" },
|
|
191
|
-
{ token: "color-by", category: "directive" },
|
|
603
|
+
{ token: "analog", category: "directive", chartTypes: ["clock"] },
|
|
604
|
+
{ token: "hours", category: "directive", chartTypes: ["clock"] },
|
|
605
|
+
{ token: "days", category: "directive", chartTypes: ["clock"] },
|
|
606
|
+
{ token: "no-sun", category: "directive", chartTypes: ["clock"] },
|
|
607
|
+
{ token: "time-24", category: "directive", chartTypes: ["clock"] },
|
|
608
|
+
{ token: "color-by", category: "directive", chartTypes: ["clock"] },
|
|
192
609
|
// ── Boxes-and-lines ──────────────────────────────────────
|
|
193
610
|
// `heat <Label> [low] [high]` is the value→colour ramp directive, but `heat`
|
|
194
611
|
// is NOT registered as a directive keyword: it is dual-use with the `heat:`
|
|
@@ -198,72 +615,186 @@ var DIRECTIVES_REGISTRY = [
|
|
|
198
615
|
// as a property in both positions — exactly the treemap `heat` precedent.
|
|
199
616
|
// Box values render by default since decision #48; `show-values` stays as
|
|
200
617
|
// the parse-accepted legacy no-op (suppress with the shared `no-value`).
|
|
201
|
-
{
|
|
618
|
+
{
|
|
619
|
+
token: "show-values",
|
|
620
|
+
category: "directive",
|
|
621
|
+
chartTypes: ["boxes-and-lines"]
|
|
622
|
+
},
|
|
202
623
|
// Treemap's legacy plural spelling of the same suppression (decision #48
|
|
203
624
|
// made the shared singular `no-value` canonical). Registered so a legacy
|
|
204
625
|
// document still highlights it as a directive rather than plain text.
|
|
205
|
-
{ token: "no-values", category: "directive" },
|
|
626
|
+
{ token: "no-values", category: "directive", chartTypes: ["treemap"] },
|
|
206
627
|
// ── Swimlane ─────────────────────────────────────────────
|
|
207
|
-
{ token: "lane", category: "directive" },
|
|
628
|
+
{ token: "lane", category: "directive", chartTypes: ["swimlane"] },
|
|
208
629
|
// ── ER ───────────────────────────────────────────────────
|
|
209
|
-
{ token: "notation", category: "directive" },
|
|
630
|
+
{ token: "notation", category: "directive", chartTypes: ["er"] },
|
|
210
631
|
// ── Class ────────────────────────────────────────────────
|
|
211
|
-
{ token: "extends", category: "directive" },
|
|
212
|
-
{ token: "implements", category: "directive" },
|
|
213
|
-
{ token: "abstract", category: "directive" },
|
|
214
|
-
{ token: "interface", category: "directive" },
|
|
215
|
-
{ token: "enum", category: "directive" },
|
|
632
|
+
{ token: "extends", category: "directive", chartTypes: ["class"] },
|
|
633
|
+
{ token: "implements", category: "directive", chartTypes: ["class"] },
|
|
634
|
+
{ token: "abstract", category: "directive", chartTypes: ["class"] },
|
|
635
|
+
{ token: "interface", category: "directive", chartTypes: ["class"] },
|
|
636
|
+
{ token: "enum", category: "directive", chartTypes: ["class"] },
|
|
216
637
|
// ── C4 ───────────────────────────────────────────────────
|
|
217
|
-
{ token: "containers", category: "directive" },
|
|
218
|
-
{ token: "components", category: "directive" },
|
|
219
|
-
{ token: "deployment", category: "directive" },
|
|
220
|
-
{ token: "technology", category: "directive" },
|
|
638
|
+
{ token: "containers", category: "directive", chartTypes: ["c4"] },
|
|
639
|
+
{ token: "components", category: "directive", chartTypes: ["c4"] },
|
|
640
|
+
{ token: "deployment", category: "directive", chartTypes: ["c4"] },
|
|
641
|
+
{ token: "technology", category: "directive", chartTypes: ["c4"] },
|
|
221
642
|
// ── Infra (directives beyond the option/behavior Sets) ───
|
|
222
|
-
{ token: "sub-node-label", category: "directive" },
|
|
223
|
-
{ token: "show-sub-node-count", category: "directive" },
|
|
224
|
-
{ token: "animate", category: "directive" },
|
|
643
|
+
{ token: "sub-node-label", category: "directive", chartTypes: ["org"] },
|
|
644
|
+
{ token: "show-sub-node-count", category: "directive", chartTypes: ["org"] },
|
|
645
|
+
{ token: "animate", category: "directive", chartTypes: ["infra"] },
|
|
225
646
|
// ── Sequence ─────────────────────────────────────────────
|
|
226
|
-
{ token: "activations", category: "directive" },
|
|
227
|
-
{ token: "no-activations", category: "directive" },
|
|
228
|
-
{ token: "autonumber", category: "directive" },
|
|
647
|
+
{ token: "activations", category: "directive", chartTypes: ["sequence"] },
|
|
648
|
+
{ token: "no-activations", category: "directive", chartTypes: ["sequence"] },
|
|
649
|
+
{ token: "autonumber", category: "directive", chartTypes: ["sequence"] },
|
|
229
650
|
// ── Map element leaders (not in DIRECTIVE_SET) ───────────
|
|
230
|
-
{ token: "poi", category: "directive" },
|
|
231
|
-
{ token: "route", category: "directive" },
|
|
651
|
+
{ token: "poi", category: "directive", chartTypes: ["map"] },
|
|
652
|
+
{ token: "route", category: "directive", chartTypes: ["map"] },
|
|
232
653
|
// ── Data charts ──────────────────────────────────────────
|
|
233
|
-
{ token: "stacked", category: "directive" },
|
|
234
|
-
{
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
{
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
654
|
+
{ token: "stacked", category: "directive", chartTypes: "all" },
|
|
655
|
+
{
|
|
656
|
+
token: "no-name",
|
|
657
|
+
category: "directive",
|
|
658
|
+
chartTypes: ["funnel", "pie", "polar-area", "scatter"]
|
|
659
|
+
},
|
|
660
|
+
{
|
|
661
|
+
token: "no-value",
|
|
662
|
+
category: "directive",
|
|
663
|
+
chartTypes: [
|
|
664
|
+
"bar",
|
|
665
|
+
"boxes-and-lines",
|
|
666
|
+
"funnel",
|
|
667
|
+
"goal",
|
|
668
|
+
"heatmap",
|
|
669
|
+
"line",
|
|
670
|
+
"pie",
|
|
671
|
+
"polar-area",
|
|
672
|
+
"radar",
|
|
673
|
+
"treemap"
|
|
674
|
+
]
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
token: "no-percent",
|
|
678
|
+
category: "directive",
|
|
679
|
+
chartTypes: ["funnel", "goal", "pie", "polar-area", "treemap"]
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
token: "series",
|
|
683
|
+
category: "directive",
|
|
684
|
+
chartTypes: [
|
|
685
|
+
"bar",
|
|
686
|
+
"function",
|
|
687
|
+
"funnel",
|
|
688
|
+
"heatmap",
|
|
689
|
+
"line",
|
|
690
|
+
"pie",
|
|
691
|
+
"polar-area",
|
|
692
|
+
"radar",
|
|
693
|
+
"sankey",
|
|
694
|
+
"scatter"
|
|
695
|
+
]
|
|
696
|
+
},
|
|
697
|
+
{ token: "orientation", category: "directive", chartTypes: "all" },
|
|
698
|
+
{
|
|
699
|
+
token: "x-label",
|
|
700
|
+
category: "directive",
|
|
701
|
+
chartTypes: ["bar", "function", "line", "quadrant", "scatter"]
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
token: "y-label",
|
|
705
|
+
category: "directive",
|
|
706
|
+
chartTypes: ["bar", "function", "line", "quadrant", "scatter"]
|
|
707
|
+
},
|
|
708
|
+
{ token: "size-label", category: "directive", chartTypes: ["scatter"] },
|
|
709
|
+
{ token: "columns", category: "directive", chartTypes: ["block", "heatmap"] },
|
|
710
|
+
{ token: "rows", category: "directive", chartTypes: "all" },
|
|
711
|
+
{ token: "labels", category: "directive", chartTypes: "all" },
|
|
712
|
+
{ token: "rotate", category: "directive", chartTypes: ["wordcloud"] },
|
|
713
|
+
{ token: "scale", category: "directive", chartTypes: "all" },
|
|
714
|
+
{
|
|
715
|
+
token: "values",
|
|
716
|
+
category: "directive",
|
|
717
|
+
chartTypes: ["pert", "tech-radar"]
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
token: "orientation-horizontal",
|
|
721
|
+
category: "directive",
|
|
722
|
+
chartTypes: ["bar"]
|
|
723
|
+
},
|
|
249
724
|
// ── Slope ────────────────────────────────────────────────
|
|
250
|
-
{ token: "period", category: "directive" },
|
|
725
|
+
{ token: "period", category: "directive", chartTypes: "all" },
|
|
251
726
|
// ── Quadrant ─────────────────────────────────────────────
|
|
252
|
-
{ token: "x-axis", category: "directive" },
|
|
253
|
-
{ token: "y-axis", category: "directive" },
|
|
254
|
-
{
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
727
|
+
{ token: "x-axis", category: "directive", chartTypes: "all" },
|
|
728
|
+
{ token: "y-axis", category: "directive", chartTypes: "all" },
|
|
729
|
+
{
|
|
730
|
+
token: "top-right",
|
|
731
|
+
category: "directive",
|
|
732
|
+
chartTypes: ["quadrant", "tech-radar"]
|
|
733
|
+
},
|
|
734
|
+
{
|
|
735
|
+
token: "top-left",
|
|
736
|
+
category: "directive",
|
|
737
|
+
chartTypes: ["quadrant", "tech-radar"]
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
token: "bottom-right",
|
|
741
|
+
category: "directive",
|
|
742
|
+
chartTypes: ["quadrant", "tech-radar"]
|
|
743
|
+
},
|
|
744
|
+
{
|
|
745
|
+
token: "bottom-left",
|
|
746
|
+
category: "directive",
|
|
747
|
+
chartTypes: ["quadrant", "tech-radar"]
|
|
748
|
+
},
|
|
258
749
|
// ── Layout (cross-chart) ─────────────────────────────────
|
|
259
|
-
{
|
|
260
|
-
|
|
261
|
-
|
|
750
|
+
{
|
|
751
|
+
token: "direction-tb",
|
|
752
|
+
category: "directive",
|
|
753
|
+
chartTypes: [
|
|
754
|
+
"boxes-and-lines",
|
|
755
|
+
"c4",
|
|
756
|
+
"clock",
|
|
757
|
+
"flowchart",
|
|
758
|
+
"infra",
|
|
759
|
+
"org",
|
|
760
|
+
"pert",
|
|
761
|
+
"sitemap",
|
|
762
|
+
"state",
|
|
763
|
+
"swimlane",
|
|
764
|
+
"version-control"
|
|
765
|
+
]
|
|
766
|
+
},
|
|
767
|
+
{
|
|
768
|
+
token: "direction-lr",
|
|
769
|
+
category: "directive",
|
|
770
|
+
chartTypes: [
|
|
771
|
+
"boxes-and-lines",
|
|
772
|
+
"c4",
|
|
773
|
+
"clock",
|
|
774
|
+
"flowchart",
|
|
775
|
+
"infra",
|
|
776
|
+
"org",
|
|
777
|
+
"pert",
|
|
778
|
+
"sitemap",
|
|
779
|
+
"state",
|
|
780
|
+
"swimlane",
|
|
781
|
+
"version-control"
|
|
782
|
+
]
|
|
783
|
+
},
|
|
784
|
+
{ token: "orientation-vertical", category: "directive", chartTypes: "all" },
|
|
262
785
|
// ── Pyramid ──────────────────────────────────────────────
|
|
263
|
-
{ token: "inverted", category: "directive" },
|
|
786
|
+
{ token: "inverted", category: "directive", chartTypes: ["pyramid"] },
|
|
264
787
|
// ── Color / notes (cross-chart) ──────────────────────────
|
|
265
|
-
{
|
|
266
|
-
|
|
788
|
+
{
|
|
789
|
+
token: "color",
|
|
790
|
+
category: "directive",
|
|
791
|
+
chartTypes: "all"
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
token: "no-notes",
|
|
795
|
+
category: "directive",
|
|
796
|
+
chartTypes: ["flowchart", "goal", "state", "whiteboard"]
|
|
797
|
+
},
|
|
267
798
|
// ── Emphasis family (§1.11, decision #49) ────────────────
|
|
268
799
|
// `highlight <Name>…` / `dim <Name>…` — the figure/ground axis, orthogonal
|
|
269
800
|
// to color (§1.5) and to the chart-wide `fill-*` family (§1.9). Both are
|
|
@@ -276,122 +807,180 @@ var DIRECTIVES_REGISTRY = [
|
|
|
276
807
|
// tokens are registered together so the whole family lights up at once.
|
|
277
808
|
//
|
|
278
809
|
// Supported on `sankey` and `family` today; every further chart type is a
|
|
279
|
-
// separate decision
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
810
|
+
// separate decision, made by adding it to `chartTypes` below (#1734).
|
|
811
|
+
{
|
|
812
|
+
token: "highlight",
|
|
813
|
+
category: "directive",
|
|
814
|
+
chartTypes: ["family", "sankey"]
|
|
815
|
+
},
|
|
816
|
+
{ token: "dim", category: "directive", chartTypes: ["family", "sankey"] },
|
|
284
817
|
// ── RACI ─────────────────────────────────────────────────
|
|
285
|
-
{ token: "roles", category: "directive" },
|
|
818
|
+
{ token: "roles", category: "directive", chartTypes: ["raci"] },
|
|
286
819
|
// ── Cycle ────────────────────────────────────────────────
|
|
287
|
-
{
|
|
288
|
-
|
|
820
|
+
{
|
|
821
|
+
token: "direction-counterclockwise",
|
|
822
|
+
category: "directive",
|
|
823
|
+
chartTypes: ["cycle"]
|
|
824
|
+
},
|
|
825
|
+
{ token: "circle-nodes", category: "directive", chartTypes: ["cycle"] },
|
|
289
826
|
// ── Journey-map ──────────────────────────────────────────
|
|
290
|
-
{ token: "persona", category: "directive" },
|
|
827
|
+
{ token: "persona", category: "directive", chartTypes: ["journey-map"] },
|
|
291
828
|
// ── Function ─────────────────────────────────────────────
|
|
292
|
-
{ token: "x", category: "directive" },
|
|
293
|
-
{
|
|
829
|
+
{ token: "x", category: "directive", chartTypes: ["function"] },
|
|
830
|
+
{
|
|
831
|
+
token: "fill",
|
|
832
|
+
category: "directive",
|
|
833
|
+
chartTypes: ["function", "line", "whiteboard"]
|
|
834
|
+
},
|
|
294
835
|
// ── Wordcloud ────────────────────────────────────────────
|
|
295
|
-
{ token: "max", category: "directive" },
|
|
296
|
-
{
|
|
836
|
+
{ token: "max", category: "directive", chartTypes: ["wordcloud"] },
|
|
837
|
+
{
|
|
838
|
+
token: "size",
|
|
839
|
+
category: "directive",
|
|
840
|
+
chartTypes: ["whiteboard", "wordcloud"]
|
|
841
|
+
},
|
|
297
842
|
// ── Arc ──────────────────────────────────────────────────
|
|
298
|
-
{ token: "order", category: "directive" },
|
|
843
|
+
{ token: "order", category: "directive", chartTypes: ["arc"] },
|
|
299
844
|
// ── PERT ─────────────────────────────────────────────────
|
|
300
|
-
{ token: "time-unit", category: "directive" },
|
|
301
|
-
{ token: "default-confidence", category: "directive" },
|
|
302
|
-
{ token: "node-detail", category: "directive" },
|
|
303
|
-
{ token: "trials", category: "directive" },
|
|
304
|
-
{ token: "seed", category: "directive" },
|
|
305
|
-
{ token: "scrubber-trials", category: "directive" },
|
|
845
|
+
{ token: "time-unit", category: "directive", chartTypes: ["pert"] },
|
|
846
|
+
{ token: "default-confidence", category: "directive", chartTypes: ["pert"] },
|
|
847
|
+
{ token: "node-detail", category: "directive", chartTypes: ["pert"] },
|
|
848
|
+
{ token: "trials", category: "directive", chartTypes: ["pert"] },
|
|
849
|
+
{ token: "seed", category: "directive", chartTypes: ["bracket", "pert"] },
|
|
850
|
+
{ token: "scrubber-trials", category: "directive", chartTypes: ["pert"] },
|
|
306
851
|
// `start-date` is also gantt's canonical project-start option (decision #48;
|
|
307
852
|
// bare `start` above stays as the legacy alias).
|
|
308
|
-
{
|
|
309
|
-
|
|
853
|
+
{
|
|
854
|
+
token: "start-date",
|
|
855
|
+
category: "directive",
|
|
856
|
+
gantt: ["option"],
|
|
857
|
+
chartTypes: ["gantt", "pert"]
|
|
858
|
+
},
|
|
859
|
+
{ token: "end-date", category: "directive", chartTypes: ["pert"] },
|
|
310
860
|
// ── Goal ─────────────────────────────────────────────────
|
|
311
861
|
// Mode flags, value-key leaders, and opt-outs. `now`/`target` collide with
|
|
312
862
|
// label prose ("start now", "on target"), but the arrow-label demotion pass
|
|
313
863
|
// (see highlight-api LABEL_WORD_NODES) treats any keyword-bearing label as
|
|
314
864
|
// text and demotes them, so they highlight only as line leaders.
|
|
315
|
-
{ token: "thermometer", category: "directive" },
|
|
316
|
-
{ token: "gauge", category: "directive" },
|
|
317
|
-
{
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
865
|
+
{ token: "thermometer", category: "directive", chartTypes: ["goal"] },
|
|
866
|
+
{ token: "gauge", category: "directive", chartTypes: ["goal"] },
|
|
867
|
+
{
|
|
868
|
+
token: "now",
|
|
869
|
+
category: "directive",
|
|
870
|
+
chartTypes: ["event-line", "goal", "pert"]
|
|
871
|
+
},
|
|
872
|
+
{ token: "target", category: "directive", chartTypes: ["countdown", "goal"] },
|
|
873
|
+
{ token: "no-note", category: "directive", chartTypes: ["goal"] },
|
|
874
|
+
{ token: "no-auto-color", category: "directive", chartTypes: ["goal"] },
|
|
321
875
|
// ── Control-flow + wireframe element keywords (CONTROL) ──
|
|
322
|
-
{ token: "if", category: "control" },
|
|
323
|
-
{ token: "else", category: "control" },
|
|
324
|
-
{ token: "loop", category: "control" },
|
|
325
|
-
{ token: "parallel", category: "control" },
|
|
326
|
-
{
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
876
|
+
{ token: "if", category: "control", chartTypes: ["sequence"] },
|
|
877
|
+
{ token: "else", category: "control", chartTypes: ["sequence"] },
|
|
878
|
+
{ token: "loop", category: "control", chartTypes: ["sequence"] },
|
|
879
|
+
{ token: "parallel", category: "control", chartTypes: ["gantt", "sequence"] },
|
|
880
|
+
{
|
|
881
|
+
token: "note",
|
|
882
|
+
category: "control",
|
|
883
|
+
chartTypes: [
|
|
884
|
+
"boxes-and-lines",
|
|
885
|
+
"class",
|
|
886
|
+
"countdown",
|
|
887
|
+
"er",
|
|
888
|
+
"flowchart",
|
|
889
|
+
"goal",
|
|
890
|
+
"sequence",
|
|
891
|
+
"state",
|
|
892
|
+
"swimlane",
|
|
893
|
+
"version-control",
|
|
894
|
+
"whiteboard"
|
|
895
|
+
]
|
|
896
|
+
},
|
|
897
|
+
{ token: "nav", category: "control", chartTypes: ["wireframe"] },
|
|
898
|
+
{ token: "tabs", category: "control", chartTypes: ["wireframe"] },
|
|
899
|
+
{ token: "table", category: "control", chartTypes: ["wireframe"] },
|
|
900
|
+
{
|
|
901
|
+
token: "image",
|
|
902
|
+
category: "control",
|
|
903
|
+
chartTypes: ["whiteboard", "wireframe"]
|
|
904
|
+
},
|
|
905
|
+
{ token: "modal", category: "control", chartTypes: ["wireframe"] },
|
|
906
|
+
{ token: "skeleton", category: "control", chartTypes: ["wireframe"] },
|
|
907
|
+
{ token: "alert", category: "control", chartTypes: ["wireframe"] },
|
|
908
|
+
{
|
|
909
|
+
token: "progress",
|
|
910
|
+
category: "control",
|
|
911
|
+
chartTypes: ["gantt", "wireframe"]
|
|
912
|
+
},
|
|
913
|
+
{ token: "mobile", category: "control", chartTypes: ["wireframe"] },
|
|
336
914
|
// Whiteboard element leaders (§39). `image` is shared with wireframe above
|
|
337
915
|
// and `text` stays an ER modifier; `database` / `queue` are left plain
|
|
338
916
|
// because sequence uses them as values, not line leaders.
|
|
339
|
-
{ token: "rectangle", category: "control" },
|
|
340
|
-
{ token: "ellipse", category: "control" },
|
|
341
|
-
{ token: "arrow", category: "control" },
|
|
342
|
-
{ token: "ink", category: "control" },
|
|
917
|
+
{ token: "rectangle", category: "control", chartTypes: ["whiteboard"] },
|
|
918
|
+
{ token: "ellipse", category: "control", chartTypes: ["whiteboard"] },
|
|
919
|
+
{ token: "arrow", category: "control", chartTypes: ["whiteboard"] },
|
|
920
|
+
{ token: "ink", category: "control", chartTypes: ["whiteboard"] },
|
|
921
|
+
// ── SWOT section keywords (CONTROL) ──────────────────────
|
|
922
|
+
{ token: "strengths", category: "control", chartTypes: ["swot"] },
|
|
923
|
+
{ token: "weaknesses", category: "control", chartTypes: ["swot"] },
|
|
924
|
+
{ token: "opportunities", category: "control", chartTypes: ["swot"] },
|
|
925
|
+
{ token: "threats", category: "control", chartTypes: ["swot"] },
|
|
926
|
+
{ token: "no-axes", category: "directive", chartTypes: ["swot"] },
|
|
927
|
+
{ token: "no-tint-items", category: "directive", chartTypes: ["swot"] },
|
|
343
928
|
// ── Kanban status keywords (STATUS) ──────────────────────
|
|
344
|
-
{ token: "na", category: "status" },
|
|
345
|
-
{ token: "todo", category: "status" },
|
|
346
|
-
{ token: "wip", category: "status" },
|
|
347
|
-
{ token: "done", category: "status" },
|
|
348
|
-
{ token: "blocked", category: "status" },
|
|
349
|
-
{ token: "in-progress", category: "status" },
|
|
350
|
-
{ token: "backlog", category: "status" },
|
|
351
|
-
{ token: "ready", category: "status" },
|
|
929
|
+
{ token: "na", category: "status", chartTypes: ["kanban"] },
|
|
930
|
+
{ token: "todo", category: "status", chartTypes: ["kanban"] },
|
|
931
|
+
{ token: "wip", category: "status", chartTypes: ["kanban"] },
|
|
932
|
+
{ token: "done", category: "status", chartTypes: ["kanban"] },
|
|
933
|
+
{ token: "blocked", category: "status", chartTypes: ["kanban"] },
|
|
934
|
+
{ token: "in-progress", category: "status", chartTypes: ["kanban"] },
|
|
935
|
+
{ token: "backlog", category: "status", chartTypes: ["kanban"] },
|
|
936
|
+
{ token: "ready", category: "status", chartTypes: ["kanban"] },
|
|
352
937
|
// ── Modifiers + ER column types/modifiers (MODIFIER) ─────
|
|
353
938
|
// `collapsed` is the bare trailing group-line flag made canonical by
|
|
354
939
|
// decision #48 (`[Fulfillment] collapsed`). It is deliberately a bare
|
|
355
940
|
// MODIFIER rather than a colon key: the legacy `collapsed: true` form still
|
|
356
941
|
// parses and still highlights (as `modifier` instead of `propertyName`),
|
|
357
942
|
// whereas leaving it colon-only left the canonical bare form as plain text.
|
|
358
|
-
{ token: "collapsed", category: "modifier" },
|
|
359
|
-
{ token: "as", category: "modifier" },
|
|
360
|
-
{ token: "alias", category: "modifier" },
|
|
361
|
-
{ token: "aka", category: "modifier" },
|
|
362
|
-
{ token: "position", category: "modifier" },
|
|
363
|
-
{ token: "default", category: "modifier" },
|
|
364
|
-
{ token: "pk", category: "modifier" },
|
|
365
|
-
{ token: "fk", category: "modifier" },
|
|
366
|
-
{ token: "nullable", category: "modifier" },
|
|
367
|
-
{ token: "unique", category: "modifier" },
|
|
368
|
-
{ token: "int", category: "modifier" },
|
|
369
|
-
{ token: "varchar", category: "modifier" },
|
|
370
|
-
{
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
{ token: "
|
|
943
|
+
{ token: "collapsed", category: "modifier", chartTypes: "all" },
|
|
944
|
+
{ token: "as", category: "modifier", chartTypes: "all" },
|
|
945
|
+
{ token: "alias", category: "modifier", chartTypes: "all" },
|
|
946
|
+
{ token: "aka", category: "modifier", chartTypes: "all" },
|
|
947
|
+
{ token: "position", category: "modifier", chartTypes: "all" },
|
|
948
|
+
{ token: "default", category: "modifier", chartTypes: "all" },
|
|
949
|
+
{ token: "pk", category: "modifier", chartTypes: ["er"] },
|
|
950
|
+
{ token: "fk", category: "modifier", chartTypes: ["er"] },
|
|
951
|
+
{ token: "nullable", category: "modifier", chartTypes: ["er"] },
|
|
952
|
+
{ token: "unique", category: "modifier", chartTypes: ["er"] },
|
|
953
|
+
{ token: "int", category: "modifier", chartTypes: ["class", "er"] },
|
|
954
|
+
{ token: "varchar", category: "modifier", chartTypes: ["class", "er"] },
|
|
955
|
+
{
|
|
956
|
+
token: "text",
|
|
957
|
+
category: "modifier",
|
|
958
|
+
chartTypes: ["class", "er", "whiteboard"]
|
|
959
|
+
},
|
|
960
|
+
{ token: "boolean", category: "modifier", chartTypes: ["class", "er"] },
|
|
961
|
+
{ token: "date", category: "modifier", chartTypes: ["class", "er"] },
|
|
962
|
+
{ token: "timestamp", category: "modifier", chartTypes: ["class", "er"] },
|
|
963
|
+
{ token: "float", category: "modifier", chartTypes: ["class", "er"] },
|
|
964
|
+
{ token: "decimal", category: "modifier", chartTypes: ["class", "er"] },
|
|
376
965
|
// ── Bracket ──────────────────────────────────────────────
|
|
377
966
|
// `beats` / `vs` are the infix match keywords; the rest are line directives.
|
|
378
967
|
// (`seed` and `no-legend` already appear above — shared, not re-listed.)
|
|
379
|
-
{ token: "beats", category: "control" },
|
|
380
|
-
{ token: "vs", category: "control" },
|
|
381
|
-
{ token: "rounds", category: "directive" },
|
|
382
|
-
{ token: "accent", category: "directive" },
|
|
383
|
-
{ token: "no-round", category: "modifier" },
|
|
384
|
-
{ token: "no-rounds", category: "modifier" },
|
|
385
|
-
{ token: "single-elim", category: "modifier" },
|
|
386
|
-
{ token: "double-elim", category: "modifier" },
|
|
387
|
-
{ token: "seeded", category: "modifier" },
|
|
968
|
+
{ token: "beats", category: "control", chartTypes: ["bracket"] },
|
|
969
|
+
{ token: "vs", category: "control", chartTypes: ["bracket"] },
|
|
970
|
+
{ token: "rounds", category: "directive", chartTypes: ["bracket"] },
|
|
971
|
+
{ token: "accent", category: "directive", chartTypes: "all" },
|
|
972
|
+
{ token: "no-round", category: "modifier", chartTypes: ["bracket"] },
|
|
973
|
+
{ token: "no-rounds", category: "modifier", chartTypes: ["bracket"] },
|
|
974
|
+
{ token: "single-elim", category: "modifier", chartTypes: ["bracket"] },
|
|
975
|
+
{ token: "double-elim", category: "modifier", chartTypes: ["bracket"] },
|
|
976
|
+
{ token: "seeded", category: "modifier", chartTypes: ["bracket"] },
|
|
388
977
|
// ── Live link (§38) ──────────────────────────────────────
|
|
389
978
|
// The pointer type's one directive. Registered so it highlights and
|
|
390
979
|
// autocompletes like `palette` does — §38 justifies the shape by calling it
|
|
391
980
|
// "the ordinary DGMO directive shape", and an unregistered `url` would make
|
|
392
981
|
// that sentence false in the editor: `editor/tokens.ts` specializes only
|
|
393
982
|
// against the keyword registries, so it would render as plain identifier text.
|
|
394
|
-
{ token: "url", category: "directive" }
|
|
983
|
+
{ token: "url", category: "directive", chartTypes: ["live-link"] }
|
|
395
984
|
];
|
|
396
985
|
function tokensWhere(pred) {
|
|
397
986
|
const out = /* @__PURE__ */ new Set();
|
|
@@ -427,6 +1016,21 @@ var REGISTRY_STATUS_TOKENS = tokensWhere(
|
|
|
427
1016
|
var REGISTRY_MODIFIER_TOKENS = tokensWhere(
|
|
428
1017
|
(e) => e.category === "modifier" && !e.colonKey && !e.noHighlight
|
|
429
1018
|
);
|
|
1019
|
+
var REGISTRY_TOKEN_CHART_TYPES = (() => {
|
|
1020
|
+
const out = /* @__PURE__ */ new Map();
|
|
1021
|
+
for (const e of DIRECTIVES_REGISTRY) {
|
|
1022
|
+
const prev = out.get(e.token);
|
|
1023
|
+
if (prev === "all") continue;
|
|
1024
|
+
if (e.chartTypes === "all") {
|
|
1025
|
+
out.set(e.token, "all");
|
|
1026
|
+
continue;
|
|
1027
|
+
}
|
|
1028
|
+
const set = prev ?? /* @__PURE__ */ new Set();
|
|
1029
|
+
for (const t of e.chartTypes) set.add(t);
|
|
1030
|
+
out.set(e.token, set);
|
|
1031
|
+
}
|
|
1032
|
+
return out;
|
|
1033
|
+
})();
|
|
430
1034
|
var REGISTRY_COLON_KEY_TOKENS = tokensWhere((e) => !!e.colonKey);
|
|
431
1035
|
var REGISTRY_NON_HIGHLIGHT_TOKENS = tokensWhere(
|
|
432
1036
|
(e) => !!e.noHighlight
|
|
@@ -514,6 +1118,10 @@ var chartTypesData = [
|
|
|
514
1118
|
id: "kanban",
|
|
515
1119
|
description: "Task board columns"
|
|
516
1120
|
},
|
|
1121
|
+
{
|
|
1122
|
+
id: "swot",
|
|
1123
|
+
description: "SWOT analysis: strengths, weaknesses, opportunities and threats in four fixed panels on helpful/harmful and internal/external axes"
|
|
1124
|
+
},
|
|
517
1125
|
{
|
|
518
1126
|
id: "raci",
|
|
519
1127
|
description: "Tasks \xD7 roles responsibility matrix with constraint linting"
|
|
@@ -672,8 +1280,66 @@ var STATUS_KEYWORDS = /* @__PURE__ */ new Set([...REGISTRY_STATUS_TOKENS]);
|
|
|
672
1280
|
var MODIFIER_KEYWORDS = /* @__PURE__ */ new Set([...REGISTRY_MODIFIER_TOKENS]);
|
|
673
1281
|
|
|
674
1282
|
// src/editor/tokens.ts
|
|
675
|
-
|
|
1283
|
+
var PENDING = 0;
|
|
1284
|
+
var UNKNOWN = -1;
|
|
1285
|
+
var CHART_TYPE_INDEX = new Map(
|
|
1286
|
+
CHART_TYPE_IDS.map((id, i) => [id, i + 1])
|
|
1287
|
+
);
|
|
1288
|
+
function readToken(input, length) {
|
|
1289
|
+
let s = "";
|
|
1290
|
+
for (let i = 0; i < length; i++) s += String.fromCharCode(input.peek(i));
|
|
1291
|
+
return s;
|
|
1292
|
+
}
|
|
1293
|
+
function decide(term, text) {
|
|
1294
|
+
if (term !== ChartType) return UNKNOWN;
|
|
1295
|
+
return CHART_TYPE_INDEX.get(text()) ?? UNKNOWN;
|
|
1296
|
+
}
|
|
1297
|
+
var chartTypeContext = new ContextTracker({
|
|
1298
|
+
start: PENDING,
|
|
1299
|
+
shift(context, term, stack, input) {
|
|
1300
|
+
if (context !== PENDING) return context;
|
|
1301
|
+
if (term >= stack.parser.nodeSet.types.length || term === Comment)
|
|
1302
|
+
return context;
|
|
1303
|
+
return decide(term, () => readToken(input, stack.pos - input.pos));
|
|
1304
|
+
},
|
|
1305
|
+
// A node reused from an earlier parse is not shifted token by token, so a
|
|
1306
|
+
// reused first line has to decide the context here, from its first leaf.
|
|
1307
|
+
// Not observed (2026-11-06, @lezer/lr 1.4.10: the first line sat in a
|
|
1308
|
+
// re-parsed buffer in every probe), but nothing in Lezer promises that.
|
|
1309
|
+
reuse(context, node, _stack, input) {
|
|
1310
|
+
if (context !== PENDING) return context;
|
|
1311
|
+
const cursor = node.cursor();
|
|
1312
|
+
for (; ; ) {
|
|
1313
|
+
if (cursor.firstChild()) continue;
|
|
1314
|
+
const { from, to } = cursor;
|
|
1315
|
+
const id = cursor.type.id;
|
|
1316
|
+
if (id !== Comment && to > from) {
|
|
1317
|
+
return decide(id, () => {
|
|
1318
|
+
let s = "";
|
|
1319
|
+
for (let i = from; i < to; i++)
|
|
1320
|
+
s += String.fromCharCode(input.peek(i));
|
|
1321
|
+
return s;
|
|
1322
|
+
});
|
|
1323
|
+
}
|
|
1324
|
+
if (!advance(cursor)) return context;
|
|
1325
|
+
}
|
|
1326
|
+
},
|
|
1327
|
+
hash: (context) => context
|
|
1328
|
+
});
|
|
1329
|
+
function advance(cursor) {
|
|
1330
|
+
while (!cursor.nextSibling()) if (!cursor.parent()) return false;
|
|
1331
|
+
return true;
|
|
1332
|
+
}
|
|
1333
|
+
function inScope(value, context) {
|
|
1334
|
+
if (context <= PENDING) return true;
|
|
1335
|
+
const scope = REGISTRY_TOKEN_CHART_TYPES.get(value);
|
|
1336
|
+
if (scope === void 0 || scope === "all") return true;
|
|
1337
|
+
return scope.has(CHART_TYPE_IDS[context - 1]);
|
|
1338
|
+
}
|
|
1339
|
+
function specializeKeyword(value, stack) {
|
|
676
1340
|
if (CHART_TYPES.has(value)) return ChartType;
|
|
1341
|
+
if (!inScope(value, stack?.context ?? UNKNOWN))
|
|
1342
|
+
return -1;
|
|
677
1343
|
if (value === TAG_KEYWORD) return TagKeyword;
|
|
678
1344
|
if (DIRECTIVE_KEYWORDS.has(value)) return DirectiveKeyword;
|
|
679
1345
|
if (CONTROL_KEYWORDS.has(value)) return ControlKeyword;
|
|
@@ -690,6 +1356,7 @@ var parser = LRParser.deserialize({
|
|
|
690
1356
|
goto: "!byPPPPPPPPzPPPPPPPPPPPPPPPPPPPPPPPPP!O!UPPPP!]TSOTQTORWTSROTRURVQORT",
|
|
691
1357
|
nodeNames: "\u26A0 ChartType TagKeyword DirectiveKeyword ControlKeyword ModifierKeyword Document Comment ContentLine SyncArrow AsyncArrow Duration DateLiteral Percentage Number SectionMarker Url OpenBracket CloseBracket OpenParen CloseParen OpenAngle CloseAngle Pipe Colon Comma Plus Dash Tilde Star Question QuotedString Identifier Punct",
|
|
692
1358
|
maxTerm: 40,
|
|
1359
|
+
context: chartTypeContext,
|
|
693
1360
|
skippedNodes: [0],
|
|
694
1361
|
repeatNodeCount: 2,
|
|
695
1362
|
tokenData: ">w~RzOX#uXY#zYZ$VZp#upq#zqr#urs$[st#uux#uxy%eyz%lz{%s{|%z|}&R}!O&Y!O!P#u!P!Q&i!Q!['Y![!]1|!]!^#u!^!_2T!_!`2[!`!a2i!a!b2p!b!c#u!c!}2w!}#O5}#O#P#u#P#Q6S#Q#R#u#R#S2w#S#T#u#T#[2w#[#]6Z#]#o2w#o#p#u#p#q>Z#q#r#u#r#s>b#s;'S#u;'S;=`>q<%lO#u~#zOq~~$PQv~XY#zpq#z~$[Ow~~$aUq~OY$sZr$srs%Ys;'S$s;'S;=`%_<%lO$s~$vUOY$sZr$srs%Ys;'S$s;'S;=`%_<%lO$s~%_Oo~~%bP;=`<%l$s~%lOc~q~~%sOd~q~~%zOm~q~~&ROj~q~~&YOi~q~~&aPk~q~!`!a&d~&iOX~~&nPq~!P!Q&q~&vSV~OY&qZ;'S&q;'S;=`'S<%lO&q~'VP;=`<%l&q~'a_^~q~uv(`|}(e}!O)b!O!P*l!P!Q,h!Q![-R#R#S1h#U#V+g#W#X+m#[#]+m#a#b+z#e#f+m#g#h,]#k#l+m#m#n+m~(eO]~~(hP!Q![(k~(nP!Q![(q~(tP!Q![(w~(|Q^~|}(e!O!P)S~)VP!Q![)Y~)_P^~!Q![)Y~)eP!Q![)h~)mQ[~}!O)s!Q![*d~)vP!Q![)y~)|P!Q![*P~*UP[~!Q![*X~*[P!Q![*_~*dO[~~*iP[~}!O)s~*oP!Q![*r~*wY^~uv(`!Q![*r#U#V+g#W#X+m#[#]+m#a#b+z#e#f+m#g#h,]#k#l+m#m#n+m~+jP#W#X+m~+rPZ~!a!b+u~+zOZ~~,PQZ~!a!b+u#]#^,V~,YP#b#c+m~,bQZ~!a!b+u#d#e+m~,kP!Q![,n~,sQ[~!P!Q)s!Q![,y~-OP[~!P!Q)s~-W_^~uv(`|}(e}!O)b!O!P*l!P!Q,h!Q![.V#R#S1h#U#V+g#W#X+m#[#]+m#a#b+z#e#f+m#g#h,]#k#l+m#m#n+m~.[]^~uv(`|}(e!O!P*l!Q![/T#R#S1h#U#V+g#W#X+m#[#]+m#a#b+z#e#f+m#g#h,]#k#l+m#m#n+m~/Y]^~uv(`}!O0R!O!P*l!Q![0m#R#S1h#U#V+g#W#X+m#[#]+m#a#b+z#e#f+m#g#h,]#k#l+m#m#n+m~0UP!Q![0X~0[P!Q![0_~0dP[~}!O0g~0jP!Q![*X~0r[^~uv(`!O!P*l!Q![0m#R#S1h#U#V+g#W#X+m#[#]+m#a#b+z#e#f+m#g#h,]#k#l+m#m#n+m~1kP!Q![1n~1sR^~!O!P)S!Q![1n#R#S1h~2TOh~q~~2[Oe~q~~2aPq~!_!`2d~2iO_~~2pOf~q~~2wOn~q~~3O_p~q~qr3}st3}vw3}wx3}{|3}}!O5R!O!P3}!P!Q3}!Q![3}!_!`3}!a!b3}!b!c3}!c!}3}#R#S3}#T#o3}~4S_p~qr3}st3}vw3}wx3}{|3}}!O5R!O!P3}!P!Q3}!Q![3}!_!`3}!a!b3}!b!c3}!c!}3}#R#S3}#T#o3}~5U]qr3}st3}vw3}wx3}{|3}!O!P3}!P!Q3}!_!`3}!a!b3}!b!c3}!c!}3}#R#S3}#T#o3}~6SOa~~6ZOb~q~~6bap~q~qr3}st3}vw3}wx3}{|3}}!O5R!O!P3}!P!Q3}!Q![3}!_!`3}!a!b3}!b!c3}!c!}3}#R#S3}#T#h3}#h#i7g#i#o3}~7lap~qr3}st3}vw3}wx3}{|3}}!O5R!O!P3}!P!Q3}!Q![3}!_!`3}!a!b3}!b!c3}!c!}3}#R#S3}#T#h3}#h#i8q#i#o3}~8vap~qr3}st3}vw3}wx3}{|3}}!O5R!O!P3}!P!Q3}!Q![3}!_!`3}!a!b3}!b!c3}!c!}3}#R#S3}#T#d3}#d#e9{#e#o3}~:Qbp~qr3}st3}vw3}wx3}{|3}}!O5R!O!P3}!P!Q3}!Q![3}![!];Y!_!`3}!a!b3}!b!c3}!c!}3}#R#S3}#T#g3}#g#h=S#h#o3}~;]P!P!Q;`~;cP!P!Q;f~;iYOX<XZp<Xqy<Xz|<X}!`<X!a#P<X#Q#p<X#q;'S<X;'S;=`<|<%lO<X~<^Y`~OX<XZp<Xqy<Xz|<X}!`<X!a#P<X#Q#p<X#q;'S<X;'S;=`<|<%lO<X~=PP;=`<%l<X~=X`p~qr3}st3}vw3}wx3}{|3}}!O5R!O!P3}!P!Q3}!Q![3}![!];Y!_!`3}!a!b3}!b!c3}!c!}3}#R#S3}#T#o3}~>bOg~q~~>iPl~q~!`!a>l~>qOY~~>tP;=`<%l#u",
|