🎨 Clean up card discovery and settings

This commit is contained in:
Erin Schnabel 2025-10-07 08:54:30 -04:00
parent 2d5695e5b1
commit 68760d75e7
No known key found for this signature in database
3 changed files with 30 additions and 38 deletions

View file

@ -9,38 +9,27 @@ export class CardParser {
}
async parseFile(file: TFile): Promise<Card[]> {
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}`,
});
}

View file

@ -6,7 +6,6 @@ export class FlashcardModal extends Modal {
plugin: SimpleFlashcardsPlugin;
card: Card | null;
deckPath: string | undefined;
contentEl: HTMLElement;
constructor(
app: App,

View file

@ -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);