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.
Files changed (181) hide show
  1. package/README.md +47 -5
  2. package/dist/bin.js +3109 -490
  3. package/dist/cjs/detect-client-shell.js +78 -0
  4. package/dist/cjs/extract-mdast.js +58 -0
  5. package/dist/cjs/extract-meta-refresh.js +71 -0
  6. package/dist/cjs/extractors/index.js +5 -0
  7. package/dist/cjs/extractors/lib/block-features.js +465 -0
  8. package/dist/cjs/extractors/lib/block-model.generated.js +45 -0
  9. package/dist/cjs/extractors/lib/block-model.js +72 -0
  10. package/dist/cjs/extractors/lib/blocks.js +212 -0
  11. package/dist/cjs/extractors/lib/code-tabs.js +191 -0
  12. package/dist/cjs/extractors/lib/constants.js +1 -1
  13. package/dist/cjs/extractors/lib/layout-tables.js +123 -0
  14. package/dist/cjs/extractors/lib/sanitize.js +146 -26
  15. package/dist/cjs/extractors/lib/takumi-signal.js +76 -0
  16. package/dist/cjs/extractors/lib/ui-chrome.js +7 -0
  17. package/dist/cjs/extractors/presets/auto.js +3 -3
  18. package/dist/cjs/extractors/presets/kiwame.js +231 -0
  19. package/dist/cjs/extractors/presets/takumi.js +34 -3
  20. package/dist/cjs/html-to-markdown.js +58 -4
  21. package/dist/cjs/html-to-mdast.js +4 -3
  22. package/dist/cjs/index.js +16 -0
  23. package/dist/cjs/link-replacer.js +19 -13
  24. package/dist/cjs/loaders/cf-puppeteer.js +14 -7
  25. package/dist/cjs/loaders/fetch.js +14 -2
  26. package/dist/cjs/loaders/playwright.js +32 -30
  27. package/dist/cjs/loaders/puppeteer.js +14 -7
  28. package/dist/cjs/md-splitter.js +24 -11
  29. package/dist/cjs/mdast-handlers/custom-code-handler.js +32 -9
  30. package/dist/cjs/mdast-handlers/custom-div-handler.js +14 -35
  31. package/dist/cjs/mdast-handlers/custom-img-handler.js +10 -1
  32. package/dist/cjs/mdast-handlers/custom-table-handler.js +18 -1
  33. package/dist/cjs/mdast-handlers/definition-list-handler.js +17 -6
  34. package/dist/cjs/mdast-handlers/table-cell-flatten.js +195 -0
  35. package/dist/cjs/mdast-handlers/twoslash.js +71 -0
  36. package/dist/cjs/mdast-to-markdown.js +2 -5
  37. package/dist/cjs/metadata/index.js +4 -3
  38. package/dist/cjs/normalize/index.js +11 -2
  39. package/dist/cjs/platform/client.js +73 -16
  40. package/dist/cjs/platform/index.js +4 -0
  41. package/dist/cjs/platform/types.js +7 -1
  42. package/dist/cjs/utils/hast-fast.js +1 -1
  43. package/dist/cjs/utils/parse-html.js +113 -0
  44. package/dist/cjs/utils/pre-text.js +104 -0
  45. package/dist/detect-client-shell.js +53 -0
  46. package/dist/extract-mdast.js +58 -0
  47. package/dist/extract-meta-refresh.js +47 -0
  48. package/dist/extractors/index.js +3 -0
  49. package/dist/extractors/lib/block-features.js +437 -0
  50. package/dist/extractors/lib/block-model.generated.js +21 -0
  51. package/dist/extractors/lib/block-model.js +48 -0
  52. package/dist/extractors/lib/blocks.js +185 -0
  53. package/dist/extractors/lib/code-tabs.js +168 -0
  54. package/dist/extractors/lib/constants.js +1 -1
  55. package/dist/extractors/lib/layout-tables.js +99 -0
  56. package/dist/extractors/lib/sanitize.js +144 -26
  57. package/dist/extractors/lib/takumi-signal.js +53 -0
  58. package/dist/extractors/lib/ui-chrome.js +5 -0
  59. package/dist/extractors/presets/auto.js +3 -3
  60. package/dist/extractors/presets/kiwame.js +206 -0
  61. package/dist/extractors/presets/takumi.js +34 -3
  62. package/dist/html-to-markdown.js +57 -4
  63. package/dist/html-to-mdast.js +4 -3
  64. package/dist/index.js +18 -0
  65. package/dist/link-replacer.js +19 -13
  66. package/dist/loaders/cf-puppeteer.js +15 -8
  67. package/dist/loaders/fetch.js +14 -2
  68. package/dist/loaders/playwright.js +32 -30
  69. package/dist/loaders/puppeteer.js +15 -8
  70. package/dist/md-splitter.js +24 -11
  71. package/dist/mdast-handlers/custom-code-handler.js +30 -9
  72. package/dist/mdast-handlers/custom-div-handler.js +14 -35
  73. package/dist/mdast-handlers/custom-img-handler.js +10 -1
  74. package/dist/mdast-handlers/custom-table-handler.js +19 -2
  75. package/dist/mdast-handlers/definition-list-handler.js +17 -6
  76. package/dist/mdast-handlers/table-cell-flatten.js +170 -0
  77. package/dist/mdast-handlers/twoslash.js +48 -0
  78. package/dist/mdast-to-markdown.js +2 -5
  79. package/dist/metadata/index.js +4 -3
  80. package/dist/normalize/index.js +12 -2
  81. package/dist/platform/client.js +73 -16
  82. package/dist/platform/index.js +4 -0
  83. package/dist/platform/types.js +5 -1
  84. package/dist/types/cli/bin.js.map +1 -1
  85. package/dist/types/cli/commands/jobs/files.d.ts +28 -0
  86. package/dist/types/cli/commands/jobs/files.js.map +1 -0
  87. package/dist/types/cli/commands/jobs/llms-txt.d.ts +33 -0
  88. package/dist/types/cli/commands/jobs/llms-txt.js.map +1 -0
  89. package/dist/types/cli/commands/jobs/options.d.ts +58 -0
  90. package/dist/types/cli/commands/jobs/options.js.map +1 -0
  91. package/dist/types/cli/commands/jobs/run.d.ts +44 -0
  92. package/dist/types/cli/commands/jobs/run.js.map +1 -0
  93. package/dist/types/cli/commands/skill/content.js.map +1 -1
  94. package/dist/types/cli/commands/webforai/interactive.d.ts +1 -1
  95. package/dist/types/cli/commands/webforai/interactive.js.map +1 -1
  96. package/dist/types/cli/commands/webforai/options.d.ts +9 -2
  97. package/dist/types/cli/commands/webforai/options.js.map +1 -1
  98. package/dist/types/cli/commands/webforai/run.js.map +1 -1
  99. package/dist/types/cli/constants.d.ts +3 -1
  100. package/dist/types/cli/constants.js.map +1 -1
  101. package/dist/types/cli/utils.d.ts +8 -1
  102. package/dist/types/cli/utils.js.map +1 -1
  103. package/dist/types/detect-client-shell.d.ts +24 -0
  104. package/dist/types/detect-client-shell.js.map +1 -0
  105. package/dist/types/extract-mdast.js.map +1 -1
  106. package/dist/types/extract-meta-refresh.d.ts +29 -0
  107. package/dist/types/extract-meta-refresh.js.map +1 -0
  108. package/dist/types/extractors/index.d.ts +1 -0
  109. package/dist/types/extractors/index.js.map +1 -1
  110. package/dist/types/extractors/lib/block-features.d.ts +43 -0
  111. package/dist/types/extractors/lib/block-features.js.map +1 -0
  112. package/dist/types/extractors/lib/block-model.d.ts +28 -0
  113. package/dist/types/extractors/lib/block-model.generated.d.ts +5 -0
  114. package/dist/types/extractors/lib/block-model.generated.js.map +1 -0
  115. package/dist/types/extractors/lib/block-model.js.map +1 -0
  116. package/dist/types/extractors/lib/blocks.d.ts +53 -0
  117. package/dist/types/extractors/lib/blocks.js.map +1 -0
  118. package/dist/types/extractors/lib/code-tabs.d.ts +30 -0
  119. package/dist/types/extractors/lib/code-tabs.js.map +1 -0
  120. package/dist/types/extractors/lib/constants.js.map +1 -1
  121. package/dist/types/extractors/lib/layout-tables.d.ts +17 -0
  122. package/dist/types/extractors/lib/layout-tables.js.map +1 -0
  123. package/dist/types/extractors/lib/sanitize.d.ts +33 -3
  124. package/dist/types/extractors/lib/sanitize.js.map +1 -1
  125. package/dist/types/extractors/lib/takumi-signal.d.ts +12 -0
  126. package/dist/types/extractors/lib/takumi-signal.js.map +1 -0
  127. package/dist/types/extractors/lib/ui-chrome.d.ts +8 -0
  128. package/dist/types/extractors/lib/ui-chrome.js.map +1 -1
  129. package/dist/types/extractors/presets/auto.d.ts +6 -1
  130. package/dist/types/extractors/presets/auto.js.map +1 -1
  131. package/dist/types/extractors/presets/kiwame.d.ts +31 -0
  132. package/dist/types/extractors/presets/kiwame.js.map +1 -0
  133. package/dist/types/extractors/presets/takumi.js.map +1 -1
  134. package/dist/types/html-to-markdown.d.ts +9 -0
  135. package/dist/types/html-to-markdown.js.map +1 -1
  136. package/dist/types/html-to-mdast.js.map +1 -1
  137. package/dist/types/index.d.ts +3 -1
  138. package/dist/types/index.js.map +1 -1
  139. package/dist/types/link-replacer.d.ts +3 -1
  140. package/dist/types/link-replacer.js.map +1 -1
  141. package/dist/types/loaders/cf-puppeteer.js.map +1 -1
  142. package/dist/types/loaders/fetch.d.ts +4 -0
  143. package/dist/types/loaders/fetch.js.map +1 -1
  144. package/dist/types/loaders/playwright.js.map +1 -1
  145. package/dist/types/loaders/puppeteer.js.map +1 -1
  146. package/dist/types/md-splitter.d.ts +1 -1
  147. package/dist/types/md-splitter.js.map +1 -1
  148. package/dist/types/mdast-handlers/custom-code-handler.d.ts +9 -0
  149. package/dist/types/mdast-handlers/custom-code-handler.js.map +1 -1
  150. package/dist/types/mdast-handlers/custom-div-handler.js.map +1 -1
  151. package/dist/types/mdast-handlers/custom-img-handler.js.map +1 -1
  152. package/dist/types/mdast-handlers/custom-table-handler.js.map +1 -1
  153. package/dist/types/mdast-handlers/definition-list-handler.d.ts +0 -11
  154. package/dist/types/mdast-handlers/definition-list-handler.js.map +1 -1
  155. package/dist/types/mdast-handlers/table-cell-flatten.d.ts +18 -0
  156. package/dist/types/mdast-handlers/table-cell-flatten.js.map +1 -0
  157. package/dist/types/mdast-handlers/twoslash.d.ts +14 -0
  158. package/dist/types/mdast-handlers/twoslash.js.map +1 -0
  159. package/dist/types/mdast-to-markdown.js.map +1 -1
  160. package/dist/types/metadata/index.js.map +1 -1
  161. package/dist/types/normalize/index.js.map +1 -1
  162. package/dist/types/platform/client.d.ts +2 -1
  163. package/dist/types/platform/client.js.map +1 -1
  164. package/dist/types/platform/error.d.ts +5 -3
  165. package/dist/types/platform/error.js.map +1 -1
  166. package/dist/types/platform/fetch.d.ts +2 -0
  167. package/dist/types/platform/fetch.js.map +1 -1
  168. package/dist/types/platform/index.d.ts +1 -1
  169. package/dist/types/platform/index.js.map +1 -1
  170. package/dist/types/platform/types.d.ts +35 -6
  171. package/dist/types/platform/types.js.map +1 -1
  172. package/dist/types/utils/hast-fast.d.ts +1 -1
  173. package/dist/types/utils/hast-fast.js.map +1 -1
  174. package/dist/types/utils/parse-html.d.ts +33 -0
  175. package/dist/types/utils/parse-html.js.map +1 -0
  176. package/dist/types/utils/pre-text.d.ts +12 -0
  177. package/dist/types/utils/pre-text.js.map +1 -0
  178. package/dist/utils/hast-fast.js +1 -1
  179. package/dist/utils/parse-html.js +87 -0
  180. package/dist/utils/pre-text.js +81 -0
  181. 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": "3.0.0",
4
- "description": "A library that provides a web interface for AI",
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
- "web",
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"