@cairn-tool/cairn 3.2.0 → 3.3.1

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 (78) hide show
  1. package/README.md +73 -29
  2. package/dist/agent/audit/index.d.ts +6 -6
  3. package/dist/agent/audit/index.js +6 -17
  4. package/dist/agent/audit/index.js.map +1 -1
  5. package/dist/atomic-write.d.ts +22 -0
  6. package/dist/atomic-write.js +42 -0
  7. package/dist/atomic-write.js.map +1 -0
  8. package/dist/binary-kind.d.ts +13 -0
  9. package/dist/binary-kind.js +25 -0
  10. package/dist/binary-kind.js.map +1 -0
  11. package/dist/cli.js +543 -250
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/jira.js +1 -21
  14. package/dist/commands/jira.js.map +1 -1
  15. package/dist/commands/pdf.d.ts +29 -0
  16. package/dist/commands/pdf.js +345 -0
  17. package/dist/commands/pdf.js.map +1 -0
  18. package/dist/contract/registry.js +64 -0
  19. package/dist/contract/registry.js.map +1 -1
  20. package/dist/contract/schemas/index.js +2 -0
  21. package/dist/contract/schemas/index.js.map +1 -1
  22. package/dist/contract/schemas/pdf.d.ts +2 -0
  23. package/dist/contract/schemas/pdf.js +292 -0
  24. package/dist/contract/schemas/pdf.js.map +1 -0
  25. package/dist/jira/adf/to-markdown.js +2 -32
  26. package/dist/jira/adf/to-markdown.js.map +1 -1
  27. package/dist/markdown-stringify.d.ts +35 -0
  28. package/dist/markdown-stringify.js +44 -0
  29. package/dist/markdown-stringify.js.map +1 -0
  30. package/dist/pdf/attachments.d.ts +50 -0
  31. package/dist/pdf/attachments.js +229 -0
  32. package/dist/pdf/attachments.js.map +1 -0
  33. package/dist/pdf/diagnostics.d.ts +110 -0
  34. package/dist/pdf/diagnostics.js +137 -0
  35. package/dist/pdf/diagnostics.js.map +1 -0
  36. package/dist/pdf/document.d.ts +159 -0
  37. package/dist/pdf/document.js +272 -0
  38. package/dist/pdf/document.js.map +1 -0
  39. package/dist/pdf/forms.d.ts +9 -0
  40. package/dist/pdf/forms.js +101 -0
  41. package/dist/pdf/forms.js.map +1 -0
  42. package/dist/pdf/inspect.d.ts +42 -0
  43. package/dist/pdf/inspect.js +232 -0
  44. package/dist/pdf/inspect.js.map +1 -0
  45. package/dist/pdf/layout.d.ts +78 -0
  46. package/dist/pdf/layout.js +524 -0
  47. package/dist/pdf/layout.js.map +1 -0
  48. package/dist/pdf/outline.d.ts +30 -0
  49. package/dist/pdf/outline.js +127 -0
  50. package/dist/pdf/outline.js.map +1 -0
  51. package/dist/pdf/read.d.ts +62 -0
  52. package/dist/pdf/read.js +193 -0
  53. package/dist/pdf/read.js.map +1 -0
  54. package/dist/pdf/struct.d.ts +35 -0
  55. package/dist/pdf/struct.js +226 -0
  56. package/dist/pdf/struct.js.map +1 -0
  57. package/dist/pdf/text.d.ts +71 -0
  58. package/dist/pdf/text.js +166 -0
  59. package/dist/pdf/text.js.map +1 -0
  60. package/dist/pdf/to-markdown.d.ts +22 -0
  61. package/dist/pdf/to-markdown.js +289 -0
  62. package/dist/pdf/to-markdown.js.map +1 -0
  63. package/dist/pdf/types.d.ts +205 -0
  64. package/dist/pdf/types.js +2 -0
  65. package/dist/pdf/types.js.map +1 -0
  66. package/dist/pdf/validate.d.ts +51 -0
  67. package/dist/pdf/validate.js +136 -0
  68. package/dist/pdf/validate.js.map +1 -0
  69. package/dist/serve/pdf-tools.d.ts +2 -0
  70. package/dist/serve/pdf-tools.js +196 -0
  71. package/dist/serve/pdf-tools.js.map +1 -0
  72. package/dist/serve/tools.d.ts +2 -17
  73. package/dist/serve/tools.js +4 -0
  74. package/dist/serve/tools.js.map +1 -1
  75. package/dist/serve/types.d.ts +22 -0
  76. package/dist/serve/types.js +2 -0
  77. package/dist/serve/types.js.map +1 -0
  78. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"struct.js","sourceRoot":"","sources":["../../src/pdf/struct.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { OpenDocument } from "./document.js";
2
+ /** Two decimal places, applied wherever a float reaches a payload or a compare. */
3
+ export declare function round2(value: number): number;
4
+ /**
5
+ * One positioned run of text, in page-upright coordinates.
6
+ *
7
+ * `x`/`y` are the baseline origin with y increasing **downwards** from the top
8
+ * left, which is what lets every comparison downstream read as "smaller y is
9
+ * higher on the page".
10
+ */
11
+ export interface PositionedRun {
12
+ page: number;
13
+ /** Order within the page as pdf.js emitted it: the final sort tie-break. */
14
+ index: number;
15
+ text: string;
16
+ x: number;
17
+ y: number;
18
+ width: number;
19
+ height: number;
20
+ /** Effective font size in user units. */
21
+ size: number;
22
+ /**
23
+ * Document-stable font identity.
24
+ *
25
+ * `TextItem.fontName` is a *per-page* internal id (`g_d10_f1`) and the same id
26
+ * means different fonts on different pages, so keying anything document-wide
27
+ * on it is silently wrong past page one. That failure presents as "headings
28
+ * detected inconsistently", which is very hard to attribute, so the raw id
29
+ * never leaves this module.
30
+ */
31
+ fontKey: string;
32
+ fontFamily: string;
33
+ bold: boolean;
34
+ italic: boolean;
35
+ vertical: boolean;
36
+ /** Right angles only; null means an arbitrary rotation, excluded from layout. */
37
+ angle: 0 | 90 | 180 | 270 | null;
38
+ hasEOL: boolean;
39
+ /** Marked-content id, when the caller asked for marked content. */
40
+ mcid: string | null;
41
+ }
42
+ export interface PageRuns {
43
+ page: number;
44
+ runs: PositionedRun[];
45
+ width: number;
46
+ height: number;
47
+ rotation: number;
48
+ /** Non-whitespace code points across the whole page, including dropped runs. */
49
+ characters: number;
50
+ }
51
+ /**
52
+ * Extracts one page's runs.
53
+ *
54
+ * Position comes from `viewport.convertToViewportPoint`, never from a
55
+ * hand-rolled matrix: `transform[4]`/`[5]` are PDF user space — y-up, origin
56
+ * bottom-left, `/Rotate` not applied — and the viewport applies the rotation and
57
+ * the flip in one call that cannot drift from pdf.js's own convention.
58
+ */
59
+ export declare function extractPage(handle: OpenDocument, page: number, options?: {
60
+ markedContent?: boolean;
61
+ }): Promise<PageRuns>;
62
+ /**
63
+ * Renders one page's runs as plain text.
64
+ *
65
+ * Line grouping only — no paragraph, heading, or list inference, which is
66
+ * `to-markdown`'s job. Runs are ordered top to bottom then left to right, and a
67
+ * new line starts when the baseline moves by more than a third of the run
68
+ * height, which is the same tolerance `layout.ts` uses so the two agree about
69
+ * what a line is.
70
+ */
71
+ export declare function runsToText(runs: PositionedRun[]): string;
@@ -0,0 +1,166 @@
1
+ /** Two decimal places, applied wherever a float reaches a payload or a compare. */
2
+ export function round2(value) {
3
+ return Math.round(value * 100) / 100;
4
+ }
5
+ const BOLD = /bold|black|heavy|semibold|demi/i;
6
+ const ITALIC = /italic|oblique/i;
7
+ function nonWhitespace(text) {
8
+ let count = 0;
9
+ for (const char of text)
10
+ if (!/\s/.test(char))
11
+ count += 1;
12
+ return count;
13
+ }
14
+ /**
15
+ * Snaps a rotation to a right angle, or reports that it is not one.
16
+ *
17
+ * Text at an arbitrary angle cannot participate in line grouping — every
18
+ * geometric assumption downstream is axis-aligned — so it is excluded and
19
+ * reported rather than being folded in at the wrong position.
20
+ */
21
+ function angleOf(transform) {
22
+ const degrees = (Math.atan2(transform[1] ?? 0, transform[0] ?? 1) * 180) / Math.PI;
23
+ const normalized = ((degrees % 360) + 360) % 360;
24
+ for (const candidate of [0, 90, 180, 270]) {
25
+ const delta = Math.abs(normalized - candidate);
26
+ if (delta <= 1 || delta >= 359)
27
+ return candidate;
28
+ }
29
+ return normalized > 359 || normalized < 1 ? 0 : null;
30
+ }
31
+ function isTextItem(item) {
32
+ return typeof item.str === "string" && item.type === undefined;
33
+ }
34
+ /**
35
+ * Extracts one page's runs.
36
+ *
37
+ * Position comes from `viewport.convertToViewportPoint`, never from a
38
+ * hand-rolled matrix: `transform[4]`/`[5]` are PDF user space — y-up, origin
39
+ * bottom-left, `/Rotate` not applied — and the viewport applies the rotation and
40
+ * the flip in one call that cannot drift from pdf.js's own convention.
41
+ */
42
+ export async function extractPage(handle, page, options = {}) {
43
+ const proxy = await handle.within(() => handle.doc.getPage(page));
44
+ try {
45
+ const viewport = proxy.getViewport({ scale: 1 });
46
+ const content = await handle.within(() => proxy.getTextContent({ includeMarkedContent: Boolean(options.markedContent) }));
47
+ const runs = [];
48
+ let characters = 0;
49
+ // Only `beginMarkedContentProps` carries an id, so the stack records the
50
+ // innermost id-bearing frame and text inherits it.
51
+ const stack = [];
52
+ let index = 0;
53
+ for (const item of content.items) {
54
+ if (item.type !== undefined) {
55
+ if (item.type.startsWith("begin"))
56
+ stack.push(item.id ?? null);
57
+ else if (item.type.startsWith("end"))
58
+ stack.pop();
59
+ continue;
60
+ }
61
+ if (!isTextItem(item))
62
+ continue;
63
+ const text = item.str ?? "";
64
+ characters += nonWhitespace(text);
65
+ if (text.trim() === "")
66
+ continue;
67
+ const transform = item.transform ?? [1, 0, 0, 1, 0, 0];
68
+ const [x, y] = viewport.convertToViewportPoint(transform[4] ?? 0, transform[5] ?? 0);
69
+ const style = content.styles[item.fontName ?? ""] ?? {};
70
+ const family = style.fontFamily ?? "";
71
+ const matrixSize = Math.hypot(transform[1] ?? 0, transform[3] ?? 1);
72
+ const size = round2(item.height && item.height > 0 ? item.height : matrixSize);
73
+ let mcid = null;
74
+ for (let depth = stack.length - 1; depth >= 0; depth -= 1) {
75
+ if (stack[depth]) {
76
+ mcid = stack[depth];
77
+ break;
78
+ }
79
+ }
80
+ runs.push({
81
+ page,
82
+ index,
83
+ text,
84
+ x: round2(x),
85
+ y: round2(y),
86
+ width: round2(item.width ?? 0),
87
+ height: round2(item.height ?? 0),
88
+ size,
89
+ fontKey: `${family}@${size}`,
90
+ fontFamily: family,
91
+ // The only weight signal `getTextContent` offers. It works for embedded
92
+ // fonts with descriptive names and never for the standard 14, which
93
+ // pdf.js reports as a generic CSS family ("sans-serif") regardless of
94
+ // weight — so size stays the primary heading signal and this is a hint.
95
+ bold: BOLD.test(family),
96
+ italic: ITALIC.test(family),
97
+ vertical: Boolean(style.vertical),
98
+ angle: angleOf(transform),
99
+ hasEOL: Boolean(item.hasEOL),
100
+ mcid,
101
+ });
102
+ index += 1;
103
+ }
104
+ return {
105
+ page,
106
+ runs,
107
+ width: round2(viewport.width),
108
+ height: round2(viewport.height),
109
+ rotation: viewport.rotation,
110
+ characters,
111
+ };
112
+ }
113
+ finally {
114
+ // The per-page font and glyph caches. Without this a 900-page document
115
+ // exhausts memory on a machine that has plenty.
116
+ proxy.cleanup();
117
+ }
118
+ }
119
+ /**
120
+ * Renders one page's runs as plain text.
121
+ *
122
+ * Line grouping only — no paragraph, heading, or list inference, which is
123
+ * `to-markdown`'s job. Runs are ordered top to bottom then left to right, and a
124
+ * new line starts when the baseline moves by more than a third of the run
125
+ * height, which is the same tolerance `layout.ts` uses so the two agree about
126
+ * what a line is.
127
+ */
128
+ export function runsToText(runs) {
129
+ if (runs.length === 0)
130
+ return "";
131
+ const ordered = [...runs].sort((a, b) => a.y - b.y || a.x - b.x || a.index - b.index);
132
+ const lines = [];
133
+ let current = [ordered[0]];
134
+ for (const run of ordered.slice(1)) {
135
+ const previous = current[current.length - 1];
136
+ const tolerance = Math.max(previous.size, run.size) * 0.35;
137
+ if (Math.abs(run.y - previous.y) <= tolerance)
138
+ current.push(run);
139
+ else {
140
+ lines.push(joinLine(current));
141
+ current = [run];
142
+ }
143
+ }
144
+ lines.push(joinLine(current));
145
+ return lines.join("\n");
146
+ }
147
+ /**
148
+ * Joins one line's runs, reconstructing word spacing from glyph advances.
149
+ *
150
+ * A PDF carries no spaces between separately positioned runs; the gap between
151
+ * where one run ends and the next begins is the only evidence, measured in
152
+ * multiples of the font size so it holds at any scale.
153
+ */
154
+ function joinLine(runs) {
155
+ const ordered = [...runs].sort((a, b) => a.x - b.x || a.index - b.index);
156
+ let text = ordered[0].text;
157
+ for (let index = 1; index < ordered.length; index += 1) {
158
+ const previous = ordered[index - 1];
159
+ const run = ordered[index];
160
+ const gap = run.x - (previous.x + previous.width);
161
+ const needsSpace = gap > previous.size * 0.25 && !/\s$/.test(text) && !/^\s/.test(run.text);
162
+ text += needsSpace ? ` ${run.text}` : run.text;
163
+ }
164
+ return text.trimEnd();
165
+ }
166
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/pdf/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { OpenDocument } from "./document.js";
2
+ import type { Block, PdfDiagnostic } from "./types.js";
3
+ export interface ToMarkdownResult {
4
+ markdown: string;
5
+ diagnostics: PdfDiagnostic[];
6
+ blocks: Block[];
7
+ }
8
+ export interface ConvertOptions {
9
+ /** Pages to emit. Statistics are still computed across the whole document. */
10
+ pages?: number[];
11
+ headingLevels?: Map<string, number>;
12
+ }
13
+ /**
14
+ * Converts a document to Markdown.
15
+ *
16
+ * The path is chosen **per page**: a page whose structure tree carries at least
17
+ * one content leaf uses it, and any other page falls to geometry. Mixed
18
+ * documents are real — a scanned appendix bound onto a tagged report — and
19
+ * `getMarkInfo().Marked` alone is not sufficient evidence, since producers set
20
+ * it and ship empty trees.
21
+ */
22
+ export declare function toMarkdown(handle: OpenDocument, options?: ConvertOptions): Promise<ToMarkdownResult>;
@@ -0,0 +1,289 @@
1
+ import { stringifyMarkdown } from "../markdown-stringify.js";
2
+ import { CODES, DiagnosticSink } from "./diagnostics.js";
3
+ import { blocksFromLayout } from "./layout.js";
4
+ import { blocksFromStruct } from "./struct.js";
5
+ import { extractPage } from "./text.js";
6
+ /** The five Latin ligatures a text layer routinely carries. */
7
+ const LIGATURES = {
8
+ ff: "ff",
9
+ fi: "fi",
10
+ fl: "fl",
11
+ ffi: "ffi",
12
+ ffl: "ffl",
13
+ };
14
+ /**
15
+ * Normalizes one span's text.
16
+ *
17
+ * Ligature expansion is opinionated and worth the notice it carries: leaving
18
+ * U+FB01 in place breaks searching a converted document for "find", "office", or
19
+ * "file", which is most of the reason to convert to Markdown at all.
20
+ *
21
+ * Markdown syntax is deliberately *not* pre-escaped here — that is
22
+ * remark-stringify's job, and doing both double-escapes.
23
+ */
24
+ function normalizeText(text, seen) {
25
+ let out = "";
26
+ for (const char of text) {
27
+ const expansion = LIGATURES[char];
28
+ if (expansion) {
29
+ seen.ligatures = true;
30
+ out += expansion;
31
+ continue;
32
+ }
33
+ const code = char.codePointAt(0) ?? 0;
34
+ if ((code < 32 && char !== "\t") || code === 127) {
35
+ seen.controls = true;
36
+ continue;
37
+ }
38
+ out += char;
39
+ }
40
+ // Two byte sequences for the same visible text defeat every downstream grep.
41
+ return out.replace(/\s+/g, " ").normalize("NFC");
42
+ }
43
+ /**
44
+ * Renders spans as phrasing content, in a fixed nesting order.
45
+ *
46
+ * Code innermost, then emphasis, then strong — fixed for the same reason the ADF
47
+ * converter fixes its mark order: mdast nests what the source keeps flat, and a
48
+ * varying nesting order varies the output bytes for identical input.
49
+ */
50
+ function phrasing(spans, seen) {
51
+ const out = [];
52
+ for (const span of spans) {
53
+ const value = normalizeText(span.text, seen);
54
+ if (!value)
55
+ continue;
56
+ let node = span.code
57
+ ? { type: "inlineCode", value }
58
+ : { type: "text", value };
59
+ if (span.italic)
60
+ node = { type: "emphasis", children: [node] };
61
+ if (span.bold)
62
+ node = { type: "strong", children: [node] };
63
+ out.push(node);
64
+ }
65
+ return out;
66
+ }
67
+ function paragraphOf(spans, seen) {
68
+ const children = phrasing(spans, seen);
69
+ return children.length ? { type: "paragraph", children } : null;
70
+ }
71
+ /** Converts one block. Never branches on `provenance.path`. */
72
+ function toMdast(block, sink, seen) {
73
+ switch (block.kind) {
74
+ case "heading": {
75
+ const children = phrasing(block.spans, seen);
76
+ if (!children.length)
77
+ return [];
78
+ return [
79
+ {
80
+ type: "heading",
81
+ depth: Math.min(Math.max(block.level ?? 1, 1), 6),
82
+ children,
83
+ },
84
+ ];
85
+ }
86
+ case "paragraph":
87
+ case "figure":
88
+ case "code": {
89
+ if (block.kind === "code") {
90
+ const value = block.spans.map((span) => span.text).join("\n");
91
+ // `lang` and `meta` pinned null: nothing here can infer a language, and
92
+ // guessing one would be a claim the converter cannot support.
93
+ return value ? [{ type: "code", lang: null, meta: null, value }] : [];
94
+ }
95
+ const paragraph = paragraphOf(block.spans, seen);
96
+ return paragraph ? [paragraph] : [];
97
+ }
98
+ case "caption": {
99
+ const children = phrasing(block.spans, seen);
100
+ return children.length
101
+ ? [{ type: "paragraph", children: [{ type: "emphasis", children }] }]
102
+ : [];
103
+ }
104
+ case "blockquote": {
105
+ const children = block.children.flatMap((child) => toMdast(child, sink, seen));
106
+ return children.length ? [{ type: "blockquote", children: children }] : [];
107
+ }
108
+ case "list": {
109
+ const items = block.children
110
+ .filter((child) => child.kind === "listItem")
111
+ .map((child) => {
112
+ const own = paragraphOf(child.spans, seen);
113
+ const nested = child.children.flatMap((grand) => toMdast(grand, sink, seen));
114
+ const content = [...(own ? [own] : []), ...nested];
115
+ // `spread` and `checked` pinned rather than derived from input
116
+ // whitespace, which would make the bytes depend on the source's
117
+ // incidental leading.
118
+ return { type: "listItem", spread: false, checked: null, children: content };
119
+ })
120
+ .filter((item) => item.children.length > 0);
121
+ return items.length
122
+ ? [
123
+ {
124
+ type: "list",
125
+ ordered: Boolean(block.ordered),
126
+ start: null,
127
+ spread: false,
128
+ children: items,
129
+ },
130
+ ]
131
+ : [];
132
+ }
133
+ case "listItem": {
134
+ const paragraph = paragraphOf(block.spans, seen);
135
+ return paragraph ? [paragraph] : [];
136
+ }
137
+ case "table": {
138
+ const rows = block.children.filter((child) => child.kind === "tableRow");
139
+ if (rows.length === 0)
140
+ return [];
141
+ const width = Math.max(...rows.map((row) => row.children.length));
142
+ const mdRows = rows.map((row) => {
143
+ const cells = row.children.slice(0, width).map((cell) => {
144
+ if (cell.children.length > 0)
145
+ sink.add({
146
+ code: CODES.cellSpanDropped,
147
+ quality: "approximate",
148
+ message: "A table cell's block content was flattened into inline content",
149
+ construct: "TD",
150
+ });
151
+ return { type: "tableCell", children: phrasing(cell.spans, seen) };
152
+ });
153
+ while (cells.length < width)
154
+ cells.push({ type: "tableCell", children: [] });
155
+ return { type: "tableRow", children: cells };
156
+ });
157
+ // Alignment is never inferred from geometry: an ADF cell has no alignment
158
+ // and neither does a reconstructed one, so claiming one would be invented.
159
+ const table = {
160
+ type: "table",
161
+ align: Array.from({ length: width }, () => null),
162
+ children: mdRows,
163
+ };
164
+ return [table];
165
+ }
166
+ default:
167
+ return [];
168
+ }
169
+ }
170
+ /**
171
+ * Converts a document to Markdown.
172
+ *
173
+ * The path is chosen **per page**: a page whose structure tree carries at least
174
+ * one content leaf uses it, and any other page falls to geometry. Mixed
175
+ * documents are real — a scanned appendix bound onto a tagged report — and
176
+ * `getMarkInfo().Marked` alone is not sufficient evidence, since producers set
177
+ * it and ship empty trees.
178
+ */
179
+ export async function toMarkdown(handle, options = {}) {
180
+ const sink = new DiagnosticSink();
181
+ const seen = { ligatures: false, controls: false };
182
+ const { doc } = handle;
183
+ const all = Array.from({ length: doc.numPages }, (_, index) => index + 1);
184
+ const wanted = options.pages ?? all;
185
+ const selected = new Set(wanted);
186
+ const structBlocks = [];
187
+ const geometricPages = [];
188
+ let structCount = 0;
189
+ let geometricCount = 0;
190
+ for (const page of all) {
191
+ let runs;
192
+ try {
193
+ runs = await extractPage(handle, page, { markedContent: true });
194
+ }
195
+ catch {
196
+ sink.add({
197
+ code: CODES.contentUndecodable,
198
+ quality: "unsupported",
199
+ message: "The page's content stream could not be decoded; nothing was emitted for it",
200
+ page,
201
+ });
202
+ continue;
203
+ }
204
+ if (runs.runs.length === 0) {
205
+ if (selected.has(page))
206
+ sink.add({
207
+ code: CODES.noTextLayer,
208
+ quality: "unsupported",
209
+ message: "The page carries no text layer; nothing was emitted for it",
210
+ page,
211
+ remediation: "The page is an image. Recognizing its text needs OCR, which this toolset does not do.",
212
+ });
213
+ continue;
214
+ }
215
+ let tree;
216
+ try {
217
+ const proxy = await handle.within(() => doc.getPage(page));
218
+ tree = await handle.within(() => proxy.getStructTree());
219
+ }
220
+ catch {
221
+ tree = null;
222
+ }
223
+ const structured = blocksFromStruct(tree, runs.runs, sink, page);
224
+ if (structured.usable) {
225
+ structCount += 1;
226
+ if (selected.has(page))
227
+ structBlocks.push(...structured.blocks);
228
+ }
229
+ else {
230
+ geometricCount += 1;
231
+ geometricPages.push(runs);
232
+ }
233
+ }
234
+ // Geometry runs over every page it owns, selected or not, so document-wide
235
+ // statistics — the modal body size, the heading ranking, repeated headers —
236
+ // are the same whether or not `--pages` narrowed the output. The selection is
237
+ // applied afterwards, which is what makes a page range a true subset of the
238
+ // full conversion rather than a differently-inferred document.
239
+ const geometric = geometricPages.length
240
+ ? blocksFromLayout(geometricPages, sink, { headingLevels: options.headingLevels })
241
+ : [];
242
+ const geometricSelected = geometric.filter((block) => block.provenance.pages.some((page) => selected.has(page)));
243
+ const blocks = [...structBlocks, ...geometricSelected].sort((a, b) => (a.provenance.pages[0] ?? 0) - (b.provenance.pages[0] ?? 0));
244
+ // Always emitted, and deliberately a notice rather than an approximation:
245
+ // making "this document was untagged" itself blocking would mean --strict
246
+ // refuses essentially every real PDF, which makes the flag meaningless.
247
+ // --strict blocks on the per-construct losses instead.
248
+ sink.add({
249
+ code: CODES.conversionPath,
250
+ quality: "exact",
251
+ message: structCount && geometricCount
252
+ ? `Mixed conversion: ${structCount} page(s) from the structure tree, ${geometricCount} from geometry`
253
+ : structCount
254
+ ? `Converted ${structCount} page(s) from the document's structure tree`
255
+ : `Converted ${geometricCount} page(s) by inferring structure from geometry`,
256
+ remediation: geometricCount > 0
257
+ ? "An untagged page has no paragraphs, headings, or lists to read — all of them are inferred."
258
+ : undefined,
259
+ });
260
+ if (options.pages)
261
+ sink.add({
262
+ code: CODES.pageSubsetConverted,
263
+ quality: "exact",
264
+ message: `Emitted ${wanted.length} of ${doc.numPages} page(s); document-wide inference still used every page`,
265
+ });
266
+ if (geometricCount > 0)
267
+ sink.add({
268
+ code: CODES.inlineStyleInferred,
269
+ quality: "approximate",
270
+ message: "Bold and italic are inferred from font names; underline, strikethrough, and super/subscript are not represented",
271
+ remediation: "The standard 14 fonts report a generic family, so weight is undetectable in documents using them.",
272
+ });
273
+ if (seen.ligatures)
274
+ sink.add({
275
+ code: CODES.ligaturesExpanded,
276
+ quality: "exact",
277
+ message: "Typographic ligatures were expanded to their component letters",
278
+ });
279
+ if (seen.controls)
280
+ sink.add({
281
+ code: CODES.controlCharactersStripped,
282
+ quality: "exact",
283
+ message: "Control characters in the text layer were removed",
284
+ });
285
+ const children = blocks.flatMap((block) => toMdast(block, sink, seen));
286
+ const root = { type: "root", children };
287
+ return { markdown: stringifyMarkdown(root), diagnostics: sink.all(), blocks };
288
+ }
289
+ //# sourceMappingURL=to-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-markdown.js","sourceRoot":"","sources":["../../src/pdf/to-markdown.ts"],"names":[],"mappings":"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"}