@boxpdf/html-writer 0.1.13 → 0.1.15
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/dist/index.cjs +133 -99
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +133 -99
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/semantic-document.ts","../src/semantic-inline.ts","../src/semantic-media.ts"],"sourcesContent":["import type {\n EmbeddedFont,\n EmbeddedType3Font,\n ExtractedPage,\n RasterImage,\n TextSpan,\n Type3Glyph,\n VectorPath,\n} from \"@boxpdf/reader\";\nimport { type SemanticBlock, structurePage, tableToHtml } from \"@boxpdf/reader/structure\";\nimport { type SemanticDocumentStats, writeSemanticDocument } from \"./semantic-document.js\";\nimport { dominantTextColor, semanticTextHtml } from \"./semantic-inline.js\";\nimport { semanticMedia } from \"./semantic-media.js\";\n\nexport type { SemanticDocumentStats } from \"./semantic-document.js\";\n\nexport type HtmlLayout = \"positioned\" | \"flow\";\nexport type HtmlProfile = \"visual\" | \"semantic\";\nexport type HtmlWrite = (chunk: string) => void | Promise<void>;\n\nexport interface HtmlWriterOptions {\n /** Output intent. Visual preserves page presentation; semantic prioritizes reading order. */\n profile?: HtmlProfile;\n /** @deprecated Use `profile: \"visual\"` or `profile: \"semantic\"`. */\n layout?: HtmlLayout;\n title?: string;\n language?: string;\n includeDocument?: boolean;\n includeStyles?: boolean;\n /** Maximum extracted page models retained for document-level semantic decisions. */\n semanticLookaheadPages?: number;\n /** Receives bounded-buffer and document-inference statistics after semantic output completes. */\n onSemanticStats?: (stats: Readonly<SemanticDocumentStats>) => void;\n}\n\nconst styles = `.pdf-document{margin:0 auto}.pdf-page{box-sizing:border-box;margin:1rem auto;background:#fff;color:#000}.pdf-page--visual,.pdf-page--positioned{position:relative;overflow:hidden}.pdf-page-content{position:absolute;transform-origin:0 0}.pdf-span{position:absolute;white-space:pre;transform-origin:left bottom;unicode-bidi:isolate}.pdf-span[data-direction=ttb]{writing-mode:vertical-rl}.pdf-page--semantic,.pdf-page--flow{max-width:60rem;padding:1rem}.pdf-page--semantic p,.pdf-page--flow p{white-space:pre-wrap;unicode-bidi:plaintext}.pdf-semantic-document h1,.pdf-page--semantic h1{font-size:1.7em}.pdf-semantic-document h2,.pdf-page--semantic h2{font-size:1.5em}.pdf-semantic-document h3,.pdf-page--semantic h3{font-size:1.35em}.pdf-semantic-document h4,.pdf-page--semantic h4{font-size:1.1em}.pdf-page table{border-collapse:collapse}.pdf-page td{padding:.15rem .4rem;vertical-align:top}`;\n\nexport async function writeHtmlDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: HtmlWrite,\n options: HtmlWriterOptions = {},\n): Promise<void> {\n const includeDocument = options.includeDocument ?? true;\n if (includeDocument) {\n await write(\"<!doctype html><html\");\n await write(\n ` lang=\"${escapeAttribute(options.language ?? \"en\")}\"><head><meta charset=\"utf-8\">`,\n );\n await write('<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">');\n await write(`<title>${escapeHtml(options.title ?? \"PDF document\")}</title>`);\n if (options.includeStyles ?? true) await write(`<style>${styles}</style>`);\n await write(\"</head><body>\");\n }\n await write('<main class=\"pdf-document\">');\n if (resolveProfile(options) === \"semantic\") {\n const lookahead = semanticLookahead(options.semanticLookaheadPages);\n const stats = await writeSemanticDocument(pages, write, lookahead);\n options.onSemanticStats?.(stats);\n } else {\n for await (const page of pages) await writePage(page, write, options);\n }\n await write(\"</main>\");\n if (includeDocument) await write(\"</body></html>\");\n}\n\nfunction semanticLookahead(value: number | undefined): number {\n const lookahead = value ?? 4;\n if (!Number.isSafeInteger(lookahead) || lookahead < 1 || lookahead > 16) {\n throw new RangeError(\"semanticLookaheadPages must be an integer between 1 and 16\");\n }\n return lookahead;\n}\n\nexport async function writePage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions = {},\n): Promise<void> {\n if (resolveProfile(options) === \"semantic\") await writeFlowPage(page, write);\n else await writePositionedPage(page, write, options);\n}\n\nexport async function pageToHtml(\n page: ExtractedPage,\n options: HtmlWriterOptions = {},\n): Promise<string> {\n let output = \"\";\n await writePage(\n page,\n (chunk) => {\n output += chunk;\n },\n options,\n );\n return output;\n}\n\nasync function writePositionedPage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions,\n): Promise<void> {\n const visualSpans = page.visualSpans ?? page.spans;\n const reflectedOverlay = usesReflectedVisualOverlay(page, visualSpans);\n const quarterTurn = page.rotate === 90 || page.rotate === 270;\n const displayWidth = quarterTurn ? page.height : page.width;\n const displayHeight = quarterTurn ? page.width : page.height;\n await write(\n `<section class=\"pdf-page pdf-page--visual pdf-page--positioned\" data-page=\"${page.number}\" data-rotate=\"${page.rotate}\" style=\"width:${number(displayWidth)}pt;height:${number(displayHeight)}pt\">`,\n );\n const fontAliases = new Map(\n (page.fonts ?? [])\n .filter((font) => font.format === \"truetype\" && !/(?:courier|^TTE)/i.test(font.family ?? \"\"))\n .map((font) => [font.id, `boxpdf-${page.number}-${font.id}`]),\n );\n const type3Fonts = new Map(\n (page.fonts ?? [])\n .filter((font): font is EmbeddedType3Font => font.format === \"type3\")\n .map((font) => [font.id, font]),\n );\n if ((options.includeStyles ?? true) && page.fonts?.length) {\n await write(`<style>${page.fonts.map((font) => fontFace(font, fontAliases)).join(\"\")}</style>`);\n }\n await write(\n `<div class=\"pdf-page-content pdf-page-content--${page.rotate}\" style=\"width:${number(page.width)}pt;height:${number(page.height)}pt${rotationTransform(page)}\">`,\n );\n await write(\n `<svg class=\"pdf-visual-text\" xmlns=\"http://www.w3.org/2000/svg\" width=\"${number(page.width)}pt\" height=\"${number(page.height)}pt\" viewBox=\"0 0 ${number(page.width)} ${number(page.height)}\">`,\n );\n const clipDefinitions =\n imageClipDefinitions(page.images ?? [], page.number, page.height) +\n pathClipDefinitions(page.paths ?? [], page.number);\n if (clipDefinitions) await write(`<defs>${clipDefinitions}</defs>`);\n if (reflectedOverlay) {\n for (const [index, image] of (page.images ?? []).entries()) {\n await write(visualImage(image, page.height, page.number, index));\n }\n }\n for (const fill of page.fills ?? []) {\n const points = fill.points.map(([x, y]) => `${number(x)},${number(page.height - y)}`).join(\" \");\n if (isCssHexColor(fill.color)) {\n const opacity = isUnitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n await write(`<polygon points=\"${points}\" fill=\"${fill.color}\"${opacity}/>`);\n }\n }\n if (page.paths?.length) {\n await write(`<g transform=\"translate(0 ${number(page.height)}) scale(1 -1)\">`);\n for (const [pathIndex, path] of page.paths.entries()) {\n if (!isSvgPath(path.d)) continue;\n const fill = isCssHexColor(path.fill) ? path.fill : \"none\";\n const stroke = isCssHexColor(path.stroke) ? path.stroke : \"none\";\n const strokeWidth =\n path.strokeWidth !== undefined && Number.isFinite(path.strokeWidth) && path.strokeWidth >= 0\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n const fillRule = path.fillRule ? ` fill-rule=\"${path.fillRule}\"` : \"\";\n const fillOpacity = isUnitInterval(path.fillOpacity)\n ? ` fill-opacity=\"${number(path.fillOpacity)}\"`\n : \"\";\n const strokeOpacity = isUnitInterval(path.strokeOpacity)\n ? ` stroke-opacity=\"${number(path.strokeOpacity)}\"`\n : \"\";\n const dasharray = path.strokeDasharray?.every((value) => Number.isFinite(value) && value >= 0)\n ? ` stroke-dasharray=\"${path.strokeDasharray.map(number).join(\" \")}\"`\n : \"\";\n const dashoffset = Number.isFinite(path.strokeDashoffset)\n ? ` stroke-dashoffset=\"${number(path.strokeDashoffset ?? 0)}\"`\n : \"\";\n const linecap = path.strokeLinecap ? ` stroke-linecap=\"${path.strokeLinecap}\"` : \"\";\n const linejoin = path.strokeLinejoin ? ` stroke-linejoin=\"${path.strokeLinejoin}\"` : \"\";\n let output = `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${strokeWidth}${fillOpacity}${strokeOpacity}${dasharray}${dashoffset}${linecap}${linejoin}${fillRule}/>`;\n for (let index = (path.clips?.length ?? 0) - 1; index >= 0; index -= 1) {\n output = `<g clip-path=\"url(#${pathClipId(page.number, pathIndex, index)})\">${output}</g>`;\n }\n await write(output);\n }\n await write(\"</g>\");\n }\n if (!reflectedOverlay) {\n for (const [index, image] of (page.images ?? []).entries()) {\n await write(visualImage(image, page.height, page.number, index));\n }\n }\n for (const span of visualSpans) {\n if (!usesPositionedSpan(span)) {\n const type3 = span.fontAssetId ? type3Fonts.get(span.fontAssetId) : undefined;\n await write(\n type3\n ? visualType3Text(span, type3, page.height)\n : visualText(span, page.height, fontAliases, reflectedOverlay && page.rotate === 180),\n );\n }\n }\n await write(\"</svg>\");\n for (const span of visualSpans) {\n if (usesPositionedSpan(span)) await write(positionedSpan(span, fontAliases));\n }\n await write(\"</div></section>\");\n}\n\nfunction usesReflectedVisualOverlay(page: ExtractedPage, spans: TextSpan[]): boolean {\n return (\n Boolean(page.images?.length) &&\n Boolean(page.paths?.length || page.fills?.length) &&\n spans.length > 0 &&\n spans.every(\n (span) =>\n span.transform !== undefined &&\n Math.abs(span.transform[0] + 1) < 0.000_001 &&\n Math.abs(span.transform[1]) < 0.000_001 &&\n Math.abs(span.transform[2]) < 0.000_001 &&\n Math.abs(span.transform[3] - 1) < 0.000_001,\n )\n );\n}\n\nfunction visualImage(\n image: RasterImage,\n pageHeight: number,\n pageNumber: number,\n imageIndex: number,\n): string {\n const [a, b, c, d, e, f] = image.transform;\n const transform = [a, -b, -c, d, c + e, pageHeight - d - f].map(number).join(\" \");\n const opacity = isUnitInterval(image.opacity) ? ` opacity=\"${number(image.opacity)}\"` : \"\";\n const mime = image.format === \"jpeg\" ? \"image/jpeg\" : \"image/bmp\";\n const data = image.format === \"jpeg\" ? image.data : rgbBmp(image);\n let output = `<image width=\"1\" height=\"1\" preserveAspectRatio=\"none\" transform=\"matrix(${transform})\" href=\"data:${mime};base64,${base64(data)}\"${opacity}/>`;\n for (let index = (image.clips?.length ?? 0) - 1; index >= 0; index -= 1) {\n output = `<g clip-path=\"url(#${imageClipId(pageNumber, imageIndex, index)})\">${output}</g>`;\n }\n return output;\n}\n\nfunction imageClipDefinitions(\n images: RasterImage[],\n pageNumber: number,\n pageHeight: number,\n): string {\n return images\n .flatMap((image, imageIndex) =>\n (image.clips ?? []).map((clip, clipIndex) => {\n if (!isSvgPath(clip.d)) return \"\";\n const fillRule = clip.fillRule ? ` clip-rule=\"${clip.fillRule}\"` : \"\";\n return `<clipPath id=\"${imageClipId(pageNumber, imageIndex, clipIndex)}\" clipPathUnits=\"userSpaceOnUse\"><path d=\"${clip.d}\" transform=\"translate(0 ${number(pageHeight)}) scale(1 -1)\"${fillRule}/></clipPath>`;\n }),\n )\n .join(\"\");\n}\n\nfunction imageClipId(pageNumber: number, imageIndex: number, clipIndex: number): string {\n return `boxpdf-clip-${pageNumber}-${imageIndex}-${clipIndex}`;\n}\n\nfunction pathClipDefinitions(paths: VectorPath[], pageNumber: number): string {\n return paths\n .flatMap((path, pathIndex) =>\n (path.clips ?? []).map((clip, clipIndex) => {\n if (!isSvgPath(clip.d)) return \"\";\n const fillRule = clip.fillRule ? ` clip-rule=\"${clip.fillRule}\"` : \"\";\n return `<clipPath id=\"${pathClipId(pageNumber, pathIndex, clipIndex)}\" clipPathUnits=\"userSpaceOnUse\"><path d=\"${clip.d}\"${fillRule}/></clipPath>`;\n }),\n )\n .join(\"\");\n}\n\nfunction pathClipId(pageNumber: number, pathIndex: number, clipIndex: number): string {\n return `boxpdf-path-clip-${pageNumber}-${pathIndex}-${clipIndex}`;\n}\n\nfunction rgbBmp(image: RasterImage): Uint8Array {\n const stride = Math.ceil((image.width * 3) / 4) * 4;\n const output = new Uint8Array(54 + stride * image.height);\n const view = new DataView(output.buffer);\n output[0] = 0x42;\n output[1] = 0x4d;\n view.setUint32(2, output.length, true);\n view.setUint32(10, 54, true);\n view.setUint32(14, 40, true);\n view.setInt32(18, image.width, true);\n view.setInt32(22, -image.height, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, 24, true);\n view.setUint32(34, stride * image.height, true);\n for (let row = 0; row < image.height; row += 1) {\n for (let column = 0; column < image.width; column += 1) {\n const source = (row * image.width + column) * 3;\n const target = 54 + row * stride + column * 3;\n output[target] = image.data[source + 2] ?? 0;\n output[target + 1] = image.data[source + 1] ?? 0;\n output[target + 2] = image.data[source] ?? 0;\n }\n }\n return output;\n}\n\nfunction rotationTransform(page: ExtractedPage): string {\n switch (page.rotate) {\n case 90:\n return `;transform:translate(${number(page.height)}pt,0) rotate(90deg)`;\n case 180:\n return `;transform:translate(${number(page.width)}pt,${number(page.height)}pt) rotate(180deg)`;\n case 270:\n return `;transform:translate(0,${number(page.width)}pt) rotate(270deg)`;\n default:\n return \"\";\n }\n}\n\nfunction positionedSpan(span: TextSpan, fontAliases: Map<string, string>): string {\n const direction = directionAttribute([span]);\n const style = [\n `left:${number(span.bounds.x)}pt`,\n `bottom:${number(span.bounds.y)}pt`,\n `width:${number(span.bounds.width)}pt`,\n `height:${number(span.bounds.height)}pt`,\n `font-size:${number(span.fontSize)}pt`,\n ...(isCssHexColor(span.color) ? [`color:${span.color}`] : []),\n ...(isUnitInterval(span.fillOpacity) ? [`opacity:${number(span.fillOpacity)}`] : []),\n ...fontStyles(\n span.fontFamily,\n span.fontAssetId ? fontAliases.get(span.fontAssetId) : undefined,\n ),\n ].join(\";\");\n return `<span class=\"pdf-span\"${direction} style=\"${style}\">${escapeHtml(span.text)}</span>`;\n}\n\nasync function writeFlowPage(page: ExtractedPage, write: HtmlWrite): Promise<void> {\n const structured = structurePage(page);\n const defaultColor = dominantTextColor(structured.lines);\n const media = semanticMedia(page);\n let mediaIndex = 0;\n await write(\n `<section class=\"pdf-page pdf-page--semantic pdf-page--flow\" data-page=\"${page.number}\">`,\n );\n for (const block of structured.blocks) {\n const blockY = semanticBlockY(block);\n while ((media[mediaIndex]?.bounds.y ?? -Infinity) >= blockY) {\n await write(`<div class=\"pdf-semantic-visual\">${media[mediaIndex]?.html}</div>`);\n mediaIndex += 1;\n }\n if (block.type === \"table\") await write(tableToHtml(block.table));\n else if (block.type === \"heading\") {\n await write(\n `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor)}</h${block.level}>`,\n );\n } else if (block.type === \"paragraph\") {\n await write(\n `<p${directionAttribute(block.lines.flatMap((line) => line.spans))}>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`,\n );\n } else if (block.type === \"preformatted\") {\n await write(`<pre>${escapeHtml(block.text)}</pre>`);\n } else if (block.type === \"definitionList\") {\n await write(\"<dl>\");\n for (const entry of block.entries) {\n await write(\n `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`,\n );\n }\n await write(\"</dl>\");\n } else if (block.type === \"cardList\") {\n await write('<div class=\"pdf-semantic-cards\">');\n for (const item of block.items) {\n await write(`<article><h3>${escapeHtml(item.title)}</h3>`);\n for (const detail of item.details) await write(`<p>${escapeHtml(detail)}</p>`);\n await write(\"</article>\");\n }\n await write(\"</div>\");\n } else if (block.type === \"sectionGroup\") {\n await write('<div class=\"pdf-semantic-sections\">');\n for (const item of block.items) {\n await write(`<section><h3>${escapeHtml(item.label)}</h3>`);\n for (const content of item.content) await write(`<p>${escapeHtml(content)}</p>`);\n await write(\"</section>\");\n }\n await write(\"</div>\");\n } else if (block.type === \"employment\") {\n await write(\n `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`,\n );\n } else {\n const tag = block.ordered ? \"ol\" : \"ul\";\n await write(`<${tag}>`);\n for (const item of block.items) await write(`<li>${escapeHtml(item.text)}</li>`);\n await write(`</${tag}>`);\n }\n }\n while (mediaIndex < media.length) {\n await write(`<div class=\"pdf-semantic-visual\">${media[mediaIndex]?.html}</div>`);\n mediaIndex += 1;\n }\n await write(\"</section>\");\n}\n\nfunction semanticBlockY(block: SemanticBlock): number {\n const lines = block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n return Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n}\n\nfunction visualText(\n span: TextSpan,\n pageHeight: number,\n fontAliases: Map<string, string>,\n counterRotateReflectedText = false,\n): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n if (!span.fontAssetId && isAdobeCjkFont(span.fontFamily)) return \"\";\n const direction = directionAttribute([span]);\n const font = fontStyles(\n span.fontFamily,\n span.fontAssetId ? fontAliases.get(span.fontAssetId) : undefined,\n ).join(\";\");\n const stroke = isCssHexColor(span.strokeColor) ? `stroke:${span.strokeColor}` : \"\";\n const strokeWidth =\n stroke && Number.isFinite(span.strokeWidth) && (span.strokeWidth ?? -1) >= 0\n ? `stroke-width:${number(span.strokeWidth ?? 0)}`\n : \"\";\n const strokeOnly = span.renderingMode === 1 || span.renderingMode === 5;\n const fillOpacity = isUnitInterval(span.fillOpacity)\n ? `fill-opacity:${number(span.fillOpacity)}`\n : \"\";\n const strokeOpacity = isUnitInterval(span.strokeOpacity)\n ? `stroke-opacity:${number(span.strokeOpacity)}`\n : \"\";\n const style = [\n isHebrewPaintOrder(span) ? \"unicode-bidi:bidi-override;direction:ltr\" : \"\",\n span.direction === \"ttb\" ? \"writing-mode:vertical-rl\" : \"\",\n strokeOnly ? \"fill:none\" : isCssHexColor(span.color) ? `fill:${span.color}` : \"\",\n stroke,\n strokeWidth,\n fillOpacity,\n strokeOpacity,\n font,\n ]\n .filter(Boolean)\n .join(\";\");\n const textExtent = span.direction === \"ttb\" ? span.bounds.height : span.bounds.width;\n const textLength =\n textExtent > 0 && !isHebrewPaintOrder(span)\n ? ` textLength=\"${number(textExtent)}\" lengthAdjust=\"${span.direction === \"ttb\" || usesSpacingAdjustment(span) ? \"spacing\" : \"spacingAndGlyphs\"}\"`\n : \"\";\n const transform =\n counterRotateReflectedText && span.transform\n ? ([\n span.transform[0],\n span.transform[1],\n span.transform[2],\n -span.transform[3],\n ] as TextSpan[\"transform\"])\n : span.transform;\n const transformed = hasNonIdentityTransform(transform);\n const rtlOffset = span.direction === \"rtl\" ? span.bounds.width : 0;\n const basisX = transform?.[0] ?? 1;\n const basisY = transform?.[1] ?? 0;\n const anchorX = span.bounds.x + basisX * rtlOffset;\n const anchorY = pageHeight - span.bounds.y + basisY * rtlOffset;\n const position = transformed\n ? ` x=\"0\" y=\"0\" transform=\"matrix(${transform?.map(number).join(\" \")} ${number(anchorX)} ${number(anchorY)})\"`\n : ` x=\"${number(anchorX)}\" y=\"${number(anchorY)}\"`;\n return `<text${direction}${position} font-size=\"${number(span.fontSize)}\"${textLength}${style ? ` style=\"${style}\"` : \"\"}>${escapeHtml(span.text)}</text>`;\n}\n\nfunction isAdobeCjkFont(fontFamily: string | undefined): boolean {\n return /^Adobe(?:Heiti|Song|Kaiti|Ming|Gothic|Mincho)Std-/i.test(fontFamily ?? \"\");\n}\n\nfunction visualType3Text(span: TextSpan, font: EmbeddedType3Font, pageHeight: number): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n const glyphs = new Map(font.glyphs.map((glyph) => [glyph.code, glyph]));\n const sequence = (span.glyphCodes ?? []).map((code) => glyphs.get(code));\n const totalAdvance = sequence.reduce((total, glyph) => total + (glyph?.advance ?? 0), 0);\n if (totalAdvance <= 0 || span.bounds.width <= 0 || span.fontSize <= 0) return \"\";\n const transform = span.transform ?? [1, 0, 0, 1];\n const outer = `matrix(${transform.map(number).join(\" \")} ${number(span.bounds.x)} ${number(pageHeight - span.bounds.y)})`;\n const xScale = span.bounds.width / totalAdvance;\n let offset = 0;\n let content = \"\";\n for (const glyph of sequence) {\n if (!glyph) continue;\n content += `<g transform=\"translate(${number(offset)} 0)\">${type3Glyph(glyph)}</g>`;\n offset += glyph.advance;\n }\n return `<g transform=\"${outer}\"><g transform=\"scale(${number(xScale)} ${number(-span.fontSize)})\">${content}</g></g>`;\n}\n\nfunction isHebrewPaintOrder(span: TextSpan): boolean {\n return span.direction === \"ltr\" && /[\\u0590-\\u05ff]/u.test(span.text);\n}\n\nfunction usesSpacingAdjustment(span: TextSpan): boolean {\n return !span.fontAssetId && /arial/i.test(span.fontFamily ?? \"\");\n}\n\nfunction type3Glyph(glyph: Type3Glyph): string {\n let output = \"\";\n for (const fill of glyph.fills ?? []) {\n if (!isCssHexColor(fill.color)) continue;\n const points = fill.points.map(([x, y]) => `${number(x)},${number(y)}`).join(\" \");\n const opacity = isUnitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n output += `<polygon points=\"${points}\" fill=\"${fill.color}\"${opacity}/>`;\n }\n for (const path of glyph.paths ?? []) {\n if (!isSvgPath(path.d)) continue;\n const fill = isCssHexColor(path.fill) ? path.fill : \"none\";\n const stroke = isCssHexColor(path.stroke) ? path.stroke : \"none\";\n const width =\n path.strokeWidth !== undefined && Number.isFinite(path.strokeWidth) && path.strokeWidth >= 0\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n output += `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${width}/>`;\n }\n return (glyph.fills?.length ?? 0) > 64 && glyph.advance > 2\n ? `<g shape-rendering=\"crispEdges\">${output}</g>`\n : output;\n}\n\nfunction isCssHexColor(value: string | undefined): value is string {\n return /^#[\\da-f]{6}$/i.test(value ?? \"\");\n}\n\nfunction isUnitInterval(value: number | undefined): value is number {\n return Number.isFinite(value) && (value ?? -1) >= 0 && (value ?? 2) <= 1;\n}\n\nfunction isSvgPath(value: string): boolean {\n return value.length <= 1_000_000 && /^[\\d\\s.,+\\-eEMmLlCcZz]+$/.test(value);\n}\n\nfunction fontStyles(fontFamily: string | undefined, alias?: string): string[] {\n const normalized = fontFamily?.toLowerCase() ?? \"\";\n const styles: string[] = [];\n let fallback: string | undefined;\n if (/courier|mono|nimbusmono|^cmtt/.test(normalized)) {\n fallback = \"Courier New,Courier,monospace\";\n } else if (\n /times|minion|serif|baskerville|georgia|nimbusrom|guardian.*egyp|^cm[rs]y?\\d/.test(normalized)\n ) {\n fallback = \"Times New Roman,Times,serif\";\n } else if (/helvetica|arial|sans|nimbussan|calibre|myriad|panton|^tte/.test(normalized)) {\n fallback = \"Arial,Helvetica,sans-serif\";\n } else if (/^mstt/.test(normalized)) {\n fallback = \"Arial,Helvetica,sans-serif\";\n }\n if (alias || fallback) styles.push(`font-family:${[alias, fallback].filter(Boolean).join(\",\")}`);\n if (/bold|black|semibold|demi|medi|^tte/.test(normalized)) styles.push(\"font-weight:700\");\n if (/italic|oblique|slant|ital(?:$|[_-])/.test(normalized)) styles.push(\"font-style:italic\");\n return styles;\n}\n\nfunction isMonospace(fontFamily: string | undefined): boolean {\n return /courier|mono/i.test(fontFamily ?? \"\");\n}\n\nfunction usesPositionedSpan(span: TextSpan): boolean {\n return (\n !span.glyphCodes && isMonospace(span.fontFamily) && !hasNonIdentityTransform(span.transform)\n );\n}\n\nfunction hasNonIdentityTransform(transform: TextSpan[\"transform\"]): boolean {\n if (!transform) return false;\n const identity: [number, number, number, number] = [1, 0, 0, 1];\n return transform.some((value, index) => Math.abs(value - (identity[index] ?? 0)) > 0.000_001);\n}\n\nfunction fontFace(font: EmbeddedFont, aliases: Map<string, string>): string {\n if (font.format !== \"truetype\") return \"\";\n const alias = aliases.get(font.id);\n if (!alias) return \"\";\n const styles = fontStyles(font.family, alias).filter(\n (style) => !style.startsWith(\"font-family:\"),\n );\n return `@font-face{font-family:${alias};src:url(data:font/ttf;base64,${base64(font.data)}) format(\"truetype\");${styles.join(\";\")}}`;\n}\n\nfunction base64(bytes: Uint8Array): string {\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n let output = \"\";\n for (let index = 0; index < bytes.length; index += 3) {\n const first = bytes[index] ?? 0;\n const second = bytes[index + 1] ?? 0;\n const third = bytes[index + 2] ?? 0;\n output += alphabet[first >> 2];\n output += alphabet[((first & 3) << 4) | (second >> 4)];\n output += index + 1 < bytes.length ? alphabet[((second & 15) << 2) | (third >> 6)] : \"=\";\n output += index + 2 < bytes.length ? alphabet[third & 63] : \"=\";\n }\n return output;\n}\n\nfunction directionAttribute(spans: TextSpan[]): string {\n const rtl = spans.filter((span) => span.direction === \"rtl\").length;\n const vertical = spans.filter((span) => span.direction === \"ttb\").length;\n if (vertical > rtl && vertical * 2 >= spans.length) return ' data-direction=\"ttb\"';\n return rtl * 2 >= spans.length && spans.length > 0 ? ' dir=\"rtl\"' : \"\";\n}\n\nfunction number(value: number): string {\n return Number.isFinite(value) ? String(Math.round(value * 1000) / 1000) : \"0\";\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHtml(value).replaceAll(\"`\", \"`\");\n}\n\nfunction escapeHtml(value: string): string {\n return [...value]\n .map((character) => {\n const codePoint = character.codePointAt(0) ?? 0;\n if (codePoint === 13) return \"\\n\";\n return isForbiddenControl(codePoint) ? \"�\" : character;\n })\n .join(\"\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction isForbiddenControl(codePoint: number): boolean {\n return (\n codePoint <= 8 ||\n codePoint === 11 ||\n codePoint === 12 ||\n (codePoint >= 14 && codePoint <= 31) ||\n codePoint === 127\n );\n}\n\nfunction resolveProfile(options: HtmlWriterOptions): HtmlProfile {\n const legacyProfile = options.layout === \"flow\" ? \"semantic\" : \"visual\";\n if (options.profile && options.layout && options.profile !== legacyProfile) {\n throw new Error(\n `conflicting HTML output options: profile \"${options.profile}\" does not match layout \"${options.layout}\"`,\n );\n }\n return options.profile ?? legacyProfile;\n}\n","import type { ExtractedPage } from \"@boxpdf/reader\";\nimport {\n type SemanticBlock,\n type StructuredPage,\n structurePage,\n type Table,\n tableToRows,\n} from \"@boxpdf/reader/structure\";\nimport { dominantTextColor, semanticTextHtml } from \"./semantic-inline.js\";\nimport { type SemanticMedia, semanticMedia } from \"./semantic-media.js\";\n\nexport interface SemanticDocumentStats {\n pagesProcessed: number;\n peakBufferedPages: number;\n peakBufferedLines: number;\n mergedTables: number;\n suppressedFurniture: number;\n}\n\ninterface BufferedPage {\n width: number;\n height: number;\n structured: StructuredPage;\n media: SemanticMedia[];\n}\n\ninterface ActiveTable {\n table: Table;\n header: string[] | undefined;\n}\n\nexport async function writeSemanticDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: (chunk: string) => void | Promise<void>,\n lookaheadPages: number,\n): Promise<SemanticDocumentStats> {\n const stats: SemanticDocumentStats = {\n pagesProcessed: 0,\n peakBufferedPages: 0,\n peakBufferedLines: 0,\n mergedTables: 0,\n suppressedFurniture: 0,\n };\n const buffer: BufferedPage[] = [];\n const seenFurniture = new Set<string>();\n const sectionLevels: number[] = [];\n let activeTable: ActiveTable | undefined;\n const pendingMedia: string[] = [];\n let headerOpen = false;\n let headerHasParagraph = false;\n let contentStarted = false;\n let employmentOpen = false;\n let pendingParagraph:\n | {\n block: Extract<SemanticBlock, { type: \"paragraph\" }>;\n height: number;\n defaultColor: string;\n }\n | undefined;\n await write('<article class=\"pdf-semantic-document\">');\n\n const closeTable = async () => {\n if (!activeTable) return;\n await write(\"</table>\");\n activeTable = undefined;\n while (pendingMedia.length > 0) await write(pendingMedia.shift() ?? \"\");\n };\n\n const closeSections = async (minimumLevel = 0) => {\n while ((sectionLevels.at(-1) ?? -1) >= minimumLevel && sectionLevels.length > 0) {\n await write(\"</section>\");\n sectionLevels.pop();\n }\n };\n\n const flushPendingParagraph = async () => {\n if (!pendingParagraph) return;\n await write(semanticBlockHtml(pendingParagraph.block, pendingParagraph.defaultColor));\n pendingParagraph = undefined;\n };\n\n const closeEmployment = async () => {\n if (!employmentOpen) return;\n await write(\"</section>\");\n employmentOpen = false;\n };\n\n const emitPage = async (page: BufferedPage, future: BufferedPage[]) => {\n const defaultColor = dominantTextColor(page.structured.lines);\n let mediaIndex = 0;\n const futureFurniture = new Set(future.flatMap((candidate) => marginSignatures(candidate)));\n const repeatedFurniture = new Set([...seenFurniture, ...futureFurniture]);\n for (const [blockIndex, block] of page.structured.blocks.entries()) {\n const nextBlock = page.structured.blocks[blockIndex + 1];\n const blockY = semanticBlockY(block);\n while ((page.media[mediaIndex]?.bounds.y ?? -Infinity) >= blockY) {\n await flushPendingParagraph();\n const html = `<div class=\"pdf-semantic-visual\">${page.media[mediaIndex]?.html}</div>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n mediaIndex += 1;\n }\n if (isRepeatedFurniture(block, page, repeatedFurniture)) {\n stats.suppressedFurniture += 1;\n continue;\n }\n await flushPendingParagraph();\n if (employmentOpen && block.type !== \"list\") await closeEmployment();\n if (!contentStarted && !headerOpen && block.type === \"heading\" && block.level === 1) {\n await write(`<header><h1>${semanticTextHtml(block.text, block.lines, defaultColor)}</h1>`);\n headerOpen = true;\n continue;\n }\n if (headerOpen) {\n if (block.type === \"paragraph\") {\n const tag = isContactBlock(block) ? \"address\" : \"p\";\n await write(\n `<${tag}>${semanticTextHtml(block.text, block.lines, defaultColor)}</${tag}>`,\n );\n headerHasParagraph = true;\n continue;\n }\n if (\n block.type === \"heading\" &&\n !headerHasParagraph &&\n (block.level === 1 ||\n block.text.trimStart().startsWith(\"#\") ||\n (block.level === 4 && nextBlock?.type === \"paragraph\" && isContactBlock(nextBlock)))\n ) {\n await write(\n `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor)}</h${block.level}>`,\n );\n continue;\n }\n await write(\"</header>\");\n headerOpen = false;\n contentStarted = true;\n }\n if (block.type === \"table\") {\n const rows = tableToRows(block.table);\n if (activeTable && tablesContinue(activeTable.table, block.table, page.width)) {\n const continuationRows = sameRow(activeTable.header, rows[0]) ? rows.slice(1) : rows;\n for (const row of continuationRows) await write(tableRow(row, false));\n activeTable.table = block.table;\n stats.mergedTables += 1;\n continue;\n }\n await closeTable();\n const header = tableHeader(rows);\n await write(\"<table>\");\n for (const [index, row] of rows.entries())\n await write(tableRow(row, Boolean(header && index === 0)));\n activeTable = { table: block.table, header };\n continue;\n }\n if (activeTable && block.type === \"definitionList\" && isFinancialSummary(block)) {\n const columns = activeTable.table.columns.length;\n await write(\n `<tfoot>${block.entries.map((entry) => financialSummaryRow(entry, columns)).join(\"\")}</tfoot>`,\n );\n await closeTable();\n continue;\n }\n await closeTable();\n if (block.type === \"heading\") {\n const level = contentStarted && block.level === 1 ? 2 : block.level;\n await closeSections(level);\n await write(\n `<section data-level=\"${level}\"><h${level}>${semanticTextHtml(block.text, block.lines, defaultColor)}</h${level}>`,\n );\n sectionLevels.push(level);\n continue;\n }\n if (block.type === \"paragraph\") {\n if (isTitledRecord(block)) {\n const [institution, ...details] = block.lines;\n if (institution) await write(`<h3>${escapeHtml(institution.text)}</h3>`);\n for (const detail of details) await write(`<p>${escapeHtml(detail.text)}</p>`);\n continue;\n }\n if (isUnmarkedList(block)) {\n await write(\n `<ul>${block.lines.map((line) => `<li>${escapeHtml(line.text)}</li>`).join(\"\")}</ul>`,\n );\n continue;\n }\n pendingParagraph = { block, height: page.height, defaultColor };\n continue;\n }\n if (block.type === \"employment\") {\n await write(\n `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p>`,\n );\n employmentOpen = true;\n continue;\n }\n await write(semanticBlockHtml(block, defaultColor));\n }\n while (mediaIndex < page.media.length) {\n await flushPendingParagraph();\n const html = `<div class=\"pdf-semantic-visual\">${page.media[mediaIndex]?.html}</div>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n mediaIndex += 1;\n }\n for (const signature of marginSignatures(page)) seenFurniture.add(signature);\n };\n\n for await (const page of pages) {\n const structured = structurePage(page);\n buffer.push({ width: page.width, height: page.height, structured, media: semanticMedia(page) });\n stats.pagesProcessed += 1;\n stats.peakBufferedPages = Math.max(stats.peakBufferedPages, buffer.length);\n stats.peakBufferedLines = Math.max(\n stats.peakBufferedLines,\n buffer.reduce((total, item) => total + item.structured.lines.length, 0),\n );\n if (buffer.length >= lookaheadPages) {\n const ready = buffer.shift();\n if (ready) await emitPage(ready, buffer);\n }\n }\n while (buffer.length > 0) {\n const ready = buffer.shift();\n if (ready) await emitPage(ready, buffer);\n }\n if (headerOpen) await write(\"</header>\");\n await closeTable();\n await closeEmployment();\n if (pendingParagraph && isFooterParagraph(pendingParagraph.block, pendingParagraph.height)) {\n await closeSections();\n await write(\n `<footer>${semanticBlockHtml(pendingParagraph.block, pendingParagraph.defaultColor)}</footer>`,\n );\n pendingParagraph = undefined;\n } else {\n await flushPendingParagraph();\n await closeSections();\n }\n await write(\"</article>\");\n return stats;\n}\n\nfunction isContactBlock(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n const text = block.text;\n const signals = [\n /@/.test(text),\n /\\+?\\d[\\d().\\s-]{7,}/.test(text),\n /\\bhttps?:\\/\\//i.test(text),\n /\\b\\w+\\.\\w{2,}\\b/i.test(text),\n ];\n return signals.filter(Boolean).length >= 2;\n}\n\nfunction isTitledRecord(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n if (block.lines.length < 2) return false;\n const [first, ...rest] = block.lines;\n if (!first || rest.length === 0) return false;\n const firstSize = Math.max(...first.spans.map((span) => span.fontSize));\n const restSize = Math.max(...rest.flatMap((line) => line.spans.map((span) => span.fontSize)));\n const emphasized = first.spans.some((span) =>\n /(?:bold|semibold|demi)/i.test(span.fontFamily ?? \"\"),\n );\n return emphasized || firstSize >= restSize * 1.08;\n}\n\nfunction isUnmarkedList(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n if (block.lines.length < 3) return false;\n const first = block.lines[0];\n if (!first) return false;\n const aligned = block.lines.every(\n (line) => Math.abs(line.bounds.x - first.bounds.x) <= Math.max(8, first.bounds.height),\n );\n const separated = block.lines.slice(1).every((line, index) => {\n const previous = block.lines[index];\n if (!previous) return false;\n const gap = previous.bounds.y - (line.bounds.y + line.bounds.height);\n return gap >= Math.min(previous.bounds.height, line.bounds.height) * 0.55;\n });\n return aligned && separated;\n}\n\nfunction isFooterParagraph(\n block: Extract<SemanticBlock, { type: \"paragraph\" }>,\n pageHeight: number,\n): boolean {\n const inBottomMargin = block.lines.every(\n (line) => line.bounds.y + line.bounds.height <= pageHeight * 0.15,\n );\n return inBottomMargin || /^(?:thanks|thank you)\\b/i.test(block.text.trim());\n}\n\nfunction marginSignatures(page: BufferedPage): string[] {\n return page.structured.blocks.flatMap((block) =>\n blockLines(block)\n .filter((line) => isMarginLine(line.bounds.y, line.bounds.height, page.height))\n .map((line) => furnitureSignature(line.text)),\n );\n}\n\nfunction isRepeatedFurniture(\n block: SemanticBlock,\n page: BufferedPage,\n futureFurniture: Set<string>,\n): boolean {\n const lines = blockLines(block);\n return (\n lines.length > 0 &&\n lines.every(\n (line) =>\n isMarginLine(line.bounds.y, line.bounds.height, page.height) &&\n futureFurniture.has(furnitureSignature(line.text)),\n )\n );\n}\n\nfunction blockLines(block: SemanticBlock) {\n return block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n}\n\nfunction isMarginLine(y: number, height: number, pageHeight: number): boolean {\n return y + height <= pageHeight * 0.12 || y >= pageHeight * 0.88;\n}\n\nfunction furnitureSignature(value: string): string {\n return value.toLocaleLowerCase(\"en\").replace(/\\d+/g, \"#\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction tablesContinue(previous: Table, next: Table, pageWidth: number): boolean {\n if (previous.columns.length !== next.columns.length || previous.columns.length < 2) return false;\n return previous.columns.every(\n (column, index) =>\n Math.abs(column - (next.columns[index] ?? Number.POSITIVE_INFINITY)) / pageWidth <= 0.04,\n );\n}\n\nfunction tableHeader(rows: string[][]): string[] | undefined {\n const first = rows[0];\n if (!first) return undefined;\n const later = rows.slice(1).flat();\n return first.every((value) => /\\p{L}/u.test(value) && !isNumericValue(value)) &&\n later.some(isNumericValue)\n ? first\n : undefined;\n}\n\nfunction sameRow(left: string[] | undefined, right: string[] | undefined): boolean {\n return Boolean(\n left &&\n right &&\n left.length === right.length &&\n left.every((value, index) => value === right[index]),\n );\n}\n\nfunction tableRow(row: string[], header: boolean): string {\n const cell = header ? \"th\" : \"td\";\n return `<tr>${row.map((value) => `<${cell}>${escapeHtml(value)}</${cell}>`).join(\"\")}</tr>`;\n}\n\nfunction isFinancialSummary(block: Extract<SemanticBlock, { type: \"definitionList\" }>): boolean {\n return (\n block.entries.length > 0 &&\n block.entries.every((entry) => isNumericValue(entry.description)) &&\n block.entries.some((entry) => /\\p{Sc}|%/u.test(entry.description))\n );\n}\n\nfunction isNumericValue(value: string): boolean {\n return /^(?:\\p{Sc}\\s*)?[\\d.,'’\\s]+(?:\\s*%)?$/u.test(value.trim());\n}\n\nfunction financialSummaryRow(\n entry: Extract<SemanticBlock, { type: \"definitionList\" }>[\"entries\"][number],\n columns: number,\n): string {\n const colspan = columns > 2 ? ` colspan=\"${columns - 1}\"` : \"\";\n return `<tr><th scope=\"row\"${colspan}>${escapeHtml(entry.term)}</th><td>${escapeHtml(entry.description)}</td></tr>`;\n}\n\nfunction semanticBlockHtml(\n block: Exclude<SemanticBlock, { type: \"table\" }>,\n defaultColor = \"#000000\",\n): string {\n if (block.type === \"heading\")\n return `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor)}</h${block.level}>`;\n if (block.type === \"paragraph\")\n return `<p>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`;\n if (block.type === \"preformatted\") return `<pre>${escapeHtml(block.text)}</pre>`;\n if (block.type === \"definitionList\") {\n if (\n block.entries.length <= 3 &&\n block.entries.some((entry) => entry.description.trim().split(/\\s+/).length >= 5) &&\n block.entries.every((entry) => /^[A-Z][A-Z\\s/-]*$/.test(entry.term.trim()))\n ) {\n return block.entries\n .map(\n (entry) =>\n `<section><h2>${escapeHtml(titleCase(entry.term))}</h2><p>${escapeHtml(entry.description)}</p></section>`,\n )\n .join(\"\");\n }\n const list = `<dl>${block.entries\n .map(\n (entry) =>\n `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`,\n )\n .join(\"\")}</dl>`;\n return isFinancialSummary(block) ? `<section>${list}</section>` : list;\n }\n if (block.type === \"cardList\") {\n return `<section><h2>Items ordered</h2><table><thead><tr><th scope=\"col\">Item</th><th scope=\"col\">Quantity</th><th scope=\"col\">Amount</th></tr></thead><tbody>${block.items.map(cardTableRow).join(\"\")}</tbody></table></section>`;\n }\n if (block.type === \"sectionGroup\") {\n return block.items.map(labeledSectionHtml).join(\"\");\n }\n if (block.type === \"employment\") {\n return `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`;\n }\n const tag = block.ordered ? \"ol\" : \"ul\";\n return `<${tag}>${block.items.map((item) => `<li>${escapeHtml(item.text)}</li>`).join(\"\")}</${tag}>`;\n}\n\nfunction semanticBlockY(block: SemanticBlock): number {\n const lines = block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n return Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n}\n\nfunction cardTableRow(item: Extract<SemanticBlock, { type: \"cardList\" }>[\"items\"][number]): string {\n const trailing = item.details.at(-1) ?? \"\";\n const match = /^\\s*[×x]\\s*(\\d+)\\s+(.+)$/u.exec(trailing);\n const description = item.details.slice(0, -1).join(\" \");\n const detail = description ? `<br><span>${escapeHtml(description)}</span>` : \"\";\n const quantity = match?.[1] ?? \"\";\n const amount = match?.[2] ?? trailing;\n return `<tr><th scope=\"row\">${escapeHtml(item.title)}${detail}</th><td>${escapeHtml(quantity)}</td><td>${escapeHtml(amount)}</td></tr>`;\n}\n\nfunction labeledSectionHtml(\n item: Extract<SemanticBlock, { type: \"sectionGroup\" }>[\"items\"][number],\n): string {\n const heading = titleCase(item.label);\n const postal = /\\b(?:ship|deliver|mail)(?:ed)?\\b/i.test(item.label);\n if (postal) {\n const [name, ...address] = item.content;\n const content = [name ? `<strong>${escapeHtml(name)}</strong>` : \"\", ...address.map(escapeHtml)]\n .filter(Boolean)\n .join(\"<br>\");\n return `<section><h2>${escapeHtml(heading)}</h2><address>${content}</address></section>`;\n }\n return `<section><h2>${escapeHtml(heading)}</h2>${item.content\n .map(\n (content, index) =>\n `<p>${index === 0 ? `<strong>${escapeHtml(content)}</strong>` : escapeHtml(content)}</p>`,\n )\n .join(\"\")}</section>`;\n}\n\nfunction titleCase(value: string): string {\n const normalized = value.trim().toLocaleLowerCase(\"en\");\n return normalized.replace(/^\\p{L}/u, (letter) => letter.toLocaleUpperCase(\"en\"));\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n","import type { TextLine } from \"@boxpdf/reader/structure\";\n\ninterface StyledRange {\n start: number;\n end: number;\n color: string;\n}\n\nexport function dominantTextColor(lines: TextLine[]): string {\n const counts = new Map<string, number>();\n for (const span of lines.flatMap((line) => line.spans)) {\n const color = normalizedColor(span.color) ?? \"#000000\";\n counts.set(color, (counts.get(color) ?? 0) + Math.max(1, [...span.text].length));\n }\n return [...counts].sort((left, right) => right[1] - left[1])[0]?.[0] ?? \"#000000\";\n}\n\nexport function semanticTextHtml(text: string, lines: TextLine[], defaultColor: string): string {\n const ranges: StyledRange[] = [];\n let cursor = 0;\n for (const span of lines.flatMap((line) => line.spans)) {\n if (!span.text) continue;\n const start = text.indexOf(span.text, cursor);\n if (start < 0) continue;\n cursor = start + span.text.length;\n const color = normalizedColor(span.color);\n if (color && color !== defaultColor) ranges.push({ start, end: cursor, color });\n }\n const merged = mergeRanges(ranges, text);\n let html = \"\";\n let offset = 0;\n for (const range of merged) {\n html += escapeHtml(text.slice(offset, range.start));\n html += `<span style=\"color:${range.color}\">${escapeHtml(text.slice(range.start, range.end))}</span>`;\n offset = range.end;\n }\n return html + escapeHtml(text.slice(offset));\n}\n\nfunction mergeRanges(ranges: StyledRange[], text: string): StyledRange[] {\n const merged: StyledRange[] = [];\n for (const range of ranges) {\n const previous = merged.at(-1);\n if (\n previous &&\n previous.color === range.color &&\n /^\\s*$/.test(text.slice(previous.end, range.start))\n ) {\n previous.end = range.end;\n } else {\n merged.push({ ...range });\n }\n }\n return merged;\n}\n\nfunction normalizedColor(value: string | undefined): string | undefined {\n if (!value || !/^#[\\da-f]{6}$/i.test(value)) return undefined;\n const color = value.toLowerCase();\n return color === \"#000000\" || color === \"#000\" ? \"#000000\" : color;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n","import type { ExtractedPage, RasterImage, Rect, VectorFill, VectorPath } from \"@boxpdf/reader\";\n\nexport interface SemanticMedia {\n bounds: Rect;\n html: string;\n}\n\nexport function semanticMedia(page: ExtractedPage): SemanticMedia[] {\n const output = (page.images ?? []).map((image) => rasterMedia(image));\n const vector = vectorMedia(page);\n if (vector) output.push(vector);\n return output.sort((left, right) => right.bounds.y - left.bounds.y);\n}\n\nfunction rasterMedia(image: RasterImage): SemanticMedia {\n const bounds = transformedUnitBounds(image.transform);\n const mime = image.format === \"jpeg\" ? \"image/jpeg\" : \"image/bmp\";\n const data = image.format === \"jpeg\" ? image.data : rgbBmp(image);\n const opacity = unitInterval(image.opacity) ? `;opacity:${number(image.opacity)}` : \"\";\n return {\n bounds,\n html: `<img class=\"pdf-semantic-media\" src=\"data:${mime};base64,${base64(data)}\" width=\"${number(bounds.width)}\" height=\"${number(bounds.height)}\" alt=\"\" style=\"max-width:100%;height:auto${opacity}\">`,\n };\n}\n\nfunction vectorMedia(page: ExtractedPage): SemanticMedia | undefined {\n const paths = (page.paths ?? []).filter((path) => safePath(path.d));\n const fills = page.fills ?? [];\n const bounds = unionBounds([\n ...paths.map((path) => pathBounds(path.d)),\n ...fills.map(fillBounds),\n ]);\n if (!bounds || bounds.width <= 0 || bounds.height <= 0) return undefined;\n const content = fills.map(vectorFill).join(\"\") + paths.map((path) => vectorPath(path)).join(\"\");\n return {\n bounds,\n html: `<svg class=\"pdf-semantic-media\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${number(bounds.x)} ${number(page.height - bounds.y - bounds.height)} ${number(bounds.width)} ${number(bounds.height)}\" style=\"display:block;max-width:100%;height:auto\" aria-hidden=\"true\"><g transform=\"translate(0 ${number(page.height)}) scale(1 -1)\">${content}</g></svg>`,\n };\n}\n\nfunction vectorFill(fill: VectorFill): string {\n const points = fill.points.map(([x, y]) => `${number(x)},${number(y)}`).join(\" \");\n const opacity = unitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n return cssColor(fill.color) ? `<polygon points=\"${points}\" fill=\"${fill.color}\"${opacity}/>` : \"\";\n}\n\nfunction vectorPath(path: VectorPath): string {\n const fill = cssColor(path.fill) ? path.fill : \"none\";\n const stroke = cssColor(path.stroke) ? path.stroke : \"none\";\n const width = finiteNonnegative(path.strokeWidth)\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n const fillOpacity = unitInterval(path.fillOpacity)\n ? ` fill-opacity=\"${number(path.fillOpacity)}\"`\n : \"\";\n const strokeOpacity = unitInterval(path.strokeOpacity)\n ? ` stroke-opacity=\"${number(path.strokeOpacity)}\"`\n : \"\";\n const dash = path.strokeDasharray?.every(finiteNonnegative)\n ? ` stroke-dasharray=\"${path.strokeDasharray.map(number).join(\" \")}\"`\n : \"\";\n const linecap = path.strokeLinecap ? ` stroke-linecap=\"${path.strokeLinecap}\"` : \"\";\n const linejoin = path.strokeLinejoin ? ` stroke-linejoin=\"${path.strokeLinejoin}\"` : \"\";\n const rule = path.fillRule ? ` fill-rule=\"${path.fillRule}\"` : \"\";\n return `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${width}${fillOpacity}${strokeOpacity}${dash}${linecap}${linejoin}${rule}/>`;\n}\n\nfunction transformedUnitBounds([a, b, c, d, e, f]: RasterImage[\"transform\"]): Rect {\n const points = [\n [e, f],\n [a + e, b + f],\n [c + e, d + f],\n [a + c + e, b + d + f],\n ];\n const xs = points.map(([x]) => x ?? 0);\n const ys = points.map(([, y]) => y ?? 0);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return { x: minX, y: minY, width: Math.max(...xs) - minX, height: Math.max(...ys) - minY };\n}\n\nfunction pathBounds(path: string): Rect | undefined {\n const values = [...path.matchAll(/[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?/gi)].map((match) =>\n Number(match[0]),\n );\n if (values.length < 2) return undefined;\n const xs: number[] = [];\n const ys: number[] = [];\n for (let index = 0; index + 1 < values.length; index += 2) {\n xs.push(values[index] ?? 0);\n ys.push(values[index + 1] ?? 0);\n }\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return { x: minX, y: minY, width: Math.max(...xs) - minX, height: Math.max(...ys) - minY };\n}\n\nfunction fillBounds(fill: VectorFill): Rect | undefined {\n if (fill.points.length === 0) return undefined;\n const xs = fill.points.map(([x]) => x);\n const ys = fill.points.map(([, y]) => y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return { x: minX, y: minY, width: Math.max(...xs) - minX, height: Math.max(...ys) - minY };\n}\n\nfunction unionBounds(bounds: Array<Rect | undefined>): Rect | undefined {\n const values = bounds.filter((value): value is Rect => Boolean(value));\n if (values.length === 0) return undefined;\n const x = Math.min(...values.map((value) => value.x));\n const y = Math.min(...values.map((value) => value.y));\n const right = Math.max(...values.map((value) => value.x + value.width));\n const top = Math.max(...values.map((value) => value.y + value.height));\n return { x, y, width: right - x, height: top - y };\n}\n\nfunction rgbBmp(image: RasterImage): Uint8Array {\n const stride = Math.ceil((image.width * 3) / 4) * 4;\n const output = new Uint8Array(54 + stride * image.height);\n const view = new DataView(output.buffer);\n output.set([0x42, 0x4d]);\n view.setUint32(2, output.length, true);\n view.setUint32(10, 54, true);\n view.setUint32(14, 40, true);\n view.setInt32(18, image.width, true);\n view.setInt32(22, -image.height, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, 24, true);\n for (let row = 0; row < image.height; row += 1) {\n for (let column = 0; column < image.width; column += 1) {\n const source = (row * image.width + column) * 3;\n const target = 54 + row * stride + column * 3;\n output[target] = image.data[source + 2] ?? 0;\n output[target + 1] = image.data[source + 1] ?? 0;\n output[target + 2] = image.data[source] ?? 0;\n }\n }\n return output;\n}\n\nfunction base64(bytes: Uint8Array): string {\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n let output = \"\";\n for (let index = 0; index < bytes.length; index += 3) {\n const first = bytes[index] ?? 0;\n const second = bytes[index + 1] ?? 0;\n const third = bytes[index + 2] ?? 0;\n output += alphabet[first >> 2];\n output += alphabet[((first & 3) << 4) | (second >> 4)];\n output += index + 1 < bytes.length ? alphabet[((second & 15) << 2) | (third >> 6)] : \"=\";\n output += index + 2 < bytes.length ? alphabet[third & 63] : \"=\";\n }\n return output;\n}\n\nfunction safePath(value: string): boolean {\n return value.length <= 1_000_000 && /^[\\d\\s.,+\\-eEMmLlCcZz]+$/.test(value);\n}\n\nfunction cssColor(value: string | undefined): value is string {\n return /^#[\\da-f]{6}$/i.test(value ?? \"\");\n}\n\nfunction finiteNonnegative(value: number | undefined): value is number {\n return Number.isFinite(value) && (value ?? -1) >= 0;\n}\n\nfunction unitInterval(value: number | undefined): value is number {\n return finiteNonnegative(value) && value <= 1;\n}\n\nfunction number(value: number): string {\n return Number.isFinite(value) ? String(Math.round(value * 1_000) / 1_000) : \"0\";\n}\n"],"mappings":"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","names":["structurePage","escapeHtml","escapeHtml","number","rgbBmp","base64","structurePage","semanticBlockY","styles"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/semantic-document.ts","../src/semantic-inline.ts","../src/visual-font.ts","../src/semantic-media.ts"],"sourcesContent":["import type {\n EmbeddedType3Font,\n ExtractedPage,\n RasterImage,\n TextSpan,\n Type3Glyph,\n VectorPath,\n} from \"@boxpdf/reader\";\nimport { type SemanticBlock, structurePage, tableToHtml } from \"@boxpdf/reader/structure\";\nimport { type SemanticDocumentStats, writeSemanticDocument } from \"./semantic-document.js\";\nimport { dominantTextColor, semanticTextHtml } from \"./semantic-inline.js\";\nimport { semanticMedia, withoutSemanticMediaSpans } from \"./semantic-media.js\";\nimport { base64, visualFontAliases, visualFontFace, visualFontStyles } from \"./visual-font.js\";\n\nexport type { SemanticDocumentStats } from \"./semantic-document.js\";\n\nexport type HtmlLayout = \"positioned\" | \"flow\";\nexport type HtmlProfile = \"visual\" | \"semantic\";\nexport type HtmlWrite = (chunk: string) => void | Promise<void>;\n\nexport interface HtmlWriterOptions {\n /** Output intent. Visual preserves page presentation; semantic prioritizes reading order. */\n profile?: HtmlProfile;\n /** @deprecated Use `profile: \"visual\"` or `profile: \"semantic\"`. */\n layout?: HtmlLayout;\n title?: string;\n language?: string;\n includeDocument?: boolean;\n includeStyles?: boolean;\n /** Maximum extracted page models retained for document-level semantic decisions. */\n semanticLookaheadPages?: number;\n /** Receives bounded-buffer and document-inference statistics after semantic output completes. */\n onSemanticStats?: (stats: Readonly<SemanticDocumentStats>) => void;\n}\n\nconst styles = `.pdf-document{margin:0 auto}.pdf-page{box-sizing:border-box;margin:1rem auto;background:#fff;color:#000}.pdf-page--visual,.pdf-page--positioned{position:relative;overflow:hidden}.pdf-page-content{position:absolute;transform-origin:0 0}.pdf-span{position:absolute;white-space:pre;transform-origin:left bottom;unicode-bidi:isolate}.pdf-span[data-direction=ttb]{writing-mode:vertical-rl}.pdf-page--semantic,.pdf-page--flow{max-width:60rem;padding:1rem}.pdf-page--semantic p,.pdf-page--flow p{white-space:pre-wrap;unicode-bidi:plaintext}.pdf-semantic-document h1,.pdf-page--semantic h1{font-size:1.7em}.pdf-semantic-document h2,.pdf-page--semantic h2{font-size:1.5em}.pdf-semantic-document h3,.pdf-page--semantic h3{font-size:1.35em}.pdf-semantic-document h4,.pdf-page--semantic h4{font-size:1.1em}.pdf-page table{border-collapse:collapse}.pdf-page td{padding:.15rem .4rem;vertical-align:top}`;\n\nexport async function writeHtmlDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: HtmlWrite,\n options: HtmlWriterOptions = {},\n): Promise<void> {\n const includeDocument = options.includeDocument ?? true;\n if (includeDocument) {\n await write(\"<!doctype html><html\");\n await write(\n ` lang=\"${escapeAttribute(options.language ?? \"en\")}\"><head><meta charset=\"utf-8\">`,\n );\n await write('<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">');\n await write(`<title>${escapeHtml(options.title ?? \"PDF document\")}</title>`);\n if (options.includeStyles ?? true) await write(`<style>${styles}</style>`);\n await write(\"</head><body>\");\n }\n await write('<main class=\"pdf-document\">');\n if (resolveProfile(options) === \"semantic\") {\n const lookahead = semanticLookahead(options.semanticLookaheadPages);\n const stats = await writeSemanticDocument(pages, write, lookahead);\n options.onSemanticStats?.(stats);\n } else {\n for await (const page of pages) await writePage(page, write, options);\n }\n await write(\"</main>\");\n if (includeDocument) await write(\"</body></html>\");\n}\n\nfunction semanticLookahead(value: number | undefined): number {\n const lookahead = value ?? 4;\n if (!Number.isSafeInteger(lookahead) || lookahead < 1 || lookahead > 16) {\n throw new RangeError(\"semanticLookaheadPages must be an integer between 1 and 16\");\n }\n return lookahead;\n}\n\nexport async function writePage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions = {},\n): Promise<void> {\n if (resolveProfile(options) === \"semantic\") await writeFlowPage(page, write);\n else await writePositionedPage(page, write, options);\n}\n\nexport async function pageToHtml(\n page: ExtractedPage,\n options: HtmlWriterOptions = {},\n): Promise<string> {\n let output = \"\";\n await writePage(\n page,\n (chunk) => {\n output += chunk;\n },\n options,\n );\n return output;\n}\n\nasync function writePositionedPage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions,\n): Promise<void> {\n const visualSpans = page.visualSpans ?? page.spans;\n const reflectedOverlay = usesReflectedVisualOverlay(page, visualSpans);\n const quarterTurn = page.rotate === 90 || page.rotate === 270;\n const displayWidth = quarterTurn ? page.height : page.width;\n const displayHeight = quarterTurn ? page.width : page.height;\n await write(\n `<section class=\"pdf-page pdf-page--visual pdf-page--positioned\" data-page=\"${page.number}\" data-rotate=\"${page.rotate}\" style=\"width:${number(displayWidth)}pt;height:${number(displayHeight)}pt\">`,\n );\n const fontAliases = visualFontAliases(page.number, page.fonts ?? []);\n const type3Fonts = new Map(\n (page.fonts ?? [])\n .filter((font): font is EmbeddedType3Font => font.format === \"type3\")\n .map((font) => [font.id, font]),\n );\n if ((options.includeStyles ?? true) && page.fonts?.length) {\n await write(\n `<style>${page.fonts.map((font) => visualFontFace(font, fontAliases)).join(\"\")}</style>`,\n );\n }\n await write(\n `<div class=\"pdf-page-content pdf-page-content--${page.rotate}\" style=\"width:${number(page.width)}pt;height:${number(page.height)}pt${rotationTransform(page)}\">`,\n );\n await write(\n `<svg class=\"pdf-visual-text\" xmlns=\"http://www.w3.org/2000/svg\" width=\"${number(page.width)}pt\" height=\"${number(page.height)}pt\" viewBox=\"0 0 ${number(page.width)} ${number(page.height)}\">`,\n );\n const clipDefinitions =\n imageClipDefinitions(page.images ?? [], page.number, page.height) +\n pathClipDefinitions(page.paths ?? [], page.number);\n if (clipDefinitions) await write(`<defs>${clipDefinitions}</defs>`);\n if (reflectedOverlay) {\n for (const [index, image] of (page.images ?? []).entries()) {\n await write(visualImage(image, page.height, page.number, index));\n }\n }\n for (const fill of page.fills ?? []) {\n const points = fill.points.map(([x, y]) => `${number(x)},${number(page.height - y)}`).join(\" \");\n if (isCssHexColor(fill.color)) {\n const opacity = isUnitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n await write(`<polygon points=\"${points}\" fill=\"${fill.color}\"${opacity}/>`);\n }\n }\n if (page.paths?.length) {\n await write(`<g transform=\"translate(0 ${number(page.height)}) scale(1 -1)\">`);\n for (const [pathIndex, path] of page.paths.entries()) {\n if (!isSvgPath(path.d)) continue;\n const fill = isCssHexColor(path.fill) ? path.fill : \"none\";\n const stroke = isCssHexColor(path.stroke) ? path.stroke : \"none\";\n const strokeWidth =\n path.strokeWidth !== undefined && Number.isFinite(path.strokeWidth) && path.strokeWidth >= 0\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n const fillRule = path.fillRule ? ` fill-rule=\"${path.fillRule}\"` : \"\";\n const fillOpacity = isUnitInterval(path.fillOpacity)\n ? ` fill-opacity=\"${number(path.fillOpacity)}\"`\n : \"\";\n const strokeOpacity = isUnitInterval(path.strokeOpacity)\n ? ` stroke-opacity=\"${number(path.strokeOpacity)}\"`\n : \"\";\n const dasharray = path.strokeDasharray?.every((value) => Number.isFinite(value) && value >= 0)\n ? ` stroke-dasharray=\"${path.strokeDasharray.map(number).join(\" \")}\"`\n : \"\";\n const dashoffset = Number.isFinite(path.strokeDashoffset)\n ? ` stroke-dashoffset=\"${number(path.strokeDashoffset ?? 0)}\"`\n : \"\";\n const linecap = path.strokeLinecap ? ` stroke-linecap=\"${path.strokeLinecap}\"` : \"\";\n const linejoin = path.strokeLinejoin ? ` stroke-linejoin=\"${path.strokeLinejoin}\"` : \"\";\n let output = `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${strokeWidth}${fillOpacity}${strokeOpacity}${dasharray}${dashoffset}${linecap}${linejoin}${fillRule}/>`;\n for (let index = (path.clips?.length ?? 0) - 1; index >= 0; index -= 1) {\n output = `<g clip-path=\"url(#${pathClipId(page.number, pathIndex, index)})\">${output}</g>`;\n }\n await write(output);\n }\n await write(\"</g>\");\n }\n if (!reflectedOverlay) {\n for (const [index, image] of (page.images ?? []).entries()) {\n await write(visualImage(image, page.height, page.number, index));\n }\n }\n for (const span of visualSpans) {\n if (!usesPositionedSpan(span)) {\n const type3 = span.fontAssetId ? type3Fonts.get(span.fontAssetId) : undefined;\n await write(\n type3\n ? visualType3Text(span, type3, page.height)\n : visualText(span, page.height, fontAliases, reflectedOverlay && page.rotate === 180),\n );\n }\n }\n await write(\"</svg>\");\n for (const span of visualSpans) {\n if (usesPositionedSpan(span)) await write(positionedSpan(span, fontAliases));\n }\n await write(\"</div></section>\");\n}\n\nfunction usesReflectedVisualOverlay(page: ExtractedPage, spans: TextSpan[]): boolean {\n return (\n Boolean(page.images?.length) &&\n Boolean(page.paths?.length || page.fills?.length) &&\n spans.length > 0 &&\n spans.every(\n (span) =>\n span.transform !== undefined &&\n Math.abs(span.transform[0] + 1) < 0.000_001 &&\n Math.abs(span.transform[1]) < 0.000_001 &&\n Math.abs(span.transform[2]) < 0.000_001 &&\n Math.abs(span.transform[3] - 1) < 0.000_001,\n )\n );\n}\n\nfunction visualImage(\n image: RasterImage,\n pageHeight: number,\n pageNumber: number,\n imageIndex: number,\n): string {\n const [a, b, c, d, e, f] = image.transform;\n const transform = [a, -b, -c, d, c + e, pageHeight - d - f].map(number).join(\" \");\n const opacity = isUnitInterval(image.opacity) ? ` opacity=\"${number(image.opacity)}\"` : \"\";\n const mime = image.format === \"jpeg\" ? \"image/jpeg\" : \"image/bmp\";\n const data = image.format === \"jpeg\" ? image.data : rgbBmp(image);\n let output = `<image width=\"1\" height=\"1\" preserveAspectRatio=\"none\" transform=\"matrix(${transform})\" href=\"data:${mime};base64,${base64(data)}\"${opacity}/>`;\n for (let index = (image.clips?.length ?? 0) - 1; index >= 0; index -= 1) {\n output = `<g clip-path=\"url(#${imageClipId(pageNumber, imageIndex, index)})\">${output}</g>`;\n }\n return output;\n}\n\nfunction imageClipDefinitions(\n images: RasterImage[],\n pageNumber: number,\n pageHeight: number,\n): string {\n return images\n .flatMap((image, imageIndex) =>\n (image.clips ?? []).map((clip, clipIndex) => {\n if (!isSvgPath(clip.d)) return \"\";\n const fillRule = clip.fillRule ? ` clip-rule=\"${clip.fillRule}\"` : \"\";\n return `<clipPath id=\"${imageClipId(pageNumber, imageIndex, clipIndex)}\" clipPathUnits=\"userSpaceOnUse\"><path d=\"${clip.d}\" transform=\"translate(0 ${number(pageHeight)}) scale(1 -1)\"${fillRule}/></clipPath>`;\n }),\n )\n .join(\"\");\n}\n\nfunction imageClipId(pageNumber: number, imageIndex: number, clipIndex: number): string {\n return `boxpdf-clip-${pageNumber}-${imageIndex}-${clipIndex}`;\n}\n\nfunction pathClipDefinitions(paths: VectorPath[], pageNumber: number): string {\n return paths\n .flatMap((path, pathIndex) =>\n (path.clips ?? []).map((clip, clipIndex) => {\n if (!isSvgPath(clip.d)) return \"\";\n const fillRule = clip.fillRule ? ` clip-rule=\"${clip.fillRule}\"` : \"\";\n return `<clipPath id=\"${pathClipId(pageNumber, pathIndex, clipIndex)}\" clipPathUnits=\"userSpaceOnUse\"><path d=\"${clip.d}\"${fillRule}/></clipPath>`;\n }),\n )\n .join(\"\");\n}\n\nfunction pathClipId(pageNumber: number, pathIndex: number, clipIndex: number): string {\n return `boxpdf-path-clip-${pageNumber}-${pathIndex}-${clipIndex}`;\n}\n\nfunction rgbBmp(image: RasterImage): Uint8Array {\n const stride = Math.ceil((image.width * 3) / 4) * 4;\n const output = new Uint8Array(54 + stride * image.height);\n const view = new DataView(output.buffer);\n output[0] = 0x42;\n output[1] = 0x4d;\n view.setUint32(2, output.length, true);\n view.setUint32(10, 54, true);\n view.setUint32(14, 40, true);\n view.setInt32(18, image.width, true);\n view.setInt32(22, -image.height, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, 24, true);\n view.setUint32(34, stride * image.height, true);\n for (let row = 0; row < image.height; row += 1) {\n for (let column = 0; column < image.width; column += 1) {\n const source = (row * image.width + column) * 3;\n const target = 54 + row * stride + column * 3;\n output[target] = image.data[source + 2] ?? 0;\n output[target + 1] = image.data[source + 1] ?? 0;\n output[target + 2] = image.data[source] ?? 0;\n }\n }\n return output;\n}\n\nfunction rotationTransform(page: ExtractedPage): string {\n switch (page.rotate) {\n case 90:\n return `;transform:translate(${number(page.height)}pt,0) rotate(90deg)`;\n case 180:\n return `;transform:translate(${number(page.width)}pt,${number(page.height)}pt) rotate(180deg)`;\n case 270:\n return `;transform:translate(0,${number(page.width)}pt) rotate(270deg)`;\n default:\n return \"\";\n }\n}\n\nfunction positionedSpan(span: TextSpan, fontAliases: Map<string, string>): string {\n const direction = directionAttribute([span]);\n const style = [\n `left:${number(span.bounds.x)}pt`,\n `bottom:${number(span.bounds.y)}pt`,\n `width:${number(span.bounds.width)}pt`,\n `height:${number(span.bounds.height)}pt`,\n `font-size:${number(span.fontSize)}pt`,\n ...(isCssHexColor(span.color) ? [`color:${span.color}`] : []),\n ...(isUnitInterval(span.fillOpacity) ? [`opacity:${number(span.fillOpacity)}`] : []),\n ...visualFontStyles(\n span.fontFamily,\n span.fontAssetId ? fontAliases.get(span.fontAssetId) : undefined,\n ),\n ].join(\";\");\n return `<span class=\"pdf-span\"${direction} style=\"${style}\">${escapeHtml(span.text)}</span>`;\n}\n\nasync function writeFlowPage(page: ExtractedPage, write: HtmlWrite): Promise<void> {\n const media = semanticMedia(page);\n const structured = structurePage(withoutSemanticMediaSpans(page, media));\n const defaultColor = dominantTextColor(structured.lines);\n let mediaIndex = 0;\n await write(\n `<section class=\"pdf-page pdf-page--semantic pdf-page--flow\" data-page=\"${page.number}\">`,\n );\n for (const block of structured.blocks) {\n const blockY = semanticBlockY(block);\n while ((media[mediaIndex]?.bounds.y ?? -Infinity) >= blockY) {\n await write(`<div class=\"pdf-semantic-visual\">${media[mediaIndex]?.html}</div>`);\n mediaIndex += 1;\n }\n if (block.type === \"table\") await write(tableToHtml(block.table));\n else if (block.type === \"heading\") {\n await write(\n `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor)}</h${block.level}>`,\n );\n } else if (block.type === \"paragraph\") {\n await write(\n `<p${directionAttribute(block.lines.flatMap((line) => line.spans))}>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`,\n );\n } else if (block.type === \"preformatted\") {\n await write(`<pre>${escapeHtml(block.text)}</pre>`);\n } else if (block.type === \"definitionList\") {\n await write(\"<dl>\");\n for (const entry of block.entries) {\n await write(\n `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`,\n );\n }\n await write(\"</dl>\");\n } else if (block.type === \"cardList\") {\n await write('<div class=\"pdf-semantic-cards\">');\n for (const item of block.items) {\n await write(`<article><h3>${escapeHtml(item.title)}</h3>`);\n for (const detail of item.details) await write(`<p>${escapeHtml(detail)}</p>`);\n await write(\"</article>\");\n }\n await write(\"</div>\");\n } else if (block.type === \"sectionGroup\") {\n await write('<div class=\"pdf-semantic-sections\">');\n for (const item of block.items) {\n await write(`<section><h3>${escapeHtml(item.label)}</h3>`);\n for (const content of item.content) await write(`<p>${escapeHtml(content)}</p>`);\n await write(\"</section>\");\n }\n await write(\"</div>\");\n } else if (block.type === \"employment\") {\n await write(\n `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`,\n );\n } else {\n const tag = block.ordered ? \"ol\" : \"ul\";\n await write(`<${tag}>`);\n for (const item of block.items) await write(`<li>${escapeHtml(item.text)}</li>`);\n await write(`</${tag}>`);\n }\n }\n while (mediaIndex < media.length) {\n await write(`<div class=\"pdf-semantic-visual\">${media[mediaIndex]?.html}</div>`);\n mediaIndex += 1;\n }\n await write(\"</section>\");\n}\n\nfunction semanticBlockY(block: SemanticBlock): number {\n const lines = block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n return Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n}\n\nfunction visualText(\n span: TextSpan,\n pageHeight: number,\n fontAliases: Map<string, string>,\n counterRotateReflectedText = false,\n): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n if (!span.fontAssetId && isAdobeCjkFont(span.fontFamily)) return \"\";\n const direction = directionAttribute([span]);\n const font = visualFontStyles(\n span.fontFamily,\n span.fontAssetId ? fontAliases.get(span.fontAssetId) : undefined,\n ).join(\";\");\n const stroke = isCssHexColor(span.strokeColor) ? `stroke:${span.strokeColor}` : \"\";\n const strokeWidth =\n stroke && Number.isFinite(span.strokeWidth) && (span.strokeWidth ?? -1) >= 0\n ? `stroke-width:${number(span.strokeWidth ?? 0)}`\n : \"\";\n const strokeOnly = span.renderingMode === 1 || span.renderingMode === 5;\n const fillOpacity = isUnitInterval(span.fillOpacity)\n ? `fill-opacity:${number(span.fillOpacity)}`\n : \"\";\n const strokeOpacity = isUnitInterval(span.strokeOpacity)\n ? `stroke-opacity:${number(span.strokeOpacity)}`\n : \"\";\n const style = [\n isHebrewPaintOrder(span) ? \"unicode-bidi:bidi-override;direction:ltr\" : \"\",\n span.direction === \"ttb\" ? \"writing-mode:vertical-rl\" : \"\",\n strokeOnly ? \"fill:none\" : isCssHexColor(span.color) ? `fill:${span.color}` : \"\",\n stroke,\n strokeWidth,\n fillOpacity,\n strokeOpacity,\n font,\n ]\n .filter(Boolean)\n .join(\";\");\n const textExtent = span.direction === \"ttb\" ? span.bounds.height : span.bounds.width;\n const textLength =\n textExtent > 0 && !isHebrewPaintOrder(span)\n ? ` textLength=\"${number(textExtent)}\" lengthAdjust=\"${span.direction === \"ttb\" || usesSpacingAdjustment(span) ? \"spacing\" : \"spacingAndGlyphs\"}\"`\n : \"\";\n const transform =\n counterRotateReflectedText && span.transform\n ? ([\n span.transform[0],\n span.transform[1],\n span.transform[2],\n -span.transform[3],\n ] as TextSpan[\"transform\"])\n : span.transform;\n const transformed = hasNonIdentityTransform(transform);\n const rtlOffset = span.direction === \"rtl\" ? span.bounds.width : 0;\n const basisX = transform?.[0] ?? 1;\n const basisY = transform?.[1] ?? 0;\n const anchorX = span.bounds.x + basisX * rtlOffset;\n const anchorY = pageHeight - span.bounds.y + basisY * rtlOffset;\n const position = transformed\n ? ` x=\"0\" y=\"0\" transform=\"matrix(${transform?.map(number).join(\" \")} ${number(anchorX)} ${number(anchorY)})\"`\n : ` x=\"${number(anchorX)}\" y=\"${number(anchorY)}\"`;\n return `<text${direction}${position} font-size=\"${number(span.fontSize)}\"${textLength}${style ? ` style=\"${style}\"` : \"\"}>${escapeHtml(span.text)}</text>`;\n}\n\nfunction isAdobeCjkFont(fontFamily: string | undefined): boolean {\n return /^Adobe(?:Heiti|Song|Kaiti|Ming|Gothic|Mincho)Std-/i.test(fontFamily ?? \"\");\n}\n\nfunction visualType3Text(span: TextSpan, font: EmbeddedType3Font, pageHeight: number): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n const glyphs = new Map(font.glyphs.map((glyph) => [glyph.code, glyph]));\n const sequence = (span.glyphCodes ?? []).map((code) => glyphs.get(code));\n const totalAdvance = sequence.reduce((total, glyph) => total + (glyph?.advance ?? 0), 0);\n if (totalAdvance <= 0 || span.bounds.width <= 0 || span.fontSize <= 0) return \"\";\n const transform = span.transform ?? [1, 0, 0, 1];\n const outer = `matrix(${transform.map(number).join(\" \")} ${number(span.bounds.x)} ${number(pageHeight - span.bounds.y)})`;\n const xScale = span.bounds.width / totalAdvance;\n let offset = 0;\n let content = \"\";\n for (const glyph of sequence) {\n if (!glyph) continue;\n content += `<g transform=\"translate(${number(offset)} 0)\">${type3Glyph(glyph)}</g>`;\n offset += glyph.advance;\n }\n return `<g transform=\"${outer}\"><g transform=\"scale(${number(xScale)} ${number(-span.fontSize)})\">${content}</g></g>`;\n}\n\nfunction isHebrewPaintOrder(span: TextSpan): boolean {\n return span.direction === \"ltr\" && /[\\u0590-\\u05ff]/u.test(span.text);\n}\n\nfunction usesSpacingAdjustment(span: TextSpan): boolean {\n return !span.fontAssetId && /arial/i.test(span.fontFamily ?? \"\");\n}\n\nfunction type3Glyph(glyph: Type3Glyph): string {\n let output = \"\";\n for (const fill of glyph.fills ?? []) {\n if (!isCssHexColor(fill.color)) continue;\n const points = fill.points.map(([x, y]) => `${number(x)},${number(y)}`).join(\" \");\n const opacity = isUnitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n output += `<polygon points=\"${points}\" fill=\"${fill.color}\"${opacity}/>`;\n }\n for (const path of glyph.paths ?? []) {\n if (!isSvgPath(path.d)) continue;\n const fill = isCssHexColor(path.fill) ? path.fill : \"none\";\n const stroke = isCssHexColor(path.stroke) ? path.stroke : \"none\";\n const width =\n path.strokeWidth !== undefined && Number.isFinite(path.strokeWidth) && path.strokeWidth >= 0\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n output += `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${width}/>`;\n }\n return (glyph.fills?.length ?? 0) > 64 && glyph.advance > 2\n ? `<g shape-rendering=\"crispEdges\">${output}</g>`\n : output;\n}\n\nfunction isCssHexColor(value: string | undefined): value is string {\n return /^#[\\da-f]{6}$/i.test(value ?? \"\");\n}\n\nfunction isUnitInterval(value: number | undefined): value is number {\n return Number.isFinite(value) && (value ?? -1) >= 0 && (value ?? 2) <= 1;\n}\n\nfunction isSvgPath(value: string): boolean {\n return value.length <= 1_000_000 && /^[\\d\\s.,+\\-eEMmLlCcZz]+$/.test(value);\n}\n\nfunction isMonospace(fontFamily: string | undefined): boolean {\n return /courier|mono/i.test(fontFamily ?? \"\");\n}\n\nfunction usesPositionedSpan(span: TextSpan): boolean {\n return (\n !span.glyphCodes && isMonospace(span.fontFamily) && !hasNonIdentityTransform(span.transform)\n );\n}\n\nfunction hasNonIdentityTransform(transform: TextSpan[\"transform\"]): boolean {\n if (!transform) return false;\n const identity: [number, number, number, number] = [1, 0, 0, 1];\n return transform.some((value, index) => Math.abs(value - (identity[index] ?? 0)) > 0.000_001);\n}\n\nfunction directionAttribute(spans: TextSpan[]): string {\n const rtl = spans.filter((span) => span.direction === \"rtl\").length;\n const vertical = spans.filter((span) => span.direction === \"ttb\").length;\n if (vertical > rtl && vertical * 2 >= spans.length) return ' data-direction=\"ttb\"';\n return rtl * 2 >= spans.length && spans.length > 0 ? ' dir=\"rtl\"' : \"\";\n}\n\nfunction number(value: number): string {\n return Number.isFinite(value) ? String(Math.round(value * 1000) / 1000) : \"0\";\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHtml(value).replaceAll(\"`\", \"`\");\n}\n\nfunction escapeHtml(value: string): string {\n return [...value]\n .map((character) => {\n const codePoint = character.codePointAt(0) ?? 0;\n if (codePoint === 13) return \"\\n\";\n return isForbiddenControl(codePoint) ? \"�\" : character;\n })\n .join(\"\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction isForbiddenControl(codePoint: number): boolean {\n return (\n codePoint <= 8 ||\n codePoint === 11 ||\n codePoint === 12 ||\n (codePoint >= 14 && codePoint <= 31) ||\n codePoint === 127\n );\n}\n\nfunction resolveProfile(options: HtmlWriterOptions): HtmlProfile {\n const legacyProfile = options.layout === \"flow\" ? \"semantic\" : \"visual\";\n if (options.profile && options.layout && options.profile !== legacyProfile) {\n throw new Error(\n `conflicting HTML output options: profile \"${options.profile}\" does not match layout \"${options.layout}\"`,\n );\n }\n return options.profile ?? legacyProfile;\n}\n","import type { ExtractedPage } from \"@boxpdf/reader\";\nimport {\n type SemanticBlock,\n type StructuredPage,\n structurePage,\n type Table,\n tableToRows,\n} from \"@boxpdf/reader/structure\";\nimport { dominantTextColor, semanticTextHtml } from \"./semantic-inline.js\";\nimport { type SemanticMedia, semanticMedia, withoutSemanticMediaSpans } from \"./semantic-media.js\";\n\nexport interface SemanticDocumentStats {\n pagesProcessed: number;\n peakBufferedPages: number;\n peakBufferedLines: number;\n mergedTables: number;\n suppressedFurniture: number;\n}\n\ninterface BufferedPage {\n width: number;\n height: number;\n structured: StructuredPage;\n media: SemanticMedia[];\n}\n\ninterface ActiveTable {\n table: Table;\n header: string[] | undefined;\n}\n\nexport async function writeSemanticDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: (chunk: string) => void | Promise<void>,\n lookaheadPages: number,\n): Promise<SemanticDocumentStats> {\n const stats: SemanticDocumentStats = {\n pagesProcessed: 0,\n peakBufferedPages: 0,\n peakBufferedLines: 0,\n mergedTables: 0,\n suppressedFurniture: 0,\n };\n const buffer: BufferedPage[] = [];\n const seenFurniture = new Set<string>();\n const sectionLevels: number[] = [];\n let activeTable: ActiveTable | undefined;\n const pendingMedia: string[] = [];\n let headerOpen = false;\n let headerHasParagraph = false;\n let contentStarted = false;\n let employmentOpen = false;\n let pendingParagraph:\n | {\n block: Extract<SemanticBlock, { type: \"paragraph\" }>;\n height: number;\n defaultColor: string;\n }\n | undefined;\n await write('<article class=\"pdf-semantic-document\">');\n\n const closeTable = async () => {\n if (!activeTable) return;\n await write(\"</table>\");\n activeTable = undefined;\n while (pendingMedia.length > 0) await write(pendingMedia.shift() ?? \"\");\n };\n\n const closeSections = async (minimumLevel = 0) => {\n while ((sectionLevels.at(-1) ?? -1) >= minimumLevel && sectionLevels.length > 0) {\n await write(\"</section>\");\n sectionLevels.pop();\n }\n };\n\n const flushPendingParagraph = async () => {\n if (!pendingParagraph) return;\n await write(semanticBlockHtml(pendingParagraph.block, pendingParagraph.defaultColor));\n pendingParagraph = undefined;\n };\n\n const closeEmployment = async () => {\n if (!employmentOpen) return;\n await write(\"</section>\");\n employmentOpen = false;\n };\n\n const emitPage = async (page: BufferedPage, future: BufferedPage[]) => {\n const defaultColor = dominantTextColor(page.structured.lines);\n let mediaIndex = 0;\n const futureFurniture = new Set(future.flatMap((candidate) => marginSignatures(candidate)));\n const repeatedFurniture = new Set([...seenFurniture, ...futureFurniture]);\n for (const [blockIndex, block] of page.structured.blocks.entries()) {\n const nextBlock = page.structured.blocks[blockIndex + 1];\n const blockY = semanticBlockY(block);\n while ((page.media[mediaIndex]?.bounds.y ?? -Infinity) >= blockY) {\n await flushPendingParagraph();\n const html = `<div class=\"pdf-semantic-visual\">${page.media[mediaIndex]?.html}</div>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n mediaIndex += 1;\n }\n if (isRepeatedFurniture(block, page, repeatedFurniture)) {\n stats.suppressedFurniture += 1;\n continue;\n }\n await flushPendingParagraph();\n if (employmentOpen && block.type !== \"list\") await closeEmployment();\n if (!contentStarted && !headerOpen && block.type === \"heading\" && block.level === 1) {\n await write(`<header><h1>${semanticTextHtml(block.text, block.lines, defaultColor)}</h1>`);\n headerOpen = true;\n continue;\n }\n if (headerOpen) {\n if (block.type === \"paragraph\") {\n const tag = isContactBlock(block) ? \"address\" : \"p\";\n await write(\n `<${tag}>${semanticTextHtml(block.text, block.lines, defaultColor)}</${tag}>`,\n );\n headerHasParagraph = true;\n continue;\n }\n if (\n block.type === \"heading\" &&\n !headerHasParagraph &&\n (block.level === 1 ||\n block.text.trimStart().startsWith(\"#\") ||\n (block.level === 4 && nextBlock?.type === \"paragraph\" && isContactBlock(nextBlock)))\n ) {\n await write(\n `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor)}</h${block.level}>`,\n );\n continue;\n }\n await write(\"</header>\");\n headerOpen = false;\n contentStarted = true;\n }\n if (block.type === \"table\") {\n const rows = tableToRows(block.table);\n if (activeTable && tablesContinue(activeTable.table, block.table, page.width)) {\n const continuationRows = sameRow(activeTable.header, rows[0]) ? rows.slice(1) : rows;\n for (const row of continuationRows) await write(tableRow(row, false));\n activeTable.table = block.table;\n stats.mergedTables += 1;\n continue;\n }\n await closeTable();\n const header = tableHeader(rows);\n await write(\"<table>\");\n for (const [index, row] of rows.entries())\n await write(tableRow(row, Boolean(header && index === 0)));\n activeTable = { table: block.table, header };\n continue;\n }\n if (activeTable && block.type === \"definitionList\" && isFinancialSummary(block)) {\n const columns = activeTable.table.columns.length;\n await write(\n `<tfoot>${block.entries.map((entry) => financialSummaryRow(entry, columns)).join(\"\")}</tfoot>`,\n );\n await closeTable();\n continue;\n }\n await closeTable();\n if (block.type === \"heading\") {\n const level = contentStarted && block.level === 1 ? 2 : block.level;\n await closeSections(level);\n await write(\n `<section data-level=\"${level}\"><h${level}>${semanticTextHtml(block.text, block.lines, defaultColor)}</h${level}>`,\n );\n sectionLevels.push(level);\n continue;\n }\n if (block.type === \"paragraph\") {\n if (isTitledRecord(block)) {\n const [institution, ...details] = block.lines;\n if (institution) await write(`<h3>${escapeHtml(institution.text)}</h3>`);\n for (const detail of details) await write(`<p>${escapeHtml(detail.text)}</p>`);\n continue;\n }\n if (isUnmarkedList(block)) {\n await write(\n `<ul>${block.lines.map((line) => `<li>${escapeHtml(line.text)}</li>`).join(\"\")}</ul>`,\n );\n continue;\n }\n pendingParagraph = { block, height: page.height, defaultColor };\n continue;\n }\n if (block.type === \"employment\") {\n await write(\n `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p>`,\n );\n employmentOpen = true;\n continue;\n }\n await write(semanticBlockHtml(block, defaultColor));\n }\n while (mediaIndex < page.media.length) {\n await flushPendingParagraph();\n const html = `<div class=\"pdf-semantic-visual\">${page.media[mediaIndex]?.html}</div>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n mediaIndex += 1;\n }\n for (const signature of marginSignatures(page)) seenFurniture.add(signature);\n };\n\n for await (const page of pages) {\n const media = semanticMedia(page);\n const structured = structurePage(withoutSemanticMediaSpans(page, media));\n buffer.push({ width: page.width, height: page.height, structured, media });\n stats.pagesProcessed += 1;\n stats.peakBufferedPages = Math.max(stats.peakBufferedPages, buffer.length);\n stats.peakBufferedLines = Math.max(\n stats.peakBufferedLines,\n buffer.reduce((total, item) => total + item.structured.lines.length, 0),\n );\n if (buffer.length >= lookaheadPages) {\n const ready = buffer.shift();\n if (ready) await emitPage(ready, buffer);\n }\n }\n while (buffer.length > 0) {\n const ready = buffer.shift();\n if (ready) await emitPage(ready, buffer);\n }\n if (headerOpen) await write(\"</header>\");\n await closeTable();\n await closeEmployment();\n if (pendingParagraph && isFooterParagraph(pendingParagraph.block, pendingParagraph.height)) {\n await closeSections();\n await write(\n `<footer>${semanticBlockHtml(pendingParagraph.block, pendingParagraph.defaultColor)}</footer>`,\n );\n pendingParagraph = undefined;\n } else {\n await flushPendingParagraph();\n await closeSections();\n }\n await write(\"</article>\");\n return stats;\n}\n\nfunction isContactBlock(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n const text = block.text;\n const signals = [\n /@/.test(text),\n /\\+?\\d[\\d().\\s-]{7,}/.test(text),\n /\\bhttps?:\\/\\//i.test(text),\n /\\b\\w+\\.\\w{2,}\\b/i.test(text),\n ];\n return signals.filter(Boolean).length >= 2;\n}\n\nfunction isTitledRecord(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n if (block.lines.length < 2) return false;\n const [first, ...rest] = block.lines;\n if (!first || rest.length === 0) return false;\n const firstSize = Math.max(...first.spans.map((span) => span.fontSize));\n const restSize = Math.max(...rest.flatMap((line) => line.spans.map((span) => span.fontSize)));\n const emphasized = first.spans.some((span) =>\n /(?:bold|semibold|demi)/i.test(span.fontFamily ?? \"\"),\n );\n return emphasized || firstSize >= restSize * 1.08;\n}\n\nfunction isUnmarkedList(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n if (block.lines.length < 3) return false;\n const first = block.lines[0];\n if (!first) return false;\n const aligned = block.lines.every(\n (line) => Math.abs(line.bounds.x - first.bounds.x) <= Math.max(8, first.bounds.height),\n );\n const separated = block.lines.slice(1).every((line, index) => {\n const previous = block.lines[index];\n if (!previous) return false;\n const gap = previous.bounds.y - (line.bounds.y + line.bounds.height);\n return gap >= Math.min(previous.bounds.height, line.bounds.height) * 0.55;\n });\n return aligned && separated;\n}\n\nfunction isFooterParagraph(\n block: Extract<SemanticBlock, { type: \"paragraph\" }>,\n pageHeight: number,\n): boolean {\n const inBottomMargin = block.lines.every(\n (line) => line.bounds.y + line.bounds.height <= pageHeight * 0.15,\n );\n return inBottomMargin || /^(?:thanks|thank you)\\b/i.test(block.text.trim());\n}\n\nfunction marginSignatures(page: BufferedPage): string[] {\n return page.structured.blocks.flatMap((block) =>\n blockLines(block)\n .filter((line) => isMarginLine(line.bounds.y, line.bounds.height, page.height))\n .map((line) => furnitureSignature(line.text)),\n );\n}\n\nfunction isRepeatedFurniture(\n block: SemanticBlock,\n page: BufferedPage,\n futureFurniture: Set<string>,\n): boolean {\n const lines = blockLines(block);\n return (\n lines.length > 0 &&\n lines.every(\n (line) =>\n isMarginLine(line.bounds.y, line.bounds.height, page.height) &&\n futureFurniture.has(furnitureSignature(line.text)),\n )\n );\n}\n\nfunction blockLines(block: SemanticBlock) {\n return block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n}\n\nfunction isMarginLine(y: number, height: number, pageHeight: number): boolean {\n return y + height <= pageHeight * 0.12 || y >= pageHeight * 0.88;\n}\n\nfunction furnitureSignature(value: string): string {\n return value.toLocaleLowerCase(\"en\").replace(/\\d+/g, \"#\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction tablesContinue(previous: Table, next: Table, pageWidth: number): boolean {\n if (previous.columns.length !== next.columns.length || previous.columns.length < 2) return false;\n return previous.columns.every(\n (column, index) =>\n Math.abs(column - (next.columns[index] ?? Number.POSITIVE_INFINITY)) / pageWidth <= 0.04,\n );\n}\n\nfunction tableHeader(rows: string[][]): string[] | undefined {\n const first = rows[0];\n if (!first) return undefined;\n const later = rows.slice(1).flat();\n return first.every((value) => /\\p{L}/u.test(value) && !isNumericValue(value)) &&\n later.some(isNumericValue)\n ? first\n : undefined;\n}\n\nfunction sameRow(left: string[] | undefined, right: string[] | undefined): boolean {\n return Boolean(\n left &&\n right &&\n left.length === right.length &&\n left.every((value, index) => value === right[index]),\n );\n}\n\nfunction tableRow(row: string[], header: boolean): string {\n const cell = header ? \"th\" : \"td\";\n return `<tr>${row.map((value) => `<${cell}>${escapeHtml(value)}</${cell}>`).join(\"\")}</tr>`;\n}\n\nfunction isFinancialSummary(block: Extract<SemanticBlock, { type: \"definitionList\" }>): boolean {\n return (\n block.entries.length > 0 &&\n block.entries.every((entry) => isNumericValue(entry.description)) &&\n block.entries.some((entry) => /\\p{Sc}|%/u.test(entry.description))\n );\n}\n\nfunction isNumericValue(value: string): boolean {\n return /^(?:\\p{Sc}\\s*)?[\\d.,'’\\s]+(?:\\s*%)?$/u.test(value.trim());\n}\n\nfunction financialSummaryRow(\n entry: Extract<SemanticBlock, { type: \"definitionList\" }>[\"entries\"][number],\n columns: number,\n): string {\n const colspan = columns > 2 ? ` colspan=\"${columns - 1}\"` : \"\";\n return `<tr><th scope=\"row\"${colspan}>${escapeHtml(entry.term)}</th><td>${escapeHtml(entry.description)}</td></tr>`;\n}\n\nfunction semanticBlockHtml(\n block: Exclude<SemanticBlock, { type: \"table\" }>,\n defaultColor = \"#000000\",\n): string {\n if (block.type === \"heading\")\n return `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor)}</h${block.level}>`;\n if (block.type === \"paragraph\")\n return `<p>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`;\n if (block.type === \"preformatted\") return `<pre>${escapeHtml(block.text)}</pre>`;\n if (block.type === \"definitionList\") {\n if (\n block.entries.length <= 3 &&\n block.entries.some((entry) => entry.description.trim().split(/\\s+/).length >= 5) &&\n block.entries.every((entry) => /^[A-Z][A-Z\\s/-]*$/.test(entry.term.trim()))\n ) {\n return block.entries\n .map(\n (entry) =>\n `<section><h2>${escapeHtml(titleCase(entry.term))}</h2><p>${escapeHtml(entry.description)}</p></section>`,\n )\n .join(\"\");\n }\n const list = `<dl>${block.entries\n .map(\n (entry) =>\n `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`,\n )\n .join(\"\")}</dl>`;\n return isFinancialSummary(block) ? `<section>${list}</section>` : list;\n }\n if (block.type === \"cardList\") {\n return `<section><h2>Items ordered</h2><table><thead><tr><th scope=\"col\">Item</th><th scope=\"col\">Quantity</th><th scope=\"col\">Amount</th></tr></thead><tbody>${block.items.map(cardTableRow).join(\"\")}</tbody></table></section>`;\n }\n if (block.type === \"sectionGroup\") {\n return block.items.map(labeledSectionHtml).join(\"\");\n }\n if (block.type === \"employment\") {\n return `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`;\n }\n const tag = block.ordered ? \"ol\" : \"ul\";\n return `<${tag}>${block.items.map((item) => `<li>${escapeHtml(item.text)}</li>`).join(\"\")}</${tag}>`;\n}\n\nfunction semanticBlockY(block: SemanticBlock): number {\n const lines = block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n return Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n}\n\nfunction cardTableRow(item: Extract<SemanticBlock, { type: \"cardList\" }>[\"items\"][number]): string {\n const trailing = item.details.at(-1) ?? \"\";\n const match = /^\\s*[×x]\\s*(\\d+)\\s+(.+)$/u.exec(trailing);\n const description = item.details.slice(0, -1).join(\" \");\n const detail = description ? `<br><span>${escapeHtml(description)}</span>` : \"\";\n const quantity = match?.[1] ?? \"\";\n const amount = match?.[2] ?? trailing;\n return `<tr><th scope=\"row\">${escapeHtml(item.title)}${detail}</th><td>${escapeHtml(quantity)}</td><td>${escapeHtml(amount)}</td></tr>`;\n}\n\nfunction labeledSectionHtml(\n item: Extract<SemanticBlock, { type: \"sectionGroup\" }>[\"items\"][number],\n): string {\n const heading = titleCase(item.label);\n const postal = /\\b(?:ship|deliver|mail)(?:ed)?\\b/i.test(item.label);\n if (postal) {\n const [name, ...address] = item.content;\n const content = [name ? `<strong>${escapeHtml(name)}</strong>` : \"\", ...address.map(escapeHtml)]\n .filter(Boolean)\n .join(\"<br>\");\n return `<section><h2>${escapeHtml(heading)}</h2><address>${content}</address></section>`;\n }\n return `<section><h2>${escapeHtml(heading)}</h2>${item.content\n .map(\n (content, index) =>\n `<p>${index === 0 ? `<strong>${escapeHtml(content)}</strong>` : escapeHtml(content)}</p>`,\n )\n .join(\"\")}</section>`;\n}\n\nfunction titleCase(value: string): string {\n const normalized = value.trim().toLocaleLowerCase(\"en\");\n return normalized.replace(/^\\p{L}/u, (letter) => letter.toLocaleUpperCase(\"en\"));\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n","import type { TextLine } from \"@boxpdf/reader/structure\";\n\ninterface StyledRange {\n start: number;\n end: number;\n color: string;\n}\n\nexport function dominantTextColor(lines: TextLine[]): string {\n const counts = new Map<string, number>();\n for (const span of lines.flatMap((line) => line.spans)) {\n const color = normalizedColor(span.color) ?? \"#000000\";\n counts.set(color, (counts.get(color) ?? 0) + Math.max(1, [...span.text].length));\n }\n return [...counts].sort((left, right) => right[1] - left[1])[0]?.[0] ?? \"#000000\";\n}\n\nexport function semanticTextHtml(text: string, lines: TextLine[], defaultColor: string): string {\n const ranges: StyledRange[] = [];\n let cursor = 0;\n for (const span of lines.flatMap((line) => line.spans)) {\n if (!span.text) continue;\n const start = text.indexOf(span.text, cursor);\n if (start < 0) continue;\n cursor = start + span.text.length;\n const color = normalizedColor(span.color);\n if (color && color !== defaultColor) ranges.push({ start, end: cursor, color });\n }\n const merged = mergeRanges(ranges, text);\n let html = \"\";\n let offset = 0;\n for (const range of merged) {\n html += escapeHtml(text.slice(offset, range.start));\n html += `<span style=\"color:${range.color}\">${escapeHtml(text.slice(range.start, range.end))}</span>`;\n offset = range.end;\n }\n return html + escapeHtml(text.slice(offset));\n}\n\nfunction mergeRanges(ranges: StyledRange[], text: string): StyledRange[] {\n const merged: StyledRange[] = [];\n for (const range of ranges) {\n const previous = merged.at(-1);\n if (\n previous &&\n previous.color === range.color &&\n /^\\s*$/.test(text.slice(previous.end, range.start))\n ) {\n previous.end = range.end;\n } else {\n merged.push({ ...range });\n }\n }\n return merged;\n}\n\nfunction normalizedColor(value: string | undefined): string | undefined {\n if (!value || !/^#[\\da-f]{6}$/i.test(value)) return undefined;\n const color = value.toLowerCase();\n return color === \"#000000\" || color === \"#000\" ? \"#000000\" : color;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n","import type { EmbeddedFont } from \"@boxpdf/reader\";\n\nexport function visualFontAliases(pageNumber: number, fonts: EmbeddedFont[]): Map<string, string> {\n return new Map(\n fonts\n .filter((font) => font.format === \"truetype\" && !/(?:courier|^TTE)/i.test(font.family ?? \"\"))\n .map((font) => [font.id, `boxpdf-${pageNumber}-${font.id}`]),\n );\n}\n\nexport function visualFontFace(font: EmbeddedFont, aliases: Map<string, string>): string {\n if (font.format !== \"truetype\") return \"\";\n const alias = aliases.get(font.id);\n if (!alias) return \"\";\n const styles = visualFontStyles(font.family, alias).filter(\n (style) => !style.startsWith(\"font-family:\"),\n );\n return `@font-face{font-family:${alias};src:url(data:font/ttf;base64,${base64(font.data)}) format(\"truetype\");${styles.join(\";\")}}`;\n}\n\nexport function visualFontStyles(fontFamily: string | undefined, alias?: string): string[] {\n const normalized = fontFamily?.toLowerCase() ?? \"\";\n const styles: string[] = [];\n let fallback: string | undefined;\n if (/courier|mono|nimbusmono|^cmtt/.test(normalized)) {\n fallback = \"Courier New,Courier,monospace\";\n } else if (\n /times|minion|serif|baskerville|georgia|nimbusrom|guardian.*egyp|^cm[rs]y?\\d/.test(normalized)\n ) {\n fallback = \"Times New Roman,Times,serif\";\n } else if (/helvetica|arial|sans|nimbussan|calibre|myriad|panton|^tte|^mstt/.test(normalized)) {\n fallback = \"Arial,Helvetica,sans-serif\";\n }\n if (alias || fallback) styles.push(`font-family:${[alias, fallback].filter(Boolean).join(\",\")}`);\n if (/bold|black|semibold|demi|medi|^tte/.test(normalized)) styles.push(\"font-weight:700\");\n if (/italic|oblique|slant|ital(?:$|[_-])/.test(normalized)) styles.push(\"font-style:italic\");\n return styles;\n}\n\nexport function base64(bytes: Uint8Array): string {\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n let output = \"\";\n for (let index = 0; index < bytes.length; index += 3) {\n const first = bytes[index] ?? 0;\n const second = bytes[index + 1] ?? 0;\n const third = bytes[index + 2] ?? 0;\n output += alphabet[first >> 2];\n output += alphabet[((first & 3) << 4) | (second >> 4)];\n output += index + 1 < bytes.length ? alphabet[((second & 15) << 2) | (third >> 6)] : \"=\";\n output += index + 2 < bytes.length ? alphabet[third & 63] : \"=\";\n }\n return output;\n}\n","import type {\n ExtractedPage,\n RasterImage,\n Rect,\n TextSpan,\n VectorFill,\n VectorPath,\n} from \"@boxpdf/reader\";\nimport { base64, visualFontAliases, visualFontFace, visualFontStyles } from \"./visual-font.js\";\n\nexport interface SemanticMedia {\n bounds: Rect;\n html: string;\n consumedSpans?: TextSpan[];\n}\n\nexport function semanticMedia(page: ExtractedPage): SemanticMedia[] {\n const output = (page.images ?? []).map((image) => rasterMedia(image));\n const vector = vectorMedia(page);\n if (vector) output.push(vector);\n return output.sort((left, right) => right.bounds.y - left.bounds.y);\n}\n\nfunction rasterMedia(image: RasterImage): SemanticMedia {\n const bounds = transformedUnitBounds(image.transform);\n const mime = image.format === \"jpeg\" ? \"image/jpeg\" : \"image/bmp\";\n const data = image.format === \"jpeg\" ? image.data : rgbBmp(image);\n const opacity = unitInterval(image.opacity) ? `;opacity:${number(image.opacity)}` : \"\";\n return {\n bounds,\n html: `<img class=\"pdf-semantic-media\" src=\"data:${mime};base64,${base64(data)}\" width=\"${number(bounds.width)}\" height=\"${number(bounds.height)}\" alt=\"\" style=\"max-width:100%;height:auto${opacity}\">`,\n };\n}\n\nfunction vectorMedia(page: ExtractedPage): SemanticMedia | undefined {\n const paths = (page.paths ?? []).filter((path) => safePath(path.d));\n const fills = page.fills ?? [];\n const bounds = unionBounds([\n ...paths.map((path) => pathBounds(path.d)),\n ...fills.map(fillBounds),\n ]);\n if (!bounds || bounds.width <= 0 || bounds.height <= 0) return undefined;\n const aliases = visualFontAliases(page.number, page.fonts ?? []);\n const visualCodeFonts = new Set(\n (page.fonts ?? [])\n .filter((font) => font.format === \"truetype\" && font.visualCodeMapping)\n .map((font) => font.id),\n );\n const visualSpans = page.visualSpans ?? page.spans;\n const overlay = visualSpans.filter(\n (span) =>\n span.fontAssetId &&\n visualCodeFonts.has(span.fontAssetId) &&\n centerInside(span.bounds, bounds),\n );\n const consumedSpans = page.spans.filter(\n (span) =>\n span.fontAssetId &&\n visualCodeFonts.has(span.fontAssetId) &&\n centerInside(span.bounds, bounds),\n );\n const fontIds = new Set(overlay.map((span) => span.fontAssetId));\n const fontFaces = (page.fonts ?? [])\n .filter((font) => fontIds.has(font.id))\n .map((font) => visualFontFace(font, aliases))\n .join(\"\");\n return {\n bounds,\n html: `<svg class=\"pdf-semantic-media\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${number(bounds.x)} ${number(page.height - bounds.y - bounds.height)} ${number(bounds.width)} ${number(bounds.height)}\" style=\"display:block;max-width:100%;height:auto\" aria-hidden=\"true\">${fontFaces ? `<style>${fontFaces}</style>` : \"\"}<g transform=\"translate(0 ${number(page.height)}) scale(1 -1)\">${fills.map(vectorFill).join(\"\") + paths.map((path) => vectorPath(path)).join(\"\")}</g>${overlay.map((span) => vectorText(span, page.height, aliases)).join(\"\")}</svg>`,\n ...(consumedSpans.length > 0 ? { consumedSpans } : {}),\n };\n}\n\nexport function withoutSemanticMediaSpans(\n page: ExtractedPage,\n media: SemanticMedia[],\n): ExtractedPage {\n const consumed = new Set(media.flatMap((item) => item.consumedSpans ?? []));\n return consumed.size > 0\n ? { ...page, spans: page.spans.filter((span) => !consumed.has(span)) }\n : page;\n}\n\nfunction vectorText(span: TextSpan, pageHeight: number, aliases: Map<string, string>): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n const styles = [\n cssColor(span.color) ? `fill:${span.color}` : \"\",\n unitInterval(span.fillOpacity) ? `fill-opacity:${number(span.fillOpacity)}` : \"\",\n ...visualFontStyles(\n span.fontFamily,\n span.fontAssetId ? aliases.get(span.fontAssetId) : undefined,\n ),\n ]\n .filter(Boolean)\n .join(\";\");\n const anchorY = pageHeight - span.bounds.y;\n const transform = span.transform;\n const position = transform\n ? ` x=\"0\" y=\"0\" transform=\"matrix(${transform.map(number).join(\" \")} ${number(span.bounds.x)} ${number(anchorY)})\"`\n : ` x=\"${number(span.bounds.x)}\" y=\"${number(anchorY)}\"`;\n const extent = span.direction === \"ttb\" ? span.bounds.height : span.bounds.width;\n const length =\n extent > 0 ? ` textLength=\"${number(extent)}\" lengthAdjust=\"spacingAndGlyphs\"` : \"\";\n return `<text${position} font-size=\"${number(span.fontSize)}\"${length}${styles ? ` style=\"${styles}\"` : \"\"}>${escapeHtml(span.text)}</text>`;\n}\n\nfunction centerInside(inner: Rect, outer: Rect): boolean {\n const x = inner.x + inner.width / 2;\n const y = inner.y + inner.height / 2;\n return x >= outer.x && x <= outer.x + outer.width && y >= outer.y && y <= outer.y + outer.height;\n}\n\nfunction vectorFill(fill: VectorFill): string {\n const points = fill.points.map(([x, y]) => `${number(x)},${number(y)}`).join(\" \");\n const opacity = unitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n return cssColor(fill.color) ? `<polygon points=\"${points}\" fill=\"${fill.color}\"${opacity}/>` : \"\";\n}\n\nfunction vectorPath(path: VectorPath): string {\n const fill = cssColor(path.fill) ? path.fill : \"none\";\n const stroke = cssColor(path.stroke) ? path.stroke : \"none\";\n const width = finiteNonnegative(path.strokeWidth)\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n const fillOpacity = unitInterval(path.fillOpacity)\n ? ` fill-opacity=\"${number(path.fillOpacity)}\"`\n : \"\";\n const strokeOpacity = unitInterval(path.strokeOpacity)\n ? ` stroke-opacity=\"${number(path.strokeOpacity)}\"`\n : \"\";\n const dash = path.strokeDasharray?.every(finiteNonnegative)\n ? ` stroke-dasharray=\"${path.strokeDasharray.map(number).join(\" \")}\"`\n : \"\";\n const linecap = path.strokeLinecap ? ` stroke-linecap=\"${path.strokeLinecap}\"` : \"\";\n const linejoin = path.strokeLinejoin ? ` stroke-linejoin=\"${path.strokeLinejoin}\"` : \"\";\n const rule = path.fillRule ? ` fill-rule=\"${path.fillRule}\"` : \"\";\n return `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${width}${fillOpacity}${strokeOpacity}${dash}${linecap}${linejoin}${rule}/>`;\n}\n\nfunction transformedUnitBounds([a, b, c, d, e, f]: RasterImage[\"transform\"]): Rect {\n const points = [\n [e, f],\n [a + e, b + f],\n [c + e, d + f],\n [a + c + e, b + d + f],\n ];\n const xs = points.map(([x]) => x ?? 0);\n const ys = points.map(([, y]) => y ?? 0);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return { x: minX, y: minY, width: Math.max(...xs) - minX, height: Math.max(...ys) - minY };\n}\n\nfunction pathBounds(path: string): Rect | undefined {\n const values = [...path.matchAll(/[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?/gi)].map((match) =>\n Number(match[0]),\n );\n if (values.length < 2) return undefined;\n const xs: number[] = [];\n const ys: number[] = [];\n for (let index = 0; index + 1 < values.length; index += 2) {\n xs.push(values[index] ?? 0);\n ys.push(values[index + 1] ?? 0);\n }\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return { x: minX, y: minY, width: Math.max(...xs) - minX, height: Math.max(...ys) - minY };\n}\n\nfunction fillBounds(fill: VectorFill): Rect | undefined {\n if (fill.points.length === 0) return undefined;\n const xs = fill.points.map(([x]) => x);\n const ys = fill.points.map(([, y]) => y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return { x: minX, y: minY, width: Math.max(...xs) - minX, height: Math.max(...ys) - minY };\n}\n\nfunction unionBounds(bounds: Array<Rect | undefined>): Rect | undefined {\n const values = bounds.filter((value): value is Rect => Boolean(value));\n if (values.length === 0) return undefined;\n const x = Math.min(...values.map((value) => value.x));\n const y = Math.min(...values.map((value) => value.y));\n const right = Math.max(...values.map((value) => value.x + value.width));\n const top = Math.max(...values.map((value) => value.y + value.height));\n return { x, y, width: right - x, height: top - y };\n}\n\nfunction rgbBmp(image: RasterImage): Uint8Array {\n const stride = Math.ceil((image.width * 3) / 4) * 4;\n const output = new Uint8Array(54 + stride * image.height);\n const view = new DataView(output.buffer);\n output.set([0x42, 0x4d]);\n view.setUint32(2, output.length, true);\n view.setUint32(10, 54, true);\n view.setUint32(14, 40, true);\n view.setInt32(18, image.width, true);\n view.setInt32(22, -image.height, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, 24, true);\n for (let row = 0; row < image.height; row += 1) {\n for (let column = 0; column < image.width; column += 1) {\n const source = (row * image.width + column) * 3;\n const target = 54 + row * stride + column * 3;\n output[target] = image.data[source + 2] ?? 0;\n output[target + 1] = image.data[source + 1] ?? 0;\n output[target + 2] = image.data[source] ?? 0;\n }\n }\n return output;\n}\n\nfunction safePath(value: string): boolean {\n return value.length <= 1_000_000 && /^[\\d\\s.,+\\-eEMmLlCcZz]+$/.test(value);\n}\n\nfunction cssColor(value: string | undefined): value is string {\n return /^#[\\da-f]{6}$/i.test(value ?? \"\");\n}\n\nfunction finiteNonnegative(value: number | undefined): value is number {\n return Number.isFinite(value) && (value ?? -1) >= 0;\n}\n\nfunction unitInterval(value: number | undefined): value is number {\n return finiteNonnegative(value) && value <= 1;\n}\n\nfunction number(value: number): string {\n return Number.isFinite(value) ? String(Math.round(value * 1_000) / 1_000) : \"0\";\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n"],"mappings":"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","names":["structurePage","styles","styles","escapeHtml","escapeHtml","escapeHtml","number","rgbBmp","structurePage","semanticBlockY"]}
|