amenbo 0.3.0 → 0.4.1
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.
- package/README.en.md +4 -2
- package/README.md +4 -2
- package/dist/adapters/index.d.ts +4 -4
- package/dist/adapters/index.js +0 -7
- package/dist/adapters/index.js.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/core.d.ts +21 -33
- package/dist/core.js +4 -201
- package/dist/core.js.map +1 -1
- package/dist/extract/markdown.d.ts +143 -5
- package/dist/extract/markdown.js +524 -39
- package/dist/extract/markdown.js.map +1 -1
- package/dist/fetcher/http.d.ts +1 -1
- package/dist/fetcher/http.js +1 -1
- package/dist/formatting.d.ts +48 -0
- package/dist/formatting.js +203 -0
- package/dist/formatting.js.map +1 -0
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -25,6 +25,7 @@ export interface ExtractResult {
|
|
|
25
25
|
interface TableCandidate {
|
|
26
26
|
tagName: string;
|
|
27
27
|
outerHTML: string;
|
|
28
|
+
innerHTML: string;
|
|
28
29
|
textContent: string;
|
|
29
30
|
parentElement: TableCandidate | null;
|
|
30
31
|
closest(selector: string): TableCandidate | null;
|
|
@@ -37,15 +38,36 @@ interface TableQueryHost {
|
|
|
37
38
|
export interface DroppedTable {
|
|
38
39
|
/** turndownへ渡す正規化済みHTML(colspan/rowspan展開・多段ヘッダ結合後)。 */
|
|
39
40
|
html: string;
|
|
40
|
-
/**
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* 表内セル(th/td)から作った照合プローブ群。Readability出力に既にある表かの重複判定に使う。
|
|
43
|
+
* 単一signatureではなく複数プローブの多数決にするのは、Readabilityが表を保持しつつ一部セルの
|
|
44
|
+
* 隠し要素を刈る(Langエラーspan・隠し座標span等)ため、先頭固定のsignatureだと保持済みの表でも
|
|
45
|
+
* 照合が外れて丸ごと再挿入されるのを防ぐため。contentHtml側と同じnormalizeForSignature
|
|
46
|
+
* (タグ→空白)で両辺を揃える(空白非対称による重複挿入対策)。
|
|
47
|
+
*/
|
|
48
|
+
probes: string[];
|
|
42
49
|
/** 表の直前の見出し(優先)または近傍段落の正規化テキスト。位置復元のアンカー。無ければ空。 */
|
|
43
50
|
anchor: string;
|
|
51
|
+
/**
|
|
52
|
+
* anchorの由来。heading由来は見出し要素の完全一致で照合し(「人口」等の短く非一意な見出しが
|
|
53
|
+
* 段落の部分文字列へ吸着して表が無関係な節へ誤挿入されるのを防ぐ)、paragraph由来は包含判定する。
|
|
54
|
+
*/
|
|
55
|
+
anchorKind: "heading" | "paragraph" | "";
|
|
44
56
|
}
|
|
45
57
|
/**
|
|
46
58
|
* turndownのGFMテーブル変換はcolspan/rowspan・多段ヘッダを扱えず列ズレや空セルを生む。
|
|
47
|
-
* グリッドを再構築してspan
|
|
48
|
-
*
|
|
59
|
+
* グリッドを再構築してspanを「位置の占有」として展開し(内容の複製はしない)、先頭の連続ヘッダ行は
|
|
60
|
+
* 1行へ結合してから全行同一列数の単純表を返す。救出経路(collectDataTables)とReadability/アダプタ等が
|
|
61
|
+
* 本文に保持した複雑表(normalizeRetainedTables)の双方から呼ばれる。
|
|
62
|
+
* spanの無い単純表・既に正規化済みの表に対しては構造を変えず冪等に振る舞う。
|
|
63
|
+
* captionは再構築で失われないよう先頭へ復元する。
|
|
64
|
+
*
|
|
65
|
+
* 内容配置は行の役割で分岐する:
|
|
66
|
+
* - 列ヘッダ行(all-th ∧ 起点セル2つ以上): 占有読み。colspanグループラベルは配下の各列へ複製される
|
|
67
|
+
* (多段ヘッダ結合「グループ 列名」の意味を保つための唯一の複製)
|
|
68
|
+
* - データ行: 起点位置にのみ内容、span継続位置は空セル(複製しない)
|
|
69
|
+
* - 全幅単一th行: 列ヘッダではなく表題/節ラベル。先頭の連続分はcaptionへ畳み(turndown-gfmが
|
|
70
|
+
* ヘッダ行を見失って複雑表フォールバックへ落ちるのを防ぐ)、表中間の区切り行はデータ行として出力
|
|
49
71
|
*/
|
|
50
72
|
export declare function normalizeTableHtml(tableHtml: string): string;
|
|
51
73
|
/**
|
|
@@ -58,11 +80,127 @@ export declare function collectDataTables(body: TableQueryHost): DroppedTable[];
|
|
|
58
80
|
/**
|
|
59
81
|
* Readability出力に含まれない表だけを、可能なら元の位置(アンカー直後)へ、無理なら末尾へ再結合する。
|
|
60
82
|
* アンカー(表の直前見出し/段落)がReadability出力に残っていれば、その要素の直後に挿入して
|
|
61
|
-
* 「表が本来属していた節」へ戻す(記事構造=意味の保持)
|
|
83
|
+
* 「表が本来属していた節」へ戻す(記事構造=意味の保持)。残っていなければ末尾フォールバック
|
|
84
|
+
* (誤配置より末尾が安全)。
|
|
62
85
|
*/
|
|
63
86
|
export declare function reinsertDroppedTables(contentHtml: string, tables: DroppedTable[]): {
|
|
64
87
|
html: string;
|
|
65
88
|
appended: number;
|
|
66
89
|
};
|
|
90
|
+
/** 救出対象の見出し。位置復元のため直後段落テキストをアンカーとして持つ。 */
|
|
91
|
+
export interface DroppedHeading {
|
|
92
|
+
/** 見出しレベル(2-6)。h1はReadabilityがtitleへ昇格させるため対象外。 */
|
|
93
|
+
level: number;
|
|
94
|
+
/** normalizeForSignatureで正規化した見出しのプレーンテキスト。outlineに要る階層とテキストのみ持つ。 */
|
|
95
|
+
text: string;
|
|
96
|
+
/**
|
|
97
|
+
* 節スコープ内の十分長いコンテンツ要素(段落/表/リスト等)を文書順に並べた位置復元アンカー候補。
|
|
98
|
+
* 最初の段落まで(段落を含む)を最大HEADING_ANCHOR_CANDIDATE_MAX件持ち、照合は先頭から試して
|
|
99
|
+
* 最初に一致した要素の直前へ挿入する。単一アンカーにしないのは、節先頭のブロックが
|
|
100
|
+
* Readabilityに落とされるノイズ(廃止グラフ注意書き等)だった場合に、後続の実在要素
|
|
101
|
+
* (データ表や本文段落)へ吸着させるため。段落優先にせず文書順なのは、節の先頭が表のとき
|
|
102
|
+
* 見出しを表の前に立てるため(段落優先だと見出しが表の後ろへ入り、表が前の節へ帰属してしまう)。
|
|
103
|
+
* 空配列=節本文なし(復元しない)。
|
|
104
|
+
*/
|
|
105
|
+
anchors: HeadingAnchorCandidate[];
|
|
106
|
+
}
|
|
107
|
+
export interface HeadingAnchorCandidate {
|
|
108
|
+
text: string;
|
|
109
|
+
/**
|
|
110
|
+
* block(表/リスト)由来はnormalizeTableHtml再構築で空白が消えるため全空白除去で照合し、
|
|
111
|
+
* paragraph由来は空白正規化ベースの包含で照合する(全空白除去を段落由来へ広げると欧文で偽陽性が増える)。
|
|
112
|
+
*/
|
|
113
|
+
kind: "paragraph" | "block";
|
|
114
|
+
}
|
|
115
|
+
/** collectHeadingsが走査するDOM要素の最小インターフェース。 */
|
|
116
|
+
interface HeadingCandidate {
|
|
117
|
+
tagName: string;
|
|
118
|
+
textContent: string;
|
|
119
|
+
parentElement: HeadingCandidate | null;
|
|
120
|
+
closest(selector: string): HeadingCandidate | null;
|
|
121
|
+
}
|
|
122
|
+
interface HeadingQueryHost {
|
|
123
|
+
querySelectorAll(selector: string): ArrayLike<HeadingCandidate>;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Readabilityは見出しがラッパー要素(編集リンク付きdiv等)に包まれていると本文整形時にh2-h6を
|
|
127
|
+
* 丸ごと落とし、outline/section機能が依存する節構造を全消失させる。parse前のdocumentからh2-h6を
|
|
128
|
+
* 採取し、節スコープ内の段落/ブロックをアンカーにして位置復元に備える。
|
|
129
|
+
* parseは渡したdocumentを破壊的に変更するため、必ずparse前に呼ぶこと。
|
|
130
|
+
* h1はReadabilityがtitleへ昇格させるため対象外(復元するとtitleと二重化する)。
|
|
131
|
+
* 見出し内リンク等のmarkupは持たない(outlineに要るのはテキストと階層のみ)。
|
|
132
|
+
*/
|
|
133
|
+
export declare function collectHeadings(body: HeadingQueryHost): DroppedHeading[];
|
|
134
|
+
/**
|
|
135
|
+
* Readabilityが落とした見出しを、アンカー(直後段落)がReadability出力に残っている場合のみ、
|
|
136
|
+
* その段落の直前(beforebegin)へ`<hN>text</hN>`として戻す。
|
|
137
|
+
*
|
|
138
|
+
* 表救出(reinsertDroppedTables)との最重要差分は「アンカー不在の見出しは復元しない・末尾
|
|
139
|
+
* フォールバックもしない」こと。表=データそのもの(失うと情報欠落)だが、見出し=節のラベルであり、
|
|
140
|
+
* 節本文がReadability出力に残っていない見出しを戻してもノイズにしかならない。アンカーの生存確認が
|
|
141
|
+
* 「その節が本文として残っているか」の判定を兼ね、nav/フッター等Readabilityが正しく落とした節の
|
|
142
|
+
* 見出しを自然に除外する(サイト固有知識なしでnavbox見出しを拾わない)。
|
|
143
|
+
* 同一テキストの見出しは最初の1件のみ扱う(同名節の複数復元はアンカー取り違えリスクの方が大きい)。
|
|
144
|
+
* 挿入は「同テキストの見出しが本文に無い」場合のみのため、再適用しても増えない(冪等)。
|
|
145
|
+
*/
|
|
146
|
+
export declare function reinsertDroppedHeadings(contentHtml: string, headings: DroppedHeading[]): {
|
|
147
|
+
html: string;
|
|
148
|
+
restored: number;
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* 本文HTMLに保持された複雑表(colspan/rowspan・多段ヘッダ)をその場で正規化し、あわせて全表の
|
|
152
|
+
* セル内ブロック要素をインライン化する。
|
|
153
|
+
* 救出経路(reinsertDroppedTables)は「Readabilityが落とした表」しか正規化しないため、
|
|
154
|
+
* Readability/アダプタ/ジオメトリ/selector等が本文に保持した複雑表は未正規化のまま
|
|
155
|
+
* turndownへ渡ると列ズレ・空セルになる。turndown直前の全経路共通パスでこれを補う。
|
|
156
|
+
* (アダプタ経路(例: zenn等)はReadabilityを経由しないため、readability経路限定ではなく
|
|
157
|
+
* 全経路に適用する必要がある。)
|
|
158
|
+
* 正規化はspan/多段ヘッダを持つ最外データ表だけを対象にし、レイアウト表・単純表・
|
|
159
|
+
* 既に正規化済みの表(救出で挿入済みを含む)は触らないため冪等。
|
|
160
|
+
* インライン化はブロック要素を持つ全ての表が対象(セル内ul等によるturndown-gfmのouterHTML
|
|
161
|
+
* ダンプを防ぐため)。入れ子表もgfmからは単体の表として変換される(外表スキップ時に内表だけが
|
|
162
|
+
* GFM表になる)ので、最外表に限定せず各表を個別にインライン化する。正規化より先に全表を
|
|
163
|
+
* インライン化するのは、外表の正規化(remove+再挿入)後では旧サブツリー内の入れ子表への
|
|
164
|
+
* 変更が出力へ反映されないため。
|
|
165
|
+
*/
|
|
166
|
+
export declare function normalizeRetainedTables(contentHtml: string): string;
|
|
167
|
+
/** removeStyleLeakElementsが除去対象を検索・除去できる最小限のDOM互換インターフェース。 */
|
|
168
|
+
interface StyleLeakElement {
|
|
169
|
+
closest(selector: string): unknown;
|
|
170
|
+
remove(): void;
|
|
171
|
+
}
|
|
172
|
+
export interface StyleLeakHostDocument {
|
|
173
|
+
querySelectorAll(selector: string): ArrayLike<StyleLeakElement>;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* turndownにはstyle/scriptの内容を除外するルールが無く、DOM上に残っていると
|
|
177
|
+
* 地の文への吸収(defaultReplacementが子孫テキストをそのまま連結する)か、gfmプラグインの
|
|
178
|
+
* 複雑表フォールバック(node.outerHTMLをそのままダンプする)経由でMarkdownへ混入する。
|
|
179
|
+
* Readability自身は_prepDocumentで<style>を除去するが、それはparse()呼び出し時点の
|
|
180
|
+
* ドキュメントにしか効かない: 救出表(collectDataTables)はparse前のouterHTMLを採取するため
|
|
181
|
+
* 道連れにしてしまい、アダプタ/selector経路はReadabilityを経由すらしない。抽出方式に関わらず
|
|
182
|
+
* 確実に除去するため、全ての抽出処理より前にドキュメント全体から取り除く
|
|
183
|
+
* (removeConsentBannersより前: バナー判定のテキスト長ヒューリスティックが埋め込みCSSで
|
|
184
|
+
* 水増しされるのも防げる)。pre/code内は著者が意図的に置いたコード例とみなし対象外にする。
|
|
185
|
+
*
|
|
186
|
+
* noscriptは対象に含めない: Readability.parse()は内部の_unwrapNoscriptImages()で、遅延読み込み
|
|
187
|
+
* プレースホルダimgをnoscript内の実画像へ差し替えてからnoscriptを除去する(style/scriptには
|
|
188
|
+
* 無い復元ロジック)。ここで先回りして除去すると差し替え元のnoscriptが消え、劣化した
|
|
189
|
+
* プレースホルダ画像しか残らなくなる。noscript自体の除去はremoveResidualNoscriptElements
|
|
190
|
+
* (turndown直前の全経路共通パス、Readability実行後)に委ねる。
|
|
191
|
+
*/
|
|
192
|
+
export declare function removeStyleLeakElements(document: StyleLeakHostDocument): void;
|
|
193
|
+
/**
|
|
194
|
+
* <noscript>の除去は、Readability.parse()内の_unwrapNoscriptImages()(遅延読み込み
|
|
195
|
+
* プレースホルダimgをnoscript内の実画像へ差し替える処理)より後に行う必要がある
|
|
196
|
+
* (removeStyleLeakElementsのコメント参照)。readability/geometry/body-fallback経路は
|
|
197
|
+
* Readability.parse()が常に呼ばれる(結果を使わない場合も含め、渡したdocumentへ破壊的に
|
|
198
|
+
* 適用される)ため、この時点で画像差し替え・noscript除去は既に完了しており本関数は素通りする。
|
|
199
|
+
* 一方adapter/selector経路はReadabilityを経由しないため<noscript>が残ったままで、
|
|
200
|
+
* 地の文へ混入する。turndown直前の全経路共通パスに置くことで、経由済みの経路には影響を
|
|
201
|
+
* 与えず(冪等)、未経由の経路だけを確実にカバーする。pre/code内は著者が意図的に置いた
|
|
202
|
+
* コード例とみなし対象外にする。
|
|
203
|
+
*/
|
|
204
|
+
export declare function removeResidualNoscriptElements(html: string): string;
|
|
67
205
|
export declare function extractMarkdown(html: string, options?: ExtractOptions): ExtractResult;
|
|
68
206
|
export {};
|