mirror of
https://github.com/fancive/obsidian-parallel-reader.git
synced 2026-07-22 06:53:43 +00:00
- anchor.ts: precompute line-offset index once; O(log n) binary-search offsetToLine replaces two O(n) newline-count loops. findLineForAnchor takes an optional lineOffsets param (backward compatible). - cards.ts / generation.ts: build the line-offset index once per document and thread it through all card anchor resolutions (was N cards x ~9 full-document O(n) passes -> 1 O(n) pass + N x O(log n)). - anchor.ts: ASCII-whitespace charCode fast path in normalizeWithMap, deferring to /\s/ only for non-ASCII (exact semantics preserved). - settings.ts: memoize generationFingerprint by settings object identity (WeakMap) — collapses SHA-1 + stableStringify done on every file-open. - view.ts: remove keydown listener in onClose (lifecycle leak fix). Verified: tsc, build, biome, all 28 tests, e2e smoke, branch coverage 100% (new anchor regression tests added). Deferred (higher risk / test-breaking): view full-render->surgical DOM, scroll rebind guard, cache scheduleSave timing — see notes/perf-report.md. Change-Id: I17eef347471bb8233d48164e4453d492f301eac2
43 lines
2 KiB
JavaScript
43 lines
2 KiB
JavaScript
const { assert, t } = require('./test-setup');
|
||
|
||
assert.strictEqual(t.findLineForAnchor('', 'hello'), -1, 'empty content returns -1');
|
||
assert.strictEqual(t.findLineForAnchor('hello world', ''), -1, 'empty anchor returns -1');
|
||
assert.strictEqual(t.findLineForAnchor('hello world', 'hello world'), 0, 'exact full match on line 0');
|
||
assert.strictEqual(t.findLineForAnchor('line0\nline1\nhello', 'hello'), 2, 'exact match on line 2');
|
||
assert.strictEqual(t.findLineForAnchor('line0\nline1\nhello world', ' hello world '), 2, 'trimmed match');
|
||
assert.strictEqual(
|
||
t.findLineForAnchor('intro\nThe quick brown fox jumps over the lazy dog\nend', 'The quick brown fox jumps'),
|
||
1,
|
||
'prefix match at 60-char threshold',
|
||
);
|
||
assert.strictEqual(
|
||
t.findLineForAnchor('a\nb\nc\nd\ne\nAlpha beta\nGamma\tDelta\nlast', 'Alpha beta Gamma Delta'),
|
||
5,
|
||
'normalized whitespace match returns correct line',
|
||
);
|
||
assert.strictEqual(t.findLineForAnchor('hello\nworld', 'zzz_not_found'), -1, 'unmatched anchor returns -1');
|
||
assert.strictEqual(
|
||
t.findLineForAnchor('first line\nsecond with 日本語 text\nthird', '日本語'),
|
||
1,
|
||
'unicode anchor match',
|
||
);
|
||
|
||
// ── perf: precomputed line-offset index must yield identical results ──
|
||
const doc = 'l0\nl1\nl2 needle here\nl3\n\nl5 tail';
|
||
const offsets = t.buildLineOffsets(doc);
|
||
assert.deepStrictEqual(offsets, [0, 3, 6, 21, 24, 25], 'buildLineOffsets marks each line start');
|
||
assert.strictEqual(
|
||
t.findLineForAnchor(doc, 'needle here', offsets),
|
||
t.findLineForAnchor(doc, 'needle here'),
|
||
'threaded offsets match self-computed result (exact path)',
|
||
);
|
||
assert.strictEqual(t.findLineForAnchor(doc, 'tail', offsets), 5, 'threaded offsets resolve trailing line');
|
||
// Non-ASCII whitespace (NBSP ) must still normalize like /\s/ did.
|
||
assert.strictEqual(
|
||
t.findLineForAnchor('x\ny\nAlpha beta gamma\nz', 'Alpha beta gamma'),
|
||
2,
|
||
'NBSP collapses to single space in normalized fallback match',
|
||
);
|
||
assert.strictEqual(t.buildLineOffsets('')[0], 0, 'empty content still has line 0');
|
||
|
||
console.log('anchor tests passed');
|