yanki 1.2.11 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cli.js +58 -9
- package/dist/lib/index.d.ts +144 -1604
- package/dist/lib/index.js +50 -1
- package/package.json +31 -26
- package/readme.md +2 -2
- package/dist/abap-Dg923wIy.js +0 -1
- package/dist/actionscript-3-8WTK4YD2.js +0 -1
- package/dist/ada-CTi7YQtL.js +0 -1
- package/dist/andromeeda-CT0vplkN.js +0 -1
- package/dist/angular-html-rCdPnZ8w.js +0 -1
- package/dist/angular-ts-DYCYVCHu.js +0 -1
- package/dist/apache-PcO-DBxQ.js +0 -1
- package/dist/apex-CnCu5_gb.js +0 -1
- package/dist/apl-B743j01p.js +0 -1
- package/dist/applescript-BWh8DkcF.js +0 -1
- package/dist/ara-C1--7J61.js +0 -1
- package/dist/asciidoc-CkWYjVYI.js +0 -1
- package/dist/asm-CTFRnVOM.js +0 -1
- package/dist/astro-DHbdk5O0.js +0 -1
- package/dist/aurora-x-C0VKFdlO.js +0 -1
- package/dist/awk-CrWgQKhV.js +0 -1
- package/dist/ayu-dark-BJpTlUew.js +0 -1
- package/dist/ayu-light-O0eOCvqE.js +0 -1
- package/dist/ayu-mirage-BC8LA-_7.js +0 -1
- package/dist/ballerina-a0yOSyc5.js +0 -1
- package/dist/bat-B0cHNp6s.js +0 -1
- package/dist/beancount-dPJi_gci.js +0 -1
- package/dist/berry-CVKoklHx.js +0 -1
- package/dist/bibtex-DRcCXNgM.js +0 -1
- package/dist/bicep-jWz-hQ8I.js +0 -1
- package/dist/blade-h41ErOi-.js +0 -1
- package/dist/bsl-C7rNYC9b.js +0 -1
- package/dist/c-BG-tZi7o.js +0 -1
- package/dist/c3-2rTjmrCP.js +0 -1
- package/dist/cadence-BuaeHeSu.js +0 -1
- package/dist/cairo-BHkUC1B6.js +0 -1
- package/dist/catppuccin-frappe-D3lHSMns.js +0 -1
- package/dist/catppuccin-latte-DoBaWTGn.js +0 -1
- package/dist/catppuccin-macchiato-BkAuvdZC.js +0 -1
- package/dist/catppuccin-mocha-D9fcC0iT.js +0 -1
- package/dist/clarity-CC_0IFDj.js +0 -1
- package/dist/clojure-KnfDkB_V.js +0 -1
- package/dist/cmake-bh2MLnkv.js +0 -1
- package/dist/cobol-WHXSr_Wd.js +0 -1
- package/dist/codeowners-CtwIM3TN.js +0 -1
- package/dist/codeql-D164juXQ.js +0 -1
- package/dist/coffee-BWKAfs2s.js +0 -1
- package/dist/common-lisp-DXc9XcIM.js +0 -1
- package/dist/coq-BCSFDxg0.js +0 -1
- package/dist/cpp-CTmscSNZ.js +0 -1
- package/dist/crystal-BFJuErkW.js +0 -1
- package/dist/csharp-B7nLXyi8.js +0 -1
- package/dist/css-PZBBrkI0.js +0 -1
- package/dist/csv-D5aBhKLr.js +0 -1
- package/dist/cue-WCin6O4e.js +0 -1
- package/dist/cypher-DYQk2G82.js +0 -1
- package/dist/d-DVc-yF-l.js +0 -1
- package/dist/dark-plus-DLU5INA3.js +0 -1
- package/dist/dart-YLd5yyRs.js +0 -1
- package/dist/dax-oldcCaJg.js +0 -1
- package/dist/desktop-DZfyBMgF.js +0 -1
- package/dist/diff-jW5kmiru.js +0 -1
- package/dist/docker-DG9neUKd.js +0 -1
- package/dist/dotenv-Bea-FkXq.js +0 -1
- package/dist/dracula-XcYHBZy6.js +0 -1
- package/dist/dracula-soft-BPeX9gxW.js +0 -1
- package/dist/dream-maker-DAHQwpwp.js +0 -1
- package/dist/edge-BvW7BRWT.js +0 -1
- package/dist/elixir-C40XQAD9.js +0 -1
- package/dist/elm-DzXNHNQT.js +0 -1
- package/dist/emacs-lisp-BdGsgvrR.js +0 -1
- package/dist/erb-C4CxwLi_.js +0 -1
- package/dist/erlang-Jhp2iHYS.js +0 -1
- package/dist/everforest-dark-WOub3wle.js +0 -1
- package/dist/everforest-light-DCUg8VH8.js +0 -1
- package/dist/fennel-BH6gVCng.js +0 -1
- package/dist/fish-BxskpYPN.js +0 -1
- package/dist/fluent-Bwo2XpEt.js +0 -1
- package/dist/fortran-fixed-form-DoFUIhSC.js +0 -1
- package/dist/fortran-free-form-DB5N_DgY.js +0 -1
- package/dist/fsharp-DHaf8n3s.js +0 -1
- package/dist/gdresource--mAQ4nUO.js +0 -1
- package/dist/gdscript-C3mT4Uym.js +0 -1
- package/dist/gdshader-G7X6ysY3.js +0 -1
- package/dist/genie-DSsjfZMX.js +0 -1
- package/dist/gherkin-Cbsyuvab.js +0 -1
- package/dist/git-commit-CesLaiSz.js +0 -1
- package/dist/git-rebase-B9wKr8Mu.js +0 -1
- package/dist/github-dark-BQV5ugrc.js +0 -1
- package/dist/github-dark-default-DLWDM7FH.js +0 -1
- package/dist/github-dark-dimmed-D1FmiR_p.js +0 -1
- package/dist/github-dark-high-contrast-BilLoi0o.js +0 -1
- package/dist/github-light-Rcb2q3L5.js +0 -1
- package/dist/github-light-default-CQ75esMw.js +0 -1
- package/dist/github-light-high-contrast-CRF1wyLy.js +0 -1
- package/dist/gleam-BeBqoPwE.js +0 -1
- package/dist/glimmer-js-3dwOmeU7.js +0 -1
- package/dist/glimmer-ts-CGrdEN9y.js +0 -1
- package/dist/glsl-CJ5UNUz7.js +0 -1
- package/dist/gn-Dxr0sSUf.js +0 -1
- package/dist/gnuplot-CtW3R_Hz.js +0 -1
- package/dist/go-BBr2UQCn.js +0 -1
- package/dist/graphql-BXLvmlOo.js +0 -1
- package/dist/groovy-DFxE31Qs.js +0 -1
- package/dist/gruvbox-dark-hard-C37G1gbc.js +0 -1
- package/dist/gruvbox-dark-medium-C3G9m3TV.js +0 -1
- package/dist/gruvbox-dark-soft-eZmcmZ9I.js +0 -1
- package/dist/gruvbox-light-hard-BYj-vz_3.js +0 -1
- package/dist/gruvbox-light-medium-BdQlDiiF.js +0 -1
- package/dist/gruvbox-light-soft-BGNwjiRh.js +0 -1
- package/dist/hack-BVNIISZD.js +0 -1
- package/dist/haml-CNL2qJ9f.js +0 -1
- package/dist/handlebars-X5srullM.js +0 -1
- package/dist/haskell-CeCR1-Hh.js +0 -1
- package/dist/haxe-DVIybFAS.js +0 -1
- package/dist/hcl-B6OePqme.js +0 -1
- package/dist/hjson-D2jn7IRw.js +0 -1
- package/dist/hlsl-MKeth5V9.js +0 -1
- package/dist/horizon-cslQss18.js +0 -1
- package/dist/houston-RHIKkNfR.js +0 -1
- package/dist/html-B4bznzA2.js +0 -1
- package/dist/html-derivative-CD1Z7kSG.js +0 -1
- package/dist/http-Bb0P8zvE.js +0 -1
- package/dist/hurl-DdMgw5nt.js +0 -1
- package/dist/hxml-BdTS9Zj7.js +0 -1
- package/dist/hy-BZMqGtQj.js +0 -1
- package/dist/imba-D-Pk5S0X.js +0 -1
- package/dist/index-ClVrxBsa.js +0 -2
- package/dist/ini-Dix3pTmg.js +0 -1
- package/dist/java-BTDmaRNO.js +0 -1
- package/dist/javascript-WyGyM1wV.js +0 -1
- package/dist/jinja-Cibv3n81.js +0 -1
- package/dist/jison-CZOoZOej.js +0 -1
- package/dist/json-B8JryHcM.js +0 -1
- package/dist/json5-Cdatmj9n.js +0 -1
- package/dist/jsonc-CvUCa1o5.js +0 -1
- package/dist/jsonl-9I_GBd5L.js +0 -1
- package/dist/jsonnet-XoenQ2oc.js +0 -1
- package/dist/jssm-CWE2S0Z5.js +0 -1
- package/dist/jsx-8cLv2Six.js +0 -1
- package/dist/julia-DIzTBDVk.js +0 -1
- package/dist/kanagawa-dragon-BOvIHJVT.js +0 -1
- package/dist/kanagawa-lotus-Bwcd7Bvx.js +0 -1
- package/dist/kanagawa-wave-0SAlpf0s.js +0 -1
- package/dist/kdl-CMbyIXjQ.js +0 -1
- package/dist/kotlin-BQy537ds.js +0 -1
- package/dist/kusto-B_y0uMaZ.js +0 -1
- package/dist/laserwave-si7wuSrt.js +0 -1
- package/dist/latex-B3uSg0EJ.js +0 -1
- package/dist/lean-7hWDN_w4.js +0 -1
- package/dist/less-CaoNcwlE.js +0 -1
- package/dist/light-plus-g_Fi9vkG.js +0 -1
- package/dist/liquid-e5bbsXXe.js +0 -1
- package/dist/llvm-CiYQeg8E.js +0 -1
- package/dist/log-CcaF_xNv.js +0 -1
- package/dist/logo-D9WQLoKQ.js +0 -1
- package/dist/lua-CCXtT60v.js +0 -1
- package/dist/luau-BTSFCcFb.js +0 -1
- package/dist/make-DXVx14cr.js +0 -1
- package/dist/markdown-DX-TNHnc.js +0 -1
- package/dist/marko-CFpKsLoh.js +0 -1
- package/dist/material-theme-CIJ3cGaW.js +0 -1
- package/dist/material-theme-darker-BWg3m1GB.js +0 -1
- package/dist/material-theme-lighter-DR8HWMN7.js +0 -1
- package/dist/material-theme-ocean-CZf9pk28.js +0 -1
- package/dist/material-theme-palenight-BF01YeZy.js +0 -1
- package/dist/matlab-DzreyMvm.js +0 -1
- package/dist/mdc-BX9nsEef.js +0 -1
- package/dist/mdx-C2fqO2XY.js +0 -1
- package/dist/mermaid-Cwy4Up_p.js +0 -1
- package/dist/min-dark-DhfaepVE.js +0 -1
- package/dist/min-light-6xx0uMgm.js +0 -1
- package/dist/mipsasm-yE_Aqo9y.js +0 -1
- package/dist/mojo-Bk-6ipf4.js +0 -1
- package/dist/monokai-BodnsaDQ.js +0 -1
- package/dist/moonbit-C7bLf9Bh.js +0 -1
- package/dist/move-CyYMWVy5.js +0 -1
- package/dist/narrat-DXUZ_ZkW.js +0 -1
- package/dist/nextflow-MPHPbw14.js +0 -1
- package/dist/nginx-DGL4151v.js +0 -1
- package/dist/night-owl-EdP2Hztp.js +0 -1
- package/dist/night-owl-light-Bk-lYVyk.js +0 -1
- package/dist/nim-CvfVE-Jm.js +0 -1
- package/dist/nix-Ckjrpg0r.js +0 -1
- package/dist/nord-BAu0wM6c.js +0 -1
- package/dist/nushell-8dnicoUR.js +0 -1
- package/dist/objective-c-BoaBTdtz.js +0 -1
- package/dist/objective-cpp-DstR8hNy.js +0 -1
- package/dist/ocaml-DTbn2Hv7.js +0 -1
- package/dist/odin-Bxc4S6Xn.js +0 -1
- package/dist/one-dark-pro-utPxbBbJ.js +0 -1
- package/dist/one-light-BuCQ22aO.js +0 -1
- package/dist/openscad-CXHpNBsb.js +0 -1
- package/dist/pascal-Sr-XLSE6.js +0 -1
- package/dist/perl-Dl-vCdjY.js +0 -1
- package/dist/php-BnUU948c.js +0 -1
- package/dist/pkl-CRusufhw.js +0 -1
- package/dist/plastic-CXnNNlFZ.js +0 -1
- package/dist/plsql-Dbm3tV2N.js +0 -1
- package/dist/po-LG0lFwH4.js +0 -1
- package/dist/poimandres-BrOVMvuE.js +0 -1
- package/dist/polar-DjOs3GWb.js +0 -1
- package/dist/postcss-GRRkWn2F.js +0 -1
- package/dist/powerquery-DHf-dtTS.js +0 -1
- package/dist/powershell-CubgGmZX.js +0 -1
- package/dist/prisma-Dgf8IN_C.js +0 -1
- package/dist/prolog-9JcfiY6I.js +0 -1
- package/dist/proto-dqx_Sj2i.js +0 -1
- package/dist/pug-jKFt5v09.js +0 -1
- package/dist/puppet-B4ctDsrh.js +0 -1
- package/dist/purescript-B-mlhevv.js +0 -1
- package/dist/python-B6Ihcp-E.js +0 -1
- package/dist/qml-CXQr5hi3.js +0 -1
- package/dist/qmldir-DXd9s5XC.js +0 -1
- package/dist/qss-B7NnhfIi.js +0 -1
- package/dist/r-1ts4xG1r.js +0 -1
- package/dist/racket-CrxT4k8p.js +0 -1
- package/dist/raku-B9ngR1rt.js +0 -1
- package/dist/razor-AVvyMHo4.js +0 -1
- package/dist/red-DR6ZwibK.js +0 -1
- package/dist/reg-Cvyu2Gnx.js +0 -1
- package/dist/regexp-DK-WlHNu.js +0 -1
- package/dist/rel-CYd0g8C5.js +0 -1
- package/dist/riscv-C5dpdlr7.js +0 -1
- package/dist/ron-U45VO4hY.js +0 -1
- package/dist/rose-pine-Cd1NG3HO.js +0 -1
- package/dist/rose-pine-dawn-eauBvPfk.js +0 -1
- package/dist/rose-pine-moon-B3tSb9zr.js +0 -1
- package/dist/rosmsg-ZkSIzPhc.js +0 -1
- package/dist/rst-DwFZPvOu.js +0 -1
- package/dist/ruby-C0v-A00B.js +0 -1
- package/dist/rust-CxuBE0J8.js +0 -1
- package/dist/sas-9Dvcn_Se.js +0 -1
- package/dist/sass-bfEVHPJ8.js +0 -1
- package/dist/scala-Dtw19ca_.js +0 -1
- package/dist/scheme-OJppFQF3.js +0 -1
- package/dist/scss-CFlr0x0u.js +0 -1
- package/dist/sdbl-Bd9eE8IL.js +0 -1
- package/dist/shaderlab-CJHdEwFw.js +0 -1
- package/dist/shellscript-DgJyDXW6.js +0 -1
- package/dist/shellsession-BqFY_Jl7.js +0 -1
- package/dist/slack-dark-CWRQmTmo.js +0 -1
- package/dist/slack-ochin-DO_ok7XK.js +0 -1
- package/dist/smalltalk-B9IHbYt7.js +0 -1
- package/dist/snazzy-light-B5llO_gK.js +0 -1
- package/dist/solarized-dark-G9yBjKj_.js +0 -1
- package/dist/solarized-light-DeSzljQz.js +0 -1
- package/dist/solidity-B3CjIuAd.js +0 -1
- package/dist/soy-BnGnvCkT.js +0 -1
- package/dist/sparql-Ckj_9Rg5.js +0 -1
- package/dist/splunk-h-bNAnbk.js +0 -1
- package/dist/sql-BbONfI8K.js +0 -1
- package/dist/ssh-config-CywOjoXH.js +0 -1
- package/dist/stata-eYSq_k6x.js +0 -1
- package/dist/stylus-CIg617SB.js +0 -1
- package/dist/surrealql-W2k3R_tb.js +0 -1
- package/dist/svelte-Bq7yX3Ip.js +0 -1
- package/dist/swift-D8uC5CNv.js +0 -1
- package/dist/sync-files-Zngz3Rg8.js +0 -962
- package/dist/synthwave-84-DRVv-_m_.js +0 -1
- package/dist/system-verilog-Qdm_1g2q.js +0 -1
- package/dist/systemd-DMp0udv_.js +0 -1
- package/dist/talonscript-eRuyeYHl.js +0 -1
- package/dist/tasl-B9CVvjfG.js +0 -1
- package/dist/tcl-Bq9dbVAF.js +0 -1
- package/dist/templ-BIQx08BK.js +0 -1
- package/dist/terraform-CAp711iT.js +0 -1
- package/dist/tex-Dpq9weyt.js +0 -1
- package/dist/tokyo-night-BvwC8l2v.js +0 -1
- package/dist/toml-Ms459DBw.js +0 -1
- package/dist/ts-tags-D-LANnn2.js +0 -1
- package/dist/tsv-BFtm7NXx.js +0 -1
- package/dist/tsx-D6116Ycy.js +0 -1
- package/dist/turtle-DpRhbQZY.js +0 -1
- package/dist/twig-BCfKcIax.js +0 -1
- package/dist/typescript-BqvgUolh.js +0 -1
- package/dist/typespec-DhK7u29_.js +0 -1
- package/dist/typst-Dfd71gQj.js +0 -1
- package/dist/v-BH76v7br.js +0 -1
- package/dist/vala-z59IxkFd.js +0 -1
- package/dist/vb-4AxSLKIU.js +0 -1
- package/dist/verilog-LfQUkHDc.js +0 -1
- package/dist/vesper--t9w6MWz.js +0 -1
- package/dist/vhdl-DJCsFYgn.js +0 -1
- package/dist/viml-pbKHW3Ia.js +0 -1
- package/dist/vitesse-black-B_BYPdvp.js +0 -1
- package/dist/vitesse-dark-DOSOf2Sz.js +0 -1
- package/dist/vitesse-light-gUX51GpB.js +0 -1
- package/dist/vue-FQ0hgXO-.js +0 -1
- package/dist/vue-html-DH1-x0xc.js +0 -1
- package/dist/vue-vine-DeUyrIQS.js +0 -1
- package/dist/vyper-DpazWNpx.js +0 -1
- package/dist/wasm-CFi-k9--.js +0 -1
- package/dist/wasm-CiQ5tcoN.js +0 -1
- package/dist/wenyan-DoPRjnAP.js +0 -1
- package/dist/wgsl-CxjTZs-b.js +0 -1
- package/dist/wikitext-Bx2qct8O.js +0 -1
- package/dist/wit-DDW3hD69.js +0 -1
- package/dist/wolfram-pu21K997.js +0 -1
- package/dist/xml-BhAxjPaW.js +0 -1
- package/dist/xsl-6n2rlM5j.js +0 -1
- package/dist/yaml-Bopit2L3.js +0 -1
- package/dist/zenscript-BIAKq-aR.js +0 -1
- package/dist/zig-bSFrHQ7n.js +0 -1
package/dist/bin/cli.js
CHANGED
|
@@ -1,10 +1,59 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
`))
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
import{globby as e}from"globby";import t from"node:fs/promises";import n from"node:path";import r from"untildify";import i from"yargs";import{hideBin as a}from"yargs/helpers";import{deepmerge as o}from"deepmerge-ts";import s from"plur";import c from"pretty-ms";import{YankiConnect as l,defaultYankiConnectOptions as u}from"yanki-connect";import d from"@shikijs/rehype";import{toText as f}from"hast-util-to-text";import p from"rehype-format";import m from"rehype-parse";import h from"rehype-raw";import g from"rehype-stringify";import _ from"remark-rehype";import{unified as v}from"unified";import{u as y}from"unist-builder";import{CONTINUE as b,EXIT as x,SKIP as S,visit as C}from"unist-util-visit";import ee from"@sindresorhus/fnv1a";import w from"path-browserify-esm";import te from"@sindresorhus/slugify";import{sha256 as T}from"crypto-hash";import E from"@stdlib/assert-is-absolute-path";import ne from"slash";import re from"remark-breaks";import{parse as ie,stringify as ae}from"yaml";import oe from"remark-denden-ruby";import se from"remark-flexible-markers";import ce from"remark-frontmatter";import le from"remark-gfm";import ue from"remark-github-beta-blockquote-admonitions";import de from"remark-math";import fe from"remark-parse";import{sanitizeUri as pe}from"micromark-util-sanitize-uri";import me from"filenamify";import{nanoid as he}from"nanoid";import D from"picocolors";var ge=`2.0.0`;function O(e,t){return ee(e,{size:t===8?32:64}).toString(16).padStart(t,`0`)}function _e(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ve(e,t,n=`...`,r=` `){if(e.length<=t)return e;let i=t-n.length,a=e.split(r);for(;a.length>1&&a.join(r).length>i;)a.pop();return`${a.join(r).slice(0,i)}${n}`}function ye(e){return e.toLowerCase().replaceAll(/[^\da-z]/gi,` `).trim().replaceAll(/ +/g,`-`)}function k(e){if(e!==void 0)return e.trim()===``?void 0:e}function be(e,...t){return xe(e,...t)}function xe(e,...t){let n=e.reduce((e,n,r)=>`${e}${n}${String(t[r]??``)}`,``).split(/\r?\n/).filter(e=>e.trim()!==``),r=/^(\s+)/.exec(n[0])?.[0]??``,i=RegExp(`^${r}`);return n.map(e=>e.replace(i,``).trimEnd()).join(`
|
|
3
|
+
`)}function Se(e,t){let n=e.match(t);if(n?.index===void 0)return[e,void 0];let{index:r}=n;return[e.slice(0,r),e.slice(r)]}const Ce=be`
|
|
4
|
+
.card {
|
|
5
|
+
font-family: arial;
|
|
6
|
+
font-size: 20px;
|
|
7
|
+
text-align: center;
|
|
8
|
+
color: black;
|
|
9
|
+
background-color: white;
|
|
10
|
+
}
|
|
11
|
+
`,A=`yanki`,j=`(Empty)`,we=y(`element`,{properties:{},tagName:`p`},[y(`element`,{properties:{},tagName:`em`},[y(`text`,j)])]),Te=`Untitled`,Ee=[`avif`,`gif`,`ico`,`jpeg`,`jpg`,`png`,`svg`,`tif`,`tiff`,`webp`],De=[`3gp`,`aac`,`avi`,`flac`,`flv`,`m4a`,`mkv`,`mov`,`mp3`,`mp4`,`mpeg`,`mpg`,`oga`,`ogg`,`ogv`,`ogx`,`opus`,`spx`,`swf`,`wav`,`webm`],Oe=[`md`,`pdf`],ke=[...De,...Ee,...Oe],Ae=typeof window>`u`?typeof process>`u`?`other`:`node`:`browser`;Ae===`browser`?/windows/i.test(navigator.userAgent)||/mac/i.test(navigator.userAgent)||/linux/i.test(navigator.userAgent)||/ubuntu/i.test(navigator.userAgent):Ae===`node`&&(process.platform===`win32`||process.platform===`darwin`||process.platform);const M={allFilePaths:[],ankiConnectOptions:u,ankiWeb:!1,basePath:void 0,checkDatabase:!0,cwd:w.process_cwd,dryRun:!1,fetchAdapter:void 0,fileAdapter:void 0,manageFilenames:`off`,maxFilenameLength:60,namespace:`Yanki`,obsidianVault:void 0,resolveUrls:!0,strictLineBreaks:!0,strictMatching:!1,syncMediaAssets:`local`};async function N(){if(Ae===`node`){let e=await import(`node:fs/promises`);if(e===void 0)throw Error(`Error loading file functions in Node environment`);return{async readFile(t){return e.readFile(t,`utf8`)},async readFileBuffer(t){return e.readFile(t)},async rename(t,n){await e.rename(t,n)},async stat(t){return e.stat(t)},async writeFile(t,n){await e.writeFile(t,n,`utf8`)}}}throw Error(`The "readFile", "readFileBuffer", "rename" , "stat", and "writeFile" function implementations must be provided to the function when running in the browser`)}function P(){return fetch.bind(globalThis)}async function je(e,t){try{return await t.stat(e),!0}catch{return!1}}async function Me(e,t,n=`metadata`){switch(n){case`content`:return(await T(await t.readFileBuffer(e))).slice(0,16);case`metadata`:{let{mtimeMs:n,size:r}=await t.stat(e),i=`${n??``}${r??``}`;return i===``?Me(e,t,`name`):O(i,16)}case`name`:return O(e,16)}}function F(e,t=!1){return Pe(e,t),Ne(e)}function Ne(e){return e.normalize(`NFC`).trim()}function Pe(e,t=!1){let n=[];e.trim().length===0&&n.push(`Cannot be empty`),e.trim().length>60&&n.push(`Cannot be longer than 60 characters`);let r=[[/:/,`Colon`],[/\u0000/,`Null`],[/\u0001/,`Start of Heading`],[/\u0002/,`Start of Text`],[/\u0003/,`End of Text`],[/\u0004/,`End of Transmission`],[/\u0005/,`Enquiry`],[/\u0006/,`Acknowledge`],[/\u0007/,`Bell`],[/\u0008/,`Backspace`],[/\u0009/,`Horizontal Tab`],[/\u000A/,`Line Feed`],[/\u000B/,`Vertical Tab`],[/\u000C/,`Form Feed`],[/\u000D/,`Carriage Return`],[/\u000E/,`Shift Out`],[/\u000F/,`Shift In`],[/\u0010/,`Data Link Escape`],[/\u0011/,`Device Control 1`],[/\u0012/,`Device Control 2`],[/\u0013/,`Device Control 3`],[/\u0014/,`Device Control 4`],[/\u0015/,`Negative Acknowledge`],[/\u0016/,`Synchronous Idle`],[/\u0017/,`End of Transmission Block`],[/\u0018/,`Cancel`],[/\u0019/,`End of Medium`],[/\u001A/,`Substitute`],[/\u001B/,`Escape`],[/\u001C/,`File Separator`],[/\u001D/,`Group Separator`],[/\u001E/,`Record Separator`],[/\u001F/,`Unit Separator`],[/\u007F/,`Delete`],[/\u0080/,`Padding Character`],[/\u0081/,`High Octet Preset`],[/\u0082/,`Break Permitted Here`],[/\u0083/,`No Break Here`],[/\u0084/,`Index`],[/\u0085/,`Next Line`],[/\u0086/,`Start of Selected Area`],[/\u0087/,`End of Selected Area`],[/\u0088/,`Character Tabulation Set`],[/\u0089/,`Character Tabulation with Justification`],[/\u008A/,`Line Tabulation Set`],[/\u008B/,`Partial Line Forward`],[/\u008C/,`Partial Line Backward`],[/\u008D/,`Reverse Line Feed`],[/\u008E/,`Single Shift Two`],[/\u008F/,`Single Shift Three`],[/\u0090/,`Device Control String`],[/\u0091/,`Private Use One`],[/\u0092/,`Private Use Two`],[/\u0093/,`Set Transmit State`],[/\u0094/,`Cancel Character`],[/\u0095/,`Message Waiting`],[/\u0096/,`Start of Protected Area`],[/\u0097/,`End of Protected Area`],[/\u0098/,`Start of String`],[/\u0099/,`Single Graphic Character Introducer`],[/\u009A/,`Single Character Introducer`],[/\u009B/,`Control Sequence Introducer`],[/\u009C/,`String Terminator`],[/\u009D/,`Operating System Command`],[/\u009E/,`Privacy Message`],[/\u009F/,`Application Program Command`],[/\u00A0/,`Non-breaking Space`],[/\u00AD/,`Soft Hyphen`],[/\u200B/,`Zero-width Space`],[/\u200C/,`Zero-width Non-joiner`],[/\u200D/,`Zero-width Joiner`],[/\u200E/,`Left-to-right Mark`],[/\u200F/,`Right-to-left Mark`],[/\u202A/,`Left-to-right Embedding`],[/\u202B/,`Right-to-left Embedding`],[/\u202C/,`Pop Directional Formatting`],[/\u202D/,`Left-to-right Override`],[/\u202E/,`Right-to-left Override`],[/\uFEFF/,`Byte Order Mark (BOM)`]];t||r.push([/\*/,`Asterisk`]);for(let[t,i]of r){let r=e.match(t);if(r){let e=JSON.stringify(r[0]).slice(1,-1);n.push(`Forbidden character: ${i}: "${e}"`)}}if(n.length>0)throw Error(`Invalid namespace "${e}":\n\t- ${n.join(`
|
|
12
|
+
- `)}`)}function Fe(e){return`yanki-media-${te(Ne(e)).replaceAll(/-+/g,`-`)}`}function Ie(e){let t={"application/octet-stream":`mp4`,"application/ogg":`ogx`,"application/pdf":`pdf`,"application/x-shockwave-flash":`swf`,"audio/aac":`aac`,"audio/flac":`flac`,"audio/mp4":`m4a`,"audio/mpeg":`mp3`,"audio/ogg":`ogg`,"audio/opus":`opus`,"audio/wav":`wav`,"audio/webm":`webm`,"audio/x-speex":`spx`,"image/avif":`avif`,"image/gif":`gif`,"image/jpeg":`jpg`,"image/png":`png`,"image/svg+xml":`svg`,"image/tiff":`tif`,"image/vnd.microsoft.icon":`ico`,"image/webp":`webp`,"image/x-icon":`ico`,"text/markdown":`md`,"video/3gpp":`3gp`,"video/flv":`flv`,"video/matroska":`mkv`,"video/mp4":`mp4`,"video/mpeg":`mpg`,"video/msvideo":`avi`,"video/ogg":`ogv`,"video/quicktime":`mov`,"video/webm":`webm`,"video/x-flv":`flv`,"video/x-matroska":`mkv`,"video/x-msvideo":`avi`}[e];if(t!==void 0)return t}function I(e){return E.posix(e)||E.win32(e)}const Le=/^\\\\\?\\.+/;function L(e){if(Le.test(e))return console.warn(`Unsupported extended length path detected: ${e}`),e;let t=ne(e),n=w.normalize(t);return t.startsWith(`./`)?`./${n}`:n}function Re(e,t){let{basePath:n,compoundBase:r=!1,cwd:i}=t;return n!==void 0&&(I(n)||console.warn(`Base path "${n}" is not absolute`),i.startsWith(n)||console.warn(`CWD "${i}" does not start with base path "${n}"`)),I(i)||console.warn(`CWD "${i}" is not absolute`),I(e)?n===void 0||/^[A-Z]:/i.test(e)||!r&&e.startsWith(n)?e:w.join(n,e):w.join(i,e)}function ze(e,t){let n=RegExp(`^${t}`,`i`);return e.replace(n,``)}function R(e){let t=w.dirname(e),[n,r]=Se(w.basename(e),/[#?^]/);return[w.join(t,n),r]}function z(e){return R(e)[0]}function Be(e){return R(e).at(1)??``}function Ve(e){return He(e)!==``}function He(e){return w.extname(z(e))}function Ue(e,t){return Ve(e)?e:We(e,t)}function We(e,t){let[n,r]=R(e);return`${n}.${t}${r??``}`}function Ge(e){try{return decodeURI(e)}catch(t){console.warn(`Error decoding URI text: "${e}"`,t);return}}function B(e){try{let t=new URL(e),n=/^[a-z]:/i,r=/^file:/i;return(r.test(t.protocol)||n.test(t.protocol))&&!r.test(e)?void 0:t}catch{return}}function V(e){return B(e)!==void 0}function Ke(e){let t=B(e);return t?.protocol===`file:`?t.pathname:e}function H(e){let t=B(e);if(t===void 0){let t=L(e);return I(t)||t.startsWith(`./`)||t.startsWith(`../`)?`localFilePath`:`localFileName`}return t.protocol===`file:`?`localFileUrl`:t.protocol===`obsidian:`?`obsidianVaultUrl`:t.protocol===`http:`||t.protocol===`https:`?`remoteHttpUrl`:`unsupportedProtocolUrl`}function qe(e,t){if(e===void 0)return;e instanceof Headers||(e=Je(e));let n=(e instanceof Headers?t.map(t=>e.get(t)):t.map(t=>e[t])).filter(e=>e!=null).join(``);if(n!==``)return n}function Je(e){let t={};for(let[n,r]of Object.entries(e))t[n.toLowerCase()]=r;return t}async function Ye(e,t){try{return(await t(e,{method:`HEAD`}))?.status===200}catch{return!1}}async function Xe(e,t,n=`metadata`){switch(n){case`metadata`:if(t===void 0)return Xe(e,t,`name`);try{let n=qe((await t(e,{method:`HEAD`}))?.headers,[`content-type`]);if(n===void 0)throw Error(`No content-type header found`);return Ie(n)}catch{return Xe(e,t,`name`)}case`name`:{let t,n=B(e);if(n===void 0){console.warn(`Could not parse URL: ${e}`);return}let r=n.pathname.split(`.`);return t=r.length>1?r.at(-1):n.search.split(`.`).at(-1),ke.includes(t??``)?t:void 0}}}async function Ze(e,t,n=`metadata`){switch(n){case`content`:return console.warn("`content` hash mode is not yet implemented for URLs"),Ze(e,t,`metadata`);case`metadata`:try{let n=qe((await t(e,{method:`HEAD`}))?.headers,[`etag`,`last-modified`,`content-length`]);if(n===void 0)throw Error(`No headers found`);return O(n,16)}catch{return Ze(e,t,`name`)}case`name`:return O(e,16)}}function Qe(e){let t=B(e);return t===void 0?void 0:{host:`${t.protocol}//${t.hostname}`,port:Number.parseInt(t.port,10)}}async function $e(e,t){let n=V(e)?await Xe(e,t):w.extname(e).slice(1);if(!(n===void 0||!ke.includes(n)))return n}async function et(e,t,n){return V(e)?Ye(e,n):je(e,t)}async function tt(e,t,n,r,i){if(!await et(e,r,i))return;let a=Fe(t),o=await nt(e,r,i),s=n===void 0?``:`.${n}`,c;if(c=`${a}-${o}${s}`,c.length>120)throw Error(`Filename too long: ${c}`);return c}async function nt(e,t,n){return V(e)?Ze(e,n):Me(e,t)}const rt=v().use(function(){return function(e,t){if(t.data.strictLineBreaks===!1){re()(e);return}return e}}).use(_,{allowDangerousHtml:!0}).use(h).use(function(){return function(e){let t=!1;C(e,(e,n,r)=>{if(r===void 0||n===void 0||e.type!==`element`)return b;if(e.tagName===`pre`&&e.children.length===1&&e.children[0].type===`element`&&e.children[0].tagName===`code`&&Array.isArray(e.children[0].properties.className)&&e.children[0].properties.className.includes(`language-math`)&&(t=!0,r.children.splice(n,1,e.children[0])),e.tagName===`code`&&Array.isArray(e.properties.className)&&e.properties.className.includes(`language-math`)){let n=e.properties.className.includes(`math-display`)||t;t=!1,e.tagName=n?`div`:`span`,e.children=[{type:`text`,value:n?String.raw`\[`:String.raw`\(`},...e.children,{type:`text`,value:n?String.raw`\]`:String.raw`\)`}]}})}}).use(d,{defaultLanguage:`plaintext`,fallbackLanguage:`plaintext`,themes:{dark:`github-dark`,light:`github-light`}}).use(p).use(g),it={...M};async function U(e,t){if(e===void 0)return``;let{cssClassNames:n,fetchAdapter:r=P(),fileAdapter:i=await N(),namespace:a,strictLineBreaks:s,syncMediaAssets:c,useEmptyPlaceholder:l}=o(it,t??{}),u=await rt.run(e,{data:{strictLineBreaks:s}}),d=y(`root`,[y(`element`,{properties:{className:n?.map(e=>ye(e))},tagName:`div`},u.children)]),f=[];C(d,`element`,(e,t,n)=>{if(n===void 0||t===void 0||e.tagName!==`img`)return b;if(typeof e.properties.src!=`string`||e.properties?.src?.trim().length===0)return console.warn(`Image has no src`),b;let o,s=H(e.properties.src);switch(s){case`localFilePath`:if(o=Ge(e.properties.src),o===void 0)return b;o=z(o);break;case`unsupportedProtocolUrl`:case`localFileName`:console.warn(`Unsupported URL for media asset, treating as link: "${e.properties.src}"`),o=e.properties.src;break;case`obsidianVaultUrl`:case`localFileUrl`:o=e.properties.src;break;case`remoteHttpUrl`:o=e.properties.src;break}f.push(async()=>{let l=await $e(o,s===`obsidianVaultUrl`?void 0:r),u=l!==void 0&&s!==`unsupportedProtocolUrl`&&s!==`localFileName`&&s!==`obsidianVaultUrl`&&s!==`localFileUrl`,d=(s===`localFilePath`&&c===`local`||s===`remoteHttpUrl`&&c===`remote`||c===`all`)&&u,f=d?await tt(o,a,l,i,r):void 0,p=f??o,m=d&&f!==void 0?`true`:`false`;if(!u||Oe.includes(l)){let r=V(p)?p:`${p}${Be(String(e.properties.dataYankiSrcOriginal))}`;n.children.splice(t,1,y(`element`,{properties:{className:[`yanki-media`,`yanki-media-${u?`file`:`unsupported`}`],"data-yanki-alt-text":e.properties.alt,"data-yanki-media-src":o,"data-yanki-media-sync":m,"data-yanki-src":p,"data-yanki-src-original":e.properties.dataYankiSrcOriginal},tagName:`span`},[y(`element`,{properties:{href:r},tagName:`a`},[y(`text`,decodeURI(String(e.properties.dataYankiSrcOriginal)))])]))}else Ee.includes(l)?(e.properties.src=p,e.properties.className=[`yanki-media`,`yanki-media-image`],e.properties.dataYankiMediaSrc=o,e.properties.dataYankiMediaSync=m):De.includes(l)&&n.children.splice(t,1,y(`element`,{properties:{className:[`yanki-media`,`yanki-media-audio-video`],"data-yanki-alt-text":e.properties.alt,"data-yanki-media-src":o,"data-yanki-media-sync":m,"data-yanki-src":p,"data-yanki-src-original":e.properties.dataYankiSrcOriginal},tagName:`span`},[y(`text`,`[sound:${p}]`)]))})});for(let e of f)await e();C(d,`element`,(e,t,n)=>{if(n===void 0||t===void 0||e.tagName!==`img`||k(String(e.properties.alt))===void 0)return b;let{alt:r,height:i,width:a}=ft(String(e.properties.alt??``));r===void 0?delete e.properties.alt:e.properties.alt=r,i!==void 0&&(e.properties.height=i),a!==void 0&&(e.properties.width=a)});let p=mt(d);if(p&&!l)return``;let m=p?ht(d,we):d;return ot(rt.stringify(m)).trim()}const at=v().use(m,{fragment:!0});function ot(e){return`<!-- This HTML was generated by Yanki, a Markdown to Anki converter. Do not edit directly. -->\n${e}`}function st(e){return f(e)}function ct(e){return st(at.parse(e))}function lt(e){return ct(e).split(`
|
|
13
|
+
`).map(e=>e.trim()).filter(e=>e.length>0).join(` `)}function ut(e){return ct(e).split(`
|
|
14
|
+
`).map(e=>e.trim()).find(e=>e.length>0)??``}function dt(e){let t=at.parse(e),n=[];return C(t,`element`,e=>{if((e.tagName===`img`||e.tagName===`span`)&&e.properties?.dataYankiMediaSync===`true`){let t=e.properties?.src??e.properties?.dataYankiSrc,r=e.properties?.dataYankiMediaSrc;t!==void 0&&r!==void 0&&typeof t==`string`&&typeof r==`string`&&n.push({filename:t,originalSrc:r})}}),n}function ft(e){let t=e.split(`|`),n=k(t.pop()),r=k(t.join(`|`));if(n!==void 0){let{width:e,height:t}=pt(n);if(e!==void 0||t!==void 0)return{alt:r,height:t,width:e}}return{alt:e,height:void 0,width:void 0}}function pt(e){if(!/^[\dx]+$/.test(e))return{width:void 0,height:void 0};if(!e.includes(`x`)){let t=Number.parseInt(e,10);if(!Number.isNaN(t))return{width:t,height:void 0}}let[t,n]=e.split(`x`).map(e=>Number.parseInt(e,10));return{width:Number.isNaN(t)||t===void 0?void 0:t,height:Number.isNaN(n)||n===void 0?void 0:n}}function mt(e){let t=!1;return C(e,e=>{if(!t){if(e.type===`element`){let n=e,{tagName:r}=n;if([`img`,`video`,`audio`,`iframe`,`object`,`embed`,`canvas`,`svg`,`picture`].includes(r)||f(n).trim())return t=!0,x}if(e.type===`text`&&e.value!==void 0&&e.value.trim()!==``)return t=!0,x}}),!t}function ht(e,t){return C(e,`element`,e=>{if(e.tagName===`div`)return e.children.unshift(t),x}),e}const W=[{cardTemplates:[{Back:`{{FrontSide}}
|
|
15
|
+
|
|
16
|
+
<hr id=answer>
|
|
17
|
+
|
|
18
|
+
{{Back}}`,Front:`{{Front}}`,YankiNamespace:`{{YankiNamespace}}`}],inOrderFields:[`Front`,`Back`,`YankiNamespace`],modelName:`Yanki - Basic`},{cardTemplates:[{Back:`{{cloze:Front}}<br>
|
|
19
|
+
{{Back}}`,Front:`{{cloze:Front}}`,YankiNamespace:`{{YankiNamespace}}`}],inOrderFields:[`Front`,`Back`,`YankiNamespace`],isCloze:!0,modelName:`Yanki - Cloze`},{cardTemplates:[{Back:`{{Front}}
|
|
20
|
+
|
|
21
|
+
<hr id=answer>
|
|
22
|
+
|
|
23
|
+
{{type:Back}}`,Front:`{{Front}}
|
|
24
|
+
|
|
25
|
+
{{type:Back}}`,YankiNamespace:`{{YankiNamespace}}`}],inOrderFields:[`Front`,`Back`,`YankiNamespace`],modelName:`Yanki - Basic (type in the answer)`},{cardTemplates:[{Back:`{{FrontSide}}
|
|
26
|
+
|
|
27
|
+
<hr id=answer>
|
|
28
|
+
|
|
29
|
+
{{Back}}{{#Extra}}
|
|
30
|
+
|
|
31
|
+
<hr>
|
|
32
|
+
|
|
33
|
+
{{Extra}}{{/Extra}}`,Front:`{{Front}}`,YankiNamespace:`{{YankiNamespace}}`},{Back:`{{FrontSide}}
|
|
34
|
+
|
|
35
|
+
<hr id=answer>
|
|
36
|
+
|
|
37
|
+
{{Front}}{{#Extra}}
|
|
38
|
+
|
|
39
|
+
<hr>
|
|
40
|
+
|
|
41
|
+
{{Extra}}{{/Extra}}`,Front:`{{Back}}`,YankiNamespace:`{{YankiNamespace}}`}],inOrderFields:[`Front`,`Back`,`Extra`,`YankiNamespace`],modelName:`Yanki - Basic (and reversed card with extra)`}],gt=W.map(e=>e.modelName),_t=[`Yanki - Basic (and reversed card)`];async function vt(e,t,n=!1){if(n)return;let r=t.map(e=>e.noteId).filter(e=>e!==void 0);await e.note.deleteNotes({notes:r})}async function yt(e,t,n){if(t.noteId!==void 0)throw Error(`Note already has an ID`);if(n)return 0;let r=await e.note.addNote({note:{...t,options:{allowDuplicate:!0}}}).catch(async r=>{if(r instanceof Error){if(r.message===`model was not found: ${t.modelName}`){let r=W.find(e=>e.modelName===t.modelName);if(r===void 0)throw Error(`Model not found: ${t.modelName}`);return await e.model.createModel(r),yt(e,t,n)}if(r.message===`deck was not found: ${t.deckName}`){if(t.deckName===``)throw Error(`Deck name is empty`);return await e.deck.createDeck({deck:t.deckName}),yt(e,t,n)}throw r}else throw TypeError(`Unknown error`)});if(r===null)throw Error(`Note creation failed`);return await Ot(e,t,n),r}async function bt(e,t,n,r){if(t.noteId===void 0)throw Error(`Local note ID is undefined`);if(n.cards===void 0)throw Error(`Remote note cards are undefined`);let i=!1;if(t.deckName!==n.deckName){if(t.deckName===``)throw Error(`Local deck name is empty`);r||await e.deck.changeDeck({cards:n.cards,deck:t.deckName}),i=!0}return(!Ct(t.tags??[],n.tags??[])||!xt(t.fields,n.fields)||t.modelName!==n.modelName)&&(r||(await e.note.updateNoteModel({note:{...t,id:t.noteId,tags:t.tags??[]}}).catch(async i=>{if(i instanceof Error){if(i.message===`Model '${t.modelName}' not found`){let i=W.find(e=>e.modelName===t.modelName);if(i===void 0)throw Error(`Model not found: ${t.modelName}`);return await e.model.createModel(i),bt(e,t,n,r)}throw i}else throw TypeError(`Unknown error`)}),await Ot(e,t,r)),i=!0),i}function xt(e,t){for(let n of[`Front`,`Back`,`Extra`])if(n in e&&n in t){if(e[n].normalize(`NFC`)!==t[n].normalize(`NFC`))return!1}else if(n in e||n in t)return!1;return!0}function St(e,t,n=!0){return!(n&&e.noteId!==t.noteId||e.deckName!==t.deckName||e.modelName!==t.modelName||!xt(e.fields,t.fields)||!Ct(e.tags??[],t.tags??[]))}function Ct(e,t){let n=new Set(e.map(e=>e.normalize(`NFC`).toLowerCase())),r=new Set(t.map(e=>e.normalize(`NFC`).toLowerCase()));return new Set([...n,...r]).size===r.size}async function wt(e,t=M.namespace){return await Tt(e,await e.note.findNotes({query:`"YankiNamespace:${t}"`}))}async function Tt(e,t){let n=await e.note.notesInfo({notes:t}),r=[];if(n.every(e=>e.noteId===void 0))return Array.from({length:n.length}).fill(void 0);let i=n.flatMap(e=>e.cards??[]),a=await e.deck.getDecks({cards:i}),o=new Map;for(let[e,t]of Object.entries(a))for(let n of t)o.set(n,e);let s=new Map,c=new Map;for(let t of n){if(t.noteId===void 0){r.push(void 0);continue}if(![..._t,...gt].includes(t.modelName))throw Error(`Unknown model name ${t.modelName} for note ${t.noteId}`);let n=[...new Set(t.cards.map(e=>o.get(e)))];n.length;let i=n.at(0);if(i===void 0)throw Error(`No deck found for cards in note ${t.noteId}`);if(!s.has(i)){let t=!!(await e.deck.getDeckConfig({deck:i})).dyn;if(s.set(i,t),t){let t=await e.deck.deckNames();for(let n of t)if(!s.has(n)){let t=await e.deck.getDeckConfig({deck:n});s.set(n,!!t.dyn)}let n=[...s.entries()].filter(([e,t])=>!t&&e!==`Default`).map(([e])=>e).sort((e,t)=>t.split(`::`).length-e.split(`::`).length);n.push(`Default`);for(let e of n)c.set(e,void 0)}}if(s.get(i)){let n=c.keys(),r=!1;for(let a of n)if(c.get(a)===void 0&&c.set(a,await e.note.findNotes({query:`"deck:${a}"`})),c.get(a)?.includes(t.noteId)){i=a,r=!0;break}if(!r)throw Error(`No matching non-filtered deck found for note ${t.noteId}`)}r.push({cards:t.cards,deckName:i,fields:{Back:t.fields.Back.value??``,...t.fields.Extra!==void 0&&{Extra:t.fields.Extra.value??``},Front:t.fields.Front.value??``,YankiNamespace:t.fields.YankiNamespace.value??``},modelName:t.modelName,noteId:t.noteId,tags:t.tags})}return r}async function Et(e,t,n,r){let i=[...new Set(t.map(e=>e.deckName))].filter(Boolean),a=[...new Set(n.map(e=>e.deckName))].filter(Boolean).filter(e=>!i.includes(e)),o=[];for(let e of a){let t=e.split(`::`);if(t.length!==1)for(;t.length>1;){t.pop();let e=t.join(`::`);if(i.some(t=>e.includes(t)))break;o.push(e)}}let s=[...new Set([...a,...o])].sort(),c=[];for(let i of s){let a=await e.deck.getDeckStats({decks:[i]}),o=Object.values(a);if(o.length>1){console.warn(`Multiple decks found for deck name: ${i}`);continue}let s=o.at(0);if(s===void 0){console.warn(`Deck not found for deck name: ${i}`);continue}let l=Math.max(s.total_in_deck,s.new_count+s.learn_count+s.review_count);if(r){let e=n.filter(e=>e.deckName===i).length,r=t.filter(e=>e.deckName===i).length;l===e&&r===0&&!c.includes(i)&&c.push(i)}else l===0&&!c.includes(i)&&c.push(i)}return r||await e.deck.deleteDecks({cardsToo:!0,decks:c}),c}async function Dt(e,t,n,r){let i;try{let{css:n}=await e.model.modelStyling({modelName:t});i=n}catch(i){if(i instanceof Error){if(i.message===`model was not found: ${t}`){let i=W.find(e=>e.modelName===t);if(i===void 0)throw Error(`Model not found: ${t}`);return r?!1:(await e.model.createModel(i),Dt(e,i.modelName,n,r))}throw i}else throw TypeError(`Unknown error`)}return i!==void 0&&i===n?!1:(r||await e.model.updateModelStyling({model:{css:n,name:t}}),!0)}async function Ot(e,t,n){let r=dt(`${t.fields.Front}\n${t.fields.Back}\n${t.fields.Extra}`),i=[];for(let{filename:t,originalSrc:a}of r)if((await e.media.getMediaFilesNames({pattern:t})).length===0){if(!n)try{let n=await e.media.storeMediaFile(V(a)?{deleteExisting:!0,filename:t,url:a}:{deleteExisting:!0,filename:t,path:a});t!==n&&console.warn(`Anki media filename mismatch: Expected: "${t}" -> Received: "${n}"`)}catch(e){console.warn(`Anki could not store media file: "${t}"\n${String(e)}`)}i.push({filename:t,originalSrc:a})}return i}async function kt(e,t,n,r){if(r)return[];let i=Fe(n),a=[];for(let e of t){let t=dt(`${e.fields.Front}\n${e.fields.Back}\n${e.fields.Extra}`);for(let{filename:e}of t)a.push(e)}let o=await e.media.getMediaFilesNames({pattern:`${i}-*`}),s=[];for(let t of o)a.includes(t)||(await e.media.deleteMediaFile({filename:t}),s.push(t));return s}async function G(e){try{let{permission:t}=await e.miscellaneous.requestPermission();if(t===`denied`)throw Error(`Permission denied, please add this source to the "webCorsOriginList" in the Anki-Connect add-on configuration options.`);return`granted`}catch(e){if(e instanceof Error&&(e.message===`fetch failed`||e.message===`net::ERR_CONNECTION_REFUSED`))return`ankiUnreachable`;throw e}}async function At(e){try{await e.miscellaneous.sync()}catch{console.warn(`Could not sync to AnkiWeb.`)}}const jt={...M};async function Mt(e){let t=performance.now(),{ankiConnectOptions:n,ankiWeb:r,dryRun:i,namespace:a}=o(jt,e??{}),s=F(a,!0),c=new l(n);if(await G(c)===`ankiUnreachable`)throw Error(`Anki is unreachable. Is Anki running?`);let u=await wt(c,s);await vt(c,u,i);let d=await Et(c,[],u,i),f=await kt(c,[],s,i);return u.length>0||d.length,!i&&r&&await At(c),{ankiWeb:r,deletedDecks:d,deletedMedia:f,deletedNotes:u,dryRun:i,duration:performance.now()-t,namespace:s}}function Nt(e,t=!1){let n=e.deletedDecks.length,r=e.deletedNotes.length,i=e.deletedMedia.length;if(n===0&&r===0&&i===0)return`Nothing to delete`;let a=[`${e.dryRun?`Will`:`Successfully`} deleted ${r} ${s(`note`,r)}, ${n} ${s(`deck`,n)}, and ${i} media ${s(`asset`,i)} from Anki${e.dryRun?``:` in ${c(e.duration)}`}.`];if(t){if(r>0){a.push(``,e.dryRun?`Notes to delete:`:`Deleted notes:`);for(let t of e.deletedNotes){let e=ve(ut(t.fields.Front),50);a.push(` Note ID ${t.noteId} ${e}`)}}if(n>0){a.push(``,e.dryRun?`Decks to delete:`:`Deleted decks:`);for(let t of e.deletedDecks)a.push(` ${t}`)}if(i>0){a.push(``,e.dryRun?`Media assets to delete:`:`Deleted media assets:`);for(let t of e.deletedMedia)a.push(` ${t}`)}}return a.join(`
|
|
42
|
+
`)}const Pt={...M};async function Ft(e){let t=performance.now(),{ankiConnectOptions:n,namespace:r}=o(Pt,e??{}),i=F(r,!0),a=new l(n);if(await G(a)===`ankiUnreachable`)throw Error(`Anki is unreachable. Is Anki running?`);let s=await wt(a,i);return{duration:performance.now()-t,namespace:i,notes:s}}function It(e){if(e.notes.length===0)return`No notes found.`;let t=[];for(let n of e.notes){let e=ve(ut(n.fields.Front),50);t.push(`Note ID ${n.noteId} ${e}`)}return t.join(`
|
|
43
|
+
`)}const Lt={css:Ce,...M};({...M});async function Rt(e){let t=performance.now(),{ankiConnectOptions:n,ankiWeb:r,css:i,dryRun:a}=o(Lt,e??{}),s=new l(n);if(await G(s)===`ankiUnreachable`)throw Error(`Anki is unreachable. Is Anki running?`);let c=[];for(let e of gt){let t=await Dt(s,e,i,a);c.push({action:t?`updated`:`unchanged`,name:e})}return c.some(e=>e.action!==`unchanged`),!a&&r&&await At(s),{ankiWeb:r,dryRun:a,duration:performance.now()-t,models:c}}function zt(e,t=!1){let n=[],r=e.models.filter(e=>e.action===`unchanged`),i=e.models.filter(e=>e.action===`updated`);if(n.push(`${e.dryRun?`Will`:`Successfully`} update ${i.length} ${s(`model`,i.length)} and left ${r.length} ${s(`model`,r.length)} unchanged${e.dryRun?``:` in ${c(e.duration)}`}.`),t){if(i.length>0){n.push(``,e.dryRun?`Models to update:`:`Updated models:`);for(let e of i)n.push(` ${e.name}`)}if(r.length>0){n.push(``,e.dryRun?`Models unchanged:`:`Unchanged models:`);for(let e of r)n.push(` ${e.name}`)}}return n.join(`
|
|
44
|
+
`)}async function Bt(e,t){let[n,r]=Vt(e),i=e.split(/\r?\n/);if(n===void 0||r===void 0)return t===void 0?e:[`---`,ae({noteId:t}).trim(),`---
|
|
45
|
+
`,...i].join(`
|
|
46
|
+
`);let a=await ie(i.slice(n+1,r).join(`
|
|
47
|
+
`))??{};if(t===void 0){if(delete a.noteId,Object.keys(a).length===0){let e=i.slice(r+1);return e[0].trim()===``?e.slice(1).join(`
|
|
48
|
+
`):e.join(`
|
|
49
|
+
`)}}else a.noteId=t;let o=ae(a,{lineWidth:0}).trim();return[...i.slice(0,n+1),o,...i.slice(r)].join(`
|
|
50
|
+
`)}function Vt(e){let t=e.split(/\r?\n/);if(!t.join(``).trim().startsWith(`---`))return[void 0,void 0];let n=t.findIndex(e=>e.startsWith(`---`)),r=t.findIndex((e,t)=>t>n&&e.startsWith(`---`));return n===-1||r===-1?[void 0,void 0]:[n,r]}const Ht={allFilePaths:[],basePath:void 0,convertFilePathsToProtocol:`none`,obsidianVaultName:void 0};function K(e,t){let{allFilePaths:n,basePath:r,convertFilePathsToProtocol:i,cwd:a,obsidianVaultName:s,type:c}=o(Ht,t??{});i===`obsidian`&&s===void 0&&console.warn(`convertFilePathsToProtocol is 'obsidian', but no obsidianVaultName provided`);let l=Ge(e)??e;switch(H(l)){case`localFileName`:{let t=Ue(L(l),`md`);return t=Ut(t,a,n??[])??Re(l,{basePath:r,cwd:a}),H(t)===`localFilePath`?K(t,{allFilePaths:n,basePath:r,convertFilePathsToProtocol:i,cwd:a,obsidianVaultName:s,type:c}):(console.warn(`Failed to convert local file wiki-style name to path: ${e} --> ${t}`),t)}case`localFilePath`:{let e=Re(L(l),{basePath:r,cwd:a}),t=Wt(Ue(e,`md`),n??[])??Wt(We(e,`md`),n??[])??void 0;if(t!==void 0){if(i!==`none`&&(c===`link`||c===`embed`&&[`.md`,`.pdf`].includes(He(t)))){if(i===`obsidian`&&s!==void 0)return Kt(t,r??``,s);if(i===`file`)return Gt(t)}return z(t)}return z(e)}case`localFileUrl`:{let t=L(Ke(e));return H(t)===`localFilePath`?K(t,{allFilePaths:n,basePath:r,convertFilePathsToProtocol:i,cwd:a,obsidianVaultName:s,type:c}):(console.warn(`Failed to convert file URL to path: ${e} --> ${t}`),t)}case`obsidianVaultUrl`:return e;case`remoteHttpUrl`:return e;case`unsupportedProtocolUrl`:return console.warn(`Unsupported URL protocol: ${e}`),e}}function Ut(e,t,n){if(n.length===0)return;let[r,i]=R(e),a=r.replace(/\.md$/,``).toLowerCase(),o=n.filter(e=>e.replace(/\.md$/,``).toLowerCase().endsWith(a));if(o.length!==0)return o.length===1?`${o[0]}${i??``}`:`${[...o].sort((e,n)=>{if(!r.endsWith(`.md`)||r.includes(w.sep)){let r=e.startsWith(t);if(r!==n.startsWith(t))return r?-1:1}let i=e.split(w.sep).length,a=n.split(w.sep).length;return i===a?e.localeCompare(n):i-a})[0]}${i??``}`}function Wt(e,t){let n=z(e);if(t.some(e=>e.toLowerCase().endsWith(n.toLowerCase())))return e}function Gt(e){return`file://${e}`}function Kt(e,t,n){let r=ze(e,t);return`obsidian://open?vault=${encodeURIComponent(n)}&file=${encodeURIComponent(r)}`}const qt=function(e){let{allFilePaths:t=[],basePath:n,cwd:r,enabled:i=!0,obsidianVault:a}=e;return function(e){i&&(C(e,`link`,e=>{e.data??={},e.data.hProperties={...e.data?.hProperties,"data-yanki-src-original":e.url};let i=K(e.url,{allFilePaths:t,basePath:n,convertFilePathsToProtocol:a===void 0?`none`:`obsidian`,cwd:r,obsidianVaultName:a,type:`link`});e.url=V(i)?i:encodeURI(i)}),C(e,`image`,e=>{e.data??={},e.data.hProperties={...e.data?.hProperties,"data-yanki-src-original":e.url};let i=K(e.url,{allFilePaths:t,basePath:n,convertFilePathsToProtocol:a===void 0?`none`:`obsidian`,cwd:r,obsidianVaultName:a,type:`embed`});e.url=V(i)?i:encodeURI(i)}))}};function Jt(){let e=``,t;return{enter:{wikiEmbed:r,wikiLabel:o,wikiLink:n,wikiUrl:i},exit:{wikiEmbed:l,wikiLabel:s,wikiLink:c,wikiUrl:a}};function n(n){e=``,t=void 0,this.enter({children:[],title:void 0,type:`link`,url:``},n)}function r(n){e=``,t=void 0,this.enter({type:`image`,url:``},n)}function i(){this.buffer()}function a(){e=this.resume()}function o(){this.buffer()}function s(){t=this.resume()}function c(n){let r=this.stack.at(-1);r.url=pe(e),r.children=[{type:`text`,value:k((t??``).replaceAll(`|`,``))??e.split(`#`).pop()??e.split(`/`).pop()??e}],this.exit(n)}function l(n){let r=this.stack.at(-1);r.url=pe(e),t!==void 0&&(r.alt=t),this.exit(n)}}function Yt(){return{text:{33:{name:`wikiEmbed`,tokenize:e},91:{name:`wikiLink`,tokenize:e}}};function e(e,t,n){let r=!1,i=!1,a=0,o=0;return s;function s(t){return t===33?(r=!0,e.enter(`wikiEmbed`),e.enter(`wikiMarker`),e.consume(t),c):(e.enter(`wikiLink`),e.enter(`wikiMarker`),c(t))}function c(t){return t===91?(e.consume(t),l):n(t)}function l(t){return t===91?(e.consume(t),e.exit(`wikiMarker`),u):n(t)}function u(t){return t===-5||t===-4||t===-3||t===null||t===124||t===93?n(t):(e.enter(`wikiUrl`),e.enter(`chunkString`,{contentType:`string`}),e.consume(t),a++,d)}function d(t){return t===-5||t===-4||t===-3||t===null?n(t):t===124?a===1?n(t):x(t):t===92?e.check({partial:!0,tokenize:b},x,f)(t):t===93?h(t):f(t)}function f(t){return e.consume(t),a++,d}function p(t){return t===-5||t===-4||t===-3||t===null?n(t):t===93?h(t):(e.enter(`wikiLabel`),e.enter(`chunkString`,{contentType:`string`}),e.consume(t),o++,m)}function m(t){return t===-5||t===-4||t===-3||t===null?n(t):t===93?h(t):(e.consume(t),o++,m)}function h(t){return t===93?e.check({partial:!0,tokenize:y},g,v)(t):n(t)}function g(t){return t===93?(i?o>0&&(e.exit(`chunkString`),e.exit(`wikiLabel`)):a>0&&(e.exit(`chunkString`),e.exit(`wikiUrl`)),e.enter(`wikiMarker`),e.consume(t),_):n(t)}function _(i){return i!==93||a===0?n(i):(e.consume(i),e.exit(`wikiMarker`),r?e.exit(`wikiEmbed`):e.exit(`wikiLink`),t)}function v(t){return t===93?(e.consume(t),i?(o++,m):(a++,d)):n(t)}function y(e,t,n){return r;function r(r){return r===93?(e.enter(`wikiMarkerTemp`),e.consume(r),e.exit(`wikiMarkerTemp`),t(r)):n(r)}}function b(e,t,n){return r;function r(t){return t===92?(e.enter(`wikiMarkerTemp`),e.consume(t),i):n(t)}function i(r){return r===124?(e.consume(r),e.exit(`wikiMarkerTemp`),t(r)):(e.exit(`wikiMarkerTemp`),n(r))}}function x(t){return e.exit(`chunkString`),e.exit(`wikiUrl`),e.enter(`wikiMarker`),e.consume(t),t===92?C:(e.exit(`wikiMarker`),i=!0,e.check({partial:!0,tokenize:S},h,p)(t))}function S(e,t,n){return r;function r(r){return r===93?(e.enter(`wikiMarkerTemp`),e.consume(r),e.exit(`wikiMarkerTemp`),t(r)):n(r)}}function C(t){return t===124?(e.consume(t),e.exit(`wikiMarker`),i=!0,p):n(t)}}}const Xt=function(){let e=this.data();e.micromarkExtensions=[...e.micromarkExtensions??[],Yt()],e.fromMarkdownExtensions=[...e.fromMarkdownExtensions??[],Jt()]},Zt={...M};async function Qt(e,t){let{allFilePaths:n,basePath:r,cwd:i,obsidianVault:a,resolveUrls:s}=o(Zt,t??{}),c=v().use(fe).use(ce,[{anywhere:!1,marker:`-`,type:`yaml`}]).use(Xt).use(le,{singleTilde:!1}).use(qt,{allFilePaths:n,basePath:r,cwd:i,enabled:s,obsidianVault:a}).use(de).use(ue).use(se).use(oe);return c.run(c.parse(e))}function $t(e){return e.type===`text`}function en(e,t){return C(e,t,(e,t,n)=>{if(n&&t!==void 0)return n.children.splice(t,1),x}),e}function tn(e){let t=e.at(0);t?.type===`text`&&(t.value=t.value.trimStart(),t.value===``&&e.shift());let n=e.at(-1);return n?.type===`text`&&(n.value=n.value.trimEnd(),n.value===``&&e.pop()),e}function nn(e){let t=1;return C(e,`delete`,(e,n,r)=>{if(r===void 0||n===void 0||!(`children`in e)||e.children.length===0)return b;if(e.children.length>0&&$t(e.children[0])){let n=/^[(|]?(\d{1,2})(?:[\s).|]|$)(.*)$/.exec(e.children[0].value);if(n!==null&&(e.children.length>1||(n.at(2)??``).length>0)){let r=Number.parseInt(n.at(1)??``,10);Number.isNaN(r)||(t=r,e.children[0].value=(n.at(2)?.trim().length??0)>0?n.at(2)??``:``)}}let i=e.children.at(-1),a=e.children.length>1&&i?.type===`emphasis`?[y(`text`,`{{c${t}::`),...tn(e.children.slice(0,-1)),y(`text`,`::`),...tn(e.children.slice(-1)),y(`text`,`}}`)]:[y(`text`,`{{c${t}::`),...tn(e.children),y(`text`,`}}`)];r.children.splice(n,1,...a),t+=1}),e}function rn(e){let t,n=!1;return C(e,`thematicBreak`,(e,r,i)=>r===void 0||i===void 0?b:(t=r,i.children[r+1]?.type===`thematicBreak`&&(n=!0),x)),t===void 0?[e,void 0]:[{children:e.children.slice(0,t),type:`root`},{children:e.children.slice(t+(n?2:1)),type:`root`}]}function an(e){let t;if(C(e,e=>{if(e.type===`thematicBreak`)return t=void 0,x;if(e.type===`delete`)return t=`Yanki - Cloze`,x}),t!==void 0)return t;if(!sn(e)&&cn(e))return`Yanki - Basic (type in the answer)`;let n;return C(e,(e,r,i)=>{if(i===null||r===null)return b;if(e.type===`thematicBreak`){if(t===void 0)t=`Yanki - Basic`;else if(t===`Yanki - Basic`&&n?.type===`thematicBreak`)return t=`Yanki - Basic (and reversed card with extra)`,x}n=e}),t??`Yanki - Basic`}function on(e){let t;if(C(e,`yaml`,e=>`value`in e?(t=e.value,x):b),!t)return{};let n=ie(t);if(!n)throw Error(`Could not parse frontmatter`);return n}function sn(e){let t=!1;return C(e,`thematicBreak`,()=>(t=!0,x)),t}function cn(e){let t,n=0;return C(e,e=>{if(e.type===`text`&&e.value.trim()!==``)t=e,n++;else if(e.type===`emphasis`&&e.children.some(e=>e.type===`text`&&e.value.trim()!==``))return t=e,n++,S}),t?.type===`emphasis`&&n>1}function ln(e){let t,n,r;if(C(e,`emphasis`,(e,i,a)=>{if(a===void 0||i===void 0||e.type!==`emphasis`)return b;t=e,n=a,r=i}),n&&t&&typeof r==`number`)return n.children.splice(r,1),t}const un={namespaceValidationAndSanitization:!0,...M};async function dn(e,t){let{allFilePaths:n,basePath:r,cwd:i,fetchAdapter:a=P(),fileAdapter:s=await N(),namespace:c,namespaceValidationAndSanitization:l,obsidianVault:u,resolveUrls:d,strictLineBreaks:f,syncMediaAssets:p}=o(un,t??{}),m=l?F(c):c,h=await Qt(e,{allFilePaths:n,basePath:r,cwd:i,obsidianVault:u,resolveUrls:d}),g=an(h),_=on(h);h=en(h,`yaml`);let v=``,b=``,x;switch(g){case`Yanki - Basic`:case`Yanki - Basic (and reversed card with extra)`:{let[e,t]=rn(h),n;if(t!==void 0&&g===`Yanki - Basic (and reversed card with extra)`){x=``;let[e,r]=rn(t);t=e,n=r}v=await U(e,{cssClassNames:[A,`namespace-${m}`,`front`,`model-${g}`],fetchAdapter:a,fileAdapter:s,namespace:m,strictLineBreaks:f,syncMediaAssets:p,useEmptyPlaceholder:!0}),b=await U(t,{cssClassNames:[A,`namespace-${m}`,`back`,`model-${g}`],fetchAdapter:a,fileAdapter:s,namespace:m,strictLineBreaks:f,syncMediaAssets:p,useEmptyPlaceholder:!0}),n!==void 0&&(x=await U(n,{cssClassNames:[A,`namespace-${m}`,`extra`,`model-${g}`],fetchAdapter:a,fileAdapter:s,namespace:m,strictLineBreaks:f,syncMediaAssets:p,useEmptyPlaceholder:!1}));break}case`Yanki - Basic (type in the answer)`:{let e=ln(h);if(e===void 0)throw Error(`Could not find emphasis in Basic (type in the answer) note AST.`);let t=h,n=y(`root`,y(`paragraph`,e.children));v=await U(t,{cssClassNames:[A,`namespace-${m}`,`front`,`model-${g}`],fetchAdapter:a,fileAdapter:s,namespace:m,strictLineBreaks:f,syncMediaAssets:p,useEmptyPlaceholder:!0}),b=await U(n,{cssClassNames:[A,`namespace-${m}`,`back`,`model-${g}`],fetchAdapter:a,fileAdapter:s,namespace:m,strictLineBreaks:f,syncMediaAssets:p,useEmptyPlaceholder:!1});break}case`Yanki - Cloze`:{let[e,t]=rn(h);v=await U(nn(e),{cssClassNames:[A,`namespace-${m}`,`front`,`model-${g}`],fetchAdapter:a,fileAdapter:s,namespace:m,strictLineBreaks:f,syncMediaAssets:p,useEmptyPlaceholder:!0}),b=await U(t,{cssClassNames:[A,`namespace-${m}`,`back`,`model-${g}`],fetchAdapter:a,fileAdapter:s,namespace:m,strictLineBreaks:f,syncMediaAssets:p,useEmptyPlaceholder:!1});break}}return{deckName:``,fields:{Back:b,...x!==void 0&&{Extra:x},Front:v,YankiNamespace:m},modelName:g,noteId:_.noteId??void 0,tags:fn(_.tags)}}function fn(e){return(typeof e==`string`?[e]:e??[]).map(e=>e.replaceAll(`/`,`::`))}const pn={...M};async function mn(e,t){let{allFilePaths:n,basePath:r,fetchAdapter:i=P(),fileAdapter:a=await N(),namespace:s,obsidianVault:c,strictLineBreaks:l,syncMediaAssets:u}=o(pn,t??{}),d=F(s);e.sort((e,t)=>e.localeCompare(t));let f=gn(e);return await Promise.all(e.map(async(e,t)=>{let o=await a.readFile(e),s=await dn(o,{allFilePaths:n,basePath:r,cwd:w.dirname(e),fetchAdapter:i,fileAdapter:a,namespace:d,namespaceValidationAndSanitization:!1,obsidianVault:c,strictLineBreaks:l,syncMediaAssets:u});return s.deckName===``&&(s.deckName=f[t]),{filePath:e,filePathOriginal:e,markdown:o,note:s}}))}const hn={mode:`common-root`};function gn(e,t){let{mode:n}=o(hn,t??{});if(e.length===0)return[];let r=e.map(e=>w.dirname(e).split(w.sep)),i=r.reduce((e,t)=>e.filter((e,n)=>e===t[n])),a=r.some(e=>e.at(-1)===i.at(-1)),s=n===`common-parent`||a?1:0;return r.map(e=>e.slice(i.length-s).join(`::`))}function _n(e,t,n){if(t===`off`)throw Error(`manageFilenames must not be off`);switch(e.modelName){case`Yanki - Basic`:case`Yanki - Basic (and reversed card with extra)`:case`Yanki - Basic (type in the answer)`:{let r=k(q(e.fields.Front).replace(j,``).replace(Te,``)),i=k(q(e.fields.Back).replace(j,``).replace(Te,``));switch(t){case`prompt`:return q(r??i??``,n);case`response`:return q(i??r??``,n)}}case`Yanki - Cloze`:{let r=lt(e.fields.Front),i=k(r.split(`{{`).at(0)??``),a=k(/\{\{\w\d*\s?:{0,2}([^:}]+)/.exec(r)?.at(1)),o=k(r.split(`}}`).at(1)?.split(`{{`).at(0)??``);switch(t){case`prompt`:return q(i??o??a??``,n);case`response`:return q(a??i??o??``,n)}}}}function q(e,t){let n=me(ut(e).trim(),{maxLength:2**53-1,replacement:` `}).replaceAll(/\s+/g,` `).trim();return n.length===0&&(n=Te),n=n.normalize(`NFC`),t===void 0?n:ve(n,Math.min(t,108))}function vn(e,t){let n=xn(e,1),r=2;for(;t.includes(n.toLowerCase());)n=xn(e,r),r++;return n}function yn(e,t){let n=xn(e,2);return t.includes(n.toLowerCase())?e:bn(e)}function bn(e){let t=e.endsWith(`.`)||e.endsWith(`)`)?void 0:w.extname(e),n=w.basename(e,t).replace(/\s\(\d+\)$/,``);return w.join(w.dirname(e),`${n}${t??``}`)}function xn(e,t){let n=w.extname(e),r=`${bn(w.basename(e,n))} (${t})`;return w.join(w.dirname(e),`${r}${n}`)}function Sn(e){return`${e}-${he(8)}`}const Cn={...M};async function wn(e,t){let{dryRun:n,fileAdapter:r=await N(),manageFilenames:i,maxFilenameLength:a}=o(Cn,t??{});if(i!==`off`){let t=[];for(let n of e){let{filePath:e,note:r}=n;if(e===void 0)throw Error(`File path is undefined`);let o=_n(r,i,a),s=vn(w.join(w.dirname(e),`${o}${w.extname(e)}`),t);n.filePath=s,t.push(s.toLowerCase())}for(let n of e){let{filePath:e}=n;if(e===void 0)throw Error(`File path is undefined`);n.filePath=yn(e,t)}let o=new Map;for(let t of e){let{filePath:i,filePathOriginal:a}=t;if(a===void 0)throw Error(`Original file path is undefined.`);if(i===void 0)throw Error(`File path is undefined.`);if(i===a)continue;let s=i;e.some(({filePath:e,filePathOriginal:t})=>e!==i&&t?.toLowerCase()===i.toLowerCase())&&(s=Sn(i),o.set(s,i)),n||await r.rename(a,s)}for(let[e,t]of o)n||await r.rename(e,t)}return e.sort((e,t)=>e.filePath.localeCompare(t.filePath)),e}({...M});const Tn={...M};async function En(e,t){let n=performance.now(),r=structuredClone(e),{ankiConnectOptions:i,ankiWeb:a,checkDatabase:s,dryRun:c,namespace:u,strictMatching:d}=o(Tn,t??{}),f=F(u),p=[],m=new l(i);if(await G(m)===`ankiUnreachable`)return{ankiWeb:a,deletedDecks:[],deletedMedia:[],dryRun:c,duration:performance.now()-n,fixedDatabase:!1,namespace:f,synced:r.map(e=>({action:`ankiUnreachable`,note:e}))};for(let e of r)e.deckName===``&&(e.deckName=`Yanki`);let h=await wt(m,`*`),g=h.filter(e=>e.fields.YankiNamespace===f);for(let e of r){if(e.noteId===void 0)continue;let t=Dn(r,e.noteId);if(t.length<=1)continue;let n=On(t,g.find(t=>t.noteId===e.noteId));for(let e of t)e!==n&&(e.noteId=void 0)}let _=new Set(r.filter(e=>e.noteId!==void 0&&g.some(t=>e.noteId===t.noteId)).map(e=>e.noteId));for(let e of r){let t=h.find(t=>t.noteId===e.noteId);if(t?.fields.YankiNamespace!==f&&(e.noteId=void 0,t=void 0),t===void 0)e.noteId=d?void 0:kn(e,g,_),e.noteId===void 0?(e.noteId=await yt(m,{...e,noteId:void 0},c),p.push({action:`created`,note:e})):p.push({action:`matched`,note:e});else{if(t.noteId===void 0)throw Error(`Remote note ID is undefined`);let n=await bt(m,e,t,c);p.push({action:n?`updated`:`unchanged`,note:e})}if(e.noteId===void 0)throw Error(`Note ID is undefined`);_.add(e.noteId)}let v=g.filter(e=>!r.some(t=>t.noteId===e.noteId));await vt(m,v,c);for(let e of v)p.push({action:`deleted`,note:e});let y=[],b=[];for(let e of p)e.action===`deleted`?b.push(e.note):y.push(e.note);let x=await Et(m,y,g,c),S=!1;if(s){let e=g.filter(e=>p.some(t=>t.action===`updated`&&t.note.noteId===e.noteId&&t.note.modelName!==e.modelName));if(e.length>0){let t=e.flatMap(({cards:e})=>e??[]);try{await m.card.cardsInfo({cards:t})}catch{S=!0,await m.graphical.guiCheckDatabase()}}}let C=await kt(m,y,f,c);return x.length>0||p.some(e=>e.action!==`unchanged`),!c&&a&&await At(m),{ankiWeb:a,deletedDecks:x,deletedMedia:C,dryRun:c,duration:performance.now()-n,fixedDatabase:S,namespace:f,synced:p}}function Dn(e,t){return e.filter(e=>e.noteId===void 0?!1:e.noteId===t)}function On(e,t){return e.find(e=>e.fields.Front===t?.fields.Front&&e.fields.Back===t.fields.Back&&e.fields.Extra===t.fields.Extra)??e[0]}function kn(e,t,n){return t.find(t=>t.noteId!==void 0&&!n.has(t.noteId)&&St(e,t,!1))?.noteId??void 0}const An={...M,...Tn};async function jn(e,t){let n=performance.now(),{allFilePaths:r,ankiConnectOptions:i,ankiWeb:a,basePath:s,checkDatabase:c,dryRun:l,fetchAdapter:u=P(),fileAdapter:d=await N(),manageFilenames:f,maxFilenameLength:p,namespace:m,obsidianVault:h,strictLineBreaks:g,strictMatching:_,syncMediaAssets:v}=o(An,t??{}),y=e.map(e=>L(e)),b=s===void 0?void 0:L(s),x=r.map(e=>L(e)),S=F(m),C=await wn(await mn(y,{allFilePaths:x,basePath:b,fetchAdapter:u,fileAdapter:d,namespace:S,obsidianVault:h,strictLineBreaks:g,syncMediaAssets:v}),{dryRun:l,fileAdapter:d,manageFilenames:f,maxFilenameLength:p});if(h!==void 0&&C.some(e=>e.filePath!==e.filePathOriginal)){let e=await mn(C.map(e=>e.filePath),{allFilePaths:x.map(e=>{let t=C.find(t=>t.filePathOriginal===e);return t?t.filePath:e}),basePath:b,fetchAdapter:u,fileAdapter:d,namespace:S,obsidianVault:h,strictLineBreaks:g,syncMediaAssets:v});for(let[t,n]of C.entries())n.note=e[t].note}let{deletedDecks:ee,deletedMedia:w,fixedDatabase:te,synced:T}=await En(C.map(e=>e.note),{ankiConnectOptions:i,ankiWeb:a,checkDatabase:c,dryRun:l,namespace:S,strictMatching:_}),E=T.filter(e=>e.action!==`deleted`);for(let[e,t]of C.entries()){let n=E[e];if((t.note.noteId===void 0||t.note.noteId!==n.note.noteId)&&n.action!==`ankiUnreachable`){let e=await Bt(t.markdown,n.note.noteId);l||await d.writeFile(t.filePath,e)}n.filePath=t.filePath,n.filePathOriginal=t.filePathOriginal}let ne=[...T.filter(e=>e.action===`deleted`).map(e=>({action:`deleted`,filePath:void 0,filePathOriginal:void 0,note:e.note})),...E].sort((e,t)=>(e.filePath??``).localeCompare(t.filePath??``));return{ankiWeb:a,deletedDecks:ee,deletedMedia:w,dryRun:l,duration:performance.now()-n,fixedDatabase:te,namespace:S,synced:ne}}function Mn(e,t=!1){let n=[],{synced:r}=e,i=r.reduce((e,t)=>(e[t.action]=(e[t.action]||0)+1,e),{}),a=r.filter(e=>e.action!==`deleted`).length,o=r.filter(e=>e.filePath!==e.filePathOriginal).length,l=i.ankiUnreachable>0;if(n.push(`${e.dryRun?`Will sync`:l?`Failed to sync`:`Successfully synced`} ${a} ${s(`note`,a)} to Anki${e.dryRun?``:` in ${c(e.duration)}`}.`),t){n.push(``,e.dryRun?`Sync Plan Summary:`:`Sync Summary:`);for(let[e,t]of Object.entries(i))n.push(` ${_e(e)}: ${t}`);o>0&&n.push(``,`Local notes renamed: ${o}`),e.deletedDecks.length>0&&n.push(``,`Decks pruned: ${e.deletedDecks.length}`),e.deletedMedia.length>0&&n.push(``,`Media assets deleted: ${e.deletedMedia.length}`),e.dryRun||n.push(``,`Database automatically fixed: ${e.fixedDatabase?`Yes`:`No`}`),n.push(``,e.dryRun?`Sync Plan Details:`:`Sync Details:`);for(let{action:e,filePath:t,note:i}of r)t===void 0?n.push(` Note ID ${i.noteId} ${_e(e)} (From Anki)`):n.push(` Note ID ${i.noteId} ${_e(e)} ${t}`)}return n.join(`
|
|
51
|
+
`)}const Nn=process?.versions?.node!==void 0,J={verbose:!1,log(...e){if(!this.verbose)return;let t=D.gray(`[Log]`);Nn?console.warn(t,...e):console.log(t,...e)},logPrefixed(e,...t){this.info(D.blue(`[${e}]`),...t)},info(...e){if(!this.verbose)return;let t=D.green(`[Info]`);Nn?console.warn(t,...e):console.info(t,...e)},infoPrefixed(e,...t){this.info(D.blue(`[${e}]`),...t)},warn(...e){console.warn(D.yellow(`[Warning]`),...e)},warnPrefixed(e,...t){this.warn(D.blue(`[${e}]`),...t)},error(...e){console.error(D.red(`[Error]`),...e)},errorPrefixed(e,...t){this.error(D.blue(`[${e}]`),...t)}},Y={"anki-auto-launch":{alias:`l`,default:!1,describe:`Attempt to open the Anki desktop app if it's not already running. (Experimental, macOS only.)`,type:`boolean`}},Pn={"anki-web":{alias:`w`,default:!0,describe:`Automatically sync any changes to AnkiWeb after Yanki has finished syncing locally. If false, only local Anki data is updated and you must manually invoke a sync to AnkiWeb. This is the equivalent of pushing the "sync" button in the Anki app.`,type:`boolean`}},X={"anki-connect":{default:`http://127.0.0.1:8765`,describe:`Host and port of the Anki-Connect server. The default is usually fine. See the Anki-Connect documentation for more information.`,type:`string`}},Fn={verbose:{default:!1,describe:`Enable verbose logging.`,type:`boolean`}};function Z(e){return{json:{default:!1,describe:e,type:`boolean`}}}const In={"dry-run":{alias:`d`,default:!1,describe:`Run without making any changes to the Anki database. See a report of what would have been done.`,type:`boolean`}};function Ln(e){return{namespace:{alias:`n`,default:M.namespace,describe:e,type:`string`}}}const Rn={"strict-line-breaks":{alias:`b`,default:M.strictLineBreaks,describe:`Set to false to treat single newlines in Markdown as line breaks.`,type:`boolean`}};function Q(e){let t=Qe(e);if(t===void 0)throw Error(`Invalid AnkiConnect URL: "${e}"`);return t}const $=e=>{throw e instanceof Error?(e.cause?.code===`ECONNREFUSED`&&(J.error(`Failed to connect to Anki. Make sure Anki is running and AnkiConnect is installed.`),process.exitCode=1,process.exit()),e):Error(`Unknown error`)},zn=i(a(process.argv));await zn.scriptName(`yanki`).usage(`$0 [command]`,"Run a Yanki command. Defaults to `sync` if a command is not provided.").command([`$0 <directory> [options]`,`sync <directory> [options]`],`Perform a one-way synchronization from a local directory of Markdown files to the Anki database. Any Markdown files in subdirectories are included as well.`,e=>e.positional(`directory`,{demandOption:!0,describe:`The path to the local directory of Markdown files to sync.`,type:`string`}).option(In).option(Ln(`Advanced option for managing multiple Yanki synchronization groups. Case insensitive. See the readme for more information.`)).option(X).option(Y).option(Pn).option(`manage-filenames`,{alias:`m`,choices:[`off`,`prompt`,`response`],default:M.manageFilenames,describe:'Rename local note files to match their content. Useful if you want to feel have semantically reasonable note file names without managing them by hand. The `"prompt"` option will attempt to create the filename based on the "front" of the card, while `"response"` will prioritize the "back", "Cloze", or "type in the answer" portions of the card. Truncation, sanitization, and deduplication are taken care of.',type:`string`}).option(`max-filename-length`,{default:void 0,defaultDescription:String(M.maxFilenameLength),describe:"If `manage-filenames` is enabled, this option specifies the maximum length of the filename in characters.",type:`number`}).option(`sync-media`,{alias:`s`,choices:[`off`,`all`,`local`,`remote`],default:M.syncMediaAssets,describe:"Sync image, video, and audio assets to Anki's media storage system. Clean up is managed automatically. The `all` argument will save both local and remote assets to Anki, while `local` will only save local assets, `remote` will only save remote assets, and `off` will not save any assets.",type:`string`}).option(`strict-matching`,{default:M.strictMatching,describe:'Consider notes to be a "match" only if the local Markdown frontmatter `noteId` matches the remote Anki database `noteId` exactly. When disabled, Yanki will attempt to reuse existing Anki notes whose content matches a local Markdown note, even if the local and remote `noteId` differs. This helps preserve study progress in Anki if the local Markdown frontmatter is lost or corrupted. In Yanki 0.17.0 and earlier, `--strict-matching` was the default behavior. Starting with version 0.18.0, it is disabled by default.',type:`boolean`}).option(`check-database`,{default:M.checkDatabase,describe:'Automatically run Anki\'s "Check Database" command after note model updates that might produce database corruption. In Yanki 1.0.2 and earlier, `--check-database false` was the default behavior. Starting with version 1.1.0, it is enabled by default.',type:`boolean`}).option(Rn).option(Z(`Output the sync report as JSON.`)).option(Fn),async({ankiAutoLaunch:t,ankiConnect:n,ankiWeb:i,checkDatabase:a,directory:o,dryRun:s,json:c,manageFilenames:l,maxFilenameLength:u,namespace:d,recursive:f=!0,strictLineBreaks:p,strictMatching:m,syncMedia:h,verbose:g})=>{J.verbose=g;let _=L(r(o)),v=(await e(f?`**/*.md`:`*.md`,{absolute:!0,cwd:_})).map(e=>L(e)),y=(await e(`**/*`,{absolute:!0,cwd:_})).map(e=>L(e));if(v.length===0){J.error(`No Markdown files found in "${o}".`),process.exitCode=1;return}l===`off`&&u!==void 0&&J.warn("Ignoring `max-filename-length` option because `manage-filenames` is not enabled.");let{host:b,port:x}=Q(n),S=await jn(v,{allFilePaths:y,ankiConnectOptions:{autoLaunch:t,host:b,port:x},ankiWeb:i,checkDatabase:a,dryRun:s,manageFilenames:l,maxFilenameLength:u,namespace:d,strictLineBreaks:p,strictMatching:m,syncMediaAssets:h}).catch($);c?(process.stdout.write(JSON.stringify(S,void 0,2)),process.stdout.write(`
|
|
52
|
+
`)):(process.stderr.write(Mn(S,g)),process.stderr.write(`
|
|
53
|
+
`))}).command(`list [options]`,`Utility command to list Yanki-created notes in the Anki database.`,e=>e.option(Ln("Advanced option to list notes in a specific namespace. Case insensitive. Notes from the default internal namespace are listed by default. Pass `'*'` to list all Yanki-created notes in the Anki database.")).options(X).options(Y).option(Z(`Output the list of notes as JSON to stdout.`)),async({ankiAutoLaunch:e,ankiConnect:t,json:n,namespace:r})=>{let{host:i,port:a}=Q(t),o=await Ft({ankiConnectOptions:{autoLaunch:e,host:i,port:a},namespace:r}).catch($);n?(process.stdout.write(JSON.stringify(o,void 0,2)),process.stdout.write(`
|
|
54
|
+
`)):(process.stdout.write(It(o)),process.stdout.write(`
|
|
55
|
+
`))}).command(`delete [options]`,"Utility command to manually delete Yanki-created notes in the Anki database. This is for advanced use cases, usually the `sync` command takes care of deleting files from Anki Database once they're removed from the local file system.",e=>e.option(In).option(Ln("Advanced option to list notes in a specific namespace. Case insensitive. Notes from the default internal namespace are listed by default. If you've synced notes to multiple namespaces, Pass `'*'` to delete all Yanki-created notes in the Anki database.")).options(X).options(Y).option(Pn).option(Z(`Output the list of deleted notes as JSON to stdout.`)).option(Fn),async({ankiAutoLaunch:e,ankiConnect:t,ankiWeb:n,dryRun:r,json:i,namespace:a,verbose:o})=>{let{host:s,port:c}=Q(t),l=await Mt({ankiConnectOptions:{autoLaunch:e,host:s,port:c},ankiWeb:n,dryRun:r,namespace:a}).catch($);i?(process.stdout.write(JSON.stringify(l,void 0,2)),process.stdout.write(`
|
|
56
|
+
`)):(process.stderr.write(Nt(l,o)),process.stderr.write(`
|
|
57
|
+
`))}).command(`style [options]`,`Utility command to set the CSS stylesheet for all present and future Yanki-created notes.`,e=>e.option(In).option(`css`,{alias:`c`,default:void 0,describe:`Path to the CSS stylesheet to set for all Yanki-created notes. If not provided, the default Anki stylesheet is used.`,type:`string`}).options(X).options(Y).option(Pn).option(Z(`Output the list of updated note types / models as JSON to stdout.`)).option(Fn),async({ankiAutoLaunch:e,ankiConnect:r,ankiWeb:i,css:a,dryRun:o,json:s,verbose:c})=>{let{host:l,port:u}=Q(r),d;if(a!==void 0){if(n.extname(a)!==`.css`){J.error(`The provided CSS file must have a .css extension.`),process.exitCode=1;return}try{d=await t.readFile(a,`utf8`)}catch(e){e instanceof Error?J.error(`Error loading CSS file: ${e.message}`):J.error(`Unknown error loading CSS file: ${String(e)}`),process.exitCode=1;return}}let f=await Rt({ankiConnectOptions:{autoLaunch:e,host:l,port:u},ankiWeb:i,css:d??void 0,dryRun:o}).catch($);s?(process.stdout.write(JSON.stringify(f,void 0,2)),process.stdout.write(`
|
|
58
|
+
`)):(process.stderr.write(zt(f,c)),process.stderr.write(`
|
|
59
|
+
`))}).demandCommand(1).alias(`h`,`help`).version(ge).alias(`v`,`version`).help().wrap(process.stdout.isTTY?Math.min(120,zn.terminalWidth()):0).parse();export{};
|