From ce195cee72ed35090bed4e1379475a7a7c71b9ef Mon Sep 17 00:00:00 2001 From: posimai Date: Mon, 20 Apr 2026 22:51:41 +0900 Subject: [PATCH] =?UTF-8?q?fix(posimai-sc):=20=E7=94=A8=E8=AA=9E=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=87=E3=83=83=E3=82=AF=E3=82=B9=E6=8A=BD=E5=87=BA?= =?UTF-8?q?=E3=82=A2=E3=83=AB=E3=82=B4=E3=83=AA=E3=82=BA=E3=83=A0=E3=82=92?= =?UTF-8?q?=E5=86=8D=E8=A8=AD=E8=A8=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 旧アルゴリズムの問題: - の出現位置を問わず全て用語として分割していたため 説明文中の強調タグ(例: 種類の異なる)が 偽の用語エントリになっていた(104件中80件以上が不正) - ヒントが助詞(は、が)や記号で始まるケースを除去できていなかった 新アルゴリズム: -
で行分割し、各行の先頭 だけを用語として扱う - 先頭より前に地の文があれば inline 強調とみなしてスキップ - hint クリーンアップに =・は を追加 - 結果: 104件 → 26件の正常エントリのみ残留 SW v8 → v9 Co-Authored-By: Claude Sonnet 4.6 --- posimai-sc/js/app.js | 50 ++++++++++++++++++++++++++++++-------------- posimai-sc/sw.js | 2 +- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/posimai-sc/js/app.js b/posimai-sc/js/app.js index 10c8d760..e4d0fc60 100644 --- a/posimai-sc/js/app.js +++ b/posimai-sc/js/app.js @@ -16,24 +16,42 @@ function shuffleInPlace(arr) { function extractTermsFromBeginnerBox(box) { const clone = box.cloneNode(true); clone.querySelector('.formula-label')?.remove(); - const inner = clone.innerHTML.trim(); - const parts = inner.split(/(?=)/i).map(s => s.trim()).filter(s => /^/i.test(s)); + + //
で行分割し、各行の先頭 だけを用語として扱う。 + // 行中の inline (強調)は無視することで偽エントリを防ぐ。 + const segments = []; + let cur = []; + for (const child of clone.childNodes) { + if (child.nodeName === 'BR') { segments.push(cur); cur = []; } + else cur.push(child); + } + if (cur.length) segments.push(cur); + const terms = []; - for (const p of parts) { - const doc = new DOMParser().parseFromString('
'+p+'
', 'text/html'); - const root = doc.querySelector('.seg'); - const st = root && root.querySelector('strong'); - if (!st) continue; - const term = st.textContent.trim(); - let hint = ''; - let n = st.nextSibling; - while (n) { - if (n.nodeType === 3) hint += n.textContent; - else if (n.nodeType === 1) hint += n.textContent; - n = n.nextSibling; + for (const seg of segments) { + // 先頭ノードが でなければ(前に地の文がある)定義行ではない + let termNode = null; + const beforeNodes = []; + for (const node of seg) { + if (node.nodeName === 'STRONG') { termNode = node; break; } + beforeNodes.push(node); } - hint = hint.replace(/^[::\s.]+/, '').trim(); - if (term) terms.push({ term, hint }); + if (!termNode) continue; + // 先頭 の前に地の文があれば inline 強調とみなしてスキップ + if (beforeNodes.some(n => (n.textContent || '').trim())) continue; + + const term = termNode.textContent.trim(); + if (!term) continue; + + // termNode 以降の全ノードの textContent を結合してヒントにする + const afterIdx = seg.indexOf(termNode) + 1; + const hint = seg.slice(afterIdx) + .map(n => n.textContent || '') + .join('') + .replace(/^[::\s.。=は]+/, '') + .trim(); + + terms.push({ term, hint }); } return terms; } diff --git a/posimai-sc/sw.js b/posimai-sc/sw.js index bd461a77..39b62976 100644 --- a/posimai-sc/sw.js +++ b/posimai-sc/sw.js @@ -1,5 +1,5 @@ // posimai-sc SW — same-origin の静的資産のみキャッシュ(CDN は対象外) -const CACHE = 'posimai-sc-v8'; +const CACHE = 'posimai-sc-v9'; const STATIC = [ '/', '/index.html',