webforai 1.3.1 → 1.3.3

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 (36) hide show
  1. package/dist/cjs/extract-hast/readability.js +23 -13
  2. package/dist/cjs/extract-hast/utils.js +1 -1
  3. package/dist/cjs/extract-mdast.js +47 -0
  4. package/dist/cjs/html-to-markdown.test.js +121 -1
  5. package/dist/cjs/html-to-mdast.js +3 -1
  6. package/dist/cjs/link-replacer.test.js +47 -0
  7. package/dist/cjs/loaders/fetch.js +34 -0
  8. package/dist/cjs/loaders/fetch.test.js +9 -0
  9. package/dist/cjs/loaders/playwright.js +4 -13
  10. package/dist/cjs/loaders/playwright.test.js +17 -0
  11. package/dist/cjs/mdast-handlers/custom-a-handler.js +5 -1
  12. package/dist/cjs/mdast-to-markdown.js +2 -1
  13. package/dist/extract-hast/readability.js +23 -13
  14. package/dist/extract-hast/utils.js +1 -1
  15. package/dist/extract-mdast.js +24 -0
  16. package/dist/html-to-markdown.test.js +99 -1
  17. package/dist/html-to-mdast.js +3 -1
  18. package/dist/link-replacer.test.js +47 -0
  19. package/dist/loaders/fetch.js +10 -0
  20. package/dist/loaders/fetch.test.js +9 -0
  21. package/dist/loaders/playwright.js +4 -13
  22. package/dist/loaders/playwright.test.js +17 -0
  23. package/dist/mdast-handlers/custom-a-handler.js +5 -1
  24. package/dist/mdast-to-markdown.js +2 -1
  25. package/dist/types/extract-hast/readability.js.map +1 -1
  26. package/dist/types/extract-hast/utils.js.map +1 -1
  27. package/dist/types/extract-mdast.d.ts +2 -0
  28. package/dist/types/extract-mdast.js.map +1 -0
  29. package/dist/types/html-to-mdast.js.map +1 -1
  30. package/dist/types/loaders/fetch.d.ts +9 -0
  31. package/dist/types/loaders/fetch.js.map +1 -0
  32. package/dist/types/loaders/playwright.d.ts +16 -2
  33. package/dist/types/loaders/playwright.js.map +1 -1
  34. package/dist/types/mdast-handlers/custom-a-handler.js.map +1 -1
  35. package/dist/types/mdast-to-markdown.js.map +1 -1
  36. package/package.json +6 -1
@@ -30,6 +30,7 @@ const UNLIKELY_ROLES = ["menu", "menubar", "complementary", "navigation", "alert
30
30
  const REGEXPS = {
31
31
  hidden: /hidden|invisible|fallback-image/i,
32
32
  byline: /byline|author|dateline|writtenby|p-author/i,
33
+ specialUnlikelyCandidates: /frb-|uls-menu|language-link/i,
33
34
  unlikelyCandidates: /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote|speechify-ignore/i,
34
35
  okMaybeItsaCandidate: /and|article|body|column|content|main|shadow|code/i
35
36
  };
@@ -89,18 +90,31 @@ const unlikelyElementFilter = (node) => {
89
90
  return true;
90
91
  }
91
92
  const element = node;
92
- const match = (0, import_utils.matchString)(element);
93
93
  if (["body", "article", "main", "section", "a"].includes(element.tagName)) {
94
94
  return true;
95
95
  }
96
96
  if ((0, import_utils.hasAncestors)(element, ["table", "code"], 3)) {
97
97
  return true;
98
98
  }
99
+ const match = (0, import_utils.matchString)(element);
100
+ if (REGEXPS.specialUnlikelyCandidates.test(match)) {
101
+ return false;
102
+ }
99
103
  if (REGEXPS.unlikelyCandidates.test(match) && !REGEXPS.okMaybeItsaCandidate.test(match)) {
100
104
  return false;
101
105
  }
102
106
  return true;
103
107
  };
