@hidemikimura/receipt-html-to-pdf 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/dist/receipt-html-to-pdf.min.js +39 -0
- package/dist/receipt-html-to-pdf.min.js.map +7 -0
- package/examples/lit.js +52 -0
- package/examples/react.jsx +56 -0
- package/examples/vanilla.html +55 -0
- package/package.json +82 -0
- package/src/font/cid.js +187 -0
- package/src/font/parse.js +336 -0
- package/src/font/registry.js +168 -0
- package/src/font/subset.js +211 -0
- package/src/index.js +239 -0
- package/src/page.js +429 -0
- package/src/paginate.js +119 -0
- package/src/pdf/compress.js +30 -0
- package/src/pdf/content.js +192 -0
- package/src/pdf/image.js +33 -0
- package/src/pdf/writer.js +253 -0
- package/src/renderer.js +328 -0
- package/src/units.js +127 -0
- package/src/walker/image.js +264 -0
- package/src/walker/text.js +199 -0
- package/src/walker/walk.js +670 -0
- package/types/font/cid.d.ts +40 -0
- package/types/font/parse.d.ts +113 -0
- package/types/font/registry.d.ts +63 -0
- package/types/font/subset.d.ts +26 -0
- package/types/index.d.ts +198 -0
- package/types/page.d.ts +64 -0
- package/types/paginate.d.ts +59 -0
- package/types/pdf/compress.d.ts +13 -0
- package/types/pdf/content.d.ts +65 -0
- package/types/pdf/image.d.ts +9 -0
- package/types/pdf/writer.d.ts +125 -0
- package/types/renderer.d.ts +55 -0
- package/types/units.d.ts +53 -0
- package/types/walker/image.d.ts +72 -0
- package/types/walker/text.d.ts +38 -0
- package/types/walker/walk.d.ts +150 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/font/parse.js", "../src/font/registry.js", "../src/renderer.js", "../src/units.js", "../src/walker/text.js", "../src/walker/image.js", "../src/walker/walk.js", "../src/pdf/compress.js", "../src/pdf/writer.js", "../src/pdf/content.js", "../src/font/subset.js", "../src/font/cid.js", "../src/pdf/image.js", "../src/paginate.js", "../src/page.js", "../src/index.js"],
|
|
4
|
+
"sourcesContent": ["// @ts-check\n/**\n * TrueType (sfnt / glyf \u30A2\u30A6\u30C8\u30E9\u30A4\u30F3) \u30D5\u30A9\u30F3\u30C8\u306E\u6700\u5C0F\u30D1\u30FC\u30B5\u30FC\u3002\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3068 PDF \u57CB\u3081\u8FBC\u307F\u306B\u5FC5\u8981\u306A\u30C6\u30FC\u30D6\u30EB\u3060\u3051\u3092\u8AAD\u3080\u3002\n */\n\n/**\n * @typedef {object} ParsedFont\n * @property {Uint8Array} data\n * @property {Map<string, {offset: number, length: number}>} tables\n * @property {number} unitsPerEm\n * @property {number} indexToLocFormat\n * @property {[number, number, number, number]} bbox xMin yMin xMax yMax (font units)\n * @property {number} ascender hhea\n * @property {number} descender hhea\uFF08\u8CA0\u5024\uFF09\n * @property {number} lineGap\n * @property {number} numGlyphs\n * @property {Uint16Array} advances \u30B0\u30EA\u30D5\u3054\u3068\u306E advance width (font units)\n * @property {Uint32Array} loca numGlyphs + 1 \u8981\u7D20\n * @property {Map<number, number>} cmap \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8 \u2192 GID\n * @property {number} capHeight OS/2 sCapHeight\uFF08\u306A\u3051\u308C\u3070 ascender * 0.7\uFF09\n * @property {number} italicAngle\n * @property {boolean} useTypoMetrics OS/2 fsSelection bit 7\n * @property {number} typoAscender\n * @property {number} typoDescender\n * @property {number} winAscent\n * @property {number} winDescent\n * @property {string} postScriptName\n * @property {boolean} bold\n * @property {boolean} italic\n * @property {boolean} variable fvar \u30C6\u30FC\u30D6\u30EB\u3092\u6301\u3064\u53EF\u5909\u30D5\u30A9\u30F3\u30C8\u304B\n */\n\n/**\n * @param {ArrayBuffer|Uint8Array} buffer\n * @returns {ParsedFont}\n */\nexport function parseFont(buffer) {\n const data = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n const tag = dv.getUint32(0);\n if (tag === 0x4f54544f /* 'OTTO' */) {\n throw new Error('CFF outlines (OpenType/CFF) are not supported. Use a TrueType (glyf) font.');\n }\n if (tag === 0x774f4646 /* 'wOFF' */ || tag === 0x774f4632 /* 'wOF2' */) {\n throw new Error('WOFF/WOFF2 are not supported. Use a raw .ttf file.');\n }\n if (tag === 0x74746366 /* 'ttcf' */) {\n throw new Error('TrueType collections (.ttc) are not supported. Extract a single face first.');\n }\n if (tag !== 0x00010000 && tag !== 0x74727565 /* 'true' */) {\n throw new Error('Not a TrueType font (bad sfnt version)');\n }\n\n const numTables = dv.getUint16(4);\n /** @type {Map<string, {offset: number, length: number}>} */\n const tables = new Map();\n for (let i = 0; i < numTables; i++) {\n const p = 12 + i * 16;\n const name = String.fromCharCode(data[p] ?? 0, data[p + 1] ?? 0, data[p + 2] ?? 0, data[p + 3] ?? 0);\n tables.set(name, { offset: dv.getUint32(p + 8), length: dv.getUint32(p + 12) });\n }\n if (tables.has('CFF ')) throw new Error('CFF outlines are not supported. Use a TrueType (glyf) font.');\n // \u53EF\u5909\u30D5\u30A9\u30F3\u30C8: glyf \u306B\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u306E\u307F\u5165\u3063\u3066\u3044\u308B\u3002\u547C\u3073\u51FA\u3057\u5074\u304C\u8B66\u544A\u3067\u304D\u308B\u3088\u3046\u30D5\u30E9\u30B0\u3092\u7ACB\u3066\u308B\u3002\n const variable = tables.has('fvar');\n for (const req of ['head', 'hhea', 'maxp', 'hmtx', 'loca', 'glyf']) {\n if (!tables.has(req)) throw new Error(`Font is missing required table: ${req}`);\n }\n\n const t = (/** @type {string} */ name) => /** @type {{offset: number, length: number}} */ (tables.get(name));\n\n // head\n const head = t('head');\n const unitsPerEm = dv.getUint16(head.offset + 18);\n const bbox = /** @type {[number, number, number, number]} */ ([\n dv.getInt16(head.offset + 36),\n dv.getInt16(head.offset + 38),\n dv.getInt16(head.offset + 40),\n dv.getInt16(head.offset + 42),\n ]);\n const macStyle = dv.getUint16(head.offset + 44);\n const indexToLocFormat = dv.getInt16(head.offset + 50);\n\n // hhea\n const hhea = t('hhea');\n const ascender = dv.getInt16(hhea.offset + 4);\n const descender = dv.getInt16(hhea.offset + 6);\n const lineGap = dv.getInt16(hhea.offset + 8);\n const numberOfHMetrics = dv.getUint16(hhea.offset + 34);\n\n // maxp\n const numGlyphs = dv.getUint16(t('maxp').offset + 4);\n\n // hmtx\n const hmtx = t('hmtx');\n const advances = new Uint16Array(numGlyphs);\n let lastAdvance = 0;\n for (let g = 0; g < numGlyphs; g++) {\n if (g < numberOfHMetrics) lastAdvance = dv.getUint16(hmtx.offset + g * 4);\n advances[g] = lastAdvance;\n }\n\n // loca\n const locaT = t('loca');\n const loca = new Uint32Array(numGlyphs + 1);\n for (let g = 0; g <= numGlyphs; g++) {\n loca[g] = indexToLocFormat === 0 ? dv.getUint16(locaT.offset + g * 2) * 2 : dv.getUint32(locaT.offset + g * 4);\n }\n\n // cmap\uFF08\u30B5\u30D6\u30BB\u30C3\u30C8\u51FA\u529B\u306B\u306F\u542B\u307E\u308C\u306A\u3044\u305F\u3081\u7701\u7565\u53EF\u3002\u7121\u3051\u308C\u3070\u7A7A\uFF09\n const cmapT = tables.get('cmap');\n const cmap = cmapT ? parseCmap(dv, cmapT.offset) : new Map();\n\n // OS/2 (optional)\n let capHeight = Math.round(ascender * 0.7);\n let useTypoMetrics = false;\n let typoAscender = ascender;\n let typoDescender = descender;\n let winAscent = ascender;\n let winDescent = -descender;\n let bold = (macStyle & 1) !== 0;\n let italic = (macStyle & 2) !== 0;\n const os2 = tables.get('OS/2');\n if (os2) {\n const version = dv.getUint16(os2.offset);\n const fsSelection = dv.getUint16(os2.offset + 62);\n useTypoMetrics = (fsSelection & (1 << 7)) !== 0;\n bold = bold || (fsSelection & (1 << 5)) !== 0;\n italic = italic || (fsSelection & 1) !== 0;\n typoAscender = dv.getInt16(os2.offset + 68);\n typoDescender = dv.getInt16(os2.offset + 70);\n winAscent = dv.getUint16(os2.offset + 74);\n winDescent = dv.getUint16(os2.offset + 76);\n if (version >= 2 && os2.length >= 90) {\n const ch = dv.getInt16(os2.offset + 88);\n if (ch > 0) capHeight = ch;\n }\n }\n\n // post (optional) \u2014 italicAngle\n let italicAngle = 0;\n const post = tables.get('post');\n if (post) italicAngle = dv.getInt32(post.offset + 4) / 65536;\n\n const postScriptName = parsePostScriptName(dv, data, tables.get('name')) ?? 'Embedded';\n\n return {\n data,\n tables,\n unitsPerEm,\n indexToLocFormat,\n bbox,\n ascender,\n descender,\n lineGap,\n numGlyphs,\n advances,\n loca,\n cmap,\n capHeight,\n italicAngle,\n useTypoMetrics,\n typoAscender,\n typoDescender,\n winAscent,\n winDescent,\n postScriptName,\n bold,\n italic,\n variable,\n };\n}\n\n/**\n * cmap \u30C6\u30FC\u30D6\u30EB\u304B\u3089 Unicode \u30B5\u30D6\u30C6\u30FC\u30D6\u30EB\uFF08format 12 \u512A\u5148\u3001\u306A\u3051\u308C\u3070 4\uFF09\u3092\u8AAD\u3080\u3002\n * @param {DataView} dv\n * @param {number} base\n * @returns {Map<number, number>}\n */\nfunction parseCmap(dv, base) {\n const n = dv.getUint16(base + 2);\n let best = -1;\n let bestScore = -1;\n for (let i = 0; i < n; i++) {\n const p = base + 4 + i * 8;\n const platform = dv.getUint16(p);\n const encoding = dv.getUint16(p + 2);\n const offset = dv.getUint32(p + 4);\n const format = dv.getUint16(base + offset);\n let score = -1;\n if (platform === 3 && encoding === 10 && format === 12) score = 4;\n else if (platform === 0 && (encoding === 4 || encoding === 6) && format === 12) score = 3;\n else if (platform === 3 && encoding === 1 && format === 4) score = 2;\n else if (platform === 0 && format === 4) score = 1;\n if (score > bestScore) {\n bestScore = score;\n best = base + offset;\n }\n }\n if (best < 0) throw new Error('Font has no usable Unicode cmap subtable (format 4 or 12)');\n\n /** @type {Map<number, number>} */\n const map = new Map();\n const format = dv.getUint16(best);\n if (format === 4) {\n const segCountX2 = dv.getUint16(best + 6);\n const segCount = segCountX2 / 2;\n const endP = best + 14;\n const startP = endP + segCountX2 + 2;\n const deltaP = startP + segCountX2;\n const rangeP = deltaP + segCountX2;\n for (let s = 0; s < segCount; s++) {\n const end = dv.getUint16(endP + s * 2);\n const start = dv.getUint16(startP + s * 2);\n const delta = dv.getInt16(deltaP + s * 2);\n const rangeOffset = dv.getUint16(rangeP + s * 2);\n if (start === 0xffff) continue;\n for (let c = start; c <= end; c++) {\n let gid;\n if (rangeOffset === 0) {\n gid = (c + delta) & 0xffff;\n } else {\n const gp = rangeP + s * 2 + rangeOffset + (c - start) * 2;\n if (gp + 2 > dv.byteLength) continue;\n gid = dv.getUint16(gp);\n if (gid !== 0) gid = (gid + delta) & 0xffff;\n }\n if (gid !== 0) map.set(c, gid);\n }\n }\n } else if (format === 12) {\n const nGroups = dv.getUint32(best + 12);\n let p = best + 16;\n for (let i = 0; i < nGroups; i++, p += 12) {\n const start = dv.getUint32(p);\n const end = dv.getUint32(p + 4);\n const startGid = dv.getUint32(p + 8);\n for (let c = start; c <= end && c - start < 0x10000; c++) {\n const gid = startGid + (c - start);\n if (gid !== 0) map.set(c, gid);\n }\n }\n }\n return map;\n}\n\n/**\n * name \u30C6\u30FC\u30D6\u30EB\u304B\u3089 PostScript \u540D (nameID 6) \u3092\u53D6\u308A\u51FA\u3059\u3002\n * @param {DataView} dv\n * @param {Uint8Array} data\n * @param {{offset: number, length: number}|undefined} nameT\n * @returns {string|null}\n */\nfunction parsePostScriptName(dv, data, nameT) {\n if (!nameT) return null;\n const count = dv.getUint16(nameT.offset + 2);\n const stringOffset = dv.getUint16(nameT.offset + 4);\n let fallback = null;\n for (let i = 0; i < count; i++) {\n const p = nameT.offset + 6 + i * 12;\n const platform = dv.getUint16(p);\n const nameId = dv.getUint16(p + 6);\n const length = dv.getUint16(p + 8);\n const offset = dv.getUint16(p + 10);\n if (nameId !== 6) continue;\n const start = nameT.offset + stringOffset + offset;\n if (platform === 1) {\n // Macintosh Roman: ASCII \u3068\u307F\u306A\u3059\n return sanitizePsName(String.fromCharCode(...data.subarray(start, start + length)));\n }\n if (platform === 3 || platform === 0) {\n let s = '';\n for (let j = 0; j + 1 < length; j += 2) s += String.fromCharCode(dv.getUint16(start + j));\n fallback = sanitizePsName(s);\n }\n }\n return fallback;\n}\n\n/** @param {string} s */\nfunction sanitizePsName(s) {\n return s.replace(/[^\\x21-\\x7e]/g, '').replace(/[\\[\\]\\(\\)\\{\\}<>\\/%#]/g, '') || 'Embedded';\n}\n\n/**\n * \u30B0\u30EA\u30D5\u306E\u751F\u30D0\u30A4\u30C8\u5217\u3092\u8FD4\u3059\uFF08\u7A7A\u30B0\u30EA\u30D5\u306F\u9577\u3055 0\uFF09\u3002\n * @param {ParsedFont} font\n * @param {number} gid\n * @returns {Uint8Array}\n */\nexport function glyphData(font, gid) {\n const glyf = /** @type {{offset: number, length: number}} */ (font.tables.get('glyf'));\n const start = font.loca[gid] ?? 0;\n const end = font.loca[gid + 1] ?? start;\n return font.data.subarray(glyf.offset + start, glyf.offset + end);\n}\n\n/**\n * \u8907\u5408\u30B0\u30EA\u30D5\u304C\u53C2\u7167\u3059\u308B\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8 GID \u3092\u8FD4\u3059\uFF08\u5358\u7D14\u30B0\u30EA\u30D5\u306A\u3089\u7A7A\uFF09\u3002\n * @param {Uint8Array} g\n * @returns {number[]}\n */\nexport function componentGids(g) {\n if (g.length < 10) return [];\n const dv = new DataView(g.buffer, g.byteOffset, g.byteLength);\n const numberOfContours = dv.getInt16(0);\n if (numberOfContours >= 0) return [];\n /** @type {number[]} */\n const out = [];\n let p = 10;\n for (;;) {\n const flags = dv.getUint16(p);\n const glyphIndex = dv.getUint16(p + 2);\n out.push(glyphIndex);\n p += 4;\n p += flags & 0x0001 /* ARG_1_AND_2_ARE_WORDS */ ? 4 : 2;\n if (flags & 0x0008 /* WE_HAVE_A_SCALE */) p += 2;\n else if (flags & 0x0040 /* WE_HAVE_AN_X_AND_Y_SCALE */) p += 4;\n else if (flags & 0x0080 /* WE_HAVE_A_TWO_BY_TWO */) p += 8;\n if (!(flags & 0x0020 /* MORE_COMPONENTS */)) break;\n if (p >= g.length) break;\n }\n return out;\n}\n\n/**\n * \u30D6\u30E9\u30A6\u30B6\u304C\u884C\u30DC\u30C3\u30AF\u30B9\u8A08\u7B97\u306B\u4F7F\u3046\u30A2\u30BB\u30F3\u30C8\uFF0F\u30C7\u30A3\u30BB\u30F3\u30C8\u306B\u8FD1\u3044\u5024\uFF08font units\uFF09\u3092\u8FD4\u3059\u3002\n * Chrome/Firefox \u306F OS/2 USE_TYPO_METRICS \u304C\u7ACB\u3063\u3066\u3044\u308C\u3070 typo\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070 hhea \u3092\u4F7F\u3046\u3002\n * @param {ParsedFont} font\n * @returns {{ascent: number, descent: number}} descent \u306F\u6B63\u5024\n */\nexport function browserMetrics(font) {\n if (font.useTypoMetrics) return { ascent: font.typoAscender, descent: -font.typoDescender };\n return { ascent: font.ascender, descent: -font.descender };\n}\n", "// @ts-check\n/**\n * \u767B\u9332\u30D5\u30A9\u30F3\u30C8\u306E\u7BA1\u7406\u3068 CSS font-family / font-weight / font-style \u304B\u3089\u306E\u30D5\u30A9\u30F3\u30C8\u9078\u629E\u3002\n */\nimport { parseFont } from './parse.js';\n\n/**\n * @typedef {object} RegisteredFont\n * @property {string} family \u6B63\u898F\u5316\u6E08\u307F\uFF08\u5C0F\u6587\u5B57\u30FB\u5F15\u7528\u7B26\u306A\u3057\uFF09\n * @property {string} displayFamily\n * @property {number} weight\n * @property {'normal'|'italic'} style\n * @property {import('./parse.js').ParsedFont} parsed\n */\n\nexport class FontRegistry {\n constructor() {\n /** @type {RegisteredFont[]} */\n this.fonts = [];\n }\n\n /**\n * @param {import('../index.js').FontSource} source\n * @returns {Promise<RegisteredFont>}\n */\n async register(source) {\n const bytes = await loadBytes(source.src);\n const parsed = parseFont(bytes);\n const entry = {\n family: normalizeFamily(source.family),\n displayFamily: source.family,\n weight: source.weight ?? 400,\n style: source.style ?? 'normal',\n parsed,\n };\n const idx = this.fonts.findIndex(\n (f) => f.family === entry.family && f.weight === entry.weight && f.style === entry.style,\n );\n if (idx >= 0) this.fonts[idx] = entry;\n else this.fonts.push(entry);\n return entry;\n }\n\n /** @param {string} family */\n hasFamily(family) {\n const n = normalizeFamily(family);\n return this.fonts.some((f) => f.family === n);\n }\n\n /**\n * CSS \u306E\u6307\u5B9A\u306B\u6700\u3082\u8FD1\u3044\u767B\u9332\u30D5\u30A9\u30F3\u30C8\u3092\u8FD4\u3059\u3002\n * @param {string[]} families font-family \u30EA\u30B9\u30C8\uFF08\u512A\u5148\u9806\uFF09\n * @param {number} weight\n * @param {'normal'|'italic'} style\n * @param {number} [codePoint] \u6307\u5B9A\u3059\u308B\u3068\u3053\u306E\u6587\u5B57\u306E\u30B0\u30EA\u30D5\u3092\u6301\u3064\u30D5\u30A9\u30F3\u30C8\u306B\u9650\u5B9A\u3059\u308B\n * @returns {RegisteredFont|null}\n */\n match(families, weight, style, codePoint) {\n for (const fam of families) {\n const n = normalizeFamily(fam);\n let candidates = this.fonts.filter((f) => f.family === n);\n if (codePoint !== undefined) candidates = candidates.filter((f) => f.parsed.cmap.has(codePoint));\n if (!candidates.length) continue;\n return pickFace(candidates, weight, style);\n }\n return null;\n }\n\n /**\n * \u767B\u9332\u6E08\u307F\u306E\u5168\u30D5\u30A1\u30DF\u30EA\u30FC\u306E\u4E2D\u304B\u3089\u3001\u6307\u5B9A\u6587\u5B57\u306E\u30B0\u30EA\u30D5\u3092\u6301\u3064\u3082\u306E\u3092\u63A2\u3059\uFF08\u6700\u7D42\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\uFF09\u3002\n * @param {number} codePoint\n * @param {number} weight\n * @param {'normal'|'italic'} style\n * @returns {RegisteredFont|null}\n */\n anyWithGlyph(codePoint, weight, style) {\n const candidates = this.fonts.filter((f) => f.parsed.cmap.has(codePoint));\n return candidates.length ? pickFace(candidates, weight, style) : null;\n }\n}\n\n/**\n * CSS Fonts Level 4 \u306E\u30D5\u30A9\u30F3\u30C8\u30DE\u30C3\u30C1\u30F3\u30B0\u3092\u7C21\u7565\u5316\u3057\u305F\u3082\u306E\u3002\n * 1. style \u304C\u4E00\u81F4\u3059\u308B\u3082\u306E\u3092\u512A\u5148\uFF08\u306A\u3051\u308C\u3070\u7121\u8996\uFF09\n * 2. weight: 400 \u306F 500 \u3092\u5148\u306B\u898B\u308B\u3002400\u301C500 \u306F\u4E0A\u2192\u4E0B\u3001<400 \u306F\u4E0B\u2192\u4E0A\u3001>500 \u306F\u4E0A\u2192\u4E0B\u3002\n * @param {RegisteredFont[]} candidates\n * @param {number} weight\n * @param {'normal'|'italic'} style\n * @returns {RegisteredFont}\n */\nfunction pickFace(candidates, weight, style) {\n const styled = candidates.filter((f) => f.style === style);\n const pool = styled.length ? styled : candidates;\n const exact = pool.find((f) => f.weight === weight);\n if (exact) return exact;\n\n const sorted = [...pool].sort((a, b) => a.weight - b.weight);\n const heavier = sorted.filter((f) => f.weight > weight);\n const lighter = sorted.filter((f) => f.weight < weight).reverse();\n\n if (weight >= 400 && weight <= 500) {\n const mid = heavier.find((f) => f.weight <= 500);\n if (mid) return mid;\n if (lighter.length) return /** @type {RegisteredFont} */ (lighter[0]);\n return /** @type {RegisteredFont} */ (heavier[0]);\n }\n if (weight < 400) {\n return /** @type {RegisteredFont} */ (lighter[0] ?? heavier[0]);\n }\n return /** @type {RegisteredFont} */ (heavier[0] ?? lighter[0]);\n}\n\n/**\n * @param {string} family\n * @returns {string}\n */\nexport function normalizeFamily(family) {\n return family.trim().replace(/^[\"']|[\"']$/g, '').trim().toLowerCase();\n}\n\n/**\n * getComputedStyle().fontFamily\uFF08'\"BIZ UDPGothic\", sans-serif'\uFF09\u3092\u30EA\u30B9\u30C8\u306B\u5206\u5272\u3059\u308B\u3002\n * @param {string} value\n * @returns {string[]}\n */\nexport function splitFamilies(value) {\n /** @type {string[]} */\n const out = [];\n let cur = '';\n let quote = '';\n for (const ch of value) {\n if (quote) {\n if (ch === quote) quote = '';\n else cur += ch;\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n } else if (ch === ',') {\n if (cur.trim()) out.push(cur.trim());\n cur = '';\n } else cur += ch;\n }\n if (cur.trim()) out.push(cur.trim());\n return out;\n}\n\n/**\n * getComputedStyle().fontWeight\uFF08'400' / '700' / 'bold'\uFF09\u3092\u6570\u5024\u306B\u3059\u308B\u3002\n * @param {string} value\n * @returns {number}\n */\nexport function parseWeight(value) {\n if (value === 'bold') return 700;\n if (value === 'normal') return 400;\n const n = parseInt(value, 10);\n return Number.isFinite(n) ? n : 400;\n}\n\n/**\n * @param {string|ArrayBuffer|Uint8Array} src\n * @returns {Promise<Uint8Array>}\n */\nasync function loadBytes(src) {\n if (src instanceof Uint8Array) return src;\n if (src instanceof ArrayBuffer) return new Uint8Array(src);\n const res = await fetch(src);\n if (!res.ok) throw new Error(`Failed to fetch font ${src}: ${res.status} ${res.statusText}`);\n return new Uint8Array(await res.arrayBuffer());\n}\n", "// @ts-check\n/**\n * \u975E\u8868\u793A iframe \u306B HTML \u3092\u63CF\u753B\u3057\u3001\u30EC\u30A4\u30A2\u30A6\u30C8\u8A08\u6E2C\u53EF\u80FD\u306A Document \u3092\u7528\u610F\u3059\u308B\u3002\n */\n\n/**\n * @typedef {object} RenderedDocument\n * @property {HTMLIFrameElement} iframe\n * @property {Document} doc\n * @property {Window} win\n * @property {HTMLElement} root \u8D70\u67FB\u306E\u8D77\u70B9\uFF08body\uFF09\n * @property {() => void} destroy\n */\n\n/**\n * @param {import('./index.js').ConvertInput} input\n * @param {{widthPx: number, stylesheets: 'inherit'|'none'|string[], mediaPrint: boolean, baseUrl?: string, warn?: (w: import('./index.js').ConversionWarning) => void}} opts\n * @returns {Promise<RenderedDocument>}\n */\nexport async function renderDocument(input, opts) {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.cssText = `position:fixed;left:-100000px;top:0;width:${opts.widthPx}px;height:1000px;border:0;visibility:hidden;pointer-events:none;`;\n document.body.appendChild(iframe);\n\n const win = iframe.contentWindow;\n const doc = iframe.contentDocument;\n if (!win || !doc) throw new Error('Failed to create rendering iframe');\n\n const html = buildHtml(input, opts);\n doc.open();\n doc.write(html);\n doc.close();\n\n // \u9AD8\u3055\u3092\u5185\u5BB9\u306B\u5408\u308F\u305B\u308B\uFF08\u30B9\u30AF\u30ED\u30FC\u30EB\u304C\u767A\u751F\u3057\u306A\u3044\u3088\u3046\u306B\u3059\u308B\uFF09\n const fit = () => {\n iframe.style.height = `${Math.max(doc.documentElement.scrollHeight, doc.body.scrollHeight, 100)}px`;\n };\n fit();\n\n await waitForStylesheets(doc);\n fit();\n await waitForFonts(doc);\n await waitForImages(doc);\n materializePseudoElements(doc, opts.warn ?? (() => {}));\n fit();\n // \u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u78BA\u5B9A\u3055\u305B\u308B\n void doc.body.offsetHeight;\n\n return {\n iframe,\n doc,\n win,\n root: doc.body,\n destroy: () => iframe.remove(),\n };\n}\n\n/**\n * @param {import('./index.js').ConvertInput} input\n * @param {{stylesheets: 'inherit'|'none'|string[], mediaPrint: boolean, baseUrl?: string}} opts\n * @returns {string}\n */\nfunction buildHtml(input, opts) {\n const baseUrl = opts.baseUrl ?? document.baseURI;\n const base = `<base href=\"${escapeAttr(baseUrl)}\">`;\n const reset = `<style data-rhtp-reset>html,body{margin:0;padding:0;background:transparent}html{-webkit-text-size-adjust:100%}</style>`;\n\n if (typeof input === 'string') {\n // \u5B8C\u5168\u306A HTML \u6587\u66F8\u306A\u3089\u305D\u306E\u307E\u307E\u3002<head> \u306E\u76F4\u5F8C\u306B base \u3068\u30EA\u30BB\u30C3\u30C8\u3092\u5DEE\u3057\u8FBC\u3080\u3002\n if (/<html[\\s>]/i.test(input)) {\n let html = input;\n html = /<head[^>]*>/i.test(html)\n ? html.replace(/<head[^>]*>/i, (m) => `${m}${base}${reset}`)\n : html.replace(/<html[^>]*>/i, (m) => `${m}<head>${base}${reset}</head>`);\n return opts.mediaPrint ? expandPrintMedia(html) : html;\n }\n const styles = collectStyles(opts.stylesheets, opts.mediaPrint);\n return `<!DOCTYPE html><html><head><meta charset=\"utf-8\">${base}${reset}${styles}</head><body>${input}</body></html>`;\n }\n\n // \u8981\u7D20: outerHTML \u3068\u89AA\u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u6301\u3061\u8FBC\u3080\u3002\n // <html> / <body> \u306E\u5C5E\u6027\uFF08class, lang, data-* \u2026\uFF09\u3082\u5199\u3057\u3001`body.reissue .x` \u306E\u3088\u3046\u306A\u7956\u5148\u4F9D\u5B58\u306E\u30BB\u30EC\u30AF\u30BF\u3092\u52B9\u304B\u305B\u308B\u3002\n const styles = collectStyles(opts.stylesheets, opts.mediaPrint);\n const htmlAttrs = copyAttrs(document.documentElement);\n const bodyAttrs = copyAttrs(document.body);\n const body = input === document.body || input === document.documentElement ? document.body.innerHTML : input.outerHTML;\n return `<!DOCTYPE html><html${htmlAttrs}><head><meta charset=\"utf-8\">${base}${reset}${styles}</head><body${bodyAttrs}>${body}</body></html>`;\n}\n\n/**\n * @param {'inherit'|'none'|string[]} stylesheets\n * @param {boolean} mediaPrint\n * @returns {string}\n */\nfunction collectStyles(stylesheets, mediaPrint) {\n if (stylesheets === 'none') return '';\n /** @type {string[]} */\n const parts = [];\n if (stylesheets === 'inherit') {\n for (const el of document.querySelectorAll('style, link[rel~=\"stylesheet\"]')) {\n if (el.hasAttribute('data-rhtp-reset')) continue;\n if (el instanceof HTMLStyleElement) {\n const css = el.textContent ?? '';\n parts.push(`<style>${mediaPrint ? expandPrintMediaCss(css) : css}</style>`);\n } else if (el instanceof HTMLLinkElement) {\n parts.push(`<link rel=\"stylesheet\" href=\"${escapeAttr(el.href)}\"${el.media ? ` media=\"${escapeAttr(el.media)}\"` : ''}>`);\n }\n }\n return parts.join('');\n }\n for (const s of stylesheets) {\n if (/^(https?:)?\\/\\/|^\\.{0,2}\\/|\\.css(\\?|$)/i.test(s) && !s.includes('{')) {\n parts.push(`<link rel=\"stylesheet\" href=\"${escapeAttr(s)}\">`);\n } else {\n parts.push(`<style>${mediaPrint ? expandPrintMediaCss(s) : s}</style>`);\n }\n }\n return parts.join('');\n}\n\n/**\n * HTML \u6587\u5B57\u5217\u4E2D\u306E <style> \u5185\u306E @media print \u3092\u5C55\u958B\u3059\u308B\u3002\n * @param {string} html\n */\nfunction expandPrintMedia(html) {\n return html.replace(/<style([^>]*)>([\\s\\S]*?)<\\/style>/gi, (_m, attrs, css) => `<style${attrs}>${expandPrintMediaCss(css)}</style>`);\n}\n\n/**\n * `@media print { ... }` \u30D6\u30ED\u30C3\u30AF\u3092\u901A\u5E38\u30EB\u30FC\u30EB\u3068\u3057\u3066\u5C55\u958B\u3057\u3001`@media screen { ... }` \u3092\u9664\u53BB\u3059\u308B\u3002\n * \u5358\u7D14\u306A\u62EC\u5F27\u306E\u5BFE\u5FDC\u3067\u51E6\u7406\u3059\u308B\uFF08\u30CD\u30B9\u30C8\u3057\u305F @media \u306F\u60F3\u5B9A\u3057\u306A\u3044\uFF09\u3002\n * @param {string} css\n * @returns {string}\n */\nexport function expandPrintMediaCss(css) {\n let out = '';\n let i = 0;\n while (i < css.length) {\n const m = /@media\\s*([^{]+)\\{/g;\n m.lastIndex = i;\n const hit = m.exec(css);\n if (!hit) {\n out += css.slice(i);\n break;\n }\n out += css.slice(i, hit.index);\n // \u30D6\u30ED\u30C3\u30AF\u306E\u7D42\u308F\u308A\u3092\u63A2\u3059\n let depth = 1;\n let j = m.lastIndex;\n while (j < css.length && depth > 0) {\n if (css[j] === '{') depth++;\n else if (css[j] === '}') depth--;\n j++;\n }\n const query = /** @type {string} */ (hit[1]).trim();\n const body = css.slice(m.lastIndex, j - 1);\n if (/\\bprint\\b/.test(query)) out += body;\n else if (/^\\s*(only\\s+)?screen\\b/.test(query) && !/\\band\\b/.test(query)) out += '';\n else out += css.slice(hit.index, j);\n i = j;\n }\n return out;\n}\n\n/**\n * \u8981\u7D20\u306E\u5C5E\u6027\u3092 ` name=\"value\"` \u306E\u4E26\u3073\u306B\u3059\u308B\uFF08\u30A4\u30D9\u30F3\u30C8\u30CF\u30F3\u30C9\u30E9\u5C5E\u6027\u306F\u9664\u304F\uFF09\u3002\n * @param {Element} el\n */\nfunction copyAttrs(el) {\n let out = '';\n for (const a of el.attributes) {\n if (/^on/i.test(a.name)) continue;\n out += ` ${a.name}=\"${escapeAttr(a.value)}\"`;\n }\n return out;\n}\n\n/** @param {string} s */\nfunction escapeAttr(s) {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\n/** @param {Document} doc */\nasync function waitForStylesheets(doc) {\n const links = [...doc.querySelectorAll('link[rel~=\"stylesheet\"]')];\n await Promise.all(\n links.map(\n (l) =>\n new Promise((resolve) => {\n const link = /** @type {HTMLLinkElement} */ (l);\n if (link.sheet) return resolve(undefined);\n link.addEventListener('load', () => resolve(undefined), { once: true });\n link.addEventListener('error', () => resolve(undefined), { once: true });\n setTimeout(() => resolve(undefined), 10000);\n }),\n ),\n );\n}\n\n/** @param {Document} doc */\nasync function waitForFonts(doc) {\n // \u4F7F\u7528\u4E2D\u306E\u30D5\u30A9\u30F3\u30C8\u8AAD\u307F\u8FBC\u307F\u3092\u8D77\u52D5\u3055\u305B\u308B\u305F\u3081\u306B\u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u5F37\u5236\n void doc.body.offsetHeight;\n if (doc.fonts) {\n await doc.fonts.ready;\n // ready \u5F8C\u306B\u65B0\u305F\u306B\u8AAD\u307F\u8FBC\u307F\u304C\u59CB\u307E\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u3001loading \u72B6\u614B\u306E\u3082\u306E\u3092\u5F85\u3064\n const loading = [...doc.fonts].filter((f) => f.status === 'loading').map((f) => f.loaded.catch(() => undefined));\n if (loading.length) await Promise.all(loading);\n await doc.fonts.ready;\n }\n}\n\n/** @param {Document} doc */\nasync function waitForImages(doc) {\n const imgs = [...doc.images];\n await Promise.all(\n imgs.map((img) =>\n img.complete\n ? img.decode().catch(() => undefined)\n : new Promise((resolve) => {\n img.addEventListener('load', () => img.decode().catch(() => undefined).then(resolve), { once: true });\n img.addEventListener('error', () => resolve(undefined), { once: true });\n setTimeout(() => resolve(undefined), 10000);\n }),\n ),\n );\n}\n\n/**\n * ::before / ::after \u3092\u5B9F\u4F53\u306E <span> \u306B\u7F6E\u304D\u63DB\u3048\u308B\u3002\n * \u64EC\u4F3C\u8981\u7D20\u306F DOM \u30CE\u30FC\u30C9\u3092\u6301\u305F\u305A Range \u3067\u8A08\u6E2C\u3067\u304D\u306A\u3044\u305F\u3081\u3001computed style \u3092\u3059\u3079\u3066\u5199\u3057\u305F span \u3092\n * \u540C\u3058\u4F4D\u7F6E\u306B\u633F\u5165\u3057\u3001\u5143\u306E\u64EC\u4F3C\u8981\u7D20\u306F content: none \u3067\u6D88\u3059\u3002\u6587\u5B57\u5217 content \u306E\u307F\u5BFE\u5FDC\uFF08counter / url \u306F\u8B66\u544A\uFF09\u3002\n * @param {Document} doc\n * @param {(w: import('./index.js').ConversionWarning) => void} warn\n */\nexport function materializePseudoElements(doc, warn) {\n const win = doc.defaultView;\n if (!win) return;\n /** @type {{el: Element, pseudo: 'before'|'after', text: string, styles: [string, string][]}[]} */\n const jobs = [];\n for (const el of doc.body.querySelectorAll('*')) {\n for (const pseudo of /** @type {('before'|'after')[]} */ (['before', 'after'])) {\n const ps = win.getComputedStyle(el, `::${pseudo}`);\n const content = ps.content;\n if (!content || content === 'none' || content === 'normal' || ps.display === 'none') continue;\n const text = parseContentString(content);\n if (text === null) {\n warn({\n code: 'unsupported-css',\n message: `::${pseudo} content \"${content}\" is not supported (only quoted strings are); the pseudo-element is skipped`,\n element: el,\n property: 'content',\n });\n continue;\n }\n /** @type {[string, string][]} */\n const styles = [];\n for (let i = 0; i < ps.length; i++) {\n const prop = /** @type {string} */ (ps[i]);\n if (prop === 'content' || prop.startsWith('-webkit-') || prop.startsWith('-moz-')) continue;\n styles.push([prop, ps.getPropertyValue(prop)]);\n }\n jobs.push({ el, pseudo, text, styles });\n }\n }\n if (!jobs.length) return;\n\n const style = doc.createElement('style');\n style.setAttribute('data-rhtp-pseudo', '');\n style.textContent =\n '[data-rhtp-pseudo-host~=\"before\"]::before{content:none!important;display:none!important}' +\n '[data-rhtp-pseudo-host~=\"after\"]::after{content:none!important;display:none!important}';\n doc.head.appendChild(style);\n\n for (const job of jobs) {\n const span = doc.createElement('span');\n span.setAttribute('data-rhtp-pseudo', job.pseudo);\n for (const [prop, value] of job.styles) span.style.setProperty(prop, value);\n span.textContent = job.text;\n const hosts = (job.el.getAttribute('data-rhtp-pseudo-host') ?? '').split(' ').filter(Boolean);\n hosts.push(job.pseudo);\n job.el.setAttribute('data-rhtp-pseudo-host', hosts.join(' '));\n if (job.pseudo === 'before') job.el.insertBefore(span, job.el.firstChild);\n else job.el.appendChild(span);\n }\n}\n\n/**\n * computed content \u5024\uFF08'\"\u203B \"' / '\"a\" \"b\"' / 'counter(x)' \u2026\uFF09\u304B\u3089\u6587\u5B57\u5217\u3092\u53D6\u308A\u51FA\u3059\u3002\n * \u6587\u5B57\u5217\u4EE5\u5916\u306E\u30C8\u30FC\u30AF\u30F3\u304C\u542B\u307E\u308C\u308B\u5834\u5408\u306F null\u3002\n * @param {string} value\n * @returns {string|null}\n */\nexport function parseContentString(value) {\n let out = '';\n let i = 0;\n const v = value.trim();\n while (i < v.length) {\n const ch = v[i];\n if (ch === ' ' || ch === '\\t') {\n i++;\n continue;\n }\n if (ch !== '\"' && ch !== \"'\") return null;\n const quote = ch;\n i++;\n while (i < v.length && v[i] !== quote) {\n if (v[i] === '\\\\') {\n i++;\n const hex = /^[0-9a-fA-F]{1,6}/.exec(v.slice(i));\n if (hex) {\n out += String.fromCodePoint(parseInt(hex[0], 16));\n i += hex[0].length;\n if (v[i] === ' ') i++;\n } else {\n out += v[i] ?? '';\n i++;\n }\n } else {\n out += v[i];\n i++;\n }\n }\n i++; // closing quote\n }\n return out;\n}\n", "// @ts-check\n/**\n * \u5358\u4F4D\u30FB\u8272\u306E\u5909\u63DB\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\u3002\n * \u5185\u90E8\u5EA7\u6A19\u306F CSS px\uFF08\u30D6\u30E9\u30A6\u30B6\u8A08\u6E2C\u5024\uFF09\u3067\u6301\u3061\u3001PDF \u51FA\u529B\u6642\u306B pt \u3078\u5909\u63DB\u3059\u308B\u3002\n */\n\n/** 1 CSS px = 0.75 pt\uFF0896dpi \u57FA\u6E96\uFF09 */\nexport const PX_TO_PT = 0.75;\n/** 1 mm = 72 / 25.4 pt */\nexport const MM_TO_PT = 72 / 25.4;\n\n/** @type {Record<string, {width: number, height: number}>} \u7528\u7D19\u30B5\u30A4\u30BA\uFF08pt\uFF09 */\nexport const PAGE_SIZES = {\n A3: { width: 297 * MM_TO_PT, height: 420 * MM_TO_PT },\n A4: { width: 210 * MM_TO_PT, height: 297 * MM_TO_PT },\n A5: { width: 148 * MM_TO_PT, height: 210 * MM_TO_PT },\n B4: { width: 257 * MM_TO_PT, height: 364 * MM_TO_PT },\n B5: { width: 182 * MM_TO_PT, height: 257 * MM_TO_PT },\n Letter: { width: 612, height: 792 },\n Legal: { width: 612, height: 1008 },\n};\n\n/**\n * CSS \u9577\u3055\u6587\u5B57\u5217\uFF08'15mm', '1in', '12pt', '100px', '2cm'\uFF09\u3092 pt \u306B\u5909\u63DB\u3059\u308B\u3002\n * \u5358\u4F4D\u306A\u3057\u306E\u6570\u5024\u306F px \u3068\u307F\u306A\u3059\u3002\n * @param {string|number} value\n * @returns {number}\n */\nexport function lengthToPt(value) {\n if (typeof value === 'number') return value * PX_TO_PT;\n const m = /^\\s*(-?[\\d.]+)\\s*([a-z%]*)\\s*$/i.exec(value);\n if (!m) throw new Error(`Invalid CSS length: ${value}`);\n const n = parseFloat(/** @type {string} */ (m[1]));\n switch ((m[2] ?? '').toLowerCase()) {\n case '':\n case 'px':\n return n * PX_TO_PT;\n case 'pt':\n return n;\n case 'mm':\n return n * MM_TO_PT;\n case 'cm':\n return n * MM_TO_PT * 10;\n case 'in':\n return n * 72;\n case 'pc':\n return n * 12;\n default:\n throw new Error(`Unsupported CSS unit: ${value}`);\n }\n}\n\n/** @param {number} pt @returns {number} */\nexport function ptToPx(pt) {\n return pt / PX_TO_PT;\n}\n\n/**\n * getComputedStyle \u304C\u8FD4\u3059 px \u6587\u5B57\u5217\uFF08'12px'\uFF09\u3092\u6570\u5024\u306B\u3059\u308B\u3002\n * @param {string} value\n * @returns {number}\n */\nexport function cssPx(value) {\n const n = parseFloat(value);\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * @typedef {{r: number, g: number, b: number, a: number}} Rgba \u5404\u6210\u5206 0\u301C1\n */\n\n/**\n * getComputedStyle \u306E\u8272\u6587\u5B57\u5217\uFF08'rgb(34, 34, 34)' / 'rgba(0, 0, 0, 0.5)' / 'transparent'\n * / 'color(srgb ...)'\uFF09\u3092\u30D1\u30FC\u30B9\u3059\u308B\u3002\u30D1\u30FC\u30B9\u3067\u304D\u306A\u3044\u5834\u5408\u306F null\u3002\n * @param {string} value\n * @returns {Rgba|null}\n */\nexport function parseColor(value) {\n if (!value) return null;\n const v = value.trim();\n if (v === 'transparent') return { r: 0, g: 0, b: 0, a: 0 };\n let m = /^rgba?\\(\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*(?:[,/]\\s*([\\d.]+%?)\\s*)?\\)$/i.exec(v);\n if (m) {\n const a = m[4] === undefined ? 1 : m[4].endsWith('%') ? parseFloat(m[4]) / 100 : parseFloat(m[4]);\n return {\n r: clamp01(parseFloat(/** @type {string} */ (m[1])) / 255),\n g: clamp01(parseFloat(/** @type {string} */ (m[2])) / 255),\n b: clamp01(parseFloat(/** @type {string} */ (m[3])) / 255),\n a: clamp01(a),\n };\n }\n m = /^color\\(srgb\\s+([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\s*(?:\\/\\s*([\\d.]+%?)\\s*)?\\)$/i.exec(v);\n if (m) {\n const a = m[4] === undefined ? 1 : m[4].endsWith('%') ? parseFloat(m[4]) / 100 : parseFloat(m[4]);\n return {\n r: clamp01(parseFloat(/** @type {string} */ (m[1]))),\n g: clamp01(parseFloat(/** @type {string} */ (m[2]))),\n b: clamp01(parseFloat(/** @type {string} */ (m[3]))),\n a: clamp01(a),\n };\n }\n m = /^#([0-9a-f]{3,8})$/i.exec(v);\n if (m) {\n let h = /** @type {string} */ (m[1]);\n if (h.length === 3 || h.length === 4) h = h.split('').map((c) => c + c).join('');\n const n = parseInt(h.padEnd(8, 'f'), 16);\n return { r: ((n >>> 24) & 255) / 255, g: ((n >>> 16) & 255) / 255, b: ((n >>> 8) & 255) / 255, a: (n & 255) / 255 };\n }\n return null;\n}\n\n/** @param {number} n */\nfunction clamp01(n) {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\n/**\n * PDF \u7528\u306B\u6570\u5024\u3092\u4E38\u3081\u3066\u6587\u5B57\u5217\u5316\u3059\u308B\uFF08\u5C0F\u6570\u7B2C 3 \u4F4D\u307E\u3067\u3001\u672B\u5C3E\u30BC\u30ED\u9664\u53BB\uFF09\u3002\n * @param {number} n\n * @returns {string}\n */\nexport function num(n) {\n if (!Number.isFinite(n)) return '0';\n const s = n.toFixed(3);\n const t = s.includes('.') ? s.replace(/\\.?0+$/, '') : s;\n return t === '' || t === '-0' || t === '-' ? '0' : t;\n}\n", "// @ts-check\n/**\n * \u30C6\u30AD\u30B9\u30C8\u30CE\u30FC\u30C9\u306E\u8A08\u6E2C\u3002\n * Range \u3092 1 \u6587\u5B57\u305A\u3064\u5F35\u3063\u3066\u5404\u30B0\u30EA\u30D5\u306E\u77E9\u5F62\u3092\u5B9F\u6E2C\u3057\u3001\u884C\u3054\u3068\u306B\u30B0\u30EA\u30D5\u5217\uFF08GID\u30FB\u30DA\u30F3\u4F4D\u7F6E\uFF09\u3092\u8FD4\u3059\u3002\n * \u30D6\u30E9\u30A6\u30B6\u306E\u30AB\u30FC\u30CB\u30F3\u30B0\u30FBletter-spacing\u30FB\u7981\u5247\u30FB\u4E21\u7AEF\u63C3\u3048\u306E\u7D50\u679C\u304C\u305D\u306E\u307E\u307E\u4F4D\u7F6E\u306B\u53CD\u6620\u3055\u308C\u308B\u3002\n */\n\n/**\n * @typedef {object} MeasuredLine\n * @property {import('../font/registry.js').RegisteredFont} font\n * @property {number} baseline \u30D9\u30FC\u30B9\u30E9\u30A4\u30F3 y\uFF08\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u5EA7\u6A19 px\uFF09\n * @property {number} top \u884C\u5185\u30B0\u30EA\u30D5\u77E9\u5F62\u306E\u4E0A\u7AEF\n * @property {number} bottom \u884C\u5185\u30B0\u30EA\u30D5\u77E9\u5F62\u306E\u4E0B\u7AEF\n * @property {import('./walk.js').Glyph[]} glyphs\n */\n\n/**\n * @typedef {object} MeasureOptions\n * @property {import('../font/registry.js').FontRegistry} registry\n * @property {string[]} families\n * @property {string[]} fallback\n * @property {import('../font/registry.js').RegisteredFont} primary\n * @property {number} weight\n * @property {'normal'|'italic'} fstyle\n * @property {number} size px\n * @property {'font'|'measure'|'auto'} textMeasure\n * @property {(w: import('../index.js').ConversionWarning) => void} warn\n * @property {Element} element\n */\n\nconst WHITESPACE = new Set([0x20, 0x09, 0x0a, 0x0d, 0x0c, 0xa0, 0x3000, 0x2002, 0x2003, 0x2009, 0x200a, 0x202f, 0x205f]);\n\n/**\n * @param {Text} node\n * @param {CSSStyleDeclaration} style\n * @param {MeasureOptions} o\n * @returns {MeasuredLine[]}\n */\nexport function measureText(node, style, o) {\n const doc = node.ownerDocument;\n const text = applyTextTransform(node.data, style.textTransform);\n const range = doc.createRange();\n const baselineOffset = probeBaseline(doc, style);\n\n /** @type {MeasuredLine[]} */\n const lines = [];\n /** @type {MeasuredLine|null} */\n let cur = null;\n let curTop = NaN;\n /** @type {Set<number>} */\n const warnedCps = new Set();\n\n for (let i = 0; i < text.length; ) {\n const cp = /** @type {number} */ (text.codePointAt(i));\n const len = cp > 0xffff ? 2 : 1;\n const end = i + len;\n\n range.setStart(node, i);\n range.setEnd(node, Math.min(end, node.data.length));\n const rect = pickRect(range.getClientRects());\n i = end;\n if (!rect) continue; // \u6298\u308A\u7573\u307E\u308C\u305F\u7A7A\u767D\u30FB\u6539\u884C\n\n const resolved = resolveGlyph(cp, o, warnedCps);\n if (!resolved) continue;\n const { font, gid, cpForUnicode } = resolved;\n\n const top = rect.top;\n if (!cur || cur.font !== font || Math.abs(top - curTop) > 0.5) {\n cur = { font, baseline: top + baselineOffset, top, bottom: rect.bottom, glyphs: [] };\n curTop = top;\n lines.push(cur);\n }\n cur.top = Math.min(cur.top, top);\n cur.bottom = Math.max(cur.bottom, rect.bottom);\n const advance = ((font.parsed.advances[gid] ?? 0) * o.size) / font.parsed.unitsPerEm;\n cur.glyphs.push({ gid, cp: cpForUnicode, x: rect.left, advance });\n }\n return lines;\n}\n\n/**\n * 1 \u6587\u5B57\u5206\u306E\u77E9\u5F62\u306E\u3046\u3061\u5E45\u3092\u6301\u3064\u3082\u306E\u3092\u9078\u3076\u3002\u884C\u672B\u306E\u6298\u308A\u8FD4\u3057\u4F4D\u7F6E\u3067\u306F 2 \u3064\u8FD4\u308B\u3053\u3068\u304C\u3042\u308B\u3002\n * @param {DOMRectList} rects\n * @returns {DOMRect|null}\n */\nfunction pickRect(rects) {\n /** @type {DOMRect|null} */\n let best = null;\n for (const r of rects) {\n if (r.width > 0.01 && (!best || r.width > best.width)) best = r;\n }\n return best;\n}\n\n/**\n * \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\u306B\u5BFE\u5FDC\u3059\u308B\u30D5\u30A9\u30F3\u30C8\u3068 GID \u3092\u6C7A\u3081\u308B\u3002\n * @param {number} cp\n * @param {MeasureOptions} o\n * @param {Set<number>} warnedCps\n * @returns {{font: import('../font/registry.js').RegisteredFont, gid: number, cpForUnicode: number}|null}\n */\nfunction resolveGlyph(cp, o, warnedCps) {\n const tryFont = (/** @type {import('../font/registry.js').RegisteredFont|null} */ f, /** @type {number} */ c) => {\n const gid = f?.parsed.cmap.get(c);\n return f && gid ? { font: f, gid, cpForUnicode: cp } : null;\n };\n\n // \u7A7A\u767D\u985E: \u4E3B\u30D5\u30A9\u30F3\u30C8\u306E\u540C\u3058\u6587\u5B57 \u2192 U+0020 \u3067\u4EE3\u66FF\uFF08\u4F4D\u7F6E\u306F\u5B9F\u6E2C\u5024\u3067\u88DC\u6B63\u3055\u308C\u308B\u306E\u3067\u5E45\u306F\u554F\u308F\u306A\u3044\uFF09\n if (WHITESPACE.has(cp)) {\n return tryFont(o.primary, cp) ?? tryFont(o.primary, 0x20) ?? tryFont(o.registry.anyWithGlyph(0x20, o.weight, o.fstyle), 0x20);\n }\n\n let hit = tryFont(o.primary, cp);\n if (hit) return hit;\n hit = tryFont(o.registry.match(o.families, o.weight, o.fstyle, cp), cp);\n if (hit) return hit;\n hit = tryFont(o.registry.match(o.fallback, o.weight, o.fstyle, cp), cp);\n if (hit) return hit;\n hit = tryFont(o.registry.anyWithGlyph(cp, o.weight, o.fstyle), cp);\n if (hit) return hit;\n\n if (!warnedCps.has(cp)) {\n warnedCps.add(cp);\n o.warn({\n code: 'missing-glyph',\n message: `No registered font has a glyph for U+${cp.toString(16).toUpperCase().padStart(4, '0')} \"${String.fromCodePoint(cp)}\"; substituted with U+25A1`,\n element: o.element,\n text: String.fromCodePoint(cp),\n });\n }\n // \u8C46\u8150\uFF08\u25A1\uFF09\u3067\u4EE3\u66FF\u3002ToUnicode \u306B\u306F\u5143\u306E\u6587\u5B57\u3092\u6B8B\u3059\n const sub = tryFont(o.primary, 0x25a1) ?? tryFont(o.registry.anyWithGlyph(0x25a1, o.weight, o.fstyle), 0x25a1);\n return sub ? { ...sub, cpForUnicode: cp } : null;\n}\n\n/**\n * @param {string} s\n * @param {string} transform computed text-transform\n * @returns {string}\n */\nfunction applyTextTransform(s, transform) {\n if (!transform || transform === 'none') return s;\n let out = s;\n if (transform.includes('uppercase')) out = s.toUpperCase();\n else if (transform.includes('lowercase')) out = s.toLowerCase();\n else if (transform.includes('capitalize')) out = s.replace(/(^|\\s)(\\p{L})/gu, (m, sp, ch) => sp + ch.toUpperCase());\n // \u9577\u3055\u304C\u5909\u308F\u308B\u5909\u63DB\uFF08\u00DF \u2192 SS \u306A\u3069\uFF09\u306F Range \u306E\u30AA\u30D5\u30BB\u30C3\u30C8\u3068\u5BFE\u5FDC\u304C\u53D6\u308C\u306A\u3044\u306E\u3067\u8AE6\u3081\u308B\n return out.length === s.length ? out : s;\n}\n\n/** @type {WeakMap<Document, Map<string, number>>} */\nconst probeCache = new WeakMap();\n\n/**\n * \u3053\u306E font \u6307\u5B9A\u3067\u63CF\u3044\u305F\u30C6\u30AD\u30B9\u30C8\u306E Range \u77E9\u5F62\u306E\u4E0A\u7AEF\u304B\u3089\u3001\u30D9\u30FC\u30B9\u30E9\u30A4\u30F3\u307E\u3067\u306E\u8DDD\u96E2\uFF08px\uFF09\u3092\u5B9F\u6E2C\u3059\u308B\u3002\n * inline-block\uFF08vertical-align: baseline\uFF09\u306E\u4E0B\u7AEF\u304C\u30D9\u30FC\u30B9\u30E9\u30A4\u30F3\u4F4D\u7F6E\u306B\u4E00\u81F4\u3059\u308B\u3053\u3068\u3092\u5229\u7528\u3059\u308B\u3002\n * @param {Document} doc\n * @param {CSSStyleDeclaration} style\n * @returns {number}\n */\nfunction probeBaseline(doc, style) {\n const key = [style.fontFamily, style.fontSize, style.fontWeight, style.fontStyle, style.fontStretch, style.fontVariant, style.fontFeatureSettings].join('|');\n let cache = probeCache.get(doc);\n if (!cache) {\n cache = new Map();\n probeCache.set(doc, cache);\n }\n const cached = cache.get(key);\n if (cached !== undefined) return cached;\n\n const probe = doc.createElement('div');\n probe.setAttribute('data-rhtp-probe', '');\n probe.style.cssText = 'position:absolute;left:0;top:0;visibility:hidden;white-space:pre;line-height:normal;margin:0;padding:0;border:0;letter-spacing:0;text-indent:0;';\n probe.style.fontFamily = style.fontFamily;\n probe.style.fontSize = style.fontSize;\n probe.style.fontWeight = style.fontWeight;\n probe.style.fontStyle = style.fontStyle;\n probe.style.fontStretch = style.fontStretch;\n probe.style.fontVariant = style.fontVariant;\n probe.style.fontFeatureSettings = style.fontFeatureSettings;\n const textNode = doc.createTextNode('Ag\u3042');\n probe.appendChild(textNode);\n const mark = doc.createElement('span');\n mark.style.cssText = 'display:inline-block;width:0;height:0;vertical-align:baseline;margin:0;padding:0;border:0;';\n probe.appendChild(mark);\n doc.body.appendChild(probe);\n\n const range = doc.createRange();\n range.selectNodeContents(textNode);\n const textRect = range.getBoundingClientRect();\n const markRect = mark.getBoundingClientRect();\n const offset = markRect.bottom - textRect.top;\n probe.remove();\n\n const result = Number.isFinite(offset) && offset > 0 ? offset : parseFloat(style.fontSize) * 0.8;\n cache.set(key, result);\n return result;\n}\n", "// @ts-check\n/**\n * \u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u3068\u30C7\u30B3\u30FC\u30C9\u3002\n * - JPEG \u306F\u5143\u30D0\u30A4\u30C8\u5217\u3092\u305D\u306E\u307E\u307E DCTDecode \u3067\u57CB\u3081\u8FBC\u3080\uFF08\u518D\u5727\u7E2E\u3057\u306A\u3044\uFF09\n * - \u305D\u308C\u4EE5\u5916\uFF08PNG, GIF, WebP, SVG \u2026\uFF09\u306F <canvas> \u3067\u30C7\u30B3\u30FC\u30C9\u3057\u3066 RGB + \u30A2\u30EB\u30D5\u30A1\u306B\u5206\u96E2\u3059\u308B\n * \u540C\u3058 URL \u306F 1 \u56DE\u3060\u3051\u30C7\u30B3\u30FC\u30C9\u3057\u3001PDF \u4E0A\u3067\u3082 1 \u3064\u306E XObject \u3092\u5171\u6709\u3059\u308B\u3002\n */\n\n/**\n * @typedef {object} DecodedImage\n * @property {string} key \u91CD\u8907\u6392\u9664\u30AD\u30FC\uFF08URL\uFF09\n * @property {number} width \u30D4\u30AF\u30BB\u30EB\n * @property {number} height\n * @property {Uint8Array|null} jpeg JPEG \u306E\u751F\u30D0\u30A4\u30C8\u5217\uFF08DCTDecode\uFF09\n * @property {Uint8Array|null} rgb \u5E45\u00D7\u9AD8\u3055\u00D73\n * @property {Uint8Array|null} alpha \u5E45\u00D7\u9AD8\u3055\uFF08\u5B8C\u5168\u4E0D\u900F\u660E\u306A\u3089 null\uFF09\n */\n\n/** @type {Map<string, Promise<DecodedImage|null>>} */\nconst cache = new Map();\n\n/**\n * @param {string} url \u7D76\u5BFE URL\uFF08img.currentSrc \u307E\u305F\u306F background-image \u306E url()\uFF09\n * @param {(w: import('../index.js').ConversionWarning) => void} warn\n * @param {Element} [element]\n * @returns {Promise<DecodedImage|null>}\n */\nexport function loadImage(url, warn, element) {\n let p = cache.get(url);\n if (!p) {\n p = decode(url, warn, element).catch((e) => {\n warn({ code: 'image-failed', message: `Failed to load image ${url}: ${e instanceof Error ? e.message : String(e)}`, element });\n return null;\n });\n cache.set(url, p);\n }\n return p;\n}\n\n/**\n * @param {string} url\n * @param {(w: import('../index.js').ConversionWarning) => void} warn\n * @param {Element} [element]\n * @returns {Promise<DecodedImage|null>}\n */\nasync function decode(url, warn, element) {\n // 1. \u30D0\u30A4\u30C8\u5217\u3092\u53D6\u5F97\u3067\u304D\u308C\u3070 JPEG \u5224\u5B9A\n /** @type {Uint8Array|null} */\n let bytes = null;\n try {\n const res = await fetch(url, { mode: 'cors', credentials: 'same-origin' });\n if (res.ok) bytes = new Uint8Array(await res.arrayBuffer());\n } catch {\n bytes = null; // CORS \u7B49\u3067\u8AAD\u3081\u306A\u3044\u5834\u5408\u306F canvas \u7D4C\u7531\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\n }\n\n if (bytes && bytes[0] === 0xff && bytes[1] === 0xd8) {\n const dims = jpegDimensions(bytes);\n if (dims && dims.components === 3) {\n return { key: url, width: dims.width, height: dims.height, jpeg: bytes, rgb: null, alpha: null };\n }\n // CMYK / \u30B0\u30EC\u30FC\u30B9\u30B1\u30FC\u30EB JPEG \u306F canvas \u7D4C\u7531\u3067 RGB \u5316\u3059\u308B\n }\n\n // 2. canvas \u3067\u30C7\u30B3\u30FC\u30C9\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.decoding = 'sync';\n const loaded = new Promise((resolve, reject) => {\n img.onload = () => resolve(undefined);\n img.onerror = () => reject(new Error('image failed to load'));\n });\n if (bytes) {\n const blobUrl = URL.createObjectURL(new Blob([/** @type {Uint8Array<ArrayBuffer>} */ (bytes)]));\n img.src = blobUrl;\n try {\n await loaded;\n } finally {\n URL.revokeObjectURL(blobUrl);\n }\n } else {\n img.src = url;\n await loaded;\n }\n const w = img.naturalWidth;\n const h = img.naturalHeight;\n if (!w || !h) throw new Error('image has no intrinsic size');\n\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) throw new Error('2D canvas unavailable');\n ctx.drawImage(img, 0, 0);\n /** @type {ImageData} */\n let data;\n try {\n data = ctx.getImageData(0, 0, w, h);\n } catch {\n warn({\n code: 'image-failed',\n message: `Image ${url} is cross-origin without CORS headers; add crossorigin=\"anonymous\" and Access-Control-Allow-Origin. Skipped.`,\n element,\n });\n return null;\n }\n const px = data.data;\n const rgb = new Uint8Array(w * h * 3);\n const alpha = new Uint8Array(w * h);\n let opaque = true;\n for (let i = 0, j = 0, k = 0; i < px.length; i += 4, j += 3, k++) {\n const a = /** @type {number} */ (px[i + 3]);\n // getImageData \u306F\u975E\u30D7\u30EA\u30DE\u30EB\u30C1\u30D7\u30E9\u30A4\u3002\u900F\u660E\u30D4\u30AF\u30BB\u30EB\u306E\u8272\u306F\u30CE\u30A4\u30BA\u306B\u306A\u308A\u3046\u308B\u306E\u3067\u767D\u306B\u5BC4\u305B\u308B\n if (a === 0) {\n rgb[j] = rgb[j + 1] = rgb[j + 2] = 255;\n } else {\n rgb[j] = /** @type {number} */ (px[i]);\n rgb[j + 1] = /** @type {number} */ (px[i + 1]);\n rgb[j + 2] = /** @type {number} */ (px[i + 2]);\n }\n alpha[k] = a;\n if (a !== 255) opaque = false;\n }\n return { key: url, width: w, height: h, jpeg: null, rgb, alpha: opaque ? null : alpha };\n}\n\n/**\n * JPEG \u306E SOF \u30DE\u30FC\u30AB\u30FC\u304B\u3089\u5BF8\u6CD5\u3068\u6210\u5206\u6570\u3092\u8AAD\u3080\u3002\n * @param {Uint8Array} b\n * @returns {{width: number, height: number, components: number}|null}\n */\nexport function jpegDimensions(b) {\n let p = 2;\n while (p + 9 < b.length) {\n if (b[p] !== 0xff) {\n p++;\n continue;\n }\n const marker = /** @type {number} */ (b[p + 1]);\n if (marker === 0xd8 || (marker >= 0xd0 && marker <= 0xd7) || marker === 0x01 || marker === 0xff) {\n p += marker === 0xff ? 1 : 2;\n continue;\n }\n const len = ((/** @type {number} */ (b[p + 2])) << 8) | /** @type {number} */ (b[p + 3]);\n if ((marker >= 0xc0 && marker <= 0xc3) || (marker >= 0xc5 && marker <= 0xc7) || (marker >= 0xc9 && marker <= 0xcb) || (marker >= 0xcd && marker <= 0xcf)) {\n return {\n height: ((/** @type {number} */ (b[p + 5])) << 8) | /** @type {number} */ (b[p + 6]),\n width: ((/** @type {number} */ (b[p + 7])) << 8) | /** @type {number} */ (b[p + 8]),\n components: /** @type {number} */ (b[p + 9]),\n };\n }\n if (marker === 0xda) break; // SOS: \u4EE5\u964D\u306F\u753B\u50CF\u30C7\u30FC\u30BF\n p += 2 + len;\n }\n return null;\n}\n\n/**\n * computed background-image \u306E `url(\"...\")` \u3092\u53D6\u308A\u51FA\u3059\u3002\u8907\u6570\u6307\u5B9A\u30FB\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\u306F null\u3002\n * @param {string} value\n * @returns {string|null}\n */\nexport function parseBackgroundUrl(value) {\n if (!value || value === 'none') return null;\n const parts = splitTopLevelCommas(value);\n if (parts.length !== 1) return null;\n const m = /^url\\((?:\"([^\"]*)\"|'([^']*)'|([^)]*))\\)$/.exec(/** @type {string} */ (parts[0]).trim());\n if (!m) return null;\n return m[1] ?? m[2] ?? m[3] ?? null;\n}\n\n/** @param {string} s */\nfunction splitTopLevelCommas(s) {\n /** @type {string[]} */\n const out = [];\n let depth = 0;\n let cur = '';\n for (const ch of s) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (ch === ',' && depth === 0) {\n out.push(cur);\n cur = '';\n } else cur += ch;\n }\n if (cur.trim()) out.push(cur);\n return out;\n}\n\n/**\n * background-size / background-position / object-fit / object-position \u304B\u3089\u63CF\u753B\u77E9\u5F62\u3092\u8A08\u7B97\u3059\u308B\u3002\n * @param {{x: number, y: number, w: number, h: number}} box \u63CF\u753B\u9818\u57DF\uFF08px\uFF09\n * @param {number} iw \u753B\u50CF\u306E\u56FA\u6709\u5E45\n * @param {number} ih\n * @param {string} size 'auto' | 'cover' | 'contain' | '<w> <h>'\uFF08computed \u5024\u3001px \u307E\u305F\u306F %\uFF09\n * @param {string} position '0% 0%' | '50% 50%' | '10px 20px' \u2026\uFF08computed \u5024\u30012 \u5024\uFF09\n * @returns {{x: number, y: number, w: number, h: number}}\n */\nexport function fitImage(box, iw, ih, size, position) {\n let w;\n let h;\n const s = size.trim();\n if (s === 'cover' || s === 'contain') {\n const scale = s === 'cover' ? Math.max(box.w / iw, box.h / ih) : Math.min(box.w / iw, box.h / ih);\n w = iw * scale;\n h = ih * scale;\n } else {\n const [sw = 'auto', sh = 'auto'] = s.split(/\\s+/);\n const rw = sizeComponent(sw, box.w);\n const rh = sizeComponent(sh, box.h);\n if (rw === null && rh === null) {\n w = iw;\n h = ih;\n } else if (rw === null) {\n h = /** @type {number} */ (rh);\n w = (iw * h) / ih;\n } else if (rh === null) {\n w = rw;\n h = (ih * w) / iw;\n } else {\n w = rw;\n h = rh;\n }\n }\n const [px = '0%', py = '0%'] = position.trim().split(/\\s+/);\n const x = box.x + positionComponent(px, box.w - w);\n const y = box.y + positionComponent(py, box.h - h);\n return { x, y, w, h };\n}\n\n/** @param {string} v @param {number} ref @returns {number|null} */\nfunction sizeComponent(v, ref) {\n if (v === 'auto') return null;\n if (v.endsWith('%')) return (parseFloat(v) / 100) * ref;\n return parseFloat(v) || 0;\n}\n\n/** @param {string} v @param {number} free */\nfunction positionComponent(v, free) {\n if (v === 'left' || v === 'top') return 0;\n if (v === 'center') return free / 2;\n if (v === 'right' || v === 'bottom') return free;\n if (v.endsWith('%')) return (parseFloat(v) / 100) * free;\n return parseFloat(v) || 0;\n}\n\n/**\n * object-fit \u3092 background-size \u76F8\u5F53\u306E\u5024\u306B\u5909\u63DB\u3059\u308B\u3002\n * @param {string} fit\n * @returns {string}\n */\nexport function objectFitToSize(fit) {\n switch (fit) {\n case 'contain':\n case 'scale-down':\n return 'contain';\n case 'cover':\n return 'cover';\n case 'none':\n return 'auto';\n default:\n return '100% 100%';\n }\n}\n", "// @ts-check\n/**\n * DOM Walker \u2014 \u30D6\u30E9\u30A6\u30B6\u304C\u30EC\u30A4\u30A2\u30A6\u30C8\u3057\u305F Document \u3092\u8D70\u67FB\u3057\u3001DisplayList\uFF08\u63CF\u753B\u547D\u4EE4\u306E\u914D\u5217\uFF09\u3092\u4F5C\u308B\u3002\n * \u5EA7\u6A19\u306F\u3059\u3079\u3066 CSS px\u3001iframe \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5EA7\u6A19\uFF08\u5DE6\u4E0A\u539F\u70B9\u3001y \u4E0B\u5411\u304D\uFF09\u3002\n */\nimport { parseColor, cssPx } from '../units.js';\nimport { splitFamilies, parseWeight } from '../font/registry.js';\nimport { measureText } from './text.js';\nimport { loadImage, parseBackgroundUrl, fitImage, objectFitToSize } from './image.js';\n\n/**\n * @typedef {import('../units.js').Rgba} Rgba\n * @typedef {[number, number, number, number]} Radius [\u5DE6\u4E0A, \u53F3\u4E0A, \u53F3\u4E0B, \u5DE6\u4E0B] px\n * @typedef {{x: number, y: number, w: number, h: number, radius?: Radius}} Box\n *\n * @typedef {{type: 'rect', x: number, y: number, w: number, h: number, color: Rgba, radius?: Radius, z: number, seq: number}} RectItem\n * @typedef {{type: 'line', x1: number, y1: number, x2: number, y2: number, width: number, color: Rgba, dash: number[]|null, z: number, seq: number}} LineItem\n * @typedef {{type: 'stroke-rrect', x: number, y: number, w: number, h: number, radius: Radius, width: number, color: Rgba, dash: number[]|null, z: number, seq: number}} StrokeRRectItem\n * @typedef {{type: 'image', x: number, y: number, w: number, h: number, image: import('./image.js').DecodedImage, clip: Box|null, alpha: number, z: number, seq: number}} ImageItem\n * @typedef {{gid: number, cp: number, x: number, advance: number}} Glyph advance \u306F px\n * @typedef {{type: 'text', x: number, y: number, top: number, bottom: number, size: number, color: Rgba, font: import('../font/registry.js').RegisteredFont, glyphs: Glyph[], z: number, seq: number}} TextItem\n * @typedef {{type: 'group', matrix: [number, number, number, number, number, number], origin: {x: number, y: number}, items: DisplayItem[], top: number, bottom: number, z: number, seq: number}} GroupItem\n * @typedef {{type: 'clip', box: Box, items: DisplayItem[], top: number, bottom: number, z: number, seq: number}} ClipItem overflow: hidden\n * @typedef {RectItem|LineItem|StrokeRRectItem|ImageItem|TextItem|GroupItem|ClipItem} DisplayItem\n *\n * @typedef {{top: number, bottom: number}} Atom \u30DA\u30FC\u30B8\u5883\u754C\u3092\u8DE8\u3044\u3067\u306F\u3044\u3051\u306A\u3044\u7E26\u7BC4\u56F2\uFF08\u884C\u30FB\u8868\u306E\u884C\u30FB\u753B\u50CF\u30FBbreak-inside: avoid\uFF09\n * @typedef {{top: number, bottom: number, headTop: number, headBottom: number, headItems: DisplayItem[], footTop: number, footBottom: number, footItems: DisplayItem[]}} TableInfo\n * @typedef {{items: DisplayItem[], atoms: Atom[], breaks: number[], tables: TableInfo[], height: number}} WalkResult\n */\n\n/**\n * @typedef {object} WalkContext\n * @property {import('../font/registry.js').FontRegistry} registry\n * @property {string[]} fontFallback\n * @property {(w: import('../index.js').ConversionWarning) => void} warn\n * @property {'font'|'measure'|'auto'} textMeasure\n */\n\nconst SKIP_TAGS = new Set(['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEMPLATE', 'HEAD', 'META', 'LINK', 'TITLE', 'BASE', 'IFRAME', 'CANVAS', 'VIDEO', 'AUDIO', 'SVG', 'OBJECT', 'EMBED']);\n\n/** \u672A\u5BFE\u5FDC CSS \u30D7\u30ED\u30D1\u30C6\u30A3: [computedStyle \u306E\u30AD\u30FC, \u300C\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u300D\u5224\u5B9A] */\nconst UNSUPPORTED = /** @type {[keyof CSSStyleDeclaration & string, (v: string) => boolean][]} */ ([\n ['boxShadow', (v) => v !== 'none'],\n ['textShadow', (v) => v !== 'none'],\n ['filter', (v) => v !== 'none'],\n ['backdropFilter', (v) => v !== 'none' && v !== ''],\n ['writingMode', (v) => v.startsWith('vertical')],\n ['outlineStyle', (v) => v !== 'none'],\n ['clipPath', (v) => v !== 'none'],\n ['mixBlendMode', (v) => v !== 'normal'],\n]);\n\n/**\n * @param {HTMLElement} root\n * @param {WalkContext} ctx\n * @returns {Promise<WalkResult>}\n */\nexport async function walk(root, ctx) {\n const win = /** @type {Window} */ (root.ownerDocument.defaultView);\n const sx = win.scrollX;\n const sy = win.scrollY;\n /** @type {DisplayItem[]} \u73FE\u5728\u306E\u51FA\u529B\u5148\uFF08transform \u30B0\u30EB\u30FC\u30D7\u5185\u3067\u306F\u5DEE\u3057\u66FF\u308F\u308B\uFF09 */\n let out = [];\n const rootItems = out;\n /** @type {Atom[]} */\n const atoms = [];\n /** @type {number[]} */\n const breaks = [];\n /** @type {TableInfo[]} */\n const tables = [];\n /** @type {TableInfo|null} \u8D70\u67FB\u4E2D\u306E\u30C6\u30FC\u30D6\u30EB\uFF08thead \u306E\u63CF\u753B\u547D\u4EE4\u3092\u8A18\u9332\u3059\u308B\u5148\uFF09 */\n let currentTable = null;\n let seq = 0;\n /** @type {Set<string>} */\n const warned = new Set();\n /** @type {Set<string>} */\n const missingFamilies = new Set();\n\n /**\n * @param {string} key\n * @param {import('../index.js').ConversionWarning} w\n */\n function warnOnce(key, w) {\n if (warned.has(key)) return;\n warned.add(key);\n ctx.warn(w);\n }\n\n /**\n * @typedef {{z: number, alpha: number, decorations: {line: string, color: Rgba}[]}} Inherited\n */\n\n /**\n * @param {Element} el\n * @param {Inherited} inherited\n */\n async function visit(el, inherited) {\n if (SKIP_TAGS.has(el.tagName)) return;\n const style = win.getComputedStyle(el);\n if (style.display === 'none') return;\n\n // transform: \u4E00\u6642\u7684\u306B\u7121\u52B9\u5316\u3057\u3066\u7121\u5909\u5F62\u306E\u5EA7\u6A19\u3067\u8D70\u67FB\u3057\u3001\u30B0\u30EB\u30FC\u30D7\u3068\u3057\u3066\u5305\u3080\n const matrix = parseTransform(style.transform);\n // \u6CE8\u610F: iframe \u5185\u306E\u8981\u7D20\u306F\u89AA\u30A6\u30A3\u30F3\u30C9\u30A6\u306E HTMLElement \u306E instanceof \u306B\u5931\u6557\u3059\u308B\u306E\u3067\u3001\u30BF\u30B0\u540D\u30FB\u30D7\u30ED\u30D1\u30C6\u30A3\u3067\u5224\u5B9A\u3059\u308B\n if (matrix && 'style' in el) {\n const hel = /** @type {HTMLElement} */ (el);\n const transformedRect = hel.getBoundingClientRect();\n const prev = hel.style.transform;\n hel.style.transform = 'none';\n void hel.offsetWidth;\n const plainRect = hel.getBoundingClientRect();\n const [ox, oy] = parseOrigin(style.transformOrigin);\n const origin = { x: plainRect.left + ox + sx, y: plainRect.top + oy + sy };\n\n const saved = out;\n out = [];\n await visitInner(el, win.getComputedStyle(el), inherited);\n const items = out;\n out = saved;\n hel.style.transform = prev;\n void hel.offsetWidth;\n\n out.push({\n type: 'group',\n matrix,\n origin,\n items,\n top: transformedRect.top + sy,\n bottom: transformedRect.bottom + sy,\n z: zOf(style, inherited.z),\n seq: seq++,\n });\n return;\n }\n await visitInner(el, style, inherited);\n }\n\n /** @param {CSSStyleDeclaration} style @param {number} inheritedZ */\n function zOf(style, inheritedZ) {\n if (style.position !== 'static' && style.zIndex !== 'auto') {\n const zi = parseInt(style.zIndex, 10);\n if (Number.isFinite(zi)) return zi;\n }\n return inheritedZ;\n }\n\n /**\n * @param {Element} el\n * @param {CSSStyleDeclaration} style\n * @param {Inherited} inherited\n */\n async function visitInner(el, style, inherited) {\n const z = zOf(style, inherited.z);\n const opacity = parseFloat(style.opacity);\n const alpha = inherited.alpha * (Number.isFinite(opacity) ? opacity : 1);\n const visible = style.visibility === 'visible' && alpha > 0;\n\n // \u30DA\u30FC\u30B8\u5206\u5272\u306E\u30D2\u30F3\u30C8\uFF08\u975E\u8868\u793A\u3067\u3082\u4F4D\u7F6E\u306F\u6301\u3064\u306E\u3067 visible \u306B\u95A2\u4FC2\u306A\u304F\u96C6\u3081\u308B\uFF09\n if (style.display !== 'contents' && style.display !== 'inline') {\n const r = el.getBoundingClientRect();\n const top = r.top + sy;\n const bottom = r.bottom + sy;\n if (r.height > 0) {\n const bb = style.breakBefore || style.pageBreakBefore;\n const ba = style.breakAfter || style.pageBreakAfter;\n if (/^(page|always|left|right|recto|verso)$/.test(bb)) breaks.push(top);\n if (/^(page|always|left|right|recto|verso)$/.test(ba)) breaks.push(bottom);\n const bi = style.breakInside || style.pageBreakInside;\n // \u8868\u306E\u884C\u30FB\u884C\u30B0\u30EB\u30FC\u30D7\u30FB\u753B\u50CF\u30FBavoid \u6307\u5B9A\u306F\u5206\u5272\u3057\u306A\u3044\n if (bi === 'avoid' || bi === 'avoid-page' || style.display === 'table-row' || style.display === 'table-header-group' || style.display === 'table-footer-group' || el.tagName === 'IMG') {\n atoms.push({ top, bottom });\n }\n }\n }\n /** @type {TableInfo|null} */\n let openedTable = null;\n if (style.display === 'table' || style.display === 'inline-table') {\n const r = el.getBoundingClientRect();\n openedTable = { top: r.top + sy, bottom: r.bottom + sy, headTop: 0, headBottom: 0, headItems: [], footTop: 0, footBottom: 0, footItems: [] };\n tables.push(openedTable);\n }\n const savedTable = currentTable;\n if (openedTable) currentTable = openedTable;\n const isHead = style.display === 'table-header-group' && currentTable && !currentTable.headItems.length;\n const isFoot = style.display === 'table-footer-group' && currentTable && !currentTable.footItems.length;\n const groupStart = isHead || isFoot ? out.length : -1;\n\n // overflow: hidden / clip / auto / scroll \u2192 \u5B50\u5B6B\u3092 padding-box \u3067\u30AF\u30EA\u30C3\u30D7\u3059\u308B\n const clips = style.overflowX !== 'visible' || style.overflowY !== 'visible';\n /** @type {DisplayItem[]|null} */\n let clipSaved = null;\n /** @type {Box|null} */\n let clipBox = null;\n if (clips && style.display !== 'inline' && style.display !== 'contents' && el !== root) {\n const r = el.getBoundingClientRect();\n clipBox = boxFor(r, style, 'padding-box', parseRadius(style, r));\n }\n\n if (visible && style.display !== 'contents') {\n warnUnsupported(el, style);\n const rects = style.display === 'inline' ? [...el.getClientRects()] : [el.getBoundingClientRect()];\n const collapse = style.borderCollapse === 'collapse' && /^table/.test(style.display) && style.display !== 'table-caption';\n const radius = rects.length === 1 ? parseRadius(style, /** @type {DOMRect} */ (rects[0])) : null;\n for (const r of rects) {\n if (r.width <= 0 && r.height <= 0) continue;\n paintBackground(r, style, alpha, z, radius);\n await paintBackgroundImage(el, r, style, alpha, z, radius);\n paintBorders(r, style, alpha, z, collapse, radius);\n }\n if (el.tagName === 'IMG' && rects[0]) {\n await paintImg(/** @type {HTMLImageElement} */ (el), /** @type {DOMRect} */ (rects[0]), style, alpha, z, radius);\n }\n }\n\n // text-decoration \u306F\u5B50\u5B6B\u30C6\u30AD\u30B9\u30C8\u3078\u4F1D\u64AD\u3059\u308B\n let decorations = inherited.decorations;\n const decoLine = style.textDecorationLine;\n if (decoLine && decoLine !== 'none') {\n const color = parseColor(style.textDecorationColor) ?? parseColor(style.color) ?? { r: 0, g: 0, b: 0, a: 1 };\n decorations = [...decorations, { line: decoLine, color }];\n }\n\n if (clipBox) {\n clipSaved = out;\n out = [];\n }\n const next = { z, alpha, decorations };\n for (const node of [...el.childNodes]) {\n if (node.nodeType === Node.TEXT_NODE) {\n if (visible) paintText(/** @type {Text} */ (node), el, style, next);\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n await visit(/** @type {Element} */ (node), next);\n }\n }\n if (clipBox && clipSaved) {\n // \u5B8C\u5168\u306B\u5916\u306B\u3042\u308B\u547D\u4EE4\u306F\u6368\u3066\u308B\uFF08\u30AF\u30EA\u30C3\u30D7\u3067\u6D88\u3048\u305F\u6587\u5B57\u304C\u62BD\u51FA\u30C6\u30AD\u30B9\u30C8\u306B\u6B8B\u3089\u306A\u3044\u3088\u3046\u306B\uFF09\n const inside = out.filter((it) => intersects(it, /** @type {Box} */ (clipBox)));\n out = clipSaved;\n if (inside.length) {\n out.push({ type: 'clip', box: clipBox, items: inside, top: clipBox.y, bottom: clipBox.y + clipBox.h, z, seq: seq++ });\n }\n }\n\n if ((isHead || isFoot) && currentTable && groupStart >= 0) {\n const r = el.getBoundingClientRect();\n const items = out.slice(groupStart);\n if (isHead) {\n currentTable.headTop = r.top + sy;\n currentTable.headBottom = r.bottom + sy;\n currentTable.headItems = items;\n } else {\n currentTable.footTop = r.top + sy;\n currentTable.footBottom = r.bottom + sy;\n currentTable.footItems = items;\n }\n }\n currentTable = savedTable;\n }\n\n /** @param {Element} el @param {CSSStyleDeclaration} style */\n function warnUnsupported(el, style) {\n for (const [prop, isSet] of UNSUPPORTED) {\n const v = String(style[prop] ?? '');\n if (isSet(v)) {\n warnOnce(`css:${prop}`, {\n code: 'unsupported-css',\n message: `CSS property \"${camelToKebab(prop)}\" is not supported in this version and will be ignored (first seen on <${el.tagName.toLowerCase()}>: ${v})`,\n element: el,\n property: camelToKebab(prop),\n });\n }\n }\n if (/^matrix3d/.test(style.transform)) {\n warnOnce('css:transform3d', { code: 'unsupported-css', message: '3D transforms are not supported; the element is drawn untransformed', element: el, property: 'transform' });\n }\n }\n\n /**\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {Radius|null} radius\n */\n function paintBackground(r, style, alpha, z, radius) {\n const bg = parseColor(style.backgroundColor);\n if (!bg || bg.a <= 0) return;\n /** @type {RectItem} */\n const item = { type: 'rect', x: r.left + sx, y: r.top + sy, w: r.width, h: r.height, color: withAlpha(bg, alpha), z, seq: seq++ };\n if (radius) item.radius = radius;\n out.push(item);\n }\n\n /**\n * @param {Element} el\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {Radius|null} radius\n */\n async function paintBackgroundImage(el, r, style, alpha, z, radius) {\n if (style.backgroundImage === 'none') return;\n const url = parseBackgroundUrl(style.backgroundImage);\n if (!url) {\n warnOnce('css:backgroundImage', {\n code: 'unsupported-css',\n message: `background-image \"${style.backgroundImage}\" is not supported (only a single url() is); ignored`,\n element: el,\n property: 'background-image',\n });\n return;\n }\n const img = await loadImage(new URL(url, el.ownerDocument.baseURI).href, ctx.warn, el);\n if (!img) return;\n if (style.backgroundRepeat !== 'no-repeat') {\n warnOnce('css:backgroundRepeat', {\n code: 'unsupported-css',\n message: `background-repeat \"${style.backgroundRepeat}\" is not supported; drawn once as no-repeat`,\n element: el,\n property: 'background-repeat',\n });\n }\n // background-origin / clip\uFF08\u65E2\u5B9A: padding-box / border-box\uFF09\n const clipBox = boxFor(r, style, style.backgroundClip || 'border-box', radius);\n const originBox = boxFor(r, style, style.backgroundOrigin || 'padding-box', null);\n const fit = fitImage(originBox, img.width, img.height, style.backgroundSize, style.backgroundPosition);\n out.push({ type: 'image', ...fit, image: img, clip: clipBox, alpha, z, seq: seq++ });\n }\n\n /**\n * @param {HTMLImageElement} el\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {Radius|null} radius\n */\n async function paintImg(el, r, style, alpha, z, radius) {\n const src = el.currentSrc || el.src;\n if (!src) return;\n const img = await loadImage(src, ctx.warn, el);\n if (!img) return;\n const content = boxFor(r, style, 'content-box', radius);\n const fit = fitImage(content, img.width, img.height, objectFitToSize(style.objectFit), style.objectPosition);\n if (style.objectFit === 'scale-down' && (fit.w > img.width || fit.h > img.height)) {\n Object.assign(fit, fitImage(content, img.width, img.height, 'auto', style.objectPosition));\n }\n out.push({ type: 'image', ...fit, image: img, clip: content, alpha, z, seq: seq++ });\n }\n\n /**\n * border-box \u306E\u77E9\u5F62\u304B\u3089\u6307\u5B9A\u30DC\u30C3\u30AF\u30B9\u3092\u6C42\u3081\u308B\u3002\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {string} box 'border-box' | 'padding-box' | 'content-box'\n * @param {Radius|null} radius\n * @returns {Box}\n */\n function boxFor(r, style, box, radius) {\n let x = r.left + sx;\n let y = r.top + sy;\n let w = r.width;\n let h = r.height;\n if (box === 'padding-box' || box === 'content-box') {\n const bt = cssPx(style.borderTopWidth);\n const br = cssPx(style.borderRightWidth);\n const bb = cssPx(style.borderBottomWidth);\n const bl = cssPx(style.borderLeftWidth);\n x += bl;\n y += bt;\n w -= bl + br;\n h -= bt + bb;\n if (radius) radius = /** @type {Radius} */ (radius.map((v) => Math.max(0, v - Math.max(bt, br, bb, bl))));\n }\n if (box === 'content-box') {\n const pt = cssPx(style.paddingTop);\n const pr = cssPx(style.paddingRight);\n const pb = cssPx(style.paddingBottom);\n const pl = cssPx(style.paddingLeft);\n x += pl;\n y += pt;\n w -= pl + pr;\n h -= pt + pb;\n }\n /** @type {Box} */\n const b = { x, y, w: Math.max(0, w), h: Math.max(0, h) };\n if (radius && radius.some((v) => v > 0)) b.radius = radius;\n return b;\n }\n\n /**\n * @param {DOMRect} r\n * @param {CSSStyleDeclaration} style\n * @param {number} alpha\n * @param {number} z\n * @param {boolean} collapse border-collapse: collapse \u306E\u30C6\u30FC\u30D6\u30EB\u8981\u7D20\u304B\uFF08\u5883\u754C\u7DDA\u3092\u8FBA\u306E\u4E2D\u5FC3\u306B\u63CF\u304F\uFF09\n * @param {Radius|null} radius\n */\n function paintBorders(r, style, alpha, z, collapse, radius) {\n const x = r.left + sx;\n const y = r.top + sy;\n const w = r.width;\n const h = r.height;\n /** @type {('Top'|'Right'|'Bottom'|'Left')[]} */\n const names = ['Top', 'Right', 'Bottom', 'Left'];\n const sides = names.map((side) => ({\n side,\n width: cssPx(/** @type {string} */ (style[`border${side}Width`])),\n style: /** @type {string} */ (style[`border${side}Style`]),\n color: parseColor(/** @type {string} */ (style[`border${side}Color`])),\n }));\n const drawn = sides.filter((s) => s.width > 0 && s.style !== 'none' && s.style !== 'hidden' && s.color && s.color.a > 0);\n if (!drawn.length) return;\n\n // \u89D2\u4E38: 4 \u8FBA\u304C\u540C\u3058\u5E45\u30FB\u8272\u30FB\u30B9\u30BF\u30A4\u30EB\u306A\u3089\u89D2\u4E38\u30D1\u30B9\u3092\u30B9\u30C8\u30ED\u30FC\u30AF\u3059\u308B\n if (radius && radius.some((v) => v > 0)) {\n const f = /** @type {typeof drawn[0]} */ (drawn[0]);\n const uniform =\n drawn.length === 4 &&\n drawn.every((s) => s.width === f.width && s.style === f.style && JSON.stringify(s.color) === JSON.stringify(f.color));\n if (uniform) {\n const bw = f.width;\n out.push({\n type: 'stroke-rrect',\n x: x + bw / 2,\n y: y + bw / 2,\n w: w - bw,\n h: h - bw,\n radius: /** @type {Radius} */ (radius.map((v) => Math.max(0, v - bw / 2))),\n width: bw,\n color: withAlpha(/** @type {Rgba} */ (f.color), alpha),\n dash: dashFor(f.style, bw),\n z,\n seq: seq++,\n });\n return;\n }\n warnOnce('css:borderRadiusNonUniform', {\n code: 'unsupported-css',\n message: 'border-radius with non-uniform borders is approximated with straight borders',\n property: 'border-radius',\n });\n }\n\n for (const s of drawn) {\n const bw = s.width;\n const c = withAlpha(/** @type {Rgba} */ (s.color), alpha);\n const horizontal = s.side === 'Top' || s.side === 'Bottom';\n const dir = s.side === 'Top' || s.side === 'Left' ? 1 : -1;\n const edge = s.side === 'Top' ? y : s.side === 'Bottom' ? y + h : s.side === 'Left' ? x : x + w;\n const dash = dashFor(s.style, bw);\n if (dash) {\n const center = collapse ? edge : edge + (bw / 2) * dir;\n out.push({\n type: 'line',\n x1: horizontal ? x : center,\n y1: horizontal ? center : y,\n x2: horizontal ? x + w : center,\n y2: horizontal ? center : y + h,\n width: bw,\n color: c,\n dash,\n z,\n seq: seq++,\n });\n continue;\n }\n // solid / double / groove / ridge / inset / outset \u306F\u5857\u308A\u77E9\u5F62\u3067\u8FD1\u4F3C\n const start = collapse ? edge - bw / 2 : dir > 0 ? edge : edge - bw;\n if (horizontal) out.push({ type: 'rect', x, y: start, w, h: bw, color: c, z, seq: seq++ });\n else out.push({ type: 'rect', x: start, y, w: bw, h, color: c, z, seq: seq++ });\n }\n }\n\n /**\n * @param {Text} node\n * @param {Element} parent\n * @param {CSSStyleDeclaration} style\n * @param {Inherited} inh\n */\n function paintText(node, parent, style, inh) {\n const raw = node.data;\n if (!raw) return;\n if (!/\\S/.test(raw) && !raw.includes('\u00A0')) {\n const range = node.ownerDocument.createRange();\n range.selectNodeContents(node);\n if (![...range.getClientRects()].some((r) => r.width > 0)) return;\n }\n\n const color = withAlpha(parseColor(style.color) ?? { r: 0, g: 0, b: 0, a: 1 }, inh.alpha);\n const size = cssPx(style.fontSize);\n if (size <= 0) return;\n const families = splitFamilies(style.fontFamily);\n const weight = parseWeight(style.fontWeight);\n const fstyle = /** @type {'normal'|'italic'} */ (style.fontStyle === 'italic' || style.fontStyle === 'oblique' ? 'italic' : 'normal');\n\n const primary = ctx.registry.match(families, weight, fstyle) ?? ctx.registry.match(ctx.fontFallback, weight, fstyle);\n if (!primary) {\n const key = families.join(',');\n if (!missingFamilies.has(key)) {\n missingFamilies.add(key);\n ctx.warn({\n code: 'missing-font',\n message: `No registered font matches font-family \"${style.fontFamily}\" and no fallback is available; text will be skipped`,\n element: parent,\n });\n }\n return;\n }\n\n const lines = measureText(node, style, {\n registry: ctx.registry,\n families,\n fallback: ctx.fontFallback,\n primary,\n weight,\n fstyle,\n size,\n textMeasure: ctx.textMeasure,\n warn: ctx.warn,\n element: parent,\n });\n\n for (const line of lines) {\n if (!line.glyphs.length) continue;\n atoms.push({ top: line.top + sy, bottom: line.bottom + sy });\n out.push({\n type: 'text',\n x: line.glyphs[0]?.x ?? 0,\n y: line.baseline + sy,\n top: line.top + sy,\n bottom: line.bottom + sy,\n size,\n color,\n font: line.font,\n glyphs: line.glyphs.map((g) => ({ ...g, x: g.x + sx })),\n z: inh.z,\n seq: seq++,\n });\n for (const deco of inh.decorations) {\n const first = line.glyphs[0];\n const last = line.glyphs[line.glyphs.length - 1];\n if (!first || !last) continue;\n const x1 = first.x + sx;\n const x2 = last.x + last.advance + sx;\n const thickness = Math.max(1, size / 14);\n const c = withAlpha(deco.color, inh.alpha);\n if (deco.line.includes('underline')) {\n out.push({ type: 'rect', x: x1, y: line.baseline + sy + size * 0.08, w: x2 - x1, h: thickness, color: c, z: inh.z, seq: seq++ });\n }\n if (deco.line.includes('line-through')) {\n out.push({ type: 'rect', x: x1, y: line.baseline + sy - size * 0.3, w: x2 - x1, h: thickness, color: c, z: inh.z, seq: seq++ });\n }\n }\n }\n }\n\n await visit(root, { z: 0, alpha: 1, decorations: [] });\n sortItems(rootItems);\n // \u6587\u66F8\u306E\u9AD8\u3055: body \u306E\u4E0B\u7AEF\u3068\u3001\u306F\u307F\u51FA\u3057\u305F\u547D\u4EE4\uFF08\u7D76\u5BFE\u914D\u7F6E\u306A\u3069\uFF09\u306E\u4E0B\u7AEF\u306E\u5927\u304D\u3044\u65B9\u3002\n // body.scrollHeight \u306F\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u9AD8\u3055\u306B\u81A8\u3089\u3080\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u4F7F\u308F\u306A\u3044\u3002\n let height = root.getBoundingClientRect().bottom + sy;\n for (const it of rootItems) {\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') height = Math.max(height, it.y + it.h);\n else if (it.type === 'line') height = Math.max(height, it.y1, it.y2);\n else if (it.type === 'text' || it.type === 'group' || it.type === 'clip') height = Math.max(height, it.bottom);\n }\n return { items: rootItems, atoms, breaks, tables, height };\n}\n\n/** @param {DisplayItem[]} items */\nfunction sortItems(items) {\n items.sort((a, b) => a.z - b.z || a.seq - b.seq);\n for (const it of items) if (it.type === 'group' || it.type === 'clip') sortItems(it.items);\n}\n\n/**\n * @param {string} style border-style\n * @param {number} bw\n * @returns {number[]|null}\n */\nfunction dashFor(style, bw) {\n if (style === 'dashed') return [bw * 3, bw * 3];\n if (style === 'dotted') return [bw, bw];\n return null;\n}\n\n/**\n * computed border-*-radius\uFF08'4px' / '4px 6px' / '50%'\uFF09\u3092 px \u306E Radius \u306B\u3059\u308B\u3002\n * \u6955\u5186\u306F\u6C34\u5E73\u65B9\u5411\u306E\u534A\u5F84\u3067\u8FD1\u4F3C\u3059\u308B\u3002\n * @param {CSSStyleDeclaration} style\n * @param {DOMRect} r\n * @returns {Radius|null}\n */\nfunction parseRadius(style, r) {\n const one = (/** @type {string} */ v) => {\n const first = v.trim().split(/\\s+/)[0] ?? '0px';\n return first.endsWith('%') ? (parseFloat(first) / 100) * r.width : cssPx(first);\n };\n const radius = /** @type {Radius} */ ([\n one(style.borderTopLeftRadius),\n one(style.borderTopRightRadius),\n one(style.borderBottomRightRadius),\n one(style.borderBottomLeftRadius),\n ]);\n return radius.some((v) => v > 0) ? radius : null;\n}\n\n/**\n * computed transform\uFF08'matrix(a, b, c, d, e, f)'\uFF09\u3092\u89E3\u6790\u3059\u308B\u3002none / 3D \u306F null\u3002\n * @param {string} value\n * @returns {[number, number, number, number, number, number]|null}\n */\nexport function parseTransform(value) {\n if (!value || value === 'none') return null;\n const m = /^matrix\\(([^)]+)\\)$/.exec(value.trim());\n if (!m) return null;\n const n = /** @type {string} */ (m[1]).split(',').map((s) => parseFloat(s));\n if (n.length !== 6 || n.some((v) => !Number.isFinite(v))) return null;\n const [a, b, c, d, e, f] = /** @type {[number, number, number, number, number, number]} */ (n);\n if (a === 1 && b === 0 && c === 0 && d === 1 && e === 0 && f === 0) return null;\n return [a, b, c, d, e, f];\n}\n\n/**\n * computed transform-origin\uFF08'40px 20px' \u307E\u305F\u306F 3 \u5024\uFF09\u2192 [x, y] px\n * @param {string} value\n * @returns {[number, number]}\n */\nfunction parseOrigin(value) {\n const parts = value.trim().split(/\\s+/);\n return [cssPx(parts[0] ?? '0'), cssPx(parts[1] ?? '0')];\n}\n\n/**\n * \u547D\u4EE4\u306E\u5916\u63A5\u77E9\u5F62\u304C\u30DC\u30C3\u30AF\u30B9\u3068\u91CD\u306A\u308B\u304B\uFF08\u30AF\u30EA\u30C3\u30D7\u3067\u5B8C\u5168\u306B\u6D88\u3048\u308B\u547D\u4EE4\u306E\u9664\u53BB\u306B\u4F7F\u3046\uFF09\u3002\n * @param {DisplayItem} it\n * @param {Box} b\n */\nfunction intersects(it, b) {\n let x1;\n let y1;\n let x2;\n let y2;\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') {\n x1 = it.x; y1 = it.y; x2 = it.x + it.w; y2 = it.y + it.h;\n } else if (it.type === 'line') {\n x1 = Math.min(it.x1, it.x2) - it.width; y1 = Math.min(it.y1, it.y2) - it.width;\n x2 = Math.max(it.x1, it.x2) + it.width; y2 = Math.max(it.y1, it.y2) + it.width;\n } else if (it.type === 'text') {\n const last = it.glyphs[it.glyphs.length - 1];\n x1 = it.x; y1 = it.top; x2 = last ? last.x + last.advance : it.x; y2 = it.bottom;\n } else if (it.type === 'clip') {\n x1 = it.box.x; y1 = it.box.y; x2 = it.box.x + it.box.w; y2 = it.box.y + it.box.h;\n } else {\n return true; // group\uFF08transform\uFF09\u306F\u5883\u754C\u304C\u56DE\u8EE2\u3059\u308B\u306E\u3067\u5E38\u306B\u6B8B\u3059\n }\n return x2 > b.x && x1 < b.x + b.w && y2 > b.y && y1 < b.y + b.h;\n}\n\n/** @param {Rgba} c @param {number} alpha */\nfunction withAlpha(c, alpha) {\n return alpha === 1 ? c : { ...c, a: c.a * alpha };\n}\n\n/** @param {string} s */\nfunction camelToKebab(s) {\n return s.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n}\n", "// @ts-check\n/**\n * Web \u6A19\u6E96 CompressionStream \u306B\u3088\u308B zlib (FlateDecode) \u5727\u7E2E\u3002\n * \u672A\u5BFE\u5FDC\u74B0\u5883\u3067\u306F null \u3092\u8FD4\u3057\u3001\u547C\u3073\u51FA\u3057\u5074\u306F\u7121\u5727\u7E2E\u3067\u51FA\u529B\u3059\u308B\u3002\n */\n\n/**\n * @returns {boolean}\n */\nexport function canCompress() {\n return typeof CompressionStream === 'function';\n}\n\n/**\n * @param {Uint8Array} bytes\n * @returns {Promise<Uint8Array|null>} zlib \u5F62\u5F0F\uFF08PDF \u306E FlateDecode \u304C\u671F\u5F85\u3059\u308B\u5F62\u5F0F\uFF09\n */\nexport async function deflate(bytes) {\n if (!canCompress()) return null;\n try {\n const cs = new CompressionStream('deflate');\n const writer = cs.writable.getWriter();\n void writer.write(/** @type {Uint8Array<ArrayBuffer>} */ (bytes));\n void writer.close();\n const buf = await new Response(cs.readable).arrayBuffer();\n return new Uint8Array(buf);\n } catch {\n return null;\n }\n}\n", "// @ts-check\n/**\n * \u6700\u5C0F\u9650\u306E PDF \u30E9\u30A4\u30BF\u30FC\u3002\n * \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u30E1\u30E2\u30EA\u4E0A\u306B\u4FDD\u6301\u3057\u3001build() \u3067 xref / trailer \u3092\u542B\u3080\u30D0\u30A4\u30C8\u5217\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n */\nimport { deflate } from './compress.js';\nimport { num } from '../units.js';\n\n/** \u9593\u63A5\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u53C2\u7167 */\nexport class Ref {\n /** @param {number} id */\n constructor(id) {\n this.id = id;\n }\n toString() {\n return `${this.id} 0 R`;\n }\n}\n\n/** PDF \u540D\u524D\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\uFF08/Name\uFF09 */\nexport class Name {\n /** @param {string} name */\n constructor(name) {\n this.name = name;\n }\n toString() {\n // \u533A\u5207\u308A\u6587\u5B57\u30FB\u975E ASCII \u306F #xx \u3067\u30A8\u30B9\u30B1\u30FC\u30D7\n let out = '/';\n for (const ch of this.name) {\n const c = ch.charCodeAt(0);\n if (c < 0x21 || c > 0x7e || '#/%()<>[]{}'.includes(ch)) {\n for (const b of new TextEncoder().encode(ch)) out += '#' + b.toString(16).padStart(2, '0');\n } else out += ch;\n }\n return out;\n }\n}\n\n/** \u30D0\u30A4\u30C8\u5217\u305D\u306E\u307E\u307E\uFF08\u65E2\u306B\u30B7\u30EA\u30A2\u30E9\u30A4\u30BA\u6E08\u307F\u306E\u65AD\u7247\uFF09 */\nexport class Raw {\n /** @param {string} text */\n constructor(text) {\n this.text = text;\n }\n toString() {\n return this.text;\n }\n}\n\n/**\n * PDF \u30C6\u30AD\u30B9\u30C8\u6587\u5B57\u5217\u3002ASCII \u306E\u307F\u306A\u3089\u30EA\u30C6\u30E9\u30EB\u6587\u5B57\u5217\u3001\u305D\u3046\u3067\u306A\u3051\u308C\u3070 UTF-16BE (BOM \u4ED8\u304D) \u306E 16 \u9032\u6587\u5B57\u5217\u3002\n * @param {string} s\n * @returns {Raw}\n */\nexport function pdfString(s) {\n // eslint-disable-next-line no-control-regex\n if (/^[\\x20-\\x7e]*$/.test(s)) {\n return new Raw('(' + s.replace(/[\\\\()]/g, (c) => '\\\\' + c) + ')');\n }\n let hex = 'FEFF';\n for (let i = 0; i < s.length; i++) hex += s.charCodeAt(i).toString(16).padStart(4, '0');\n return new Raw('<' + hex + '>');\n}\n\n/**\n * PDF \u65E5\u4ED8\u6587\u5B57\u5217 (D:YYYYMMDDHHmmSS+HH'mm')\n * @param {Date} d\n * @returns {Raw}\n */\nexport function pdfDate(d) {\n const p = (/** @type {number} */ n) => String(n).padStart(2, '0');\n const tz = -d.getTimezoneOffset();\n const sign = tz >= 0 ? '+' : '-';\n const tzh = p(Math.floor(Math.abs(tz) / 60));\n const tzm = p(Math.abs(tz) % 60);\n return new Raw(\n `(D:${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}${p(d.getHours())}${p(d.getMinutes())}${p(d.getSeconds())}${sign}${tzh}'${tzm}')`,\n );\n}\n\n/**\n * @typedef {number|string|boolean|null|Ref|Name|Raw|PdfArray|PdfDict} PdfValue\n */\n/** @typedef {PdfValue[]} PdfArray */\n/** @typedef {{[key: string]: PdfValue}} PdfDict */\n\n/**\n * \u5024\u3092 PDF \u69CB\u6587\u306B\u30B7\u30EA\u30A2\u30E9\u30A4\u30BA\u3059\u308B\u3002\n * - number \u2192 \u6570\u5024\u3001boolean \u2192 true/false\u3001null \u2192 null\n * - string \u2192 \u540D\u524D (/Foo)\u3002\u30C6\u30AD\u30B9\u30C8\u6587\u5B57\u5217\u306F pdfString() \u3067 Raw \u306B\u3057\u3066\u6E21\u3059\n * - \u914D\u5217 \u2192 [ ... ]\u3001\u30D7\u30EC\u30FC\u30F3\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8 \u2192 << /Key value ... >>\n * @param {PdfValue} v\n * @returns {string}\n */\nexport function serialize(v) {\n if (v === null) return 'null';\n if (typeof v === 'number') return num(v);\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n if (typeof v === 'string') return new Name(v).toString();\n if (v instanceof Ref || v instanceof Name || v instanceof Raw) return v.toString();\n if (Array.isArray(v)) return '[' + v.map(serialize).join(' ') + ']';\n const parts = [];\n for (const [k, val] of Object.entries(v)) {\n if (val === undefined) continue;\n parts.push(new Name(k).toString() + ' ' + serialize(val));\n }\n return '<< ' + parts.join(' ') + ' >>';\n}\n\n/**\n * @typedef {object} PdfObject\n * @property {PdfValue} value\n * @property {Uint8Array} [stream]\n */\n\nexport class PdfWriter {\n /**\n * @param {{compress?: boolean, version?: string}} [options]\n */\n constructor(options = {}) {\n /** @type {(PdfObject|null)[]} 0 \u756A\u306F\u30D5\u30EA\u30FC\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8 */\n this.objects = [null];\n this.compress = options.compress ?? true;\n this.version = options.version ?? '1.7';\n }\n\n /**\n * \u9593\u63A5\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u4E88\u7D04\u3059\u308B\uFF08\u5F8C\u3067 set \u3067\u4E2D\u8EAB\u3092\u5165\u308C\u308B\uFF09\u3002\n * @returns {Ref}\n */\n reserve() {\n this.objects.push({ value: null });\n return new Ref(this.objects.length - 1);\n }\n\n /**\n * @param {Ref} ref\n * @param {PdfValue} value\n * @param {Uint8Array} [stream]\n */\n set(ref, value, stream) {\n this.objects[ref.id] = { value, stream };\n }\n\n /**\n * @param {PdfValue} value\n * @returns {Ref}\n */\n add(value) {\n const ref = this.reserve();\n this.set(ref, value);\n return ref;\n }\n\n /**\n * \u30B9\u30C8\u30EA\u30FC\u30E0\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u8FFD\u52A0\u3059\u308B\u3002compress \u304C\u6709\u52B9\u306A\u3089 FlateDecode \u3092\u8A66\u307F\u308B\u3002\n * @param {{[key: string]: PdfValue}} dict\n * @param {Uint8Array} bytes\n * @param {{compress?: boolean}} [opts]\n * @returns {Promise<Ref>}\n */\n async addStream(dict, bytes, opts = {}) {\n const ref = this.reserve();\n await this.setStream(ref, dict, bytes, opts);\n return ref;\n }\n\n /**\n * @param {Ref} ref\n * @param {{[key: string]: PdfValue}} dict\n * @param {Uint8Array} bytes\n * @param {{compress?: boolean}} [opts]\n */\n async setStream(ref, dict, bytes, opts = {}) {\n let data = bytes;\n const d = { ...dict };\n const doCompress = opts.compress ?? this.compress;\n if (doCompress && !('Filter' in d)) {\n const z = await deflate(bytes);\n if (z && z.length < bytes.length) {\n data = z;\n d.Filter = 'FlateDecode';\n }\n }\n d.Length = data.length;\n this.set(ref, d, data);\n }\n\n /**\n * \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5168\u4F53\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * @param {Ref} rootRef /Catalog \u3078\u306E\u53C2\u7167\n * @param {Ref} [infoRef] /Info \u3078\u306E\u53C2\u7167\n * @returns {Uint8Array}\n */\n build(rootRef, infoRef) {\n const enc = new TextEncoder();\n /** @type {Uint8Array[]} */\n const chunks = [];\n let offset = 0;\n const push = (/** @type {Uint8Array|string} */ c) => {\n const b = typeof c === 'string' ? enc.encode(c) : c;\n chunks.push(b);\n offset += b.length;\n };\n\n // \u30D8\u30C3\u30C0\u30FC\u30022 \u884C\u76EE\u306E\u30D0\u30A4\u30CA\u30EA\u30B3\u30E1\u30F3\u30C8\u306F\u30D5\u30A1\u30A4\u30EB\u304C\u30D0\u30A4\u30CA\u30EA\u3067\u3042\u308B\u3053\u3068\u3092\u8EE2\u9001\u7CFB\u306B\u77E5\u3089\u305B\u308B\u6163\u4F8B\n push(concat([enc.encode(`%PDF-${this.version}\\n%`), new Uint8Array([0xe2, 0xe3, 0xcf, 0xd3]), enc.encode('\\n')]));\n\n /** @type {number[]} */\n const offsets = [];\n for (let i = 1; i < this.objects.length; i++) {\n const obj = this.objects[i];\n if (!obj) throw new Error(`PDF object ${i} was reserved but never set`);\n offsets[i] = offset;\n push(`${i} 0 obj\\n${serialize(obj.value)}\\n`);\n if (obj.stream) {\n push('stream\\n');\n push(obj.stream);\n push('\\nendstream\\n');\n }\n push('endobj\\n');\n }\n\n const xrefOffset = offset;\n let xref = `xref\\n0 ${this.objects.length}\\n0000000000 65535 f \\n`;\n for (let i = 1; i < this.objects.length; i++) {\n xref += String(offsets[i]).padStart(10, '0') + ' 00000 n \\n';\n }\n push(xref);\n /** @type {{[key: string]: PdfValue}} */\n const trailer = { Size: this.objects.length, Root: rootRef };\n if (infoRef) trailer.Info = infoRef;\n push(`trailer\\n${serialize(trailer)}\\nstartxref\\n${xrefOffset}\\n%%EOF\\n`);\n\n return concat(chunks);\n }\n}\n\n/**\n * @param {Uint8Array[]} chunks\n * @returns {Uint8Array}\n */\nexport function concat(chunks) {\n let len = 0;\n for (const c of chunks) len += c.length;\n const out = new Uint8Array(len);\n let o = 0;\n for (const c of chunks) {\n out.set(c, o);\n o += c.length;\n }\n return out;\n}\n", "// @ts-check\n/**\n * \u30DA\u30FC\u30B8\u30B3\u30F3\u30C6\u30F3\u30C4\u30B9\u30C8\u30EA\u30FC\u30E0\u306E\u30D3\u30EB\u30C0\u30FC\u3002\n * \u5EA7\u6A19\u306F PDF \u5EA7\u6A19\u7CFB\uFF08\u5DE6\u4E0B\u539F\u70B9\u3001pt\uFF09\u3067\u53D7\u3051\u53D6\u308B\u3002CSS \u5EA7\u6A19\u304B\u3089\u306E\u5909\u63DB\u306F\u547C\u3073\u51FA\u3057\u5074\uFF08page.js\uFF09\u304C\u884C\u3046\u3002\n */\nimport { num } from '../units.js';\n\nexport class ContentStream {\n constructor() {\n /** @type {string[]} */\n this.ops = [];\n this.depth = 0;\n }\n\n save() {\n this.ops.push('q');\n this.depth++;\n return this;\n }\n\n restore() {\n if (this.depth <= 0) throw new Error('ContentStream: unbalanced Q');\n this.ops.push('Q');\n this.depth--;\n return this;\n }\n\n /** @param {number} a @param {number} b @param {number} c @param {number} d @param {number} e @param {number} f */\n transform(a, b, c, d, e, f) {\n this.ops.push(`${num(a)} ${num(b)} ${num(c)} ${num(d)} ${num(e)} ${num(f)} cm`);\n return this;\n }\n\n /** @param {string} gsName ExtGState \u30EA\u30BD\u30FC\u30B9\u540D */\n setGState(gsName) {\n this.ops.push(`/${gsName} gs`);\n return this;\n }\n\n /** @param {number} r @param {number} g @param {number} b */\n fillColor(r, g, b) {\n this.ops.push(`${num(r)} ${num(g)} ${num(b)} rg`);\n return this;\n }\n\n /** @param {number} r @param {number} g @param {number} b */\n strokeColor(r, g, b) {\n this.ops.push(`${num(r)} ${num(g)} ${num(b)} RG`);\n return this;\n }\n\n /** @param {number} w */\n lineWidth(w) {\n this.ops.push(`${num(w)} w`);\n return this;\n }\n\n /** @param {number[]} pattern @param {number} [phase] */\n dash(pattern, phase = 0) {\n this.ops.push(`[${pattern.map(num).join(' ')}] ${num(phase)} d`);\n return this;\n }\n\n /** @param {0|1|2} cap */\n lineCap(cap) {\n this.ops.push(`${cap} J`);\n return this;\n }\n\n /** @param {number} x @param {number} y @param {number} w @param {number} h */\n rect(x, y, w, h) {\n this.ops.push(`${num(x)} ${num(y)} ${num(w)} ${num(h)} re`);\n return this;\n }\n\n /** @param {number} x @param {number} y */\n moveTo(x, y) {\n this.ops.push(`${num(x)} ${num(y)} m`);\n return this;\n }\n\n /** @param {number} x @param {number} y */\n lineTo(x, y) {\n this.ops.push(`${num(x)} ${num(y)} l`);\n return this;\n }\n\n /**\n * 3 \u6B21\u30D9\u30B8\u30A7\u66F2\u7DDA\n * @param {number} x1 @param {number} y1 @param {number} x2 @param {number} y2 @param {number} x3 @param {number} y3\n */\n curveTo(x1, y1, x2, y2, x3, y3) {\n this.ops.push(`${num(x1)} ${num(y1)} ${num(x2)} ${num(y2)} ${num(x3)} ${num(y3)} c`);\n return this;\n }\n\n closePath() {\n this.ops.push('h');\n return this;\n }\n\n /**\n * \u89D2\u4E38\u77E9\u5F62\u306E\u30D1\u30B9\u3092\u8FFD\u52A0\u3059\u308B\uFF08PDF \u5EA7\u6A19: y \u4E0A\u5411\u304D\u3001(x, y) \u306F\u5DE6\u4E0B\uFF09\u3002\n * @param {number} x @param {number} y @param {number} w @param {number} h\n * @param {[number, number, number, number]} r [\u5DE6\u4E0A, \u53F3\u4E0A, \u53F3\u4E0B, \u5DE6\u4E0B] \u306E\u534A\u5F84\uFF08pt\uFF09\u3002CSS \u306E\u9806\u5E8F\n */\n roundedRect(x, y, w, h, r) {\n const k = 0.5523; // 4/3\u00B7(\u221A2\u22121)\n const max = Math.min(w, h) / 2;\n const clamp = (/** @type {number} */ v) => Math.max(0, Math.min(v, max));\n const tl = clamp(r[0]);\n const tr = clamp(r[1]);\n const br = clamp(r[2]);\n const bl = clamp(r[3]);\n const top = y + h;\n const right = x + w;\n // \u5DE6\u4E0A\u304B\u3089\u6642\u8A08\u56DE\u308A\uFF08PDF \u5EA7\u6A19\u3067\u306F\u4E0A\u8FBA\u304C y+h\uFF09\n this.moveTo(x + tl, top);\n this.lineTo(right - tr, top);\n if (tr) this.curveTo(right - tr + tr * k, top, right, top - tr + tr * k, right, top - tr);\n this.lineTo(right, y + br);\n if (br) this.curveTo(right, y + br - br * k, right - br + br * k, y, right - br, y);\n this.lineTo(x + bl, y);\n if (bl) this.curveTo(x + bl - bl * k, y, x, y + bl - bl * k, x, y + bl);\n this.lineTo(x, top - tl);\n if (tl) this.curveTo(x, top - tl + tl * k, x + tl - tl * k, top, x + tl, top);\n return this.closePath();\n }\n\n /**\n * \u753B\u50CF XObject \u3092 (x, y) \u3092\u5DE6\u4E0B\u3068\u3057\u3066 w\u00D7h \u3067\u63CF\u304F\u3002\n * @param {string} name @param {number} x @param {number} y @param {number} w @param {number} h\n */\n image(name, x, y, w, h) {\n this.ops.push(`q ${num(w)} 0 0 ${num(h)} ${num(x)} ${num(y)} cm /${name} Do Q`);\n return this;\n }\n\n fill() {\n this.ops.push('f');\n return this;\n }\n\n stroke() {\n this.ops.push('S');\n return this;\n }\n\n /** \u73FE\u5728\u306E\u30D1\u30B9\u3067\u30AF\u30EA\u30C3\u30D7\u3057\u3066\u65B0\u3057\u3044\u30D1\u30B9\u3092\u958B\u59CB\u3059\u308B */\n clip() {\n this.ops.push('W n');\n return this;\n }\n\n /** @param {number} x @param {number} y @param {number} w @param {number} h */\n fillRect(x, y, w, h) {\n return this.rect(x, y, w, h).fill();\n }\n\n /**\n * \u30C6\u30AD\u30B9\u30C8\u3092\u63CF\u753B\u3059\u308B\u3002\n * @param {string} fontName \u30EA\u30BD\u30FC\u30B9\u540D\uFF08F1 \u306A\u3069\uFF09\n * @param {number} size \u30D5\u30A9\u30F3\u30C8\u30B5\u30A4\u30BA (pt)\n * @param {number} x \u30D9\u30FC\u30B9\u30E9\u30A4\u30F3\u59CB\u70B9 x (pt)\n * @param {number} y \u30D9\u30FC\u30B9\u30E9\u30A4\u30F3 y (pt)\n * @param {Array<string|number>} tj TJ \u914D\u5217\u3002\u6587\u5B57\u5217\u306F 16 \u9032 CID \u5217\uFF08<...> \u306A\u3057\uFF09\u3001\u6570\u5024\u306F 1/1000 \u5358\u4F4D\u306E\u4F4D\u7F6E\u8ABF\u6574\n * @param {{charSpacing?: number, rise?: number}} [opts]\n */\n text(fontName, size, x, y, tj, opts = {}) {\n const parts = [];\n for (const t of tj) {\n if (typeof t === 'string') {\n if (t.length) parts.push(`<${t}>`);\n } else if (t !== 0) parts.push(num(t));\n }\n if (!parts.length) return this;\n this.ops.push('BT');\n this.ops.push(`/${fontName} ${num(size)} Tf`);\n if (opts.charSpacing) this.ops.push(`${num(opts.charSpacing)} Tc`);\n if (opts.rise) this.ops.push(`${num(opts.rise)} Ts`);\n this.ops.push(`1 0 0 1 ${num(x)} ${num(y)} Tm`);\n this.ops.push(`[${parts.join(' ')}] TJ`);\n this.ops.push('ET');\n return this;\n }\n\n /** @returns {Uint8Array} */\n toBytes() {\n if (this.depth !== 0) throw new Error(`ContentStream: ${this.depth} unclosed q`);\n return new TextEncoder().encode(this.ops.join('\\n') + '\\n');\n }\n}\n", "// @ts-check\n/**\n * TrueType \u30B5\u30D6\u30BB\u30C3\u30BF\u30FC\u3002\n * \u4F7F\u7528\u30B0\u30EA\u30D5\uFF08\u3068\u8907\u5408\u30B0\u30EA\u30D5\u304C\u53C2\u7167\u3059\u308B\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\uFF09\u3060\u3051\u3092\u542B\u3080\u65B0\u3057\u3044 sfnt \u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * GID \u306F 0 \u304B\u3089\u8A70\u3081\u76F4\u3055\u308C\u3001\u65E7 GID \u2192 \u65B0 GID \u306E\u5BFE\u5FDC\u8868\u3092\u8FD4\u3059\u3002\n * cmap \u306F\u51FA\u529B\u3057\u306A\u3044\uFF08PDF \u5074\u3067\u306F CIDToGIDMap /Identity \u3067 CID = \u65B0 GID \u3068\u3057\u3066\u6271\u3046\uFF09\u3002\n */\nimport { glyphData, componentGids } from './parse.js';\nimport { concat } from '../pdf/writer.js';\n\n/**\n * @typedef {object} SubsetResult\n * @property {Uint8Array} data \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3055\u308C\u305F\u30D5\u30A9\u30F3\u30C8\u30D5\u30A1\u30A4\u30EB\n * @property {Map<number, number>} gidMap \u65E7 GID \u2192 \u65B0 GID\n * @property {number[]} oldGids \u65B0 GID \u9806\u306B\u4E26\u3093\u3060\u65E7 GID\n */\n\n/**\n * @param {import('./parse.js').ParsedFont} font\n * @param {Iterable<number>} usedGids\n * @returns {SubsetResult}\n */\nexport function subsetFont(font, usedGids) {\n // 1. \u30B0\u30EA\u30D5\u96C6\u5408\u3092\u9589\u5305\u3059\u308B\uFF08\u8907\u5408\u30B0\u30EA\u30D5\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u3092\u518D\u5E30\u7684\u306B\u8FFD\u52A0\uFF09\n /** @type {Set<number>} */\n const set = new Set([0]);\n const stack = [...usedGids];\n while (stack.length) {\n const gid = /** @type {number} */ (stack.pop());\n if (gid < 0 || gid >= font.numGlyphs || set.has(gid)) continue;\n set.add(gid);\n for (const c of componentGids(glyphData(font, gid))) if (!set.has(c)) stack.push(c);\n }\n const oldGids = [...set].sort((a, b) => a - b);\n /** @type {Map<number, number>} */\n const gidMap = new Map();\n oldGids.forEach((g, i) => gidMap.set(g, i));\n const n = oldGids.length;\n\n // 2. glyf / loca\n /** @type {Uint8Array[]} */\n const glyphChunks = [];\n const loca = new Uint32Array(n + 1);\n let glyfLen = 0;\n for (let i = 0; i < n; i++) {\n let g = glyphData(font, /** @type {number} */ (oldGids[i]));\n if (g.length && new DataView(g.buffer, g.byteOffset, g.byteLength).getInt16(0) < 0) {\n g = remapComposite(g, gidMap);\n }\n loca[i] = glyfLen;\n glyphChunks.push(g);\n glyfLen += g.length;\n const pad = (4 - (glyfLen % 4)) % 4;\n if (pad) {\n glyphChunks.push(new Uint8Array(pad));\n glyfLen += pad;\n }\n }\n loca[n] = glyfLen;\n const glyf = concat(glyphChunks);\n const locaBytes = new Uint8Array(loca.length * 4);\n const ldv = new DataView(locaBytes.buffer);\n loca.forEach((v, i) => ldv.setUint32(i * 4, v));\n\n // 3. hmtx\uFF08\u5168\u30B0\u30EA\u30D5\u5206\u306E advance + lsb \u3092\u66F8\u304F\uFF09\n const origHmtx = /** @type {{offset: number, length: number}} */ (font.tables.get('hmtx'));\n const origHhea = /** @type {{offset: number, length: number}} */ (font.tables.get('hhea'));\n const fdv = new DataView(font.data.buffer, font.data.byteOffset, font.data.byteLength);\n const numberOfHMetrics = fdv.getUint16(origHhea.offset + 34);\n const hmtx = new Uint8Array(n * 4);\n const hdv = new DataView(hmtx.buffer);\n for (let i = 0; i < n; i++) {\n const old = /** @type {number} */ (oldGids[i]);\n const lsbOffset =\n old < numberOfHMetrics\n ? origHmtx.offset + old * 4 + 2\n : origHmtx.offset + numberOfHMetrics * 4 + (old - numberOfHMetrics) * 2;\n hdv.setUint16(i * 4, font.advances[old] ?? 0);\n hdv.setInt16(i * 4 + 2, lsbOffset + 2 <= font.data.byteLength ? fdv.getInt16(lsbOffset) : 0);\n }\n\n // 4. head / hhea / maxp \u3092\u30B3\u30D4\u30FC\u3057\u3066\u66F8\u304D\u63DB\u3048\n const head = copyTable(font, 'head');\n const headDv = new DataView(head.buffer);\n headDv.setUint32(8, 0); // checkSumAdjustment\uFF08\u5F8C\u3067\u8A08\u7B97\uFF09\n headDv.setInt16(50, 1); // indexToLocFormat = long\n\n const hhea = copyTable(font, 'hhea');\n new DataView(hhea.buffer).setUint16(34, n);\n\n const maxp = copyTable(font, 'maxp');\n new DataView(maxp.buffer).setUint16(4, n);\n\n // 5. \u30C6\u30FC\u30D6\u30EB\u7FA4\u3092\u7D44\u307F\u7ACB\u3066\u308B\uFF08\u30BF\u30B0\u9806\u306B\u30BD\u30FC\u30C8\uFF09\n /** @type {[string, Uint8Array][]} */\n const tables = [\n ['glyf', glyf],\n ['head', head],\n ['hhea', hhea],\n ['hmtx', hmtx],\n ['loca', locaBytes],\n ['maxp', maxp],\n ];\n for (const opt of ['cvt ', 'fpgm', 'prep']) {\n if (font.tables.has(opt)) tables.push([opt, copyTable(font, opt)]);\n }\n tables.sort((a, b) => (a[0] < b[0] ? -1 : 1));\n\n const data = buildSfnt(tables);\n return { data, gidMap, oldGids };\n}\n\n/**\n * @param {import('./parse.js').ParsedFont} font\n * @param {string} tag\n * @returns {Uint8Array}\n */\nfunction copyTable(font, tag) {\n const t = font.tables.get(tag);\n if (!t) throw new Error(`missing table ${tag}`);\n // Node \u306E Buffer \u306F slice \u304C\u30D3\u30E5\u30FC\u3092\u8FD4\u3059\u305F\u3081\u3001\u5FC5\u305A\u30B3\u30D4\u30FC\u3092\u4F5C\u308B\n return new Uint8Array(font.data.subarray(t.offset, t.offset + t.length));\n}\n\n/**\n * \u8907\u5408\u30B0\u30EA\u30D5\u5185\u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8 GID \u3092\u65B0 GID \u306B\u66F8\u304D\u63DB\u3048\u308B\u3002\n * @param {Uint8Array} g\n * @param {Map<number, number>} gidMap\n * @returns {Uint8Array}\n */\nfunction remapComposite(g, gidMap) {\n const out = new Uint8Array(g);\n const dv = new DataView(out.buffer);\n let p = 10;\n for (;;) {\n const flags = dv.getUint16(p);\n const oldGid = dv.getUint16(p + 2);\n dv.setUint16(p + 2, gidMap.get(oldGid) ?? 0);\n p += 4;\n p += flags & 0x0001 ? 4 : 2;\n if (flags & 0x0008) p += 2;\n else if (flags & 0x0040) p += 4;\n else if (flags & 0x0080) p += 8;\n if (!(flags & 0x0020)) break;\n if (p >= out.length) break;\n }\n return out;\n}\n\n/**\n * \u30C6\u30FC\u30D6\u30EB\u7FA4\u304B\u3089 sfnt \u30D5\u30A1\u30A4\u30EB\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * @param {[string, Uint8Array][]} tables \u30BF\u30B0\u9806\u306B\u30BD\u30FC\u30C8\u6E08\u307F\n * @returns {Uint8Array}\n */\nfunction buildSfnt(tables) {\n const numTables = tables.length;\n let entrySelector = 0;\n while (1 << (entrySelector + 1) <= numTables) entrySelector++;\n const searchRange = (1 << entrySelector) * 16;\n const rangeShift = numTables * 16 - searchRange;\n\n const dirLen = 12 + numTables * 16;\n let offset = dirLen;\n /** @type {{tag: string, data: Uint8Array, offset: number, checksum: number}[]} */\n const entries = [];\n for (const [tag, data] of tables) {\n entries.push({ tag, data, offset, checksum: checksum(data) });\n offset += (data.length + 3) & ~3;\n }\n\n const out = new Uint8Array(offset);\n const dv = new DataView(out.buffer);\n dv.setUint32(0, 0x00010000);\n dv.setUint16(4, numTables);\n dv.setUint16(6, searchRange);\n dv.setUint16(8, entrySelector);\n dv.setUint16(10, rangeShift);\n entries.forEach((e, i) => {\n const p = 12 + i * 16;\n for (let k = 0; k < 4; k++) out[p + k] = e.tag.charCodeAt(k);\n dv.setUint32(p + 4, e.checksum);\n dv.setUint32(p + 8, e.offset);\n dv.setUint32(p + 12, e.data.length);\n out.set(e.data, e.offset);\n });\n\n // head.checkSumAdjustment = 0xB1B0AFBA - checksum(whole font)\n const headEntry = entries.find((e) => e.tag === 'head');\n if (headEntry) {\n const total = checksum(out);\n dv.setUint32(headEntry.offset + 8, (0xb1b0afba - total) >>> 0);\n }\n return out;\n}\n\n/**\n * @param {Uint8Array} data\n * @returns {number}\n */\nfunction checksum(data) {\n let sum = 0;\n const n = data.length;\n for (let i = 0; i < n; i += 4) {\n const b0 = data[i] ?? 0;\n const b1 = data[i + 1] ?? 0;\n const b2 = data[i + 2] ?? 0;\n const b3 = data[i + 3] ?? 0;\n sum = (sum + (((b0 << 24) | (b1 << 16) | (b2 << 8) | b3) >>> 0)) >>> 0;\n }\n return sum;\n}\n", "// @ts-check\n/**\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3057\u305F TrueType \u3092 PDF \u306E Type0 / CIDFontType2 \u3068\u3057\u3066\u57CB\u3081\u8FBC\u3080\u3002\n * CID = \u30B5\u30D6\u30BB\u30C3\u30C8\u5F8C\u306E GID\uFF08CIDToGIDMap /Identity\uFF09\u3001\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u306F Identity-H\u3002\n * ToUnicode CMap \u3092\u5FC5\u305A\u4ED8\u3051\u3066\u30C6\u30AD\u30B9\u30C8\u9078\u629E\u30FB\u691C\u7D22\u30FB\u30B3\u30D4\u30FC\u3092\u4FDD\u8A3C\u3059\u308B\u3002\n */\nimport { Raw } from '../pdf/writer.js';\nimport { subsetFont } from './subset.js';\n\n/**\n * PDF \u306B\u57CB\u3081\u8FBC\u3080 1 \u30D5\u30A9\u30F3\u30C8\u5206\u306E\u4F7F\u7528\u72B6\u6CC1\u3002\n * \u8D70\u67FB\u4E2D\u306B addGlyph \u3067\u30B0\u30EA\u30D5\u3092\u96C6\u3081\u3001\u6700\u5F8C\u306B embed \u3067 PDF \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u751F\u6210\u3059\u308B\u3002\n */\nexport class EmbeddedFont {\n /**\n * @param {import('./parse.js').ParsedFont} font\n * @param {string} resourceName \u30DA\u30FC\u30B8\u30EA\u30BD\u30FC\u30B9\u540D\uFF08F1 \u306A\u3069\uFF09\n */\n constructor(font, resourceName) {\n this.font = font;\n this.resourceName = resourceName;\n /** @type {Map<number, number>} \u65E7 GID \u2192 \u4EE3\u8868\u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08ToUnicode \u7528\uFF09 */\n this.usedGids = new Map();\n /** @type {import('./subset.js').SubsetResult|null} */\n this.subset = null;\n }\n\n /**\n * @param {number} gid \u65E7 GID\n * @param {number} codePoint\n */\n addGlyph(gid, codePoint) {\n if (!this.usedGids.has(gid)) this.usedGids.set(gid, codePoint);\n }\n\n /**\n * \u65E7 GID \u3092 PDF \u4E0A\u306E CID\uFF08\u30B5\u30D6\u30BB\u30C3\u30C8\u5F8C GID\uFF09\u3078\u5909\u63DB\u3059\u308B\u3002embed \u5F8C\u306B\u306E\u307F\u6709\u52B9\u3002\n * @param {number} gid\n * @returns {number}\n */\n cid(gid) {\n if (!this.subset) throw new Error('EmbeddedFont: embed() must be called before cid()');\n return this.subset.gidMap.get(gid) ?? 0;\n }\n\n /**\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u5316\u3092\u78BA\u5B9A\u3055\u305B\u308B\u3002\u4EE5\u5F8C cid() \u304C\u4F7F\u3048\u308B\u3002\n */\n finalize() {\n if (!this.subset) this.subset = subsetFont(this.font, this.usedGids.keys());\n return this.subset;\n }\n\n /**\n * PDF \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u7FA4\u3092\u66F8\u304D\u8FBC\u307F\u3001Type0 \u30D5\u30A9\u30F3\u30C8\u8F9E\u66F8\u3078\u306E\u53C2\u7167\u3092\u8FD4\u3059\u3002\n * @param {import('../pdf/writer.js').PdfWriter} writer\n * @returns {Promise<import('../pdf/writer.js').Ref>}\n */\n async embed(writer) {\n const subset = this.finalize();\n const f = this.font;\n const scale = 1000 / f.unitsPerEm;\n const tag = subsetTag(this.usedGids);\n const baseFont = `${tag}+${f.postScriptName}`;\n\n const fontFile = await writer.addStream({ Length1: subset.data.length }, subset.data);\n\n // \u30D5\u30E9\u30B0: bit 3 (Symbolic) \u3092\u7ACB\u3066\u308B\u3002Nonsymbolic \u3068\u6392\u4ED6\u3002Italic \u306F bit 7\u3001ForceBold \u306F bit 19\u3002\n let flags = 4;\n if (f.italic) flags |= 1 << 6;\n if (f.bold) flags |= 1 << 18;\n\n const descriptor = writer.add({\n Type: 'FontDescriptor',\n FontName: baseFont,\n Flags: flags,\n FontBBox: f.bbox.map((v) => Math.round(v * scale)),\n ItalicAngle: f.italicAngle,\n Ascent: Math.round(f.ascender * scale),\n Descent: Math.round(f.descender * scale),\n CapHeight: Math.round(f.capHeight * scale),\n StemV: f.bold ? 120 : 80,\n FontFile2: fontFile,\n });\n\n // W \u914D\u5217: \u9023\u7D9A CID \u3092\u307E\u3068\u3081\u308B c [w1 w2 ...] \u5F62\u5F0F\n /** @type {import('../pdf/writer.js').PdfValue[]} */\n const W = [];\n const widths = subset.oldGids.map((g) => Math.round((f.advances[g] ?? 0) * scale));\n let i = 0;\n while (i < widths.length) {\n let j = i;\n while (j + 1 < widths.length && j - i < 100) j++;\n W.push(i, widths.slice(i, j + 1));\n i = j + 1;\n }\n\n const cidFont = writer.add({\n Type: 'Font',\n Subtype: 'CIDFontType2',\n BaseFont: baseFont,\n CIDSystemInfo: { Registry: new Raw('(Adobe)'), Ordering: new Raw('(Identity)'), Supplement: 0 },\n FontDescriptor: descriptor,\n DW: 1000,\n W,\n CIDToGIDMap: 'Identity',\n });\n\n const toUnicode = await writer.addStream({}, buildToUnicode(subset, this.usedGids));\n\n return writer.add({\n Type: 'Font',\n Subtype: 'Type0',\n BaseFont: baseFont,\n Encoding: 'Identity-H',\n DescendantFonts: [cidFont],\n ToUnicode: toUnicode,\n });\n }\n}\n\n/**\n * \u30B5\u30D6\u30BB\u30C3\u30C8\u30D5\u30A9\u30F3\u30C8\u540D\u306E\u63A5\u982D\u8F9E\uFF086 \u6587\u5B57\u306E\u5927\u6587\u5B57\uFF09\u3002\u4F7F\u7528\u30B0\u30EA\u30D5\u96C6\u5408\u304B\u3089\u6C7A\u5B9A\u7684\u306B\u751F\u6210\u3059\u308B\u3002\n * @param {Map<number, number>} usedGids\n * @returns {string}\n */\nfunction subsetTag(usedGids) {\n let h = 2166136261;\n for (const g of usedGids.keys()) {\n h ^= g;\n h = Math.imul(h, 16777619) >>> 0;\n }\n let tag = '';\n for (let i = 0; i < 6; i++) {\n tag += String.fromCharCode(65 + (h % 26));\n h = Math.floor(h / 26);\n }\n return tag;\n}\n\n/**\n * ToUnicode CMap\uFF08bfchar \u5F62\u5F0F\uFF09\u3092\u751F\u6210\u3059\u308B\u3002\n * @param {import('./subset.js').SubsetResult} subset\n * @param {Map<number, number>} usedGids \u65E7 GID \u2192 \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\n * @returns {Uint8Array}\n */\nfunction buildToUnicode(subset, usedGids) {\n /** @type {string[]} */\n const entries = [];\n subset.oldGids.forEach((oldGid, cid) => {\n const cp = usedGids.get(oldGid);\n if (cp === undefined) return;\n entries.push(`<${hex4(cid)}> <${utf16Hex(cp)}>`);\n });\n\n let body = '';\n for (let i = 0; i < entries.length; i += 100) {\n const chunk = entries.slice(i, i + 100);\n body += `${chunk.length} beginbfchar\\n${chunk.join('\\n')}\\nendbfchar\\n`;\n }\n\n const cmap =\n `/CIDInit /ProcSet findresource begin\\n` +\n `12 dict begin\\nbegincmap\\n` +\n `/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def\\n` +\n `/CMapName /Adobe-Identity-UCS def\\n/CMapType 2 def\\n` +\n `1 begincodespacerange\\n<0000> <FFFF>\\nendcodespacerange\\n` +\n body +\n `endcmap\\nCMapName currentdict /CMap defineresource pop\\nend\\nend\\n`;\n return new TextEncoder().encode(cmap);\n}\n\n/** @param {number} n */\nexport function hex4(n) {\n return n.toString(16).toUpperCase().padStart(4, '0');\n}\n\n/**\n * \u30B3\u30FC\u30C9\u30DD\u30A4\u30F3\u30C8\u3092 UTF-16BE \u306E 16 \u9032\u8868\u8A18\u306B\u3059\u308B\uFF08\u30B5\u30ED\u30B2\u30FC\u30C8\u30DA\u30A2\u5BFE\u5FDC\uFF09\u3002\n * @param {number} cp\n */\nfunction utf16Hex(cp) {\n if (cp <= 0xffff) return hex4(cp);\n const v = cp - 0x10000;\n return hex4(0xd800 + (v >> 10)) + hex4(0xdc00 + (v & 0x3ff));\n}\n\n", "// @ts-check\n/**\n * \u30C7\u30B3\u30FC\u30C9\u6E08\u307F\u753B\u50CF\u3092 PDF \u306E Image XObject \u3068\u3057\u3066\u66F8\u304D\u51FA\u3059\u3002\n */\n\n/**\n * @param {import('../pdf/writer.js').PdfWriter} writer\n * @param {import('../walker/image.js').DecodedImage} img\n * @returns {Promise<import('../pdf/writer.js').Ref>}\n */\nexport async function embedImage(writer, img) {\n /** @type {{[key: string]: import('../pdf/writer.js').PdfValue}} */\n const dict = {\n Type: 'XObject',\n Subtype: 'Image',\n Width: img.width,\n Height: img.height,\n ColorSpace: 'DeviceRGB',\n BitsPerComponent: 8,\n };\n if (img.jpeg) {\n dict.Filter = 'DCTDecode';\n return writer.addStream(dict, img.jpeg, { compress: false });\n }\n if (!img.rgb) throw new Error('embedImage: image has no pixel data');\n if (img.alpha) {\n dict.SMask = await writer.addStream(\n { Type: 'XObject', Subtype: 'Image', Width: img.width, Height: img.height, ColorSpace: 'DeviceGray', BitsPerComponent: 8 },\n img.alpha,\n );\n }\n return writer.addStream(dict, img.rgb);\n}\n", "// @ts-check\n/**\n * Paginator \u2014 \u8D70\u67FB\u7D50\u679C\uFF08\u30A2\u30C8\u30E0\u30FB\u5F37\u5236\u6539\u30DA\u30FC\u30B8\u30FB\u30C6\u30FC\u30D6\u30EB\uFF09\u304B\u3089\u5404\u30DA\u30FC\u30B8\u306E\u7E26\u7BC4\u56F2\u3092\u6C7A\u3081\u308B\u3002\n *\n * \u65B9\u91DD: \u547D\u4EE4\u306F\u52D5\u304B\u3055\u305A\u3001\u30DA\u30FC\u30B8\u3054\u3068\u306B\u300C\u3053\u306E y \u7BC4\u56F2\u3092\u63CF\u304F\u300D\u3068\u6C7A\u3081\u308B\u3060\u3051\u306B\u3059\u308B\u3002\n * \u5883\u754C\u306F\u3001\u30A2\u30C8\u30E0\uFF08\u30C6\u30AD\u30B9\u30C8\u884C\u30FB\u8868\u306E\u884C\u30FB\u753B\u50CF\u30FBbreak-inside: avoid\uFF09\u3092\u8DE8\u304C\u306A\u3044\u4F4D\u7F6E\u307E\u3067\u4E0A\u3078\u623B\u3059\u3002\n * \u30C6\u30FC\u30D6\u30EB\u304C\u6B21\u30DA\u30FC\u30B8\u3078\u7D9A\u304F\u3068\u304D\u306F thead \u3092\u5404\u30DA\u30FC\u30B8\u5148\u982D\u3067\u7E70\u308A\u8FD4\u3057\u3001\u305D\u306E\u9AD8\u3055\u5206\u3060\u3051\u672C\u6587\u3092\u4E0B\u3052\u308B\u3002\n */\n\n/**\n * @typedef {object} RepeatedHead\n * @property {import('./walker/walk.js').TableInfo} table\n * @property {number} shift \u3053\u306E\u30DA\u30FC\u30B8\u3067 thead \u3092\u63CF\u304F\u4F4D\u7F6E\uFF08\u30DA\u30FC\u30B8\u5148\u982D\u304B\u3089\u306E px \u30AA\u30D5\u30BB\u30C3\u30C8\uFF09\n *\n * @typedef {object} PageRange\n * @property {number} start \u672C\u6587\u306E\u63CF\u304D\u59CB\u3081 y\uFF08\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 px\uFF09\n * @property {number} end \u672C\u6587\u306E\u63CF\u304D\u7D42\u308F\u308A y\uFF08\u3053\u306E\u5024\u672A\u6E80\u3092\u63CF\u304F\uFF09\n * @property {RepeatedHead[]} heads \u30DA\u30FC\u30B8\u5148\u982D\u3067\u7E70\u308A\u8FD4\u3059 thead\n * @property {number} headShift \u7E70\u308A\u8FD4\u3057 thead \u306E\u5408\u8A08\u9AD8\u3055\uFF08\u672C\u6587\u306F\u3053\u306E\u5206\u3060\u3051\u4E0B\u304C\u308B\uFF09\n * @property {RepeatedHead[]} feet \u30DA\u30FC\u30B8\u672B\u5C3E\u3067\u7E70\u308A\u8FD4\u3059 tfoot\uFF08\u8868\u304C\u6B21\u30DA\u30FC\u30B8\u3078\u7D9A\u304F\u3068\u304D\uFF09\n * @property {number} footShift \u7E70\u308A\u8FD4\u3057 tfoot \u306E\u5408\u8A08\u9AD8\u3055\uFF08\u672C\u6587\u9818\u57DF\u306F\u3053\u306E\u5206\u3060\u3051\u7E2E\u3080\uFF09\n */\n\n/**\n * @param {import('./walker/walk.js').WalkResult} walk\n * @param {number} pageHeightPx \u672C\u6587\u9818\u57DF\u306E\u9AD8\u3055\uFF08px\uFF09\n * @returns {PageRange[]}\n */\nexport function paginate(walk, pageHeightPx) {\n const H = pageHeightPx;\n const total = walk.height;\n const atoms = [...walk.atoms].sort((a, b) => a.top - b.top);\n const breaks = [...new Set(walk.breaks)].sort((a, b) => a - b);\n const EPS = 0.01;\n\n /** @type {PageRange[]} */\n const pages = [];\n let start = 0;\n let guard = 0;\n while (start < total - EPS && guard++ < 10000) {\n // \u3053\u306E\u30DA\u30FC\u30B8\u306E\u5148\u982D\u3067\u7E70\u308A\u8FD4\u3059 thead: \u30DA\u30FC\u30B8\u958B\u59CB\u4F4D\u7F6E\u304C\u8868\u306E\u9014\u4E2D\u306B\u3042\u308A\u3001thead \u304C\u65E2\u306B\u524D\u30DA\u30FC\u30B8\u3067\u63CF\u304B\u308C\u3066\u3044\u308B\u8868\n /** @type {RepeatedHead[]} */\n const heads = [];\n let headShift = 0;\n for (const t of walk.tables) {\n if (t.headItems.length && t.headBottom <= start + EPS && start < t.bottom - EPS) {\n heads.push({ table: t, shift: headShift });\n headShift += t.headBottom - t.headTop;\n }\n }\n // tfoot \u306E\u7E70\u308A\u8FD4\u3057\u306F\u300C\u3053\u306E\u30DA\u30FC\u30B8\u3067\u8868\u304C\u7D42\u308F\u3089\u306A\u3044\u300D\u3068\u304D\u3060\u3051\u5FC5\u8981\u3067\u3001\u305D\u308C\u306F end \u306B\u4F9D\u5B58\u3059\u308B\u3002\n // \u307E\u305A tfoot \u7121\u3057\u3067 end \u3092\u6C42\u3081\u3001\u7E70\u308A\u8FD4\u3057\u304C\u5FC5\u8981\u306A\u8868\u304C\u3042\u308C\u3070\u5BB9\u91CF\u3092\u6E1B\u3089\u3057\u3066\u8A08\u7B97\u3057\u76F4\u3059\uFF08\u6570\u56DE\u3067\u53CE\u675F\u3059\u308B\uFF09\u3002\n /** @type {RepeatedHead[]} */\n let feet = [];\n let footShift = 0;\n let end = start;\n for (let pass = 0; pass < 4; pass++) {\n const capacity = Math.max(H - headShift - footShift, H * 0.25); // thead/tfoot \u304C\u7570\u5E38\u306B\u9AD8\u3044\u5834\u5408\u306E\u4E0B\u9650\n end = computeEnd(start, capacity);\n /** @type {RepeatedHead[]} */\n const needed = [];\n let shift = 0;\n for (const t of walk.tables) {\n // \u8868\u304C\u3053\u306E\u30DA\u30FC\u30B8\u306E\u9014\u4E2D\u304B\u3089\u59CB\u307E\u308B\u30FB\u307E\u305F\u306F\u7D9A\u3044\u3066\u3044\u3066\u3001\u304B\u3064\u3053\u306E\u30DA\u30FC\u30B8\u3067\u7D42\u308F\u3089\u306A\u3044\uFF08\u672C\u6765\u306E tfoot \u304C\u6B21\u30DA\u30FC\u30B8\u4EE5\u964D\uFF09\n if (t.footItems.length && t.top < end - EPS && t.footTop >= end - EPS && t.bottom > end + EPS) {\n needed.push({ table: t, shift });\n shift += t.footBottom - t.footTop;\n }\n }\n const same = needed.length === feet.length && needed.every((n, i) => n.table === feet[i]?.table);\n feet = needed;\n footShift = shift;\n if (same) break;\n }\n\n pages.push({ start, end, heads, headShift, feet, footShift });\n start = end;\n }\n if (!pages.length) pages.push({ start: 0, end: Math.max(total, 1), heads: [], headShift: 0, feet: [], footShift: 0 });\n return pages;\n\n /**\n * start \u304B\u3089\u5BB9\u91CF capacity \u306E\u30DA\u30FC\u30B8\u306E\u7D42\u7AEF\u3092\u3001\u5F37\u5236\u6539\u30DA\u30FC\u30B8\u3068\u30A2\u30C8\u30E0\u3092\u8003\u616E\u3057\u3066\u6C7A\u3081\u308B\u3002\n * @param {number} start\n * @param {number} capacity\n */\n function computeEnd(start, capacity) {\n let end = Math.min(start + capacity, total);\n\n // \u5F37\u5236\u6539\u30DA\u30FC\u30B8: (start, end) \u306E\u4E2D\u3067\u6700\u521D\u306E\u3082\u306E\n for (const b of breaks) {\n if (b > start + EPS && b < end - EPS) {\n end = b;\n break;\n }\n }\n\n // \u30A2\u30C8\u30E0\u3092\u8DE8\u304C\u306A\u3044\u4F4D\u7F6E\u307E\u3067\u5883\u754C\u3092\u4E0A\u3052\u308B\uFF08\u4ED6\u306E\u30A2\u30C8\u30E0\u306B\u9023\u9396\u3059\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u7E70\u308A\u8FD4\u3059\uFF09\n if (end < total - EPS) {\n let moved = true;\n let iter = 0;\n while (moved && iter++ < 1000) {\n moved = false;\n for (const a of atoms) {\n if (a.top >= end) break;\n // \u30DA\u30FC\u30B8\u5BB9\u91CF\u3088\u308A\u5927\u304D\u3044\u30A2\u30C8\u30E0\u306F\u3069\u3053\u304B\u3067\u5207\u3089\u3056\u308B\u3092\u5F97\u306A\u3044\u306E\u3067\u7121\u8996\u3059\u308B\n if (a.bottom - a.top > capacity) continue;\n if (a.top < end - EPS && a.bottom > end + EPS && a.top > start + EPS) {\n end = a.top;\n moved = true;\n }\n }\n }\n // \u4E0A\u3052\u904E\u304E\u3066\u7A7A\u30DA\u30FC\u30B8\u306B\u306A\u308B\u5834\u5408\uFF08\u30DA\u30FC\u30B8\u3088\u308A\u5927\u304D\u3044\u30A2\u30C8\u30E0\uFF09\u306F\u5BB9\u91CF\u3044\u3063\u3071\u3044\u3067\u5207\u308B\n if (end <= start + EPS) end = Math.min(start + capacity, total);\n }\n return end;\n }\n}\n", "// @ts-check\n/**\n * DisplayList \u3092\u7528\u7D19\u306B\u5272\u308A\u4ED8\u3051\u3001PDF \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3002\n * \u30DA\u30FC\u30B8\u7BC4\u56F2\u306E\u6C7A\u5B9A\u306F paginate.js\u3001\u3053\u3053\u3067\u306F\u5404\u30DA\u30FC\u30B8\u306B\u300C\u672C\u6587\uFF08\u7BC4\u56F2\u6307\u5B9A\uFF09\u30FB\u7E70\u308A\u8FD4\u3057 thead\u30FB\u30D8\u30C3\u30C0\u30FC\u30FB\u30D5\u30C3\u30BF\u30FC\u300D\u3092\u63CF\u304F\u3002\n */\nimport { PdfWriter, pdfString, pdfDate, Name } from './pdf/writer.js';\nimport { ContentStream } from './pdf/content.js';\nimport { EmbeddedFont, hex4 } from './font/cid.js';\nimport { embedImage } from './pdf/image.js';\nimport { PX_TO_PT, PAGE_SIZES, lengthToPt, num } from './units.js';\nimport { paginate } from './paginate.js';\n\n/**\n * @typedef {object} PageGeometry\n * @property {number} width pt\n * @property {number} height pt\n * @property {number} top pt \u4E0A\u4F59\u767D\n * @property {number} right pt\n * @property {number} bottom pt \u4E0B\u4F59\u767D\n * @property {number} left pt\n */\n\n/**\n * @typedef {object} PageDecoration \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\uFF08\u30DA\u30FC\u30B8\u3054\u3068\u306B\u63CF\u753B\u6E08\u307F\u306E\u8D70\u67FB\u7D50\u679C\uFF09\n * @property {number} heightPx\n * @property {(pageNumber: number, totalPages: number) => Promise<import('./walker/walk.js').WalkResult>} render\n */\n\n/**\n * @param {import('./index.js').PageOptions|undefined} page\n * @returns {PageGeometry}\n */\nexport function resolvePage(page = {}) {\n const sizeOpt = page.size ?? 'A4';\n let width;\n let height;\n if (typeof sizeOpt === 'string') {\n const s = PAGE_SIZES[sizeOpt];\n if (!s) throw new Error(`Unknown page size \"${sizeOpt}\". Use one of ${Object.keys(PAGE_SIZES).join(', ')} or {width, height}.`);\n width = s.width;\n height = s.height;\n } else {\n width = lengthToPt(sizeOpt.width);\n height = lengthToPt(sizeOpt.height);\n }\n if ((page.orientation ?? 'portrait') === 'landscape' && width < height) [width, height] = [height, width];\n\n const m = page.margin ?? '15mm';\n const margins =\n typeof m === 'string'\n ? { top: lengthToPt(m), right: lengthToPt(m), bottom: lengthToPt(m), left: lengthToPt(m) }\n : { top: lengthToPt(m.top), right: lengthToPt(m.right), bottom: lengthToPt(m.bottom), left: lengthToPt(m.left) };\n return { width, height, ...margins };\n}\n\n/**\n * @param {import('./walker/walk.js').WalkResult} body\n * @param {PageGeometry} geo\n * @param {{compress: boolean, metadata?: import('./index.js').PdfMetadata, header?: PageDecoration|null, footer?: PageDecoration|null}} opts\n * @returns {Promise<Uint8Array>}\n */\nexport async function buildPdf(body, geo, opts) {\n const writer = new PdfWriter({ compress: opts.compress });\n const headerPt = (opts.header?.heightPx ?? 0) * PX_TO_PT;\n const footerPt = (opts.footer?.heightPx ?? 0) * PX_TO_PT;\n const contentW = geo.width - geo.left - geo.right;\n const contentTop = geo.height - geo.top - headerPt; // \u672C\u6587\u9818\u57DF\u306E\u4E0A\u7AEF\uFF08PDF \u5EA7\u6A19\uFF09\n const contentH = geo.height - geo.top - geo.bottom - headerPt - footerPt;\n if (contentH <= 0) throw new Error('Page content area is empty: margins + header + footer exceed the page height');\n const contentHpx = contentH / PX_TO_PT;\n\n // 1. \u30DA\u30FC\u30B8\u7BC4\u56F2\u3092\u6C7A\u3081\u308B\n const ranges = paginate(body, contentHpx);\n const totalPages = ranges.length;\n\n // 2. \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\u3092\u30DA\u30FC\u30B8\u3054\u3068\u306B\u63CF\u753B\u3057\u3066\u8D70\u67FB\u7D50\u679C\u3092\u5F97\u308B\n /** @type {(import('./walker/walk.js').WalkResult|null)[]} */\n const headers = [];\n /** @type {(import('./walker/walk.js').WalkResult|null)[]} */\n const footers = [];\n for (let p = 0; p < totalPages; p++) {\n headers.push(opts.header ? await opts.header.render(p + 1, totalPages) : null);\n footers.push(opts.footer ? await opts.footer.render(p + 1, totalPages) : null);\n }\n\n // 3. \u30D5\u30A9\u30F3\u30C8\u30FB\u753B\u50CF\u306E\u4F7F\u7528\u3092\u96C6\u3081\u308B\n /** @type {Map<import('./font/registry.js').RegisteredFont, EmbeddedFont>} */\n const fonts = new Map();\n /** @type {Map<string, {name: string, image: import('./walker/image.js').DecodedImage}>} */\n const images = new Map();\n const collect = (/** @type {import('./walker/walk.js').DisplayItem[]} */ list) => {\n for (const it of list) {\n if (it.type === 'text') {\n let ef = fonts.get(it.font);\n if (!ef) {\n ef = new EmbeddedFont(it.font.parsed, `F${fonts.size + 1}`);\n fonts.set(it.font, ef);\n }\n for (const g of it.glyphs) ef.addGlyph(g.gid, g.cp);\n } else if (it.type === 'image') {\n if (!images.has(it.image.key)) images.set(it.image.key, { name: `Im${images.size + 1}`, image: it.image });\n } else if (it.type === 'group' || it.type === 'clip') {\n collect(it.items);\n }\n }\n };\n collect(body.items);\n for (const w of [...headers, ...footers]) if (w) collect(w.items);\n for (const ef of fonts.values()) ef.finalize();\n\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const fontDict = {};\n for (const ef of fonts.values()) fontDict[ef.resourceName] = await ef.embed(writer);\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const xobjDict = {};\n for (const im of images.values()) xobjDict[im.name] = await embedImage(writer, im.image);\n\n // ExtGState\uFF08\u900F\u660E\u5EA6\uFF09\n /** @type {Map<string, string>} */\n const gstates = new Map();\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const gstateDict = {};\n const gsName = (/** @type {number} */ a) => {\n const key = num(a);\n let name = gstates.get(key);\n if (!name) {\n name = `GS${gstates.size + 1}`;\n gstates.set(key, name);\n gstateDict[name] = writer.add({ Type: 'ExtGState', ca: a, CA: a });\n }\n return name;\n };\n\n const pagesRef = writer.reserve();\n /** @type {import('./pdf/writer.js').Ref[]} */\n const pageRefs = [];\n\n // 4. \u30DA\u30FC\u30B8\u3054\u3068\u306B\u63CF\u753B\n for (let p = 0; p < totalPages; p++) {\n const range = /** @type {import('./paginate.js').PageRange} */ (ranges[p]);\n const cs = new ContentStream();\n const painter = new Painter(cs, geo, fonts, images, gsName);\n\n // \u672C\u6587: \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y = range.start \u304C\u672C\u6587\u9818\u57DF\u306E\u4E0A\u7AEF + \u7E70\u308A\u8FD4\u3057 thead \u306E\u9AD8\u3055 \u306B\u6765\u308B\n const bodyShiftPt = range.headShift * PX_TO_PT;\n const footShiftPt = range.footShift * PX_TO_PT;\n cs.save();\n cs.rect(geo.left, contentTop - contentH + footShiftPt, contentW, contentH - bodyShiftPt - footShiftPt).clip();\n painter.setOrigin(contentTop - bodyShiftPt, range.start);\n painter.render(body.items, range);\n cs.restore();\n\n // \u7E70\u308A\u8FD4\u3057 tfoot: \u30D6\u30E9\u30A6\u30B6\u306E\u5370\u5237\u3068\u540C\u3058\u304F\u3001\u3053\u306E\u30DA\u30FC\u30B8\u306B\u8F09\u3063\u305F\u6700\u5F8C\u306E\u884C\u306E\u76F4\u4E0B\u306B\u7F6E\u304F\n const bodyEndPt = contentTop - bodyShiftPt - (range.end - range.start) * PX_TO_PT;\n for (const f of range.feet) {\n const fPt = (f.table.footBottom - f.table.footTop) * PX_TO_PT;\n const bottomPt = bodyEndPt - f.shift * PX_TO_PT - fPt;\n cs.save();\n cs.rect(geo.left, bottomPt, contentW, fPt).clip();\n painter.setOrigin(bottomPt + fPt, f.table.footTop);\n painter.render(f.table.footItems);\n cs.restore();\n }\n\n // \u7E70\u308A\u8FD4\u3057 thead\n for (const h of range.heads) {\n cs.save();\n const hPt = (h.table.headBottom - h.table.headTop) * PX_TO_PT;\n cs.rect(geo.left, contentTop - h.shift * PX_TO_PT - hPt, contentW, hPt).clip();\n painter.setOrigin(contentTop - h.shift * PX_TO_PT, h.table.headTop);\n painter.render(h.table.headItems);\n cs.restore();\n }\n\n // \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\n const header = headers[p];\n if (header) {\n cs.save();\n cs.rect(geo.left, geo.height - geo.top - headerPt, contentW, headerPt).clip();\n painter.setOrigin(geo.height - geo.top, 0);\n painter.render(header.items);\n cs.restore();\n }\n const footer = footers[p];\n if (footer) {\n cs.save();\n cs.rect(geo.left, geo.bottom, contentW, footerPt).clip();\n painter.setOrigin(geo.bottom + footerPt, 0);\n painter.render(footer.items);\n cs.restore();\n }\n\n const contentRef = await writer.addStream({}, cs.toBytes());\n pageRefs.push(\n writer.add({\n Type: 'Page',\n Parent: pagesRef,\n MediaBox: [0, 0, geo.width, geo.height],\n Resources: {\n Font: fontDict,\n XObject: xobjDict,\n ExtGState: gstateDict,\n ProcSet: [new Name('PDF'), new Name('Text'), new Name('ImageC')],\n },\n Contents: contentRef,\n }),\n );\n }\n\n writer.set(pagesRef, { Type: 'Pages', Kids: pageRefs, Count: pageRefs.length });\n const catalog = writer.add({ Type: 'Catalog', Pages: pagesRef });\n\n const md = opts.metadata ?? {};\n /** @type {{[key: string]: import('./pdf/writer.js').PdfValue}} */\n const info = {\n Producer: pdfString('receipt-html-to-pdf'),\n Creator: pdfString(md.creator ?? 'receipt-html-to-pdf'),\n CreationDate: pdfDate(md.creationDate ?? new Date()),\n };\n if (md.title) info.Title = pdfString(md.title);\n if (md.author) info.Author = pdfString(md.author);\n if (md.subject) info.Subject = pdfString(md.subject);\n if (md.keywords) info.Keywords = pdfString(md.keywords);\n const infoRef = writer.add(info);\n\n return writer.build(catalog, infoRef);\n}\n\n/**\n * \u547D\u4EE4\u304C\u30DA\u30FC\u30B8\u7BC4\u56F2 [start, end) \u306B\u5C5E\u3059\u308B\u304B\u3002\n * \u30C6\u30AD\u30B9\u30C8\u306F\u884C\u304C\u5206\u5272\u3055\u308C\u306A\u3044\u524D\u63D0\u3067\u884C\u306E\u4E2D\u5FC3\u4F4D\u7F6E\u3067\u5224\u5B9A\u3057\uFF08\u30AF\u30EA\u30C3\u30D7\u3067\u6D88\u3048\u305F\u6587\u5B57\u304C\u62BD\u51FA\u30C6\u30AD\u30B9\u30C8\u306B\u6B8B\u3089\u306A\u3044\u3088\u3046\u306B\uFF09\u3001\n * \u77E9\u5F62\u30FB\u7DDA\u30FB\u753B\u50CF\u30FB\u30B0\u30EB\u30FC\u30D7\u306F\u7BC4\u56F2\u3068\u91CD\u306A\u308C\u3070\u542B\u3081\u308B\uFF08\u898B\u3048\u306A\u3044\u90E8\u5206\u306F\u30AF\u30EA\u30C3\u30D7\u3055\u308C\u308B\uFF09\u3002\n * @param {import('./walker/walk.js').DisplayItem} it\n * @param {{start: number, end: number}} range\n */\nfunction inRange(it, range) {\n const EPS = 0.01;\n if (it.type === 'text') {\n const mid = (it.top + it.bottom) / 2;\n return mid >= range.start - EPS && mid < range.end - EPS;\n }\n return itemBottom(it) > range.start + EPS && itemTop(it) < range.end - EPS;\n}\n\n/**\n * DisplayList \u3092 PDF \u30B3\u30F3\u30C6\u30F3\u30C4\u30B9\u30C8\u30EA\u30FC\u30E0\u3078\u63CF\u304F\u3002\n * setOrigin() \u3067\u300C\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 y = docY \u3092 PDF \u306E y = pdfY \u306B\u7F6E\u304F\u300D\u5BFE\u5FDC\u3092\u5207\u308A\u66FF\u3048\u308B\u3002\n */\nclass Painter {\n /**\n * @param {ContentStream} cs\n * @param {PageGeometry} geo\n * @param {Map<import('./font/registry.js').RegisteredFont, EmbeddedFont>} fonts\n * @param {Map<string, {name: string, image: import('./walker/image.js').DecodedImage}>} images\n * @param {(alpha: number) => string} gsName\n */\n constructor(cs, geo, fonts, images, gsName) {\n this.cs = cs;\n this.geo = geo;\n this.fonts = fonts;\n this.images = images;\n this.gsName = gsName;\n this.pdfTop = geo.height - geo.top;\n this.docTop = 0;\n this.curAlpha = 1;\n }\n\n /**\n * @param {number} pdfY PDF \u5EA7\u6A19\uFF08pt, \u4E0A\u5411\u304D\uFF09\n * @param {number} docY \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5EA7\u6A19\uFF08px, \u4E0B\u5411\u304D\uFF09\n */\n setOrigin(pdfY, docY) {\n this.pdfTop = pdfY;\n this.docTop = docY;\n }\n\n /** @param {number} x */\n X(x) {\n return this.geo.left + x * PX_TO_PT;\n }\n\n /** @param {number} y */\n Y(y) {\n return this.pdfTop - (y - this.docTop) * PX_TO_PT;\n }\n\n /** @param {number} a */\n setAlpha(a) {\n if (Math.abs(a - this.curAlpha) < 0.001) return;\n this.cs.setGState(this.gsName(a));\n this.curAlpha = a;\n }\n\n /** @param {import('./walker/walk.js').Radius|undefined} r */\n radiusPt(r) {\n return /** @type {[number, number, number, number]} */ ((r ?? [0, 0, 0, 0]).map((v) => v * PX_TO_PT));\n }\n\n /** @param {import('./walker/walk.js').Box} b */\n clipBox(b) {\n const cs = this.cs;\n if (b.radius) cs.roundedRect(this.X(b.x), this.Y(b.y + b.h), b.w * PX_TO_PT, b.h * PX_TO_PT, this.radiusPt(b.radius));\n else cs.rect(this.X(b.x), this.Y(b.y + b.h), b.w * PX_TO_PT, b.h * PX_TO_PT);\n cs.clip();\n }\n\n /**\n * @param {import('./walker/walk.js').DisplayItem[]} list\n * @param {{start: number, end: number}} [range] \u6307\u5B9A\u3059\u308B\u3068\u3053\u306E\u7BC4\u56F2\u306B\u5C5E\u3059\u308B\u547D\u4EE4\u3060\u3051\u3092\u63CF\u304F\uFF08\u5B50\u30B0\u30EB\u30FC\u30D7\u306B\u3082\u9069\u7528\uFF09\n */\n render(list, range) {\n const cs = this.cs;\n for (const it of list) {\n if (range && !inRange(it, range)) continue;\n if (it.type === 'rect') {\n if (it.w <= 0 || it.h <= 0) continue;\n cs.save();\n this.setAlpha(it.color.a);\n cs.fillColor(it.color.r, it.color.g, it.color.b);\n if (it.radius) cs.roundedRect(this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT, this.radiusPt(it.radius)).fill();\n else cs.fillRect(this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'line') {\n cs.save();\n this.setAlpha(it.color.a);\n cs.strokeColor(it.color.r, it.color.g, it.color.b);\n cs.lineWidth(it.width * PX_TO_PT);\n if (it.dash) cs.dash(it.dash.map((d) => d * PX_TO_PT));\n cs.moveTo(this.X(it.x1), this.Y(it.y1)).lineTo(this.X(it.x2), this.Y(it.y2)).stroke();\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'stroke-rrect') {\n cs.save();\n this.setAlpha(it.color.a);\n cs.strokeColor(it.color.r, it.color.g, it.color.b);\n cs.lineWidth(it.width * PX_TO_PT);\n if (it.dash) cs.dash(it.dash.map((d) => d * PX_TO_PT));\n cs.roundedRect(this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT, this.radiusPt(it.radius)).stroke();\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'image') {\n const im = this.images.get(it.image.key);\n if (!im || it.w <= 0 || it.h <= 0) continue;\n cs.save();\n this.setAlpha(it.alpha);\n if (it.clip) this.clipBox(it.clip);\n cs.image(im.name, this.X(it.x), this.Y(it.y + it.h), it.w * PX_TO_PT, it.h * PX_TO_PT);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'text') {\n const ef = /** @type {EmbeddedFont} */ (this.fonts.get(it.font));\n const tj = buildTJ(it, ef);\n cs.save();\n this.setAlpha(it.color.a);\n cs.fillColor(it.color.r, it.color.g, it.color.b);\n cs.text(ef.resourceName, it.size * PX_TO_PT, this.X(it.x), this.Y(it.y), tj);\n cs.restore();\n this.curAlpha = 1;\n } else if (it.type === 'group') {\n // CSS \u884C\u5217 (a b c d e f) \u3092\u3001PDF \u5EA7\u6A19\uFF08y \u53CD\u8EE2\u30FB0.75 \u500D\uFF09\u3067\u540C\u3058\u5909\u63DB\u306B\u306A\u308B\u884C\u5217\u306B\u5199\u3059\u3002\n // \u7DDA\u5F62\u90E8\u306F y \u53CD\u8EE2\u306B\u3088\u308A b, c \u306E\u7B26\u53F7\u304C\u53CD\u8EE2\u3057\u3001\u5909\u63DB\u306E\u4E2D\u5FC3 origin \u306F\u4E0D\u52D5\u70B9\u3068\u3057\u3066\u6B8B\u3059\u3002\n const [a, b, c, d] = it.matrix;\n const ox = this.X(it.origin.x);\n const oy = this.Y(it.origin.y);\n const a2 = a;\n const b2 = -b;\n const c2 = -c;\n const d2 = d;\n const e2 = ox - (a2 * ox + c2 * oy) + it.matrix[4] * PX_TO_PT;\n const f2 = oy - (b2 * ox + d2 * oy) - it.matrix[5] * PX_TO_PT;\n cs.save();\n cs.transform(a2, b2, c2, d2, e2, f2);\n this.render(it.items, range);\n cs.restore();\n } else if (it.type === 'clip') {\n cs.save();\n this.clipBox(it.box);\n this.render(it.items, range);\n cs.restore();\n }\n }\n }\n}\n\n/**\n * \u30B0\u30EA\u30D5\u5217\u3092 TJ \u914D\u5217\u306B\u3059\u308B\u3002\n * \u5B9F\u6E2C\u3057\u305F\u30DA\u30F3\u4F4D\u7F6E\u3068\u3001\u30D5\u30A9\u30F3\u30C8\u306E advance \u304B\u3089\u8A08\u7B97\u3057\u305F\u4F4D\u7F6E\u3068\u306E\u5DEE\u3092 1/1000 \u5358\u4F4D\u306E\u8ABF\u6574\u5024\u3068\u3057\u3066\u633F\u5165\u3059\u308B\u3002\n * \u3053\u308C\u306B\u3088\u308A\u30AB\u30FC\u30CB\u30F3\u30B0\u30FBletter-spacing\u30FB\u4E21\u7AEF\u63C3\u3048\u304C\u305D\u306E\u307E\u307E\u518D\u73FE\u3055\u308C\u308B\u3002\n * @param {import('./walker/walk.js').TextItem} it\n * @param {EmbeddedFont} ef\n * @returns {Array<string|number>}\n */\nfunction buildTJ(it, ef) {\n /** @type {Array<string|number>} */\n const out = [];\n let hex = '';\n for (let i = 0; i < it.glyphs.length; i++) {\n const g = /** @type {import('./walker/walk.js').Glyph} */ (it.glyphs[i]);\n hex += hex4(ef.cid(g.gid));\n const next = it.glyphs[i + 1];\n if (!next) break;\n const expected = g.x + g.advance;\n const gap = next.x - expected; // px\n const adj = (-gap / it.size) * 1000; // \u6B63\u306E\u5024\u3067\u5DE6\u3078\u5BC4\u308B\n if (Math.abs(adj) >= 0.5) {\n out.push(hex, Math.round(adj * 10) / 10);\n hex = '';\n }\n }\n if (hex) out.push(hex);\n return out;\n}\n\n/** @param {import('./walker/walk.js').DisplayItem} it */\nfunction itemTop(it) {\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') return it.y;\n if (it.type === 'line') return Math.min(it.y1, it.y2) - it.width / 2;\n if (it.type === 'group' || it.type === 'clip') return it.top;\n return it.top;\n}\n\n/** @param {import('./walker/walk.js').DisplayItem} it */\nfunction itemBottom(it) {\n if (it.type === 'rect' || it.type === 'stroke-rrect' || it.type === 'image') return it.y + it.h;\n if (it.type === 'line') return Math.max(it.y1, it.y2) + it.width / 2;\n if (it.type === 'group' || it.type === 'clip') return it.bottom;\n return it.bottom;\n}\n", "// @ts-check\n/**\n * Receipt html to pdf \u2014 \u516C\u958B API\n *\n * \u30D6\u30E9\u30A6\u30B6\u5185\u3067 HTML/CSS \u3092\u30C6\u30AD\u30B9\u30C8\u9078\u629E\u53EF\u80FD\u306A\u30D9\u30AF\u30BF\u30FC PDF \u306B\u5909\u63DB\u3059\u308B\u3002\n * \u8A2D\u8A08\u66F8: docs/design.md\n */\nimport { FontRegistry } from './font/registry.js';\nimport { renderDocument } from './renderer.js';\nimport { walk } from './walker/walk.js';\nimport { resolvePage, buildPdf } from './page.js';\nimport { PX_TO_PT } from './units.js';\n\nexport { expandPrintMediaCss } from './renderer.js';\n\n/**\n * \u767B\u9332\u3059\u308B\u30D5\u30A9\u30F3\u30C8\u306E\u5B9A\u7FA9\u3002\n * `src` \u306F TrueType \u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\uFF08glyf\uFF09\u3092\u6301\u3064\u9759\u7684 TTF \u306E\u307F\u5BFE\u5FDC\u3002\n *\n * @typedef {object} FontSource\n * @property {string} family CSS \u306E font-family \u3068\u4E00\u81F4\u3055\u305B\u308B\u540D\u524D\n * @property {number} [weight=400] 100\u301C900\n * @property {'normal'|'italic'} [style='normal']\n * @property {string|ArrayBuffer|Uint8Array} src URL \u307E\u305F\u306F \u30D5\u30A9\u30F3\u30C8\u30D5\u30A1\u30A4\u30EB\u306E\u30D0\u30A4\u30C8\u5217\n */\n\n/**\n * \u7528\u7D19\u30B5\u30A4\u30BA\u3002\u65E2\u5B9A\u540D\u304B\u3001\u5E45\u30FB\u9AD8\u3055\u3092 CSS \u9577\u3055\uFF08'80mm' \u306A\u3069\uFF09\u3067\u6307\u5B9A\u3059\u308B\u3002\n *\n * @typedef {'A3'|'A4'|'A5'|'B4'|'B5'|'Letter'|'Legal'|{width: string, height: string}} PageSize\n */\n\n/**\n * @typedef {object} PageOptions\n * @property {PageSize} [size='A4']\n * @property {'portrait'|'landscape'} [orientation='portrait']\n * @property {string|{top: string, right: string, bottom: string, left: string}} [margin='15mm']\n */\n\n/**\n * @typedef {object} PdfMetadata\n * @property {string} [title]\n * @property {string} [author]\n * @property {string} [subject]\n * @property {string} [keywords]\n * @property {string} [creator]\n * @property {Date} [creationDate]\n */\n\n/**\n * \u5909\u63DB\u4E2D\u306B\u767A\u751F\u3057\u305F\u975E\u81F4\u547D\u7684\u306A\u554F\u984C\u3002\u4F8B\u5916\u306B\u306F\u305B\u305A onWarning \u306B\u6D41\u3059\u3002\n *\n * @typedef {object} ConversionWarning\n * @property {'unsupported-css'|'missing-font'|'missing-glyph'|'image-failed'|'other'} code\n * @property {string} message\n * @property {Element} [element]\n * @property {string} [property] unsupported-css \u306E\u3068\u304D\u306E CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u540D\n * @property {string} [text] missing-glyph \u306E\u3068\u304D\u306E\u8A72\u5F53\u6587\u5B57\n */\n\n/**\n * @typedef {object} ConvertOptions\n * @property {PageOptions} [page]\n * @property {string[]} [fontFallback] \u672A\u767B\u9332\u30D5\u30A1\u30DF\u30EA\u30FC\u304C\u8981\u6C42\u3055\u308C\u305F\u3068\u304D\u306B\u8A66\u3059 family \u306E\u9806\u5E8F\n * @property {'inherit'|'none'|string[]} [stylesheets='inherit'] \u89AA\u6587\u66F8\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u7D99\u627F\u3059\u308B\u304B\u3001URL/CSS \u30C6\u30AD\u30B9\u30C8\u3092\u660E\u793A\u3059\u308B\u304B\n * @property {boolean} [mediaPrint=false] `@media print` \u30EB\u30FC\u30EB\u3092\u901A\u5E38\u30EB\u30FC\u30EB\u3068\u3057\u3066\u9069\u7528\u3059\u308B\n * @property {boolean} [compress=true] CompressionStream \u304C\u4F7F\u3048\u308C\u3070 FlateDecode \u3092\u9069\u7528\u3059\u308B\n * @property {PdfMetadata} [metadata]\n * @property {string|null} [header=null] \u5404\u30DA\u30FC\u30B8\u4E0A\u90E8\u306E HTML \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3002{{pageNumber}} {{totalPages}} \u3092\u7F6E\u63DB\u3059\u308B\n * @property {string|null} [footer=null] \u5404\u30DA\u30FC\u30B8\u4E0B\u90E8\u306E HTML \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3002\u540C\u4E0A\n * @property {'font'|'measure'|'auto'} [textMeasure='auto'] \u30B0\u30EA\u30D5\u4F4D\u7F6E\u306E\u6C7A\u3081\u65B9\uFF08\u73FE\u5728\u306F\u5E38\u306B\u5B9F\u6E2C\uFF09\n * @property {'blob'|'uint8array'|'dataurl'} [output='blob']\n * @property {string} [baseUrl] \u76F8\u5BFE URL\uFF08\u30D5\u30A9\u30F3\u30C8\u30FB\u753B\u50CF\uFF09\u306E\u57FA\u6E96\u3002\u65E2\u5B9A\u306F\u73FE\u5728\u306E\u6587\u66F8\n * @property {(warning: ConversionWarning) => void} [onWarning]\n */\n\n/**\n * \u5909\u63DB\u306E\u5165\u529B\u3002DOM \u8981\u7D20\u3001\u307E\u305F\u306F HTML \u6587\u5B57\u5217\u3002\n * @typedef {Element|string} ConvertInput\n */\n\n/** \u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\uFF08package.json \u3068\u540C\u671F\uFF09 */\nexport const version = '0.1.0';\n\n/** \u30E2\u30B8\u30E5\u30FC\u30EB\u5171\u6709\u306E\u30D5\u30A9\u30F3\u30C8\u30EC\u30B8\u30B9\u30C8\u30EA */\nconst registry = new FontRegistry();\n\n/**\n * \u30D5\u30A9\u30F3\u30C8\u3092\u767B\u9332\u3059\u308B\u3002\u540C\u3058 family/weight/style \u3092\u518D\u767B\u9332\u3057\u305F\u5834\u5408\u306F\u4E0A\u66F8\u304D\u3059\u308B\u3002\n * \u30D1\u30FC\u30B9\u7D50\u679C\u306F\u30E2\u30B8\u30E5\u30FC\u30EB\u5185\u306B\u30AD\u30E3\u30C3\u30B7\u30E5\u3055\u308C\u3001\u4EE5\u964D\u306E htmlToPdf \u547C\u3073\u51FA\u3057\u3067\u518D\u5229\u7528\u3055\u308C\u308B\u3002\n *\n * @param {FontSource} font\n * @returns {Promise<void>}\n */\nexport async function registerFont(font) {\n if (!font || !font.family || !font.src) throw new TypeError('registerFont: { family, src } are required');\n const entry = await registry.register(font);\n if (entry.parsed.variable) {\n console.warn(\n `[receipt-html-to-pdf] \"${font.family}\" is a variable font; only the default instance outlines are embedded. ` +\n 'Use static TTF instances for other weights.',\n );\n }\n}\n\n/**\n * \u767B\u9332\u6E08\u307F\u30D5\u30A9\u30F3\u30C8\u306E\u4E00\u89A7\uFF08\u30C7\u30D0\u30C3\u30B0\u7528\uFF09\u3002\n * @returns {{family: string, weight: number, style: string, glyphs: number}[]}\n */\nexport function listFonts() {\n return registry.fonts.map((f) => ({ family: f.displayFamily, weight: f.weight, style: f.style, glyphs: f.parsed.numGlyphs }));\n}\n\n/**\n * HTML \u3092 PDF \u306B\u5909\u63DB\u3059\u308B\u3002\n *\n * @param {ConvertInput} input\n * @param {ConvertOptions} [options]\n * @returns {Promise<Blob|Uint8Array|string>} options.output \u306B\u5FDC\u3058\u305F PDF\n */\nexport async function htmlToPdf(input, options = {}) {\n if (typeof document === 'undefined') throw new Error('htmlToPdf must run in a browser (needs DOM layout)');\n if (registry.fonts.length === 0) {\n throw new Error('htmlToPdf: no fonts registered. Call registerFont() with at least one TrueType font first.');\n }\n const warn = options.onWarning ?? (() => {});\n const geo = resolvePage(options.page);\n const widthPx = (geo.width - geo.left - geo.right) / PX_TO_PT;\n\n const rendered = await renderDocument(input, {\n widthPx,\n stylesheets: options.stylesheets ?? 'inherit',\n mediaPrint: options.mediaPrint ?? false,\n baseUrl: options.baseUrl,\n warn,\n });\n\n /** @type {import('./walker/walk.js').WalkContext} */\n const walkCtx = {\n registry,\n fontFallback: options.fontFallback ?? [],\n warn,\n textMeasure: options.textMeasure ?? 'auto',\n };\n const renderOpts = {\n widthPx,\n stylesheets: options.stylesheets ?? 'inherit',\n mediaPrint: options.mediaPrint ?? false,\n baseUrl: options.baseUrl,\n warn,\n };\n\n try {\n const body = await walk(rendered.root, walkCtx);\n const header = options.header ? await makeDecoration(options.header, renderOpts, walkCtx) : null;\n const footer = options.footer ? await makeDecoration(options.footer, renderOpts, walkCtx) : null;\n const bytes = await buildPdf(body, geo, {\n compress: options.compress ?? true,\n metadata: options.metadata,\n header,\n footer,\n });\n return toOutput(bytes, options.output ?? 'blob');\n } finally {\n rendered.destroy();\n }\n}\n\n/**\n * \u30D8\u30C3\u30C0\u30FC\uFF0F\u30D5\u30C3\u30BF\u30FC\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u63CF\u753B\u3059\u308B\u6E96\u5099\u3092\u3059\u308B\u3002\n * \u9AD8\u3055\u306F 1 \u30DA\u30FC\u30B8\u76EE\u76F8\u5F53\uFF08{{pageNumber}} = {{totalPages}} = 1\uFF09\u3067\u6E2C\u308A\u3001\u5168\u30DA\u30FC\u30B8\u540C\u3058\u3068\u307F\u306A\u3059\u3002\n * @param {string} template\n * @param {Parameters<typeof renderDocument>[1]} renderOpts\n * @param {import('./walker/walk.js').WalkContext} walkCtx\n * @returns {Promise<import('./page.js').PageDecoration>}\n */\nasync function makeDecoration(template, renderOpts, walkCtx) {\n const renderOnce = async (/** @type {number} */ page, /** @type {number} */ total) => {\n const html = template.replace(/\\{\\{\\s*pageNumber\\s*\\}\\}/g, String(page)).replace(/\\{\\{\\s*totalPages\\s*\\}\\}/g, String(total));\n const rendered = await renderDocument(html, renderOpts);\n try {\n return await walk(rendered.root, walkCtx);\n } finally {\n rendered.destroy();\n }\n };\n const probe = await renderOnce(1, 1);\n /** @type {Map<string, import('./walker/walk.js').WalkResult>} */\n const cache = new Map([['1/1', probe]]);\n return {\n heightPx: probe.height,\n render: async (page, total) => {\n const key = `${page}/${total}`;\n let r = cache.get(key);\n if (!r) {\n r = await renderOnce(page, total);\n cache.set(key, r);\n }\n return r;\n },\n };\n}\n\n/**\n * @param {Uint8Array} bytes\n * @param {'blob'|'uint8array'|'dataurl'} output\n * @returns {Blob|Uint8Array|string}\n */\nfunction toOutput(bytes, output) {\n if (output === 'uint8array') return bytes;\n if (output === 'dataurl') {\n let bin = '';\n for (let i = 0; i < bytes.length; i += 0x8000) bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return 'data:application/pdf;base64,' + btoa(bin);\n }\n return new Blob([/** @type {Uint8Array<ArrayBuffer>} */ (bytes)], { type: 'application/pdf' });\n}\n\n/**\n * \u751F\u6210\u3057\u305F PDF \u3092\u30D6\u30E9\u30A6\u30B6\u3067\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3055\u305B\u308B\u88DC\u52A9\u95A2\u6570\u3002\n *\n * @param {Blob|Uint8Array} pdf\n * @param {string} filename\n * @returns {void}\n */\nexport function downloadPdf(pdf, filename) {\n const blob =\n pdf instanceof Blob\n ? pdf\n : new Blob([/** @type {Uint8Array<ArrayBuffer>} */ (pdf)], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["parseFont", "buffer", "data", "dv", "tag", "numTables", "tables", "i", "p", "name", "variable", "req", "t", "head", "unitsPerEm", "bbox", "macStyle", "indexToLocFormat", "hhea", "ascender", "descender", "lineGap", "numberOfHMetrics", "numGlyphs", "hmtx", "advances", "lastAdvance", "g", "locaT", "loca", "cmapT", "cmap", "parseCmap", "capHeight", "useTypoMetrics", "typoAscender", "typoDescender", "winAscent", "winDescent", "bold", "italic", "os2", "version", "fsSelection", "ch", "italicAngle", "post", "postScriptName", "parsePostScriptName", "base", "best", "bestScore", "platform", "encoding", "offset", "format", "score", "map", "segCountX2", "segCount", "endP", "startP", "deltaP", "rangeP", "s", "end", "start", "delta", "rangeOffset", "c", "gid", "gp", "nGroups", "startGid", "nameT", "count", "stringOffset", "fallback", "nameId", "length", "sanitizePsName", "j", "glyphData", "font", "glyf", "componentGids", "out", "flags", "glyphIndex", "FontRegistry", "source", "bytes", "loadBytes", "parsed", "parseFont", "entry", "normalizeFamily", "idx", "f", "family", "families", "weight", "style", "codePoint", "fam", "n", "candidates", "pickFace", "styled", "pool", "exact", "sorted", "a", "b", "heavier", "lighter", "mid", "splitFamilies", "value", "out", "cur", "quote", "ch", "parseWeight", "src", "res", "renderDocument", "input", "opts", "iframe", "win", "doc", "html", "buildHtml", "fit", "waitForStylesheets", "waitForFonts", "waitForImages", "materializePseudoElements", "baseUrl", "base", "escapeAttr", "reset", "m", "expandPrintMedia", "styles", "collectStyles", "htmlAttrs", "copyAttrs", "bodyAttrs", "body", "stylesheets", "mediaPrint", "parts", "el", "css", "expandPrintMediaCss", "_m", "attrs", "out", "i", "hit", "depth", "j", "query", "a", "s", "links", "l", "resolve", "link", "loading", "f", "imgs", "img", "warn", "jobs", "pseudo", "ps", "content", "text", "parseContentString", "prop", "style", "job", "span", "value", "hosts", "v", "ch", "quote", "hex", "MM_TO_PT", "PAGE_SIZES", "lengthToPt", "value", "m", "cssPx", "value", "n", "parseColor", "v", "m", "a", "clamp01", "h", "c", "num", "s", "t", "WHITESPACE", "measureText", "node", "style", "o", "doc", "text", "applyTextTransform", "range", "baselineOffset", "probeBaseline", "lines", "cur", "curTop", "warnedCps", "i", "cp", "len", "end", "rect", "pickRect", "resolved", "resolveGlyph", "font", "gid", "cpForUnicode", "top", "advance", "rects", "best", "r", "tryFont", "f", "hit", "sub", "s", "transform", "out", "m", "sp", "ch", "probeCache", "key", "cache", "cached", "probe", "textNode", "mark", "textRect", "offset", "result", "cache", "loadImage", "url", "warn", "element", "p", "decode", "e", "bytes", "res", "dims", "jpegDimensions", "img", "loaded", "resolve", "reject", "blobUrl", "w", "h", "canvas", "ctx", "data", "px", "rgb", "alpha", "opaque", "i", "j", "k", "a", "b", "marker", "len", "parseBackgroundUrl", "value", "parts", "splitTopLevelCommas", "m", "s", "out", "depth", "cur", "ch", "fitImage", "box", "iw", "ih", "size", "position", "scale", "sw", "sh", "rw", "sizeComponent", "rh", "py", "x", "positionComponent", "y", "v", "ref", "free", "objectFitToSize", "fit", "SKIP_TAGS", "UNSUPPORTED", "v", "walk", "root", "ctx", "win", "sx", "sy", "out", "rootItems", "atoms", "breaks", "tables", "currentTable", "seq", "warned", "missingFamilies", "warnOnce", "key", "w", "visit", "el", "inherited", "style", "matrix", "parseTransform", "hel", "transformedRect", "prev", "plainRect", "ox", "oy", "parseOrigin", "origin", "saved", "visitInner", "items", "zOf", "inheritedZ", "zi", "z", "opacity", "alpha", "visible", "r", "top", "bottom", "bb", "ba", "bi", "openedTable", "savedTable", "isHead", "isFoot", "groupStart", "clips", "clipSaved", "clipBox", "boxFor", "parseRadius", "warnUnsupported", "rects", "collapse", "radius", "paintBackground", "paintBackgroundImage", "paintBorders", "paintImg", "decorations", "decoLine", "color", "parseColor", "next", "node", "paintText", "inside", "it", "intersects", "prop", "isSet", "camelToKebab", "bg", "item", "withAlpha", "url", "parseBackgroundUrl", "img", "loadImage", "originBox", "fit", "fitImage", "src", "content", "objectFitToSize", "box", "x", "y", "h", "bt", "cssPx", "br", "bl", "pt", "pr", "pb", "pl", "b", "drawn", "side", "s", "f", "bw", "dashFor", "c", "horizontal", "dir", "edge", "dash", "center", "start", "parent", "inh", "raw", "range", "size", "families", "splitFamilies", "weight", "parseWeight", "fstyle", "primary", "lines", "measureText", "line", "g", "deco", "first", "last", "x1", "x2", "thickness", "sortItems", "height", "a", "one", "value", "m", "d", "e", "parts", "y1", "y2", "canCompress", "deflate", "bytes", "cs", "writer", "buf", "Ref", "id", "Name", "name", "out", "ch", "c", "b", "Raw", "text", "pdfString", "s", "hex", "i", "pdfDate", "d", "p", "n", "tz", "sign", "tzh", "tzm", "serialize", "v", "num", "parts", "k", "val", "PdfWriter", "options", "ref", "value", "stream", "dict", "bytes", "opts", "data", "z", "deflate", "rootRef", "infoRef", "enc", "chunks", "offset", "push", "concat", "offsets", "obj", "xrefOffset", "xref", "trailer", "len", "o", "ContentStream", "a", "b", "c", "d", "e", "f", "num", "gsName", "r", "g", "w", "pattern", "phase", "cap", "x", "y", "h", "x1", "y1", "x2", "y2", "x3", "y3", "max", "clamp", "v", "tl", "tr", "br", "bl", "top", "right", "name", "fontName", "size", "tj", "opts", "parts", "t", "subsetFont", "font", "usedGids", "set", "stack", "gid", "c", "componentGids", "glyphData", "oldGids", "a", "b", "gidMap", "g", "i", "n", "glyphChunks", "loca", "glyfLen", "remapComposite", "pad", "glyf", "concat", "locaBytes", "ldv", "v", "origHmtx", "origHhea", "fdv", "numberOfHMetrics", "hmtx", "hdv", "old", "lsbOffset", "head", "copyTable", "headDv", "hhea", "maxp", "tables", "opt", "buildSfnt", "tag", "t", "out", "dv", "p", "flags", "oldGid", "numTables", "entrySelector", "searchRange", "rangeShift", "offset", "entries", "data", "checksum", "e", "k", "headEntry", "total", "sum", "b0", "b1", "b2", "b3", "EmbeddedFont", "font", "resourceName", "gid", "codePoint", "subsetFont", "writer", "subset", "f", "scale", "baseFont", "subsetTag", "fontFile", "flags", "descriptor", "v", "W", "widths", "g", "i", "j", "cidFont", "Raw", "toUnicode", "buildToUnicode", "usedGids", "h", "tag", "entries", "oldGid", "cid", "cp", "hex4", "utf16Hex", "body", "chunk", "cmap", "n", "embedImage", "writer", "img", "dict", "paginate", "walk", "pageHeightPx", "H", "total", "atoms", "a", "b", "breaks", "EPS", "pages", "start", "guard", "heads", "headShift", "t", "feet", "footShift", "end", "pass", "capacity", "computeEnd", "needed", "shift", "same", "n", "i", "moved", "iter", "resolvePage", "page", "sizeOpt", "width", "height", "s", "PAGE_SIZES", "lengthToPt", "m", "margins", "buildPdf", "body", "geo", "opts", "writer", "PdfWriter", "headerPt", "footerPt", "contentW", "contentTop", "contentH", "contentHpx", "ranges", "paginate", "totalPages", "headers", "footers", "p", "fonts", "images", "collect", "list", "it", "ef", "EmbeddedFont", "g", "w", "fontDict", "xobjDict", "im", "embedImage", "gstates", "gstateDict", "gsName", "a", "key", "num", "name", "pagesRef", "pageRefs", "range", "cs", "ContentStream", "painter", "Painter", "bodyShiftPt", "footShiftPt", "bodyEndPt", "f", "fPt", "bottomPt", "h", "hPt", "header", "footer", "contentRef", "Name", "catalog", "md", "info", "pdfString", "pdfDate", "infoRef", "inRange", "mid", "itemBottom", "itemTop", "pdfY", "docY", "x", "y", "r", "v", "b", "d", "tj", "buildTJ", "ox", "oy", "a2", "b2", "c2", "d2", "e2", "f2", "out", "hex", "i", "hex4", "next", "expected", "adj", "version", "registry", "FontRegistry", "registerFont", "font", "listFonts", "f", "htmlToPdf", "input", "options", "warn", "geo", "resolvePage", "widthPx", "rendered", "renderDocument", "walkCtx", "renderOpts", "body", "walk", "header", "makeDecoration", "footer", "bytes", "buildPdf", "toOutput", "template", "renderOnce", "page", "total", "html", "probe", "cache", "key", "r", "output", "bin", "i", "downloadPdf", "pdf", "filename", "blob", "url", "a"]
|
|
7
|
+
}
|