@linloir/limr 0.0.0-stage → 1.0.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/LICENSE +21 -0
- package/README.en.md +123 -0
- package/README.md +122 -2
- package/benchmarks/results/browser.json +237 -0
- package/benchmarks/results/node.json +75 -0
- package/benchmarks/results/selection.json +172 -0
- package/dist/THIRD_PARTY_LICENSES.txt +117 -0
- package/dist/base.css +454 -0
- package/dist/chunk-3ILUZKDB.js +3130 -0
- package/dist/chunk-3ILUZKDB.js.map +1 -0
- package/dist/chunk-6N6TFHEN.js +83 -0
- package/dist/chunk-6N6TFHEN.js.map +1 -0
- package/dist/chunk-N77VD2YR.js +1238 -0
- package/dist/chunk-N77VD2YR.js.map +1 -0
- package/dist/chunk-TTISGBST.js +478 -0
- package/dist/chunk-TTISGBST.js.map +1 -0
- package/dist/chunk-V2OG4Y3F.js +1 -0
- package/dist/chunk-V2OG4Y3F.js.map +1 -0
- package/dist/core/index.d.ts +57 -0
- package/dist/core/index.js +39 -0
- package/dist/core/index.js.map +1 -0
- package/dist/engine-43u8B4yt.d.ts +172 -0
- package/dist/extensions/index.d.ts +130 -0
- package/dist/extensions/index.js +50 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/fonts/LICENSE.txt +93 -0
- package/dist/fonts/manifest.json +2204 -0
- package/dist/fonts/maple-7.9-bold-005-5530d8c1d6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-00f-1179d800a7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-010-9974a942b1.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-011-9b9230baf2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-012-c2545292b1.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-013-877b19fe05.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-014-6acf4a4e92.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-015-c889146da3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-018-419ad5f31f.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-027-dd414483da.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-028-263744fbc7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-029-ae3a163d8b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02a-515f0a82c2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02b-0823c5133d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02c-296fd5db38.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02d-0bb4734363.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02e-25415fed50.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-02f-19ed79a84e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-030-21962a0327.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-031-d216fc0d68.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-032-d90ba34901.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-033-55ea37ea00.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-034-bc8649f808.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-035-03604fe40b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-036-44fc7f77b2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-037-8a1440f155.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-038-c65a618d5c.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-039-be05db966d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03a-ca3a10002d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03b-067b32e10b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03c-4da4f84530.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03d-f0fe6a68c8.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03e-0e97f89433.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-03f-3289a5e3bc.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-040-232dcd0d7b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-041-e25e9a9c41.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-042-d64a2b1824.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-043-2d01cf5e52.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-044-0ab808b5f1.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-045-e41dc814b4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-046-d5fe26344d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-047-f322ded671.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-048-0cdcf7257f.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-049-aa280ca08a.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04a-f51ad4d92c.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04b-4e8c6fa3ee.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04c-9bfdf4d743.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04d-83ac1f5bb3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04e-bcec89804a.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-04f-d31e83b6ce.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-070-8a3b0fdf98.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-071-5bee0a62c4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-072-97d891eee4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-073-4d4c36aca0.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-074-6d3cc01e90.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-075-eab42ad657.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-076-2b1f5c4a42.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-077-1db0d50873.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-078-bc6994a28f.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-079-ad6c1757ce.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-07a-d08ed2b87d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-07f-2f4af46cc6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-0fc-42ed90884c.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-780-261fac1b24.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-781-377319a91b.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-782-3106f0be62.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-783-74fbfa8648.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-784-8570270664.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-785-cee8de1ded.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-786-5ab5ff7149.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-787-844b4c4373.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-788-01731198ab.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-789-f4c75fa806.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-78a-4370321ec6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-78b-5cd412b56f.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-78c-f88e331085.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-78d-1b9b77f6e8.woff2 +0 -0
- package/dist/fonts/maple-7.9-bold-latin-3b4b2831f3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-005-d59fef8639.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-00f-1bbda7af69.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-010-5cdd4b46a7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-011-0d1f1ae687.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-012-4ceb000b2e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-013-ad0a4f4313.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-014-94d54b71b3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-015-7aede280da.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-018-f21221b1c2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-027-d23d0e80a4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-028-23bd6f24df.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-029-c481c0ad50.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02a-1c134be68e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02b-3feb29ecfd.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02c-de8cc5a063.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02d-ea25c21fad.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02e-e68d6bd335.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-02f-c88d1e92dc.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-030-f26fefe87e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-031-f2aa1b8e22.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-032-c4fafc4aa6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-033-288a1639ca.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-034-7c982125bc.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-035-fd1575dea2.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-036-f6bf406353.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-037-8ac1466916.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-038-e9f7fed6a6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-039-6f90d42310.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03a-30c9409a7e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03b-4f1741e9e9.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03c-6551c74e78.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03d-c8e2b07106.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03e-c3e98613d4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-03f-f1c580bad4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-040-32e8260076.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-041-39805a0ed7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-042-13b4d84cd3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-043-d85780d0bd.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-044-1b5eb624d7.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-045-ad0b4f8762.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-046-9966021b3a.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-047-100d4f6f4e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-048-a0a1e8b29c.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-049-0806f9b3cc.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04a-28fdef78b3.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04b-6e93ef0086.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04c-50b8da6282.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04d-f93277723d.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04e-72e2644690.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-04f-4f234f1802.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-070-a3658a8a23.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-071-4987e49732.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-072-e587fa72cd.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-073-2aca01fdf6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-074-ae89f99a60.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-075-5a77191665.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-076-4c54a87277.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-077-e47dce25ee.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-078-b0b720dab6.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-079-316ee96f6a.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-07a-b10ccb8107.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-07d-5667cb3be1.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-07f-2ac6735ff8.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-0fc-52171ca01e.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-780-3c090c5f89.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-781-ca4077b4fa.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-782-42c3d52206.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-783-d72840dd37.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-784-b9ca097e50.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-785-b81dec6af9.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-786-76c266f6f5.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-787-403bd73766.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-788-71a4b8c2c5.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-789-94527f3fa4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-78a-81918568b8.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-78b-d0302b4bfe.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-78c-e864792049.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-78d-105ff69bf4.woff2 +0 -0
- package/dist/fonts/maple-7.9-bolditalic-latin-96412d165b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-005-23b09473f8.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-00f-e9bf4dd93c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-010-22933d6d77.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-011-71b0157ddc.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-012-b751ab3752.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-013-530b1d3f8b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-014-0e842f6749.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-015-642211b03a.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-018-0c5b0001c6.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-027-9a09afbbb1.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-028-93fea67326.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-029-7d7627d4cc.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02a-88e76d051b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02b-7d9219748b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02c-049df19d84.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02d-663fc73c6e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02e-a98ed33998.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-02f-8ef9d93d09.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-030-74885d994d.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-031-4cf66c5d65.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-032-a608b7aed4.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-033-2978f66e55.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-034-38f7a0bf87.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-035-5cc45cd3b7.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-036-ca92d327e5.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-037-f887681c7d.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-038-06150b88f8.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-039-761da333b7.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03a-1408ddaf2c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03b-1542b3b67c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03c-479f2f5011.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03d-0f10590b11.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03e-8b93e0ee0e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-03f-2bd8815e3e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-040-b85023679a.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-041-eb881b7b92.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-042-01490a139e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-043-ffb21b6c4c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-044-05cd1a1b14.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-045-1270935363.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-046-857077eab1.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-047-ca57774cc3.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-048-20969d6307.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-049-4066aa1a18.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04a-1ed360d580.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04b-2eba62d76b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04c-2f4effc460.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04d-d858c0a9c1.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04e-a19eb0289f.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-04f-8addde15f2.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-070-f0bd641f1c.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-071-e6ac564431.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-072-e6fea65bca.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-073-71621c00dc.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-074-4bd488962a.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-075-2838d95bd6.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-076-94e02ecc03.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-077-32c536ab6b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-078-18256447bd.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-079-7a735e61cf.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-07a-2b57a6a905.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-07d-8ba1bbfb50.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-07f-0240d80c69.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-0fc-e5b20a692e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-780-093cc90a9b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-781-f6ec357f6d.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-782-5ca2ef4ddd.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-783-7450baabee.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-784-14a93cc4bd.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-785-d62fb8b4d7.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-786-1d2959dc83.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-787-70ae947136.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-788-cf1f156ebf.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-789-f0b79f9680.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-78a-5a53fd7870.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-78b-40be093bfd.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-78c-3b11646f8e.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-78d-b13ed8c48b.woff2 +0 -0
- package/dist/fonts/maple-7.9-italic-latin-befeb2b610.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-005-90bff107ac.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-00f-001e503e53.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-010-374da1ebb4.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-011-8f91fcc9e7.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-012-e4ec3016ef.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-013-e779e13a12.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-014-6b833ad501.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-015-4e058c4c42.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-018-6f776bc19b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-027-92c0be3439.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-028-154c8c3039.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-029-9d88470aca.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02a-7a94cb26f2.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02b-1725b841c2.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02c-e080c435d6.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02d-a6461c4708.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02e-2e55d9b957.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-02f-858a76fa1f.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-030-bbbe80f8ad.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-031-cafc1258ad.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-032-0ca83ecceb.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-033-6cb995f2e7.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-034-5877222be6.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-035-988d8f2d26.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-036-e91853e3ca.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-037-3eed60f359.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-038-5681f42a4a.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-039-07036fe444.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03a-5495eead93.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03b-d07b1d6c1e.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03c-6291400ee0.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03d-3787a51772.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03e-ce4d945844.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-03f-95e98b329c.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-040-693b769fe8.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-041-7b436d2c09.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-042-9ad884cd73.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-043-372231e8e2.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-044-9922b540b1.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-045-8a88a91c22.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-046-82859ede10.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-047-6532babd62.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-048-abfdc5d7ce.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-049-adb7fa9ed3.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04a-f3f794b1cb.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04b-715211b8dd.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04c-c6f978d10d.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04d-61019a1c8f.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04e-806d6efe85.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-04f-99d19aa8db.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-070-e94ba9445d.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-071-057314b533.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-072-a7699beb84.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-073-ebe1bd9ef4.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-074-722db38100.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-075-150ff7187b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-076-c14595e715.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-077-6c88302a32.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-078-549b294c78.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-079-5131c42759.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-07a-c0dad221b5.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-07f-5cf5ebe065.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-0fc-b644c0c6d9.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-780-c6000d472a.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-781-86409ab7f7.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-782-9cd950637c.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-783-105c4d02df.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-784-00c042af97.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-785-022568d0b8.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-786-90b6f3aef5.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-787-e2888596c9.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-788-3416e1fda3.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-789-9ffc917b0b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-78a-4a921d07f6.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-78b-9d71c5327b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-78c-9ec048314b.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-78d-46a2ebd113.woff2 +0 -0
- package/dist/fonts/maple-7.9-regular-latin-59c752ba1d.woff2 +0 -0
- package/dist/fonts/maple.css +315 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +136 -0
- package/dist/index.js.map +1 -0
- package/dist/math-renderer-L6DOH4RX.js +21 -0
- package/dist/math-renderer-L6DOH4RX.js.map +1 -0
- package/dist/math.css +1 -0
- package/dist/react/index.d.ts +113 -0
- package/dist/react/index.js +59 -0
- package/dist/react/index.js.map +1 -0
- package/dist/styles.css +454 -0
- package/dist/translations-DHnYMg4h.d.ts +318 -0
- package/docs/README.md +13 -0
- package/docs/api.md +8 -0
- package/docs/assets/rendered.svg +9 -0
- package/docs/assets/source.svg +9 -0
- package/docs/en/README.md +26 -0
- package/docs/en/ai-skills.md +57 -0
- package/docs/en/annotations.md +84 -0
- package/docs/en/api.md +107 -0
- package/docs/en/architecture.md +33 -0
- package/docs/en/extensions.md +159 -0
- package/docs/en/getting-started.md +67 -0
- package/docs/en/integration.md +130 -0
- package/docs/en/modules.md +80 -0
- package/docs/en/performance.md +53 -0
- package/docs/en/plugin-packages.md +68 -0
- package/docs/en/styles.md +80 -0
- package/docs/en/syntax.md +352 -0
- package/docs/extensions.md +8 -0
- package/docs/implementation.md +8 -0
- package/docs/performance.md +8 -0
- package/docs/screenshots/blocks.png +0 -0
- package/docs/screenshots/dark.png +0 -0
- package/docs/screenshots/desktop.png +0 -0
- package/docs/screenshots/plugin-mobile.png +0 -0
- package/docs/styles.md +8 -0
- package/docs/visual-upgrade.md +8 -0
- package/docs/zh-CN/README.md +26 -0
- package/docs/zh-CN/ai-skills.md +57 -0
- package/docs/zh-CN/annotations.md +84 -0
- package/docs/zh-CN/api.md +107 -0
- package/docs/zh-CN/architecture.md +33 -0
- package/docs/zh-CN/extensions.md +159 -0
- package/docs/zh-CN/getting-started.md +67 -0
- package/docs/zh-CN/integration.md +130 -0
- package/docs/zh-CN/modules.md +80 -0
- package/docs/zh-CN/performance.md +53 -0
- package/docs/zh-CN/plugin-packages.md +68 -0
- package/docs/zh-CN/styles.md +80 -0
- package/docs/zh-CN/syntax.md +352 -0
- package/examples/assistant.tsx +52 -0
- package/examples/notes.tsx +80 -0
- package/examples/packages/paper-theme/index.css +25 -0
- package/examples/packages/paper-theme/package.json +7 -0
- package/examples/packages/reading-tools/index.d.ts +2 -0
- package/examples/packages/reading-tools/index.js +25 -0
- package/examples/packages/reading-tools/package.json +16 -0
- package/package.json +114 -3
- package/skills/limr-plugin-development/SKILL.md +22 -0
- package/skills/limr-plugin-development/agents/openai.yaml +4 -0
- package/skills/limr-plugin-development/assets/plugin-template/README.md +30 -0
- package/skills/limr-plugin-development/assets/plugin-template/package.json +36 -0
- package/skills/limr-plugin-development/assets/plugin-template/src/index.tsx +50 -0
- package/skills/limr-plugin-development/assets/plugin-template/src/styles.css +9 -0
- package/skills/limr-plugin-development/assets/plugin-template/tsconfig.json +20 -0
- package/skills/limr-plugin-development/assets/plugin-template/tsup.config.ts +8 -0
- package/skills/limr-plugin-development/references/contract.md +45 -0
- package/skills/limr-use/SKILL.md +23 -0
- package/skills/limr-use/agents/openai.yaml +4 -0
- package/skills/limr-use/references/integration.md +41 -0
- package/skills/limr-use/references/syntax.md +17 -0
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
// src/core/parser.ts
|
|
2
|
+
import { fromMarkdown } from "mdast-util-from-markdown";
|
|
3
|
+
import { mdxJsx } from "micromark-extension-mdx-jsx";
|
|
4
|
+
import { mdxJsxFromMarkdown } from "mdast-util-mdx-jsx";
|
|
5
|
+
import { directive } from "micromark-extension-directive";
|
|
6
|
+
import { directiveFromMarkdown } from "mdast-util-directive";
|
|
7
|
+
|
|
8
|
+
// src/core/tree.ts
|
|
9
|
+
function walk(node, visit, parent) {
|
|
10
|
+
visit(node, parent);
|
|
11
|
+
for (const child of node.children ?? []) walk(child, visit, node);
|
|
12
|
+
}
|
|
13
|
+
function textContent(node) {
|
|
14
|
+
if (node.type === "image") return String(node.alt ?? "");
|
|
15
|
+
return node.value ?? node.children?.map(textContent).join("") ?? "";
|
|
16
|
+
}
|
|
17
|
+
function rangeOf(node) {
|
|
18
|
+
return { start: node.position?.start.offset ?? 0, end: node.position?.end.offset ?? 0 };
|
|
19
|
+
}
|
|
20
|
+
function intersects(a, b) {
|
|
21
|
+
return a.start < b.end && b.start < a.end;
|
|
22
|
+
}
|
|
23
|
+
function lineStarts(source) {
|
|
24
|
+
const result = [0];
|
|
25
|
+
for (let i = 0; i < source.length; i++) {
|
|
26
|
+
if (source[i] === "\r") {
|
|
27
|
+
if (source[i + 1] === "\n") i++;
|
|
28
|
+
result.push(i + 1);
|
|
29
|
+
} else if (source[i] === "\n") result.push(i + 1);
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
function sourcePoint(offset, lines) {
|
|
34
|
+
let lo = 0, hi = lines.length;
|
|
35
|
+
while (lo + 1 < hi) {
|
|
36
|
+
const mid = lo + hi >>> 1;
|
|
37
|
+
if (lines[mid] <= offset) lo = mid;
|
|
38
|
+
else hi = mid;
|
|
39
|
+
}
|
|
40
|
+
return { offset, line: lo + 1, column: offset - lines[lo] + 1 };
|
|
41
|
+
}
|
|
42
|
+
function slugify(text) {
|
|
43
|
+
return text.toLowerCase().trim().replace(/[^\p{L}\p{N}\s_-]/gu, "").replace(/[\s_]+/g, "-").replace(/^-+|-+$/g, "") || "section";
|
|
44
|
+
}
|
|
45
|
+
function safeUrl(value, image = false) {
|
|
46
|
+
if (typeof value !== "string") return void 0;
|
|
47
|
+
const normalized = value.trim().replace(/[\u0000-\u0020\u007f]/g, "");
|
|
48
|
+
if (/^(?:https?:|mailto:|tel:)/i.test(normalized) || !/^[a-z][a-z\d+.-]*:/i.test(normalized)) return value;
|
|
49
|
+
if (image && /^data:image\/(?:png|gif|jpe?g|webp|avif);base64,/i.test(normalized)) return value;
|
|
50
|
+
return void 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/core/parser.ts
|
|
54
|
+
function validateExtensions(extensions) {
|
|
55
|
+
const names = /* @__PURE__ */ new Set();
|
|
56
|
+
const tags = /* @__PURE__ */ new Set();
|
|
57
|
+
const directives = /* @__PURE__ */ new Set();
|
|
58
|
+
for (const extension of extensions) {
|
|
59
|
+
if (names.has(extension.name)) throw new Error(`Duplicate LiMR extension: ${extension.name}. Use replaceExtension() to replace it explicitly.`);
|
|
60
|
+
names.add(extension.name);
|
|
61
|
+
for (const [items, known, kind] of [[extension.tags, tags, "tag"], [extension.directives, directives, "directive"]]) {
|
|
62
|
+
for (const name of items ?? []) {
|
|
63
|
+
if (known.has(name)) throw new Error(`Duplicate LiMR ${kind}: ${name}`);
|
|
64
|
+
known.add(name);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function createParser(extensions) {
|
|
70
|
+
validateExtensions(extensions);
|
|
71
|
+
const tagDefinitions = new Map(extensions.flatMap((ext) => (ext.tags ?? []).map((name) => [name, ext])));
|
|
72
|
+
const directiveDefinitions = new Map(extensions.flatMap((ext) => (ext.directives ?? []).map((name) => [name, ext])));
|
|
73
|
+
const syntax = extensions.flatMap((ext) => [...ext.micromark ?? []]);
|
|
74
|
+
const mdast = extensions.flatMap((ext) => [...ext.mdast ?? []]);
|
|
75
|
+
if (directiveDefinitions.size) {
|
|
76
|
+
syntax.push(directive());
|
|
77
|
+
mdast.push(directiveFromMarkdown());
|
|
78
|
+
}
|
|
79
|
+
const jsxSyntax = tagDefinitions.size ? [...syntax, { disable: { null: ["htmlFlow", "htmlText"] } }, mdxJsx()] : syntax;
|
|
80
|
+
const jsxMdast = tagDefinitions.size ? [...mdast, mdxJsxFromMarkdown()] : mdast;
|
|
81
|
+
return (fragment, offset, context, lines, environment = "") => {
|
|
82
|
+
const prefix = environment ? `${environment}
|
|
83
|
+
|
|
84
|
+
limr-definition-boundary
|
|
85
|
+
|
|
86
|
+
` : "";
|
|
87
|
+
const input = prefix + fragment;
|
|
88
|
+
const diagnostics = [];
|
|
89
|
+
let attributeLines;
|
|
90
|
+
const attributePoint = (at) => sourcePoint(at, lines.length ? lines : attributeLines ??= lineStarts(context.source));
|
|
91
|
+
let recoveryOffset;
|
|
92
|
+
let root;
|
|
93
|
+
try {
|
|
94
|
+
root = fromMarkdown(input, { extensions: jsxSyntax, mdastExtensions: jsxMdast });
|
|
95
|
+
} catch (error) {
|
|
96
|
+
root = fromMarkdown(input, { extensions: syntax, mdastExtensions: mdast });
|
|
97
|
+
recoveryOffset = offset;
|
|
98
|
+
diagnostics.push({ message: error instanceof Error ? error.message : String(error), offset });
|
|
99
|
+
}
|
|
100
|
+
root.children = root.children?.filter((node) => (node.position?.start.offset ?? 0) >= prefix.length);
|
|
101
|
+
if (offset || prefix.length || tagDefinitions.size || directiveDefinitions.size) walk(root, (node) => {
|
|
102
|
+
if (node.position && (offset || prefix.length)) {
|
|
103
|
+
const start = Math.max(0, node.position.start.offset - prefix.length + offset);
|
|
104
|
+
const end = Math.max(start, node.position.end.offset - prefix.length + offset);
|
|
105
|
+
node.position = { start: sourcePoint(start, lines), end: sourcePoint(end, lines) };
|
|
106
|
+
}
|
|
107
|
+
if (node.type === "mdxJsxFlowElement" || node.type === "mdxJsxTextElement") {
|
|
108
|
+
const definition = tagDefinitions.get(node.name ?? "");
|
|
109
|
+
const rawAttributes = node.attributes;
|
|
110
|
+
const attributes = {};
|
|
111
|
+
const attributeNodes = {};
|
|
112
|
+
for (const attr of rawAttributes ?? []) {
|
|
113
|
+
if (attr.type === "mdxJsxAttribute" && (typeof attr.value === "string" || attr.value === null)) {
|
|
114
|
+
attributes[attr.name] = attr.value ?? true;
|
|
115
|
+
if (definition && typeof attr.value === "string" && attr.position) {
|
|
116
|
+
const start = attr.position.start.offset - prefix.length + offset;
|
|
117
|
+
const end = attr.position.end.offset - prefix.length + offset;
|
|
118
|
+
const raw = context.source.slice(start, end), opening = raw.search(/["']/);
|
|
119
|
+
if (opening >= 0) attributeNodes[attr.name] = { type: "text", value: attr.value, verbatimEscapes: true, position: { start: attributePoint(start + opening + 1), end: attributePoint(end - 1) } };
|
|
120
|
+
}
|
|
121
|
+
} else diagnostics.push({ message: "JSX expressions are not executed. Use string attributes or pass data from React.", offset: node.position?.start.offset });
|
|
122
|
+
}
|
|
123
|
+
node.inline = definition?.display === "block" ? false : definition?.display === "inline" ? true : node.type === "mdxJsxTextElement";
|
|
124
|
+
node.type = definition ? "component" : "html";
|
|
125
|
+
node.attributes = attributes;
|
|
126
|
+
if (Object.keys(attributeNodes).length) node.attributeNodes = attributeNodes;
|
|
127
|
+
node.selection = definition?.selection ?? "content";
|
|
128
|
+
if (!definition && node.position) {
|
|
129
|
+
node.value = context.source.slice(node.position.start.offset, node.position.end.offset);
|
|
130
|
+
node.children = void 0;
|
|
131
|
+
}
|
|
132
|
+
} else if (node.type === "containerDirective" || node.type === "leafDirective" || node.type === "textDirective") {
|
|
133
|
+
const definition = directiveDefinitions.get(node.name ?? "");
|
|
134
|
+
if (definition) {
|
|
135
|
+
const start = node.position?.start.offset ?? 0;
|
|
136
|
+
const end = context.source.indexOf("\n", start);
|
|
137
|
+
const header = context.source.slice(start, end < 0 ? context.source.length : end);
|
|
138
|
+
const brace = header.indexOf("{");
|
|
139
|
+
if (brace >= 0) {
|
|
140
|
+
const attributeNodes = {};
|
|
141
|
+
const expression = /([^\s{}=]+)\s*=\s*(?:"((?:\\.|[^"\\])*)"|'((?:\\.|[^'\\])*)'|([^\s}]+))/g;
|
|
142
|
+
const raw = header.slice(brace + 1);
|
|
143
|
+
for (const match of raw.matchAll(expression)) {
|
|
144
|
+
const name = match[1], value = node.attributes?.[name];
|
|
145
|
+
if (typeof value !== "string") continue;
|
|
146
|
+
const quoted = match[2] !== void 0 || match[3] !== void 0;
|
|
147
|
+
const valueLength = (match[2] ?? match[3] ?? match[4]).length;
|
|
148
|
+
const valueEnd = start + brace + 1 + match.index + match[0].length - (quoted ? 1 : 0);
|
|
149
|
+
attributeNodes[name] = { type: "text", value, position: { start: attributePoint(valueEnd - valueLength), end: attributePoint(valueEnd) } };
|
|
150
|
+
}
|
|
151
|
+
if (Object.keys(attributeNodes).length) node.attributeNodes = attributeNodes;
|
|
152
|
+
}
|
|
153
|
+
node.inline = node.type === "textDirective";
|
|
154
|
+
node.type = "component";
|
|
155
|
+
node.selection = definition.selection ?? "content";
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
if (offset || prefix.length) root.position = { start: sourcePoint(offset, lines), end: sourcePoint(offset + fragment.length, lines) };
|
|
160
|
+
for (const extension of extensions) {
|
|
161
|
+
try {
|
|
162
|
+
extension.transform?.(root, context);
|
|
163
|
+
} catch (error) {
|
|
164
|
+
diagnostics.push({ message: error instanceof Error ? error.message : String(error), extension: extension.name });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return { nodes: root.children ?? [], diagnostics, recoveryOffset };
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// src/core/engine.ts
|
|
172
|
+
var sequence = 0;
|
|
173
|
+
var DocumentEngine = class {
|
|
174
|
+
id;
|
|
175
|
+
extensions;
|
|
176
|
+
parse;
|
|
177
|
+
snapshot;
|
|
178
|
+
nextBlock = 0;
|
|
179
|
+
listeners = /* @__PURE__ */ new Set();
|
|
180
|
+
definitionSignature = "";
|
|
181
|
+
recoveryOffset;
|
|
182
|
+
constructor(source = "", options = {}) {
|
|
183
|
+
this.id = options.id ?? `limr-${++sequence}`;
|
|
184
|
+
this.extensions = options.extensions ?? [];
|
|
185
|
+
this.parse = createParser(this.extensions);
|
|
186
|
+
this.update(source, { streaming: options.streaming });
|
|
187
|
+
}
|
|
188
|
+
getSnapshot = () => this.snapshot;
|
|
189
|
+
subscribe = (listener) => {
|
|
190
|
+
this.listeners.add(listener);
|
|
191
|
+
return () => this.listeners.delete(listener);
|
|
192
|
+
};
|
|
193
|
+
setExtensions(extensions) {
|
|
194
|
+
if (extensions === this.extensions) return;
|
|
195
|
+
this.parse = createParser(extensions);
|
|
196
|
+
this.extensions = extensions;
|
|
197
|
+
const previous = this.snapshot;
|
|
198
|
+
this.update(previous.source, { streaming: previous.streaming }, true);
|
|
199
|
+
}
|
|
200
|
+
append(chunk) {
|
|
201
|
+
return this.update(this.snapshot.source + chunk, { streaming: true });
|
|
202
|
+
}
|
|
203
|
+
finish() {
|
|
204
|
+
return this.update(this.snapshot.source, { streaming: false });
|
|
205
|
+
}
|
|
206
|
+
update(source, options = {}, force = false) {
|
|
207
|
+
const previous = this.snapshot;
|
|
208
|
+
const streaming = options.streaming ?? false;
|
|
209
|
+
if (!force && previous?.source === source && previous.streaming === streaming) return previous;
|
|
210
|
+
const globalTransform = this.extensions.some((ext) => ext.transform && ext.scope !== "local");
|
|
211
|
+
const append = !force && previous?.streaming && source.startsWith(previous.source) && !globalTransform;
|
|
212
|
+
const finalizing = !!previous?.streaming && !streaming;
|
|
213
|
+
let start = append && streaming && previous.blocks.length ? previous.blocks[previous.blocks.length - 1].range.start : 0;
|
|
214
|
+
const recovering = this.recoveryOffset !== void 0;
|
|
215
|
+
if (append && recovering) start = Math.min(start, this.recoveryOffset);
|
|
216
|
+
let reason = force || globalTransform ? "extension" : !previous ? "initial" : finalizing ? "finalize" : append ? "append" : "replace";
|
|
217
|
+
const lines = start ? lineStarts(source) : [];
|
|
218
|
+
const context = { source, streaming, documentId: this.id };
|
|
219
|
+
let retained = start ? previous.blocks.filter((block) => block.range.end <= start) : [];
|
|
220
|
+
const environment = [];
|
|
221
|
+
for (const block of retained) walk(block.node, (node) => {
|
|
222
|
+
if (node.type === "definition" || node.type === "footnoteDefinition") {
|
|
223
|
+
const range = rangeOf(node);
|
|
224
|
+
environment.push(source.slice(range.start, range.end));
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
let parsed = this.parse(source.slice(start), start, context, lines, environment.join("\n\n"));
|
|
228
|
+
const getSignature = (nodes) => {
|
|
229
|
+
const entries = [];
|
|
230
|
+
for (const node of nodes) walk(node, (child) => {
|
|
231
|
+
if (child.type === "definition" || child.type === "footnoteDefinition") {
|
|
232
|
+
const range = rangeOf(child);
|
|
233
|
+
entries.push(source.slice(range.start, range.end));
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
return entries.join("\0");
|
|
237
|
+
};
|
|
238
|
+
let signature = getSignature([...retained.map((block) => block.node), ...parsed.nodes]);
|
|
239
|
+
let parsedCharacters = source.length - start + environment.join("\n\n").length;
|
|
240
|
+
const definitionsChanged = !!previous && signature !== this.definitionSignature;
|
|
241
|
+
if (start && definitionsChanged) {
|
|
242
|
+
reason = "definitions";
|
|
243
|
+
start = 0;
|
|
244
|
+
retained = [];
|
|
245
|
+
parsed = this.parse(source, 0, context, lines);
|
|
246
|
+
signature = getSignature(parsed.nodes);
|
|
247
|
+
parsedCharacters += source.length;
|
|
248
|
+
}
|
|
249
|
+
this.definitionSignature = signature;
|
|
250
|
+
this.recoveryOffset = parsed.recoveryOffset;
|
|
251
|
+
const oldAt = new Map(previous?.blocks.map((block) => [block.range.start, block]));
|
|
252
|
+
let reused = retained.length;
|
|
253
|
+
const blocks = [...retained];
|
|
254
|
+
for (let index = 0; index < parsed.nodes.length; index++) {
|
|
255
|
+
const node = parsed.nodes[index];
|
|
256
|
+
const range = rangeOf(node);
|
|
257
|
+
const old = oldAt.get(range.start);
|
|
258
|
+
const pending = streaming && index === parsed.nodes.length - 1;
|
|
259
|
+
const reusable = !definitionsChanged && !recovering && reason === "append" && old && old.node.type === node.type && old.pending === pending && previous.source.slice(old.range.start, old.range.end) === source.slice(range.start, range.end);
|
|
260
|
+
if (reusable) {
|
|
261
|
+
blocks.push(old);
|
|
262
|
+
reused++;
|
|
263
|
+
} else blocks.push({ id: old?.id ?? `${this.id}-b${++this.nextBlock}`, node, range, pending });
|
|
264
|
+
}
|
|
265
|
+
const headings = [];
|
|
266
|
+
const definitions = /* @__PURE__ */ new Map();
|
|
267
|
+
const footnotes = /* @__PURE__ */ new Map();
|
|
268
|
+
const footnoteOrder = [];
|
|
269
|
+
const annotations = /* @__PURE__ */ new Map();
|
|
270
|
+
const occurrences = [];
|
|
271
|
+
const slugCounts = /* @__PURE__ */ new Map();
|
|
272
|
+
for (const block of blocks) walk(block.node, (node) => {
|
|
273
|
+
if (node.type === "heading") {
|
|
274
|
+
const text = textContent(node);
|
|
275
|
+
const base = slugify(text);
|
|
276
|
+
const count = slugCounts.get(base) ?? 0;
|
|
277
|
+
slugCounts.set(base, count + 1);
|
|
278
|
+
headings.push({ id: `${this.id}-${base}${count ? `-${count}` : ""}`, text, level: Number(node.depth), range: rangeOf(node), blockId: block.id });
|
|
279
|
+
}
|
|
280
|
+
if (node.type === "definition" && !definitions.has(String(node.identifier))) definitions.set(String(node.identifier), node);
|
|
281
|
+
if (node.type === "footnoteDefinition" && !footnotes.has(String(node.identifier))) footnotes.set(String(node.identifier), node);
|
|
282
|
+
if (node.type === "footnoteReference" && !footnoteOrder.includes(String(node.identifier))) footnoteOrder.push(String(node.identifier));
|
|
283
|
+
if (node.type === "annotationDefinition") {
|
|
284
|
+
const annotation = node.annotation;
|
|
285
|
+
annotations.set(annotation.id, annotation);
|
|
286
|
+
}
|
|
287
|
+
if (node.type === "annotationReference") {
|
|
288
|
+
const range = rangeOf(node);
|
|
289
|
+
occurrences.push({ id: `${this.id}-ref-${range.start}`, range, annotationIds: node.annotationIds, embedded: true });
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
this.snapshot = {
|
|
293
|
+
id: this.id,
|
|
294
|
+
revision: (previous?.revision ?? -1) + 1,
|
|
295
|
+
source,
|
|
296
|
+
streaming,
|
|
297
|
+
blocks,
|
|
298
|
+
headings: previous && headings.length === previous.headings.length && headings.every((heading, index) => {
|
|
299
|
+
const old = previous.headings[index];
|
|
300
|
+
return heading.id === old.id && heading.text === old.text && heading.level === old.level && heading.blockId === old.blockId && heading.range.start === old.range.start && heading.range.end === old.range.end;
|
|
301
|
+
}) ? previous.headings : headings,
|
|
302
|
+
definitions,
|
|
303
|
+
footnotes,
|
|
304
|
+
footnoteOrder,
|
|
305
|
+
annotations: [...annotations.values()],
|
|
306
|
+
occurrences,
|
|
307
|
+
diagnostics: parsed.diagnostics,
|
|
308
|
+
metrics: { parsedCharacters, reusedBlocks: reused, parsedBlocks: parsed.nodes.length, fullParse: start === 0, reason }
|
|
309
|
+
};
|
|
310
|
+
for (const listener of this.listeners) listener();
|
|
311
|
+
return this.snapshot;
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
function createDocument(source = "", options = {}) {
|
|
315
|
+
return new DocumentEngine(source, options);
|
|
316
|
+
}
|
|
317
|
+
function replaceExtension(extensions, replacement) {
|
|
318
|
+
const exists = extensions.some((extension) => extension.name === replacement.name);
|
|
319
|
+
return exists ? extensions.map((extension) => extension.name === replacement.name ? replacement : extension) : [...extensions, replacement];
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// src/core/selection.ts
|
|
323
|
+
import { decodeString } from "micromark-util-decode-string";
|
|
324
|
+
function mapText(source, value, range, options = {}) {
|
|
325
|
+
const raw = source.slice(range.start, range.end);
|
|
326
|
+
const starts = [], ends = [];
|
|
327
|
+
let rendered = 0, exact = true;
|
|
328
|
+
for (let at = 0; at < raw.length && rendered < value.length; ) {
|
|
329
|
+
let length = 1, decoded = raw[at];
|
|
330
|
+
if (options.escapes !== false && raw[at] === "\\" && /[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]/.test(raw[at + 1] ?? "")) {
|
|
331
|
+
length = 2;
|
|
332
|
+
decoded = raw[at + 1];
|
|
333
|
+
} else if (raw[at] === "&") {
|
|
334
|
+
const entity = /^&(?:#x[\da-f]+|#\d+|[a-z][\da-z]+);/i.exec(raw.slice(at));
|
|
335
|
+
if (entity) {
|
|
336
|
+
const result = decodeString(entity[0]);
|
|
337
|
+
if (result !== entity[0]) {
|
|
338
|
+
length = entity[0].length;
|
|
339
|
+
decoded = result;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
} else if (raw[at] === "\r") {
|
|
343
|
+
length = raw[at + 1] === "\n" ? 2 : 1;
|
|
344
|
+
decoded = "\n";
|
|
345
|
+
}
|
|
346
|
+
if (value.startsWith(decoded, rendered)) {
|
|
347
|
+
for (let unit = 0; unit < decoded.length; unit++) {
|
|
348
|
+
starts.push(range.start + at);
|
|
349
|
+
ends.push(range.start + at + length);
|
|
350
|
+
}
|
|
351
|
+
rendered += decoded.length;
|
|
352
|
+
} else if (!/[\s>]/.test(decoded)) exact = false;
|
|
353
|
+
at += length;
|
|
354
|
+
}
|
|
355
|
+
if (rendered !== value.length) exact = false;
|
|
356
|
+
while (starts.length < value.length) {
|
|
357
|
+
starts.push(range.start);
|
|
358
|
+
ends.push(range.end);
|
|
359
|
+
}
|
|
360
|
+
return { starts, ends, exact };
|
|
361
|
+
}
|
|
362
|
+
function selectionFromRange(document, raw, options = {}) {
|
|
363
|
+
const initial = { start: Math.max(0, raw.start), end: Math.min(document.source.length, raw.end) };
|
|
364
|
+
const syntax = { ...initial };
|
|
365
|
+
const containers = /* @__PURE__ */ new Set(["strong", "emphasis", "delete", "link", "linkReference", "heading", "listItem", "blockquote"]);
|
|
366
|
+
const source = document.source;
|
|
367
|
+
const whitespace = (start, end) => !source.slice(start, end).trim();
|
|
368
|
+
function expand(node) {
|
|
369
|
+
const range = rangeOf(node);
|
|
370
|
+
if (!intersects(range, syntax) || range.start >= syntax.start && range.end <= syntax.end) return;
|
|
371
|
+
node.children?.forEach(expand);
|
|
372
|
+
let content;
|
|
373
|
+
if (containers.has(node.type) && node.children?.length) {
|
|
374
|
+
content = { start: rangeOf(node.children[0]).start, end: rangeOf(node.children.at(-1)).end };
|
|
375
|
+
} else if (node.type === "inlineCode" || node.type === "inlineMath") {
|
|
376
|
+
const length = (node.type === "inlineCode" ? /^`+/ : /^\$+/).exec(source.slice(range.start, range.end))?.[0].length ?? 0;
|
|
377
|
+
content = { start: range.start + length, end: range.end - length };
|
|
378
|
+
} else if (node.type === "code" || node.type === "math") {
|
|
379
|
+
const raw2 = source.slice(range.start, range.end);
|
|
380
|
+
const opening = /^[ \t]*(`{3,}|~{3,}|\${2,})[^\r\n]*(?:\r\n|\r|\n)/.exec(raw2);
|
|
381
|
+
if (opening) {
|
|
382
|
+
const fence = opening[1];
|
|
383
|
+
const closing = /(?:\r\n|\r|\n)[ \t]*(`+|~+|\$+)[ \t]*$/.exec(raw2);
|
|
384
|
+
const closed = closing && closing[1][0] === fence[0] && closing[1].length >= fence.length;
|
|
385
|
+
content = { start: range.start + opening[0].length, end: closed ? range.start + closing.index : range.end };
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (content) {
|
|
389
|
+
if (syntax.start > range.start && syntax.start < range.end && (syntax.start <= content.start || whitespace(content.start, syntax.start))) syntax.start = range.start;
|
|
390
|
+
if (syntax.end < range.end && syntax.end > range.start && (syntax.end >= content.end || whitespace(syntax.end, content.end))) syntax.end = range.end;
|
|
391
|
+
}
|
|
392
|
+
if (node.type === "blockquote") {
|
|
393
|
+
const line = Math.max(range.start, source.lastIndexOf("\n", syntax.start - 1) + 1);
|
|
394
|
+
if (/^[ \t]*(?:>[ \t]*)+$/.test(source.slice(line, syntax.start))) syntax.start = line;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
let lo = 0, hi = document.blocks.length;
|
|
398
|
+
while (lo < hi) {
|
|
399
|
+
const mid = lo + hi >>> 1;
|
|
400
|
+
if (document.blocks[mid].range.end <= initial.start) lo = mid + 1;
|
|
401
|
+
else hi = mid;
|
|
402
|
+
}
|
|
403
|
+
const selectedBlocks = [];
|
|
404
|
+
for (let index = lo; index < document.blocks.length && document.blocks[index].range.start < initial.end; index++) {
|
|
405
|
+
const block = document.blocks[index];
|
|
406
|
+
selectedBlocks.push(block);
|
|
407
|
+
expand(block.node);
|
|
408
|
+
}
|
|
409
|
+
const blockRanges = [];
|
|
410
|
+
const blockTypes = /* @__PURE__ */ new Set(["paragraph", "heading", "code", "math", "table", "listItem", "thematicBreak", "html"]);
|
|
411
|
+
function collect(node) {
|
|
412
|
+
const range = rangeOf(node);
|
|
413
|
+
if (!intersects(range, initial)) return;
|
|
414
|
+
if (blockTypes.has(node.type) || node.type === "component" && !node.inline) {
|
|
415
|
+
blockRanges.push(range);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
node.children?.forEach(collect);
|
|
419
|
+
}
|
|
420
|
+
selectedBlocks.forEach((block) => collect(block.node));
|
|
421
|
+
const result = (ranges) => ({ ranges, sourceText: ranges.map((range) => document.source.slice(range.start, range.end)).join("\n\n") });
|
|
422
|
+
return {
|
|
423
|
+
documentId: document.id,
|
|
424
|
+
revision: document.revision,
|
|
425
|
+
text: options.text ?? document.source.slice(initial.start, initial.end),
|
|
426
|
+
quality: options.quality ?? "exact",
|
|
427
|
+
settled: options.settled ?? true,
|
|
428
|
+
raw: result([initial]),
|
|
429
|
+
syntax: result([syntax]),
|
|
430
|
+
blocks: result(blockRanges.length ? blockRanges : [initial])
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// src/core/annotations.ts
|
|
435
|
+
var defaultHighlight = { color: "#F2C744", style: "background" };
|
|
436
|
+
var sameRange = (a, b) => a.start === b.start && a.end === b.end;
|
|
437
|
+
function annotationReferenceRange(document, occurrence) {
|
|
438
|
+
if (!occurrence.embedded) return occurrence.range;
|
|
439
|
+
let reference = occurrence.range;
|
|
440
|
+
const visit = (node) => {
|
|
441
|
+
const range = rangeOf(node);
|
|
442
|
+
if (!intersects(range, occurrence.range)) return;
|
|
443
|
+
if (["paragraph", "heading", "listItem", "tableCell"].includes(node.type)) reference = range;
|
|
444
|
+
node.children?.forEach(visit);
|
|
445
|
+
};
|
|
446
|
+
for (const block of document.blocks) if (intersects(block.range, occurrence.range)) visit(block.node);
|
|
447
|
+
return reference;
|
|
448
|
+
}
|
|
449
|
+
function resolveAnnotationAnchors(annotation, document) {
|
|
450
|
+
return (annotation.anchors ?? (annotation.range ? [{ range: annotation.range }] : [])).flatMap((anchor) => {
|
|
451
|
+
if (anchor.documentId && anchor.documentId !== document.id) return [];
|
|
452
|
+
let range = anchor.range;
|
|
453
|
+
if (anchor.quote && document.source.slice(range.start, range.end) !== anchor.quote) {
|
|
454
|
+
const start = document.source.indexOf(anchor.quote);
|
|
455
|
+
if (start < 0 || document.source.indexOf(anchor.quote, start + 1) >= 0) return [];
|
|
456
|
+
range = { start, end: start + anchor.quote.length };
|
|
457
|
+
} else if (anchor.revision !== void 0 && anchor.revision !== document.revision && !anchor.quote) return [];
|
|
458
|
+
return range.start >= 0 && range.end <= document.source.length && range.start <= range.end ? [{ ...anchor, range }] : [];
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
export {
|
|
463
|
+
walk,
|
|
464
|
+
textContent,
|
|
465
|
+
rangeOf,
|
|
466
|
+
intersects,
|
|
467
|
+
safeUrl,
|
|
468
|
+
DocumentEngine,
|
|
469
|
+
createDocument,
|
|
470
|
+
replaceExtension,
|
|
471
|
+
mapText,
|
|
472
|
+
selectionFromRange,
|
|
473
|
+
defaultHighlight,
|
|
474
|
+
sameRange,
|
|
475
|
+
annotationReferenceRange,
|
|
476
|
+
resolveAnnotationAnchors
|
|
477
|
+
};
|
|
478
|
+
//# sourceMappingURL=chunk-TTISGBST.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/parser.ts","../src/core/tree.ts","../src/core/engine.ts","../src/core/selection.ts","../src/core/annotations.ts"],"sourcesContent":["import { fromMarkdown } from 'mdast-util-from-markdown';\nimport { mdxJsx } from 'micromark-extension-mdx-jsx';\nimport { mdxJsxFromMarkdown } from 'mdast-util-mdx-jsx';\nimport { directive } from 'micromark-extension-directive';\nimport { directiveFromMarkdown } from 'mdast-util-directive';\nimport { lineStarts, sourcePoint, walk } from './tree';\nimport type { Diagnostic, MarkdownNode, ParseContext, SourcePosition, SyntaxExtension } from './types';\n\nexport function validateExtensions(extensions: readonly SyntaxExtension[]): void {\n const names = new Set<string>();\n const tags = new Set<string>();\n const directives = new Set<string>();\n for (const extension of extensions) {\n if (names.has(extension.name)) throw new Error(`Duplicate LiMR extension: ${extension.name}. Use replaceExtension() to replace it explicitly.`);\n names.add(extension.name);\n for (const [items, known, kind] of [[extension.tags, tags, 'tag'], [extension.directives, directives, 'directive']] as const) {\n for (const name of items ?? []) {\n if (known.has(name)) throw new Error(`Duplicate LiMR ${kind}: ${name}`);\n known.add(name);\n }\n }\n }\n}\n\nexport function createParser(extensions: readonly SyntaxExtension[]) {\n validateExtensions(extensions);\n const tagDefinitions = new Map(extensions.flatMap(ext => (ext.tags ?? []).map(name => [name, ext] as const)));\n const directiveDefinitions = new Map(extensions.flatMap(ext => (ext.directives ?? []).map(name => [name, ext] as const)));\n const syntax = extensions.flatMap(ext => [...ext.micromark ?? []]);\n const mdast = extensions.flatMap(ext => [...ext.mdast ?? []]);\n if (directiveDefinitions.size) { syntax.push(directive()); mdast.push(directiveFromMarkdown()); }\n // CommonMark's HTML blocks otherwise swallow same-line native tag names such\n // as <figcaption>**caption**</figcaption> before the JSX adapter can see them.\n // Unknown JSX remains inert through the whitelist below; recovery keeps HTML.\n const jsxSyntax = tagDefinitions.size ? [...syntax, { disable: { null: ['htmlFlow', 'htmlText'] } }, mdxJsx()] : syntax;\n const jsxMdast = tagDefinitions.size ? [...mdast, mdxJsxFromMarkdown()] : mdast;\n\n return (fragment: string, offset: number, context: ParseContext, lines: readonly number[], environment = '') => {\n // Definitions are a parsing environment, never part of the stored source.\n // A known prefix offset is removed from EVERY node position below.\n // A neutral paragraph closes footnote containers. Without it, an indented\n // suffix can be consumed as part of a synthetic footnote definition.\n const prefix = environment ? `${environment}\\n\\nlimr-definition-boundary\\n\\n` : '';\n const input = prefix + fragment;\n const diagnostics: Diagnostic[] = [];\n let attributeLines: readonly number[] | undefined;\n const attributePoint = (at: number) => sourcePoint(at, lines.length ? lines : attributeLines ??= lineStarts(context.source));\n let recoveryOffset: number | undefined;\n let root: MarkdownNode;\n try {\n root = fromMarkdown(input, { extensions: jsxSyntax, mdastExtensions: jsxMdast }) as unknown as MarkdownNode;\n } catch (error) {\n // Incomplete JSX is common during streaming. Preserve readable Markdown,\n // treat HTML as inert source and retry the final block on the next append.\n root = fromMarkdown(input, { extensions: syntax, mdastExtensions: mdast }) as unknown as MarkdownNode;\n recoveryOffset = offset;\n diagnostics.push({ message: error instanceof Error ? error.message : String(error), offset });\n }\n root.children = root.children?.filter(node => (node.position?.start.offset ?? 0) >= prefix.length);\n if (offset || prefix.length || tagDefinitions.size || directiveDefinitions.size) walk(root, node => {\n if (node.position && (offset || prefix.length)) {\n const start = Math.max(0, node.position.start.offset - prefix.length + offset);\n const end = Math.max(start, node.position.end.offset - prefix.length + offset);\n node.position = { start: sourcePoint(start, lines), end: sourcePoint(end, lines) };\n }\n if (node.type === 'mdxJsxFlowElement' || node.type === 'mdxJsxTextElement') {\n const definition = tagDefinitions.get(node.name ?? '');\n const rawAttributes = node.attributes as unknown as { type: string; name: string; value: unknown; position?: SourcePosition }[];\n const attributes: Record<string, string | boolean | number> = {};\n const attributeNodes: Record<string, MarkdownNode> = {};\n for (const attr of rawAttributes ?? []) {\n if (attr.type === 'mdxJsxAttribute' && (typeof attr.value === 'string' || attr.value === null)) {\n attributes[attr.name] = attr.value ?? true;\n if (definition && typeof attr.value === 'string' && attr.position) {\n const start = attr.position.start.offset - prefix.length + offset;\n const end = attr.position.end.offset - prefix.length + offset;\n const raw = context.source.slice(start, end), opening = raw.search(/[\"']/);\n if (opening >= 0) attributeNodes[attr.name] = { type: 'text', value: attr.value, verbatimEscapes: true, position: { start: attributePoint(start + opening + 1), end: attributePoint(end - 1) } };\n }\n }\n else diagnostics.push({ message: 'JSX expressions are not executed. Use string attributes or pass data from React.', offset: node.position?.start.offset });\n }\n node.inline = definition?.display === 'block' ? false : definition?.display === 'inline' ? true : node.type === 'mdxJsxTextElement';\n node.type = definition ? 'component' : 'html';\n node.attributes = attributes;\n if (Object.keys(attributeNodes).length) node.attributeNodes = attributeNodes;\n node.selection = definition?.selection ?? 'content';\n if (!definition && node.position) {\n node.value = context.source.slice(node.position.start.offset, node.position.end.offset);\n node.children = undefined;\n }\n } else if (node.type === 'containerDirective' || node.type === 'leafDirective' || node.type === 'textDirective') {\n const definition = directiveDefinitions.get(node.name ?? '');\n if (definition) {\n // Directive attributes have no mdast positions. Scan only their header,\n // respecting quoted values instead of searching the rendered title.\n const start = node.position?.start.offset ?? 0;\n const end = context.source.indexOf('\\n', start);\n const header = context.source.slice(start, end < 0 ? context.source.length : end);\n const brace = header.indexOf('{');\n if (brace >= 0) {\n const attributeNodes: Record<string, MarkdownNode> = {};\n const expression = /([^\\s{}=]+)\\s*=\\s*(?:\"((?:\\\\.|[^\"\\\\])*)\"|'((?:\\\\.|[^'\\\\])*)'|([^\\s}]+))/g;\n const raw = header.slice(brace + 1);\n for (const match of raw.matchAll(expression)) {\n const name = match[1], value = node.attributes?.[name];\n if (typeof value !== 'string') continue;\n const quoted = match[2] !== undefined || match[3] !== undefined;\n const valueLength = (match[2] ?? match[3] ?? match[4]).length;\n const valueEnd = start + brace + 1 + match.index! + match[0].length - (quoted ? 1 : 0);\n attributeNodes[name] = { type: 'text', value, position: { start: attributePoint(valueEnd - valueLength), end: attributePoint(valueEnd) } };\n }\n if (Object.keys(attributeNodes).length) node.attributeNodes = attributeNodes;\n }\n node.inline = node.type === 'textDirective';\n node.type = 'component';\n node.selection = definition.selection ?? 'content';\n }\n }\n });\n if (offset || prefix.length) root.position = { start: sourcePoint(offset, lines), end: sourcePoint(offset + fragment.length, lines) };\n for (const extension of extensions) {\n try { extension.transform?.(root, context); }\n catch (error) { diagnostics.push({ message: error instanceof Error ? error.message : String(error), extension: extension.name }); }\n }\n return { nodes: root.children ?? [], diagnostics, recoveryOffset };\n };\n}\n","import type { MarkdownNode, SourcePoint, SourceRange } from './types';\n\nexport function walk(node: MarkdownNode, visit: (node: MarkdownNode, parent?: MarkdownNode) => void, parent?: MarkdownNode): void {\n visit(node, parent);\n for (const child of node.children ?? []) walk(child, visit, node);\n}\nexport function textContent(node: MarkdownNode): string {\n if (node.type === 'image') return String(node.alt ?? '');\n return node.value ?? node.children?.map(textContent).join('') ?? '';\n}\nexport function rangeOf(node: MarkdownNode): SourceRange {\n return { start: node.position?.start.offset ?? 0, end: node.position?.end.offset ?? 0 };\n}\nexport function intersects(a: SourceRange, b: SourceRange): boolean { return a.start < b.end && b.start < a.end; }\nexport function lineStarts(source: string): number[] {\n const result = [0];\n for (let i = 0; i < source.length; i++) {\n if (source[i] === '\\r') { if (source[i + 1] === '\\n') i++; result.push(i + 1); }\n else if (source[i] === '\\n') result.push(i + 1);\n }\n return result;\n}\nexport function sourcePoint(offset: number, lines: readonly number[]): SourcePoint {\n let lo = 0, hi = lines.length;\n while (lo + 1 < hi) { const mid = (lo + hi) >>> 1; if (lines[mid] <= offset) lo = mid; else hi = mid; }\n return { offset, line: lo + 1, column: offset - lines[lo] + 1 };\n}\nexport function slugify(text: string): string {\n return text.toLowerCase().trim().replace(/[^\\p{L}\\p{N}\\s_-]/gu, '').replace(/[\\s_]+/g, '-').replace(/^-+|-+$/g, '') || 'section';\n}\nexport function safeUrl(value: unknown, image = false): string | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = value.trim().replace(/[\\u0000-\\u0020\\u007f]/g, '');\n if (/^(?:https?:|mailto:|tel:)/i.test(normalized) || !/^[a-z][a-z\\d+.-]*:/i.test(normalized)) return value;\n if (image && /^data:image\\/(?:png|gif|jpe?g|webp|avif);base64,/i.test(normalized)) return value;\n return undefined;\n}\n","import { createParser } from './parser';\nimport { lineStarts, rangeOf, slugify, textContent, walk } from './tree';\nimport type { Annotation, AnnotationOccurrence, Block, DocumentMetrics, DocumentOptions, DocumentSnapshot, Heading, MarkdownNode, SyntaxExtension } from './types';\n\nlet sequence = 0;\n\n/** A synchronous, DOM-free document session. React/scroll state never enters it. */\nexport class DocumentEngine {\n readonly id: string;\n private extensions: readonly SyntaxExtension[];\n private parse: ReturnType<typeof createParser>;\n private snapshot?: DocumentSnapshot;\n private nextBlock = 0;\n private listeners = new Set<() => void>();\n private definitionSignature = '';\n private recoveryOffset: number | undefined;\n\n constructor(source = '', options: DocumentOptions = {}) {\n this.id = options.id ?? `limr-${++sequence}`;\n this.extensions = options.extensions ?? [];\n this.parse = createParser(this.extensions);\n this.update(source, { streaming: options.streaming });\n }\n\n getSnapshot = (): DocumentSnapshot => this.snapshot!;\n subscribe = (listener: () => void): (() => void) => { this.listeners.add(listener); return () => this.listeners.delete(listener); };\n\n setExtensions(extensions: readonly SyntaxExtension[]): void {\n if (extensions === this.extensions) return;\n this.parse = createParser(extensions);\n this.extensions = extensions;\n const previous = this.snapshot!;\n this.update(previous.source, { streaming: previous.streaming }, true);\n }\n\n append(chunk: string): DocumentSnapshot { return this.update(this.snapshot!.source + chunk, { streaming: true }); }\n finish(): DocumentSnapshot { return this.update(this.snapshot!.source, { streaming: false }); }\n\n update(source: string, options: { streaming?: boolean } = {}, force = false): DocumentSnapshot {\n const previous = this.snapshot;\n const streaming = options.streaming ?? false;\n if (!force && previous?.source === source && previous.streaming === streaming) return previous;\n const globalTransform = this.extensions.some(ext => ext.transform && ext.scope !== 'local');\n const append = !force && previous?.streaming && source.startsWith(previous.source) && !globalTransform;\n const finalizing = !!previous?.streaming && !streaming;\n let start = append && streaming && previous.blocks.length ? previous.blocks[previous.blocks.length - 1].range.start : 0;\n const recovering = this.recoveryOffset !== undefined;\n if (append && recovering) start = Math.min(start, this.recoveryOffset!);\n let reason: DocumentMetrics['reason'] = force || globalTransform ? 'extension' : !previous ? 'initial' : finalizing ? 'finalize' : append ? 'append' : 'replace';\n const lines = start ? lineStarts(source) : [];\n const context = { source, streaming, documentId: this.id };\n let retained = start ? previous!.blocks.filter(block => block.range.end <= start) : [];\n const environment: string[] = [];\n for (const block of retained) walk(block.node, node => {\n if (node.type === 'definition' || node.type === 'footnoteDefinition') { const range = rangeOf(node); environment.push(source.slice(range.start, range.end)); }\n });\n let parsed = this.parse(source.slice(start), start, context, lines, environment.join('\\n\\n'));\n const getSignature = (nodes: readonly MarkdownNode[]) => {\n const entries: string[] = [];\n for (const node of nodes) walk(node, child => {\n if (child.type === 'definition' || child.type === 'footnoteDefinition') { const range = rangeOf(child); entries.push(source.slice(range.start, range.end)); }\n });\n return entries.join('\\u0000');\n };\n let signature = getSignature([...retained.map(block => block.node), ...parsed.nodes]);\n let parsedCharacters = source.length - start + environment.join('\\n\\n').length;\n const definitionsChanged = !!previous && signature !== this.definitionSignature;\n if (start && definitionsChanged) {\n reason = 'definitions';\n start = 0;\n retained = [];\n parsed = this.parse(source, 0, context, lines);\n signature = getSignature(parsed.nodes);\n parsedCharacters += source.length;\n }\n this.definitionSignature = signature;\n this.recoveryOffset = parsed.recoveryOffset;\n const oldAt = new Map(previous?.blocks.map(block => [block.range.start, block]));\n let reused = retained.length;\n const blocks: Block[] = [...retained];\n for (let index = 0; index < parsed.nodes.length; index++) {\n const node = parsed.nodes[index];\n const range = rangeOf(node);\n const old = oldAt.get(range.start);\n const pending = streaming && index === parsed.nodes.length - 1;\n // Definition changes can change semantic nodes without changing their raw text.\n const reusable = !definitionsChanged && !recovering && reason === 'append' && old && old.node.type === node.type && old.pending === pending && previous!.source.slice(old.range.start, old.range.end) === source.slice(range.start, range.end);\n if (reusable) { blocks.push(old); reused++; }\n else blocks.push({ id: old?.id ?? `${this.id}-b${++this.nextBlock}`, node, range, pending });\n }\n const headings: Heading[] = [];\n const definitions = new Map<string, MarkdownNode>();\n const footnotes = new Map<string, MarkdownNode>();\n const footnoteOrder: string[] = [];\n const annotations = new Map<string, Annotation>();\n const occurrences: AnnotationOccurrence[] = [];\n const slugCounts = new Map<string, number>();\n for (const block of blocks) walk(block.node, node => {\n if (node.type === 'heading') {\n const text = textContent(node);\n const base = slugify(text);\n const count = slugCounts.get(base) ?? 0;\n slugCounts.set(base, count + 1);\n headings.push({ id: `${this.id}-${base}${count ? `-${count}` : ''}`, text, level: Number(node.depth), range: rangeOf(node), blockId: block.id });\n }\n if (node.type === 'definition' && !definitions.has(String(node.identifier))) definitions.set(String(node.identifier), node);\n if (node.type === 'footnoteDefinition' && !footnotes.has(String(node.identifier))) footnotes.set(String(node.identifier), node);\n if (node.type === 'footnoteReference' && !footnoteOrder.includes(String(node.identifier))) footnoteOrder.push(String(node.identifier));\n if (node.type === 'annotationDefinition') {\n const annotation = node.annotation as Annotation;\n annotations.set(annotation.id, annotation);\n }\n if (node.type === 'annotationReference') {\n const range = rangeOf(node);\n occurrences.push({ id: `${this.id}-ref-${range.start}`, range, annotationIds: node.annotationIds as string[], embedded: true });\n }\n });\n this.snapshot = {\n id: this.id, revision: (previous?.revision ?? -1) + 1, source, streaming,\n blocks,\n headings: previous && headings.length === previous.headings.length && headings.every((heading, index) => {\n const old = previous.headings[index];\n return heading.id === old.id && heading.text === old.text && heading.level === old.level && heading.blockId === old.blockId && heading.range.start === old.range.start && heading.range.end === old.range.end;\n }) ? previous.headings : headings,\n definitions, footnotes, footnoteOrder, annotations: [...annotations.values()], occurrences,\n diagnostics: parsed.diagnostics,\n metrics: { parsedCharacters, reusedBlocks: reused, parsedBlocks: parsed.nodes.length, fullParse: start === 0, reason },\n };\n for (const listener of this.listeners) listener();\n return this.snapshot;\n }\n}\n\nexport function createDocument(source = '', options: DocumentOptions = {}): DocumentEngine { return new DocumentEngine(source, options); }\n\nexport function replaceExtension<T extends SyntaxExtension>(extensions: readonly T[], replacement: T): T[] {\n const exists = extensions.some(extension => extension.name === replacement.name);\n return exists ? extensions.map(extension => extension.name === replacement.name ? replacement : extension) : [...extensions, replacement];\n}\n","import { decodeString } from 'micromark-util-decode-string';\nimport { intersects, rangeOf } from './tree';\nimport type { DocumentSnapshot, MarkdownNode, SelectionResult, SelectionSnapshot, SourceRange } from './types';\n\nexport interface TextMapping { starts: readonly number[]; ends: readonly number[]; exact: boolean }\n\n/** Align decoded text to original source, retaining escape/entity/CRLF boundaries. */\nexport function mapText(source: string, value: string, range: SourceRange, options: { escapes?: boolean } = {}): TextMapping {\n const raw = source.slice(range.start, range.end);\n const starts: number[] = [], ends: number[] = [];\n let rendered = 0, exact = true;\n for (let at = 0; at < raw.length && rendered < value.length;) {\n let length = 1, decoded = raw[at];\n if (options.escapes !== false && raw[at] === '\\\\' && /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/.test(raw[at + 1] ?? '')) { length = 2; decoded = raw[at + 1]; }\n else if (raw[at] === '&') {\n const entity = /^&(?:#x[\\da-f]+|#\\d+|[a-z][\\da-z]+);/i.exec(raw.slice(at));\n if (entity) { const result = decodeString(entity[0]); if (result !== entity[0]) { length = entity[0].length; decoded = result; } }\n } else if (raw[at] === '\\r') { length = raw[at + 1] === '\\n' ? 2 : 1; decoded = '\\n'; }\n if (value.startsWith(decoded, rendered)) {\n for (let unit = 0; unit < decoded.length; unit++) { starts.push(range.start + at); ends.push(range.start + at + length); }\n rendered += decoded.length;\n } else if (!/[\\s>]/.test(decoded)) exact = false;\n at += length;\n }\n if (rendered !== value.length) exact = false;\n while (starts.length < value.length) { starts.push(range.start); ends.push(range.end); }\n return { starts, ends, exact };\n}\n\nexport function selectionFromRange(document: DocumentSnapshot, raw: SourceRange, options: { text?: string; quality?: SelectionSnapshot['quality']; settled?: boolean } = {}): SelectionSnapshot {\n const initial = { start: Math.max(0, raw.start), end: Math.min(document.source.length, raw.end) };\n const syntax = { ...initial };\n const containers = new Set(['strong', 'emphasis', 'delete', 'link', 'linkReference', 'heading', 'listItem', 'blockquote']);\n const source = document.source;\n const whitespace = (start: number, end: number) => !source.slice(start, end).trim();\n // Walk boundary ancestors inside-out. Each edge absorbs only its adjacent\n // delimiter, never the unselected words inside an ancestor. Custom component\n // tags remain boundaries; their Markdown children still participate normally.\n function expand(node: MarkdownNode) {\n const range = rangeOf(node);\n if (!intersects(range, syntax) || range.start >= syntax.start && range.end <= syntax.end) return;\n node.children?.forEach(expand);\n let content: SourceRange | undefined;\n if (containers.has(node.type) && node.children?.length) {\n content = { start: rangeOf(node.children[0]).start, end: rangeOf(node.children.at(-1)!).end };\n } else if (node.type === 'inlineCode' || node.type === 'inlineMath') {\n const length = (node.type === 'inlineCode' ? /^`+/ : /^\\$+/).exec(source.slice(range.start, range.end))?.[0].length ?? 0;\n content = { start: range.start + length, end: range.end - length };\n } else if (node.type === 'code' || node.type === 'math') {\n const raw = source.slice(range.start, range.end);\n const opening = /^[ \\t]*(`{3,}|~{3,}|\\${2,})[^\\r\\n]*(?:\\r\\n|\\r|\\n)/.exec(raw);\n if (opening) {\n const fence = opening[1];\n const closing = /(?:\\r\\n|\\r|\\n)[ \\t]*(`+|~+|\\$+)[ \\t]*$/.exec(raw);\n const closed = closing && closing[1][0] === fence[0] && closing[1].length >= fence.length;\n content = { start: range.start + opening[0].length, end: closed ? range.start + closing.index : range.end };\n }\n }\n if (content) {\n if (syntax.start > range.start && syntax.start < range.end && (syntax.start <= content.start || whitespace(content.start, syntax.start))) syntax.start = range.start;\n if (syntax.end < range.end && syntax.end > range.start && (syntax.end >= content.end || whitespace(syntax.end, content.end))) syntax.end = range.end;\n }\n if (node.type === 'blockquote') {\n // Continuation lines have their own quote prefixes, independent of the\n // paragraph's first line. Do not consume earlier, unselected quote text.\n const line = Math.max(range.start, source.lastIndexOf('\\n', syntax.start - 1) + 1);\n if (/^[ \\t]*(?:>[ \\t]*)+$/.test(source.slice(line, syntax.start))) syntax.start = line;\n }\n }\n let lo = 0, hi = document.blocks.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; if (document.blocks[mid].range.end <= initial.start) lo = mid + 1; else hi = mid; }\n const selectedBlocks = [];\n for (let index = lo; index < document.blocks.length && document.blocks[index].range.start < initial.end; index++) {\n const block = document.blocks[index]; selectedBlocks.push(block); expand(block.node);\n }\n const blockRanges: SourceRange[] = [];\n const blockTypes = new Set(['paragraph', 'heading', 'code', 'math', 'table', 'listItem', 'thematicBreak', 'html']);\n function collect(node: MarkdownNode) {\n const range = rangeOf(node);\n if (!intersects(range, initial)) return;\n if (blockTypes.has(node.type) || node.type === 'component' && !node.inline) { blockRanges.push(range); return; }\n node.children?.forEach(collect);\n }\n selectedBlocks.forEach(block => collect(block.node));\n const result = (ranges: SourceRange[]): SelectionResult => ({ ranges, sourceText: ranges.map(range => document.source.slice(range.start, range.end)).join('\\n\\n') });\n return {\n documentId: document.id, revision: document.revision, text: options.text ?? document.source.slice(initial.start, initial.end),\n quality: options.quality ?? 'exact', settled: options.settled ?? true,\n raw: result([initial]), syntax: result([syntax]), blocks: result(blockRanges.length ? blockRanges : [initial]),\n };\n}\n","import type { Annotation, AnnotationAnchor, AnnotationOccurrence, DocumentSnapshot, HighlightData, MarkdownNode, SourceRange } from './types';\nimport { intersects, rangeOf } from './tree';\n\nexport const defaultHighlight: Readonly<HighlightData> = { color: '#F2C744', style: 'background' };\nexport const sameRange = (a: SourceRange, b: SourceRange) => a.start === b.start && a.end === b.end;\n\n/** Embedded references quote their nearest text block; keep the marker's own\n * range intact for source mapping, insertion and selection. */\nexport function annotationReferenceRange(document: DocumentSnapshot, occurrence: AnnotationOccurrence): SourceRange {\n if (!occurrence.embedded) return occurrence.range;\n let reference = occurrence.range;\n const visit = (node: MarkdownNode) => {\n const range = rangeOf(node);\n if (!intersects(range, occurrence.range)) return;\n if (['paragraph', 'heading', 'listItem', 'tableCell'].includes(node.type)) reference = range;\n node.children?.forEach(visit);\n };\n for (const block of document.blocks) if (intersects(block.range, occurrence.range)) visit(block.node);\n return reference;\n}\n\n/** Resolve persisted anchors once against the current source. */\nexport function resolveAnnotationAnchors(annotation: Annotation, document: DocumentSnapshot): AnnotationAnchor[] {\n return (annotation.anchors ?? (annotation.range ? [{ range: annotation.range }] : [])).flatMap(anchor => {\n if (anchor.documentId && anchor.documentId !== document.id) return [];\n let range = anchor.range;\n if (anchor.quote && document.source.slice(range.start, range.end) !== anchor.quote) {\n const start = document.source.indexOf(anchor.quote);\n if (start < 0 || document.source.indexOf(anchor.quote, start + 1) >= 0) return [];\n range = { start, end: start + anchor.quote.length };\n } else if (anchor.revision !== undefined && anchor.revision !== document.revision && !anchor.quote) return [];\n return range.start >= 0 && range.end <= document.source.length && range.start <= range.end ? [{ ...anchor, range }] : [];\n });\n}\n"],"mappings":"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","names":["raw"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-V2OG4Y3F.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { k as SourceRange, f as DocumentSnapshot, h as SelectionSnapshot, b as AnnotationOccurrence, g as HighlightData, A as Annotation, a as AnnotationAnchor, M as MarkdownNode } from '../engine-43u8B4yt.js';
|
|
2
|
+
export { B as Block, D as Diagnostic, c as DocumentEngine, d as DocumentMetrics, e as DocumentOptions, H as Heading, P as ParseContext, R as Rect, S as SelectionResult, i as SourcePoint, j as SourcePosition, l as SyntaxExtension, m as createDocument, r as replaceExtension } from '../engine-43u8B4yt.js';
|
|
3
|
+
import 'micromark-util-types';
|
|
4
|
+
import 'mdast-util-from-markdown';
|
|
5
|
+
|
|
6
|
+
interface TextMapping {
|
|
7
|
+
starts: readonly number[];
|
|
8
|
+
ends: readonly number[];
|
|
9
|
+
exact: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Align decoded text to original source, retaining escape/entity/CRLF boundaries. */
|
|
12
|
+
declare function mapText(source: string, value: string, range: SourceRange, options?: {
|
|
13
|
+
escapes?: boolean;
|
|
14
|
+
}): TextMapping;
|
|
15
|
+
declare function selectionFromRange(document: DocumentSnapshot, raw: SourceRange, options?: {
|
|
16
|
+
text?: string;
|
|
17
|
+
quality?: SelectionSnapshot['quality'];
|
|
18
|
+
settled?: boolean;
|
|
19
|
+
}): SelectionSnapshot;
|
|
20
|
+
|
|
21
|
+
/** Bounded LRU for expensive pure computations. Instances define cache isolation. */
|
|
22
|
+
declare class LruCache<K, V> {
|
|
23
|
+
readonly capacity: number;
|
|
24
|
+
private entries;
|
|
25
|
+
constructor(capacity?: number);
|
|
26
|
+
get size(): number;
|
|
27
|
+
get(key: K): V | undefined;
|
|
28
|
+
set(key: K, value: V): void;
|
|
29
|
+
delete(key: K): void;
|
|
30
|
+
clear(): void;
|
|
31
|
+
}
|
|
32
|
+
declare class ResourceCache<T = unknown> {
|
|
33
|
+
private values;
|
|
34
|
+
private pending;
|
|
35
|
+
constructor(capacity?: number);
|
|
36
|
+
acquire(key: string, loader: (signal: AbortSignal) => Promise<T>): {
|
|
37
|
+
promise: Promise<T>;
|
|
38
|
+
release: () => void;
|
|
39
|
+
};
|
|
40
|
+
invalidate(key?: string): void;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
declare const defaultHighlight: Readonly<HighlightData>;
|
|
44
|
+
declare const sameRange: (a: SourceRange, b: SourceRange) => boolean;
|
|
45
|
+
/** Embedded references quote their nearest text block; keep the marker's own
|
|
46
|
+
* range intact for source mapping, insertion and selection. */
|
|
47
|
+
declare function annotationReferenceRange(document: DocumentSnapshot, occurrence: AnnotationOccurrence): SourceRange;
|
|
48
|
+
/** Resolve persisted anchors once against the current source. */
|
|
49
|
+
declare function resolveAnnotationAnchors(annotation: Annotation, document: DocumentSnapshot): AnnotationAnchor[];
|
|
50
|
+
|
|
51
|
+
declare function walk(node: MarkdownNode, visit: (node: MarkdownNode, parent?: MarkdownNode) => void, parent?: MarkdownNode): void;
|
|
52
|
+
declare function textContent(node: MarkdownNode): string;
|
|
53
|
+
declare function rangeOf(node: MarkdownNode): SourceRange;
|
|
54
|
+
declare function intersects(a: SourceRange, b: SourceRange): boolean;
|
|
55
|
+
declare function safeUrl(value: unknown, image?: boolean): string | undefined;
|
|
56
|
+
|
|
57
|
+
export { Annotation, AnnotationAnchor, AnnotationOccurrence, DocumentSnapshot, HighlightData, LruCache, MarkdownNode, ResourceCache, SelectionSnapshot, SourceRange, type TextMapping, annotationReferenceRange, defaultHighlight, intersects, mapText, rangeOf, resolveAnnotationAnchors, safeUrl, sameRange, selectionFromRange, textContent, walk };
|