mirror of
https://github.com/ebullient/obsidian-deck-notes.git
synced 2026-07-22 06:40:43 +00:00
🎨 Clean up card discovery and settings
This commit is contained in:
parent
2d5695e5b1
commit
68760d75e7
3 changed files with 30 additions and 38 deletions
|
|
@ -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}`,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ export class FlashcardModal extends Modal {
|
|||
plugin: SimpleFlashcardsPlugin;
|
||||
card: Card | null;
|
||||
deckPath: string | undefined;
|
||||
contentEl: HTMLElement;
|
||||
|
||||
constructor(
|
||||
app: App,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue