@intentic/webq 1.317.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +46 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +38 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/cache.command.d.ts +3 -0
- package/dist/commands/cache.command.d.ts.map +1 -0
- package/dist/commands/cache.command.js +54 -0
- package/dist/commands/cache.command.js.map +1 -0
- package/dist/commands/crawl.command.d.ts +3 -0
- package/dist/commands/crawl.command.d.ts.map +1 -0
- package/dist/commands/crawl.command.js +77 -0
- package/dist/commands/crawl.command.js.map +1 -0
- package/dist/commands/fetch.command.d.ts +3 -0
- package/dist/commands/fetch.command.d.ts.map +1 -0
- package/dist/commands/fetch.command.js +55 -0
- package/dist/commands/fetch.command.js.map +1 -0
- package/dist/lib/bm25.d.ts +7 -0
- package/dist/lib/bm25.d.ts.map +1 -0
- package/dist/lib/bm25.js +51 -0
- package/dist/lib/bm25.js.map +1 -0
- package/dist/lib/browser.d.ts +8 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +29 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/cache.d.ts +15 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +28 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/crawl.d.ts +31 -0
- package/dist/lib/crawl.d.ts.map +1 -0
- package/dist/lib/crawl.js +188 -0
- package/dist/lib/crawl.js.map +1 -0
- package/dist/lib/dom.d.ts +23 -0
- package/dist/lib/dom.d.ts.map +1 -0
- package/dist/lib/dom.js +74 -0
- package/dist/lib/dom.js.map +1 -0
- package/dist/lib/env.d.ts +2 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +4 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/flags.d.ts +69 -0
- package/dist/lib/flags.d.ts.map +1 -0
- package/dist/lib/flags.js +23 -0
- package/dist/lib/flags.js.map +1 -0
- package/dist/lib/http.d.ts +16 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +75 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/links.d.ts +9 -0
- package/dist/lib/links.d.ts.map +1 -0
- package/dist/lib/links.js +41 -0
- package/dist/lib/links.js.map +1 -0
- package/dist/lib/markdown.d.ts +6 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +292 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/output.d.ts +20 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +64 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/page.d.ts +26 -0
- package/dist/lib/page.d.ts.map +1 -0
- package/dist/lib/page.js +153 -0
- package/dist/lib/page.js.map +1 -0
- package/dist/lib/prune.d.ts +7 -0
- package/dist/lib/prune.d.ts.map +1 -0
- package/dist/lib/prune.js +100 -0
- package/dist/lib/prune.js.map +1 -0
- package/dist/lib/robots.d.ts +10 -0
- package/dist/lib/robots.d.ts.map +1 -0
- package/dist/lib/robots.js +84 -0
- package/dist/lib/robots.js.map +1 -0
- package/dist/lib/sitemap.d.ts +9 -0
- package/dist/lib/sitemap.d.ts.map +1 -0
- package/dist/lib/sitemap.js +61 -0
- package/dist/lib/sitemap.js.map +1 -0
- package/dist/lib/version.d.ts +2 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +3 -0
- package/dist/lib/version.js.map +1 -0
- package/package.json +69 -0
- package/src/app.ts +43 -0
- package/src/cli.integration.test.ts +191 -0
- package/src/cli.ts +6 -0
- package/src/commands/cache.command.ts +54 -0
- package/src/commands/crawl.command.ts +94 -0
- package/src/commands/fetch.command.ts +61 -0
- package/src/lib/bm25.test.ts +33 -0
- package/src/lib/bm25.ts +70 -0
- package/src/lib/browser.ts +42 -0
- package/src/lib/cache.ts +44 -0
- package/src/lib/crawl.ts +247 -0
- package/src/lib/dom.ts +107 -0
- package/src/lib/env.ts +6 -0
- package/src/lib/flags.ts +41 -0
- package/src/lib/http.ts +101 -0
- package/src/lib/links.test.ts +37 -0
- package/src/lib/links.ts +47 -0
- package/src/lib/markdown.test.ts +76 -0
- package/src/lib/markdown.ts +337 -0
- package/src/lib/output.test.ts +16 -0
- package/src/lib/output.ts +86 -0
- package/src/lib/page.ts +213 -0
- package/src/lib/prune.test.ts +78 -0
- package/src/lib/prune.ts +133 -0
- package/src/lib/robots.test.ts +52 -0
- package/src/lib/robots.ts +102 -0
- package/src/lib/sitemap.test.ts +37 -0
- package/src/lib/sitemap.ts +74 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { attr, isElement, isText, rawTextOf } from "./dom.js";
|
|
2
|
+
const NON_CONTENT = new Set(["script", "style", "noscript", "template", "svg", "canvas", "iframe", "object", "embed", "link", "meta", "head"]);
|
|
3
|
+
const INLINE = {
|
|
4
|
+
strong: { open: "**", close: "**" },
|
|
5
|
+
b: { open: "**", close: "**" },
|
|
6
|
+
em: { open: "*", close: "*" },
|
|
7
|
+
i: { open: "*", close: "*" },
|
|
8
|
+
del: { open: "~~", close: "~~" },
|
|
9
|
+
s: { open: "~~", close: "~~" },
|
|
10
|
+
strike: { open: "~~", close: "~~" },
|
|
11
|
+
kbd: { open: "`", close: "`" },
|
|
12
|
+
};
|
|
13
|
+
const HEADINGS = { h1: 1, h2: 2, h3: 3, h4: 4, h5: 5, h6: 6 };
|
|
14
|
+
export const renderMarkdown = (root, options = {}) => {
|
|
15
|
+
const blocks = renderFlow(root.childNodes, options);
|
|
16
|
+
return `${blocks
|
|
17
|
+
.join("\n\n")
|
|
18
|
+
.replaceAll(/[ \t]+$/gm, "")
|
|
19
|
+
.replaceAll(/\n{3,}/g, "\n\n")
|
|
20
|
+
.trim()}\n`;
|
|
21
|
+
};
|
|
22
|
+
const renderFlow = (nodes, options) => {
|
|
23
|
+
const blocks = [];
|
|
24
|
+
let run = "";
|
|
25
|
+
const flush = () => {
|
|
26
|
+
const paragraph = collapse(run);
|
|
27
|
+
if (paragraph !== "") {
|
|
28
|
+
blocks.push(paragraph);
|
|
29
|
+
}
|
|
30
|
+
run = "";
|
|
31
|
+
};
|
|
32
|
+
for (const node of nodes) {
|
|
33
|
+
if (isText(node)) {
|
|
34
|
+
run += node.value;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (!isElement(node) || NON_CONTENT.has(node.tagName)) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const block = renderBlock(node, options);
|
|
41
|
+
if (block === undefined) {
|
|
42
|
+
run += renderInline(node, options);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
flush();
|
|
46
|
+
if (block !== "") {
|
|
47
|
+
blocks.push(block);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
flush();
|
|
52
|
+
return blocks;
|
|
53
|
+
};
|
|
54
|
+
const renderBlock = (el, options) => {
|
|
55
|
+
const heading = HEADINGS[el.tagName];
|
|
56
|
+
if (heading !== undefined) {
|
|
57
|
+
const text = collapse(renderInlineChildren(el, options));
|
|
58
|
+
return text === "" ? "" : `${"#".repeat(heading)} ${text}`;
|
|
59
|
+
}
|
|
60
|
+
switch (el.tagName) {
|
|
61
|
+
case "p":
|
|
62
|
+
return collapse(renderInlineChildren(el, options));
|
|
63
|
+
case "ul":
|
|
64
|
+
case "ol":
|
|
65
|
+
return renderList(el, options, 0);
|
|
66
|
+
case "pre":
|
|
67
|
+
return renderPre(el);
|
|
68
|
+
case "blockquote":
|
|
69
|
+
return renderFlow(el.childNodes, options)
|
|
70
|
+
.join("\n\n")
|
|
71
|
+
.split("\n")
|
|
72
|
+
.map((line) => `> ${line}`.trimEnd())
|
|
73
|
+
.join("\n");
|
|
74
|
+
case "table":
|
|
75
|
+
return renderTable(el, options);
|
|
76
|
+
case "hr":
|
|
77
|
+
return "---";
|
|
78
|
+
case "figure": {
|
|
79
|
+
const caption = el.childNodes.filter(isElement).find((child) => child.tagName === "figcaption");
|
|
80
|
+
const body = renderFlow(el.childNodes.filter((child) => !(isElement(child) && child.tagName === "figcaption")), options);
|
|
81
|
+
const captionText = caption === undefined ? "" : collapse(renderInlineChildren(caption, options));
|
|
82
|
+
return [body.join("\n\n"), captionText === "" ? "" : `*${captionText}*`].filter(Boolean).join("\n\n");
|
|
83
|
+
}
|
|
84
|
+
case "dl":
|
|
85
|
+
return renderDefinitionList(el, options);
|
|
86
|
+
case "details": {
|
|
87
|
+
const summary = el.childNodes.filter(isElement).find((child) => child.tagName === "summary");
|
|
88
|
+
const rest = renderFlow(el.childNodes.filter((child) => !(isElement(child) && child.tagName === "summary")), options);
|
|
89
|
+
const label = summary === undefined ? "" : `**${collapse(renderInlineChildren(summary, options))}**`;
|
|
90
|
+
return [label, rest.join("\n\n")].filter(Boolean).join("\n\n");
|
|
91
|
+
}
|
|
92
|
+
case "div":
|
|
93
|
+
case "section":
|
|
94
|
+
case "article":
|
|
95
|
+
case "main":
|
|
96
|
+
case "body":
|
|
97
|
+
case "aside":
|
|
98
|
+
case "header":
|
|
99
|
+
case "footer":
|
|
100
|
+
case "nav":
|
|
101
|
+
case "form":
|
|
102
|
+
case "fieldset":
|
|
103
|
+
case "address":
|
|
104
|
+
case "center":
|
|
105
|
+
return renderFlow(el.childNodes, options).join("\n\n");
|
|
106
|
+
default:
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const renderInlineChildren = (el, options) => el.childNodes.map((child) => (isText(child) ? child.value : isElement(child) ? renderInline(child, options) : "")).join("");
|
|
111
|
+
const renderInline = (el, options) => {
|
|
112
|
+
if (NON_CONTENT.has(el.tagName)) {
|
|
113
|
+
return "";
|
|
114
|
+
}
|
|
115
|
+
if (el.tagName === "br") {
|
|
116
|
+
return BR;
|
|
117
|
+
}
|
|
118
|
+
if (el.tagName === "img") {
|
|
119
|
+
return renderImage(el, options);
|
|
120
|
+
}
|
|
121
|
+
if (el.tagName === "a") {
|
|
122
|
+
return renderLink(el, options);
|
|
123
|
+
}
|
|
124
|
+
if (el.tagName === "code") {
|
|
125
|
+
const code = rawTextOf(el).trim();
|
|
126
|
+
return code.includes("`") ? `\`\` ${code} \`\`` : `\`${code}\``;
|
|
127
|
+
}
|
|
128
|
+
const wrap = INLINE[el.tagName];
|
|
129
|
+
const inner = renderInlineChildren(el, options);
|
|
130
|
+
if (wrap === undefined) {
|
|
131
|
+
return inner;
|
|
132
|
+
}
|
|
133
|
+
const trimmed = collapse(inner);
|
|
134
|
+
return trimmed === "" ? "" : `${wrap.open}${trimmed}${wrap.close}`;
|
|
135
|
+
};
|
|
136
|
+
const renderLink = (el, options) => {
|
|
137
|
+
const text = collapse(renderInlineChildren(el, options));
|
|
138
|
+
const href = resolveUrl(attr(el, "href"), options.baseUrl);
|
|
139
|
+
if (href === undefined || href.startsWith("javascript:")) {
|
|
140
|
+
return text;
|
|
141
|
+
}
|
|
142
|
+
if (href.startsWith("mailto:") || href.startsWith("tel:")) {
|
|
143
|
+
return text === "" ? href.slice(href.indexOf(":") + 1) : text;
|
|
144
|
+
}
|
|
145
|
+
if (text === "") {
|
|
146
|
+
return "";
|
|
147
|
+
}
|
|
148
|
+
return `[${text}](${href})`;
|
|
149
|
+
};
|
|
150
|
+
const renderImage = (el, options) => {
|
|
151
|
+
const alt = attr(el, "alt")?.trim() ?? "";
|
|
152
|
+
const src = resolveUrl(attr(el, "src"), options.baseUrl);
|
|
153
|
+
if (src === undefined || src.startsWith("data:")) {
|
|
154
|
+
return alt;
|
|
155
|
+
}
|
|
156
|
+
return ``;
|
|
157
|
+
};
|
|
158
|
+
const renderList = (el, options, depth) => {
|
|
159
|
+
const ordered = el.tagName === "ol";
|
|
160
|
+
const start = Number(attr(el, "start") ?? "1");
|
|
161
|
+
const items = el.childNodes.filter(isElement).filter((child) => child.tagName === "li");
|
|
162
|
+
const lines = [];
|
|
163
|
+
items.forEach((item, index) => {
|
|
164
|
+
const marker = ordered ? `${start + index}. ` : "- ";
|
|
165
|
+
const indent = " ".repeat(depth);
|
|
166
|
+
const nested = [];
|
|
167
|
+
const inlineParts = [];
|
|
168
|
+
for (const child of item.childNodes) {
|
|
169
|
+
if (isElement(child) && (child.tagName === "ul" || child.tagName === "ol")) {
|
|
170
|
+
nested.push(renderList(child, options, depth + 1));
|
|
171
|
+
}
|
|
172
|
+
else if (isElement(child) && renderBlock(child, options) !== undefined) {
|
|
173
|
+
const block = renderBlock(child, options) ?? "";
|
|
174
|
+
if (block !== "") {
|
|
175
|
+
nested.push(block
|
|
176
|
+
.split("\n")
|
|
177
|
+
.map((line) => `${indent} ${line}`.trimEnd())
|
|
178
|
+
.join("\n"));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else if (isText(child)) {
|
|
182
|
+
inlineParts.push(child.value);
|
|
183
|
+
}
|
|
184
|
+
else if (isElement(child)) {
|
|
185
|
+
inlineParts.push(renderInline(child, options));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
lines.push(`${indent}${marker}${collapse(inlineParts.join(""))}`);
|
|
189
|
+
lines.push(...nested);
|
|
190
|
+
});
|
|
191
|
+
return lines.join("\n");
|
|
192
|
+
};
|
|
193
|
+
const renderPre = (el) => {
|
|
194
|
+
const codeChild = el.childNodes.filter(isElement).find((child) => child.tagName === "code");
|
|
195
|
+
const classes = `${attr(el, "class") ?? ""} ${codeChild === undefined ? "" : (attr(codeChild, "class") ?? "")}`;
|
|
196
|
+
const lang = /(?:language|lang)-([\w+-]+)/.exec(classes)?.[1] ?? "";
|
|
197
|
+
const code = preTextOf(el).replace(/^\n/, "").trimEnd();
|
|
198
|
+
const longestRun = Math.max(2, ...[...code.matchAll(/`+/g)].map((m) => m[0].length));
|
|
199
|
+
const fence = "`".repeat(Math.max(3, longestRun + 1));
|
|
200
|
+
return `${fence}${lang}\n${code}\n${fence}`;
|
|
201
|
+
};
|
|
202
|
+
const PRE_LINE = new Set(["div", "p", "li", "tr", "section", "article", "table", "tbody", "ul", "ol", "h1", "h2", "h3", "h4", "h5", "h6"]);
|
|
203
|
+
const preTextOf = (node) => {
|
|
204
|
+
if (isText(node)) {
|
|
205
|
+
return node.value;
|
|
206
|
+
}
|
|
207
|
+
if (!isElement(node) || NON_CONTENT.has(node.tagName)) {
|
|
208
|
+
return "";
|
|
209
|
+
}
|
|
210
|
+
if (node.tagName === "br") {
|
|
211
|
+
return "\n";
|
|
212
|
+
}
|
|
213
|
+
let text = "";
|
|
214
|
+
let afterLine = false;
|
|
215
|
+
for (const child of node.childNodes) {
|
|
216
|
+
if (isElement(child) && PRE_LINE.has(child.tagName)) {
|
|
217
|
+
if (text !== "" && !text.endsWith("\n")) {
|
|
218
|
+
text += "\n";
|
|
219
|
+
}
|
|
220
|
+
text += `${preTextOf(child).replace(/\n$/, "")}\n`;
|
|
221
|
+
afterLine = true;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (afterLine && isText(child) && /^\r?\n$/.test(child.value)) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
text += preTextOf(child);
|
|
228
|
+
afterLine = false;
|
|
229
|
+
}
|
|
230
|
+
return text;
|
|
231
|
+
};
|
|
232
|
+
const renderTable = (el, options) => {
|
|
233
|
+
const rows = [];
|
|
234
|
+
for (const tr of collectRows(el)) {
|
|
235
|
+
const cells = tr.childNodes.filter(isElement).filter((cell) => cell.tagName === "td" || cell.tagName === "th");
|
|
236
|
+
rows.push(cells.map((cell) => collapse(renderInlineChildren(cell, options)).replaceAll("|", "\\|").replaceAll("\n", " ")));
|
|
237
|
+
}
|
|
238
|
+
if (rows.length === 0) {
|
|
239
|
+
return "";
|
|
240
|
+
}
|
|
241
|
+
const width = Math.max(...rows.map((row) => row.length));
|
|
242
|
+
const pad = (row) => [...row, ...Array.from({ length: width - row.length }, () => "")];
|
|
243
|
+
const [header, ...body] = rows.map(pad);
|
|
244
|
+
return [tableRow(header), tableRow(header.map(() => "---")), ...body.map(tableRow)].join("\n");
|
|
245
|
+
};
|
|
246
|
+
const tableRow = (cells) => `| ${cells.join(" | ")} |`;
|
|
247
|
+
const collectRows = (el) => {
|
|
248
|
+
const rows = [];
|
|
249
|
+
for (const child of el.childNodes.filter(isElement)) {
|
|
250
|
+
if (child.tagName === "tr") {
|
|
251
|
+
rows.push(child);
|
|
252
|
+
}
|
|
253
|
+
else if (child.tagName === "thead" || child.tagName === "tbody" || child.tagName === "tfoot") {
|
|
254
|
+
rows.push(...child.childNodes.filter(isElement).filter((row) => row.tagName === "tr"));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return rows;
|
|
258
|
+
};
|
|
259
|
+
const renderDefinitionList = (el, options) => {
|
|
260
|
+
const lines = [];
|
|
261
|
+
for (const child of el.childNodes.filter(isElement)) {
|
|
262
|
+
if (child.tagName === "dt") {
|
|
263
|
+
lines.push(`**${collapse(renderInlineChildren(child, options))}**`);
|
|
264
|
+
}
|
|
265
|
+
else if (child.tagName === "dd") {
|
|
266
|
+
lines.push(`: ${collapse(renderInlineChildren(child, options))}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return lines.join("\n");
|
|
270
|
+
};
|
|
271
|
+
const resolveUrl = (raw, base) => {
|
|
272
|
+
if (raw === undefined || raw === "") {
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
const trimmed = raw.trim();
|
|
276
|
+
if (/^(?:javascript|mailto|tel|data):/i.test(trimmed)) {
|
|
277
|
+
return trimmed;
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
return base === undefined ? trimmed : new URL(trimmed, base).href;
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
const BR = "\u0001";
|
|
287
|
+
const collapse = (text) => text
|
|
288
|
+
.split(BR)
|
|
289
|
+
.map((part) => part.replaceAll(/\s+/g, " ").trim())
|
|
290
|
+
.join("\n")
|
|
291
|
+
.trim();
|
|
292
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/lib/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PageResult } from "./page.js";
|
|
2
|
+
export interface SavedPage {
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly tokens: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const slugFor: (url: string) => string;
|
|
7
|
+
export declare const savePage: (outDir: string, page: PageResult, fetchedAt: Date) => Promise<SavedPage>;
|
|
8
|
+
export interface IndexEntry {
|
|
9
|
+
readonly url: string;
|
|
10
|
+
readonly title: string;
|
|
11
|
+
readonly path: string;
|
|
12
|
+
readonly tokens: number;
|
|
13
|
+
readonly depth: number;
|
|
14
|
+
}
|
|
15
|
+
export interface CrawlIndex {
|
|
16
|
+
readonly markdownPath: string;
|
|
17
|
+
readonly jsonPath: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const saveIndex: (outDir: string, startUrl: string, entries: IndexEntry[], skipped: Record<string, number>) => Promise<CrawlIndex>;
|
|
20
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,OAAO,QAAS,MAAM,KAAG,MAerC,CAAC;AAEF,eAAO,MAAM,QAAQ,WAAkB,MAAM,QAAQ,UAAU,aAAa,IAAI,KAAG,OAAO,CAAC,SAAS,CAiBnG,CAAC;AAEF,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC7B;AAGD,eAAO,MAAM,SAAS,WAAkB,MAAM,YAAY,MAAM,WAAW,UAAU,EAAE,WAAW,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,UAAU,CAuB5I,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { estimateTokens } from "@intentic/base/format";
|
|
5
|
+
export const slugFor = (url) => {
|
|
6
|
+
const hash = createHash("sha256").update(url).digest("hex").slice(0, 8);
|
|
7
|
+
let readable;
|
|
8
|
+
try {
|
|
9
|
+
const parsed = new URL(url);
|
|
10
|
+
readable = `${parsed.host}${parsed.pathname}`;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
readable = url;
|
|
14
|
+
}
|
|
15
|
+
const slug = readable
|
|
16
|
+
.toLowerCase()
|
|
17
|
+
.replaceAll(/[^a-z0-9]+/g, "-")
|
|
18
|
+
.replaceAll(/^-+|-+$/g, "")
|
|
19
|
+
.slice(0, 80);
|
|
20
|
+
return `${slug === "" ? "page" : slug}-${hash}.md`;
|
|
21
|
+
};
|
|
22
|
+
export const savePage = async (outDir, page, fetchedAt) => {
|
|
23
|
+
await mkdir(outDir, { recursive: true });
|
|
24
|
+
const path = join(outDir, slugFor(page.url));
|
|
25
|
+
const frontMatter = [
|
|
26
|
+
"---",
|
|
27
|
+
`url: ${page.url}`,
|
|
28
|
+
...(page.finalUrl === page.url ? [] : [`final_url: ${page.finalUrl}`]),
|
|
29
|
+
`title: ${JSON.stringify(page.meta.title)}`,
|
|
30
|
+
`fetched_at: ${fetchedAt.toISOString()}`,
|
|
31
|
+
`source: ${page.source}`,
|
|
32
|
+
...page.notes.map((note) => `note: ${JSON.stringify(note)}`),
|
|
33
|
+
"---",
|
|
34
|
+
"",
|
|
35
|
+
].join("\n");
|
|
36
|
+
const content = `${frontMatter}${page.markdown}`;
|
|
37
|
+
await writeFile(path, content);
|
|
38
|
+
return { path, tokens: estimateTokens(page.markdown) };
|
|
39
|
+
};
|
|
40
|
+
export const saveIndex = async (outDir, startUrl, entries, skipped) => {
|
|
41
|
+
await mkdir(outDir, { recursive: true });
|
|
42
|
+
const sorted = entries.toSorted((a, b) => a.url.localeCompare(b.url));
|
|
43
|
+
const markdownPath = join(outDir, "index.md");
|
|
44
|
+
const jsonPath = join(outDir, "index.json");
|
|
45
|
+
const skippedLine = Object.entries(skipped)
|
|
46
|
+
.filter(([, count]) => count > 0)
|
|
47
|
+
.map(([reason, count]) => `${reason} ${count}`)
|
|
48
|
+
.join(", ");
|
|
49
|
+
const lines = [
|
|
50
|
+
`# Crawl of ${startUrl}`,
|
|
51
|
+
"",
|
|
52
|
+
`${entries.length} pages, ${entries.reduce((sum, entry) => sum + entry.tokens, 0)} tokens total.`,
|
|
53
|
+
...(skippedLine === "" ? [] : [`Skipped: ${skippedLine}.`]),
|
|
54
|
+
"",
|
|
55
|
+
"| title | url | file | tokens |",
|
|
56
|
+
"| --- | --- | --- | --- |",
|
|
57
|
+
...sorted.map((entry) => `| ${entry.title.replaceAll("|", "\\|")} | ${entry.url} | ${entry.path} | ${entry.tokens} |`),
|
|
58
|
+
"",
|
|
59
|
+
];
|
|
60
|
+
await writeFile(markdownPath, lines.join("\n"));
|
|
61
|
+
await writeFile(jsonPath, JSON.stringify({ startUrl, pages: sorted, skipped }, null, 2));
|
|
62
|
+
return { markdownPath, jsonPath };
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type PageMeta } from "./dom.js";
|
|
2
|
+
import { type Link } from "./links.js";
|
|
3
|
+
export type BrowserMode = "auto" | "never" | "force";
|
|
4
|
+
export interface FetchPageOptions {
|
|
5
|
+
readonly raw?: boolean;
|
|
6
|
+
readonly query?: string | undefined;
|
|
7
|
+
readonly browser?: BrowserMode;
|
|
8
|
+
readonly maxAgeS?: number;
|
|
9
|
+
readonly timeoutMs?: number;
|
|
10
|
+
readonly maxBytes?: number;
|
|
11
|
+
readonly threshold?: number | undefined;
|
|
12
|
+
}
|
|
13
|
+
export interface PageResult {
|
|
14
|
+
readonly url: string;
|
|
15
|
+
readonly finalUrl: string;
|
|
16
|
+
readonly status: number;
|
|
17
|
+
readonly contentType: string;
|
|
18
|
+
readonly markdown: string;
|
|
19
|
+
readonly meta: PageMeta;
|
|
20
|
+
readonly links: Link[];
|
|
21
|
+
readonly source: "cache" | "network" | "browser";
|
|
22
|
+
readonly prunedShare: number | undefined;
|
|
23
|
+
readonly notes: string[];
|
|
24
|
+
}
|
|
25
|
+
export declare const fetchPage: (url: string, options?: FetchPageOptions) => Promise<PageResult>;
|
|
26
|
+
//# sourceMappingURL=page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/lib/page.ts"],"names":[],"mappings":"AAOA,OAAO,EAA8D,KAAK,QAAQ,EAAmC,MAAM,UAAU,CAAC;AAEtI,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAIrD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAE/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAEjD,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,SAAS,QAAe,MAAM,YAAW,gBAAgB,KAAQ,OAAO,CAAC,UAAU,CAmD/F,CAAC"}
|
package/dist/lib/page.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { neutralizeOutsideText } from "@intentic/base/outside-text";
|
|
2
|
+
import { bm25Rank } from "./bm25.js";
|
|
3
|
+
import { chromiumAvailable, renderPage } from "./browser.js";
|
|
4
|
+
import { cacheRead, cacheWrite, DEFAULT_MAX_AGE_S } from "./cache.js";
|
|
5
|
+
import { bodyOf, elementsByTag, metaOf, parseHtml, remove, textOf, walk } from "./dom.js";
|
|
6
|
+
import { httpFetch, USER_AGENT } from "./http.js";
|
|
7
|
+
import { extractLinks } from "./links.js";
|
|
8
|
+
import { renderMarkdown } from "./markdown.js";
|
|
9
|
+
import { pruneTree } from "./prune.js";
|
|
10
|
+
export const fetchPage = async (url, options = {}) => {
|
|
11
|
+
const browserMode = options.browser ?? "auto";
|
|
12
|
+
const maxAgeS = options.maxAgeS ?? DEFAULT_MAX_AGE_S;
|
|
13
|
+
const timeoutMs = options.timeoutMs ?? 20_000;
|
|
14
|
+
const notes = [];
|
|
15
|
+
let acquired = browserMode === "force" ? undefined : await acquireStatic(url, options, maxAgeS, timeoutMs, notes);
|
|
16
|
+
if (acquired === undefined || (browserMode !== "never" && looksLikeAppShell(acquired.doc, acquired.body))) {
|
|
17
|
+
const rendered = await acquireBrowser(url, maxAgeS, timeoutMs, notes);
|
|
18
|
+
if (rendered !== undefined) {
|
|
19
|
+
acquired = rendered;
|
|
20
|
+
}
|
|
21
|
+
else if (acquired === undefined) {
|
|
22
|
+
throw new Error("browser rendering unavailable (no Chromium in this image) and --browser force was asked for");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const { doc, body, finalUrl, status, contentType, source } = acquired;
|
|
26
|
+
if (!isHtml(contentType)) {
|
|
27
|
+
return {
|
|
28
|
+
url,
|
|
29
|
+
finalUrl,
|
|
30
|
+
status,
|
|
31
|
+
contentType,
|
|
32
|
+
markdown: neutralizeOutsideText(nonHtmlMarkdown(acquired.rawBody, contentType, notes)),
|
|
33
|
+
meta: { title: url, description: undefined, lang: undefined },
|
|
34
|
+
links: [],
|
|
35
|
+
source,
|
|
36
|
+
prunedShare: undefined,
|
|
37
|
+
notes,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const rawMeta = metaOf(doc);
|
|
41
|
+
const meta = {
|
|
42
|
+
title: neutralizeOutsideText(rawMeta.title),
|
|
43
|
+
description: rawMeta.description === undefined ? undefined : neutralizeOutsideText(rawMeta.description),
|
|
44
|
+
lang: rawMeta.lang,
|
|
45
|
+
};
|
|
46
|
+
const links = extractLinks(doc, finalUrl);
|
|
47
|
+
let prunedShare;
|
|
48
|
+
if (body !== undefined && options.raw !== true) {
|
|
49
|
+
prunedShare = pruneTree(body, options.threshold === undefined ? {} : { threshold: options.threshold });
|
|
50
|
+
}
|
|
51
|
+
if (body !== undefined && options.query !== undefined && options.query !== "") {
|
|
52
|
+
notes.push(applyQueryFilter(body, options.query));
|
|
53
|
+
}
|
|
54
|
+
const markdown = body === undefined ? "" : neutralizeOutsideText(renderMarkdown(body, { baseUrl: finalUrl }));
|
|
55
|
+
return { url, finalUrl, status, contentType, markdown, meta, links, source, prunedShare, notes };
|
|
56
|
+
};
|
|
57
|
+
const acquireStatic = async (url, options, maxAgeS, timeoutMs, notes) => {
|
|
58
|
+
const cached = maxAgeS > 0 ? await cacheRead(url, "static", maxAgeS) : undefined;
|
|
59
|
+
if (cached !== undefined) {
|
|
60
|
+
return parsed(cached.body, cached.finalUrl, cached.status, cached.contentType, "cache");
|
|
61
|
+
}
|
|
62
|
+
const fetched = await httpFetch(url, {
|
|
63
|
+
timeoutMs,
|
|
64
|
+
userAgent: USER_AGENT,
|
|
65
|
+
...(options.maxBytes === undefined ? {} : { maxBytes: options.maxBytes }),
|
|
66
|
+
});
|
|
67
|
+
if (fetched.truncated) {
|
|
68
|
+
notes.push("byte cap hit mid-body: this page is cut short");
|
|
69
|
+
}
|
|
70
|
+
await cacheWrite({
|
|
71
|
+
url,
|
|
72
|
+
finalUrl: fetched.finalUrl,
|
|
73
|
+
status: fetched.status,
|
|
74
|
+
contentType: fetched.contentType,
|
|
75
|
+
body: fetched.body,
|
|
76
|
+
mode: "static",
|
|
77
|
+
fetchedAt: Date.now(),
|
|
78
|
+
});
|
|
79
|
+
return parsed(fetched.body, fetched.finalUrl, fetched.status, fetched.contentType, "network");
|
|
80
|
+
};
|
|
81
|
+
const acquireBrowser = async (url, maxAgeS, timeoutMs, notes) => {
|
|
82
|
+
const mode = "browser";
|
|
83
|
+
const cached = maxAgeS > 0 ? await cacheRead(url, mode, maxAgeS) : undefined;
|
|
84
|
+
if (cached !== undefined) {
|
|
85
|
+
return parsed(cached.body, cached.finalUrl, cached.status, cached.contentType, "browser");
|
|
86
|
+
}
|
|
87
|
+
if (!(await chromiumAvailable())) {
|
|
88
|
+
notes.push("page looks JS-rendered but this image has no Chromium (browser feature pack): static HTML served best-effort");
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
const rendered = await renderPage(url, timeoutMs);
|
|
92
|
+
await cacheWrite({ url, finalUrl: rendered.finalUrl, status: 200, contentType: "text/html", body: rendered.html, mode, fetchedAt: Date.now() });
|
|
93
|
+
return parsed(rendered.html, rendered.finalUrl, 200, "text/html", "browser");
|
|
94
|
+
};
|
|
95
|
+
const parsed = (html, finalUrl, status, contentType, source) => {
|
|
96
|
+
const doc = isHtml(contentType) ? parseHtml(html) : parseHtml("");
|
|
97
|
+
return { doc, body: bodyOf(doc), rawBody: html, finalUrl, status, contentType, source };
|
|
98
|
+
};
|
|
99
|
+
const isHtml = (contentType) => contentType === "" || /text\/html|application\/xhtml/i.test(contentType);
|
|
100
|
+
const looksLikeAppShell = (doc, body) => {
|
|
101
|
+
if (body === undefined) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
const text = textOf(body);
|
|
105
|
+
if (text.length >= 200) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return elementsByTag(doc, "script").length > 0;
|
|
109
|
+
};
|
|
110
|
+
const nonHtmlMarkdown = (rawBody, contentType, notes) => {
|
|
111
|
+
if (/json/i.test(contentType)) {
|
|
112
|
+
return `\`\`\`json\n${rawBody.trim()}\n\`\`\`\n`;
|
|
113
|
+
}
|
|
114
|
+
if (/xml/i.test(contentType)) {
|
|
115
|
+
return `\`\`\`xml\n${rawBody.trim()}\n\`\`\`\n`;
|
|
116
|
+
}
|
|
117
|
+
if (/^text\//i.test(contentType)) {
|
|
118
|
+
return `${rawBody.trim()}\n`;
|
|
119
|
+
}
|
|
120
|
+
notes.push(`unsupported content type ${contentType.split(";")[0] ?? contentType}: no markdown produced`);
|
|
121
|
+
return "";
|
|
122
|
+
};
|
|
123
|
+
const FILTERABLE = new Set(["p", "li", "pre", "table", "blockquote", "dd"]);
|
|
124
|
+
const applyQueryFilter = (body, query) => {
|
|
125
|
+
const candidates = [];
|
|
126
|
+
walk(body, (el) => {
|
|
127
|
+
if (FILTERABLE.has(el.tagName) && !hasFilterableAncestorWithin(el, body)) {
|
|
128
|
+
candidates.push(el);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
const ranked = bm25Rank(candidates, (el) => textOf(el), query);
|
|
132
|
+
const keep = new Set(ranked.map((entry) => entry.block));
|
|
133
|
+
if (keep.size < Math.min(3, candidates.length)) {
|
|
134
|
+
return `query matched too little (${keep.size}/${candidates.length} blocks): kept the whole page`;
|
|
135
|
+
}
|
|
136
|
+
for (const candidate of candidates) {
|
|
137
|
+
if (!keep.has(candidate)) {
|
|
138
|
+
remove(candidate);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return `query kept ${keep.size}/${candidates.length} blocks`;
|
|
142
|
+
};
|
|
143
|
+
const hasFilterableAncestorWithin = (el, root) => {
|
|
144
|
+
let parent = el.parentNode;
|
|
145
|
+
while (parent !== null && parent !== root) {
|
|
146
|
+
if ("tagName" in parent && FILTERABLE.has(parent.tagName)) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
parent = "parentNode" in parent && parent.parentNode !== undefined ? parent.parentNode : null;
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/lib/page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../src/lib/prune.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,OAAO,EAAqC,MAAM,UAAU,CAAC;AA2BhG,MAAM,WAAW,YAAY;IAEzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC9B;AASD,eAAO,MAAM,SAAS,SAAU,OAAO,YAAW,YAAY,KAAQ,MAWrE,CAAC"}
|