@jackuait/blok 0.10.0-beta.6 → 0.10.0-beta.7
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/codemod/migrate-editorjs-to-blok.js +0 -2
- package/codemod/test.js +0 -6
- package/dist/blok.mjs +2 -2
- package/dist/chunks/_basePickBy-BHRNO12X.mjs +410 -0
- package/dist/chunks/_baseUniq-DtFPDBML.mjs +1045 -0
- package/dist/chunks/_getTag-ozrhqxk_.mjs +26 -0
- package/dist/chunks/arc-BEqJP9HX.mjs +80 -0
- package/dist/chunks/architecture-YZFGNWBL-Bcu-90pi.mjs +3 -0
- package/dist/chunks/architectureDiagram-Q4EWVU46-BMno5LCn.mjs +4066 -0
- package/dist/chunks/array-Cyf-61SV.mjs +6 -0
- package/dist/chunks/blockDiagram-DXYQGD6D-DlP_cPth.mjs +3259 -0
- package/dist/chunks/{blok-BdlR_lX6.mjs → blok-CiLRmoHI.mjs} +850 -855
- package/dist/chunks/c4Diagram-AHTNJAMY-BbVV8EXj.mjs +2956 -0
- package/dist/chunks/channel-DPcniO2B.mjs +5 -0
- package/dist/chunks/chunk-2KRD3SAO-CazES4VS.mjs +20 -0
- package/dist/chunks/chunk-336JU56O-heO72r_k.mjs +49 -0
- package/dist/chunks/chunk-426QAEUC-CmCcml1z.mjs +13 -0
- package/dist/chunks/chunk-4BX2VUAB-B10DxOza.mjs +19 -0
- package/dist/chunks/chunk-4TB4RGXK-B0snhZOU.mjs +3250 -0
- package/dist/chunks/chunk-55IACEB6-CGkn5ABd.mjs +8 -0
- package/dist/chunks/chunk-5FUZZQ4R-USdumo_u.mjs +3786 -0
- package/dist/chunks/chunk-5PVQY5BW-CxUGVzQL.mjs +1692 -0
- package/dist/chunks/chunk-67CJDMHE-Bvw55oRa.mjs +20 -0
- package/dist/chunks/chunk-7N4EOEYR-Bs2qDy88.mjs +29 -0
- package/dist/chunks/chunk-AA7GKIK3-Bss0LgrN.mjs +24 -0
- package/dist/chunks/chunk-BSJP7CBP-CpUW7gi5.mjs +83 -0
- package/dist/chunks/chunk-CIAEETIT-DlRbLLf3.mjs +20 -0
- package/dist/chunks/{chunk-Byubey_H.mjs → chunk-D6kmoKXy.mjs} +5 -5
- package/dist/chunks/chunk-EDXVE4YY-DEcX4XWm.mjs +26 -0
- package/dist/chunks/chunk-ENJZ2VHE-B4THRZkR.mjs +566 -0
- package/dist/chunks/chunk-FMBD7UC4-CF6BKEiV.mjs +5 -0
- package/dist/chunks/chunk-FOC6F5B3--xuza7Yn.mjs +20 -0
- package/dist/chunks/chunk-ICPOFSXX-BMja8cuy.mjs +3290 -0
- package/dist/chunks/chunk-K5T4RW27-CHEqGHFS.mjs +16370 -0
- package/dist/chunks/chunk-KGLVRYIC-DHYYpR8v.mjs +20 -0
- package/dist/chunks/chunk-LIHQZDEY-AvbOvyLE.mjs +55 -0
- package/dist/chunks/chunk-ORNJ4GCN-38fbR5OS.mjs +25 -0
- package/dist/chunks/chunk-OYMX7WX6-BiqlATPA.mjs +2038 -0
- package/dist/chunks/chunk-QZHKN3VN-DitZIvj8.mjs +12 -0
- package/dist/chunks/chunk-U2HBQHQK-DJytnHmZ.mjs +1875 -0
- package/dist/chunks/chunk-X2U36JSP-DlOifw1K.mjs +68 -0
- package/dist/chunks/chunk-XPW4576I-s4fsi4XO.mjs +1146 -0
- package/dist/chunks/chunk-YZCP3GAM-Ch258bXC.mjs +60 -0
- package/dist/chunks/chunk-ZZ45TVLE-DWziaKxP.mjs +33 -0
- package/dist/chunks/classDiagram-6PBFFD2Q-BOkAe08u.mjs +30 -0
- package/dist/chunks/classDiagram-v2-HSJHXN6E-DeKatSvh.mjs +30 -0
- package/dist/chunks/clone-CJCz7VRp.mjs +8 -0
- package/dist/chunks/{constants-Cp8O0UfP.mjs → constants-DFS8l39Y.mjs} +49 -50
- package/dist/chunks/cose-bilkent-S5V4N54A-CzLGVqvr.mjs +2246 -0
- package/dist/chunks/cytoscape.esm-D0iglm-M.mjs +18108 -0
- package/dist/chunks/dagre-KV5264BT-XbHSjleO.mjs +298 -0
- package/dist/chunks/dagre-XY8CZ1sg.mjs +1536 -0
- package/dist/chunks/defaultLocale-DFhS1600.mjs +201 -0
- package/dist/chunks/diagram-5BDNPKRD-CM7c3UTI.mjs +112 -0
- package/dist/chunks/diagram-G4DWMVQ6-Bhg4ps6b.mjs +546 -0
- package/dist/chunks/diagram-MMDJMWI5-C-UCVaxB.mjs +234 -0
- package/dist/chunks/diagram-TYMM5635-BOHSujSD.mjs +144 -0
- package/dist/chunks/dist-DHsXIYdd.mjs +59 -0
- package/dist/chunks/erDiagram-SMLLAGMA-CwKxXFMB.mjs +1712 -0
- package/dist/chunks/flowDiagram-DWJPFMVM-rQJKfyuO.mjs +4175 -0
- package/dist/chunks/ganttDiagram-T4ZO3ILL-DfaZirLX.mjs +3083 -0
- package/dist/chunks/gitGraph-7Q5UKJZL-BKG8cHGz.mjs +3 -0
- package/dist/chunks/gitGraphDiagram-UUTBAWPF-CRa-ymsI.mjs +792 -0
- package/dist/chunks/graphlib-CuDElSdG.mjs +223 -0
- package/dist/chunks/{i18next-loader-oDO9ZKUV.mjs → i18next-loader-CasQQb5s.mjs} +2 -2
- package/dist/chunks/info-OMHHGYJF-FKqYyUn9.mjs +3 -0
- package/dist/chunks/infoDiagram-42DDH7IO-CvyJU2nE.mjs +29 -0
- package/dist/chunks/init-JlKGZtuT.mjs +15 -0
- package/dist/chunks/ishikawaDiagram-UXIWVN3A-CIpbw1BK.mjs +719 -0
- package/dist/chunks/journeyDiagram-VCZTEJTY-H96UcUK9.mjs +885 -0
- package/dist/chunks/kanban-definition-6JOO6SKY-BYZT3srA.mjs +980 -0
- package/dist/chunks/{katex-NjLaA6AJ.mjs → katex-JyOgX6MW.mjs} +1 -1
- package/dist/chunks/{lightweight-i18n-DTySD6f6.mjs → lightweight-i18n-Cvv8CWh4.mjs} +13 -0
- package/dist/chunks/line-B9xUUA7k.mjs +34 -0
- package/dist/chunks/linear-Dj-1yA_B.mjs +289 -0
- package/dist/chunks/mermaid-parser.core-D6OPAUtM.mjs +57 -0
- package/dist/chunks/mermaid.core-BPN9ZHKQ.mjs +989 -0
- package/dist/{messages-B4lhNMKm2.mjs → chunks/messages--YKhFEDE.mjs} +28 -3
- package/dist/chunks/{messages-CF_PfacZ.mjs → messages-0Uwu1AMJ2.mjs} +26 -1
- package/dist/{messages-Bug6Du35.mjs → chunks/messages-1__0Ph4Q.mjs} +26 -1
- package/dist/chunks/{messages-CnQydQJd2.mjs → messages-4sm9Pb0C.mjs} +26 -1
- package/dist/chunks/{messages-BDXl53cy2.mjs → messages-4uxjtzKW.mjs} +26 -1
- package/dist/{messages-DQN1y6E9.mjs → chunks/messages-B-SwLgkQ.mjs} +28 -3
- package/dist/chunks/{messages-BlcRm2I3.mjs → messages-B1ylBxXQ.mjs} +26 -1
- package/dist/{messages-12_eyAo-.mjs → chunks/messages-B5m3dhKc.mjs} +26 -1
- package/dist/chunks/{messages-D8-N0FmU.mjs → messages-B6n2zDtv.mjs} +27 -2
- package/dist/chunks/{messages-BMq9k_lI.mjs → messages-BC9w4zAT.mjs} +26 -1
- package/dist/{messages-CsiGzUSP2.mjs → chunks/messages-BOj-7N3p.mjs} +26 -1
- package/dist/chunks/{messages-CvlMT1e62.mjs → messages-BRYHTS18.mjs} +26 -1
- package/dist/{messages-hrSlVSHp.mjs → chunks/messages-BSBbVjor.mjs} +33 -8
- package/dist/{messages-uCsQjz7M.mjs → chunks/messages-BUUkmUGc.mjs} +26 -1
- package/dist/chunks/{messages-DopbvJlg.mjs → messages-Bb3YEV2P.mjs} +31 -6
- package/dist/{messages-KqWQKmIu2.mjs → chunks/messages-Be_6YLzJ.mjs} +27 -2
- package/dist/chunks/{messages-BXn9Vzbx2.mjs → messages-BevRhv5d.mjs} +26 -1
- package/dist/chunks/{messages-DQ5ng0_t2.mjs → messages-Bhqr7Im2.mjs} +26 -1
- package/dist/{messages-B3Yhiycb2.mjs → chunks/messages-BpJFjSKa.mjs} +27 -2
- package/dist/chunks/{messages-BaoJwsEZ.mjs → messages-BqYlq_Bn.mjs} +26 -1
- package/dist/chunks/{messages-vN4T4r67.mjs → messages-BtAwCUfD.mjs} +26 -1
- package/dist/{messages-Cb3wXGnc.mjs → chunks/messages-Bthbp65G.mjs} +27 -2
- package/dist/{messages-x353UCBI.mjs → chunks/messages-BvHMZ8Pi2.mjs} +26 -1
- package/dist/{messages-BOE2mzCj2.mjs → chunks/messages-Bw1BE9jW.mjs} +26 -1
- package/dist/chunks/{messages-C5aCWL7B.mjs → messages-Bx6Wt285.mjs} +26 -1
- package/dist/{messages-C8f1I5EQ2.mjs → chunks/messages-BzslJRYv.mjs} +27 -2
- package/dist/chunks/{messages-CZ5Sbf8U.mjs → messages-C02M0Tpw.mjs} +26 -1
- package/dist/chunks/{messages-DN-194c32.mjs → messages-C1u3E9qg.mjs} +26 -1
- package/dist/chunks/{messages-DdmWzF5M.mjs → messages-C68WgSKk.mjs} +27 -2
- package/dist/chunks/{messages-Dgng6KN8.mjs → messages-C8w8JCP0.mjs} +28 -3
- package/dist/chunks/{messages-B5fKJXd6.mjs → messages-CFOZdSk4.mjs} +26 -1
- package/dist/chunks/{messages-5ArOv8cj.mjs → messages-CGOY79lr.mjs} +26 -1
- package/dist/{messages-mipkPgwQ2.mjs → chunks/messages-CGaSMZPu.mjs} +26 -1
- package/dist/{messages-Dq_v7slw2.mjs → chunks/messages-CJJgQ0BH.mjs} +26 -1
- package/dist/chunks/{messages-DUGEqDEG.mjs → messages-CTD6rtQj2.mjs} +26 -1
- package/dist/{messages-DIKCwGog.mjs → chunks/messages-CZymJML9.mjs} +30 -5
- package/dist/chunks/{messages-CcyIKgGU.mjs → messages-CfeFJbiv.mjs} +30 -5
- package/dist/chunks/{messages-BXSXk3oS2.mjs → messages-Cgatzu_z.mjs} +28 -3
- package/dist/{messages-CBPiFbEf2.mjs → chunks/messages-Ch2zBI602.mjs} +26 -1
- package/dist/chunks/{messages-yszqJukE.mjs → messages-CiAHsUfO.mjs} +26 -1
- package/dist/chunks/{messages-bmwto4UV.mjs → messages-Cuzq-tNW.mjs} +26 -1
- package/dist/{messages-JK9Okzsy2.mjs → chunks/messages-Cw4qiMwb.mjs} +26 -1
- package/dist/chunks/{messages-DSO2U-ul.mjs → messages-Cyh-mz40.mjs} +26 -1
- package/dist/{messages-DbZsJAff.mjs → chunks/messages-D-I2QO8H.mjs} +26 -1
- package/dist/chunks/{messages-BhcYsC_M2.mjs → messages-D0D2gruy.mjs} +26 -1
- package/dist/{messages-X80Nh0ib.mjs → chunks/messages-D1BKxfLD.mjs} +27 -2
- package/dist/chunks/{messages-CjVPwkVy.mjs → messages-D4eDs6R_.mjs} +26 -1
- package/dist/{messages-C5Uufygq.mjs → chunks/messages-D9Xr-hES.mjs} +26 -1
- package/dist/{messages-DkvQ-6HC2.mjs → chunks/messages-D9eJPHia.mjs} +28 -3
- package/dist/chunks/{messages-DRv4g-IA.mjs → messages-DBFWSzKY2.mjs} +26 -1
- package/dist/chunks/{messages-SSDr5fGF2.mjs → messages-DC0wu2S7.mjs} +26 -1
- package/dist/{messages-Bdk4ocMI.mjs → chunks/messages-DF9o19rG.mjs} +26 -1
- package/dist/chunks/{messages-DVKifYlq.mjs → messages-DFS_n986.mjs} +49 -24
- package/dist/{messages-CvvbLyTy2.mjs → chunks/messages-DGS4H30T.mjs} +26 -1
- package/dist/{messages-PvMdmlxI.mjs → chunks/messages-DKjddpzJ.mjs} +28 -3
- package/dist/chunks/{messages-DGD6BiGd.mjs → messages-DMvTdUXC.mjs} +28 -3
- package/dist/{messages-CD8K1g_t2.mjs → chunks/messages-DQUX-QYI2.mjs} +26 -1
- package/dist/chunks/{messages-CqgEz7C5.mjs → messages-DUigq8FO2.mjs} +26 -1
- package/dist/chunks/{messages-ByAqzAhB.mjs → messages-DY0FJdpH.mjs} +26 -1
- package/dist/{messages-DACg1XAu.mjs → chunks/messages-DfVXiqt-2.mjs} +26 -1
- package/dist/{messages-BYQ769S5.mjs → chunks/messages-DgZc9TJw.mjs} +26 -1
- package/dist/{messages-Dj79y02X.mjs → chunks/messages-QD4BCUDP.mjs} +26 -1
- package/dist/{messages-BeI2HORe2.mjs → chunks/messages-USmweex9.mjs} +26 -1
- package/dist/{messages-CEEzfqMO2.mjs → chunks/messages-a1JTi0Qm.mjs} +29 -4
- package/dist/chunks/{messages-Dz3UhEco2.mjs → messages-jcgCHPRn.mjs} +26 -1
- package/dist/{messages--cUQf9JX.mjs → chunks/messages-tnnqHpbd.mjs} +27 -2
- package/dist/chunks/{messages-DZwCufSb.mjs → messages-vzWKPLJO.mjs} +26 -1
- package/dist/chunks/{micromark-extension-math-CCEGWpdz.mjs → micromark-extension-math-Cz_ZZ_0Y.mjs} +1 -1
- package/dist/chunks/mindmap-definition-QFDTVHPH-BswFuNN6.mjs +1013 -0
- package/dist/chunks/ordinal-D1_lEgAO.mjs +65 -0
- package/dist/chunks/packet-4T2RLAQJ-DTUW2U0C.mjs +3 -0
- package/dist/chunks/path-6nYPAvNb.mjs +85 -0
- package/dist/chunks/pie-ZZUOXDRM-D-umqvEM.mjs +3 -0
- package/dist/chunks/pieDiagram-DEJITSTG-1WJgvK1w.mjs +179 -0
- package/dist/chunks/quadrantDiagram-34T5L4WZ-B_YH8QGl.mjs +1960 -0
- package/dist/chunks/radar-PYXPWWZC-DkQelf08.mjs +3 -0
- package/dist/chunks/requirementDiagram-MS252O5E-DRl0YJRI.mjs +2224 -0
- package/dist/chunks/rough.esm-CSWJruu5.mjs +1353 -0
- package/dist/chunks/sankeyDiagram-XADWPNL6-B-8IrknH.mjs +909 -0
- package/dist/chunks/sequenceDiagram-FGHM5R23-DTLb8qmO.mjs +4181 -0
- package/dist/chunks/src-CRgEHLPW.mjs +2149 -0
- package/dist/chunks/stateDiagram-FHFEXIEX-B0JFjLFy.mjs +218 -0
- package/dist/chunks/stateDiagram-v2-QKLJ7IA2-Co9CUU_z.mjs +28 -0
- package/dist/chunks/timeline-definition-GMOUNBTQ-CS9KTh-Q.mjs +1084 -0
- package/dist/chunks/{tools-DGOsJbHH.mjs → tools-CSYsrnud.mjs} +2116 -1268
- package/dist/chunks/treeView-SZITEDCU-DOOoyNP9.mjs +3 -0
- package/dist/chunks/treemap-W4RFUUIX-CsOoUA-u.mjs +3 -0
- package/dist/chunks/vennDiagram-DHZGUBPP-0BNu5Wna.mjs +1876 -0
- package/dist/chunks/wardley-RL74JXVD-CCzZcmEk.mjs +3 -0
- package/dist/chunks/wardleyDiagram-NUSXRM2D-Ca9XByNH.mjs +594 -0
- package/dist/chunks/xychartDiagram-5P7HB3ND-C8AyKUAE.mjs +2017 -0
- package/dist/cli.mjs +1 -1
- package/dist/full.mjs +3 -3
- package/dist/locales.mjs +80 -67
- package/dist/markdown.mjs +2 -2
- package/dist/{chunks/messages-9l49jauY.mjs → messages-5jvKxQNu2.mjs} +26 -1
- package/dist/{messages-CkySRhtd2.mjs → messages-7QD-X6XT2.mjs} +26 -1
- package/dist/{chunks/messages-Btr121zI2.mjs → messages-96iaAUds2.mjs} +27 -2
- package/dist/{chunks/messages-BAP2OAQk.mjs → messages-B19o-Teb.mjs} +28 -3
- package/dist/{messages-DJU4YLij.mjs → messages-B1ZUQagA.mjs} +26 -1
- package/dist/{messages-Dg2CDXZi2.mjs → messages-B7ieAJBd2.mjs} +26 -1
- package/dist/{messages-CByBLxWk.mjs → messages-BECMxmfX.mjs} +26 -1
- package/dist/{messages-CwCEcbWG.mjs → messages-BIHc0KHY.mjs} +27 -2
- package/dist/{messages-D8WvwU42.mjs → messages-BIoeoik5.mjs} +26 -1
- package/dist/{messages-D38h5XlF.mjs → messages-BJeGJksD.mjs} +26 -1
- package/dist/{messages-Cd23UgLV2.mjs → messages-BRZX964b2.mjs} +27 -2
- package/dist/{chunks/messages-B9N__q552.mjs → messages-BTQPpoM42.mjs} +29 -4
- package/dist/{messages-CUzBNjnc.mjs → messages-BYNcD6uR.mjs} +26 -1
- package/dist/{messages-DjWfVYHS2.mjs → messages-BYmmMDrN2.mjs} +26 -1
- package/dist/{chunks/messages-DkTxBa1V.mjs → messages-BbYq1pk-.mjs} +26 -1
- package/dist/{chunks/messages-BHhbHLoq.mjs → messages-BiUGXvYr2.mjs} +26 -1
- package/dist/{messages-So3SHdIc2.mjs → messages-BiiongNz2.mjs} +26 -1
- package/dist/{chunks/messages-BxBID_0B.mjs → messages-Bm0Feca1.mjs} +30 -5
- package/dist/{messages-C2veeQpU.mjs → messages-BmAn22OX.mjs} +26 -1
- package/dist/{messages-KbYSpNrE.mjs → messages-Bq3F2Tp_.mjs} +26 -1
- package/dist/{chunks/messages-Dux1S0-D2.mjs → messages-BsycN_JI2.mjs} +26 -1
- package/dist/{messages-DRU_IgoW.mjs → messages-BwHs4cm1.mjs} +30 -5
- package/dist/{messages-Cv-DKlZd.mjs → messages-CJTy6JZt.mjs} +26 -1
- package/dist/{chunks/messages-D7n_wJK7.mjs → messages-CR_L_UtK.mjs} +26 -1
- package/dist/{messages-DnhEzmXJ2.mjs → messages-CSUHBs4c2.mjs} +26 -1
- package/dist/{messages-C_HmWyXc2.mjs → messages-CWIXvnDf2.mjs} +26 -1
- package/dist/{messages-KSxF8eib.mjs → messages-CcF4y-E4.mjs} +26 -1
- package/dist/{chunks/messages-CL3mCbi6.mjs → messages-Ce6KVEbT.mjs} +27 -2
- package/dist/{chunks/messages-C-jA6Rf7.mjs → messages-Ci0KqX-J.mjs} +33 -8
- package/dist/{chunks/messages-DMyRdafk2.mjs → messages-CjbnogEC.mjs} +26 -1
- package/dist/{chunks/messages-BlO_37l_.mjs → messages-CmB406HW.mjs} +28 -3
- package/dist/{messages-Cho2VTAX.mjs → messages-CqXtJTpU.mjs} +26 -1
- package/dist/{messages-CWEL1WDy2.mjs → messages-D0aw5_0k2.mjs} +28 -3
- package/dist/{messages-CgEDVri-2.mjs → messages-D8FQWulF2.mjs} +26 -1
- package/dist/{chunks/messages-B5aAzExz.mjs → messages-DBiVgUs2.mjs} +27 -2
- package/dist/{chunks/messages-DYizZHT2.mjs → messages-DIJlIqlQ2.mjs} +26 -1
- package/dist/{messages-BPL7riv-.mjs → messages-DLX_iBDJ.mjs} +26 -1
- package/dist/{messages-vptt-pVF.mjs → messages-DLlc9QPw.mjs} +26 -1
- package/dist/{chunks/messages-876bKyUj2.mjs → messages-DMr62KiO2.mjs} +26 -1
- package/dist/{chunks/messages-CgedvWCf.mjs → messages-DPA-mMWC2.mjs} +27 -2
- package/dist/{messages-vcoib5Ga.mjs → messages-DTh9a8mR.mjs} +26 -1
- package/dist/{chunks/messages-DgEGJECT.mjs → messages-DY4IqlhY.mjs} +26 -1
- package/dist/{chunks/messages-CdzF0Hvl.mjs → messages-DYTTu0O12.mjs} +26 -1
- package/dist/{messages-rbox5gSb2.mjs → messages-DbySKTKt2.mjs} +28 -3
- package/dist/{chunks/messages-BGCQCeWd.mjs → messages-Ddnj2iTG2.mjs} +26 -1
- package/dist/{chunks/messages-CNEJxD8q2.mjs → messages-DkLU_rWm.mjs} +26 -1
- package/dist/{chunks/messages-FYl9woii2.mjs → messages-Dl3Sv6Rq2.mjs} +27 -2
- package/dist/{messages-Clsh86WQ.mjs → messages-Dl5Y2-Ia.mjs} +49 -24
- package/dist/{chunks/messages-CKRJDX0K2.mjs → messages-DnG0ef8t2.mjs} +28 -3
- package/dist/{chunks/messages-CyxDkx8a.mjs → messages-DnGJD4TL.mjs} +26 -1
- package/dist/{chunks/messages-DnJHflSh.mjs → messages-Dnp9N6RU2.mjs} +26 -1
- package/dist/{chunks/messages-Jps5Tc77.mjs → messages-Dvn35ksS.mjs} +26 -1
- package/dist/{messages-ChTWmxS8.mjs → messages-Dw__BcTj.mjs} +26 -1
- package/dist/{messages-D7juvhHp.mjs → messages-Dy-Y_nEI.mjs} +26 -1
- package/dist/{messages-CNNcKuGH.mjs → messages-E_ZuzGDt.mjs} +26 -1
- package/dist/{chunks/messages-DJO0ERQT.mjs → messages-F2xRoY1w.mjs} +26 -1
- package/dist/{messages-DqJTZbwt.mjs → messages-Smt4GBbj.mjs} +31 -6
- package/dist/{chunks/messages-D8dKkyII2.mjs → messages-aMXpHt5X2.mjs} +26 -1
- package/dist/{chunks/messages-DWD0ry9x.mjs → messages-aWZH50vu2.mjs} +28 -3
- package/dist/{chunks/messages-BbfLRqLh2.mjs → messages-dv19AkyJ.mjs} +26 -1
- package/dist/{chunks/messages-Dw2rmKMi2.mjs → messages-hWwSRF-2.mjs} +26 -1
- package/dist/{messages-En8LDjUB.mjs → messages-j7o5rT9s.mjs} +26 -1
- package/dist/{chunks/messages-NJsvFwJj.mjs → messages-nUVjeh7K.mjs} +27 -2
- package/dist/{messages-Cg1CF4pw.mjs → messages-nlhESX9t.mjs} +26 -1
- package/dist/{messages-CSl0Wla62.mjs → messages-rk-A1Wa42.mjs} +28 -3
- package/dist/{messages-nOe1gJYu.mjs → messages-xh2eOLvs.mjs} +26 -1
- package/dist/{messages-B_sKqaeK.mjs → messages-ynAe7ewZ.mjs} +26 -1
- package/dist/react.mjs +2 -2
- package/dist/tools.mjs +2 -2
- package/dist/vendor.LICENSE.txt +3254 -297
- package/package.json +7 -2
- package/src/components/constants/data-attributes.ts +0 -2
- package/src/components/i18n/locales/am/messages.json +26 -1
- package/src/components/i18n/locales/ar/messages.json +26 -1
- package/src/components/i18n/locales/az/messages.json +26 -1
- package/src/components/i18n/locales/bg/messages.json +26 -1
- package/src/components/i18n/locales/bn/messages.json +26 -1
- package/src/components/i18n/locales/bs/messages.json +28 -3
- package/src/components/i18n/locales/cs/messages.json +30 -5
- package/src/components/i18n/locales/da/messages.json +33 -8
- package/src/components/i18n/locales/de/messages.json +31 -6
- package/src/components/i18n/locales/dv/messages.json +26 -1
- package/src/components/i18n/locales/el/messages.json +26 -1
- package/src/components/i18n/locales/en/messages.json +13 -0
- package/src/components/i18n/locales/es/messages.json +27 -2
- package/src/components/i18n/locales/et/messages.json +30 -5
- package/src/components/i18n/locales/fa/messages.json +26 -1
- package/src/components/i18n/locales/fi/messages.json +26 -1
- package/src/components/i18n/locales/fil/messages.json +49 -24
- package/src/components/i18n/locales/fr/messages.json +27 -2
- package/src/components/i18n/locales/gu/messages.json +26 -1
- package/src/components/i18n/locales/he/messages.json +26 -1
- package/src/components/i18n/locales/hi/messages.json +26 -1
- package/src/components/i18n/locales/hr/messages.json +28 -3
- package/src/components/i18n/locales/hu/messages.json +27 -2
- package/src/components/i18n/locales/hy/messages.json +26 -1
- package/src/components/i18n/locales/id/messages.json +26 -1
- package/src/components/i18n/locales/it/messages.json +27 -2
- package/src/components/i18n/locales/ja/messages.json +26 -1
- package/src/components/i18n/locales/ka/messages.json +26 -1
- package/src/components/i18n/locales/km/messages.json +26 -1
- package/src/components/i18n/locales/kn/messages.json +26 -1
- package/src/components/i18n/locales/ko/messages.json +26 -1
- package/src/components/i18n/locales/ku/messages.json +26 -1
- package/src/components/i18n/locales/lo/messages.json +26 -1
- package/src/components/i18n/locales/lt/messages.json +26 -1
- package/src/components/i18n/locales/lv/messages.json +26 -1
- package/src/components/i18n/locales/mk/messages.json +26 -1
- package/src/components/i18n/locales/ml/messages.json +26 -1
- package/src/components/i18n/locales/mn/messages.json +26 -1
- package/src/components/i18n/locales/mr/messages.json +26 -1
- package/src/components/i18n/locales/ms/messages.json +28 -3
- package/src/components/i18n/locales/my/messages.json +26 -1
- package/src/components/i18n/locales/ne/messages.json +26 -1
- package/src/components/i18n/locales/nl/messages.json +28 -3
- package/src/components/i18n/locales/no/messages.json +29 -4
- package/src/components/i18n/locales/pa/messages.json +26 -1
- package/src/components/i18n/locales/pl/messages.json +27 -2
- package/src/components/i18n/locales/ps/messages.json +26 -1
- package/src/components/i18n/locales/pt/messages.json +27 -2
- package/src/components/i18n/locales/ro/messages.json +27 -2
- package/src/components/i18n/locales/ru/messages.json +26 -1
- package/src/components/i18n/locales/sd/messages.json +26 -1
- package/src/components/i18n/locales/si/messages.json +26 -1
- package/src/components/i18n/locales/sk/messages.json +28 -3
- package/src/components/i18n/locales/sl/messages.json +28 -3
- package/src/components/i18n/locales/sq/messages.json +27 -2
- package/src/components/i18n/locales/sr/messages.json +26 -1
- package/src/components/i18n/locales/sv/messages.json +28 -3
- package/src/components/i18n/locales/sw/messages.json +26 -1
- package/src/components/i18n/locales/ta/messages.json +26 -1
- package/src/components/i18n/locales/te/messages.json +26 -1
- package/src/components/i18n/locales/th/messages.json +26 -1
- package/src/components/i18n/locales/tr/messages.json +26 -1
- package/src/components/i18n/locales/ug/messages.json +26 -1
- package/src/components/i18n/locales/uk/messages.json +26 -1
- package/src/components/i18n/locales/ur/messages.json +26 -1
- package/src/components/i18n/locales/vi/messages.json +26 -1
- package/src/components/i18n/locales/yi/messages.json +26 -1
- package/src/components/i18n/locales/zh/messages.json +26 -1
- package/src/components/icons/index.ts +38 -0
- package/src/components/modules/ui.ts +0 -13
- package/src/stories/EditorModes.stories.ts +0 -60
- package/src/styles/main.css +39 -1
- package/src/tools/callout/emoji-picker/index.ts +3 -2
- package/src/tools/code/code-keyboard.ts +16 -9
- package/src/tools/code/constants.ts +26 -3
- package/src/tools/code/dom-builder.ts +40 -5
- package/src/tools/code/highlight-applier.ts +229 -0
- package/src/tools/code/index.ts +141 -1
- package/src/tools/code/mermaid-loader.ts +45 -0
- package/src/tools/code/shiki-loader.ts +135 -0
- package/src/tools/table/core/table-commands.ts +16 -0
- package/src/tools/table/core/table-controller.ts +29 -0
- package/src/tools/table/core/table-events.ts +17 -0
- package/src/tools/table/index.ts +194 -11
- package/src/tools/table/table-cell-blocks.ts +9 -6
- package/src/tools/table/table-cell-clipboard.ts +6 -1
- package/src/tools/table/table-cell-placement-picker.ts +133 -0
- package/src/tools/table/table-cell-selection.ts +174 -19
- package/src/tools/table/table-core.ts +321 -113
- package/src/tools/table/table-map.ts +279 -0
- package/src/tools/table/table-model.ts +901 -1
- package/src/tools/table/table-operations.ts +78 -44
- package/src/tools/table/table-resize.ts +19 -17
- package/src/tools/table/table-row-col-drag.ts +24 -10
- package/src/tools/table/types.ts +24 -2
- package/types/data-attributes.d.ts +0 -1
- package/types/tools/code.d.ts +2 -0
- /package/dist/chunks/{am-CS-JjQ0N.mjs → am-rVzV1W41.mjs} +0 -0
- /package/dist/chunks/{ar-Dt4XzR5U.mjs → ar-C710lkoH.mjs} +0 -0
- /package/dist/chunks/{az-CaDTXby8.mjs → az-BOp1pgua.mjs} +0 -0
- /package/dist/chunks/{bg-D1pLog-R.mjs → bg-CL9p09ZD.mjs} +0 -0
- /package/dist/chunks/{bn-Db_ae60m.mjs → bn-CNmSeyAy.mjs} +0 -0
- /package/dist/chunks/{bs-DJTg1R9e.mjs → bs-BRzMGqzk.mjs} +0 -0
- /package/dist/chunks/{cs-_Gc21gSL.mjs → cs-BYPBLmnF.mjs} +0 -0
- /package/dist/chunks/{da-xDB8uhCd.mjs → da-CBC_LR1c.mjs} +0 -0
- /package/dist/chunks/{de-B6gVjh1Z.mjs → de-DxRFMoAj.mjs} +0 -0
- /package/dist/chunks/{el-ClbRSnOs.mjs → el-Bk6YbySf.mjs} +0 -0
- /package/dist/chunks/{es-CuY9rnLK.mjs → es-DpT3FCMR.mjs} +0 -0
- /package/dist/chunks/{et-BLu5lDVc.mjs → et-DE9Dr_g9.mjs} +0 -0
- /package/dist/chunks/{fa-P3gnrZH8.mjs → fa-Banj1QUE.mjs} +0 -0
- /package/dist/chunks/{fi-B8PVHLjq.mjs → fi-DfN3M5ER.mjs} +0 -0
- /package/dist/chunks/{fil-B9JII5iF.mjs → fil-DbCsRS1d.mjs} +0 -0
- /package/dist/chunks/{fr-BWLDZdcc.mjs → fr-D1clKhgt.mjs} +0 -0
- /package/dist/chunks/{gu-BH3R_s4c.mjs → gu-1CsZyRwT.mjs} +0 -0
- /package/dist/chunks/{he-CCmeCVR_.mjs → he-qQdnL6eK.mjs} +0 -0
- /package/dist/chunks/{hi-BBav00DN.mjs → hi-DxM0Nff1.mjs} +0 -0
- /package/dist/chunks/{hr-B5ZX0r9G.mjs → hr-Onldyi-u.mjs} +0 -0
- /package/dist/chunks/{hu-1jgDa3YU.mjs → hu-CAn3pBuY.mjs} +0 -0
- /package/dist/chunks/{hy-LX4Kp2PE.mjs → hy-D43q7NxE.mjs} +0 -0
- /package/dist/chunks/{i18next-KNC_XV5x.mjs → i18next-BBGW2sDE.mjs} +0 -0
- /package/dist/chunks/{id-CcG40D1H.mjs → id-Xrw5Dd0Y.mjs} +0 -0
- /package/dist/chunks/{it-Cb8_K72W.mjs → it-CA9ZDMSc.mjs} +0 -0
- /package/dist/chunks/{ja-ipCH91mv.mjs → ja-D0J6WRFh.mjs} +0 -0
- /package/dist/chunks/{ka-BRvREIgq.mjs → ka-BZL7xDuY.mjs} +0 -0
- /package/dist/chunks/{km-BJwVw7Fg.mjs → km-BimgQZVU.mjs} +0 -0
- /package/dist/chunks/{kn-BPgUazCC.mjs → kn-C2n2cPHK.mjs} +0 -0
- /package/dist/chunks/{ko-CQLzxe7k.mjs → ko-n4Cn93D3.mjs} +0 -0
- /package/dist/chunks/{ku-BHhHu8Iz.mjs → ku-BYZCgT44.mjs} +0 -0
- /package/dist/chunks/{lo-DsTgYblY.mjs → lo-DVXiAE4N.mjs} +0 -0
- /package/dist/chunks/{lt-CDzHJm71.mjs → lt-B9KlQFnY.mjs} +0 -0
- /package/dist/chunks/{lv-MLLIAnIX.mjs → lv-BINeOdyx.mjs} +0 -0
- /package/dist/chunks/{mdast-util-math-yS0EygZV.mjs → mdast-util-math-CHYUxOHk.mjs} +0 -0
- /package/dist/chunks/{mk-DQdmUquZ.mjs → mk-_-QrPrLN.mjs} +0 -0
- /package/dist/chunks/{ml-DqehZnra.mjs → ml-KvJSC1KT.mjs} +0 -0
- /package/dist/chunks/{mn-4cFkKFjW.mjs → mn-CjFjWnRG.mjs} +0 -0
- /package/dist/chunks/{mr-DWiztOP4.mjs → mr-DqAZ7FRX.mjs} +0 -0
- /package/dist/chunks/{ms-BSz-iSnc.mjs → ms-BZcV4UG_.mjs} +0 -0
- /package/dist/chunks/{my-DbtbM1MW.mjs → my-97SC9jYN.mjs} +0 -0
- /package/dist/chunks/{ne-CqALWw_f.mjs → ne-Bs-M2TyF.mjs} +0 -0
- /package/dist/chunks/{nl-D_ra6RvH.mjs → nl-2ZwQilo-.mjs} +0 -0
- /package/dist/chunks/{no-Cg_kz_jl.mjs → no-fOQTpFq1.mjs} +0 -0
- /package/dist/chunks/{notifier-BOwxj_Ok.mjs → notifier-B1zCi9G1.mjs} +0 -0
- /package/dist/chunks/{pa-NLAsNqwY.mjs → pa-DLOqkMi0.mjs} +0 -0
- /package/dist/chunks/{pl-NHKp4YDg.mjs → pl-FYs9QrXU.mjs} +0 -0
- /package/dist/chunks/{ps-D1zEqNeg.mjs → ps-CTXe6pSe.mjs} +0 -0
- /package/dist/chunks/{pt-DBtqbUEB.mjs → pt-B1X4x7d1.mjs} +0 -0
- /package/dist/chunks/{ro-lqr63ai5.mjs → ro-Bf7S2FaR.mjs} +0 -0
- /package/dist/chunks/{ru-BycNnDyN.mjs → ru-B8lqnu_j.mjs} +0 -0
- /package/dist/chunks/{sd-DpHpIN9Z.mjs → sd-CHRYJm2r.mjs} +0 -0
- /package/dist/chunks/{si-BwiwaC7N.mjs → si-CI0Hs6vH.mjs} +0 -0
- /package/dist/chunks/{sk-CqRHT2Gp.mjs → sk-Bdvq1Kb_.mjs} +0 -0
- /package/dist/chunks/{sl-DA348uQ_.mjs → sl-B_qiFTV5.mjs} +0 -0
- /package/dist/chunks/{sq-D7JNgve1.mjs → sq-E0j1hysP.mjs} +0 -0
- /package/dist/chunks/{sr-D8RK6Kwp.mjs → sr-VPpVNTZw.mjs} +0 -0
- /package/dist/chunks/{sv-dwgT67ZG.mjs → sv-gKmDSR3d.mjs} +0 -0
- /package/dist/chunks/{sw-ZRRJnkem.mjs → sw-zeFLiO23.mjs} +0 -0
- /package/dist/chunks/{ta-5x4L5Krl.mjs → ta-Ci-j89hR.mjs} +0 -0
- /package/dist/chunks/{te-BZpEimwA.mjs → te-qyMI0M7a.mjs} +0 -0
- /package/dist/chunks/{th-Bhr-33kv.mjs → th-DPxHtpdb.mjs} +0 -0
- /package/dist/chunks/{tr-6tSNKGNB.mjs → tr-CRV6GS-G.mjs} +0 -0
- /package/dist/chunks/{ug-_e-jvr2b.mjs → ug-DW0YFpo5.mjs} +0 -0
- /package/dist/chunks/{uk-DooSc2Ja.mjs → uk-ssteuphK.mjs} +0 -0
- /package/dist/chunks/{ur-rb-krkIO.mjs → ur-qhY3-jY7.mjs} +0 -0
- /package/dist/chunks/{vi-CQkLn2AQ.mjs → vi-CHriMMC8.mjs} +0 -0
- /package/dist/chunks/{zh-CXQ40Q2_.mjs → zh-BJktawVN.mjs} +0 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { DARK_MODE_SELECTOR } from './constants';
|
|
2
|
+
|
|
3
|
+
export interface HighlightToken {
|
|
4
|
+
content: string;
|
|
5
|
+
color: string;
|
|
6
|
+
/** Character offset from the start of the LINE (not document) */
|
|
7
|
+
offset: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface ThemeTokens {
|
|
11
|
+
tokens: HighlightToken[][];
|
|
12
|
+
fg: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface DualThemeTokens {
|
|
16
|
+
light: ThemeTokens;
|
|
17
|
+
dark: ThemeTokens;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Typed subset of Highlight (Set-like, as per the CSS Custom Highlight API spec) */
|
|
21
|
+
interface HighlightSet extends Highlight {
|
|
22
|
+
add(range: Range): void;
|
|
23
|
+
delete(range: Range): boolean;
|
|
24
|
+
size: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Typed subset of the CSS Custom Highlight API HighlightRegistry (Map-like) */
|
|
28
|
+
interface HighlightMap {
|
|
29
|
+
get(name: string): HighlightSet | undefined;
|
|
30
|
+
set(name: string, highlight: HighlightSet): void;
|
|
31
|
+
delete(name: string): void;
|
|
32
|
+
keys(): IterableIterator<string>;
|
|
33
|
+
size: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** CSS global augmented with the highlights registry (feature-detected at runtime) */
|
|
37
|
+
interface CSSWithHighlights {
|
|
38
|
+
highlights: HighlightMap;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const state = {
|
|
42
|
+
stylesheet: null as CSSStyleSheet | null,
|
|
43
|
+
knownRules: new Set<string>(),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export function isHighlightingSupported(): boolean {
|
|
47
|
+
return typeof CSS !== 'undefined' && 'highlights' in CSS;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function getHighlights(): HighlightMap {
|
|
51
|
+
return (CSS as unknown as CSSWithHighlights).highlights;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function ensureStylesheet(): CSSStyleSheet {
|
|
55
|
+
if (!state.stylesheet) {
|
|
56
|
+
state.stylesheet = new CSSStyleSheet();
|
|
57
|
+
document.adoptedStyleSheets = [...document.adoptedStyleSheets, state.stylesheet];
|
|
58
|
+
}
|
|
59
|
+
return state.stylesheet;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function colorToId(hex: string): string {
|
|
63
|
+
const clean = hex.replace('#', '').toLowerCase();
|
|
64
|
+
return clean.length > 6 ? clean.substring(0, 6) : clean;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function ensureRule(stylesheet: CSSStyleSheet, name: string, color: string, scope?: string): void {
|
|
68
|
+
const key = `${scope ?? ''}::${name}`;
|
|
69
|
+
if (state.knownRules.has(key)) return;
|
|
70
|
+
|
|
71
|
+
const rule = scope
|
|
72
|
+
? `${scope} ::highlight(${name}) { color: ${color}; }`
|
|
73
|
+
: `::highlight(${name}) { color: ${color}; }`;
|
|
74
|
+
|
|
75
|
+
stylesheet.insertRule(rule, stylesheet.cssRules.length);
|
|
76
|
+
state.knownRules.add(key);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function findTextNode(
|
|
80
|
+
element: HTMLElement,
|
|
81
|
+
targetOffset: number
|
|
82
|
+
): { node: Node; offset: number } | null {
|
|
83
|
+
const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);
|
|
84
|
+
|
|
85
|
+
const find = (node: Node | null, accumulated: number): { node: Node; offset: number } | null => {
|
|
86
|
+
if (!node) {
|
|
87
|
+
if (targetOffset === accumulated && element.lastChild) {
|
|
88
|
+
return { node: element.lastChild, offset: element.lastChild.textContent?.length ?? 0 };
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const len = node.textContent?.length ?? 0;
|
|
93
|
+
if (accumulated + len > targetOffset) {
|
|
94
|
+
return { node, offset: targetOffset - accumulated };
|
|
95
|
+
}
|
|
96
|
+
return find(walker.nextNode(), accumulated + len);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
return find(walker.nextNode(), 0);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function buildLineOffsets(text: string): number[] {
|
|
103
|
+
return text.split('\n').reduce<{ offsets: number[]; pos: number }>(
|
|
104
|
+
(acc, line) => ({
|
|
105
|
+
offsets: [...acc.offsets, acc.pos],
|
|
106
|
+
pos: acc.pos + line.length + 1,
|
|
107
|
+
}),
|
|
108
|
+
{ offsets: [], pos: 0 }
|
|
109
|
+
).offsets;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function applyToken(
|
|
113
|
+
element: HTMLElement,
|
|
114
|
+
text: string,
|
|
115
|
+
lineBase: number,
|
|
116
|
+
token: HighlightToken,
|
|
117
|
+
themeKey: string,
|
|
118
|
+
scope: string | undefined,
|
|
119
|
+
priority: number,
|
|
120
|
+
stylesheet: CSSStyleSheet,
|
|
121
|
+
ownedRanges: Array<[string, Range]>
|
|
122
|
+
): void {
|
|
123
|
+
if (!token.content.trim()) return;
|
|
124
|
+
|
|
125
|
+
const start = lineBase + token.offset;
|
|
126
|
+
const end = start + token.content.length;
|
|
127
|
+
if (end > text.length) return;
|
|
128
|
+
|
|
129
|
+
const startPos = findTextNode(element, start);
|
|
130
|
+
const endPos = findTextNode(element, end);
|
|
131
|
+
if (!startPos || !endPos) return;
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
const range = new Range();
|
|
135
|
+
range.setStart(startPos.node, startPos.offset);
|
|
136
|
+
range.setEnd(endPos.node, endPos.offset);
|
|
137
|
+
|
|
138
|
+
const colorId = colorToId(token.color);
|
|
139
|
+
const hlName = `blok-${themeKey}-${colorId}`;
|
|
140
|
+
const highlights = getHighlights();
|
|
141
|
+
|
|
142
|
+
ensureRule(stylesheet, hlName, token.color, scope);
|
|
143
|
+
|
|
144
|
+
const existing = highlights.get(hlName);
|
|
145
|
+
const highlight = existing ?? (new Highlight() as unknown as HighlightSet);
|
|
146
|
+
if (!existing) {
|
|
147
|
+
highlight.priority = priority;
|
|
148
|
+
highlights.set(hlName, highlight);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
highlight.add(range);
|
|
152
|
+
ownedRanges.push([hlName, range]);
|
|
153
|
+
} catch {
|
|
154
|
+
// Skip invalid ranges
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function applyThemeTokens(
|
|
159
|
+
element: HTMLElement,
|
|
160
|
+
text: string,
|
|
161
|
+
lineOffsets: number[],
|
|
162
|
+
themeData: ThemeTokens,
|
|
163
|
+
themeKey: string,
|
|
164
|
+
scope: string | undefined,
|
|
165
|
+
priority: number,
|
|
166
|
+
stylesheet: CSSStyleSheet,
|
|
167
|
+
ownedRanges: Array<[string, Range]>
|
|
168
|
+
): void {
|
|
169
|
+
for (const [lineIdx, lineTokens] of themeData.tokens.entries()) {
|
|
170
|
+
const lineBase = lineOffsets[lineIdx];
|
|
171
|
+
if (lineBase === undefined) continue;
|
|
172
|
+
|
|
173
|
+
for (const token of lineTokens) {
|
|
174
|
+
applyToken(element, text, lineBase, token, themeKey, scope, priority, stylesheet, ownedRanges);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function applyHighlights(element: HTMLElement, themes: DualThemeTokens): () => void {
|
|
180
|
+
if (!isHighlightingSupported()) return () => {};
|
|
181
|
+
|
|
182
|
+
const stylesheet = ensureStylesheet();
|
|
183
|
+
const ownedRanges: Array<[string, Range]> = [];
|
|
184
|
+
const text = element.textContent ?? '';
|
|
185
|
+
const lineOffsets = buildLineOffsets(text);
|
|
186
|
+
|
|
187
|
+
const themeEntries: Array<[string, ThemeTokens, string | undefined, number]> = [
|
|
188
|
+
['l', themes.light, undefined, 0],
|
|
189
|
+
['d', themes.dark, DARK_MODE_SELECTOR, 1],
|
|
190
|
+
];
|
|
191
|
+
|
|
192
|
+
for (const [themeKey, themeData, scope, priority] of themeEntries) {
|
|
193
|
+
applyThemeTokens(element, text, lineOffsets, themeData, themeKey, scope, priority, stylesheet, ownedRanges);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return () => cleanupRanges(ownedRanges, getHighlights());
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function cleanupRanges(ownedRanges: Array<[string, Range]>, highlights: HighlightMap): void {
|
|
200
|
+
for (const [name, range] of ownedRanges) {
|
|
201
|
+
const hl = highlights.get(name);
|
|
202
|
+
if (!hl) continue;
|
|
203
|
+
hl.delete(range);
|
|
204
|
+
if (hl.size === 0) {
|
|
205
|
+
highlights.delete(name);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function removeBlokHighlights(highlights: HighlightMap): void {
|
|
211
|
+
const blokNames = [...highlights.keys()].filter((name) => name.startsWith('blok-'));
|
|
212
|
+
for (const name of blokNames) {
|
|
213
|
+
highlights.delete(name);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export function disposeAllHighlights(): void {
|
|
218
|
+
if (isHighlightingSupported()) {
|
|
219
|
+
removeBlokHighlights(getHighlights());
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (state.stylesheet) {
|
|
223
|
+
document.adoptedStyleSheets = document.adoptedStyleSheets.filter(
|
|
224
|
+
(s) => s !== state.stylesheet
|
|
225
|
+
);
|
|
226
|
+
state.stylesheet = null;
|
|
227
|
+
state.knownRules.clear();
|
|
228
|
+
}
|
|
229
|
+
}
|
package/src/tools/code/index.ts
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
CODE_AREA_STYLES,
|
|
22
22
|
COPY_CODE_KEY,
|
|
23
23
|
WRAP_LINES_KEY,
|
|
24
|
+
LINE_NUMBERS_KEY,
|
|
24
25
|
COPIED_KEY,
|
|
25
26
|
LANGUAGE_KEY,
|
|
26
27
|
COPIED_FEEDBACK_STYLES,
|
|
@@ -31,8 +32,12 @@ import {
|
|
|
31
32
|
TAB_ACTIVE_STYLES,
|
|
32
33
|
TAB_INACTIVE_STYLES,
|
|
33
34
|
PREVIEW_AREA_STYLES,
|
|
35
|
+
GUTTER_LINE_STYLES,
|
|
34
36
|
} from './constants';
|
|
35
37
|
import { renderLatex } from './katex-loader';
|
|
38
|
+
import { renderMermaid } from './mermaid-loader';
|
|
39
|
+
import { tokenizeCode, isHighlightable } from './shiki-loader';
|
|
40
|
+
import { applyHighlights, isHighlightingSupported } from './highlight-applier';
|
|
36
41
|
|
|
37
42
|
const COPIED_FEEDBACK_DURATION = 1500;
|
|
38
43
|
|
|
@@ -42,9 +47,12 @@ export class CodeTool implements BlockTool {
|
|
|
42
47
|
private _data: CodeData;
|
|
43
48
|
private _dom: CodeDOMRefs | null = null;
|
|
44
49
|
private _wrapping = true;
|
|
50
|
+
private _lineNumbers = true;
|
|
45
51
|
private _picker: LanguagePicker | null = null;
|
|
46
52
|
private _previewActive = false;
|
|
47
53
|
private _previewContainer: HTMLElement | null = null;
|
|
54
|
+
private _disposeHighlights: (() => void) | null = null;
|
|
55
|
+
private _highlightRafId: number | null = null;
|
|
48
56
|
|
|
49
57
|
constructor({ data, api, readOnly }: BlockToolConstructorOptions<CodeData>) {
|
|
50
58
|
this.api = api;
|
|
@@ -52,7 +60,9 @@ export class CodeTool implements BlockTool {
|
|
|
52
60
|
this._data = {
|
|
53
61
|
code: data?.code ?? '',
|
|
54
62
|
language: data?.language ?? DEFAULT_LANGUAGE,
|
|
63
|
+
lineNumbers: data?.lineNumbers,
|
|
55
64
|
};
|
|
65
|
+
this._lineNumbers = data?.lineNumbers ?? true;
|
|
56
66
|
}
|
|
57
67
|
|
|
58
68
|
public render(): HTMLElement {
|
|
@@ -64,6 +74,7 @@ export class CodeTool implements BlockTool {
|
|
|
64
74
|
readOnly: this.readOnly,
|
|
65
75
|
copyLabel: this.api.i18n.t(COPY_CODE_KEY),
|
|
66
76
|
wrapLabel: this.api.i18n.t(WRAP_LINES_KEY),
|
|
77
|
+
lineNumbersLabel: this.api.i18n.t(LINE_NUMBERS_KEY),
|
|
67
78
|
previewable: this.readOnly ? false : isPreviewable,
|
|
68
79
|
codeTabLabel: this.api.i18n.t(CODE_TAB_KEY),
|
|
69
80
|
previewTabLabel: this.api.i18n.t(PREVIEW_TAB_KEY),
|
|
@@ -71,6 +82,10 @@ export class CodeTool implements BlockTool {
|
|
|
71
82
|
|
|
72
83
|
this._dom = dom;
|
|
73
84
|
|
|
85
|
+
// Line numbers gutter visibility
|
|
86
|
+
dom.gutterElement.hidden = !this._lineNumbers;
|
|
87
|
+
dom.lineNumbersButton.addEventListener('click', () => this.toggleLineNumbers());
|
|
88
|
+
|
|
74
89
|
// Read-only + previewable: show preview only, hide code, no tabs
|
|
75
90
|
if (this.readOnly && isPreviewable) {
|
|
76
91
|
const previewEl = document.createElement('div');
|
|
@@ -79,6 +94,7 @@ export class CodeTool implements BlockTool {
|
|
|
79
94
|
previewEl.setAttribute('data-blok-testid', 'code-preview');
|
|
80
95
|
dom.wrapper.appendChild(previewEl);
|
|
81
96
|
dom.preElement.hidden = true;
|
|
97
|
+
dom.gutterElement.hidden = true;
|
|
82
98
|
this._previewContainer = previewEl;
|
|
83
99
|
void this.renderPreview();
|
|
84
100
|
}
|
|
@@ -87,6 +103,7 @@ export class CodeTool implements BlockTool {
|
|
|
87
103
|
if (!this.readOnly && isPreviewable && dom.codeTab && dom.previewTab && dom.previewElement) {
|
|
88
104
|
this._previewActive = true;
|
|
89
105
|
dom.preElement.hidden = true;
|
|
106
|
+
dom.gutterElement.hidden = true;
|
|
90
107
|
dom.previewElement.hidden = false;
|
|
91
108
|
this._previewContainer = dom.previewElement;
|
|
92
109
|
void this.renderPreview();
|
|
@@ -101,8 +118,17 @@ export class CodeTool implements BlockTool {
|
|
|
101
118
|
|
|
102
119
|
if (handled) {
|
|
103
120
|
event.preventDefault();
|
|
121
|
+
this.syncTrailingBr();
|
|
122
|
+
this.updateGutter();
|
|
123
|
+
this.scheduleHighlight();
|
|
104
124
|
}
|
|
105
125
|
});
|
|
126
|
+
|
|
127
|
+
dom.codeElement.addEventListener('input', () => {
|
|
128
|
+
this.syncTrailingBr();
|
|
129
|
+
this.updateGutter();
|
|
130
|
+
this.scheduleHighlight();
|
|
131
|
+
});
|
|
106
132
|
}
|
|
107
133
|
|
|
108
134
|
dom.copyButton.addEventListener('click', () => this.copyCode());
|
|
@@ -126,6 +152,10 @@ export class CodeTool implements BlockTool {
|
|
|
126
152
|
return dom.wrapper;
|
|
127
153
|
}
|
|
128
154
|
|
|
155
|
+
public rendered(): void {
|
|
156
|
+
void this.highlightCode();
|
|
157
|
+
}
|
|
158
|
+
|
|
129
159
|
private showCode(): void {
|
|
130
160
|
if (!this._dom?.previewElement || !this._dom.codeTab || !this._dom.previewTab) {
|
|
131
161
|
return;
|
|
@@ -133,6 +163,7 @@ export class CodeTool implements BlockTool {
|
|
|
133
163
|
|
|
134
164
|
this._previewActive = false;
|
|
135
165
|
this._dom.preElement.hidden = false;
|
|
166
|
+
this._dom.gutterElement.hidden = !this._lineNumbers;
|
|
136
167
|
this._dom.previewElement.hidden = true;
|
|
137
168
|
this._dom.codeTab.className = `${TAB_STYLES} ${TAB_ACTIVE_STYLES}`;
|
|
138
169
|
this._dom.previewTab.className = `${TAB_STYLES} ${TAB_INACTIVE_STYLES}`;
|
|
@@ -145,6 +176,7 @@ export class CodeTool implements BlockTool {
|
|
|
145
176
|
|
|
146
177
|
this._previewActive = true;
|
|
147
178
|
this._dom.preElement.hidden = true;
|
|
179
|
+
this._dom.gutterElement.hidden = true;
|
|
148
180
|
this._dom.previewElement.hidden = false;
|
|
149
181
|
this._dom.codeTab.className = `${TAB_STYLES} ${TAB_INACTIVE_STYLES}`;
|
|
150
182
|
this._dom.previewTab.className = `${TAB_STYLES} ${TAB_ACTIVE_STYLES}`;
|
|
@@ -159,7 +191,9 @@ export class CodeTool implements BlockTool {
|
|
|
159
191
|
}
|
|
160
192
|
|
|
161
193
|
const code = this._dom?.codeElement.textContent ?? this._data.code;
|
|
162
|
-
const rendered =
|
|
194
|
+
const rendered = this._data.language === 'mermaid'
|
|
195
|
+
? await renderMermaid(code)
|
|
196
|
+
: await renderLatex(code);
|
|
163
197
|
|
|
164
198
|
this._previewContainer.innerHTML = rendered;
|
|
165
199
|
}
|
|
@@ -168,6 +202,7 @@ export class CodeTool implements BlockTool {
|
|
|
168
202
|
return {
|
|
169
203
|
code: this._dom?.codeElement.textContent ?? '',
|
|
170
204
|
language: this._data.language,
|
|
205
|
+
lineNumbers: this._lineNumbers,
|
|
171
206
|
};
|
|
172
207
|
}
|
|
173
208
|
|
|
@@ -181,6 +216,8 @@ export class CodeTool implements BlockTool {
|
|
|
181
216
|
if (this._dom) {
|
|
182
217
|
this._dom.codeElement.textContent = this._data.code;
|
|
183
218
|
}
|
|
219
|
+
|
|
220
|
+
void this.highlightCode();
|
|
184
221
|
}
|
|
185
222
|
|
|
186
223
|
public renderSettings(): MenuConfig {
|
|
@@ -220,6 +257,8 @@ export class CodeTool implements BlockTool {
|
|
|
220
257
|
if (this._dom) {
|
|
221
258
|
this._dom.codeElement.textContent = this._data.code;
|
|
222
259
|
}
|
|
260
|
+
|
|
261
|
+
void this.highlightCode();
|
|
223
262
|
}
|
|
224
263
|
|
|
225
264
|
private setLanguage(id: string): void {
|
|
@@ -230,6 +269,7 @@ export class CodeTool implements BlockTool {
|
|
|
230
269
|
}
|
|
231
270
|
|
|
232
271
|
this._picker?.setActiveLanguage(id);
|
|
272
|
+
void this.highlightCode();
|
|
233
273
|
}
|
|
234
274
|
|
|
235
275
|
private getLanguageName(id: string): string {
|
|
@@ -271,6 +311,98 @@ export class CodeTool implements BlockTool {
|
|
|
271
311
|
}
|
|
272
312
|
}
|
|
273
313
|
|
|
314
|
+
private toggleLineNumbers(): void {
|
|
315
|
+
this._lineNumbers = !this._lineNumbers;
|
|
316
|
+
|
|
317
|
+
if (this._dom) {
|
|
318
|
+
this._dom.gutterElement.hidden = !this._lineNumbers;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
private updateGutter(): void {
|
|
323
|
+
if (!this._dom) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
const code = this._dom.codeElement.textContent ?? '';
|
|
328
|
+
const lineCount = code ? code.split('\n').length : 1;
|
|
329
|
+
const gutter = this._dom.gutterElement;
|
|
330
|
+
const currentCount = gutter.children.length;
|
|
331
|
+
|
|
332
|
+
if (currentCount === lineCount) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Rebuild gutter lines
|
|
337
|
+
gutter.innerHTML = '';
|
|
338
|
+
Array.from({ length: lineCount }, (_, idx) => {
|
|
339
|
+
const lineEl = document.createElement('div');
|
|
340
|
+
lineEl.className = GUTTER_LINE_STYLES;
|
|
341
|
+
lineEl.textContent = String(idx + 1);
|
|
342
|
+
gutter.appendChild(lineEl);
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Ensure a trailing <br> exists when the text content ends with '\n'.
|
|
348
|
+
* Browsers collapse a trailing newline in contenteditable — no visible
|
|
349
|
+
* empty line is rendered, so the caret has nowhere to go. A sentinel
|
|
350
|
+
* <br> forces the browser to create the line box. It is invisible to
|
|
351
|
+
* textContent, so save() and updateGutter() need no changes.
|
|
352
|
+
*/
|
|
353
|
+
private syncTrailingBr(): void {
|
|
354
|
+
if (!this._dom) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
const code = this._dom.codeElement;
|
|
359
|
+
const text = code.textContent ?? '';
|
|
360
|
+
const hasBr = code.lastChild instanceof HTMLBRElement;
|
|
361
|
+
|
|
362
|
+
if (text.endsWith('\n') && !hasBr) {
|
|
363
|
+
code.appendChild(document.createElement('br'));
|
|
364
|
+
} else if (!text.endsWith('\n') && hasBr) {
|
|
365
|
+
code.lastChild.remove();
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
private scheduleHighlight(): void {
|
|
370
|
+
if (this._highlightRafId !== null) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
this._highlightRafId = requestAnimationFrame(() => {
|
|
375
|
+
this._highlightRafId = null;
|
|
376
|
+
void this.highlightCode();
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
private async highlightCode(): Promise<void> {
|
|
381
|
+
if (!isHighlightingSupported() || !isHighlightable(this._data.language)) {
|
|
382
|
+
this._disposeHighlights?.();
|
|
383
|
+
this._disposeHighlights = null;
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
const code = this._dom?.codeElement.textContent ?? '';
|
|
388
|
+
|
|
389
|
+
if (!code.trim()) {
|
|
390
|
+
this._disposeHighlights?.();
|
|
391
|
+
this._disposeHighlights = null;
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
const tokens = await tokenizeCode(code, this._data.language);
|
|
396
|
+
|
|
397
|
+
if (!tokens || !this._dom) {
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Clean up previous highlights before applying new ones
|
|
402
|
+
this._disposeHighlights?.();
|
|
403
|
+
this._disposeHighlights = applyHighlights(this._dom.codeElement, tokens);
|
|
404
|
+
}
|
|
405
|
+
|
|
274
406
|
private exitBlock(): void {
|
|
275
407
|
const currentIndex = this.api.blocks.getCurrentBlockIndex();
|
|
276
408
|
|
|
@@ -278,6 +410,14 @@ export class CodeTool implements BlockTool {
|
|
|
278
410
|
}
|
|
279
411
|
|
|
280
412
|
public removed(): void {
|
|
413
|
+
this._disposeHighlights?.();
|
|
414
|
+
this._disposeHighlights = null;
|
|
415
|
+
|
|
416
|
+
if (this._highlightRafId !== null) {
|
|
417
|
+
cancelAnimationFrame(this._highlightRafId);
|
|
418
|
+
this._highlightRafId = null;
|
|
419
|
+
}
|
|
420
|
+
|
|
281
421
|
if (this._picker) {
|
|
282
422
|
this._picker.getElement().remove();
|
|
283
423
|
this._picker = null;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type mermaidType from 'mermaid';
|
|
2
|
+
|
|
3
|
+
const state = {
|
|
4
|
+
mermaidPromise: null as Promise<typeof mermaidType> | null,
|
|
5
|
+
initialized: false,
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
async function loadMermaid(): Promise<typeof mermaidType> {
|
|
9
|
+
if (!state.mermaidPromise) {
|
|
10
|
+
state.mermaidPromise = import('mermaid').then((mod) => mod.default);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const mermaid = await state.mermaidPromise;
|
|
14
|
+
|
|
15
|
+
if (!state.initialized) {
|
|
16
|
+
state.initialized = true;
|
|
17
|
+
mermaid.initialize({ startOnLoad: false, securityLevel: 'strict' });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return mermaid;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Render a Mermaid diagram string to SVG. Lazy-loads Mermaid on first call.
|
|
25
|
+
*/
|
|
26
|
+
export async function renderMermaid(code: string): Promise<string> {
|
|
27
|
+
try {
|
|
28
|
+
const mermaid = await loadMermaid();
|
|
29
|
+
|
|
30
|
+
const parseResult = await mermaid.parse(code, { suppressErrors: true });
|
|
31
|
+
|
|
32
|
+
if (parseResult === false) {
|
|
33
|
+
return '<span class="text-red-500 text-sm">Invalid Mermaid syntax</span>';
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const id = `mermaid-${crypto.randomUUID()}`;
|
|
37
|
+
const result = await mermaid.render(id, code);
|
|
38
|
+
|
|
39
|
+
return result.svg;
|
|
40
|
+
} catch (error) {
|
|
41
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
42
|
+
|
|
43
|
+
return `<span class="text-red-500 text-sm">${message}</span>`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { HighlightToken, DualThemeTokens, ThemeTokens } from './highlight-applier';
|
|
2
|
+
import { HIGHLIGHTABLE_LANGUAGES, SHIKI_LIGHT_THEME, SHIKI_DARK_THEME } from './constants';
|
|
3
|
+
|
|
4
|
+
const LANG_IMPORTS: Record<string, () => Promise<unknown>> = {
|
|
5
|
+
javascript: () => import('@shikijs/langs/javascript'),
|
|
6
|
+
typescript: () => import('@shikijs/langs/typescript'),
|
|
7
|
+
python: () => import('@shikijs/langs/python'),
|
|
8
|
+
java: () => import('@shikijs/langs/java'),
|
|
9
|
+
c: () => import('@shikijs/langs/c'),
|
|
10
|
+
cpp: () => import('@shikijs/langs/cpp'),
|
|
11
|
+
csharp: () => import('@shikijs/langs/csharp'),
|
|
12
|
+
go: () => import('@shikijs/langs/go'),
|
|
13
|
+
rust: () => import('@shikijs/langs/rust'),
|
|
14
|
+
ruby: () => import('@shikijs/langs/ruby'),
|
|
15
|
+
php: () => import('@shikijs/langs/php'),
|
|
16
|
+
swift: () => import('@shikijs/langs/swift'),
|
|
17
|
+
kotlin: () => import('@shikijs/langs/kotlin'),
|
|
18
|
+
sql: () => import('@shikijs/langs/sql'),
|
|
19
|
+
html: () => import('@shikijs/langs/html'),
|
|
20
|
+
css: () => import('@shikijs/langs/css'),
|
|
21
|
+
json: () => import('@shikijs/langs/json'),
|
|
22
|
+
yaml: () => import('@shikijs/langs/yaml'),
|
|
23
|
+
markdown: () => import('@shikijs/langs/markdown'),
|
|
24
|
+
bash: () => import('@shikijs/langs/shellscript'),
|
|
25
|
+
shell: () => import('@shikijs/langs/shellscript'),
|
|
26
|
+
dockerfile: () => import('@shikijs/langs/dockerfile'),
|
|
27
|
+
xml: () => import('@shikijs/langs/xml'),
|
|
28
|
+
graphql: () => import('@shikijs/langs/graphql'),
|
|
29
|
+
r: () => import('@shikijs/langs/r'),
|
|
30
|
+
scala: () => import('@shikijs/langs/scala'),
|
|
31
|
+
dart: () => import('@shikijs/langs/dart'),
|
|
32
|
+
lua: () => import('@shikijs/langs/lua'),
|
|
33
|
+
latex: () => import('@shikijs/langs/latex'),
|
|
34
|
+
mermaid: () => import('@shikijs/langs/mermaid'),
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
interface ShikiTokenResult {
|
|
38
|
+
tokens: Array<Array<{ content: string; color?: string; offset: number }>>;
|
|
39
|
+
fg: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface ShikiHighlighter {
|
|
43
|
+
getLoadedLanguages(): string[];
|
|
44
|
+
loadLanguage(lang: unknown): Promise<void>;
|
|
45
|
+
codeToTokens(code: string, options: { lang: string; theme: string }): ShikiTokenResult;
|
|
46
|
+
dispose(): void;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const state = {
|
|
50
|
+
highlighterPromise: null as Promise<ShikiHighlighter> | null,
|
|
51
|
+
highlighter: null as ShikiHighlighter | null,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export function isHighlightable(lang: string): boolean {
|
|
55
|
+
return HIGHLIGHTABLE_LANGUAGES.has(lang);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function ensureHighlighter(): Promise<ShikiHighlighter> {
|
|
59
|
+
if (!state.highlighterPromise) {
|
|
60
|
+
state.highlighterPromise = (async (): Promise<ShikiHighlighter> => {
|
|
61
|
+
const { createHighlighterCore } = await import('shiki/core');
|
|
62
|
+
const { createJavaScriptRegexEngine } = await import('shiki/engine/javascript');
|
|
63
|
+
|
|
64
|
+
const hl: ShikiHighlighter = await createHighlighterCore({
|
|
65
|
+
themes: [
|
|
66
|
+
import('@shikijs/themes/one-light'),
|
|
67
|
+
import('@shikijs/themes/vitesse-dark'),
|
|
68
|
+
],
|
|
69
|
+
langs: [],
|
|
70
|
+
engine: createJavaScriptRegexEngine(),
|
|
71
|
+
}) as ShikiHighlighter;
|
|
72
|
+
state.highlighter = hl;
|
|
73
|
+
return hl;
|
|
74
|
+
})();
|
|
75
|
+
}
|
|
76
|
+
return state.highlighterPromise;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function ensureLanguage(highlighter: ShikiHighlighter, lang: string): Promise<void> {
|
|
80
|
+
const loaded: string[] = highlighter.getLoadedLanguages();
|
|
81
|
+
if (loaded.includes(lang)) return;
|
|
82
|
+
|
|
83
|
+
const importer = LANG_IMPORTS[lang];
|
|
84
|
+
if (!importer) return;
|
|
85
|
+
|
|
86
|
+
await highlighter.loadLanguage(await importer());
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function mapTokens(result: ShikiTokenResult): ThemeTokens {
|
|
90
|
+
return {
|
|
91
|
+
tokens: result.tokens.map((line) =>
|
|
92
|
+
line.map((token): HighlightToken => ({
|
|
93
|
+
content: token.content,
|
|
94
|
+
color: token.color ?? result.fg,
|
|
95
|
+
offset: token.offset,
|
|
96
|
+
}))
|
|
97
|
+
),
|
|
98
|
+
fg: result.fg,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export async function tokenizeCode(code: string, lang: string): Promise<DualThemeTokens | null> {
|
|
103
|
+
if (!isHighlightable(lang)) return null;
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
const highlighter = await ensureHighlighter();
|
|
107
|
+
await ensureLanguage(highlighter, lang);
|
|
108
|
+
|
|
109
|
+
const lightResult: ShikiTokenResult = highlighter.codeToTokens(code, {
|
|
110
|
+
lang,
|
|
111
|
+
theme: SHIKI_LIGHT_THEME,
|
|
112
|
+
});
|
|
113
|
+
const darkResult: ShikiTokenResult = highlighter.codeToTokens(code, {
|
|
114
|
+
lang,
|
|
115
|
+
theme: SHIKI_DARK_THEME,
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
light: mapTokens(lightResult),
|
|
120
|
+
dark: mapTokens(darkResult),
|
|
121
|
+
};
|
|
122
|
+
} catch {
|
|
123
|
+
state.highlighterPromise = null;
|
|
124
|
+
state.highlighter = null;
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function disposeHighlighter(): void {
|
|
130
|
+
if (state.highlighter) {
|
|
131
|
+
state.highlighter.dispose();
|
|
132
|
+
state.highlighter = null;
|
|
133
|
+
}
|
|
134
|
+
state.highlighterPromise = null;
|
|
135
|
+
}
|
|
@@ -77,6 +77,20 @@ export interface SetColWidthsCommand {
|
|
|
77
77
|
readonly widths: readonly number[] | undefined;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
export interface MergeCellsCommand {
|
|
81
|
+
readonly type: 'merge-cells';
|
|
82
|
+
readonly minRow: number;
|
|
83
|
+
readonly maxRow: number;
|
|
84
|
+
readonly minCol: number;
|
|
85
|
+
readonly maxCol: number;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface SplitCellCommand {
|
|
89
|
+
readonly type: 'split-cell';
|
|
90
|
+
readonly row: number;
|
|
91
|
+
readonly col: number;
|
|
92
|
+
}
|
|
93
|
+
|
|
80
94
|
export interface ReplaceAllCommand {
|
|
81
95
|
readonly type: 'replace-all';
|
|
82
96
|
readonly data: TableData;
|
|
@@ -96,4 +110,6 @@ export type TableCommand =
|
|
|
96
110
|
| RemoveBlockFromCellCommand
|
|
97
111
|
| SetCellBlocksCommand
|
|
98
112
|
| SetColWidthsCommand
|
|
113
|
+
| MergeCellsCommand
|
|
114
|
+
| SplitCellCommand
|
|
99
115
|
| ReplaceAllCommand;
|