webforai 2.1.1 → 3.0.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 (154) hide show
  1. package/README.md +63 -1
  2. package/dist/adapters/index.js +58 -0
  3. package/dist/adapters/registry.js +149 -0
  4. package/dist/adapters/sites/declarative.js +178 -0
  5. package/dist/adapters/sites/hackernews.js +94 -0
  6. package/dist/adapters/sites/youtube.js +165 -0
  7. package/dist/adapters/types.js +0 -0
  8. package/dist/bin.js +3197 -402
  9. package/dist/cjs/adapters/index.js +86 -0
  10. package/dist/cjs/adapters/registry.js +178 -0
  11. package/dist/cjs/adapters/sites/declarative.js +202 -0
  12. package/dist/cjs/adapters/sites/hackernews.js +117 -0
  13. package/dist/cjs/adapters/sites/youtube.js +191 -0
  14. package/dist/cjs/adapters/types.js +16 -0
  15. package/dist/cjs/constants.js +2 -2
  16. package/dist/cjs/extractors/index.js +5 -0
  17. package/dist/cjs/extractors/lib/constants.js +186 -0
  18. package/dist/cjs/extractors/lib/sanitize.js +425 -0
  19. package/dist/cjs/extractors/lib/score.js +264 -0
  20. package/dist/cjs/extractors/lib/terminators.js +131 -0
  21. package/dist/cjs/extractors/lib/ui-chrome.js +119 -0
  22. package/dist/cjs/extractors/pipeExtractors.js +12 -9
  23. package/dist/cjs/extractors/presets/auto.js +44 -0
  24. package/dist/cjs/extractors/presets/minimal-filter.js +27 -48
  25. package/dist/cjs/extractors/presets/takumi.js +84 -122
  26. package/dist/cjs/html-to-markdown.js +44 -7
  27. package/dist/cjs/html-to-mdast.js +9 -1
  28. package/dist/cjs/index.js +31 -2
  29. package/dist/cjs/mdast-handlers/custom-a-handler.js +25 -9
  30. package/dist/cjs/mdast-handlers/custom-img-handler.js +23 -1
  31. package/dist/cjs/mdast-handlers/custom-table-handler.js +16 -0
  32. package/dist/cjs/mdast-handlers/definition-list-handler.js +99 -0
  33. package/dist/cjs/mdast-handlers/math-handler.js +12 -3
  34. package/dist/cjs/mdast-handlers/sup-sub-handler.js +39 -0
  35. package/dist/cjs/metadata/index.js +223 -0
  36. package/dist/cjs/normalize/index.js +168 -0
  37. package/dist/cjs/platform/client.js +147 -0
  38. package/dist/cjs/platform/error.js +36 -0
  39. package/dist/cjs/platform/fetch.js +37 -0
  40. package/dist/cjs/platform/index.js +40 -0
  41. package/dist/cjs/platform/types.js +34 -0
  42. package/dist/cjs/utils/hast-fast.js +284 -0
  43. package/dist/constants.js +2 -2
  44. package/dist/extractors/index.js +3 -0
  45. package/dist/extractors/lib/constants.js +150 -0
  46. package/dist/extractors/lib/sanitize.js +415 -0
  47. package/dist/extractors/lib/score.js +242 -0
  48. package/dist/extractors/lib/terminators.js +107 -0
  49. package/dist/extractors/lib/ui-chrome.js +96 -0
  50. package/dist/extractors/pipeExtractors.js +12 -9
  51. package/dist/extractors/presets/auto.js +20 -0
  52. package/dist/extractors/presets/minimal-filter.js +35 -47
  53. package/dist/extractors/presets/takumi.js +91 -122
  54. package/dist/html-to-markdown.js +42 -6
  55. package/dist/html-to-mdast.js +9 -1
  56. package/dist/index.js +31 -2
  57. package/dist/mdast-handlers/custom-a-handler.js +25 -9
  58. package/dist/mdast-handlers/custom-img-handler.js +23 -1
  59. package/dist/mdast-handlers/custom-table-handler.js +16 -0
  60. package/dist/mdast-handlers/definition-list-handler.js +76 -0
  61. package/dist/mdast-handlers/math-handler.js +12 -3
  62. package/dist/mdast-handlers/sup-sub-handler.js +16 -0
  63. package/dist/metadata/index.js +198 -0
  64. package/dist/normalize/index.js +149 -0
  65. package/dist/platform/client.js +125 -0
  66. package/dist/platform/error.js +13 -0
  67. package/dist/platform/fetch.js +14 -0
  68. package/dist/platform/index.js +19 -0
  69. package/dist/platform/types.js +9 -0
  70. package/dist/types/adapters/index.d.ts +24 -0
  71. package/dist/types/adapters/index.js.map +1 -0
  72. package/dist/types/adapters/registry.d.ts +35 -0
  73. package/dist/types/adapters/registry.js.map +1 -0
  74. package/dist/types/adapters/sites/declarative.d.ts +13 -0
  75. package/dist/types/adapters/sites/declarative.js.map +1 -0
  76. package/dist/types/adapters/sites/hackernews.d.ts +13 -0
  77. package/dist/types/adapters/sites/hackernews.js.map +1 -0
  78. package/dist/types/adapters/sites/youtube.d.ts +31 -0
  79. package/dist/types/adapters/sites/youtube.js.map +1 -0
  80. package/dist/types/adapters/types.d.ts +99 -0
  81. package/dist/types/adapters/types.js.map +1 -0
  82. package/dist/types/cli/bin.js.map +1 -1
  83. package/dist/types/cli/commands/skill/content.d.ts +9 -0
  84. package/dist/types/cli/commands/skill/content.js.map +1 -0
  85. package/dist/types/cli/commands/skill/index.d.ts +19 -0
  86. package/dist/types/cli/commands/skill/index.js.map +1 -0
  87. package/dist/types/cli/commands/webforai/interactive.d.ts +7 -0
  88. package/dist/types/cli/commands/webforai/interactive.js.map +1 -0
  89. package/dist/types/cli/commands/webforai/loadHtml.js.map +1 -1
  90. package/dist/types/cli/commands/webforai/options.d.ts +55 -0
  91. package/dist/types/cli/commands/webforai/options.js.map +1 -0
  92. package/dist/types/cli/commands/webforai/run.d.ts +10 -0
  93. package/dist/types/cli/commands/webforai/run.js.map +1 -0
  94. package/dist/types/cli/constants.d.ts +14 -4
  95. package/dist/types/cli/constants.js.map +1 -1
  96. package/dist/types/cli/helpers/selectExtractMode.js.map +1 -1
  97. package/dist/types/cli/helpers/selectLoader.js.map +1 -1
  98. package/dist/types/constants.d.ts +7 -1
  99. package/dist/types/constants.js.map +1 -1
  100. package/dist/types/extractors/index.d.ts +1 -0
  101. package/dist/types/extractors/index.js.map +1 -1
  102. package/dist/types/extractors/lib/constants.d.ts +81 -0
  103. package/dist/types/extractors/lib/constants.js.map +1 -0
  104. package/dist/types/extractors/lib/sanitize.d.ts +66 -0
  105. package/dist/types/extractors/lib/sanitize.js.map +1 -0
  106. package/dist/types/extractors/lib/score.d.ts +85 -0
  107. package/dist/types/extractors/lib/score.js.map +1 -0
  108. package/dist/types/extractors/lib/terminators.d.ts +26 -0
  109. package/dist/types/extractors/lib/terminators.js.map +1 -0
  110. package/dist/types/extractors/lib/ui-chrome.d.ts +18 -0
  111. package/dist/types/extractors/lib/ui-chrome.js.map +1 -0
  112. package/dist/types/extractors/pipeExtractors.d.ts +5 -0
  113. package/dist/types/extractors/pipeExtractors.js.map +1 -1
  114. package/dist/types/extractors/presets/auto.d.ts +30 -0
  115. package/dist/types/extractors/presets/auto.js.map +1 -0
  116. package/dist/types/extractors/presets/minimal-filter.d.ts +10 -2
  117. package/dist/types/extractors/presets/minimal-filter.js.map +1 -1
  118. package/dist/types/extractors/presets/takumi.d.ts +19 -3
  119. package/dist/types/extractors/presets/takumi.js.map +1 -1
  120. package/dist/types/extractors/types.d.ts +8 -0
  121. package/dist/types/html-to-markdown.d.ts +38 -0
  122. package/dist/types/html-to-markdown.js.map +1 -1
  123. package/dist/types/html-to-mdast.d.ts +11 -0
  124. package/dist/types/html-to-mdast.js.map +1 -1
  125. package/dist/types/index.d.ts +6 -3
  126. package/dist/types/index.js.map +1 -1
  127. package/dist/types/mdast-handlers/custom-a-handler.js.map +1 -1
  128. package/dist/types/mdast-handlers/custom-img-handler.js.map +1 -1
  129. package/dist/types/mdast-handlers/custom-table-handler.js.map +1 -1
  130. package/dist/types/mdast-handlers/definition-list-handler.d.ts +13 -0
  131. package/dist/types/mdast-handlers/definition-list-handler.js.map +1 -0
  132. package/dist/types/mdast-handlers/math-handler.js.map +1 -1
  133. package/dist/types/mdast-handlers/sup-sub-handler.d.ts +10 -0
  134. package/dist/types/mdast-handlers/sup-sub-handler.js.map +1 -0
  135. package/dist/types/metadata/index.d.ts +47 -0
  136. package/dist/types/metadata/index.js.map +1 -0
  137. package/dist/types/normalize/index.d.ts +53 -0
  138. package/dist/types/normalize/index.js.map +1 -0
  139. package/dist/types/platform/client.d.ts +54 -0
  140. package/dist/types/platform/client.js.map +1 -0
  141. package/dist/types/platform/error.d.ts +20 -0
  142. package/dist/types/platform/error.js.map +1 -0
  143. package/dist/types/platform/fetch.d.ts +34 -0
  144. package/dist/types/platform/fetch.js.map +1 -0
  145. package/dist/types/platform/index.d.ts +4 -0
  146. package/dist/types/platform/index.js.map +1 -0
  147. package/dist/types/platform/types.d.ts +135 -0
  148. package/dist/types/platform/types.js.map +1 -0
  149. package/dist/types/utils/hast-fast.d.ts +101 -0
  150. package/dist/types/utils/hast-fast.js.map +1 -0
  151. package/dist/utils/hast-fast.js +246 -0
  152. package/package.json +10 -3
  153. package/dist/types/cli/commands/webforai/index.d.ts +0 -6
  154. package/dist/types/cli/commands/webforai/index.js.map +0 -1
