From a898aa80e9822f437a4a325082b8a6fc27f60cbc Mon Sep 17 00:00:00 2001 From: Dusk Date: Thu, 30 Apr 2026 21:24:51 +0800 Subject: [PATCH] chore(release): bump version to 1.0.2 - bump package.json/manifest.json to 1.0.2 - add versions.json compatibility entry for 1.0.2 - include latest scope-row inline hint layout adjustments --- main.js | 10 ++++----- manifest.json | 2 +- package.json | 2 +- .../settings/PluginSettingTab.test.ts | 13 +++++++++++ src/presentation/settings/PluginSettingTab.ts | 9 +++++--- styles.css | 22 +++++++++++++++++-- versions.json | 3 ++- 7 files changed, 48 insertions(+), 13 deletions(-) diff --git a/main.js b/main.js index 9976f6f..1ab86f7 100644 --- a/main.js +++ b/main.js @@ -18,13 +18,13 @@ ${n}`}function ye(e,t,n){return En(e)?e.userMessage:e instanceof Error?{rawMessa `,i=t.split(/\r?\n/),a=[...n].sort((o,u)=>u.blockStartLine-o.blockStartLine);for(let o of a)this.applyWrite(i,o);return i.join(r)}applyWrite(t,n){bt(t,{contentEndLine:n.contentEndLine,blockEndLine:n.blockEndLine,markerLine:n.markerLine,markerIndent:n.markerIndent,renderedMarker:yt(n.noteId,n.itemToSlot,n.freeSlots),additionalRemovalLineIndexes:su(t,n.blockStartLine,n.blockEndLine)})}};function yt(e,t,n){qn(t,n);let r=Object.entries(t).sort((a,o)=>a[1]-o[1]||a[0].localeCompare(o[0])).map(([a,o])=>`${a}:${o}`).join(","),i=[...new Set(n)].sort((a,o)=>a-o).join(",");return``}function ou(e){if(!e.trim())return{};let t={},n=new Set;for(let r of e.split(",")){let i=r.trim();if(!i)continue;let[a,o]=i.split(":");if(!a||!o||!au.test(a))throw new U(`Invalid GI item mapping entry: ${r}`);let u=Number(o);if(!Number.isInteger(u)||u<1)throw new U(`Invalid GI slot value: ${o}`);if(t[a]!==void 0||n.has(u))throw new U(`Duplicate GI mapping entry detected: ${r}`);t[a]=u,n.add(u)}return t}function uu(e){if(!e.trim())return[];let t=[],n=new Set;for(let r of e.split(",")){let i=r.trim();if(!i)continue;let a=Number(i);if(!Number.isInteger(a)||a<1)throw new U(`Invalid GI free slot value: ${i}`);if(n.has(a))throw new U(`Duplicate GI free slot detected: ${i}`);n.add(a),t.push(a)}return t.sort((r,i)=>r-i)}function qn(e,t){let n=new Set;for(let r of Object.values(e)){if(!Number.isInteger(r)||r<1)throw new U(`GI item slot must be a positive integer. Received: ${r}`);n.add(r)}for(let r of t){if(!Number.isInteger(r)||r<1)throw new U(`GI free slot must be a positive integer. Received: ${r}`);if(n.has(r))throw new U(`GI free slot ${r} overlaps with an occupied slot.`)}}function su(e,t,n){let r=[];for(let i=t;io.noteId)),new Set(r.map(o=>o.noteId)),this.cardMarkerService,this.groupMarkerService);try{return a.nextContent!==i.content&&await this.vaultGateway.replaceMarkdownFile(t,i.content,a.nextContent),{removedCardMarkers:a.removedCardMarkers,removedGroupMarkers:a.removedGroupMarkers,removedMarkers:a.removedCardMarkers+a.removedGroupMarkers,conflictFiles:[],failureFiles:[]}}catch(o){return o instanceof fe?{...xt(),conflictFiles:[t]}:{...xt(),failureFiles:[pt(t,o)]}}}};function du(e,t,n,r,i){let a=e.includes(`\r `)?`\r `:` -`,o=e.split(/\r?\n/),u=[],s=0,d=0;for(let c=0;c0||r.trackedGroups.length>0}async execute(t){let n=await this.pluginStateRepository.load(),r=vi(n,t);if(r.trackedCards.length===0&&r.trackedGroups.length===0)return lu();let i=r.noteIds;i.length>0&&await this.ankiGateway.deleteNotes(i);let a=await this.markdownMarkerRemovalService.remove(t,r.trackedCards.map(u=>({noteId:u.noteId})),r.trackedGroups.map(u=>({noteId:u.noteId,groupId:u.groupId,blockStartLine:u.blockStartLine}))),o=cu(n,t,r);return await this.pluginStateRepository.save(o),{trackedCards:r.trackedCards.length,trackedGroups:r.trackedGroups.length,deletedNotes:i.length,removedMarkers:a.removedMarkers,removedCardMarkers:a.removedCardMarkers,removedGroupMarkers:a.removedGroupMarkers,deletedLocalRecords:r.trackedCards.length+r.trackedGroups.length,conflictFiles:a.conflictFiles,failureFiles:a.failureFiles}}};function vi(e,t){let n=new Set,r=new Set,i=e.groupBlocks??{};for(let u of e.files[t]?.noteIds??[]){let s=z(u);e.cards[s]&&n.add(s)}for(let u of e.files[t]?.groupIds??[])i[u]&&r.add(u);for(let u of Object.values(e.cards))u.filePath===t&&n.add(z(u.noteId));for(let[u,s]of Object.entries(i))s.filePath===t&&r.add(u);let a=Array.from(n).map(u=>e.cards[u]).filter(u=>!!u),o=Array.from(r).map(u=>i[u]).filter(u=>!!u);return{trackedCards:a,trackedGroups:o,noteIds:Array.from(new Set([...a.map(u=>u.noteId),...o.map(u=>u.noteId)]))}}function cu(e,t,n){let r={...e.cards},i={...e.groupBlocks??{}};for(let o of n.trackedCards)delete r[z(o.noteId)];for(let o of n.trackedGroups)delete i[o.groupId];let a={...e.files};return delete a[t],{files:a,cards:r,groupBlocks:e.groupBlocks?i:void 0,pendingWriteBack:e.pendingWriteBack.filter(o=>o.filePath!==t)}}function lu(){return{trackedCards:0,trackedGroups:0,deletedNotes:0,removedMarkers:0,removedCardMarkers:0,removedGroupMarkers:0,deletedLocalRecords:0,conflictFiles:[],failureFiles:[]}}var Ft=class{constructor(t){this.manualSyncService=t}async execute(t,n){return this.manualSyncService.syncFile(t,n)}};var Mt=class{constructor(t){this.manualSyncService=t}async execute(t){return this.manualSyncService.syncVault(t)}};var Ti=require("obsidian"),wt=class{constructor(t){this.getBaseUrl=t}async ensureDeckExists(t){await this.invoke("createDeck",{deck:t})}async ensureDecks(t){let n=Array.from(new Set(t));await this.invokeMulti(n.map(r=>({action:"createDeck",params:{deck:r}})))}async listNoteModels(){return this.invoke("modelNames",{})}async listDeckNames(){let t=await this.invoke("deckNamesAndIds",{});return Object.keys(t)}async getModelFieldNames(t){return this.invoke("modelFieldNames",{modelName:t})}async getModelFieldNamesByModelNames(t){let n=Array.from(new Set(t.map(i=>i.trim()).filter(i=>i.length>0)));if(n.length===0)return{};let r=await this.invoke("multi",{actions:n.map(i=>({action:"modelFieldNames",params:{modelName:i}}))});return n.reduce((i,a,o)=>{let u=pu(r[o]);return u&&(i[a]=u),i},{})}async findNoteIds(t){return this.invoke("findNotes",{query:t})}async getNoteDetails(t){if(t.length===0)return[];let n=await this.invoke("notesInfo",{notes:t}),r=n.flatMap(a=>Array.isArray(a?.cards)?a.cards:[]),i=new Map;if(r.length>0){let a=await this.invoke("cardsInfo",{cards:r});for(let o of a)!o||typeof o.cardId!="number"||typeof o.deckName!="string"||i.set(o.cardId,o.deckName)}return n.flatMap(a=>{if(!a||typeof a.noteId!="number"||typeof a.modelName!="string")return[];let o=Array.isArray(a.cards)?a.cards:[],u=Object.fromEntries(Object.entries(a.fields??{}).map(([s,d])=>[s,d?.value??""]));return[{noteId:a.noteId,modelName:a.modelName,cardIds:o,deckNames:Array.from(new Set(o.map(s=>i.get(s)).filter(s=>typeof s=="string"))),tags:Array.isArray(a.tags)?a.tags.filter(s=>typeof s=="string"):[],fields:u}]})}async getModelDetails(t){return{fieldNames:await this.getModelFieldNames(t)}}async getDeckStats(t){if(t.length===0)return[];let n=await this.invoke("deckNamesAndIds",{}),r=await this.invoke("getDeckStats",{decks:t});return t.map(i=>({deckName:i,noteCount:fu(r,n[i])}))}async getNoteSummaries(t){return(await this.getNoteDetails(t)).map(n=>({noteId:n.noteId,modelName:n.modelName,cardIds:n.cardIds,deckNames:n.deckNames,tags:n.tags}))}async addNote(t){return this.invoke("addNote",{note:{deckName:t.deckName,modelName:t.modelName,fields:t.fields,options:{allowDuplicate:!1,duplicateScope:"deck"},tags:t.tags}})}async addNotes(t){return this.invokeMulti(t.map(n=>({action:"addNote",params:{note:{deckName:n.deckName,modelName:n.modelName,fields:n.fields,options:{allowDuplicate:!1,duplicateScope:"deck"},tags:n.tags}}})))}async deleteNotes(t){t.length!==0&&await this.invoke("deleteNotes",{notes:t})}async updateNote(t){if(await this.invoke("updateNoteFields",{note:{id:t.noteId,fields:t.fields}}),!t.deckName)return;let r=(await this.invoke("notesInfo",{notes:[t.noteId]}))[0]?.cards??[];r.length>0&&await this.invoke("changeDeck",{cards:r,deck:t.deckName})}async updateNoteModel(t){try{await this.invoke("updateNoteModel",{note:{id:t.noteId,modelName:t.modelName,fields:t.fields}})}catch(n){throw new Error(gu("updateNoteModel",{noteId:t.noteId,modelName:t.modelName},n))}}async updateNotes(t){await this.invokeMulti(t.map(n=>({action:"updateNoteFields",params:{note:{id:n.noteId,fields:n.fields}}})))}async syncNoteTags(t){let n=[];for(let r of t)r.removeTags.length>0&&n.push({action:"removeTags",params:{notes:[r.noteId],tags:r.removeTags.join(" ")}}),r.addTags.length>0&&n.push({action:"addTags",params:{notes:[r.noteId],tags:r.addTags.join(" ")}});await this.invokeMulti(n)}async changeDecks(t){await this.invokeMulti(t.filter(n=>n.cardIds.length>0).map(n=>({action:"changeDeck",params:{cards:n.cardIds,deck:n.deckName}})))}async deleteDecks(t){let n=Array.from(new Set(t));n.length!==0&&await this.invoke("deleteDecks",{decks:n,cardsToo:!0})}async storeMedia(t){await this.invoke("storeMediaFile",{filename:t.fileName,path:t.absolutePath})}async storeMediaFiles(t){await this.invokeMulti(t.map(n=>({action:"storeMediaFile",params:{filename:n.fileName,path:n.absolutePath}})))}async invoke(t,n){let i=(await(0,Ti.requestUrl)({url:this.getBaseUrl(),method:"POST",contentType:"application/json",body:JSON.stringify({action:t,version:6,params:n})})).json;if(i.error)throw new Error(i.error);return i.result}async invokeMulti(t){return t.length===0?[]:this.invoke("multi",{actions:t})}};function pu(e){if(Array.isArray(e))return e.filter(n=>typeof n=="string");if(!e||typeof e!="object"||Array.isArray(e))return;let t=e;if(!t.error&&Array.isArray(t.result))return t.result.filter(n=>typeof n=="string")}function fu(e,t){if(!e||typeof e!="object"||typeof t!="number")return;let n=e[String(t)];if(!n||typeof n!="object")return;let i=n.total_in_deck;if(typeof i=="number"&&Number.isFinite(i))return i}function gu(e,t,n){let r=typeof t.noteId=="number"&&typeof t.modelName=="string"?` for note ${t.noteId} to model ${t.modelName}`:typeof t.noteId=="number"?` for note ${t.noteId}`:"";return`AnkiConnect ${e} failed${r}: ${mu(n)}`}function mu(e){return e instanceof Error&&e.message.trim().length>0?e.message.trim():String(e)}var vt=class{constructor(t){this.plugin=t}async load(){let t=await this.plugin.loadData();return t!==null&&typeof t=="object"?t:null}async save(t){await this.plugin.saveData(t)}};var ie=require("obsidian");function Q(e){let t=2166136261;for(let n=0;n>>0).toString(16).padStart(8,"0")}function Tt(e){if(!e)return[];let t=[],n=new Set;for(let r of e){if(typeof r!="string")continue;let a=(r.startsWith("#")?r.slice(1):r).split("/").map(u=>u.trim()).filter(u=>u.length>0);if(a.length===0)continue;let o=a.join("::");n.has(o)||(n.add(o),t.push(o))}return t}var hu=new Set(["png","jpg","jpeg","gif","bmp","svg","webp","tiff"]),ku=new Set(["wav","m4a","flac","mp3","wma","aac","webm","ogg"]),At=class{constructor(t){this.app=t}listFolderTree(){return Promise.resolve(this.app.vault.getRoot().children.filter(t=>t instanceof ie.TFolder).map(t=>this.toFolderTreeNode(t)))}listMarkdownFileRefs(){return Promise.resolve(this.app.vault.getMarkdownFiles().map(t=>({path:t.path,basename:t.basename,mtime:t.stat.mtime,size:t.stat.size})))}async listMarkdownFiles(){let t=this.app.vault.getMarkdownFiles();return Promise.all(t.map(n=>this.toSourceFile(n)))}async getMarkdownFile(t){let n=this.app.vault.getAbstractFileByPath(t);return!(n instanceof ie.TFile)||n.extension.toLowerCase()!=="md"?null:this.toSourceFile(n)}async readMarkdownFile(t){return this.getMarkdownFile(t)}async replaceMarkdownFile(t,n,r){let i=this.app.vault.getAbstractFileByPath(t);if(!(i instanceof ie.TFile)||i.extension.toLowerCase()!=="md")throw new kt(t);await this.app.vault.process(i,a=>{if(a!==n)throw new fe(t);return r})}resolveWikiLink(t,n){let{alias:r,linkPath:i}=Di(t),o=this.app.metadataCache.getFirstLinkpathDest(Dt(i),n)?.path??Dt(i),u=r||bu(i);return{url:this.createObsidianUrl(i.includes("#")?`${o}${i.slice(i.indexOf("#"))}`:o),displayText:u}}resolveEmbed(t,n){let{alias:r,linkPath:i}=Di(t),a=this.app.metadataCache.getFirstLinkpathDest(Dt(i),n);if(!(a instanceof ie.TFile))return null;let o=a.extension.toLowerCase(),u=hu.has(o)?"image":ku.has(o)?"audio":null;if(!u)return null;let s=yu(this.app,a.path),d=`${Q(a.path)}-${a.name}`;return{kind:u,fileName:d,absolutePath:s,altText:r||a.name}}createBacklink(t){return this.createObsidianUrl(`${t.filePath}#${xu(t.headingText)}`)}async toSourceFile(t){let n=this.app.metadataCache.getFileCache(t);return{path:t.path,basename:t.basename,content:await this.app.vault.cachedRead(t),tags:Cu(n)}}createObsidianUrl(t){return`obsidian://open?vault=${encodeURIComponent(this.app.vault.getName())}&file=${encodeURIComponent(t)}`}toFolderTreeNode(t){return{path:t.path,name:t.name,children:t.children.filter(n=>n instanceof ie.TFolder).map(n=>this.toFolderTreeNode(n))}}};function Di(e){let[t,n]=e.split("|",2).map(r=>r.trim());return{linkPath:t,alias:n||void 0}}function Dt(e){return e.split("#",1)[0]}function bu(e){let t=Dt(e);return(t.split("/").pop()??t).replace(/\.[^.]+$/,"")||e}function yu(e,t){let n=e.vault.adapter;if(!n.getFullPath)throw new Error("The active vault adapter does not expose an absolute filesystem path.");return n.getFullPath(t)}function xu(e){return e.replace(/(?:\s+#\S+)+$/g,t=>t.replace(/(^|\s)#(\S+)/g,"$1$2"))}function Cu(e){return e?Tt((0,ie.getAllTags)(e)):[]}var Et=class{constructor(t){this.pluginDataStore=t}async load(){let t=await this.pluginDataStore.load()??{},n=hi(t.settings);return pe(n),n}async save(t){let n=Ce(t);pe(n);let r=await this.pluginDataStore.load()??{};await this.pluginDataStore.save({...r,settings:n})}};function Se(e,t){if(e==="cloze")return t==="all"?"all":"sequential"}function _t(e,t,n){return`${e}\0${t}\0${n}`}var Lt=class{constructor(t){this.pluginDataStore=t}async load(){let t=await this.pluginDataStore.load()??{};return Su(t.pluginState)}async save(t){let n=await this.pluginDataStore.load()??{};await this.pluginDataStore.save({...n,pluginState:t})}};function Su(e){if(!e)return wi();let t=_u(e.cards),n=Lu(e.files),r=Iu(e.groupBlocks),i={};for(let u of Object.values(t)){let s=Xe(u.noteId);if(s===void 0)continue;let d=Fu(u,s);if(!d)continue;let c=z(s),l=i[c];(!l||l.lastSyncedAt<=d.lastSyncedAt)&&(i[c]=d)}let a={};for(let[u,s]of Object.entries(n))a[u]={filePath:u,fileHash:typeof s.fileHash=="string"?s.fileHash:"",fileStamp:typeof s.fileStamp=="string"?s.fileStamp:"",deckRulesFingerprint:typeof s.deckRulesFingerprint=="string"?s.deckRulesFingerprint:void 0,lastIndexedAt:typeof s.lastIndexedAt=="number"?s.lastIndexedAt:0,noteIds:Tu(s,t,i),groupIds:Eu(s,r)};let o={};for(let[u,s]of Object.entries(r)){let d=vu(s,u);if(!d)continue;let c=o[u];(!c||c.lastSyncedAt<=d.lastSyncedAt)&&(o[u]=d)}return{files:a,cards:i,groupBlocks:o,pendingWriteBack:Du(e.pendingWriteBack)}}function Fu(e,t){let n=Mu(e.cardType);return n?{noteId:t,filePath:typeof e.filePath=="string"?e.filePath:"",heading:typeof e.heading=="string"?e.heading:"",backlinkHeadingText:typeof e.backlinkHeadingText=="string"?e.backlinkHeadingText:typeof e.heading=="string"?e.heading:"",headingLevel:typeof e.headingLevel=="number"?e.headingLevel:1,bodyMarkdown:typeof e.bodyMarkdown=="string"?e.bodyMarkdown:"",cardType:n,clozeMode:Se(n,wu(e.clozeMode)),blockStartOffset:typeof e.blockStartOffset=="number"?e.blockStartOffset:0,blockEndOffset:typeof e.blockEndOffset=="number"?e.blockEndOffset:0,blockStartLine:typeof e.blockStartLine=="number"?e.blockStartLine:1,bodyStartLine:typeof e.bodyStartLine=="number"?e.bodyStartLine:1,blockEndLine:typeof e.blockEndLine=="number"?e.blockEndLine:1,contentEndLine:typeof e.contentEndLine=="number"?e.contentEndLine:1,markerLine:typeof e.markerLine=="number"?e.markerLine:void 0,rawBlockText:typeof e.rawBlockText=="string"?e.rawBlockText:"",rawBlockHash:typeof e.rawBlockHash=="string"?e.rawBlockHash:"",renderConfigHash:typeof e.renderConfigHash=="string"?e.renderConfigHash:"",deck:typeof e.deck=="string"?e.deck:"",deckHint:typeof e.deckHint=="string"?e.deckHint:void 0,deckHintSource:e.deckHintSource==="frontmatter"||e.deckHintSource==="body"?e.deckHintSource:void 0,deckWarnings:Array.isArray(e.deckWarnings)?[...e.deckWarnings]:[],tagsHint:Array.isArray(e.tagsHint)?e.tagsHint.filter(r=>typeof r=="string"):[],lastSyncedAt:typeof e.lastSyncedAt=="number"?e.lastSyncedAt:0,orphan:!!e.orphan}:null}function Mu(e){if(e==="basic"||e==="cloze")return e}function wu(e){if(e==="sequential"||e==="all")return e}function vu(e,t){let n=Xe(e.noteId);return n===void 0||!t.trim()?null:{groupId:t,noteId:n,filePath:typeof e.filePath=="string"?e.filePath:"",headingText:typeof e.headingText=="string"?e.headingText:"",backlinkHeadingText:typeof e.backlinkHeadingText=="string"?e.backlinkHeadingText:typeof e.headingText=="string"?e.headingText:"",headingLevel:typeof e.headingLevel=="number"?e.headingLevel:1,stem:typeof e.stem=="string"?e.stem:"",src:typeof e.src=="string"?e.src:"",blockStartOffset:typeof e.blockStartOffset=="number"?e.blockStartOffset:0,blockEndOffset:typeof e.blockEndOffset=="number"?e.blockEndOffset:0,blockStartLine:typeof e.blockStartLine=="number"?e.blockStartLine:1,bodyStartLine:typeof e.bodyStartLine=="number"?e.bodyStartLine:1,blockEndLine:typeof e.blockEndLine=="number"?e.blockEndLine:1,contentEndLine:typeof e.contentEndLine=="number"?e.contentEndLine:1,markerLine:typeof e.markerLine=="number"?e.markerLine:void 0,markerIndent:typeof e.markerIndent=="string"?e.markerIndent:void 0,rawBlockText:typeof e.rawBlockText=="string"?e.rawBlockText:"",rawBlockHash:typeof e.rawBlockHash=="string"?e.rawBlockHash:"",deck:typeof e.deck=="string"?e.deck:"",deckHint:typeof e.deckHint=="string"?e.deckHint:void 0,deckHintSource:e.deckHintSource==="frontmatter"||e.deckHintSource==="body"?e.deckHintSource:void 0,deckWarnings:Array.isArray(e.deckWarnings)?[...e.deckWarnings]:[],tagsHint:Array.isArray(e.tagsHint)?e.tagsHint.filter(r=>typeof r=="string"):[],items:Array.isArray(e.items)?e.items.flatMap(r=>{if(!r||typeof r!="object")return[];let i=r;return typeof i.title!="string"||typeof i.answer!="string"||typeof i.ordinalInMarkdown!="number"?[]:[{itemId:typeof i.itemId=="string"?i.itemId:void 0,title:i.title,answer:i.answer,slot:typeof i.slot=="number"?i.slot:void 0,ordinalInMarkdown:i.ordinalInMarkdown}]}):[],freeSlots:Array.isArray(e.freeSlots)?e.freeSlots.filter(r=>typeof r=="number"&&Number.isInteger(r)&&r>0):[],lastSyncedAt:typeof e.lastSyncedAt=="number"?e.lastSyncedAt:0,orphan:!!e.orphan}}function Tu(e,t,n){let r=new Set;if(Array.isArray(e.noteIds))for(let i of e.noteIds){let a=Xe(i);a!==void 0&&n[z(a)]&&r.add(a)}if(Array.isArray(e.cardIds))for(let i of e.cardIds){let a=Xe(t[i]?.noteId);a!==void 0&&n[z(a)]&&r.add(a)}return Array.from(r)}function Du(e){return Array.isArray(e)?e.flatMap(t=>{let n=Au(t);return n?[n]:[]}):[]}function Au(e){let t=Ye(e.filePath),n=Nu(e.blockStartLine),r=Ye(e.expectedFileHash),i=Ye(e.targetMarker),a=Ye(e.rawBlockHash),o=Xe(e.targetNoteId);if(!t||!n||!r||!i||!a||!o)return null;let u=Pu(e.markerKind);if(e.markerKind!==void 0&&!u)return null;let s=e.targetGroupId===void 0?void 0:Ye(e.targetGroupId);return e.targetGroupId!==void 0&&!s?null:{filePath:t,blockStartLine:n,expectedFileHash:r,targetMarker:i,rawBlockHash:a,targetNoteId:o,markerKind:u,targetGroupId:s}}function Eu(e,t){return Array.isArray(e.groupIds)?e.groupIds.filter(n=>typeof n=="string"&&!!t[n]):[]}function _u(e){let t={},n=e??{};for(let r in n){let i=n[r];t[r]=i}return t}function Lu(e){let t={},n=e??{};for(let r in n){let i=n[r];t[r]=i}return t}function Iu(e){let t={},n=e??{};for(let r in n){let i=n[r];t[r]=i}return t}function Xe(e){return typeof e=="number"&&Number.isInteger(e)&&e>0?e:void 0}function Nu(e){return typeof e=="number"&&Number.isInteger(e)&&e>0?e:void 0}function Ye(e){return typeof e=="string"&&e.trim().length>0?e:void 0}function Pu(e){return e==="card-id"||e==="group-gi"?e:void 0}function Ai(e){e.addCommand({id:"sync-current-file-to-anki",name:g("commands.syncCurrentFileToAnki"),callback:()=>{e.runSyncCurrentFile()}}),e.addCommand({id:"sync-vault-to-anki",name:g("commands.syncVaultToAnki"),callback:()=>{e.runSyncVault()}}),e.addCommand({id:"clear-current-file-synced-cards",name:g("commands.clearCurrentFileSyncedCards"),callback:()=>{e.runClearCurrentFileSyncedCards()}}),e.addCommand({id:"cleanup-empty-decks",name:g("commands.cleanupEmptyDecks"),callback:()=>{e.runCleanupEmptyDecks()}})}var Je=require("obsidian");var It=class extends Je.Modal{constructor(n,r){super(n);this.candidateDeckNames=r;this.deckToggles=new Map;this.selectedDeckNames=new Set;this.resolvedValue=null}openAndGetSelection(){return new Promise(n=>{this.resolver=n,this.open()})}onOpen(){let{contentEl:n}=this;n.empty(),n.createEl("h2",{text:g("modal.emptyDeck.title")}),n.createEl("p",{text:g("modal.emptyDeck.description")});for(let i of this.candidateDeckNames)new Je.Setting(n).setName(i).addToggle(a=>{this.deckToggles.set(i,a),a.setValue(!1).onChange(o=>{o?this.selectedDeckNames.add(i):this.selectedDeckNames.delete(i),this.refreshSelectionState()})});let r=new Je.Setting(n).addButton(i=>{i.setButtonText(g("modal.emptyDeck.selectAll")).onClick(()=>{this.selectAllDecks()})}).addButton(i=>{i.setButtonText(g("modal.emptyDeck.clearAll")).onClick(()=>{this.clearSelectedDecks()})}).addButton(i=>{i.setButtonText(g("modal.emptyDeck.invert")).onClick(()=>{this.invertSelectedDecks()})}).addButton(i=>{i.setButtonText(g("modal.emptyDeck.cancel")).onClick(()=>{this.finish(null)})}).addButton(i=>{this.deleteButton=i,i.setButtonText(g("modal.emptyDeck.deleteSelected")).setCta().onClick(()=>{this.finish(Array.from(this.selectedDeckNames))})});this.selectionCountEl=r.settingEl.createSpan({text:this.getSelectionCountText()}),this.selectionCountEl.addClass("anki-helper-empty-deck-selection-count"),this.refreshSelectionState()}onClose(){let n=this.resolver,r=this.resolvedValue;this.contentEl.empty(),this.deckToggles.clear(),this.deleteButton=void 0,this.selectionCountEl=void 0,this.resolver=void 0,this.resolvedValue=null,this.selectedDeckNames.clear(),n?.(r)}finish(n){this.resolvedValue=n,this.close()}selectAllDecks(){this.selectedDeckNames.clear();for(let n of this.candidateDeckNames)this.selectedDeckNames.add(n),this.deckToggles.get(n)?.setValue(!0);this.refreshSelectionState()}clearSelectedDecks(){this.selectedDeckNames.clear();for(let n of this.candidateDeckNames)this.deckToggles.get(n)?.setValue(!1);this.refreshSelectionState()}invertSelectedDecks(){let n=new Set;for(let r of this.candidateDeckNames){let i=!this.selectedDeckNames.has(r);this.deckToggles.get(r)?.setValue(i),i&&n.add(r)}this.selectedDeckNames.clear();for(let r of n)this.selectedDeckNames.add(r);this.refreshSelectionState()}refreshSelectionState(){this.deleteButton?.setDisabled(this.selectedDeckNames.size===0),this.selectionCountEl&&(this.selectionCountEl.textContent=this.getSelectionCountText())}getSelectionCountText(){return g("modal.emptyDeck.selectionCount",{selected:this.selectedDeckNames.size,total:this.candidateDeckNames.length})}};var zn=require("obsidian");var Nt=class{info(t){new zn.Notice(t,5e3)}error(t){new zn.Notice(t,8e3)}showSyncSummary(t,n){let r=se(),o=[g(t==="currentFile"?"notice.summary.currentFileSync":"notice.summary.vaultSync",{scannedFiles:n.scannedFiles,scannedCards:n.scannedCards,created:n.created,rebuilt:n.rebuilt,updated:n.updated,migratedNoteTypes:n.migratedNoteTypes,migratedDecks:n.migratedDecks,orphaned:n.orphaned,uploadedMedia:n.uploadedMedia,skippedUnchangedCards:n.skippedUnchangedCards})];n.markerWriteConflictFiles.length>0&&o.push(g("notice.summary.markerWriteConflicts",{files:de(r,n.markerWriteConflictFiles)})),n.warnings.length>0&&o.push(g("notice.summary.warningsCount",{count:n.warnings.length})),this.info(o.join(" "));for(let u of n.warnings.slice(0,3))this.info(this.renderDeckWarning(u))}showClearCurrentFileSummary(t){let n=se(),r=[g("notice.summary.clearCurrentFile",{trackedCards:t.trackedCards,trackedGroups:t.trackedGroups,deletedNotes:t.deletedNotes,removedMarkers:t.removedMarkers,removedCardMarkers:t.removedCardMarkers,removedGroupMarkers:t.removedGroupMarkers,deletedLocalRecords:t.deletedLocalRecords})];t.conflictFiles.length>0&&r.push(g("notice.summary.markerRemovalConflicts",{files:de(n,t.conflictFiles)})),t.failureFiles.length>0&&r.push(g("notice.summary.failures",{items:oi(t.failureFiles)})),this.info(r.join(" "))}showCleanupEmptyDecksSummary(t){let n=se(),r=[g("notice.summary.cleanupEmptyDecks",{candidateCount:t.candidateCount,selectedCount:t.selectedCount,deletedCount:t.deletedCount,skippedCount:t.skippedDeckNames.length})];t.skippedDeckNames.length>0&&r.push(g("notice.summary.skippedDecks",{decks:de(n,t.skippedDeckNames)})),this.info(r.join(" "))}renderDeckWarning(t){return g(Ru(t.code),t.params)}};function Ru(e){switch(e){case"deck_conflict_yaml_body":return"warnings.deck.conflictYamlBody";case"deck_multiple_body_declarations":return"warnings.deck.multipleBodyDeclarations";case"deck_invalid_folder_segment":return"warnings.deck.invalidFolderSegment";case"deck_fallback_default":return"warnings.deck.fallbackDefault"}}var G=require("obsidian");function Ei(e){return e==="cloze"}function _i(e){return e==="basic"}var Ne=class{map(t,n,r){return this.mapRenderedCard(t,n,r)}mapRenderedCard(t,n,r){let i=this.getRequiredMapping(t,r);return this.validateMapping(i,n),_i(t.type)?this.mapBasic(t,i):this.mapCloze(t,i)}suggest(t,n,r,i=Date.now()){if(t==="qa-group")throw new Error("QaGroupFieldMappingService must be used for qa-group mappings.");return Bu(t)?{cardType:t,modelName:n,loadedFieldNames:[...r],titleField:Pt(r,["Front","Title"])??r[0],bodyField:Pt(r,["Back","Body","Answer"])??r.find(a=>a!==(Pt(r,["Front","Title"])??r[0])),loadedAt:i}:{cardType:t,modelName:n,loadedFieldNames:[...r],mainField:Pt(r,["Text","Body","Content"])??r[0],loadedAt:i}}validateMapping(t,n){if(!Dn(t)&&!ti(t))throw new Error("QaGroupFieldMappingService validates qa-group mappings.");let r=new Set(n.fieldNames);if(Dn(t)){if(!t.titleField||!t.bodyField)throw new S(Li(t.cardType),{modelName:t.modelName});if(t.titleField===t.bodyField)throw new S(qu(),{modelName:t.modelName});let i=[t.titleField,t.bodyField].filter(a=>!r.has(a));if(i.length>0)throw new S("errors.noteFieldMapping.stale",{modelName:t.modelName,fields:i.map(a=>`"${a}"`)});return}if(!t.mainField)throw new S("errors.noteFieldMapping.incompleteSavedMapping.cloze",{modelName:t.modelName});if(!r.has(t.mainField))throw new S("errors.noteFieldMapping.stale",{modelName:t.modelName,fields:[`"${t.mainField}"`]})}mapBasic(t,n){let r=n.titleField,i=n.bodyField;if(!r||!i)throw new S(Li(t.type),{modelName:t.noteModel});return{[r]:t.renderedFields.title,[i]:t.renderedFields.body}}mapCloze(t,n){if(!n.mainField)throw new S("errors.noteFieldMapping.incompleteSavedMapping.cloze",{modelName:t.noteModel});return{[n.mainField]:`${t.renderedFields.title}

${t.renderedFields.body}`}}getRequiredMapping(t,n){let r=n[B(t.type,t.noteModel)];if(!r)throw new S(Gu(t.type),{modelName:t.noteModel});return r}};function Bu(e){return e==="basic"}function Gu(e){return e==="cloze"?"errors.noteFieldMapping.missingSavedMapping.cloze":"errors.noteFieldMapping.missingSavedMapping.basic"}function Li(e){return e==="cloze"?"errors.noteFieldMapping.incompleteSavedMapping.cloze":"errors.noteFieldMapping.incompleteSavedMapping.basic"}function qu(){return"errors.noteFieldMapping.titleBodyMustDiffer.basic"}function Pt(e,t){return e.find(n=>t.some(r=>r.toLowerCase()===n.toLowerCase()))}function Pi(e,t){let n=new Set(Hn(t));return e.map(r=>Bi(r,n,!1))}function Ri(e,t,n,r){let i=zu(e),a=new Set(Hn(t).filter(u=>i.nodeByPath.has(u)));if(!i.nodeByPath.has(n))return Rt(e,Array.from(a));if(r)return Ii(n,a,i.parentByPath)||(Ni(a,n),a.add(n)),Rt(e,Array.from(a));let o=Ii(n,a,i.parentByPath);if(o&&(a.delete(o),o!==n)){let u=i.nodeByPath.get(o);if(u)for(let s of qi(u,n))a.add(s)}return Ni(a,n),Rt(e,Array.from(a))}function Rt(e,t){let n=new Set(Hn(t));return e.flatMap(r=>Gi(r,n).paths)}function Bi(e,t,n){let r=n||t.has(e.path),i=e.children.map(o=>Bi(o,t,r));if(r)return{...e,checked:!0,indeterminate:!1,children:i};let a=i.some(o=>o.checked||o.indeterminate);return{...e,checked:!1,indeterminate:a,children:i}}function Gi(e,t){return t.has(e.path)?{paths:[e.path]}:e.children.length===0?{paths:[]}:{paths:e.children.map(r=>Gi(r,t)).flatMap(r=>r.paths)}}function zu(e){let t=new Map,n=new Map,r=(i,a)=>{t.set(i.path,i),n.set(i.path,a);for(let o of i.children)r(o,i.path)};for(let i of e)r(i,void 0);return{nodeByPath:t,parentByPath:n}}function Ii(e,t,n){let r=e;for(;r;){if(t.has(r))return r;r=n.get(r)}}function Ni(e,t){for(let n of Array.from(e))(n===t||zi(n,t))&&e.delete(n)}function qi(e,t){if(e.path===t)return[];let n=e.children.find(i=>i.path===t||zi(t,i.path));if(!n)return[e.path];let r=[];for(let i of e.children){if(i.path===n.path){r.push(...qi(i,t));continue}r.push(i.path)}return r}function Hn(e){return Array.from(new Set(e.map(t=>Hu(t)).filter(Boolean)))}function Hu(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function zi(e,t){return e===t||e.startsWith(`${t}/`)}var Hi={key:"settings.scope.loading"},Ou=500,Oi=["card-types","sync-content","deck","scope","commands"],Bt=["basic","qa-group","cloze","cloze-all"],Wu=8,$u=64,Wi="--ahs-settings-page-header-height",Uu="--ahs-settings-sticky-card-gap",Qu=`${$u}px`,Vu=`${Wu}px`,ju="anki-heading-sync-settings",$i="ahs-is-hidden";function v(e,...t){e.classList.add(...t)}function Ku(e,t,n){if(n){e.classList.add(t);return}e.classList.remove(t)}var Gt=class extends G.PluginSettingTab{constructor(n){super(n.app,n);this.noteFieldMappingService=new Ne;this.qaGroupFieldMappingService=new ce;this.availableNoteModels=[];this.draftMappings={};this.loadedModelDetails={};this.debouncedTextSaves=new Map;this.textDraftValues=new Map;this.cardShells=new Map;this.expandedCardIds=new Set;this.expandedFolderPaths=new Set;this.folderTree=[];this.folderTreeStatus=Hi;this.folderTreeLoadPromise=null;this.hasLoadedFolderTree=!1;this.displayInitialized=!1;this.ankiConfigLoading=!1;this.cardTypeStatusOverride=null;this.noteTypeCacheCheckStatus="idle";this.noteTypeCacheCheckPromise=null;this.detectedAnkiNoteTypeCache=null;this.noteTypeCacheCheckToken=0;this.pageHeaderResizeObserver=null;this.scopeNeedsSelectedAncestorExpansion=!0;this.plugin=n}hide(){this.disconnectPageHeaderResizeObserver(),super.hide(),this.displayInitialized=!1,this.cardShells.clear(),this.flushDebouncedTextSaves(),this.cardTypeStatusOverride=null,this.noteTypeCacheCheckStatus="idle",this.noteTypeCacheCheckPromise=null,this.detectedAnkiNoteTypeCache=null,this.noteTypeCacheCheckToken+=1,this.scopeNeedsSelectedAncestorExpansion=!0}display(){let{containerEl:n}=this,r=n.scrollTop;if(n.classList.add(ju),!this.displayInitialized){n.style.setProperty(Wi,Qu),n.style.setProperty(Uu,Vu),n.empty();let i=n.createDiv();i.dataset.settingsPageHeader="true",v(i,"ahs-settings-page-header");let a=i.createDiv();a.dataset.settingsPageHeaderMask="true",v(a,"ahs-settings-page-header-mask");let o=new G.Setting(i).setName(g("settings.pluginTitle")).setHeading();v(o.settingEl,"ahs-settings-page-title-setting"),v(o.nameEl,"ahs-settings-page-title"),this.observePageHeaderHeight(i);let u=n.createDiv();u.dataset.settingsCardsContainer="true",this.initializeCards(u),this.displayInitialized=!0}for(let i of Oi)this.renderCard(i);n.scrollTop=r}markActionButton(n){n.setCta()}initializeCards(n){this.cardShells.clear();for(let r of Oi){let i=n.createDiv();i.dataset.settingsCard=r;let a=i.createEl("button");a.type="button",a.dataset.settingsCardToggle=r,v(a,"ahs-settings-card-toggle"),a.addEventListener("click",()=>{this.toggleCard(r)});let o=i.createDiv();o.dataset.settingsCardBody=r,v(o,"ahs-settings-card-body",$i),this.cardShells.set(r,{cardEl:i,headerEl:a,bodyEl:o})}}toggleCard(n){this.expandedCardIds.has(n)?this.expandedCardIds.delete(n):this.expandedCardIds.add(n),this.renderCard(n)}renderCard(n){let r=this.cardShells.get(n);if(!r)return;let i=this.expandedCardIds.has(n);if(r.headerEl.textContent=`${i?"\u25BE":"\u25B8"} ${this.getCardTitle(n)}`,r.headerEl.setAttr("aria-expanded",String(i)),Ku(r.bodyEl,$i,!i),r.bodyEl.empty(),!!i){if(n==="card-types"){this.renderCardTypesCard(r.bodyEl);return}if(n==="sync-content"){this.renderSyncContentCard(r.bodyEl);return}if(n==="scope"){this.renderScopeCard(r.bodyEl);return}if(n==="deck"){this.renderDeckCard(r.bodyEl);return}this.renderCommandsCard(r.bodyEl)}}observePageHeaderHeight(n){this.disconnectPageHeaderResizeObserver(),this.updatePageHeaderHeight(n),!(typeof ResizeObserver>"u")&&(this.pageHeaderResizeObserver=new ResizeObserver(()=>{this.updatePageHeaderHeight(n)}),this.pageHeaderResizeObserver.observe(n))}updatePageHeaderHeight(n){let r=n.getBoundingClientRect().height;!Number.isFinite(r)||r<=0||this.containerEl.style.setProperty(Wi,`${Math.round(r)}px`)}disconnectPageHeaderResizeObserver(){this.pageHeaderResizeObserver?.disconnect(),this.pageHeaderResizeObserver=null}renderCardTypesCard(n){this.hydrateVisibleCardTypeCaches(),this.maybeStartNoteTypeCacheCheck();let r=n.createDiv();v(r,"ahs-settings-action-row");let i=new G.ButtonComponent(r).setButtonText(this.ankiConfigLoading?g("settings.cards.cardTypes.loadAnki.loading"):g("settings.cards.cardTypes.loadAnki.button")).setCta().setDisabled(this.ankiConfigLoading).onClick(()=>this.loadAnkiCardTypeConfig());i.buttonEl.dataset.cardTypesRefresh="true",r.createSpan({text:`${g("settings.cards.cardTypes.statusLabel")}${Le(this.getCardTypeStatusMessage())}`});let a=n.createDiv();a.dataset.cardTypeList="true",v(a,"ahs-settings-card-list");for(let o of Bt)this.renderCardTypeBlock(a,o)}renderCardTypeBlock(n,r){let i=this.plugin.settings.cardTypeConfigs[r],a=n.createDiv();a.dataset.cardTypeConfig=r,v(a,"ahs-settings-card-type-block");let o=a.createDiv();v(o,"ahs-settings-card-type-header");let u=o.createEl("input");u.type="checkbox",u.checked=i.enabled,u.dataset.cardTypeEnabled=r,u.addEventListener("change",()=>{this.saveCardTypeConfig(r,{enabled:u.checked})});let s=o.createEl("strong",{text:this.getCardTypeLabel(r)});v(s,"ahs-settings-card-type-title");let d=a.createDiv();v(d,"ahs-settings-recognition-row");let c=this.createInlineControlGroup(d,g("settings.cards.cardTypes.labels.headingLevel")),l=this.createSelect(c,`card-type-heading:${r}`);l.dataset.cardTypeHeading=r,v(l,"ahs-settings-heading-select");for(let b=1;b<=6;b+=1)this.appendOption(l,String(b),`H${b}`);l.value=String(i.headingLevel),l.addEventListener("change",()=>{this.saveCardTypeConfig(r,{headingLevel:Number(l.value)})});let m=this.createInlineControlGroup(d,g("settings.cards.cardTypes.labels.extraMarker")).createEl("input");if(m.type="text",m.dataset.cardTypeMarker=r,m.placeholder=g("settings.cards.cardTypes.markerPlaceholder"),v(m,"ahs-settings-marker-input"),m.value=this.getDraftValue(`card-type-marker:${r}`,i.extraMarker),m.addEventListener("input",()=>{this.scheduleDebouncedTextSave(`card-type-marker:${r}`,m.value,async b=>{await this.saveCardTypeConfig(r,{extraMarker:b})&&this.textDraftValues.delete(`card-type-marker:${r}`)})}),r==="cloze-all"){let b=a.createEl("p",{text:g("settings.cards.cardTypes.sharedClozeMappingHint")});b.dataset.cardTypeSharedHint=r,v(b,"ahs-settings-muted-text");return}let p=a.createDiv();v(p,"ahs-settings-grid-row");let F=this.createGridControlSlot(p,g("settings.cards.cardTypes.labels.noteType")),k=this.createSelect(F,`card-type-note-type:${r}`);k.dataset.cardTypeNoteType=r,this.applyFluidEllipsis(k);for(let b of this.getSelectableNoteModels(i.noteType))this.appendOption(k,b,b);k.value=i.noteType,k.disabled=this.ankiConfigLoading,k.addEventListener("change",()=>{this.saveCardTypeConfig(r,{noteType:k.value})}),this.renderCardTypeFieldControls(p,r)}renderCardTypeFieldControls(n,r){if(r==="qa-group"){this.renderQaGroupFieldControls(n,r);return}let i=this.getCurrentMappingForConfig(r);if(r==="cloze"){let c=this.createGridControlSlot(n,g("settings.cards.cardTypes.labels.mainField")),l=this.createFieldSelect(c,`card-type-question-field:${r}`),f=i&&"mainField"in i?i:void 0;l.dataset.cardTypeQuestionField=r,this.applyFluidEllipsis(l),this.populateFieldSelect(l,f?.loadedFieldNames??[],f?.mainField),l.addEventListener("change",()=>{this.saveFieldMapping(r,{mainField:l.value||void 0})});return}let a=this.createGridControlSlot(n,g("settings.cards.cardTypes.labels.questionField")),o=this.createFieldSelect(a,`card-type-question-field:${r}`),u=i&&"bodyField"in i?i:void 0;o.dataset.cardTypeQuestionField=r,this.applyFluidEllipsis(o),this.populateFieldSelect(o,u?.loadedFieldNames??[],u?.titleField),o.addEventListener("change",()=>{this.saveFieldMapping(r,{titleField:o.value||void 0})});let s=this.createGridControlSlot(n,g("settings.cards.cardTypes.labels.answerField")),d=this.createFieldSelect(s,`card-type-answer-field:${r}`);d.dataset.cardTypeAnswerField=r,this.applyFluidEllipsis(d),this.populateFieldSelect(d,u?.loadedFieldNames??[],u?.bodyField),d.addEventListener("change",()=>{this.saveFieldMapping(r,{bodyField:d.value||void 0})})}renderQaGroupFieldControls(n,r){let i=this.plugin.settings.cardTypeConfigs[r].noteType.trim(),a=this.getQaGroupFieldState(r),o=a.mapping?this.getQaGroupSelectedFields(a.mapping):void 0,u=this.createGridControlSlot(n,g("settings.cards.cardTypes.labels.qaGroupTitleField"));if(a.mapping){let l=this.createFieldSelect(u,`card-type-qa-group-title-field:${r}`);l.dataset.qaGroupTitleField=r,this.applyFluidEllipsis(l),this.populateFieldSelect(l,a.mapping.loadedFieldNames,a.mapping.titleField);let f=n.createDiv();f.dataset.qaGroupPairRow=r,v(f,"ahs-settings-qa-group-pair-row");let m=this.createGridControlSlot(f,g("settings.cards.cardTypes.labels.qaGroupFirstQuestionField")),p=this.createFieldSelect(m,`card-type-qa-group-first-question-field:${r}`);p.dataset.qaGroupFirstQuestionField=r,this.applyFluidEllipsis(p),this.populateFieldSelect(p,a.mapping.loadedFieldNames,o?.firstQuestionField);let F=this.createGridControlSlot(f,g("settings.cards.cardTypes.labels.qaGroupFirstAnswerField")),k=this.createFieldSelect(F,`card-type-qa-group-first-answer-field:${r}`);k.dataset.qaGroupFirstAnswerField=r,this.applyFluidEllipsis(k),this.populateFieldSelect(k,a.mapping.loadedFieldNames,o?.firstAnswerField);let b=()=>{this.saveQaGroupFieldSelection(r,{titleField:l.value||void 0,firstQuestionField:p.value||void 0,firstAnswerField:k.value||void 0})};l.addEventListener("change",b),p.addEventListener("change",b),k.addEventListener("change",b);let x=f.createSpan({text:g("settings.cards.cardTypes.qaGroup.configuredSlots",{count:a.mapping.slots.length})});x.dataset.qaGroupSlotSummary=r,v(x,"ahs-settings-nowrap-start"),this.applyFluidEllipsis(x)}else{u.createSpan({text:i.length>0?g("settings.cards.cardTypes.qaGroup.unavailable"):g("settings.cards.cardTypes.qaGroup.noModel")}).dataset.qaGroupTitleField=r;let l=n.createDiv();l.dataset.qaGroupPairRow=r,v(l,"ahs-settings-qa-group-pair-row");let f=this.createGridControlSlot(l,g("settings.cards.cardTypes.labels.qaGroupFirstQuestionField"));f.createSpan({text:i.length>0?g("settings.cards.cardTypes.qaGroup.unavailable"):g("settings.cards.cardTypes.qaGroup.noModel")}).dataset.qaGroupFirstQuestionField=r;let m=this.createGridControlSlot(l,g("settings.cards.cardTypes.labels.qaGroupFirstAnswerField"));m.createSpan({text:i.length>0?g("settings.cards.cardTypes.qaGroup.unavailable"):g("settings.cards.cardTypes.qaGroup.noModel")}).dataset.qaGroupFirstAnswerField=r;let p=l.createSpan({text:i.length>0?g("settings.cards.cardTypes.qaGroup.unavailable"):g("settings.cards.cardTypes.qaGroup.noModel")});p.dataset.qaGroupSlotSummary=r,v(p,"ahs-settings-nowrap-start"),this.applyFluidEllipsis(p)}if(a.error){let l=n.createDiv({text:Le(a.error)});l.dataset.qaGroupError=r,v(l,"ahs-settings-grid-full");return}if(!a.mapping||a.mapping.warnings.length===0)return;let s=n.createDiv();s.dataset.qaGroupWarnings=r,v(s,"ahs-settings-grid-full","ahs-settings-warnings"),s.createEl("strong",{text:g("settings.cards.cardTypes.labels.qaGroupWarnings")});for(let l of a.mapping.warnings)s.createDiv({text:this.renderQaGroupWarning(l)}).dataset.qaGroupWarning=r;let d=s.createEl("label");v(d,"ahs-settings-inline-check");let c=d.createEl("input");c.type="checkbox",c.checked=Ln(a.mapping.warnings,a.mapping.acceptedWarnings),c.dataset.qaGroupWarningAccept=r,c.addEventListener("change",()=>{this.saveQaGroupWarningAcceptance(r,c.checked)}),d.createSpan({text:g("settings.cards.cardTypes.qaGroup.acceptWarnings")})}renderSyncContentCard(n){let r=this.createSyncContentSection(n,"body-range",g("settings.cards.syncContent.sections.bodyRange"));new G.Setting(r).setName(g("settings.cardAnswerCutoffMode.name")).setDesc(g("settings.cardAnswerCutoffMode.desc")).addDropdown(u=>{u.addOption("heading-block",g("settings.cardAnswerCutoffMode.options.headingBlock")),u.addOption("double-blank-lines",g("settings.cardAnswerCutoffMode.options.doubleBlankLines")),u.setValue(this.plugin.settings.cardAnswerCutoffMode).onChange(s=>{this.plugin.updateSettings({cardAnswerCutoffMode:s})})});let i=this.createSyncContentSection(n,"backlink",g("settings.cards.syncContent.sections.backlink"));new G.Setting(i).setName(g("settings.syncOptions.addObsidianBacklink.name")).setDesc(g("settings.syncOptions.addObsidianBacklink.desc")).addToggle(u=>{u.setValue(this.plugin.settings.addObsidianBacklink).onChange(s=>{this.plugin.updateSettings({addObsidianBacklink:s})})}),new G.Setting(i).setName(g("settings.syncOptions.obsidianBacklinkLabel.name")).setDesc(g("settings.syncOptions.obsidianBacklinkLabel.desc")).addText(u=>{u.setPlaceholder(g("settings.syncOptions.obsidianBacklinkLabel.placeholder")).setValue(this.getDraftValue("obsidian-backlink-label",this.plugin.settings.obsidianBacklinkLabel)).onChange(s=>{this.scheduleDebouncedTextSave("obsidian-backlink-label",s,async d=>{let c=d.trim();await this.plugin.updateSettings({obsidianBacklinkLabel:c||Ke}),this.textDraftValues.delete("obsidian-backlink-label")})})}),new G.Setting(i).setName(g("settings.syncOptions.obsidianBacklinkPlacement.name")).setDesc(g("settings.syncOptions.obsidianBacklinkPlacement.desc")).addDropdown(u=>{u.addOption("question-last-line",g("settings.syncOptions.obsidianBacklinkPlacement.options.questionLastLine")),u.addOption("answer-first-line",g("settings.syncOptions.obsidianBacklinkPlacement.options.answerFirstLine")),u.addOption("answer-last-line",g("settings.syncOptions.obsidianBacklinkPlacement.options.answerLastLine")),u.setValue(this.plugin.settings.obsidianBacklinkPlacement).onChange(s=>{this.plugin.updateSettings({obsidianBacklinkPlacement:s})})});let a=this.createSyncContentSection(n,"tags",g("settings.cards.syncContent.sections.tags"));new G.Setting(a).setName(g("settings.syncOptions.syncObsidianTagsToAnki.name")).setDesc(g("settings.syncOptions.syncObsidianTagsToAnki.desc")).addToggle(u=>{u.setValue(this.plugin.settings.syncObsidianTagsToAnki).onChange(s=>{this.plugin.updateSettings({syncObsidianTagsToAnki:s})})}),new G.Setting(a).setName(g("settings.syncOptions.keepPureTagLinesInCardBody.name")).setDesc(g("settings.syncOptions.keepPureTagLinesInCardBody.desc")).addToggle(u=>{u.setValue(this.plugin.settings.keepPureTagLinesInCardBody).onChange(s=>{this.plugin.updateSettings({keepPureTagLinesInCardBody:s})})});let o=this.createSyncContentSection(n,"cloze-special",g("settings.cards.syncContent.sections.clozeSpecial"));new G.Setting(o).setName(g("settings.syncOptions.highlightsToCloze.name")).setDesc(g("settings.syncOptions.highlightsToCloze.desc")).addToggle(u=>{u.setValue(this.plugin.settings.convertHighlightsToCloze).onChange(s=>{this.plugin.updateSettings({convertHighlightsToCloze:s})})})}createSyncContentSection(n,r,i){let a=n.createDiv();return a.dataset.syncContentSection=r,v(a,"ahs-settings-section"),this.createSectionHeading(a,"syncContentSectionTitle",r,i),a}renderScopeCard(n){if(new G.Setting(n).setName(g("settings.scope.name")).setDesc(Yu(this.plugin.settings.scopeMode)).addDropdown(s=>{s.addOption("all",g("settings.scope.option.all")).addOption("include",g("settings.scope.option.include")).addOption("exclude",g("settings.scope.option.exclude")).setValue(this.plugin.settings.scopeMode).onChange(d=>{d!=="all"&&d!=="include"&&d!=="exclude"||this.updateScopeMode(d)})}),!gt(this.plugin.settings.scopeMode,this.plugin.settings.includeFolders)){let s=n.createEl("p",{text:g("settings.scope.unconfiguredWarning")});s.dataset.scopeWarning="unconfigured",v(s,"ahs-settings-warning-text")}if(this.plugin.settings.scopeMode==="all")return;let r=n.createDiv(),i=new G.ButtonComponent(r).setButtonText(g("settings.cards.scope.refreshFolders")).setCta().setDisabled(!!this.folderTreeLoadPromise).onClick(()=>{this.refreshFolderTree()});if(i.buttonEl.dataset.scopeRefreshFolders="true",this.ensureFolderTreeLoaded(),n.createEl("p",{text:Ju(this.plugin.settings.scopeMode)}),this.folderTreeLoadPromise||this.folderTree.length===0){n.createEl("p",{text:Le(this.folderTreeStatus)});return}this.expandSelectedFolderAncestorsIfNeeded(this.plugin.settings.scopeMode);let a=this.getSelectedFoldersForScopeMode(this.plugin.settings.scopeMode),o=Pi(this.folderTree,a),u=n.createDiv();u.dataset.scopeTree="true",v(u,"ahs-settings-folder-tree");for(let s of o)this.renderFolderNode(u,s,this.plugin.settings.scopeMode,0)}renderDeckCard(n){let r=this.createDeckSection(n,"folder-mapping",g("settings.cards.deck.sections.folderMapping"));new G.Setting(r).setName(g("settings.deck.folderDeckMode.name")).setDesc(g("settings.deck.folderDeckMode.desc")).addDropdown(o=>{this.populateFolderDeckModeDropdown(o,this.plugin.settings.folderDeckMode),o.onChange(u=>{u!=="off"&&u!=="folder"&&u!=="folder-and-file"||this.plugin.updateSettings({folderDeckMode:u})})}),this.renderDeckExampleBlock(r);let i=this.createDeckSection(n,"file-deck",g("settings.cards.deck.sections.fileDeck"));new G.Setting(i).setName(g("settings.deck.fileDeckEnabled.name")).setDesc(g("settings.deck.fileDeckEnabled.desc")).addToggle(o=>{o.setValue(this.plugin.settings.fileDeckEnabled).onChange(async u=>{await this.plugin.updateSettings({fileDeckEnabled:u}),this.renderCard("deck")})}),this.plugin.settings.fileDeckEnabled&&(new G.Setting(i).setName(g("settings.deck.marker.name")).setDesc(g("settings.deck.marker.desc")).addText(o=>{o.setValue(this.getDraftValue("file-deck-marker",this.plugin.settings.fileDeckMarker)).onChange(u=>{this.scheduleDebouncedTextSave("file-deck-marker",u,async s=>{let d=s.trim();if(!d){this.textDraftValues.delete("file-deck-marker"),this.renderCard("deck");return}await this.plugin.updateSettings({fileDeckMarker:d}),this.textDraftValues.delete("file-deck-marker")})})}),new G.Setting(i).setName(g("settings.deck.template.name")).setDesc(g("settings.deck.template.desc")).addText(o=>{o.setValue(this.getDraftValue("file-deck-template",this.plugin.settings.fileDeckTemplate)).onChange(u=>{this.scheduleDebouncedTextSave("file-deck-template",u,async s=>{let d=s.trim();if(!d){this.textDraftValues.delete("file-deck-template"),this.renderCard("deck");return}await this.plugin.updateSettings({fileDeckTemplate:d}),this.textDraftValues.delete("file-deck-template")})})}),new G.Setting(i).setName(g("settings.deck.insertLocation.name")).setDesc(g("settings.deck.insertLocation.desc")).addDropdown(o=>{this.populateFileDeckInsertLocationDropdown(o,this.plugin.settings.fileDeckInsertLocation),o.onChange(u=>{u!=="yaml"&&u!=="body"||this.plugin.updateSettings({fileDeckInsertLocation:u})})}),new G.Setting(i).setName(g("settings.deck.insertTemplate.name")).setDesc(g("settings.deck.insertTemplate.desc")).addButton(o=>{this.markActionButton(o),o.setButtonText(g("settings.deck.insertTemplate.button")).onClick(()=>{this.plugin.insertDeckTemplateToCurrentFile()})}));let a=this.createDeckSection(n,"default-deck",g("settings.cards.deck.sections.defaultDeck"));new G.Setting(a).setName(g("settings.deck.defaultDeck.name")).setDesc(g("settings.deck.defaultDeck.desc")).addText(o=>{o.setValue(this.getDraftValue("default-deck",this.plugin.settings.defaultDeck)).onChange(u=>{this.scheduleDebouncedTextSave("default-deck",u,async s=>{let d=s.trim();if(!d){this.textDraftValues.delete("default-deck"),this.renderCard("deck");return}await this.plugin.updateSettings({defaultDeck:d}),this.textDraftValues.delete("default-deck")})})}),this.createDeckHelperText(a,g("settings.deck.fallbackDesc"),"fallback"),this.createDeckPriorityFooter(n)}renderDeckExampleBlock(n){let r=n.createDiv();r.dataset.deckExampleBlock="true",v(r,"ahs-settings-deck-example-block");let i=r.createEl("strong",{text:g("settings.deck.examplesTitle")});v(i,"ahs-settings-small-title");for(let a of[g("settings.deck.folderExample"),g("settings.deck.folderAndFileExample")]){let o=r.createDiv({text:a});o.dataset.deckExampleRow="true",v(o,"ahs-settings-helper-text")}}createDeckHelperText(n,r,i){let a=n.createDiv({text:r});return a.dataset.deckHelperText=i,v(a,"ahs-settings-helper-text"),a}createDeckPriorityFooter(n){let r=this.createDeckHelperText(n,g("settings.deck.priorityDesc"),"priority");r.dataset.deckPriorityFooter="true",v(r,"ahs-settings-helper-text-priority")}createDeckSection(n,r,i){let a=n.createDiv();return a.dataset.deckSection=r,v(a,"ahs-settings-section"),this.createSectionHeading(a,"deckSectionTitle",r,i),a}renderCommandsCard(n){n.createEl("p",{text:g("settings.cards.commands.desc")});let r=n.createEl("ul");for(let[i,a]of[[g("commands.syncCurrentFileToAnki"),g("settings.cards.commands.items.syncCurrentFile")],[g("commands.syncVaultToAnki"),g("settings.cards.commands.items.syncVault")],[g("commands.clearCurrentFileSyncedCards"),g("settings.cards.commands.items.clearCurrentFile")],[g("commands.cleanupEmptyDecks"),g("settings.cards.commands.items.cleanupDecks")]])r.createEl("li",{text:`${i}: ${a}`})}async saveCardTypeConfig(n,r){let i={...this.plugin.settings.cardTypeConfigs,[n]:{...this.plugin.settings.cardTypeConfigs[n],...r}};try{pe(Ce({...this.plugin.settings,cardTypeConfigs:i}))}catch(a){return this.cardTypeStatusOverride=ye(a,"settings.cards.cardTypes.failedSave"),this.renderCard("card-types"),!1}if(this.cardTypeStatusOverride=null,await this.plugin.updateSettings({cardTypeConfigs:i}),n==="qa-group"&&typeof r.noteType=="string"){await this.syncQaGroupMappingFromCache(i[n].noteType);let a=B("qa-group",i[n].noteType);if(!this.plugin.settings.noteFieldMappings[a]){let o=this.plugin.settings.ankiModelFieldCache[i[n].noteType];if(o){let u=this.qaGroupFieldMappingService.suggest(i[n].noteType,o.fieldNames,o.loadedAt);await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[a]:u}})}}}return(n==="basic"||n==="cloze")&&typeof r.noteType=="string"&&await this.syncFieldMappingFromCache(n),this.renderCard("card-types"),!0}async saveFieldMapping(n,r){let i=this.getCurrentMappingForConfig(n),a=this.getRuntimeCardType(n),o=this.plugin.settings.cardTypeConfigs[n].noteType,u=B(a,o),s={...i??this.createFallbackMapping(a,o),...r};this.cardTypeStatusOverride=null,this.draftMappings[u]=s,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[u]:{...s,loadedFieldNames:[...s.loadedFieldNames]}}}),this.renderCard("card-types")}async loadAnkiCardTypeConfig(){this.noteTypeCacheCheckToken+=1,this.noteTypeCacheCheckPromise=null,this.cardTypeStatusOverride=null,this.noteTypeCacheCheckStatus=this.resolveManualRefreshCacheStatus(),this.ankiConfigLoading=!0,this.renderCard("card-types");try{let n=await this.plugin.listNoteModels(),r=Qi(n);this.availableNoteModels.splice(0,this.availableNoteModels.length,...r);let i=await this.plugin.getModelFieldNamesByModelNames(r),a=Date.now(),o=Object.entries(i).reduce((s,[d,c])=>(s[d]={fieldNames:[...c],loadedAt:a},s),{});await this.plugin.updateSettings({ankiNoteTypeCache:this.getAvailableNoteModels(),ankiModelFieldCache:o}),this.hydrateVisibleCardTypeCaches(o),await this.syncVisibleFieldMappingsFromCache(o),await this.syncQaGroupMappingFromCache(this.plugin.settings.cardTypeConfigs["qa-group"].noteType,o);let u=this.countConfiguredCardTypes(o);this.detectedAnkiNoteTypeCache=[...r],this.noteTypeCacheCheckStatus="same",this.cardTypeStatusOverride={key:"settings.cards.cardTypes.loadedSummary",params:{noteTypeCount:this.availableNoteModels.length,configuredCount:u}}}catch(n){this.cardTypeStatusOverride=ye(n,"settings.cards.cardTypes.failedLoad")}finally{this.ankiConfigLoading=!1,this.renderCard("card-types")}}maybeStartNoteTypeCacheCheck(){if(this.ankiConfigLoading||this.plugin.settings.ankiNoteTypeCache.length===0||this.noteTypeCacheCheckStatus!=="idle"||this.noteTypeCacheCheckPromise)return;this.noteTypeCacheCheckStatus="checking";let n=++this.noteTypeCacheCheckToken,r=this.checkNoteTypeCacheFreshness(n).finally(()=>{this.noteTypeCacheCheckPromise===r&&(this.noteTypeCacheCheckPromise=null),n===this.noteTypeCacheCheckToken&&this.renderCard("card-types")});this.noteTypeCacheCheckPromise=r}async checkNoteTypeCacheFreshness(n){try{let r=Qi(await this.plugin.listNoteModels());if(n!==this.noteTypeCacheCheckToken)return;this.detectedAnkiNoteTypeCache=r,this.noteTypeCacheCheckStatus=Xu(this.plugin.settings.ankiNoteTypeCache,r)?"same":"changed"}catch{if(n!==this.noteTypeCacheCheckToken)return;this.noteTypeCacheCheckStatus="failed"}}getCardTypeStatusMessage(){if(this.ankiConfigLoading)return{key:"settings.cards.cardTypes.loadAnki.loading"};if(this.cardTypeStatusOverride)return this.cardTypeStatusOverride;let n=this.plugin.settings.ankiNoteTypeCache.length;if(n===0)return{key:"settings.cards.cardTypes.cacheEmpty"};let r=this.countConfiguredCardTypes(this.plugin.settings.ankiModelFieldCache);return this.noteTypeCacheCheckStatus==="changed"?{key:"settings.cards.cardTypes.cacheChanged",params:{cachedCount:n,liveCount:this.detectedAnkiNoteTypeCache?.length??n,configuredCount:r}}:this.noteTypeCacheCheckStatus==="failed"?{key:"settings.cards.cardTypes.cacheCheckFailed",params:{noteTypeCount:n,configuredCount:r}}:{key:"settings.cards.cardTypes.cacheSummary",params:{noteTypeCount:n,configuredCount:r}}}resolveManualRefreshCacheStatus(){return this.noteTypeCacheCheckStatus==="changed"||this.noteTypeCacheCheckStatus==="failed"?this.noteTypeCacheCheckStatus:this.plugin.settings.ankiNoteTypeCache.length>0?"same":"idle"}hydrateVisibleCardTypeCaches(n=this.plugin.settings.ankiModelFieldCache){for(let r of Bt)this.hydrateCardTypeCache(r,n)}hydrateCardTypeCache(n,r){let i=this.getRuntimeCardType(n),a=this.plugin.settings.cardTypeConfigs[n].noteType,o=B(i,a),u=r[a];if(!u)return;let s=this.createCachedModelDetails(a,u.fieldNames);this.loadedModelDetails[o]=s,this.seedDraftMapping(i,a,s,u.loadedAt)}async syncVisibleFieldMappingsFromCache(n=this.plugin.settings.ankiModelFieldCache){for(let r of Bt)r==="qa-group"||r==="cloze-all"||await this.syncFieldMappingFromCache(r,n)}async syncFieldMappingFromCache(n,r=this.plugin.settings.ankiModelFieldCache){let i=this.getRuntimeCardType(n),a=this.plugin.settings.cardTypeConfigs[n].noteType.trim(),o=r[a];if(!o)return;let u=B(i,a),s=this.plugin.settings.noteFieldMappings[u]??this.draftMappings[u],d=s?{...s,loadedFieldNames:[...o.fieldNames],loadedAt:o.loadedAt}:this.noteFieldMappingService.suggest(i,a,o.fieldNames,o.loadedAt);this.draftMappings[u]=d,!On(this.plugin.settings.noteFieldMappings[u],d)&&await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[u]:d}})}createCachedModelDetails(n,r){return{fieldNames:[...r]}}countConfiguredCardTypes(n){return Bt.reduce((r,i)=>{let a=this.plugin.settings.cardTypeConfigs[i];return a.enabled?r+(n[a.noteType]?1:0):r},0)}seedDraftMapping(n,r,i,a=Date.now()){let o=B(n,r),u=this.plugin.settings.noteFieldMappings[o]??this.draftMappings[o];if(n==="qa-group"){if(O(u)){this.draftMappings[o]=this.refreshSavedQaGroupMapping(u,i.fieldNames,a);return}try{this.draftMappings[o]=this.qaGroupFieldMappingService.suggest(r,i.fieldNames,a,void 0,void 0)}catch{delete this.draftMappings[o]}return}if(u){this.draftMappings[o]={...u,loadedFieldNames:[...i.fieldNames],loadedAt:a};return}this.draftMappings[o]=this.noteFieldMappingService.suggest(n,r,i.fieldNames,a)}getSelectableNoteModels(n){let r=this.availableNoteModels.length>0?this.getAvailableNoteModels():[...this.plugin.settings.ankiNoteTypeCache];return r.includes(n)||r.unshift(n),r}getAvailableNoteModels(){return[...this.availableNoteModels]}getCurrentMappingForConfig(n){let r=this.getRuntimeCardType(n),i=this.plugin.settings.cardTypeConfigs[n].noteType,a=B(r,i),o=this.draftMappings[a]??this.plugin.settings.noteFieldMappings[a];if(o)return O(o)?this.cloneQaGroupFieldMapping(o):{...o,loadedFieldNames:[...o.loadedFieldNames]};let u=this.loadedModelDetails[a];if(!u)return;if(r==="qa-group")try{let d=this.plugin.settings.noteFieldMappings[a]??this.draftMappings[a],c=this.qaGroupFieldMappingService.suggest(i,u.fieldNames,Date.now(),O(d)?d.acceptedWarnings:void 0,O(d)?d.titleField:void 0);return this.draftMappings[a]=c,this.cloneQaGroupFieldMapping(c)}catch{return}let s=this.noteFieldMappingService.suggest(r,i,u.fieldNames);return this.draftMappings[a]=s,{...s,loadedFieldNames:[...s.loadedFieldNames]}}createFallbackMapping(n,r){let i=B(n,r),a=this.loadedModelDetails[i];if(a){if(n==="qa-group"){let o=this.plugin.settings.noteFieldMappings[i]??this.draftMappings[i];return this.qaGroupFieldMappingService.suggest(r,a.fieldNames,Date.now(),O(o)?o.acceptedWarnings:void 0,O(o)?o.titleField:void 0)}return this.noteFieldMappingService.suggest(n,r,a.fieldNames)}return n==="qa-group"?{cardType:n,modelName:r,titleField:void 0,slots:[],warnings:[],acceptedWarnings:void 0,derivation:void 0,loadedFieldNames:[],loadedAt:Date.now()}:{cardType:n,modelName:r,loadedFieldNames:[],loadedAt:Date.now()}}async saveQaGroupWarningAcceptance(n,r){let i=this.getCurrentMappingForConfig(n);if(!i||!O(i))return;let a=this.getRuntimeCardType(n),o=B(a,i.modelName),u={...i,slots:i.slots.map(s=>({...s})),warnings:[...i.warnings],acceptedWarnings:r?[...i.warnings]:void 0,loadedFieldNames:[...i.loadedFieldNames]};this.cardTypeStatusOverride=null,this.draftMappings[o]=u,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:u}}),this.renderCard("card-types")}async saveQaGroupFieldSelection(n,r){let i=this.plugin.settings.cardTypeConfigs[n].noteType.trim();if(i.length===0)return;let a=B("qa-group",i),o=this.getCurrentMappingForConfig(n),u=o&&O(o)?o.loadedFieldNames:this.loadedModelDetails[a]?.fieldNames??[],s=o&&O(o)?o.loadedAt:Date.now(),d=this.createQaGroupSelectionDraft(i,u,s,r);this.draftMappings[a]=d;try{let c=this.qaGroupFieldMappingService.createMappingFromSelection(i,u,r,s);this.cardTypeStatusOverride=null,this.draftMappings[a]=c,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[a]:c}})}catch{this.cardTypeStatusOverride=null,this.renderCard("card-types");return}this.renderCard("card-types")}async syncQaGroupMappingFromCache(n,r=this.plugin.settings.ankiModelFieldCache){let i=n.trim();if(i.length===0)return;let a=r[i];if(!a)return;let o=B("qa-group",i),u=this.plugin.settings.noteFieldMappings[o]??this.draftMappings[o];if(O(u)){let s=this.refreshSavedQaGroupMapping(u,a.fieldNames,a.loadedAt);this.draftMappings[o]=s,On(this.plugin.settings.noteFieldMappings[o],s)||await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:s}});return}try{let s=this.qaGroupFieldMappingService.suggest(i,a.fieldNames,a.loadedAt,void 0,void 0);this.draftMappings[o]=s,On(this.plugin.settings.noteFieldMappings[o],s)||await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:s}})}catch{if(delete this.draftMappings[o],this.plugin.settings.noteFieldMappings[o]){let s={...this.plugin.settings.noteFieldMappings};delete s[o],await this.plugin.updateSettings({noteFieldMappings:s})}}}getQaGroupFieldState(n){let r=this.plugin.settings.cardTypeConfigs[n].noteType,i=B("qa-group",r),a=this.draftMappings[i]??this.plugin.settings.noteFieldMappings[i];if(a&&O(a)){if(a.derivation?.mode==="first-pair"){let u=this.getQaGroupSelectedFields(a);try{return{mapping:this.qaGroupFieldMappingService.createMappingFromSelection(r,a.loadedFieldNames,u,a.loadedAt)}}catch(s){return{mapping:this.cloneQaGroupFieldMapping(a),error:ye(s,"settings.cards.cardTypes.failedSave")}}}return{mapping:this.cloneQaGroupFieldMapping(a)}}let o=this.loadedModelDetails[i];if(!o)return{};try{let u=this.plugin.settings.noteFieldMappings[i]??this.draftMappings[i];return{mapping:this.qaGroupFieldMappingService.suggest(r,o.fieldNames,Date.now(),O(u)?u.acceptedWarnings:void 0,O(u)?u.titleField:void 0)}}catch(u){return{error:ye(u,"settings.cards.cardTypes.failedSave")}}}refreshSavedQaGroupMapping(n,r,i){if(n.derivation?.mode==="first-pair")try{return this.qaGroupFieldMappingService.createMappingFromSelection(n.modelName,r,this.getQaGroupSelectedFields(n),i)}catch{return{...this.cloneQaGroupFieldMapping(n),loadedFieldNames:[...r],loadedAt:i}}return{...n,loadedFieldNames:[...r],slots:n.slots.map(a=>({...a})),warnings:[...n.warnings],acceptedWarnings:n.acceptedWarnings?[...n.acceptedWarnings]:void 0,derivation:n.derivation?{...n.derivation}:void 0,loadedAt:i}}cloneQaGroupFieldMapping(n){return{...n,derivation:n.derivation?{...n.derivation}:void 0,loadedFieldNames:[...n.loadedFieldNames],slots:n.slots.map(r=>({...r})),warnings:[...n.warnings],acceptedWarnings:n.acceptedWarnings?[...n.acceptedWarnings]:void 0}}getQaGroupSelectedFields(n){return{titleField:n.titleField,firstQuestionField:n.derivation?.firstQuestionField??n.slots[0]?.questionField,firstAnswerField:n.derivation?.firstAnswerField??n.slots[0]?.answerField}}createQaGroupSelectionDraft(n,r,i,a){let o=a.titleField?.trim()||void 0,u=a.firstQuestionField?.trim()||void 0,s=a.firstAnswerField?.trim()||void 0;return{cardType:"qa-group",modelName:n,titleField:o,slots:[],warnings:[],acceptedWarnings:void 0,derivation:u||s?{mode:"first-pair",firstQuestionField:u,firstAnswerField:s}:void 0,loadedFieldNames:[...r],loadedAt:i}}renderQaGroupWarning(n){let r=ci(n);if(!r)return n;let i=String(r.index).padStart(2,"0");return r.kind==="missing-answer"?g("settings.cards.cardTypes.qaGroup.warning.missingAnswer",{index:i,questionField:r.questionField,answerField:r.answerField}):g("settings.cards.cardTypes.qaGroup.warning.missingQuestion",{index:i,questionField:r.questionField,answerField:r.answerField})}getRuntimeCardType(n){return n==="qa-group"?"qa-group":n==="cloze"||n==="cloze-all"?"cloze":"basic"}ensureFolderTreeLoaded(n=!1){n&&(this.hasLoadedFolderTree=!1,this.folderTree=[]),!(this.hasLoadedFolderTree||this.folderTreeLoadPromise)&&(this.folderTreeStatus=Hi,this.folderTreeLoadPromise=this.plugin.listFolderTree().then(r=>{this.folderTree=r,this.folderTreeStatus=r.length>0?{rawMessage:""}:{key:"settings.scope.empty"},this.requestSelectedFolderAncestorExpansion()}).catch(r=>{this.folderTree=[],this.folderTreeStatus=ye(r,"settings.scope.failedLoad")}).finally(()=>{this.hasLoadedFolderTree=!0,this.folderTreeLoadPromise=null,this.renderCard("scope")}))}refreshFolderTree(){this.expandedFolderPaths.clear(),this.ensureFolderTreeLoaded(!0),this.renderCard("scope")}async updateScopeMode(n){await this.plugin.updateSettings({scopeMode:n}),n!=="all"&&(this.requestSelectedFolderAncestorExpansion(),this.ensureFolderTreeLoaded()),this.renderCard("scope")}async updateFolderSelection(n,r,i){let a=n==="include"?this.plugin.settings.includeFolders:this.plugin.settings.excludeFolders,o=Ri(this.folderTree,a,r,i);if(n==="include"){let u=i?this.plugin.settings.alternateFolderDeckModeFolders:this.plugin.settings.alternateFolderDeckModeFolders.filter(s=>!Zu(s,r));await this.plugin.updateSettings({includeFolders:o,alternateFolderDeckModeFolders:u})}else await this.plugin.updateSettings({excludeFolders:o});this.renderCard("scope")}async updateAlternateFolderDeckModeFolder(n,r){let i=r?this.plugin.settings.alternateFolderDeckModeFolders.includes(n)?[...this.plugin.settings.alternateFolderDeckModeFolders]:[...this.plugin.settings.alternateFolderDeckModeFolders,n]:this.plugin.settings.alternateFolderDeckModeFolders.filter(a=>a!==n);await this.plugin.updateSettings({alternateFolderDeckModeFolders:i}),this.renderCard("scope")}renderFolderNode(n,r,i,a){let o=n.createDiv();o.dataset.folderRow=r.path,v(o,"ahs-settings-folder-row"),o.style.setProperty("--ahs-folder-depth-indent",`${a*18}px`);let u=r.children.length>0,s=u&&this.expandedFolderPaths.has(r.path),d=o.createEl(u?"button":"span");d.dataset.folderToggle=r.path,d.textContent=u?s?"\u25BE":"\u25B8":"",v(d,"ahs-settings-folder-toggle"),u?(v(d,"ahs-settings-folder-toggle-button"),d.setAttr("aria-label",s?g("settings.scope.collapseFolder",{name:r.name}):g("settings.scope.expandFolder",{name:r.name})),d.setAttr("title",s?g("settings.scope.collapseFolder",{name:r.name}):g("settings.scope.expandFolder",{name:r.name})),d.addEventListener("click",()=>{this.expandedFolderPaths.has(r.path)?this.expandedFolderPaths.delete(r.path):this.expandedFolderPaths.add(r.path),this.renderCard("scope")})):v(d,"ahs-settings-folder-toggle-spacer");let c=o.createEl("input");c.type="checkbox",c.checked=r.checked,c.indeterminate=r.indeterminate,c.dataset.folderPath=r.path,v(c,"ahs-settings-folder-checkbox"),c.addEventListener("change",()=>{this.updateFolderSelection(i,r.path,c.checked)});let l=o.createDiv();v(l,"ahs-settings-folder-label-stack");let f=l.createSpan({text:r.name});if(f.dataset.folderPathLabel=r.path,v(f,"ahs-settings-folder-label"),this.applyFluidEllipsis(f),i==="include"&&r.checked&&this.plugin.settings.folderDeckMode!=="off"){let p=o.createEl("input"),F=g("settings.scope.folderDeckModeOverride.ariaLabel",{name:r.name}),k=this.getFolderDeckModeOverrideTitle(),b=this.plugin.settings.alternateFolderDeckModeFolders.includes(r.path);if(p.type="checkbox",p.checked=b,p.dataset.folderDeckModeOverride=r.path,p.setAttr("aria-label",F),p.setAttr("title",k),v(p,"ahs-settings-folder-override-checkbox"),p.addEventListener("click",x=>{x?.stopPropagation()}),p.addEventListener("change",()=>{this.updateAlternateFolderDeckModeFolder(r.path,p.checked)}),b){let x=l.createDiv({text:this.getFolderDeckModeOverrideHint()});x.dataset.folderDeckModeOverrideHint=r.path,v(x,"ahs-settings-folder-override-hint")}}if(!u||!s)return;let m=n.createDiv();m.dataset.folderChildren=r.path,v(m,"ahs-settings-folder-children");for(let p of r.children)this.renderFolderNode(m,p,i,a+1)}requestSelectedFolderAncestorExpansion(){this.scopeNeedsSelectedAncestorExpansion=!0}expandSelectedFolderAncestorsIfNeeded(n){if(this.scopeNeedsSelectedAncestorExpansion){this.scopeNeedsSelectedAncestorExpansion=!1;for(let r of this.getSelectedFoldersForScopeMode(n))for(let i of es(r))this.expandedFolderPaths.add(i)}}getSelectedFoldersForScopeMode(n){return n==="include"?this.plugin.settings.includeFolders:this.plugin.settings.excludeFolders}getFolderDeckModeOverrideHint(){return this.plugin.settings.folderDeckMode==="folder"?g("settings.scope.folderDeckModeOverride.hint.folderAndFile"):g("settings.scope.folderDeckModeOverride.hint.folder")}getFolderDeckModeOverrideTitle(){return this.plugin.settings.folderDeckMode==="folder"?g("settings.scope.folderDeckModeOverride.title.folderAndFile"):g("settings.scope.folderDeckModeOverride.title.folder")}createInlineControlGroup(n,r){let i=n.createEl("label");v(i,"ahs-settings-inline-control-group");let a=i.createSpan({text:r});return v(a,"ahs-settings-inline-control-label"),i}createGridControlSlot(n,r){let i=n.createEl("label");v(i,"ahs-settings-grid-control-slot");let a=i.createSpan({text:r});v(a,"ahs-settings-grid-control-label");let o=i.createDiv();return v(o,"ahs-settings-grid-control-content"),o}applyFluidEllipsis(n){let r=(n.tagName||n.tag||"").toLowerCase(),i=r==="select"||r==="input";v(n,"ahs-settings-fluid-ellipsis"),i&&v(n,"ahs-settings-fluid-control")}createSectionHeading(n,r,i,a){let o=n.createDiv(),u=new G.Setting(o).setName(a).setHeading();u.settingEl.dataset[r]=i,u.nameEl.dataset[r]=i,v(u.settingEl,"ahs-settings-section-heading")}scheduleDebouncedTextSave(n,r,i){let a=window.activeWindow;this.textDraftValues.set(n,r);let o=this.debouncedTextSaves.get(n);o&&a.clearTimeout(o.timer);let u=a.setTimeout(()=>{this.flushDebouncedTextSave(n)},Ou);this.debouncedTextSaves.set(n,{timer:u,saveAction:i})}async flushDebouncedTextSave(n){let r=window.activeWindow,i=this.debouncedTextSaves.get(n);i&&(r.clearTimeout(i.timer),this.debouncedTextSaves.delete(n),await i.saveAction(this.textDraftValues.get(n)??""))}async flushDebouncedTextSaves(){let n=[...this.debouncedTextSaves.keys()];await Promise.allSettled(n.map(r=>this.flushDebouncedTextSave(r)))}getDraftValue(n,r){return this.textDraftValues.get(n)??r}createSelect(n,r){let i=n.createEl("select");return i.dataset.selectKey=r,i}createFieldSelect(n,r){return this.createSelect(n,r)}appendOption(n,r,i){let a=n.createEl("option",{text:i});a.value=r}populateFieldSelect(n,r,i){n.empty(),this.appendOption(n,"",r.length>0?g("settings.mapping.selectFieldPlaceholder"):g("settings.cards.cardTypes.fieldsUnavailable"));for(let a of r)this.appendOption(n,a,a);n.value=i??""}populateFileDeckInsertLocationDropdown(n,r){n.addOption("body",g("settings.deck.insertLocation.options.body")),n.addOption("yaml",g("settings.deck.insertLocation.options.yaml")),n.setValue(r)}populateFolderDeckModeDropdown(n,r){n.addOption("off",g("settings.deck.folderDeckMode.options.off")),n.addOption("folder",g("settings.deck.folderDeckMode.options.folder")),n.addOption("folder-and-file",g("settings.deck.folderDeckMode.options.folderAndFile")),n.setValue(r)}getCardTitle(n){return n==="card-types"?g("settings.cards.cardTypes.title"):n==="sync-content"?g("settings.cards.syncContent.title"):n==="scope"?g("settings.cards.scope.title"):n==="deck"?g("settings.cards.deck.title"):g("settings.cards.commands.title")}getCardTypeLabel(n){return n==="basic"?g("settings.cards.cardTypes.rows.basic"):n==="qa-group"?g("settings.cards.cardTypes.rows.qaGroup"):n==="cloze"?g("settings.cards.cardTypes.rows.cloze"):n==="cloze-all"?g("settings.cards.cardTypes.rows.clozeAll"):g("settings.cards.cardTypes.rows.qaGroup")}};function Ui(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function Zu(e,t){let n=Ui(e),r=Ui(t);return n===r||n.startsWith(`${r}/`)}function Yu(e){return e==="include"?g("settings.scope.summary.include"):e==="exclude"?g("settings.scope.summary.exclude"):g("settings.scope.summary.all")}function On(e,t){return JSON.stringify(e)===JSON.stringify(t)}function Qi(e){let t=new Set;for(let n of e){if(typeof n!="string")continue;let r=n.trim();r.length>0&&t.add(r)}return[...t].sort((n,r)=>n.localeCompare(r))}function Xu(e,t){return e.length!==t.length?!1:e.every((n,r)=>n===t[r])}function Ju(e){return e==="include"?g("settings.scope.treeDescription.include"):g("settings.scope.treeDescription.exclude")}function es(e){let t=e.split("/").filter(r=>r.length>0),n=[];for(let r=1;r0?e.message.trim():String(e)}var zt=class{async runCollectBatches(t,n,r,i){if(t.length===0)return[];let a=rs(t,n),o=[],u=0;return await Promise.all(Array.from({length:Math.min(r,a.length)},async()=>{for(;u(await i(a),[]))}};function rs(e,t){let n=[];for(let r=0;ri.has(a))}function et(e,t){let n=Ht(e),r=Ht(t),i=new Set(n),a=new Set(r);return{addTags:n.filter(o=>!a.has(o)),removeTags:r.filter(o=>!i.has(o))}}var Ot=class{constructor(t,n=new Ne,r=new zt){this.ankiGateway=t;this.noteFieldMappingService=n;this.batchScheduler=r}async execute(t,n,r,i){let a=new Map,o=new Map,u=new Set,s=new Map,d=0,c=0,l=0,f=0,m=0,p=Array.from(new Set([...t.toRebuild,...t.toUpdate,...t.toVerifyDeck,...t.toRewriteMarker,...t.toChangeDeck].flatMap(y=>y.noteId?[y.noteId]:[]))),F=await this.batchScheduler.runCollectBatches(p,100,1,y=>this.ankiGateway.getNoteSummaries(y)),k=new Map(F.map(y=>[y.noteId,y])),b=[],x=[],C=[],h=[],M=[],T=new Set(t.toChangeDeck.map(y=>y.card.syncKey));for(let y of t.toCreate)b.push(await this.requireRenderedCard(y,n,r));for(let y of t.toRebuild){if(y.noteId&&k.has(y.noteId)){x.push({plannedCard:y,renderedCard:await this.requireRenderedCard(y,n,r)});continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toUpdate){if(y.noteId&&k.has(y.noteId)){let w=await this.requireRenderedCard(y,n,r),_=k.get(y.noteId);_&&_.modelName!==w.noteModel?h.push({plannedCard:y,renderedCard:w,summary:_}):C.push({plannedCard:y,renderedCard:w});continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toRewriteMarker)if(!s.has(y.card.syncKey)){if(y.noteId&&k.has(y.noteId)){s.set(y.card.syncKey,y),o.set(y.card.syncKey,y.noteId);continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toVerifyDeck){if(!y.noteId)continue;let w=k.get(y.noteId);w&&is(w,y.deck,T.has(y.card.syncKey))&&(M.push(y),o.set(y.card.syncKey,y.noteId))}await this.batchScheduler.runVoidBatches(Array.from(new Set([...b.map(y=>y.deck),...x.map(y=>y.renderedCard.deck),...M.map(y=>y.deck)])),50,1,y=>this.ankiGateway.ensureDecks(y));let D=await this.uploadMedia([...b,...x.map(y=>y.renderedCard),...C.map(y=>y.renderedCard),...h.map(y=>y.renderedCard)]),I=await this.batchScheduler.runCollectBatches(b,50,1,async y=>this.ankiGateway.addNotes(await Promise.all(y.map(async w=>({deckName:w.deck,modelName:w.noteModel,fields:await this.mapFields(w,i,a),tags:w.card.tagsHint})))));for(let y=0;y{await this.ankiGateway.updateNotes(await Promise.all(y.map(async({plannedCard:w,renderedCard:_})=>({noteId:w.noteId??0,fields:await this.mapFields(_,i,a)}))))}),await this.batchScheduler.runVoidBatches(h,25,1,async y=>{for(let{plannedCard:w,renderedCard:_,summary:L}of y){let P=await this.mapFields(_,i,a);try{await this.ankiGateway.updateNoteModel({noteId:w.noteId??0,modelName:_.noteModel,fields:P})}catch(q){throw qt({noteId:w.noteId??0,fromModel:L.modelName,toModel:_.noteModel,error:q,location:`${w.card.filePath}:${w.card.blockStartLine}`})}}});let A=[...C,...h].flatMap(({plannedCard:y})=>{if(!y.noteId)return[];let w=k.get(y.noteId);if(!w)return[];let _=et(y.card.tagsHint,w.tags);return _.addTags.length===0&&_.removeTags.length===0?[]:[{noteId:y.noteId,addTags:_.addTags,removeTags:_.removeTags}]});await this.batchScheduler.runVoidBatches(A,50,1,y=>this.ankiGateway.syncNoteTags(y)),l+=C.length+h.length,f=h.length;for(let{plannedCard:y}of[...C,...h])y.noteId&&(u.add(y.card.syncKey),o.set(y.card.syncKey,y.noteId));let R=new Map;for(let y of M){let w=y.noteId;if(!w)continue;let _=k.get(w);if(!_||_.cardIds.length===0)continue;let L=R.get(y.deck)??new Set;for(let P of _.cardIds)L.add(P);R.set(y.deck,L)}await this.batchScheduler.runVoidBatches(Array.from(R.entries()).map(([y,w])=>({deckName:y,cardIds:Array.from(w)})),25,1,y=>this.ankiGateway.changeDecks(y)),m=M.length;for(let y of M)u.add(y.card.syncKey);return{created:d,rebuilt:c,updated:l,migratedNoteTypes:f,migratedDecks:m,uploadedMedia:D,markerWrites:Array.from(s.values()).map(y=>({...y,noteId:o.get(y.card.syncKey)??y.noteId})),resolvedNoteIds:o,touchedSyncKeys:u}}async requireRenderedCard(t,n,r){let i=n.get(t.card.syncKey);if(i)return i;let a=await r(t);return n.set(t.card.syncKey,a),a}async mapFields(t,n,r){let i=await this.getModelDetails(t.noteModel,r);return this.noteFieldMappingService.mapRenderedCard({type:t.card.cardType,noteModel:t.noteModel,renderedFields:t.renderedFields},i,n)}async getModelDetails(t,n){let r=n.get(t);if(r)return r;let i=this.ankiGateway.getModelDetails(t).catch(a=>{throw n.delete(t),a});return n.set(t,i),i}async uploadMedia(t){let n=new Map;for(let r of t)for(let i of r.media)n.set(`${i.kind}:${i.absolutePath}:${i.fileName}`,i);return await this.batchScheduler.runVoidBatches(Array.from(n.values()),10,3,r=>this.ankiGateway.storeMediaFiles(r)),n.size}};function Ki(e){return e instanceof Error?e:new Error(String(e))}function is(e,t,n){let r=e.deckNames?.filter(i=>i.length>0)??[];return r.length===0?n:r.some(i=>i!==t)}var Pe=class{filter(t,n,r,i){let a=Wt(r),o=Wt(i);return t.filter(u=>u.path.toLowerCase().endsWith(".md")?this.isPathInScope(u.path,n,a,o):!1)}isPathInScope(t,n,r,i){let a=os(t),o=Wt(r),u=Wt(i);return n==="include"?o.some(s=>Zi(a,s)):n==="exclude"?!u.some(s=>Zi(a,s)):!0}};function Wt(e){return e.map(as).filter(Boolean)}function as(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function os(e){return e.trim().replace(/\\/g,"/").replace(/^\/+/,"")}function Zi(e,t){return e===t||e.startsWith(`${t}/`)}function $t(e,t,n){return`${e}\0group\0${t}\0${n}`}function Fe(e,t){return`${e}#${t}`}function Qt(e){let t=us(e.lines,e.startLine,e.markerAdapter),n=t.find(o=>o.valid);if(n?.marker){let o=e.lines.slice(0,n.index);return{contentLines:o,trailingLines:cs(e.lines.slice(n.index+1)),contentEndLine:Ut(o,e.startLine,e.fallbackLine),markerLine:e.startLine+n.index,markerIndent:n.indent,marker:n.marker,markerState:"present-valid"}}let r=e.cutoffMode==="double-blank-lines"?ss(e.lines):void 0;if(r){let o=t.find(s=>!s.valid&&s.index>=r.end),u=e.lines.slice(0,r.start);return{contentLines:u,trailingLines:e.lines.slice(r.end),contentEndLine:Ut(u,e.startLine,e.fallbackLine),markerLine:o?e.startLine+o.index:void 0,markerIndent:o?.indent,markerState:o?"present-invalid":"missing"}}let i=ds(e.lines),a=i===void 0?void 0:t.find(o=>!o.valid&&o.index===i);if(a){let o=e.lines.filter((u,s)=>s!==a.index);return{contentLines:o,trailingLines:[],contentEndLine:Ut(o,e.startLine,e.fallbackLine),markerLine:e.startLine+a.index,markerIndent:a.indent,markerState:"present-invalid"}}return{contentLines:e.lines,trailingLines:[],contentEndLine:Ut(e.lines,e.startLine,e.fallbackLine),markerState:"missing"}}function us(e,t,n){let r=[],i=null;for(let a=0;a=2&&n!==void 0)return{start:n,end:i};t=t?null:a.slice(0,3),n=void 0,r=0;continue}if(!t){if(!a){n??(n=i),r+=1;continue}if(r>=2&&n!==void 0)return{start:n,end:i};n=void 0,r=0}}if(r>=2&&n!==void 0)return{start:n,end:e.length}}function Ut(e,t,n){for(let r=e.length-1;r>=0;r-=1)if(e[r].trim())return t+r;return n}function ds(e){for(let t=e.length-1;t>=0;t-=1)if(e[t].trim())return t}function cs(e){let t=0;for(;t1&&a.push({filePath:r,code:"deck_multiple_body_declarations",params:{marker:i}}),{bodyDeck:o[0],warnings:a}}};function ps(e){if(e[0]?.trim()==="---"){for(let t=1;t!Ss(s))),u=[`qa-group:${n}`,...a.map(s=>`${s.title} +`,o=e.split(/\r?\n/),u=[],s=0,d=0;for(let c=0;c0||r.trackedGroups.length>0}async execute(t){let n=await this.pluginStateRepository.load(),r=vi(n,t);if(r.trackedCards.length===0&&r.trackedGroups.length===0)return lu();let i=r.noteIds;i.length>0&&await this.ankiGateway.deleteNotes(i);let a=await this.markdownMarkerRemovalService.remove(t,r.trackedCards.map(u=>({noteId:u.noteId})),r.trackedGroups.map(u=>({noteId:u.noteId,groupId:u.groupId,blockStartLine:u.blockStartLine}))),o=cu(n,t,r);return await this.pluginStateRepository.save(o),{trackedCards:r.trackedCards.length,trackedGroups:r.trackedGroups.length,deletedNotes:i.length,removedMarkers:a.removedMarkers,removedCardMarkers:a.removedCardMarkers,removedGroupMarkers:a.removedGroupMarkers,deletedLocalRecords:r.trackedCards.length+r.trackedGroups.length,conflictFiles:a.conflictFiles,failureFiles:a.failureFiles}}};function vi(e,t){let n=new Set,r=new Set,i=e.groupBlocks??{};for(let u of e.files[t]?.noteIds??[]){let s=z(u);e.cards[s]&&n.add(s)}for(let u of e.files[t]?.groupIds??[])i[u]&&r.add(u);for(let u of Object.values(e.cards))u.filePath===t&&n.add(z(u.noteId));for(let[u,s]of Object.entries(i))s.filePath===t&&r.add(u);let a=Array.from(n).map(u=>e.cards[u]).filter(u=>!!u),o=Array.from(r).map(u=>i[u]).filter(u=>!!u);return{trackedCards:a,trackedGroups:o,noteIds:Array.from(new Set([...a.map(u=>u.noteId),...o.map(u=>u.noteId)]))}}function cu(e,t,n){let r={...e.cards},i={...e.groupBlocks??{}};for(let o of n.trackedCards)delete r[z(o.noteId)];for(let o of n.trackedGroups)delete i[o.groupId];let a={...e.files};return delete a[t],{files:a,cards:r,groupBlocks:e.groupBlocks?i:void 0,pendingWriteBack:e.pendingWriteBack.filter(o=>o.filePath!==t)}}function lu(){return{trackedCards:0,trackedGroups:0,deletedNotes:0,removedMarkers:0,removedCardMarkers:0,removedGroupMarkers:0,deletedLocalRecords:0,conflictFiles:[],failureFiles:[]}}var Ft=class{constructor(t){this.manualSyncService=t}async execute(t,n){return this.manualSyncService.syncFile(t,n)}};var Mt=class{constructor(t){this.manualSyncService=t}async execute(t){return this.manualSyncService.syncVault(t)}};var Ti=require("obsidian"),wt=class{constructor(t){this.getBaseUrl=t}async ensureDeckExists(t){await this.invoke("createDeck",{deck:t})}async ensureDecks(t){let n=Array.from(new Set(t));await this.invokeMulti(n.map(r=>({action:"createDeck",params:{deck:r}})))}async listNoteModels(){return this.invoke("modelNames",{})}async listDeckNames(){let t=await this.invoke("deckNamesAndIds",{});return Object.keys(t)}async getModelFieldNames(t){return this.invoke("modelFieldNames",{modelName:t})}async getModelFieldNamesByModelNames(t){let n=Array.from(new Set(t.map(i=>i.trim()).filter(i=>i.length>0)));if(n.length===0)return{};let r=await this.invoke("multi",{actions:n.map(i=>({action:"modelFieldNames",params:{modelName:i}}))});return n.reduce((i,a,o)=>{let u=pu(r[o]);return u&&(i[a]=u),i},{})}async findNoteIds(t){return this.invoke("findNotes",{query:t})}async getNoteDetails(t){if(t.length===0)return[];let n=await this.invoke("notesInfo",{notes:t}),r=n.flatMap(a=>Array.isArray(a?.cards)?a.cards:[]),i=new Map;if(r.length>0){let a=await this.invoke("cardsInfo",{cards:r});for(let o of a)!o||typeof o.cardId!="number"||typeof o.deckName!="string"||i.set(o.cardId,o.deckName)}return n.flatMap(a=>{if(!a||typeof a.noteId!="number"||typeof a.modelName!="string")return[];let o=Array.isArray(a.cards)?a.cards:[],u=Object.fromEntries(Object.entries(a.fields??{}).map(([s,d])=>[s,d?.value??""]));return[{noteId:a.noteId,modelName:a.modelName,cardIds:o,deckNames:Array.from(new Set(o.map(s=>i.get(s)).filter(s=>typeof s=="string"))),tags:Array.isArray(a.tags)?a.tags.filter(s=>typeof s=="string"):[],fields:u}]})}async getModelDetails(t){return{fieldNames:await this.getModelFieldNames(t)}}async getDeckStats(t){if(t.length===0)return[];let n=await this.invoke("deckNamesAndIds",{}),r=await this.invoke("getDeckStats",{decks:t});return t.map(i=>({deckName:i,noteCount:fu(r,n[i])}))}async getNoteSummaries(t){return(await this.getNoteDetails(t)).map(n=>({noteId:n.noteId,modelName:n.modelName,cardIds:n.cardIds,deckNames:n.deckNames,tags:n.tags}))}async addNote(t){return this.invoke("addNote",{note:{deckName:t.deckName,modelName:t.modelName,fields:t.fields,options:{allowDuplicate:!1,duplicateScope:"deck"},tags:t.tags}})}async addNotes(t){return this.invokeMulti(t.map(n=>({action:"addNote",params:{note:{deckName:n.deckName,modelName:n.modelName,fields:n.fields,options:{allowDuplicate:!1,duplicateScope:"deck"},tags:n.tags}}})))}async deleteNotes(t){t.length!==0&&await this.invoke("deleteNotes",{notes:t})}async updateNote(t){if(await this.invoke("updateNoteFields",{note:{id:t.noteId,fields:t.fields}}),!t.deckName)return;let r=(await this.invoke("notesInfo",{notes:[t.noteId]}))[0]?.cards??[];r.length>0&&await this.invoke("changeDeck",{cards:r,deck:t.deckName})}async updateNoteModel(t){try{await this.invoke("updateNoteModel",{note:{id:t.noteId,modelName:t.modelName,fields:t.fields}})}catch(n){throw new Error(gu("updateNoteModel",{noteId:t.noteId,modelName:t.modelName},n))}}async updateNotes(t){await this.invokeMulti(t.map(n=>({action:"updateNoteFields",params:{note:{id:n.noteId,fields:n.fields}}})))}async syncNoteTags(t){let n=[];for(let r of t)r.removeTags.length>0&&n.push({action:"removeTags",params:{notes:[r.noteId],tags:r.removeTags.join(" ")}}),r.addTags.length>0&&n.push({action:"addTags",params:{notes:[r.noteId],tags:r.addTags.join(" ")}});await this.invokeMulti(n)}async changeDecks(t){await this.invokeMulti(t.filter(n=>n.cardIds.length>0).map(n=>({action:"changeDeck",params:{cards:n.cardIds,deck:n.deckName}})))}async deleteDecks(t){let n=Array.from(new Set(t));n.length!==0&&await this.invoke("deleteDecks",{decks:n,cardsToo:!0})}async storeMedia(t){await this.invoke("storeMediaFile",{filename:t.fileName,path:t.absolutePath})}async storeMediaFiles(t){await this.invokeMulti(t.map(n=>({action:"storeMediaFile",params:{filename:n.fileName,path:n.absolutePath}})))}async invoke(t,n){let i=(await(0,Ti.requestUrl)({url:this.getBaseUrl(),method:"POST",contentType:"application/json",body:JSON.stringify({action:t,version:6,params:n})})).json;if(i.error)throw new Error(i.error);return i.result}async invokeMulti(t){return t.length===0?[]:this.invoke("multi",{actions:t})}};function pu(e){if(Array.isArray(e))return e.filter(n=>typeof n=="string");if(!e||typeof e!="object"||Array.isArray(e))return;let t=e;if(!t.error&&Array.isArray(t.result))return t.result.filter(n=>typeof n=="string")}function fu(e,t){if(!e||typeof e!="object"||typeof t!="number")return;let n=e[String(t)];if(!n||typeof n!="object")return;let i=n.total_in_deck;if(typeof i=="number"&&Number.isFinite(i))return i}function gu(e,t,n){let r=typeof t.noteId=="number"&&typeof t.modelName=="string"?` for note ${t.noteId} to model ${t.modelName}`:typeof t.noteId=="number"?` for note ${t.noteId}`:"";return`AnkiConnect ${e} failed${r}: ${mu(n)}`}function mu(e){return e instanceof Error&&e.message.trim().length>0?e.message.trim():String(e)}var vt=class{constructor(t){this.plugin=t}async load(){let t=await this.plugin.loadData();return t!==null&&typeof t=="object"?t:null}async save(t){await this.plugin.saveData(t)}};var ie=require("obsidian");function Q(e){let t=2166136261;for(let n=0;n>>0).toString(16).padStart(8,"0")}function Tt(e){if(!e)return[];let t=[],n=new Set;for(let r of e){if(typeof r!="string")continue;let a=(r.startsWith("#")?r.slice(1):r).split("/").map(u=>u.trim()).filter(u=>u.length>0);if(a.length===0)continue;let o=a.join("::");n.has(o)||(n.add(o),t.push(o))}return t}var hu=new Set(["png","jpg","jpeg","gif","bmp","svg","webp","tiff"]),ku=new Set(["wav","m4a","flac","mp3","wma","aac","webm","ogg"]),At=class{constructor(t){this.app=t}listFolderTree(){return Promise.resolve(this.app.vault.getRoot().children.filter(t=>t instanceof ie.TFolder).map(t=>this.toFolderTreeNode(t)))}listMarkdownFileRefs(){return Promise.resolve(this.app.vault.getMarkdownFiles().map(t=>({path:t.path,basename:t.basename,mtime:t.stat.mtime,size:t.stat.size})))}async listMarkdownFiles(){let t=this.app.vault.getMarkdownFiles();return Promise.all(t.map(n=>this.toSourceFile(n)))}async getMarkdownFile(t){let n=this.app.vault.getAbstractFileByPath(t);return!(n instanceof ie.TFile)||n.extension.toLowerCase()!=="md"?null:this.toSourceFile(n)}async readMarkdownFile(t){return this.getMarkdownFile(t)}async replaceMarkdownFile(t,n,r){let i=this.app.vault.getAbstractFileByPath(t);if(!(i instanceof ie.TFile)||i.extension.toLowerCase()!=="md")throw new kt(t);await this.app.vault.process(i,a=>{if(a!==n)throw new fe(t);return r})}resolveWikiLink(t,n){let{alias:r,linkPath:i}=Di(t),o=this.app.metadataCache.getFirstLinkpathDest(Dt(i),n)?.path??Dt(i),u=r||bu(i);return{url:this.createObsidianUrl(i.includes("#")?`${o}${i.slice(i.indexOf("#"))}`:o),displayText:u}}resolveEmbed(t,n){let{alias:r,linkPath:i}=Di(t),a=this.app.metadataCache.getFirstLinkpathDest(Dt(i),n);if(!(a instanceof ie.TFile))return null;let o=a.extension.toLowerCase(),u=hu.has(o)?"image":ku.has(o)?"audio":null;if(!u)return null;let s=yu(this.app,a.path),d=`${Q(a.path)}-${a.name}`;return{kind:u,fileName:d,absolutePath:s,altText:r||a.name}}createBacklink(t){return this.createObsidianUrl(`${t.filePath}#${xu(t.headingText)}`)}async toSourceFile(t){let n=this.app.metadataCache.getFileCache(t);return{path:t.path,basename:t.basename,content:await this.app.vault.cachedRead(t),tags:Cu(n)}}createObsidianUrl(t){return`obsidian://open?vault=${encodeURIComponent(this.app.vault.getName())}&file=${encodeURIComponent(t)}`}toFolderTreeNode(t){return{path:t.path,name:t.name,children:t.children.filter(n=>n instanceof ie.TFolder).map(n=>this.toFolderTreeNode(n))}}};function Di(e){let[t,n]=e.split("|",2).map(r=>r.trim());return{linkPath:t,alias:n||void 0}}function Dt(e){return e.split("#",1)[0]}function bu(e){let t=Dt(e);return(t.split("/").pop()??t).replace(/\.[^.]+$/,"")||e}function yu(e,t){let n=e.vault.adapter;if(!n.getFullPath)throw new Error("The active vault adapter does not expose an absolute filesystem path.");return n.getFullPath(t)}function xu(e){return e.replace(/(?:\s+#\S+)+$/g,t=>t.replace(/(^|\s)#(\S+)/g,"$1$2"))}function Cu(e){return e?Tt((0,ie.getAllTags)(e)):[]}var Et=class{constructor(t){this.pluginDataStore=t}async load(){let t=await this.pluginDataStore.load()??{},n=hi(t.settings);return pe(n),n}async save(t){let n=Ce(t);pe(n);let r=await this.pluginDataStore.load()??{};await this.pluginDataStore.save({...r,settings:n})}};function Se(e,t){if(e==="cloze")return t==="all"?"all":"sequential"}function _t(e,t,n){return`${e}\0${t}\0${n}`}var Lt=class{constructor(t){this.pluginDataStore=t}async load(){let t=await this.pluginDataStore.load()??{};return Su(t.pluginState)}async save(t){let n=await this.pluginDataStore.load()??{};await this.pluginDataStore.save({...n,pluginState:t})}};function Su(e){if(!e)return wi();let t=_u(e.cards),n=Lu(e.files),r=Iu(e.groupBlocks),i={};for(let u of Object.values(t)){let s=Xe(u.noteId);if(s===void 0)continue;let d=Fu(u,s);if(!d)continue;let c=z(s),l=i[c];(!l||l.lastSyncedAt<=d.lastSyncedAt)&&(i[c]=d)}let a={};for(let[u,s]of Object.entries(n))a[u]={filePath:u,fileHash:typeof s.fileHash=="string"?s.fileHash:"",fileStamp:typeof s.fileStamp=="string"?s.fileStamp:"",deckRulesFingerprint:typeof s.deckRulesFingerprint=="string"?s.deckRulesFingerprint:void 0,lastIndexedAt:typeof s.lastIndexedAt=="number"?s.lastIndexedAt:0,noteIds:Tu(s,t,i),groupIds:Eu(s,r)};let o={};for(let[u,s]of Object.entries(r)){let d=vu(s,u);if(!d)continue;let c=o[u];(!c||c.lastSyncedAt<=d.lastSyncedAt)&&(o[u]=d)}return{files:a,cards:i,groupBlocks:o,pendingWriteBack:Du(e.pendingWriteBack)}}function Fu(e,t){let n=Mu(e.cardType);return n?{noteId:t,filePath:typeof e.filePath=="string"?e.filePath:"",heading:typeof e.heading=="string"?e.heading:"",backlinkHeadingText:typeof e.backlinkHeadingText=="string"?e.backlinkHeadingText:typeof e.heading=="string"?e.heading:"",headingLevel:typeof e.headingLevel=="number"?e.headingLevel:1,bodyMarkdown:typeof e.bodyMarkdown=="string"?e.bodyMarkdown:"",cardType:n,clozeMode:Se(n,wu(e.clozeMode)),blockStartOffset:typeof e.blockStartOffset=="number"?e.blockStartOffset:0,blockEndOffset:typeof e.blockEndOffset=="number"?e.blockEndOffset:0,blockStartLine:typeof e.blockStartLine=="number"?e.blockStartLine:1,bodyStartLine:typeof e.bodyStartLine=="number"?e.bodyStartLine:1,blockEndLine:typeof e.blockEndLine=="number"?e.blockEndLine:1,contentEndLine:typeof e.contentEndLine=="number"?e.contentEndLine:1,markerLine:typeof e.markerLine=="number"?e.markerLine:void 0,rawBlockText:typeof e.rawBlockText=="string"?e.rawBlockText:"",rawBlockHash:typeof e.rawBlockHash=="string"?e.rawBlockHash:"",renderConfigHash:typeof e.renderConfigHash=="string"?e.renderConfigHash:"",deck:typeof e.deck=="string"?e.deck:"",deckHint:typeof e.deckHint=="string"?e.deckHint:void 0,deckHintSource:e.deckHintSource==="frontmatter"||e.deckHintSource==="body"?e.deckHintSource:void 0,deckWarnings:Array.isArray(e.deckWarnings)?[...e.deckWarnings]:[],tagsHint:Array.isArray(e.tagsHint)?e.tagsHint.filter(r=>typeof r=="string"):[],lastSyncedAt:typeof e.lastSyncedAt=="number"?e.lastSyncedAt:0,orphan:!!e.orphan}:null}function Mu(e){if(e==="basic"||e==="cloze")return e}function wu(e){if(e==="sequential"||e==="all")return e}function vu(e,t){let n=Xe(e.noteId);return n===void 0||!t.trim()?null:{groupId:t,noteId:n,filePath:typeof e.filePath=="string"?e.filePath:"",headingText:typeof e.headingText=="string"?e.headingText:"",backlinkHeadingText:typeof e.backlinkHeadingText=="string"?e.backlinkHeadingText:typeof e.headingText=="string"?e.headingText:"",headingLevel:typeof e.headingLevel=="number"?e.headingLevel:1,stem:typeof e.stem=="string"?e.stem:"",src:typeof e.src=="string"?e.src:"",blockStartOffset:typeof e.blockStartOffset=="number"?e.blockStartOffset:0,blockEndOffset:typeof e.blockEndOffset=="number"?e.blockEndOffset:0,blockStartLine:typeof e.blockStartLine=="number"?e.blockStartLine:1,bodyStartLine:typeof e.bodyStartLine=="number"?e.bodyStartLine:1,blockEndLine:typeof e.blockEndLine=="number"?e.blockEndLine:1,contentEndLine:typeof e.contentEndLine=="number"?e.contentEndLine:1,markerLine:typeof e.markerLine=="number"?e.markerLine:void 0,markerIndent:typeof e.markerIndent=="string"?e.markerIndent:void 0,rawBlockText:typeof e.rawBlockText=="string"?e.rawBlockText:"",rawBlockHash:typeof e.rawBlockHash=="string"?e.rawBlockHash:"",deck:typeof e.deck=="string"?e.deck:"",deckHint:typeof e.deckHint=="string"?e.deckHint:void 0,deckHintSource:e.deckHintSource==="frontmatter"||e.deckHintSource==="body"?e.deckHintSource:void 0,deckWarnings:Array.isArray(e.deckWarnings)?[...e.deckWarnings]:[],tagsHint:Array.isArray(e.tagsHint)?e.tagsHint.filter(r=>typeof r=="string"):[],items:Array.isArray(e.items)?e.items.flatMap(r=>{if(!r||typeof r!="object")return[];let i=r;return typeof i.title!="string"||typeof i.answer!="string"||typeof i.ordinalInMarkdown!="number"?[]:[{itemId:typeof i.itemId=="string"?i.itemId:void 0,title:i.title,answer:i.answer,slot:typeof i.slot=="number"?i.slot:void 0,ordinalInMarkdown:i.ordinalInMarkdown}]}):[],freeSlots:Array.isArray(e.freeSlots)?e.freeSlots.filter(r=>typeof r=="number"&&Number.isInteger(r)&&r>0):[],lastSyncedAt:typeof e.lastSyncedAt=="number"?e.lastSyncedAt:0,orphan:!!e.orphan}}function Tu(e,t,n){let r=new Set;if(Array.isArray(e.noteIds))for(let i of e.noteIds){let a=Xe(i);a!==void 0&&n[z(a)]&&r.add(a)}if(Array.isArray(e.cardIds))for(let i of e.cardIds){let a=Xe(t[i]?.noteId);a!==void 0&&n[z(a)]&&r.add(a)}return Array.from(r)}function Du(e){return Array.isArray(e)?e.flatMap(t=>{let n=Au(t);return n?[n]:[]}):[]}function Au(e){let t=Ye(e.filePath),n=Nu(e.blockStartLine),r=Ye(e.expectedFileHash),i=Ye(e.targetMarker),a=Ye(e.rawBlockHash),o=Xe(e.targetNoteId);if(!t||!n||!r||!i||!a||!o)return null;let u=Pu(e.markerKind);if(e.markerKind!==void 0&&!u)return null;let s=e.targetGroupId===void 0?void 0:Ye(e.targetGroupId);return e.targetGroupId!==void 0&&!s?null:{filePath:t,blockStartLine:n,expectedFileHash:r,targetMarker:i,rawBlockHash:a,targetNoteId:o,markerKind:u,targetGroupId:s}}function Eu(e,t){return Array.isArray(e.groupIds)?e.groupIds.filter(n=>typeof n=="string"&&!!t[n]):[]}function _u(e){let t={},n=e??{};for(let r in n){let i=n[r];t[r]=i}return t}function Lu(e){let t={},n=e??{};for(let r in n){let i=n[r];t[r]=i}return t}function Iu(e){let t={},n=e??{};for(let r in n){let i=n[r];t[r]=i}return t}function Xe(e){return typeof e=="number"&&Number.isInteger(e)&&e>0?e:void 0}function Nu(e){return typeof e=="number"&&Number.isInteger(e)&&e>0?e:void 0}function Ye(e){return typeof e=="string"&&e.trim().length>0?e:void 0}function Pu(e){return e==="card-id"||e==="group-gi"?e:void 0}function Ai(e){e.addCommand({id:"sync-current-file-to-anki",name:g("commands.syncCurrentFileToAnki"),callback:()=>{e.runSyncCurrentFile()}}),e.addCommand({id:"sync-vault-to-anki",name:g("commands.syncVaultToAnki"),callback:()=>{e.runSyncVault()}}),e.addCommand({id:"clear-current-file-synced-cards",name:g("commands.clearCurrentFileSyncedCards"),callback:()=>{e.runClearCurrentFileSyncedCards()}}),e.addCommand({id:"cleanup-empty-decks",name:g("commands.cleanupEmptyDecks"),callback:()=>{e.runCleanupEmptyDecks()}})}var Je=require("obsidian");var It=class extends Je.Modal{constructor(n,r){super(n);this.candidateDeckNames=r;this.deckToggles=new Map;this.selectedDeckNames=new Set;this.resolvedValue=null}openAndGetSelection(){return new Promise(n=>{this.resolver=n,this.open()})}onOpen(){let{contentEl:n}=this;n.empty(),n.createEl("h2",{text:g("modal.emptyDeck.title")}),n.createEl("p",{text:g("modal.emptyDeck.description")});for(let i of this.candidateDeckNames)new Je.Setting(n).setName(i).addToggle(a=>{this.deckToggles.set(i,a),a.setValue(!1).onChange(o=>{o?this.selectedDeckNames.add(i):this.selectedDeckNames.delete(i),this.refreshSelectionState()})});let r=new Je.Setting(n).addButton(i=>{i.setButtonText(g("modal.emptyDeck.selectAll")).onClick(()=>{this.selectAllDecks()})}).addButton(i=>{i.setButtonText(g("modal.emptyDeck.clearAll")).onClick(()=>{this.clearSelectedDecks()})}).addButton(i=>{i.setButtonText(g("modal.emptyDeck.invert")).onClick(()=>{this.invertSelectedDecks()})}).addButton(i=>{i.setButtonText(g("modal.emptyDeck.cancel")).onClick(()=>{this.finish(null)})}).addButton(i=>{this.deleteButton=i,i.setButtonText(g("modal.emptyDeck.deleteSelected")).setCta().onClick(()=>{this.finish(Array.from(this.selectedDeckNames))})});this.selectionCountEl=r.settingEl.createSpan({text:this.getSelectionCountText()}),this.selectionCountEl.addClass("anki-helper-empty-deck-selection-count"),this.refreshSelectionState()}onClose(){let n=this.resolver,r=this.resolvedValue;this.contentEl.empty(),this.deckToggles.clear(),this.deleteButton=void 0,this.selectionCountEl=void 0,this.resolver=void 0,this.resolvedValue=null,this.selectedDeckNames.clear(),n?.(r)}finish(n){this.resolvedValue=n,this.close()}selectAllDecks(){this.selectedDeckNames.clear();for(let n of this.candidateDeckNames)this.selectedDeckNames.add(n),this.deckToggles.get(n)?.setValue(!0);this.refreshSelectionState()}clearSelectedDecks(){this.selectedDeckNames.clear();for(let n of this.candidateDeckNames)this.deckToggles.get(n)?.setValue(!1);this.refreshSelectionState()}invertSelectedDecks(){let n=new Set;for(let r of this.candidateDeckNames){let i=!this.selectedDeckNames.has(r);this.deckToggles.get(r)?.setValue(i),i&&n.add(r)}this.selectedDeckNames.clear();for(let r of n)this.selectedDeckNames.add(r);this.refreshSelectionState()}refreshSelectionState(){this.deleteButton?.setDisabled(this.selectedDeckNames.size===0),this.selectionCountEl&&(this.selectionCountEl.textContent=this.getSelectionCountText())}getSelectionCountText(){return g("modal.emptyDeck.selectionCount",{selected:this.selectedDeckNames.size,total:this.candidateDeckNames.length})}};var zn=require("obsidian");var Nt=class{info(t){new zn.Notice(t,5e3)}error(t){new zn.Notice(t,8e3)}showSyncSummary(t,n){let r=se(),o=[g(t==="currentFile"?"notice.summary.currentFileSync":"notice.summary.vaultSync",{scannedFiles:n.scannedFiles,scannedCards:n.scannedCards,created:n.created,rebuilt:n.rebuilt,updated:n.updated,migratedNoteTypes:n.migratedNoteTypes,migratedDecks:n.migratedDecks,orphaned:n.orphaned,uploadedMedia:n.uploadedMedia,skippedUnchangedCards:n.skippedUnchangedCards})];n.markerWriteConflictFiles.length>0&&o.push(g("notice.summary.markerWriteConflicts",{files:de(r,n.markerWriteConflictFiles)})),n.warnings.length>0&&o.push(g("notice.summary.warningsCount",{count:n.warnings.length})),this.info(o.join(" "));for(let u of n.warnings.slice(0,3))this.info(this.renderDeckWarning(u))}showClearCurrentFileSummary(t){let n=se(),r=[g("notice.summary.clearCurrentFile",{trackedCards:t.trackedCards,trackedGroups:t.trackedGroups,deletedNotes:t.deletedNotes,removedMarkers:t.removedMarkers,removedCardMarkers:t.removedCardMarkers,removedGroupMarkers:t.removedGroupMarkers,deletedLocalRecords:t.deletedLocalRecords})];t.conflictFiles.length>0&&r.push(g("notice.summary.markerRemovalConflicts",{files:de(n,t.conflictFiles)})),t.failureFiles.length>0&&r.push(g("notice.summary.failures",{items:oi(t.failureFiles)})),this.info(r.join(" "))}showCleanupEmptyDecksSummary(t){let n=se(),r=[g("notice.summary.cleanupEmptyDecks",{candidateCount:t.candidateCount,selectedCount:t.selectedCount,deletedCount:t.deletedCount,skippedCount:t.skippedDeckNames.length})];t.skippedDeckNames.length>0&&r.push(g("notice.summary.skippedDecks",{decks:de(n,t.skippedDeckNames)})),this.info(r.join(" "))}renderDeckWarning(t){return g(Ru(t.code),t.params)}};function Ru(e){switch(e){case"deck_conflict_yaml_body":return"warnings.deck.conflictYamlBody";case"deck_multiple_body_declarations":return"warnings.deck.multipleBodyDeclarations";case"deck_invalid_folder_segment":return"warnings.deck.invalidFolderSegment";case"deck_fallback_default":return"warnings.deck.fallbackDefault"}}var G=require("obsidian");function Ei(e){return e==="cloze"}function _i(e){return e==="basic"}var Ne=class{map(t,n,r){return this.mapRenderedCard(t,n,r)}mapRenderedCard(t,n,r){let i=this.getRequiredMapping(t,r);return this.validateMapping(i,n),_i(t.type)?this.mapBasic(t,i):this.mapCloze(t,i)}suggest(t,n,r,i=Date.now()){if(t==="qa-group")throw new Error("QaGroupFieldMappingService must be used for qa-group mappings.");return Bu(t)?{cardType:t,modelName:n,loadedFieldNames:[...r],titleField:Pt(r,["Front","Title"])??r[0],bodyField:Pt(r,["Back","Body","Answer"])??r.find(a=>a!==(Pt(r,["Front","Title"])??r[0])),loadedAt:i}:{cardType:t,modelName:n,loadedFieldNames:[...r],mainField:Pt(r,["Text","Body","Content"])??r[0],loadedAt:i}}validateMapping(t,n){if(!Dn(t)&&!ti(t))throw new Error("QaGroupFieldMappingService validates qa-group mappings.");let r=new Set(n.fieldNames);if(Dn(t)){if(!t.titleField||!t.bodyField)throw new S(Li(t.cardType),{modelName:t.modelName});if(t.titleField===t.bodyField)throw new S(qu(),{modelName:t.modelName});let i=[t.titleField,t.bodyField].filter(a=>!r.has(a));if(i.length>0)throw new S("errors.noteFieldMapping.stale",{modelName:t.modelName,fields:i.map(a=>`"${a}"`)});return}if(!t.mainField)throw new S("errors.noteFieldMapping.incompleteSavedMapping.cloze",{modelName:t.modelName});if(!r.has(t.mainField))throw new S("errors.noteFieldMapping.stale",{modelName:t.modelName,fields:[`"${t.mainField}"`]})}mapBasic(t,n){let r=n.titleField,i=n.bodyField;if(!r||!i)throw new S(Li(t.type),{modelName:t.noteModel});return{[r]:t.renderedFields.title,[i]:t.renderedFields.body}}mapCloze(t,n){if(!n.mainField)throw new S("errors.noteFieldMapping.incompleteSavedMapping.cloze",{modelName:t.noteModel});return{[n.mainField]:`${t.renderedFields.title}

${t.renderedFields.body}`}}getRequiredMapping(t,n){let r=n[B(t.type,t.noteModel)];if(!r)throw new S(Gu(t.type),{modelName:t.noteModel});return r}};function Bu(e){return e==="basic"}function Gu(e){return e==="cloze"?"errors.noteFieldMapping.missingSavedMapping.cloze":"errors.noteFieldMapping.missingSavedMapping.basic"}function Li(e){return e==="cloze"?"errors.noteFieldMapping.incompleteSavedMapping.cloze":"errors.noteFieldMapping.incompleteSavedMapping.basic"}function qu(){return"errors.noteFieldMapping.titleBodyMustDiffer.basic"}function Pt(e,t){return e.find(n=>t.some(r=>r.toLowerCase()===n.toLowerCase()))}function Pi(e,t){let n=new Set(Hn(t));return e.map(r=>Bi(r,n,!1))}function Ri(e,t,n,r){let i=zu(e),a=new Set(Hn(t).filter(u=>i.nodeByPath.has(u)));if(!i.nodeByPath.has(n))return Rt(e,Array.from(a));if(r)return Ii(n,a,i.parentByPath)||(Ni(a,n),a.add(n)),Rt(e,Array.from(a));let o=Ii(n,a,i.parentByPath);if(o&&(a.delete(o),o!==n)){let u=i.nodeByPath.get(o);if(u)for(let s of qi(u,n))a.add(s)}return Ni(a,n),Rt(e,Array.from(a))}function Rt(e,t){let n=new Set(Hn(t));return e.flatMap(r=>Gi(r,n).paths)}function Bi(e,t,n){let r=n||t.has(e.path),i=e.children.map(o=>Bi(o,t,r));if(r)return{...e,checked:!0,indeterminate:!1,children:i};let a=i.some(o=>o.checked||o.indeterminate);return{...e,checked:!1,indeterminate:a,children:i}}function Gi(e,t){return t.has(e.path)?{paths:[e.path]}:e.children.length===0?{paths:[]}:{paths:e.children.map(r=>Gi(r,t)).flatMap(r=>r.paths)}}function zu(e){let t=new Map,n=new Map,r=(i,a)=>{t.set(i.path,i),n.set(i.path,a);for(let o of i.children)r(o,i.path)};for(let i of e)r(i,void 0);return{nodeByPath:t,parentByPath:n}}function Ii(e,t,n){let r=e;for(;r;){if(t.has(r))return r;r=n.get(r)}}function Ni(e,t){for(let n of Array.from(e))(n===t||zi(n,t))&&e.delete(n)}function qi(e,t){if(e.path===t)return[];let n=e.children.find(i=>i.path===t||zi(t,i.path));if(!n)return[e.path];let r=[];for(let i of e.children){if(i.path===n.path){r.push(...qi(i,t));continue}r.push(i.path)}return r}function Hn(e){return Array.from(new Set(e.map(t=>Hu(t)).filter(Boolean)))}function Hu(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function zi(e,t){return e===t||e.startsWith(`${t}/`)}var Hi={key:"settings.scope.loading"},Ou=500,Oi=["card-types","sync-content","deck","scope","commands"],Bt=["basic","qa-group","cloze","cloze-all"],Wu=8,$u=64,Wi="--ahs-settings-page-header-height",Uu="--ahs-settings-sticky-card-gap",Qu=`${$u}px`,Vu=`${Wu}px`,ju="anki-heading-sync-settings",$i="ahs-is-hidden";function w(e,...t){e.classList.add(...t)}function Ku(e,t,n){if(n){e.classList.add(t);return}e.classList.remove(t)}var Gt=class extends G.PluginSettingTab{constructor(n){super(n.app,n);this.noteFieldMappingService=new Ne;this.qaGroupFieldMappingService=new ce;this.availableNoteModels=[];this.draftMappings={};this.loadedModelDetails={};this.debouncedTextSaves=new Map;this.textDraftValues=new Map;this.cardShells=new Map;this.expandedCardIds=new Set;this.expandedFolderPaths=new Set;this.folderTree=[];this.folderTreeStatus=Hi;this.folderTreeLoadPromise=null;this.hasLoadedFolderTree=!1;this.displayInitialized=!1;this.ankiConfigLoading=!1;this.cardTypeStatusOverride=null;this.noteTypeCacheCheckStatus="idle";this.noteTypeCacheCheckPromise=null;this.detectedAnkiNoteTypeCache=null;this.noteTypeCacheCheckToken=0;this.pageHeaderResizeObserver=null;this.scopeNeedsSelectedAncestorExpansion=!0;this.plugin=n}hide(){this.disconnectPageHeaderResizeObserver(),super.hide(),this.displayInitialized=!1,this.cardShells.clear(),this.flushDebouncedTextSaves(),this.cardTypeStatusOverride=null,this.noteTypeCacheCheckStatus="idle",this.noteTypeCacheCheckPromise=null,this.detectedAnkiNoteTypeCache=null,this.noteTypeCacheCheckToken+=1,this.scopeNeedsSelectedAncestorExpansion=!0}display(){let{containerEl:n}=this,r=n.scrollTop;if(n.classList.add(ju),!this.displayInitialized){n.style.setProperty(Wi,Qu),n.style.setProperty(Uu,Vu),n.empty();let i=n.createDiv();i.dataset.settingsPageHeader="true",w(i,"ahs-settings-page-header");let a=i.createDiv();a.dataset.settingsPageHeaderMask="true",w(a,"ahs-settings-page-header-mask");let o=new G.Setting(i).setName(g("settings.pluginTitle")).setHeading();w(o.settingEl,"ahs-settings-page-title-setting"),w(o.nameEl,"ahs-settings-page-title"),this.observePageHeaderHeight(i);let u=n.createDiv();u.dataset.settingsCardsContainer="true",this.initializeCards(u),this.displayInitialized=!0}for(let i of Oi)this.renderCard(i);n.scrollTop=r}markActionButton(n){n.setCta()}initializeCards(n){this.cardShells.clear();for(let r of Oi){let i=n.createDiv();i.dataset.settingsCard=r;let a=i.createEl("button");a.type="button",a.dataset.settingsCardToggle=r,w(a,"ahs-settings-card-toggle"),a.addEventListener("click",()=>{this.toggleCard(r)});let o=i.createDiv();o.dataset.settingsCardBody=r,w(o,"ahs-settings-card-body",$i),this.cardShells.set(r,{cardEl:i,headerEl:a,bodyEl:o})}}toggleCard(n){this.expandedCardIds.has(n)?this.expandedCardIds.delete(n):this.expandedCardIds.add(n),this.renderCard(n)}renderCard(n){let r=this.cardShells.get(n);if(!r)return;let i=this.expandedCardIds.has(n);if(r.headerEl.textContent=`${i?"\u25BE":"\u25B8"} ${this.getCardTitle(n)}`,r.headerEl.setAttr("aria-expanded",String(i)),Ku(r.bodyEl,$i,!i),r.bodyEl.empty(),!!i){if(n==="card-types"){this.renderCardTypesCard(r.bodyEl);return}if(n==="sync-content"){this.renderSyncContentCard(r.bodyEl);return}if(n==="scope"){this.renderScopeCard(r.bodyEl);return}if(n==="deck"){this.renderDeckCard(r.bodyEl);return}this.renderCommandsCard(r.bodyEl)}}observePageHeaderHeight(n){this.disconnectPageHeaderResizeObserver(),this.updatePageHeaderHeight(n),!(typeof ResizeObserver>"u")&&(this.pageHeaderResizeObserver=new ResizeObserver(()=>{this.updatePageHeaderHeight(n)}),this.pageHeaderResizeObserver.observe(n))}updatePageHeaderHeight(n){let r=n.getBoundingClientRect().height;!Number.isFinite(r)||r<=0||this.containerEl.style.setProperty(Wi,`${Math.round(r)}px`)}disconnectPageHeaderResizeObserver(){this.pageHeaderResizeObserver?.disconnect(),this.pageHeaderResizeObserver=null}renderCardTypesCard(n){this.hydrateVisibleCardTypeCaches(),this.maybeStartNoteTypeCacheCheck();let r=n.createDiv();w(r,"ahs-settings-action-row");let i=new G.ButtonComponent(r).setButtonText(this.ankiConfigLoading?g("settings.cards.cardTypes.loadAnki.loading"):g("settings.cards.cardTypes.loadAnki.button")).setCta().setDisabled(this.ankiConfigLoading).onClick(()=>this.loadAnkiCardTypeConfig());i.buttonEl.dataset.cardTypesRefresh="true",r.createSpan({text:`${g("settings.cards.cardTypes.statusLabel")}${Le(this.getCardTypeStatusMessage())}`});let a=n.createDiv();a.dataset.cardTypeList="true",w(a,"ahs-settings-card-list");for(let o of Bt)this.renderCardTypeBlock(a,o)}renderCardTypeBlock(n,r){let i=this.plugin.settings.cardTypeConfigs[r],a=n.createDiv();a.dataset.cardTypeConfig=r,w(a,"ahs-settings-card-type-block");let o=a.createDiv();w(o,"ahs-settings-card-type-header");let u=o.createEl("input");u.type="checkbox",u.checked=i.enabled,u.dataset.cardTypeEnabled=r,u.addEventListener("change",()=>{this.saveCardTypeConfig(r,{enabled:u.checked})});let s=o.createEl("strong",{text:this.getCardTypeLabel(r)});w(s,"ahs-settings-card-type-title");let d=a.createDiv();w(d,"ahs-settings-recognition-row");let c=this.createInlineControlGroup(d,g("settings.cards.cardTypes.labels.headingLevel")),l=this.createSelect(c,`card-type-heading:${r}`);l.dataset.cardTypeHeading=r,w(l,"ahs-settings-heading-select");for(let b=1;b<=6;b+=1)this.appendOption(l,String(b),`H${b}`);l.value=String(i.headingLevel),l.addEventListener("change",()=>{this.saveCardTypeConfig(r,{headingLevel:Number(l.value)})});let m=this.createInlineControlGroup(d,g("settings.cards.cardTypes.labels.extraMarker")).createEl("input");if(m.type="text",m.dataset.cardTypeMarker=r,m.placeholder=g("settings.cards.cardTypes.markerPlaceholder"),w(m,"ahs-settings-marker-input"),m.value=this.getDraftValue(`card-type-marker:${r}`,i.extraMarker),m.addEventListener("input",()=>{this.scheduleDebouncedTextSave(`card-type-marker:${r}`,m.value,async b=>{await this.saveCardTypeConfig(r,{extraMarker:b})&&this.textDraftValues.delete(`card-type-marker:${r}`)})}),r==="cloze-all"){let b=a.createEl("p",{text:g("settings.cards.cardTypes.sharedClozeMappingHint")});b.dataset.cardTypeSharedHint=r,w(b,"ahs-settings-muted-text");return}let p=a.createDiv();w(p,"ahs-settings-grid-row");let F=this.createGridControlSlot(p,g("settings.cards.cardTypes.labels.noteType")),k=this.createSelect(F,`card-type-note-type:${r}`);k.dataset.cardTypeNoteType=r,this.applyFluidEllipsis(k);for(let b of this.getSelectableNoteModels(i.noteType))this.appendOption(k,b,b);k.value=i.noteType,k.disabled=this.ankiConfigLoading,k.addEventListener("change",()=>{this.saveCardTypeConfig(r,{noteType:k.value})}),this.renderCardTypeFieldControls(p,r)}renderCardTypeFieldControls(n,r){if(r==="qa-group"){this.renderQaGroupFieldControls(n,r);return}let i=this.getCurrentMappingForConfig(r);if(r==="cloze"){let c=this.createGridControlSlot(n,g("settings.cards.cardTypes.labels.mainField")),l=this.createFieldSelect(c,`card-type-question-field:${r}`),f=i&&"mainField"in i?i:void 0;l.dataset.cardTypeQuestionField=r,this.applyFluidEllipsis(l),this.populateFieldSelect(l,f?.loadedFieldNames??[],f?.mainField),l.addEventListener("change",()=>{this.saveFieldMapping(r,{mainField:l.value||void 0})});return}let a=this.createGridControlSlot(n,g("settings.cards.cardTypes.labels.questionField")),o=this.createFieldSelect(a,`card-type-question-field:${r}`),u=i&&"bodyField"in i?i:void 0;o.dataset.cardTypeQuestionField=r,this.applyFluidEllipsis(o),this.populateFieldSelect(o,u?.loadedFieldNames??[],u?.titleField),o.addEventListener("change",()=>{this.saveFieldMapping(r,{titleField:o.value||void 0})});let s=this.createGridControlSlot(n,g("settings.cards.cardTypes.labels.answerField")),d=this.createFieldSelect(s,`card-type-answer-field:${r}`);d.dataset.cardTypeAnswerField=r,this.applyFluidEllipsis(d),this.populateFieldSelect(d,u?.loadedFieldNames??[],u?.bodyField),d.addEventListener("change",()=>{this.saveFieldMapping(r,{bodyField:d.value||void 0})})}renderQaGroupFieldControls(n,r){let i=this.plugin.settings.cardTypeConfigs[r].noteType.trim(),a=this.getQaGroupFieldState(r),o=a.mapping?this.getQaGroupSelectedFields(a.mapping):void 0,u=this.createGridControlSlot(n,g("settings.cards.cardTypes.labels.qaGroupTitleField"));if(a.mapping){let l=this.createFieldSelect(u,`card-type-qa-group-title-field:${r}`);l.dataset.qaGroupTitleField=r,this.applyFluidEllipsis(l),this.populateFieldSelect(l,a.mapping.loadedFieldNames,a.mapping.titleField);let f=n.createDiv();f.dataset.qaGroupPairRow=r,w(f,"ahs-settings-qa-group-pair-row");let m=this.createGridControlSlot(f,g("settings.cards.cardTypes.labels.qaGroupFirstQuestionField")),p=this.createFieldSelect(m,`card-type-qa-group-first-question-field:${r}`);p.dataset.qaGroupFirstQuestionField=r,this.applyFluidEllipsis(p),this.populateFieldSelect(p,a.mapping.loadedFieldNames,o?.firstQuestionField);let F=this.createGridControlSlot(f,g("settings.cards.cardTypes.labels.qaGroupFirstAnswerField")),k=this.createFieldSelect(F,`card-type-qa-group-first-answer-field:${r}`);k.dataset.qaGroupFirstAnswerField=r,this.applyFluidEllipsis(k),this.populateFieldSelect(k,a.mapping.loadedFieldNames,o?.firstAnswerField);let b=()=>{this.saveQaGroupFieldSelection(r,{titleField:l.value||void 0,firstQuestionField:p.value||void 0,firstAnswerField:k.value||void 0})};l.addEventListener("change",b),p.addEventListener("change",b),k.addEventListener("change",b);let x=f.createSpan({text:g("settings.cards.cardTypes.qaGroup.configuredSlots",{count:a.mapping.slots.length})});x.dataset.qaGroupSlotSummary=r,w(x,"ahs-settings-nowrap-start"),this.applyFluidEllipsis(x)}else{u.createSpan({text:i.length>0?g("settings.cards.cardTypes.qaGroup.unavailable"):g("settings.cards.cardTypes.qaGroup.noModel")}).dataset.qaGroupTitleField=r;let l=n.createDiv();l.dataset.qaGroupPairRow=r,w(l,"ahs-settings-qa-group-pair-row");let f=this.createGridControlSlot(l,g("settings.cards.cardTypes.labels.qaGroupFirstQuestionField"));f.createSpan({text:i.length>0?g("settings.cards.cardTypes.qaGroup.unavailable"):g("settings.cards.cardTypes.qaGroup.noModel")}).dataset.qaGroupFirstQuestionField=r;let m=this.createGridControlSlot(l,g("settings.cards.cardTypes.labels.qaGroupFirstAnswerField"));m.createSpan({text:i.length>0?g("settings.cards.cardTypes.qaGroup.unavailable"):g("settings.cards.cardTypes.qaGroup.noModel")}).dataset.qaGroupFirstAnswerField=r;let p=l.createSpan({text:i.length>0?g("settings.cards.cardTypes.qaGroup.unavailable"):g("settings.cards.cardTypes.qaGroup.noModel")});p.dataset.qaGroupSlotSummary=r,w(p,"ahs-settings-nowrap-start"),this.applyFluidEllipsis(p)}if(a.error){let l=n.createDiv({text:Le(a.error)});l.dataset.qaGroupError=r,w(l,"ahs-settings-grid-full");return}if(!a.mapping||a.mapping.warnings.length===0)return;let s=n.createDiv();s.dataset.qaGroupWarnings=r,w(s,"ahs-settings-grid-full","ahs-settings-warnings"),s.createEl("strong",{text:g("settings.cards.cardTypes.labels.qaGroupWarnings")});for(let l of a.mapping.warnings)s.createDiv({text:this.renderQaGroupWarning(l)}).dataset.qaGroupWarning=r;let d=s.createEl("label");w(d,"ahs-settings-inline-check");let c=d.createEl("input");c.type="checkbox",c.checked=Ln(a.mapping.warnings,a.mapping.acceptedWarnings),c.dataset.qaGroupWarningAccept=r,c.addEventListener("change",()=>{this.saveQaGroupWarningAcceptance(r,c.checked)}),d.createSpan({text:g("settings.cards.cardTypes.qaGroup.acceptWarnings")})}renderSyncContentCard(n){let r=this.createSyncContentSection(n,"body-range",g("settings.cards.syncContent.sections.bodyRange"));new G.Setting(r).setName(g("settings.cardAnswerCutoffMode.name")).setDesc(g("settings.cardAnswerCutoffMode.desc")).addDropdown(u=>{u.addOption("heading-block",g("settings.cardAnswerCutoffMode.options.headingBlock")),u.addOption("double-blank-lines",g("settings.cardAnswerCutoffMode.options.doubleBlankLines")),u.setValue(this.plugin.settings.cardAnswerCutoffMode).onChange(s=>{this.plugin.updateSettings({cardAnswerCutoffMode:s})})});let i=this.createSyncContentSection(n,"backlink",g("settings.cards.syncContent.sections.backlink"));new G.Setting(i).setName(g("settings.syncOptions.addObsidianBacklink.name")).setDesc(g("settings.syncOptions.addObsidianBacklink.desc")).addToggle(u=>{u.setValue(this.plugin.settings.addObsidianBacklink).onChange(s=>{this.plugin.updateSettings({addObsidianBacklink:s})})}),new G.Setting(i).setName(g("settings.syncOptions.obsidianBacklinkLabel.name")).setDesc(g("settings.syncOptions.obsidianBacklinkLabel.desc")).addText(u=>{u.setPlaceholder(g("settings.syncOptions.obsidianBacklinkLabel.placeholder")).setValue(this.getDraftValue("obsidian-backlink-label",this.plugin.settings.obsidianBacklinkLabel)).onChange(s=>{this.scheduleDebouncedTextSave("obsidian-backlink-label",s,async d=>{let c=d.trim();await this.plugin.updateSettings({obsidianBacklinkLabel:c||Ke}),this.textDraftValues.delete("obsidian-backlink-label")})})}),new G.Setting(i).setName(g("settings.syncOptions.obsidianBacklinkPlacement.name")).setDesc(g("settings.syncOptions.obsidianBacklinkPlacement.desc")).addDropdown(u=>{u.addOption("question-last-line",g("settings.syncOptions.obsidianBacklinkPlacement.options.questionLastLine")),u.addOption("answer-first-line",g("settings.syncOptions.obsidianBacklinkPlacement.options.answerFirstLine")),u.addOption("answer-last-line",g("settings.syncOptions.obsidianBacklinkPlacement.options.answerLastLine")),u.setValue(this.plugin.settings.obsidianBacklinkPlacement).onChange(s=>{this.plugin.updateSettings({obsidianBacklinkPlacement:s})})});let a=this.createSyncContentSection(n,"tags",g("settings.cards.syncContent.sections.tags"));new G.Setting(a).setName(g("settings.syncOptions.syncObsidianTagsToAnki.name")).setDesc(g("settings.syncOptions.syncObsidianTagsToAnki.desc")).addToggle(u=>{u.setValue(this.plugin.settings.syncObsidianTagsToAnki).onChange(s=>{this.plugin.updateSettings({syncObsidianTagsToAnki:s})})}),new G.Setting(a).setName(g("settings.syncOptions.keepPureTagLinesInCardBody.name")).setDesc(g("settings.syncOptions.keepPureTagLinesInCardBody.desc")).addToggle(u=>{u.setValue(this.plugin.settings.keepPureTagLinesInCardBody).onChange(s=>{this.plugin.updateSettings({keepPureTagLinesInCardBody:s})})});let o=this.createSyncContentSection(n,"cloze-special",g("settings.cards.syncContent.sections.clozeSpecial"));new G.Setting(o).setName(g("settings.syncOptions.highlightsToCloze.name")).setDesc(g("settings.syncOptions.highlightsToCloze.desc")).addToggle(u=>{u.setValue(this.plugin.settings.convertHighlightsToCloze).onChange(s=>{this.plugin.updateSettings({convertHighlightsToCloze:s})})})}createSyncContentSection(n,r,i){let a=n.createDiv();return a.dataset.syncContentSection=r,w(a,"ahs-settings-section"),this.createSectionHeading(a,"syncContentSectionTitle",r,i),a}renderScopeCard(n){if(new G.Setting(n).setName(g("settings.scope.name")).setDesc(Yu(this.plugin.settings.scopeMode)).addDropdown(s=>{s.addOption("all",g("settings.scope.option.all")).addOption("include",g("settings.scope.option.include")).addOption("exclude",g("settings.scope.option.exclude")).setValue(this.plugin.settings.scopeMode).onChange(d=>{d!=="all"&&d!=="include"&&d!=="exclude"||this.updateScopeMode(d)})}),!gt(this.plugin.settings.scopeMode,this.plugin.settings.includeFolders)){let s=n.createEl("p",{text:g("settings.scope.unconfiguredWarning")});s.dataset.scopeWarning="unconfigured",w(s,"ahs-settings-warning-text")}if(this.plugin.settings.scopeMode==="all")return;let r=n.createDiv(),i=new G.ButtonComponent(r).setButtonText(g("settings.cards.scope.refreshFolders")).setCta().setDisabled(!!this.folderTreeLoadPromise).onClick(()=>{this.refreshFolderTree()});if(i.buttonEl.dataset.scopeRefreshFolders="true",this.ensureFolderTreeLoaded(),n.createEl("p",{text:Ju(this.plugin.settings.scopeMode)}),this.folderTreeLoadPromise||this.folderTree.length===0){n.createEl("p",{text:Le(this.folderTreeStatus)});return}this.expandSelectedFolderAncestorsIfNeeded(this.plugin.settings.scopeMode);let a=this.getSelectedFoldersForScopeMode(this.plugin.settings.scopeMode),o=Pi(this.folderTree,a),u=n.createDiv();u.dataset.scopeTree="true",w(u,"ahs-settings-folder-tree");for(let s of o)this.renderFolderNode(u,s,this.plugin.settings.scopeMode,0)}renderDeckCard(n){let r=this.createDeckSection(n,"folder-mapping",g("settings.cards.deck.sections.folderMapping"));new G.Setting(r).setName(g("settings.deck.folderDeckMode.name")).setDesc(g("settings.deck.folderDeckMode.desc")).addDropdown(o=>{this.populateFolderDeckModeDropdown(o,this.plugin.settings.folderDeckMode),o.onChange(u=>{u!=="off"&&u!=="folder"&&u!=="folder-and-file"||this.plugin.updateSettings({folderDeckMode:u})})}),this.renderDeckExampleBlock(r);let i=this.createDeckSection(n,"file-deck",g("settings.cards.deck.sections.fileDeck"));new G.Setting(i).setName(g("settings.deck.fileDeckEnabled.name")).setDesc(g("settings.deck.fileDeckEnabled.desc")).addToggle(o=>{o.setValue(this.plugin.settings.fileDeckEnabled).onChange(async u=>{await this.plugin.updateSettings({fileDeckEnabled:u}),this.renderCard("deck")})}),this.plugin.settings.fileDeckEnabled&&(new G.Setting(i).setName(g("settings.deck.marker.name")).setDesc(g("settings.deck.marker.desc")).addText(o=>{o.setValue(this.getDraftValue("file-deck-marker",this.plugin.settings.fileDeckMarker)).onChange(u=>{this.scheduleDebouncedTextSave("file-deck-marker",u,async s=>{let d=s.trim();if(!d){this.textDraftValues.delete("file-deck-marker"),this.renderCard("deck");return}await this.plugin.updateSettings({fileDeckMarker:d}),this.textDraftValues.delete("file-deck-marker")})})}),new G.Setting(i).setName(g("settings.deck.template.name")).setDesc(g("settings.deck.template.desc")).addText(o=>{o.setValue(this.getDraftValue("file-deck-template",this.plugin.settings.fileDeckTemplate)).onChange(u=>{this.scheduleDebouncedTextSave("file-deck-template",u,async s=>{let d=s.trim();if(!d){this.textDraftValues.delete("file-deck-template"),this.renderCard("deck");return}await this.plugin.updateSettings({fileDeckTemplate:d}),this.textDraftValues.delete("file-deck-template")})})}),new G.Setting(i).setName(g("settings.deck.insertLocation.name")).setDesc(g("settings.deck.insertLocation.desc")).addDropdown(o=>{this.populateFileDeckInsertLocationDropdown(o,this.plugin.settings.fileDeckInsertLocation),o.onChange(u=>{u!=="yaml"&&u!=="body"||this.plugin.updateSettings({fileDeckInsertLocation:u})})}),new G.Setting(i).setName(g("settings.deck.insertTemplate.name")).setDesc(g("settings.deck.insertTemplate.desc")).addButton(o=>{this.markActionButton(o),o.setButtonText(g("settings.deck.insertTemplate.button")).onClick(()=>{this.plugin.insertDeckTemplateToCurrentFile()})}));let a=this.createDeckSection(n,"default-deck",g("settings.cards.deck.sections.defaultDeck"));new G.Setting(a).setName(g("settings.deck.defaultDeck.name")).setDesc(g("settings.deck.defaultDeck.desc")).addText(o=>{o.setValue(this.getDraftValue("default-deck",this.plugin.settings.defaultDeck)).onChange(u=>{this.scheduleDebouncedTextSave("default-deck",u,async s=>{let d=s.trim();if(!d){this.textDraftValues.delete("default-deck"),this.renderCard("deck");return}await this.plugin.updateSettings({defaultDeck:d}),this.textDraftValues.delete("default-deck")})})}),this.createDeckHelperText(a,g("settings.deck.fallbackDesc"),"fallback"),this.createDeckPriorityFooter(n)}renderDeckExampleBlock(n){let r=n.createDiv();r.dataset.deckExampleBlock="true",w(r,"ahs-settings-deck-example-block");let i=r.createEl("strong",{text:g("settings.deck.examplesTitle")});w(i,"ahs-settings-small-title");for(let a of[g("settings.deck.folderExample"),g("settings.deck.folderAndFileExample")]){let o=r.createDiv({text:a});o.dataset.deckExampleRow="true",w(o,"ahs-settings-helper-text")}}createDeckHelperText(n,r,i){let a=n.createDiv({text:r});return a.dataset.deckHelperText=i,w(a,"ahs-settings-helper-text"),a}createDeckPriorityFooter(n){let r=this.createDeckHelperText(n,g("settings.deck.priorityDesc"),"priority");r.dataset.deckPriorityFooter="true",w(r,"ahs-settings-helper-text-priority")}createDeckSection(n,r,i){let a=n.createDiv();return a.dataset.deckSection=r,w(a,"ahs-settings-section"),this.createSectionHeading(a,"deckSectionTitle",r,i),a}renderCommandsCard(n){n.createEl("p",{text:g("settings.cards.commands.desc")});let r=n.createEl("ul");for(let[i,a]of[[g("commands.syncCurrentFileToAnki"),g("settings.cards.commands.items.syncCurrentFile")],[g("commands.syncVaultToAnki"),g("settings.cards.commands.items.syncVault")],[g("commands.clearCurrentFileSyncedCards"),g("settings.cards.commands.items.clearCurrentFile")],[g("commands.cleanupEmptyDecks"),g("settings.cards.commands.items.cleanupDecks")]])r.createEl("li",{text:`${i}: ${a}`})}async saveCardTypeConfig(n,r){let i={...this.plugin.settings.cardTypeConfigs,[n]:{...this.plugin.settings.cardTypeConfigs[n],...r}};try{pe(Ce({...this.plugin.settings,cardTypeConfigs:i}))}catch(a){return this.cardTypeStatusOverride=ye(a,"settings.cards.cardTypes.failedSave"),this.renderCard("card-types"),!1}if(this.cardTypeStatusOverride=null,await this.plugin.updateSettings({cardTypeConfigs:i}),n==="qa-group"&&typeof r.noteType=="string"){await this.syncQaGroupMappingFromCache(i[n].noteType);let a=B("qa-group",i[n].noteType);if(!this.plugin.settings.noteFieldMappings[a]){let o=this.plugin.settings.ankiModelFieldCache[i[n].noteType];if(o){let u=this.qaGroupFieldMappingService.suggest(i[n].noteType,o.fieldNames,o.loadedAt);await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[a]:u}})}}}return(n==="basic"||n==="cloze")&&typeof r.noteType=="string"&&await this.syncFieldMappingFromCache(n),this.renderCard("card-types"),!0}async saveFieldMapping(n,r){let i=this.getCurrentMappingForConfig(n),a=this.getRuntimeCardType(n),o=this.plugin.settings.cardTypeConfigs[n].noteType,u=B(a,o),s={...i??this.createFallbackMapping(a,o),...r};this.cardTypeStatusOverride=null,this.draftMappings[u]=s,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[u]:{...s,loadedFieldNames:[...s.loadedFieldNames]}}}),this.renderCard("card-types")}async loadAnkiCardTypeConfig(){this.noteTypeCacheCheckToken+=1,this.noteTypeCacheCheckPromise=null,this.cardTypeStatusOverride=null,this.noteTypeCacheCheckStatus=this.resolveManualRefreshCacheStatus(),this.ankiConfigLoading=!0,this.renderCard("card-types");try{let n=await this.plugin.listNoteModels(),r=Qi(n);this.availableNoteModels.splice(0,this.availableNoteModels.length,...r);let i=await this.plugin.getModelFieldNamesByModelNames(r),a=Date.now(),o=Object.entries(i).reduce((s,[d,c])=>(s[d]={fieldNames:[...c],loadedAt:a},s),{});await this.plugin.updateSettings({ankiNoteTypeCache:this.getAvailableNoteModels(),ankiModelFieldCache:o}),this.hydrateVisibleCardTypeCaches(o),await this.syncVisibleFieldMappingsFromCache(o),await this.syncQaGroupMappingFromCache(this.plugin.settings.cardTypeConfigs["qa-group"].noteType,o);let u=this.countConfiguredCardTypes(o);this.detectedAnkiNoteTypeCache=[...r],this.noteTypeCacheCheckStatus="same",this.cardTypeStatusOverride={key:"settings.cards.cardTypes.loadedSummary",params:{noteTypeCount:this.availableNoteModels.length,configuredCount:u}}}catch(n){this.cardTypeStatusOverride=ye(n,"settings.cards.cardTypes.failedLoad")}finally{this.ankiConfigLoading=!1,this.renderCard("card-types")}}maybeStartNoteTypeCacheCheck(){if(this.ankiConfigLoading||this.plugin.settings.ankiNoteTypeCache.length===0||this.noteTypeCacheCheckStatus!=="idle"||this.noteTypeCacheCheckPromise)return;this.noteTypeCacheCheckStatus="checking";let n=++this.noteTypeCacheCheckToken,r=this.checkNoteTypeCacheFreshness(n).finally(()=>{this.noteTypeCacheCheckPromise===r&&(this.noteTypeCacheCheckPromise=null),n===this.noteTypeCacheCheckToken&&this.renderCard("card-types")});this.noteTypeCacheCheckPromise=r}async checkNoteTypeCacheFreshness(n){try{let r=Qi(await this.plugin.listNoteModels());if(n!==this.noteTypeCacheCheckToken)return;this.detectedAnkiNoteTypeCache=r,this.noteTypeCacheCheckStatus=Xu(this.plugin.settings.ankiNoteTypeCache,r)?"same":"changed"}catch{if(n!==this.noteTypeCacheCheckToken)return;this.noteTypeCacheCheckStatus="failed"}}getCardTypeStatusMessage(){if(this.ankiConfigLoading)return{key:"settings.cards.cardTypes.loadAnki.loading"};if(this.cardTypeStatusOverride)return this.cardTypeStatusOverride;let n=this.plugin.settings.ankiNoteTypeCache.length;if(n===0)return{key:"settings.cards.cardTypes.cacheEmpty"};let r=this.countConfiguredCardTypes(this.plugin.settings.ankiModelFieldCache);return this.noteTypeCacheCheckStatus==="changed"?{key:"settings.cards.cardTypes.cacheChanged",params:{cachedCount:n,liveCount:this.detectedAnkiNoteTypeCache?.length??n,configuredCount:r}}:this.noteTypeCacheCheckStatus==="failed"?{key:"settings.cards.cardTypes.cacheCheckFailed",params:{noteTypeCount:n,configuredCount:r}}:{key:"settings.cards.cardTypes.cacheSummary",params:{noteTypeCount:n,configuredCount:r}}}resolveManualRefreshCacheStatus(){return this.noteTypeCacheCheckStatus==="changed"||this.noteTypeCacheCheckStatus==="failed"?this.noteTypeCacheCheckStatus:this.plugin.settings.ankiNoteTypeCache.length>0?"same":"idle"}hydrateVisibleCardTypeCaches(n=this.plugin.settings.ankiModelFieldCache){for(let r of Bt)this.hydrateCardTypeCache(r,n)}hydrateCardTypeCache(n,r){let i=this.getRuntimeCardType(n),a=this.plugin.settings.cardTypeConfigs[n].noteType,o=B(i,a),u=r[a];if(!u)return;let s=this.createCachedModelDetails(a,u.fieldNames);this.loadedModelDetails[o]=s,this.seedDraftMapping(i,a,s,u.loadedAt)}async syncVisibleFieldMappingsFromCache(n=this.plugin.settings.ankiModelFieldCache){for(let r of Bt)r==="qa-group"||r==="cloze-all"||await this.syncFieldMappingFromCache(r,n)}async syncFieldMappingFromCache(n,r=this.plugin.settings.ankiModelFieldCache){let i=this.getRuntimeCardType(n),a=this.plugin.settings.cardTypeConfigs[n].noteType.trim(),o=r[a];if(!o)return;let u=B(i,a),s=this.plugin.settings.noteFieldMappings[u]??this.draftMappings[u],d=s?{...s,loadedFieldNames:[...o.fieldNames],loadedAt:o.loadedAt}:this.noteFieldMappingService.suggest(i,a,o.fieldNames,o.loadedAt);this.draftMappings[u]=d,!On(this.plugin.settings.noteFieldMappings[u],d)&&await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[u]:d}})}createCachedModelDetails(n,r){return{fieldNames:[...r]}}countConfiguredCardTypes(n){return Bt.reduce((r,i)=>{let a=this.plugin.settings.cardTypeConfigs[i];return a.enabled?r+(n[a.noteType]?1:0):r},0)}seedDraftMapping(n,r,i,a=Date.now()){let o=B(n,r),u=this.plugin.settings.noteFieldMappings[o]??this.draftMappings[o];if(n==="qa-group"){if(O(u)){this.draftMappings[o]=this.refreshSavedQaGroupMapping(u,i.fieldNames,a);return}try{this.draftMappings[o]=this.qaGroupFieldMappingService.suggest(r,i.fieldNames,a,void 0,void 0)}catch{delete this.draftMappings[o]}return}if(u){this.draftMappings[o]={...u,loadedFieldNames:[...i.fieldNames],loadedAt:a};return}this.draftMappings[o]=this.noteFieldMappingService.suggest(n,r,i.fieldNames,a)}getSelectableNoteModels(n){let r=this.availableNoteModels.length>0?this.getAvailableNoteModels():[...this.plugin.settings.ankiNoteTypeCache];return r.includes(n)||r.unshift(n),r}getAvailableNoteModels(){return[...this.availableNoteModels]}getCurrentMappingForConfig(n){let r=this.getRuntimeCardType(n),i=this.plugin.settings.cardTypeConfigs[n].noteType,a=B(r,i),o=this.draftMappings[a]??this.plugin.settings.noteFieldMappings[a];if(o)return O(o)?this.cloneQaGroupFieldMapping(o):{...o,loadedFieldNames:[...o.loadedFieldNames]};let u=this.loadedModelDetails[a];if(!u)return;if(r==="qa-group")try{let d=this.plugin.settings.noteFieldMappings[a]??this.draftMappings[a],c=this.qaGroupFieldMappingService.suggest(i,u.fieldNames,Date.now(),O(d)?d.acceptedWarnings:void 0,O(d)?d.titleField:void 0);return this.draftMappings[a]=c,this.cloneQaGroupFieldMapping(c)}catch{return}let s=this.noteFieldMappingService.suggest(r,i,u.fieldNames);return this.draftMappings[a]=s,{...s,loadedFieldNames:[...s.loadedFieldNames]}}createFallbackMapping(n,r){let i=B(n,r),a=this.loadedModelDetails[i];if(a){if(n==="qa-group"){let o=this.plugin.settings.noteFieldMappings[i]??this.draftMappings[i];return this.qaGroupFieldMappingService.suggest(r,a.fieldNames,Date.now(),O(o)?o.acceptedWarnings:void 0,O(o)?o.titleField:void 0)}return this.noteFieldMappingService.suggest(n,r,a.fieldNames)}return n==="qa-group"?{cardType:n,modelName:r,titleField:void 0,slots:[],warnings:[],acceptedWarnings:void 0,derivation:void 0,loadedFieldNames:[],loadedAt:Date.now()}:{cardType:n,modelName:r,loadedFieldNames:[],loadedAt:Date.now()}}async saveQaGroupWarningAcceptance(n,r){let i=this.getCurrentMappingForConfig(n);if(!i||!O(i))return;let a=this.getRuntimeCardType(n),o=B(a,i.modelName),u={...i,slots:i.slots.map(s=>({...s})),warnings:[...i.warnings],acceptedWarnings:r?[...i.warnings]:void 0,loadedFieldNames:[...i.loadedFieldNames]};this.cardTypeStatusOverride=null,this.draftMappings[o]=u,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:u}}),this.renderCard("card-types")}async saveQaGroupFieldSelection(n,r){let i=this.plugin.settings.cardTypeConfigs[n].noteType.trim();if(i.length===0)return;let a=B("qa-group",i),o=this.getCurrentMappingForConfig(n),u=o&&O(o)?o.loadedFieldNames:this.loadedModelDetails[a]?.fieldNames??[],s=o&&O(o)?o.loadedAt:Date.now(),d=this.createQaGroupSelectionDraft(i,u,s,r);this.draftMappings[a]=d;try{let c=this.qaGroupFieldMappingService.createMappingFromSelection(i,u,r,s);this.cardTypeStatusOverride=null,this.draftMappings[a]=c,await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[a]:c}})}catch{this.cardTypeStatusOverride=null,this.renderCard("card-types");return}this.renderCard("card-types")}async syncQaGroupMappingFromCache(n,r=this.plugin.settings.ankiModelFieldCache){let i=n.trim();if(i.length===0)return;let a=r[i];if(!a)return;let o=B("qa-group",i),u=this.plugin.settings.noteFieldMappings[o]??this.draftMappings[o];if(O(u)){let s=this.refreshSavedQaGroupMapping(u,a.fieldNames,a.loadedAt);this.draftMappings[o]=s,On(this.plugin.settings.noteFieldMappings[o],s)||await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:s}});return}try{let s=this.qaGroupFieldMappingService.suggest(i,a.fieldNames,a.loadedAt,void 0,void 0);this.draftMappings[o]=s,On(this.plugin.settings.noteFieldMappings[o],s)||await this.plugin.updateSettings({noteFieldMappings:{...this.plugin.settings.noteFieldMappings,[o]:s}})}catch{if(delete this.draftMappings[o],this.plugin.settings.noteFieldMappings[o]){let s={...this.plugin.settings.noteFieldMappings};delete s[o],await this.plugin.updateSettings({noteFieldMappings:s})}}}getQaGroupFieldState(n){let r=this.plugin.settings.cardTypeConfigs[n].noteType,i=B("qa-group",r),a=this.draftMappings[i]??this.plugin.settings.noteFieldMappings[i];if(a&&O(a)){if(a.derivation?.mode==="first-pair"){let u=this.getQaGroupSelectedFields(a);try{return{mapping:this.qaGroupFieldMappingService.createMappingFromSelection(r,a.loadedFieldNames,u,a.loadedAt)}}catch(s){return{mapping:this.cloneQaGroupFieldMapping(a),error:ye(s,"settings.cards.cardTypes.failedSave")}}}return{mapping:this.cloneQaGroupFieldMapping(a)}}let o=this.loadedModelDetails[i];if(!o)return{};try{let u=this.plugin.settings.noteFieldMappings[i]??this.draftMappings[i];return{mapping:this.qaGroupFieldMappingService.suggest(r,o.fieldNames,Date.now(),O(u)?u.acceptedWarnings:void 0,O(u)?u.titleField:void 0)}}catch(u){return{error:ye(u,"settings.cards.cardTypes.failedSave")}}}refreshSavedQaGroupMapping(n,r,i){if(n.derivation?.mode==="first-pair")try{return this.qaGroupFieldMappingService.createMappingFromSelection(n.modelName,r,this.getQaGroupSelectedFields(n),i)}catch{return{...this.cloneQaGroupFieldMapping(n),loadedFieldNames:[...r],loadedAt:i}}return{...n,loadedFieldNames:[...r],slots:n.slots.map(a=>({...a})),warnings:[...n.warnings],acceptedWarnings:n.acceptedWarnings?[...n.acceptedWarnings]:void 0,derivation:n.derivation?{...n.derivation}:void 0,loadedAt:i}}cloneQaGroupFieldMapping(n){return{...n,derivation:n.derivation?{...n.derivation}:void 0,loadedFieldNames:[...n.loadedFieldNames],slots:n.slots.map(r=>({...r})),warnings:[...n.warnings],acceptedWarnings:n.acceptedWarnings?[...n.acceptedWarnings]:void 0}}getQaGroupSelectedFields(n){return{titleField:n.titleField,firstQuestionField:n.derivation?.firstQuestionField??n.slots[0]?.questionField,firstAnswerField:n.derivation?.firstAnswerField??n.slots[0]?.answerField}}createQaGroupSelectionDraft(n,r,i,a){let o=a.titleField?.trim()||void 0,u=a.firstQuestionField?.trim()||void 0,s=a.firstAnswerField?.trim()||void 0;return{cardType:"qa-group",modelName:n,titleField:o,slots:[],warnings:[],acceptedWarnings:void 0,derivation:u||s?{mode:"first-pair",firstQuestionField:u,firstAnswerField:s}:void 0,loadedFieldNames:[...r],loadedAt:i}}renderQaGroupWarning(n){let r=ci(n);if(!r)return n;let i=String(r.index).padStart(2,"0");return r.kind==="missing-answer"?g("settings.cards.cardTypes.qaGroup.warning.missingAnswer",{index:i,questionField:r.questionField,answerField:r.answerField}):g("settings.cards.cardTypes.qaGroup.warning.missingQuestion",{index:i,questionField:r.questionField,answerField:r.answerField})}getRuntimeCardType(n){return n==="qa-group"?"qa-group":n==="cloze"||n==="cloze-all"?"cloze":"basic"}ensureFolderTreeLoaded(n=!1){n&&(this.hasLoadedFolderTree=!1,this.folderTree=[]),!(this.hasLoadedFolderTree||this.folderTreeLoadPromise)&&(this.folderTreeStatus=Hi,this.folderTreeLoadPromise=this.plugin.listFolderTree().then(r=>{this.folderTree=r,this.folderTreeStatus=r.length>0?{rawMessage:""}:{key:"settings.scope.empty"},this.requestSelectedFolderAncestorExpansion()}).catch(r=>{this.folderTree=[],this.folderTreeStatus=ye(r,"settings.scope.failedLoad")}).finally(()=>{this.hasLoadedFolderTree=!0,this.folderTreeLoadPromise=null,this.renderCard("scope")}))}refreshFolderTree(){this.expandedFolderPaths.clear(),this.ensureFolderTreeLoaded(!0),this.renderCard("scope")}async updateScopeMode(n){await this.plugin.updateSettings({scopeMode:n}),n!=="all"&&(this.requestSelectedFolderAncestorExpansion(),this.ensureFolderTreeLoaded()),this.renderCard("scope")}async updateFolderSelection(n,r,i){let a=n==="include"?this.plugin.settings.includeFolders:this.plugin.settings.excludeFolders,o=Ri(this.folderTree,a,r,i);if(n==="include"){let u=i?this.plugin.settings.alternateFolderDeckModeFolders:this.plugin.settings.alternateFolderDeckModeFolders.filter(s=>!Zu(s,r));await this.plugin.updateSettings({includeFolders:o,alternateFolderDeckModeFolders:u})}else await this.plugin.updateSettings({excludeFolders:o});this.renderCard("scope")}async updateAlternateFolderDeckModeFolder(n,r){let i=r?this.plugin.settings.alternateFolderDeckModeFolders.includes(n)?[...this.plugin.settings.alternateFolderDeckModeFolders]:[...this.plugin.settings.alternateFolderDeckModeFolders,n]:this.plugin.settings.alternateFolderDeckModeFolders.filter(a=>a!==n);await this.plugin.updateSettings({alternateFolderDeckModeFolders:i}),this.renderCard("scope")}renderFolderNode(n,r,i,a){let o=n.createDiv();o.dataset.folderRow=r.path,w(o,"ahs-settings-folder-row"),o.style.setProperty("--ahs-folder-depth-indent",`${a*18}px`);let u=r.children.length>0,s=u&&this.expandedFolderPaths.has(r.path),d=o.createEl(u?"button":"span");d.dataset.folderToggle=r.path,d.textContent=u?s?"\u25BE":"\u25B8":"",w(d,"ahs-settings-folder-toggle"),u?(w(d,"ahs-settings-folder-toggle-button"),d.setAttr("aria-label",s?g("settings.scope.collapseFolder",{name:r.name}):g("settings.scope.expandFolder",{name:r.name})),d.setAttr("title",s?g("settings.scope.collapseFolder",{name:r.name}):g("settings.scope.expandFolder",{name:r.name})),d.addEventListener("click",()=>{this.expandedFolderPaths.has(r.path)?this.expandedFolderPaths.delete(r.path):this.expandedFolderPaths.add(r.path),this.renderCard("scope")})):w(d,"ahs-settings-folder-toggle-spacer");let c=o.createEl("input");c.type="checkbox",c.checked=r.checked,c.indeterminate=r.indeterminate,c.dataset.folderPath=r.path,w(c,"ahs-settings-folder-checkbox"),c.addEventListener("change",()=>{this.updateFolderSelection(i,r.path,c.checked)});let l=o.createDiv();w(l,"ahs-settings-folder-label-stack");let f=l.createDiv();w(f,"ahs-settings-folder-label-inline");let m=f.createSpan({text:r.name});if(m.dataset.folderPathLabel=r.path,w(m,"ahs-settings-folder-label"),this.applyFluidEllipsis(m),i==="include"&&r.checked&&this.plugin.settings.folderDeckMode!=="off"){let F=f.createEl("input"),k=g("settings.scope.folderDeckModeOverride.ariaLabel",{name:r.name}),b=this.getFolderDeckModeOverrideTitle(),x=this.plugin.settings.alternateFolderDeckModeFolders.includes(r.path);if(F.type="checkbox",F.checked=x,F.dataset.folderDeckModeOverride=r.path,F.setAttr("aria-label",k),F.setAttr("title",b),w(F,"ahs-settings-folder-override-checkbox"),F.addEventListener("click",C=>{C?.stopPropagation()}),F.addEventListener("change",()=>{this.updateAlternateFolderDeckModeFolder(r.path,F.checked)}),x){let C=f.createSpan({text:this.getFolderDeckModeOverrideHint()});C.dataset.folderDeckModeOverrideHint=r.path,w(C,"ahs-settings-folder-override-hint")}}if(!u||!s)return;let p=n.createDiv();p.dataset.folderChildren=r.path,w(p,"ahs-settings-folder-children");for(let F of r.children)this.renderFolderNode(p,F,i,a+1)}requestSelectedFolderAncestorExpansion(){this.scopeNeedsSelectedAncestorExpansion=!0}expandSelectedFolderAncestorsIfNeeded(n){if(this.scopeNeedsSelectedAncestorExpansion){this.scopeNeedsSelectedAncestorExpansion=!1;for(let r of this.getSelectedFoldersForScopeMode(n))for(let i of es(r))this.expandedFolderPaths.add(i)}}getSelectedFoldersForScopeMode(n){return n==="include"?this.plugin.settings.includeFolders:this.plugin.settings.excludeFolders}getFolderDeckModeOverrideHint(){return this.plugin.settings.folderDeckMode==="folder"?g("settings.scope.folderDeckModeOverride.hint.folderAndFile"):g("settings.scope.folderDeckModeOverride.hint.folder")}getFolderDeckModeOverrideTitle(){return this.plugin.settings.folderDeckMode==="folder"?g("settings.scope.folderDeckModeOverride.title.folderAndFile"):g("settings.scope.folderDeckModeOverride.title.folder")}createInlineControlGroup(n,r){let i=n.createEl("label");w(i,"ahs-settings-inline-control-group");let a=i.createSpan({text:r});return w(a,"ahs-settings-inline-control-label"),i}createGridControlSlot(n,r){let i=n.createEl("label");w(i,"ahs-settings-grid-control-slot");let a=i.createSpan({text:r});w(a,"ahs-settings-grid-control-label");let o=i.createDiv();return w(o,"ahs-settings-grid-control-content"),o}applyFluidEllipsis(n){let r=(n.tagName||n.tag||"").toLowerCase(),i=r==="select"||r==="input";w(n,"ahs-settings-fluid-ellipsis"),i&&w(n,"ahs-settings-fluid-control")}createSectionHeading(n,r,i,a){let o=n.createDiv(),u=new G.Setting(o).setName(a).setHeading();u.settingEl.dataset[r]=i,u.nameEl.dataset[r]=i,w(u.settingEl,"ahs-settings-section-heading")}scheduleDebouncedTextSave(n,r,i){let a=window.activeWindow;this.textDraftValues.set(n,r);let o=this.debouncedTextSaves.get(n);o&&a.clearTimeout(o.timer);let u=a.setTimeout(()=>{this.flushDebouncedTextSave(n)},Ou);this.debouncedTextSaves.set(n,{timer:u,saveAction:i})}async flushDebouncedTextSave(n){let r=window.activeWindow,i=this.debouncedTextSaves.get(n);i&&(r.clearTimeout(i.timer),this.debouncedTextSaves.delete(n),await i.saveAction(this.textDraftValues.get(n)??""))}async flushDebouncedTextSaves(){let n=[...this.debouncedTextSaves.keys()];await Promise.allSettled(n.map(r=>this.flushDebouncedTextSave(r)))}getDraftValue(n,r){return this.textDraftValues.get(n)??r}createSelect(n,r){let i=n.createEl("select");return i.dataset.selectKey=r,i}createFieldSelect(n,r){return this.createSelect(n,r)}appendOption(n,r,i){let a=n.createEl("option",{text:i});a.value=r}populateFieldSelect(n,r,i){n.empty(),this.appendOption(n,"",r.length>0?g("settings.mapping.selectFieldPlaceholder"):g("settings.cards.cardTypes.fieldsUnavailable"));for(let a of r)this.appendOption(n,a,a);n.value=i??""}populateFileDeckInsertLocationDropdown(n,r){n.addOption("body",g("settings.deck.insertLocation.options.body")),n.addOption("yaml",g("settings.deck.insertLocation.options.yaml")),n.setValue(r)}populateFolderDeckModeDropdown(n,r){n.addOption("off",g("settings.deck.folderDeckMode.options.off")),n.addOption("folder",g("settings.deck.folderDeckMode.options.folder")),n.addOption("folder-and-file",g("settings.deck.folderDeckMode.options.folderAndFile")),n.setValue(r)}getCardTitle(n){return n==="card-types"?g("settings.cards.cardTypes.title"):n==="sync-content"?g("settings.cards.syncContent.title"):n==="scope"?g("settings.cards.scope.title"):n==="deck"?g("settings.cards.deck.title"):g("settings.cards.commands.title")}getCardTypeLabel(n){return n==="basic"?g("settings.cards.cardTypes.rows.basic"):n==="qa-group"?g("settings.cards.cardTypes.rows.qaGroup"):n==="cloze"?g("settings.cards.cardTypes.rows.cloze"):n==="cloze-all"?g("settings.cards.cardTypes.rows.clozeAll"):g("settings.cards.cardTypes.rows.qaGroup")}};function Ui(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function Zu(e,t){let n=Ui(e),r=Ui(t);return n===r||n.startsWith(`${r}/`)}function Yu(e){return e==="include"?g("settings.scope.summary.include"):e==="exclude"?g("settings.scope.summary.exclude"):g("settings.scope.summary.all")}function On(e,t){return JSON.stringify(e)===JSON.stringify(t)}function Qi(e){let t=new Set;for(let n of e){if(typeof n!="string")continue;let r=n.trim();r.length>0&&t.add(r)}return[...t].sort((n,r)=>n.localeCompare(r))}function Xu(e,t){return e.length!==t.length?!1:e.every((n,r)=>n===t[r])}function Ju(e){return e==="include"?g("settings.scope.treeDescription.include"):g("settings.scope.treeDescription.exclude")}function es(e){let t=e.split("/").filter(r=>r.length>0),n=[];for(let r=1;r0?e.message.trim():String(e)}var zt=class{async runCollectBatches(t,n,r,i){if(t.length===0)return[];let a=rs(t,n),o=[],u=0;return await Promise.all(Array.from({length:Math.min(r,a.length)},async()=>{for(;u(await i(a),[]))}};function rs(e,t){let n=[];for(let r=0;ri.has(a))}function et(e,t){let n=Ht(e),r=Ht(t),i=new Set(n),a=new Set(r);return{addTags:n.filter(o=>!a.has(o)),removeTags:r.filter(o=>!i.has(o))}}var Ot=class{constructor(t,n=new Ne,r=new zt){this.ankiGateway=t;this.noteFieldMappingService=n;this.batchScheduler=r}async execute(t,n,r,i){let a=new Map,o=new Map,u=new Set,s=new Map,d=0,c=0,l=0,f=0,m=0,p=Array.from(new Set([...t.toRebuild,...t.toUpdate,...t.toVerifyDeck,...t.toRewriteMarker,...t.toChangeDeck].flatMap(y=>y.noteId?[y.noteId]:[]))),F=await this.batchScheduler.runCollectBatches(p,100,1,y=>this.ankiGateway.getNoteSummaries(y)),k=new Map(F.map(y=>[y.noteId,y])),b=[],x=[],C=[],h=[],M=[],T=new Set(t.toChangeDeck.map(y=>y.card.syncKey));for(let y of t.toCreate)b.push(await this.requireRenderedCard(y,n,r));for(let y of t.toRebuild){if(y.noteId&&k.has(y.noteId)){x.push({plannedCard:y,renderedCard:await this.requireRenderedCard(y,n,r)});continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toUpdate){if(y.noteId&&k.has(y.noteId)){let v=await this.requireRenderedCard(y,n,r),_=k.get(y.noteId);_&&_.modelName!==v.noteModel?h.push({plannedCard:y,renderedCard:v,summary:_}):C.push({plannedCard:y,renderedCard:v});continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toRewriteMarker)if(!s.has(y.card.syncKey)){if(y.noteId&&k.has(y.noteId)){s.set(y.card.syncKey,y),o.set(y.card.syncKey,y.noteId);continue}b.push(await this.requireRenderedCard(y,n,r)),s.set(y.card.syncKey,y)}for(let y of t.toVerifyDeck){if(!y.noteId)continue;let v=k.get(y.noteId);v&&is(v,y.deck,T.has(y.card.syncKey))&&(M.push(y),o.set(y.card.syncKey,y.noteId))}await this.batchScheduler.runVoidBatches(Array.from(new Set([...b.map(y=>y.deck),...x.map(y=>y.renderedCard.deck),...M.map(y=>y.deck)])),50,1,y=>this.ankiGateway.ensureDecks(y));let D=await this.uploadMedia([...b,...x.map(y=>y.renderedCard),...C.map(y=>y.renderedCard),...h.map(y=>y.renderedCard)]),I=await this.batchScheduler.runCollectBatches(b,50,1,async y=>this.ankiGateway.addNotes(await Promise.all(y.map(async v=>({deckName:v.deck,modelName:v.noteModel,fields:await this.mapFields(v,i,a),tags:v.card.tagsHint})))));for(let y=0;y{await this.ankiGateway.updateNotes(await Promise.all(y.map(async({plannedCard:v,renderedCard:_})=>({noteId:v.noteId??0,fields:await this.mapFields(_,i,a)}))))}),await this.batchScheduler.runVoidBatches(h,25,1,async y=>{for(let{plannedCard:v,renderedCard:_,summary:L}of y){let P=await this.mapFields(_,i,a);try{await this.ankiGateway.updateNoteModel({noteId:v.noteId??0,modelName:_.noteModel,fields:P})}catch(q){throw qt({noteId:v.noteId??0,fromModel:L.modelName,toModel:_.noteModel,error:q,location:`${v.card.filePath}:${v.card.blockStartLine}`})}}});let A=[...C,...h].flatMap(({plannedCard:y})=>{if(!y.noteId)return[];let v=k.get(y.noteId);if(!v)return[];let _=et(y.card.tagsHint,v.tags);return _.addTags.length===0&&_.removeTags.length===0?[]:[{noteId:y.noteId,addTags:_.addTags,removeTags:_.removeTags}]});await this.batchScheduler.runVoidBatches(A,50,1,y=>this.ankiGateway.syncNoteTags(y)),l+=C.length+h.length,f=h.length;for(let{plannedCard:y}of[...C,...h])y.noteId&&(u.add(y.card.syncKey),o.set(y.card.syncKey,y.noteId));let R=new Map;for(let y of M){let v=y.noteId;if(!v)continue;let _=k.get(v);if(!_||_.cardIds.length===0)continue;let L=R.get(y.deck)??new Set;for(let P of _.cardIds)L.add(P);R.set(y.deck,L)}await this.batchScheduler.runVoidBatches(Array.from(R.entries()).map(([y,v])=>({deckName:y,cardIds:Array.from(v)})),25,1,y=>this.ankiGateway.changeDecks(y)),m=M.length;for(let y of M)u.add(y.card.syncKey);return{created:d,rebuilt:c,updated:l,migratedNoteTypes:f,migratedDecks:m,uploadedMedia:D,markerWrites:Array.from(s.values()).map(y=>({...y,noteId:o.get(y.card.syncKey)??y.noteId})),resolvedNoteIds:o,touchedSyncKeys:u}}async requireRenderedCard(t,n,r){let i=n.get(t.card.syncKey);if(i)return i;let a=await r(t);return n.set(t.card.syncKey,a),a}async mapFields(t,n,r){let i=await this.getModelDetails(t.noteModel,r);return this.noteFieldMappingService.mapRenderedCard({type:t.card.cardType,noteModel:t.noteModel,renderedFields:t.renderedFields},i,n)}async getModelDetails(t,n){let r=n.get(t);if(r)return r;let i=this.ankiGateway.getModelDetails(t).catch(a=>{throw n.delete(t),a});return n.set(t,i),i}async uploadMedia(t){let n=new Map;for(let r of t)for(let i of r.media)n.set(`${i.kind}:${i.absolutePath}:${i.fileName}`,i);return await this.batchScheduler.runVoidBatches(Array.from(n.values()),10,3,r=>this.ankiGateway.storeMediaFiles(r)),n.size}};function Ki(e){return e instanceof Error?e:new Error(String(e))}function is(e,t,n){let r=e.deckNames?.filter(i=>i.length>0)??[];return r.length===0?n:r.some(i=>i!==t)}var Pe=class{filter(t,n,r,i){let a=Wt(r),o=Wt(i);return t.filter(u=>u.path.toLowerCase().endsWith(".md")?this.isPathInScope(u.path,n,a,o):!1)}isPathInScope(t,n,r,i){let a=os(t),o=Wt(r),u=Wt(i);return n==="include"?o.some(s=>Zi(a,s)):n==="exclude"?!u.some(s=>Zi(a,s)):!0}};function Wt(e){return e.map(as).filter(Boolean)}function as(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function os(e){return e.trim().replace(/\\/g,"/").replace(/^\/+/,"")}function Zi(e,t){return e===t||e.startsWith(`${t}/`)}function $t(e,t,n){return`${e}\0group\0${t}\0${n}`}function Fe(e,t){return`${e}#${t}`}function Qt(e){let t=us(e.lines,e.startLine,e.markerAdapter),n=t.find(o=>o.valid);if(n?.marker){let o=e.lines.slice(0,n.index);return{contentLines:o,trailingLines:cs(e.lines.slice(n.index+1)),contentEndLine:Ut(o,e.startLine,e.fallbackLine),markerLine:e.startLine+n.index,markerIndent:n.indent,marker:n.marker,markerState:"present-valid"}}let r=e.cutoffMode==="double-blank-lines"?ss(e.lines):void 0;if(r){let o=t.find(s=>!s.valid&&s.index>=r.end),u=e.lines.slice(0,r.start);return{contentLines:u,trailingLines:e.lines.slice(r.end),contentEndLine:Ut(u,e.startLine,e.fallbackLine),markerLine:o?e.startLine+o.index:void 0,markerIndent:o?.indent,markerState:o?"present-invalid":"missing"}}let i=ds(e.lines),a=i===void 0?void 0:t.find(o=>!o.valid&&o.index===i);if(a){let o=e.lines.filter((u,s)=>s!==a.index);return{contentLines:o,trailingLines:[],contentEndLine:Ut(o,e.startLine,e.fallbackLine),markerLine:e.startLine+a.index,markerIndent:a.indent,markerState:"present-invalid"}}return{contentLines:e.lines,trailingLines:[],contentEndLine:Ut(e.lines,e.startLine,e.fallbackLine),markerState:"missing"}}function us(e,t,n){let r=[],i=null;for(let a=0;a=2&&n!==void 0)return{start:n,end:i};t=t?null:a.slice(0,3),n=void 0,r=0;continue}if(!t){if(!a){n??(n=i),r+=1;continue}if(r>=2&&n!==void 0)return{start:n,end:i};n=void 0,r=0}}if(r>=2&&n!==void 0)return{start:n,end:e.length}}function Ut(e,t,n){for(let r=e.length-1;r>=0;r-=1)if(e[r].trim())return t+r;return n}function ds(e){for(let t=e.length-1;t>=0;t-=1)if(e[t].trim())return t}function cs(e){let t=0;for(;t1&&a.push({filePath:r,code:"deck_multiple_body_declarations",params:{marker:i}}),{bodyDeck:o[0],warnings:a}}};function ps(e){if(e[0]?.trim()==="---"){for(let t=1;t!Ss(s))),u=[`qa-group:${n}`,...a.map(s=>`${s.title} ${s.answer}`),...o].join(` `).trimEnd();return{stem:n,items:a,markerState:r.markerState,groupMarker:r.marker,contentEndLine:r.contentEndLine,markerLine:r.markerLine,markerIndent:r.markerIndent,rawBlockText:u,rawBlockHash:Q(u)}}};function ys(e,t){let n=e.trimEnd();return n.endsWith(t)?n.slice(0,n.length-t.length).trimEnd():n}function Xi(e){let t=[],n=null;for(let i=0;ii.indent.length));return t.filter(i=>i.indent.length===r)}function Ji(e,t,n,r){let i,a=t-1,o=null;for(let u=t;ut&&!e[n-1].trim();)n-=1;return e.slice(t,n)}function ea(e){let t=e.filter(r=>r.trim().length>0).map(r=>ta(r).length),n=t.length>0?Math.min(...t):0;return e.map(r=>r.slice(Math.min(n,r.length)))}function ta(e){return e.match(/^[ \t]*/)?.[0]??""}function na(e){return e.startsWith("```")||e.startsWith("~~~")}function Ss(e){return/^\s*",Qd="<[?][\\s\\S]*?[?]>",Vd="]*>",jd="",qa=new RegExp("^(?:"+Ba+"|"+Ga+"|"+Ud+"|"+Qd+"|"+Vd+"|"+jd+")"),za=new RegExp("^(?:"+Ba+"|"+Ga+")");var He=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(za.source+"\\s*$"),/^$/,!1]];function Fr(e,t,n,r){let i=e.bMarks[t]+e.tShift[t],a=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||!e.md.options.html||e.src.charCodeAt(i)!==60)return!1;let o=e.src.slice(i,a),u=0;for(;u=4)return!1;let o=e.src.charCodeAt(i);if(o!==35||i>=a)return!1;let u=1;for(o=e.src.charCodeAt(++i);o===35&&i6||ii&&E(e.src.charCodeAt(s-1))&&(a=s),e.line=t+1;let d=e.push("heading_open","h"+String(u),1);d.markup="########".slice(0,u),d.map=[t,e.line];let c=e.push("inline","",0);c.content=e.src.slice(i,a).trim(),c.map=[t,e.line],c.children=[];let l=e.push("heading_close","h"+String(u),-1);return l.markup="########".slice(0,u),!0}function wr(e,t,n){let r=e.md.block.ruler.getRules("paragraph");if(e.sCount[t]-e.blkIndent>=4)return!1;let i=e.parentType;e.parentType="paragraph";let a=0,o,u=t+1;for(;u3)continue;if(e.sCount[u]>=e.blkIndent){let m=e.bMarks[u]+e.tShift[u],p=e.eMarks[u];if(m=p))){a=o===61?1:2;break}}if(e.sCount[u]<0)continue;let f=!1;for(let m=0,p=r.length;m3||e.sCount[a]<0)continue;let d=!1;for(let c=0,l=r.length;c=n||e.sCount[o]=a){e.line=n;break}let s=e.line,d=!1;for(let c=0;c=e.line)throw new Error("block rule didn't increment state.line");break}if(!d)throw new Error("none of the block rules matched");e.tight=!u,e.isEmpty(e.line-1)&&(u=!0),o=e.line,o0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],i={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(r),this.tokens_meta.push(i),r};it.prototype.scanDelims=function(e,t){let n=this.posMax,r=this.src.charCodeAt(e),i=e>0?this.src.charCodeAt(e-1):32,a=e;for(;a0)return!1;let n=e.pos,r=e.posMax;if(n+3>r||e.src.charCodeAt(n)!==58||e.src.charCodeAt(n+1)!==47||e.src.charCodeAt(n+2)!==47)return!1;let i=e.pending.match(Zd);if(!i)return!1;let a=i[1],o=e.md.linkify.matchAtStart(e.src.slice(n-a.length));if(!o)return!1;let u=o.url;if(u.length<=a.length)return!1;let s=u.length;for(;s>0&&u.charCodeAt(s-1)===42;)s--;s!==u.length&&(u=u.slice(0,s));let d=e.md.normalizeLink(u);if(!e.md.validateLink(d))return!1;if(!t){e.pending=e.pending.slice(0,-a.length);let c=e.push("link_open","a",1);c.attrs=[["href",d]],c.markup="linkify",c.info="auto";let l=e.push("text","",0);l.content=e.md.normalizeLinkText(u);let f=e.push("link_close","a",-1);f.markup="linkify",f.info="auto"}return e.pos+=u.length-a.length,!0}function Ar(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==10)return!1;let r=e.pending.length-1,i=e.posMax;if(!t)if(r>=0&&e.pending.charCodeAt(r)===32)if(r>=1&&e.pending.charCodeAt(r-1)===32){let a=r-1;for(;a>=1&&e.pending.charCodeAt(a-1)===32;)a--;e.pending=e.pending.slice(0,a),e.push("hardbreak","br",0)}else e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0);else e.push("softbreak","br",0);for(n++;n?@[]^_`{|}~-".split("").forEach(function(e){Er[e.charCodeAt(0)]=1});function _r(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==92||(n++,n>=r))return!1;let i=e.src.charCodeAt(n);if(i===10){for(t||e.push("hardbreak","br",0),n++;n=55296&&i<=56319&&n+1=56320&&u<=57343&&(a+=e.src[n+1],n++)}let o="\\"+a;if(!t){let u=e.push("text_special","",0);i<256&&Er[i]!==0?u.content=a:u.content=o,u.markup=o,u.info="escape"}return e.pos=n+1,!0}function Lr(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==96)return!1;let i=n;n++;let a=e.posMax;for(;n=0;r--){let i=t[r];if(i.marker!==95&&i.marker!==42||i.end===-1)continue;let a=t[i.end],o=r>0&&t[r-1].end===i.end+1&&t[r-1].marker===i.marker&&t[r-1].token===i.token-1&&t[i.end+1].token===a.token+1,u=String.fromCharCode(i.marker),s=e.tokens[i.token];s.type=o?"strong_open":"em_open",s.tag=o?"strong":"em",s.nesting=1,s.markup=o?u+u:u,s.content="";let d=e.tokens[a.token];d.type=o?"strong_close":"em_close",d.tag=o?"strong":"em",d.nesting=-1,d.markup=o?u+u:u,d.content="",o&&(e.tokens[t[r-1].token].content="",e.tokens[t[i.end+1].token].content="",r--)}}function ec(e){let t=e.tokens_meta,n=e.tokens_meta.length;$a(e,e.delimiters);for(let r=0;r=l)return!1;if(s=p,i=e.md.helpers.parseLinkDestination(e.src,p,e.posMax),i.ok){for(o=e.md.normalizeLink(i.str),e.md.validateLink(o)?p=i.pos:o="",s=p;p=l||e.src.charCodeAt(p)!==41)&&(d=!0),p++}if(d){if(typeof e.env.references>"u")return!1;if(p=0?r=e.src.slice(s,p++):p=m+1):p=m+1,r||(r=e.src.slice(f,m)),a=e.env.references[Te(r)],!a)return e.pos=c,!1;o=a.href,u=a.title}if(!t){e.pos=f,e.posMax=m;let F=e.push("link_open","a",1),k=[["href",o]];F.attrs=k,u&&k.push(["title",u]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,e.push("link_close","a",-1)}return e.pos=p,e.posMax=l,!0}function Rr(e,t){let n,r,i,a,o,u,s,d,c="",l=e.pos,f=e.posMax;if(e.src.charCodeAt(e.pos)!==33||e.src.charCodeAt(e.pos+1)!==91)return!1;let m=e.pos+2,p=e.md.helpers.parseLinkLabel(e,e.pos+1,!1);if(p<0)return!1;if(a=p+1,a=f)return!1;for(d=a,u=e.md.helpers.parseLinkDestination(e.src,a,e.posMax),u.ok&&(c=e.md.normalizeLink(u.str),e.md.validateLink(c)?a=u.pos:c=""),d=a;a=f||e.src.charCodeAt(a)!==41)return e.pos=l,!1;a++}else{if(typeof e.env.references>"u")return!1;if(a=0?i=e.src.slice(d,a++):a=p+1):a=p+1,i||(i=e.src.slice(m,p)),o=e.env.references[Te(i)],!o)return e.pos=l,!1;c=o.href,s=o.title}if(!t){r=e.src.slice(m,p);let F=[];e.md.inline.parse(r,e.md,e.env,F);let k=e.push("image","img",0),b=[["src",c],["alt",""]];k.attrs=b,k.children=F,k.content=r,s&&b.push(["title",s])}return e.pos=a,e.posMax=f,!0}var tc=/^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/,nc=/^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\x00-\x20]*)$/;function Br(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==60)return!1;let r=e.pos,i=e.posMax;for(;;){if(++n>=i)return!1;let o=e.src.charCodeAt(n);if(o===60)return!1;if(o===62)break}let a=e.src.slice(r+1,n);if(nc.test(a)){let o=e.md.normalizeLink(a);if(!e.md.validateLink(o))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",o]],u.markup="autolink",u.info="auto";let s=e.push("text","",0);s.content=e.md.normalizeLinkText(a);let d=e.push("link_close","a",-1);d.markup="autolink",d.info="auto"}return e.pos+=a.length+2,!0}if(tc.test(a)){let o=e.md.normalizeLink("mailto:"+a);if(!e.md.validateLink(o))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",o]],u.markup="autolink",u.info="auto";let s=e.push("text","",0);s.content=e.md.normalizeLinkText(a);let d=e.push("link_close","a",-1);d.markup="autolink",d.info="auto"}return e.pos+=a.length+2,!0}return!1}function rc(e){return/^\s]/i.test(e)}function ic(e){return/^<\/a\s*>/i.test(e)}function ac(e){let t=e|32;return t>=97&&t<=122}function Gr(e,t){if(!e.md.options.html)return!1;let n=e.posMax,r=e.pos;if(e.src.charCodeAt(r)!==60||r+2>=n)return!1;let i=e.src.charCodeAt(r+1);if(i!==33&&i!==63&&i!==47&&!ac(i))return!1;let a=e.src.slice(r).match(qa);if(!a)return!1;if(!t){let o=e.push("html_inline","",0);o.content=a[0],rc(o.content)&&e.linkLevel++,ic(o.content)&&e.linkLevel--}return e.pos+=a[0].length,!0}var oc=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,uc=/^&([a-z][a-z0-9]{1,31});/i;function qr(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==38||n+1>=r)return!1;if(e.src.charCodeAt(n+1)===35){let a=e.src.slice(n).match(oc);if(a){if(!t){let o=a[1][0].toLowerCase()==="x"?parseInt(a[1].slice(1),16):parseInt(a[1],10),u=e.push("text_special","",0);u.content=ln(o)?rt(o):rt(65533),u.markup=a[0],u.info="entity"}return e.pos+=a[0].length,!0}}else{let a=e.src.slice(n).match(uc);if(a){let o=he(a[0]);if(o!==a[0]){if(!t){let u=e.push("text_special","",0);u.content=o,u.markup=a[0],u.info="entity"}return e.pos+=a[0].length,!0}}}return!1}function Ua(e){let t={},n=e.length;if(!n)return;let r=0,i=-2,a=[];for(let o=0;os;d-=a[d]+1){let l=e[d];if(l.marker===u.marker&&l.open&&l.end<0){let f=!1;if((l.close||u.open)&&(l.length+u.length)%3===0&&(l.length%3!==0||u.length%3!==0)&&(f=!0),!f){let m=d>0&&!e[d-1].open?a[d-1]+1:0;a[o]=o-d+m,a[d]=m,u.open=!1,l.end=o,l.close=!1,c=-1,i=-2;break}}}c!==-1&&(t[u.marker][(u.open?3:0)+(u.length||0)%3]=c)}}function zr(e){let t=e.tokens_meta,n=e.tokens_meta.length;Ua(e.delimiters);for(let r=0;r0&&r++,i[t].type==="text"&&t+1=e.pos)throw new Error("inline rule didn't increment state.pos");break}}else e.pos=e.posMax;o||e.pos++,a[t]=e.pos};at.prototype.tokenize=function(e){let t=this.ruler.getRules(""),n=t.length,r=e.posMax,i=e.md.options.maxNesting;for(;e.pos=e.pos)throw new Error("inline rule didn't increment state.pos");break}}if(o){if(e.pos>=r)break;continue}e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()};at.prototype.parse=function(e,t,n,r){let i=new this.State(e,t,n,r);this.tokenize(i);let a=this.ruler2.getRules(""),o=a.length;for(let u=0;u|$))",t.tpl_email_fuzzy="(^|"+n+'|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}function $r(e){return Array.prototype.slice.call(arguments,1).forEach(function(n){n&&Object.keys(n).forEach(function(r){e[r]=n[r]})}),e}function hn(e){return Object.prototype.toString.call(e)}function sc(e){return hn(e)==="[object String]"}function dc(e){return hn(e)==="[object Object]"}function cc(e){return hn(e)==="[object RegExp]"}function ja(e){return hn(e)==="[object Function]"}function lc(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var Za={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};function pc(e){return Object.keys(e||{}).reduce(function(t,n){return t||Za.hasOwnProperty(n)},!1)}var fc={"http:":{validate:function(e,t,n){let r=e.slice(t);return n.re.http||(n.re.http=new RegExp("^\\/\\/"+n.re.src_auth+n.re.src_host_port_strict+n.re.src_path,"i")),n.re.http.test(r)?r.match(n.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,t,n){let r=e.slice(t);return n.re.no_http||(n.re.no_http=new RegExp("^"+n.re.src_auth+"(?:localhost|(?:(?:"+n.re.src_domain+")\\.)+"+n.re.src_domain_root+")"+n.re.src_port+n.re.src_host_terminator+n.re.src_path,"i")),n.re.no_http.test(r)?t>=3&&e[t-3]===":"||t>=3&&e[t-3]==="/"?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){let r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},gc="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",mc="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");function hc(e){e.__index__=-1,e.__text_cache__=""}function kc(e){return function(t,n){let r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}function Ka(){return function(e,t){t.normalize(e)}}function mn(e){let t=e.re=Va(e.__opts__),n=e.__tlds__.slice();e.onCompile(),e.__tlds_replaced__||n.push(gc),n.push(t.src_xn),t.src_tlds=n.join("|");function r(u){return u.replace("%TLDS%",t.src_tlds)}t.email_fuzzy=RegExp(r(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(r(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(r(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(r(t.tpl_host_fuzzy_test),"i");let i=[];e.__compiled__={};function a(u,s){throw new Error('(LinkifyIt) Invalid schema "'+u+'": '+s)}Object.keys(e.__schemas__).forEach(function(u){let s=e.__schemas__[u];if(s===null)return;let d={validate:null,link:null};if(e.__compiled__[u]=d,dc(s)){cc(s.validate)?d.validate=kc(s.validate):ja(s.validate)?d.validate=s.validate:a(u,s),ja(s.normalize)?d.normalize=s.normalize:s.normalize?a(u,s):d.normalize=Ka();return}if(sc(s)){i.push(u);return}a(u,s)}),i.forEach(function(u){e.__compiled__[e.__schemas__[u]]&&(e.__compiled__[u].validate=e.__compiled__[e.__schemas__[u]].validate,e.__compiled__[u].normalize=e.__compiled__[e.__schemas__[u]].normalize)}),e.__compiled__[""]={validate:null,normalize:Ka()};let o=Object.keys(e.__compiled__).filter(function(u){return u.length>0&&e.__compiled__[u]}).map(lc).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+o+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+o+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),hc(e)}function bc(e,t){let n=e.__index__,r=e.__last_index__,i=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=i,this.text=i,this.url=i}function Ur(e,t){let n=new bc(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function V(e,t){if(!(this instanceof V))return new V(e,t);t||pc(e)&&(t=e,e={}),this.__opts__=$r({},Za,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=$r({},fc,e),this.__compiled__={},this.__tlds__=mc,this.__tlds_replaced__=!1,this.re={},mn(this)}V.prototype.add=function(t,n){return this.__schemas__[t]=n,mn(this),this};V.prototype.set=function(t){return this.__opts__=$r(this.__opts__,t),this};V.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;let n,r,i,a,o,u,s,d,c;if(this.re.schema_test.test(t)){for(s=this.re.schema_search,s.lastIndex=0;(n=s.exec(t))!==null;)if(a=this.testSchemaAt(t,n[2],s.lastIndex),a){this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+a;break}}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(d=t.search(this.re.host_fuzzy_test),d>=0&&(this.__index__<0||d=0&&(i=t.match(this.re.email_fuzzy))!==null&&(o=i.index+i[1].length,u=i.index+i[0].length,(this.__index__<0||othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=o,this.__last_index__=u))),this.__index__>=0};V.prototype.pretest=function(t){return this.re.pretest.test(t)};V.prototype.testSchemaAt=function(t,n,r){return this.__compiled__[n.toLowerCase()]?this.__compiled__[n.toLowerCase()].validate(t,r,this):0};V.prototype.match=function(t){let n=[],r=0;this.__index__>=0&&this.__text_cache__===t&&(n.push(Ur(this,r)),r=this.__last_index__);let i=r?t.slice(r):t;for(;this.test(i);)n.push(Ur(this,r)),i=i.slice(this.__last_index__),r+=this.__last_index__;return n.length?n:null};V.prototype.matchAtStart=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return null;let n=this.re.schema_at_start.exec(t);if(!n)return null;let r=this.testSchemaAt(t,n[2],n[0].length);return r?(this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+r,Ur(this,0)):null};V.prototype.tlds=function(t,n){return t=Array.isArray(t)?t:[t],n?(this.__tlds__=this.__tlds__.concat(t).sort().filter(function(r,i,a){return r!==a[i-1]}).reverse(),mn(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,mn(this),this)};V.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),t.schema==="mailto:"&&!/^mailto:/i.test(t.url)&&(t.url="mailto:"+t.url)};V.prototype.onCompile=function(){};var Ya=V;var yc=/^xn--/,xc=/[^\0-\x7F]/,Cc=/[\x2E\u3002\uFF0E\uFF61]/g,Sc={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Qr=35,ne=Math.floor,Vr=String.fromCharCode;function ke(e){throw new RangeError(Sc[e])}function Fc(e,t){let n=[],r=e.length;for(;r--;)n[r]=t(e[r]);return n}function Ja(e,t){let n=e.split("@"),r="";n.length>1&&(r=n[0]+"@",e=n[1]),e=e.replace(Cc,".");let i=e.split("."),a=Fc(i,t).join(".");return r+a}function eo(e){let t=[],n=0,r=e.length;for(;n=55296&&i<=56319&&nString.fromCodePoint(...e),wc=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:36},Xa=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},to=function(e,t,n){let r=0;for(e=n?ne(e/700):e>>1,e+=ne(e/t);e>Qr*26>>1;r+=36)e=ne(e/Qr);return ne(r+(Qr+1)*e/(e+38))},no=function(e){let t=[],n=e.length,r=0,i=128,a=72,o=e.lastIndexOf("-");o<0&&(o=0);for(let u=0;u=128&&ke("not-basic"),t.push(e.charCodeAt(u));for(let u=o>0?o+1:0;u=n&&ke("invalid-input");let f=wc(e.charCodeAt(u++));f>=36&&ke("invalid-input"),f>ne((2147483647-r)/c)&&ke("overflow"),r+=f*c;let m=l<=a?1:l>=a+26?26:l-a;if(fne(2147483647/p)&&ke("overflow"),c*=p}let d=t.length+1;a=to(r-s,d,s==0),ne(r/d)>2147483647-i&&ke("overflow"),i+=ne(r/d),r%=d,t.splice(r++,0,i)}return String.fromCodePoint(...t)},ro=function(e){let t=[];e=eo(e);let n=e.length,r=128,i=0,a=72;for(let s of e)s<128&&t.push(Vr(s));let o=t.length,u=o;for(o&&t.push("-");u=r&&cne((2147483647-i)/d)&&ke("overflow"),i+=(s-r)*d,r=s;for(let c of e)if(c2147483647&&ke("overflow"),c===r){let l=i;for(let f=36;;f+=36){let m=f<=a?1:f>=a+26?26:f-a;if(l=0))try{t.hostname=jr.toASCII(t.hostname)}catch{}return en(Re(t))}function Nc(e){let t=nt(e,!0);if(t.hostname&&(!t.protocol||uo.indexOf(t.protocol)>=0))try{t.hostname=jr.toUnicode(t.hostname)}catch{}return tt(Re(t),tt.defaultChars+"%")}function j(e,t){if(!(this instanceof j))return new j(e,t);t||cn(e)||(t=e||{},e="default"),this.inline=new Qa,this.block=new Ha,this.core=new _a,this.renderer=new wa,this.linkify=new Ya,this.validateLink=Lc,this.normalizeLink=Ic,this.normalizeLinkText=Nc,this.utils=tr,this.helpers=Ge({},ar),this.options={},this.configure(e),t&&this.set(t)}j.prototype.set=function(e){return Ge(this.options,e),this};j.prototype.configure=function(e){let t=this;if(cn(e)){let n=e;if(e=Ac[n],!e)throw new Error('Wrong `markdown-it` preset "'+n+'", check name')}if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(n){e.components[n].rules&&t[n].ruler.enableOnly(e.components[n].rules),e.components[n].rules2&&t[n].ruler2.enableOnly(e.components[n].rules2)}),this};j.prototype.enable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(i){n=n.concat(this[i].ruler.enable(e,!0))},this),n=n.concat(this.inline.ruler2.enable(e,!0));let r=e.filter(function(i){return n.indexOf(i)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+r);return this};j.prototype.disable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(i){n=n.concat(this[i].ruler.disable(e,!0))},this),n=n.concat(this.inline.ruler2.disable(e,!0));let r=e.filter(function(i){return n.indexOf(i)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+r);return this};j.prototype.use=function(e){let t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this};j.prototype.parse=function(e,t){if(typeof e!="string")throw new Error("Input data should be a String");let n=new this.core.State(e,this,t);return this.core.process(n),n.tokens};j.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)};j.prototype.parseInline=function(e,t){let n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens};j.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var ot=j;var Pc=/^#[^\s#.,,。;;::!?!?()[\]{}<>]+(?:\/[^\s#.,,。;;::!?!?()[\]{}<>]+)*$/u;function kn(e,t){if(t||e.length===0)return e;let n=e.split(/\r?\n/),r=n.filter(i=>!Rc(i));return r.length===n.length?e:Gc(Bc(r)).join(` -`)}function Rc(e){let t=e.trim();return t?t.split(/\s+/).every(n=>Pc.test(n)):!1}function Bc(e){let t=0,n=e.length;for(;tt&&!e[n-1].trim();)n-=1;return e.slice(t,n)}function Gc(e){let t=[];for(let n of e){let r=n.trim().length===0,i=t[t.length-1],a=i!==void 0&&i.trim().length===0;r&&a||t.push(r?"":n)}return t}var qc="#[^\\s#.,\uFF0C\u3002;\uFF1B:\uFF1A!?\uFF01\uFF1F()[\\]{}<>]+(?:\\/[^\\s#.,\uFF0C\u3002;\uFF1B:\uFF1A!?\uFF01\uFF1F()[\\]{}<>]+)*";var zc=/[\p{L}\p{N}_/#]/u,Hc=new Set(["code","pre"]),Oc="ahs-ob-tag";function bn(e){if(!e||!e.includes("#"))return e;let t="",n=0,r=[];for(;nn){let s=e.slice(n,a);t+=r.length===0?so(s):s,n=a}if(n>=e.length)break;let o=e.indexOf(">",n);if(o===-1){let s=e.slice(n);t+=r.length===0?so(s):s;break}let u=e.slice(n,o+1);Uc(u,r),t+=u,n=o+1}return t}function so(e){let t=new RegExp(qc,"gu"),n="",r=0,i;for(;(i=t.exec(e))!==null;){let a=i[0],o=i.index,u=o+a.length;if(!Wc(e,o))continue;let s=Tt([a])[0];s&&(n+=e.slice(r,o),n+=$c(a,s),r=u)}return r===0?e:n+e.slice(r)}function Wc(e,t){return t===0?!0:!zc.test(e[t-1]??"")}function $c(e,t){return`${co(e)}`}function Uc(e,t){let n=/^<\s*(\/)?\s*([a-zA-Z0-9-]+)/.exec(e);if(!n)return;let r=!!n[1],i=n[2]?.toLowerCase();if(!(!i||!Hc.has(i))){if(r){for(let a=t.length-1;a>=0;a-=1)if(t[a]===i){t.splice(a,1);break}return}/\/\s*>$/.test(e)||t.push(i)}}function co(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}var yn=class{constructor(t=new Z){this.deckNormalizationService=t}mapFilePathToDeck(t,n,r=[]){let i=Qc(t,n,r);if(i==="off")return{warnings:[]};let a=lo(t),o=a.lastIndexOf("/");if(o<0)return{warnings:[]};let u=a.slice(0,o);if(!u.trim())return{warnings:[]};let s=u.split("/").filter(Boolean);if(i==="folder-and-file"){let d=a.slice(o+1).replace(/\.[^.]+$/,"").trim();d&&s.push(d)}return s.some(d=>d.includes("::"))?{warnings:[{filePath:t,code:"deck_invalid_folder_segment"}]}:{deck:this.deckNormalizationService.normalize(s.join("/")),warnings:[]}}};function Qc(e,t,n){if(t==="off")return"off";let r=lo(e);return n.some(a=>{let o=Vc(a);return o.length>0&&jc(r,o)})?t==="folder"?"folder-and-file":"folder":t}function Vc(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function lo(e){return e.trim().replace(/\\/g,"/").replace(/^\/+/,"")}function jc(e,t){return e===t||e.startsWith(`${t}/`)}var Oe=class{constructor(t=new yn,n=new Z){this.folderDeckMappingService=t;this.deckNormalizationService=n}resolve(t,n){if(t.deckHint)return{resolvedDeck:{value:this.deckNormalizationService.normalize(t.deckHint),source:t.deckHintSource??"body"},warnings:[...t.deckWarnings]};let r=this.folderDeckMappingService.mapFilePathToDeck(t.filePath,n.folderDeckMode,n.alternateFolderDeckModeFolders);return r.deck?{resolvedDeck:{value:r.deck,source:"folder"},warnings:[...t.deckWarnings,...r.warnings]}:{resolvedDeck:{value:this.deckNormalizationService.normalize(n.defaultDeck),source:"default"},warnings:[...t.deckWarnings,...r.warnings,{filePath:t.filePath,code:"deck_fallback_default"}]}}};function We(e){return`${e.filePath}\0${e.code}\0${Kr(e.params)}`}function Kr(e){return e===void 0?"":e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(n=>Kr(n)).join(",")}]`:`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${Kr(r)}`).join(",")}}`}function xn({href:e,label:t,escapeHref:n=!0}){return`${po(t)}`}function ut(e,t,n){if(n==="question-last-line")return{title:e.title?`${e.title}
${t}`:t,body:e.body};let r=`

${t}

`;return n==="answer-first-line"?{title:e.title,body:e.body?`${r}${e.body}`:r}:{title:e.title,body:e.body?`${e.body}${r}`:r}}function po(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}var Kc=new ot({breaks:!0,html:!0,linkify:!0}),Zc=/`[^`\n]+`/g,Yc=/==(.+?)==/g,Cn=class{constructor(t,n=new ce,r=new Oe,i=new X,a=()=>Date.now(),o=()=>`g_${Q(`${Date.now()}_${Math.random()}_${Date.now()}`).slice(0,12)}`,u=()=>(this.sequence+=1,`i_${Q(`${Date.now()}_${this.sequence}_${Math.random()}`).slice(0,10)}`),s){this.ankiGateway=t;this.qaGroupFieldMappingService=n;this.deckResolutionService=r;this.groupMarkerService=i;this.now=a;this.createGroupId=o;this.createItemId=u;this.createBacklink=s;this.sequence=0}async sync(t,n,r){if(t.length===0)return{created:0,updated:0,migratedNoteTypes:0,migratedDecks:0,markerWrites:[],resolvedNoteIds:new Map,touchedSyncKeys:[],syncedGroupBlocks:[],warnings:[]};let{modelName:i,mapping:a,availableSlots:o,legacyInternalFields:u}=await this.resolveQaGroupModel(r),s=Jc(n.groupBlocks??{}),d=new Set,c=new Map,l=[],f=new Map,m=new Set,p=[],F=0,k=0,b=0,x=0,C=this.buildGroupBacklinkAnchor(t[0]??null,r);for(let h of t){if(h.items.length>o.length)throw new S("errors.noteFieldMapping.qaGroupSlotCapacityExceeded",{modelName:i,capacity:o.length,itemCount:h.items.length,filePath:h.filePath,blockStartLine:h.blockStartLine});let M=await this.resolveRecoveredGroup(h,s,i,a,o),T=M.groupId??h.groupId??this.createGroupId(),D=ul(M.items,o),I=tl(h.items,D,this.createItemId,o);if(I.length>o.length)throw new S("errors.noteFieldMapping.qaGroupSlotCapacityExceeded",{modelName:i,capacity:o.length,itemCount:I.length,filePath:h.filePath,blockStartLine:h.blockStartLine});let A=nl(I,o),R=this.deckResolutionService.resolve({filePath:h.filePath,deckHint:h.deckHint,deckHintSource:h.deckHintSource,deckWarnings:h.deckWarnings},r);for(let N of R.warnings)c.set(We(N),N);let y=R.resolvedDeck.value;d.has(y)||(await this.ankiGateway.ensureDeckExists(y),d.add(y));let w=I.map(N=>({...N,title:Zr(N.title,!1),answer:Zr(kn(N.answer,r.keepPureTagLinesInCardBody),!0)})),_=Xc(a,Zr(h.stem,!1),w,this.buildGroupBacklinkAnchor(h,r)||C,r.obsidianBacklinkPlacement,u),L=M.noteId??h.noteId,P=M.loadedNote;if(L===void 0)L=await this.ankiGateway.addNote({deckName:y,modelName:i,fields:_,tags:h.tagsHint??[]}),F+=1,m.add(h.syncKey);else{if(P??(P=await this.tryLoadQaGroupNote(L,h,i)),P.kind==="missing"&&(L=await this.ankiGateway.addNote({deckName:y,modelName:i,fields:_,tags:h.tagsHint??[]}),F+=1,m.add(h.syncKey)),P.kind==="matching"){let N=P.note,re=!al(N.fields,_),Ee=!(N.deckNames??[]).includes(y),_e=et(h.tagsHint,N.tags),vn=_e.addTags.length>0||_e.removeTags.length>0;if(!re&&!Ee&&!vn){f.set(h.syncKey,L);let ko=this.now();p.push({groupId:T,noteId:L,filePath:h.filePath,headingText:h.headingText,backlinkHeadingText:h.backlinkHeadingText,headingLevel:h.headingLevel,stem:h.stem,src:h.src||Fe(h.filePath,h.backlinkHeadingText),blockStartOffset:h.blockStartOffset,blockEndOffset:h.blockEndOffset,blockStartLine:h.blockStartLine,bodyStartLine:h.bodyStartLine,blockEndLine:h.blockEndLine,contentEndLine:h.contentEndLine,markerLine:h.markerLine,markerIndent:h.markerIndent,rawBlockText:h.rawBlockText,rawBlockHash:h.rawBlockHash,deck:y,deckHint:h.deckHint,deckHintSource:h.deckHintSource,deckWarnings:[...R.warnings],tagsHint:h.tagsHint?[...h.tagsHint]:[],items:I,freeSlots:A,lastSyncedAt:M.stateRecord?.lastSyncedAt??ko,orphan:!1});continue}(re||Ee)&&await this.ankiGateway.updateNote({noteId:L,fields:_,deckName:Ee?y:void 0}),re&&(k+=1),!re&&vn&&(k+=1),Ee&&(x+=1),vn&&await this.ankiGateway.syncNoteTags([{noteId:L,addTags:_e.addTags,removeTags:_e.removeTags}]),m.add(h.syncKey)}if(P.kind==="model-mismatch"){let N=!(P.note.deckNames??[]).includes(y),re=et(h.tagsHint,P.note.tags),Ee=re.addTags.length>0||re.removeTags.length>0;try{await this.ankiGateway.updateNoteModel({noteId:L,modelName:i,fields:_})}catch(_e){throw qt({noteId:L,fromModel:P.actualModelName,toModel:P.expectedModelName,error:_e,location:`${h.filePath}:${h.blockStartLine}`})}N&&P.note.cardIds.length>0&&(await this.ankiGateway.changeDecks([{deckName:y,cardIds:P.note.cardIds}]),x+=1),Ee&&await this.ankiGateway.syncNoteTags([{noteId:L,addTags:re.addTags,removeTags:re.removeTags}]),k+=1,b+=1,m.add(h.syncKey)}}f.set(h.syncKey,L);let q=Object.fromEntries(I.filter(N=>N.itemId&&N.slot).map(N=>[N.itemId,N.slot]));(h.markerState!=="present-valid"||!this.groupMarkerService.isEquivalent(h.groupMarker,L,q,A)||ol(h))&&l.push({syncKey:h.syncKey,filePath:h.filePath,blockStartLine:h.blockStartLine,contentEndLine:h.contentEndLine,blockEndLine:h.blockEndLine,markerLine:h.markerLine,markerIndent:h.markerIndent,noteId:L,groupId:T,itemToSlot:q,freeSlots:A,sourceContent:h.sourceContent??""});let be=this.now();p.push({groupId:T,noteId:L,filePath:h.filePath,headingText:h.headingText,backlinkHeadingText:h.backlinkHeadingText,headingLevel:h.headingLevel,stem:h.stem,src:h.src||Fe(h.filePath,h.backlinkHeadingText),blockStartOffset:h.blockStartOffset,blockEndOffset:h.blockEndOffset,blockStartLine:h.blockStartLine,bodyStartLine:h.bodyStartLine,blockEndLine:h.blockEndLine,contentEndLine:h.contentEndLine,markerLine:h.markerLine,markerIndent:h.markerIndent,rawBlockText:h.rawBlockText,rawBlockHash:h.rawBlockHash,deck:y,deckHint:h.deckHint,deckHintSource:h.deckHintSource,deckWarnings:[...R.warnings],tagsHint:h.tagsHint?[...h.tagsHint]:[],items:I,freeSlots:A,lastSyncedAt:m.has(h.syncKey)?be:M.stateRecord?.lastSyncedAt??be,orphan:!1})}return{created:F,updated:k,migratedNoteTypes:b,migratedDecks:x,markerWrites:l,resolvedNoteIds:f,touchedSyncKeys:[...m],syncedGroupBlocks:p,warnings:[...c.values()]}}async resolveRecoveredGroup(t,n,r,i,a){let o=(t.groupId?n.byGroupId.get(t.groupId):void 0)??(t.noteId!==void 0?n.byNoteId.get(t.noteId):void 0)??il(n.bySrc.get(t.src));if(o)return{noteId:o.noteId,groupId:o.groupId,items:o.items.map(u=>({...u})),freeSlots:[...o.freeSlots],stateRecord:o};if(t.noteId!==void 0){let u=await this.tryLoadQaGroupNote(t.noteId,t,r);return u.kind==="matching"?{...el(u.note,i,a,t.groupId),loadedNote:u}:u.kind==="model-mismatch"?{noteId:u.note.noteId,groupId:t.groupId,items:[],freeSlots:[...a],loadedNote:u}:{noteId:t.noteId,groupId:t.groupId,items:[],freeSlots:[...a],loadedNote:u}}return{items:[],freeSlots:[...a]}}async tryLoadQaGroupNote(t,n,r){let i=(await this.ankiGateway.getNoteDetails([t]))[0];return i?i.modelName!==r?{kind:"model-mismatch",note:i,actualModelName:i.modelName,expectedModelName:r}:{kind:"matching",note:i}:{kind:"missing"}}buildGroupBacklinkAnchor(t,n){return!t||!n.addObsidianBacklink||!this.createBacklink?"":xn({href:this.createBacklink({filePath:t.filePath,sourceContent:t.sourceContent,headingLine:t.blockStartLine,blockStartLine:t.blockStartLine,bodyStartLine:t.bodyStartLine,blockEndLine:t.blockEndLine,contentEndLine:t.contentEndLine,markerLine:t.markerLine,headingLevel:t.headingLevel,headingText:t.backlinkHeadingText}),label:n.obsidianBacklinkLabel})}async resolveQaGroupModel(t){let n=t.cardTypeConfigs["qa-group"].noteType.trim();if(!n)throw new S("errors.noteFieldMapping.noteTypeNotSelected.qaGroup");let r=t.noteFieldMappings[B("qa-group",n)];if(!O(r))throw new S("errors.noteFieldMapping.missingSavedMapping.qaGroup",{modelName:n});let i=await this.ankiGateway.getModelFieldNames(n),a={...r,modelName:n,loadedFieldNames:[...i],slots:r.slots.map(o=>({...o})),warnings:[...r.warnings],acceptedWarnings:r.acceptedWarnings?[...r.acceptedWarnings]:void 0,loadedAt:this.now()};return this.qaGroupFieldMappingService.validateMapping(a,i),{modelName:n,mapping:a,availableSlots:a.slots.map(o=>o.index),legacyInternalFields:sl(i)}}};function Xc(e,t,n,r,i,a){if(!e.titleField)throw new S("errors.noteFieldMapping.qaGroupMissingTitle",{modelName:e.modelName});let o=r&&i==="question-last-line"?ut({title:t,body:""},r,i).title:t,u={[e.titleField]:o};for(let d of e.slots)u[d.questionField]="",u[d.answerField]="";for(let d of a)u[d]="";let s=new Map(e.slots.map(d=>[d.index,d]));for(let d of n){if(d.slot===void 0)continue;let c=s.get(d.slot);if(!c)continue;let l=r&&i!=="question-last-line"?ut({title:d.title,body:d.answer},r,i).body:d.answer;u[c.questionField]=d.title,u[c.answerField]=l}return u}function Jc(e){let t=new Map,n=new Map,r=new Map;for(let i of Object.values(e)){if(i.orphan)continue;t.set(i.groupId,i),n.set(i.noteId,i);let a=r.get(i.src);if(a){a.push(i);continue}r.set(i.src,[i])}return{byGroupId:t,byNoteId:n,bySrc:r}}function el(e,t,n,r){let i=[],a=new Set;for(let o of t.slots){let u=go(e.fields[o.questionField]??""),s=go(e.fields[o.answerField]??"");!u&&!s||(a.add(o.index),i.push({itemId:`recovered-slot-${String(o.index).padStart(2,"0")}`,title:u,answer:s,slot:o.index,ordinalInMarkdown:o.index}))}return{noteId:e.noteId,groupId:r,items:i,freeSlots:n.filter(o=>!a.has(o))}}function tl(e,t,n,r){let i=new Map,a=[];for(let l of t){let f=fo(l.title,l.answer),m=i.get(f);m?m.push(l):i.set(f,[l]),a.push(l)}let o=[],u=[];for(let l=0;ll.ordinalInMarkdown-f.ordinalInMarkdown||(l.slot??999)-(f.slot??999));for(let l of u){let f=e[l],m=s.shift();if(m){o[l]={...f,itemId:m.itemId,slot:m.slot};continue}o[l]={...f,itemId:n()}}let d=new Set(o.map(l=>l.slot).filter(l=>typeof l=="number")),c=[...r].filter(l=>!d.has(l));for(let l of o){if(l.slot!==void 0)continue;let f=c.shift();if(f===void 0)throw new Error("No free QA Group slots are available.");l.slot=f}return o.map((l,f)=>({...l,ordinalInMarkdown:f+1}))}function nl(e,t){let n=new Set(e.map(r=>r.slot).filter(r=>typeof r=="number"));return t.filter(r=>!n.has(r))}function fo(e,t){return`${e}\0${t}`}function rl(e,t){let n=e.findIndex(r=>r.itemId===t.itemId&&r.slot===t.slot&&r.title===t.title&&r.answer===t.answer);n>=0&&e.splice(n,1)}function il(e){if(!(!e||e.length!==1))return e[0]}function al(e,t){let n=Object.keys(t).sort();for(let r of n)if((e[r]??"")!==(t[r]??""))return!1;return!0}function ol(e){if(!e.sourceContent)return!1;let t=e.sourceContent.split(/\r?\n/);for(let n=e.blockStartLine;n$1"),i=n.restore(r),a=Kc.renderInline(i).trim();return t?bn(a):a}function ul(e,t){let n=new Set(t);return e.map(r=>({...r,slot:typeof r.slot=="number"&&n.has(r.slot)?r.slot:void 0}))}function go(e){return e.replace(/

]*>.*?<\/a><\/p>/g,"").replace(/
]*>.*?<\/a>/g,"").trim()}function sl(e){return e.includes("GroupId")&&e.includes("Src")&&e.some(n=>/^S\d+_Id$/i.test(n))&&e.some(n=>/^S\d+_Q$/i.test(n))&&e.some(n=>/^S\d+_A$/i.test(n))?e.filter(n=>n==="GroupId"||n==="Src"||/^S\d+_Id$/i.test(n)):[]}function dl(e){let t=[];return{text:e.replace(Zc,r=>{let i=`@@QA_GROUP_INLINE_CODE_${t.length}@@`;return t.push(r),i}),restore:r=>t.reduce((i,a,o)=>i.split(`@@QA_GROUP_INLINE_CODE_${o}@@`).join(a),r)}}var cl="manual-render-v3",Ae=class{constructor(t=new Oe){this.deckResolutionService=t}resolve(t,n){let r=ll(t.cardType,n),i=this.deckResolutionService.resolve(t,n),a=i.resolvedDeck.value,o=n.noteFieldMappings[B(t.cardType,r)]??null,u=t.cardType==="cloze"&&t.clozeMode==="all"?"all":void 0,s={version:cl,cardType:t.cardType,clozeMode:u,noteModel:r,mapping:o,addObsidianBacklink:n.addObsidianBacklink,obsidianBacklinkLabel:n.obsidianBacklinkLabel,obsidianBacklinkPlacement:n.obsidianBacklinkPlacement,convertHighlightsToCloze:n.convertHighlightsToCloze,keepPureTagLinesInCardBody:n.keepPureTagLinesInCardBody},d=Q(JSON.stringify(s));return{deck:a,noteModel:r,renderConfigHash:d,warnings:i.warnings}}};function ll(e,t){if(Ei(e)){if(!t.clozeNoteType.trim())throw new S("errors.noteFieldMapping.noteTypeNotSelected.cloze");return t.clozeNoteType}if(!t.qaNoteType.trim())throw new S("errors.noteFieldMapping.noteTypeNotSelected.basic");return t.qaNoteType}var Yr=/`[^`\n]+`/g,Xr=/```[\s\S]*?```|~~~[\s\S]*?~~~/g,Sn=/==(.+?)==/g,Jr=/(?:(?0&&i.add(u)}for(let o of r.text.matchAll(Jr)){let u=o[1],s=u?Number(u):e.clozeMode==="all"?1:a++;Number.isInteger(s)&&s>0&&i.add(s)}return i}function $e(e,t,n){let r=[];return{text:e.replace(t,a=>{let o=`@@${n}_${r.length}@@`;return r.push(a),o}),restore:(a,o=u=>u)=>r.reduce((u,s,d)=>u.split(`@@${n}_${d}@@`).join(o(s)),a)}}var Fn=class{constructor(t=new Ae){this.renderConfigService=t}plan(t,n,r,i){let a=new Map,o=new Set(n.pendingWriteBack.filter(x=>x.markerKind!=="group-gi").map(x=>Ie(x.filePath,x.blockStartLine,x.rawBlockHash))),u=new Set,s=[],d=[],c=[],l=[],f=[],m=[],p=new Map,F=0;for(let x of t){if(a.has(x.syncKey))throw new Error(`Duplicate syncKey detected in current scan: ${x.syncKey}`);if(a.set(x.syncKey,x),x.noteId!==void 0){let R=z(x.noteId);if(u.has(R))throw new Error(`Duplicate noteId detected in current scan: ${x.noteId}`);u.add(R)}let C=x.noteId!==void 0?n.cards[z(x.noteId)]:void 0,h=this.renderConfigService.resolve(x,i);for(let R of h.warnings)p.set(We(R),R);let M=x.noteId,T=Ie(x.filePath,x.blockStartLine,x.rawBlockHash),D={card:{...x,noteId:M},noteId:M,deck:h.deck,noteModel:h.noteModel,renderConfigHash:h.renderConfigHash};if(!M){s.push(D);continue}if(fl(C,x,i)){d.push(D);continue}if(l.push(D),(x.idMarkerState!=="present-valid"||x.noteIdSource!=="marker"||o.has(T))&&m.push(D),!C){c.push(D);continue}let I=C.rawBlockHash!==x.rawBlockHash||C.renderConfigHash!==h.renderConfigHash||!ji(C.tagsHint,x.tagsHint)||C.orphan,A=C.deck!==h.deck;I&&c.push(D),A&&f.push(D),!I&&!A&&(F+=1)}let k=new Set(r),b=Object.values(n.cards).filter(x=>k.has(x.filePath)&&!u.has(z(x.noteId)));return{toCreate:s,toRebuild:d,toUpdate:c,toVerifyDeck:l,toChangeDeck:f,toRewriteMarker:m,toOrphan:b,unchangedCards:F,warnings:Array.from(p.values())}}};function fl(e,t,n){if(!e||e.cardType!=="cloze"||t.cardType!=="cloze")return!1;let r=Se(e.cardType,e.clozeMode);if(r!=="sequential"||t.clozeMode!=="all")return!1;let i=ei({bodyMarkdown:e.bodyMarkdown,clozeMode:r,convertHighlightsToCloze:n.convertHighlightsToCloze}),a=ei({bodyMarkdown:t.bodyMarkdown,clozeMode:t.clozeMode,convertHighlightsToCloze:n.convertHighlightsToCloze});return i.size>a.size}var mo=new ot({breaks:!0,html:!0,linkify:!0}),gl=/(?`\\[${k.trim()}\\]`),d=d.replace(ml,(F,k)=>`\\(${k.trim()}\\)`),i&&r.convertHighlightsToCloze&&(d=d.replace(Sn,"{$1}")),i&&(d=d.replace(Jr,(F,k,b)=>`{{c${k?Number(k):n.card.clozeMode==="all"?1:l++}::${b}}}`)),d=d.replace(kl,(F,k)=>{let b=r.resourceResolver.resolveEmbed(k,n.card.filePath);return b?(c.push({kind:b.kind,fileName:b.fileName,absolutePath:b.absolutePath,altText:b.altText}),b.kind==="audio"?`[sound:${b.fileName}]`:`${st(b.altText??b.fileName)}`):F}),d=d.replace(bl,(F,k)=>{let b=r.resourceResolver.resolveWikiLink(k,n.card.filePath);return b?`${st(b.displayText)}`:F}),d=d.replace(Sn,"$1");let f=$e(d,hl,"MATH");d=f.text,d=s.restore(d),d=u.restore(d);let m=(a?mo.renderInline(d):mo.render(d)).trim(),p=f.restore(m,st);return{html:a?p:bn(p),media:c}}};function yl(e){let t=new Set;return e.filter(n=>{let r=`${n.kind}:${n.absolutePath}:${n.fileName}`;return t.has(r)?!1:(t.add(r),!0)})}function st(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}var dt=class extends S{constructor(t){super("errors.currentFileOutOfScope",{filePath:t}),this.name="CurrentFileOutOfScopeError"}},Ue=class extends S{constructor(){super("errors.runScopeNotConfigured"),this.name="RunScopeNotConfiguredError"}},wn=class{constructor(t,n,r,i=new Zt(t),a=new Fn,o=new Mn,u=new Ot(r),s=new Yt(t),d=new Ae,c=()=>Date.now()){this.vaultGateway=t;this.pluginStateRepository=n;this.ankiGateway=r;this.fileIndexerService=i;this.diffPlannerService=a;this.renderer=o;this.ankiBatchExecutor=u;this.markdownWriteBackService=s;this.scanScopeService=new Pe;if(this.qaGroupSyncService=new Cn(r,void 0,void 0,void 0,void 0,void 0,void 0,this.vaultGateway.createBacklink.bind(this.vaultGateway)),xl(d)){this.renderConfigService=d,this.now=c;return}this.renderConfigService=new Ae,this.now=d}async syncVault(t){pe(t),this.assertRunScopeConfigured(t);let n=await this.pluginStateRepository.load(),r=await this.fileIndexerService.indexVault(t,n);return this.syncIndexedResult(r,n,t)}async syncFile(t,n){if(pe(n),this.assertRunScopeConfigured(n),!this.scanScopeService.isPathInScope(t,n.scopeMode,n.includeFolders,n.excludeFolders))throw new dt(t);let r=await this.pluginStateRepository.load(),i=await this.fileIndexerService.indexFile(t,n,r);return this.syncIndexedResult(i,r,n)}assertRunScopeConfigured(t){if(!gt(t.scopeMode,t.includeFolders))throw new Ue}async syncIndexedResult(t,n,r){let i=this.diffPlannerService.plan(t.cards,n,t.scopedFilePaths,r),a={addObsidianBacklink:r.addObsidianBacklink,obsidianBacklinkLabel:r.obsidianBacklinkLabel,obsidianBacklinkPlacement:r.obsidianBacklinkPlacement,convertHighlightsToCloze:r.convertHighlightsToCloze,keepPureTagLinesInCardBody:r.keepPureTagLinesInCardBody,resourceResolver:this.vaultGateway},o=new Map;for(let m of[...i.toCreate,...i.toRebuild,...i.toUpdate])o.has(m.card.syncKey)||o.set(m.card.syncKey,this.renderer.render(m,a));let u=await this.ankiBatchExecutor.execute(i,o,m=>Promise.resolve(this.renderer.render(m,a)),r.noteFieldMappings),s=await this.qaGroupSyncService.sync(t.groupBlocks,n,r),d=new Map(t.indexedFiles.map(m=>[m.filePath,m])),c=await this.markdownWriteBackService.write(u.markerWrites,d,s.markerWrites),l=Cl(n,t.scopedFilePaths,s.syncedGroupBlocks),f=this.buildNextState(n,t.cards,t.indexedFiles,s.syncedGroupBlocks,r,new Set([...u.touchedSyncKeys,...s.touchedSyncKeys,...c.writtenSyncKeys]),u.resolvedNoteIds,i.toOrphan,l);if(f.pendingWriteBack=[...n.pendingWriteBack.filter(m=>!new Set(t.scopedFilePaths).has(m.filePath)),...c.pendingEntries],this.markFilesDirty(f,[...c.failureFiles.map(m=>m.filePath),...c.conflictFiles]),await this.pluginStateRepository.save(f),c.failureFiles.length>0)throw this.createWriteBackFailureError(c.failureFiles);return{scannedFiles:t.scannedFiles,scannedCards:t.cards.length+t.groupBlocks.length,created:u.created+s.created,rebuilt:u.rebuilt,updated:u.updated+s.updated,migratedNoteTypes:u.migratedNoteTypes+s.migratedNoteTypes,migratedDecks:u.migratedDecks+s.migratedDecks,orphaned:i.toOrphan.length+l.length,uploadedMedia:u.uploadedMedia,skippedUnchangedCards:t.skippedUnchangedCards,rewrittenMarkers:c.writtenSyncKeys.length,markerWriteConflictFiles:c.conflictFiles,warnings:Sl(i.warnings,s.warnings)}}buildNextState(t,n,r,i,a,o,u,s,d){let c=this.now(),l=Qn(a),f=new Set(r.filter(k=>k.content!==void 0).map(k=>k.filePath)),m=new Map;for(let k of i){let b=m.get(k.filePath);b?b.push(k):m.set(k.filePath,[k])}let p={files:{...t.files},cards:{...t.cards},groupBlocks:{...t.groupBlocks??{}},pendingWriteBack:[...t.pendingWriteBack]};for(let k of f)delete p.files[k];for(let[k,b]of Object.entries(p.cards))f.has(b.filePath)&&delete p.cards[k];for(let[k,b]of Object.entries(p.groupBlocks??{}))f.has(b.filePath)&&delete p.groupBlocks?.[k];let F=new Map;for(let k of n){let b=u.get(k.syncKey)??k.noteId;b!==void 0&&F.set(k.syncKey,b)}for(let k of r){if(k.content===void 0)continue;let b=Array.from(new Set(k.cards.map(x=>F.get(x.syncKey)).filter(x=>x!==void 0)));p.files[k.filePath]={filePath:k.filePath,fileHash:k.fileHash,fileStamp:k.fileStamp,deckRulesFingerprint:l,lastIndexedAt:c,noteIds:b,groupIds:(m.get(k.filePath)??[]).map(x=>x.groupId)}}for(let k of n){let b=F.get(k.syncKey);if(b===void 0)continue;let x=t.cards[z(b)]??(k.noteId!==void 0?t.cards[z(k.noteId)]:void 0),C=this.renderConfigService.resolve(k,a);p.cards[z(b)]={noteId:b,filePath:k.filePath,heading:k.heading,backlinkHeadingText:k.backlinkHeadingText,headingLevel:k.headingLevel,bodyMarkdown:k.bodyMarkdown,cardType:k.cardType,clozeMode:k.clozeMode,blockStartOffset:k.blockStartOffset,blockEndOffset:k.blockEndOffset,blockStartLine:k.blockStartLine,bodyStartLine:k.bodyStartLine,blockEndLine:k.blockEndLine,contentEndLine:k.contentEndLine,markerLine:k.markerLine,rawBlockText:k.rawBlockText,rawBlockHash:k.rawBlockHash,renderConfigHash:C.renderConfigHash,deck:C.deck,deckHint:k.deckHint,deckHintSource:k.deckHintSource,deckWarnings:[...k.deckWarnings],tagsHint:k.tagsHint,lastSyncedAt:o.has(k.syncKey)?c:x?.lastSyncedAt??0,orphan:!1}}for(let k of s)p.cards[z(k.noteId)]={...k,orphan:!0};for(let k of i)p.groupBlocks??(p.groupBlocks={}),p.groupBlocks[k.groupId]=k;for(let k of d)p.groupBlocks??(p.groupBlocks={}),p.groupBlocks[k.groupId]={...k,orphan:!0};return p}markFilesDirty(t,n){for(let r of new Set(n))t.files[r]&&(t.files[r]={...t.files[r],fileHash:"",fileStamp:""})}createWriteBackFailureError(t){return new S("errors.writeBack.summary",{fileCount:t.length},{failures:t})}};function xl(e){return typeof e=="object"&&e!==null&&"resolve"in e}function Cl(e,t,n){let r=new Set(t),i=new Set(n.map(a=>a.groupId));return Object.values(e.groupBlocks??{}).filter(a=>r.has(a.filePath)&&!i.has(a.groupId)).map(a=>({...a,orphan:!0}))}function Sl(...e){let t=new Map;for(let n of e)for(let r of n)t.set(We(r),r);return[...t.values()]}var ct=class extends ho.Plugin{constructor(){super(...arguments);this.settings=H;this.noticeService=new Nt;this.ankiGateway=new wt(()=>this.settings.ankiConnectUrl);this.deckTemplateInsertionService=new mt}async onload(){let n=new vt(this);this.pluginConfigRepository=new Et(n);let r=new Lt(n),i=new At(this.app);this.vaultGateway=i;try{this.settings=await this.pluginConfigRepository.load()}catch(o){console.error("Failed to load plugin settings, falling back to defaults.",o),this.settings=H,this.noticeService.error(g("notice.invalidSettingsRestored"))}let a=new wn(i,r,this.ankiGateway);this.syncCurrentFileUseCase=new Ft(a),this.syncVaultUseCase=new Mt(a),this.clearCurrentFileSyncedCardsUseCase=new St(r,this.ankiGateway,i),this.cleanupEmptyDecksUseCase=new ht(this.ankiGateway),Ai(this),this.addSettingTab(new Gt(this))}async updateSettings(n){if(!this.pluginConfigRepository)return;let r=Ce({...this.settings,...n});try{await this.pluginConfigRepository.save(r),this.settings=r}catch(i){this.noticeService.error(xe(i,"notice.failedSavePluginSettings"))}}async listNoteModels(){return this.ankiGateway.listNoteModels()}async getModelFieldNamesByModelNames(n){return this.ankiGateway.getModelFieldNamesByModelNames(n)}async getNoteModelDetails(n){return this.ankiGateway.getModelDetails(n)}async listFolderTree(){return this.vaultGateway?this.vaultGateway.listFolderTree():[]}async runSyncCurrentFile(){let n=this.app.workspace.getActiveFile();if(!n||n.extension.toLowerCase()!=="md"){this.noticeService.error(g("notice.noActiveMarkdownForSync"));return}if(!this.syncCurrentFileUseCase){this.noticeService.error(g("notice.syncUseCaseNotInitialized"));return}try{let r=await this.syncCurrentFileUseCase.execute(n.path,this.settings);this.noticeService.showSyncSummary("currentFile",r)}catch(r){if(r instanceof dt||r instanceof Ue){this.noticeService.info(lt(r));return}console.error("Current file sync failed.",r),this.noticeService.error(xe(r,"notice.currentFileSyncFailed"))}}async runSyncVault(){if(!this.syncVaultUseCase){this.noticeService.error(g("notice.syncUseCaseNotInitialized"));return}try{let n=await this.syncVaultUseCase.execute(this.settings);this.noticeService.showSyncSummary("vault",n)}catch(n){if(n instanceof Ue){this.noticeService.info(lt(n));return}console.error("Vault sync failed.",n),this.noticeService.error(xe(n,"notice.vaultSyncFailed"))}}async insertDeckTemplateToCurrentFile(){let n=this.app.workspace.getActiveFile();if(!n||n.extension.toLowerCase()!=="md"){this.noticeService.error(g("notice.noActiveMarkdownForDeckTemplateInsertion"));return}if(!this.vaultGateway){this.noticeService.error(g("notice.vaultGatewayNotInitialized"));return}try{let r=await this.vaultGateway.readMarkdownFile(n.path);if(!r){this.noticeService.error(g("notice.markdownFileNotFound",{filePath:n.path}));return}let i=this.deckTemplateInsertionService.insert(r,this.settings.fileDeckMarker,this.settings.fileDeckTemplate,this.settings.fileDeckInsertLocation);if(i.nextContent===i.expectedContent){this.noticeService.info(g("notice.deckTemplateAlreadyCurrent"));return}await this.vaultGateway.replaceMarkdownFile(n.path,i.expectedContent,i.nextContent),this.noticeService.info(g("notice.deckTemplateInserted",{deck:i.insertedDeck}))}catch(r){console.error("Deck template insertion failed.",r),this.noticeService.error(xe(r,"notice.deckTemplateInsertionFailed"))}}async runClearCurrentFileSyncedCards(){let n=this.app.workspace.getActiveFile();if(!n||n.extension.toLowerCase()!=="md"){this.noticeService.error(g("notice.noActiveMarkdownForReset"));return}if(!this.clearCurrentFileSyncedCardsUseCase){this.noticeService.error(g("notice.clearCurrentFileUseCaseNotInitialized"));return}try{if(!await this.clearCurrentFileSyncedCardsUseCase.hasTrackedCards(n.path)){this.noticeService.info(g("notice.noTrackedCardsInCurrentFile"));return}let i=await this.clearCurrentFileSyncedCardsUseCase.execute(n.path);this.noticeService.showClearCurrentFileSummary(i)}catch(r){console.error("Clear current file synced cards failed.",r),this.noticeService.error(xe(r,"notice.clearCurrentFileFailed"))}}async runCleanupEmptyDecks(){if(!this.cleanupEmptyDecksUseCase){this.noticeService.error(g("notice.cleanupEmptyDecksUseCaseNotInitialized"));return}try{let n=await this.cleanupEmptyDecksUseCase.listCandidates();if(n.length===0){this.noticeService.info(g("notice.noEmptyDeckCandidates"));return}let r=await new It(this.app,n).openAndGetSelection();if(r===null){this.noticeService.info(g("notice.cleanupEmptyDecksCancelled"));return}let i=await this.cleanupEmptyDecksUseCase.execute(r,n);this.noticeService.showCleanupEmptyDecksSummary(i)}catch(n){console.error("Cleanup empty decks failed.",n),this.noticeService.error(xe(n,"notice.cleanupEmptyDecksFailed"))}}};var Fl=ct; +`,a.map=[t,e.line],!0}function br(e,t,n,r){let i=e.bMarks[t]+e.tShift[t],a=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||i+3>a)return!1;let o=e.src.charCodeAt(i);if(o!==126&&o!==96)return!1;let u=i;i=e.skipChars(i,o);let s=i-u;if(s<3)return!1;let d=e.src.slice(u,i),c=e.src.slice(i,a);if(o===96&&c.indexOf(String.fromCharCode(o))>=0)return!1;if(r)return!0;let l=t,f=!1;for(;l++,!(l>=n||(i=u=e.bMarks[l]+e.tShift[l],a=e.eMarks[l],i=4)&&(i=e.skipChars(i,o),!(i-u=4||e.src.charCodeAt(i)!==62)return!1;if(r)return!0;let u=[],s=[],d=[],c=[],l=e.md.block.ruler.getRules("blockquote"),f=e.parentType;e.parentType="blockquote";let m=!1,p;for(p=t;p=a)break;if(e.src.charCodeAt(i++)===62&&!C){let M=e.sCount[p]+1,T,D;e.src.charCodeAt(i)===32?(i++,M++,D=!1,T=!0):e.src.charCodeAt(i)===9?(T=!0,(e.bsCount[p]+M)%4===3?(i++,M++,D=!1):D=!0):T=!1;let I=M;for(u.push(e.bMarks[p]),e.bMarks[p]=i;i=a,s.push(e.bsCount[p]),e.bsCount[p]=e.sCount[p]+1+(T?1:0),d.push(e.sCount[p]),e.sCount[p]=I-M,c.push(e.tShift[p]),e.tShift[p]=i-e.bMarks[p];continue}if(m)break;let h=!1;for(let M=0,T=l.length;M";let b=[t,0];k.map=b,e.md.block.tokenize(e,t,p);let x=e.push("blockquote_close","blockquote",-1);x.markup=">",e.lineMax=o,e.parentType=f,b[1]=e.line;for(let C=0;C=4)return!1;let a=e.bMarks[t]+e.tShift[t],o=e.src.charCodeAt(a++);if(o!==42&&o!==45&&o!==95)return!1;let u=1;for(;a=r)return-1;let a=e.src.charCodeAt(i++);if(a<48||a>57)return-1;for(;;){if(i>=r)return-1;if(a=e.src.charCodeAt(i++),a>=48&&a<=57){if(i-n>=10)return-1;continue}if(a===41||a===46)break;return-1}return i=4||e.listIndent>=0&&e.sCount[s]-e.listIndent>=4&&e.sCount[s]=e.blkIndent&&(c=!0);let l,f,m;if((m=Pa(e,s))>=0){if(l=!0,o=e.bMarks[s]+e.tShift[s],f=Number(e.src.slice(o,m-1)),c&&f!==1)return!1}else if((m=Na(e,s))>=0)l=!1;else return!1;if(c&&e.skipSpaces(m)>=e.eMarks[s])return!1;if(r)return!0;let p=e.src.charCodeAt(m-1),F=e.tokens.length;l?(u=e.push("ordered_list_open","ol",1),f!==1&&(u.attrs=[["start",f]])):u=e.push("bullet_list_open","ul",1);let k=[s,0];u.map=k,u.markup=String.fromCharCode(p);let b=!1,x=e.md.block.ruler.getRules("list"),C=e.parentType;for(e.parentType="list";s=i?D=1:D=M-h,D>4&&(D=1);let I=h+D;u=e.push("list_item_open","li",1),u.markup=String.fromCharCode(p);let A=[s,0];u.map=A,l&&(u.info=e.src.slice(o,m-1));let R=e.tight,y=e.tShift[s],v=e.sCount[s],_=e.listIndent;if(e.listIndent=e.blkIndent,e.blkIndent=I,e.tight=!0,e.tShift[s]=T-e.bMarks[s],e.sCount[s]=M,T>=i&&e.isEmpty(s+1)?e.line=Math.min(e.line+2,n):e.md.block.tokenize(e,s,n,!0),(!e.tight||b)&&(d=!1),b=e.line-s>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=_,e.tShift[s]=y,e.sCount[s]=v,e.tight=R,u=e.push("list_item_close","li",-1),u.markup=String.fromCharCode(p),s=e.line,A[1]=s,s>=n||e.sCount[s]=4)break;let L=!1;for(let P=0,q=x.length;P=4||e.src.charCodeAt(i)!==91)return!1;function u(x){let C=e.lineMax;if(x>=C||e.isEmpty(x))return null;let h=!1;if(e.sCount[x]-e.blkIndent>3&&(h=!0),e.sCount[x]<0&&(h=!0),!h){let D=e.md.block.ruler.getRules("reference"),I=e.parentType;e.parentType="reference";let A=!1;for(let R=0,y=D.length;R"u"&&(e.env.references={}),typeof e.env.references[b]>"u"&&(e.env.references[b]={title:k,href:l}),e.line=o),!0):!1}var Ra=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"];var qd="[a-zA-Z_:][a-zA-Z0-9:._-]*",zd="[^\"'=<>`\\x00-\\x20]+",Hd="'[^']*'",Od='"[^"]*"',Wd="(?:"+zd+"|"+Hd+"|"+Od+")",$d="(?:\\s+"+qd+"(?:\\s*=\\s*"+Wd+")?)",Ba="<[A-Za-z][A-Za-z0-9\\-]*"+$d+"*\\s*\\/?>",Ga="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",Ud="",Qd="<[?][\\s\\S]*?[?]>",Vd="]*>",jd="",qa=new RegExp("^(?:"+Ba+"|"+Ga+"|"+Ud+"|"+Qd+"|"+Vd+"|"+jd+")"),za=new RegExp("^(?:"+Ba+"|"+Ga+")");var He=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(za.source+"\\s*$"),/^$/,!1]];function Fr(e,t,n,r){let i=e.bMarks[t]+e.tShift[t],a=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||!e.md.options.html||e.src.charCodeAt(i)!==60)return!1;let o=e.src.slice(i,a),u=0;for(;u=4)return!1;let o=e.src.charCodeAt(i);if(o!==35||i>=a)return!1;let u=1;for(o=e.src.charCodeAt(++i);o===35&&i6||ii&&E(e.src.charCodeAt(s-1))&&(a=s),e.line=t+1;let d=e.push("heading_open","h"+String(u),1);d.markup="########".slice(0,u),d.map=[t,e.line];let c=e.push("inline","",0);c.content=e.src.slice(i,a).trim(),c.map=[t,e.line],c.children=[];let l=e.push("heading_close","h"+String(u),-1);return l.markup="########".slice(0,u),!0}function wr(e,t,n){let r=e.md.block.ruler.getRules("paragraph");if(e.sCount[t]-e.blkIndent>=4)return!1;let i=e.parentType;e.parentType="paragraph";let a=0,o,u=t+1;for(;u3)continue;if(e.sCount[u]>=e.blkIndent){let m=e.bMarks[u]+e.tShift[u],p=e.eMarks[u];if(m=p))){a=o===61?1:2;break}}if(e.sCount[u]<0)continue;let f=!1;for(let m=0,p=r.length;m3||e.sCount[a]<0)continue;let d=!1;for(let c=0,l=r.length;c=n||e.sCount[o]=a){e.line=n;break}let s=e.line,d=!1;for(let c=0;c=e.line)throw new Error("block rule didn't increment state.line");break}if(!d)throw new Error("none of the block rules matched");e.tight=!u,e.isEmpty(e.line-1)&&(u=!0),o=e.line,o0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],i={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(r),this.tokens_meta.push(i),r};it.prototype.scanDelims=function(e,t){let n=this.posMax,r=this.src.charCodeAt(e),i=e>0?this.src.charCodeAt(e-1):32,a=e;for(;a0)return!1;let n=e.pos,r=e.posMax;if(n+3>r||e.src.charCodeAt(n)!==58||e.src.charCodeAt(n+1)!==47||e.src.charCodeAt(n+2)!==47)return!1;let i=e.pending.match(Zd);if(!i)return!1;let a=i[1],o=e.md.linkify.matchAtStart(e.src.slice(n-a.length));if(!o)return!1;let u=o.url;if(u.length<=a.length)return!1;let s=u.length;for(;s>0&&u.charCodeAt(s-1)===42;)s--;s!==u.length&&(u=u.slice(0,s));let d=e.md.normalizeLink(u);if(!e.md.validateLink(d))return!1;if(!t){e.pending=e.pending.slice(0,-a.length);let c=e.push("link_open","a",1);c.attrs=[["href",d]],c.markup="linkify",c.info="auto";let l=e.push("text","",0);l.content=e.md.normalizeLinkText(u);let f=e.push("link_close","a",-1);f.markup="linkify",f.info="auto"}return e.pos+=u.length-a.length,!0}function Ar(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==10)return!1;let r=e.pending.length-1,i=e.posMax;if(!t)if(r>=0&&e.pending.charCodeAt(r)===32)if(r>=1&&e.pending.charCodeAt(r-1)===32){let a=r-1;for(;a>=1&&e.pending.charCodeAt(a-1)===32;)a--;e.pending=e.pending.slice(0,a),e.push("hardbreak","br",0)}else e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0);else e.push("softbreak","br",0);for(n++;n?@[]^_`{|}~-".split("").forEach(function(e){Er[e.charCodeAt(0)]=1});function _r(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==92||(n++,n>=r))return!1;let i=e.src.charCodeAt(n);if(i===10){for(t||e.push("hardbreak","br",0),n++;n=55296&&i<=56319&&n+1=56320&&u<=57343&&(a+=e.src[n+1],n++)}let o="\\"+a;if(!t){let u=e.push("text_special","",0);i<256&&Er[i]!==0?u.content=a:u.content=o,u.markup=o,u.info="escape"}return e.pos=n+1,!0}function Lr(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==96)return!1;let i=n;n++;let a=e.posMax;for(;n=0;r--){let i=t[r];if(i.marker!==95&&i.marker!==42||i.end===-1)continue;let a=t[i.end],o=r>0&&t[r-1].end===i.end+1&&t[r-1].marker===i.marker&&t[r-1].token===i.token-1&&t[i.end+1].token===a.token+1,u=String.fromCharCode(i.marker),s=e.tokens[i.token];s.type=o?"strong_open":"em_open",s.tag=o?"strong":"em",s.nesting=1,s.markup=o?u+u:u,s.content="";let d=e.tokens[a.token];d.type=o?"strong_close":"em_close",d.tag=o?"strong":"em",d.nesting=-1,d.markup=o?u+u:u,d.content="",o&&(e.tokens[t[r-1].token].content="",e.tokens[t[i.end+1].token].content="",r--)}}function ec(e){let t=e.tokens_meta,n=e.tokens_meta.length;$a(e,e.delimiters);for(let r=0;r=l)return!1;if(s=p,i=e.md.helpers.parseLinkDestination(e.src,p,e.posMax),i.ok){for(o=e.md.normalizeLink(i.str),e.md.validateLink(o)?p=i.pos:o="",s=p;p=l||e.src.charCodeAt(p)!==41)&&(d=!0),p++}if(d){if(typeof e.env.references>"u")return!1;if(p=0?r=e.src.slice(s,p++):p=m+1):p=m+1,r||(r=e.src.slice(f,m)),a=e.env.references[Te(r)],!a)return e.pos=c,!1;o=a.href,u=a.title}if(!t){e.pos=f,e.posMax=m;let F=e.push("link_open","a",1),k=[["href",o]];F.attrs=k,u&&k.push(["title",u]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,e.push("link_close","a",-1)}return e.pos=p,e.posMax=l,!0}function Rr(e,t){let n,r,i,a,o,u,s,d,c="",l=e.pos,f=e.posMax;if(e.src.charCodeAt(e.pos)!==33||e.src.charCodeAt(e.pos+1)!==91)return!1;let m=e.pos+2,p=e.md.helpers.parseLinkLabel(e,e.pos+1,!1);if(p<0)return!1;if(a=p+1,a=f)return!1;for(d=a,u=e.md.helpers.parseLinkDestination(e.src,a,e.posMax),u.ok&&(c=e.md.normalizeLink(u.str),e.md.validateLink(c)?a=u.pos:c=""),d=a;a=f||e.src.charCodeAt(a)!==41)return e.pos=l,!1;a++}else{if(typeof e.env.references>"u")return!1;if(a=0?i=e.src.slice(d,a++):a=p+1):a=p+1,i||(i=e.src.slice(m,p)),o=e.env.references[Te(i)],!o)return e.pos=l,!1;c=o.href,s=o.title}if(!t){r=e.src.slice(m,p);let F=[];e.md.inline.parse(r,e.md,e.env,F);let k=e.push("image","img",0),b=[["src",c],["alt",""]];k.attrs=b,k.children=F,k.content=r,s&&b.push(["title",s])}return e.pos=a,e.posMax=f,!0}var tc=/^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/,nc=/^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\x00-\x20]*)$/;function Br(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==60)return!1;let r=e.pos,i=e.posMax;for(;;){if(++n>=i)return!1;let o=e.src.charCodeAt(n);if(o===60)return!1;if(o===62)break}let a=e.src.slice(r+1,n);if(nc.test(a)){let o=e.md.normalizeLink(a);if(!e.md.validateLink(o))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",o]],u.markup="autolink",u.info="auto";let s=e.push("text","",0);s.content=e.md.normalizeLinkText(a);let d=e.push("link_close","a",-1);d.markup="autolink",d.info="auto"}return e.pos+=a.length+2,!0}if(tc.test(a)){let o=e.md.normalizeLink("mailto:"+a);if(!e.md.validateLink(o))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",o]],u.markup="autolink",u.info="auto";let s=e.push("text","",0);s.content=e.md.normalizeLinkText(a);let d=e.push("link_close","a",-1);d.markup="autolink",d.info="auto"}return e.pos+=a.length+2,!0}return!1}function rc(e){return/^\s]/i.test(e)}function ic(e){return/^<\/a\s*>/i.test(e)}function ac(e){let t=e|32;return t>=97&&t<=122}function Gr(e,t){if(!e.md.options.html)return!1;let n=e.posMax,r=e.pos;if(e.src.charCodeAt(r)!==60||r+2>=n)return!1;let i=e.src.charCodeAt(r+1);if(i!==33&&i!==63&&i!==47&&!ac(i))return!1;let a=e.src.slice(r).match(qa);if(!a)return!1;if(!t){let o=e.push("html_inline","",0);o.content=a[0],rc(o.content)&&e.linkLevel++,ic(o.content)&&e.linkLevel--}return e.pos+=a[0].length,!0}var oc=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,uc=/^&([a-z][a-z0-9]{1,31});/i;function qr(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==38||n+1>=r)return!1;if(e.src.charCodeAt(n+1)===35){let a=e.src.slice(n).match(oc);if(a){if(!t){let o=a[1][0].toLowerCase()==="x"?parseInt(a[1].slice(1),16):parseInt(a[1],10),u=e.push("text_special","",0);u.content=ln(o)?rt(o):rt(65533),u.markup=a[0],u.info="entity"}return e.pos+=a[0].length,!0}}else{let a=e.src.slice(n).match(uc);if(a){let o=he(a[0]);if(o!==a[0]){if(!t){let u=e.push("text_special","",0);u.content=o,u.markup=a[0],u.info="entity"}return e.pos+=a[0].length,!0}}}return!1}function Ua(e){let t={},n=e.length;if(!n)return;let r=0,i=-2,a=[];for(let o=0;os;d-=a[d]+1){let l=e[d];if(l.marker===u.marker&&l.open&&l.end<0){let f=!1;if((l.close||u.open)&&(l.length+u.length)%3===0&&(l.length%3!==0||u.length%3!==0)&&(f=!0),!f){let m=d>0&&!e[d-1].open?a[d-1]+1:0;a[o]=o-d+m,a[d]=m,u.open=!1,l.end=o,l.close=!1,c=-1,i=-2;break}}}c!==-1&&(t[u.marker][(u.open?3:0)+(u.length||0)%3]=c)}}function zr(e){let t=e.tokens_meta,n=e.tokens_meta.length;Ua(e.delimiters);for(let r=0;r0&&r++,i[t].type==="text"&&t+1=e.pos)throw new Error("inline rule didn't increment state.pos");break}}else e.pos=e.posMax;o||e.pos++,a[t]=e.pos};at.prototype.tokenize=function(e){let t=this.ruler.getRules(""),n=t.length,r=e.posMax,i=e.md.options.maxNesting;for(;e.pos=e.pos)throw new Error("inline rule didn't increment state.pos");break}}if(o){if(e.pos>=r)break;continue}e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()};at.prototype.parse=function(e,t,n,r){let i=new this.State(e,t,n,r);this.tokenize(i);let a=this.ruler2.getRules(""),o=a.length;for(let u=0;u|$))",t.tpl_email_fuzzy="(^|"+n+'|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}function $r(e){return Array.prototype.slice.call(arguments,1).forEach(function(n){n&&Object.keys(n).forEach(function(r){e[r]=n[r]})}),e}function hn(e){return Object.prototype.toString.call(e)}function sc(e){return hn(e)==="[object String]"}function dc(e){return hn(e)==="[object Object]"}function cc(e){return hn(e)==="[object RegExp]"}function ja(e){return hn(e)==="[object Function]"}function lc(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var Za={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};function pc(e){return Object.keys(e||{}).reduce(function(t,n){return t||Za.hasOwnProperty(n)},!1)}var fc={"http:":{validate:function(e,t,n){let r=e.slice(t);return n.re.http||(n.re.http=new RegExp("^\\/\\/"+n.re.src_auth+n.re.src_host_port_strict+n.re.src_path,"i")),n.re.http.test(r)?r.match(n.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,t,n){let r=e.slice(t);return n.re.no_http||(n.re.no_http=new RegExp("^"+n.re.src_auth+"(?:localhost|(?:(?:"+n.re.src_domain+")\\.)+"+n.re.src_domain_root+")"+n.re.src_port+n.re.src_host_terminator+n.re.src_path,"i")),n.re.no_http.test(r)?t>=3&&e[t-3]===":"||t>=3&&e[t-3]==="/"?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){let r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},gc="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",mc="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");function hc(e){e.__index__=-1,e.__text_cache__=""}function kc(e){return function(t,n){let r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}function Ka(){return function(e,t){t.normalize(e)}}function mn(e){let t=e.re=Va(e.__opts__),n=e.__tlds__.slice();e.onCompile(),e.__tlds_replaced__||n.push(gc),n.push(t.src_xn),t.src_tlds=n.join("|");function r(u){return u.replace("%TLDS%",t.src_tlds)}t.email_fuzzy=RegExp(r(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(r(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(r(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(r(t.tpl_host_fuzzy_test),"i");let i=[];e.__compiled__={};function a(u,s){throw new Error('(LinkifyIt) Invalid schema "'+u+'": '+s)}Object.keys(e.__schemas__).forEach(function(u){let s=e.__schemas__[u];if(s===null)return;let d={validate:null,link:null};if(e.__compiled__[u]=d,dc(s)){cc(s.validate)?d.validate=kc(s.validate):ja(s.validate)?d.validate=s.validate:a(u,s),ja(s.normalize)?d.normalize=s.normalize:s.normalize?a(u,s):d.normalize=Ka();return}if(sc(s)){i.push(u);return}a(u,s)}),i.forEach(function(u){e.__compiled__[e.__schemas__[u]]&&(e.__compiled__[u].validate=e.__compiled__[e.__schemas__[u]].validate,e.__compiled__[u].normalize=e.__compiled__[e.__schemas__[u]].normalize)}),e.__compiled__[""]={validate:null,normalize:Ka()};let o=Object.keys(e.__compiled__).filter(function(u){return u.length>0&&e.__compiled__[u]}).map(lc).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+o+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+o+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),hc(e)}function bc(e,t){let n=e.__index__,r=e.__last_index__,i=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=i,this.text=i,this.url=i}function Ur(e,t){let n=new bc(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function V(e,t){if(!(this instanceof V))return new V(e,t);t||pc(e)&&(t=e,e={}),this.__opts__=$r({},Za,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=$r({},fc,e),this.__compiled__={},this.__tlds__=mc,this.__tlds_replaced__=!1,this.re={},mn(this)}V.prototype.add=function(t,n){return this.__schemas__[t]=n,mn(this),this};V.prototype.set=function(t){return this.__opts__=$r(this.__opts__,t),this};V.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;let n,r,i,a,o,u,s,d,c;if(this.re.schema_test.test(t)){for(s=this.re.schema_search,s.lastIndex=0;(n=s.exec(t))!==null;)if(a=this.testSchemaAt(t,n[2],s.lastIndex),a){this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+a;break}}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(d=t.search(this.re.host_fuzzy_test),d>=0&&(this.__index__<0||d=0&&(i=t.match(this.re.email_fuzzy))!==null&&(o=i.index+i[1].length,u=i.index+i[0].length,(this.__index__<0||othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=o,this.__last_index__=u))),this.__index__>=0};V.prototype.pretest=function(t){return this.re.pretest.test(t)};V.prototype.testSchemaAt=function(t,n,r){return this.__compiled__[n.toLowerCase()]?this.__compiled__[n.toLowerCase()].validate(t,r,this):0};V.prototype.match=function(t){let n=[],r=0;this.__index__>=0&&this.__text_cache__===t&&(n.push(Ur(this,r)),r=this.__last_index__);let i=r?t.slice(r):t;for(;this.test(i);)n.push(Ur(this,r)),i=i.slice(this.__last_index__),r+=this.__last_index__;return n.length?n:null};V.prototype.matchAtStart=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return null;let n=this.re.schema_at_start.exec(t);if(!n)return null;let r=this.testSchemaAt(t,n[2],n[0].length);return r?(this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+r,Ur(this,0)):null};V.prototype.tlds=function(t,n){return t=Array.isArray(t)?t:[t],n?(this.__tlds__=this.__tlds__.concat(t).sort().filter(function(r,i,a){return r!==a[i-1]}).reverse(),mn(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,mn(this),this)};V.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),t.schema==="mailto:"&&!/^mailto:/i.test(t.url)&&(t.url="mailto:"+t.url)};V.prototype.onCompile=function(){};var Ya=V;var yc=/^xn--/,xc=/[^\0-\x7F]/,Cc=/[\x2E\u3002\uFF0E\uFF61]/g,Sc={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Qr=35,ne=Math.floor,Vr=String.fromCharCode;function ke(e){throw new RangeError(Sc[e])}function Fc(e,t){let n=[],r=e.length;for(;r--;)n[r]=t(e[r]);return n}function Ja(e,t){let n=e.split("@"),r="";n.length>1&&(r=n[0]+"@",e=n[1]),e=e.replace(Cc,".");let i=e.split("."),a=Fc(i,t).join(".");return r+a}function eo(e){let t=[],n=0,r=e.length;for(;n=55296&&i<=56319&&nString.fromCodePoint(...e),wc=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:36},Xa=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},to=function(e,t,n){let r=0;for(e=n?ne(e/700):e>>1,e+=ne(e/t);e>Qr*26>>1;r+=36)e=ne(e/Qr);return ne(r+(Qr+1)*e/(e+38))},no=function(e){let t=[],n=e.length,r=0,i=128,a=72,o=e.lastIndexOf("-");o<0&&(o=0);for(let u=0;u=128&&ke("not-basic"),t.push(e.charCodeAt(u));for(let u=o>0?o+1:0;u=n&&ke("invalid-input");let f=wc(e.charCodeAt(u++));f>=36&&ke("invalid-input"),f>ne((2147483647-r)/c)&&ke("overflow"),r+=f*c;let m=l<=a?1:l>=a+26?26:l-a;if(fne(2147483647/p)&&ke("overflow"),c*=p}let d=t.length+1;a=to(r-s,d,s==0),ne(r/d)>2147483647-i&&ke("overflow"),i+=ne(r/d),r%=d,t.splice(r++,0,i)}return String.fromCodePoint(...t)},ro=function(e){let t=[];e=eo(e);let n=e.length,r=128,i=0,a=72;for(let s of e)s<128&&t.push(Vr(s));let o=t.length,u=o;for(o&&t.push("-");u=r&&cne((2147483647-i)/d)&&ke("overflow"),i+=(s-r)*d,r=s;for(let c of e)if(c2147483647&&ke("overflow"),c===r){let l=i;for(let f=36;;f+=36){let m=f<=a?1:f>=a+26?26:f-a;if(l=0))try{t.hostname=jr.toASCII(t.hostname)}catch{}return en(Re(t))}function Nc(e){let t=nt(e,!0);if(t.hostname&&(!t.protocol||uo.indexOf(t.protocol)>=0))try{t.hostname=jr.toUnicode(t.hostname)}catch{}return tt(Re(t),tt.defaultChars+"%")}function j(e,t){if(!(this instanceof j))return new j(e,t);t||cn(e)||(t=e||{},e="default"),this.inline=new Qa,this.block=new Ha,this.core=new _a,this.renderer=new wa,this.linkify=new Ya,this.validateLink=Lc,this.normalizeLink=Ic,this.normalizeLinkText=Nc,this.utils=tr,this.helpers=Ge({},ar),this.options={},this.configure(e),t&&this.set(t)}j.prototype.set=function(e){return Ge(this.options,e),this};j.prototype.configure=function(e){let t=this;if(cn(e)){let n=e;if(e=Ac[n],!e)throw new Error('Wrong `markdown-it` preset "'+n+'", check name')}if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(n){e.components[n].rules&&t[n].ruler.enableOnly(e.components[n].rules),e.components[n].rules2&&t[n].ruler2.enableOnly(e.components[n].rules2)}),this};j.prototype.enable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(i){n=n.concat(this[i].ruler.enable(e,!0))},this),n=n.concat(this.inline.ruler2.enable(e,!0));let r=e.filter(function(i){return n.indexOf(i)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+r);return this};j.prototype.disable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(i){n=n.concat(this[i].ruler.disable(e,!0))},this),n=n.concat(this.inline.ruler2.disable(e,!0));let r=e.filter(function(i){return n.indexOf(i)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+r);return this};j.prototype.use=function(e){let t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this};j.prototype.parse=function(e,t){if(typeof e!="string")throw new Error("Input data should be a String");let n=new this.core.State(e,this,t);return this.core.process(n),n.tokens};j.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)};j.prototype.parseInline=function(e,t){let n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens};j.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var ot=j;var Pc=/^#[^\s#.,,。;;::!?!?()[\]{}<>]+(?:\/[^\s#.,,。;;::!?!?()[\]{}<>]+)*$/u;function kn(e,t){if(t||e.length===0)return e;let n=e.split(/\r?\n/),r=n.filter(i=>!Rc(i));return r.length===n.length?e:Gc(Bc(r)).join(` +`)}function Rc(e){let t=e.trim();return t?t.split(/\s+/).every(n=>Pc.test(n)):!1}function Bc(e){let t=0,n=e.length;for(;tt&&!e[n-1].trim();)n-=1;return e.slice(t,n)}function Gc(e){let t=[];for(let n of e){let r=n.trim().length===0,i=t[t.length-1],a=i!==void 0&&i.trim().length===0;r&&a||t.push(r?"":n)}return t}var qc="#[^\\s#.,\uFF0C\u3002;\uFF1B:\uFF1A!?\uFF01\uFF1F()[\\]{}<>]+(?:\\/[^\\s#.,\uFF0C\u3002;\uFF1B:\uFF1A!?\uFF01\uFF1F()[\\]{}<>]+)*";var zc=/[\p{L}\p{N}_/#]/u,Hc=new Set(["code","pre"]),Oc="ahs-ob-tag";function bn(e){if(!e||!e.includes("#"))return e;let t="",n=0,r=[];for(;nn){let s=e.slice(n,a);t+=r.length===0?so(s):s,n=a}if(n>=e.length)break;let o=e.indexOf(">",n);if(o===-1){let s=e.slice(n);t+=r.length===0?so(s):s;break}let u=e.slice(n,o+1);Uc(u,r),t+=u,n=o+1}return t}function so(e){let t=new RegExp(qc,"gu"),n="",r=0,i;for(;(i=t.exec(e))!==null;){let a=i[0],o=i.index,u=o+a.length;if(!Wc(e,o))continue;let s=Tt([a])[0];s&&(n+=e.slice(r,o),n+=$c(a,s),r=u)}return r===0?e:n+e.slice(r)}function Wc(e,t){return t===0?!0:!zc.test(e[t-1]??"")}function $c(e,t){return`${co(e)}`}function Uc(e,t){let n=/^<\s*(\/)?\s*([a-zA-Z0-9-]+)/.exec(e);if(!n)return;let r=!!n[1],i=n[2]?.toLowerCase();if(!(!i||!Hc.has(i))){if(r){for(let a=t.length-1;a>=0;a-=1)if(t[a]===i){t.splice(a,1);break}return}/\/\s*>$/.test(e)||t.push(i)}}function co(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}var yn=class{constructor(t=new Z){this.deckNormalizationService=t}mapFilePathToDeck(t,n,r=[]){let i=Qc(t,n,r);if(i==="off")return{warnings:[]};let a=lo(t),o=a.lastIndexOf("/");if(o<0)return{warnings:[]};let u=a.slice(0,o);if(!u.trim())return{warnings:[]};let s=u.split("/").filter(Boolean);if(i==="folder-and-file"){let d=a.slice(o+1).replace(/\.[^.]+$/,"").trim();d&&s.push(d)}return s.some(d=>d.includes("::"))?{warnings:[{filePath:t,code:"deck_invalid_folder_segment"}]}:{deck:this.deckNormalizationService.normalize(s.join("/")),warnings:[]}}};function Qc(e,t,n){if(t==="off")return"off";let r=lo(e);return n.some(a=>{let o=Vc(a);return o.length>0&&jc(r,o)})?t==="folder"?"folder-and-file":"folder":t}function Vc(e){return e.trim().replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function lo(e){return e.trim().replace(/\\/g,"/").replace(/^\/+/,"")}function jc(e,t){return e===t||e.startsWith(`${t}/`)}var Oe=class{constructor(t=new yn,n=new Z){this.folderDeckMappingService=t;this.deckNormalizationService=n}resolve(t,n){if(t.deckHint)return{resolvedDeck:{value:this.deckNormalizationService.normalize(t.deckHint),source:t.deckHintSource??"body"},warnings:[...t.deckWarnings]};let r=this.folderDeckMappingService.mapFilePathToDeck(t.filePath,n.folderDeckMode,n.alternateFolderDeckModeFolders);return r.deck?{resolvedDeck:{value:r.deck,source:"folder"},warnings:[...t.deckWarnings,...r.warnings]}:{resolvedDeck:{value:this.deckNormalizationService.normalize(n.defaultDeck),source:"default"},warnings:[...t.deckWarnings,...r.warnings,{filePath:t.filePath,code:"deck_fallback_default"}]}}};function We(e){return`${e.filePath}\0${e.code}\0${Kr(e.params)}`}function Kr(e){return e===void 0?"":e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(n=>Kr(n)).join(",")}]`:`{${Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${JSON.stringify(n)}:${Kr(r)}`).join(",")}}`}function xn({href:e,label:t,escapeHref:n=!0}){return`${po(t)}`}function ut(e,t,n){if(n==="question-last-line")return{title:e.title?`${e.title}
${t}`:t,body:e.body};let r=`

${t}

`;return n==="answer-first-line"?{title:e.title,body:e.body?`${r}${e.body}`:r}:{title:e.title,body:e.body?`${e.body}${r}`:r}}function po(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}var Kc=new ot({breaks:!0,html:!0,linkify:!0}),Zc=/`[^`\n]+`/g,Yc=/==(.+?)==/g,Cn=class{constructor(t,n=new ce,r=new Oe,i=new X,a=()=>Date.now(),o=()=>`g_${Q(`${Date.now()}_${Math.random()}_${Date.now()}`).slice(0,12)}`,u=()=>(this.sequence+=1,`i_${Q(`${Date.now()}_${this.sequence}_${Math.random()}`).slice(0,10)}`),s){this.ankiGateway=t;this.qaGroupFieldMappingService=n;this.deckResolutionService=r;this.groupMarkerService=i;this.now=a;this.createGroupId=o;this.createItemId=u;this.createBacklink=s;this.sequence=0}async sync(t,n,r){if(t.length===0)return{created:0,updated:0,migratedNoteTypes:0,migratedDecks:0,markerWrites:[],resolvedNoteIds:new Map,touchedSyncKeys:[],syncedGroupBlocks:[],warnings:[]};let{modelName:i,mapping:a,availableSlots:o,legacyInternalFields:u}=await this.resolveQaGroupModel(r),s=Jc(n.groupBlocks??{}),d=new Set,c=new Map,l=[],f=new Map,m=new Set,p=[],F=0,k=0,b=0,x=0,C=this.buildGroupBacklinkAnchor(t[0]??null,r);for(let h of t){if(h.items.length>o.length)throw new S("errors.noteFieldMapping.qaGroupSlotCapacityExceeded",{modelName:i,capacity:o.length,itemCount:h.items.length,filePath:h.filePath,blockStartLine:h.blockStartLine});let M=await this.resolveRecoveredGroup(h,s,i,a,o),T=M.groupId??h.groupId??this.createGroupId(),D=ul(M.items,o),I=tl(h.items,D,this.createItemId,o);if(I.length>o.length)throw new S("errors.noteFieldMapping.qaGroupSlotCapacityExceeded",{modelName:i,capacity:o.length,itemCount:I.length,filePath:h.filePath,blockStartLine:h.blockStartLine});let A=nl(I,o),R=this.deckResolutionService.resolve({filePath:h.filePath,deckHint:h.deckHint,deckHintSource:h.deckHintSource,deckWarnings:h.deckWarnings},r);for(let N of R.warnings)c.set(We(N),N);let y=R.resolvedDeck.value;d.has(y)||(await this.ankiGateway.ensureDeckExists(y),d.add(y));let v=I.map(N=>({...N,title:Zr(N.title,!1),answer:Zr(kn(N.answer,r.keepPureTagLinesInCardBody),!0)})),_=Xc(a,Zr(h.stem,!1),v,this.buildGroupBacklinkAnchor(h,r)||C,r.obsidianBacklinkPlacement,u),L=M.noteId??h.noteId,P=M.loadedNote;if(L===void 0)L=await this.ankiGateway.addNote({deckName:y,modelName:i,fields:_,tags:h.tagsHint??[]}),F+=1,m.add(h.syncKey);else{if(P??(P=await this.tryLoadQaGroupNote(L,h,i)),P.kind==="missing"&&(L=await this.ankiGateway.addNote({deckName:y,modelName:i,fields:_,tags:h.tagsHint??[]}),F+=1,m.add(h.syncKey)),P.kind==="matching"){let N=P.note,re=!al(N.fields,_),Ee=!(N.deckNames??[]).includes(y),_e=et(h.tagsHint,N.tags),vn=_e.addTags.length>0||_e.removeTags.length>0;if(!re&&!Ee&&!vn){f.set(h.syncKey,L);let ko=this.now();p.push({groupId:T,noteId:L,filePath:h.filePath,headingText:h.headingText,backlinkHeadingText:h.backlinkHeadingText,headingLevel:h.headingLevel,stem:h.stem,src:h.src||Fe(h.filePath,h.backlinkHeadingText),blockStartOffset:h.blockStartOffset,blockEndOffset:h.blockEndOffset,blockStartLine:h.blockStartLine,bodyStartLine:h.bodyStartLine,blockEndLine:h.blockEndLine,contentEndLine:h.contentEndLine,markerLine:h.markerLine,markerIndent:h.markerIndent,rawBlockText:h.rawBlockText,rawBlockHash:h.rawBlockHash,deck:y,deckHint:h.deckHint,deckHintSource:h.deckHintSource,deckWarnings:[...R.warnings],tagsHint:h.tagsHint?[...h.tagsHint]:[],items:I,freeSlots:A,lastSyncedAt:M.stateRecord?.lastSyncedAt??ko,orphan:!1});continue}(re||Ee)&&await this.ankiGateway.updateNote({noteId:L,fields:_,deckName:Ee?y:void 0}),re&&(k+=1),!re&&vn&&(k+=1),Ee&&(x+=1),vn&&await this.ankiGateway.syncNoteTags([{noteId:L,addTags:_e.addTags,removeTags:_e.removeTags}]),m.add(h.syncKey)}if(P.kind==="model-mismatch"){let N=!(P.note.deckNames??[]).includes(y),re=et(h.tagsHint,P.note.tags),Ee=re.addTags.length>0||re.removeTags.length>0;try{await this.ankiGateway.updateNoteModel({noteId:L,modelName:i,fields:_})}catch(_e){throw qt({noteId:L,fromModel:P.actualModelName,toModel:P.expectedModelName,error:_e,location:`${h.filePath}:${h.blockStartLine}`})}N&&P.note.cardIds.length>0&&(await this.ankiGateway.changeDecks([{deckName:y,cardIds:P.note.cardIds}]),x+=1),Ee&&await this.ankiGateway.syncNoteTags([{noteId:L,addTags:re.addTags,removeTags:re.removeTags}]),k+=1,b+=1,m.add(h.syncKey)}}f.set(h.syncKey,L);let q=Object.fromEntries(I.filter(N=>N.itemId&&N.slot).map(N=>[N.itemId,N.slot]));(h.markerState!=="present-valid"||!this.groupMarkerService.isEquivalent(h.groupMarker,L,q,A)||ol(h))&&l.push({syncKey:h.syncKey,filePath:h.filePath,blockStartLine:h.blockStartLine,contentEndLine:h.contentEndLine,blockEndLine:h.blockEndLine,markerLine:h.markerLine,markerIndent:h.markerIndent,noteId:L,groupId:T,itemToSlot:q,freeSlots:A,sourceContent:h.sourceContent??""});let be=this.now();p.push({groupId:T,noteId:L,filePath:h.filePath,headingText:h.headingText,backlinkHeadingText:h.backlinkHeadingText,headingLevel:h.headingLevel,stem:h.stem,src:h.src||Fe(h.filePath,h.backlinkHeadingText),blockStartOffset:h.blockStartOffset,blockEndOffset:h.blockEndOffset,blockStartLine:h.blockStartLine,bodyStartLine:h.bodyStartLine,blockEndLine:h.blockEndLine,contentEndLine:h.contentEndLine,markerLine:h.markerLine,markerIndent:h.markerIndent,rawBlockText:h.rawBlockText,rawBlockHash:h.rawBlockHash,deck:y,deckHint:h.deckHint,deckHintSource:h.deckHintSource,deckWarnings:[...R.warnings],tagsHint:h.tagsHint?[...h.tagsHint]:[],items:I,freeSlots:A,lastSyncedAt:m.has(h.syncKey)?be:M.stateRecord?.lastSyncedAt??be,orphan:!1})}return{created:F,updated:k,migratedNoteTypes:b,migratedDecks:x,markerWrites:l,resolvedNoteIds:f,touchedSyncKeys:[...m],syncedGroupBlocks:p,warnings:[...c.values()]}}async resolveRecoveredGroup(t,n,r,i,a){let o=(t.groupId?n.byGroupId.get(t.groupId):void 0)??(t.noteId!==void 0?n.byNoteId.get(t.noteId):void 0)??il(n.bySrc.get(t.src));if(o)return{noteId:o.noteId,groupId:o.groupId,items:o.items.map(u=>({...u})),freeSlots:[...o.freeSlots],stateRecord:o};if(t.noteId!==void 0){let u=await this.tryLoadQaGroupNote(t.noteId,t,r);return u.kind==="matching"?{...el(u.note,i,a,t.groupId),loadedNote:u}:u.kind==="model-mismatch"?{noteId:u.note.noteId,groupId:t.groupId,items:[],freeSlots:[...a],loadedNote:u}:{noteId:t.noteId,groupId:t.groupId,items:[],freeSlots:[...a],loadedNote:u}}return{items:[],freeSlots:[...a]}}async tryLoadQaGroupNote(t,n,r){let i=(await this.ankiGateway.getNoteDetails([t]))[0];return i?i.modelName!==r?{kind:"model-mismatch",note:i,actualModelName:i.modelName,expectedModelName:r}:{kind:"matching",note:i}:{kind:"missing"}}buildGroupBacklinkAnchor(t,n){return!t||!n.addObsidianBacklink||!this.createBacklink?"":xn({href:this.createBacklink({filePath:t.filePath,sourceContent:t.sourceContent,headingLine:t.blockStartLine,blockStartLine:t.blockStartLine,bodyStartLine:t.bodyStartLine,blockEndLine:t.blockEndLine,contentEndLine:t.contentEndLine,markerLine:t.markerLine,headingLevel:t.headingLevel,headingText:t.backlinkHeadingText}),label:n.obsidianBacklinkLabel})}async resolveQaGroupModel(t){let n=t.cardTypeConfigs["qa-group"].noteType.trim();if(!n)throw new S("errors.noteFieldMapping.noteTypeNotSelected.qaGroup");let r=t.noteFieldMappings[B("qa-group",n)];if(!O(r))throw new S("errors.noteFieldMapping.missingSavedMapping.qaGroup",{modelName:n});let i=await this.ankiGateway.getModelFieldNames(n),a={...r,modelName:n,loadedFieldNames:[...i],slots:r.slots.map(o=>({...o})),warnings:[...r.warnings],acceptedWarnings:r.acceptedWarnings?[...r.acceptedWarnings]:void 0,loadedAt:this.now()};return this.qaGroupFieldMappingService.validateMapping(a,i),{modelName:n,mapping:a,availableSlots:a.slots.map(o=>o.index),legacyInternalFields:sl(i)}}};function Xc(e,t,n,r,i,a){if(!e.titleField)throw new S("errors.noteFieldMapping.qaGroupMissingTitle",{modelName:e.modelName});let o=r&&i==="question-last-line"?ut({title:t,body:""},r,i).title:t,u={[e.titleField]:o};for(let d of e.slots)u[d.questionField]="",u[d.answerField]="";for(let d of a)u[d]="";let s=new Map(e.slots.map(d=>[d.index,d]));for(let d of n){if(d.slot===void 0)continue;let c=s.get(d.slot);if(!c)continue;let l=r&&i!=="question-last-line"?ut({title:d.title,body:d.answer},r,i).body:d.answer;u[c.questionField]=d.title,u[c.answerField]=l}return u}function Jc(e){let t=new Map,n=new Map,r=new Map;for(let i of Object.values(e)){if(i.orphan)continue;t.set(i.groupId,i),n.set(i.noteId,i);let a=r.get(i.src);if(a){a.push(i);continue}r.set(i.src,[i])}return{byGroupId:t,byNoteId:n,bySrc:r}}function el(e,t,n,r){let i=[],a=new Set;for(let o of t.slots){let u=go(e.fields[o.questionField]??""),s=go(e.fields[o.answerField]??"");!u&&!s||(a.add(o.index),i.push({itemId:`recovered-slot-${String(o.index).padStart(2,"0")}`,title:u,answer:s,slot:o.index,ordinalInMarkdown:o.index}))}return{noteId:e.noteId,groupId:r,items:i,freeSlots:n.filter(o=>!a.has(o))}}function tl(e,t,n,r){let i=new Map,a=[];for(let l of t){let f=fo(l.title,l.answer),m=i.get(f);m?m.push(l):i.set(f,[l]),a.push(l)}let o=[],u=[];for(let l=0;ll.ordinalInMarkdown-f.ordinalInMarkdown||(l.slot??999)-(f.slot??999));for(let l of u){let f=e[l],m=s.shift();if(m){o[l]={...f,itemId:m.itemId,slot:m.slot};continue}o[l]={...f,itemId:n()}}let d=new Set(o.map(l=>l.slot).filter(l=>typeof l=="number")),c=[...r].filter(l=>!d.has(l));for(let l of o){if(l.slot!==void 0)continue;let f=c.shift();if(f===void 0)throw new Error("No free QA Group slots are available.");l.slot=f}return o.map((l,f)=>({...l,ordinalInMarkdown:f+1}))}function nl(e,t){let n=new Set(e.map(r=>r.slot).filter(r=>typeof r=="number"));return t.filter(r=>!n.has(r))}function fo(e,t){return`${e}\0${t}`}function rl(e,t){let n=e.findIndex(r=>r.itemId===t.itemId&&r.slot===t.slot&&r.title===t.title&&r.answer===t.answer);n>=0&&e.splice(n,1)}function il(e){if(!(!e||e.length!==1))return e[0]}function al(e,t){let n=Object.keys(t).sort();for(let r of n)if((e[r]??"")!==(t[r]??""))return!1;return!0}function ol(e){if(!e.sourceContent)return!1;let t=e.sourceContent.split(/\r?\n/);for(let n=e.blockStartLine;n$1"),i=n.restore(r),a=Kc.renderInline(i).trim();return t?bn(a):a}function ul(e,t){let n=new Set(t);return e.map(r=>({...r,slot:typeof r.slot=="number"&&n.has(r.slot)?r.slot:void 0}))}function go(e){return e.replace(/

]*>.*?<\/a><\/p>/g,"").replace(/
]*>.*?<\/a>/g,"").trim()}function sl(e){return e.includes("GroupId")&&e.includes("Src")&&e.some(n=>/^S\d+_Id$/i.test(n))&&e.some(n=>/^S\d+_Q$/i.test(n))&&e.some(n=>/^S\d+_A$/i.test(n))?e.filter(n=>n==="GroupId"||n==="Src"||/^S\d+_Id$/i.test(n)):[]}function dl(e){let t=[];return{text:e.replace(Zc,r=>{let i=`@@QA_GROUP_INLINE_CODE_${t.length}@@`;return t.push(r),i}),restore:r=>t.reduce((i,a,o)=>i.split(`@@QA_GROUP_INLINE_CODE_${o}@@`).join(a),r)}}var cl="manual-render-v3",Ae=class{constructor(t=new Oe){this.deckResolutionService=t}resolve(t,n){let r=ll(t.cardType,n),i=this.deckResolutionService.resolve(t,n),a=i.resolvedDeck.value,o=n.noteFieldMappings[B(t.cardType,r)]??null,u=t.cardType==="cloze"&&t.clozeMode==="all"?"all":void 0,s={version:cl,cardType:t.cardType,clozeMode:u,noteModel:r,mapping:o,addObsidianBacklink:n.addObsidianBacklink,obsidianBacklinkLabel:n.obsidianBacklinkLabel,obsidianBacklinkPlacement:n.obsidianBacklinkPlacement,convertHighlightsToCloze:n.convertHighlightsToCloze,keepPureTagLinesInCardBody:n.keepPureTagLinesInCardBody},d=Q(JSON.stringify(s));return{deck:a,noteModel:r,renderConfigHash:d,warnings:i.warnings}}};function ll(e,t){if(Ei(e)){if(!t.clozeNoteType.trim())throw new S("errors.noteFieldMapping.noteTypeNotSelected.cloze");return t.clozeNoteType}if(!t.qaNoteType.trim())throw new S("errors.noteFieldMapping.noteTypeNotSelected.basic");return t.qaNoteType}var Yr=/`[^`\n]+`/g,Xr=/```[\s\S]*?```|~~~[\s\S]*?~~~/g,Sn=/==(.+?)==/g,Jr=/(?:(?0&&i.add(u)}for(let o of r.text.matchAll(Jr)){let u=o[1],s=u?Number(u):e.clozeMode==="all"?1:a++;Number.isInteger(s)&&s>0&&i.add(s)}return i}function $e(e,t,n){let r=[];return{text:e.replace(t,a=>{let o=`@@${n}_${r.length}@@`;return r.push(a),o}),restore:(a,o=u=>u)=>r.reduce((u,s,d)=>u.split(`@@${n}_${d}@@`).join(o(s)),a)}}var Fn=class{constructor(t=new Ae){this.renderConfigService=t}plan(t,n,r,i){let a=new Map,o=new Set(n.pendingWriteBack.filter(x=>x.markerKind!=="group-gi").map(x=>Ie(x.filePath,x.blockStartLine,x.rawBlockHash))),u=new Set,s=[],d=[],c=[],l=[],f=[],m=[],p=new Map,F=0;for(let x of t){if(a.has(x.syncKey))throw new Error(`Duplicate syncKey detected in current scan: ${x.syncKey}`);if(a.set(x.syncKey,x),x.noteId!==void 0){let R=z(x.noteId);if(u.has(R))throw new Error(`Duplicate noteId detected in current scan: ${x.noteId}`);u.add(R)}let C=x.noteId!==void 0?n.cards[z(x.noteId)]:void 0,h=this.renderConfigService.resolve(x,i);for(let R of h.warnings)p.set(We(R),R);let M=x.noteId,T=Ie(x.filePath,x.blockStartLine,x.rawBlockHash),D={card:{...x,noteId:M},noteId:M,deck:h.deck,noteModel:h.noteModel,renderConfigHash:h.renderConfigHash};if(!M){s.push(D);continue}if(fl(C,x,i)){d.push(D);continue}if(l.push(D),(x.idMarkerState!=="present-valid"||x.noteIdSource!=="marker"||o.has(T))&&m.push(D),!C){c.push(D);continue}let I=C.rawBlockHash!==x.rawBlockHash||C.renderConfigHash!==h.renderConfigHash||!ji(C.tagsHint,x.tagsHint)||C.orphan,A=C.deck!==h.deck;I&&c.push(D),A&&f.push(D),!I&&!A&&(F+=1)}let k=new Set(r),b=Object.values(n.cards).filter(x=>k.has(x.filePath)&&!u.has(z(x.noteId)));return{toCreate:s,toRebuild:d,toUpdate:c,toVerifyDeck:l,toChangeDeck:f,toRewriteMarker:m,toOrphan:b,unchangedCards:F,warnings:Array.from(p.values())}}};function fl(e,t,n){if(!e||e.cardType!=="cloze"||t.cardType!=="cloze")return!1;let r=Se(e.cardType,e.clozeMode);if(r!=="sequential"||t.clozeMode!=="all")return!1;let i=ei({bodyMarkdown:e.bodyMarkdown,clozeMode:r,convertHighlightsToCloze:n.convertHighlightsToCloze}),a=ei({bodyMarkdown:t.bodyMarkdown,clozeMode:t.clozeMode,convertHighlightsToCloze:n.convertHighlightsToCloze});return i.size>a.size}var mo=new ot({breaks:!0,html:!0,linkify:!0}),gl=/(?`\\[${k.trim()}\\]`),d=d.replace(ml,(F,k)=>`\\(${k.trim()}\\)`),i&&r.convertHighlightsToCloze&&(d=d.replace(Sn,"{$1}")),i&&(d=d.replace(Jr,(F,k,b)=>`{{c${k?Number(k):n.card.clozeMode==="all"?1:l++}::${b}}}`)),d=d.replace(kl,(F,k)=>{let b=r.resourceResolver.resolveEmbed(k,n.card.filePath);return b?(c.push({kind:b.kind,fileName:b.fileName,absolutePath:b.absolutePath,altText:b.altText}),b.kind==="audio"?`[sound:${b.fileName}]`:`${st(b.altText??b.fileName)}`):F}),d=d.replace(bl,(F,k)=>{let b=r.resourceResolver.resolveWikiLink(k,n.card.filePath);return b?`${st(b.displayText)}`:F}),d=d.replace(Sn,"$1");let f=$e(d,hl,"MATH");d=f.text,d=s.restore(d),d=u.restore(d);let m=(a?mo.renderInline(d):mo.render(d)).trim(),p=f.restore(m,st);return{html:a?p:bn(p),media:c}}};function yl(e){let t=new Set;return e.filter(n=>{let r=`${n.kind}:${n.absolutePath}:${n.fileName}`;return t.has(r)?!1:(t.add(r),!0)})}function st(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}var dt=class extends S{constructor(t){super("errors.currentFileOutOfScope",{filePath:t}),this.name="CurrentFileOutOfScopeError"}},Ue=class extends S{constructor(){super("errors.runScopeNotConfigured"),this.name="RunScopeNotConfiguredError"}},wn=class{constructor(t,n,r,i=new Zt(t),a=new Fn,o=new Mn,u=new Ot(r),s=new Yt(t),d=new Ae,c=()=>Date.now()){this.vaultGateway=t;this.pluginStateRepository=n;this.ankiGateway=r;this.fileIndexerService=i;this.diffPlannerService=a;this.renderer=o;this.ankiBatchExecutor=u;this.markdownWriteBackService=s;this.scanScopeService=new Pe;if(this.qaGroupSyncService=new Cn(r,void 0,void 0,void 0,void 0,void 0,void 0,this.vaultGateway.createBacklink.bind(this.vaultGateway)),xl(d)){this.renderConfigService=d,this.now=c;return}this.renderConfigService=new Ae,this.now=d}async syncVault(t){pe(t),this.assertRunScopeConfigured(t);let n=await this.pluginStateRepository.load(),r=await this.fileIndexerService.indexVault(t,n);return this.syncIndexedResult(r,n,t)}async syncFile(t,n){if(pe(n),this.assertRunScopeConfigured(n),!this.scanScopeService.isPathInScope(t,n.scopeMode,n.includeFolders,n.excludeFolders))throw new dt(t);let r=await this.pluginStateRepository.load(),i=await this.fileIndexerService.indexFile(t,n,r);return this.syncIndexedResult(i,r,n)}assertRunScopeConfigured(t){if(!gt(t.scopeMode,t.includeFolders))throw new Ue}async syncIndexedResult(t,n,r){let i=this.diffPlannerService.plan(t.cards,n,t.scopedFilePaths,r),a={addObsidianBacklink:r.addObsidianBacklink,obsidianBacklinkLabel:r.obsidianBacklinkLabel,obsidianBacklinkPlacement:r.obsidianBacklinkPlacement,convertHighlightsToCloze:r.convertHighlightsToCloze,keepPureTagLinesInCardBody:r.keepPureTagLinesInCardBody,resourceResolver:this.vaultGateway},o=new Map;for(let m of[...i.toCreate,...i.toRebuild,...i.toUpdate])o.has(m.card.syncKey)||o.set(m.card.syncKey,this.renderer.render(m,a));let u=await this.ankiBatchExecutor.execute(i,o,m=>Promise.resolve(this.renderer.render(m,a)),r.noteFieldMappings),s=await this.qaGroupSyncService.sync(t.groupBlocks,n,r),d=new Map(t.indexedFiles.map(m=>[m.filePath,m])),c=await this.markdownWriteBackService.write(u.markerWrites,d,s.markerWrites),l=Cl(n,t.scopedFilePaths,s.syncedGroupBlocks),f=this.buildNextState(n,t.cards,t.indexedFiles,s.syncedGroupBlocks,r,new Set([...u.touchedSyncKeys,...s.touchedSyncKeys,...c.writtenSyncKeys]),u.resolvedNoteIds,i.toOrphan,l);if(f.pendingWriteBack=[...n.pendingWriteBack.filter(m=>!new Set(t.scopedFilePaths).has(m.filePath)),...c.pendingEntries],this.markFilesDirty(f,[...c.failureFiles.map(m=>m.filePath),...c.conflictFiles]),await this.pluginStateRepository.save(f),c.failureFiles.length>0)throw this.createWriteBackFailureError(c.failureFiles);return{scannedFiles:t.scannedFiles,scannedCards:t.cards.length+t.groupBlocks.length,created:u.created+s.created,rebuilt:u.rebuilt,updated:u.updated+s.updated,migratedNoteTypes:u.migratedNoteTypes+s.migratedNoteTypes,migratedDecks:u.migratedDecks+s.migratedDecks,orphaned:i.toOrphan.length+l.length,uploadedMedia:u.uploadedMedia,skippedUnchangedCards:t.skippedUnchangedCards,rewrittenMarkers:c.writtenSyncKeys.length,markerWriteConflictFiles:c.conflictFiles,warnings:Sl(i.warnings,s.warnings)}}buildNextState(t,n,r,i,a,o,u,s,d){let c=this.now(),l=Qn(a),f=new Set(r.filter(k=>k.content!==void 0).map(k=>k.filePath)),m=new Map;for(let k of i){let b=m.get(k.filePath);b?b.push(k):m.set(k.filePath,[k])}let p={files:{...t.files},cards:{...t.cards},groupBlocks:{...t.groupBlocks??{}},pendingWriteBack:[...t.pendingWriteBack]};for(let k of f)delete p.files[k];for(let[k,b]of Object.entries(p.cards))f.has(b.filePath)&&delete p.cards[k];for(let[k,b]of Object.entries(p.groupBlocks??{}))f.has(b.filePath)&&delete p.groupBlocks?.[k];let F=new Map;for(let k of n){let b=u.get(k.syncKey)??k.noteId;b!==void 0&&F.set(k.syncKey,b)}for(let k of r){if(k.content===void 0)continue;let b=Array.from(new Set(k.cards.map(x=>F.get(x.syncKey)).filter(x=>x!==void 0)));p.files[k.filePath]={filePath:k.filePath,fileHash:k.fileHash,fileStamp:k.fileStamp,deckRulesFingerprint:l,lastIndexedAt:c,noteIds:b,groupIds:(m.get(k.filePath)??[]).map(x=>x.groupId)}}for(let k of n){let b=F.get(k.syncKey);if(b===void 0)continue;let x=t.cards[z(b)]??(k.noteId!==void 0?t.cards[z(k.noteId)]:void 0),C=this.renderConfigService.resolve(k,a);p.cards[z(b)]={noteId:b,filePath:k.filePath,heading:k.heading,backlinkHeadingText:k.backlinkHeadingText,headingLevel:k.headingLevel,bodyMarkdown:k.bodyMarkdown,cardType:k.cardType,clozeMode:k.clozeMode,blockStartOffset:k.blockStartOffset,blockEndOffset:k.blockEndOffset,blockStartLine:k.blockStartLine,bodyStartLine:k.bodyStartLine,blockEndLine:k.blockEndLine,contentEndLine:k.contentEndLine,markerLine:k.markerLine,rawBlockText:k.rawBlockText,rawBlockHash:k.rawBlockHash,renderConfigHash:C.renderConfigHash,deck:C.deck,deckHint:k.deckHint,deckHintSource:k.deckHintSource,deckWarnings:[...k.deckWarnings],tagsHint:k.tagsHint,lastSyncedAt:o.has(k.syncKey)?c:x?.lastSyncedAt??0,orphan:!1}}for(let k of s)p.cards[z(k.noteId)]={...k,orphan:!0};for(let k of i)p.groupBlocks??(p.groupBlocks={}),p.groupBlocks[k.groupId]=k;for(let k of d)p.groupBlocks??(p.groupBlocks={}),p.groupBlocks[k.groupId]={...k,orphan:!0};return p}markFilesDirty(t,n){for(let r of new Set(n))t.files[r]&&(t.files[r]={...t.files[r],fileHash:"",fileStamp:""})}createWriteBackFailureError(t){return new S("errors.writeBack.summary",{fileCount:t.length},{failures:t})}};function xl(e){return typeof e=="object"&&e!==null&&"resolve"in e}function Cl(e,t,n){let r=new Set(t),i=new Set(n.map(a=>a.groupId));return Object.values(e.groupBlocks??{}).filter(a=>r.has(a.filePath)&&!i.has(a.groupId)).map(a=>({...a,orphan:!0}))}function Sl(...e){let t=new Map;for(let n of e)for(let r of n)t.set(We(r),r);return[...t.values()]}var ct=class extends ho.Plugin{constructor(){super(...arguments);this.settings=H;this.noticeService=new Nt;this.ankiGateway=new wt(()=>this.settings.ankiConnectUrl);this.deckTemplateInsertionService=new mt}async onload(){let n=new vt(this);this.pluginConfigRepository=new Et(n);let r=new Lt(n),i=new At(this.app);this.vaultGateway=i;try{this.settings=await this.pluginConfigRepository.load()}catch(o){console.error("Failed to load plugin settings, falling back to defaults.",o),this.settings=H,this.noticeService.error(g("notice.invalidSettingsRestored"))}let a=new wn(i,r,this.ankiGateway);this.syncCurrentFileUseCase=new Ft(a),this.syncVaultUseCase=new Mt(a),this.clearCurrentFileSyncedCardsUseCase=new St(r,this.ankiGateway,i),this.cleanupEmptyDecksUseCase=new ht(this.ankiGateway),Ai(this),this.addSettingTab(new Gt(this))}async updateSettings(n){if(!this.pluginConfigRepository)return;let r=Ce({...this.settings,...n});try{await this.pluginConfigRepository.save(r),this.settings=r}catch(i){this.noticeService.error(xe(i,"notice.failedSavePluginSettings"))}}async listNoteModels(){return this.ankiGateway.listNoteModels()}async getModelFieldNamesByModelNames(n){return this.ankiGateway.getModelFieldNamesByModelNames(n)}async getNoteModelDetails(n){return this.ankiGateway.getModelDetails(n)}async listFolderTree(){return this.vaultGateway?this.vaultGateway.listFolderTree():[]}async runSyncCurrentFile(){let n=this.app.workspace.getActiveFile();if(!n||n.extension.toLowerCase()!=="md"){this.noticeService.error(g("notice.noActiveMarkdownForSync"));return}if(!this.syncCurrentFileUseCase){this.noticeService.error(g("notice.syncUseCaseNotInitialized"));return}try{let r=await this.syncCurrentFileUseCase.execute(n.path,this.settings);this.noticeService.showSyncSummary("currentFile",r)}catch(r){if(r instanceof dt||r instanceof Ue){this.noticeService.info(lt(r));return}console.error("Current file sync failed.",r),this.noticeService.error(xe(r,"notice.currentFileSyncFailed"))}}async runSyncVault(){if(!this.syncVaultUseCase){this.noticeService.error(g("notice.syncUseCaseNotInitialized"));return}try{let n=await this.syncVaultUseCase.execute(this.settings);this.noticeService.showSyncSummary("vault",n)}catch(n){if(n instanceof Ue){this.noticeService.info(lt(n));return}console.error("Vault sync failed.",n),this.noticeService.error(xe(n,"notice.vaultSyncFailed"))}}async insertDeckTemplateToCurrentFile(){let n=this.app.workspace.getActiveFile();if(!n||n.extension.toLowerCase()!=="md"){this.noticeService.error(g("notice.noActiveMarkdownForDeckTemplateInsertion"));return}if(!this.vaultGateway){this.noticeService.error(g("notice.vaultGatewayNotInitialized"));return}try{let r=await this.vaultGateway.readMarkdownFile(n.path);if(!r){this.noticeService.error(g("notice.markdownFileNotFound",{filePath:n.path}));return}let i=this.deckTemplateInsertionService.insert(r,this.settings.fileDeckMarker,this.settings.fileDeckTemplate,this.settings.fileDeckInsertLocation);if(i.nextContent===i.expectedContent){this.noticeService.info(g("notice.deckTemplateAlreadyCurrent"));return}await this.vaultGateway.replaceMarkdownFile(n.path,i.expectedContent,i.nextContent),this.noticeService.info(g("notice.deckTemplateInserted",{deck:i.insertedDeck}))}catch(r){console.error("Deck template insertion failed.",r),this.noticeService.error(xe(r,"notice.deckTemplateInsertionFailed"))}}async runClearCurrentFileSyncedCards(){let n=this.app.workspace.getActiveFile();if(!n||n.extension.toLowerCase()!=="md"){this.noticeService.error(g("notice.noActiveMarkdownForReset"));return}if(!this.clearCurrentFileSyncedCardsUseCase){this.noticeService.error(g("notice.clearCurrentFileUseCaseNotInitialized"));return}try{if(!await this.clearCurrentFileSyncedCardsUseCase.hasTrackedCards(n.path)){this.noticeService.info(g("notice.noTrackedCardsInCurrentFile"));return}let i=await this.clearCurrentFileSyncedCardsUseCase.execute(n.path);this.noticeService.showClearCurrentFileSummary(i)}catch(r){console.error("Clear current file synced cards failed.",r),this.noticeService.error(xe(r,"notice.clearCurrentFileFailed"))}}async runCleanupEmptyDecks(){if(!this.cleanupEmptyDecksUseCase){this.noticeService.error(g("notice.cleanupEmptyDecksUseCaseNotInitialized"));return}try{let n=await this.cleanupEmptyDecksUseCase.listCandidates();if(n.length===0){this.noticeService.info(g("notice.noEmptyDeckCandidates"));return}let r=await new It(this.app,n).openAndGetSelection();if(r===null){this.noticeService.info(g("notice.cleanupEmptyDecksCancelled"));return}let i=await this.cleanupEmptyDecksUseCase.execute(r,n);this.noticeService.showCleanupEmptyDecksSummary(i)}catch(n){console.error("Cleanup empty decks failed.",n),this.noticeService.error(xe(n,"notice.cleanupEmptyDecksFailed"))}}};var Fl=ct; diff --git a/manifest.json b/manifest.json index 1e2dedc..1ef297d 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "anki-heading-sync", "name": "Anki Heading Sync", - "version": "1.0.1", + "version": "1.0.2", "minAppVersion": "1.8.7", "description": "Focused heading-based Markdown to Anki sync plugin.", "author": "Dusk", diff --git a/package.json b/package.json index 28ca643..cc57b0e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-anki-heading-sync", - "version": "1.0.1", + "version": "1.0.2", "description": "Focused heading-based Markdown to Anki sync plugin.", "author": "Dusk", "main": "dist/plugin/main.js", diff --git a/src/presentation/settings/PluginSettingTab.test.ts b/src/presentation/settings/PluginSettingTab.test.ts index 450ab9e..328cee7 100644 --- a/src/presentation/settings/PluginSettingTab.test.ts +++ b/src/presentation/settings/PluginSettingTab.test.ts @@ -1673,10 +1673,16 @@ describe("PluginSettingTab", () => { await flushPromises(); const overrideCheckbox = queryByDataset(tab.containerEl, "folderDeckModeOverride", "notes/sub"); + const childLabel = queryByDataset(tab.containerEl, "folderPathLabel", "notes/sub"); const overrideAttributes = overrideCheckbox as unknown as { title?: string; "aria-label"?: string }; + const labelParent = (childLabel as unknown as { parent?: { children?: unknown[] } }).parent; + const overrideParent = (overrideCheckbox as unknown as { parent?: { children?: unknown[] } }).parent; expect(overrideCheckbox.classList.contains("ahs-settings-folder-override-checkbox")).toBe(true); expect(overrideAttributes.title).toBe("当前全局为「文件夹」,勾选后此文件夹改用「文件夹及文件名」作为牌组名"); expect(overrideAttributes["aria-label"]).toBe("切换 sub 的文件夹牌组映射模式"); + expect(overrideParent).toBe(labelParent); + expect(labelParent?.children?.[0]).toBe(childLabel); + expect(labelParent?.children?.[1]).toBe(overrideCheckbox); expect(() => queryByDataset(tab.containerEl, "folderDeckModeOverrideHint", "notes/sub")).toThrow(); }); @@ -1703,8 +1709,15 @@ describe("PluginSettingTab", () => { expect(plugin.updateCalls).toContainEqual({ alternateFolderDeckModeFolders: ["notes/sub"], }); + const childLabel = queryByDataset(tab.containerEl, "folderPathLabel", "notes/sub"); + const rerenderedOverrideCheckbox = queryByDataset(tab.containerEl, "folderDeckModeOverride", "notes/sub"); const hint = queryByDataset(tab.containerEl, "folderDeckModeOverrideHint", "notes/sub"); + const inlineParent = (childLabel as unknown as { parent?: { children?: unknown[] } }).parent; expect(hint.classList.contains("ahs-settings-folder-override-hint")).toBe(true); + expect((hint as unknown as { parent?: unknown }).parent).toBe(inlineParent); + expect(inlineParent?.children?.[0]).toBe(childLabel); + expect(inlineParent?.children?.[1]).toBe(rerenderedOverrideCheckbox); + expect(inlineParent?.children?.[2]).toBe(hint); expect(hint.textContent).toContain("文件夹及文件名"); }); diff --git a/src/presentation/settings/PluginSettingTab.ts b/src/presentation/settings/PluginSettingTab.ts index 373d591..449a845 100644 --- a/src/presentation/settings/PluginSettingTab.ts +++ b/src/presentation/settings/PluginSettingTab.ts @@ -1698,13 +1698,16 @@ export class AnkiHeadingSyncSettingTab extends PluginSettingTab { const contentEl = row.createDiv(); addClasses(contentEl, "ahs-settings-folder-label-stack"); - const labelEl = contentEl.createSpan({ text: node.name }); + const inlineLabelEl = contentEl.createDiv(); + addClasses(inlineLabelEl, "ahs-settings-folder-label-inline"); + + const labelEl = inlineLabelEl.createSpan({ text: node.name }); labelEl.dataset.folderPathLabel = node.path; addClasses(labelEl, "ahs-settings-folder-label"); this.applyFluidEllipsis(labelEl); if (scopeMode === "include" && node.checked && this.plugin.settings.folderDeckMode !== "off") { - const overrideCheckbox = row.createEl("input"); + const overrideCheckbox = inlineLabelEl.createEl("input"); const overrideLabel = t("settings.scope.folderDeckModeOverride.ariaLabel", { name: node.name }); const overrideTitle = this.getFolderDeckModeOverrideTitle(); const overrideChecked = this.plugin.settings.alternateFolderDeckModeFolders.includes(node.path); @@ -1723,7 +1726,7 @@ export class AnkiHeadingSyncSettingTab extends PluginSettingTab { }); if (overrideChecked) { - const hintEl = contentEl.createDiv({ text: this.getFolderDeckModeOverrideHint() }); + const hintEl = inlineLabelEl.createSpan({ text: this.getFolderDeckModeOverrideHint() }); hintEl.dataset.folderDeckModeOverrideHint = node.path; addClasses(hintEl, "ahs-settings-folder-override-hint"); } diff --git a/styles.css b/styles.css index 24ae600..c3e10f7 100644 --- a/styles.css +++ b/styles.css @@ -200,7 +200,7 @@ .anki-heading-sync-settings .ahs-settings-folder-row { display: grid; - grid-template-columns: 24px 24px minmax(0, 1fr) auto; + grid-template-columns: 24px 24px minmax(0, 1fr); align-items: center; column-gap: 0; width: 100%; @@ -241,12 +241,22 @@ .anki-heading-sync-settings .ahs-settings-folder-label-stack { display: flex; flex-direction: column; + align-items: flex-start; min-width: 0; gap: 2px; } +.anki-heading-sync-settings .ahs-settings-folder-label-inline { + display: inline-flex; + align-items: center; + align-self: flex-start; + gap: 8px; + min-width: 0; + max-width: 100%; +} + .anki-heading-sync-settings .ahs-settings-folder-override-checkbox { - justify-self: end; + flex: none; width: 16px; height: 16px; margin: 0; @@ -271,9 +281,11 @@ } .anki-heading-sync-settings .ahs-settings-folder-override-hint { + flex: none; color: var(--text-muted); font-size: var(--font-ui-smaller); line-height: 1.35; + white-space: nowrap; } .anki-heading-sync-settings .ahs-settings-inline-control-group { @@ -320,6 +332,12 @@ overflow: hidden; } +.anki-heading-sync-settings .ahs-settings-folder-label.ahs-settings-fluid-ellipsis { + flex: 0 1 auto; + width: auto; + max-width: 100%; +} + .anki-heading-sync-settings select.ahs-settings-fluid-control, .anki-heading-sync-settings input.ahs-settings-fluid-control { box-sizing: border-box; diff --git a/versions.json b/versions.json index 1263e0d..a3167a9 100644 --- a/versions.json +++ b/versions.json @@ -1,4 +1,5 @@ { "1.0.0": "1.8.7", - "1.0.1": "1.8.7" + "1.0.1": "1.8.7", + "1.0.2": "1.8.7" }