kordoc 4.21.26 → 4.21.27
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/README.md +2 -1
- package/dist/{-K2UEFE7X.js → -5FOZFOPV.js} +11 -11
- package/dist/{chunk-SJCNQUDE.js → chunk-3QFNMDZP.js} +2 -2
- package/dist/{chunk-TF7AUNDC.js → chunk-3TB6JJBL.js} +4 -2
- package/dist/chunk-3TB6JJBL.js.map +1 -0
- package/dist/{chunk-OAY3X47Q.js → chunk-4A7JRTHE.js} +2 -2
- package/dist/{chunk-YELU7MYQ.js → chunk-4IWKVH6O.js} +2 -2
- package/dist/{chunk-VWC3ULX3.cjs → chunk-5JWHW4UV.cjs} +6 -6
- package/dist/{chunk-VWC3ULX3.cjs.map → chunk-5JWHW4UV.cjs.map} +1 -1
- package/dist/{chunk-LD4NMTZO.js → chunk-ASQDTBJ6.js} +3 -3
- package/dist/{chunk-W7UWPQHF.js → chunk-AUGRVQB6.js} +2 -2
- package/dist/{chunk-AWFUJ2CE.js → chunk-C2HKIYE3.js} +2 -2
- package/dist/{chunk-PBH2C3OP.js → chunk-DD2GXMGJ.js} +3 -3
- package/dist/{chunk-OWSHVRMX.cjs → chunk-ELSZDGZ7.cjs} +22 -22
- package/dist/{chunk-OWSHVRMX.cjs.map → chunk-ELSZDGZ7.cjs.map} +1 -1
- package/dist/{chunk-A4HUSCRK.js → chunk-EYBBOB7U.js} +2 -2
- package/dist/{chunk-Q6UEDUKY.js → chunk-FAEJNNBT.js} +2489 -14
- package/dist/chunk-FAEJNNBT.js.map +1 -0
- package/dist/{chunk-UDZEBK7Q.cjs → chunk-HC7DIBJE.cjs} +3 -3
- package/dist/{chunk-UDZEBK7Q.cjs.map → chunk-HC7DIBJE.cjs.map} +1 -1
- package/dist/{chunk-SOVJDMJY.js → chunk-HMBRJJGY.js} +11 -11
- package/dist/{chunk-PFVWZCTB.js → chunk-HRN3C63G.js} +2 -2
- package/dist/{chunk-DTFLALDT.cjs → chunk-HXPMM4PR.cjs} +2 -2
- package/dist/{chunk-DTFLALDT.cjs.map → chunk-HXPMM4PR.cjs.map} +1 -1
- package/dist/{chunk-GTBUIVUV.js → chunk-KQ6KVQQU.js} +2 -2
- package/dist/{chunk-KL76G6NH.js → chunk-LLHFRMTG.js} +3 -3
- package/dist/{chunk-Q4LTCLFD.cjs → chunk-LTDCTNEX.cjs} +3 -3
- package/dist/{chunk-Q4LTCLFD.cjs.map → chunk-LTDCTNEX.cjs.map} +1 -1
- package/dist/{chunk-XGWEGV27.js → chunk-NH6RW2PO.js} +4 -4
- package/dist/{chunk-XSODQPSA.js → chunk-P6SAEXKO.js} +3 -3
- package/dist/{chunk-3ZCHEQX6.js → chunk-PUJNXNUE.js} +2 -2
- package/dist/{chunk-5VUUWX45.js → chunk-R54VFPLG.js} +2 -2
- package/dist/{chunk-SFQ3WDK7.js → chunk-TAJOXAOK.js} +2 -2
- package/dist/{chunk-BSPSDDNO.js → chunk-U3HWTT3T.js} +2 -2
- package/dist/{chunk-YBZWKPGR.js → chunk-UH2U72S7.js} +2 -2
- package/dist/{chunk-TKCNKW5W.js → chunk-VIVIPR7N.js} +2 -2
- package/dist/{chunk-YQVTAHV4.cjs → chunk-YUQBMV3N.cjs} +13 -13
- package/dist/{chunk-YQVTAHV4.cjs.map → chunk-YUQBMV3N.cjs.map} +1 -1
- package/dist/{chunk-D2MPOLNQ.js → chunk-Z34VK7MS.js} +4 -4
- package/dist/chunks-KZ6732NP.js +10 -0
- package/dist/cli.js +30 -30
- package/dist/{formula-PTSVDIHL.js → formula-LS5FCGH5.js} +3 -3
- package/dist/{formula-BO746TK2.js → formula-TNUMGTPU.js} +4 -4
- package/dist/{formula-XRZGYJP4.cjs → formula-WFBAKL22.cjs} +9 -9
- package/dist/{formula-XRZGYJP4.cjs.map → formula-WFBAKL22.cjs.map} +1 -1
- package/dist/{image-ocr-PCZMYABJ.cjs → image-ocr-WHK52J27.cjs} +15 -15
- package/dist/{image-ocr-PCZMYABJ.cjs.map → image-ocr-WHK52J27.cjs.map} +1 -1
- package/dist/{image-ocr-6PQJ7SJV.js → image-ocr-WWXJXNAZ.js} +6 -6
- package/dist/{image-ocr-4GISRDFY.js → image-ocr-ZUI7DVYZ.js} +9 -9
- package/dist/index.cjs +3056 -579
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +2491 -14
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +22 -22
- package/dist/{model-bundle-X5WVJMXG.js → model-bundle-KM4RKTU7.js} +5 -5
- package/dist/{models-QW3UZLY6.js → models-76SBLVIV.js} +5 -5
- package/dist/{parse-worker-v2-Q46SCTCX.js → parse-worker-v2-IYOKO2NP.js} +12 -12
- package/dist/{parser-ADGA6725.js → parser-B5DBOBDE.js} +8 -8
- package/dist/{parser-5UATDT56.js → parser-P35ZPRLT.js} +11 -11
- package/dist/{parser-22LKHTYJ.cjs → parser-SRWWDEXK.cjs} +136 -136
- package/dist/{parser-22LKHTYJ.cjs.map → parser-SRWWDEXK.cjs.map} +1 -1
- package/dist/pdf-ocr-FLFNGUVG.js +18 -0
- package/dist/pdf-ocr-NMHJCH2L.cjs +19 -0
- package/dist/{pdf-ocr-ZNT5VSX4.cjs.map → pdf-ocr-NMHJCH2L.cjs.map} +1 -1
- package/dist/pdf-ocr-UMFTSHTT.js +22 -0
- package/dist/{profile-io-QTSVWB4E.js → profile-io-KZVR5AHE.js} +3 -3
- package/dist/{rasterize-QRVOQ3UJ.js → rasterize-Y6DC56YR.js} +3 -3
- package/dist/{redact-doc-PAJLYEFP.js → redact-doc-XES7L54Z.js} +11 -11
- package/dist/{render-OO7VXST4.js → render-4SCFESBK.js} +7 -7
- package/dist/seal-KHFUGTQY.js +10 -0
- package/dist/{setup-OXRFTMAG.js → setup-2WZE5CT7.js} +3 -3
- package/dist/visual-G5YJLTFE.js +20 -0
- package/dist/{watch-G3B7QNFH.js → watch-XGNA5YOY.js} +12 -12
- package/package.json +1 -1
- package/dist/chunk-Q6UEDUKY.js.map +0 -1
- package/dist/chunk-TF7AUNDC.js.map +0 -1
- package/dist/chunks-L65DKHAH.js +0 -10
- package/dist/pdf-ocr-UGAISYQB.js +0 -22
- package/dist/pdf-ocr-UXJTMLIE.js +0 -18
- package/dist/pdf-ocr-ZNT5VSX4.cjs +0 -19
- package/dist/seal-GC7EKQ4T.js +0 -10
- package/dist/visual-KD4RZPWD.js +0 -20
- /package/dist/{-K2UEFE7X.js.map → -5FOZFOPV.js.map} +0 -0
- /package/dist/{chunk-SJCNQUDE.js.map → chunk-3QFNMDZP.js.map} +0 -0
- /package/dist/{chunk-OAY3X47Q.js.map → chunk-4A7JRTHE.js.map} +0 -0
- /package/dist/{chunk-YELU7MYQ.js.map → chunk-4IWKVH6O.js.map} +0 -0
- /package/dist/{chunk-LD4NMTZO.js.map → chunk-ASQDTBJ6.js.map} +0 -0
- /package/dist/{chunk-W7UWPQHF.js.map → chunk-AUGRVQB6.js.map} +0 -0
- /package/dist/{chunk-AWFUJ2CE.js.map → chunk-C2HKIYE3.js.map} +0 -0
- /package/dist/{chunk-PBH2C3OP.js.map → chunk-DD2GXMGJ.js.map} +0 -0
- /package/dist/{chunk-A4HUSCRK.js.map → chunk-EYBBOB7U.js.map} +0 -0
- /package/dist/{chunk-SOVJDMJY.js.map → chunk-HMBRJJGY.js.map} +0 -0
- /package/dist/{chunk-PFVWZCTB.js.map → chunk-HRN3C63G.js.map} +0 -0
- /package/dist/{chunk-GTBUIVUV.js.map → chunk-KQ6KVQQU.js.map} +0 -0
- /package/dist/{chunk-KL76G6NH.js.map → chunk-LLHFRMTG.js.map} +0 -0
- /package/dist/{chunk-XGWEGV27.js.map → chunk-NH6RW2PO.js.map} +0 -0
- /package/dist/{chunk-XSODQPSA.js.map → chunk-P6SAEXKO.js.map} +0 -0
- /package/dist/{chunk-3ZCHEQX6.js.map → chunk-PUJNXNUE.js.map} +0 -0
- /package/dist/{chunk-5VUUWX45.js.map → chunk-R54VFPLG.js.map} +0 -0
- /package/dist/{chunk-SFQ3WDK7.js.map → chunk-TAJOXAOK.js.map} +0 -0
- /package/dist/{chunk-BSPSDDNO.js.map → chunk-U3HWTT3T.js.map} +0 -0
- /package/dist/{chunk-YBZWKPGR.js.map → chunk-UH2U72S7.js.map} +0 -0
- /package/dist/{chunk-TKCNKW5W.js.map → chunk-VIVIPR7N.js.map} +0 -0
- /package/dist/{chunk-D2MPOLNQ.js.map → chunk-Z34VK7MS.js.map} +0 -0
- /package/dist/{chunks-L65DKHAH.js.map → chunks-KZ6732NP.js.map} +0 -0
- /package/dist/{formula-PTSVDIHL.js.map → formula-LS5FCGH5.js.map} +0 -0
- /package/dist/{formula-BO746TK2.js.map → formula-TNUMGTPU.js.map} +0 -0
- /package/dist/{image-ocr-6PQJ7SJV.js.map → image-ocr-WWXJXNAZ.js.map} +0 -0
- /package/dist/{image-ocr-4GISRDFY.js.map → image-ocr-ZUI7DVYZ.js.map} +0 -0
- /package/dist/{model-bundle-X5WVJMXG.js.map → model-bundle-KM4RKTU7.js.map} +0 -0
- /package/dist/{models-QW3UZLY6.js.map → models-76SBLVIV.js.map} +0 -0
- /package/dist/{parse-worker-v2-Q46SCTCX.js.map → parse-worker-v2-IYOKO2NP.js.map} +0 -0
- /package/dist/{parser-ADGA6725.js.map → parser-B5DBOBDE.js.map} +0 -0
- /package/dist/{parser-5UATDT56.js.map → parser-P35ZPRLT.js.map} +0 -0
- /package/dist/{pdf-ocr-UGAISYQB.js.map → pdf-ocr-FLFNGUVG.js.map} +0 -0
- /package/dist/{pdf-ocr-UXJTMLIE.js.map → pdf-ocr-UMFTSHTT.js.map} +0 -0
- /package/dist/{profile-io-QTSVWB4E.js.map → profile-io-KZVR5AHE.js.map} +0 -0
- /package/dist/{rasterize-QRVOQ3UJ.js.map → rasterize-Y6DC56YR.js.map} +0 -0
- /package/dist/{redact-doc-PAJLYEFP.js.map → redact-doc-XES7L54Z.js.map} +0 -0
- /package/dist/{render-OO7VXST4.js.map → render-4SCFESBK.js.map} +0 -0
- /package/dist/{seal-GC7EKQ4T.js.map → seal-KHFUGTQY.js.map} +0 -0
- /package/dist/{setup-OXRFTMAG.js.map → setup-2WZE5CT7.js.map} +0 -0
- /package/dist/{visual-KD4RZPWD.js.map → visual-G5YJLTFE.js.map} +0 -0
- /package/dist/{watch-G3B7QNFH.js.map → watch-XGNA5YOY.js.map} +0 -0
package/README.md
CHANGED
|
@@ -117,10 +117,11 @@ await writeFile("보고서.hwpx", Buffer.from(hwpx))
|
|
|
117
117
|
|
|
118
118
|
## 최근 업데이트
|
|
119
119
|
|
|
120
|
-
최신 배포: **[4.21.
|
|
120
|
+
최신 배포: **[4.21.27](https://github.com/chrisryugj/kordoc/releases/tag/v4.21.27)** · 2026-10-13
|
|
121
121
|
|
|
122
122
|
| 버전 | 주요 변경 |
|
|
123
123
|
| --- | --- |
|
|
124
|
+
| 4.21.27 | reflow 줄바꿈을 한컴 조판 규칙으로(양자화·한글 1em·condense·금칙), 두 줄+ 문단 줄 시작 일치 37.3% → 52.8%, KoPub 폭표 |
|
|
124
125
|
| 4.21.26 | 학력 칸 `년 월 입학/졸업` 자리표시 기간 채움, markdown 경로 라벨 덮어쓰기 2,843 → 486(#146) |
|
|
125
126
|
| 4.21.25 | 채운 칸 좌표·fill --dry-run 대상 칸, 2단 머리 표 채움(#145·#146) |
|
|
126
127
|
| 4.21.24 | 서식 표 patch 거부 해소·끝 빈 칸 채움·행 추가, fill 하위 라벨·자리표시·상자 줄(#144·#145·#146) |
|
|
@@ -54,10 +54,10 @@ import {
|
|
|
54
54
|
unknownFontWarnings,
|
|
55
55
|
usesGaejosikMunche,
|
|
56
56
|
validateHwpx
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-HMBRJJGY.js";
|
|
58
58
|
import {
|
|
59
59
|
blocksToChunks
|
|
60
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-C2HKIYE3.js";
|
|
61
61
|
import {
|
|
62
62
|
SPACE_EM_FIXED,
|
|
63
63
|
SPACE_EM_FONT,
|
|
@@ -82,30 +82,30 @@ import {
|
|
|
82
82
|
renderSceneToHtml,
|
|
83
83
|
simulateWrap,
|
|
84
84
|
simulateWrapKeepWord
|
|
85
|
-
} from "./chunk-
|
|
86
|
-
import "./chunk-
|
|
85
|
+
} from "./chunk-FAEJNNBT.js";
|
|
86
|
+
import "./chunk-4A7JRTHE.js";
|
|
87
87
|
import {
|
|
88
88
|
blocksToPages
|
|
89
|
-
} from "./chunk-
|
|
89
|
+
} from "./chunk-UH2U72S7.js";
|
|
90
90
|
import "./chunk-VKVDMH7X.js";
|
|
91
91
|
import "./chunk-VQFA55IC.js";
|
|
92
|
-
import "./chunk-
|
|
92
|
+
import "./chunk-PUJNXNUE.js";
|
|
93
93
|
import {
|
|
94
94
|
blocksToMarkdown,
|
|
95
95
|
flattenLayoutTables,
|
|
96
96
|
hasStructuredCellContent
|
|
97
|
-
} from "./chunk-
|
|
97
|
+
} from "./chunk-R54VFPLG.js";
|
|
98
98
|
import {
|
|
99
99
|
applySplices,
|
|
100
100
|
buildParagraphSplices,
|
|
101
101
|
buildRangeSplices,
|
|
102
102
|
placeSealHwpx,
|
|
103
103
|
scanSectionXml
|
|
104
|
-
} from "./chunk-
|
|
105
|
-
import "./chunk-
|
|
104
|
+
} from "./chunk-DD2GXMGJ.js";
|
|
105
|
+
import "./chunk-3TB6JJBL.js";
|
|
106
106
|
import {
|
|
107
107
|
VERSION
|
|
108
|
-
} from "./chunk-
|
|
108
|
+
} from "./chunk-3QFNMDZP.js";
|
|
109
109
|
import {
|
|
110
110
|
DEFAULT_REDACT_RULES,
|
|
111
111
|
redactMarkdown,
|
|
@@ -204,4 +204,4 @@ export {
|
|
|
204
204
|
usesGaejosikMunche,
|
|
205
205
|
validateHwpx
|
|
206
206
|
};
|
|
207
|
-
//# sourceMappingURL=-
|
|
207
|
+
//# sourceMappingURL=-5FOZFOPV.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/utils.ts
|
|
4
4
|
import { format } from "util";
|
|
5
|
-
var VERSION = true ? "4.21.
|
|
5
|
+
var VERSION = true ? "4.21.27" : "0.0.0-dev";
|
|
6
6
|
function toArrayBuffer(buf) {
|
|
7
7
|
if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {
|
|
8
8
|
return buf.buffer;
|
|
@@ -170,4 +170,4 @@ export {
|
|
|
170
170
|
classifyError,
|
|
171
171
|
partExtension
|
|
172
172
|
};
|
|
173
|
-
//# sourceMappingURL=chunk-
|
|
173
|
+
//# sourceMappingURL=chunk-3QFNMDZP.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
KordocError,
|
|
4
4
|
unzipLimitBytes
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-3QFNMDZP.js";
|
|
6
6
|
|
|
7
7
|
// src/hwpx/parser-shared.ts
|
|
8
8
|
import { DOMParser } from "@xmldom/xmldom";
|
|
@@ -245,6 +245,8 @@ function findDeep(el, name, depth = 0) {
|
|
|
245
245
|
}
|
|
246
246
|
function parseParaGeom(el) {
|
|
247
247
|
const g = { ...DEFAULT_PARA_GEOM };
|
|
248
|
+
const condense = Number(el.getAttribute("condense")) || 0;
|
|
249
|
+
if (condense > 0) g.condense = condense;
|
|
248
250
|
const ls = findDeep(el, "lineSpacing");
|
|
249
251
|
if (ls) {
|
|
250
252
|
g.lineSpacingType = ls.getAttribute("type") ?? "PERCENT";
|
|
@@ -365,4 +367,4 @@ export {
|
|
|
365
367
|
hwpFaceToCssStack,
|
|
366
368
|
parseRenderStyles
|
|
367
369
|
};
|
|
368
|
-
//# sourceMappingURL=chunk-
|
|
370
|
+
//# sourceMappingURL=chunk-3TB6JJBL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hwpx/parser-shared.ts","../src/shared/xml.ts","../src/render/head-styles.ts"],"sourcesContent":["/**\n * HWPX 파서 공유 상수/타입/유틸 (parser.ts에서 분리).\n * ZIP 한도, 섹션 공유 상태(SectionShared), walk 컨텍스트(WalkCtx), XML 유틸.\n */\n\nimport { DOMParser } from \"@xmldom/xmldom\"\nimport type JSZip from \"jszip\"\nimport { KordocError, unzipLimitBytes } from \"../utils.js\"\nimport type { CellContext, IRBlock, ParseWarning } from \"../types.js\"\n// WalkCtx.styleMap 타입 참조 — 타입 전용이라 styles.ts와의 순환은 컴파일 시 소거됨\nimport type { HwpxStyleMap } from \"./styles.js\"\nimport type { NoteNumberFormat } from \"./notes.js\"\nimport type { Edges } from \"../table/layout-frames.js\"\n\n// 256MB — rhwp 1만 건 실문서 서베이에서 section1.xml 단독 75.2MB(압축비 35:1) 정상\n// 문서가 확인됨 (rhwp #1917). 종전 100MB 총합 컷은 대형 실문서를 ZIP bomb 으로 오인 거부.\nexport const MAX_DECOMPRESS_SIZE = unzipLimitBytes(256 * 1024 * 1024)\n/** 손상 ZIP 복구 시 최대 엔트리 수 */\nexport const MAX_ZIP_ENTRIES = 500\n\n/** ZIP bomb 가드 전용 에러 — per-section catch가 XML fatalError(PARTIAL_PARSE로 강등)와\n * 구분해 이것만 재던진다. KordocError 서브클래스라 sanitizeError allowlist는 그대로 통과 */\nexport class ZipBombError extends KordocError {\n constructor(message: string) {\n super(message)\n this.name = \"ZipBombError\"\n }\n}\n\n/**\n * ZIP 엔트리를 압축 해제 상한까지만 푼다 — 중앙 디렉터리의 크기 필드는 위조할 수 있어 사전 검사(precheckZipSize)를 지나고,\n * 다 푼 뒤 재는 누적 검사로는 엔트리 하나가 상한의 몇 배를 메모리에 올리는 것을 못 막았다(크기 필드 100B·실제 800MB manifest →\n * RSS +1GB, rhwp #7602 의 엔트리별 읽기 상한과 같은 방어). used 는 이미 푼 누적량 — 누적 집계는 호출부가 종전대로 한다.\n * 글은 JSZip async(\"text\") 와 같은 Buffer UTF-8 디코딩(BOM 보존)\n */\nexport function readZipEntry(file: JSZip.JSZipObject, type: \"text\", used?: number): Promise<string>\nexport function readZipEntry(file: JSZip.JSZipObject, type: \"uint8array\", used?: number): Promise<Uint8Array>\nexport function readZipEntry(file: JSZip.JSZipObject, type: \"text\" | \"uint8array\", used = 0): Promise<string | Uint8Array> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n let size = 0\n const stream = file.nodeStream(\"nodebuffer\")\n stream.on(\"data\", (chunk: Buffer) => {\n size += chunk.length\n if (used + size > MAX_DECOMPRESS_SIZE) {\n stream.pause()\n reject(new ZipBombError(\"ZIP 압축 해제 크기 초과 (ZIP bomb 의심)\"))\n return\n }\n chunks.push(chunk)\n })\n stream.on(\"error\", reject)\n stream.on(\"end\", () => {\n if (type === \"text\") return resolve(Buffer.concat(chunks, size).toString(\"utf-8\"))\n // 바이트는 단독 버퍼로 — Buffer.concat 은 작은 크기를 공유 풀에서 잘라 줘 data.buffer 가 남의 64KB 가 된다\n const out = new Uint8Array(size)\n let at = 0\n for (const c of chunks) { out.set(c, at); at += c.length }\n resolve(out)\n })\n })\n}\n\n/** colSpan/rowSpan을 안전한 범위로 클램핑 */\nexport function clampSpan(val: number, max: number): number {\n return Math.max(1, Math.min(val, max))\n}\n\n// XML DOM 헬퍼 정본은 src/shared/xml.ts — 하위호환 재수출 (section-walker, render/* 등이\n// 이 모듈에서 import). MAX_XML_DEPTH 의미(요소 깊이 ≠ 표 중첩 단계)는 정본 주석 참조.\nexport { MAX_XML_DEPTH, findChildByLocalName, extractTextFromNode } from \"../shared/xml.js\"\n\n/** 셀 컨텍스트 확장 — 중첩표/이미지/다중문단 블록과 제목셀 여부를 IRCell로 전달 (v3.0) */\nexport interface CellCtxEx extends CellContext {\n blocks?: IRBlock[]\n /** 중첩표/이미지 등 구조 콘텐츠 존재 — true일 때만 IRCell.blocks로 attach */\n hasStructure?: boolean\n isHeader?: boolean\n /** 칸의 보이는 변 (borderFillIDRef → header borderFill) — IR 칸의 CELL_EDGES 로 옮긴다 (v4.17.0) */\n edges?: Edges\n /**\n * cell.text 평탄화 조립용 임시 상태 (#52 후속) — 인라인 흐름(글자취급 표·같은 문단\n * 텍스트)이 \"열려\" 있어 다음 인라인 항목을 `\\n`이 아니라 공백으로 이어야 하는지.\n * 문단 경계·블록/float 표에서 닫힌다(false). 최종 IRCell로는 나가지 않는 워크 전용 필드.\n */\n lineOpen?: boolean\n /**\n * keepEmptyParagraphs 조립용 임시 상태 (#57) — 이 셀에서 문단(빈 문단 포함)을 하나라도\n * 봤는지. 선두 빈 문단은 cell.text가 계속 \"\"라 truthiness로 구분할 수 없어 별도 추적한다.\n * 옵션 off일 땐 미사용. 최종 IRCell로는 나가지 않는 워크 전용 필드.\n */\n paraSeen?: boolean\n}\n\nexport interface TableState {\n rows: CellContext[][]\n currentRow: CellContext[]\n cell: CellCtxEx | null\n /** hp:caption 텍스트 — IRTable.caption으로 전달 (v3.0) */\n caption?: string\n /** hp:caption 내부 블록(중첩표 포함) — IRTable.captionBlocks로 전달 (#55) */\n captionBlocks?: IRBlock[]\n /**\n * 글자취급(treatAsChar=\"1\") 표 여부 — 부모 셀 텍스트 평탄화 시 앞뒤 텍스트와 같은 줄로\n * 공백 연결할지 판단 (#52 후속). 블록/float 표(기본 undefined)는 종전대로 `\\n`.\n */\n inline?: boolean\n /** hp:tbl id — IRTable.sourceId (렌더 region 조인 키, #76) */\n sourceId?: string\n}\n\n/** 섹션 간 공유 상태 — 자동번호 카운터, 머리말/꼬리말, 변경추적 */\nexport interface SectionShared {\n /** numbering id → 레벨별(1..10) 카운터. -1 = 미사용(start값으로 초기화 — 0은 start=\"0\"의 유효값) */\n numState: Map<string, number[]>\n pageText: { headers: string[]; footers: string[] }\n track: { deleteDepth: number; warned: boolean; deletedObjects: WeakSet<Element>; deletedImageRefs: Set<string> }\n /** content.hpf kordoc-layout 메타 (\"default\"|\"gongmun\") — 자사 생성 파일 왕복 채널\n * 게이트. null/미설정 = 외래 파일 (id 기반 인라인 강조·인용 복원 꺼짐) */\n kordocLayout?: string | null\n /** 표 후행 빈 열(앵커 있는 입력란) 보존 — ParseOptions.keepTrailingEmptyCols (#47) */\n keepTrailingEmptyCols?: boolean\n /** 빈 문단 보존 — ParseOptions.keepEmptyParagraphs (#57) */\n keepEmptyParagraphs?: boolean\n /** 미기입 누름틀 안내문도 마크다운에 — ParseOptions.includeFieldPlaceholders (#92) */\n includeFieldPlaceholders?: boolean\n /** 실제 페이지 경계 상태 (#66) — base: 이전 섹션까지 누적 페이지 수,\n * allUsable: 지금까지 파싱한 전 섹션이 조판 캐시(linesegarray)를 신뢰 가능 */\n pageState: { base: number; allUsable: boolean }\n /** 목차 항목(채움 탭 + 쪽 번호 줄) 글 — 표 칸 안 목차는 틀 표 풀기가 문단을 새로 만들어 블록 표시가 사라지므로 글로도 기억한다 (#121) */\n tocTexts: Set<string>\n}\n\nexport function createSectionShared(): SectionShared {\n return {\n numState: new Map(),\n pageText: { headers: [], footers: [] },\n track: { deleteDepth: 0, warned: false, deletedObjects: new WeakSet(), deletedImageRefs: new Set() },\n pageState: { base: 0, allUsable: true },\n tocTexts: new Set(),\n }\n}\n\n/** walk 함수들이 공유하는 파싱 컨텍스트 — 개별 optional 파라미터를 하나로 묶어 시그니처 안정화 */\nexport interface WalkCtx {\n styleMap?: HwpxStyleMap\n warnings?: ParseWarning[]\n sectionNum?: number\n shared: SectionShared\n /** secPr outlineShapeIDRef — 개요(OUTLINE) 문단이 사용하는 numbering id */\n outlineNumId?: string\n /** secPr footNotePr/endNotePr 번호 모양 — 각주·미주 본문 참조 부호 재구성 (notes.ts) */\n noteFormats?: { footnote?: NoteNumberFormat; endnote?: NoteNumberFormat }\n /** 현재 페이지 (#66) — top-level 문단 진입 시 paraPage로 갱신, 셀/중첩은 호스트 상속 */\n page?: number\n /** 섹션 프리패스 결과: top-level <hp:p> → 섹션 내 0-based 페이지 */\n paraPage?: Map<Element, number>\n /** 이전 섹션까지 누적 페이지 수 (전역 페이지 = pageBase + 섹션 내 페이지 + 1) */\n pageBase?: number\n}\n\n/** xmldom DOMParser 생성 — onError 콜백으로 malformed XML 경고 수집 */\nexport function createXmlParser(warnings?: ParseWarning[]): DOMParser {\n return new DOMParser({\n onError(level: \"warning\" | \"error\" | \"fatalError\", msg: string) {\n if (level === \"fatalError\") throw new KordocError(`XML 파싱 실패: ${msg}`)\n warnings?.push({ code: \"MALFORMED_XML\", message: `XML ${level === \"warning\" ? \"경고\" : \"오류\"}: ${msg}` })\n },\n })\n}\n\n/** 수집된 머리말/꼬리말을 본문 앞/뒤 문단으로 배치 */\nexport function applyPageText(blocks: IRBlock[], shared: SectionShared): void {\n const { headers, footers } = shared.pageText\n if (headers.length > 0) {\n blocks.unshift(...headers.map(t => ({ type: \"paragraph\" as const, text: t, pageNumber: 1 })))\n }\n if (footers.length > 0) {\n blocks.push(...footers.map(t => ({ type: \"paragraph\" as const, text: t })))\n }\n}\n\n","/**\n * XML DOM 공용 헬퍼 — hwpx(parser-shared)·hwpml(parser)·docx(equation)가 공유.\n *\n * xmldom Element를 네임스페이스 접두사 무시(localName 기준)로 다루는 최소 유틸.\n * 정본은 이 모듈 — hwpx/parser-shared.ts는 하위호환 재수출만 유지한다.\n */\n\n/** XML DOM 재귀 최대 깊이 — 악성 파일의 스택 오버플로 방지.\n * 좌표계가 다른 hwp5 MAX_NEST_DEPTH(8, 표 중첩 단계)·filler/소스맵 16\n * (표 중첩 단계)과 달리 이건 \"XML 요소\" 깊이라 표 1단이 여러 depth를\n * 소모한다 — 상수 통일 금지 (의미가 다름) */\nexport const MAX_XML_DEPTH = 200\n\n/** 요소의 localName (네임스페이스 접두사 제거) */\nexport function localName(el: Element): string {\n return (el.tagName || el.localName || \"\").replace(/^[^:]+:/, \"\")\n}\n\n/** 자식 중 지정된 localName(접두사 제거)을 가진 첫 번째 Element 반환 */\nexport function findChildByLocalName(parent: Element, name: string): Element | null {\n const children = parent.childNodes\n if (!children) return null\n for (let i = 0; i < children.length; i++) {\n const ch = children[i] as Element\n if (ch.nodeType !== 1) continue\n if (localName(ch) === name) return ch\n }\n return null\n}\n\n/** 자식 중 지정된 localName을 가진 모든 Element (직계만) */\nexport function childrenByLocalName(parent: Element, name: string): Element[] {\n const out: Element[] = []\n const children = parent.childNodes\n if (!children) return out\n for (let i = 0; i < children.length; i++) {\n const ch = children[i] as Element\n if (ch.nodeType !== 1) continue\n if (localName(ch) === name) out.push(ch)\n }\n return out\n}\n\n/** 직계 자식 Element 전부 (텍스트/주석 노드 제외) */\nexport function elementChildren(parent: Element): Element[] {\n const out: Element[] = []\n const children = parent.childNodes\n if (!children) return out\n for (let i = 0; i < children.length; i++) {\n if (children[i].nodeType === 1) out.push(children[i] as Element)\n }\n return out\n}\n\n/** 텍스트를 담는 노드 타입 — TEXT_NODE(3)과 CDATA_SECTION_NODE(4).\n * CDATA 를 빠뜨리면 `<hp:t><![CDATA[본문]]></hp:t>` 로 저장된 문서의 텍스트가\n * 경고 없이 통째로 사라진다 (rhwp f4c7de75 와 같은 결함). 한컴 저장본은 CDATA 를\n * 쓰지 않지만 제3자 도구 산출물·특수문자 다수 문단에서는 유효한 XML 표현이다. */\nfunction isTextNode(node: Node): boolean {\n return node.nodeType === 3 || node.nodeType === 4\n}\n\n/** 노드 내 모든 텍스트를 재귀적으로 추출 (요소 단위 trim — hwpx 기존 시맨틱).\n * MAX_XML_DEPTH 가드 — 악성 심층 XML 스택 오버플로 방지 */\nexport function extractTextFromNode(node: Node, depth: number = 0): string {\n let result = \"\"\n if (depth > MAX_XML_DEPTH) return result\n const children = node.childNodes\n if (!children) return result\n for (let i = 0; i < children.length; i++) {\n const child = children[i]\n if (isTextNode(child)) result += child.textContent || \"\"\n else if (child.nodeType === 1) result += extractTextFromNode(child, depth + 1)\n }\n return result.trim()\n}\n\n/** 노드 내 모든 텍스트를 공백 원형 그대로 추출 (trim 없음 — hwpml CHAR 텍스트 시맨틱) */\nexport function rawTextContent(node: Node, depth: number = 0): string {\n if (depth > MAX_XML_DEPTH) return \"\"\n const children = node.childNodes\n if (!children) return \"\"\n const parts: string[] = []\n for (let i = 0; i < children.length; i++) {\n const child = children[i]\n if (isTextNode(child)) parts.push(child.nodeValue || \"\")\n else if (child.nodeType === 1) parts.push(rawTextContent(child, depth + 1))\n }\n return parts.join(\"\")\n}\n","/**\n * 레이아웃 보존 렌더 — header.xml 스타일 테이블 (charPr/paraPr/borderFill).\n * 파서 IR과 무관하게 렌더에 필요한 속성만 추출한다.\n */\n\nimport { createXmlParser, findChildByLocalName } from \"../hwpx/parser-shared.js\"\n\nexport interface RenderCharStyle {\n /** 글자 크기 (1/100pt — 1000 = 10pt) */\n height: number\n bold: boolean\n italic: boolean\n underline: boolean\n /** #RRGGBB — 검정이면 undefined */\n color?: string\n /** 장평 % */\n ratio: number\n /** 자간 % */\n spacing: number\n /** CSS font-family 스택 — charPr fontRef(hangul)에서 해석. 없으면 root 기본 폴백 */\n fontFamily?: string\n /** HWP 원본 글꼴명 (fontfaces face) — reflow 폭 테이블 선택용 */\n face?: string\n}\n\nexport type ParaAlign = \"JUSTIFY\" | \"LEFT\" | \"RIGHT\" | \"CENTER\" | \"DISTRIBUTE\" | \"DISTRIBUTE_SPACE\"\n\n/** reflow(Tier-2)용 문단 기하 — 줄간격·여백. paraPr `<hh:margin>`·`<hh:lineSpacing>`은\n * `<hp:switch>/<hp:case>` 안(손자)이라 재귀 탐색으로 뽑는다. 단위 HWPUNIT. */\nexport interface RenderParaGeom {\n /** PERCENT(기본 160=160%) / FIXED / BETWEEN_LINES / AT_LEAST */\n lineSpacingType: string\n lineSpacingValue: number\n /** 왼쪽 들여쓰기(HWPUNIT) */\n marginLeft: number\n marginRight: number\n /** 첫 줄 들여쓰기/내어쓰기 — 음수=둘째 줄부터 더 들어감(hanging) */\n marginIntent: number\n /** 문단 위 간격(prev) */\n spaceBefore: number\n /** 문단 아래 간격(next) */\n spaceAfter: number\n /** breakSetting의 한글 줄나눔 — 'keep'(어절)/'charAll'(글자). 없으면 호출자 모드.\n * 주의: 저장 속성 의미는 이름과 반대 — breakNonLatinWord \"BREAK_WORD\"=어절,\n * \"KEEP_WORD\"=글자 (한글 COM 실렌더 실측) */\n wrapMode?: \"keep\" | \"charAll\"\n /** 탭 정의(tabPrIDRef)가 내어쓰기용 자동 탭(autoTabLeft) — 첫 줄 탭이 내어쓰기 위치에 선다 */\n autoTabLeft?: boolean\n /** 공백 최소값(paraPr condense, %) — 줄 안 공백이 그만큼 줄어들 수 있어 줄 가용폭이 공백 폭 합 × condense% 늘어난다 */\n condense?: number\n}\n\nexport const DEFAULT_PARA_GEOM: RenderParaGeom = {\n lineSpacingType: \"PERCENT\", lineSpacingValue: 160,\n marginLeft: 0, marginRight: 0, marginIntent: 0, spaceBefore: 0, spaceAfter: 0,\n}\n\nexport interface RenderBorderEdge {\n /** SOLID/DASH/DOT… — NONE은 edge 자체를 생략 */\n type: string\n /** pt 단위 굵기 */\n widthPt: number\n color: string\n}\n\nexport interface RenderBorderFill {\n left?: RenderBorderEdge\n right?: RenderBorderEdge\n top?: RenderBorderEdge\n bottom?: RenderBorderEdge\n /** 배경색 #RRGGBB (없으면 undefined) */\n fill?: string\n}\n\nexport interface RenderStyles {\n charPr: Map<string, RenderCharStyle>\n paraAlign: Map<string, ParaAlign>\n /** reflow용 문단 기하 (줄간격·여백) — id별 */\n paraGeom: Map<string, RenderParaGeom>\n borderFill: Map<string, RenderBorderFill>\n}\n\nexport const DEFAULT_CHAR: RenderCharStyle = { height: 1000, bold: false, italic: false, underline: false, ratio: 100, spacing: 0 }\n\n// ─── 글꼴 매핑 (HWP fontfaces face → CSS font-family 스택) ──────────────\n//\n// HWPX charPr 는 <hh:fontRef hangul=\"N\">으로 fontfaces 테이블의 실제 글꼴명을 가리킨다.\n// 렌더는 이 글꼴명을 SVG <text font-family>로 내보내 뷰어(WebView2/브라우저)가 원본과\n// 같은 글꼴로 그리게 한다. 미설치 글꼴은 계열(명조=serif / 고딕=sans) 폴백으로 수렴시켜\n// 최소한 획 계열(바탕↔돋움)은 원본과 일치시킨다 — 공문서 제목 고딕이 바탕체로 나오던 회귀 해소.\n\n/** 자주 쓰는 글꼴의 별칭 스택 (한글명↔영문 시스템명 병기 — 뷰어 OS별 등록명 차이 흡수) */\nconst FONT_ALIASES: Record<string, string> = {\n \"함초롬바탕\": \"'HCR Batang','함초롬바탕','한컴바탕'\",\n \"한컴바탕\": \"'HCR Batang','함초롬바탕','한컴바탕'\",\n \"함초롬돋움\": \"'HCR Dotum','함초롬돋움','한컴돋움'\",\n \"한컴돋움\": \"'HCR Dotum','함초롬돋움','한컴돋움'\",\n \"맑은 고딕\": \"'Malgun Gothic','맑은 고딕'\",\n \"맑은고딕\": \"'Malgun Gothic','맑은 고딕'\",\n \"굴림\": \"'Gulim','굴림'\",\n \"굴림체\": \"'GulimChe','굴림체','Gulim'\",\n \"돋움\": \"'Dotum','돋움'\",\n \"돋움체\": \"'DotumChe','돋움체','Dotum'\",\n \"바탕\": \"'Batang','바탕'\",\n \"바탕체\": \"'BatangChe','바탕체','Batang'\",\n \"궁서\": \"'Gungsuh','궁서'\",\n \"궁서체\": \"'GungsuhChe','궁서체','Gungsuh'\",\n \"나눔고딕\": \"'NanumGothic','나눔고딕'\",\n \"나눔명조\": \"'NanumMyeongjo','나눔명조'\",\n \"맑은 고딕 Semilight\": \"'Malgun Gothic Semilight','맑은 고딕'\",\n}\n\n/** 명조/바탕 계열(serif) 여부 — 아니면 고딕/돋움(sans)으로 본다 */\nfunction isSerifFace(face: string): boolean {\n return /바탕|명조|Batang|Myeong|Mincho|궁서|Gungsuh|Serif|신명|순명|Song|송/i.test(face)\n}\n\n/** CSS font-family 토큰 인용 — 영숫자·하이픈만이면 무인용, 그 외(공백·한글)는 작은따옴표 */\nfunction cssQuote(name: string): string {\n return /^[A-Za-z0-9_-]+$/.test(name) ? name : `'${name.replace(/['\"\\\\]/g, \"\")}'`\n}\n\n/**\n * HWP 글꼴명 → CSS font-family 스택. 정확한 글꼴 먼저, 이어서 계열 폴백(명조=serif /\n * 고딕=sans, 각 한국어 렌더 가능 글꼴 포함)을 붙여 미설치 시에도 획 계열을 보존한다.\n */\nexport function hwpFaceToCssStack(face: string | null | undefined): string {\n const trimmed = (face ?? \"\").trim()\n if (!trimmed) return \"\"\n const generic = isSerifFace(trimmed)\n ? \"'HCR Batang','Batang','Noto Serif KR',serif\"\n : \"'Malgun Gothic','HCR Dotum','Noto Sans KR',sans-serif\"\n const head = FONT_ALIASES[trimmed] ?? cssQuote(trimmed)\n return `${head},${generic}`\n}\n\n/** fontfaces 테이블에서 HANGUL 그룹의 font id → 글꼴명 맵 (없으면 첫 그룹) */\nfunction collectHangulFonts(root: Element): Map<string, string> {\n const map = new Map<string, string>()\n const findFaces = (el: Element, depth: number): Element | null => {\n if (depth > 24) return null\n for (const ch of Array.from(el.childNodes)) {\n if (ch.nodeType !== 1) continue\n const e = ch as Element\n if ((e.tagName || \"\").replace(/^[^:]+:/, \"\") === \"fontfaces\") return e\n const f = findFaces(e, depth + 1)\n if (f) return f\n }\n return null\n }\n const faces = findFaces(root, 0)\n if (!faces) return map\n let group: Element | null = null\n let firstGroup: Element | null = null\n for (const ch of Array.from(faces.childNodes)) {\n if (ch.nodeType !== 1) continue\n const e = ch as Element\n if ((e.tagName || \"\").replace(/^[^:]+:/, \"\") !== \"fontface\") continue\n if (!firstGroup) firstGroup = e\n if ((e.getAttribute(\"lang\") ?? \"\").toUpperCase() === \"HANGUL\") { group = e; break }\n }\n group = group ?? firstGroup\n if (!group) return map\n for (const ch of Array.from(group.childNodes)) {\n if (ch.nodeType !== 1) continue\n const e = ch as Element\n if ((e.tagName || \"\").replace(/^[^:]+:/, \"\") !== \"font\") continue\n const id = e.getAttribute(\"id\")\n const face = e.getAttribute(\"face\")\n if (id != null && face) map.set(id, face)\n }\n return map\n}\n\n/** \"0.12 mm\" / \"0.5 mm\" → pt */\nfunction borderWidthPt(v: string | null | undefined): number {\n const n = parseFloat(v ?? \"\")\n if (!Number.isFinite(n)) return 0.34\n return n * 2.834645 // mm → pt\n}\n\nfunction parseEdge(el: Element | null): RenderBorderEdge | undefined {\n if (!el) return undefined\n const type = el.getAttribute(\"type\") ?? \"NONE\"\n if (type === \"NONE\") return undefined\n return { type, widthPt: borderWidthPt(el.getAttribute(\"width\")), color: el.getAttribute(\"color\") ?? \"#000000\" }\n}\n\n/** 서브트리에서 localName이 일치하는 첫 요소를 재귀 탐색 (switch/case 래핑 대응) */\nfunction findDeep(el: Element, name: string, depth = 0): Element | null {\n if (depth > 32) return null\n const children = el.childNodes\n if (!children) return null\n for (let i = 0; i < children.length; i++) {\n const ch = children[i]\n if (ch.nodeType !== 1) continue\n const e = ch as Element\n if ((e.tagName || \"\").replace(/^[^:]+:/, \"\") === name) return e\n const found = findDeep(e, name, depth + 1)\n if (found) return found\n }\n return null\n}\n\n/** paraPr 요소 → 문단 기하 (margin·lineSpacing은 hp:switch/case 안이라 재귀 탐색) */\nfunction parseParaGeom(el: Element): RenderParaGeom {\n const g: RenderParaGeom = { ...DEFAULT_PARA_GEOM }\n const condense = Number(el.getAttribute(\"condense\")) || 0\n if (condense > 0) g.condense = condense\n const ls = findDeep(el, \"lineSpacing\")\n if (ls) {\n g.lineSpacingType = ls.getAttribute(\"type\") ?? \"PERCENT\"\n g.lineSpacingValue = Number(ls.getAttribute(\"value\")) || 160\n }\n const margin = findDeep(el, \"margin\")\n if (margin) {\n const v = (n: string): number => {\n const c = findDeep(margin, n)\n return c ? Number(c.getAttribute(\"value\")) || 0 : 0\n }\n g.marginLeft = v(\"left\")\n g.marginRight = v(\"right\")\n g.marginIntent = v(\"intent\")\n g.spaceBefore = v(\"prev\")\n g.spaceAfter = v(\"next\")\n }\n const bs = findDeep(el, \"breakSetting\")\n if (bs) {\n // 속성 의미 역전 주의(위 RenderParaGeom.wrapMode 주석): BREAK_WORD=어절, KEEP_WORD=글자\n const nl = bs.getAttribute(\"breakNonLatinWord\")\n if (nl === \"BREAK_WORD\") g.wrapMode = \"keep\"\n else if (nl === \"KEEP_WORD\") g.wrapMode = \"charAll\"\n }\n return g\n}\n\n/** header.xml(구버전 head.xml) → 렌더용 스타일 맵 */\nexport function parseRenderStyles(headXml: string): RenderStyles {\n const styles: RenderStyles = { charPr: new Map(), paraAlign: new Map(), paraGeom: new Map(), borderFill: new Map() }\n const doc = createXmlParser().parseFromString(headXml, \"text/xml\")\n const root = doc.documentElement as unknown as Element | null\n if (!root) return styles\n\n // fontfaces(HANGUL) 선파싱 — charPr fontRef 해석에 쓴다\n const hangulFonts = collectHangulFonts(root)\n // 탭 정의 — 문단의 tabPrIDRef 는 워크가 끝난 뒤 해석(순서 무관)\n const autoTabPr = new Set<string>()\n const paraTabRef = new Map<string, string>()\n\n const walk = (el: Element): void => {\n const tag = (el.tagName || \"\").replace(/^[^:]+:/, \"\")\n if (tag === \"charPr\") {\n const id = el.getAttribute(\"id\")\n if (id != null) {\n const ratioEl = findChildByLocalName(el, \"ratio\")\n const spacingEl = findChildByLocalName(el, \"spacing\")\n const underlineEl = findChildByLocalName(el, \"underline\")\n const textColor = el.getAttribute(\"textColor\")\n const fontRef = findChildByLocalName(el, \"fontRef\")\n const fontId = fontRef?.getAttribute(\"hangul\") ?? fontRef?.getAttribute(\"latin\")\n const face = fontId != null ? hangulFonts.get(fontId) : undefined\n styles.charPr.set(id, {\n height: Number(el.getAttribute(\"height\")) || 1000,\n bold: findChildByLocalName(el, \"bold\") != null,\n italic: findChildByLocalName(el, \"italic\") != null,\n underline: underlineEl != null && (underlineEl.getAttribute(\"type\") ?? \"NONE\") !== \"NONE\",\n color: textColor && textColor !== \"#000000\" && textColor.toLowerCase() !== \"none\" ? textColor : undefined,\n ratio: Number(ratioEl?.getAttribute(\"hangul\")) || 100,\n spacing: Number(spacingEl?.getAttribute(\"hangul\")) || 0,\n fontFamily: face ? hwpFaceToCssStack(face) : undefined,\n face,\n })\n }\n } else if (tag === \"tabPr\") {\n const id = el.getAttribute(\"id\")\n if (id != null && el.getAttribute(\"autoTabLeft\") === \"1\") autoTabPr.add(id)\n } else if (tag === \"paraPr\") {\n const id = el.getAttribute(\"id\")\n if (id != null) {\n const align = findChildByLocalName(el, \"align\")\n styles.paraAlign.set(id, (align?.getAttribute(\"horizontal\") as ParaAlign) || \"JUSTIFY\")\n styles.paraGeom.set(id, parseParaGeom(el))\n const tab = el.getAttribute(\"tabPrIDRef\")\n if (tab != null) paraTabRef.set(id, tab)\n }\n } else if (tag === \"borderFill\") {\n const id = el.getAttribute(\"id\")\n if (id != null) {\n const bf: RenderBorderFill = {\n left: parseEdge(findChildByLocalName(el, \"leftBorder\")),\n right: parseEdge(findChildByLocalName(el, \"rightBorder\")),\n top: parseEdge(findChildByLocalName(el, \"topBorder\")),\n bottom: parseEdge(findChildByLocalName(el, \"bottomBorder\")),\n }\n const fillBrush = findChildByLocalName(el, \"fillBrush\")\n const winBrush = fillBrush ? findChildByLocalName(fillBrush, \"winBrush\") : null\n const face = winBrush?.getAttribute(\"faceColor\")\n if (face && face.toLowerCase() !== \"none\") bf.fill = face\n styles.borderFill.set(id, bf)\n }\n }\n const children = el.childNodes\n for (let i = 0; i < children.length; i++) {\n const ch = children[i]\n if (ch.nodeType === 1) walk(ch as Element)\n }\n }\n walk(root)\n for (const [id, tab] of paraTabRef) {\n const g = styles.paraGeom.get(id)\n if (g && autoTabPr.has(tab)) g.autoTabLeft = true\n }\n return styles\n}\n"],"mappings":";;;;;;;AAKA,SAAS,iBAAiB;;;ACMnB,IAAM,gBAAgB;AAGtB,SAAS,UAAU,IAAqB;AAC7C,UAAQ,GAAG,WAAW,GAAG,aAAa,IAAI,QAAQ,WAAW,EAAE;AACjE;AAGO,SAAS,qBAAqB,QAAiB,MAA8B;AAClF,QAAM,WAAW,OAAO;AACxB,MAAI,CAAC,SAAU,QAAO;AACtB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,KAAK,SAAS,CAAC;AACrB,QAAI,GAAG,aAAa,EAAG;AACvB,QAAI,UAAU,EAAE,MAAM,KAAM,QAAO;AAAA,EACrC;AACA,SAAO;AACT;AAGO,SAAS,oBAAoB,QAAiB,MAAyB;AAC5E,QAAM,MAAiB,CAAC;AACxB,QAAM,WAAW,OAAO;AACxB,MAAI,CAAC,SAAU,QAAO;AACtB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,KAAK,SAAS,CAAC;AACrB,QAAI,GAAG,aAAa,EAAG;AACvB,QAAI,UAAU,EAAE,MAAM,KAAM,KAAI,KAAK,EAAE;AAAA,EACzC;AACA,SAAO;AACT;AAGO,SAAS,gBAAgB,QAA4B;AAC1D,QAAM,MAAiB,CAAC;AACxB,QAAM,WAAW,OAAO;AACxB,MAAI,CAAC,SAAU,QAAO;AACtB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,QAAI,SAAS,CAAC,EAAE,aAAa,EAAG,KAAI,KAAK,SAAS,CAAC,CAAY;AAAA,EACjE;AACA,SAAO;AACT;AAMA,SAAS,WAAW,MAAqB;AACvC,SAAO,KAAK,aAAa,KAAK,KAAK,aAAa;AAClD;AAIO,SAAS,oBAAoB,MAAY,QAAgB,GAAW;AACzE,MAAI,SAAS;AACb,MAAI,QAAQ,cAAe,QAAO;AAClC,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SAAU,QAAO;AACtB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,SAAS,CAAC;AACxB,QAAI,WAAW,KAAK,EAAG,WAAU,MAAM,eAAe;AAAA,aAC7C,MAAM,aAAa,EAAG,WAAU,oBAAoB,OAAO,QAAQ,CAAC;AAAA,EAC/E;AACA,SAAO,OAAO,KAAK;AACrB;AAGO,SAAS,eAAe,MAAY,QAAgB,GAAW;AACpE,MAAI,QAAQ,cAAe,QAAO;AAClC,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,SAAS,CAAC;AACxB,QAAI,WAAW,KAAK,EAAG,OAAM,KAAK,MAAM,aAAa,EAAE;AAAA,aAC9C,MAAM,aAAa,EAAG,OAAM,KAAK,eAAe,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC5E;AACA,SAAO,MAAM,KAAK,EAAE;AACtB;;;ADzEO,IAAM,sBAAsB,gBAAgB,MAAM,OAAO,IAAI;AAE7D,IAAM,kBAAkB;AAIxB,IAAM,eAAN,cAA2B,YAAY;AAAA,EAC5C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAUO,SAAS,aAAa,MAAyB,MAA6B,OAAO,GAAiC;AACzH,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,QAAI,OAAO;AACX,UAAM,SAAS,KAAK,WAAW,YAAY;AAC3C,WAAO,GAAG,QAAQ,CAAC,UAAkB;AACnC,cAAQ,MAAM;AACd,UAAI,OAAO,OAAO,qBAAqB;AACrC,eAAO,MAAM;AACb,eAAO,IAAI,aAAa,iFAA+B,CAAC;AACxD;AAAA,MACF;AACA,aAAO,KAAK,KAAK;AAAA,IACnB,CAAC;AACD,WAAO,GAAG,SAAS,MAAM;AACzB,WAAO,GAAG,OAAO,MAAM;AACrB,UAAI,SAAS,OAAQ,QAAO,QAAQ,OAAO,OAAO,QAAQ,IAAI,EAAE,SAAS,OAAO,CAAC;AAEjF,YAAM,MAAM,IAAI,WAAW,IAAI;AAC/B,UAAI,KAAK;AACT,iBAAW,KAAK,QAAQ;AAAE,YAAI,IAAI,GAAG,EAAE;AAAG,cAAM,EAAE;AAAA,MAAO;AACzD,cAAQ,GAAG;AAAA,IACb,CAAC;AAAA,EACH,CAAC;AACH;AAGO,SAAS,UAAU,KAAa,KAAqB;AAC1D,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AACvC;AAmEO,SAAS,sBAAqC;AACnD,SAAO;AAAA,IACL,UAAU,oBAAI,IAAI;AAAA,IAClB,UAAU,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,IACrC,OAAO,EAAE,aAAa,GAAG,QAAQ,OAAO,gBAAgB,oBAAI,QAAQ,GAAG,kBAAkB,oBAAI,IAAI,EAAE;AAAA,IACnG,WAAW,EAAE,MAAM,GAAG,WAAW,KAAK;AAAA,IACtC,UAAU,oBAAI,IAAI;AAAA,EACpB;AACF;AAqBO,SAAS,gBAAgB,UAAsC;AACpE,SAAO,IAAI,UAAU;AAAA,IACnB,QAAQ,OAA2C,KAAa;AAC9D,UAAI,UAAU,aAAc,OAAM,IAAI,YAAY,kCAAc,GAAG,EAAE;AACrE,gBAAU,KAAK,EAAE,MAAM,iBAAiB,SAAS,OAAO,UAAU,YAAY,iBAAO,cAAI,KAAK,GAAG,GAAG,CAAC;AAAA,IACvG;AAAA,EACF,CAAC;AACH;AAGO,SAAS,cAAc,QAAmB,QAA6B;AAC5E,QAAM,EAAE,SAAS,QAAQ,IAAI,OAAO;AACpC,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,QAAQ,GAAG,QAAQ,IAAI,QAAM,EAAE,MAAM,aAAsB,MAAM,GAAG,YAAY,EAAE,EAAE,CAAC;AAAA,EAC9F;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,KAAK,GAAG,QAAQ,IAAI,QAAM,EAAE,MAAM,aAAsB,MAAM,EAAE,EAAE,CAAC;AAAA,EAC5E;AACF;;;AEhIO,IAAM,oBAAoC;AAAA,EAC/C,iBAAiB;AAAA,EAAW,kBAAkB;AAAA,EAC9C,YAAY;AAAA,EAAG,aAAa;AAAA,EAAG,cAAc;AAAA,EAAG,aAAa;AAAA,EAAG,YAAY;AAC9E;AA2BO,IAAM,eAAgC,EAAE,QAAQ,KAAM,MAAM,OAAO,QAAQ,OAAO,WAAW,OAAO,OAAO,KAAK,SAAS,EAAE;AAUlI,IAAM,eAAuC;AAAA,EAC3C,kCAAS;AAAA,EACT,4BAAQ;AAAA,EACR,kCAAS;AAAA,EACT,4BAAQ;AAAA,EACR,6BAAS;AAAA,EACT,4BAAQ;AAAA,EACR,gBAAM;AAAA,EACN,sBAAO;AAAA,EACP,gBAAM;AAAA,EACN,sBAAO;AAAA,EACP,gBAAM;AAAA,EACN,sBAAO;AAAA,EACP,gBAAM;AAAA,EACN,sBAAO;AAAA,EACP,4BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,uCAAmB;AACrB;AAGA,SAAS,YAAY,MAAuB;AAC1C,SAAO,4DAA4D,KAAK,IAAI;AAC9E;AAGA,SAAS,SAAS,MAAsB;AACtC,SAAO,mBAAmB,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,WAAW,EAAE,CAAC;AAC/E;AAMO,SAAS,kBAAkB,MAAyC;AACzE,QAAM,WAAW,QAAQ,IAAI,KAAK;AAClC,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,YAAY,OAAO,IAC/B,gDACA;AACJ,QAAM,OAAO,aAAa,OAAO,KAAK,SAAS,OAAO;AACtD,SAAO,GAAG,IAAI,IAAI,OAAO;AAC3B;AAGA,SAAS,mBAAmB,MAAoC;AAC9D,QAAM,MAAM,oBAAI,IAAoB;AACpC,QAAM,YAAY,CAAC,IAAa,UAAkC;AAChE,QAAI,QAAQ,GAAI,QAAO;AACvB,eAAW,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG;AAC1C,UAAI,GAAG,aAAa,EAAG;AACvB,YAAM,IAAI;AACV,WAAK,EAAE,WAAW,IAAI,QAAQ,WAAW,EAAE,MAAM,YAAa,QAAO;AACrE,YAAM,IAAI,UAAU,GAAG,QAAQ,CAAC;AAChC,UAAI,EAAG,QAAO;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,UAAU,MAAM,CAAC;AAC/B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,QAAwB;AAC5B,MAAI,aAA6B;AACjC,aAAW,MAAM,MAAM,KAAK,MAAM,UAAU,GAAG;AAC7C,QAAI,GAAG,aAAa,EAAG;AACvB,UAAM,IAAI;AACV,SAAK,EAAE,WAAW,IAAI,QAAQ,WAAW,EAAE,MAAM,WAAY;AAC7D,QAAI,CAAC,WAAY,cAAa;AAC9B,SAAK,EAAE,aAAa,MAAM,KAAK,IAAI,YAAY,MAAM,UAAU;AAAE,cAAQ;AAAG;AAAA,IAAM;AAAA,EACpF;AACA,UAAQ,SAAS;AACjB,MAAI,CAAC,MAAO,QAAO;AACnB,aAAW,MAAM,MAAM,KAAK,MAAM,UAAU,GAAG;AAC7C,QAAI,GAAG,aAAa,EAAG;AACvB,UAAM,IAAI;AACV,SAAK,EAAE,WAAW,IAAI,QAAQ,WAAW,EAAE,MAAM,OAAQ;AACzD,UAAM,KAAK,EAAE,aAAa,IAAI;AAC9B,UAAM,OAAO,EAAE,aAAa,MAAM;AAClC,QAAI,MAAM,QAAQ,KAAM,KAAI,IAAI,IAAI,IAAI;AAAA,EAC1C;AACA,SAAO;AACT;AAGA,SAAS,cAAc,GAAsC;AAC3D,QAAM,IAAI,WAAW,KAAK,EAAE;AAC5B,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,SAAO,IAAI;AACb;AAEA,SAAS,UAAU,IAAkD;AACnE,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,OAAO,GAAG,aAAa,MAAM,KAAK;AACxC,MAAI,SAAS,OAAQ,QAAO;AAC5B,SAAO,EAAE,MAAM,SAAS,cAAc,GAAG,aAAa,OAAO,CAAC,GAAG,OAAO,GAAG,aAAa,OAAO,KAAK,UAAU;AAChH;AAGA,SAAS,SAAS,IAAa,MAAc,QAAQ,GAAmB;AACtE,MAAI,QAAQ,GAAI,QAAO;AACvB,QAAM,WAAW,GAAG;AACpB,MAAI,CAAC,SAAU,QAAO;AACtB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,KAAK,SAAS,CAAC;AACrB,QAAI,GAAG,aAAa,EAAG;AACvB,UAAM,IAAI;AACV,SAAK,EAAE,WAAW,IAAI,QAAQ,WAAW,EAAE,MAAM,KAAM,QAAO;AAC9D,UAAM,QAAQ,SAAS,GAAG,MAAM,QAAQ,CAAC;AACzC,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAGA,SAAS,cAAc,IAA6B;AAClD,QAAM,IAAoB,EAAE,GAAG,kBAAkB;AACjD,QAAM,WAAW,OAAO,GAAG,aAAa,UAAU,CAAC,KAAK;AACxD,MAAI,WAAW,EAAG,GAAE,WAAW;AAC/B,QAAM,KAAK,SAAS,IAAI,aAAa;AACrC,MAAI,IAAI;AACN,MAAE,kBAAkB,GAAG,aAAa,MAAM,KAAK;AAC/C,MAAE,mBAAmB,OAAO,GAAG,aAAa,OAAO,CAAC,KAAK;AAAA,EAC3D;AACA,QAAM,SAAS,SAAS,IAAI,QAAQ;AACpC,MAAI,QAAQ;AACV,UAAM,IAAI,CAAC,MAAsB;AAC/B,YAAM,IAAI,SAAS,QAAQ,CAAC;AAC5B,aAAO,IAAI,OAAO,EAAE,aAAa,OAAO,CAAC,KAAK,IAAI;AAAA,IACpD;AACA,MAAE,aAAa,EAAE,MAAM;AACvB,MAAE,cAAc,EAAE,OAAO;AACzB,MAAE,eAAe,EAAE,QAAQ;AAC3B,MAAE,cAAc,EAAE,MAAM;AACxB,MAAE,aAAa,EAAE,MAAM;AAAA,EACzB;AACA,QAAM,KAAK,SAAS,IAAI,cAAc;AACtC,MAAI,IAAI;AAEN,UAAM,KAAK,GAAG,aAAa,mBAAmB;AAC9C,QAAI,OAAO,aAAc,GAAE,WAAW;AAAA,aAC7B,OAAO,YAAa,GAAE,WAAW;AAAA,EAC5C;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,SAA+B;AAC/D,QAAM,SAAuB,EAAE,QAAQ,oBAAI,IAAI,GAAG,WAAW,oBAAI,IAAI,GAAG,UAAU,oBAAI,IAAI,GAAG,YAAY,oBAAI,IAAI,EAAE;AACnH,QAAM,MAAM,gBAAgB,EAAE,gBAAgB,SAAS,UAAU;AACjE,QAAM,OAAO,IAAI;AACjB,MAAI,CAAC,KAAM,QAAO;AAGlB,QAAM,cAAc,mBAAmB,IAAI;AAE3C,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,aAAa,oBAAI,IAAoB;AAE3C,QAAM,OAAO,CAAC,OAAsB;AAClC,UAAM,OAAO,GAAG,WAAW,IAAI,QAAQ,WAAW,EAAE;AACpD,QAAI,QAAQ,UAAU;AACpB,YAAM,KAAK,GAAG,aAAa,IAAI;AAC/B,UAAI,MAAM,MAAM;AACd,cAAM,UAAU,qBAAqB,IAAI,OAAO;AAChD,cAAM,YAAY,qBAAqB,IAAI,SAAS;AACpD,cAAM,cAAc,qBAAqB,IAAI,WAAW;AACxD,cAAM,YAAY,GAAG,aAAa,WAAW;AAC7C,cAAM,UAAU,qBAAqB,IAAI,SAAS;AAClD,cAAM,SAAS,SAAS,aAAa,QAAQ,KAAK,SAAS,aAAa,OAAO;AAC/E,cAAM,OAAO,UAAU,OAAO,YAAY,IAAI,MAAM,IAAI;AACxD,eAAO,OAAO,IAAI,IAAI;AAAA,UACpB,QAAQ,OAAO,GAAG,aAAa,QAAQ,CAAC,KAAK;AAAA,UAC7C,MAAM,qBAAqB,IAAI,MAAM,KAAK;AAAA,UAC1C,QAAQ,qBAAqB,IAAI,QAAQ,KAAK;AAAA,UAC9C,WAAW,eAAe,SAAS,YAAY,aAAa,MAAM,KAAK,YAAY;AAAA,UACnF,OAAO,aAAa,cAAc,aAAa,UAAU,YAAY,MAAM,SAAS,YAAY;AAAA,UAChG,OAAO,OAAO,SAAS,aAAa,QAAQ,CAAC,KAAK;AAAA,UAClD,SAAS,OAAO,WAAW,aAAa,QAAQ,CAAC,KAAK;AAAA,UACtD,YAAY,OAAO,kBAAkB,IAAI,IAAI;AAAA,UAC7C;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAAW,QAAQ,SAAS;AAC1B,YAAM,KAAK,GAAG,aAAa,IAAI;AAC/B,UAAI,MAAM,QAAQ,GAAG,aAAa,aAAa,MAAM,IAAK,WAAU,IAAI,EAAE;AAAA,IAC5E,WAAW,QAAQ,UAAU;AAC3B,YAAM,KAAK,GAAG,aAAa,IAAI;AAC/B,UAAI,MAAM,MAAM;AACd,cAAM,QAAQ,qBAAqB,IAAI,OAAO;AAC9C,eAAO,UAAU,IAAI,IAAK,OAAO,aAAa,YAAY,KAAmB,SAAS;AACtF,eAAO,SAAS,IAAI,IAAI,cAAc,EAAE,CAAC;AACzC,cAAM,MAAM,GAAG,aAAa,YAAY;AACxC,YAAI,OAAO,KAAM,YAAW,IAAI,IAAI,GAAG;AAAA,MACzC;AAAA,IACF,WAAW,QAAQ,cAAc;AAC/B,YAAM,KAAK,GAAG,aAAa,IAAI;AAC/B,UAAI,MAAM,MAAM;AACd,cAAM,KAAuB;AAAA,UAC3B,MAAM,UAAU,qBAAqB,IAAI,YAAY,CAAC;AAAA,UACtD,OAAO,UAAU,qBAAqB,IAAI,aAAa,CAAC;AAAA,UACxD,KAAK,UAAU,qBAAqB,IAAI,WAAW,CAAC;AAAA,UACpD,QAAQ,UAAU,qBAAqB,IAAI,cAAc,CAAC;AAAA,QAC5D;AACA,cAAM,YAAY,qBAAqB,IAAI,WAAW;AACtD,cAAM,WAAW,YAAY,qBAAqB,WAAW,UAAU,IAAI;AAC3E,cAAM,OAAO,UAAU,aAAa,WAAW;AAC/C,YAAI,QAAQ,KAAK,YAAY,MAAM,OAAQ,IAAG,OAAO;AACrD,eAAO,WAAW,IAAI,IAAI,EAAE;AAAA,MAC9B;AAAA,IACF;AACA,UAAM,WAAW,GAAG;AACpB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,KAAK,SAAS,CAAC;AACrB,UAAI,GAAG,aAAa,EAAG,MAAK,EAAa;AAAA,IAC3C;AAAA,EACF;AACA,OAAK,IAAI;AACT,aAAW,CAAC,IAAI,GAAG,KAAK,YAAY;AAClC,UAAM,IAAI,OAAO,SAAS,IAAI,EAAE;AAChC,QAAI,KAAK,UAAU,IAAI,GAAG,EAAG,GAAE,cAAc;AAAA,EAC/C;AACA,SAAO;AACT;","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
KordocError,
|
|
4
4
|
OPTIONAL_DEP_INSTALL_HINT
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-3QFNMDZP.js";
|
|
6
6
|
|
|
7
7
|
// src/render/rasterize.ts
|
|
8
8
|
var densityExponent = null;
|
|
@@ -88,4 +88,4 @@ export {
|
|
|
88
88
|
rasterizeSvg,
|
|
89
89
|
rasterizePageSvg
|
|
90
90
|
};
|
|
91
|
-
//# sourceMappingURL=chunk-
|
|
91
|
+
//# sourceMappingURL=chunk-4A7JRTHE.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
KordocError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-3QFNMDZP.js";
|
|
5
5
|
|
|
6
6
|
// src/hwpx/profile-io.ts
|
|
7
7
|
import { z } from "zod";
|
|
@@ -89,4 +89,4 @@ export {
|
|
|
89
89
|
formatProfileSchema,
|
|
90
90
|
parseFormatProfileJson
|
|
91
91
|
};
|
|
92
|
-
//# sourceMappingURL=chunk-
|
|
92
|
+
//# sourceMappingURL=chunk-4IWKVH6O.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkHXPMM4PRcjs = require('./chunk-HXPMM4PR.cjs');
|
|
5
5
|
|
|
6
6
|
// src/script-tags.ts
|
|
7
7
|
var LITERAL_TAG = /<(?=\/?(?:u|sup|sub)>)/g;
|
|
@@ -842,7 +842,7 @@ function blocksToMarkdown(blocks, options) {
|
|
|
842
842
|
if (_optionalChain([block, 'access', _32 => _32.spans, 'optionalAccess', _33 => _33.length])) {
|
|
843
843
|
let rendered = spansToMarkdown(block.spans);
|
|
844
844
|
if (block.href) {
|
|
845
|
-
const href =
|
|
845
|
+
const href = _chunkHXPMM4PRcjs.sanitizeHref.call(void 0, block.href);
|
|
846
846
|
if (href) rendered = `[${rendered}](${href})`;
|
|
847
847
|
}
|
|
848
848
|
if (block.footnoteText) rendered += ` (\uC8FC: ${block.footnoteText})`;
|
|
@@ -850,7 +850,7 @@ function blocksToMarkdown(blocks, options) {
|
|
|
850
850
|
continue;
|
|
851
851
|
}
|
|
852
852
|
if (block.href) {
|
|
853
|
-
const href =
|
|
853
|
+
const href = _chunkHXPMM4PRcjs.sanitizeHref.call(void 0, block.href);
|
|
854
854
|
if (href) text = `[${text}](${href})`;
|
|
855
855
|
}
|
|
856
856
|
if (block.footnoteText) {
|
|
@@ -922,7 +922,7 @@ function visibleText(b) {
|
|
|
922
922
|
return _optionalChain([b, 'access', _44 => _44.spans, 'optionalAccess', _45 => _45.some, 'call', _46 => _46((s) => s.placeholder)]) ? b.spans.filter((s) => !s.placeholder).map((s) => s.text).join("") : _nullishCoalesce(b.text, () => ( ""));
|
|
923
923
|
}
|
|
924
924
|
function escapeHtmlCellText(text) {
|
|
925
|
-
return
|
|
925
|
+
return _chunkHXPMM4PRcjs.escapeHtml.call(void 0, text).replace(/(\\)?<(\/?)(u|sup|sub)>/g, (_, esc, sl, tag) => esc ? `<${sl}${tag}>` : `<${sl}${tag}>`);
|
|
926
926
|
}
|
|
927
927
|
function cellInnerHtml(cell) {
|
|
928
928
|
if (_optionalChain([cell, 'access', _47 => _47.blocks, 'optionalAccess', _48 => _48.length])) {
|
|
@@ -931,7 +931,7 @@ function cellInnerHtml(cell) {
|
|
|
931
931
|
const cap = captionToHtml(b.table);
|
|
932
932
|
return (cap ? cap + "<br>" : "") + tableToHtml(b.table);
|
|
933
933
|
}
|
|
934
|
-
if (b.type === "image" && b.text) return `<img src="${
|
|
934
|
+
if (b.type === "image" && b.text) return `<img src="${_chunkHXPMM4PRcjs.escapeHtml.call(void 0, b.text, true)}" alt="image">`;
|
|
935
935
|
const t = (sanitizeText(visibleText(b)) + noteSuffix(b)).trim();
|
|
936
936
|
return t ? escapeHtmlCellText(t).replace(/\n/g, "<br>") : "";
|
|
937
937
|
}).filter(Boolean).join("<br>");
|
|
@@ -1360,4 +1360,4 @@ var HEADING_RATIO_H3 = 1.15;
|
|
|
1360
1360
|
|
|
1361
1361
|
|
|
1362
1362
|
exports.escapeLiteralTags = escapeLiteralTags; exports.wrapScript = wrapScript; exports.tidyScriptTags = tidyScriptTags; exports.plainScripts = plainScripts; exports.stripScriptTags = stripScriptTags; exports.WINGDINGS = WINGDINGS; exports.mapPuaText = mapPuaText; exports.MAX_COLS = MAX_COLS; exports.MAX_ROWS = MAX_ROWS; exports.MAX_TABLE_CELLS = MAX_TABLE_CELLS; exports.buildTable = buildTable; exports.convertTableToText = convertTableToText; exports.escapeGfm = escapeGfm; exports.escapeLiteralDollar = escapeLiteralDollar; exports.sanitizeText = sanitizeText; exports.markNonLayoutTable = markNonLayoutTable; exports.flattenLayoutTables = flattenLayoutTables; exports.dedupeRunningHeaders = dedupeRunningHeaders; exports.assignTableIds = assignTableIds; exports.blocksToMarkdown = blocksToMarkdown; exports.hasStructuredCellContent = hasStructuredCellContent; exports.noteSuffix = noteSuffix; exports.escapeHtmlCellText = escapeHtmlCellText; exports.CELL_EDGES = CELL_EDGES; exports.CELL_PAGES = CELL_PAGES; exports.CONTENT_CELLS = CONTENT_CELLS; exports.CELL_BASELINES = CELL_BASELINES; exports.unframeLayoutTables = unframeLayoutTables; exports.HEADING_RATIO_H1 = HEADING_RATIO_H1; exports.HEADING_RATIO_H2 = HEADING_RATIO_H2; exports.HEADING_RATIO_H3 = HEADING_RATIO_H3;
|
|
1363
|
-
//# sourceMappingURL=chunk-
|
|
1363
|
+
//# sourceMappingURL=chunk-5JWHW4UV.cjs.map
|