kordoc 4.21.14 → 4.21.16
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 +9 -5
- package/dist/{-NFGEXZS2.js → -UXYZMTS3.js} +11 -11
- package/dist/{chunk-7B52XW7E.js → chunk-23MZM3TB.js} +2 -2
- package/dist/{chunk-Q7LA7Y5H.js → chunk-3QH3YMYN.js} +31 -26
- package/dist/chunk-3QH3YMYN.js.map +1 -0
- package/dist/{chunk-3UJ6J7KL.js → chunk-6NKVRRRA.js} +2 -2
- package/dist/{chunk-RXRXI562.js → chunk-BDAZLHIX.js} +2 -2
- package/dist/{chunk-7XFNVRLJ.js → chunk-BH3YWFQ2.js} +2 -2
- package/dist/{chunk-FYEAXEAU.js → chunk-DOMPCV2Y.js} +31 -9
- package/dist/chunk-DOMPCV2Y.js.map +1 -0
- package/dist/{chunk-RAD7PPJQ.js → chunk-EOFOH42T.js} +2 -2
- package/dist/{chunk-PTI4VSCS.js → chunk-FCMPZH3C.js} +2 -2
- package/dist/{chunk-VABASIVA.js → chunk-HU57WCBC.js} +2 -2
- package/dist/{chunk-CEEO4Y4C.js → chunk-IWVUM6HF.js} +2 -2
- package/dist/{chunk-UPXNSQ5W.cjs → chunk-KZ7BA2OM.cjs} +169 -147
- package/dist/chunk-KZ7BA2OM.cjs.map +1 -0
- package/dist/{chunk-GYXBK3TK.cjs → chunk-LUU44ZTY.cjs} +2 -2
- package/dist/{chunk-GYXBK3TK.cjs.map → chunk-LUU44ZTY.cjs.map} +1 -1
- package/dist/{chunk-GUQJMYX7.js → chunk-LVIKAUU4.js} +2 -2
- package/dist/{chunk-YC2DUW3G.cjs → chunk-MV5HIQHU.cjs} +3 -3
- package/dist/{chunk-YC2DUW3G.cjs.map → chunk-MV5HIQHU.cjs.map} +1 -1
- package/dist/{chunk-VU4YUOQA.js → chunk-N5RIWVIC.js} +2 -2
- package/dist/{chunk-7XC65KUP.js → chunk-OWWX5UTD.js} +2 -2
- package/dist/{chunk-IUGKBJ6H.js → chunk-P5QIWYVM.js} +2 -2
- package/dist/{chunk-VVSSEJ3D.js → chunk-RAZWJ3U7.js} +3 -3
- package/dist/{chunk-BSAE6CWF.js → chunk-RMJJKX2G.js} +4 -4
- package/dist/{chunk-MYXET3LQ.cjs → chunk-SEC3LWGT.cjs} +3 -3
- package/dist/{chunk-MYXET3LQ.cjs.map → chunk-SEC3LWGT.cjs.map} +1 -1
- package/dist/{chunk-FMNZ6LKP.js → chunk-SRE2WOSL.js} +2 -2
- package/dist/{chunk-KIRVVFUF.js → chunk-STTG6A4U.js} +3 -3
- package/dist/{chunk-SRBAZZ2Q.js → chunk-TQY3IMGY.js} +6 -6
- package/dist/{chunk-YZEC34PY.js → chunk-U7NXCGTB.js} +2 -2
- package/dist/{chunk-IPIEHRZD.js → chunk-VPTFJTYT.js} +32 -10
- package/dist/chunk-VPTFJTYT.js.map +1 -0
- package/dist/{chunk-WITNFNK6.cjs → chunk-WKVTKR3B.cjs} +13 -13
- package/dist/{chunk-WITNFNK6.cjs.map → chunk-WKVTKR3B.cjs.map} +1 -1
- package/dist/{chunk-U3HNKUQO.js → chunk-XUXC3BZ6.js} +3 -3
- package/dist/{chunk-3MO374RM.js → chunk-XWBPXHKP.js} +2 -2
- package/dist/{chunk-REYOYRL3.cjs → chunk-ZKWQZOIL.cjs} +6 -6
- package/dist/{chunk-REYOYRL3.cjs.map → chunk-ZKWQZOIL.cjs.map} +1 -1
- package/dist/chunks-UPIVB4EW.js +10 -0
- package/dist/cli.js +30 -30
- package/dist/{formula-FDDOXS7W.js → formula-H5LADM66.js} +4 -4
- package/dist/{formula-FQANVEI4.js → formula-I7EOO6S2.js} +3 -3
- package/dist/{formula-LIPU2JQQ.cjs → formula-VC5F4S7C.cjs} +9 -9
- package/dist/{formula-LIPU2JQQ.cjs.map → formula-VC5F4S7C.cjs.map} +1 -1
- package/dist/{image-ocr-YM73PHV7.js → image-ocr-2DT5BU34.js} +6 -6
- package/dist/{image-ocr-WTX4WHZU.js → image-ocr-UDTUNF63.js} +9 -9
- package/dist/{image-ocr-VGTOXH7Y.cjs → image-ocr-VC3T6KFN.cjs} +15 -15
- package/dist/{image-ocr-VGTOXH7Y.cjs.map → image-ocr-VC3T6KFN.cjs.map} +1 -1
- package/dist/index.cjs +297 -292
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +26 -21
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +22 -22
- package/dist/{model-bundle-YEHT4JUO.js → model-bundle-Z37CFFMW.js} +5 -5
- package/dist/{models-4ASIMFAV.js → models-GS4DRBDG.js} +5 -5
- package/dist/{parse-worker-v2-N62RC6TH.js → parse-worker-v2-WH3CMHIN.js} +12 -12
- package/dist/{parser-SWNM5NK4.cjs → parser-DFVRE7YF.cjs} +164 -135
- package/dist/parser-DFVRE7YF.cjs.map +1 -0
- package/dist/{parser-V22O4XMF.js → parser-IKWLVTWU.js} +41 -12
- package/dist/{parser-2FYGOCTK.js.map → parser-IKWLVTWU.js.map} +1 -1
- package/dist/{parser-2FYGOCTK.js → parser-SMPMTT77.js} +38 -9
- package/dist/parser-SMPMTT77.js.map +1 -0
- package/dist/pdf-ocr-HMSF3BEC.js +22 -0
- package/dist/pdf-ocr-QJ6TWDGK.cjs +19 -0
- package/dist/{pdf-ocr-5EIZ6FQK.cjs.map → pdf-ocr-QJ6TWDGK.cjs.map} +1 -1
- package/dist/pdf-ocr-VSDGQ5HT.js +18 -0
- package/dist/{profile-io-SENGZT4A.js → profile-io-TVR55F6Z.js} +3 -3
- package/dist/{rasterize-AB4REB2Q.js → rasterize-ZTYN7LUB.js} +3 -3
- package/dist/{redact-doc-BWRZ3VTR.js → redact-doc-6RFML2CI.js} +11 -11
- package/dist/{render-QZUTDY63.js → render-YEB6SN2W.js} +7 -7
- package/dist/seal-35ET5BXB.js +10 -0
- package/dist/{setup-VT7WZC6T.js → setup-MBNEN7OK.js} +3 -3
- package/dist/visual-GBJCSTDI.js +20 -0
- package/dist/{watch-KZ233B4K.js → watch-GAZ3L6JO.js} +12 -12
- package/package.json +1 -1
- package/dist/chunk-FYEAXEAU.js.map +0 -1
- package/dist/chunk-IPIEHRZD.js.map +0 -1
- package/dist/chunk-Q7LA7Y5H.js.map +0 -1
- package/dist/chunk-UPXNSQ5W.cjs.map +0 -1
- package/dist/chunks-2GLJOAET.js +0 -10
- package/dist/parser-SWNM5NK4.cjs.map +0 -1
- package/dist/parser-V22O4XMF.js.map +0 -1
- package/dist/pdf-ocr-5EIZ6FQK.cjs +0 -19
- package/dist/pdf-ocr-B2PXMZR6.js +0 -18
- package/dist/pdf-ocr-UCTWKFIX.js +0 -22
- package/dist/seal-EIKMOF6T.js +0 -10
- package/dist/visual-EGXR2HXY.js +0 -20
- /package/dist/{-NFGEXZS2.js.map → -UXYZMTS3.js.map} +0 -0
- /package/dist/{chunk-7B52XW7E.js.map → chunk-23MZM3TB.js.map} +0 -0
- /package/dist/{chunk-3UJ6J7KL.js.map → chunk-6NKVRRRA.js.map} +0 -0
- /package/dist/{chunk-RXRXI562.js.map → chunk-BDAZLHIX.js.map} +0 -0
- /package/dist/{chunk-7XFNVRLJ.js.map → chunk-BH3YWFQ2.js.map} +0 -0
- /package/dist/{chunk-RAD7PPJQ.js.map → chunk-EOFOH42T.js.map} +0 -0
- /package/dist/{chunk-PTI4VSCS.js.map → chunk-FCMPZH3C.js.map} +0 -0
- /package/dist/{chunk-VABASIVA.js.map → chunk-HU57WCBC.js.map} +0 -0
- /package/dist/{chunk-CEEO4Y4C.js.map → chunk-IWVUM6HF.js.map} +0 -0
- /package/dist/{chunk-GUQJMYX7.js.map → chunk-LVIKAUU4.js.map} +0 -0
- /package/dist/{chunk-VU4YUOQA.js.map → chunk-N5RIWVIC.js.map} +0 -0
- /package/dist/{chunk-7XC65KUP.js.map → chunk-OWWX5UTD.js.map} +0 -0
- /package/dist/{chunk-IUGKBJ6H.js.map → chunk-P5QIWYVM.js.map} +0 -0
- /package/dist/{chunk-VVSSEJ3D.js.map → chunk-RAZWJ3U7.js.map} +0 -0
- /package/dist/{chunk-BSAE6CWF.js.map → chunk-RMJJKX2G.js.map} +0 -0
- /package/dist/{chunk-FMNZ6LKP.js.map → chunk-SRE2WOSL.js.map} +0 -0
- /package/dist/{chunk-KIRVVFUF.js.map → chunk-STTG6A4U.js.map} +0 -0
- /package/dist/{chunk-SRBAZZ2Q.js.map → chunk-TQY3IMGY.js.map} +0 -0
- /package/dist/{chunk-YZEC34PY.js.map → chunk-U7NXCGTB.js.map} +0 -0
- /package/dist/{chunk-U3HNKUQO.js.map → chunk-XUXC3BZ6.js.map} +0 -0
- /package/dist/{chunk-3MO374RM.js.map → chunk-XWBPXHKP.js.map} +0 -0
- /package/dist/{chunks-2GLJOAET.js.map → chunks-UPIVB4EW.js.map} +0 -0
- /package/dist/{formula-FDDOXS7W.js.map → formula-H5LADM66.js.map} +0 -0
- /package/dist/{formula-FQANVEI4.js.map → formula-I7EOO6S2.js.map} +0 -0
- /package/dist/{image-ocr-YM73PHV7.js.map → image-ocr-2DT5BU34.js.map} +0 -0
- /package/dist/{image-ocr-WTX4WHZU.js.map → image-ocr-UDTUNF63.js.map} +0 -0
- /package/dist/{model-bundle-YEHT4JUO.js.map → model-bundle-Z37CFFMW.js.map} +0 -0
- /package/dist/{models-4ASIMFAV.js.map → models-GS4DRBDG.js.map} +0 -0
- /package/dist/{parse-worker-v2-N62RC6TH.js.map → parse-worker-v2-WH3CMHIN.js.map} +0 -0
- /package/dist/{pdf-ocr-B2PXMZR6.js.map → pdf-ocr-HMSF3BEC.js.map} +0 -0
- /package/dist/{pdf-ocr-UCTWKFIX.js.map → pdf-ocr-VSDGQ5HT.js.map} +0 -0
- /package/dist/{profile-io-SENGZT4A.js.map → profile-io-TVR55F6Z.js.map} +0 -0
- /package/dist/{rasterize-AB4REB2Q.js.map → rasterize-ZTYN7LUB.js.map} +0 -0
- /package/dist/{redact-doc-BWRZ3VTR.js.map → redact-doc-6RFML2CI.js.map} +0 -0
- /package/dist/{render-QZUTDY63.js.map → render-YEB6SN2W.js.map} +0 -0
- /package/dist/{seal-EIKMOF6T.js.map → seal-35ET5BXB.js.map} +0 -0
- /package/dist/{setup-VT7WZC6T.js.map → setup-MBNEN7OK.js.map} +0 -0
- /package/dist/{visual-EGXR2HXY.js.map → visual-GBJCSTDI.js.map} +0 -0
- /package/dist/{watch-KZ233B4K.js.map → watch-GAZ3L6JO.js.map} +0 -0
package/README.md
CHANGED
|
@@ -12,7 +12,9 @@ HWP 3.x·5.x, HWPX, HWPML, PDF, XLS·XLSX, DOCX, PPTX, PNG·JPG·WebP를 Markdow
|
|
|
12
12
|
[English](README-EN.md) · [상세 사용법](docs/usage.md) · [벤치마크](docs/benchmarks.md) · [변경 이력](CHANGELOG.md)
|
|
13
13
|
|
|
14
14
|
- 📊 **PDF 공개 벤치 종합 0.963** — opendataloader-bench 200문서. 공개 12개 파서 비교 1위(2026-09-29 기록). [측정 조건](docs/benchmarks.md)
|
|
15
|
-
- 🇰🇷 **한국 공문서 표 구조 100%** — 원본 HWPX 2,424문서의 보이는 표 **10,342개 전부 구조 일치**. [4.21.
|
|
15
|
+
- 🇰🇷 **한국 공문서 표 구조 100%** — 원본 HWPX 2,424문서의 보이는 표 **10,342개 전부 구조 일치**. [4.21.16 검증](docs/benchmarks.md)
|
|
16
|
+
|
|
17
|
+
쓸모 있었다면 GitHub ⭐ 하나 눌러주세요. 다른 사람이 이 도구를 찾는 데 도움이 됩니다.
|
|
16
18
|
|
|
17
19
|
[](https://youtu.be/Q13GmgDcIw0)
|
|
18
20
|
|
|
@@ -98,27 +100,29 @@ await writeFile("보고서.hwpx", Buffer.from(hwpx))
|
|
|
98
100
|
|
|
99
101
|
## 검증 결과
|
|
100
102
|
|
|
101
|
-
**4.21.
|
|
103
|
+
**4.21.16 · 2026-10-11 배포 검증**. 고정 코퍼스와 참조 기준으로 측정한 결과입니다.
|
|
102
104
|
|
|
103
105
|
| 대상 | 규모 | 결과 |
|
|
104
106
|
| --- | --- | --- |
|
|
105
107
|
| HWPX | 2,424문서 · 10,342표 | 표 구조 일치 **10,342/10,342 · 100%** |
|
|
106
108
|
| HWP 5.x ↔ HWPX | 1,130쌍 · 4,315표 | 짝 문서의 표 구조 일치 **100%** |
|
|
107
|
-
| PDF 글 | 744쌍 | 글자 재현율 **99.84%** · 정확도 **99.64%** · 읽기 순서 **99.16%** · 어절 F1 **98.
|
|
109
|
+
| PDF 글 | 744쌍 | 글자 재현율 **99.84%** · 정확도 **99.64%** · 읽기 순서 **99.16%** · 어절 F1 **98.98%** |
|
|
108
110
|
| PDF 표 | 708쌍 · 2,331표 | 표 탐지 **99.83%** · 구조 일치 **97.98%** · 칸 F1 **0.991** |
|
|
109
111
|
| PDF 전체 | 1,911문서 중 1,729건 채점 | 글 커버리지 **99.80%** |
|
|
110
112
|
| OCR | 53문서 · 102쪽 | CER **0.0412** · 글자 재현율 **99.02%** |
|
|
111
113
|
|
|
112
114
|
표 구조 점수와 셀 내용·화면 재현은 별도 지표입니다. 채점 범위·제외 기준·전 벤치 문서별 비교는 [벤치마크 상세](docs/benchmarks.md)에 있습니다.
|
|
113
115
|
|
|
114
|
-
외부 PDF 벤치 **opendataloader-bench 200문서**는 4.21.
|
|
116
|
+
외부 PDF 벤치 **opendataloader-bench 200문서**는 4.21.16 배포 측정에서 기본값 종합 **0.963**, OCR 끔 **0.939**입니다. [옵션별 결과와 재현 방법](docs/benchmarks.md#pdf--markdown--opendataloader-bench)
|
|
115
117
|
|
|
116
118
|
## 최근 업데이트
|
|
117
119
|
|
|
118
|
-
최신 배포: **[4.21.
|
|
120
|
+
최신 배포: **[4.21.16](https://github.com/chrisryugj/kordoc/releases/tag/v4.21.16)** · 2026-10-11
|
|
119
121
|
|
|
120
122
|
| 버전 | 주요 변경 |
|
|
121
123
|
| --- | --- |
|
|
124
|
+
| 4.21.16 | PDF 표 쪽 넘김 갈린 행의 수량 이어짐 — 머리 칸 "30%" / 다음 쪽 "미만" 을 한 칸으로; 공문서 autoFit.safety(다른 조판기용 한 줄 판정 여유) (법령 별표 PDF 표 97.40 → 97.69%) |
|
|
125
|
+
| 4.21.15 | PDF 줄 끝 공백 글리프로 어절 경계 꺾임 가르기 — 원문이 띄운 줄 꺾임("이루어⏎진다면")을 붙이던 것 (PDF 어절 F1 98.89 → 98.98%) |
|
|
122
126
|
| 4.21.14 | 한컴 PDF 유니코드 없는 기호 되살리기 — 자동 글머리표·괄호(U+F000)를 글꼴 윤곽 모양으로 "▸"·"□"·"《》"·"↓" 등으로; 텍스트층 커버리지 채점 기준 변경 (PDF 어절 F1 98.87 → 98.89%·글 재현율 99.83 → 99.84%) |
|
|
123
127
|
| 4.21.13 | PDF 법령 별표 쪽 넘김 행 — 번호 열이 다음 차례면 새 행, "가)" 항목도 다음 항목 머리로, 쪽을 넘는 긴 칸은 두 행을 덮는 한 칸으로; parse-worker 가 닫힌 stdout 에서 조용히 끝남(#142) (법령 별표 PDF 표 구조 일치 96.82 → 97.40%, 문서별 하락 0) |
|
|
124
128
|
| 4.21.12 | PDF 칸 숫자 줄·걸친 글상자·배분 이름표·첨자 겹침 — 칸을 채운 숫자 줄만 잇기, 서로 걸친 글상자는 글로, 숫자 행 배분 두 음절 붙이기, 붙은 첨자 겹침 허용 0.25em (PDF 어절 F1 98.86 → 98.87%·ODL 표 TEDS 0.9799 → 0.9802, 문서별 하락 0) |
|
|
@@ -54,17 +54,17 @@ import {
|
|
|
54
54
|
unknownFontWarnings,
|
|
55
55
|
usesGaejosikMunche,
|
|
56
56
|
validateHwpx
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-3QH3YMYN.js";
|
|
58
58
|
import {
|
|
59
59
|
blocksToPages
|
|
60
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-HU57WCBC.js";
|
|
61
61
|
import {
|
|
62
62
|
applySplices,
|
|
63
63
|
buildParagraphSplices,
|
|
64
64
|
buildRangeSplices,
|
|
65
65
|
placeSealHwpx,
|
|
66
66
|
scanSectionXml
|
|
67
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-RAZWJ3U7.js";
|
|
68
68
|
import {
|
|
69
69
|
DEFAULT_REDACT_RULES,
|
|
70
70
|
redactMarkdown,
|
|
@@ -72,7 +72,7 @@ import {
|
|
|
72
72
|
} from "./chunk-3WSNLH4B.js";
|
|
73
73
|
import {
|
|
74
74
|
blocksToChunks
|
|
75
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-XWBPXHKP.js";
|
|
76
76
|
import {
|
|
77
77
|
SPACE_EM_FIXED,
|
|
78
78
|
SPACE_EM_FONT,
|
|
@@ -97,20 +97,20 @@ import {
|
|
|
97
97
|
renderSceneToHtml,
|
|
98
98
|
simulateWrap,
|
|
99
99
|
simulateWrapKeepWord
|
|
100
|
-
} from "./chunk-
|
|
100
|
+
} from "./chunk-TQY3IMGY.js";
|
|
101
101
|
import "./chunk-7FCNOKOR.js";
|
|
102
|
-
import "./chunk-
|
|
102
|
+
import "./chunk-6NKVRRRA.js";
|
|
103
103
|
import "./chunk-VQFA55IC.js";
|
|
104
|
-
import "./chunk-
|
|
104
|
+
import "./chunk-SRE2WOSL.js";
|
|
105
105
|
import {
|
|
106
106
|
blocksToMarkdown,
|
|
107
107
|
flattenLayoutTables,
|
|
108
108
|
hasStructuredCellContent
|
|
109
|
-
} from "./chunk-
|
|
110
|
-
import "./chunk-
|
|
109
|
+
} from "./chunk-FCMPZH3C.js";
|
|
110
|
+
import "./chunk-EOFOH42T.js";
|
|
111
111
|
import {
|
|
112
112
|
VERSION
|
|
113
|
-
} from "./chunk-
|
|
113
|
+
} from "./chunk-OWWX5UTD.js";
|
|
114
114
|
export {
|
|
115
115
|
AGENCY_COMMON_NAME,
|
|
116
116
|
BUILTIN_TEMPLATES,
|
|
@@ -204,4 +204,4 @@ export {
|
|
|
204
204
|
usesGaejosikMunche,
|
|
205
205
|
validateHwpx
|
|
206
206
|
};
|
|
207
|
-
//# sourceMappingURL=-
|
|
207
|
+
//# sourceMappingURL=-UXYZMTS3.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
escapeHtml,
|
|
3
3
|
sanitizeHref
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-P5QIWYVM.js";
|
|
5
5
|
|
|
6
6
|
// src/script-tags.ts
|
|
7
7
|
var LITERAL_TAG = /<(?=\/?(?:u|sup|sub)>)/g;
|
|
@@ -1359,4 +1359,4 @@ export {
|
|
|
1359
1359
|
HEADING_RATIO_H2,
|
|
1360
1360
|
HEADING_RATIO_H3
|
|
1361
1361
|
};
|
|
1362
|
-
//# sourceMappingURL=chunk-
|
|
1362
|
+
//# sourceMappingURL=chunk-23MZM3TB.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
blocksToPages
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-HU57WCBC.js";
|
|
5
5
|
import {
|
|
6
6
|
allLinesegRemovalSplices,
|
|
7
7
|
applySplices,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
patchZipEntries,
|
|
17
17
|
readZipEntries,
|
|
18
18
|
scanSectionXml
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-RAZWJ3U7.js";
|
|
20
20
|
import {
|
|
21
21
|
CONVERT_MAP,
|
|
22
22
|
FLAG_COMPRESSED,
|
|
@@ -67,7 +67,7 @@ import {
|
|
|
67
67
|
romanNumeral,
|
|
68
68
|
simulateWrap,
|
|
69
69
|
takeTocLeaders
|
|
70
|
-
} from "./chunk-
|
|
70
|
+
} from "./chunk-TQY3IMGY.js";
|
|
71
71
|
import {
|
|
72
72
|
inlineImagesIntoMarkdown
|
|
73
73
|
} from "./chunk-7FCNOKOR.js";
|
|
@@ -82,7 +82,7 @@ import {
|
|
|
82
82
|
tidyScriptTags,
|
|
83
83
|
unframeLayoutTables,
|
|
84
84
|
wrapScript
|
|
85
|
-
} from "./chunk-
|
|
85
|
+
} from "./chunk-6NKVRRRA.js";
|
|
86
86
|
import {
|
|
87
87
|
parsePageRange
|
|
88
88
|
} from "./chunk-VQFA55IC.js";
|
|
@@ -102,7 +102,7 @@ import {
|
|
|
102
102
|
localName,
|
|
103
103
|
rawTextContent,
|
|
104
104
|
readZipEntry
|
|
105
|
-
} from "./chunk-
|
|
105
|
+
} from "./chunk-SRE2WOSL.js";
|
|
106
106
|
import {
|
|
107
107
|
MAX_COLS,
|
|
108
108
|
MAX_ROWS,
|
|
@@ -117,7 +117,7 @@ import {
|
|
|
117
117
|
hasStructuredCellContent,
|
|
118
118
|
mapPuaText,
|
|
119
119
|
noteSuffix
|
|
120
|
-
} from "./chunk-
|
|
120
|
+
} from "./chunk-FCMPZH3C.js";
|
|
121
121
|
import {
|
|
122
122
|
KordocError,
|
|
123
123
|
classifyError,
|
|
@@ -133,7 +133,7 @@ import {
|
|
|
133
133
|
toArrayBuffer,
|
|
134
134
|
unescapeHtml,
|
|
135
135
|
unzipLimitBytes
|
|
136
|
-
} from "./chunk-
|
|
136
|
+
} from "./chunk-OWWX5UTD.js";
|
|
137
137
|
|
|
138
138
|
// src/table/visual.ts
|
|
139
139
|
import { readFile as readFile2 } from "fs/promises";
|
|
@@ -20517,12 +20517,13 @@ function buildTitleBox(title, titleCharPr, barCharPr, bodyWidth, reg) {
|
|
|
20517
20517
|
// src/hwpx/fit-line.ts
|
|
20518
20518
|
var RATIOS = [100, 97, 95, 92, 90, 87, 85];
|
|
20519
20519
|
var SPACINGS = [0, -3, -5];
|
|
20520
|
-
function safety(faceClass, approx) {
|
|
20521
|
-
|
|
20520
|
+
function safety(faceClass, approx, limit) {
|
|
20521
|
+
const k = faceClass.startsWith("font:") ? 0.98 : approx;
|
|
20522
|
+
return limit === void 0 ? k : Math.min(k, limit);
|
|
20522
20523
|
}
|
|
20523
|
-
function fitOneLine(text, font, pt, availHu, minPt = Math.max(pt - 3, 10), minRatio = 85) {
|
|
20524
|
+
function fitOneLine(text, font, pt, availHu, minPt = Math.max(pt - 3, 10), minRatio = 85, safetyLimit) {
|
|
20524
20525
|
const faceClass = faceClassForGen(font);
|
|
20525
|
-
const avail = availHu * safety(faceClass, 0.98);
|
|
20526
|
+
const avail = availHu * safety(faceClass, 0.98, safetyLimit);
|
|
20526
20527
|
const fits = (p, r, s) => measureTextWidth(text, p * 100, r, { spacingPct: s, faceClass }) <= avail;
|
|
20527
20528
|
if (fits(pt, 100, 0)) return { pt, ratio: 100, spacing: 0, overflow: false };
|
|
20528
20529
|
const ratios = RATIOS.filter((r) => r >= minRatio);
|
|
@@ -20557,10 +20558,10 @@ function worstLooseness(text, starts, firstW, contW, h, ratio, spacing, faceClas
|
|
|
20557
20558
|
}
|
|
20558
20559
|
return worst;
|
|
20559
20560
|
}
|
|
20560
|
-
function fitParagraph(text, font, pt, firstW, contW, minRatio = 88, orphanRatio = ORPHAN_RATIO) {
|
|
20561
|
+
function fitParagraph(text, font, pt, firstW, contW, minRatio = 88, orphanRatio = ORPHAN_RATIO, safetyLimit) {
|
|
20561
20562
|
const faceClass = faceClassForGen(font);
|
|
20562
20563
|
const h = pt * 100;
|
|
20563
|
-
const k = safety(faceClass, 0.95);
|
|
20564
|
+
const k = safety(faceClass, 0.95, safetyLimit);
|
|
20564
20565
|
const f = firstW * k, c = contW * k;
|
|
20565
20566
|
const ladder = [[100, 0], ...SQUEEZE.filter(([r]) => r >= minRatio)];
|
|
20566
20567
|
const base = simulateWrap(text, f, c, h, 100, "keep", { faceClass });
|
|
@@ -20614,10 +20615,10 @@ function fitParagraph(text, font, pt, firstW, contW, minRatio = 88, orphanRatio
|
|
|
20614
20615
|
return best && (best.r !== 100 || best.sp !== 0) ? { ratio: best.r, spacing: best.sp } : null;
|
|
20615
20616
|
}
|
|
20616
20617
|
var LIST_BREAK = /* @__PURE__ */ new Set([..."\xB7,\u3001/"]);
|
|
20617
|
-
function fitCharBreaks(text, font, pt, firstW, contW, minRatio = 88) {
|
|
20618
|
+
function fitCharBreaks(text, font, pt, firstW, contW, minRatio = 88, safetyLimit) {
|
|
20618
20619
|
const faceClass = faceClassForGen(font);
|
|
20619
20620
|
const h = pt * 100;
|
|
20620
|
-
const k = safety(faceClass, 0.95);
|
|
20621
|
+
const k = safety(faceClass, 0.95, safetyLimit);
|
|
20621
20622
|
if (!text.split(/ +/).some((w) => measureTextWidth(w, h, 100, { faceClass }) > contW * k)) return null;
|
|
20622
20623
|
const prepared = prepareWrap(text, "charAll", { faceClass });
|
|
20623
20624
|
let best = null;
|
|
@@ -21270,6 +21271,9 @@ function validateGongmunOptions(opts) {
|
|
|
21270
21271
|
if (typeof opts.autoFit === "object" && opts.autoFit.minRatio !== void 0) {
|
|
21271
21272
|
assertFiniteRange("autoFit.minRatio", opts.autoFit.minRatio, 50, 99);
|
|
21272
21273
|
}
|
|
21274
|
+
if (typeof opts.autoFit === "object" && opts.autoFit.safety !== void 0) {
|
|
21275
|
+
assertFiniteRange("autoFit.safety", opts.autoFit.safety, 0.8, 1);
|
|
21276
|
+
}
|
|
21273
21277
|
if (opts.margins) {
|
|
21274
21278
|
for (const side of ["top", "bottom", "left", "right"]) {
|
|
21275
21279
|
const value = opts.margins[side];
|
|
@@ -21387,6 +21391,7 @@ function resolveGongmun(input) {
|
|
|
21387
21391
|
margins: opts.margins ?? (ministry ? MINISTRY_MARGINS : preset === "report" || preset === "plan" || preset === "bangchim" ? SEOUL_REPORT_MARGINS : reportFamily ? GAEJOSIK_MARGINS : OFFICIAL_MARGINS),
|
|
21388
21392
|
centerTitle: opts.centerTitle ?? true,
|
|
21389
21393
|
autoFitMinRatio,
|
|
21394
|
+
...typeof opts.autoFit === "object" && opts.autoFit.safety !== void 0 ? { autoFitSafety: opts.autoFit.safety } : {},
|
|
21390
21395
|
// 보도자료는 머리박스가 1페이지 최상단을 차지하는 서식이라 표지·목차와 양립 불가 —
|
|
21391
21396
|
// 켜면 머리박스가 표지에 얹히고 25pt 제목·부제가 유실된다 (docHead 프리셋 게이팅과 동일 관례)
|
|
21392
21397
|
cover: coverOn && preset !== "press" ? { date: coverOpts.date ?? null, org: coverOpts.org ?? "", ...coverOpts.dept ? { dept: coverOpts.dept } : {}, ...coverOpts.label ? { label: coverOpts.label } : {} } : null,
|
|
@@ -26104,7 +26109,7 @@ function buildGongmunSectionV5(blocks, gongmun, deps, theme) {
|
|
|
26104
26109
|
const textW2 = W2 - lay.left - lay.hang;
|
|
26105
26110
|
let ratio = 100, spacing = 0, charBreaks = false;
|
|
26106
26111
|
if (st.oneLine) {
|
|
26107
|
-
const fit = fitOneLine(plain2(node.text), st.font, st.pt, textW2, st.pt, 90);
|
|
26112
|
+
const fit = fitOneLine(plain2(node.text), st.font, st.pt, textW2, st.pt, 90, g.autoFitSafety);
|
|
26108
26113
|
if (fit.overflow) warnings.push(`\u25A1 \uD56D\uBAA9\uC774 \uD55C \uC904\uC5D0 \uB2F4\uAE30\uC9C0 \uC54A\uC544 \uB450 \uC904\uB85C \uAEBE\uC785\uB2C8\uB2E4 \u2014 \uBB38\uC7A5\uC744 \uC904\uC774\uC138\uC694(\uC7A5\uD3C9 90%\xB7\uC790\uAC04 -5 \uB85C\uB3C4 \uCD08\uACFC): "${node.text.slice(0, 30)}\u2026"`);
|
|
26109
26114
|
else {
|
|
26110
26115
|
ratio = fit.ratio;
|
|
@@ -26112,8 +26117,8 @@ function buildGongmunSectionV5(blocks, gongmun, deps, theme) {
|
|
|
26112
26117
|
}
|
|
26113
26118
|
} else {
|
|
26114
26119
|
const t = plain2(node.text);
|
|
26115
|
-
const cb = fitCharBreaks(t, st.font, st.pt, textW2, textW2, g.autoFitMinRatio ?? 101);
|
|
26116
|
-
const f = cb ?? (g.autoFitMinRatio !== null ? fitParagraph(t, st.font, st.pt, textW2, textW2, g.autoFitMinRatio) : null);
|
|
26120
|
+
const cb = fitCharBreaks(t, st.font, st.pt, textW2, textW2, g.autoFitMinRatio ?? 101, g.autoFitSafety);
|
|
26121
|
+
const f = cb ?? (g.autoFitMinRatio !== null ? fitParagraph(t, st.font, st.pt, textW2, textW2, g.autoFitMinRatio, void 0, g.autoFitSafety) : null);
|
|
26117
26122
|
if (f) {
|
|
26118
26123
|
ratio = f.ratio;
|
|
26119
26124
|
spacing = f.spacing;
|
|
@@ -26142,8 +26147,8 @@ function buildGongmunSectionV5(blocks, gongmun, deps, theme) {
|
|
|
26142
26147
|
const left = isMinistry ? st.leadTa * taHu(st.pt) : leadLeft(node.depth, st.pt);
|
|
26143
26148
|
const textW2 = W2 - left - lay.hang;
|
|
26144
26149
|
const t = plain2(node.text);
|
|
26145
|
-
const cb = fitCharBreaks(t, st.font, st.pt, textW2, textW2, g.autoFitMinRatio ?? 101);
|
|
26146
|
-
const f = cb ?? (g.autoFitMinRatio !== null ? fitParagraph(t, st.font, st.pt, textW2, textW2, g.autoFitMinRatio) : null);
|
|
26150
|
+
const cb = fitCharBreaks(t, st.font, st.pt, textW2, textW2, g.autoFitMinRatio ?? 101, g.autoFitSafety);
|
|
26151
|
+
const f = cb ?? (g.autoFitMinRatio !== null ? fitParagraph(t, st.font, st.pt, textW2, textW2, g.autoFitMinRatio, void 0, g.autoFitSafety) : null);
|
|
26147
26152
|
const base = { font: st.font, pt: st.pt, bold: st.bold, ratio: f?.ratio ?? 100, spacing: f?.spacing ?? 0 };
|
|
26148
26153
|
const paraId = reg.para({ align: st.align ?? "JUSTIFY", left, indent: -lay.hang, after: isMinistry ? 400 : 0, lineSp: isMinistry ? 130 : st.lineSp ?? scheme.lineSp, keepWord: !cb, autoTab: true, widowOrphan: true });
|
|
26149
26154
|
const markerRun = markerRunXml(marker, reg.char({ font: st.font, pt: st.pt, bold: st.bold }), lay);
|
|
@@ -26172,8 +26177,8 @@ function buildGongmunSectionV5(blocks, gongmun, deps, theme) {
|
|
|
26172
26177
|
let ratio = 100, spacing = 0, charBreaks = false;
|
|
26173
26178
|
if (!node.align) {
|
|
26174
26179
|
const t = plain2(node.text);
|
|
26175
|
-
const cb = fitCharBreaks(t, st.font, st.pt, W2, W2, g.autoFitMinRatio ?? 101);
|
|
26176
|
-
const f = cb ?? (g.autoFitMinRatio !== null ? fitParagraph(t, st.font, st.pt, W2, W2, g.autoFitMinRatio) : null);
|
|
26180
|
+
const cb = fitCharBreaks(t, st.font, st.pt, W2, W2, g.autoFitMinRatio ?? 101, g.autoFitSafety);
|
|
26181
|
+
const f = cb ?? (g.autoFitMinRatio !== null ? fitParagraph(t, st.font, st.pt, W2, W2, g.autoFitMinRatio, void 0, g.autoFitSafety) : null);
|
|
26177
26182
|
if (f) {
|
|
26178
26183
|
ratio = f.ratio;
|
|
26179
26184
|
spacing = f.spacing;
|
|
@@ -26215,7 +26220,7 @@ function buildGongmunSectionV5(blocks, gongmun, deps, theme) {
|
|
|
26215
26220
|
}
|
|
26216
26221
|
const label = chapterStyle === "none" ? "" : chapterLabel(node.index, chapterStyle === "number" ? "number" : "roman");
|
|
26217
26222
|
const text = label ? `${label} ${node.text}` : node.text;
|
|
26218
|
-
const fit = fitOneLine(plain2(text), st.font, st.pt, W2, st.pt - 2);
|
|
26223
|
+
const fit = fitOneLine(plain2(text), st.font, st.pt, W2, st.pt - 2, void 0, g.autoFitSafety);
|
|
26219
26224
|
const base = { font: st.font, pt: fit.pt, bold: st.bold, ratio: fit.ratio, spacing: fit.spacing };
|
|
26220
26225
|
const before = prevKind === "start" || prevKind === "title" || prevKind === "summary" ? 0 : lineHu(scheme.body);
|
|
26221
26226
|
const paraId = reg.para({ align: "LEFT", before, after: Math.round(lineHu(scheme.body) * 0.3), lineSp: st.lineSp ?? scheme.lineSp, keepWithNext: true });
|
|
@@ -30754,7 +30759,7 @@ function scriptsOff(r, off) {
|
|
|
30754
30759
|
}
|
|
30755
30760
|
async function parseImage(buffer, options) {
|
|
30756
30761
|
try {
|
|
30757
|
-
const { parseImageDocument } = await import("./image-ocr-
|
|
30762
|
+
const { parseImageDocument } = await import("./image-ocr-UDTUNF63.js");
|
|
30758
30763
|
const { blocks, warnings } = await parseImageDocument(buffer, options);
|
|
30759
30764
|
stripScriptTags({ blocks });
|
|
30760
30765
|
return {
|
|
@@ -30814,7 +30819,7 @@ async function parseHwp(buffer, options) {
|
|
|
30814
30819
|
async function parsePdf(buffer, options) {
|
|
30815
30820
|
let parsePdfDocument;
|
|
30816
30821
|
try {
|
|
30817
|
-
const mod = await import("./parser-
|
|
30822
|
+
const mod = await import("./parser-IKWLVTWU.js");
|
|
30818
30823
|
parsePdfDocument = mod.parsePdfDocument;
|
|
30819
30824
|
} catch {
|
|
30820
30825
|
return {
|
|
@@ -31044,4 +31049,4 @@ export {
|
|
|
31044
31049
|
parseHwpml,
|
|
31045
31050
|
fillForm
|
|
31046
31051
|
};
|
|
31047
|
-
//# sourceMappingURL=chunk-
|
|
31052
|
+
//# sourceMappingURL=chunk-3QH3YMYN.js.map
|