108
+ const isImageLink = (element) => {
109
+ const a = (0, import_hast_util_select.select)("a", element);
110
+ const img = (0, import_hast_util_select.select)("img", a);
111
+ if (!(a && img)) {
112
+ return false;
113
+ }
114
+ const imgFilename = img.properties.src?.toString().split("/").pop();
115
+ const hrefFilename = a.properties.href?.toString().split("/").pop();
116
+ return imgFilename === hrefFilename && imgFilename;
117
+ };
104
118
  const removeEmptyFilter = (node) => {
105
119
  if (node.type !== "element") {
106
120
  return true;
@@ -109,6 +123,9 @@ const removeEmptyFilter = (node) => {
109
123
  if (!PARAGRAPH_TAGS.includes(element.tagName)) {
110
124
  return true;
111
125
  }
126
+ if (isImageLink(element)) {
127
+ return true;
128
+ }
112
129
  const text = (0, import_hast_util_to_string.toString)(element);
113
130
  if (text.length < 10) {
114
131
  return false;
@@ -119,7 +136,7 @@ const readabilityExtractHast = (hast) => {
119
136
  const lang = String((0, import_hast_util_select.select)("html", hast)?.properties.lang || tryGetLang(hast) || "en");
120
137
  const body = (0, import_hast_util_select.select)("body", hast) ?? hast;
121
138
  const proxiedHast = (0, import_unist_util_parents.parents)(body);
122
- let baseFilterd = (0, import_unist_util_filter.filter)(proxiedHast, (node) => {
139
+ const baseFilterd = (0, import_unist_util_filter.filter)(proxiedHast, (node) => {
123
140
  if (!metadataFilter(node)) {
124
141
  return false;
125
142
  }
@@ -133,17 +150,7 @@ const readabilityExtractHast = (hast) => {
133
150
  }
134
151
  const baseText = (0, import_hast_util_to_string.toString)(baseFilterd);
135
152
  let minimalLength = lang in BASE_MINIMAL_LENGTH ? BASE_MINIMAL_LENGTH[lang] : 500;
136
- if (baseText.length > minimalLength) {
137
- const filterd = (0, import_unist_util_filter.filter)(baseFilterd, (node) => {
138
- if (!unlikelyElementFilter(node)) {
139
- return false;
140
- }
141
- return true;
142
- });
143
- if (filterd) {
144
- baseFilterd = filterd;
145
- }
146
- } else {
153
+ if (baseText.length < minimalLength) {
147
154
  minimalLength = Math.max(0, baseText.length - 200);
148
155
  }
149
156
  let bodyTree = baseFilterd;
@@ -168,6 +175,9 @@ const readabilityExtractHast = (hast) => {
168
175
  if (!removeEmptyFilter(node)) {
169
176
  return false;
170
177
  }
178
+ if (!unlikelyElementFilter(node)) {
179
+ return false;
180
+ }
171
181
  return true;
172
182
  });
173
183
  return finalTree;
@@ -24,7 +24,7 @@ __export(utils_exports, {
24
24
  matchString: () => matchString
25
25
  });
26
26
  module.exports = __toCommonJS(utils_exports);
27
- const matchString = (element) => `${element.tagName} ${element.properties.id} ${classnames(element).join(" ")} }`;
27
+ const matchString = (element) => `${element.tagName} ${element.properties.id} ${classnames(element).join(" ")}`;
28
28
  const classnames = (element) => {
29
29
  if (Array.isArray(element.properties.className)) {
30
30
  return element.properties.className;
@@ -0,0 +1,47 @@
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 extract_mdast_exports = {};
20
+ __export(extract_mdast_exports, {
21
+ extractMdast: () => extractMdast
22
+ });
23
+ module.exports = __toCommonJS(extract_mdast_exports);
24
+ var import_unist_util_filter = require("unist-util-filter");
25
+ const DECLATION_TYPES = ["blockquote", "strong", "emphasis", "delete"];
26
+ const emptyDeclarationFilter = (node) => {
27
+ if (!DECLATION_TYPES.includes(node.type)) {
28
+ return true;
29
+ }
30
+ if (node.children.length === 0) {
31
+ return false;
32
+ }
33
+ return true;
34
+ };
35
+ const extractMdast = (node) => {
36
+ const extracted = (0, import_unist_util_filter.filter)(node, (node2) => {
37
+ if (!emptyDeclarationFilter(node2)) {
38
+ return false;
39
+ }
40
+ return true;
41
+ });
42
+ return extracted;
43
+ };
44
+ // Annotate the CommonJS export names for ESM import in node:
45
+ 0 && (module.exports = {
46
+ extractMdast
47
+ });
@@ -1,10 +1,35 @@
1
1
  "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
2
24
  var import_fastest_levenshtein = require("fastest-levenshtein");
3
25
  var import_vitest = require("vitest");
4
26
  var import_html_to_markdown = require("./html-to-markdown");
27
+ var import_fetch = require("./loaders/fetch");
5
28
  const html = `
6
29
  <h1>Hello, world!</h1>
7
30
  <p>This is a paragraph.</p>
31
+ <a href="/example.html">Example</a>
32
+ <img src="/example.jpg" alt="Example" />
8
33
  <ul>
9
34
  <li>Item 1</li>
10
35
  <li>Item 2</li>
@@ -14,13 +39,108 @@ const expected = `# Hello, world!
14
39
 
15
40
  This is a paragraph.
16
41
 
42
+ [Example](/example.html)
43
+
44
+ ![Example](/example.jpg)
45
+
17
46
  * Item 1
18
47
  * Item 2
19
48
  `;
49
+ const baseUrlReplaced = `# Hello, world!
50
+
51
+ This is a paragraph.
52
+
53
+ [Example](https://example.com/example.html)
54
+
55
+ ![Example](https://example.com/example.jpg)
56
+
57
+ * Item 1
58
+ * Item 2
59
+ `;
60
+ const linkAsText = `# Hello, world!
61
+
62
+ This is a paragraph.
63
+
64
+ Example
65
+
66
+ ![Example](/example.jpg)
67
+
68
+ - Item 1
69
+ - Item 2
70
+ `;
71
+ const imageHidden = `# Hello, world!
72
+
73
+ This is a paragraph.
74
+
75
+ [Example](/example.html)
76
+
77
+ - Item 1
78
+ - Item 2
79
+ `;
80
+ const htmlTable = `
81
+ <table>
82
+ <tr>
83
+ <th>Header 1</th>
84
+ <th>Header 2</th>
85
+ </tr>
86
+ <tr>
87
+ <td>Cell 1</td>
88
+ <td>Cell 2</td>
89
+ </tr>
90
+ </table>
91
+ `;
92
+ const expectedTableMarkdown = `
93
+ | Header 1 | Header 2 |
94
+ | -------- | -------- |
95
+ | Cell 1 | Cell 2 |
96
+ `;
97
+ const expectedTableText = `Header 1 Header 2
98
+ Cell 1 Cell 2`;
20
99
  (0, import_vitest.describe)("htmlToMarkdown", () => {
21
100
  (0, import_vitest.it)("should convert HTML to Markdown", () => {
22
101
  const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html, { extractors: false });
23
102
  const d = (0, import_fastest_levenshtein.distance)(markdown, expected);
24
- (0, import_vitest.expect)(d).lte(2);
103
+ (0, import_vitest.expect)(d).lte(5);
104
+ });
105
+ (0, import_vitest.it)("should convert HTML to Markdown with replaced base URL", () => {
106
+ const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html, { baseUrl: "https://example.com", extractors: false });
107
+ const d = (0, import_fastest_levenshtein.distance)(markdown, baseUrlReplaced);
108
+ (0, import_vitest.expect)(d).lte(5);
109
+ });
110
+ (0, import_vitest.it)("should convert HTML to Markdown with links as text", () => {
111
+ const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html, { linkAsText: true, extractors: false });
112
+ const d = (0, import_fastest_levenshtein.distance)(markdown, linkAsText);
113
+ (0, import_vitest.expect)(d).lte(5);
114
+ });
115
+ (0, import_vitest.it)("should convert HTML to Markdown with hidden images", () => {
116
+ const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html, { hideImage: true, extractors: false });
117
+ const d = (0, import_fastest_levenshtein.distance)(markdown, imageHidden);
118
+ (0, import_vitest.expect)(d).lte(5);
119
+ });
120
+ (0, import_vitest.it)("should convert HTML table to Markdown table", () => {
121
+ const markdown = (0, import_html_to_markdown.htmlToMarkdown)(htmlTable, { extractors: false });
122
+ const d = (0, import_fastest_levenshtein.distance)(markdown, expectedTableMarkdown);
123
+ (0, import_vitest.expect)(d).lte(5);
124
+ });
125
+ (0, import_vitest.it)("should convert HTML table with table as text option", () => {
126
+ const markdown = (0, import_html_to_markdown.htmlToMarkdown)(htmlTable, { tableAsText: true, extractors: false });
127
+ const d = (0, import_fastest_levenshtein.distance)(markdown, expectedTableText);
128
+ (0, import_vitest.expect)(d).lte(10);
129
+ });
130
+ });
131
+ (0, import_vitest.describe)("htmlToMarkdown E2E", () => {
132
+ (0, import_vitest.it)("should convert npm README to Markdown ", async () => {
133
+ const html2 = await (0, import_fetch.loadHtml)("https://www.npmjs.com/package/webforai");
134
+ const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html2, { baseUrl: "https://www.npmjs.com/package/webforai" });
135
+ const original = await import("../README.md?raw");
136
+ const d = (0, import_fastest_levenshtein.distance)(markdown, original.default);
137
+ (0, import_vitest.expect)(d).lte(400);
138
+ });
139
+ (0, import_vitest.it)("should convert GitHub README to Markdown ", async () => {
140
+ const html2 = await (0, import_fetch.loadHtml)("https://github.com/inaridiy/webforai");
141
+ const markdown = (0, import_html_to_markdown.htmlToMarkdown)(html2, { baseUrl: "https://www.npmjs.com/package/webforai" });
142
+ const original = await import("../../../README.md?raw");
143
+ const d = (0, import_fastest_levenshtein.distance)(markdown, original.default);
144
+ (0, import_vitest.expect)(d).lte(200);
25
145
  });
26
146
  });
@@ -24,6 +24,7 @@ module.exports = __toCommonJS(html_to_mdast_exports);
24
24
  var import_hast_util_from_html = require("hast-util-from-html");
25
25
  var import_hast_util_to_mdast = require("hast-util-to-mdast");
26
26
  var import_extract_hast = require("./extract-hast");
27
+ var import_extract_mdast = require("./extract-mdast");
27
28
  var import_custom_a_handler = require("./mdast-handlers/custom-a-handler");
28
29
  var import_custom_code_handler = require("./mdast-handlers/custom-code-handler");
29
30
  var import_custom_div_handler = require("./mdast-handlers/custom-div-handler");
@@ -46,7 +47,8 @@ const htmlToMdast = (htmlOrHast, options) => {
46
47
  br: import_empty_handler.emptyHandler
47
48
  }
48
49
  });
49
- return mdast;
50
+ const extractedMdast = (0, import_extract_mdast.extractMdast)(mdast);
51
+ return extractedMdast;
50
52
  };
51
53
  // Annotate the CommonJS export names for ESM import in node:
52
54
  0 && (module.exports = {
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_link_replacer = require("./link-replacer");
4
+ const markdown = `# Hello, world!
5
+
6
+ This is a paragraph.
7
+
8
+ [Example](/example.html)
9
+
10
+ ![Example](/example.jpg)
11
+
12
+ [Absolute Link](https://www.google.com)
13
+
14
+ [Link with hash](/page#hash)
15
+
16
+ [Link with query](/page?query=string)`;
17
+ const expected = `# Hello, world!
18
+
19
+ This is a paragraph.
20
+
21
+ [Example](https://example.com/example.html)
22
+
23
+ ![Example](https://example.com/example.jpg)
24
+
25
+ [Absolute Link](https://www.google.com)
26
+
27
+ [Link with hash](https://example.com/page#hash)
28
+
29
+ [Link with query](https://example.com/page?query=string)`;
30
+ (0, import_vitest.describe)("linkReplacer", () => {
31
+ (0, import_vitest.it)("should replace relative links", () => {
32
+ const replaced = (0, import_link_replacer.linkReplacer)(markdown, "https://example.com");
33
+ (0, import_vitest.expect)(replaced).toEqual(expected);
34
+ });
35
+ (0, import_vitest.it)("should not replace absolute links", () => {
36
+ const replaced = (0, import_link_replacer.linkReplacer)("[Absolute Link](https://www.google.com)", "https://example.com");
37
+ (0, import_vitest.expect)(replaced).toEqual("[Absolute Link](https://www.google.com)");
38
+ });
39
+ (0, import_vitest.it)("should handle links with hashes", () => {
40
+ const replaced = (0, import_link_replacer.linkReplacer)("[Link with hash](/page#hash)", "https://example.com");
41
+ (0, import_vitest.expect)(replaced).toEqual("[Link with hash](https://example.com/page#hash)");
42
+ });
43
+ (0, import_vitest.it)("should handle links with query parameters", () => {
44
+ const replaced = (0, import_link_replacer.linkReplacer)("[Link with query](/page?query=string)", "https://example.com");
45
+ (0, import_vitest.expect)(replaced).toEqual("[Link with query](https://example.com/page?query=string)");
46
+ });
47
+ });
@@ -0,0 +1,34 @@
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 fetch_exports = {};
20
+ __export(fetch_exports, {
21
+ USER_AGENT: () => USER_AGENT,
22
+ loadHtml: () => loadHtml
23
+ });
24
+ module.exports = __toCommonJS(fetch_exports);
25
+ const USER_AGENT = "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/125.0.0.0 safari/537.36";
26
+ const loadHtml = async (url, userAgent = USER_AGENT) => {
27
+ const response = await fetch(url, { headers: { "User-Agent": userAgent } });
28
+ return response.text();
29
+ };
30
+ // Annotate the CommonJS export names for ESM import in node:
31
+ 0 && (module.exports = {
32
+ USER_AGENT,
33
+ loadHtml
34
+ });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_fetch = require("./fetch");
4
+ (0, import_vitest.describe)("Fetch loader", () => {
5
+ (0, import_vitest.it)("should load the HTML of a URL", async () => {
6
+ const html = await (0, import_fetch.loadHtml)("https://example.com");
7
+ (0, import_vitest.expect)(html).toContain("Example Domain");
8
+ });
9
+ });
@@ -22,23 +22,14 @@ __export(playwright_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(playwright_exports);
24
24
  var import_playwright = require("playwright");
25
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
26
25
  const loadHtml = async (url, context) => {
27
- let _browser = null;
28
- let _context;
29
- if (context) {
30
- _context = context;
31
- } else {
32
- _browser = await import_playwright.chromium.launch({ headless: true });
33
- _context = await _browser.newContext();
34
- }
26
+ const _context = context ?? await import_playwright.chromium.launch({ headless: true });
35
27
  const page = await _context.newPage();
36
- await page.goto(url);
37
- await Promise.race([page.waitForLoadState("networkidle"), sleep(1e4)]);
28
+ await page.goto(url, { waitUntil: "load" });
38
29
  const html = await page.content();
39
30
  await page.close();
40
- if (_browser) {
41
- await _browser.close();
31
+ if (!context) {
32
+ await _context.close();
42
33
  }
43
34
  return html;
44
35
  };
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var import_playwright = require("playwright");
3
+ var import_vitest = require("vitest");
4
+ var import_playwright2 = require("./playwright");
5
+ (0, import_vitest.describe)("Playwright loader", () => {
6
+ (0, import_vitest.it)("should load the HTML of a URL", async () => {
7
+ const html = await (0, import_playwright2.loadHtml)("https://example.com");
8
+ (0, import_vitest.expect)(html).toContain("Example Domain");
9
+ });
10
+ (0, import_vitest.it)("should load the HTML of a URL using a custom context", async () => {
11
+ const context = await import_playwright.chromium.launch({ headless: true });
12
+ const html = await (0, import_playwright2.loadHtml)("https://example.com", context);
13
+ (0, import_vitest.expect)(html).toContain("Example Domain");
14
+ (0, import_vitest.expect)(context.isConnected()).toBe(true);
15
+ await context.close();
16
+ });
17
+ });
@@ -25,7 +25,11 @@ var import_hast_util_to_mdast = require("hast-util-to-mdast");
25
25
  var import_hast_util_to_string = require("hast-util-to-string");
26
26
  const customAHandler = (options) => (state, node) => {
27
27
  if (options?.asText) {
28
- const link2 = { type: "text", value: (0, import_hast_util_to_string.toString)(node) };
28
+ const text = (0, import_hast_util_to_string.toString)(node);
29
+ if (3 >= text.length) {
30
+ return void 0;
31
+ }
32
+ const link2 = { type: "text", value: text };
29
33
  state.patch(node, link2);
30
34
  return link2;
31
35
  }
@@ -28,7 +28,8 @@ var import_mdast_util_to_markdown = require("mdast-util-to-markdown");
28
28
  var import_link_replacer = require("./link-replacer");
29
29
  var import_mdast_utils = require("./utils/mdast-utils");
30
30
  const DEFAULT_MDAST_TO_MARKDOWN_OPTIONS = {
31
- extensions: [(0, import_mdast_util_gfm.gfmToMarkdown)(), (0, import_mdast_util_math.mathToMarkdown)()]
31
+ extensions: [(0, import_mdast_util_gfm.gfmToMarkdown)(), (0, import_mdast_util_math.mathToMarkdown)()],
32
+ bullet: "-"
32
33
  };
33
34
  const mdastToMarkdown = (mdast, options) => {
34
35
  const { baseUrl, ...toMarkdownOptions } = { ...DEFAULT_MDAST_TO_MARKDOWN_OPTIONS, ...options };
@@ -8,6 +8,7 @@ var UNLIKELY_ROLES = ["menu", "menubar", "complementary", "navigation", "alert",
8
8
  var REGEXPS = {
9
9
  hidden: /hidden|invisible|fallback-image/i,
10
10
  byline: /byline|author|dateline|writtenby|p-author/i,
11
+ specialUnlikelyCandidates: /frb-|uls-menu|language-link/i,
11
12
  unlikelyCandidates: /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote|speechify-ignore/i,
12
13
  okMaybeItsaCandidate: /and|article|body|column|content|main|shadow|code/i
13
14
  };
@@ -67,18 +68,31 @@ var unlikelyElementFilter = (node) => {
67
68
  return true;
68
69
  }
69
70
  const element = node;
70
- const match = matchString(element);
71
71
  if (["body", "article", "main", "section", "a"].includes(element.tagName)) {
72
72
  return true;
73
73
  }
74
74
  if (hasAncestors(element, ["table", "code"], 3)) {
75
75
  return true;
76
76
  }
77
+ const match = matchString(element);
78
+ if (REGEXPS.specialUnlikelyCandidates.test(match)) {
79
+ return false;
80
+ }
77
81
  if (REGEXPS.unlikelyCandidates.test(match) && !REGEXPS.okMaybeItsaCandidate.test(match)) {
78
82
  return false;
79
83
  }
80
84
  return true;
81
85
  };
86
+ var isImageLink = (element) => {
87
+ const a = select("a", element);
88
+ const img = select("img", a);
89
+ if (!(a && img)) {
90
+ return false;
91
+ }
92
+ const imgFilename = img.properties.src?.toString().split("/").pop();
93
+ const hrefFilename = a.properties.href?.toString().split("/").pop();
94
+ return imgFilename === hrefFilename && imgFilename;
95
+ };
82
96
  var removeEmptyFilter = (node) => {
83
97
  if (node.type !== "element") {
84
98
  return true;
@@ -87,6 +101,9 @@ var removeEmptyFilter = (node) => {
87
101
  if (!PARAGRAPH_TAGS.includes(element.tagName)) {
88
102
  return true;
89
103
  }
104
+ if (isImageLink(element)) {
105
+ return true;
106
+ }
90
107
  const text = hastToString(element);
91
108
  if (text.length < 10) {
92
109
  return false;
@@ -97,7 +114,7 @@ var readabilityExtractHast = (hast) => {
97
114
  const lang = String(select("html", hast)?.properties.lang || tryGetLang(hast) || "en");
98
115
  const body = select("body", hast) ?? hast;
99
116
  const proxiedHast = parents(body);
100
- let baseFilterd = filter(proxiedHast, (node) => {
117
+ const baseFilterd = filter(proxiedHast, (node) => {
101
118
  if (!metadataFilter(node)) {
102
119
  return false;
103
120
  }
@@ -111,17 +128,7 @@ var readabilityExtractHast = (hast) => {
111
128
  }
112
129
  const baseText = hastToString(baseFilterd);
113
130
  let minimalLength = lang in BASE_MINIMAL_LENGTH ? BASE_MINIMAL_LENGTH[lang] : 500;
114
- if (baseText.length > minimalLength) {
115
- const filterd = filter(baseFilterd, (node) => {
116
- if (!unlikelyElementFilter(node)) {
117
- return false;
118
- }
119
- return true;
120
- });
121
- if (filterd) {
122
- baseFilterd = filterd;
123
- }
124
- } else {
131
+ if (baseText.length < minimalLength) {
125
132
  minimalLength = Math.max(0, baseText.length - 200);
126
133
  }
127
134
  let bodyTree = baseFilterd;
@@ -146,6 +153,9 @@ var readabilityExtractHast = (hast) => {
146
153
  if (!removeEmptyFilter(node)) {
147
154
  return false;
148
155
  }
156
+ if (!unlikelyElementFilter(node)) {
157
+ return false;
158
+ }
149
159
  return true;
150
160
  });
151
161
  return finalTree;
@@ -1,5 +1,5 @@
1
1
  // src/extract-hast/utils.ts
2
- var matchString = (element) => `${element.tagName} ${element.properties.id} ${classnames(element).join(" ")} }`;
2
+ var matchString = (element) => `${element.tagName} ${element.properties.id} ${classnames(element).join(" ")}`;
3
3
  var classnames = (element) => {
4
4
  if (Array.isArray(element.properties.className)) {
5
5
  return element.properties.className;
@@ -0,0 +1,24 @@
1
+ // src/extract-mdast.ts
2
+ import { filter } from "unist-util-filter";
3
+ var DECLATION_TYPES = ["blockquote", "strong", "emphasis", "delete"];
4
+ var emptyDeclarationFilter = (node) => {
5
+ if (!DECLATION_TYPES.includes(node.type)) {
6
+ return true;
7
+ }
8
+ if (node.children.length === 0) {
9
+ return false;
10
+ }
11
+ return true;
12
+ };
13
+ var extractMdast = (node) => {
14
+ const extracted = filter(node, (node2) => {
15
+ if (!emptyDeclarationFilter(node2)) {
16
+ return false;
17
+ }
18
+ return true;
19
+ });
20
+ return extracted;
21
+ };
22
+ export {
23
+ extractMdast
24
+ };
@@ -2,9 +2,12 @@
2
2
  import { distance } from "fastest-levenshtein";
3
3
  import { describe, expect, it } from "vitest";
4
4
  import { htmlToMarkdown } from "./html-to-markdown.js";
5
+ import { loadHtml } from "./loaders/fetch.js";
5
6
  var html = `
6
7
  <h1>Hello, world!</h1>
7
8
  <p>This is a paragraph.</p>
9
+ <a href="/example.html">Example</a>
10
+ <img src="/example.jpg" alt="Example" />
8
11
  <ul>
9
12
  <li>Item 1</li>
10
13
  <li>Item 2</li>
@@ -14,13 +17,108 @@ var expected = `# Hello, world!
14
17
 
15
18
  This is a paragraph.
16
19
 
20
+ [Example](/example.html)
21
+
22
+ ![Example](/example.jpg)
23
+
17
24
  * Item 1
18
25
  * Item 2
19
26
  `;
27
+ var baseUrlReplaced = `# Hello, world!
28
+
29
+ This is a paragraph.
30
+
31
+ [Example](https://example.com/example.html)
32
+
33
+ ![Example](https://example.com/example.jpg)
34
+
35
+ * Item 1
36
+ * Item 2
37
+ `;
38
+ var linkAsText = `# Hello, world!
39
+
40
+ This is a paragraph.
41
+
42
+ Example
43
+
44
+ ![Example](/example.jpg)
45
+
46
+ - Item 1
47
+ - Item 2
48
+ `;
49
+ var imageHidden = `# Hello, world!
50
+
51
+ This is a paragraph.
52
+
53
+ [Example](/example.html)
54
+
55
+ - Item 1
56
+ - Item 2
57
+ `;
58
+ var htmlTable = `
59
+ <table>
60
+ <tr>
61
+ <th>Header 1</th>
62
+ <th>Header 2</th>
63
+ </tr>
64
+ <tr>
65
+ <td>Cell 1</td>
66
+ <td>Cell 2</td>
67
+ </tr>
68
+ </table>
69
+ `;
70
+ var expectedTableMarkdown = `
71
+ | Header 1 | Header 2 |
72
+ | -------- | -------- |
73
+ | Cell 1 | Cell 2 |
74
+ `;
75
+ var expectedTableText = `Header 1 Header 2
76
+ Cell 1 Cell 2`;
20
77
  describe("htmlToMarkdown", () => {
21
78
  it("should convert HTML to Markdown", () => {
22
79
  const markdown = htmlToMarkdown(html, { extractors: false });
23
80
  const d = distance(markdown, expected);
24
- expect(d).lte(2);
81
+ expect(d).lte(5);
82
+ });
83
+ it("should convert HTML to Markdown with replaced base URL", () => {
84
+ const markdown = htmlToMarkdown(html, { baseUrl: "https://example.com", extractors: false });
85
+ const d = distance(markdown, baseUrlReplaced);
86
+ expect(d).lte(5);
87
+ });
88
+ it("should convert HTML to Markdown with links as text", () => {
89
+ const markdown = htmlToMarkdown(html, { linkAsText: true, extractors: false });
90
+ const d = distance(markdown, linkAsText);
91
+ expect(d).lte(5);
92
+ });
93
+ it("should convert HTML to Markdown with hidden images", () => {
94
+ const markdown = htmlToMarkdown(html, { hideImage: true, extractors: false });
95
+ const d = distance(markdown, imageHidden);
96
+ expect(d).lte(5);
97
+ });
98
+ it("should convert HTML table to Markdown table", () => {
99
+ const markdown = htmlToMarkdown(htmlTable, { extractors: false });
100
+ const d = distance(markdown, expectedTableMarkdown);
101
+ expect(d).lte(5);
102
+ });
103
+ it("should convert HTML table with table as text option", () => {
104
+ const markdown = htmlToMarkdown(htmlTable, { tableAsText: true, extractors: false });
105
+ const d = distance(markdown, expectedTableText);
106
+ expect(d).lte(10);
107
+ });
108
+ });
109
+ describe("htmlToMarkdown E2E", () => {
110
+ it("should convert npm README to Markdown ", async () => {
111
+ const html2 = await loadHtml("https://www.npmjs.com/package/webforai");
112
+ const markdown = htmlToMarkdown(html2, { baseUrl: "https://www.npmjs.com/package/webforai" });
113
+ const original = await import("../README.md?raw");
114
+ const d = distance(markdown, original.default);
115
+ expect(d).lte(400);
116
+ });
117
+ it("should convert GitHub README to Markdown ", async () => {
118
+ const html2 = await loadHtml("https://github.com/inaridiy/webforai");
119
+ const markdown = htmlToMarkdown(html2, { baseUrl: "https://www.npmjs.com/package/webforai" });
120
+ const original = await import("../../../README.md?raw");
121
+ const d = distance(markdown, original.default);
122
+ expect(d).lte(200);
25
123
  });
26
124
  });
@@ -2,6 +2,7 @@
2
2
  import { fromHtml } from "hast-util-from-html";
3
3
  import { toMdast } from "hast-util-to-mdast";
4
4
  import { extractHast } from "./extract-hast/index.js";
5
+ import { extractMdast } from "./extract-mdast.js";
5
6
  import { customAHandler } from "./mdast-handlers/custom-a-handler.js";
6
7
  import { customCodeHandler } from "./mdast-handlers/custom-code-handler.js";
7
8
  import { customDivHandler } from "./mdast-handlers/custom-div-handler.js";
@@ -24,7 +25,8 @@ var htmlToMdast = (htmlOrHast, options) => {
24
25
  br: emptyHandler
25
26
  }
26
27
  });
27
- return mdast;
28
+ const extractedMdast = extractMdast(mdast);
29
+ return extractedMdast;
28
30
  };
29
31
  export {
30
32
  htmlToMdast
@@ -0,0 +1,47 @@
1
+ // src/link-replacer.test.ts
2
+ import { describe, expect, it } from "vitest";
3
+ import { linkReplacer } from "./link-replacer.js";
4
+ var markdown = `# Hello, world!
5
+
6
+ This is a paragraph.
7
+
8
+ [Example](/example.html)
9
+
10
+ ![Example](/example.jpg)
11
+
12
+ [Absolute Link](https://www.google.com)
13
+
14
+ [Link with hash](/page#hash)
15
+
16
+ [Link with query](/page?query=string)`;
17
+ var expected = `# Hello, world!
18
+
19
+ This is a paragraph.
20
+
21
+ [Example](https://example.com/example.html)
22
+
23
+ ![Example](https://example.com/example.jpg)
24
+
25
+ [Absolute Link](https://www.google.com)
26
+
27
+ [Link with hash](https://example.com/page#hash)
28
+
29
+ [Link with query](https://example.com/page?query=string)`;
30
+ describe("linkReplacer", () => {
31
+ it("should replace relative links", () => {
32
+ const replaced = linkReplacer(markdown, "https://example.com");
33
+ expect(replaced).toEqual(expected);
34
+ });
35
+ it("should not replace absolute links", () => {
36
+ const replaced = linkReplacer("[Absolute Link](https://www.google.com)", "https://example.com");
37
+ expect(replaced).toEqual("[Absolute Link](https://www.google.com)");
38
+ });
39
+ it("should handle links with hashes", () => {
40
+ const replaced = linkReplacer("[Link with hash](/page#hash)", "https://example.com");
41
+ expect(replaced).toEqual("[Link with hash](https://example.com/page#hash)");
42
+ });
43
+ it("should handle links with query parameters", () => {
44
+ const replaced = linkReplacer("[Link with query](/page?query=string)", "https://example.com");
45
+ expect(replaced).toEqual("[Link with query](https://example.com/page?query=string)");
46
+ });
47
+ });
@@ -0,0 +1,10 @@
1
+ // src/loaders/fetch.ts
2
+ var USER_AGENT = "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/125.0.0.0 safari/537.36";
3
+ var loadHtml = async (url, userAgent = USER_AGENT) => {
4
+ const response = await fetch(url, { headers: { "User-Agent": userAgent } });
5
+ return response.text();
6
+ };
7
+ export {
8
+ USER_AGENT,
9
+ loadHtml
10
+ };
@@ -0,0 +1,9 @@
1
+ // src/loaders/fetch.test.ts
2
+ import { describe, expect, it } from "vitest";
3
+ import { loadHtml } from "./fetch.js";
4
+ describe("Fetch loader", () => {
5
+ it("should load the HTML of a URL", async () => {
6
+ const html = await loadHtml("https://example.com");
7
+ expect(html).toContain("Example Domain");
8
+ });
9
+ });
@@ -1,22 +1,13 @@
1
1
  // src/loaders/playwright.ts
2
2
  import { chromium } from "playwright";
3
- var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
4
3
  var loadHtml = async (url, context) => {
5
- let _browser = null;
6
- let _context;
7
- if (context) {
8
- _context = context;
9
- } else {
10
- _browser = await chromium.launch({ headless: true });
11
- _context = await _browser.newContext();
12
- }
4
+ const _context = context ?? await chromium.launch({ headless: true });
13
5
  const page = await _context.newPage();
14
- await page.goto(url);
15
- await Promise.race([page.waitForLoadState("networkidle"), sleep(1e4)]);
6
+ await page.goto(url, { waitUntil: "load" });
16
7
  const html = await page.content();
17
8
  await page.close();
18
- if (_browser) {
19
- await _browser.close();
9
+ if (!context) {
10
+ await _context.close();
20
11
  }
21
12
  return html;
22
13
  };
@@ -0,0 +1,17 @@
1
+ // src/loaders/playwright.test.ts
2
+ import { chromium } from "playwright";
3
+ import { describe, expect, it } from "vitest";
4
+ import { loadHtml } from "./playwright.js";
5
+ describe("Playwright loader", () => {
6
+ it("should load the HTML of a URL", async () => {
7
+ const html = await loadHtml("https://example.com");
8
+ expect(html).toContain("Example Domain");
9
+ });
10
+ it("should load the HTML of a URL using a custom context", async () => {
11
+ const context = await chromium.launch({ headless: true });
12
+ const html = await loadHtml("https://example.com", context);
13
+ expect(html).toContain("Example Domain");
14
+ expect(context.isConnected()).toBe(true);
15
+ await context.close();
16
+ });
17
+ });
@@ -3,7 +3,11 @@ import { defaultHandlers } from "hast-util-to-mdast";
3
3
  import { toString as hastToString } from "hast-util-to-string";
4
4
  var customAHandler = (options) => (state, node) => {
5
5
  if (options?.asText) {
6
- const link2 = { type: "text", value: hastToString(node) };
6
+ const text = hastToString(node);
7
+ if (3 >= text.length) {
8
+ return void 0;
9
+ }
10
+ const link2 = { type: "text", value: text };
7
11
  state.patch(node, link2);
8
12
  return link2;
9
13
  }
@@ -5,7 +5,8 @@ import { toMarkdown } from "mdast-util-to-markdown";
5
5
  import { linkReplacer } from "./link-replacer.js";
6
6
  import { warpRoot } from "./utils/mdast-utils.js";
7
7
  var DEFAULT_MDAST_TO_MARKDOWN_OPTIONS = {
8
- extensions: [gfmToMarkdown(), mathToMarkdown()]
8
+ extensions: [gfmToMarkdown(), mathToMarkdown()],
9
+ bullet: "-"
9
10
  };
10
11
  var mdastToMarkdown = (mdast, options) => {
11
12
  const { baseUrl, ...toMarkdownOptions } = { ...DEFAULT_MDAST_TO_MARKDOWN_OPTIONS, ...options };
@@ -1 +1 @@
1
- {"version":3,"file":"readability.js","sourceRoot":"","sources":["../../../src/extract-hast/readability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readability.js","sourceRoot":"","sources":["../../../src/extract-hast/readability.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/extract-hast/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAE,EAAE,CAC/C,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAElF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAqB,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,KAAa,EAAE,EAAE;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,QAAkB,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;IAC/E,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/extract-hast/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAE,EAAE,CAC/C,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAEhF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,UAAU,CAAC,SAAqB,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,KAAa,EAAE,EAAE;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,QAAkB,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;IAC/E,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Nodes as Mdast } from "mdast";
2
+ export declare const extractMdast: (node: Mdast) => Mdast;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-mdast.js","sourceRoot":"","sources":["../../src/extract-mdast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEvE,MAAM,sBAAsB,GAAG,CAAC,IAAW,EAAE,EAAE;IAC9C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAK,IAAe,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAW,EAAE,EAAE;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QACvC,IAAI,CAAC,sBAAsB,CAAC,IAAa,CAAC,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;IACH,OAAO,SAAkB,CAAC;AAC3B,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"html-to-mdast.js","sourceRoot":"","sources":["../../src/html-to-mdast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAmB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAgB5D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAyB,EAAE,OAA4B,EAAS,EAAE;IAC7F,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAErC,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEpG,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,EAAE;QACpC,QAAQ,EAAE;YACT,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,gBAAgB;YACrB,GAAG,EAAE,iBAAiB;YACtB,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;YAClD,GAAG,EAAE,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YACxD,KAAK,EAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;YAC3D,EAAE,EAAE,YAAY;SAChB;KACD,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACd,CAAC,CAAC"}
1
+ {"version":3,"file":"html-to-mdast.js","sourceRoot":"","sources":["../../src/html-to-mdast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,EAAmB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAgB5D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAyB,EAAE,OAA4B,EAAS,EAAE;IAC7F,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAErC,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEpG,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,EAAE;QACpC,QAAQ,EAAE;YACT,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,gBAAgB;YACrB,GAAG,EAAE,iBAAiB;YACtB,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;YAClD,GAAG,EAAE,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YACxD,KAAK,EAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;YAC3D,EAAE,EAAE,YAAY;SAChB;KACD,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAE3C,OAAO,cAAc,CAAC;AACvB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const USER_AGENT = "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/125.0.0.0 safari/537.36";
2
+ /**
3
+ * Useful function for load the HTML of a URL using the Fetch API.
4
+ * **Not recommended** for use in production environments.
5
+ * @param url - The URL to load.
6
+ * @param userAgent - The user agent to use. Default is a Chrome user agent.
7
+ * @returns The HTML content of the URL.
8
+ */
9
+ export declare const loadHtml: (url: string, userAgent?: string) => Promise<string>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/loaders/fetch.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GACtB,iHAAiH,CAAC;AAEnH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,SAAS,GAAG,UAAU,EAAE,EAAE;IACrE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC,CAAC"}
@@ -1,2 +1,16 @@
1
- import { type BrowserContext } from "playwright";
2
- export declare const loadHtml: (url: string, context?: BrowserContext) => Promise<string>;
1
+ import { type Browser, type BrowserContext } from "playwright";
2
+ /**
3
+ * Useful function for load the HTML of a URL using Playwright.
4
+ * **Not recommended** for use in production environments.
5
+ * @param url - The URL to load.
6
+ * @param context - The Playwright browser context to use. If not provided, a new browser context will be created and closed after loading the URL.
7
+ * @returns The HTML content of the URL.
8
+ * @example
9
+ * ```ts
10
+ * import { loadHtml } from "webforai/loaders/playwright";
11
+ *
12
+ * const html = await loadHtml("https://example.com");
13
+ * console.log(html);
14
+ * ```
15
+ */
16
+ export declare const loadHtml: (url: string, context?: BrowserContext | Browser) => Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../../../src/loaders/playwright.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,OAAwB,EAAE,EAAE;IACvE,IAAI,QAAQ,GAAmB,IAAI,CAAC;IACpC,IAAI,QAAwB,CAAC;IAC7B,IAAI,OAAO,EAAE,CAAC;QACb,QAAQ,GAAG,OAAO,CAAC;IACpB,CAAC;SAAM,CAAC;QACP,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAClC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACnB,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC"}
1
+ {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../../../src/loaders/playwright.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,OAAkC,EAAE,EAAE;IACjF,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAExE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAClC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAEnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"custom-a-handler.js","sourceRoot":"","sources":["../../../src/mdast-handlers/custom-a-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,MAAM,cAAc,GAC1B,CAAC,OAA8B,EAAU,EAAE,CAC3C,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACf,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,EAAW,CAAC;QAClE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC"}
1
+ {"version":3,"file":"custom-a-handler.js","sourceRoot":"","sources":["../../../src/mdast-handlers/custom-a-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,MAAM,cAAc,GAC1B,CAAC,OAA8B,EAAU,EAAE,CAC3C,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACf,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAW,CAAC;QACpD,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mdast-to-markdown.js","sourceRoot":"","sources":["../../src/mdast-to-markdown.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAqC,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAY/C;;GAEG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAA2B;IACxE,UAAU,EAAE,CAAC,aAAa,EAAE,EAAE,cAAc,EAAE,CAAC;CAC/C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAA4B,EAAE,OAAgC,EAAU,EAAE;IACzG,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,GAAG,EAAE,GAAG,iCAAiC,EAAE,GAAG,OAAO,EAAE,CAAC;IAE/F,IAAI,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAE9D,IAAI,OAAO,EAAE,CAAC;QACb,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC"}
1
+ {"version":3,"file":"mdast-to-markdown.js","sourceRoot":"","sources":["../../src/mdast-to-markdown.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAqC,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAY/C;;GAEG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAA2B;IACxE,UAAU,EAAE,CAAC,aAAa,EAAE,EAAE,cAAc,EAAE,CAAC;IAC/C,MAAM,EAAE,GAAG;CACX,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAA4B,EAAE,OAAgC,EAAU,EAAE;IACzG,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,GAAG,EAAE,GAAG,iCAAiC,EAAE,GAAG,OAAO,EAAE,CAAC;IAE/F,IAAI,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAE9D,IAAI,OAAO,EAAE,CAAC;QACb,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webforai",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "A library that provides a web interface for AI",
5
5
  "author": "inaridiy",
6
6
  "license": "MIT",
@@ -42,6 +42,11 @@
42
42
  "import": "./dist/loaders/playwright.js",
43
43
  "require": "./dist/cjs/loaders/playwright.js"
44
44
  },
45
+ "./loaders/fetch": {
46
+ "types": "./dist/types/loaders/fetch.d.ts",
47
+ "import": "./dist/loaders/fetch.js",
48
+ "require": "./dist/cjs/loaders/fetch.js"
49
+ },
45
50
  "./loaders/cf-puppeteer": {
46
51
  "types": "./dist/types/loaders/cf-puppeteer.d.ts",
47
52
  "import": "./dist/loaders/cf-puppeteer.js",