yanki 1.2.4 → 1.2.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/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var q=Object.defineProperty;var m=(e,o)=>q(e,"name",{value:o,configurable:!0});import{globby as $}from"globby";import G from"node:fs/promises";import W from"node:path";import L from"node:os";import _ from"yargs";import{hideBin as V}from"yargs/helpers";import{w as K,x as h,v as Q,y as O,n as X,m as Z,l as ee,b as te,c as oe,f as ne,s as se,i as ae}from"../sync-files-
|
|
2
|
+
var q=Object.defineProperty;var m=(e,o)=>q(e,"name",{value:o,configurable:!0});import{globby as $}from"globby";import G from"node:fs/promises";import W from"node:path";import L from"node:os";import _ from"yargs";import{hideBin as V}from"yargs/helpers";import{w as K,x as h,v as Q,y as O,n as X,m as Z,l as ee,b as te,c as oe,f as ne,s as se,i as ae}from"../sync-files-CrisD0s7.js";import"process";import"rehype-parse";import"node:crypto";let y,x;function ie(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);if(y===void 0&&(y=L.homedir()),y&&/^~(?=$|\/|\\)/.test(e))return e.replace(/^~/,y);const o=e.match(/^~([^/\\]+)(.*)/);if(o&&(x===void 0&&(x=L.userInfo().username),x)){const s=o[1],a=o[2];if(s===x)return y+a}return e}m(ie,"untildify");var re="1.2.5",B={exports:{}},F;function le(){if(F)return B.exports;F=1;let e=process||{},o=e.argv||[],s=e.env||{},a=!(s.NO_COLOR||o.includes("--no-color"))&&(!!s.FORCE_COLOR||o.includes("--color")||e.platform==="win32"||(e.stdout||{}).isTTY&&s.TERM!=="dumb"||!!s.CI),d=m((n,t,l=n)=>c=>{let i=""+c,u=i.indexOf(t,n.length);return~u?n+p(i,t,l,u)+t:n+i+t},"formatter"),p=m((n,t,l,c)=>{let i="",u=0;do i+=n.substring(u,c)+l,u=c+t.length,c=n.indexOf(t,u);while(~c);return i+n.substring(u)},"replaceClose"),r=m((n=a)=>{let t=n?d:()=>String;return{isColorSupported:n,reset:t("\x1B[0m","\x1B[0m"),bold:t("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:t("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:t("\x1B[3m","\x1B[23m"),underline:t("\x1B[4m","\x1B[24m"),inverse:t("\x1B[7m","\x1B[27m"),hidden:t("\x1B[8m","\x1B[28m"),strikethrough:t("\x1B[9m","\x1B[29m"),black:t("\x1B[30m","\x1B[39m"),red:t("\x1B[31m","\x1B[39m"),green:t("\x1B[32m","\x1B[39m"),yellow:t("\x1B[33m","\x1B[39m"),blue:t("\x1B[34m","\x1B[39m"),magenta:t("\x1B[35m","\x1B[39m"),cyan:t("\x1B[36m","\x1B[39m"),white:t("\x1B[37m","\x1B[39m"),gray:t("\x1B[90m","\x1B[39m"),bgBlack:t("\x1B[40m","\x1B[49m"),bgRed:t("\x1B[41m","\x1B[49m"),bgGreen:t("\x1B[42m","\x1B[49m"),bgYellow:t("\x1B[43m","\x1B[49m"),bgBlue:t("\x1B[44m","\x1B[49m"),bgMagenta:t("\x1B[45m","\x1B[49m"),bgCyan:t("\x1B[46m","\x1B[49m"),bgWhite:t("\x1B[47m","\x1B[49m"),blackBright:t("\x1B[90m","\x1B[39m"),redBright:t("\x1B[91m","\x1B[39m"),greenBright:t("\x1B[92m","\x1B[39m"),yellowBright:t("\x1B[93m","\x1B[39m"),blueBright:t("\x1B[94m","\x1B[39m"),magentaBright:t("\x1B[95m","\x1B[39m"),cyanBright:t("\x1B[96m","\x1B[39m"),whiteBright:t("\x1B[97m","\x1B[39m"),bgBlackBright:t("\x1B[100m","\x1B[49m"),bgRedBright:t("\x1B[101m","\x1B[49m"),bgGreenBright:t("\x1B[102m","\x1B[49m"),bgYellowBright:t("\x1B[103m","\x1B[49m"),bgBlueBright:t("\x1B[104m","\x1B[49m"),bgMagentaBright:t("\x1B[105m","\x1B[49m"),bgCyanBright:t("\x1B[106m","\x1B[49m"),bgWhiteBright:t("\x1B[107m","\x1B[49m")}},"createColors");return B.exports=r(),B.exports.createColors=r,B.exports}m(le,"requirePicocolors");var ce=le(),f=K(ce);const T=process?.versions?.node!==void 0,g={verbose:!1,log(...e){if(!this.verbose)return;const o=f.gray("[Log]");T?console.warn(o,...e):console.log(o,...e)},logPrefixed(e,...o){this.info(f.blue(`[${e}]`),...o)},info(...e){if(!this.verbose)return;const o=f.green("[Info]");T?console.warn(o,...e):console.info(o,...e)},infoPrefixed(e,...o){this.info(f.blue(`[${e}]`),...o)},warn(...e){console.warn(f.yellow("[Warning]"),...e)},warnPrefixed(e,...o){this.warn(f.blue(`[${e}]`),...o)},error(...e){console.error(f.red("[Error]"),...e)},errorPrefixed(e,...o){this.error(f.blue(`[${e}]`),...o)}},b={"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"}},R={"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"}},w={"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"}},P={verbose:{default:!1,describe:"Enable verbose logging.",type:"boolean"}};function k(e){return{json:{default:!1,describe:e,type:"boolean"}}}m(k,"jsonOption");const N={"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 E(e){return{namespace:{alias:"n",default:h.namespace,describe:e,type:"string"}}}m(E,"namespaceOption");const de={"strict-line-breaks":{alias:"b",default:h.strictLineBreaks,describe:"Set to false to treat single newlines in Markdown as line breaks.",type:"boolean"}};function v(e){const o=Q(e);if(o===void 0)throw new Error(`Invalid AnkiConnect URL: "${e}"`);return o}m(v,"urlToHostAndPortValidated");const C=m(e=>{throw e instanceof Error?(e.cause?.code==="ECONNREFUSED"&&(g.error("Failed to connect to Anki. Make sure Anki is running and AnkiConnect is installed."),process.exitCode=1,process.exit()),e):new Error("Unknown error")},"ankiNotRunningErrorHandler"),U=_(V(process.argv));await U.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(N).option(E("Advanced option for managing multiple Yanki synchronization groups. Case insensitive. See the readme for more information.")).option(w).option(b).option(R).option("manage-filenames",{alias:"m",choices:["off","prompt","response"],default:h.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(h.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:h.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:h.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:h.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(de).option(k("Output the sync report as JSON.")).option(P),async({ankiAutoLaunch:e,ankiConnect:o,ankiWeb:s,checkDatabase:a,directory:d,dryRun:p,json:r,manageFilenames:n,maxFilenameLength:t,namespace:l,recursive:c=!0,strictLineBreaks:i,strictMatching:u,syncMedia:D,verbose:M})=>{g.verbose=M;const A=O(ie(d)),J=c?`${A}/**/*.md`:`${A}/*.md`,Y=(await $(J,{absolute:!0})).map(S=>O(S)),z=(await $(`${A}/**/*`,{absolute:!0})).map(S=>O(S));if(Y.length===0){g.error(`No Markdown files found in "${d}".`),process.exitCode=1;return}n==="off"&&t!==void 0&&g.warn("Ignoring `max-filename-length` option because `manage-filenames` is not enabled.");const{host:H,port:j}=v(o),I=await X(Y,{allFilePaths:z,ankiConnectOptions:{autoLaunch:e,host:H,port:j},ankiWeb:s,checkDatabase:a,dryRun:p,manageFilenames:n,maxFilenameLength:t,namespace:l,strictLineBreaks:i,strictMatching:u,syncMediaAssets:D}).catch(C);r?(process.stdout.write(JSON.stringify(I,void 0,2)),process.stdout.write(`
|
|
3
3
|
`)):(process.stderr.write(Z(I,M)),process.stderr.write(`
|
|
4
4
|
`))}).command("list [options]","Utility command to list Yanki-created notes in the Anki database.",e=>e.option(E("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(w).options(b).option(k("Output the list of notes as JSON to stdout.")),async({ankiAutoLaunch:e,ankiConnect:o,json:s,namespace:a})=>{const{host:d,port:p}=v(o),r=await ee({ankiConnectOptions:{autoLaunch:e,host:d,port:p},namespace:a}).catch(C);s?(process.stdout.write(JSON.stringify(r,void 0,2)),process.stdout.write(`
|
|
5
5
|
`)):(process.stdout.write(te(r)),process.stdout.write(`
|
package/dist/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as n,d as i,q as r,g as f,a as m,e as p,h as u,k as d,o as y,f as S,b as O,i as c,m as F,t as N,j as R,u as g,l as k,r as h,s as w,n as A,p as C,v as G}from"../sync-files-
|
|
1
|
+
import{c as n,d as i,q as r,g as f,a as m,e as p,h as u,k as d,o as y,f as S,b as O,i as c,m as F,t as N,j as R,u as g,l as k,r as h,s as w,n as A,p as C,v as G}from"../sync-files-CrisD0s7.js";import"process";import"rehype-parse";import"node:path";import"node:crypto";export{n as cleanNotes,i as defaultCleanOptions,r as defaultGetNoteFromMarkdownOptions,f as defaultGetStyleOptions,m as defaultListOptions,p as defaultRenameFilesOptions,u as defaultSetStyleOptions,d as defaultSyncFilesOptions,y as defaultSyncNotesOptions,S as formatCleanResult,O as formatListResult,c as formatSetStyleResult,F as formatSyncFilesResult,N as getNoteFromMarkdown,R as getStyle,g as hostAndPortToUrl,k as listNotes,h as renameFiles,w as setStyle,A as syncFiles,C as syncNotes,G as urlToHostAndPort};
|
|
@@ -950,7 +950,7 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
|
|
|
950
950
|
`)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
|
|
951
951
|
`,n)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(t){const n=t.items[t.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,n.value){const r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else if(n.sep)n.sep.push(this.sourceToken);else{if(this.atIndentedComment(n.start,t.indent)){const i=t.items[t.items.length-2]?.value?.end;if(Array.isArray(i)){Array.prototype.push.apply(i,n.start),i.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){const r=!this.onKeyLine&&this.indent===t.indent,i=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind";let u=[];if(i&&n.sep&&!n.value){const a=[];for(let o=0;o<n.sep.length;++o){const l=n.sep[o];switch(l.type){case"newline":a.push(o);break;case"space":break;case"comment":l.indent>t.indent&&(a.length=0);break;default:a.length=0}}a.length>=2&&(u=n.sep.splice(a[1]))}switch(this.type){case"anchor":case"tag":i||n.value?(u.push(this.sourceToken),t.items.push({start:u}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):i||n.value?(u.push(this.sourceToken),t.items.push({start:u,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(Pt(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:u,key:null,sep:[this.sourceToken]}]});else if(em(n.key)&&!Pt(n.sep,"newline")){const a=$n(n.start),o=n.key,l=n.sep;l.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:o,sep:l}]})}else u.length>0?n.sep=n.sep.concat(u,this.sourceToken):n.sep.push(this.sourceToken);else if(Pt(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{const a=$n(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||i?t.items.push({start:u,key:null,sep:[this.sourceToken]}):Pt(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const a=this.flowScalar(this.type);i||n.value?(t.items.push({start:u,key:a,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(a):(Object.assign(n,{key:a,sep:[]}),this.onKeyLine=!0);return}default:{const a=this.startBlockValue(t);if(a){if(a.type==="block-seq"){if(!n.explicitKey&&n.sep&&!Pt(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&t.items.push({start:u});this.stack.push(a);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(t){const n=t.items[t.items.length-1];switch(this.type){case"newline":if(n.value){const r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,t.indent)){const i=t.items[t.items.length-2]?.value?.end;if(Array.isArray(i)){Array.prototype.push.apply(i,n.start),i.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=t.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==t.indent)break;n.value||Pt(n.start,"seq-item-ind")?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>t.indent){const r=this.startBlockValue(t);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(t){const n=t.items[t.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r&&r.type==="flow-collection")}else if(t.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?t.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?t.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{const i=this.flowScalar(this.type);!n||n.value?t.items.push({start:[],key:i,sep:[]}):n.sep?this.stack.push(i):Object.assign(n,{key:i,sep:[]});return}case"flow-map-end":case"flow-seq-end":t.end.push(this.sourceToken);return}const r=this.startBlockValue(t);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{const r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===t.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){const i=ps(r),u=$n(i);tm(t);const a=t.end.splice(1,t.end.length);a.push(this.sourceToken);const o={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:u,key:t,sep:a}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=o}else yield*this.lineEnd(t)}}flowScalar(t){if(this.onNewLine){let n=this.source.indexOf(`
|
|
952
952
|
`)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
|
|
953
|
-
`,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;const n=ps(t),r=$n(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;const n=ps(t),r=$n(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}}function JN(e){const t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new QN||null,prettyErrors:t}}s(JN,"parseOptions");function ZN(e,t={}){const{lineCounter:n,prettyErrors:r}=JN(t),i=new XN(n?.addNewLine),u=new YN(t);let a=null;for(const o of u.compose(i.parse(e),!0,e.length))if(!a)a=o;else if(a.options.logLevel!=="silent"){a.errors.push(new $r(o.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(a.errors.forEach(qp(e,n)),a.warnings.forEach(qp(e,n))),a}s(ZN,"parseDocument");function nm(e,t,n){let r;const i=ZN(e,n);if(!i)return null;if(i.warnings.forEach(u=>Ap(i.options.logLevel,u)),i.errors.length>0){if(i.options.logLevel!=="silent")throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:r},n))}s(nm,"parse");function rm(e,t,n){let r=null;if(typeof t=="function"||Array.isArray(t)?r=t:n===void 0&&t&&(n=t),typeof n=="string"&&(n=n.length),typeof n=="number"){const i=Math.round(n);n=i<1?void 0:i>8?{indent:8}:{indent:i}}if(e===void 0){const{keepUndefined:i}=n??t??{};if(!i)return}return vr(e)&&!r?e.toString(n):new Yr(e,r,n).toString(n)}s(rm,"stringify");const ex={allFilePaths:[],basePath:void 0,convertFilePathsToProtocol:"none",obsidianVaultName:void 0};function ms(e,t){const{allFilePaths:n,basePath:r,convertFilePathsToProtocol:i,cwd:u,obsidianVaultName:a,type:o}=Oe(ex,t??{});i==="obsidian"&&a===void 0&&console.warn("convertFilePathsToProtocol is 'obsidian', but no obsidianVaultName provided");const l=Od(e)??e;switch(qi(l)){case"localFileName":{let f=vd(ut(l),"md");return f=tx(f,u,n??[])??xd(l,{basePath:r,cwd:u}),qi(f)==="localFilePath"?ms(f,{allFilePaths:n,basePath:r,convertFilePathsToProtocol:i,cwd:u,obsidianVaultName:a,type:o}):(console.warn(`Failed to convert local file wiki-style name to path: ${e} --> ${f}`),f)}case"localFilePath":{const f=xd(ut(l),{basePath:r,cwd:u}),h=im(vd(f,"md"),n??[])??im(Ld(f,"md"),n??[])??void 0;if(h!==void 0){if(i!=="none"&&(o==="link"||o==="embed"&&[".md",".pdf"].includes(Id(h)))){if(i==="obsidian"&&a!==void 0)return rx(h,r??"",a);if(i==="file")return nx(h)}return Sr(h)}return Sr(f)}case"localFileUrl":{const f=ut(s_(e));return qi(f)==="localFilePath"?ms(f,{allFilePaths:n,basePath:r,convertFilePathsToProtocol:i,cwd:u,obsidianVaultName:a,type:o}):(console.warn(`Failed to convert file URL to path: ${e} --> ${f}`),f)}case"obsidianVaultUrl":return e;case"remoteHttpUrl":return e;case"unsupportedProtocolUrl":return console.warn(`Unsupported URL protocol: ${e}`),e}}s(ms,"resolveLink");function tx(e,t,n){if(n.length===0)return;const[r,i]=$i(e),u=r.replace(/\.md$/,"").toLowerCase(),a=n.filter(l=>l.replace(/\.md$/,"").toLowerCase().endsWith(u));return a.length===0?void 0:a.length===1?`${a[0]}${i??""}`:`${[...a].sort((l,c)=>{if(!r.endsWith(".md")||r.includes(ne.sep)){const m=l.startsWith(t),p=c.startsWith(t);if(m!==p)return m?-1:1}const f=l.split(ne.sep).length,h=c.split(ne.sep).length;return f!==h?f-h:l.localeCompare(c)})[0]}${i??""}`}s(tx,"resolveNameLink");function im(e,t){const n=Sr(e);if(t.some(r=>r.toLowerCase().endsWith(n.toLowerCase())))return e}s(im,"pathExistsInAllFiles");function nx(e){return`file://${e}`}s(nx,"createFileLink");function rx(e,t,n){const r=n_(e,t);return`obsidian://open?vault=${encodeURIComponent(n)}&file=${encodeURIComponent(r)}`}s(rx,"createObsidianVaultLink");const ix=s(function(e){const{allFilePaths:t=[],basePath:n,cwd:r,enabled:i=!0,obsidianVault:u}=e;return function(a){i&&(ae(a,"link",o=>{o.data??={},o.data.hProperties={...o.data?.hProperties,"data-yanki-src-original":o.url};const l=ms(o.url,{allFilePaths:t,basePath:n,convertFilePathsToProtocol:u===void 0?"none":"obsidian",cwd:r,obsidianVaultName:u,type:"link"});o.url=Xt(l)?l:encodeURI(l)}),ae(a,"image",o=>{o.data??={},o.data.hProperties={...o.data?.hProperties,"data-yanki-src-original":o.url};const l=ms(o.url,{allFilePaths:t,basePath:n,convertFilePathsToProtocol:u===void 0?"none":"obsidian",cwd:r,obsidianVaultName:u,type:"embed"});o.url=Xt(l)?l:encodeURI(l)}))}},"plugin$1");function sx(){let e="",t;return{enter:{wikiEmbed:r,wikiLabel:a,wikiLink:n,wikiUrl:i},exit:{wikiEmbed:c,wikiLabel:o,wikiLink:l,wikiUrl:u}};function n(f){e="",t=void 0,this.enter({children:[],title:void 0,type:"link",url:""},f)}function r(f){e="",t=void 0,this.enter({type:"image",url:""},f)}function i(){this.buffer()}function u(){e=this.resume()}function a(){this.buffer()}function o(){t=this.resume()}function l(f){const h=this.stack.at(-1);h.url=Zh(e),h.children=[{type:"text",value:ft((t??"").replaceAll("|",""))??e.split("#").pop()??e.split("/").pop()??e}],this.exit(f)}function c(f){const h=this.stack.at(-1);h.url=Zh(e),t!==void 0&&(h.alt=t),this.exit(f)}}s(sx,"wikiBasicFromMarkdown");function ux(){return{text:{33:{name:"wikiEmbed",tokenize:e},91:{name:"wikiLink",tokenize:e}}};function e(t,n,r){let i=!1,u=!1,a=0,o=0;return l;function l(w){return w===33?(i=!0,t.enter("wikiEmbed"),t.enter("wikiMarker"),t.consume(w),c):(t.enter("wikiLink"),t.enter("wikiMarker"),c(w))}function c(w){return w===91?(t.consume(w),f):r(w)}function f(w){return w===91?(t.consume(w),t.exit("wikiMarker"),h):r(w)}function h(w){return w===-5||w===-4||w===-3||w===null||w===124||w===93?r(w):(t.enter("wikiUrl"),t.enter("chunkString",{contentType:"string"}),t.consume(w),a++,m)}function m(w){return w===-5||w===-4||w===-3||w===null?r(w):w===124?a===1?r(w):_(w):w===92?t.check({partial:!0,tokenize:v},_,p)(w):w===93?A(w):p(w)}function p(w){return t.consume(w),a++,m}function g(w){return w===-5||w===-4||w===-3||w===null?r(w):w===93?A(w):(t.enter("wikiLabel"),t.enter("chunkString",{contentType:"string"}),t.consume(w),o++,E)}function E(w){return w===-5||w===-4||w===-3||w===null?r(w):w===93?A(w):(t.consume(w),o++,E)}function A(w){return w!==93?r(w):t.check({partial:!0,tokenize:I},D,T)(w)}function D(w){return w!==93?r(w):(u?o>0&&(t.exit("chunkString"),t.exit("wikiLabel")):a>0&&(t.exit("chunkString"),t.exit("wikiUrl")),t.enter("wikiMarker"),t.consume(w),C)}function C(w){return w!==93||a===0?r(w):(t.consume(w),t.exit("wikiMarker"),i?t.exit("wikiEmbed"):t.exit("wikiLink"),n)}function T(w){return w!==93?r(w):(t.consume(w),u?(o++,E):(a++,m))}function I(w,F,q){return M;function M(Y){return Y!==93?q(Y):(w.enter("wikiMarkerTemp"),w.consume(Y),w.exit("wikiMarkerTemp"),F(Y))}}function v(w,F,q){return M;function M(G){return G!==92?q(G):(w.enter("wikiMarkerTemp"),w.consume(G),Y)}function Y(G){return G===124?(w.consume(G),w.exit("wikiMarkerTemp"),F(G)):(w.exit("wikiMarkerTemp"),q(G))}}function _(w){return t.exit("chunkString"),t.exit("wikiUrl"),t.enter("wikiMarker"),t.consume(w),w===92?x:(t.exit("wikiMarker"),u=!0,t.check({partial:!0,tokenize:L},A,g)(w))}function L(w,F,q){return M;function M(Y){return Y===93?(w.enter("wikiMarkerTemp"),w.consume(Y),w.exit("wikiMarkerTemp"),F(Y)):q(Y)}}function x(w){return w!==124?r(w):(t.consume(w),t.exit("wikiMarker"),u=!0,g)}}}s(ux,"wikiBasic");const ax=s(function(){const e=this.data();e.micromarkExtensions=[...e.micromarkExtensions??[],ux()],e.fromMarkdownExtensions=[...e.fromMarkdownExtensions??[],sx()]},"plugin"),ox={...He};async function lx(e,t){const{allFilePaths:n,basePath:r,cwd:i,obsidianVault:u,resolveUrls:a}=Oe(ox,t??{}),o=Ru().use(jF).use(_B,[{anywhere:!1,marker:"-",type:"yaml"}]).use(ax).use(J6,{singleTilde:!1}).use(ix,{allFilePaths:n,basePath:r,cwd:i,enabled:a,obsidianVault:u}).use(dF).use(tF).use(fB).use(Z_);return o.run(o.parse(e))}s(lx,"getAstFromMarkdown");function cx(e){return e.type==="text"}s(cx,"isText");function hx(e,t){return ae(e,t,(n,r,i)=>{if(i&&r!==void 0)return i.children.splice(r,1),Pe}),e}s(hx,"deleteFirstNodeOfType");function Ro(e){const t=e.at(0);t?.type==="text"&&(t.value=t.value.trimStart(),t.value===""&&e.shift());const n=e.at(-1);return n?.type==="text"&&(n.value=n.value.trimEnd(),n.value===""&&e.pop()),e}s(Ro,"trimLeadingAndTrailingSpaces");function fx(e){let t=1;return ae(e,"delete",(n,r,i)=>{if(i===void 0||r===void 0||!("children"in n)||n.children.length===0)return Ve;if(n.children.length>0&&cx(n.children[0])){const o=/^[(|]?(\d{1,2})(?:[\s).|]|$)(.*)$/.exec(n.children[0].value);if(o!==null&&(n.children.length>1||(o.at(2)??"").length>0)){const l=Number.parseInt(o.at(1)??"",10);Number.isNaN(l)||(t=l,n.children[0].value=(o.at(2)?.trim().length??0)>0?o.at(2)??"":"")}}const u=n.children.at(-1),a=n.children.length>1&&u?.type==="emphasis"?[ie("text",`{{c${t}::`),...Ro(n.children.slice(0,-1)),ie("text","::"),...Ro(n.children.slice(-1)),ie("text","}}")]:[ie("text",`{{c${t}::`),...Ro(n.children),ie("text","}}")];i.children.splice(r,1,...a),t+=1}),e}s(fx,"replaceDeleteNodesWithClozeMarkup");function Po(e){let t,n=!1;if(ae(e,"thematicBreak",(u,a,o)=>a===void 0||o===void 0?Ve:(t=a,o.children[a+1]?.type==="thematicBreak"&&(n=!0),Pe)),t===void 0)return[e,void 0];const r={children:e.children.slice(0,t),type:"root"},i={children:e.children.slice(t+(n?2:1)),type:"root"};return[r,i]}s(Po,"splitTreeAtThematicBreak");function dx(e){let t;if(ae(e,r=>{if(r.type==="thematicBreak")return t=void 0,Pe;if(r.type==="delete")return t="Yanki - Cloze",Pe}),t!==void 0)return t;if(!mx(e)&&gx(e))return"Yanki - Basic (type in the answer)";let n;return ae(e,(r,i,u)=>{if(u===null||i===null)return Ve;if(r.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)",Pe}n=r}),t??"Yanki - Basic"}s(dx,"getYankiModelNameFromTree");function px(e){let t;if(ae(e,"yaml",r=>"value"in r?(t=r.value,Pe):Ve),!t)return{};const n=nm(t);if(!n)throw new Error("Could not parse frontmatter");return n}s(px,"getFrontmatterFromTree");function mx(e){let t=!1;return ae(e,"thematicBreak",()=>(t=!0,Pe)),t}s(mx,"hasThematicBreak");function gx(e){let t,n=0;return ae(e,r=>{if(r.type==="text"&&r.value.trim()!=="")t=r,n++;else if(r.type==="emphasis"&&r.children.some(i=>i.type==="text"&&i.value.trim()!==""))return t=r,n++,Ei}),t?.type==="emphasis"&&n>1}s(gx,"isLastVisibleNodeEmphasisWithOthers");function Ex(e){let t,n,r;if(ae(e,"emphasis",(i,u,a)=>{if(a===void 0||u===void 0||i.type!=="emphasis")return Ve;t=i,n=a,r=u}),n&&t&&typeof r=="number")return n.children.splice(r,1),t}s(Ex,"removeLastEmphasis");const sm={namespaceValidationAndSanitization:!0,...He};async function um(e,t){const{allFilePaths:n,basePath:r,cwd:i,fetchAdapter:u=br(),fileAdapter:a=await Bn(),namespace:o,namespaceValidationAndSanitization:l,obsidianVault:c,resolveUrls:f,strictLineBreaks:h,syncMediaAssets:m}=Oe(sm,t??{}),p=l?Qt(o):o;let g=await lx(e,{allFilePaths:n,basePath:r,cwd:i,obsidianVault:c,resolveUrls:f});const E=dx(g),A=px(g);g=hx(g,"yaml");let D="",C="",T;switch(E){case"Yanki - Basic":case"Yanki - Basic (and reversed card with extra)":{let[v,_]=Po(g),L;if(_!==void 0&&E==="Yanki - Basic (and reversed card with extra)"){T="";const[x,w]=Po(_);_=x,L=w}D=await Jt(v,{cssClassNames:[Kt,`namespace-${p}`,"front",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!0}),C=await Jt(_,{cssClassNames:[Kt,`namespace-${p}`,"back",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!0}),L!==void 0&&(T=await Jt(L,{cssClassNames:[Kt,`namespace-${p}`,"extra",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!1}));break}case"Yanki - Basic (type in the answer)":{const v=Ex(g);if(v===void 0)throw new Error("Could not find emphasis in Basic (type in the answer) note AST.");const _=g,L=ie("root",ie("paragraph",v.children));D=await Jt(_,{cssClassNames:[Kt,`namespace-${p}`,"front",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!0}),C=await Jt(L,{cssClassNames:[Kt,`namespace-${p}`,"back",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!1});break}case"Yanki - Cloze":{g=fx(g);const[v,_]=Po(g);D=await Jt(v,{cssClassNames:[Kt,`namespace-${p}`,"front",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!0}),C=await Jt(_,{cssClassNames:[Kt,`namespace-${p}`,"back",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!1});break}}return{deckName:"",fields:{Back:C,...T!==void 0&&{Extra:T},Front:D,YankiNamespace:p},modelName:E,noteId:A.noteId??void 0,tags:Ax(A.tags)}}s(um,"getNoteFromMarkdown");function Ax(e){return(typeof e=="string"?[e]:e??[]).map(t=>t.replaceAll("/","::"))}s(Ax,"obsidianTagsToAnkiTags");const Dx={...He};async function Mo(e,t){const{allFilePaths:n,basePath:r,fetchAdapter:i=br(),fileAdapter:u=await Bn(),namespace:a,obsidianVault:o,strictLineBreaks:l,syncMediaAssets:c}=Oe(Dx,t??{}),f=Qt(a);e.sort((p,g)=>p.localeCompare(g));const h=yx(e);return await Promise.all(e.map(async(p,g)=>{const E=await u.readFile(p),A=await um(E,{allFilePaths:n,basePath:r,cwd:ne.dirname(p),fetchAdapter:i,fileAdapter:u,namespace:f,namespaceValidationAndSanitization:!1,obsidianVault:o,strictLineBreaks:l,syncMediaAssets:c});return A.deckName===""&&(A.deckName=h[g]),{filePath:p,filePathOriginal:p,markdown:E,note:A}}))}s(Mo,"loadLocalNotes");const Cx={mode:"common-root"};function yx(e,t){const{mode:n}=Oe(Cx,{});if(e.length===0)return[];const r=e.map(l=>ne.dirname(l).split(ne.sep)),i=r.reduce((l,c)=>l.filter((h,m)=>h===c[m])),u=r.some(l=>l.at(-1)===i.at(-1)),a=n==="common-parent"||u?1:0;return r.map(l=>l.slice(i.length-a).join("::"))}s(yx,"getDeckNamesFromFilePaths");const Tx={...He};async function am(e,t){const{dryRun:n,fileAdapter:r=await Bn(),manageFilenames:i,maxFilenameLength:u}=Oe(Tx,t??{});if(i!=="off"){const a=[];for(const l of e){const{filePath:c,note:f}=l;if(c===void 0)throw new Error("File path is undefined");const h=V_(f,i,u),m=ne.join(ne.dirname(c),`${h}${ne.extname(c)}`),p=W_(m,a);l.filePath=p,a.push(p.toLowerCase())}for(const l of e){const{filePath:c}=l;if(c===void 0)throw new Error("File path is undefined");l.filePath=K_(c,a)}const o=new Map;for(const l of e){const{filePath:c,filePathOriginal:f}=l;if(f===void 0)throw new Error("Original file path is undefined.");if(c===void 0)throw new Error("File path is undefined.");if(c===f)continue;let h=c;e.some(({filePath:m,filePathOriginal:p})=>m!==c&&p?.toLowerCase()===c.toLowerCase())&&(h=Q_(c),o.set(h,c)),n||await r.rename(f,h)}for(const[l,c]of o)n||await r.rename(l,c)}return e.sort((a,o)=>a.filePath.localeCompare(o.filePath)),e}s(am,"renameNotes");const om={...He};async function bx(e,t){const{allFilePaths:n,basePath:r,dryRun:i,fetchAdapter:u=br(),fileAdapter:a=await Bn(),manageFilenames:o,maxFilenameLength:l,namespace:c,obsidianVault:f,strictLineBreaks:h,syncMediaAssets:m}=Oe(om,t??{}),p=e.map(T=>ut(T)),g=r===void 0?void 0:ut(r),E=n.map(T=>ut(T)),A=Qt(c),D=await Mo(p,{allFilePaths:E,basePath:g,fetchAdapter:u,fileAdapter:a,namespace:A,obsidianVault:f,strictLineBreaks:h,syncMediaAssets:m}),C=await am(D,{dryRun:i,fileAdapter:a,manageFilenames:o,maxFilenameLength:l});return{dryRun:i,notes:C}}s(bx,"renameFiles");const Uo={css:V3,...He},kx={...He};async function Sx(e){const{ankiConnectOptions:t}=Oe(Uo,e??{}),n=new Kn(t);if(await Br(n)==="ankiUnreachable")throw new Error("Anki is unreachable. Is Anki running?");const i=new Set;for(const u of ji){const a=await v_(n,u);i.add(a)}if(i.size===0)throw new Error("No CSS found in any Yanki model.");if(i.size>1)throw new Error("Expected all Yanki models to have identical CSS.");return[...i][0]}s(Sx,"getStyle");async function _x(e){const t=performance.now(),{ankiConnectOptions:n,ankiWeb:r,css:i,dryRun:u}=Oe(Uo,e??{}),a=new Kn(n);if(await Br(a)==="ankiUnreachable")throw new Error("Anki is unreachable. Is Anki running?");const l=[];for(const f of ji){const h=await Gd(a,f,i,u);l.push({action:h?"updated":"unchanged",name:f})}const c=l.some(f=>f.action!=="unchanged");return!u&&r&&(c||zu)&&await $a(a),{ankiWeb:r,dryRun:u,duration:performance.now()-t,models:l}}s(_x,"setStyle");function Bx(e,t=!1){const n=[],r=e.models.filter(u=>u.action==="unchanged"),i=e.models.filter(u=>u.action==="updated");if(n.push(`${e.dryRun?"Will":"Successfully"} update ${i.length} ${fn("model",i.length)} and left ${r.length} ${fn("model",r.length)} unchanged${e.dryRun?"":` in ${Cs(e.duration)}`}.`),t){if(i.length>0){n.push("",e.dryRun?"Models to update:":"Updated models:");for(const u of i)n.push(` ${u.name}`)}if(r.length>0){n.push("",e.dryRun?"Models unchanged:":"Unchanged models:");for(const u of r)n.push(` ${u.name}`)}}return n.join(`
|
|
953
|
+
`,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;const n=ps(t),r=$n(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;const n=ps(t),r=$n(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}}function JN(e){const t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new QN||null,prettyErrors:t}}s(JN,"parseOptions");function ZN(e,t={}){const{lineCounter:n,prettyErrors:r}=JN(t),i=new XN(n?.addNewLine),u=new YN(t);let a=null;for(const o of u.compose(i.parse(e),!0,e.length))if(!a)a=o;else if(a.options.logLevel!=="silent"){a.errors.push(new $r(o.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(a.errors.forEach(qp(e,n)),a.warnings.forEach(qp(e,n))),a}s(ZN,"parseDocument");function nm(e,t,n){let r;const i=ZN(e,n);if(!i)return null;if(i.warnings.forEach(u=>Ap(i.options.logLevel,u)),i.errors.length>0){if(i.options.logLevel!=="silent")throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:r},n))}s(nm,"parse");function rm(e,t,n){let r=null;if(typeof t=="function"||Array.isArray(t)?r=t:n===void 0&&t&&(n=t),typeof n=="string"&&(n=n.length),typeof n=="number"){const i=Math.round(n);n=i<1?void 0:i>8?{indent:8}:{indent:i}}if(e===void 0){const{keepUndefined:i}=n??t??{};if(!i)return}return vr(e)&&!r?e.toString(n):new Yr(e,r,n).toString(n)}s(rm,"stringify");const ex={allFilePaths:[],basePath:void 0,convertFilePathsToProtocol:"none",obsidianVaultName:void 0};function ms(e,t){const{allFilePaths:n,basePath:r,convertFilePathsToProtocol:i,cwd:u,obsidianVaultName:a,type:o}=Oe(ex,t??{});i==="obsidian"&&a===void 0&&console.warn("convertFilePathsToProtocol is 'obsidian', but no obsidianVaultName provided");const l=Od(e)??e;switch(qi(l)){case"localFileName":{let f=vd(ut(l),"md");return f=tx(f,u,n??[])??xd(l,{basePath:r,cwd:u}),qi(f)==="localFilePath"?ms(f,{allFilePaths:n,basePath:r,convertFilePathsToProtocol:i,cwd:u,obsidianVaultName:a,type:o}):(console.warn(`Failed to convert local file wiki-style name to path: ${e} --> ${f}`),f)}case"localFilePath":{const f=xd(ut(l),{basePath:r,cwd:u}),h=im(vd(f,"md"),n??[])??im(Ld(f,"md"),n??[])??void 0;if(h!==void 0){if(i!=="none"&&(o==="link"||o==="embed"&&[".md",".pdf"].includes(Id(h)))){if(i==="obsidian"&&a!==void 0)return rx(h,r??"",a);if(i==="file")return nx(h)}return Sr(h)}return Sr(f)}case"localFileUrl":{const f=ut(s_(e));return qi(f)==="localFilePath"?ms(f,{allFilePaths:n,basePath:r,convertFilePathsToProtocol:i,cwd:u,obsidianVaultName:a,type:o}):(console.warn(`Failed to convert file URL to path: ${e} --> ${f}`),f)}case"obsidianVaultUrl":return e;case"remoteHttpUrl":return e;case"unsupportedProtocolUrl":return console.warn(`Unsupported URL protocol: ${e}`),e}}s(ms,"resolveLink");function tx(e,t,n){if(n.length===0)return;const[r,i]=$i(e),u=r.replace(/\.md$/,"").toLowerCase(),a=n.filter(l=>l.replace(/\.md$/,"").toLowerCase().endsWith(u));return a.length===0?void 0:a.length===1?`${a[0]}${i??""}`:`${[...a].sort((l,c)=>{if(!r.endsWith(".md")||r.includes(ne.sep)){const m=l.startsWith(t),p=c.startsWith(t);if(m!==p)return m?-1:1}const f=l.split(ne.sep).length,h=c.split(ne.sep).length;return f!==h?f-h:l.localeCompare(c)})[0]}${i??""}`}s(tx,"resolveNameLink");function im(e,t){const n=Sr(e);if(t.some(r=>r.toLowerCase().endsWith(n.toLowerCase())))return e}s(im,"pathExistsInAllFiles");function nx(e){return`file://${e}`}s(nx,"createFileLink");function rx(e,t,n){const r=n_(e,t);return`obsidian://open?vault=${encodeURIComponent(n)}&file=${encodeURIComponent(r)}`}s(rx,"createObsidianVaultLink");const ix=s(function(e){const{allFilePaths:t=[],basePath:n,cwd:r,enabled:i=!0,obsidianVault:u}=e;return function(a){i&&(ae(a,"link",o=>{o.data??={},o.data.hProperties={...o.data?.hProperties,"data-yanki-src-original":o.url};const l=ms(o.url,{allFilePaths:t,basePath:n,convertFilePathsToProtocol:u===void 0?"none":"obsidian",cwd:r,obsidianVaultName:u,type:"link"});o.url=Xt(l)?l:encodeURI(l)}),ae(a,"image",o=>{o.data??={},o.data.hProperties={...o.data?.hProperties,"data-yanki-src-original":o.url};const l=ms(o.url,{allFilePaths:t,basePath:n,convertFilePathsToProtocol:u===void 0?"none":"obsidian",cwd:r,obsidianVaultName:u,type:"embed"});o.url=Xt(l)?l:encodeURI(l)}))}},"plugin$1");function sx(){let e="",t;return{enter:{wikiEmbed:r,wikiLabel:a,wikiLink:n,wikiUrl:i},exit:{wikiEmbed:c,wikiLabel:o,wikiLink:l,wikiUrl:u}};function n(f){e="",t=void 0,this.enter({children:[],title:void 0,type:"link",url:""},f)}function r(f){e="",t=void 0,this.enter({type:"image",url:""},f)}function i(){this.buffer()}function u(){e=this.resume()}function a(){this.buffer()}function o(){t=this.resume()}function l(f){const h=this.stack.at(-1);h.url=Zh(e),h.children=[{type:"text",value:ft((t??"").replaceAll("|",""))??e.split("#").pop()??e.split("/").pop()??e}],this.exit(f)}function c(f){const h=this.stack.at(-1);h.url=Zh(e),t!==void 0&&(h.alt=t),this.exit(f)}}s(sx,"wikiBasicFromMarkdown");function ux(){return{text:{33:{name:"wikiEmbed",tokenize:e},91:{name:"wikiLink",tokenize:e}}};function e(t,n,r){let i=!1,u=!1,a=0,o=0;return l;function l(w){return w===33?(i=!0,t.enter("wikiEmbed"),t.enter("wikiMarker"),t.consume(w),c):(t.enter("wikiLink"),t.enter("wikiMarker"),c(w))}function c(w){return w===91?(t.consume(w),f):r(w)}function f(w){return w===91?(t.consume(w),t.exit("wikiMarker"),h):r(w)}function h(w){return w===-5||w===-4||w===-3||w===null||w===124||w===93?r(w):(t.enter("wikiUrl"),t.enter("chunkString",{contentType:"string"}),t.consume(w),a++,m)}function m(w){return w===-5||w===-4||w===-3||w===null?r(w):w===124?a===1?r(w):_(w):w===92?t.check({partial:!0,tokenize:v},_,p)(w):w===93?A(w):p(w)}function p(w){return t.consume(w),a++,m}function g(w){return w===-5||w===-4||w===-3||w===null?r(w):w===93?A(w):(t.enter("wikiLabel"),t.enter("chunkString",{contentType:"string"}),t.consume(w),o++,E)}function E(w){return w===-5||w===-4||w===-3||w===null?r(w):w===93?A(w):(t.consume(w),o++,E)}function A(w){return w!==93?r(w):t.check({partial:!0,tokenize:I},D,T)(w)}function D(w){return w!==93?r(w):(u?o>0&&(t.exit("chunkString"),t.exit("wikiLabel")):a>0&&(t.exit("chunkString"),t.exit("wikiUrl")),t.enter("wikiMarker"),t.consume(w),C)}function C(w){return w!==93||a===0?r(w):(t.consume(w),t.exit("wikiMarker"),i?t.exit("wikiEmbed"):t.exit("wikiLink"),n)}function T(w){return w!==93?r(w):(t.consume(w),u?(o++,E):(a++,m))}function I(w,F,q){return M;function M(Y){return Y!==93?q(Y):(w.enter("wikiMarkerTemp"),w.consume(Y),w.exit("wikiMarkerTemp"),F(Y))}}function v(w,F,q){return M;function M(G){return G!==92?q(G):(w.enter("wikiMarkerTemp"),w.consume(G),Y)}function Y(G){return G===124?(w.consume(G),w.exit("wikiMarkerTemp"),F(G)):(w.exit("wikiMarkerTemp"),q(G))}}function _(w){return t.exit("chunkString"),t.exit("wikiUrl"),t.enter("wikiMarker"),t.consume(w),w===92?x:(t.exit("wikiMarker"),u=!0,t.check({partial:!0,tokenize:L},A,g)(w))}function L(w,F,q){return M;function M(Y){return Y===93?(w.enter("wikiMarkerTemp"),w.consume(Y),w.exit("wikiMarkerTemp"),F(Y)):q(Y)}}function x(w){return w!==124?r(w):(t.consume(w),t.exit("wikiMarker"),u=!0,g)}}}s(ux,"wikiBasic");const ax=s(function(){const e=this.data();e.micromarkExtensions=[...e.micromarkExtensions??[],ux()],e.fromMarkdownExtensions=[...e.fromMarkdownExtensions??[],sx()]},"plugin"),ox={...He};async function lx(e,t){const{allFilePaths:n,basePath:r,cwd:i,obsidianVault:u,resolveUrls:a}=Oe(ox,t??{}),o=Ru().use(jF).use(_B,[{anywhere:!1,marker:"-",type:"yaml"}]).use(ax).use(J6,{singleTilde:!1}).use(ix,{allFilePaths:n,basePath:r,cwd:i,enabled:a,obsidianVault:u}).use(dF).use(tF).use(fB).use(Z_);return o.run(o.parse(e))}s(lx,"getAstFromMarkdown");function cx(e){return e.type==="text"}s(cx,"isText");function hx(e,t){return ae(e,t,(n,r,i)=>{if(i&&r!==void 0)return i.children.splice(r,1),Pe}),e}s(hx,"deleteFirstNodeOfType");function Ro(e){const t=e.at(0);t?.type==="text"&&(t.value=t.value.trimStart(),t.value===""&&e.shift());const n=e.at(-1);return n?.type==="text"&&(n.value=n.value.trimEnd(),n.value===""&&e.pop()),e}s(Ro,"trimLeadingAndTrailingSpaces");function fx(e){let t=1;return ae(e,"delete",(n,r,i)=>{if(i===void 0||r===void 0||!("children"in n)||n.children.length===0)return Ve;if(n.children.length>0&&cx(n.children[0])){const o=/^[(|]?(\d{1,2})(?:[\s).|]|$)(.*)$/.exec(n.children[0].value);if(o!==null&&(n.children.length>1||(o.at(2)??"").length>0)){const l=Number.parseInt(o.at(1)??"",10);Number.isNaN(l)||(t=l,n.children[0].value=(o.at(2)?.trim().length??0)>0?o.at(2)??"":"")}}const u=n.children.at(-1),a=n.children.length>1&&u?.type==="emphasis"?[ie("text",`{{c${t}::`),...Ro(n.children.slice(0,-1)),ie("text","::"),...Ro(n.children.slice(-1)),ie("text","}}")]:[ie("text",`{{c${t}::`),...Ro(n.children),ie("text","}}")];i.children.splice(r,1,...a),t+=1}),e}s(fx,"replaceDeleteNodesWithClozeMarkup");function Po(e){let t,n=!1;if(ae(e,"thematicBreak",(u,a,o)=>a===void 0||o===void 0?Ve:(t=a,o.children[a+1]?.type==="thematicBreak"&&(n=!0),Pe)),t===void 0)return[e,void 0];const r={children:e.children.slice(0,t),type:"root"},i={children:e.children.slice(t+(n?2:1)),type:"root"};return[r,i]}s(Po,"splitTreeAtThematicBreak");function dx(e){let t;if(ae(e,r=>{if(r.type==="thematicBreak")return t=void 0,Pe;if(r.type==="delete")return t="Yanki - Cloze",Pe}),t!==void 0)return t;if(!mx(e)&&gx(e))return"Yanki - Basic (type in the answer)";let n;return ae(e,(r,i,u)=>{if(u===null||i===null)return Ve;if(r.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)",Pe}n=r}),t??"Yanki - Basic"}s(dx,"getYankiModelNameFromTree");function px(e){let t;if(ae(e,"yaml",r=>"value"in r?(t=r.value,Pe):Ve),!t)return{};const n=nm(t);if(!n)throw new Error("Could not parse frontmatter");return n}s(px,"getFrontmatterFromTree");function mx(e){let t=!1;return ae(e,"thematicBreak",()=>(t=!0,Pe)),t}s(mx,"hasThematicBreak");function gx(e){let t,n=0;return ae(e,r=>{if(r.type==="text"&&r.value.trim()!=="")t=r,n++;else if(r.type==="emphasis"&&r.children.some(i=>i.type==="text"&&i.value.trim()!==""))return t=r,n++,Ei}),t?.type==="emphasis"&&n>1}s(gx,"isLastVisibleNodeEmphasisWithOthers");function Ex(e){let t,n,r;if(ae(e,"emphasis",(i,u,a)=>{if(a===void 0||u===void 0||i.type!=="emphasis")return Ve;t=i,n=a,r=u}),n&&t&&typeof r=="number")return n.children.splice(r,1),t}s(Ex,"removeLastEmphasis");const sm={namespaceValidationAndSanitization:!0,...He};async function um(e,t){const{allFilePaths:n,basePath:r,cwd:i,fetchAdapter:u=br(),fileAdapter:a=await Bn(),namespace:o,namespaceValidationAndSanitization:l,obsidianVault:c,resolveUrls:f,strictLineBreaks:h,syncMediaAssets:m}=Oe(sm,t??{}),p=l?Qt(o):o;let g=await lx(e,{allFilePaths:n,basePath:r,cwd:i,obsidianVault:c,resolveUrls:f});const E=dx(g),A=px(g);g=hx(g,"yaml");let D="",C="",T;switch(E){case"Yanki - Basic":case"Yanki - Basic (and reversed card with extra)":{let[v,_]=Po(g),L;if(_!==void 0&&E==="Yanki - Basic (and reversed card with extra)"){T="";const[x,w]=Po(_);_=x,L=w}D=await Jt(v,{cssClassNames:[Kt,`namespace-${p}`,"front",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!0}),C=await Jt(_,{cssClassNames:[Kt,`namespace-${p}`,"back",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!0}),L!==void 0&&(T=await Jt(L,{cssClassNames:[Kt,`namespace-${p}`,"extra",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!1}));break}case"Yanki - Basic (type in the answer)":{const v=Ex(g);if(v===void 0)throw new Error("Could not find emphasis in Basic (type in the answer) note AST.");const _=g,L=ie("root",ie("paragraph",v.children));D=await Jt(_,{cssClassNames:[Kt,`namespace-${p}`,"front",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!0}),C=await Jt(L,{cssClassNames:[Kt,`namespace-${p}`,"back",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!1});break}case"Yanki - Cloze":{const[v,_]=Po(g);D=await Jt(fx(v),{cssClassNames:[Kt,`namespace-${p}`,"front",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!0}),C=await Jt(_,{cssClassNames:[Kt,`namespace-${p}`,"back",`model-${E}`],fetchAdapter:u,fileAdapter:a,namespace:p,strictLineBreaks:h,syncMediaAssets:m,useEmptyPlaceholder:!1});break}}return{deckName:"",fields:{Back:C,...T!==void 0&&{Extra:T},Front:D,YankiNamespace:p},modelName:E,noteId:A.noteId??void 0,tags:Ax(A.tags)}}s(um,"getNoteFromMarkdown");function Ax(e){return(typeof e=="string"?[e]:e??[]).map(t=>t.replaceAll("/","::"))}s(Ax,"obsidianTagsToAnkiTags");const Dx={...He};async function Mo(e,t){const{allFilePaths:n,basePath:r,fetchAdapter:i=br(),fileAdapter:u=await Bn(),namespace:a,obsidianVault:o,strictLineBreaks:l,syncMediaAssets:c}=Oe(Dx,t??{}),f=Qt(a);e.sort((p,g)=>p.localeCompare(g));const h=yx(e);return await Promise.all(e.map(async(p,g)=>{const E=await u.readFile(p),A=await um(E,{allFilePaths:n,basePath:r,cwd:ne.dirname(p),fetchAdapter:i,fileAdapter:u,namespace:f,namespaceValidationAndSanitization:!1,obsidianVault:o,strictLineBreaks:l,syncMediaAssets:c});return A.deckName===""&&(A.deckName=h[g]),{filePath:p,filePathOriginal:p,markdown:E,note:A}}))}s(Mo,"loadLocalNotes");const Cx={mode:"common-root"};function yx(e,t){const{mode:n}=Oe(Cx,{});if(e.length===0)return[];const r=e.map(l=>ne.dirname(l).split(ne.sep)),i=r.reduce((l,c)=>l.filter((h,m)=>h===c[m])),u=r.some(l=>l.at(-1)===i.at(-1)),a=n==="common-parent"||u?1:0;return r.map(l=>l.slice(i.length-a).join("::"))}s(yx,"getDeckNamesFromFilePaths");const Tx={...He};async function am(e,t){const{dryRun:n,fileAdapter:r=await Bn(),manageFilenames:i,maxFilenameLength:u}=Oe(Tx,t??{});if(i!=="off"){const a=[];for(const l of e){const{filePath:c,note:f}=l;if(c===void 0)throw new Error("File path is undefined");const h=V_(f,i,u),m=ne.join(ne.dirname(c),`${h}${ne.extname(c)}`),p=W_(m,a);l.filePath=p,a.push(p.toLowerCase())}for(const l of e){const{filePath:c}=l;if(c===void 0)throw new Error("File path is undefined");l.filePath=K_(c,a)}const o=new Map;for(const l of e){const{filePath:c,filePathOriginal:f}=l;if(f===void 0)throw new Error("Original file path is undefined.");if(c===void 0)throw new Error("File path is undefined.");if(c===f)continue;let h=c;e.some(({filePath:m,filePathOriginal:p})=>m!==c&&p?.toLowerCase()===c.toLowerCase())&&(h=Q_(c),o.set(h,c)),n||await r.rename(f,h)}for(const[l,c]of o)n||await r.rename(l,c)}return e.sort((a,o)=>a.filePath.localeCompare(o.filePath)),e}s(am,"renameNotes");const om={...He};async function bx(e,t){const{allFilePaths:n,basePath:r,dryRun:i,fetchAdapter:u=br(),fileAdapter:a=await Bn(),manageFilenames:o,maxFilenameLength:l,namespace:c,obsidianVault:f,strictLineBreaks:h,syncMediaAssets:m}=Oe(om,t??{}),p=e.map(T=>ut(T)),g=r===void 0?void 0:ut(r),E=n.map(T=>ut(T)),A=Qt(c),D=await Mo(p,{allFilePaths:E,basePath:g,fetchAdapter:u,fileAdapter:a,namespace:A,obsidianVault:f,strictLineBreaks:h,syncMediaAssets:m}),C=await am(D,{dryRun:i,fileAdapter:a,manageFilenames:o,maxFilenameLength:l});return{dryRun:i,notes:C}}s(bx,"renameFiles");const Uo={css:V3,...He},kx={...He};async function Sx(e){const{ankiConnectOptions:t}=Oe(Uo,e??{}),n=new Kn(t);if(await Br(n)==="ankiUnreachable")throw new Error("Anki is unreachable. Is Anki running?");const i=new Set;for(const u of ji){const a=await v_(n,u);i.add(a)}if(i.size===0)throw new Error("No CSS found in any Yanki model.");if(i.size>1)throw new Error("Expected all Yanki models to have identical CSS.");return[...i][0]}s(Sx,"getStyle");async function _x(e){const t=performance.now(),{ankiConnectOptions:n,ankiWeb:r,css:i,dryRun:u}=Oe(Uo,e??{}),a=new Kn(n);if(await Br(a)==="ankiUnreachable")throw new Error("Anki is unreachable. Is Anki running?");const l=[];for(const f of ji){const h=await Gd(a,f,i,u);l.push({action:h?"updated":"unchanged",name:f})}const c=l.some(f=>f.action!=="unchanged");return!u&&r&&(c||zu)&&await $a(a),{ankiWeb:r,dryRun:u,duration:performance.now()-t,models:l}}s(_x,"setStyle");function Bx(e,t=!1){const n=[],r=e.models.filter(u=>u.action==="unchanged"),i=e.models.filter(u=>u.action==="updated");if(n.push(`${e.dryRun?"Will":"Successfully"} update ${i.length} ${fn("model",i.length)} and left ${r.length} ${fn("model",r.length)} unchanged${e.dryRun?"":` in ${Cs(e.duration)}`}.`),t){if(i.length>0){n.push("",e.dryRun?"Models to update:":"Updated models:");for(const u of i)n.push(` ${u.name}`)}if(r.length>0){n.push("",e.dryRun?"Models unchanged:":"Unchanged models:");for(const u of r)n.push(` ${u.name}`)}}return n.join(`
|
|
954
954
|
`)}s(Bx,"formatSetStyleResult");async function wx(e,t){const[n,r]=Fx(e),i=e.split(/\r?\n/);if(n===void 0||r===void 0)return t===void 0?e:["---",rm({noteId:t}).trim(),`---
|
|
955
955
|
`,...i].join(`
|
|
956
956
|
`);const u=i.slice(n+1,r).join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yanki",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.5",
|
|
4
4
|
"description": "A CLI tool and TypeScript library for syncing Markdown to Anki flashcards.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"anki",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"unist-builder": "^4.0.0",
|
|
101
101
|
"unist-util-visit": "^5.0.0",
|
|
102
102
|
"untildify": "^6.0.0",
|
|
103
|
-
"vite": "^7.1.
|
|
103
|
+
"vite": "^7.1.12",
|
|
104
104
|
"vitest": "^3.2.4",
|
|
105
105
|
"yaml": "^2.8.1",
|
|
106
106
|
"yanki-connect": "^3.0.10"
|