@@ -18,18 +18,55 @@ 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
- htmlToMarkdown: () => htmlToMarkdown
21
+ htmlToMarkdown: () => htmlToMarkdown,
22
+ htmlToMarkdownWithMetadata: () => htmlToMarkdownWithMetadata
22
23
  });
23
24
  module.exports = __toCommonJS(html_to_markdown_exports);
25
+ var import_hast_util_from_html = require("hast-util-from-html");
24
26
  var import_html_to_mdast = require("./html-to-mdast");
25
27
  var import_mdast_to_markdown = require("./mdast-to-markdown");
26
- const htmlToMarkdown = (htmlOrHast, options) => {
27
- const { baseUrl, formatting: toMarkdownOptions, ...toMdastOptions } = options || {};
28
- const mdast = (0, import_html_to_mdast.htmlToMdast)(htmlOrHast, toMdastOptions);
29
- const markdown = (0, import_mdast_to_markdown.mdastToMarkdown)(mdast, { baseUrl, ...toMarkdownOptions });
30
- return markdown;
28
+ var import_metadata = require("./metadata");
29
+ var import_hast_utils = require("./utils/hast-utils");
30
+ const htmlToMarkdownWithMetadata = (htmlOrHast, options) => {
31
+ const { baseUrl, frontmatter, title, formatting: toMarkdownOptions, ...toMdastOptions } = options || {};
32
+ const hast = typeof htmlOrHast === "string" ? (0, import_hast_util_from_html.fromHtml)(htmlOrHast, { fragment: true }) : htmlOrHast;
33
+ const isOwned = typeof htmlOrHast === "string";
34
+ const declaredLang = typeof htmlOrHast === "string" ? (0, import_hast_utils.getLangFromStr)(htmlOrHast) : void 0;
35
+ const metadata = (0, import_metadata.extractMetadata)(hast);
36
+ if (declaredLang && !metadata.lang) {
37
+ metadata.lang = declaredLang;
38
+ }
39
+ const mdast = (0, import_html_to_mdast.htmlToMdast)(hast, {
40
+ ...toMdastOptions,
41
+ owned: isOwned,
42
+ lang: toMdastOptions.lang ?? metadata.lang,
43
+ url: toMdastOptions.url ?? metadata.canonicalUrl
44
+ });
45
+ const body = (0, import_mdast_to_markdown.mdastToMarkdown)(mdast, { baseUrl, ...toMarkdownOptions });
46
+ const titled = title === false ? body : withTitle(body, metadata.title);
47
+ const markdown = frontmatter ? `${(0, import_metadata.toFrontmatter)(metadata)}${titled}` : titled;
48
+ return { markdown, metadata };
49
+ };
50
+ const TITLE_LOOKAHEAD = 400;
51
+ const withTitle = (body, title) => {
52
+ if (!title) {
53
+ return body;
54
+ }
55
+ const opening = body.slice(0, TITLE_LOOKAHEAD);
56
+ if (/^#\s+\S/m.test(opening)) {
57
+ return body;
58
+ }
59
+ if (normalizeForCompare(opening).includes(normalizeForCompare(title))) {
60
+ return body;
61
+ }
62
+ return `# ${title}
63
+
64
+ ${body}`;
31
65
  };
66
+ const normalizeForCompare = (value) => value.replace(/\s+/g, " ").trim().toLowerCase();
67
+ const htmlToMarkdown = (htmlOrHast, options) => htmlToMarkdownWithMetadata(htmlOrHast, options).markdown;
32
68
  // Annotate the CommonJS export names for ESM import in node:
33
69
  0 && (module.exports = {
34
- htmlToMarkdown
70
+ htmlToMarkdown,
71
+ htmlToMarkdownWithMetadata
35
72
  });
@@ -30,18 +30,26 @@ var import_custom_code_handler = require("./mdast-handlers/custom-code-handler")
30
30
  var import_custom_div_handler = require("./mdast-handlers/custom-div-handler");
31
31
  var import_custom_img_handler = require("./mdast-handlers/custom-img-handler");
32
32
  var import_custom_table_handler = require("./mdast-handlers/custom-table-handler");
33
+ var import_definition_list_handler = require("./mdast-handlers/definition-list-handler");
33
34
  var import_math_handler = require("./mdast-handlers/math-handler");
35
+ var import_sup_sub_handler = require("./mdast-handlers/sup-sub-handler");
36
+ var import_normalize = require("./normalize");
34
37
  var import_hast_utils = require("./utils/hast-utils");
35
38
  const htmlToMdast = (htmlOrHast, options) => {
36
39
  const { extractors, url: defaultUrl, lang: defaultLang } = options || {};
37
40
  const [lang, hast] = typeof htmlOrHast === "string" ? [defaultLang || (0, import_hast_utils.getLangFromStr)(htmlOrHast), (0, import_hast_util_from_html.fromHtml)(htmlOrHast, { fragment: true })] : [defaultLang || (0, import_hast_utils.getLangFromHast)(htmlOrHast), htmlOrHast];
41
+ const isOwned = typeof htmlOrHast === "string" || (options?.owned ?? false);
38
42
  const url = defaultUrl || (0, import_hast_utils.getUrlFromHast)(hast);
39
- const extractedHast = (0, import_extractors.pipeExtractors)({ hast, lang, url }, extractors);
43
+ const extractedHast = (0, import_extractors.pipeExtractors)({ hast, lang, url, owned: isOwned }, extractors);
44
+ (0, import_normalize.normalizeHast)(extractedHast, options?.normalize);
40
45
  const mdast = (0, import_hast_util_to_mdast.toMdast)(extractedHast, {
41
46
  handlers: {
42
47
  math: import_math_handler.mathHandler,
43
48
  div: import_custom_div_handler.customDivHandler,
44
49
  pre: import_custom_code_handler.customCodeHandler,
50
+ dl: import_definition_list_handler.definitionListHandler,
51
+ sup: (0, import_sup_sub_handler.supSubHandler)("sup"),
52
+ sub: (0, import_sup_sub_handler.supSubHandler)("sub"),
45
53
  a: (0, import_custom_a_handler.customAHandler)({ asText: options?.linkAsText }),
46
54
  img: (0, import_custom_img_handler.customImgHandler)({ hideImage: options?.hideImage }),
47
55
  table: (0, import_custom_table_handler.customTableHandler)({ asText: options?.tableAsText })
package/dist/cjs/index.js CHANGED
@@ -18,13 +18,26 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var src_exports = {};
20
20
  __export(src_exports, {
21
+ BUILTIN_ADAPTERS: () => import_adapters.BUILTIN_ADAPTERS,
22
+ adapterById: () => import_adapters.adapterById,
23
+ autoExtractor: () => import_extractors.autoExtractor,
24
+ buildPageSignature: () => import_adapters.buildPageSignature,
25
+ createAutoExtractor: () => import_extractors.createAutoExtractor,
26
+ defineSelectorAdapter: () => import_adapters.defineSelectorAdapter,
27
+ extractMetadata: () => import_metadata.extractMetadata,
21
28
  htmlToMarkdown: () => import_html_to_markdown.htmlToMarkdown,
29
+ htmlToMarkdownWithMetadata: () => import_html_to_markdown.htmlToMarkdownWithMetadata,
22
30
  htmlToMdast: () => import_html_to_mdast.htmlToMdast,
23
31
  mdastSplitter: () => import_md_splitter.mdastSplitter,
24
32
  mdastToMarkdown: () => import_mdast_to_markdown.mdastToMarkdown,
25
33
  minimalFilter: () => import_extractors.minimalFilter,
34
+ normalizeHast: () => import_normalize.normalizeHast,
26
35
  pipeExtractors: () => import_extractors.pipeExtractors,
27
- takumiExtractor: () => import_extractors.takumiExtractor
36
+ resolveAdapter: () => import_adapters.resolveAdapter,
37
+ runAdapters: () => import_adapters.runAdapters,
38
+ takumiExtractor: () => import_extractors.takumiExtractor,
39
+ toFrontmatter: () => import_metadata.toFrontmatter,
40
+ youtubeCaptionTracks: () => import_adapters.youtubeCaptionTracks
28
41
  });
29
42
  module.exports = __toCommonJS(src_exports);
30
43
  var import_html_to_markdown = require("./html-to-markdown");
@@ -32,13 +45,29 @@ var import_md_splitter = require("./md-splitter");
32
45
  var import_html_to_mdast = require("./html-to-mdast");
33
46
  var import_mdast_to_markdown = require("./mdast-to-markdown");
34
47
  var import_extractors = require("./extractors");
48
+ var import_adapters = require("./adapters");
49
+ var import_metadata = require("./metadata");
50
+ var import_normalize = require("./normalize");
35
51
  // Annotate the CommonJS export names for ESM import in node:
36
52
  0 && (module.exports = {
53
+ BUILTIN_ADAPTERS,
54
+ adapterById,
55
+ autoExtractor,
56
+ buildPageSignature,
57
+ createAutoExtractor,
58
+ defineSelectorAdapter,
59
+ extractMetadata,
37
60
  htmlToMarkdown,
61
+ htmlToMarkdownWithMetadata,
38
62
  htmlToMdast,
39
63
  mdastSplitter,
40
64
  mdastToMarkdown,
41
65
  minimalFilter,
66
+ normalizeHast,
42
67
  pipeExtractors,
43
- takumiExtractor
68
+ resolveAdapter,
69
+ runAdapters,
70
+ takumiExtractor,
71
+ toFrontmatter,
72
+ youtubeCaptionTracks
44
73
  });
@@ -23,21 +23,37 @@ __export(custom_a_handler_exports, {
23
23
  module.exports = __toCommonJS(custom_a_handler_exports);
24
24
  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
+ var import_hast_fast = require("../utils/hast-fast");
27
+ const ALLOWED_SCHEMES = /* @__PURE__ */ new Set(["http:", "https:", "mailto:", "tel:", "ftp:", "ftps:"]);
28
+ const isFollowableHref = (href) => {
29
+ const trimmed = href?.trim();
30
+ if (!trimmed) {
31
+ return false;
32
+ }
33
+ const scheme = trimmed.match(/^[a-z][a-z0-9+.-]*:/i)?.[0];
34
+ if (!scheme) {
35
+ return true;
36
+ }
37
+ return ALLOWED_SCHEMES.has(scheme.toLowerCase());
38
+ };
26
39
  const customAHandler = (options) => (state, node) => {
27
- if (options?.asText) {
40
+ const asPlainText = () => {
28
41
  const text = (0, import_hast_util_to_string.toString)(node);
29
- if (3 >= text.length) {
42
+ if (text.length === 0) {
30
43
  return void 0;
31
44
  }
32
- const link2 = { type: "text", value: text };
33
- state.patch(node, link2);
34
- return link2;
45
+ const result = { type: "text", value: text };
46
+ state.patch(node, result);
47
+ return result;
48
+ };
49
+ if (options?.asText) {
50
+ return (0, import_hast_util_to_string.toString)(node).length <= 3 ? void 0 : asPlainText();
35
51
  }
36
- const link = import_hast_util_to_mdast.defaultHandlers.a(state, node);
37
- if (link.children.length > 0) {
38
- return link;
52
+ if (!isFollowableHref((0, import_hast_fast.stringProperty)(node, "href"))) {
53
+ return asPlainText();
39
54
  }
40
- return void 0;
55
+ const link = import_hast_util_to_mdast.defaultHandlers.a(state, node);
56
+ return link.children.length > 0 ? link : void 0;
41
57
  };
42
58
  // Annotate the CommonJS export names for ESM import in node:
43
59
  0 && (module.exports = {
@@ -22,11 +22,33 @@ __export(custom_img_handler_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(custom_img_handler_exports);
24
24
  var import_hast_util_to_mdast = require("hast-util-to-mdast");
25
+ var import_hast_fast = require("../utils/hast-fast");
26
+ const MAX_DATA_URL_LENGTH = 256;
27
+ const hasNoUsableSource = (node) => {
28
+ const src = (0, import_hast_fast.stringProperty)(node, "src")?.trim();
29
+ if (!src) {
30
+ return true;
31
+ }
32
+ if (src.startsWith("data:")) {
33
+ return src.length > MAX_DATA_URL_LENGTH;
34
+ }
35
+ return false;
36
+ };
25
37
  const customImgHandler = (options) => (state, node) => {
26
38
  if (options?.hideImage) {
27
39
  return void 0;
28
40
  }
29
- return import_hast_util_to_mdast.defaultHandlers.image(state, node);
41
+ if (hasNoUsableSource(node)) {
42
+ return void 0;
43
+ }
44
+ const image = import_hast_util_to_mdast.defaultHandlers.image(state, node);
45
+ if (!image.alt) {
46
+ const title = (0, import_hast_fast.stringProperty)(node, "title");
47
+ if (title) {
48
+ image.alt = title;
49
+ }
50
+ }
51
+ return image;
30
52
  };
31
53
  // Annotate the CommonJS export names for ESM import in node:
32
54
  0 && (module.exports = {
@@ -23,12 +23,28 @@ __export(custom_table_handler_exports, {
23
23
  module.exports = __toCommonJS(custom_table_handler_exports);
24
24
  var import_hast_util_to_mdast = require("hast-util-to-mdast");
25
25
  var import_hast_util_to_text = require("hast-util-to-text");
26
+ var import_hast_fast = require("../utils/hast-fast");
27
+ const MAX_SPAN = 1e3;
28
+ const clampSpans = (node) => {
29
+ (0, import_hast_fast.walk)(node, (candidate) => {
30
+ if (!(0, import_hast_fast.isElement)(candidate) || candidate.tagName !== "td" && candidate.tagName !== "th") {
31
+ return;
32
+ }
33
+ for (const attribute of ["colSpan", "rowSpan"]) {
34
+ const span = (0, import_hast_fast.numericProperty)(candidate, attribute);
35
+ if (span !== void 0 && span > MAX_SPAN) {
36
+ candidate.properties[attribute] = MAX_SPAN;
37
+ }
38
+ }
39
+ });
40
+ };
26
41
  const customTableHandler = (options) => (state, node) => {
27
42
  if (options?.asText) {
28
43
  const paragraph = { type: "paragraph", children: [{ type: "text", value: (0, import_hast_util_to_text.toText)(node) }] };
29
44
  state.patch(node, paragraph);
30
45
  return paragraph;
31
46
  }
47
+ clampSpans(node);
32
48
  return import_hast_util_to_mdast.defaultHandlers.table(state, node);
33
49
  };
34
50
  // Annotate the CommonJS export names for ESM import in node:
@@ -0,0 +1,99 @@
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 definition_list_handler_exports = {};
20
+ __export(definition_list_handler_exports, {
21
+ definitionListHandler: () => definitionListHandler
22
+ });
23
+ module.exports = __toCommonJS(definition_list_handler_exports);
24
+ const hoistBoundaryWhitespace = (nodes) => {
25
+ const result = [];
26
+ for (const node of nodes) {
27
+ if (node.type !== "emphasis" && node.type !== "strong") {
28
+ result.push(node);
29
+ continue;
30
+ }
31
+ node.children = hoistBoundaryWhitespace(node.children);
32
+ const first = node.children[0];
33
+ if (first?.type === "text" && /^\s/.test(first.value)) {
34
+ result.push({ type: "text", value: " " });
35
+ first.value = first.value.replace(/^\s+/, "");
36
+ }
37
+ let trailing = false;
38
+ const last = node.children[node.children.length - 1];
39
+ if (last?.type === "text" && /\s$/.test(last.value)) {
40
+ last.value = last.value.replace(/\s+$/, "");
41
+ trailing = true;
42
+ }
43
+ node.children = node.children.filter((child) => !(child.type === "text" && child.value.length === 0));
44
+ if (node.children.length > 0) {
45
+ result.push(node);
46
+ }
47
+ if (trailing) {
48
+ result.push({ type: "text", value: " " });
49
+ }
50
+ }
51
+ return result;
52
+ };
53
+ const definitionListHandler = (state, node) => {
54
+ const items = [];
55
+ let current;
56
+ const flush = () => {
57
+ if (!current) {
58
+ return;
59
+ }
60
+ const heading = {
61
+ type: "paragraph",
62
+ children: current.term.length > 0 ? [{ type: "strong", children: current.term }] : []
63
+ };
64
+ items.push({ type: "listItem", spread: false, children: [heading, ...current.definitions] });
65
+ current = void 0;
66
+ };
67
+ for (const child of node.children) {
68
+ if (child.type !== "element") {
69
+ continue;
70
+ }
71
+ const element = child;
72
+ if (element.tagName === "dt") {
73
+ if (current && current.definitions.length > 0) {
74
+ flush();
75
+ }
76
+ const phrasing = hoistBoundaryWhitespace(state.all(element));
77
+ current = current ? { term: [...current.term, { type: "text", value: ", " }, ...phrasing], definitions: [] } : { term: phrasing, definitions: [] };
78
+ continue;
79
+ }
80
+ if (element.tagName === "dd") {
81
+ if (!current) {
82
+ current = { term: [], definitions: [] };
83
+ }
84
+ const content = state.toFlow(state.all(element));
85
+ current.definitions.push(...content);
86
+ }
87
+ }
88
+ flush();
89
+ if (items.length === 0) {
90
+ return void 0;
91
+ }
92
+ const result = { type: "list", ordered: false, spread: false, children: items };
93
+ state.patch(node, result);
94
+ return result;
95
+ };
96
+ // Annotate the CommonJS export names for ESM import in node:
97
+ 0 && (module.exports = {
98
+ definitionListHandler
99
+ });
@@ -23,10 +23,19 @@ __export(math_handler_exports, {
23
23
  module.exports = __toCommonJS(math_handler_exports);
24
24
  var import_hast_util_to_html = require("hast-util-to-html");
25
25
  var import_mathml_to_latex = require("mathml-to-latex");
26
+ var import_hast_fast = require("../utils/hast-fast");
27
+ const readAnnotation = (node) => {
28
+ const alttext = (0, import_hast_fast.stringProperty)(node, "alttext");
29
+ if (!alttext) {
30
+ return void 0;
31
+ }
32
+ const unwrapped = alttext.trim().replace(/^\{\\displaystyle\s*([\s\S]*)\}$/, "$1").trim();
33
+ return unwrapped.length > 0 ? unwrapped : void 0;
34
+ };
35
+ const isDisplayMath = (node) => (0, import_hast_fast.stringProperty)(node, "display") === "block";
26
36
  const mathHandler = (state, node) => {
27
- const mathMl = (0, import_hast_util_to_html.toHtml)(node);
28
- const latex = import_mathml_to_latex.MathMLToLaTeX.convert(mathMl);
29
- const result = { type: "inlineMath", value: latex };
37
+ const latex = readAnnotation(node) ?? import_mathml_to_latex.MathMLToLaTeX.convert((0, import_hast_util_to_html.toHtml)(node));
38
+ const result = isDisplayMath(node) ? { type: "math", value: latex, meta: null } : { type: "inlineMath", value: latex };
30
39
  state.patch(node, result);
31
40
  return result;
32
41
  };
@@ -0,0 +1,39 @@
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 sup_sub_handler_exports = {};
20
+ __export(sup_sub_handler_exports, {
21
+ supSubHandler: () => supSubHandler
22
+ });
23
+ module.exports = __toCommonJS(sup_sub_handler_exports);
24
+ var import_hast_util_to_string = require("hast-util-to-string");
25
+ const MAX_ANNOTATION_LENGTH = 32;
26
+ const supSubHandler = (tagName) => (state, node) => {
27
+ const inner = (0, import_hast_util_to_string.toString)(node).trim();
28
+ if (inner.length === 0 || inner.length > MAX_ANNOTATION_LENGTH) {
29
+ return state.all(node);
30
+ }
31
+ const escaped = inner.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
32
+ const result = { type: "html", value: `<${tagName}>${escaped}</${tagName}>` };
33
+ state.patch(node, result);
34
+ return result;
35
+ };
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {
38
+ supSubHandler
39
+ });
@@ -0,0 +1,223 @@
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 metadata_exports = {};
20
+ __export(metadata_exports, {
21
+ extractMetadata: () => extractMetadata,
22
+ readJsonLd: () => readJsonLd,
23
+ toFrontmatter: () => toFrontmatter
24
+ });
25
+ module.exports = __toCommonJS(metadata_exports);
26
+ var import_hast_fast = require("../utils/hast-fast");
27
+ const readMetaTags = (tree) => {
28
+ const tags = /* @__PURE__ */ new Map();
29
+ for (const meta of (0, import_hast_fast.collectElements)(tree, (element) => element.tagName === "meta")) {
30
+ const key = (0, import_hast_fast.stringProperty)(meta, "property") ?? (0, import_hast_fast.stringProperty)(meta, "name") ?? (0, import_hast_fast.stringProperty)(meta, "itemprop");
31
+ const content = (0, import_hast_fast.stringProperty)(meta, "content");
32
+ if (!(key && content)) {
33
+ continue;
34
+ }
35
+ const normalized = key.toLowerCase();
36
+ if (!tags.has(normalized)) {
37
+ tags.set(normalized, content);
38
+ }
39
+ }
40
+ return tags;
41
+ };
42
+ const readJsonLd = (tree) => {
43
+ const entries = [];
44
+ for (const script of (0, import_hast_fast.collectElements)(tree, (element) => element.tagName === "script")) {
45
+ const type = (0, import_hast_fast.stringProperty)(script, "type");
46
+ if (type?.toLowerCase() !== "application/ld+json") {
47
+ continue;
48
+ }
49
+ const source = script.children.map((child) => child.type === "text" ? child.value : "").join("").trim();
50
+ if (source.length === 0) {
51
+ continue;
52
+ }
53
+ let parsed;
54
+ try {
55
+ parsed = JSON.parse(source);
56
+ } catch {
57
+ continue;
58
+ }
59
+ for (const entry of flattenJsonLd(parsed)) {
60
+ entries.push(entry);
61
+ }
62
+ }
63
+ return entries;
64
+ };
65
+ const flattenJsonLd = (value) => {
66
+ if (Array.isArray(value)) {
67
+ return value.flatMap(flattenJsonLd);
68
+ }
69
+ if (typeof value !== "object" || value === null) {
70
+ return [];
71
+ }
72
+ const record = value;
73
+ const graph = record["@graph"];
74
+ if (graph) {
75
+ return flattenJsonLd(graph);
76
+ }
77
+ return [record];
78
+ };
79
+ const ARTICLE_TYPES = /* @__PURE__ */ new Set([
80
+ "article",
81
+ "newsarticle",
82
+ "blogposting",
83
+ "techarticle",
84
+ "scholarlyarticle",
85
+ "report",
86
+ "webpage"
87
+ ]);
88
+ const jsonLdType = (entry) => {
89
+ const type = entry["@type"];
90
+ if (typeof type === "string") {
91
+ return [type.toLowerCase()];
92
+ }
93
+ if (Array.isArray(type)) {
94
+ return type.filter((value) => typeof value === "string").map((value) => value.toLowerCase());
95
+ }
96
+ return [];
97
+ };
98
+ const readName = (value) => {
99
+ if (typeof value === "string") {
100
+ return value;
101
+ }
102
+ if (Array.isArray(value)) {
103
+ for (const entry of value) {
104
+ const name = readName(entry);
105
+ if (name) {
106
+ return name;
107
+ }
108
+ }
109
+ return void 0;
110
+ }
111
+ if (typeof value === "object" && value !== null) {
112
+ const name = value.name;
113
+ return typeof name === "string" ? name : void 0;
114
+ }
115
+ return void 0;
116
+ };
117
+ const asString = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
118
+ const MAX_TITLE_LENGTH = 160;
119
+ const asTitle = (value) => {
120
+ const cleaned = clean(value);
121
+ return cleaned && cleaned.length <= MAX_TITLE_LENGTH ? cleaned : void 0;
122
+ };
123
+ const clean = (value) => {
124
+ if (value === void 0) {
125
+ return void 0;
126
+ }
127
+ const trimmed = value.replace(/\s+/g, " ").trim();
128
+ return trimmed.length > 0 ? trimmed : void 0;
129
+ };
130
+ const documentTitle = (tree) => {
131
+ const title = (0, import_hast_fast.findElement)(tree, (element) => element.tagName === "title");
132
+ if (!title) {
133
+ return void 0;
134
+ }
135
+ return title.children.map((child) => child.type === "text" ? child.value : "").join("");
136
+ };
137
+ const firstHeading = (tree) => {
138
+ const heading = (0, import_hast_fast.findElement)(tree, (element) => element.tagName === "h1");
139
+ if (!heading) {
140
+ return void 0;
141
+ }
142
+ let text = "";
143
+ (0, import_hast_fast.walk)(heading, (node) => {
144
+ if (node.type === "text") {
145
+ text += node.value;
146
+ }
147
+ });
148
+ return text;
149
+ };
150
+ const linkHref = (tree, rel) => {
151
+ const link = (0, import_hast_fast.findElement)(
152
+ tree,
153
+ (element) => element.tagName === "link" && ((0, import_hast_fast.stringProperty)(element, "rel") ?? "").toLowerCase().includes(rel)
154
+ );
155
+ return link ? (0, import_hast_fast.stringProperty)(link, "href") : void 0;
156
+ };
157
+ const documentLang = (tree) => {
158
+ const html = (0, import_hast_fast.findElement)(tree, (element) => element.tagName === "html");
159
+ if (html) {
160
+ const declared = (0, import_hast_fast.stringProperty)(html, "lang") ?? (0, import_hast_fast.stringProperty)(html, "xml:lang");
161
+ if (declared) {
162
+ return declared;
163
+ }
164
+ }
165
+ if ((0, import_hast_fast.isElement)(tree)) {
166
+ const own = (0, import_hast_fast.stringProperty)(tree, "lang");
167
+ if (own) {
168
+ return own;
169
+ }
170
+ }
171
+ const tagged = (0, import_hast_fast.findElement)(tree, (element) => Boolean((0, import_hast_fast.stringProperty)(element, "lang")));
172
+ return tagged ? (0, import_hast_fast.stringProperty)(tagged, "lang") : void 0;
173
+ };
174
+ const extractMetadata = (tree) => {
175
+ const meta = readMetaTags(tree);
176
+ const jsonLd = readJsonLd(tree);
177
+ const article = jsonLd.find((entry) => jsonLdType(entry).some((type) => ARTICLE_TYPES.has(type))) ?? jsonLd[0];
178
+ const get = (...keys) => {
179
+ for (const key of keys) {
180
+ const value = meta.get(key);
181
+ if (value) {
182
+ return value;
183
+ }
184
+ }
185
+ return void 0;
186
+ };
187
+ const title = asTitle(get("og:title", "twitter:title")) ?? asTitle(asString(article?.headline)) ?? asTitle(asString(article?.name)) ?? asTitle(documentTitle(tree)) ?? asTitle(firstHeading(tree));
188
+ return {
189
+ title,
190
+ description: clean(get("og:description", "twitter:description", "description")) ?? clean(asString(article?.description)),
191
+ author: clean(readName(article?.author)) ?? clean(get("author", "article:author", "twitter:creator")),
192
+ published: clean(asString(article?.datePublished)) ?? clean(get("article:published_time", "date", "pubdate")),
193
+ modified: clean(asString(article?.dateModified)) ?? clean(get("article:modified_time", "og:updated_time")),
194
+ siteName: clean(get("og:site_name", "application-name")) ?? clean(readName(article?.publisher)),
195
+ canonicalUrl: clean(linkHref(tree, "canonical")) ?? clean(get("og:url", "twitter:url")),
196
+ lang: clean(documentLang(tree)),
197
+ image: clean(get("og:image", "twitter:image", "twitter:image:src")),
198
+ type: clean(get("og:type"))
199
+ };
200
+ };
201
+ const yamlString = (value) => `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
202
+ const toFrontmatter = (metadata) => {
203
+ const lines = [];
204
+ for (const [key, value] of Object.entries(metadata)) {
205
+ if (typeof value === "string" && value.length > 0) {
206
+ lines.push(`${key}: ${yamlString(value)}`);
207
+ }
208
+ }
209
+ if (lines.length === 0) {
210
+ return "";
211
+ }
212
+ return `---
213
+ ${lines.join("\n")}
214
+ ---
215
+
216
+ `;
217
+ };
218
+ // Annotate the CommonJS export names for ESM import in node:
219
+ 0 && (module.exports = {
220
+ extractMetadata,
221
+ readJsonLd,
222
+ toFrontmatter
223
+ });