@intentic/fileq 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 +43 -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/derive.command.d.ts +5 -0
- package/dist/commands/derive.command.d.ts.map +1 -0
- package/dist/commands/derive.command.js +53 -0
- package/dist/commands/derive.command.js.map +1 -0
- package/dist/commands/git-attributes.command.d.ts +3 -0
- package/dist/commands/git-attributes.command.d.ts.map +1 -0
- package/dist/commands/git-attributes.command.js +12 -0
- package/dist/commands/git-attributes.command.js.map +1 -0
- package/dist/commands/read.command.d.ts +3 -0
- package/dist/commands/read.command.d.ts.map +1 -0
- package/dist/commands/read.command.js +126 -0
- package/dist/commands/read.command.js.map +1 -0
- package/dist/commands/sweep.command.d.ts +3 -0
- package/dist/commands/sweep.command.d.ts.map +1 -0
- package/dist/commands/sweep.command.js +41 -0
- package/dist/commands/sweep.command.js.map +1 -0
- package/dist/lib/archives.d.ts +18 -0
- package/dist/lib/archives.d.ts.map +1 -0
- package/dist/lib/archives.js +133 -0
- package/dist/lib/archives.js.map +1 -0
- package/dist/lib/derive.d.ts +32 -0
- package/dist/lib/derive.d.ts.map +1 -0
- package/dist/lib/derive.js +99 -0
- package/dist/lib/derive.js.map +1 -0
- package/dist/lib/derivers/archive.d.ts +3 -0
- package/dist/lib/derivers/archive.d.ts.map +1 -0
- package/dist/lib/derivers/archive.js +132 -0
- package/dist/lib/derivers/archive.js.map +1 -0
- package/dist/lib/derivers/deriver.d.ts +13 -0
- package/dist/lib/derivers/deriver.d.ts.map +1 -0
- package/dist/lib/derivers/deriver.js +8 -0
- package/dist/lib/derivers/deriver.js.map +1 -0
- package/dist/lib/derivers/docx.d.ts +6 -0
- package/dist/lib/derivers/docx.d.ts.map +1 -0
- package/dist/lib/derivers/docx.js +29 -0
- package/dist/lib/derivers/docx.js.map +1 -0
- package/dist/lib/derivers/epub.d.ts +3 -0
- package/dist/lib/derivers/epub.d.ts.map +1 -0
- package/dist/lib/derivers/epub.js +102 -0
- package/dist/lib/derivers/epub.js.map +1 -0
- package/dist/lib/derivers/html.d.ts +3 -0
- package/dist/lib/derivers/html.d.ts.map +1 -0
- package/dist/lib/derivers/html.js +18 -0
- package/dist/lib/derivers/html.js.map +1 -0
- package/dist/lib/derivers/image.d.ts +3 -0
- package/dist/lib/derivers/image.d.ts.map +1 -0
- package/dist/lib/derivers/image.js +42 -0
- package/dist/lib/derivers/image.js.map +1 -0
- package/dist/lib/derivers/ipynb.d.ts +3 -0
- package/dist/lib/derivers/ipynb.d.ts.map +1 -0
- package/dist/lib/derivers/ipynb.js +75 -0
- package/dist/lib/derivers/ipynb.js.map +1 -0
- package/dist/lib/derivers/media.d.ts +3 -0
- package/dist/lib/derivers/media.d.ts.map +1 -0
- package/dist/lib/derivers/media.js +45 -0
- package/dist/lib/derivers/media.js.map +1 -0
- package/dist/lib/derivers/odp.d.ts +3 -0
- package/dist/lib/derivers/odp.d.ts.map +1 -0
- package/dist/lib/derivers/odp.js +41 -0
- package/dist/lib/derivers/odp.js.map +1 -0
- package/dist/lib/derivers/ods.d.ts +3 -0
- package/dist/lib/derivers/ods.d.ts.map +1 -0
- package/dist/lib/derivers/ods.js +86 -0
- package/dist/lib/derivers/ods.js.map +1 -0
- package/dist/lib/derivers/odt.d.ts +4 -0
- package/dist/lib/derivers/odt.d.ts.map +1 -0
- package/dist/lib/derivers/odt.js +77 -0
- package/dist/lib/derivers/odt.js.map +1 -0
- package/dist/lib/derivers/pdf-furniture.d.ts +7 -0
- package/dist/lib/derivers/pdf-furniture.d.ts.map +1 -0
- package/dist/lib/derivers/pdf-furniture.js +76 -0
- package/dist/lib/derivers/pdf-furniture.js.map +1 -0
- package/dist/lib/derivers/pdf.d.ts +4 -0
- package/dist/lib/derivers/pdf.d.ts.map +1 -0
- package/dist/lib/derivers/pdf.js +79 -0
- package/dist/lib/derivers/pdf.js.map +1 -0
- package/dist/lib/derivers/pptx.d.ts +4 -0
- package/dist/lib/derivers/pptx.d.ts.map +1 -0
- package/dist/lib/derivers/pptx.js +51 -0
- package/dist/lib/derivers/pptx.js.map +1 -0
- package/dist/lib/derivers/profile.d.ts +3 -0
- package/dist/lib/derivers/profile.d.ts.map +1 -0
- package/dist/lib/derivers/profile.js +115 -0
- package/dist/lib/derivers/profile.js.map +1 -0
- package/dist/lib/derivers/rtf.d.ts +4 -0
- package/dist/lib/derivers/rtf.d.ts.map +1 -0
- package/dist/lib/derivers/rtf.js +187 -0
- package/dist/lib/derivers/rtf.js.map +1 -0
- package/dist/lib/derivers/xlsx.d.ts +3 -0
- package/dist/lib/derivers/xlsx.d.ts.map +1 -0
- package/dist/lib/derivers/xlsx.js +68 -0
- package/dist/lib/derivers/xlsx.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 +5 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/flags.d.ts +2 -0
- package/dist/lib/flags.d.ts.map +1 -0
- package/dist/lib/flags.js +8 -0
- package/dist/lib/flags.js.map +1 -0
- package/dist/lib/formats.d.ts +6 -0
- package/dist/lib/formats.d.ts.map +1 -0
- package/dist/lib/formats.js +110 -0
- package/dist/lib/formats.js.map +1 -0
- package/dist/lib/sidecar.d.ts +30 -0
- package/dist/lib/sidecar.d.ts.map +1 -0
- package/dist/lib/sidecar.js +108 -0
- package/dist/lib/sidecar.js.map +1 -0
- package/dist/lib/sweep.d.ts +7 -0
- package/dist/lib/sweep.d.ts.map +1 -0
- package/dist/lib/sweep.js +56 -0
- package/dist/lib/sweep.js.map +1 -0
- package/dist/lib/tools.d.ts +2 -0
- package/dist/lib/tools.d.ts.map +1 -0
- package/dist/lib/tools.js +15 -0
- package/dist/lib/tools.js.map +1 -0
- package/dist/lib/xml.d.ts +3 -0
- package/dist/lib/xml.d.ts.map +1 -0
- package/dist/lib/xml.js +16 -0
- package/dist/lib/xml.js.map +1 -0
- package/dist/skill.d.ts +5 -0
- package/dist/skill.d.ts.map +1 -0
- package/dist/skill.js +75 -0
- package/dist/skill.js.map +1 -0
- package/dist/testing.d.ts +25 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +220 -0
- package/dist/testing.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +89 -0
- package/src/app.ts +48 -0
- package/src/cli.integration.test.ts +200 -0
- package/src/cli.ts +6 -0
- package/src/commands/derive.command.ts +59 -0
- package/src/commands/git-attributes.command.ts +13 -0
- package/src/commands/read.command.ts +158 -0
- package/src/commands/sweep.command.ts +48 -0
- package/src/derivers.integration.test.ts +415 -0
- package/src/lib/archives.test.ts +72 -0
- package/src/lib/archives.ts +209 -0
- package/src/lib/derive.ts +132 -0
- package/src/lib/derivers/archive.ts +168 -0
- package/src/lib/derivers/deriver.ts +33 -0
- package/src/lib/derivers/docx.test.ts +38 -0
- package/src/lib/derivers/docx.ts +44 -0
- package/src/lib/derivers/epub.ts +130 -0
- package/src/lib/derivers/html.ts +21 -0
- package/src/lib/derivers/image.ts +54 -0
- package/src/lib/derivers/ipynb.ts +113 -0
- package/src/lib/derivers/load-cost.test.ts +44 -0
- package/src/lib/derivers/media.ts +51 -0
- package/src/lib/derivers/odp.ts +52 -0
- package/src/lib/derivers/ods.ts +104 -0
- package/src/lib/derivers/odt.ts +101 -0
- package/src/lib/derivers/pdf-furniture.test.ts +60 -0
- package/src/lib/derivers/pdf-furniture.ts +121 -0
- package/src/lib/derivers/pdf.ts +102 -0
- package/src/lib/derivers/pptx.ts +61 -0
- package/src/lib/derivers/profile.ts +172 -0
- package/src/lib/derivers/rtf.ts +233 -0
- package/src/lib/derivers/xlsx.ts +82 -0
- package/src/lib/env.ts +7 -0
- package/src/lib/formats.test.ts +50 -0
- package/src/lib/formats.ts +141 -0
- package/src/lib/sidecar.test.ts +60 -0
- package/src/lib/sidecar.ts +156 -0
- package/src/lib/sweep.ts +72 -0
- package/src/lib/tools.ts +16 -0
- package/src/lib/xml.ts +20 -0
- package/src/skill.ts +90 -0
- package/src/testing.ts +333 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { plural } from "@intentic/base/format";
|
|
3
|
+
const MAX_OUTPUT_LINES = 40;
|
|
4
|
+
const joined = (value) => (Array.isArray(value) ? value.join("") : (value ?? ""));
|
|
5
|
+
const linesOf = (value) => joined(value).trimEnd().split("\n");
|
|
6
|
+
const outputLines = (output, counters) => {
|
|
7
|
+
if (output.output_type === "stream") {
|
|
8
|
+
return linesOf(output.text);
|
|
9
|
+
}
|
|
10
|
+
if (output.output_type === "error") {
|
|
11
|
+
return [`${output.ename ?? "Error"}: ${output.evalue ?? ""}`.trimEnd()];
|
|
12
|
+
}
|
|
13
|
+
if (output.data === undefined) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const plain = output.data["text/plain"];
|
|
17
|
+
if (plain !== undefined) {
|
|
18
|
+
return linesOf(plain);
|
|
19
|
+
}
|
|
20
|
+
counters.rich += 1;
|
|
21
|
+
return [`[${Object.keys(output.data).join(", ")} output omitted]`];
|
|
22
|
+
};
|
|
23
|
+
const codeCell = (cell, source, language, counters) => {
|
|
24
|
+
const block = [`\`\`\`${language}`, source, "```"];
|
|
25
|
+
const lines = (cell.outputs ?? []).flatMap((output) => outputLines(output, counters));
|
|
26
|
+
if (lines.length === 0) {
|
|
27
|
+
return block.join("\n");
|
|
28
|
+
}
|
|
29
|
+
const kept = lines.slice(0, MAX_OUTPUT_LINES);
|
|
30
|
+
if (lines.length > MAX_OUTPUT_LINES) {
|
|
31
|
+
counters.clipped += 1;
|
|
32
|
+
kept.push(`… ${lines.length - MAX_OUTPUT_LINES} more output lines`);
|
|
33
|
+
}
|
|
34
|
+
return [...block, "", "```text", ...kept, "```"].join("\n");
|
|
35
|
+
};
|
|
36
|
+
const sectionOf = (cell, language, counters) => {
|
|
37
|
+
const source = joined(cell.source).trimEnd();
|
|
38
|
+
if (cell.cell_type === "code") {
|
|
39
|
+
return codeCell(cell, source, language, counters);
|
|
40
|
+
}
|
|
41
|
+
if (source === "") {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
return cell.cell_type === "markdown" ? source : ["```text", source, "```"].join("\n");
|
|
45
|
+
};
|
|
46
|
+
const notesOf = (cellCount, counters) => {
|
|
47
|
+
const notes = [];
|
|
48
|
+
if (cellCount === 0) {
|
|
49
|
+
notes.push("no cells in this notebook");
|
|
50
|
+
}
|
|
51
|
+
if (counters.clipped > 0) {
|
|
52
|
+
notes.push(`${plural(counters.clipped, "cell")}: output cut at ${MAX_OUTPUT_LINES} lines`);
|
|
53
|
+
}
|
|
54
|
+
if (counters.rich > 0) {
|
|
55
|
+
notes.push(`${plural(counters.rich, "rich output")} (images, HTML) omitted: a notebook's pictures need the notebook itself`);
|
|
56
|
+
}
|
|
57
|
+
return notes;
|
|
58
|
+
};
|
|
59
|
+
export const ipynbDeriver = {
|
|
60
|
+
name: "ipynb",
|
|
61
|
+
version: 1,
|
|
62
|
+
derive: async (absPath) => {
|
|
63
|
+
const notebook = JSON.parse(await readFile(absPath, "utf8"));
|
|
64
|
+
const language = notebook.metadata?.language_info?.name ?? notebook.metadata?.kernelspec?.language ?? "python";
|
|
65
|
+
const cells = Array.isArray(notebook.cells) ? notebook.cells : [];
|
|
66
|
+
const counters = { rich: 0, clipped: 0 };
|
|
67
|
+
const sections = cells.map((cell) => sectionOf(cell, language, counters)).filter((section) => section !== undefined);
|
|
68
|
+
const title = cells
|
|
69
|
+
.filter((cell) => cell.cell_type === "markdown")
|
|
70
|
+
.map((cell) => /^#\s+(.+)$/m.exec(joined(cell.source))?.[1]?.trim())
|
|
71
|
+
.find((heading) => heading !== undefined);
|
|
72
|
+
return { markdown: sections.join("\n\n"), title, notes: notesOf(cells.length, counters) };
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=ipynb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipynb.js","sourceRoot":"","sources":["../../../src/lib/derivers/ipynb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAYxD,eAAO,MAAM,YAAY,EAAE,OAsC1B,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const formatDuration = (seconds) => {
|
|
2
|
+
const whole = Math.round(seconds);
|
|
3
|
+
const minutes = Math.floor(whole / 60);
|
|
4
|
+
return minutes === 0 ? `${whole}s` : `${minutes}m ${String(whole % 60).padStart(2, "0")}s`;
|
|
5
|
+
};
|
|
6
|
+
export const mediaDeriver = {
|
|
7
|
+
name: "media",
|
|
8
|
+
version: 1,
|
|
9
|
+
derive: async (absPath) => {
|
|
10
|
+
const { parseFile } = await import("music-metadata");
|
|
11
|
+
const meta = await parseFile(absPath, { duration: true });
|
|
12
|
+
const lines = [];
|
|
13
|
+
const { format, common } = meta;
|
|
14
|
+
if (format.container !== undefined) {
|
|
15
|
+
lines.push(`- Container: ${format.container}${format.codec === undefined ? "" : ` (${format.codec})`}`);
|
|
16
|
+
}
|
|
17
|
+
if (format.duration !== undefined) {
|
|
18
|
+
lines.push(`- Duration: ${formatDuration(format.duration)}`);
|
|
19
|
+
}
|
|
20
|
+
if (format.sampleRate !== undefined) {
|
|
21
|
+
lines.push(`- Sample rate: ${format.sampleRate} Hz${format.numberOfChannels === undefined ? "" : `, ${format.numberOfChannels}ch`}`);
|
|
22
|
+
}
|
|
23
|
+
if (format.bitrate !== undefined) {
|
|
24
|
+
lines.push(`- Bitrate: ${Math.round(format.bitrate / 1000)} kbit/s`);
|
|
25
|
+
}
|
|
26
|
+
const tags = [
|
|
27
|
+
["Title", common.title],
|
|
28
|
+
["Artist", common.artist],
|
|
29
|
+
["Album", common.album],
|
|
30
|
+
["Year", common.year],
|
|
31
|
+
["Genre", common.genre?.join(", ")],
|
|
32
|
+
];
|
|
33
|
+
for (const [label, value] of tags) {
|
|
34
|
+
if (value !== undefined && value !== "") {
|
|
35
|
+
lines.push(`- ${label}: ${value}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
markdown: lines.join("\n"),
|
|
40
|
+
title: common.title,
|
|
41
|
+
notes: ["no transcript: audio transcription is a later, whisper-backed tier"],
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/lib/derivers/media.ts"],"names":[],"mappings":"AAMA,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACvC,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAC/F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAY;IACjC,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,KAAK,EAAE,OAAO,EAAuB,EAAE;QAC3C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAChC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,eAAe,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,UAAU,MAAM,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QACzI,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,IAAI,GAAgE;YACtE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YACzB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;SACtC,CAAC;QACF,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YACvC,CAAC;QACL,CAAC;QACD,OAAO;YACH,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,CAAC,oEAAoE,CAAC;SAChF,CAAC;IACN,CAAC;CACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odp.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/odp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAuBxD,eAAO,MAAM,UAAU,EAAE,OA0BxB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { unzipSync } from "fflate";
|
|
3
|
+
import { attributeOf, decodeEntities } from "../xml.js";
|
|
4
|
+
const PAGE = /<draw:page\b([^>]*)>([\s\S]*?)<\/draw:page>/g;
|
|
5
|
+
const NOTES = /<presentation:notes\b[^>]*>[\s\S]*?<\/presentation:notes>/g;
|
|
6
|
+
const PARAGRAPH = /<text:(p|h)\b[^>]*(?:\/>|>([\s\S]*?)<\/text:\1>)/g;
|
|
7
|
+
const lineOf = (inner) => decodeEntities(inner
|
|
8
|
+
.replaceAll(/<text:s\b[^>]*\/>/g, " ")
|
|
9
|
+
.replaceAll(/<text:tab\b[^>]*\/>/g, " ")
|
|
10
|
+
.replaceAll(/<text:line-break\b[^>]*\/>/g, " ")
|
|
11
|
+
.replaceAll(/<[^>]+>/g, ""))
|
|
12
|
+
.replaceAll(/\s+/g, " ")
|
|
13
|
+
.trim();
|
|
14
|
+
const linesOf = (xml) => [...xml.matchAll(PARAGRAPH)].map((match) => lineOf(match[2] ?? "")).filter((line) => line !== "");
|
|
15
|
+
export const odpDeriver = {
|
|
16
|
+
name: "odp",
|
|
17
|
+
version: 1,
|
|
18
|
+
derive: async (absPath) => {
|
|
19
|
+
const zip = unzipSync(new Uint8Array(await readFile(absPath)), { filter: (file) => file.name === "content.xml" });
|
|
20
|
+
const content = zip["content.xml"];
|
|
21
|
+
if (content === undefined) {
|
|
22
|
+
return { markdown: "", notes: ["no content.xml in this OpenDocument container"] };
|
|
23
|
+
}
|
|
24
|
+
const xml = new TextDecoder().decode(content);
|
|
25
|
+
const sections = [];
|
|
26
|
+
for (const page of xml.matchAll(PAGE)) {
|
|
27
|
+
const body = page[2] ?? "";
|
|
28
|
+
const slide = body.replaceAll(NOTES, "");
|
|
29
|
+
const notes = (body.match(NOTES) ?? []).flatMap((part) => linesOf(part)).filter((line) => !/^\d+$/.test(line));
|
|
30
|
+
const name = attributeOf(page[1] ?? "", "draw:name");
|
|
31
|
+
const heading = `## Slide ${sections.length + 1}${name === undefined || name === "" ? "" : `: ${name}`}`;
|
|
32
|
+
const section = [heading, ...linesOf(slide)];
|
|
33
|
+
if (notes.length > 0) {
|
|
34
|
+
section.push("", "Notes:", ...notes.map((line) => `> ${line}`));
|
|
35
|
+
}
|
|
36
|
+
sections.push(section.join("\n"));
|
|
37
|
+
}
|
|
38
|
+
return { markdown: sections.join("\n\n"), notes: sections.length === 0 ? ["no slides in this presentation"] : [] };
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=odp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odp.js","sourceRoot":"","sources":["../../../src/lib/derivers/odp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ods.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/ods.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAmFxD,eAAO,MAAM,UAAU,EAAE,OAkBxB,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { unzipSync } from "fflate";
|
|
3
|
+
import { attributeOf, decodeEntities } from "../xml.js";
|
|
4
|
+
const MAX_ROWS_PER_SHEET = 200;
|
|
5
|
+
const MAX_COLUMNS = 30;
|
|
6
|
+
const TABLE = /<table:table\b([^>]*)>([\s\S]*?)<\/table:table>/g;
|
|
7
|
+
const ROW = /<table:table-row\b([^>]*?)(?:\/>|>([\s\S]*?)<\/table:table-row>)/g;
|
|
8
|
+
const CELL = /<table:(covered-table-cell|table-cell)\b([^>]*?)(?:\/>|>([\s\S]*?)<\/table:\1>)/g;
|
|
9
|
+
const repeatOf = (attributes, name, limit) => {
|
|
10
|
+
const value = Number.parseInt(attributeOf(attributes, name) ?? "1", 10);
|
|
11
|
+
return Number.isFinite(value) && value > 0 ? Math.min(value, limit) : 1;
|
|
12
|
+
};
|
|
13
|
+
const cellText = (attributes, inner) => {
|
|
14
|
+
const shown = decodeEntities(inner
|
|
15
|
+
.replaceAll(/<text:s\b[^>]*\/>/g, " ")
|
|
16
|
+
.replaceAll(/<text:tab\b[^>]*\/>/g, " ")
|
|
17
|
+
.replaceAll(/<\/text:p>/g, " ")
|
|
18
|
+
.replaceAll(/<[^>]+>/g, ""))
|
|
19
|
+
.replaceAll(/\s+/g, " ")
|
|
20
|
+
.trim();
|
|
21
|
+
return shown === "" ? (attributeOf(attributes, "office:value") ?? "") : shown;
|
|
22
|
+
};
|
|
23
|
+
const trimEnd = (items, empty) => {
|
|
24
|
+
let end = items.length;
|
|
25
|
+
while (end > 0 && empty(items[end - 1])) {
|
|
26
|
+
end -= 1;
|
|
27
|
+
}
|
|
28
|
+
return items.slice(0, end);
|
|
29
|
+
};
|
|
30
|
+
const cellsOf = (xml) => {
|
|
31
|
+
const cells = [];
|
|
32
|
+
for (const cell of xml.matchAll(CELL)) {
|
|
33
|
+
const attributes = cell[2] ?? "";
|
|
34
|
+
const text = cell[1] === "covered-table-cell" ? "" : cellText(attributes, cell[3] ?? "");
|
|
35
|
+
for (let repeat = 0; repeat < repeatOf(attributes, "table:number-columns-repeated", MAX_COLUMNS); repeat += 1) {
|
|
36
|
+
cells.push(text);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return trimEnd(cells, (cell) => cell === "");
|
|
40
|
+
};
|
|
41
|
+
const rowsOf = (xml) => {
|
|
42
|
+
const rows = [];
|
|
43
|
+
for (const row of xml.matchAll(ROW)) {
|
|
44
|
+
const cells = cellsOf(row[2] ?? "");
|
|
45
|
+
for (let repeat = 0; repeat < repeatOf(row[1] ?? "", "table:number-rows-repeated", MAX_ROWS_PER_SHEET); repeat += 1) {
|
|
46
|
+
rows.push(cells);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return trimEnd(rows, (row) => row.length === 0);
|
|
50
|
+
};
|
|
51
|
+
const tableRow = (cells) => `| ${cells.map((cell) => cell.replaceAll("|", "\\|")).join(" | ")} |`;
|
|
52
|
+
const sectionOf = (name, rows, notes) => {
|
|
53
|
+
if (rows.length === 0) {
|
|
54
|
+
return `## ${name}\n\n(empty sheet)`;
|
|
55
|
+
}
|
|
56
|
+
const width = Math.min(MAX_COLUMNS, Math.max(...rows.map((row) => row.length)));
|
|
57
|
+
if (Math.max(...rows.map((row) => row.length)) > MAX_COLUMNS) {
|
|
58
|
+
notes.push(`sheet "${name}": showing ${MAX_COLUMNS} of ${Math.max(...rows.map((row) => row.length))} columns`);
|
|
59
|
+
}
|
|
60
|
+
if (rows.length > MAX_ROWS_PER_SHEET) {
|
|
61
|
+
notes.push(`sheet "${name}": showing ${MAX_ROWS_PER_SHEET} of ${rows.length} rows`);
|
|
62
|
+
}
|
|
63
|
+
const kept = rows.slice(0, MAX_ROWS_PER_SHEET).map((row) => Array.from({ length: width }, (_, index) => row[index] ?? ""));
|
|
64
|
+
const [header, ...body] = kept;
|
|
65
|
+
return `## ${name}\n\n${[tableRow(header), tableRow(header.map(() => "---")), ...body.map(tableRow)].join("\n")}`;
|
|
66
|
+
};
|
|
67
|
+
export const odsDeriver = {
|
|
68
|
+
name: "ods",
|
|
69
|
+
version: 1,
|
|
70
|
+
derive: async (absPath) => {
|
|
71
|
+
const zip = unzipSync(new Uint8Array(await readFile(absPath)), { filter: (file) => file.name === "content.xml" });
|
|
72
|
+
const content = zip["content.xml"];
|
|
73
|
+
if (content === undefined) {
|
|
74
|
+
return { markdown: "", notes: ["no content.xml in this OpenDocument container"] };
|
|
75
|
+
}
|
|
76
|
+
const xml = new TextDecoder().decode(content);
|
|
77
|
+
const notes = [];
|
|
78
|
+
const sections = [];
|
|
79
|
+
for (const table of xml.matchAll(TABLE)) {
|
|
80
|
+
const name = attributeOf(table[1] ?? "", "table:name") ?? `Sheet ${sections.length + 1}`;
|
|
81
|
+
sections.push(sectionOf(name, rowsOf(table[2] ?? ""), notes));
|
|
82
|
+
}
|
|
83
|
+
return { markdown: sections.join("\n\n"), notes: sections.length === 0 ? [...notes, "no sheets in this spreadsheet"] : notes };
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=ods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ods.js","sourceRoot":"","sources":["../../../src/lib/derivers/ods.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odt.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/odt.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAyCxD,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,MAqCvC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,OAgBxB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { unzipSync } from "fflate";
|
|
3
|
+
import { bodyOf, parseHtml } from "@intentic/webq/dom";
|
|
4
|
+
import { renderMarkdown } from "@intentic/webq/markdown";
|
|
5
|
+
import { attributeOf, decodeEntities } from "../xml.js";
|
|
6
|
+
const TAG = {
|
|
7
|
+
"text:p": "p",
|
|
8
|
+
"text:list": "ul",
|
|
9
|
+
"text:list-item": "li",
|
|
10
|
+
"text:list-header": "li",
|
|
11
|
+
"text:span": "span",
|
|
12
|
+
"text:a": "a",
|
|
13
|
+
"text:line-break": "br",
|
|
14
|
+
"text:note-citation": "sup",
|
|
15
|
+
"table:table": "table",
|
|
16
|
+
"table:table-header-rows": "thead",
|
|
17
|
+
"table:table-row": "tr",
|
|
18
|
+
"table:table-cell": "td",
|
|
19
|
+
"table:covered-table-cell": "td",
|
|
20
|
+
"table:table-column": "col",
|
|
21
|
+
"table:table-columns": "colgroup",
|
|
22
|
+
};
|
|
23
|
+
const DROP_SUBTREE = [
|
|
24
|
+
"office:annotation",
|
|
25
|
+
"text:tracked-changes",
|
|
26
|
+
"draw:frame",
|
|
27
|
+
"text:table-of-content-source",
|
|
28
|
+
"text:index-title-template",
|
|
29
|
+
"text:alphabetical-index-source",
|
|
30
|
+
];
|
|
31
|
+
const dropSubtrees = (xml) => DROP_SUBTREE.reduce((text, tag) => text.replaceAll(new RegExp(`<${tag}\\b[^>]*?(?:/>|>[\\s\\S]*?</${tag}>)`, "g"), ""), xml);
|
|
32
|
+
export const odfToHtml = (xml) => {
|
|
33
|
+
const start = xml.indexOf("<office:text");
|
|
34
|
+
const end = xml.lastIndexOf("</office:text>");
|
|
35
|
+
const body = dropSubtrees(start === -1 || end === -1 ? xml : xml.slice(start, end));
|
|
36
|
+
return (body
|
|
37
|
+
.replaceAll(/<text:h\b([^>]*)>([\s\S]*?)<\/text:h>/g, (_, attributes, inner) => {
|
|
38
|
+
const level = Math.min(6, Math.max(1, Number(attributeOf(attributes, "text:outline-level") ?? "1") || 1));
|
|
39
|
+
return `<h${level}>${inner}</h${level}>`;
|
|
40
|
+
})
|
|
41
|
+
.replaceAll(/<text:s\b([^>]*)\/>/g, (_, attributes) => " ".repeat(Number(attributeOf(attributes, "text:c") ?? "1") || 1))
|
|
42
|
+
.replaceAll(/<text:tab\b[^>]*\/>/g, " ")
|
|
43
|
+
.replaceAll(/<(\/?)([a-zA-Z0-9]+:[a-zA-Z0-9-]+)((?:\s[^>]*?)?)(\/?)>/g, (_, close, name, attributes, selfClosing) => {
|
|
44
|
+
const mapped = TAG[name];
|
|
45
|
+
if (mapped === undefined) {
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
if (close === "/") {
|
|
49
|
+
return `</${mapped}>`;
|
|
50
|
+
}
|
|
51
|
+
if (mapped === "a") {
|
|
52
|
+
const href = attributeOf(attributes, "xlink:href");
|
|
53
|
+
return href === undefined ? "<a>" : `<a href="${href.replaceAll('"', """)}">`;
|
|
54
|
+
}
|
|
55
|
+
return selfClosing === "/" && mapped !== "br" && mapped !== "col" ? `<${mapped}></${mapped}>` : `<${mapped}>`;
|
|
56
|
+
})
|
|
57
|
+
.replaceAll(/<li>\s*<p>/g, "<li>")
|
|
58
|
+
.replaceAll(/<\/p>\s*<\/li>/g, "</li>"));
|
|
59
|
+
};
|
|
60
|
+
export const odtDeriver = {
|
|
61
|
+
name: "odt",
|
|
62
|
+
version: 1,
|
|
63
|
+
derive: async (absPath) => {
|
|
64
|
+
const zip = unzipSync(new Uint8Array(await readFile(absPath)));
|
|
65
|
+
const decoder = new TextDecoder();
|
|
66
|
+
const content = zip["content.xml"];
|
|
67
|
+
if (content === undefined) {
|
|
68
|
+
return { markdown: "", notes: ["no content.xml in this OpenDocument container"] };
|
|
69
|
+
}
|
|
70
|
+
const meta = zip["meta.xml"];
|
|
71
|
+
const titleMatch = meta === undefined ? null : /<dc:title>([\s\S]*?)<\/dc:title>/.exec(decoder.decode(meta));
|
|
72
|
+
const title = titleMatch?.[1] === undefined || titleMatch[1].trim() === "" ? undefined : decodeEntities(titleMatch[1].trim());
|
|
73
|
+
const body = bodyOf(parseHtml(`<html><body>${odfToHtml(decoder.decode(content))}</body></html>`));
|
|
74
|
+
return { markdown: body === undefined ? "" : renderMarkdown(body), title, notes: [] };
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=odt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odt.js","sourceRoot":"","sources":["../../../src/lib/derivers/odt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-furniture.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/pdf-furniture.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAEzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AA2DD,eAAO,MAAM,qBAAqB,UAAW,SAAS,MAAM,EAAE,KAAG,UAmChE,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
const EDGE_LINES = 3;
|
|
2
|
+
const RECUR_SHARE = 0.6;
|
|
3
|
+
const MIN_PAGES = 4;
|
|
4
|
+
const PAGE_NUMBER = [
|
|
5
|
+
/^page\s+\d{1,4}(?:\s+of\s+\d{1,4})?$/i,
|
|
6
|
+
/^\d{1,4}\s*(?:of|\/)\s*\d{1,4}$/i,
|
|
7
|
+
/^[-–—]\s*\d{1,4}\s*[-–—]$/,
|
|
8
|
+
];
|
|
9
|
+
const signaturesOf = (line, page) => {
|
|
10
|
+
const exact = line.replaceAll(/\s+/g, " ").trim().toLowerCase();
|
|
11
|
+
return [`=${exact}`, `~${exact.replaceAll(/\d+/g, (n) => `#${Number(n) - page}`)}`];
|
|
12
|
+
};
|
|
13
|
+
const edgesOf = (lines) => {
|
|
14
|
+
const filled = lines.flatMap((line, index) => (line.trim() === "" ? [] : [index]));
|
|
15
|
+
const edge = Math.min(EDGE_LINES, Math.floor(filled.length / 2));
|
|
16
|
+
return edge === 0 ? { top: [], bottom: [] } : { top: filled.slice(0, edge), bottom: filled.slice(-edge) };
|
|
17
|
+
};
|
|
18
|
+
const recurringAt = (split, side, needed) => {
|
|
19
|
+
const recurrence = new Map();
|
|
20
|
+
for (const [page, lines] of split.entries()) {
|
|
21
|
+
for (const signature of new Set(edgesOf(lines)[side].flatMap((index) => signaturesOf(lines[index] ?? "", page)))) {
|
|
22
|
+
recurrence.set(signature, (recurrence.get(signature) ?? 0) + 1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return new Set([...recurrence].filter(([signature, count]) => count >= needed && !/^[=~]#?-?\d+$/.test(signature)).map(([signature]) => signature));
|
|
26
|
+
};
|
|
27
|
+
const BARE_NUMBER = /^\d{1,4}$/;
|
|
28
|
+
const folioOffset = (split, needed) => {
|
|
29
|
+
const votes = new Map();
|
|
30
|
+
split.forEach((lines, page) => {
|
|
31
|
+
const offsets = new Set([...edgesOf(lines).top, ...edgesOf(lines).bottom]
|
|
32
|
+
.map((index) => (lines[index] ?? "").trim())
|
|
33
|
+
.filter((line) => BARE_NUMBER.test(line))
|
|
34
|
+
.map((line) => Number(line) - page));
|
|
35
|
+
for (const offset of offsets) {
|
|
36
|
+
votes.set(offset, (votes.get(offset) ?? 0) + 1);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
const [offset, count] = [...votes].toSorted((a, b) => b[1] - a[1])[0] ?? [0, 0];
|
|
40
|
+
return count >= needed ? offset : undefined;
|
|
41
|
+
};
|
|
42
|
+
export const stripRunningFurniture = (pages) => {
|
|
43
|
+
if (pages.length < MIN_PAGES) {
|
|
44
|
+
return { pages: [...pages], removed: 0, example: undefined };
|
|
45
|
+
}
|
|
46
|
+
const split = pages.map((page) => page.split("\n"));
|
|
47
|
+
const needed = Math.ceil(pages.length * RECUR_SHARE);
|
|
48
|
+
const headers = recurringAt(split, "top", needed);
|
|
49
|
+
const footers = recurringAt(split, "bottom", needed);
|
|
50
|
+
const offset = folioOffset(split, needed);
|
|
51
|
+
const seen = new Map();
|
|
52
|
+
let removed = 0;
|
|
53
|
+
const out = split.map((lines, page) => {
|
|
54
|
+
const { top, bottom } = edgesOf(lines);
|
|
55
|
+
const furniture = (running) => (index) => {
|
|
56
|
+
const line = (lines[index] ?? "").trim();
|
|
57
|
+
const folio = offset !== undefined && BARE_NUMBER.test(line) && Number(line) - page === offset;
|
|
58
|
+
return folio || signaturesOf(line, page).some((signature) => running.has(signature)) || PAGE_NUMBER.some((shape) => shape.test(line));
|
|
59
|
+
};
|
|
60
|
+
const drop = new Set([...top.filter(furniture(headers)), ...bottom.filter(furniture(footers))]);
|
|
61
|
+
for (const index of drop) {
|
|
62
|
+
const line = (lines[index] ?? "").trim();
|
|
63
|
+
if (!/^\d+$/.test(line)) {
|
|
64
|
+
seen.set(line, (seen.get(line) ?? 0) + 1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
removed += drop.size;
|
|
68
|
+
return lines
|
|
69
|
+
.filter((_, index) => !drop.has(index))
|
|
70
|
+
.join("\n")
|
|
71
|
+
.trim();
|
|
72
|
+
});
|
|
73
|
+
const example = [...seen].toSorted((a, b) => b[1] - a[1])[0]?.[0];
|
|
74
|
+
return { pages: out, removed, example };
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=pdf-furniture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-furniture.js","sourceRoot":"","sources":["../../../src/lib/derivers/pdf-furniture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/pdf.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAmBxD,eAAO,MAAM,YAAY,QAAO,OAAoD,CAAC;AAsCrF,eAAO,MAAM,UAAU,EAAE,OAqCxB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { extractText, getDocumentProxy, getMeta } from "unpdf";
|
|
7
|
+
import { onPath } from "../tools.js";
|
|
8
|
+
import { stripRunningFurniture } from "./pdf-furniture.js";
|
|
9
|
+
const SCAN_THRESHOLD_CHARS_PER_PAGE = 24;
|
|
10
|
+
const MAX_OCR_PAGES = 20;
|
|
11
|
+
const OCR_DPI = "200";
|
|
12
|
+
const run = promisify(execFile);
|
|
13
|
+
export const ocrAvailable = () => onPath("tesseract") && onPath("pdftoppm");
|
|
14
|
+
const recognisePages = async (absPath, totalPages) => {
|
|
15
|
+
const dir = await mkdtemp(join(tmpdir(), "fileq-ocr-"));
|
|
16
|
+
try {
|
|
17
|
+
await run("pdftoppm", ["-r", OCR_DPI, "-png", "-f", "1", "-l", String(Math.min(totalPages, MAX_OCR_PAGES)), absPath, join(dir, "page")], {
|
|
18
|
+
timeout: 120_000,
|
|
19
|
+
});
|
|
20
|
+
const images = (await readdir(dir)).filter((name) => name.endsWith(".png")).toSorted();
|
|
21
|
+
const pages = [];
|
|
22
|
+
for (const image of images) {
|
|
23
|
+
const { stdout } = await run("tesseract", [join(dir, image), "stdout", "-l", "eng"], { timeout: 120_000, maxBuffer: 16 * 1024 * 1024 });
|
|
24
|
+
pages.push(stdout.replaceAll(/[ \t]+/g, " ").trim());
|
|
25
|
+
}
|
|
26
|
+
return pages;
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
await rm(dir, { recursive: true, force: true });
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const pagesToMarkdown = (pages) => pages.length === 1
|
|
33
|
+
? (pages[0] ?? "")
|
|
34
|
+
: pages.map((page, index) => `## Page ${index + 1}\n\n${page === "" ? "(no text on this page)" : page}`).join("\n\n");
|
|
35
|
+
const furnitureNotes = (removed, example) => removed === 0
|
|
36
|
+
? []
|
|
37
|
+
: [
|
|
38
|
+
`removed ${removed} running header, footer and page-number line${removed === 1 ? "" : "s"}${example === undefined ? "" : ` (such as "${example}")`}`,
|
|
39
|
+
];
|
|
40
|
+
const withoutFurniture = (pages) => {
|
|
41
|
+
const { pages: kept, removed, example } = stripRunningFurniture(pages);
|
|
42
|
+
return { markdown: pagesToMarkdown(kept), notes: furnitureNotes(removed, example) };
|
|
43
|
+
};
|
|
44
|
+
export const pdfDeriver = {
|
|
45
|
+
get name() {
|
|
46
|
+
return ocrAvailable() ? "pdf+ocr" : "pdf";
|
|
47
|
+
},
|
|
48
|
+
version: 2,
|
|
49
|
+
derive: async (absPath) => {
|
|
50
|
+
const pdf = await getDocumentProxy(new Uint8Array(await readFile(absPath)));
|
|
51
|
+
const { totalPages, text } = await extractText(pdf, { mergePages: false });
|
|
52
|
+
const meta = await getMeta(pdf).catch(() => undefined);
|
|
53
|
+
const info = meta?.info;
|
|
54
|
+
const title = typeof info?.["Title"] === "string" && info["Title"] !== "" ? info["Title"] : undefined;
|
|
55
|
+
const pages = text.map((page) => page.replaceAll(/[ \t]+/g, " ").trim());
|
|
56
|
+
const totalChars = pages.reduce((sum, page) => sum + page.length, 0);
|
|
57
|
+
if (totalChars < SCAN_THRESHOLD_CHARS_PER_PAGE * totalPages) {
|
|
58
|
+
const plural = totalPages === 1 ? "" : "s";
|
|
59
|
+
if (!ocrAvailable()) {
|
|
60
|
+
return {
|
|
61
|
+
markdown: "",
|
|
62
|
+
title,
|
|
63
|
+
notes: [`no usable text layer across ${totalPages} page${plural} (a scan?): OCR is not part of this tier`],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const recognised = await recognisePages(absPath, totalPages);
|
|
67
|
+
const notes = [
|
|
68
|
+
`scanned: text recognised by OCR (tesseract) on ${recognised.length} of ${totalPages} page${plural} — recognised, not exact; check figures against the page image`,
|
|
69
|
+
];
|
|
70
|
+
if (totalPages > MAX_OCR_PAGES) {
|
|
71
|
+
notes.push(`OCR stops at ${MAX_OCR_PAGES} pages: run tesseract over the rest yourself if they matter`);
|
|
72
|
+
}
|
|
73
|
+
const { markdown, notes: stripped } = withoutFurniture(recognised);
|
|
74
|
+
return { markdown, title, notes: [...notes, ...stripped] };
|
|
75
|
+
}
|
|
76
|
+
return { title, ...withoutFurniture(pages) };
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=pdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/lib/derivers/pdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pptx.d.ts","sourceRoot":"","sources":["../../../src/lib/derivers/pptx.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AASxD,eAAO,MAAM,eAAe,QAAS,MAAM,KAAG,MAAM,EAQd,CAAC;AAavC,eAAO,MAAM,WAAW,EAAE,OA4BzB,CAAC"}
|