amenbo 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -75,7 +75,9 @@ function collectQualityInput(document, geometry) {
75
75
  extractedTokenEstimate: 0,
76
76
  };
77
77
  }
78
- // 元のDOMを変更しないよう、複製上でscript/style/noscriptを取り除いてから可視テキストを測る
78
+ // script/styleはこの時点で既にremoveStyleLeakElementsにより除去済み(ここでの除去は防御的で
79
+ // 実質no-op)。noscriptはReadability.parse()の画像復元(_unwrapNoscriptImages)のため意図的に
80
+ // 残してあるので、統計を歪めないよう複製上でのみ除去する(元のDOMは変更しない)。
79
81
  const clone = body.cloneNode(true);
80
82
  for (const el of Array.from(clone.querySelectorAll("script, style, noscript"))) {
81
83
  el.remove();
@@ -136,10 +138,497 @@ function extractByGeometry(document, geometry) {
136
138
  const htmlParts = cluster.blockIds.map((id) => elementById.get(id)?.outerHTML).filter((part) => Boolean(part));
137
139
  return htmlParts.length > 0 ? htmlParts.join("\n") : null;
138
140
  }
139
- /** HTML文字列をMarkdownへ変換する。 */
141
+ const ANCHOR_MAX_LENGTH = 80;
142
+ const ANCHOR_MIN_PARAGRAPH_LENGTH = 30;
143
+ const MAX_SPAN = 1000;
144
+ const PROBE_MIN_LENGTH = 8;
145
+ const PROBE_MAX_COUNT = 3;
146
+ const PROBE_MAX_LENGTH = 60;
147
+ // アンカー長(見出し用)とは別概念のため定数を分ける(片方の調整が他方へ波及しないように)。
148
+ const PROBE_FALLBACK_MAX_LENGTH = 80;
149
+ /** colspan/rowspan属性値を1以上MAX_SPAN以下の整数へ丸める(異常値ガード)。 */
150
+ function clampSpan(value) {
151
+ const n = Number.parseInt(value ?? "1", 10);
152
+ if (!Number.isFinite(n) || n < 1)
153
+ return 1;
154
+ return Math.min(n, MAX_SPAN);
155
+ }
156
+ /**
157
+ * turndownのGFMテーブル変換はcolspan/rowspan・多段ヘッダを扱えず列ズレや空セルを生む。
158
+ * グリッドを再構築してspanを「位置の占有」として展開し(内容の複製はしない)、先頭の連続ヘッダ行は
159
+ * 1行へ結合してから全行同一列数の単純表を返す。救出経路(collectDataTables)とReadability/アダプタ等が
160
+ * 本文に保持した複雑表(normalizeRetainedTables)の双方から呼ばれる。
161
+ * spanの無い単純表・既に正規化済みの表に対しては構造を変えず冪等に振る舞う。
162
+ * captionは再構築で失われないよう先頭へ復元する。
163
+ *
164
+ * 内容配置は行の役割で分岐する:
165
+ * - 列ヘッダ行(all-th ∧ 起点セル2つ以上): 占有読み。colspanグループラベルは配下の各列へ複製される
166
+ * (多段ヘッダ結合「グループ 列名」の意味を保つための唯一の複製)
167
+ * - データ行: 起点位置にのみ内容、span継続位置は空セル(複製しない)
168
+ * - 全幅単一th行: 列ヘッダではなく表題/節ラベル。先頭の連続分はcaptionへ畳み(turndown-gfmが
169
+ * ヘッダ行を見失って複雑表フォールバックへ落ちるのを防ぐ)、表中間の区切り行はデータ行として出力
170
+ */
171
+ export function normalizeTableHtml(tableHtml) {
172
+ const { document } = parseHTML(`<!DOCTYPE html><html><body>${tableHtml}</body></html>`);
173
+ const tableEl = document.querySelector("table");
174
+ if (!tableEl)
175
+ return tableHtml;
176
+ const table = tableEl;
177
+ // 自表直下のcaptionのみ拾う(入れ子表のcaptionを巻き込まない)。
178
+ const caption = Array.from(document.querySelectorAll("caption")).find((cap) => cap.closest("table") === tableEl);
179
+ // 入れ子の表の行を巻き込まないよう、直接の行(closestが自表と一致)だけを対象にする。
180
+ const rows = Array.from(table.querySelectorAll("tr")).filter((tr) => tr.closest("table") === tableEl);
181
+ const rowCount = rows.length;
182
+ if (rowCount === 0)
183
+ return tableHtml;
184
+ const grid = Array.from({ length: rowCount }, () => []);
185
+ const allTh = [];
186
+ const originCount = [];
187
+ for (let r = 0; r < rowCount; r++) {
188
+ const cells = Array.from(rows[r].children).filter((el) => el.tagName === "TD" || el.tagName === "TH");
189
+ allTh[r] = cells.length > 0 && cells.every((cell) => cell.tagName === "TH");
190
+ originCount[r] = cells.length;
191
+ let c = 0;
192
+ for (const cell of cells) {
193
+ while (grid[r][c] !== undefined)
194
+ c++;
195
+ const colspan = clampSpan(cell.getAttribute("colspan"));
196
+ const rowspan = clampSpan(cell.getAttribute("rowspan"));
197
+ const filled = { html: cell.innerHTML.trim(), originRow: r, originCol: c };
198
+ for (let i = 0; i < rowspan && r + i < rowCount; i++) {
199
+ for (let j = 0; j < colspan; j++) {
200
+ grid[r + i][c + j] = filled;
201
+ }
202
+ }
203
+ c += colspan;
204
+ }
205
+ }
206
+ const numCols = grid.reduce((max, row) => Math.max(max, row.length), 0);
207
+ if (numCols === 0)
208
+ return tableHtml;
209
+ const occupancyCell = (r, c) => grid[r]?.[c]?.html ?? "";
210
+ const originCellHtml = (r, c) => {
211
+ const g = grid[r]?.[c];
212
+ return g && g.originRow === r && g.originCol === c ? g.html : "";
213
+ };
214
+ // 列ヘッダ行: all-th ∧ 起点セル2つ以上。単一全幅th行(起点セル1つ)は列ヘッダではなくラベル行。
215
+ const isColumnHeaderRow = (r) => allTh[r] && originCount[r] >= 2;
216
+ const isFullWidthLabelRow = (r) => {
217
+ if (numCols < 2 || !allTh[r] || originCount[r] !== 1)
218
+ return false;
219
+ let covered = 0;
220
+ for (let c = 0; c < numCols; c++)
221
+ if (grid[r]?.[c]?.originRow === r)
222
+ covered++;
223
+ return covered === numCols;
224
+ };
225
+ const emitRow = (cells, tag) => `<tr>${cells.map((h) => `<${tag}>${h}</${tag}>`).join("")}</tr>`;
226
+ const emitOne = (r) => {
227
+ // thは列ヘッダ行にのみ与える。単一起点のラベル行をthのまま出力すると、空th兄弟を伴う
228
+ // 「all-th複数セル行」として実体化し、再パース時(救出挿入後のnormalizeRetainedTables)に
229
+ // 列ヘッダと誤認されて多段ヘッダ結合へ巻き込まれる=区切りラベルが消失するため。
230
+ const tag = isColumnHeaderRow(r) ? "th" : "td";
231
+ const read = isColumnHeaderRow(r) ? occupancyCell : originCellHtml;
232
+ return emitRow(Array.from({ length: numCols }, (_, c) => read(r, c)), tag);
233
+ };
234
+ // 先頭の連続する全幅単一thラベル行をcaptionへ畳む。全行がラベル行の退化ケースでは畳まない。
235
+ const foldedCaptions = [];
236
+ let start = 0;
237
+ while (start < rowCount && isFullWidthLabelRow(start)) {
238
+ const text = occupancyCell(start, 0);
239
+ if (text)
240
+ foldedCaptions.push(text);
241
+ start++;
242
+ }
243
+ if (start >= rowCount) {
244
+ start = 0;
245
+ foldedCaptions.length = 0;
246
+ }
247
+ let headerCount = 0;
248
+ while (start + headerCount < rowCount && isColumnHeaderRow(start + headerCount))
249
+ headerCount++;
250
+ const headerRows = [];
251
+ const bodyRows = [];
252
+ // 全行がヘッダ(start+headerCount === rowCount)の表を結合するとデータ行が消えるため、
253
+ // 結合はデータ行が1行以上残る場合に限る。全ヘッダ表はelse分岐で先頭行のみthead扱いにし、
254
+ // 残りは各行を保持する(スタイル目的でthを使う表の保護)。
255
+ if (headerCount >= 2 && start + headerCount < rowCount) {
256
+ // 多段ヘッダ: 列ごとに上→下のセルを占有読みし、重複除去して連結して1行のヘッダへ畳む。
257
+ const merged = [];
258
+ for (let c = 0; c < numCols; c++) {
259
+ const parts = [];
260
+ for (let r = start; r < start + headerCount; r++) {
261
+ const h = occupancyCell(r, c);
262
+ if (h && parts[parts.length - 1] !== h)
263
+ parts.push(h);
264
+ }
265
+ merged.push(parts.join(" "));
266
+ }
267
+ headerRows.push(emitRow(merged, "th"));
268
+ for (let r = start + headerCount; r < rowCount; r++)
269
+ bodyRows.push(emitOne(r));
270
+ }
271
+ else {
272
+ // ヘッダ0/1行(全ヘッダ表を含む): 先頭が列ヘッダ行ならthead、残りはtbodyへ。
273
+ for (let r = start; r < rowCount; r++) {
274
+ if (r === start && isColumnHeaderRow(r))
275
+ headerRows.push(emitOne(r));
276
+ else
277
+ bodyRows.push(emitOne(r));
278
+ }
279
+ }
280
+ // captionを内包したままでもヘッダ行を見失わないよう、ヘッダはthead・データはtbodyで囲う
281
+ // (turndown-gfmはtrがtableの先頭子でないとヘッダと認識せず、captionがあると降格するため)。
282
+ const captionParts = [];
283
+ if (caption) {
284
+ const capHtml = caption.innerHTML.trim();
285
+ if (capHtml)
286
+ captionParts.push(capHtml);
287
+ }
288
+ captionParts.push(...foldedCaptions);
289
+ const out = ["<table>"];
290
+ if (captionParts.length > 0)
291
+ out.push(`<caption>${captionParts.join(" ")}</caption>`);
292
+ if (headerRows.length > 0)
293
+ out.push(`<thead>${headerRows.join("")}</thead>`);
294
+ if (bodyRows.length > 0)
295
+ out.push(`<tbody>${bodyRows.join("")}</tbody>`);
296
+ out.push("</table>");
297
+ return out.join("");
298
+ }
299
+ /** テキストからタグを除きシグネチャ用に空白正規化する。 */
300
+ function normalizeForSignature(text) {
301
+ return text.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
302
+ }
303
+ /**
304
+ * document順に並べた要素列から、tableIndexの表の直前アンカー(見出し優先・無ければ近傍段落)を求める。
305
+ * 見出しは節の先頭に表を戻すのに最適。見出しが皆無なページ用に段落をフォールバックにする。
306
+ */
307
+ function findTableAnchor(seq, tableIndex) {
308
+ let paragraph = "";
309
+ for (let i = tableIndex - 1; i >= 0; i--) {
310
+ const el = seq[i];
311
+ if (!el || el.tagName === "TABLE")
312
+ continue; // 別の表は飛ばす。
313
+ const text = normalizeForSignature(el.textContent);
314
+ if (/^H[1-6]$/.test(el.tagName)) {
315
+ if (text.length > 0)
316
+ return text.slice(0, ANCHOR_MAX_LENGTH); // 見出し優先。
317
+ }
318
+ else if (!paragraph && text.length >= ANCHOR_MIN_PARAGRAPH_LENGTH) {
319
+ paragraph = text.slice(0, ANCHOR_MAX_LENGTH);
320
+ }
321
+ }
322
+ return paragraph;
323
+ }
324
+ /**
325
+ * 表内セル(th/td)から重複判定用の照合プローブを作る。入れ子表を内包するセルは、その内側の
326
+ * 表全体がinnerHTMLに入り込みノイズになる(かつ内側セルは個別に拾える)ため除外する。
327
+ * 長さ8字以上のセルテキストを重複除去し、長い順(安定ソート)に最大3本、各60字へ切り詰める。
328
+ * 対象セルが1つも無い表は、従来のouterHTML先頭を単一プローブとしてフォールバックする。
329
+ */
330
+ function buildTableProbes(table) {
331
+ const cells = Array.from(table.querySelectorAll("th, td")).filter((cell) => cell.querySelectorAll("table").length === 0);
332
+ const seen = new Set();
333
+ const probes = [];
334
+ for (const cell of cells) {
335
+ const text = normalizeForSignature(cell.innerHTML);
336
+ if (text.length < PROBE_MIN_LENGTH || seen.has(text))
337
+ continue;
338
+ seen.add(text);
339
+ probes.push(text);
340
+ }
341
+ if (probes.length === 0) {
342
+ return [normalizeForSignature(table.outerHTML).slice(0, PROBE_FALLBACK_MAX_LENGTH)].filter((p) => p.length > 0);
343
+ }
344
+ return probes
345
+ .map((probe, index) => ({ probe, index }))
346
+ .sort((a, b) => b.probe.length - a.probe.length || a.index - b.index)
347
+ .slice(0, PROBE_MAX_COUNT)
348
+ .map(({ probe }) => probe.slice(0, PROBE_MAX_LENGTH));
349
+ }
350
+ /**
351
+ * Readabilityが取りこぼしがちなデータ表を、救出候補としてHTML文字列+位置アンカーで採取する。
352
+ * Readabilityのparseは渡したdocumentを破壊的に変更するため、必ずparse前に呼ぶこと。
353
+ * 最外表のみ(入れ子の表は最外表のouterHTMLに含まれる)・2行以上かつ2列以上のものを
354
+ * 「データ表」とみなす(1列や単一行はレイアウト/リスト相当なので対象外)。
355
+ */
356
+ export function collectDataTables(body) {
357
+ const result = [];
358
+ const seq = Array.from(body.querySelectorAll("h1, h2, h3, h4, h5, h6, p, table"));
359
+ for (let i = 0; i < seq.length; i++) {
360
+ const table = seq[i];
361
+ if (!table || table.tagName !== "TABLE")
362
+ continue;
363
+ // 入れ子の表は最外表側に含まれるので個別採取しない。
364
+ if (table.parentElement?.closest("table"))
365
+ continue;
366
+ const rows = Array.from(table.querySelectorAll("tr"));
367
+ if (rows.length < 2)
368
+ continue;
369
+ let maxCells = 0;
370
+ for (const row of rows) {
371
+ const cells = row.querySelectorAll("th, td").length;
372
+ if (cells > maxCells)
373
+ maxCells = cells;
374
+ }
375
+ if (maxCells < 2)
376
+ continue;
377
+ result.push({
378
+ html: normalizeTableHtml(table.outerHTML),
379
+ probes: buildTableProbes(table),
380
+ anchor: findTableAnchor(seq, i),
381
+ });
382
+ }
383
+ return result;
384
+ }
385
+ /**
386
+ * 表のプローブの真の過半数(floor(n/2)+1)が本文に含まれていれば「既に本文にある」と判定する
387
+ * (プローブ0本は既存扱い)。ceil(n/2)だとn=2のとき1本一致(50%)で既存と判定され、本文の地の文と
388
+ * 偶然一致した1本のせいで本当に落ちた表が救出されない=サイレント欠落に倒れる。重複挿入(可視・
389
+ * 有界)よりデータ欠落(不可視)の方が害が大きいため、偶数本では厳しい側に倒す。
390
+ */
391
+ function isTableAlreadyPresent(table, contentText) {
392
+ if (table.probes.length === 0)
393
+ return true;
394
+ let hits = 0;
395
+ for (const probe of table.probes) {
396
+ if (probe.length > 0 && contentText.includes(probe))
397
+ hits++;
398
+ }
399
+ return hits >= Math.floor(table.probes.length / 2) + 1;
400
+ }
401
+ /**
402
+ * Readability出力に含まれない表だけを、可能なら元の位置(アンカー直後)へ、無理なら末尾へ再結合する。
403
+ * アンカー(表の直前見出し/段落)がReadability出力に残っていれば、その要素の直後に挿入して
404
+ * 「表が本来属していた節」へ戻す(記事構造=意味の保持)。残っていなければ末尾フォールバック。
405
+ */
406
+ export function reinsertDroppedTables(contentHtml, tables) {
407
+ if (tables.length === 0)
408
+ return { html: contentHtml, appended: 0 };
409
+ // Readabilityが既に保持している表はプローブ多数決で除外する。Readabilityが一部セルを刈っても
410
+ // 過半数のプローブが本文に残っていれば「既にある」と判定する。
411
+ const contentText = normalizeForSignature(contentHtml);
412
+ const missing = tables.filter((table) => !isTableAlreadyPresent(table, contentText));
413
+ if (missing.length === 0)
414
+ return { html: contentHtml, appended: 0 };
415
+ const { document } = parseHTML(`<!DOCTYPE html><html><body>${contentHtml}</body></html>`);
416
+ const host = document;
417
+ const anchorNodes = Array.from(host.body.querySelectorAll("h1, h2, h3, h4, h5, h6, p"));
418
+ const tail = [];
419
+ for (const table of missing) {
420
+ const anchorNode = table.anchor
421
+ ? anchorNodes.find((node) => normalizeForSignature(node.textContent).includes(table.anchor))
422
+ : undefined;
423
+ if (anchorNode) {
424
+ anchorNode.insertAdjacentHTML("afterend", table.html);
425
+ }
426
+ else {
427
+ tail.push(table.html); // アンカーが出力に無い表は末尾へ。
428
+ }
429
+ }
430
+ const inserted = host.body.innerHTML;
431
+ const html = tail.length > 0 ? `${inserted}\n${tail.join("\n")}` : inserted;
432
+ return { html, appended: missing.length };
433
+ }
434
+ /**
435
+ * 正規化が必要な「データ表」かを判定する。2行2列以上かつ、colspan/rowspanを持つか
436
+ * 「先頭に2行以上の連続ヘッダ行があり、かつその後にデータ行が残る(多段ヘッダ)」表のみtrue。
437
+ * 単純表・レイアウト表・全行がヘッダの表は、turndownに任せて差分と誤破壊を避けるため弾く
438
+ * (全ヘッダ表を多段ヘッダとして畳むとデータ行が消えるため対象外)。
439
+ * 連続ヘッダ行の数え方はnormalizeTableHtmlの列ヘッダ定義(all-th ∧ セル2つ以上)に揃える
440
+ * (全幅単一th行を列ヘッダに数えると単一セルラベルが誤って多段ヘッダ扱いされる)。
441
+ */
442
+ function needsTableNormalization(table) {
443
+ const rows = Array.from(table.querySelectorAll("tr")).filter((tr) => tr.closest("table") === table);
444
+ if (rows.length < 2)
445
+ return false;
446
+ let maxCells = 0;
447
+ let hasSpan = false;
448
+ let leadingHeaderRows = 0;
449
+ let inLeadingHeaders = true;
450
+ for (const row of rows) {
451
+ const cells = Array.from(row.children).filter((el) => el.tagName === "TD" || el.tagName === "TH");
452
+ if (cells.length > maxCells)
453
+ maxCells = cells.length;
454
+ for (const cell of cells) {
455
+ if (clampSpan(cell.getAttribute("colspan")) > 1 || clampSpan(cell.getAttribute("rowspan")) > 1)
456
+ hasSpan = true;
457
+ }
458
+ const isColumnHeader = cells.length >= 2 && cells.every((cell) => cell.tagName === "TH");
459
+ if (inLeadingHeaders && isColumnHeader)
460
+ leadingHeaderRows++;
461
+ else
462
+ inLeadingHeaders = false;
463
+ }
464
+ if (maxCells < 2)
465
+ return false;
466
+ const hasMultiHeaderWithData = leadingHeaderRows >= 2 && leadingHeaderRows < rows.length;
467
+ return hasSpan || hasMultiHeaderWithData;
468
+ }
469
+ const CELL_BLOCK_SELECTOR = "ul, ol, h1, h2, h3, h4, h5, h6, hr, blockquote, pre";
470
+ /** テキストをHTMLへ差し戻す際の最小エスケープ(pre→codeでtextContentを埋め込むため)。 */
471
+ function escapeHtml(text) {
472
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
473
+ }
474
+ /**
475
+ * 直前に非空白の内容があり、かつそれが<br>でない場合にtrue。インライン化した置換文字列が
476
+ * 先行テキストと無境界に連結される(例: 親liのテキストと入れ子リスト先頭項目が「親1子1」化する)
477
+ * のを防ぐため、置換文字列の先頭に<br>を足すべきかの判定に使う。
478
+ */
479
+ function needsLeadingBreak(el) {
480
+ let prev = el.previousSibling;
481
+ while (prev) {
482
+ if (prev.nodeType === 1)
483
+ return prev.tagName !== "BR";
484
+ if (prev.nodeType === 3 && (prev.textContent ?? "").trim().length > 0)
485
+ return true;
486
+ prev = prev.previousSibling;
487
+ }
488
+ return false;
489
+ }
490
+ /** ブロック要素をGFM表セルに収まるインラインHTMLへ変換する。 */
491
+ function inlineReplacement(el) {
492
+ const tag = el.tagName;
493
+ // hr(それ自体が区切り)とblockquote(ブロック子要素を保持したままのunwrap)以外は純インラインに
494
+ // なるため、先行内容との境界を<br>で明示する。
495
+ const lead = tag !== "HR" && tag !== "BLOCKQUOTE" && needsLeadingBreak(el) ? "<br>" : "";
496
+ if (tag === "UL" || tag === "OL") {
497
+ // マーカー無しで各liを<br>連結する(番号・入れ子構造は落とし、テキストとリンクを残す)。
498
+ const items = Array.from(el.children)
499
+ .filter((child) => child.tagName === "LI")
500
+ .map((li) => li.innerHTML.trim())
501
+ .filter((html) => html.length > 0)
502
+ .join("<br>");
503
+ return lead + items;
504
+ }
505
+ if (/^H[1-6]$/.test(tag))
506
+ return `${lead}<strong>${el.innerHTML.trim()}</strong><br>`;
507
+ if (tag === "HR")
508
+ return "<br>";
509
+ if (tag === "BLOCKQUOTE")
510
+ return el.innerHTML; // unwrap(子を保持)。
511
+ return `${lead}<code>${escapeHtml(el.textContent.replace(/\s*\n\s*/g, " ").trim())}</code>`; // PRE。
512
+ }
513
+ /** rootからの深さ(祖先数)を返す。入れ子リスト等を深い方から平坦化する順序付けに使う。 */
514
+ function depthWithin(el, root) {
515
+ let depth = 0;
516
+ let cur = el.parentElement;
517
+ while (cur && cur !== root) {
518
+ depth++;
519
+ cur = cur.parentElement;
520
+ }
521
+ return depth;
522
+ }
523
+ /**
524
+ * 表のセル内ブロック要素(ul/ol/h1-6/hr/blockquote/pre)をインライン化する。
525
+ * turndown-gfmはこれらを含む表をtableShouldBeHtml判定でouterHTMLごとダンプする(joplin-table-wrapper
526
+ * のHTMLリーク)ため、プラグインを触らず入力側で発動条件を消す。入れ子表そのものは触らず、
527
+ * 入れ子表内の要素はその入れ子表を処理する呼び出しに委ねる(closestが自表と一致する要素のみ対象)。
528
+ * 入れ子リストは深い方から平坦化する。
529
+ */
530
+ function inlineCellBlocks(table) {
531
+ const targets = Array.from(table.querySelectorAll(CELL_BLOCK_SELECTOR)).filter((el) => el.closest("table") === table);
532
+ if (targets.length === 0)
533
+ return false;
534
+ targets.sort((a, b) => depthWithin(b, table) - depthWithin(a, table));
535
+ for (const el of targets) {
536
+ el.insertAdjacentHTML("beforebegin", inlineReplacement(el));
537
+ el.remove();
538
+ }
539
+ return true;
540
+ }
541
+ /**
542
+ * 本文HTMLに保持された複雑表(colspan/rowspan・多段ヘッダ)をその場で正規化し、あわせて全表の
543
+ * セル内ブロック要素をインライン化する。
544
+ * 救出経路(reinsertDroppedTables)は「Readabilityが落とした表」しか正規化しないため、
545
+ * Readability/アダプタ/ジオメトリ/selector等が本文に保持した複雑表は未正規化のまま
546
+ * turndownへ渡ると列ズレ・空セルになる。turndown直前の全経路共通パスでこれを補う。
547
+ * (検証URLの日本語Wikipedia rowspan表はアダプタ経路=Readability非経由のため、
548
+ * readability経路限定ではなく全経路に適用する必要がある。)
549
+ * 正規化はspan/多段ヘッダを持つ最外データ表だけを対象にし、レイアウト表・単純表・
550
+ * 既に正規化済みの表(救出で挿入済みを含む)は触らないため冪等。
551
+ * インライン化はブロック要素を持つ全ての表が対象(セル内ul等によるturndown-gfmのouterHTML
552
+ * ダンプを防ぐため)。入れ子表もgfmからは単体の表として変換される(外表スキップ時に内表だけが
553
+ * GFM表になる)ので、最外表に限定せず各表を個別にインライン化する。正規化より先に全表を
554
+ * インライン化するのは、外表の正規化(remove+再挿入)後では旧サブツリー内の入れ子表への
555
+ * 変更が出力へ反映されないため。
556
+ */
557
+ export function normalizeRetainedTables(contentHtml) {
558
+ if (!contentHtml.includes("<table"))
559
+ return contentHtml;
560
+ const { document } = parseHTML(`<!DOCTYPE html><html><body>${contentHtml}</body></html>`);
561
+ const host = document;
562
+ const tables = Array.from(host.body.querySelectorAll("table"));
563
+ let changed = false;
564
+ for (const table of tables) {
565
+ if (inlineCellBlocks(table))
566
+ changed = true;
567
+ }
568
+ for (const table of tables) {
569
+ if (table.parentElement?.closest("table"))
570
+ continue; // 入れ子表は最外表側で処理する。
571
+ if (!needsTableNormalization(table))
572
+ continue;
573
+ table.insertAdjacentHTML("afterend", normalizeTableHtml(table.outerHTML));
574
+ table.remove();
575
+ changed = true;
576
+ }
577
+ return changed ? host.body.innerHTML : contentHtml;
578
+ }
579
+ /**
580
+ * turndownにはstyle/scriptの内容を除外するルールが無く、DOM上に残っていると
581
+ * 地の文への吸収(defaultReplacementが子孫テキストをそのまま連結する)か、gfmプラグインの
582
+ * 複雑表フォールバック(node.outerHTMLをそのままダンプする)経由でMarkdownへ混入する。
583
+ * Readability自身は_prepDocumentで<style>を除去するが、それはparse()呼び出し時点の
584
+ * ドキュメントにしか効かない: 救出表(collectDataTables)はparse前のouterHTMLを採取するため
585
+ * 道連れにしてしまい、アダプタ/selector経路はReadabilityを経由すらしない。抽出方式に関わらず
586
+ * 確実に除去するため、全ての抽出処理より前にドキュメント全体から取り除く
587
+ * (removeConsentBannersより前: バナー判定のテキスト長ヒューリスティックが埋め込みCSSで
588
+ * 水増しされるのも防げる)。pre/code内は著者が意図的に置いたコード例とみなし対象外にする。
589
+ *
590
+ * noscriptは対象に含めない: Readability.parse()は内部の_unwrapNoscriptImages()で、遅延読み込み
591
+ * プレースホルダimgをnoscript内の実画像へ差し替えてからnoscriptを除去する(style/scriptには
592
+ * 無い復元ロジック)。ここで先回りして除去すると差し替え元のnoscriptが消え、劣化した
593
+ * プレースホルダ画像しか残らなくなる。noscript自体の除去はremoveResidualNoscriptElements
594
+ * (turndown直前の全経路共通パス、Readability実行後)に委ねる。
595
+ */
596
+ export function removeStyleLeakElements(document) {
597
+ for (const el of Array.from(document.querySelectorAll("style, script"))) {
598
+ if (el.closest("pre, code"))
599
+ continue;
600
+ el.remove();
601
+ }
602
+ }
603
+ /**
604
+ * <noscript>の除去は、Readability.parse()内の_unwrapNoscriptImages()(遅延読み込み
605
+ * プレースホルダimgをnoscript内の実画像へ差し替える処理)より後に行う必要がある
606
+ * (removeStyleLeakElementsのコメント参照)。readability/geometry/body-fallback経路は
607
+ * Readability.parse()が常に呼ばれる(結果を使わない場合も含め、渡したdocumentへ破壊的に
608
+ * 適用される)ため、この時点で画像差し替え・noscript除去は既に完了しており本関数は素通りする。
609
+ * 一方adapter/selector経路はReadabilityを経由しないため<noscript>が残ったままで、
610
+ * 地の文へ混入する。turndown直前の全経路共通パスに置くことで、経由済みの経路には影響を
611
+ * 与えず(冪等)、未経由の経路だけを確実にカバーする。pre/code内は著者が意図的に置いた
612
+ * コード例とみなし対象外にする。
613
+ */
614
+ export function removeResidualNoscriptElements(html) {
615
+ if (!/<noscript[\s>]/i.test(html))
616
+ return html;
617
+ const { document } = parseHTML(`<!DOCTYPE html><html><body>${html}</body></html>`);
618
+ const host = document;
619
+ let changed = false;
620
+ for (const el of Array.from(host.body.querySelectorAll("noscript"))) {
621
+ if (el.closest("pre, code"))
622
+ continue;
623
+ el.remove();
624
+ changed = true;
625
+ }
626
+ return changed ? host.body.innerHTML : html;
627
+ }
140
628
  export function extractMarkdown(html, options = {}) {
141
629
  const url = options.url ?? "about:blank";
142
630
  const { document } = parseHTML(html);
631
+ removeStyleLeakElements(document);
143
632
  stripRubyAnnotations(document);
144
633
  removeConsentBanners(document);
145
634
  // レンダリング可視テキストに近い統計を、プルーニング/selector適用前の元ドキュメントから採取する
@@ -183,10 +672,14 @@ export function extractMarkdown(html, options = {}) {
183
672
  if (document.body) {
184
673
  prunedBlockCount = pruneLowValueBlocks(document.body);
185
674
  }
675
+ // Readabilityはリンク密度の高いデータ表(各国人口ソート表等)を本文から丸ごと落とすことがある。
676
+ // parseは渡したdocumentを破壊的に変更するため、parse前に救出候補の表を位置アンカー付きで採取しておく。
677
+ const dataTables = document.body ? collectDataTables(document.body) : [];
186
678
  const article = new Readability(document).parse();
187
679
  const geometryHtml = options.geometry ? extractByGeometry(document, options.geometry) : null;
188
680
  if (article && article.content && (article.textContent ?? "").trim().length >= MIN_READABILITY_TEXT_LENGTH) {
189
- contentHtml = article.content;
681
+ // Readabilityが取りこぼしたデータ表を、可能なら元の位置へ戻して本文へ再結合する。
682
+ contentHtml = reinsertDroppedTables(article.content, dataTables).html;
190
683
  title = article.title || title;
191
684
  extractionMethod = "readability";
192
685
  }
@@ -206,8 +699,13 @@ export function extractMarkdown(html, options = {}) {
206
699
  }
207
700
  }
208
701
  }
702
+ // turndownは複雑表(colspan/rowspan・多段ヘッダ)を列ズレ・空セルにするため、変換前に
703
+ // 全経路共通で最外データ表を正規化する(救出経路で正規化済みの表・単純表・レイアウト表は素通し)。
704
+ const normalizedHtml = normalizeRetainedTables(contentHtml);
705
+ // adapter/selector経路(Readability非経由)に残り得るnoscriptを最終段で除去する。詳細はコメント参照。
706
+ const sanitizedHtml = removeResidualNoscriptElements(normalizedHtml);
209
707
  const turndown = createTurndownService();
210
- const rawMarkdown = turndown.turndown(contentHtml).trim();
708
+ const rawMarkdown = turndown.turndown(sanitizedHtml).trim();
211
709
  const markdown = normalizeCjkText(rawMarkdown);
212
710
  return {
213
711
  title,
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/extract/markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/extract/markdown.ts"],"names":[],"mappings":"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"}
@@ -9,10 +9,21 @@ export interface OutlineResult {
9
9
  sections: OutlineSection[];
10
10
  totalTokens: number;
11
11
  }
12
+ /** 節の祖先見出し1つ分(breadcrumb用)。 */
13
+ export interface HeadingRef {
14
+ level: number;
15
+ heading: string;
16
+ }
12
17
  export interface MarkdownSection {
13
18
  id: string;
14
19
  level: number;
15
20
  heading: string;
21
+ /**
22
+ * この節を内包する上位見出しの連なり(浅い順)。leaf節を単独取得したときに
23
+ * 「この内容が何に属すか」の文脈(記事のargument構造)を失わないためのbreadcrumb。
24
+ * トップレベル節では空配列。
25
+ */
26
+ ancestors: HeadingRef[];
16
27
  /** 見出し行自身+ネストした子見出しを含む、この節の全内容(Markdown)。fetchツールのsection取得用。 */
17
28
  content: string;
18
29
  /**
@@ -29,5 +40,12 @@ export interface MarkdownSection {
29
40
  export declare function splitSections(markdown: string): MarkdownSection[];
30
41
  /** 見出しツリー(h1-h4)+各節冒頭1文+概算トークン数の一覧を作る。 */
31
42
  export declare function buildOutline(markdown: string): OutlineResult;
43
+ /** section IDに対応する節(祖先breadcrumb含む)を取得する。無ければnull。 */
44
+ export declare function findSection(markdown: string, sectionId: string): MarkdownSection | null;
32
45
  /** section IDに対応する節のMarkdown本文(ネストした子見出しを含む)を取得する。無ければnull。 */
33
46
  export declare function extractSection(markdown: string, sectionId: string): string | null;
47
+ /**
48
+ * 節の祖先見出しを ` › ` 区切りのbreadcrumb文字列にする。祖先が無ければnull。
49
+ * leaf節を単独取得したときに「この内容が何に属すか」をヘッダで補うために使う。
50
+ */
51
+ export declare function formatBreadcrumb(ancestors: HeadingRef[]): string | null;