webforai 3.0.0 → 4.1.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.
- package/README.md +47 -5
- package/dist/bin.js +3109 -490
- package/dist/cjs/detect-client-shell.js +78 -0
- package/dist/cjs/extract-mdast.js +58 -0
- package/dist/cjs/extract-meta-refresh.js +71 -0
- package/dist/cjs/extractors/index.js +5 -0
- package/dist/cjs/extractors/lib/block-features.js +465 -0
- package/dist/cjs/extractors/lib/block-model.generated.js +45 -0
- package/dist/cjs/extractors/lib/block-model.js +72 -0
- package/dist/cjs/extractors/lib/blocks.js +212 -0
- package/dist/cjs/extractors/lib/code-tabs.js +191 -0
- package/dist/cjs/extractors/lib/constants.js +1 -1
- package/dist/cjs/extractors/lib/layout-tables.js +123 -0
- package/dist/cjs/extractors/lib/sanitize.js +146 -26
- package/dist/cjs/extractors/lib/takumi-signal.js +76 -0
- package/dist/cjs/extractors/lib/ui-chrome.js +7 -0
- package/dist/cjs/extractors/presets/auto.js +3 -3
- package/dist/cjs/extractors/presets/kiwame.js +231 -0
- package/dist/cjs/extractors/presets/takumi.js +34 -3
- package/dist/cjs/html-to-markdown.js +58 -4
- package/dist/cjs/html-to-mdast.js +4 -3
- package/dist/cjs/index.js +16 -0
- package/dist/cjs/link-replacer.js +19 -13
- package/dist/cjs/loaders/cf-puppeteer.js +14 -7
- package/dist/cjs/loaders/fetch.js +14 -2
- package/dist/cjs/loaders/playwright.js +32 -30
- package/dist/cjs/loaders/puppeteer.js +14 -7
- package/dist/cjs/md-splitter.js +24 -11
- package/dist/cjs/mdast-handlers/custom-code-handler.js +32 -9
- package/dist/cjs/mdast-handlers/custom-div-handler.js +14 -35
- package/dist/cjs/mdast-handlers/custom-img-handler.js +10 -1
- package/dist/cjs/mdast-handlers/custom-table-handler.js +18 -1
- package/dist/cjs/mdast-handlers/definition-list-handler.js +17 -6
- package/dist/cjs/mdast-handlers/table-cell-flatten.js +195 -0
- package/dist/cjs/mdast-handlers/twoslash.js +71 -0
- package/dist/cjs/mdast-to-markdown.js +2 -5
- package/dist/cjs/metadata/index.js +4 -3
- package/dist/cjs/normalize/index.js +11 -2
- package/dist/cjs/platform/client.js +73 -16
- package/dist/cjs/platform/index.js +4 -0
- package/dist/cjs/platform/types.js +7 -1
- package/dist/cjs/utils/hast-fast.js +1 -1
- package/dist/cjs/utils/parse-html.js +113 -0
- package/dist/cjs/utils/pre-text.js +104 -0
- package/dist/detect-client-shell.js +53 -0
- package/dist/extract-mdast.js +58 -0
- package/dist/extract-meta-refresh.js +47 -0
- package/dist/extractors/index.js +3 -0
- package/dist/extractors/lib/block-features.js +437 -0
- package/dist/extractors/lib/block-model.generated.js +21 -0
- package/dist/extractors/lib/block-model.js +48 -0
- package/dist/extractors/lib/blocks.js +185 -0
- package/dist/extractors/lib/code-tabs.js +168 -0
- package/dist/extractors/lib/constants.js +1 -1
- package/dist/extractors/lib/layout-tables.js +99 -0
- package/dist/extractors/lib/sanitize.js +144 -26
- package/dist/extractors/lib/takumi-signal.js +53 -0
- package/dist/extractors/lib/ui-chrome.js +5 -0
- package/dist/extractors/presets/auto.js +3 -3
- package/dist/extractors/presets/kiwame.js +206 -0
- package/dist/extractors/presets/takumi.js +34 -3
- package/dist/html-to-markdown.js +57 -4
- package/dist/html-to-mdast.js +4 -3
- package/dist/index.js +18 -0
- package/dist/link-replacer.js +19 -13
- package/dist/loaders/cf-puppeteer.js +15 -8
- package/dist/loaders/fetch.js +14 -2
- package/dist/loaders/playwright.js +32 -30
- package/dist/loaders/puppeteer.js +15 -8
- package/dist/md-splitter.js +24 -11
- package/dist/mdast-handlers/custom-code-handler.js +30 -9
- package/dist/mdast-handlers/custom-div-handler.js +14 -35
- package/dist/mdast-handlers/custom-img-handler.js +10 -1
- package/dist/mdast-handlers/custom-table-handler.js +19 -2
- package/dist/mdast-handlers/definition-list-handler.js +17 -6
- package/dist/mdast-handlers/table-cell-flatten.js +170 -0
- package/dist/mdast-handlers/twoslash.js +48 -0
- package/dist/mdast-to-markdown.js +2 -5
- package/dist/metadata/index.js +4 -3
- package/dist/normalize/index.js +12 -2
- package/dist/platform/client.js +73 -16
- package/dist/platform/index.js +4 -0
- package/dist/platform/types.js +5 -1
- package/dist/types/cli/bin.js.map +1 -1
- package/dist/types/cli/commands/jobs/files.d.ts +28 -0
- package/dist/types/cli/commands/jobs/files.js.map +1 -0
- package/dist/types/cli/commands/jobs/llms-txt.d.ts +33 -0
- package/dist/types/cli/commands/jobs/llms-txt.js.map +1 -0
- package/dist/types/cli/commands/jobs/options.d.ts +58 -0
- package/dist/types/cli/commands/jobs/options.js.map +1 -0
- package/dist/types/cli/commands/jobs/run.d.ts +44 -0
- package/dist/types/cli/commands/jobs/run.js.map +1 -0
- package/dist/types/cli/commands/skill/content.js.map +1 -1
- package/dist/types/cli/commands/webforai/interactive.d.ts +1 -1
- package/dist/types/cli/commands/webforai/interactive.js.map +1 -1
- package/dist/types/cli/commands/webforai/options.d.ts +9 -2
- package/dist/types/cli/commands/webforai/options.js.map +1 -1
- package/dist/types/cli/commands/webforai/run.js.map +1 -1
- package/dist/types/cli/constants.d.ts +3 -1
- package/dist/types/cli/constants.js.map +1 -1
- package/dist/types/cli/utils.d.ts +8 -1
- package/dist/types/cli/utils.js.map +1 -1
- package/dist/types/detect-client-shell.d.ts +24 -0
- package/dist/types/detect-client-shell.js.map +1 -0
- package/dist/types/extract-mdast.js.map +1 -1
- package/dist/types/extract-meta-refresh.d.ts +29 -0
- package/dist/types/extract-meta-refresh.js.map +1 -0
- package/dist/types/extractors/index.d.ts +1 -0
- package/dist/types/extractors/index.js.map +1 -1
- package/dist/types/extractors/lib/block-features.d.ts +43 -0
- package/dist/types/extractors/lib/block-features.js.map +1 -0
- package/dist/types/extractors/lib/block-model.d.ts +28 -0
- package/dist/types/extractors/lib/block-model.generated.d.ts +5 -0
- package/dist/types/extractors/lib/block-model.generated.js.map +1 -0
- package/dist/types/extractors/lib/block-model.js.map +1 -0
- package/dist/types/extractors/lib/blocks.d.ts +53 -0
- package/dist/types/extractors/lib/blocks.js.map +1 -0
- package/dist/types/extractors/lib/code-tabs.d.ts +30 -0
- package/dist/types/extractors/lib/code-tabs.js.map +1 -0
- package/dist/types/extractors/lib/constants.js.map +1 -1
- package/dist/types/extractors/lib/layout-tables.d.ts +17 -0
- package/dist/types/extractors/lib/layout-tables.js.map +1 -0
- package/dist/types/extractors/lib/sanitize.d.ts +33 -3
- package/dist/types/extractors/lib/sanitize.js.map +1 -1
- package/dist/types/extractors/lib/takumi-signal.d.ts +12 -0
- package/dist/types/extractors/lib/takumi-signal.js.map +1 -0
- package/dist/types/extractors/lib/ui-chrome.d.ts +8 -0
- package/dist/types/extractors/lib/ui-chrome.js.map +1 -1
- package/dist/types/extractors/presets/auto.d.ts +6 -1
- package/dist/types/extractors/presets/auto.js.map +1 -1
- package/dist/types/extractors/presets/kiwame.d.ts +31 -0
- package/dist/types/extractors/presets/kiwame.js.map +1 -0
- package/dist/types/extractors/presets/takumi.js.map +1 -1
- package/dist/types/html-to-markdown.d.ts +9 -0
- package/dist/types/html-to-markdown.js.map +1 -1
- package/dist/types/html-to-mdast.js.map +1 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/link-replacer.d.ts +3 -1
- package/dist/types/link-replacer.js.map +1 -1
- package/dist/types/loaders/cf-puppeteer.js.map +1 -1
- package/dist/types/loaders/fetch.d.ts +4 -0
- package/dist/types/loaders/fetch.js.map +1 -1
- package/dist/types/loaders/playwright.js.map +1 -1
- package/dist/types/loaders/puppeteer.js.map +1 -1
- package/dist/types/md-splitter.d.ts +1 -1
- package/dist/types/md-splitter.js.map +1 -1
- package/dist/types/mdast-handlers/custom-code-handler.d.ts +9 -0
- package/dist/types/mdast-handlers/custom-code-handler.js.map +1 -1
- package/dist/types/mdast-handlers/custom-div-handler.js.map +1 -1
- package/dist/types/mdast-handlers/custom-img-handler.js.map +1 -1
- package/dist/types/mdast-handlers/custom-table-handler.js.map +1 -1
- package/dist/types/mdast-handlers/definition-list-handler.d.ts +0 -11
- package/dist/types/mdast-handlers/definition-list-handler.js.map +1 -1
- package/dist/types/mdast-handlers/table-cell-flatten.d.ts +18 -0
- package/dist/types/mdast-handlers/table-cell-flatten.js.map +1 -0
- package/dist/types/mdast-handlers/twoslash.d.ts +14 -0
- package/dist/types/mdast-handlers/twoslash.js.map +1 -0
- package/dist/types/mdast-to-markdown.js.map +1 -1
- package/dist/types/metadata/index.js.map +1 -1
- package/dist/types/normalize/index.js.map +1 -1
- package/dist/types/platform/client.d.ts +2 -1
- package/dist/types/platform/client.js.map +1 -1
- package/dist/types/platform/error.d.ts +5 -3
- package/dist/types/platform/error.js.map +1 -1
- package/dist/types/platform/fetch.d.ts +2 -0
- package/dist/types/platform/fetch.js.map +1 -1
- package/dist/types/platform/index.d.ts +1 -1
- package/dist/types/platform/index.js.map +1 -1
- package/dist/types/platform/types.d.ts +35 -6
- package/dist/types/platform/types.js.map +1 -1
- package/dist/types/utils/hast-fast.d.ts +1 -1
- package/dist/types/utils/hast-fast.js.map +1 -1
- package/dist/types/utils/parse-html.d.ts +33 -0
- package/dist/types/utils/parse-html.js.map +1 -0
- package/dist/types/utils/pre-text.d.ts +12 -0
- package/dist/types/utils/pre-text.js.map +1 -0
- package/dist/utils/hast-fast.js +1 -1
- package/dist/utils/parse-html.js +87 -0
- package/dist/utils/pre-text.js +81 -0
- package/package.json +18 -5
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var takumi_signal_exports = {};
|
|
20
|
+
__export(takumi_signal_exports, {
|
|
21
|
+
takumiSelection: () => takumiSelection
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(takumi_signal_exports);
|
|
24
|
+
var import_hast_fast = require("../../utils/hast-fast");
|
|
25
|
+
var import_takumi = require("../presets/takumi");
|
|
26
|
+
const MARK = "dataWebforaiIndex";
|
|
27
|
+
const cloneElements = (root) => {
|
|
28
|
+
const copyOf = (node) => "children" in node ? {
|
|
29
|
+
...node,
|
|
30
|
+
...(0, import_hast_fast.isElement)(node) ? { properties: { ...node.properties } } : {},
|
|
31
|
+
children: [...node.children]
|
|
32
|
+
} : node;
|
|
33
|
+
const copy = copyOf(root);
|
|
34
|
+
const stack = [copy];
|
|
35
|
+
while (stack.length > 0) {
|
|
36
|
+
const parent = stack.pop();
|
|
37
|
+
if (!("children" in parent)) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const children = parent.children;
|
|
41
|
+
for (let index = 0; index < children.length; index++) {
|
|
42
|
+
if ("children" in children[index]) {
|
|
43
|
+
children[index] = copyOf(children[index]);
|
|
44
|
+
stack.push(children[index]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return copy;
|
|
49
|
+
};
|
|
50
|
+
const takumiSelection = (root, lang, url) => {
|
|
51
|
+
const elements = [];
|
|
52
|
+
(0, import_hast_fast.walk)(root, (node) => {
|
|
53
|
+
if ((0, import_hast_fast.isElement)(node)) {
|
|
54
|
+
node.properties[MARK] = elements.length;
|
|
55
|
+
elements.push(node);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
const copy = cloneElements(root);
|
|
59
|
+
for (const element of elements) {
|
|
60
|
+
delete element.properties[MARK];
|
|
61
|
+
}
|
|
62
|
+
const kept = /* @__PURE__ */ new Set();
|
|
63
|
+
(0, import_hast_fast.walk)((0, import_takumi.takumiExtractor)({ hast: copy, lang, url, owned: true }), (node) => {
|
|
64
|
+
if ((0, import_hast_fast.isElement)(node)) {
|
|
65
|
+
const index = node.properties[MARK];
|
|
66
|
+
if (typeof index === "number" && elements[index]) {
|
|
67
|
+
kept.add(elements[index]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return kept;
|
|
72
|
+
};
|
|
73
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
74
|
+
0 && (module.exports = {
|
|
75
|
+
takumiSelection
|
|
76
|
+
});
|
|
@@ -18,6 +18,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var ui_chrome_exports = {};
|
|
20
20
|
__export(ui_chrome_exports, {
|
|
21
|
+
MAX_CONSENT_PLACEHOLDER_LENGTH: () => MAX_CONSENT_PLACEHOLDER_LENGTH,
|
|
22
|
+
isConsentPlaceholderText: () => isConsentPlaceholderText,
|
|
21
23
|
isUiChromeText: () => isUiChromeText
|
|
22
24
|
});
|
|
23
25
|
module.exports = __toCommonJS(ui_chrome_exports);
|
|
@@ -113,7 +115,12 @@ const isUiChromeText = (text) => {
|
|
|
113
115
|
}
|
|
114
116
|
return UI_PHRASES.has(normalized);
|
|
115
117
|
};
|
|
118
|
+
const CONSENT_PLACEHOLDER = /^(this content (isn['’]?t|is not) (visible|available) (due to|because of) your (cookie|privacy) (preferences|settings)|we need your (consent|permission) to load|to (view|see|load) this (content|embed|video|post)[, ]+(please )?(enable|accept|allow|update)|(please )?(accept|allow|enable) (all |marketing |functional )?cookies to (view|see|load|watch)|このコンテンツを表示するには.{0,30}(cookie|クッキー|同意|許可))/i;
|
|
119
|
+
const MAX_CONSENT_PLACEHOLDER_LENGTH = 400;
|
|
120
|
+
const isConsentPlaceholderText = (text) => text.length <= MAX_CONSENT_PLACEHOLDER_LENGTH && CONSENT_PLACEHOLDER.test(text.trimStart());
|
|
116
121
|
// Annotate the CommonJS export names for ESM import in node:
|
|
117
122
|
0 && (module.exports = {
|
|
123
|
+
MAX_CONSENT_PLACEHOLDER_LENGTH,
|
|
124
|
+
isConsentPlaceholderText,
|
|
118
125
|
isUiChromeText
|
|
119
126
|
});
|
|
@@ -23,9 +23,9 @@ __export(auto_exports, {
|
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(auto_exports);
|
|
25
25
|
var import_adapters = require("../../adapters");
|
|
26
|
-
var
|
|
26
|
+
var import_kiwame = require("./kiwame");
|
|
27
27
|
const createAutoExtractor = (options = {}) => {
|
|
28
|
-
const { adapters } = options;
|
|
28
|
+
const { adapters, fallback = import_kiwame.kiwameExtractor } = options;
|
|
29
29
|
return (params) => {
|
|
30
30
|
if (adapters !== false) {
|
|
31
31
|
const extracted = (0, import_adapters.runAdapters)({ hast: params.hast, url: params.url, lang: params.lang }, adapters ?? void 0);
|
|
@@ -33,7 +33,7 @@ const createAutoExtractor = (options = {}) => {
|
|
|
33
33
|
return extracted;
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
return (
|
|
36
|
+
return fallback(params);
|
|
37
37
|
};
|
|
38
38
|
};
|
|
39
39
|
const autoExtractor = createAutoExtractor();
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var kiwame_exports = {};
|
|
20
|
+
__export(kiwame_exports, {
|
|
21
|
+
DEFAULT_THRESHOLD: () => DEFAULT_THRESHOLD,
|
|
22
|
+
createKiwameExtractor: () => createKiwameExtractor,
|
|
23
|
+
kiwameExtractor: () => kiwameExtractor
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(kiwame_exports);
|
|
26
|
+
var import_hast_fast = require("../../utils/hast-fast");
|
|
27
|
+
var import_block_features = require("../lib/block-features");
|
|
28
|
+
var import_block_model = require("../lib/block-model");
|
|
29
|
+
var import_block_model2 = require("../lib/block-model.generated");
|
|
30
|
+
var import_blocks = require("../lib/blocks");
|
|
31
|
+
var import_layout_tables = require("../lib/layout-tables");
|
|
32
|
+
var import_sanitize = require("../lib/sanitize");
|
|
33
|
+
var import_takumi_signal = require("../lib/takumi-signal");
|
|
34
|
+
var import_takumi = require("./takumi");
|
|
35
|
+
const DEFAULT_THRESHOLD = 0.47;
|
|
36
|
+
const findBody = (hast) => (0, import_hast_fast.findElement)(hast, (element) => element.tagName === "body") ?? hast;
|
|
37
|
+
const completeTables = (kept, blocks) => {
|
|
38
|
+
const rows = /* @__PURE__ */ new Set();
|
|
39
|
+
const tables = /* @__PURE__ */ new Set();
|
|
40
|
+
for (const block of blocks) {
|
|
41
|
+
if (!kept.has(block.owner)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const { row, table } = enclosingTable(block.frame);
|
|
45
|
+
if (row) {
|
|
46
|
+
rows.add(row);
|
|
47
|
+
}
|
|
48
|
+
if (table) {
|
|
49
|
+
tables.add(table);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const table of tables) {
|
|
53
|
+
const first = (0, import_hast_fast.findElement)(table, (element) => element.tagName === "tr");
|
|
54
|
+
if (first) {
|
|
55
|
+
rows.add(first);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
for (const block of blocks) {
|
|
59
|
+
const { row } = enclosingTable(block.frame);
|
|
60
|
+
if (row && rows.has(row)) {
|
|
61
|
+
kept.add(block.owner);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const enclosingTable = (start) => {
|
|
66
|
+
let row;
|
|
67
|
+
for (let frame = start; frame; frame = frame.parent) {
|
|
68
|
+
const tag = frame.element.tagName;
|
|
69
|
+
if (tag === "tr" && !row) {
|
|
70
|
+
row = frame.element;
|
|
71
|
+
} else if (tag === "table") {
|
|
72
|
+
return { row, table: frame.element };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { row };
|
|
76
|
+
};
|
|
77
|
+
const HEADING_LOOKAHEAD = 3;
|
|
78
|
+
const keepSectionHeadings = (kept, blocks) => {
|
|
79
|
+
let seenKept = false;
|
|
80
|
+
for (let index = 0; index < blocks.length; index++) {
|
|
81
|
+
const block = blocks[index];
|
|
82
|
+
if (kept.has(block.owner)) {
|
|
83
|
+
seenKept = true;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (!(seenKept && /^h[1-6]$/.test(block.owner.tagName))) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
for (let next = index + 1; next < Math.min(blocks.length, index + 1 + HEADING_LOOKAHEAD); next++) {
|
|
90
|
+
if (/^h[1-6]$/.test(blocks[next].owner.tagName)) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
if (kept.has(blocks[next].owner)) {
|
|
94
|
+
kept.add(block.owner);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const CODE_IN_CONTENT_THRESHOLD = 0.2;
|
|
101
|
+
const CODE_CONTEXT = 6;
|
|
102
|
+
const keepCodeInContent = (kept, blocks, probabilities) => {
|
|
103
|
+
const keptIndex = blocks.map((block) => kept.has(block.owner));
|
|
104
|
+
const near = (from, step) => {
|
|
105
|
+
for (let distance = 1; distance <= CODE_CONTEXT; distance++) {
|
|
106
|
+
const index = from + step * distance;
|
|
107
|
+
if (index < 0 || index >= blocks.length) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
if (keptIndex[index]) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
};
|
|
116
|
+
for (const block of blocks) {
|
|
117
|
+
if (block.owner.tagName === "pre" && !keptIndex[block.index] && probabilities[block.index] >= CODE_IN_CONTENT_THRESHOLD && near(block.index, -1) && near(block.index, 1)) {
|
|
118
|
+
kept.add(block.owner);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const listOf = (block) => {
|
|
123
|
+
if (block.owner.tagName !== "li") {
|
|
124
|
+
return void 0;
|
|
125
|
+
}
|
|
126
|
+
for (let frame = block.frame.parent; frame; frame = frame.parent) {
|
|
127
|
+
const tag = frame.element.tagName;
|
|
128
|
+
if (tag === "ul" || tag === "ol") {
|
|
129
|
+
return frame.element;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return void 0;
|
|
133
|
+
};
|
|
134
|
+
const keepAuthoredLists = (kept, blocks) => {
|
|
135
|
+
let seenKept = false;
|
|
136
|
+
for (let index = 0; index < blocks.length - 1; index++) {
|
|
137
|
+
const block = blocks[index];
|
|
138
|
+
const introducesList = kept.has(block.owner) && /[::]\s*$/.test(block.text) || seenKept && /^h[1-6]$/.test(block.owner.tagName) && import_sanitize.REFERENCE_HEADING.test(block.text.trim());
|
|
139
|
+
seenKept ||= kept.has(block.owner);
|
|
140
|
+
const list = listOf(blocks[index + 1]);
|
|
141
|
+
if (!(introducesList && list)) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
kept.add(block.owner);
|
|
145
|
+
for (let next = index + 1; next < blocks.length && listOf(blocks[next]) === list; next++) {
|
|
146
|
+
kept.add(blocks[next].owner);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const pruneToBlocks = (element, kept, ownerKept) => {
|
|
151
|
+
const isBlock = element.type === "element" && (import_blocks.BLOCK_TAGS.has(element.tagName) || element.tagName === "pre");
|
|
152
|
+
const selfKept = isBlock ? kept.has(element) : ownerKept;
|
|
153
|
+
if (element.type === "element" && element.tagName === "pre") {
|
|
154
|
+
return selfKept;
|
|
155
|
+
}
|
|
156
|
+
let keepChildren = false;
|
|
157
|
+
const children = [];
|
|
158
|
+
for (const child of element.children) {
|
|
159
|
+
if (child.type === "element") {
|
|
160
|
+
if (pruneToBlocks(child, kept, selfKept)) {
|
|
161
|
+
children.push(child);
|
|
162
|
+
keepChildren = true;
|
|
163
|
+
}
|
|
164
|
+
} else if (child.type === "text") {
|
|
165
|
+
if (selfKept) {
|
|
166
|
+
children.push(child);
|
|
167
|
+
}
|
|
168
|
+
} else {
|
|
169
|
+
children.push(child);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
element.children = children;
|
|
173
|
+
return selfKept || keepChildren;
|
|
174
|
+
};
|
|
175
|
+
const createKiwameExtractor = (options = {}) => {
|
|
176
|
+
const { threshold = DEFAULT_THRESHOLD, model = import_block_model2.BLOCK_MODEL, cleanup = true } = options;
|
|
177
|
+
const stackModel = options.stackModel === void 0 ? import_block_model2.BLOCK_STACK_MODEL : options.stackModel;
|
|
178
|
+
const usable = (0, import_block_model.isUsableModel)(model);
|
|
179
|
+
const stackUsable = stackModel ? (0, import_block_model.isUsableModel)(stackModel, import_block_features.STACKED_FEATURE_COUNT) : false;
|
|
180
|
+
return (params) => {
|
|
181
|
+
if (!usable) {
|
|
182
|
+
return (0, import_takumi.takumiExtractor)(params);
|
|
183
|
+
}
|
|
184
|
+
const { hast, lang, owned } = params;
|
|
185
|
+
const body = owned ? findBody(hast) : (0, import_hast_fast.cloneHast)(findBody(hast));
|
|
186
|
+
(0, import_sanitize.stripNonContent)(body);
|
|
187
|
+
const blocks = (0, import_blocks.segmentBlocks)(body);
|
|
188
|
+
if (blocks.length === 0 || !((0, import_hast_fast.isElement)(body) || body.type === "root")) {
|
|
189
|
+
return body;
|
|
190
|
+
}
|
|
191
|
+
const collector = new import_hast_fast.MetricsCollector();
|
|
192
|
+
const takumiKept = (0, import_takumi_signal.takumiSelection)(body, lang, params.url);
|
|
193
|
+
const features = (0, import_block_features.blockFeatures)({ root: body, blocks, collector, lang, takumiKept });
|
|
194
|
+
let probabilities = (0, import_block_model.scoreBlocks)(features, blocks.length, model, import_block_features.FEATURE_COUNT);
|
|
195
|
+
if (stackModel && stackUsable) {
|
|
196
|
+
const stacked = (0, import_block_features.stackedFeatures)(blocks, features, probabilities);
|
|
197
|
+
probabilities = (0, import_block_model.scoreBlocks)(stacked, blocks.length, stackModel, import_block_features.STACKED_FEATURE_COUNT);
|
|
198
|
+
}
|
|
199
|
+
const kept = /* @__PURE__ */ new Set();
|
|
200
|
+
for (const block of blocks) {
|
|
201
|
+
if (probabilities[block.index] >= threshold) {
|
|
202
|
+
kept.add(block.owner);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (kept.size === 0) {
|
|
206
|
+
return (0, import_takumi.takumiExtractor)({ hast: body, lang, url: params.url, owned: true });
|
|
207
|
+
}
|
|
208
|
+
keepCodeInContent(kept, blocks, probabilities);
|
|
209
|
+
keepSectionHeadings(kept, blocks);
|
|
210
|
+
keepAuthoredLists(kept, blocks);
|
|
211
|
+
completeTables(kept, blocks);
|
|
212
|
+
pruneToBlocks(body, kept, false);
|
|
213
|
+
(0, import_layout_tables.unwrapLayoutTables)(body);
|
|
214
|
+
if (!cleanup) {
|
|
215
|
+
return body;
|
|
216
|
+
}
|
|
217
|
+
(0, import_hast_fast.walk)(body, (node) => {
|
|
218
|
+
if ((0, import_hast_fast.isElement)(node) && (node.tagName === "form" || node.tagName === "fieldset")) {
|
|
219
|
+
node.tagName = "div";
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
return (0, import_sanitize.cleanContent)(body, new import_hast_fast.MetricsCollector());
|
|
223
|
+
};
|
|
224
|
+
};
|
|
225
|
+
const kiwameExtractor = createKiwameExtractor();
|
|
226
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
227
|
+
0 && (module.exports = {
|
|
228
|
+
DEFAULT_THRESHOLD,
|
|
229
|
+
createKiwameExtractor,
|
|
230
|
+
kiwameExtractor
|
|
231
|
+
});
|
|
@@ -27,6 +27,7 @@ var import_sanitize = require("../lib/sanitize");
|
|
|
27
27
|
var import_score = require("../lib/score");
|
|
28
28
|
var import_terminators = require("../lib/terminators");
|
|
29
29
|
const MIN_RETAINED_FRACTION = 0.25;
|
|
30
|
+
const FURNITURE_LINK_DENSITY = 0.5;
|
|
30
31
|
const SEMANTIC_SELECTORS = [
|
|
31
32
|
(element) => (0, import_hast_fast.stringProperty)(element, "itemprop")?.includes("articleBody") ?? false,
|
|
32
33
|
(element) => element.tagName === "article",
|
|
@@ -64,6 +65,31 @@ const collectMatching = (tree, matches, into) => {
|
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
67
|
};
|
|
68
|
+
const containsTag = (element, tagName) => element.children.some((child) => (0, import_hast_fast.isElement)(child) && (child.tagName === tagName || containsTag(child, tagName)));
|
|
69
|
+
const removesEveryTitle = (root, doomed) => {
|
|
70
|
+
if (!doomed.some((element) => containsTag(element, "h1"))) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
const doomedSet = new Set(doomed);
|
|
74
|
+
let survivor = false;
|
|
75
|
+
const visit = (node) => {
|
|
76
|
+
if (survivor || !("children" in node)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
for (const child of node.children) {
|
|
80
|
+
if (!(0, import_hast_fast.isElement)(child) || doomedSet.has(child)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (child.tagName === "h1") {
|
|
84
|
+
survivor = true;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
visit(child);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
visit(root);
|
|
91
|
+
return !survivor;
|
|
92
|
+
};
|
|
67
93
|
const asRootOf = (nodes) => ({ type: "root", children: nodes });
|
|
68
94
|
const scoredSelection = (tree, collector, lang) => {
|
|
69
95
|
const context = (0, import_score.buildScoringContext)(tree, collector, lang);
|
|
@@ -90,9 +116,14 @@ const takumiExtractor = (params) => {
|
|
|
90
116
|
const shortcut = semanticShortcut(body, collector, minLength);
|
|
91
117
|
const searchRoot = shortcut ?? body;
|
|
92
118
|
const searchText = collector.textLength(searchRoot);
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
119
|
+
let doomed = (0, import_sanitize.findUnlikelyElements)(searchRoot);
|
|
120
|
+
const textOf = (elements) => elements.reduce((sum, element) => sum + collector.metrics(element).text, 0);
|
|
121
|
+
let acceptable = searchText - textOf(doomed) > Math.max(minLength, searchText * MIN_RETAINED_FRACTION);
|
|
122
|
+
if (!acceptable) {
|
|
123
|
+
doomed = (0, import_sanitize.findUnlikelyElements)(searchRoot, (element) => collector.linkDensity(element) < FURNITURE_LINK_DENSITY);
|
|
124
|
+
acceptable = doomed.length > 0 && searchText - textOf(doomed) >= minLength && !removesEveryTitle(searchRoot, doomed);
|
|
125
|
+
}
|
|
126
|
+
if (acceptable) {
|
|
96
127
|
const doomedSet = new Set(doomed);
|
|
97
128
|
(0, import_hast_fast.pruneInPlace)(searchRoot, (node) => !((0, import_hast_fast.isElement)(node) && doomedSet.has(node)));
|
|
98
129
|
collector = new import_hast_fast.MetricsCollector();
|
|
@@ -18,18 +18,19 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var html_to_markdown_exports = {};
|
|
20
20
|
__export(html_to_markdown_exports, {
|
|
21
|
+
headingTitle: () => headingTitle,
|
|
21
22
|
htmlToMarkdown: () => htmlToMarkdown,
|
|
22
23
|
htmlToMarkdownWithMetadata: () => htmlToMarkdownWithMetadata
|
|
23
24
|
});
|
|
24
25
|
module.exports = __toCommonJS(html_to_markdown_exports);
|
|
25
|
-
var
|
|
26
|
+
var import_parse_html = require("./utils/parse-html");
|
|
26
27
|
var import_html_to_mdast = require("./html-to-mdast");
|
|
27
28
|
var import_mdast_to_markdown = require("./mdast-to-markdown");
|
|
28
29
|
var import_metadata = require("./metadata");
|
|
29
30
|
var import_hast_utils = require("./utils/hast-utils");
|
|
30
31
|
const htmlToMarkdownWithMetadata = (htmlOrHast, options) => {
|
|
31
32
|
const { baseUrl, frontmatter, title, formatting: toMarkdownOptions, ...toMdastOptions } = options || {};
|
|
32
|
-
const hast = typeof htmlOrHast === "string" ? (0,
|
|
33
|
+
const hast = typeof htmlOrHast === "string" ? (0, import_parse_html.parseHtml)(htmlOrHast, { fragment: true }) : htmlOrHast;
|
|
33
34
|
const isOwned = typeof htmlOrHast === "string";
|
|
34
35
|
const declaredLang = typeof htmlOrHast === "string" ? (0, import_hast_utils.getLangFromStr)(htmlOrHast) : void 0;
|
|
35
36
|
const metadata = (0, import_metadata.extractMetadata)(hast);
|
|
@@ -43,10 +44,54 @@ const htmlToMarkdownWithMetadata = (htmlOrHast, options) => {
|
|
|
43
44
|
url: toMdastOptions.url ?? metadata.canonicalUrl
|
|
44
45
|
});
|
|
45
46
|
const body = (0, import_mdast_to_markdown.mdastToMarkdown)(mdast, { baseUrl, ...toMarkdownOptions });
|
|
46
|
-
const
|
|
47
|
+
const pageUrl = toMdastOptions.url ?? metadata.canonicalUrl;
|
|
48
|
+
const titled = title === false ? body : withTitle(body, headingTitle(metadata.title, metadata.siteName, pageUrl));
|
|
47
49
|
const markdown = frontmatter ? `${(0, import_metadata.toFrontmatter)(metadata)}${titled}` : titled;
|
|
48
50
|
return { markdown, metadata };
|
|
49
51
|
};
|
|
52
|
+
const TITLE_SEPARATOR = /\s+[-|–—·•:]\s+|\s*[||]\s*/;
|
|
53
|
+
const SITE_SECTION = /^(docs|documentation|blog|news|wiki|developers?|devblog|help|support|reference)$/;
|
|
54
|
+
const compact = (value) => value.toLowerCase().replace(/[^\p{L}\p{N}]/gu, "");
|
|
55
|
+
const siteNames = (siteName, url) => {
|
|
56
|
+
const names = siteName ? siteName.split(TITLE_SEPARATOR).map(compact) : [];
|
|
57
|
+
try {
|
|
58
|
+
const labels = url ? new URL(url).hostname.split(".") : [];
|
|
59
|
+
const meaningful = labels.slice(0, -1).filter((label) => label !== "www");
|
|
60
|
+
names.push(...meaningful.map(compact), compact(meaningful.join("")), compact(labels.join("").replace(/^www/, "")));
|
|
61
|
+
} catch {
|
|
62
|
+
}
|
|
63
|
+
return names.filter((name) => name.length >= 3);
|
|
64
|
+
};
|
|
65
|
+
const headingTitle = (title, siteName, url) => {
|
|
66
|
+
if (!title) {
|
|
67
|
+
return title;
|
|
68
|
+
}
|
|
69
|
+
const segments = title.split(TITLE_SEPARATOR);
|
|
70
|
+
if (segments.length < 2) {
|
|
71
|
+
return title;
|
|
72
|
+
}
|
|
73
|
+
const names = siteNames(siteName, url);
|
|
74
|
+
if (names.length === 0) {
|
|
75
|
+
return title;
|
|
76
|
+
}
|
|
77
|
+
const isSite = (segment) => {
|
|
78
|
+
const value = compact(segment);
|
|
79
|
+
return value.length > 0 && names.some((name) => value === name || value.startsWith(name) && SITE_SECTION.test(value.slice(name.length)));
|
|
80
|
+
};
|
|
81
|
+
const last = segments[segments.length - 1];
|
|
82
|
+
if (isSite(last)) {
|
|
83
|
+
return stripSegment(title, last, "end");
|
|
84
|
+
}
|
|
85
|
+
if (siteName && compact(segments[0]) === compact(siteName)) {
|
|
86
|
+
return stripSegment(title, segments[0], "start");
|
|
87
|
+
}
|
|
88
|
+
return title;
|
|
89
|
+
};
|
|
90
|
+
const stripSegment = (title, segment, edge) => {
|
|
91
|
+
const rest = edge === "end" ? title.slice(0, title.lastIndexOf(segment)) : title.slice(segment.length);
|
|
92
|
+
const trimmed = rest.replace(edge === "end" ? /[\s\-|–—·•:|]+$/ : /^[\s\-|–—·•:|]+/, "");
|
|
93
|
+
return trimmed.length > 0 ? trimmed : title;
|
|
94
|
+
};
|
|
50
95
|
const TITLE_LOOKAHEAD = 400;
|
|
51
96
|
const withTitle = (body, title) => {
|
|
52
97
|
if (!title) {
|
|
@@ -56,17 +101,26 @@ const withTitle = (body, title) => {
|
|
|
56
101
|
if (/^#\s+\S/m.test(opening)) {
|
|
57
102
|
return body;
|
|
58
103
|
}
|
|
59
|
-
if (
|
|
104
|
+
if (mentionsTitle(opening, title)) {
|
|
60
105
|
return body;
|
|
61
106
|
}
|
|
62
107
|
return `# ${title}
|
|
63
108
|
|
|
64
109
|
${body}`;
|
|
65
110
|
};
|
|
111
|
+
const MIN_EMBEDDED_TITLE_LENGTH = 24;
|
|
112
|
+
const mentionsTitle = (opening, title) => {
|
|
113
|
+
const wanted = normalizeForCompare(title);
|
|
114
|
+
if (wanted.length >= MIN_EMBEDDED_TITLE_LENGTH) {
|
|
115
|
+
return normalizeForCompare(opening).includes(wanted);
|
|
116
|
+
}
|
|
117
|
+
return opening.split("\n").some((line) => normalizeForCompare(line.replace(/[#*_`>]/g, "")) === wanted);
|
|
118
|
+
};
|
|
66
119
|
const normalizeForCompare = (value) => value.replace(/\s+/g, " ").trim().toLowerCase();
|
|
67
120
|
const htmlToMarkdown = (htmlOrHast, options) => htmlToMarkdownWithMetadata(htmlOrHast, options).markdown;
|
|
68
121
|
// Annotate the CommonJS export names for ESM import in node:
|
|
69
122
|
0 && (module.exports = {
|
|
123
|
+
headingTitle,
|
|
70
124
|
htmlToMarkdown,
|
|
71
125
|
htmlToMarkdownWithMetadata
|
|
72
126
|
});
|
|
@@ -21,8 +21,8 @@ __export(html_to_mdast_exports, {
|
|
|
21
21
|
htmlToMdast: () => htmlToMdast
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(html_to_mdast_exports);
|
|
24
|
-
var import_hast_util_from_html = require("hast-util-from-html");
|
|
25
24
|
var import_hast_util_to_mdast = require("hast-util-to-mdast");
|
|
25
|
+
var import_parse_html = require("./utils/parse-html");
|
|
26
26
|
var import_extract_mdast = require("./extract-mdast");
|
|
27
27
|
var import_extractors = require("./extractors");
|
|
28
28
|
var import_custom_a_handler = require("./mdast-handlers/custom-a-handler");
|
|
@@ -34,13 +34,14 @@ var import_definition_list_handler = require("./mdast-handlers/definition-list-h
|
|
|
34
34
|
var import_math_handler = require("./mdast-handlers/math-handler");
|
|
35
35
|
var import_sup_sub_handler = require("./mdast-handlers/sup-sub-handler");
|
|
36
36
|
var import_normalize = require("./normalize");
|
|
37
|
+
var import_hast_fast = require("./utils/hast-fast");
|
|
37
38
|
var import_hast_utils = require("./utils/hast-utils");
|
|
38
39
|
const htmlToMdast = (htmlOrHast, options) => {
|
|
39
40
|
const { extractors, url: defaultUrl, lang: defaultLang } = options || {};
|
|
40
|
-
const [lang, hast] = typeof htmlOrHast === "string" ? [defaultLang || (0, import_hast_utils.getLangFromStr)(htmlOrHast), (0,
|
|
41
|
+
const [lang, hast] = typeof htmlOrHast === "string" ? [defaultLang || (0, import_hast_utils.getLangFromStr)(htmlOrHast), (0, import_parse_html.parseHtml)(htmlOrHast, { fragment: true })] : [defaultLang || (0, import_hast_utils.getLangFromHast)(htmlOrHast), htmlOrHast];
|
|
41
42
|
const isOwned = typeof htmlOrHast === "string" || (options?.owned ?? false);
|
|
42
43
|
const url = defaultUrl || (0, import_hast_utils.getUrlFromHast)(hast);
|
|
43
|
-
const extractedHast = (0, import_extractors.pipeExtractors)({ hast, lang, url, owned:
|
|
44
|
+
const extractedHast = (0, import_extractors.pipeExtractors)({ hast: isOwned ? hast : (0, import_hast_fast.cloneHast)(hast), lang, url, owned: true }, extractors);
|
|
44
45
|
(0, import_normalize.normalizeHast)(extractedHast, options?.normalize);
|
|
45
46
|
const mdast = (0, import_hast_util_to_mdast.toMdast)(extractedHast, {
|
|
46
47
|
handlers: {
|
package/dist/cjs/index.js
CHANGED
|
@@ -19,15 +19,22 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var src_exports = {};
|
|
20
20
|
__export(src_exports, {
|
|
21
21
|
BUILTIN_ADAPTERS: () => import_adapters.BUILTIN_ADAPTERS,
|
|
22
|
+
MAX_META_REFRESH_DELAY_SECONDS: () => import_extract_meta_refresh.MAX_META_REFRESH_DELAY_SECONDS,
|
|
23
|
+
SHELL_EMPTY_THRESHOLD: () => import_detect_client_shell.SHELL_EMPTY_THRESHOLD,
|
|
24
|
+
SHELL_SUSPICION_THRESHOLD: () => import_detect_client_shell.SHELL_SUSPICION_THRESHOLD,
|
|
22
25
|
adapterById: () => import_adapters.adapterById,
|
|
23
26
|
autoExtractor: () => import_extractors.autoExtractor,
|
|
24
27
|
buildPageSignature: () => import_adapters.buildPageSignature,
|
|
25
28
|
createAutoExtractor: () => import_extractors.createAutoExtractor,
|
|
29
|
+
createKiwameExtractor: () => import_extractors.createKiwameExtractor,
|
|
26
30
|
defineSelectorAdapter: () => import_adapters.defineSelectorAdapter,
|
|
31
|
+
detectClientShell: () => import_detect_client_shell.detectClientShell,
|
|
32
|
+
extractMetaRefresh: () => import_extract_meta_refresh.extractMetaRefresh,
|
|
27
33
|
extractMetadata: () => import_metadata.extractMetadata,
|
|
28
34
|
htmlToMarkdown: () => import_html_to_markdown.htmlToMarkdown,
|
|
29
35
|
htmlToMarkdownWithMetadata: () => import_html_to_markdown.htmlToMarkdownWithMetadata,
|
|
30
36
|
htmlToMdast: () => import_html_to_mdast.htmlToMdast,
|
|
37
|
+
kiwameExtractor: () => import_extractors.kiwameExtractor,
|
|
31
38
|
mdastSplitter: () => import_md_splitter.mdastSplitter,
|
|
32
39
|
mdastToMarkdown: () => import_mdast_to_markdown.mdastToMarkdown,
|
|
33
40
|
minimalFilter: () => import_extractors.minimalFilter,
|
|
@@ -46,20 +53,29 @@ var import_html_to_mdast = require("./html-to-mdast");
|
|
|
46
53
|
var import_mdast_to_markdown = require("./mdast-to-markdown");
|
|
47
54
|
var import_extractors = require("./extractors");
|
|
48
55
|
var import_adapters = require("./adapters");
|
|
56
|
+
var import_detect_client_shell = require("./detect-client-shell");
|
|
57
|
+
var import_extract_meta_refresh = require("./extract-meta-refresh");
|
|
49
58
|
var import_metadata = require("./metadata");
|
|
50
59
|
var import_normalize = require("./normalize");
|
|
51
60
|
// Annotate the CommonJS export names for ESM import in node:
|
|
52
61
|
0 && (module.exports = {
|
|
53
62
|
BUILTIN_ADAPTERS,
|
|
63
|
+
MAX_META_REFRESH_DELAY_SECONDS,
|
|
64
|
+
SHELL_EMPTY_THRESHOLD,
|
|
65
|
+
SHELL_SUSPICION_THRESHOLD,
|
|
54
66
|
adapterById,
|
|
55
67
|
autoExtractor,
|
|
56
68
|
buildPageSignature,
|
|
57
69
|
createAutoExtractor,
|
|
70
|
+
createKiwameExtractor,
|
|
58
71
|
defineSelectorAdapter,
|
|
72
|
+
detectClientShell,
|
|
73
|
+
extractMetaRefresh,
|
|
59
74
|
extractMetadata,
|
|
60
75
|
htmlToMarkdown,
|
|
61
76
|
htmlToMarkdownWithMetadata,
|
|
62
77
|
htmlToMdast,
|
|
78
|
+
kiwameExtractor,
|
|
63
79
|
mdastSplitter,
|
|
64
80
|
mdastToMarkdown,
|
|
65
81
|
minimalFilter,
|
|
@@ -21,19 +21,25 @@ __export(link_replacer_exports, {
|
|
|
21
21
|
linkReplacer: () => linkReplacer
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(link_replacer_exports);
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
24
|
+
const absoluteUrl = (url, base) => {
|
|
25
|
+
if (/^(?:[a-z][a-z\d+.-]*:|#)/i.test(url)) {
|
|
26
|
+
return url;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
return new URL(url, base).href;
|
|
30
|
+
} catch {
|
|
31
|
+
return url;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const linkReplacer = (node, base) => {
|
|
35
|
+
let result = node;
|
|
36
|
+
if (node.type === "link" || node.type === "image" || node.type === "definition") {
|
|
37
|
+
result = { ...node, url: absoluteUrl(node.url, base) };
|
|
38
|
+
}
|
|
39
|
+
if ("children" in result) {
|
|
40
|
+
return { ...result, children: result.children.map((child) => linkReplacer(child, base)) };
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
37
43
|
};
|
|
38
44
|
// Annotate the CommonJS export names for ESM import in node:
|
|
39
45
|
0 && (module.exports = {
|
|
@@ -32,15 +32,22 @@ __export(cf_puppeteer_exports, {
|
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(cf_puppeteer_exports);
|
|
34
34
|
var import_puppeteer = __toESM(require("@cloudflare/puppeteer"), 1);
|
|
35
|
-
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
36
35
|
const loadHtml = async (url, ctx) => {
|
|
37
36
|
const browser = await import_puppeteer.default.launch(ctx);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
try {
|
|
38
|
+
const page = await browser.newPage();
|
|
39
|
+
await page.goto(url);
|
|
40
|
+
try {
|
|
41
|
+
await page.waitForNetworkIdle({ timeout: 1e4 });
|
|
42
|
+
} catch (error) {
|
|
43
|
+
if (!(error instanceof import_puppeteer.TimeoutError)) {
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return await page.content();
|
|
48
|
+
} finally {
|
|
49
|
+
await browser.close();
|
|
50
|
+
}
|
|
44
51
|
};
|
|
45
52
|
// Annotate the CommonJS export names for ESM import in node:
|
|
46
53
|
0 && (module.exports = {
|