diff --git a/src/cli/completions/sources/spark-tables.ts b/src/cli/completions/sources/spark-tables.ts index a47bf0b..ebfc26d 100644 --- a/src/cli/completions/sources/spark-tables.ts +++ b/src/cli/completions/sources/spark-tables.ts @@ -25,11 +25,14 @@ export const sparkTablesSource: CompletionSource = { scan(index) { const items: SparkTableCompletion[] = []; - const slugger = new Slugger(); for (const [filePath, content] of Object.entries(index)) { if (!filePath.endsWith(".md")) continue; + // Fresh slugger per file so duplicate headers across files don't + // pollute each other. (github-slugger is stateful.) + const slugger = new Slugger(); + const lines = content.split(/\r?\n/); for (let i = 0; i < lines.length; i++) { const headerCells = splitTableRow(lines[i]); diff --git a/src/components/journal/completions.ts b/src/components/journal/completions.ts index c719a7f..8029424 100644 --- a/src/components/journal/completions.ts +++ b/src/components/journal/completions.ts @@ -81,12 +81,15 @@ async function scanClientSide(): Promise { const links: LinkCompletion[] = []; const sparkTables: SparkTableCompletion[] = []; const tagRegex = /]*>\s*([\s\S]*?)\s*<\/md-dice>/gi; - const slugger = new Slugger(); for (const filePath of paths) { const content = await getIndexedData(filePath); if (!content) continue; + // Fresh slugger per file so duplicate headers across files don't + // pollute each other. + const slugger = new Slugger(); + // Dice scan let match: RegExpExecArray | null; tagRegex.lastIndex = 0;