From 68760d75e73c9aaaaf357771a893a5d48b4e4a86 Mon Sep 17 00:00:00 2001 From: Erin Schnabel Date: Tue, 7 Oct 2025 08:54:30 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Clean=20up=20card=20discovery=20?= =?UTF-8?q?and=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/flashcards-CardParser.ts | 43 ++++++++++++++---------------------- src/flashcards-Modal.ts | 1 - src/flashcards-Plugin.ts | 24 +++++++++++--------- 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/flashcards-CardParser.ts b/src/flashcards-CardParser.ts index 8d8a95e..d7393ed 100644 --- a/src/flashcards-CardParser.ts +++ b/src/flashcards-CardParser.ts @@ -9,38 +9,27 @@ export class CardParser { } async parseFile(file: TFile): Promise { - const content = await this.app.vault.read(file); - const cards: Card[] = []; - const headingRegex = /^## (.+)$/gm; + const fileCache = this.app.metadataCache.getFileCache(file); + const h2Headings = fileCache?.headings?.filter((h) => h.level === 2); - // Find all H2 headings - const headings: { text: string; index: number }[] = []; - let match = headingRegex.exec(content); - while (match !== null) { - headings.push({ text: match[1], index: match.index }); - match = headingRegex.exec(content); - } - - if (headings.length === 0) { + if (!h2Headings || h2Headings.length === 0) { console.warn(`Skipping ${file.path}: No H2 headings found`); return []; } - // Extract content for each heading - for (let i = 0; i < headings.length; i++) { - const heading = headings[i]; - const nextIndex = - i + 1 < headings.length - ? headings[i + 1].index - : content.length; + const content = await this.app.vault.cachedRead(file); + const cards: Card[] = []; - let cardContent = content.substring(heading.index, nextIndex); + // Extract content for each H2 heading + for (let i = 0; i < h2Headings.length; i++) { + const heading = h2Headings[i]; + const startOffset = heading.position.end.offset; + const nextHeading = h2Headings[i + 1]; + const endOffset = nextHeading + ? nextHeading.position.start.offset + : content.length; - // Remove the H2 heading line itself - const headingLineEnd = cardContent.indexOf("\n"); - if (headingLineEnd !== -1) { - cardContent = cardContent.substring(headingLineEnd + 1); - } + let cardContent = content.substring(startOffset, endOffset); // Truncate at first --- const dividerIndex = cardContent.indexOf("\n---"); @@ -57,9 +46,9 @@ export class CardParser { cards.push({ filePath: file.path, - heading: heading.text, + heading: heading.heading, content: cardContent, - key: `${file.path}#${heading.text}`, + key: `${file.path}#${heading.heading}`, }); } diff --git a/src/flashcards-Modal.ts b/src/flashcards-Modal.ts index 4870cfa..1a0f4df 100644 --- a/src/flashcards-Modal.ts +++ b/src/flashcards-Modal.ts @@ -6,7 +6,6 @@ export class FlashcardModal extends Modal { plugin: SimpleFlashcardsPlugin; card: Card | null; deckPath: string | undefined; - contentEl: HTMLElement; constructor( app: App, diff --git a/src/flashcards-Plugin.ts b/src/flashcards-Plugin.ts index d4e7ddb..74bcfe9 100644 --- a/src/flashcards-Plugin.ts +++ b/src/flashcards-Plugin.ts @@ -42,8 +42,10 @@ export default class SimpleFlashcardsPlugin extends Plugin { }, }); - // Initial card scan - await this.scanCards(); + // Defer initial card scan to avoid blocking startup + this.app.workspace.onLayoutReady(async () => { + await this.scanCards(); + }); } onunload() { @@ -51,12 +53,9 @@ export default class SimpleFlashcardsPlugin extends Plugin { } async loadSettings() { - this.settings = Object.assign( - {}, - DEFAULT_SETTINGS, - await this.loadData(), - ); - this.data = (await this.loadData()) || { cardViews: {} }; + const data = await this.loadData(); + this.settings = Object.assign({}, DEFAULT_SETTINGS, data); + this.data = data || { cardViews: {} }; } async saveSettings() { @@ -113,7 +112,7 @@ export default class SimpleFlashcardsPlugin extends Plugin { } // least-recent: sort by lastSeen timestamp - const sorted = pool.sort((a, b) => { + const sorted = pool.slice().sort((a, b) => { const aTime = this.data.cardViews[a.key] || 0; const bTime = this.data.cardViews[b.key] || 0; return aTime - bTime; @@ -130,7 +129,12 @@ export default class SimpleFlashcardsPlugin extends Plugin { }); } - showRandomCard() { + async showRandomCard() { + // Lazy load cards if not yet scanned + if (this.cachedCards.length === 0) { + await this.scanCards(); + } + const deckPath = this.settings.defaultDeckPath || undefined; const card = this.selectCard(deckPath);