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,87 @@
|
|
|
1
|
+
// src/utils/parse-html.ts
|
|
2
|
+
import { fromParse5 } from "hast-util-from-parse5";
|
|
3
|
+
import { parse, parseFragment } from "parse5";
|
|
4
|
+
var MAX_ELEMENT_DEPTH = 256;
|
|
5
|
+
var isParent = (node) => "childNodes" in node;
|
|
6
|
+
var LINE_ELEMENTS = /* @__PURE__ */ new Set([
|
|
7
|
+
"p",
|
|
8
|
+
"div",
|
|
9
|
+
"li",
|
|
10
|
+
"tr",
|
|
11
|
+
"td",
|
|
12
|
+
"th",
|
|
13
|
+
"h1",
|
|
14
|
+
"h2",
|
|
15
|
+
"h3",
|
|
16
|
+
"h4",
|
|
17
|
+
"h5",
|
|
18
|
+
"h6",
|
|
19
|
+
"br",
|
|
20
|
+
"section",
|
|
21
|
+
"article",
|
|
22
|
+
"pre",
|
|
23
|
+
"blockquote"
|
|
24
|
+
]);
|
|
25
|
+
var textNode = (value, parentNode) => ({ nodeName: "#text", value, parentNode });
|
|
26
|
+
var coalesceText = (parent) => {
|
|
27
|
+
const merged = [];
|
|
28
|
+
for (const child of parent.childNodes) {
|
|
29
|
+
const previous = merged.at(-1);
|
|
30
|
+
if (child.nodeName === "#text" && previous?.nodeName === "#text") {
|
|
31
|
+
previous.value += child.value;
|
|
32
|
+
} else {
|
|
33
|
+
merged.push(child);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
parent.childNodes = merged;
|
|
37
|
+
};
|
|
38
|
+
var flattenDeep = (root, maxDepth) => {
|
|
39
|
+
const stack = [[root, 0]];
|
|
40
|
+
while (stack.length > 0) {
|
|
41
|
+
const [parent, depth] = stack.pop();
|
|
42
|
+
const children = parent.childNodes;
|
|
43
|
+
let unwrapped = false;
|
|
44
|
+
for (let index = 0; index < children.length; index++) {
|
|
45
|
+
const child = children[index];
|
|
46
|
+
if (!isParent(child)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (depth + 1 > maxDepth && "tagName" in child) {
|
|
50
|
+
const replacement = [...child.childNodes];
|
|
51
|
+
if (LINE_ELEMENTS.has(child.tagName)) {
|
|
52
|
+
replacement.unshift(textNode("\n", parent));
|
|
53
|
+
replacement.push(textNode("\n", parent));
|
|
54
|
+
}
|
|
55
|
+
for (const node of replacement) {
|
|
56
|
+
node.parentNode = parent;
|
|
57
|
+
}
|
|
58
|
+
children.splice(index, 1, ...replacement);
|
|
59
|
+
index -= 1;
|
|
60
|
+
unwrapped = true;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
stack.push([child, depth + 1]);
|
|
64
|
+
}
|
|
65
|
+
if (unwrapped) {
|
|
66
|
+
coalesceText(parent);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
var SCRIPT_OR_STYLE = /<(script|style)\b([^>]*)>[\s\S]*?<\/\1\s*>/gi;
|
|
71
|
+
var LARGE_DOCUMENT_CHARS = 2e6;
|
|
72
|
+
var stripScriptBodies = (html) => html.replace(
|
|
73
|
+
SCRIPT_OR_STYLE,
|
|
74
|
+
(match, tag, attributes) => /application\/ld\+json/i.test(attributes) ? match : `<${tag}${attributes}></${tag}>`
|
|
75
|
+
);
|
|
76
|
+
var parseHtml = (html, options = {}) => {
|
|
77
|
+
const source = html.length > LARGE_DOCUMENT_CHARS ? stripScriptBodies(html) : html;
|
|
78
|
+
const document = options.fragment ? parseFragment(source, { scriptingEnabled: false }) : parse(source, { scriptingEnabled: false });
|
|
79
|
+
flattenDeep(document, MAX_ELEMENT_DEPTH);
|
|
80
|
+
return fromParse5(document);
|
|
81
|
+
};
|
|
82
|
+
export {
|
|
83
|
+
LARGE_DOCUMENT_CHARS,
|
|
84
|
+
MAX_ELEMENT_DEPTH,
|
|
85
|
+
parseHtml,
|
|
86
|
+
stripScriptBodies
|
|
87
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// src/utils/pre-text.ts
|
|
2
|
+
var LINE_BLOCK_TAGS = /* @__PURE__ */ new Set([
|
|
3
|
+
"address",
|
|
4
|
+
"article",
|
|
5
|
+
"aside",
|
|
6
|
+
"blockquote",
|
|
7
|
+
"dd",
|
|
8
|
+
"div",
|
|
9
|
+
"dl",
|
|
10
|
+
"dt",
|
|
11
|
+
"figcaption",
|
|
12
|
+
"figure",
|
|
13
|
+
"footer",
|
|
14
|
+
"form",
|
|
15
|
+
"h1",
|
|
16
|
+
"h2",
|
|
17
|
+
"h3",
|
|
18
|
+
"h4",
|
|
19
|
+
"h5",
|
|
20
|
+
"h6",
|
|
21
|
+
"header",
|
|
22
|
+
"hr",
|
|
23
|
+
"li",
|
|
24
|
+
"main",
|
|
25
|
+
"nav",
|
|
26
|
+
"ol",
|
|
27
|
+
"p",
|
|
28
|
+
"pre",
|
|
29
|
+
"section",
|
|
30
|
+
"table",
|
|
31
|
+
"tr",
|
|
32
|
+
"ul"
|
|
33
|
+
]);
|
|
34
|
+
var INLINE_CONTEXT_TAGS = /* @__PURE__ */ new Set(["span", "a", "b", "i", "em", "strong", "mark", "small", "u", "s", "label"]);
|
|
35
|
+
var preText = (node) => {
|
|
36
|
+
let out = "";
|
|
37
|
+
const ensureLineStart = () => {
|
|
38
|
+
if (out.length > 0 && out.charCodeAt(out.length - 1) !== 10) {
|
|
39
|
+
out += "\n";
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const visitChildren = (parent, inline) => {
|
|
43
|
+
let cells = 0;
|
|
44
|
+
for (const child of parent.children) {
|
|
45
|
+
const isCell = child.type === "element" && (child.tagName === "td" || child.tagName === "th");
|
|
46
|
+
visit(child, isCell ? cells++ : 0, inline);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const visitElement = (element, cellIndex, inline) => {
|
|
50
|
+
const tag = element.tagName;
|
|
51
|
+
if (tag === "br") {
|
|
52
|
+
out += "\n";
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (cellIndex > 0) {
|
|
56
|
+
out += " ";
|
|
57
|
+
}
|
|
58
|
+
const block = !inline && LINE_BLOCK_TAGS.has(tag);
|
|
59
|
+
if (block) {
|
|
60
|
+
ensureLineStart();
|
|
61
|
+
}
|
|
62
|
+
visitChildren(element, inline || INLINE_CONTEXT_TAGS.has(tag));
|
|
63
|
+
if (block) {
|
|
64
|
+
ensureLineStart();
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const visit = (current, cellIndex, inline) => {
|
|
68
|
+
if (current.type === "text") {
|
|
69
|
+
out += current.value;
|
|
70
|
+
} else if (current.type === "element") {
|
|
71
|
+
visitElement(current, cellIndex, inline);
|
|
72
|
+
} else if (current.type === "root") {
|
|
73
|
+
visitChildren(current, inline);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
visit(node, 0, false);
|
|
77
|
+
return out;
|
|
78
|
+
};
|
|
79
|
+
export {
|
|
80
|
+
preText
|
|
81
|
+
};
|
package/package.json
CHANGED
|
@@ -1,23 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webforai",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "4.1.0",
|
|
4
|
+
"description": "Convert web pages and local HTML to clean, LLM-ready Markdown: library, CLI (npx webforai) and hosted-API client.",
|
|
5
5
|
"author": "inaridiy",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"keywords": [
|
|
8
|
-
"
|
|
8
|
+
"html-to-markdown",
|
|
9
|
+
"markdown",
|
|
10
|
+
"llm",
|
|
9
11
|
"ai",
|
|
12
|
+
"scraper",
|
|
13
|
+
"crawler",
|
|
14
|
+
"readability",
|
|
15
|
+
"web-scraping",
|
|
16
|
+
"cli",
|
|
17
|
+
"rag",
|
|
10
18
|
"html",
|
|
11
19
|
"html2md",
|
|
12
|
-
"markdown",
|
|
13
20
|
"mdast",
|
|
14
21
|
"hast"
|
|
15
22
|
],
|
|
16
23
|
"repository": {
|
|
17
24
|
"type": "git",
|
|
18
|
-
"url": "https://github.com/inaridiy/webforai.git"
|
|
25
|
+
"url": "https://github.com/inaridiy/webforai.git",
|
|
26
|
+
"directory": "packages/webforai"
|
|
19
27
|
},
|
|
20
28
|
"homepage": "https://webforai.dev/",
|
|
29
|
+
"bugs": {
|
|
30
|
+
"url": "https://github.com/inaridiy/webforai/issues"
|
|
31
|
+
},
|
|
21
32
|
"files": [
|
|
22
33
|
"dist",
|
|
23
34
|
"!dist/types/**/*.js"
|
|
@@ -107,6 +118,7 @@
|
|
|
107
118
|
"boxen": "^8.0.1",
|
|
108
119
|
"commander": "^12.1.0",
|
|
109
120
|
"hast-util-from-html": "^2.0.3",
|
|
121
|
+
"hast-util-from-parse5": "^8.0.1",
|
|
110
122
|
"hast-util-select": "^6.0.2",
|
|
111
123
|
"hast-util-to-html": "^9.0.3",
|
|
112
124
|
"hast-util-to-mdast": "^10.1.0",
|
|
@@ -116,6 +128,7 @@
|
|
|
116
128
|
"mdast-util-gfm": "^3.0.0",
|
|
117
129
|
"mdast-util-math": "^3.0.0",
|
|
118
130
|
"mdast-util-to-markdown": "^2.1.0",
|
|
131
|
+
"parse5": "^7.1.2",
|
|
119
132
|
"picocolors": "^1.0.1",
|
|
120
133
|
"trim-trailing-lines": "^2.1.0",
|
|
121
134
|
"unist-util-filter": "^5.0.1"
|