yanki 2.0.3 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/angular-html-BMgm7jKv.js +1 -0
- package/dist/bin/{angular-html-qzs4hSq7.js → angular-html-DaLgCdY4.js} +1 -1
- package/dist/bin/{angular-ts-CugMBDjk.js → angular-ts-_FOddbkN.js} +1 -1
- package/dist/{standalone/apl-B3nAIz3U.js → bin/apl-Ct_wGLTZ.js} +1 -1
- package/dist/bin/{astro-Cm_dHcy3.js → astro-ZcVfwsPl.js} +1 -1
- package/dist/bin/bird2-CFa4jX8R.js +1 -0
- package/dist/bin/{blade-U1S3oe2k.js → blade-CxETtqpr.js} +1 -1
- package/dist/bin/{bsl-0ORkkYmh.js → bsl-C-_RJCQ1.js} +1 -1
- package/dist/bin/c-24YQ-N5y.js +1 -0
- package/dist/bin/{cairo-kiUMtAsX.js → cairo-Cud9ep5K.js} +1 -1
- package/dist/bin/cli.js +941 -103
- package/dist/bin/cmake-CmanohFH.js +1 -0
- package/dist/bin/cobol-D6VccPzE.js +1 -0
- package/dist/{standalone/coffee-CWthmHqg.js → bin/coffee-C_ytDHuo.js} +1 -1
- package/dist/bin/{cpp-5C3nn41J.js → cpp-BGpKj3Ti.js} +1 -1
- package/dist/bin/cpp-BuOb9E77.js +1 -0
- package/dist/{standalone/crystal-BP8Y_JHu.js → bin/crystal-D7hCMRTO.js} +1 -1
- package/dist/bin/csharp-iOHJHJRL.js +1 -0
- package/dist/bin/css-CLlsZvz0.js +1 -0
- package/dist/bin/{css-C-sfFA03.js → css-OMa7meLh.js} +1 -1
- package/dist/bin/csv-BPqpBVRL.js +1 -0
- package/dist/bin/dart-DIQ3D60A.js +1 -0
- package/dist/bin/diff-B1zQwqWC.js +1 -0
- package/dist/bin/{edge-DetFnTa9.js → edge-BJ5yEaU_.js} +1 -1
- package/dist/{standalone/elixir-DaqZx2n-.js → bin/elixir-DQ_HZ35Z.js} +1 -1
- package/dist/bin/{elm-CD-7RX5d.js → elm-BPdX9LvI.js} +1 -1
- package/dist/bin/emacs-lisp-OLcd4D2Y.js +1 -0
- package/dist/bin/{erb-KO-P0SR0.js → erb-DTravkov.js} +1 -1
- package/dist/bin/{erlang-BFKCgnPw.js → erlang-CkFToG4V.js} +1 -1
- package/dist/bin/{fortran-fixed-form-t-oisds5.js → fortran-fixed-form-CIezU5eM.js} +1 -1
- package/dist/bin/fortran-free-form-C04P-dlU.js +1 -0
- package/dist/bin/{fsharp-Dq5iPDb2.js → fsharp-Dm-_SWJW.js} +1 -1
- package/dist/bin/{gdresource-BNzPbQHR.js → gdresource-fnofKreT.js} +1 -1
- package/dist/bin/gdscript-BtzCMxvf.js +1 -0
- package/dist/bin/gdshader-1gA3GZ5B.js +1 -0
- package/dist/bin/{git-commit-Bkc1RnxN.js → git-commit-_8RqjgP7.js} +1 -1
- package/dist/bin/{git-rebase-BfAeU5XI.js → git-rebase-Z73Q-A3B.js} +1 -1
- package/dist/bin/{glimmer-js-BZd4ZfVU.js → glimmer-js-DIMbe603.js} +1 -1
- package/dist/bin/{glimmer-ts-UFNn11p7.js → glimmer-ts-B2T7GOhV.js} +1 -1
- package/dist/bin/glsl-CGmNjIir.js +1 -0
- package/dist/bin/{glsl-r9XJn22U.js → glsl-DEYttXt8.js} +1 -1
- package/dist/bin/{go-b5i9ZOwA.js → go-Ci0dAgBY.js} +1 -1
- package/dist/bin/go-DN89cYst.js +1 -0
- package/dist/bin/{graphql-J1xs8wG6.js → graphql-CCYPSk-D.js} +1 -1
- package/dist/bin/graphql-DOCOrfKm.js +1 -0
- package/dist/bin/{hack-DTChbFem.js → hack-DZ-_iRCj.js} +1 -1
- package/dist/bin/{haml-lACpmly2.js → haml-DfH0AzHT.js} +1 -1
- package/dist/bin/haml-DvXbkT9I.js +1 -0
- package/dist/bin/{handlebars-B7ppocUa.js → handlebars-CF9TGn7D.js} +1 -1
- package/dist/bin/haxe-DTUNnskd.js +1 -0
- package/dist/bin/hlsl-BJTcBv8Y.js +1 -0
- package/dist/bin/{horizon-bright-yXhu6egb.js → horizon-bright-B9AmrisQ.js} +1 -1
- package/dist/bin/html-Cuf7VAVg.js +1 -0
- package/dist/bin/{html-JSn89dCS.js → html-RMei9Tro.js} +1 -1
- package/dist/bin/{html-derivative-DhivRM2V.js → html-derivative-BTT60mrv.js} +1 -1
- package/dist/bin/html-derivative-D-Zlk8m5.js +1 -0
- package/dist/bin/{http-CfCri10f.js → http-bTeAg4ti.js} +1 -1
- package/dist/{standalone/hurl-DLBSghyU.js → bin/hurl-DNDYXzGk.js} +1 -1
- package/dist/bin/{hxml-BY0JJAFc.js → hxml-DRC8Rsp0.js} +1 -1
- package/dist/bin/java-CQDUhPYw.js +1 -0
- package/dist/bin/javascript-DPhXM0a6.js +1 -0
- package/dist/bin/{jinja-D4pZPcl3.js → jinja-B64tWnuH.js} +1 -1
- package/dist/bin/{jison-CU_JndNM.js → jison-DzJXWpYr.js} +1 -1
- package/dist/bin/json-CJDJkUtd.js +1 -0
- package/dist/bin/jsx-nttEtUui.js +1 -0
- package/dist/bin/{julia-DjiOTm9M.js → julia-CdOV4Bps.js} +1 -1
- package/dist/bin/{just-oDTZGZbN.js → just--5xSNTPr.js} +1 -1
- package/dist/{standalone/kusto-SD8_YGH-.js → bin/kusto-CrSJ-cBg.js} +1 -1
- package/dist/bin/{latex-B8d5LcJ8.js → latex-BAAvcuYp.js} +1 -1
- package/dist/bin/less-EIhUe2O9.js +1 -0
- package/dist/bin/{liquid-DuGPT5mZ.js → liquid-Bqh7lbg7.js} +1 -1
- package/dist/bin/lua-BMcOOLRU.js +1 -0
- package/dist/bin/{lua-mUj-7rV8.js → lua-yurtT0y-.js} +1 -1
- package/dist/bin/markdown-DVKCeKaE.js +1 -0
- package/dist/bin/{marko-CEM61Zib.js → marko-R0Qz5H3f.js} +1 -1
- package/dist/bin/{mdc-Dya9Bdmr.js → mdc-K4Wa14qY.js} +1 -1
- package/dist/bin/{nextflow-hLaJXrFj.js → nextflow-BFCLGvvZ.js} +1 -1
- package/dist/bin/nextflow-groovy-BXH4qERK.js +1 -0
- package/dist/bin/nextflow-groovy-CkcyVHVG.js +1 -0
- package/dist/bin/{nginx-CR6uKwZy.js → nginx-Dbalglmi.js} +1 -1
- package/dist/bin/{nim-DceKa9Nn.js → nim-z_s042OS.js} +1 -1
- package/dist/bin/perl-2YKQo-0l.js +1 -0
- package/dist/bin/{perl-B6GAvvHF.js → perl-Fl9SoTWs.js} +1 -1
- package/dist/bin/php-Bo9TDZJt.js +1 -0
- package/dist/bin/php-C0eWpkIO.js +1 -0
- package/dist/bin/postcss-CCUr_tF-.js +1 -0
- package/dist/{standalone/pug-DJ5mt9QE.js → bin/pug-DUGDf_q9.js} +1 -1
- package/dist/bin/python-Db-ndmZZ.js +1 -0
- package/dist/{standalone/qml-BxVojlB6.js → bin/qml-CPQoc4lh.js} +1 -1
- package/dist/bin/r-fQq-2_SC.js +1 -0
- package/dist/{standalone/razor-Dp2BNdgE.js → bin/razor-DNawYG-W.js} +1 -1
- package/dist/bin/regexp-YxswBMQR.js +1 -0
- package/dist/bin/{rst-BHI_EFqA.js → rst-DYfDFbA3.js} +1 -1
- package/dist/bin/ruby-DucPskDY.js +1 -0
- package/dist/bin/ruby-WBenXl3j.js +1 -0
- package/dist/bin/{sas-Dx90SbnG.js → sas-CAA8PJ6W.js} +1 -1
- package/dist/bin/scss-DsPnGUE-.js +1 -0
- package/dist/bin/{scss-ByAjeRJP.js → scss-gssODMF6.js} +1 -1
- package/dist/bin/sdbl-xOqMdGXn.js +1 -0
- package/dist/bin/{shaderlab-8CiQ7btM.js → shaderlab-DgQHun4U.js} +1 -1
- package/dist/bin/shellscript-CE_I727X.js +1 -0
- package/dist/bin/{shellsession-xr72W2pP.js → shellsession-lr0Ayolf.js} +1 -1
- package/dist/{standalone/soy-BExHEi9F.js → bin/soy-CvtaBVSX.js} +1 -1
- package/dist/bin/{sparql-Bq74Yvwh.js → sparql-C2NKB4nB.js} +1 -1
- package/dist/bin/sql-k-FO79OG.js +1 -0
- package/dist/{standalone/stata-XyxwKkW7.js → bin/stata-CxUtssUq.js} +1 -1
- package/dist/bin/stylus-BjHmFbLS.js +1 -0
- package/dist/{standalone/surrealql-DeE9iwmm.js → bin/surrealql-UeEcHssQ.js} +1 -1
- package/dist/bin/{svelte-CHomAVJT.js → svelte-biVT5zcD.js} +1 -1
- package/dist/bin/{templ-BRBP2pJf.js → templ-BYYVc90I.js} +1 -1
- package/dist/bin/tex-C2t_GUxi.js +1 -0
- package/dist/bin/{tex-5doNg0Ig.js → tex-bdKBkGZu.js} +1 -1
- package/dist/bin/ts-tags-BfYDhMLE.js +1 -0
- package/dist/bin/tsx-BVj7RLM1.js +1 -0
- package/dist/bin/turtle-D8pw025F.js +1 -0
- package/dist/bin/{twig-D5Nfm9La.js → twig-CwzAgcmH.js} +1 -1
- package/dist/bin/typescript-DNgWo8f4.js +1 -0
- package/dist/bin/typespec-Cl5YolbG.js +1 -0
- package/dist/bin/{vue-zYUVH6uJ.js → vue-DRO7KWbH.js} +1 -1
- package/dist/bin/{vue-html-D7v7uXO6.js → vue-html-BpQ6tiBD.js} +1 -1
- package/dist/bin/{vue-vine-lH9fGYq_.js → vue-vine-BoHGuuLM.js} +1 -1
- package/dist/bin/xml-CfpLAPLz.js +1 -0
- package/dist/bin/{xml-CGrMwkeu.js → xml-DDPMLAMm.js} +1 -1
- package/dist/bin/{xsl-C-lr_lSi.js → xsl-BEetQfvy.js} +1 -1
- package/dist/bin/yaml-OQyYPsei.js +1 -0
- package/dist/lib/index.d.ts +44 -12
- package/dist/lib/index.js +324 -277
- package/dist/standalone/{angular-html-BDfh9ICS.js → angular-html-WQX9Y2mw.js} +1 -1
- package/dist/standalone/{angular-ts-WiBasIpj.js → angular-ts-Bnj08IE9.js} +1 -1
- package/dist/{bin/apl-BOFh_hoE.js → standalone/apl-Dqn1qSR2.js} +1 -1
- package/dist/standalone/{astro-C0A5Ee0R.js → astro-CQ8up1JW.js} +1 -1
- package/dist/standalone/bird2-DqiG7xuw.js +1 -0
- package/dist/standalone/{blade-Bh52-e5e.js → blade-CygzwZSe.js} +1 -1
- package/dist/standalone/{bsl-DrHuh5kR.js → bsl-BpGgGeZC.js} +1 -1
- package/dist/standalone/{cairo-D055eoAu.js → cairo-r1f5WYPg.js} +1 -1
- package/dist/standalone/cobol-B8Vke0Of.js +1 -0
- package/dist/{bin/coffee-7hoZPzSj.js → standalone/coffee-Cc6XxMHI.js} +1 -1
- package/dist/standalone/{cpp-BP_mYM2q.js → cpp-COjeSwn8.js} +1 -1
- package/dist/{bin/crystal-Cc66vuxC.js → standalone/crystal-14bSZvxG.js} +1 -1
- package/dist/standalone/{css-DZpGhzjZ.js → css-0fme0D-h.js} +1 -1
- package/dist/standalone/dart-WAvmL6i0.js +1 -0
- package/dist/standalone/{edge-C7ZV1b67.js → edge-C4RY6CZu.js} +1 -1
- package/dist/{bin/elixir-CrM98V7h.js → standalone/elixir-BpoXFRn8.js} +1 -1
- package/dist/standalone/{elm-Dop4RWjQ.js → elm-B6bFr4e_.js} +1 -1
- package/dist/standalone/emacs-lisp-BYwwOo2e.js +1 -0
- package/dist/standalone/{erb-CYhomfpC.js → erb-CJHKFDY_.js} +1 -1
- package/dist/standalone/{erlang-DX8GMz3W.js → erlang-CI6aeixR.js} +1 -1
- package/dist/standalone/{fortran-fixed-form-Q6JIc71r.js → fortran-fixed-form-uKGwTJjf.js} +1 -1
- package/dist/standalone/{fsharp-BNMUC2iW.js → fsharp-CASMX8mg.js} +1 -1
- package/dist/standalone/{gdresource-BlhCtIAh.js → gdresource-CJ9IjTdR.js} +1 -1
- package/dist/standalone/{git-commit-BmPljjxo.js → git-commit-CzSqi32T.js} +1 -1
- package/dist/standalone/{git-rebase-DVpnhtFe.js → git-rebase-8fT5ziFE.js} +1 -1
- package/dist/standalone/{glimmer-js-BxvF_2QK.js → glimmer-js-DWfa8dIU.js} +1 -1
- package/dist/standalone/{glimmer-ts-AM8hgR0M.js → glimmer-ts-DnQuWFQ4.js} +1 -1
- package/dist/standalone/{glsl-CeERM8Pu.js → glsl-BL_YD74S.js} +1 -1
- package/dist/standalone/{go-s39PxAzr.js → go-ChiWKuTz.js} +1 -1
- package/dist/standalone/{graphql-B_NxG4GM.js → graphql-Clgp8jU8.js} +1 -1
- package/dist/standalone/{hack-DOi7Q-_3.js → hack-C9FDVZ3F.js} +1 -1
- package/dist/standalone/{haml-DqnJGs3l.js → haml-Bzme-jHN.js} +1 -1
- package/dist/standalone/{handlebars-BD-GTNyX.js → handlebars-CBJ4eJ41.js} +1 -1
- package/dist/standalone/{horizon-bright-CHsP19AA.js → horizon-bright-DI78Rvup.js} +1 -1
- package/dist/standalone/{html-Dg4T4CWG.js → html-CdYAzs3O.js} +1 -1
- package/dist/standalone/{html-derivative-Dy01fcFN.js → html-derivative-CTfvg-k9.js} +1 -1
- package/dist/standalone/{http-Dcg4Y0LN.js → http-DtJ6xqmi.js} +1 -1
- package/dist/{bin/hurl-C4sIrBP8.js → standalone/hurl-DVOcDWDo.js} +1 -1
- package/dist/standalone/{hxml-CkY94ZZG.js → hxml-CUgBPRa1.js} +1 -1
- package/dist/standalone/index.d.ts +103 -36
- package/dist/standalone/index.js +865 -90
- package/dist/standalone/{jinja-rn3l-epj.js → jinja-SiVN3EPo.js} +1 -1
- package/dist/standalone/{jison-Bb1qcUQw.js → jison-Cxwzm23V.js} +1 -1
- package/dist/standalone/{julia-Bf0YFlEW.js → julia-BOYqvvvj.js} +1 -1
- package/dist/standalone/{just-CgnMO4TC.js → just-IvSacbqb.js} +1 -1
- package/dist/{bin/kusto-D9rJ_wbq.js → standalone/kusto-DD1r27tX.js} +1 -1
- package/dist/standalone/{latex-CHYOx8yi.js → latex-DGWWRHT_.js} +1 -1
- package/dist/standalone/{liquid-BTKRZY_L.js → liquid-LYfo5SDA.js} +1 -1
- package/dist/standalone/{lua-RcKjZiH7.js → lua-2gNjm8zw.js} +1 -1
- package/dist/standalone/{marko-CLH1Sh4A.js → marko-U21Fnozx.js} +1 -1
- package/dist/standalone/{mdc-C1ZFsTbz.js → mdc-C13-zRpl.js} +1 -1
- package/dist/standalone/{nextflow-CE20fCoX.js → nextflow-ClSSDbXV.js} +1 -1
- package/dist/standalone/nextflow-groovy-BmdTtAtJ.js +1 -0
- package/dist/standalone/{nginx-CJQ7hxI6.js → nginx-DphzlDyZ.js} +1 -1
- package/dist/standalone/{nim-Czafvbe4.js → nim-D01gBmZb.js} +1 -1
- package/dist/standalone/{perl-CChoGwxr.js → perl-CuZPLwLm.js} +1 -1
- package/dist/standalone/php-c2mqHOa5.js +1 -0
- package/dist/{bin/pug-F80Qp1DF.js → standalone/pug-C3IdK9Vd.js} +1 -1
- package/dist/{bin/qml-Brw1WH4u.js → standalone/qml-CGE-rgGq.js} +1 -1
- package/dist/{bin/razor-DKKN_syA.js → standalone/razor-DjuaA8CM.js} +1 -1
- package/dist/standalone/{rst-DL5K0SsC.js → rst-CYE4T0LV.js} +1 -1
- package/dist/standalone/ruby-Cs80OLeO.js +1 -0
- package/dist/standalone/{sas-CgrIRNnH.js → sas-CrQDddD2.js} +1 -1
- package/dist/standalone/{scss-B5Q0dl0C.js → scss-C9pn4GwM.js} +1 -1
- package/dist/standalone/{shaderlab-B3x1KxeX.js → shaderlab-DhVgk0F4.js} +1 -1
- package/dist/standalone/{shellsession-iw5paaXf.js → shellsession-B3JdqBVn.js} +1 -1
- package/dist/{bin/soy-Cy2jSWuh.js → standalone/soy-BezrirVf.js} +1 -1
- package/dist/standalone/{sparql-38UvPuKm.js → sparql-BVgWJlnd.js} +1 -1
- package/dist/{bin/stata-DawaFFYJ.js → standalone/stata-H0pnFm1o.js} +1 -1
- package/dist/{bin/surrealql-B1iahgCh.js → standalone/surrealql-DIXH8vKD.js} +1 -1
- package/dist/standalone/{svelte-DbSBwS6o.js → svelte-BTt1OQ0v.js} +1 -1
- package/dist/standalone/{templ-hC3Z5CVs.js → templ-BSHIRmzI.js} +1 -1
- package/dist/standalone/{tex-CpSHM71U.js → tex-BjwG_oxA.js} +1 -1
- package/dist/standalone/ts-tags-Cp9pA_As.js +1 -0
- package/dist/standalone/{twig-BGs9c0m6.js → twig-BX08EwMF.js} +1 -1
- package/dist/standalone/typespec-BM547vOZ.js +1 -0
- package/dist/standalone/{vue-HXXkW9Ol.js → vue-BRMpKK6E.js} +1 -1
- package/dist/standalone/{vue-html-DMGAGeUM.js → vue-html-BZjQbgy2.js} +1 -1
- package/dist/standalone/{vue-vine-CumWe8dY.js → vue-vine-G3wsxe4j.js} +1 -1
- package/dist/standalone/{xml-OYKGlsbQ.js → xml-D0UfBFEi.js} +1 -1
- package/dist/standalone/{xsl-B9zh_nzP.js → xsl-DB3rrNcL.js} +1 -1
- package/package.json +23 -22
- package/readme.md +12 -7
- package/dist/bin/angular-html-CAOiQ-Sh.js +0 -1
- package/dist/bin/bird2-_hZ3FStw.js +0 -1
- package/dist/bin/c-CdETmdiZ.js +0 -1
- package/dist/bin/cmake-D8YNkuR-.js +0 -1
- package/dist/bin/cobol-0fKuGiZv.js +0 -1
- package/dist/bin/cpp-gdwUInvu.js +0 -1
- package/dist/bin/csharp-CIll8D6u.js +0 -1
- package/dist/bin/css-CWs_acR3.js +0 -1
- package/dist/bin/csv-DxS-HYUf.js +0 -1
- package/dist/bin/dart-C2ROqx0Z.js +0 -1
- package/dist/bin/diff-DP2jXnqp.js +0 -1
- package/dist/bin/emacs-lisp-Cj_Ixk9i.js +0 -1
- package/dist/bin/fortran-free-form-C3X_sfp9.js +0 -1
- package/dist/bin/gdscript-bYJURCOy.js +0 -1
- package/dist/bin/gdshader-KOuf2xVk.js +0 -1
- package/dist/bin/glsl-DFAnV4bR.js +0 -1
- package/dist/bin/go-GcrXPybz.js +0 -1
- package/dist/bin/graphql-AasBDd3n.js +0 -1
- package/dist/bin/haml-Dz37fDMr.js +0 -1
- package/dist/bin/haxe-B4EsxHyL.js +0 -1
- package/dist/bin/hlsl-CxhYg9sd.js +0 -1
- package/dist/bin/html-Crjq5rc3.js +0 -1
- package/dist/bin/html-derivative-CsguVNJC.js +0 -1
- package/dist/bin/java-BGzTmoXK.js +0 -1
- package/dist/bin/javascript-DTXNtrg0.js +0 -1
- package/dist/bin/json-BadQRMks.js +0 -1
- package/dist/bin/jsx-CoE327E5.js +0 -1
- package/dist/bin/less-BrjQyxTC.js +0 -1
- package/dist/bin/lua-BTFYnP6K.js +0 -1
- package/dist/bin/markdown-dl1m7YAL.js +0 -1
- package/dist/bin/nextflow-groovy-COoKx28o.js +0 -1
- package/dist/bin/nextflow-groovy-CpiNfI-c.js +0 -1
- package/dist/bin/perl-B-LgtJc7.js +0 -1
- package/dist/bin/php-BAXKJjQn.js +0 -1
- package/dist/bin/php-D9zsHNF7.js +0 -1
- package/dist/bin/postcss-D_yqFB4d.js +0 -1
- package/dist/bin/python-BLuJ3b5I.js +0 -1
- package/dist/bin/r-1QWtk6BQ.js +0 -1
- package/dist/bin/regexp-WPJh6EdZ.js +0 -1
- package/dist/bin/ruby-DME9-fO-.js +0 -1
- package/dist/bin/ruby-Go_q6-3o.js +0 -1
- package/dist/bin/scss-D8wnyi0z.js +0 -1
- package/dist/bin/sdbl-CSGqAXn4.js +0 -1
- package/dist/bin/shellscript-DhB4mnQ-.js +0 -1
- package/dist/bin/sql-BfsqdN68.js +0 -1
- package/dist/bin/stylus-CtR9dQIO.js +0 -1
- package/dist/bin/tex-BLh5zE4g.js +0 -1
- package/dist/bin/ts-tags-C0IwWXwE.js +0 -1
- package/dist/bin/tsx-BMmbqG-q.js +0 -1
- package/dist/bin/turtle-BFrhIdAM.js +0 -1
- package/dist/bin/typescript-CPs8nV3S.js +0 -1
- package/dist/bin/typespec-CJG5em1O.js +0 -1
- package/dist/bin/xml-CCj7o04Q.js +0 -1
- package/dist/bin/yaml-Dg2Msz_B.js +0 -1
- package/dist/standalone/bird2-B05GFxQw.js +0 -1
- package/dist/standalone/cobol-C9xdim3W.js +0 -1
- package/dist/standalone/dart-CcoouBGm.js +0 -1
- package/dist/standalone/emacs-lisp-C1K9lKmb.js +0 -1
- package/dist/standalone/nextflow-groovy-Brjjw2F-.js +0 -1
- package/dist/standalone/php-BW6t2_Q8.js +0 -1
- package/dist/standalone/ruby-DuNhMjQX.js +0 -1
- package/dist/standalone/ts-tags-BiWG72vW.js +0 -1
- package/dist/standalone/typespec-oIccER07.js +0 -1
- /package/dist/bin/{actionscript-3-WtXz7Nc9.js → actionscript-3-BaFy4IUl.js} +0 -0
- /package/dist/bin/{ada-CxieIYPC.js → ada-HceTT-Hk.js} +0 -0
- /package/dist/bin/{andromeeda-CEVX-4Db.js → andromeeda-DSb5DuLX.js} +0 -0
- /package/dist/bin/{apache-zgaAodRu.js → apache-MxcCclyI.js} +0 -0
- /package/dist/bin/{apex-BNA6bSzI.js → apex-Dt1yk6kE.js} +0 -0
- /package/dist/bin/{applescript-D9ApUiQg.js → applescript-CByslqpM.js} +0 -0
- /package/dist/bin/{ara-Xn981wPy.js → ara-BM6jOAfW.js} +0 -0
- /package/dist/bin/{asciidoc-C90J3qhX.js → asciidoc-BlA3UgbV.js} +0 -0
- /package/dist/bin/{asm-Cvg1-8xg.js → asm-VlQVLZc1.js} +0 -0
- /package/dist/bin/{aurora-x-BLDZZUdf.js → aurora-x-CeJL9O0f.js} +0 -0
- /package/dist/bin/{awk-BjDw91sP.js → awk-UE5FuWyB.js} +0 -0
- /package/dist/bin/{ayu-dark-CV3szcXN.js → ayu-dark-BZ1fKSke.js} +0 -0
- /package/dist/bin/{ayu-light-VFwhcb7b.js → ayu-light-Ck_aK9Yx.js} +0 -0
- /package/dist/bin/{ayu-mirage-jd_AuG1F.js → ayu-mirage-BbZPk566.js} +0 -0
- /package/dist/bin/{ballerina-vBN0WIlg.js → ballerina-Bd4N5CqQ.js} +0 -0
- /package/dist/bin/{bat-C7p6Ubpb.js → bat-nOz1h7iR.js} +0 -0
- /package/dist/bin/{beancount-zb-3xb6T.js → beancount-DYpPd8NJ.js} +0 -0
- /package/dist/bin/{berry-B_fAwMGD.js → berry-D6DSNBWg.js} +0 -0
- /package/dist/bin/{bibtex-AJFrnpSy.js → bibtex-8WxC_vKc.js} +0 -0
- /package/dist/bin/{bicep-ZTMcEuYT.js → bicep-Dr_R0619.js} +0 -0
- /package/dist/bin/{c-DIXYfOSP.js → c-DZllpasP.js} +0 -0
- /package/dist/bin/{c3-CF_7Rl_o.js → c3-BzjQIVCp.js} +0 -0
- /package/dist/bin/{cadence-BoKQX0Lv.js → cadence-QJ1AGP7V.js} +0 -0
- /package/dist/bin/{catppuccin-frappe-CHSjY7K5.js → catppuccin-frappe-C74znM78.js} +0 -0
- /package/dist/bin/{catppuccin-latte-BIei23jc.js → catppuccin-latte-yc8K1O2M.js} +0 -0
- /package/dist/bin/{catppuccin-macchiato-stEzqrNw.js → catppuccin-macchiato-DfzJUoQE.js} +0 -0
- /package/dist/bin/{catppuccin-mocha-Csibodaz.js → catppuccin-mocha-CV-OB_YP.js} +0 -0
- /package/dist/bin/{clarity-CF2X0I3d.js → clarity-CP8m4qdU.js} +0 -0
- /package/dist/bin/{clojure-D4EmLgj3.js → clojure-Du7V1e4x.js} +0 -0
- /package/dist/bin/{cmake-BADnWbaq.js → cmake-DirU205C.js} +0 -0
- /package/dist/bin/{codeowners-CKcVmpS-.js → codeowners-C-jlmeHU.js} +0 -0
- /package/dist/bin/{codeql-aBgygx2C.js → codeql-DQHv5NBs.js} +0 -0
- /package/dist/bin/{common-lisp-C0AzPNil.js → common-lisp-BsVO-SvL.js} +0 -0
- /package/dist/bin/{coq-FNCdvNHe.js → coq-Bl0U720i.js} +0 -0
- /package/dist/bin/{csharp-2Bjq_Rxi.js → csharp-DJUgEWNf.js} +0 -0
- /package/dist/bin/{csv-BU_TMxAS.js → csv-naVBPhrS.js} +0 -0
- /package/dist/bin/{cue-DV_1hEYT.js → cue-C3D0yAYi.js} +0 -0
- /package/dist/bin/{cypher-DrvyYDIr.js → cypher-CeWowZt9.js} +0 -0
- /package/dist/bin/{d-Dly9ufdX.js → d-DYrc22cP.js} +0 -0
- /package/dist/bin/{dark-plus-B42qAV4C.js → dark-plus-Comjg6US.js} +0 -0
- /package/dist/bin/{dax-vDoOL-fx.js → dax-B0jXJO6E.js} +0 -0
- /package/dist/bin/{desktop-DoZVZZ4h.js → desktop-DW6_MitS.js} +0 -0
- /package/dist/bin/{diff-By4RszRJ.js → diff-swkNtDFu.js} +0 -0
- /package/dist/bin/{docker-Bp8c7Dqi.js → docker-otzKDcRB.js} +0 -0
- /package/dist/bin/{dotenv-CEJeNbhS.js → dotenv-DK8FyOTY.js} +0 -0
- /package/dist/bin/{dracula-soft-CMTkd8vI.js → dracula-soft-srQhJYut.js} +0 -0
- /package/dist/bin/{dracula-DmN2zRHi.js → dracula-tZpPjTpX.js} +0 -0
- /package/dist/bin/{dream-maker-D3zsoW7J.js → dream-maker-CNbVmTq1.js} +0 -0
- /package/dist/bin/{everforest-dark-C1ZUi0Ki.js → everforest-dark-Bu3gFA-8.js} +0 -0
- /package/dist/bin/{everforest-light-BiIEIFyN.js → everforest-light-Cf0fR5Ti.js} +0 -0
- /package/dist/bin/{fennel-DAD8VWfy.js → fennel-Bbo-EUQE.js} +0 -0
- /package/dist/bin/{fish-G6fwZxok.js → fish-DrrKatD-.js} +0 -0
- /package/dist/bin/{fluent-BOBTNP2g.js → fluent-BWbo2JQ_.js} +0 -0
- /package/dist/bin/{fortran-free-form-By4p5LLA.js → fortran-free-form-BqeOewcz.js} +0 -0
- /package/dist/bin/{gdscript-DF4DHgCD.js → gdscript-CQy5Em6X.js} +0 -0
- /package/dist/bin/{gdshader-BPirqxsQ.js → gdshader-DuGt6i2A.js} +0 -0
- /package/dist/bin/{genie-DHT45pJu.js → genie-BtQYZNKR.js} +0 -0
- /package/dist/bin/{gherkin-BOftJ3Qu.js → gherkin-CIadD1ZT.js} +0 -0
- /package/dist/bin/{github-dark-Dhlw38v_.js → github-dark-9m5hPMlo.js} +0 -0
- /package/dist/bin/{github-dark-default-ChurEZVr.js → github-dark-default-DlN5M7CE.js} +0 -0
- /package/dist/bin/{github-dark-dimmed-Bg8moaOR.js → github-dark-dimmed-nV3axXTC.js} +0 -0
- /package/dist/bin/{github-dark-high-contrast-BuMAw1v5.js → github-dark-high-contrast-MfTMaKuJ.js} +0 -0
- /package/dist/bin/{github-light-DUFhx0nQ.js → github-light-C9MFANg3.js} +0 -0
- /package/dist/bin/{github-light-default-DhNuYLfL.js → github-light-default-Cfefjxfr.js} +0 -0
- /package/dist/bin/{github-light-high-contrast-VDpphmUr.js → github-light-high-contrast-BW7U_oJF.js} +0 -0
- /package/dist/bin/{gleam-BQORp6Ww.js → gleam-Bnawsb2X.js} +0 -0
- /package/dist/bin/{gn-BUvkHyO2.js → gn-Bc2dAhdc.js} +0 -0
- /package/dist/bin/{gnuplot-BiNqzIdJ.js → gnuplot-X12GawsY.js} +0 -0
- /package/dist/bin/{groovy-DZM0Oins.js → groovy-eavxb_aL.js} +0 -0
- /package/dist/bin/{gruvbox-dark-hard-B0-6V_Sa.js → gruvbox-dark-hard-Ckkb-ckr.js} +0 -0
- /package/dist/bin/{gruvbox-dark-medium-B2kDYkf7.js → gruvbox-dark-medium-DveV0NZQ.js} +0 -0
- /package/dist/bin/{gruvbox-dark-soft-D80qdOIx.js → gruvbox-dark-soft-BnCoejWh.js} +0 -0
- /package/dist/bin/{gruvbox-light-hard-np83Fhw4.js → gruvbox-light-hard-alFf9nMB.js} +0 -0
- /package/dist/bin/{gruvbox-light-medium--BtU_nk6.js → gruvbox-light-medium-DXv1IAoL.js} +0 -0
- /package/dist/bin/{gruvbox-light-soft-BQQJZmHA.js → gruvbox-light-soft-DE2R_dXV.js} +0 -0
- /package/dist/bin/{haskell-ChFomDou.js → haskell-D52N8aee.js} +0 -0
- /package/dist/bin/{haxe-Bgb4tX8C.js → haxe-lcHdXErF.js} +0 -0
- /package/dist/bin/{hcl-B_oQREVc.js → hcl-CohGLpsg.js} +0 -0
- /package/dist/bin/{hjson-B6rsoOCm.js → hjson-kJZd-7Uv.js} +0 -0
- /package/dist/bin/{hlsl-Dzk9GcSJ.js → hlsl-Bed0H4CN.js} +0 -0
- /package/dist/bin/{horizon-DC2iZgoY.js → horizon-BjlQhBS5.js} +0 -0
- /package/dist/bin/{houston-CAkU4Xzv.js → houston-BRgUYlu1.js} +0 -0
- /package/dist/bin/{hy-BzSjeCAF.js → hy-ClHGi00q.js} +0 -0
- /package/dist/bin/{imba-BCVM_gFu.js → imba-BwxhzLVj.js} +0 -0
- /package/dist/bin/{ini-CK7-QP3O.js → ini-BF8qU-L3.js} +0 -0
- /package/dist/bin/{java-Dgsz0B-P.js → java-DGXJx_7v.js} +0 -0
- /package/dist/bin/{javascript-BNwJ9fBE.js → javascript-DRicMqJx.js} +0 -0
- /package/dist/bin/{json-Dttibclf.js → json-ci7zycrx.js} +0 -0
- /package/dist/bin/{json5-D-uNcxgL.js → json5-5ueAesZq.js} +0 -0
- /package/dist/bin/{jsonc-Mhn2hM5D.js → jsonc-DLUxDCmI.js} +0 -0
- /package/dist/bin/{jsonl-DEwECwXy.js → jsonl-CcfJT6c3.js} +0 -0
- /package/dist/bin/{jsonnet-aP9lctbz.js → jsonnet-BfXfyZk_.js} +0 -0
- /package/dist/bin/{jssm-Bzk9BSR5.js → jssm-CG0kgLyz.js} +0 -0
- /package/dist/bin/{jsx-YopGa7XH.js → jsx-BVfyPJhl.js} +0 -0
- /package/dist/bin/{kanagawa-dragon-DRuqSBxu.js → kanagawa-dragon-CbwGXU96.js} +0 -0
- /package/dist/bin/{kanagawa-lotus-DFk8eUao.js → kanagawa-lotus-DvItD0v_.js} +0 -0
- /package/dist/bin/{kanagawa-wave-wqQYYPW0.js → kanagawa-wave-7BIcQNHD.js} +0 -0
- /package/dist/bin/{kdl-BBdrnnFN.js → kdl-CGCQY1-0.js} +0 -0
- /package/dist/bin/{kotlin-BOAeJ3Zn.js → kotlin-Babw_olw.js} +0 -0
- /package/dist/bin/{laserwave-po4bDaOp.js → laserwave-D7dCmej9.js} +0 -0
- /package/dist/bin/{lean--6SzPv5H.js → lean-BHhNV2FE.js} +0 -0
- /package/dist/bin/{less-DRwZNTsh.js → less-CwsIRTz2.js} +0 -0
- /package/dist/bin/{light-plus-B1SMNL2F.js → light-plus-DY08IP0P.js} +0 -0
- /package/dist/bin/{llvm-7RtiJHjj.js → llvm-CnTFl-xP.js} +0 -0
- /package/dist/bin/{log-KNtIq3vN.js → log-DWm71oiG.js} +0 -0
- /package/dist/bin/{logo-BhWYf_9m.js → logo-CSNcrIVD.js} +0 -0
- /package/dist/bin/{luau-CmcVV_DK.js → luau-D1AKCLXr.js} +0 -0
- /package/dist/bin/{make-Df5gTOt9.js → make-BcNpqY4E.js} +0 -0
- /package/dist/bin/{markdown-BtUDO16i.js → markdown-BWnBsa8n.js} +0 -0
- /package/dist/bin/{material-theme-BhPjDEOe.js → material-theme-CE5_eJON.js} +0 -0
- /package/dist/bin/{material-theme-darker-LB0WiHs5.js → material-theme-darker-D9dePcxU.js} +0 -0
- /package/dist/bin/{material-theme-lighter-b9Tsrc9R.js → material-theme-lighter-mNHXfMW6.js} +0 -0
- /package/dist/bin/{material-theme-ocean-B1e0t2_i.js → material-theme-ocean-FUMkFnrk.js} +0 -0
- /package/dist/bin/{material-theme-palenight-1CdY1ykl.js → material-theme-palenight-Byjl0ziV.js} +0 -0
- /package/dist/bin/{matlab-Qa9-GHKp.js → matlab-DLY1DdfV.js} +0 -0
- /package/dist/bin/{mdx-DrGeQtwF.js → mdx-C15-rtcb.js} +0 -0
- /package/dist/bin/{mermaid-CcPTwP9f.js → mermaid-BjiOJq8q.js} +0 -0
- /package/dist/bin/{min-dark-Dujx5q9i.js → min-dark-DmJdERaK.js} +0 -0
- /package/dist/bin/{min-light-wZS1kyfV.js → min-light-QnTJyXug.js} +0 -0
- /package/dist/bin/{mipsasm-BfvsshAY.js → mipsasm-CKHxalY6.js} +0 -0
- /package/dist/bin/{mojo-C2BYzC14.js → mojo-C2AiLnrb.js} +0 -0
- /package/dist/bin/{monokai-w9z2AnJS.js → monokai-BlWWERvb.js} +0 -0
- /package/dist/bin/{moonbit-DjpzDFB5.js → moonbit-CyDpODU8.js} +0 -0
- /package/dist/bin/{move-Bxr9ef96.js → move-DCXtz79I.js} +0 -0
- /package/dist/bin/{narrat-DcRshums.js → narrat-BEsur76A.js} +0 -0
- /package/dist/bin/{night-owl-CplppJJB.js → night-owl-CQ_y355d.js} +0 -0
- /package/dist/bin/{night-owl-light-BpOQXyuL.js → night-owl-light-9on5aClC.js} +0 -0
- /package/dist/bin/{nix-CtTYb1HK.js → nix-BlkifsNW.js} +0 -0
- /package/dist/bin/{nord-hoPJ5Dy3.js → nord-CHhLQxrx.js} +0 -0
- /package/dist/bin/{nushell-Cn3fXdgH.js → nushell-CGbyWjqd.js} +0 -0
- /package/dist/bin/{objective-c-BkduaOlQ.js → objective-c-DnEgp4sH.js} +0 -0
- /package/dist/bin/{objective-cpp-Cn2j-b6G.js → objective-cpp-DA1zjGUh.js} +0 -0
- /package/dist/bin/{ocaml-DqvuWcoq.js → ocaml-XKrHblGZ.js} +0 -0
- /package/dist/bin/{odin-D7ha6-Ni.js → odin-CUQeabzv.js} +0 -0
- /package/dist/bin/{one-dark-pro-eMAAhFAk.js → one-dark-pro-CPor5xCJ.js} +0 -0
- /package/dist/bin/{one-light-CSbFTW4a.js → one-light-Cs4MmHBp.js} +0 -0
- /package/dist/bin/{open-8AenGr4K.js → open-B4GJGp_X.js} +0 -0
- /package/dist/bin/{openscad-Dy0BqjE1.js → openscad-C-pyoaHZ.js} +0 -0
- /package/dist/bin/{pascal-HLRSlJ2v.js → pascal-DTg8yr2K.js} +0 -0
- /package/dist/bin/{pkl-D0LsOQD5.js → pkl-Dmk952a-.js} +0 -0
- /package/dist/bin/{plastic-DH0ROn14.js → plastic-CKy4gKei.js} +0 -0
- /package/dist/bin/{plsql-Ckotkn8G.js → plsql-DlmRLiy4.js} +0 -0
- /package/dist/bin/{po-Qix2N2fA.js → po-nqc2dSM7.js} +0 -0
- /package/dist/bin/{poimandres-HErFvNSF.js → poimandres-BcnQgoA4.js} +0 -0
- /package/dist/bin/{polar-DHAM8Rqb.js → polar-CUas3-Ed.js} +0 -0
- /package/dist/bin/{postcss-hgbxLNuF.js → postcss-DsLOvYd_.js} +0 -0
- /package/dist/bin/{powerquery-sXjCytsm.js → powerquery-o8pQIha0.js} +0 -0
- /package/dist/bin/{powershell-Br9y9LlC.js → powershell-DnB_d8z7.js} +0 -0
- /package/dist/bin/{prisma-COBUUaqE.js → prisma-BhG3Ia_M.js} +0 -0
- /package/dist/bin/{prolog-BbJTvtA-.js → prolog-CxNOQvhU.js} +0 -0
- /package/dist/bin/{proto-DiR3FLO1.js → proto-CxYQsozc.js} +0 -0
- /package/dist/bin/{puppet-CNdK406T.js → puppet-CYAa5kR2.js} +0 -0
- /package/dist/bin/{purescript-Cgw06S43.js → purescript-CN27zoMM.js} +0 -0
- /package/dist/bin/{python-DRu0B6X_.js → python-DAHUwdu1.js} +0 -0
- /package/dist/bin/{qmldir-tOWyMniz.js → qmldir-DK51keAu.js} +0 -0
- /package/dist/bin/{qss-CQ_tB_vx.js → qss-Dz7u-rR1.js} +0 -0
- /package/dist/bin/{r-CeXuGenk.js → r-CqHWlSSM.js} +0 -0
- /package/dist/bin/{racket-xM_JlWdJ.js → racket-COiCIaTN.js} +0 -0
- /package/dist/bin/{raku-CsjbV0q-.js → raku-0kOHw_dw.js} +0 -0
- /package/dist/bin/{red-2s42RJtx.js → red-m6Euu7mt.js} +0 -0
- /package/dist/bin/{reg-CDO-JwKW.js → reg-qVlCOoBm.js} +0 -0
- /package/dist/bin/{regexp-Aby82bH7.js → regexp-D7f8yhPZ.js} +0 -0
- /package/dist/bin/{rel-Lnk3efq_.js → rel-CWou97ke.js} +0 -0
- /package/dist/bin/{riscv-B6rT4cSG.js → riscv-DsFkdmj1.js} +0 -0
- /package/dist/bin/{ron-BiBOkEWn.js → ron-BiFFIB8X.js} +0 -0
- /package/dist/bin/{rose-pine-CxwcSun-.js → rose-pine-P4OLTmk8.js} +0 -0
- /package/dist/bin/{rose-pine-dawn-DkCSMZNl.js → rose-pine-dawn-Bjp9OAsX.js} +0 -0
- /package/dist/bin/{rose-pine-moon-CRcpU7ID.js → rose-pine-moon-BDOjeUMF.js} +0 -0
- /package/dist/bin/{rosmsg-_EpaFX4E.js → rosmsg-C8-G6Zy3.js} +0 -0
- /package/dist/bin/{rust-Dzeg0wAa.js → rust-8VLxkvbI.js} +0 -0
- /package/dist/bin/{sass-CfSmloHa.js → sass-CAZlzDYO.js} +0 -0
- /package/dist/bin/{scala-BzM4CFnq.js → scala-CNeLcgeU.js} +0 -0
- /package/dist/bin/{scheme-BqJLyHNb.js → scheme-DM0dV7X-.js} +0 -0
- /package/dist/bin/{sdbl-CVVKgb7O.js → sdbl-D91Q0-P-.js} +0 -0
- /package/dist/bin/{shellscript-CED9H1ao.js → shellscript-C3cZBHq3.js} +0 -0
- /package/dist/bin/{slack-dark-BLjlSbC0.js → slack-dark-D3icvwba.js} +0 -0
- /package/dist/bin/{slack-ochin-BeSJq7AY.js → slack-ochin-HRbhvypv.js} +0 -0
- /package/dist/bin/{smalltalk-DrKePzpE.js → smalltalk-CaV7xkpe.js} +0 -0
- /package/dist/bin/{snazzy-light-hGizAcbG.js → snazzy-light-DH6eOZ8E.js} +0 -0
- /package/dist/bin/{solarized-dark-B47oUJnZ.js → solarized-dark-CyUppETu.js} +0 -0
- /package/dist/bin/{solarized-light-COfgMzjY.js → solarized-light-CUG32Y3B.js} +0 -0
- /package/dist/bin/{solidity-93cGmCAT.js → solidity-CUUGhfh7.js} +0 -0
- /package/dist/bin/{splunk-C1Hlgf0c.js → splunk-D3BNLPbA.js} +0 -0
- /package/dist/bin/{sql-CWYhyc-w.js → sql-BBjVgCWI.js} +0 -0
- /package/dist/bin/{ssh-config-mSCJO_Nw.js → ssh-config-DSA-oRqW.js} +0 -0
- /package/dist/bin/{stylus-Dxd5rS5f.js → stylus-B8GmhT3T.js} +0 -0
- /package/dist/bin/{swift-CmhdkGbJ.js → swift-B3Og23RF.js} +0 -0
- /package/dist/bin/{synthwave-84-C8lHUQgz.js → synthwave-84-BQqBrmUY.js} +0 -0
- /package/dist/bin/{system-verilog-C5NPuZ4w.js → system-verilog-lZv4orfV.js} +0 -0
- /package/dist/bin/{systemd-DWf13jtC.js → systemd-C_lHKyyv.js} +0 -0
- /package/dist/bin/{talonscript-BHUwvink.js → talonscript-BgSK8iKj.js} +0 -0
- /package/dist/bin/{tasl-BqepUa6R.js → tasl-CfJEvNyg.js} +0 -0
- /package/dist/bin/{tcl-Cq_3s_LD.js → tcl-_6WfXxa8.js} +0 -0
- /package/dist/bin/{terraform-CJUb39F2.js → terraform-CvaKdwhe.js} +0 -0
- /package/dist/bin/{tokyo-night-DToTZO1M.js → tokyo-night-Dxn9nxCt.js} +0 -0
- /package/dist/bin/{toml-CcAy-xez.js → toml-C2IeULXW.js} +0 -0
- /package/dist/bin/{tsv-2LD76W9Y.js → tsv-upWrMxDX.js} +0 -0
- /package/dist/bin/{tsx-BTd5Sf56.js → tsx-CqFEeXnl.js} +0 -0
- /package/dist/bin/{turtle-D-xcuGf_.js → turtle-OfMAFnDU.js} +0 -0
- /package/dist/bin/{typescript-DcBfMx29.js → typescript-QhLgbiI3.js} +0 -0
- /package/dist/bin/{typst-CdguKrlh.js → typst-B0bxD-3R.js} +0 -0
- /package/dist/bin/{v-VnqxfSIy.js → v-DgtEGhmc.js} +0 -0
- /package/dist/bin/{vala-CPlxddOG.js → vala-X9RAnsG9.js} +0 -0
- /package/dist/bin/{vb-Do7lrS7D.js → vb-B8fi0ef3.js} +0 -0
- /package/dist/bin/{verilog-OGZUphCy.js → verilog-9KNl_vs0.js} +0 -0
- /package/dist/bin/{vesper-D6bcMq-9.js → vesper-BUDildQy.js} +0 -0
- /package/dist/bin/{vhdl-vQqxP3uc.js → vhdl-Ex4Tk_Q4.js} +0 -0
- /package/dist/bin/{viml-CRzBk174.js → viml-9TyT6AIR.js} +0 -0
- /package/dist/bin/{vitesse-black-DZPzP4WR.js → vitesse-black-BLDFwo2e.js} +0 -0
- /package/dist/bin/{vitesse-dark-Dn_i46a6.js → vitesse-dark-B7cKn6BQ.js} +0 -0
- /package/dist/bin/{vitesse-light-BYktrL59.js → vitesse-light-Cxpku45l.js} +0 -0
- /package/dist/bin/{vyper-CxG5w_hf.js → vyper-DlDvdFHA.js} +0 -0
- /package/dist/bin/{wasm-DfcgBtd_.js → wasm-BJM1CVhc.js} +0 -0
- /package/dist/bin/{wasm-C2OXzu0D.js → wasm-CgH-dZ_Q.js} +0 -0
- /package/dist/bin/{wenyan-CeYhWKkN.js → wenyan-cHQHBRol.js} +0 -0
- /package/dist/bin/{wgsl-gGAb2oSq.js → wgsl-BGXNRVfe.js} +0 -0
- /package/dist/bin/{wikitext-BNkXva03.js → wikitext-B_NAdate.js} +0 -0
- /package/dist/bin/{wit-snpmR1aT.js → wit-DpEeRzSj.js} +0 -0
- /package/dist/bin/{wolfram-BUWAXgpt.js → wolfram-FezxoFHC.js} +0 -0
- /package/dist/bin/{yaml-Brl8JesV.js → yaml-IgZurznZ.js} +0 -0
- /package/dist/bin/{zenscript-DAB1FI6O.js → zenscript-BSSNIKM2.js} +0 -0
- /package/dist/bin/{zig-DZTxXyCC.js → zig-DO_pxwRi.js} +0 -0
- /package/dist/standalone/{actionscript-3-WtXz7Nc9.js → actionscript-3-BaFy4IUl.js} +0 -0
- /package/dist/standalone/{ada-CxieIYPC.js → ada-HceTT-Hk.js} +0 -0
- /package/dist/standalone/{andromeeda-BylpTWnC.js → andromeeda-Drn3I52d.js} +0 -0
- /package/dist/standalone/{apache-zgaAodRu.js → apache-UvT67k7r.js} +0 -0
- /package/dist/standalone/{apex-BNA6bSzI.js → apex-C-zVKAtI.js} +0 -0
- /package/dist/standalone/{applescript-D9ApUiQg.js → applescript-CUUTxpqG.js} +0 -0
- /package/dist/standalone/{ara-Xn981wPy.js → ara-DXe565Eb.js} +0 -0
- /package/dist/standalone/{asciidoc-C90J3qhX.js → asciidoc-y8iYfg5t.js} +0 -0
- /package/dist/standalone/{asm-Cvg1-8xg.js → asm-FONT_MzT.js} +0 -0
- /package/dist/standalone/{aurora-x-z2QLMo08.js → aurora-x-CbSRhEG_.js} +0 -0
- /package/dist/standalone/{awk-L1WqJyjl.js → awk-C1Xf3NCS.js} +0 -0
- /package/dist/standalone/{ayu-dark-DFAYKmY8.js → ayu-dark-DUKhGG9M.js} +0 -0
- /package/dist/standalone/{ayu-light-ChPCIrww.js → ayu-light-zq1IImlB.js} +0 -0
- /package/dist/standalone/{ayu-mirage-Be8UDvXu.js → ayu-mirage-C0t0AhQz.js} +0 -0
- /package/dist/standalone/{ballerina-DOw61Yuq.js → ballerina-CtqZ90g_.js} +0 -0
- /package/dist/standalone/{bat-BJGaXoOz.js → bat-u_XFPZwF.js} +0 -0
- /package/dist/standalone/{beancount-Cu6FxzuA.js → beancount-gCaRbBDP.js} +0 -0
- /package/dist/standalone/{berry-DiPZpURY.js → berry-v4FqJ4ET.js} +0 -0
- /package/dist/standalone/{bibtex-Dp74FGRo.js → bibtex-6NwGpUZD.js} +0 -0
- /package/dist/standalone/{bicep-BwSAodHP.js → bicep-CA2puXK8.js} +0 -0
- /package/dist/standalone/{c-C-hboKX2.js → c-CUtwC4Mj.js} +0 -0
- /package/dist/standalone/{c3-BS3NJrFe.js → c3-Ce3JALMQ.js} +0 -0
- /package/dist/standalone/{cadence-DKUaB06W.js → cadence-bRc3mSPd.js} +0 -0
- /package/dist/standalone/{catppuccin-frappe-Dq9QR7eZ.js → catppuccin-frappe-Ck2c3Ir7.js} +0 -0
- /package/dist/standalone/{catppuccin-latte-yUwHFQst.js → catppuccin-latte-vbplB5Zo.js} +0 -0
- /package/dist/standalone/{catppuccin-macchiato-KYmbHQyq.js → catppuccin-macchiato-Bl8WMzwO.js} +0 -0
- /package/dist/standalone/{catppuccin-mocha-DFrUhns1.js → catppuccin-mocha-kN0Ta6g1.js} +0 -0
- /package/dist/standalone/{clarity-DKB_EYUy.js → clarity-BFCwqYZP.js} +0 -0
- /package/dist/standalone/{clojure-D7D2Zxsu.js → clojure-VpUVxvc9.js} +0 -0
- /package/dist/standalone/{cmake-Bju7ahwU.js → cmake-C9OlSQmP.js} +0 -0
- /package/dist/standalone/{codeowners-Di1OvpcW.js → codeowners-BRS2WD7U.js} +0 -0
- /package/dist/standalone/{codeql-KhL_IfCA.js → codeql-Bbt3c-53.js} +0 -0
- /package/dist/standalone/{common-lisp-DL0ShAR3.js → common-lisp-BvU0WGaz.js} +0 -0
- /package/dist/standalone/{coq-YuXzTVD8.js → coq-CYNX735i.js} +0 -0
- /package/dist/standalone/{csharp-X4m7dqIW.js → csharp-DEz-wF3L.js} +0 -0
- /package/dist/standalone/{csv-D_FJD-_L.js → csv-CwVLIGRx.js} +0 -0
- /package/dist/standalone/{cue-Brrvnugl.js → cue-BAFnez9U.js} +0 -0
- /package/dist/standalone/{cypher-CieA2-Ow.js → cypher-ByMDbfJE.js} +0 -0
- /package/dist/standalone/{d-BeWU-E1F.js → d-Bj_XxJbi.js} +0 -0
- /package/dist/standalone/{dark-plus-t8phC8vs.js → dark-plus-BxwPW2PO.js} +0 -0
- /package/dist/standalone/{dax-DZs9015r.js → dax-CN15Ir6v.js} +0 -0
- /package/dist/standalone/{desktop-Bmf3DIqD.js → desktop-Blw5nWNd.js} +0 -0
- /package/dist/standalone/{diff-M4XuV4o4.js → diff-DnSAa7YV.js} +0 -0
- /package/dist/standalone/{docker-Bf7rtiym.js → docker-CrBT4uQ5.js} +0 -0
- /package/dist/standalone/{dotenv-BwfGDw9z.js → dotenv-B3TKMiE2.js} +0 -0
- /package/dist/standalone/{dracula-__iKjS5Q.js → dracula-DDAawnm1.js} +0 -0
- /package/dist/standalone/{dracula-soft-Cn3YGlZ1.js → dracula-soft-B6l93y6r.js} +0 -0
- /package/dist/standalone/{dream-maker-BOxs3X-U.js → dream-maker-0xoAwu9F.js} +0 -0
- /package/dist/standalone/{everforest-dark-CG-xS58q.js → everforest-dark-uqvKxCLa.js} +0 -0
- /package/dist/standalone/{everforest-light-VnlgGH1r.js → everforest-light-Bgi4okNs.js} +0 -0
- /package/dist/standalone/{fennel-Bkp2zi6e.js → fennel-CDz99RXZ.js} +0 -0
- /package/dist/standalone/{fish-BSydEoPu.js → fish-BWVO9Ijr.js} +0 -0
- /package/dist/standalone/{fluent-CdeSNonp.js → fluent-SYyPuB0x.js} +0 -0
- /package/dist/standalone/{fortran-free-form-uMmrusbk.js → fortran-free-form-Cvm5N8AW.js} +0 -0
- /package/dist/standalone/{gdscript-CjXE_VF4.js → gdscript-DVPR-jwA.js} +0 -0
- /package/dist/standalone/{gdshader-D3GnIQMO.js → gdshader-DKg6VZob.js} +0 -0
- /package/dist/standalone/{genie-DjRp0HIF.js → genie-CnxW4Aei.js} +0 -0
- /package/dist/standalone/{gherkin-CO-9Xf3O.js → gherkin-Ba85ScdA.js} +0 -0
- /package/dist/standalone/{github-dark-DW2tvKKC.js → github-dark-CUBA-q-0.js} +0 -0
- /package/dist/standalone/{github-dark-default-ChsP8enW.js → github-dark-default-C6xZFMUm.js} +0 -0
- /package/dist/standalone/{github-dark-dimmed-DbObBUjn.js → github-dark-dimmed-BrWMwSTm.js} +0 -0
- /package/dist/standalone/{github-dark-high-contrast-DGQlFkmA.js → github-dark-high-contrast-BwsS_67p.js} +0 -0
- /package/dist/standalone/{github-light-JgN_--pJ.js → github-light-C3_GirKd.js} +0 -0
- /package/dist/standalone/{github-light-default-Dyse0wyU.js → github-light-default-DSvSOSFj.js} +0 -0
- /package/dist/standalone/{github-light-high-contrast-CeZ5HGZn.js → github-light-high-contrast-D-cuyaxK.js} +0 -0
- /package/dist/standalone/{gleam-BIhdqQ3b.js → gleam-BK_CIoct.js} +0 -0
- /package/dist/standalone/{gn--jXLY5_N.js → gn-C_iz9Wbo.js} +0 -0
- /package/dist/standalone/{gnuplot-Bxet1c3v.js → gnuplot-DXHAMx9j.js} +0 -0
- /package/dist/standalone/{groovy-CzT_Iae7.js → groovy-CPhve-3q.js} +0 -0
- /package/dist/standalone/{gruvbox-dark-hard-C1uR-pvB.js → gruvbox-dark-hard-DwraziE-.js} +0 -0
- /package/dist/standalone/{gruvbox-dark-medium-C_NCtEMg.js → gruvbox-dark-medium-tN06WFx5.js} +0 -0
- /package/dist/standalone/{gruvbox-dark-soft-DbASFM7u.js → gruvbox-dark-soft-BRDrk-Jk.js} +0 -0
- /package/dist/standalone/{gruvbox-light-hard-BisBk_cZ.js → gruvbox-light-hard-BUtBEr5w.js} +0 -0
- /package/dist/standalone/{gruvbox-light-medium-Cqf5GdYM.js → gruvbox-light-medium-BDydPOJI.js} +0 -0
- /package/dist/standalone/{gruvbox-light-soft-R3xWeYua.js → gruvbox-light-soft-B6sZTVCC.js} +0 -0
- /package/dist/standalone/{haskell-BU_KScmc.js → haskell-BZidAwBv.js} +0 -0
- /package/dist/standalone/{haxe-Dq20ysgQ.js → haxe-7LrSSm24.js} +0 -0
- /package/dist/standalone/{hcl-C-NSNXCz.js → hcl-B89HlRT6.js} +0 -0
- /package/dist/standalone/{hjson-C1slXyS7.js → hjson--1iec2mk.js} +0 -0
- /package/dist/standalone/{hlsl-nviGPNKF.js → hlsl-ys6eD8k3.js} +0 -0
- /package/dist/standalone/{horizon-pIEktodb.js → horizon-DHDEy49h.js} +0 -0
- /package/dist/standalone/{houston-DM-vL-Qy.js → houston-C2UUgkcj.js} +0 -0
- /package/dist/standalone/{hy-CNbyPkG-.js → hy-DfDp0LOu.js} +0 -0
- /package/dist/standalone/{imba-C3JgZFAu.js → imba-5rlinXsS.js} +0 -0
- /package/dist/standalone/{ini-CnSxfbfK.js → ini-Dvl7p4fh.js} +0 -0
- /package/dist/standalone/{java-CzlXKE3t.js → java-De0U3342.js} +0 -0
- /package/dist/standalone/{javascript-FKiEkpOl.js → javascript-CnBrVnUh.js} +0 -0
- /package/dist/standalone/{json-E5qb7BD2.js → json-DW5QMcCj.js} +0 -0
- /package/dist/standalone/{json5-BlfBFW_Y.js → json5-B92atw3l.js} +0 -0
- /package/dist/standalone/{jsonc-BRJexVfP.js → jsonc-BQ8btgHR.js} +0 -0
- /package/dist/standalone/{jsonl-D859SsoH.js → jsonl-Sr_oGeX-.js} +0 -0
- /package/dist/standalone/{jsonnet-sFIVPoTa.js → jsonnet-CLmJlxUC.js} +0 -0
- /package/dist/standalone/{jssm-BKvxMEP9.js → jssm-DnM8i8ut.js} +0 -0
- /package/dist/standalone/{jsx-D6UqkuWx.js → jsx-BLpri0NB.js} +0 -0
- /package/dist/standalone/{kanagawa-dragon-BVeOdnTJ.js → kanagawa-dragon-Rl17Vq_C.js} +0 -0
- /package/dist/standalone/{kanagawa-lotus-BPxif4UL.js → kanagawa-lotus-CEfzoMAY.js} +0 -0
- /package/dist/standalone/{kanagawa-wave-yTBcVIG8.js → kanagawa-wave-Dl5jL6TY.js} +0 -0
- /package/dist/standalone/{kdl-DHueRo8f.js → kdl-ByebaTOR.js} +0 -0
- /package/dist/standalone/{kotlin-Dq1wwHQP.js → kotlin-CO_7ebqK.js} +0 -0
- /package/dist/standalone/{laserwave-x5LKCxGn.js → laserwave-BymGJYS7.js} +0 -0
- /package/dist/standalone/{lean-xWP4NbYS.js → lean-D7q_Kpgv.js} +0 -0
- /package/dist/standalone/{less-To8q_Luw.js → less-DfGpr34i.js} +0 -0
- /package/dist/standalone/{light-plus-B9N5DQI_.js → light-plus-rCHX6NNy.js} +0 -0
- /package/dist/standalone/{llvm-DSlzjbDz.js → llvm-DI83sH5G.js} +0 -0
- /package/dist/standalone/{log-BUZNzUKc.js → log-GjieA_Fi.js} +0 -0
- /package/dist/standalone/{logo-Cdvy4UIe.js → logo-Z-Po9cqr.js} +0 -0
- /package/dist/standalone/{luau-ChD5_OIQ.js → luau-CHFvY7vV.js} +0 -0
- /package/dist/standalone/{make-PTqunrmv.js → make-pEFeZerG.js} +0 -0
- /package/dist/standalone/{markdown-tUO1dt9m.js → markdown-BLxfK9DH.js} +0 -0
- /package/dist/standalone/{material-theme-CZJ_pRWf.js → material-theme-_mO8dGF4.js} +0 -0
- /package/dist/standalone/{material-theme-darker-NnzT0yiw.js → material-theme-darker-CW8WbBMR.js} +0 -0
- /package/dist/standalone/{material-theme-lighter-B-3DgVxS.js → material-theme-lighter-DWGtW3Sj.js} +0 -0
- /package/dist/standalone/{material-theme-ocean-BZZHghfO.js → material-theme-ocean-VhkfqVVF.js} +0 -0
- /package/dist/standalone/{material-theme-palenight-B9O9JO4H.js → material-theme-palenight-cApQ4-KF.js} +0 -0
- /package/dist/standalone/{matlab-Co_sDlVB.js → matlab-L7fpDsTl.js} +0 -0
- /package/dist/standalone/{mdx-B4AGJXox.js → mdx-G_CG82jO.js} +0 -0
- /package/dist/standalone/{mermaid-4pySd3sl.js → mermaid-QCKf3Ptj.js} +0 -0
- /package/dist/standalone/{min-dark-DSigFwoh.js → min-dark-C7ciBb2i.js} +0 -0
- /package/dist/standalone/{min-light-b8nqGai7.js → min-light-DC6qyE0O.js} +0 -0
- /package/dist/standalone/{mipsasm-DbZprEQm.js → mipsasm-Ch_J_goG.js} +0 -0
- /package/dist/standalone/{mojo-4kIBaoam.js → mojo-BUTjyOde.js} +0 -0
- /package/dist/standalone/{monokai-BKSWoNnW.js → monokai-D99JixW5.js} +0 -0
- /package/dist/standalone/{moonbit-ZcSH7VpN.js → moonbit-v_Wmuq4r.js} +0 -0
- /package/dist/standalone/{move-BAMKTWoZ.js → move-CujRAOrk.js} +0 -0
- /package/dist/standalone/{narrat-DYLRa4xG.js → narrat-BUFChaaW.js} +0 -0
- /package/dist/standalone/{night-owl-light-fbFrWwTF.js → night-owl-light-ZvY_o4AV.js} +0 -0
- /package/dist/standalone/{night-owl-BtS72I6-.js → night-owl-zFbR0iUq.js} +0 -0
- /package/dist/standalone/{nix-DlQjHQ1N.js → nix-DVHO39rw.js} +0 -0
- /package/dist/standalone/{nord-Kzx5CafP.js → nord-CSYW7zq7.js} +0 -0
- /package/dist/standalone/{nushell-B04C_1w9.js → nushell-wvafmaI1.js} +0 -0
- /package/dist/standalone/{objective-c-DO0dC44X.js → objective-c-BJMjPSKt.js} +0 -0
- /package/dist/standalone/{objective-cpp-C6jZz_vb.js → objective-cpp-COwkzZNW.js} +0 -0
- /package/dist/standalone/{ocaml-D9wp3EJd.js → ocaml-BugjlZwQ.js} +0 -0
- /package/dist/standalone/{odin-u5wG6Qd6.js → odin-BbI_ip3y.js} +0 -0
- /package/dist/standalone/{one-dark-pro-x1jnl7Dq.js → one-dark-pro-O7XwserV.js} +0 -0
- /package/dist/standalone/{one-light-CHHJSb-V.js → one-light-Bv2B3pGW.js} +0 -0
- /package/dist/standalone/{open-CGQvvIUq.js → open-BpEGCZtV.js} +0 -0
- /package/dist/standalone/{openscad-H5hW1BA6.js → openscad-CYP3kDCW.js} +0 -0
- /package/dist/standalone/{pascal-h7T9h7AG.js → pascal-DzRWzYc7.js} +0 -0
- /package/dist/standalone/{pkl-Bs_8OmWM.js → pkl-Csk3Pz3F.js} +0 -0
- /package/dist/standalone/{plastic-MRrPKBd1.js → plastic-B8sPQcwq.js} +0 -0
- /package/dist/standalone/{plsql-BrbZPaQW.js → plsql-DHpuTJ3X.js} +0 -0
- /package/dist/standalone/{po-Diz0LmjW.js → po-BlTn26iX.js} +0 -0
- /package/dist/standalone/{poimandres-D3Al1iQC.js → poimandres-Nn-UO8qp.js} +0 -0
- /package/dist/standalone/{polar-BCwHILUV.js → polar-DEMP0iHG.js} +0 -0
- /package/dist/standalone/{postcss-D6Lmyt9A.js → postcss-B3SVlKZw.js} +0 -0
- /package/dist/standalone/{powerquery-CQr4BVoo.js → powerquery-DuUdfu4q.js} +0 -0
- /package/dist/standalone/{powershell-B6zzL9QO.js → powershell-CB3_ElnE.js} +0 -0
- /package/dist/standalone/{prisma-yySgczME.js → prisma-BxeT-Y5M.js} +0 -0
- /package/dist/standalone/{prolog-CZTkGNiW.js → prolog-BxrMgyN9.js} +0 -0
- /package/dist/standalone/{proto-Bu_Nhf7u.js → proto-Dek-exro.js} +0 -0
- /package/dist/standalone/{puppet-CJffH6Q6.js → puppet-C16HFbnX.js} +0 -0
- /package/dist/standalone/{purescript-CC7chrMM.js → purescript-C73JvxLF.js} +0 -0
- /package/dist/standalone/{python-C0zrVFze.js → python-DFvGjTfU.js} +0 -0
- /package/dist/standalone/{qmldir-C14XBFWV.js → qmldir-D2UzrXvk.js} +0 -0
- /package/dist/standalone/{qss-B5Hlft_e.js → qss-CyPgAzDy.js} +0 -0
- /package/dist/standalone/{r-BJ2VNcvN.js → r-BTPLa6iH.js} +0 -0
- /package/dist/standalone/{racket-BhgskJzI.js → racket-BaoaiPkO.js} +0 -0
- /package/dist/standalone/{raku-DsquHgLn.js → raku-BsUkgPqO.js} +0 -0
- /package/dist/standalone/{red-B7RxoP7i.js → red-CCJAPkdg.js} +0 -0
- /package/dist/standalone/{reg-Bax0jtzQ.js → reg-DOi1ALwl.js} +0 -0
- /package/dist/standalone/{regexp-BTh6yLg7.js → regexp-cogjKOiz.js} +0 -0
- /package/dist/standalone/{rel-BJ9pN2G2.js → rel-Y9vyrCmO.js} +0 -0
- /package/dist/standalone/{riscv-C3I2jhjQ.js → riscv-C9NE9rlt.js} +0 -0
- /package/dist/standalone/{ron-B4yZ2p1h.js → ron-uMa_rbSR.js} +0 -0
- /package/dist/standalone/{rose-pine-CesGHTut.js → rose-pine-B6wSIDAC.js} +0 -0
- /package/dist/standalone/{rose-pine-dawn-H7rm9o-e.js → rose-pine-dawn-CalFuemK.js} +0 -0
- /package/dist/standalone/{rose-pine-moon-BLFdnJwM.js → rose-pine-moon-BS44sctL.js} +0 -0
- /package/dist/standalone/{rosmsg-xA4_Syxo.js → rosmsg-ncCRrAah.js} +0 -0
- /package/dist/standalone/{rust-BwguOFUq.js → rust-D__ScB18.js} +0 -0
- /package/dist/standalone/{sass-BZyNoloZ.js → sass-Dcwwxgkc.js} +0 -0
- /package/dist/standalone/{scala-CekfPUXd.js → scala-qMGqTQGj.js} +0 -0
- /package/dist/standalone/{scheme-B2vB2nlX.js → scheme-BUvagZbg.js} +0 -0
- /package/dist/standalone/{sdbl-B-nwTmgB.js → sdbl-CdI9Io2f.js} +0 -0
- /package/dist/standalone/{shellscript-BUzexP2h.js → shellscript-CLNzcEEH.js} +0 -0
- /package/dist/standalone/{slack-dark-DCR6M5dd.js → slack-dark-CZWNFbAj.js} +0 -0
- /package/dist/standalone/{slack-ochin-BxQ3FsyT.js → slack-ochin-CcsRSPGb.js} +0 -0
- /package/dist/standalone/{smalltalk-Cy1j24XO.js → smalltalk-CkHsb-ck.js} +0 -0
- /package/dist/standalone/{snazzy-light-CjEw4xHM.js → snazzy-light-Cm_pY2Ne.js} +0 -0
- /package/dist/standalone/{solarized-dark-XlQ9gXgZ.js → solarized-dark-EVcpLOPz.js} +0 -0
- /package/dist/standalone/{solarized-light-isNaysOv.js → solarized-light-BGmOwKbi.js} +0 -0
- /package/dist/standalone/{solidity-C1mh1SRB.js → solidity-DcmwFsmZ.js} +0 -0
- /package/dist/standalone/{splunk-oM69IznW.js → splunk-BAf42Kh3.js} +0 -0
- /package/dist/standalone/{sql-CqT9Lw7j.js → sql-OpUJ1H7b.js} +0 -0
- /package/dist/standalone/{ssh-config-B0ZrS7Sv.js → ssh-config-DTZY5LJQ.js} +0 -0
- /package/dist/standalone/{stylus-B9JQrvWs.js → stylus-CHp-rBJx.js} +0 -0
- /package/dist/standalone/{swift-CaafmPxt.js → swift-DjfAKDlq.js} +0 -0
- /package/dist/standalone/{synthwave-84-BX-qCxDD.js → synthwave-84-B5y6dw6I.js} +0 -0
- /package/dist/standalone/{system-verilog-J8T_iWHG.js → system-verilog-CstGBDHm.js} +0 -0
- /package/dist/standalone/{systemd-DVL5CBpd.js → systemd-CV0H8W0r.js} +0 -0
- /package/dist/standalone/{talonscript-JJfmMcGp.js → talonscript-BfJo0mzd.js} +0 -0
- /package/dist/standalone/{tasl-B1QiBRw2.js → tasl-CbFmChTU.js} +0 -0
- /package/dist/standalone/{tcl-CqllcB5H.js → tcl-DNn0b4Xi.js} +0 -0
- /package/dist/standalone/{terraform-wW0EQRMO.js → terraform-C-5xJLZK.js} +0 -0
- /package/dist/standalone/{tokyo-night-D6xJgjfK.js → tokyo-night-DwP487HJ.js} +0 -0
- /package/dist/standalone/{toml-BHrgvSPm.js → toml-BUQbhfId.js} +0 -0
- /package/dist/standalone/{tsv-D73M_gRj.js → tsv-DboMNYlp.js} +0 -0
- /package/dist/standalone/{tsx-D6awiul2.js → tsx-D_ZL21a1.js} +0 -0
- /package/dist/standalone/{turtle-C6QRqIYF.js → turtle-ep-yDHHJ.js} +0 -0
- /package/dist/standalone/{typescript-CWgyaUtY.js → typescript-DLmRjE2H.js} +0 -0
- /package/dist/standalone/{typst-63_R-dcN.js → typst-OK3ZsbAS.js} +0 -0
- /package/dist/standalone/{v-DNh9rpzt.js → v-BRzbo0xa.js} +0 -0
- /package/dist/standalone/{vala-yZrEMgbl.js → vala-DajMRXrp.js} +0 -0
- /package/dist/standalone/{vb-CWiXLMNc.js → vb-Cp5p1BHA.js} +0 -0
- /package/dist/standalone/{verilog-D_YgnmVW.js → verilog-Karwuy7m.js} +0 -0
- /package/dist/standalone/{vesper-BoY7BUOC.js → vesper-D8EI4h-P.js} +0 -0
- /package/dist/standalone/{vhdl-CIOMuzRr.js → vhdl-BWVkbJap.js} +0 -0
- /package/dist/standalone/{viml-KvIzNj-z.js → viml-D006eITo.js} +0 -0
- /package/dist/standalone/{vitesse-black-BC5aDvua.js → vitesse-black-CiyuYPYv.js} +0 -0
- /package/dist/standalone/{vitesse-dark-C_RcLVAX.js → vitesse-dark-DF1BoauX.js} +0 -0
- /package/dist/standalone/{vitesse-light-CbYhMxH_.js → vitesse-light-BkWBILrw.js} +0 -0
- /package/dist/standalone/{vyper-DQ6Iue0m.js → vyper-pqGBEKo6.js} +0 -0
- /package/dist/standalone/{wasm-BVujMf4j.js → wasm-BNcVSub7.js} +0 -0
- /package/dist/standalone/{wasm-CttxofWT.js → wasm-BoWtZ2Hg.js} +0 -0
- /package/dist/standalone/{wenyan-sFr85_Wa.js → wenyan-B1aPQ0e8.js} +0 -0
- /package/dist/standalone/{wgsl-C8sJ4ScM.js → wgsl-MFrJo5Av.js} +0 -0
- /package/dist/standalone/{wikitext-BHbI4LrJ.js → wikitext-Bam7iWkE.js} +0 -0
- /package/dist/standalone/{wit-BrulQYCT.js → wit-RYUlqdwx.js} +0 -0
- /package/dist/standalone/{wolfram-CkTHL-YU.js → wolfram-BAx02ysC.js} +0 -0
- /package/dist/standalone/{yaml-C2UdUGt-.js → yaml-BipAacI9.js} +0 -0
- /package/dist/standalone/{zenscript-CvnF8pfB.js → zenscript-BidEsPSr.js} +0 -0
- /package/dist/standalone/{zig-DrTOhqiK.js → zig-DRQ1gulu.js} +0 -0
package/dist/lib/index.js
CHANGED
|
@@ -31,7 +31,6 @@ import remarkMath from "remark-math";
|
|
|
31
31
|
import remarkParse from "remark-parse";
|
|
32
32
|
import { parse, stringify } from "yaml";
|
|
33
33
|
import { sanitizeUri } from "micromark-util-sanitize-uri";
|
|
34
|
-
|
|
35
34
|
//#region src/lib/utilities/string.ts
|
|
36
35
|
function getHash(text, length) {
|
|
37
36
|
return fnv1a(text, { size: length === 8 ? 32 : 64 }).toString(16).padStart(length, "0");
|
|
@@ -43,10 +42,13 @@ function capitalize(text) {
|
|
|
43
42
|
* Truncates on word boundary and adds ellipsis. Does not give special treatment
|
|
44
43
|
* to file extensions. If there are no spaces in the text, it will truncate at
|
|
45
44
|
* `maxLength` without respect for word boundaries.
|
|
45
|
+
*
|
|
46
46
|
* @param text Text to truncate
|
|
47
47
|
* @param maxLength Maximum length excluding ellipsis
|
|
48
48
|
* @param truncationString String to append to truncated text. Defaults to '...'
|
|
49
|
-
* @param wordBoundary Character to consider a word boundary. Defaults to a
|
|
49
|
+
* @param wordBoundary Character to consider a word boundary. Defaults to a
|
|
50
|
+
* space.
|
|
51
|
+
*
|
|
50
52
|
* @returns Truncated string
|
|
51
53
|
*/
|
|
52
54
|
function truncateOnWordBoundary(text, maxLength, truncationString = "...", wordBoundary = " ") {
|
|
@@ -64,15 +66,19 @@ function emptyIsUndefined(text) {
|
|
|
64
66
|
return text.trim() === "" ? void 0 : text;
|
|
65
67
|
}
|
|
66
68
|
/**
|
|
67
|
-
* Mainly for nice formatting with prettier. But the line wrapping means we have
|
|
69
|
+
* Mainly for nice formatting with prettier. But the line wrapping means we have
|
|
70
|
+
* to strip surplus whitespace.
|
|
71
|
+
*
|
|
68
72
|
* @public
|
|
69
73
|
*/
|
|
70
74
|
function css(strings, ...values) {
|
|
71
75
|
return trimLeadingIndentation(strings, ...values);
|
|
72
76
|
}
|
|
77
|
+
const NEWLINE_REGEX$1 = /\r?\n/;
|
|
78
|
+
const LEADING_WHITESPACE_REGEX = /^(\s+)/;
|
|
73
79
|
function trimLeadingIndentation(strings, ...values) {
|
|
74
|
-
const lines = strings.reduce((result, text, i) => `${result}${text}${String(values[i] ?? "")}`, "").split(
|
|
75
|
-
const leadingSpace =
|
|
80
|
+
const lines = strings.reduce((result, text, i) => `${result}${text}${String(values[i] ?? "")}`, "").split(NEWLINE_REGEX$1).filter((line) => line.trim() !== "");
|
|
81
|
+
const leadingSpace = LEADING_WHITESPACE_REGEX.exec(lines[0])?.[0] ?? "";
|
|
76
82
|
const leadingSpaceRegex = new RegExp(`^${leadingSpace}`);
|
|
77
83
|
return lines.map((line) => line.replace(leadingSpaceRegex, "").trimEnd()).join("\n");
|
|
78
84
|
}
|
|
@@ -82,54 +88,43 @@ function splitAtFirstMatch(text, regex) {
|
|
|
82
88
|
const { index } = match;
|
|
83
89
|
return [text.slice(0, index), text.slice(index)];
|
|
84
90
|
}
|
|
85
|
-
|
|
86
91
|
//#endregion
|
|
87
92
|
//#region src/lib/shared/constants.ts
|
|
88
93
|
/**
|
|
89
|
-
* The default CSS to use for cards. This matches Anki's default. Stored in the
|
|
94
|
+
* The default CSS to use for cards. This matches Anki's default. Stored in the
|
|
95
|
+
* Yanki card models and shared across all Yanki-managed notes regardless of
|
|
96
|
+
* namespace. It does change occasionally, see
|
|
97
|
+
* https://github.com/ankitects/anki/blob/main/rslib/src/notetype/styling.css
|
|
90
98
|
*/
|
|
91
99
|
const CSS_DEFAULT_STYLE = css`
|
|
92
100
|
.card {
|
|
93
101
|
font-family: arial;
|
|
94
102
|
font-size: 20px;
|
|
103
|
+
line-height: 1.5;
|
|
95
104
|
text-align: center;
|
|
96
105
|
color: black;
|
|
97
106
|
background-color: white;
|
|
98
107
|
}
|
|
99
108
|
`;
|
|
100
109
|
/**
|
|
101
|
-
* CSS class to always include in a top-level div wrapper in the card template
|
|
110
|
+
* CSS class to always include in a top-level div wrapper in the card template
|
|
111
|
+
* to allow for custom styling.
|
|
102
112
|
*/
|
|
103
113
|
const CSS_DEFAULT_CLASS_NAME = "yanki";
|
|
104
114
|
/**
|
|
105
|
-
* Whether to require changes to notes, models, or decks before invoking an
|
|
106
|
-
* AnkiWeb sync. Seems like a good idea, but this is tricky... because if you
|
|
107
|
-
* change the AnkiWeb flag after doing a sync, and haven't changed any files,
|
|
108
|
-
* you won't end up pushing changes to AnkiWeb, which seems to contradict
|
|
109
|
-
* expectations even though it would be more performant in the typical case.
|
|
110
|
-
*
|
|
111
|
-
* Only applies if the `ankiWeb` flag is true.
|
|
112
|
-
*/
|
|
113
|
-
const SYNC_TO_ANKI_WEB_EVEN_IF_UNCHANGED = true;
|
|
114
|
-
/**
|
|
115
|
-
* The maximum length of a namespace. This is used to ensure that the namespace
|
|
116
|
-
* is easy to type in CLI commands and doesn't hog too much semantic space in
|
|
117
|
-
* Media filenames.
|
|
118
|
-
*/
|
|
119
|
-
const NOTE_NAMESPACE_MAX_LENGTH = 60;
|
|
120
|
-
/**
|
|
121
115
|
* The default deck to put a card in if the deck deck can not be inferred from
|
|
122
116
|
* the file path, e.g. when the `sync` command is used directly instead of
|
|
123
117
|
* `syncFiles`.
|
|
124
118
|
*/
|
|
125
119
|
const NOTE_DEFAULT_DECK_NAME = "Yanki";
|
|
126
120
|
/**
|
|
127
|
-
* Text to show if a note 'Front' field is empty, and content is required for a
|
|
121
|
+
* Text to show if a note 'Front' field is empty, and content is required for a
|
|
122
|
+
* semantically valid card.
|
|
128
123
|
*/
|
|
129
124
|
const NOTE_DEFAULT_EMPTY_TEXT = "(Empty)";
|
|
130
125
|
/**
|
|
131
|
-
* HTML element to use to present `NOTE_DEFAULT_EMPTY_TEXT`.
|
|
132
|
-
*
|
|
126
|
+
* HTML element to use to present `NOTE_DEFAULT_EMPTY_TEXT`. TODO consider
|
|
127
|
+
* hidden span?
|
|
133
128
|
*/
|
|
134
129
|
const NOTE_DEFAULT_EMPTY_HAST = u("element", {
|
|
135
130
|
properties: {},
|
|
@@ -140,29 +135,27 @@ const NOTE_DEFAULT_EMPTY_HAST = u("element", {
|
|
|
140
135
|
}, [u("text", NOTE_DEFAULT_EMPTY_TEXT)])]);
|
|
141
136
|
const MEDIA_DEFAULT_HASH_MODE_FILE = "metadata";
|
|
142
137
|
const MEDIA_DEFAULT_HASH_MODE_URL = "metadata";
|
|
143
|
-
const MEDIA_INCLUDE_LEGIBLE_FILENAME = false;
|
|
144
138
|
/**
|
|
145
139
|
* How to first attempt to infer the asset type behind a URL.
|
|
146
140
|
*
|
|
147
141
|
* - `metadata`: Fetch the head and hope for a `Content-Type` header.
|
|
148
|
-
* - `name`: Infer the extension from the URL alone, won't work if there's nothing
|
|
142
|
+
* - `name`: Infer the extension from the URL alone, won't work if there's nothing
|
|
143
|
+
* extension-like in the `pathname`.
|
|
149
144
|
*/
|
|
150
145
|
const MEDIA_URL_CONTENT_TYPE_MODE = "metadata";
|
|
151
146
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*/
|
|
155
|
-
const MEDIA_FILENAME_MAX_LENGTH = 120;
|
|
156
|
-
/**
|
|
157
|
-
* Filename to use when a media asset has no name. Will be appended with counter parenthetical as needed.
|
|
147
|
+
* Filename to use when a media asset has no name. Will be appended with counter
|
|
148
|
+
* parenthetical as needed.
|
|
158
149
|
*/
|
|
159
150
|
const MEDIA_DEFAULT_EMPTY_FILENAME = "Untitled";
|
|
160
151
|
/**
|
|
161
152
|
* Supported image extensions for Anki media assets.
|
|
162
153
|
*
|
|
163
|
-
* Note that while officially "supported", some of these are not universally
|
|
154
|
+
* Note that while officially "supported", some of these are not universally
|
|
155
|
+
* compatible across Anki platforms.
|
|
164
156
|
*
|
|
165
|
-
* Via
|
|
157
|
+
* Via
|
|
158
|
+
* https://github.com/ankitects/anki/blob/e41c4573d789afe8b020fab5d9d1eede50c3fa3d/qt/aqt/editor.py#L62
|
|
166
159
|
*/
|
|
167
160
|
const MEDIA_SUPPORTED_IMAGE_EXTENSIONS = [
|
|
168
161
|
"avif",
|
|
@@ -219,12 +212,10 @@ const MEDIA_SUPPORTED_EXTENSIONS = [
|
|
|
219
212
|
...MEDIA_SUPPORTED_IMAGE_EXTENSIONS,
|
|
220
213
|
...MEDIA_SUPPORTED_FILE_EXTENSIONS
|
|
221
214
|
];
|
|
222
|
-
|
|
223
215
|
//#endregion
|
|
224
216
|
//#region src/lib/utilities/platform.ts
|
|
225
217
|
const ENVIRONMENT = typeof window === "undefined" ? typeof process === "undefined" ? "other" : "node" : "browser";
|
|
226
|
-
|
|
227
|
-
|
|
218
|
+
ENVIRONMENT === "browser" ? /windows/i.test(navigator.userAgent) || /mac/i.test(navigator.userAgent) || /linux/i.test(navigator.userAgent) || /ubuntu/i.test(navigator.userAgent) : ENVIRONMENT === "node" && (process.platform === "win32" || process.platform === "darwin" || process.platform);
|
|
228
219
|
//#endregion
|
|
229
220
|
//#region src/lib/shared/types.ts
|
|
230
221
|
const defaultGlobalOptions = {
|
|
@@ -273,7 +264,6 @@ async function getDefaultFileAdapter() {
|
|
|
273
264
|
function getDefaultFetchAdapter() {
|
|
274
265
|
return fetch.bind(globalThis);
|
|
275
266
|
}
|
|
276
|
-
|
|
277
267
|
//#endregion
|
|
278
268
|
//#region src/lib/utilities/file.ts
|
|
279
269
|
async function fileExists(absoluteFilePath, fileAdapter) {
|
|
@@ -296,12 +286,95 @@ async function getFileContentHash(absoluteFilePath, fileAdapter, mode = MEDIA_DE
|
|
|
296
286
|
case "name": return getHash(absoluteFilePath, 16);
|
|
297
287
|
}
|
|
298
288
|
}
|
|
299
|
-
|
|
300
289
|
//#endregion
|
|
301
290
|
//#region src/lib/utilities/namespace.ts
|
|
291
|
+
const CONSECUTIVE_HYPHENS_REGEX = /-+/g;
|
|
292
|
+
const ASTERISK_REGEX = /\*/;
|
|
293
|
+
const FORBIDDEN_CHARACTERS = [
|
|
294
|
+
[/:/, "Colon"],
|
|
295
|
+
[/\u0000/, "Null"],
|
|
296
|
+
[/\u0001/, "Start of Heading"],
|
|
297
|
+
[/\u0002/, "Start of Text"],
|
|
298
|
+
[/\u0003/, "End of Text"],
|
|
299
|
+
[/\u0004/, "End of Transmission"],
|
|
300
|
+
[/\u0005/, "Enquiry"],
|
|
301
|
+
[/\u0006/, "Acknowledge"],
|
|
302
|
+
[/\u0007/, "Bell"],
|
|
303
|
+
[/\u0008/, "Backspace"],
|
|
304
|
+
[/\u0009/, "Horizontal Tab"],
|
|
305
|
+
[/\u000A/, "Line Feed"],
|
|
306
|
+
[/\u000B/, "Vertical Tab"],
|
|
307
|
+
[/\u000C/, "Form Feed"],
|
|
308
|
+
[/\u000D/, "Carriage Return"],
|
|
309
|
+
[/\u000E/, "Shift Out"],
|
|
310
|
+
[/\u000F/, "Shift In"],
|
|
311
|
+
[/\u0010/, "Data Link Escape"],
|
|
312
|
+
[/\u0011/, "Device Control 1"],
|
|
313
|
+
[/\u0012/, "Device Control 2"],
|
|
314
|
+
[/\u0013/, "Device Control 3"],
|
|
315
|
+
[/\u0014/, "Device Control 4"],
|
|
316
|
+
[/\u0015/, "Negative Acknowledge"],
|
|
317
|
+
[/\u0016/, "Synchronous Idle"],
|
|
318
|
+
[/\u0017/, "End of Transmission Block"],
|
|
319
|
+
[/\u0018/, "Cancel"],
|
|
320
|
+
[/\u0019/, "End of Medium"],
|
|
321
|
+
[/\u001A/, "Substitute"],
|
|
322
|
+
[/\u001B/, "Escape"],
|
|
323
|
+
[/\u001C/, "File Separator"],
|
|
324
|
+
[/\u001D/, "Group Separator"],
|
|
325
|
+
[/\u001E/, "Record Separator"],
|
|
326
|
+
[/\u001F/, "Unit Separator"],
|
|
327
|
+
[/\u007F/, "Delete"],
|
|
328
|
+
[/\u0080/, "Padding Character"],
|
|
329
|
+
[/\u0081/, "High Octet Preset"],
|
|
330
|
+
[/\u0082/, "Break Permitted Here"],
|
|
331
|
+
[/\u0083/, "No Break Here"],
|
|
332
|
+
[/\u0084/, "Index"],
|
|
333
|
+
[/\u0085/, "Next Line"],
|
|
334
|
+
[/\u0086/, "Start of Selected Area"],
|
|
335
|
+
[/\u0087/, "End of Selected Area"],
|
|
336
|
+
[/\u0088/, "Character Tabulation Set"],
|
|
337
|
+
[/\u0089/, "Character Tabulation with Justification"],
|
|
338
|
+
[/\u008A/, "Line Tabulation Set"],
|
|
339
|
+
[/\u008B/, "Partial Line Forward"],
|
|
340
|
+
[/\u008C/, "Partial Line Backward"],
|
|
341
|
+
[/\u008D/, "Reverse Line Feed"],
|
|
342
|
+
[/\u008E/, "Single Shift Two"],
|
|
343
|
+
[/\u008F/, "Single Shift Three"],
|
|
344
|
+
[/\u0090/, "Device Control String"],
|
|
345
|
+
[/\u0091/, "Private Use One"],
|
|
346
|
+
[/\u0092/, "Private Use Two"],
|
|
347
|
+
[/\u0093/, "Set Transmit State"],
|
|
348
|
+
[/\u0094/, "Cancel Character"],
|
|
349
|
+
[/\u0095/, "Message Waiting"],
|
|
350
|
+
[/\u0096/, "Start of Protected Area"],
|
|
351
|
+
[/\u0097/, "End of Protected Area"],
|
|
352
|
+
[/\u0098/, "Start of String"],
|
|
353
|
+
[/\u0099/, "Single Graphic Character Introducer"],
|
|
354
|
+
[/\u009A/, "Single Character Introducer"],
|
|
355
|
+
[/\u009B/, "Control Sequence Introducer"],
|
|
356
|
+
[/\u009C/, "String Terminator"],
|
|
357
|
+
[/\u009D/, "Operating System Command"],
|
|
358
|
+
[/\u009E/, "Privacy Message"],
|
|
359
|
+
[/\u009F/, "Application Program Command"],
|
|
360
|
+
[/\u00A0/, "Non-breaking Space"],
|
|
361
|
+
[/\u00AD/, "Soft Hyphen"],
|
|
362
|
+
[/\u200B/, "Zero-width Space"],
|
|
363
|
+
[/\u200C/, "Zero-width Non-joiner"],
|
|
364
|
+
[/\u200D/, "Zero-width Joiner"],
|
|
365
|
+
[/\u200E/, "Left-to-right Mark"],
|
|
366
|
+
[/\u200F/, "Right-to-left Mark"],
|
|
367
|
+
[/\u202A/, "Left-to-right Embedding"],
|
|
368
|
+
[/\u202B/, "Right-to-left Embedding"],
|
|
369
|
+
[/\u202C/, "Pop Directional Formatting"],
|
|
370
|
+
[/\u202D/, "Left-to-right Override"],
|
|
371
|
+
[/\u202E/, "Right-to-left Override"],
|
|
372
|
+
[/\uFEFF/, "Byte Order Mark (BOM)"]
|
|
373
|
+
];
|
|
302
374
|
/**
|
|
303
375
|
* Convenience
|
|
304
|
-
*
|
|
376
|
+
*
|
|
377
|
+
* @returns Sanitized valid namespace
|
|
305
378
|
* @throws {Error} If namespace is invalid
|
|
306
379
|
*/
|
|
307
380
|
function validateAndSanitizeNamespace(namespace, allowAsterisk = false) {
|
|
@@ -310,7 +383,8 @@ function validateAndSanitizeNamespace(namespace, allowAsterisk = false) {
|
|
|
310
383
|
}
|
|
311
384
|
/**
|
|
312
385
|
* Used internally before storing and searching
|
|
313
|
-
*
|
|
386
|
+
*
|
|
387
|
+
* @returns Sanitized namespace
|
|
314
388
|
*/
|
|
315
389
|
function sanitizeNamespace(namespace) {
|
|
316
390
|
return namespace.normalize("NFC").trim();
|
|
@@ -324,99 +398,20 @@ function sanitizeNamespace(namespace) {
|
|
|
324
398
|
* about the letter of the namespace, otherwise there's a risk of data loss. For
|
|
325
399
|
* this reason, validation is strict and throws errors, so that the user can
|
|
326
400
|
* understand and correct their input so that they know the proper form for
|
|
327
|
-
* subsequent uses of the namespace string — especially if they're using the
|
|
401
|
+
* subsequent uses of the namespace string — especially if they're using the
|
|
402
|
+
* CLI.
|
|
328
403
|
*
|
|
329
404
|
* Silently correcting the namespace would be a bad idea, because the user might
|
|
330
405
|
* not realize that the namespace has been changed, and then they might not be
|
|
331
406
|
* able to find their notes.
|
|
407
|
+
*
|
|
332
408
|
* @throws {Error}
|
|
333
409
|
*/
|
|
334
410
|
function validateNamespace(namespace, allowAsterisk = false) {
|
|
335
411
|
const errorMessages = [];
|
|
336
412
|
if (namespace.trim().length === 0) errorMessages.push("Cannot be empty");
|
|
337
|
-
if (namespace.trim().length >
|
|
338
|
-
const forbiddenCharacters = [
|
|
339
|
-
[/:/, "Colon"],
|
|
340
|
-
[/\u0000/, "Null"],
|
|
341
|
-
[/\u0001/, "Start of Heading"],
|
|
342
|
-
[/\u0002/, "Start of Text"],
|
|
343
|
-
[/\u0003/, "End of Text"],
|
|
344
|
-
[/\u0004/, "End of Transmission"],
|
|
345
|
-
[/\u0005/, "Enquiry"],
|
|
346
|
-
[/\u0006/, "Acknowledge"],
|
|
347
|
-
[/\u0007/, "Bell"],
|
|
348
|
-
[/\u0008/, "Backspace"],
|
|
349
|
-
[/\u0009/, "Horizontal Tab"],
|
|
350
|
-
[/\u000A/, "Line Feed"],
|
|
351
|
-
[/\u000B/, "Vertical Tab"],
|
|
352
|
-
[/\u000C/, "Form Feed"],
|
|
353
|
-
[/\u000D/, "Carriage Return"],
|
|
354
|
-
[/\u000E/, "Shift Out"],
|
|
355
|
-
[/\u000F/, "Shift In"],
|
|
356
|
-
[/\u0010/, "Data Link Escape"],
|
|
357
|
-
[/\u0011/, "Device Control 1"],
|
|
358
|
-
[/\u0012/, "Device Control 2"],
|
|
359
|
-
[/\u0013/, "Device Control 3"],
|
|
360
|
-
[/\u0014/, "Device Control 4"],
|
|
361
|
-
[/\u0015/, "Negative Acknowledge"],
|
|
362
|
-
[/\u0016/, "Synchronous Idle"],
|
|
363
|
-
[/\u0017/, "End of Transmission Block"],
|
|
364
|
-
[/\u0018/, "Cancel"],
|
|
365
|
-
[/\u0019/, "End of Medium"],
|
|
366
|
-
[/\u001A/, "Substitute"],
|
|
367
|
-
[/\u001B/, "Escape"],
|
|
368
|
-
[/\u001C/, "File Separator"],
|
|
369
|
-
[/\u001D/, "Group Separator"],
|
|
370
|
-
[/\u001E/, "Record Separator"],
|
|
371
|
-
[/\u001F/, "Unit Separator"],
|
|
372
|
-
[/\u007F/, "Delete"],
|
|
373
|
-
[/\u0080/, "Padding Character"],
|
|
374
|
-
[/\u0081/, "High Octet Preset"],
|
|
375
|
-
[/\u0082/, "Break Permitted Here"],
|
|
376
|
-
[/\u0083/, "No Break Here"],
|
|
377
|
-
[/\u0084/, "Index"],
|
|
378
|
-
[/\u0085/, "Next Line"],
|
|
379
|
-
[/\u0086/, "Start of Selected Area"],
|
|
380
|
-
[/\u0087/, "End of Selected Area"],
|
|
381
|
-
[/\u0088/, "Character Tabulation Set"],
|
|
382
|
-
[/\u0089/, "Character Tabulation with Justification"],
|
|
383
|
-
[/\u008A/, "Line Tabulation Set"],
|
|
384
|
-
[/\u008B/, "Partial Line Forward"],
|
|
385
|
-
[/\u008C/, "Partial Line Backward"],
|
|
386
|
-
[/\u008D/, "Reverse Line Feed"],
|
|
387
|
-
[/\u008E/, "Single Shift Two"],
|
|
388
|
-
[/\u008F/, "Single Shift Three"],
|
|
389
|
-
[/\u0090/, "Device Control String"],
|
|
390
|
-
[/\u0091/, "Private Use One"],
|
|
391
|
-
[/\u0092/, "Private Use Two"],
|
|
392
|
-
[/\u0093/, "Set Transmit State"],
|
|
393
|
-
[/\u0094/, "Cancel Character"],
|
|
394
|
-
[/\u0095/, "Message Waiting"],
|
|
395
|
-
[/\u0096/, "Start of Protected Area"],
|
|
396
|
-
[/\u0097/, "End of Protected Area"],
|
|
397
|
-
[/\u0098/, "Start of String"],
|
|
398
|
-
[/\u0099/, "Single Graphic Character Introducer"],
|
|
399
|
-
[/\u009A/, "Single Character Introducer"],
|
|
400
|
-
[/\u009B/, "Control Sequence Introducer"],
|
|
401
|
-
[/\u009C/, "String Terminator"],
|
|
402
|
-
[/\u009D/, "Operating System Command"],
|
|
403
|
-
[/\u009E/, "Privacy Message"],
|
|
404
|
-
[/\u009F/, "Application Program Command"],
|
|
405
|
-
[/\u00A0/, "Non-breaking Space"],
|
|
406
|
-
[/\u00AD/, "Soft Hyphen"],
|
|
407
|
-
[/\u200B/, "Zero-width Space"],
|
|
408
|
-
[/\u200C/, "Zero-width Non-joiner"],
|
|
409
|
-
[/\u200D/, "Zero-width Joiner"],
|
|
410
|
-
[/\u200E/, "Left-to-right Mark"],
|
|
411
|
-
[/\u200F/, "Right-to-left Mark"],
|
|
412
|
-
[/\u202A/, "Left-to-right Embedding"],
|
|
413
|
-
[/\u202B/, "Right-to-left Embedding"],
|
|
414
|
-
[/\u202C/, "Pop Directional Formatting"],
|
|
415
|
-
[/\u202D/, "Left-to-right Override"],
|
|
416
|
-
[/\u202E/, "Right-to-left Override"],
|
|
417
|
-
[/\uFEFF/, "Byte Order Mark (BOM)"]
|
|
418
|
-
];
|
|
419
|
-
if (!allowAsterisk) forbiddenCharacters.push([/\*/, "Asterisk"]);
|
|
413
|
+
if (namespace.trim().length > 60) errorMessages.push(`Cannot be longer than 60 characters`);
|
|
414
|
+
const forbiddenCharacters = allowAsterisk ? FORBIDDEN_CHARACTERS : [...FORBIDDEN_CHARACTERS, [ASTERISK_REGEX, "Asterisk"]];
|
|
420
415
|
for (const [regex, description] of forbiddenCharacters) {
|
|
421
416
|
const match = namespace.match(regex);
|
|
422
417
|
if (match) {
|
|
@@ -430,9 +425,8 @@ function validateNamespace(namespace, allowAsterisk = false) {
|
|
|
430
425
|
* Get sanitized namespace with yanki-media- prefix (for ease of searching)
|
|
431
426
|
*/
|
|
432
427
|
function getSlugifiedNamespace(namespace) {
|
|
433
|
-
return `yanki-media-${slugify(sanitizeNamespace(namespace)).replaceAll(
|
|
428
|
+
return `yanki-media-${slugify(sanitizeNamespace(namespace)).replaceAll(CONSECUTIVE_HYPHENS_REGEX, "-")}`;
|
|
434
429
|
}
|
|
435
|
-
|
|
436
430
|
//#endregion
|
|
437
431
|
//#region src/lib/utilities/mime.ts
|
|
438
432
|
/**
|
|
@@ -479,12 +473,15 @@ function getFileExtensionForMimeType(mimeType) {
|
|
|
479
473
|
if (result === void 0) return;
|
|
480
474
|
return result;
|
|
481
475
|
}
|
|
482
|
-
|
|
483
476
|
//#endregion
|
|
484
477
|
//#region src/lib/utilities/path.ts
|
|
478
|
+
const WINDOWS_DRIVE_LETTER_REGEX = /^[A-Z]:/i;
|
|
479
|
+
const QUERY_FRAGMENT_START_REGEX = /[#?^]/;
|
|
485
480
|
/**
|
|
486
481
|
* The browserify polyfill doesn't implement win32 absolute path detection...
|
|
482
|
+
*
|
|
487
483
|
* @param filePath Normalized path
|
|
484
|
+
*
|
|
488
485
|
* @returns Whether the path is absolute
|
|
489
486
|
*/
|
|
490
487
|
function isAbsolute(filePath) {
|
|
@@ -494,8 +491,10 @@ const RE_WINDOWS_EXTENDED_LENGTH_PATH = /^\\\\\?\\.+/;
|
|
|
494
491
|
/**
|
|
495
492
|
* Converts all paths to cross-platform 'mixed' style with forward slashes.
|
|
496
493
|
* Warns on unsupported Windows extended length paths.
|
|
494
|
+
*
|
|
497
495
|
* @param filePath Path to normalize
|
|
498
|
-
*
|
|
496
|
+
*
|
|
497
|
+
* @returns Normalized path
|
|
499
498
|
*/
|
|
500
499
|
function normalize(filePath) {
|
|
501
500
|
if (RE_WINDOWS_EXTENDED_LENGTH_PATH.test(filePath)) {
|
|
@@ -508,14 +507,15 @@ function normalize(filePath) {
|
|
|
508
507
|
return normalizedPath;
|
|
509
508
|
}
|
|
510
509
|
/**
|
|
511
|
-
* Special handling for `/absolute-path.md` style links in Obsidian
|
|
512
|
-
*
|
|
513
|
-
*
|
|
510
|
+
* Special handling for `/absolute-path.md` style links in Obsidian and static
|
|
511
|
+
* site generators, where absolute paths are relative to a base path instead of
|
|
512
|
+
* the volume root.
|
|
514
513
|
*
|
|
515
|
-
|
|
514
|
+
* Paths starting with Windows drive letters, while technically absolute, are
|
|
515
|
+
* _not_ prepended with the base:
|
|
516
516
|
*
|
|
517
|
-
*
|
|
518
|
-
*
|
|
517
|
+
* - If no base path is provided, paths are resolved relative to the the provided
|
|
518
|
+
* CWD.
|
|
519
519
|
* - If paths are relative, the base paths are ignored and the CWD is used.
|
|
520
520
|
*
|
|
521
521
|
* All path values are normalized and in 'mixed' platform style.
|
|
@@ -528,7 +528,7 @@ function resolveWithBasePath(filePath, options) {
|
|
|
528
528
|
}
|
|
529
529
|
if (!isAbsolute(cwd)) console.warn(`CWD "${cwd}" is not absolute`);
|
|
530
530
|
if (isAbsolute(filePath)) {
|
|
531
|
-
if (basePath === void 0 ||
|
|
531
|
+
if (basePath === void 0 || WINDOWS_DRIVE_LETTER_REGEX.test(filePath) || !compoundBase && filePath.startsWith(basePath)) return filePath;
|
|
532
532
|
return path.join(basePath, filePath);
|
|
533
533
|
}
|
|
534
534
|
return path.join(cwd, filePath);
|
|
@@ -539,7 +539,7 @@ function stripBasePath(filePath, basePath) {
|
|
|
539
539
|
}
|
|
540
540
|
function getBaseAndQueryParts(filePath) {
|
|
541
541
|
const directoryPath = path.dirname(filePath);
|
|
542
|
-
const [base, query] = splitAtFirstMatch(path.basename(filePath),
|
|
542
|
+
const [base, query] = splitAtFirstMatch(path.basename(filePath), QUERY_FRAGMENT_START_REGEX);
|
|
543
543
|
return [path.join(directoryPath, base), query];
|
|
544
544
|
}
|
|
545
545
|
function getBase(filePath) {
|
|
@@ -562,9 +562,10 @@ function addExtension(filePath, extension) {
|
|
|
562
562
|
const [base, query] = getBaseAndQueryParts(filePath);
|
|
563
563
|
return `${base}.${extension}${query ?? ""}`;
|
|
564
564
|
}
|
|
565
|
-
|
|
566
565
|
//#endregion
|
|
567
566
|
//#region src/lib/utilities/url.ts
|
|
567
|
+
const DRIVE_LETTER_REGEX = /^[a-z]:/i;
|
|
568
|
+
const FILE_PREFIX_REGEX = /^file:/i;
|
|
568
569
|
function safeDecodeURI(text) {
|
|
569
570
|
try {
|
|
570
571
|
return decodeURI(text);
|
|
@@ -581,9 +582,7 @@ function safeDecodeURI(text) {
|
|
|
581
582
|
function safeParseUrl(text) {
|
|
582
583
|
try {
|
|
583
584
|
const url = new URL(text);
|
|
584
|
-
|
|
585
|
-
const filePrefixPattern = /^file:/i;
|
|
586
|
-
if ((filePrefixPattern.test(url.protocol) || driveLetterPattern.test(url.protocol)) && !filePrefixPattern.test(text)) return;
|
|
585
|
+
if ((FILE_PREFIX_REGEX.test(url.protocol) || DRIVE_LETTER_REGEX.test(url.protocol)) && !FILE_PREFIX_REGEX.test(text)) return;
|
|
587
586
|
return url;
|
|
588
587
|
} catch {
|
|
589
588
|
return;
|
|
@@ -593,8 +592,9 @@ function isUrl(text) {
|
|
|
593
592
|
return safeParseUrl(text) !== void 0;
|
|
594
593
|
}
|
|
595
594
|
/**
|
|
596
|
-
* Helper to "filter" file URLs into path strings so they're treated
|
|
597
|
-
*
|
|
595
|
+
* Helper to "filter" file URLs into path strings so they're treated correctly
|
|
596
|
+
* in mdastToHtml
|
|
597
|
+
*
|
|
598
598
|
* @todo Need stuff from node's implementation, fileURLToPath?
|
|
599
599
|
*/
|
|
600
600
|
function fileUrlToPath(url) {
|
|
@@ -616,9 +616,12 @@ function getSrcType(filePathOrUrl) {
|
|
|
616
616
|
}
|
|
617
617
|
/**
|
|
618
618
|
* Supports both Header type and Record<string, string> type
|
|
619
|
+
*
|
|
619
620
|
* @param headers Headers object or record from a fetch response
|
|
620
621
|
* @param headerKeys Headers to include in the string
|
|
621
|
-
*
|
|
622
|
+
*
|
|
623
|
+
* @returns A concatenated string of the header contents, suitable for hashing,
|
|
624
|
+
* or undefined if no matching headers are present
|
|
622
625
|
*/
|
|
623
626
|
function getHeadersString(headers, headerKeys) {
|
|
624
627
|
if (headers === void 0) return;
|
|
@@ -671,11 +674,11 @@ async function getFileExtensionFromUrl(url, fetchAdapter, mode = MEDIA_URL_CONTE
|
|
|
671
674
|
*
|
|
672
675
|
* - `filename`: Use the filename of the media asset, no network required.
|
|
673
676
|
* - `metadata`: Use the metadata of the media asset, either fstat stuff for
|
|
674
|
-
*
|
|
675
|
-
*
|
|
676
|
-
* - `content`: Actually read the content of the media asset, requires reading
|
|
677
|
-
*
|
|
678
|
-
*
|
|
677
|
+
* files, or reading the headers for URLs... requires a network request for
|
|
678
|
+
* remote urls. Falls through to `filename` if not available.
|
|
679
|
+
* - `content`: Actually read the content of the media asset, requires reading the
|
|
680
|
+
* file or fetching the URL. Not yet implemented. Falls through to `metadata`
|
|
681
|
+
* if not available.
|
|
679
682
|
*/
|
|
680
683
|
async function getUrlContentHash(url, fetchAdapter, mode = MEDIA_DEFAULT_HASH_MODE_URL) {
|
|
681
684
|
switch (mode) {
|
|
@@ -706,13 +709,15 @@ function urlToHostAndPort(url) {
|
|
|
706
709
|
function hostAndPortToUrl(host, port) {
|
|
707
710
|
return `${host}:${port}`;
|
|
708
711
|
}
|
|
709
|
-
|
|
710
712
|
//#endregion
|
|
711
713
|
//#region src/lib/utilities/media.ts
|
|
712
714
|
/**
|
|
713
715
|
* Get the extension of a media file, if it's supported
|
|
714
|
-
*
|
|
716
|
+
*
|
|
717
|
+
* @returns Extension without the `.`, possibly an extra string if no extension
|
|
718
|
+
* is found
|
|
715
719
|
* @todo Check for how it handles query strings
|
|
720
|
+
*
|
|
716
721
|
* @todo Clean up type casting
|
|
717
722
|
*/
|
|
718
723
|
async function getAnkiMediaFilenameExtension(pathOrUrl, fetchAdapter) {
|
|
@@ -720,16 +725,6 @@ async function getAnkiMediaFilenameExtension(pathOrUrl, fetchAdapter) {
|
|
|
720
725
|
if (extensionCandidate === void 0 || !MEDIA_SUPPORTED_EXTENSIONS.includes(extensionCandidate)) return;
|
|
721
726
|
return extensionCandidate;
|
|
722
727
|
}
|
|
723
|
-
function getLegibleFilename(pathOrUrl, maxLength) {
|
|
724
|
-
let legibleFilename;
|
|
725
|
-
const parsedUrl = safeParseUrl(pathOrUrl);
|
|
726
|
-
if (parsedUrl === void 0) {
|
|
727
|
-
const filePath = pathOrUrl;
|
|
728
|
-
legibleFilename = path.basename(filePath, path.extname(filePath));
|
|
729
|
-
} else legibleFilename = path.basename(parsedUrl.pathname, path.extname(parsedUrl.pathname));
|
|
730
|
-
if (legibleFilename === void 0) throw new Error(`Could not create a legible file name for: ${pathOrUrl}`);
|
|
731
|
-
return truncateOnWordBoundary(slugify(legibleFilename.trim()).replaceAll(/-+/g, "-"), maxLength, "...", "-");
|
|
732
|
-
}
|
|
733
728
|
/**
|
|
734
729
|
* Check if a media asset exists
|
|
735
730
|
*/
|
|
@@ -738,8 +733,8 @@ async function mediaAssetExists(absolutePathOrUrl, fileAdapter, fetchAdapter) {
|
|
|
738
733
|
return fileExists(absolutePathOrUrl, fileAdapter);
|
|
739
734
|
}
|
|
740
735
|
/**
|
|
741
|
-
* Get a safe filename for an Anki media asset
|
|
742
|
-
*
|
|
736
|
+
* Get a safe filename for an Anki media asset Anki truncates long file names...
|
|
737
|
+
* so we crush the complete path down to a hash
|
|
743
738
|
*/
|
|
744
739
|
async function getSafeAnkiMediaFilename(absolutePathOrUrl, namespace, fileExtension, fileAdapter, fetchAdapter) {
|
|
745
740
|
if (!await mediaAssetExists(absolutePathOrUrl, fileAdapter, fetchAdapter)) return;
|
|
@@ -747,17 +742,19 @@ async function getSafeAnkiMediaFilename(absolutePathOrUrl, namespace, fileExtens
|
|
|
747
742
|
const assetHash = await getContentHash(absolutePathOrUrl, fileAdapter, fetchAdapter);
|
|
748
743
|
const resolvedFileExtension = fileExtension === void 0 ? "" : `.${fileExtension}`;
|
|
749
744
|
let safeFilename;
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
if (safeFilename.length > MEDIA_FILENAME_MAX_LENGTH) throw new Error(`Filename too long: ${safeFilename}`);
|
|
745
|
+
safeFilename = `${safeNamespace}-${assetHash}${resolvedFileExtension}`;
|
|
746
|
+
if (safeFilename.length > 120) throw new Error(`Filename too long: ${safeFilename}`);
|
|
753
747
|
return safeFilename;
|
|
754
748
|
}
|
|
755
749
|
async function getContentHash(absolutePathOrUrl, fileAdapter, fetchAdapter) {
|
|
756
750
|
return isUrl(absolutePathOrUrl) ? getUrlContentHash(absolutePathOrUrl, fetchAdapter) : getFileContentHash(absolutePathOrUrl, fileAdapter);
|
|
757
751
|
}
|
|
758
|
-
|
|
759
752
|
//#endregion
|
|
760
753
|
//#region src/lib/parse/rehype-mathjax-anki.ts
|
|
754
|
+
const CONSECUTIVE_BRACES_REGEX = /([{}])(?=[{}])/g;
|
|
755
|
+
function sanitizeBraces(value) {
|
|
756
|
+
return value.replaceAll(CONSECUTIVE_BRACES_REGEX, "$1 ");
|
|
757
|
+
}
|
|
761
758
|
/**
|
|
762
759
|
* Non-rendering replacement for the `rehype-mathjax` plugin, which takes output
|
|
763
760
|
* from `remark-math` and wraps it in Anki-specific syntax.
|
|
@@ -776,6 +773,7 @@ const plugin$3 = function() {
|
|
|
776
773
|
if (node.tagName === "code" && Array.isArray(node.properties.className) && node.properties.className.includes("language-math")) {
|
|
777
774
|
const isBlock = node.properties.className.includes("math-display") || fenced;
|
|
778
775
|
fenced = false;
|
|
776
|
+
for (const child of node.children) if (child.type === "text") child.value = sanitizeBraces(child.value);
|
|
779
777
|
node.tagName = isBlock ? "div" : "span";
|
|
780
778
|
node.children = [
|
|
781
779
|
{
|
|
@@ -792,7 +790,6 @@ const plugin$3 = function() {
|
|
|
792
790
|
});
|
|
793
791
|
};
|
|
794
792
|
};
|
|
795
|
-
|
|
796
793
|
//#endregion
|
|
797
794
|
//#region src/lib/parse/remark-conditional-breaks.ts
|
|
798
795
|
const plugin$2 = function() {
|
|
@@ -804,9 +801,9 @@ const plugin$2 = function() {
|
|
|
804
801
|
return tree;
|
|
805
802
|
};
|
|
806
803
|
};
|
|
807
|
-
|
|
808
804
|
//#endregion
|
|
809
805
|
//#region src/lib/parse/rehype-utilities.ts
|
|
806
|
+
const DIMENSION_CHARS_REGEX = /^[\dx]+$/;
|
|
810
807
|
const processor = unified().use(plugin$2).use(remarkRehype, { allowDangerousHtml: true }).use(rehypeRaw).use(plugin$3).use(rehypeShiki, {
|
|
811
808
|
defaultLanguage: "plaintext",
|
|
812
809
|
fallbackLanguage: "plaintext",
|
|
@@ -957,7 +954,7 @@ function parseDimensionsFromAltText(alt) {
|
|
|
957
954
|
};
|
|
958
955
|
}
|
|
959
956
|
function parseDimensions(dimensions) {
|
|
960
|
-
if (
|
|
957
|
+
if (!DIMENSION_CHARS_REGEX.test(dimensions)) return {
|
|
961
958
|
width: void 0,
|
|
962
959
|
height: void 0
|
|
963
960
|
};
|
|
@@ -976,7 +973,9 @@ function parseDimensions(dimensions) {
|
|
|
976
973
|
}
|
|
977
974
|
/**
|
|
978
975
|
* Determine if a HAST tree is visually empty.
|
|
976
|
+
*
|
|
979
977
|
* @param tree - The HAST tree to check.
|
|
978
|
+
*
|
|
980
979
|
* @returns - True if the tree is visually empty, otherwise false.
|
|
981
980
|
*/
|
|
982
981
|
function isVisuallyEmpty(tree) {
|
|
@@ -1013,10 +1012,12 @@ function isVisuallyEmpty(tree) {
|
|
|
1013
1012
|
return !hasVisualContent;
|
|
1014
1013
|
}
|
|
1015
1014
|
/**
|
|
1016
|
-
* Add a first child to the first div element in a HAST tree.
|
|
1017
|
-
*
|
|
1015
|
+
* Add a first child to the first div element in a HAST tree. Intended for use
|
|
1016
|
+
* with the "div-wrapped" HAST tree generated early in `mdastToHtml`.
|
|
1017
|
+
*
|
|
1018
1018
|
* @param tree - The HAST tree to modify in place.
|
|
1019
1019
|
* @param newChild - The new child node to add.
|
|
1020
|
+
*
|
|
1020
1021
|
* @returns - The modified-in-place HAST tree.
|
|
1021
1022
|
*/
|
|
1022
1023
|
function addFirstChildToFirstDiv(tree, newChild) {
|
|
@@ -1028,7 +1029,6 @@ function addFirstChildToFirstDiv(tree, newChild) {
|
|
|
1028
1029
|
});
|
|
1029
1030
|
return tree;
|
|
1030
1031
|
}
|
|
1031
|
-
|
|
1032
1032
|
//#endregion
|
|
1033
1033
|
//#region src/lib/model/model.ts
|
|
1034
1034
|
const yankiModels = [
|
|
@@ -1093,7 +1093,6 @@ const yankiModels = [
|
|
|
1093
1093
|
];
|
|
1094
1094
|
const yankiModelNames = yankiModels.map((model) => model.modelName);
|
|
1095
1095
|
const legacyYankiModelNames = ["Yanki - Basic (and reversed card)"];
|
|
1096
|
-
|
|
1097
1096
|
//#endregion
|
|
1098
1097
|
//#region src/lib/utilities/anki-connect.ts
|
|
1099
1098
|
async function deleteNotes(client, notes, dryRun = false) {
|
|
@@ -1108,9 +1107,12 @@ async function deleteNotes(client, notes, dryRun = false) {
|
|
|
1108
1107
|
*
|
|
1109
1108
|
* Duplicates will be created if present in the source. It's up to the user to
|
|
1110
1109
|
* manage their Markdown files as they like.
|
|
1110
|
+
*
|
|
1111
1111
|
* @param client An instance of YankiConnect
|
|
1112
1112
|
* @param note The note to add
|
|
1113
|
-
* @param dryRun If true, the note will not be created and an ID of 0 will be
|
|
1113
|
+
* @param dryRun If true, the note will not be created and an ID of 0 will be
|
|
1114
|
+
* returned
|
|
1115
|
+
*
|
|
1114
1116
|
* @returns The ID of the newly created note in Anki
|
|
1115
1117
|
* @throws {Error}
|
|
1116
1118
|
*/
|
|
@@ -1142,11 +1144,14 @@ async function addNote(client, note, dryRun, fileAdapter) {
|
|
|
1142
1144
|
}
|
|
1143
1145
|
/**
|
|
1144
1146
|
* Updates a note in Anki.
|
|
1147
|
+
*
|
|
1145
1148
|
* @param client An instance of YankiConnect
|
|
1146
1149
|
* @param localNote A note read from a markdown file
|
|
1147
1150
|
* @param remoteNote A note loaded from Anki
|
|
1151
|
+
*
|
|
1148
1152
|
* @returns True if the note was updated, false otherwise.
|
|
1149
|
-
* @throws {Error} If the local note ID or remote note cards are undefined, or
|
|
1153
|
+
* @throws {Error} If the local note ID or remote note cards are undefined, or
|
|
1154
|
+
* if model/deck errors occur.
|
|
1150
1155
|
*/
|
|
1151
1156
|
async function updateNote(client, localNote, remoteNote, dryRun, fileAdapter) {
|
|
1152
1157
|
if (localNote.noteId === void 0) throw new Error("Local note ID is undefined");
|
|
@@ -1185,6 +1190,7 @@ async function updateNote(client, localNote, remoteNote, dryRun, fileAdapter) {
|
|
|
1185
1190
|
}
|
|
1186
1191
|
/**
|
|
1187
1192
|
* Helper to compare local and remote field contents.
|
|
1193
|
+
*
|
|
1188
1194
|
* @returns True if the fields are equal, false otherwise.
|
|
1189
1195
|
*/
|
|
1190
1196
|
function areFieldsEqual(localFields, remoteFields) {
|
|
@@ -1206,14 +1212,14 @@ function areNotesEqual(noteA, noteB, includeId = true) {
|
|
|
1206
1212
|
return true;
|
|
1207
1213
|
}
|
|
1208
1214
|
/**
|
|
1209
|
-
* Helper function to compare two arrays of tags.
|
|
1210
|
-
*
|
|
1211
|
-
* https://github.com/kitschpatrol/yanki-obsidian/issues/44
|
|
1212
|
-
*
|
|
1213
|
-
*
|
|
1214
|
-
* ['yes', '
|
|
1215
|
-
*
|
|
1216
|
-
*
|
|
1215
|
+
* Helper function to compare two arrays of tags. Note some nuances around case
|
|
1216
|
+
* insensitivity as discussed here:
|
|
1217
|
+
* https://github.com/kitschpatrol/yanki-obsidian/issues/44 Anki will
|
|
1218
|
+
* alphabetically sort tags, so we sort as well. Duplicate tags are ignored in
|
|
1219
|
+
* Anki, so we ignore them here: ['yes', 'yes'] is considered equal to ['yes'].
|
|
1220
|
+
* Tags in different orders are considered equal: ['yes', 'no'] is considered
|
|
1221
|
+
* equal to ['no', 'yes'].
|
|
1222
|
+
*
|
|
1217
1223
|
* @returns True if the tags are equal, false otherwise.
|
|
1218
1224
|
*/
|
|
1219
1225
|
function areTagsEqual(localTags, remoteTags) {
|
|
@@ -1223,8 +1229,11 @@ function areTagsEqual(localTags, remoteTags) {
|
|
|
1223
1229
|
}
|
|
1224
1230
|
/**
|
|
1225
1231
|
* Get all notes from Anki that match the model prefix.
|
|
1232
|
+
*
|
|
1226
1233
|
* @param client An instance of YankiConnect
|
|
1227
|
-
* @param namespace The value of the YankiNamespace field, or search with '*' to
|
|
1234
|
+
* @param namespace The value of the YankiNamespace field, or search with '*' to
|
|
1235
|
+
* get all notes. Defaults to the global default namespace.
|
|
1236
|
+
*
|
|
1228
1237
|
* @returns An array of YankiNote objects
|
|
1229
1238
|
* @throws {Error}
|
|
1230
1239
|
*/
|
|
@@ -1235,14 +1244,19 @@ async function getRemoteNotes(client, namespace = defaultGlobalOptions.namespace
|
|
|
1235
1244
|
* Get all data from Anki required to populate the YankiNote type.
|
|
1236
1245
|
*
|
|
1237
1246
|
* Handles some extra footwork to identify the deck name and validate the model
|
|
1238
|
-
* name. There's no way to get everything we need in one shot from
|
|
1247
|
+
* name. There's no way to get everything we need in one shot from
|
|
1248
|
+
* Anki-Connect.
|
|
1239
1249
|
*
|
|
1240
1250
|
* Undefined elements in the returned array are subsequently used to identify
|
|
1241
1251
|
* notes that need to be created.
|
|
1252
|
+
*
|
|
1242
1253
|
* @param client An instance of YankiConnect
|
|
1243
1254
|
* @param noteIds An array of local note IDs to (attempt) to fetch
|
|
1244
|
-
*
|
|
1245
|
-
* @
|
|
1255
|
+
*
|
|
1256
|
+
* @returns Array of YankiNote objects, with undefined for notes that could not
|
|
1257
|
+
* be found.
|
|
1258
|
+
* @throws {Error} If an unknown model name or multiple decks are found for a
|
|
1259
|
+
* note, or if no deck is found.
|
|
1246
1260
|
*/
|
|
1247
1261
|
async function getRemoteNotesById(client, noteIds) {
|
|
1248
1262
|
const ankiNotes = await client.note.notesInfo({ notes: noteIds });
|
|
@@ -1350,7 +1364,8 @@ async function deleteOrphanedDecks(client, activeNotes, originalNotes, dryRun) {
|
|
|
1350
1364
|
return decksToDelete;
|
|
1351
1365
|
}
|
|
1352
1366
|
/**
|
|
1353
|
-
* Global! Does not respect namespace. You can write namespace checks into your
|
|
1367
|
+
* Global! Does not respect namespace. You can write namespace checks into your
|
|
1368
|
+
* css if you want.
|
|
1354
1369
|
*/
|
|
1355
1370
|
async function updateModelStyle(client, modelName, css, dryRun) {
|
|
1356
1371
|
let currentCss;
|
|
@@ -1382,6 +1397,7 @@ async function getModelStyle(client, modelName = yankiModelNames[0]) {
|
|
|
1382
1397
|
}
|
|
1383
1398
|
/**
|
|
1384
1399
|
* Upload all media files for a note to Anki.
|
|
1400
|
+
*
|
|
1385
1401
|
* @returns Original source name of media files uploaded
|
|
1386
1402
|
*/
|
|
1387
1403
|
async function uploadMediaForNote(client, note, dryRun, fileAdapter) {
|
|
@@ -1455,7 +1471,9 @@ async function reconcileMedia(client, liveNotes, namespace, dryRun, fileAdapter)
|
|
|
1455
1471
|
}
|
|
1456
1472
|
/**
|
|
1457
1473
|
* Request permission to access Anki through Anki-Connect.
|
|
1458
|
-
*
|
|
1474
|
+
*
|
|
1475
|
+
* @returns 'ankiUnreachable' if Anki is not open, or 'granted' if everything is
|
|
1476
|
+
* copacetic
|
|
1459
1477
|
* @throws {Error} If access is denied
|
|
1460
1478
|
*/
|
|
1461
1479
|
async function requestPermission(client) {
|
|
@@ -1475,7 +1493,6 @@ async function syncToAnkiWeb(client) {
|
|
|
1475
1493
|
console.warn("Could not sync to AnkiWeb.");
|
|
1476
1494
|
}
|
|
1477
1495
|
}
|
|
1478
|
-
|
|
1479
1496
|
//#endregion
|
|
1480
1497
|
//#region src/lib/actions/clean.ts
|
|
1481
1498
|
const defaultCleanOptions = { ...defaultGlobalOptions };
|
|
@@ -1483,8 +1500,10 @@ const defaultCleanOptions = { ...defaultGlobalOptions };
|
|
|
1483
1500
|
* Deletes all remote notes in Anki associated with the given namespace.
|
|
1484
1501
|
*
|
|
1485
1502
|
* Use with significant caution. Mostly useful for testing.
|
|
1503
|
+
*
|
|
1486
1504
|
* @returns The IDs of the notes that were deleted
|
|
1487
|
-
* @throws {Error} If Anki is unreachable or another error occurs during
|
|
1505
|
+
* @throws {Error} If Anki is unreachable or another error occurs during
|
|
1506
|
+
* deletion.
|
|
1488
1507
|
*/
|
|
1489
1508
|
async function cleanNotes(options) {
|
|
1490
1509
|
const startTime = performance.now();
|
|
@@ -1497,7 +1516,7 @@ async function cleanNotes(options) {
|
|
|
1497
1516
|
const deletedDecks = await deleteOrphanedDecks(client, [], remoteNotes, dryRun);
|
|
1498
1517
|
const { deleted: deletedMedia } = await reconcileMedia(client, [], sanitizedNamespace, dryRun);
|
|
1499
1518
|
const isChanged = remoteNotes.length > 0 || deletedDecks.length > 0;
|
|
1500
|
-
if (!dryRun && ankiWeb && (isChanged ||
|
|
1519
|
+
if (!dryRun && ankiWeb && (isChanged || true)) await syncToAnkiWeb(client);
|
|
1501
1520
|
return {
|
|
1502
1521
|
ankiWeb,
|
|
1503
1522
|
deletedDecks,
|
|
@@ -1533,7 +1552,6 @@ function formatCleanResult(result, verbose = false) {
|
|
|
1533
1552
|
}
|
|
1534
1553
|
return lines.join("\n");
|
|
1535
1554
|
}
|
|
1536
|
-
|
|
1537
1555
|
//#endregion
|
|
1538
1556
|
//#region src/lib/actions/list.ts
|
|
1539
1557
|
const defaultListOptions = { ...defaultGlobalOptions };
|
|
@@ -1562,9 +1580,10 @@ function formatListResult(result) {
|
|
|
1562
1580
|
}
|
|
1563
1581
|
return lines.join("\n");
|
|
1564
1582
|
}
|
|
1565
|
-
|
|
1566
1583
|
//#endregion
|
|
1567
1584
|
//#region src/lib/utilities/filenames.ts
|
|
1585
|
+
const CLOZE_CONTENT_REGEX = /\{\{\w\d*\s?:{0,2}([^:}]+)/;
|
|
1586
|
+
const FILENAME_INCREMENT_SUFFIX_REGEX = /\s\(\d+\)$/;
|
|
1568
1587
|
function getSafeTitleForNote(note, manageFilenames, maxLength) {
|
|
1569
1588
|
if (manageFilenames === "off") throw new Error("manageFilenames must not be off");
|
|
1570
1589
|
switch (note.modelName) {
|
|
@@ -1581,7 +1600,7 @@ function getSafeTitleForNote(note, manageFilenames, maxLength) {
|
|
|
1581
1600
|
case "Yanki - Cloze": {
|
|
1582
1601
|
const cleanFront = getAllLinesOfHtmlAsPlainText(note.fields.Front);
|
|
1583
1602
|
const textBeforeCloze = emptyIsUndefined(cleanFront.split("{{").at(0) ?? "");
|
|
1584
|
-
const firstClozeText = emptyIsUndefined(
|
|
1603
|
+
const firstClozeText = emptyIsUndefined(CLOZE_CONTENT_REGEX.exec(cleanFront)?.at(1));
|
|
1585
1604
|
const textAfterCloze = emptyIsUndefined(cleanFront.split("}}").at(1)?.split("{{").at(0) ?? "");
|
|
1586
1605
|
switch (manageFilenames) {
|
|
1587
1606
|
case "prompt": return getSafeFilename(textBeforeCloze ?? textAfterCloze ?? firstClozeText ?? "", maxLength);
|
|
@@ -1592,8 +1611,11 @@ function getSafeTitleForNote(note, manageFilenames, maxLength) {
|
|
|
1592
1611
|
}
|
|
1593
1612
|
/**
|
|
1594
1613
|
* Get a safe filename for a media asset
|
|
1614
|
+
*
|
|
1595
1615
|
* @param text Text to be converted to a safe filename
|
|
1596
|
-
* @param maxLength If undefined, no truncation will take place. If defined, a
|
|
1616
|
+
* @param maxLength If undefined, no truncation will take place. If defined, a
|
|
1617
|
+
* maximum maximum length of the filename will be enforced.
|
|
1618
|
+
*
|
|
1597
1619
|
* @returns A safe filename
|
|
1598
1620
|
*/
|
|
1599
1621
|
function getSafeFilename(text, maxLength) {
|
|
@@ -1604,8 +1626,7 @@ function getSafeFilename(text, maxLength) {
|
|
|
1604
1626
|
if (basicSafeFilename.length === 0) basicSafeFilename = MEDIA_DEFAULT_EMPTY_FILENAME;
|
|
1605
1627
|
basicSafeFilename = basicSafeFilename.normalize("NFC");
|
|
1606
1628
|
if (maxLength === void 0) return basicSafeFilename;
|
|
1607
|
-
|
|
1608
|
-
return truncateOnWordBoundary(basicSafeFilename, safeMaxLength);
|
|
1629
|
+
return truncateOnWordBoundary(basicSafeFilename, Math.min(maxLength, 108));
|
|
1609
1630
|
}
|
|
1610
1631
|
function getUniqueFilePath(filePath, existingFilenames) {
|
|
1611
1632
|
let newFilePath = appendFilenameIncrement(filePath, 1);
|
|
@@ -1623,12 +1644,15 @@ function auditUniqueFilePath(filePath, existingFilenames) {
|
|
|
1623
1644
|
}
|
|
1624
1645
|
/**
|
|
1625
1646
|
* Strip the trailing increment from a filename
|
|
1626
|
-
*
|
|
1627
|
-
* @
|
|
1647
|
+
*
|
|
1648
|
+
* @param filename File name with or without an extension, and possibly with a
|
|
1649
|
+
* (1)
|
|
1650
|
+
*
|
|
1651
|
+
* @returns Filename without the increment
|
|
1628
1652
|
*/
|
|
1629
1653
|
function stripFilenameIncrement(filename) {
|
|
1630
1654
|
const validExtension = filename.endsWith(".") || filename.endsWith(")") ? void 0 : path.extname(filename);
|
|
1631
|
-
const strippedBaseNameWithoutExtension = path.basename(filename, validExtension).replace(
|
|
1655
|
+
const strippedBaseNameWithoutExtension = path.basename(filename, validExtension).replace(FILENAME_INCREMENT_SUFFIX_REGEX, "");
|
|
1632
1656
|
return path.join(path.dirname(filename), `${strippedBaseNameWithoutExtension}${validExtension ?? ""}`);
|
|
1633
1657
|
}
|
|
1634
1658
|
function appendFilenameIncrement(filename, value) {
|
|
@@ -1639,9 +1663,9 @@ function appendFilenameIncrement(filename, value) {
|
|
|
1639
1663
|
function getTemporarilyUniqueFilePath(filePath) {
|
|
1640
1664
|
return `${filePath}-${nanoid(8)}`;
|
|
1641
1665
|
}
|
|
1642
|
-
|
|
1643
1666
|
//#endregion
|
|
1644
1667
|
//#region src/lib/utilities/resolve-link.ts
|
|
1668
|
+
const MD_EXTENSION_REGEX = /\.md$/;
|
|
1645
1669
|
const defaultResolveLinkOptions = {
|
|
1646
1670
|
allFilePaths: [],
|
|
1647
1671
|
basePath: void 0,
|
|
@@ -1651,27 +1675,31 @@ const defaultResolveLinkOptions = {
|
|
|
1651
1675
|
/**
|
|
1652
1676
|
* Resolve a file path, URL, or wiki-style named links to an absolute path.
|
|
1653
1677
|
*
|
|
1654
|
-
* Warning:
|
|
1655
|
-
*
|
|
1656
|
-
*
|
|
1678
|
+
* Warning: Wiki name link resolution is CASE INSENSITIVE, like in Obsidian,
|
|
1679
|
+
* though the case of the matching file will be preserved in the returned path.
|
|
1680
|
+
*
|
|
1657
1681
|
* @param filePathOrUrl May be one of:
|
|
1658
|
-
*
|
|
1659
|
-
*
|
|
1660
|
-
*
|
|
1661
|
-
*
|
|
1662
|
-
*
|
|
1663
|
-
*
|
|
1664
|
-
*
|
|
1665
|
-
* (All file paths can be Windows or POSIX, with or
|
|
1666
|
-
* or without funky Obsidian-style
|
|
1667
|
-
* additions.)
|
|
1682
|
+
*
|
|
1683
|
+
* - Wiki named link
|
|
1684
|
+
* - Relative file path
|
|
1685
|
+
* - Bare file path
|
|
1686
|
+
* - Absolute file path
|
|
1687
|
+
* - HTTP protocol URL string
|
|
1688
|
+
* - File protocol URL string
|
|
1689
|
+
* - Obsidian protocol URL string (All file paths can be Windows or POSIX, with or
|
|
1690
|
+
* without URI encoding, with or without funky Obsidian-style
|
|
1691
|
+
* post-extension block and heading anchor additions.)
|
|
1692
|
+
*
|
|
1693
|
+
*
|
|
1668
1694
|
* @returns Resolved absolute path or URL One of:
|
|
1669
|
-
*
|
|
1695
|
+
*
|
|
1696
|
+
* - Resolved absolute POSIX-style paths
|
|
1670
1697
|
* - Removes any file path query parameters
|
|
1671
1698
|
* - Not URI-encoded
|
|
1672
1699
|
* - Retains original case
|
|
1673
|
-
*
|
|
1674
|
-
*
|
|
1700
|
+
* - HTTP protocol URL
|
|
1701
|
+
* - Obsidian protocol vault URL (Optionally, this will include file query
|
|
1702
|
+
* parameters)
|
|
1675
1703
|
*/
|
|
1676
1704
|
function resolveLink(filePathOrUrl, options) {
|
|
1677
1705
|
const { allFilePaths, basePath, convertFilePathsToProtocol, cwd, obsidianVaultName, type } = deepmerge(defaultResolveLinkOptions, options ?? {});
|
|
@@ -1736,27 +1764,30 @@ function resolveLink(filePathOrUrl, options) {
|
|
|
1736
1764
|
*
|
|
1737
1765
|
* See Obsidian's `getFirstLinkpathDest()` for a roughly equivalent algorithm.
|
|
1738
1766
|
*
|
|
1739
|
-
* Obsidian seems to treat note links slightly differently from image / asset
|
|
1767
|
+
* Obsidian seems to treat note links slightly differently from image / asset
|
|
1768
|
+
* links.
|
|
1769
|
+
*
|
|
1740
1770
|
* @param name Non-URI-encoded name of the file, may have file extension, if no
|
|
1741
|
-
*
|
|
1742
|
-
*
|
|
1771
|
+
* match with a non-.md extension is found, a match will be attempted with .md
|
|
1772
|
+
* regardless. (POSIX-style paths.)
|
|
1743
1773
|
* @param cwd Absolute path to the current working directory of the file from
|
|
1744
|
-
*
|
|
1774
|
+
* which we're resolving the link. (POSIX-style paths)
|
|
1745
1775
|
* @param allFilePaths Array of absolute paths to all other files in the paths
|
|
1746
|
-
*
|
|
1776
|
+
* to be considered. (POSIX-style paths.)
|
|
1777
|
+
*
|
|
1747
1778
|
* @returns Absolute path to the best matching file with the name provided, or
|
|
1748
|
-
*
|
|
1779
|
+
* undefined if there's no valid match. (POSIX-style paths.)
|
|
1749
1780
|
*/
|
|
1750
1781
|
function resolveNameLink(name, cwd, allFilePaths) {
|
|
1751
1782
|
if (allFilePaths.length === 0) return;
|
|
1752
1783
|
const [base, query] = getBaseAndQueryParts(name);
|
|
1753
|
-
const baseWithoutMd = base.replace(
|
|
1784
|
+
const baseWithoutMd = base.replace(MD_EXTENSION_REGEX, "").toLowerCase();
|
|
1754
1785
|
const pathsToName = allFilePaths.filter((filePath) => {
|
|
1755
|
-
return filePath.replace(
|
|
1786
|
+
return filePath.replace(MD_EXTENSION_REGEX, "").toLowerCase().endsWith(baseWithoutMd);
|
|
1756
1787
|
});
|
|
1757
1788
|
if (pathsToName.length === 0) return;
|
|
1758
1789
|
if (pathsToName.length === 1) return `${pathsToName[0]}${query ?? ""}`;
|
|
1759
|
-
return `${
|
|
1790
|
+
return `${pathsToName.toSorted((a, b) => {
|
|
1760
1791
|
if (!base.endsWith(".md") || base.includes(path.sep)) {
|
|
1761
1792
|
const aHasCwd = a.startsWith(cwd);
|
|
1762
1793
|
if (aHasCwd !== b.startsWith(cwd)) return aHasCwd ? -1 : 1;
|
|
@@ -1770,10 +1801,13 @@ function resolveNameLink(name, cwd, allFilePaths) {
|
|
|
1770
1801
|
/**
|
|
1771
1802
|
* Check for presence of a path in a list in a case- and query- agnostic manner.
|
|
1772
1803
|
* Ignores .md extensions to simplify matching files
|
|
1804
|
+
*
|
|
1773
1805
|
* @param filePath File path with file extension. (POSIX-style path.)
|
|
1774
|
-
* @param allFilePaths Array of absolute file paths to check. (POSIX-style
|
|
1806
|
+
* @param allFilePaths Array of absolute file paths to check. (POSIX-style
|
|
1807
|
+
* paths.)
|
|
1808
|
+
*
|
|
1775
1809
|
* @returns The file path if it is present in the list of all file paths, or
|
|
1776
|
-
*
|
|
1810
|
+
* undefined if it is not.
|
|
1777
1811
|
*/
|
|
1778
1812
|
function pathExistsInAllFiles(filePath, allFilePaths) {
|
|
1779
1813
|
const base = getBase(filePath);
|
|
@@ -1786,7 +1820,6 @@ function createObsidianVaultLink(absolutePath, basePath, obsidianVault) {
|
|
|
1786
1820
|
const relativePath = stripBasePath(absolutePath, basePath);
|
|
1787
1821
|
return `obsidian://open?vault=${encodeURIComponent(obsidianVault)}&file=${encodeURIComponent(relativePath)}`;
|
|
1788
1822
|
}
|
|
1789
|
-
|
|
1790
1823
|
//#endregion
|
|
1791
1824
|
//#region src/lib/parse/remark-resolve-links.ts
|
|
1792
1825
|
const plugin$1 = function(options) {
|
|
@@ -1827,7 +1860,6 @@ const plugin$1 = function(options) {
|
|
|
1827
1860
|
});
|
|
1828
1861
|
};
|
|
1829
1862
|
};
|
|
1830
|
-
|
|
1831
1863
|
//#endregion
|
|
1832
1864
|
//#region src/lib/parse/wiki-basic/mdast-util-wiki-basic.ts
|
|
1833
1865
|
function wikiBasicFromMarkdown() {
|
|
@@ -1893,7 +1925,6 @@ function wikiBasicFromMarkdown() {
|
|
|
1893
1925
|
this.exit(token);
|
|
1894
1926
|
}
|
|
1895
1927
|
}
|
|
1896
|
-
|
|
1897
1928
|
//#endregion
|
|
1898
1929
|
//#region src/lib/parse/wiki-basic/micromark-extension-wiki-basic.ts
|
|
1899
1930
|
function wikiBasic() {
|
|
@@ -1985,9 +2016,9 @@ function wikiBasic() {
|
|
|
1985
2016
|
return insideLabel;
|
|
1986
2017
|
}
|
|
1987
2018
|
/**
|
|
1988
|
-
* When encountering a right square bracket, we must look ahead at the next
|
|
1989
|
-
* to determine whether it indicates the end of the [[wikilink]]
|
|
1990
|
-
* simply part of the label text.
|
|
2019
|
+
* When encountering a right square bracket, we must look ahead at the next
|
|
2020
|
+
* character to determine whether it indicates the end of the [[wikilink]]
|
|
2021
|
+
* or is simply part of the label text.
|
|
1991
2022
|
*/
|
|
1992
2023
|
function lookaheadClosingMarker(code) {
|
|
1993
2024
|
if (code !== 93) return nok(code);
|
|
@@ -2095,7 +2126,6 @@ function wikiBasic() {
|
|
|
2095
2126
|
}
|
|
2096
2127
|
}
|
|
2097
2128
|
}
|
|
2098
|
-
|
|
2099
2129
|
//#endregion
|
|
2100
2130
|
//#region src/lib/parse/wiki-basic/remark-wiki-basic.ts
|
|
2101
2131
|
/**
|
|
@@ -2106,12 +2136,12 @@ function wikiBasic() {
|
|
|
2106
2136
|
*
|
|
2107
2137
|
* Obsidian also supports wiki links in Markdown-style image and link syntax, so
|
|
2108
2138
|
* handling resolution here would miss those cases, so:
|
|
2139
|
+
*
|
|
2109
2140
|
* - Resolution of wiki link into absolute paths happens later in
|
|
2110
2141
|
* remark-resolve-links.ts
|
|
2111
2142
|
* - Parsing of Obsidian-style image size from alias / alt text happens later in
|
|
2112
2143
|
* rehype-utilities.ts
|
|
2113
2144
|
*
|
|
2114
|
-
*
|
|
2115
2145
|
* Note that only wiki links support spaces in the src, regular markdown links
|
|
2116
2146
|
* MUST be URI-encoded in the Markdown source Here, we URI-encode for
|
|
2117
2147
|
* consistency with the regular image syntax in the resulting HAST `<>` escaped
|
|
@@ -2124,9 +2154,9 @@ const plugin = function() {
|
|
|
2124
2154
|
data.micromarkExtensions = [...data.micromarkExtensions ?? [], wikiBasic()];
|
|
2125
2155
|
data.fromMarkdownExtensions = [...data.fromMarkdownExtensions ?? [], wikiBasicFromMarkdown()];
|
|
2126
2156
|
};
|
|
2127
|
-
|
|
2128
2157
|
//#endregion
|
|
2129
2158
|
//#region src/lib/parse/remark-utilities.ts
|
|
2159
|
+
const CLOZE_NUMBER_PREFIX_REGEX = /^[(|]?(\d{1,2})(?:[\s).|]|$)(.*)$/;
|
|
2130
2160
|
const defaultAstFromMarkdownOptions = { ...defaultGlobalOptions };
|
|
2131
2161
|
async function getAstFromMarkdown(markdown, options) {
|
|
2132
2162
|
const { allFilePaths, basePath, cwd, obsidianVault, resolveUrls } = deepmerge(defaultAstFromMarkdownOptions, options ?? {});
|
|
@@ -2156,13 +2186,16 @@ function deleteFirstNodeOfType(tree, nodeType) {
|
|
|
2156
2186
|
return tree;
|
|
2157
2187
|
}
|
|
2158
2188
|
/**
|
|
2159
|
-
* Trims all leading spaces from the first text node and all trailing spaces
|
|
2160
|
-
* the last text node in an array of phrasing content nodes.
|
|
2189
|
+
* Trims all leading spaces from the first text node and all trailing spaces
|
|
2190
|
+
* from the last text node in an array of phrasing content nodes.
|
|
2161
2191
|
*
|
|
2162
2192
|
* This is useful in cases where surrounding white space in text nodes is not
|
|
2163
2193
|
* necessary and should be removed to clean up the content.
|
|
2194
|
+
*
|
|
2164
2195
|
* @param nodes - An array of phrasing content nodes.
|
|
2165
|
-
*
|
|
2196
|
+
*
|
|
2197
|
+
* @returns The modified array of nodes with leading and trailing spaces
|
|
2198
|
+
* trimmed.
|
|
2166
2199
|
*/
|
|
2167
2200
|
function trimLeadingAndTrailingSpaces(nodes) {
|
|
2168
2201
|
const firstNode = nodes.at(0);
|
|
@@ -2182,7 +2215,7 @@ function replaceDeleteNodesWithClozeMarkup(ast) {
|
|
|
2182
2215
|
visit(ast, "delete", (node, index, parent) => {
|
|
2183
2216
|
if (parent === void 0 || index === void 0 || !("children" in node) || node.children.length === 0) return CONTINUE;
|
|
2184
2217
|
if (node.children.length > 0 && isText(node.children[0])) {
|
|
2185
|
-
const result =
|
|
2218
|
+
const result = CLOZE_NUMBER_PREFIX_REGEX.exec(node.children[0].value);
|
|
2186
2219
|
if (result !== null && (node.children.length > 1 || (result.at(2) ?? "").length > 0)) {
|
|
2187
2220
|
const possibleClozeIndex = Number.parseInt(result.at(1) ?? "", 10);
|
|
2188
2221
|
if (!Number.isNaN(possibleClozeIndex)) {
|
|
@@ -2304,7 +2337,6 @@ function removeLastEmphasis(ast) {
|
|
|
2304
2337
|
return lastEmphasisNode;
|
|
2305
2338
|
}
|
|
2306
2339
|
}
|
|
2307
|
-
|
|
2308
2340
|
//#endregion
|
|
2309
2341
|
//#region src/lib/parse/parse.ts
|
|
2310
2342
|
const defaultGetNoteFromMarkdownOptions = {
|
|
@@ -2463,10 +2495,24 @@ async function getNoteFromMarkdown(markdown, options) {
|
|
|
2463
2495
|
tags: obsidianTagsToAnkiTags(frontmatter.tags)
|
|
2464
2496
|
};
|
|
2465
2497
|
}
|
|
2498
|
+
/**
|
|
2499
|
+
* Obsidian delimits nested tags with a `/`
|
|
2500
|
+
*
|
|
2501
|
+
* Anki delimits nested tags with `::`
|
|
2502
|
+
*
|
|
2503
|
+
* '' and `:` are not permitted in Obsidian tags
|
|
2504
|
+
*
|
|
2505
|
+
* Curiously, Obsidian allows just `/` and `this//////that` as valid tags,
|
|
2506
|
+
* though `/` tags are broken. Fixes
|
|
2507
|
+
* https://github.com/kitschpatrol/yanki-obsidian/issues/20
|
|
2508
|
+
*
|
|
2509
|
+
* We also force coercion to an array of strings (even though non-string tag
|
|
2510
|
+
* values shouldn't really be allowed in the first place) to handle edge cases
|
|
2511
|
+
* like https://github.com/kitschpatrol/yanki/issues/12
|
|
2512
|
+
*/
|
|
2466
2513
|
function obsidianTagsToAnkiTags(tags) {
|
|
2467
|
-
return (
|
|
2514
|
+
return (Array.isArray(tags) ? tags : tags === void 0 ? [] : [tags]).map((tag) => String(tag).replaceAll("/", "::"));
|
|
2468
2515
|
}
|
|
2469
|
-
|
|
2470
2516
|
//#endregion
|
|
2471
2517
|
//#region src/lib/actions/load-local-notes.ts
|
|
2472
2518
|
const defaultLoadOptions = { ...defaultGlobalOptions };
|
|
@@ -2500,29 +2546,29 @@ async function loadLocalNotes(allLocalFilePaths, options) {
|
|
|
2500
2546
|
}
|
|
2501
2547
|
const defaultDeckNamesFromFilePathsOptions = { mode: "common-root" };
|
|
2502
2548
|
/**
|
|
2503
|
-
* Helper function to infer deck names from file paths if `deckName` not defined
|
|
2549
|
+
* Helper function to infer deck names from file paths if `deckName` not defined
|
|
2550
|
+
* in the note's frontmatter.
|
|
2504
2551
|
*
|
|
2505
2552
|
* `deckName` will always override the inferred deck name.
|
|
2506
2553
|
*
|
|
2507
2554
|
* Depends on the context of _all_ file paths passed to `syncNoteFiles`.
|
|
2508
2555
|
*
|
|
2509
|
-
* Example of paths -> deck names with `common-root`:
|
|
2510
|
-
* /base/foo/note.md -> foo
|
|
2556
|
+
* Example of paths -> deck names with `common-root`: /base/foo/note.md -> foo
|
|
2511
2557
|
* /base/foo/baz/note.md -> foo::baz
|
|
2512
2558
|
*
|
|
2513
|
-
* Example of paths -> deck names with `common-root`:
|
|
2514
|
-
* /base/foo/note.md -> foo
|
|
2559
|
+
* Example of paths -> deck names with `common-root`: /base/foo/note.md -> foo
|
|
2515
2560
|
* /base/foo/note.md -> foo
|
|
2516
2561
|
*
|
|
2517
|
-
* Example of paths -> deck names with `common-parent`:
|
|
2518
|
-
* /base/foo/note.md -> base::foo
|
|
2519
|
-
* /base/foo/baz/note.md -> base::foo::baz
|
|
2562
|
+
* Example of paths -> deck names with `common-parent`: /base/foo/note.md ->
|
|
2563
|
+
* base::foo /base/foo/baz/note.md -> base::foo::baz
|
|
2520
2564
|
*
|
|
2521
|
-
* Example of paths -> deck names with `common-parent`:
|
|
2565
|
+
* Example of paths -> deck names with `common-parent`: /base/foo/note.md -> foo
|
|
2522
2566
|
* /base/foo/note.md -> foo
|
|
2523
|
-
*
|
|
2524
|
-
* @param absoluteFilePaths Absolute paths to all markdown Anki note files.
|
|
2525
|
-
*
|
|
2567
|
+
*
|
|
2568
|
+
* @param absoluteFilePaths Absolute paths to all markdown Anki note files.
|
|
2569
|
+
* (Ensures proper resolution if path module is polyfilled.)
|
|
2570
|
+
*
|
|
2571
|
+
* @returns Array of ::-delimited deck paths
|
|
2526
2572
|
*/
|
|
2527
2573
|
function getDeckNamesFromFilePaths(absoluteFilePaths, options) {
|
|
2528
2574
|
const { mode } = deepmerge(defaultDeckNamesFromFilePathsOptions, options ?? {});
|
|
@@ -2535,7 +2581,6 @@ function getDeckNamesFromFilePaths(absoluteFilePaths, options) {
|
|
|
2535
2581
|
const offset = mode === "common-parent" ? lastSegmentHasFile ? 1 : 1 : lastSegmentHasFile ? 1 : 0;
|
|
2536
2582
|
return filePathSegments.map((pathSegments) => pathSegments.slice(commonPathSegments.length - offset).join("::"));
|
|
2537
2583
|
}
|
|
2538
|
-
|
|
2539
2584
|
//#endregion
|
|
2540
2585
|
//#region src/lib/actions/rename.ts
|
|
2541
2586
|
const defaultRenameNotesOptions = { ...defaultGlobalOptions };
|
|
@@ -2601,7 +2646,6 @@ async function renameFiles(allLocalFilePaths, options) {
|
|
|
2601
2646
|
})
|
|
2602
2647
|
};
|
|
2603
2648
|
}
|
|
2604
|
-
|
|
2605
2649
|
//#endregion
|
|
2606
2650
|
//#region src/lib/actions/style.ts
|
|
2607
2651
|
const defaultSetStyleOptions = {
|
|
@@ -2636,7 +2680,7 @@ async function setStyle(options) {
|
|
|
2636
2680
|
});
|
|
2637
2681
|
}
|
|
2638
2682
|
const isChanged = modelsReport.some((model) => model.action !== "unchanged");
|
|
2639
|
-
if (!dryRun && ankiWeb && (isChanged ||
|
|
2683
|
+
if (!dryRun && ankiWeb && (isChanged || true)) await syncToAnkiWeb(client);
|
|
2640
2684
|
return {
|
|
2641
2685
|
ankiWeb,
|
|
2642
2686
|
dryRun,
|
|
@@ -2661,26 +2705,27 @@ function formatSetStyleResult(result, verbose = false) {
|
|
|
2661
2705
|
}
|
|
2662
2706
|
return lines.join("\n");
|
|
2663
2707
|
}
|
|
2664
|
-
|
|
2665
2708
|
//#endregion
|
|
2666
2709
|
//#region src/lib/model/frontmatter.ts
|
|
2710
|
+
const NEWLINE_REGEX = /\r?\n/;
|
|
2667
2711
|
/**
|
|
2668
2712
|
* Update the noteId in the frontmatter of a markdown string.
|
|
2669
2713
|
*
|
|
2670
2714
|
* Used when a noteId is received from Anki after creating a note.
|
|
2671
2715
|
*
|
|
2672
|
-
*
|
|
2673
2716
|
* String manipulation is ugly, but it ensures that the markdown format is
|
|
2674
2717
|
* preserved verbatim. Running it through the unified AST and then
|
|
2675
2718
|
* remarkStringify would possibly change the format.
|
|
2719
|
+
*
|
|
2676
2720
|
* @param markdown Raw markdown string with frontmatter.
|
|
2677
|
-
* @param noteId
|
|
2678
|
-
*
|
|
2721
|
+
* @param noteId The value to set the noteId to. If undefined, the noteId will
|
|
2722
|
+
* be removed from the frontmatter. (Useful for testing.)
|
|
2723
|
+
*
|
|
2679
2724
|
* @returns Raw markdown string with updated frontmatter.
|
|
2680
2725
|
*/
|
|
2681
2726
|
async function setNoteIdInFrontmatter(markdown, noteId) {
|
|
2682
2727
|
const [frontmatterStart, frontmatterEnd] = getFrontmatterRange(markdown);
|
|
2683
|
-
const lines = markdown.split(
|
|
2728
|
+
const lines = markdown.split(NEWLINE_REGEX);
|
|
2684
2729
|
if (frontmatterStart === void 0 || frontmatterEnd === void 0) {
|
|
2685
2730
|
if (noteId === void 0) return markdown;
|
|
2686
2731
|
return [
|
|
@@ -2707,22 +2752,23 @@ async function setNoteIdInFrontmatter(markdown, noteId) {
|
|
|
2707
2752
|
].join("\n");
|
|
2708
2753
|
}
|
|
2709
2754
|
function getFrontmatterRange(markdown) {
|
|
2710
|
-
const lines = markdown.split(
|
|
2755
|
+
const lines = markdown.split(NEWLINE_REGEX);
|
|
2711
2756
|
if (!lines.join("").trim().startsWith("---")) return [void 0, void 0];
|
|
2712
2757
|
const frontmatterStart = lines.findIndex((line) => line.startsWith("---"));
|
|
2713
2758
|
const frontmatterEnd = lines.findIndex((line, index) => index > frontmatterStart && line.startsWith("---"));
|
|
2714
2759
|
if (frontmatterStart === -1 || frontmatterEnd === -1) return [void 0, void 0];
|
|
2715
2760
|
return [frontmatterStart, frontmatterEnd];
|
|
2716
2761
|
}
|
|
2717
|
-
|
|
2718
2762
|
//#endregion
|
|
2719
2763
|
//#region src/lib/actions/sync-notes.ts
|
|
2720
2764
|
const defaultSyncNotesOptions = { ...defaultGlobalOptions };
|
|
2721
2765
|
/**
|
|
2722
2766
|
* Syncs local notes to Anki.
|
|
2767
|
+
*
|
|
2723
2768
|
* @param allLocalNotes All the YankiNotes to sync
|
|
2769
|
+
*
|
|
2724
2770
|
* @returns The synced notes (with new IDs where applicable), plus some stats
|
|
2725
|
-
*
|
|
2771
|
+
* about the sync
|
|
2726
2772
|
* @throws {Error} For various reasons...
|
|
2727
2773
|
*/
|
|
2728
2774
|
async function syncNotes(allLocalNotes, options) {
|
|
@@ -2810,12 +2856,13 @@ async function syncNotes(allLocalNotes, options) {
|
|
|
2810
2856
|
} catch {
|
|
2811
2857
|
fixedDatabase = true;
|
|
2812
2858
|
await client.graphical.guiCheckDatabase();
|
|
2859
|
+
await client.miscellaneous.reloadCollection();
|
|
2813
2860
|
}
|
|
2814
2861
|
}
|
|
2815
2862
|
}
|
|
2816
2863
|
const { deleted: deletedMedia, reuploaded: reuploadedMedia } = await reconcileMedia(client, liveNotes, sanitizedNamespace, dryRun, fileAdapter ?? void 0);
|
|
2817
2864
|
const isChanged = deletedDecks.length > 0 || synced.some((note) => note.action !== "unchanged");
|
|
2818
|
-
if (!dryRun && ankiWeb && (isChanged ||
|
|
2865
|
+
if (!dryRun && ankiWeb && (isChanged || true)) await syncToAnkiWeb(client);
|
|
2819
2866
|
return {
|
|
2820
2867
|
ankiWeb,
|
|
2821
2868
|
deletedDecks,
|
|
@@ -2837,7 +2884,6 @@ function selectNoteToKeep(duplicates, remoteNote) {
|
|
|
2837
2884
|
function findRemoteContentMatchId(localNote, remoteNotes, matchedIds) {
|
|
2838
2885
|
return remoteNotes.find((remoteNote) => remoteNote.noteId !== void 0 && !matchedIds.has(remoteNote.noteId) && areNotesEqual(localNote, remoteNote, false))?.noteId ?? void 0;
|
|
2839
2886
|
}
|
|
2840
|
-
|
|
2841
2887
|
//#endregion
|
|
2842
2888
|
//#region src/lib/actions/sync-files.ts
|
|
2843
2889
|
const defaultSyncFilesOptions = {
|
|
@@ -2851,9 +2897,11 @@ const defaultSyncFilesOptions = {
|
|
|
2851
2897
|
*
|
|
2852
2898
|
* Most importantly, it updates the note IDs in the frontmatter of the local
|
|
2853
2899
|
* files.
|
|
2900
|
+
*
|
|
2854
2901
|
* @param allLocalFilePaths Array of paths to the local markdown files
|
|
2902
|
+
*
|
|
2855
2903
|
* @returns The synced files (with new IDs where applicable), plus some stats
|
|
2856
|
-
*
|
|
2904
|
+
* about the sync
|
|
2857
2905
|
* @throws {Error} If syncing fails or file operations encounter an error.
|
|
2858
2906
|
*/
|
|
2859
2907
|
async function syncFiles(allLocalFilePaths, options) {
|
|
@@ -2958,6 +3006,5 @@ function formatSyncFilesResult(result, verbose = false) {
|
|
|
2958
3006
|
}
|
|
2959
3007
|
return lines.join("\n");
|
|
2960
3008
|
}
|
|
2961
|
-
|
|
2962
3009
|
//#endregion
|
|
2963
|
-
export { cleanNotes, defaultCleanOptions, defaultGetNoteFromMarkdownOptions, defaultGetStyleOptions, defaultListOptions, defaultRenameFilesOptions, defaultSetStyleOptions, defaultSyncFilesOptions, defaultSyncNotesOptions, formatCleanResult, formatListResult, formatSetStyleResult, formatSyncFilesResult, getNoteFromMarkdown, getStyle, hostAndPortToUrl, listNotes, renameFiles, setStyle, syncFiles, syncNotes, urlToHostAndPort };
|
|
3010
|
+
export { cleanNotes, defaultCleanOptions, defaultGetNoteFromMarkdownOptions, defaultGetStyleOptions, defaultListOptions, defaultRenameFilesOptions, defaultSetStyleOptions, defaultSyncFilesOptions, defaultSyncNotesOptions, formatCleanResult, formatListResult, formatSetStyleResult, formatSyncFilesResult, getNoteFromMarkdown, getStyle, hostAndPortToUrl, listNotes, renameFiles, setStyle, syncFiles, syncNotes, urlToHostAndPort };
|