kordoc 4.21.20 → 4.21.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +7 -5
  2. package/dist/{-QHQ2QKM7.js → -PLOEMNCA.js} +11 -11
  3. package/dist/{chunk-LO5A36FU.js → chunk-3BJW5KXR.js} +2 -2
  4. package/dist/{chunk-AINZICPE.js → chunk-64MCJ5GC.js} +2 -2
  5. package/dist/{chunk-DBFAQJCX.js → chunk-64V65GZM.js} +3 -3
  6. package/dist/{chunk-N47I6OS7.js → chunk-6LJ22335.js} +6 -6
  7. package/dist/{chunk-I4HF4UCA.js → chunk-6Z4NAN36.js} +4 -4
  8. package/dist/{chunk-ZMGWKGSC.js → chunk-7MIA3IFO.js} +2 -2
  9. package/dist/{chunk-G6G25HUO.js → chunk-7TLZ56ZK.js} +2 -2
  10. package/dist/{chunk-F5PISJEI.js → chunk-BMQATDUY.js} +2 -2
  11. package/dist/{chunk-LQSF4JSV.js → chunk-BZC24YXS.js} +2 -2
  12. package/dist/{chunk-E5L6DUOE.js → chunk-EL7BGP7X.js} +3 -3
  13. package/dist/{chunk-75INFYVC.js → chunk-G4DVIZTZ.js} +2 -2
  14. package/dist/{chunk-F5KWC7I3.js → chunk-GYQGKVTQ.js} +82 -7
  15. package/dist/chunk-GYQGKVTQ.js.map +1 -0
  16. package/dist/{chunk-KS2SASZH.cjs → chunk-H5Q6J2MB.cjs} +6 -6
  17. package/dist/{chunk-KS2SASZH.cjs.map → chunk-H5Q6J2MB.cjs.map} +1 -1
  18. package/dist/{chunk-KBL24ZCP.js → chunk-H6EXISSP.js} +3 -3
  19. package/dist/{chunk-CKEO54YN.cjs → chunk-HY5O4B6O.cjs} +3 -3
  20. package/dist/{chunk-CKEO54YN.cjs.map → chunk-HY5O4B6O.cjs.map} +1 -1
  21. package/dist/{chunk-PALYDA3M.js → chunk-K7FP2VOU.js} +2 -2
  22. package/dist/{chunk-JDVOYDIA.js → chunk-KFJP2HYL.js} +2 -2
  23. package/dist/{chunk-2FALZL3E.cjs → chunk-LNKHTD47.cjs} +13 -13
  24. package/dist/{chunk-2FALZL3E.cjs.map → chunk-LNKHTD47.cjs.map} +1 -1
  25. package/dist/{chunk-FU3SCGE7.js → chunk-LZVOL2H2.js} +2 -2
  26. package/dist/{chunk-42XYVZ2B.js → chunk-M5SPGZKY.js} +2 -2
  27. package/dist/{chunk-BLKAJD2G.js → chunk-NT4LPP2I.js} +10 -10
  28. package/dist/{chunk-6HIDMA5O.js → chunk-PQW2RPZZ.js} +2 -2
  29. package/dist/{chunk-TYYKK5DX.js → chunk-PY72S2AG.js} +2 -2
  30. package/dist/{chunk-M37GOXT5.cjs → chunk-QSOWCFOV.cjs} +2 -2
  31. package/dist/{chunk-M37GOXT5.cjs.map → chunk-QSOWCFOV.cjs.map} +1 -1
  32. package/dist/{chunk-WWMHVDRG.cjs → chunk-QY627PK3.cjs} +3 -3
  33. package/dist/{chunk-WWMHVDRG.cjs.map → chunk-QY627PK3.cjs.map} +1 -1
  34. package/dist/{chunk-LY4ITNAL.js → chunk-SQSGBKCL.js} +81 -6
  35. package/dist/chunk-SQSGBKCL.js.map +1 -0
  36. package/dist/{chunk-MOT7WOP5.cjs → chunk-SZM6BSK4.cjs} +101 -26
  37. package/dist/chunk-SZM6BSK4.cjs.map +1 -0
  38. package/dist/{chunk-WINHSKFD.js → chunk-VUSPHKQ6.js} +2 -2
  39. package/dist/{chunk-7ITWGPNB.js → chunk-ZQZDGIN4.js} +2 -2
  40. package/dist/chunks-YV22WKEN.js +10 -0
  41. package/dist/cli.js +30 -30
  42. package/dist/{formula-KHPAZKOK.js → formula-I7GNHDP4.js} +4 -4
  43. package/dist/{formula-XAPMN6HX.js → formula-L4ISZCZ7.js} +3 -3
  44. package/dist/{formula-G5LTBMGC.cjs → formula-LDXFM42U.cjs} +9 -9
  45. package/dist/{formula-G5LTBMGC.cjs.map → formula-LDXFM42U.cjs.map} +1 -1
  46. package/dist/{image-ocr-RNPHQ4C2.js → image-ocr-BSAPJIFP.js} +6 -6
  47. package/dist/{image-ocr-N5LAIHRV.js → image-ocr-I7IVLLPD.js} +9 -9
  48. package/dist/{image-ocr-MHPVAYOB.cjs → image-ocr-NCKZ4EOH.cjs} +15 -15
  49. package/dist/{image-ocr-MHPVAYOB.cjs.map → image-ocr-NCKZ4EOH.cjs.map} +1 -1
  50. package/dist/index.cjs +276 -276
  51. package/dist/index.js +5 -5
  52. package/dist/mcp.js +22 -22
  53. package/dist/{model-bundle-XP4AHFLT.js → model-bundle-M3GRBX2A.js} +5 -5
  54. package/dist/{models-AD2KAUNC.js → models-5RXMJK6N.js} +5 -5
  55. package/dist/{parse-worker-v2-7UHOQ2TK.js → parse-worker-v2-72KKZMDO.js} +12 -12
  56. package/dist/{parser-5WGRQKPI.js → parser-AHSXHMAF.js} +16 -8
  57. package/dist/{parser-2RN5WNPJ.js.map → parser-AHSXHMAF.js.map} +1 -1
  58. package/dist/{parser-2RN5WNPJ.js → parser-QLNX2EFP.js} +19 -11
  59. package/dist/{parser-5WGRQKPI.js.map → parser-QLNX2EFP.js.map} +1 -1
  60. package/dist/{parser-ZPCCXCVO.cjs → parser-XQL37S4F.cjs} +142 -134
  61. package/dist/parser-XQL37S4F.cjs.map +1 -0
  62. package/dist/pdf-ocr-CR4W75XF.js +22 -0
  63. package/dist/pdf-ocr-FL32Z4MB.js +18 -0
  64. package/dist/pdf-ocr-V42HOZKB.cjs +19 -0
  65. package/dist/{pdf-ocr-SFIWMJQL.cjs.map → pdf-ocr-V42HOZKB.cjs.map} +1 -1
  66. package/dist/{profile-io-UP7H2J6I.js → profile-io-FTGHBFAH.js} +3 -3
  67. package/dist/{rasterize-XBCDG4MD.js → rasterize-346O4XV4.js} +3 -3
  68. package/dist/{redact-doc-CJ6W6YNR.js → redact-doc-O6UVSWKP.js} +11 -11
  69. package/dist/{render-K5UDHXRI.js → render-CUR3VCK5.js} +7 -7
  70. package/dist/seal-QUUK6RBL.js +10 -0
  71. package/dist/{setup-S66RLBBM.js → setup-6EA7CJZU.js} +3 -3
  72. package/dist/visual-EMOEYBC4.js +20 -0
  73. package/dist/{watch-PB7IOD73.js → watch-EQRSWNAQ.js} +12 -12
  74. package/package.json +1 -1
  75. package/dist/chunk-F5KWC7I3.js.map +0 -1
  76. package/dist/chunk-LY4ITNAL.js.map +0 -1
  77. package/dist/chunk-MOT7WOP5.cjs.map +0 -1
  78. package/dist/chunks-BJRBKGKZ.js +0 -10
  79. package/dist/parser-ZPCCXCVO.cjs.map +0 -1
  80. package/dist/pdf-ocr-KHY3P4EP.js +0 -18
  81. package/dist/pdf-ocr-LFDH6DFD.js +0 -22
  82. package/dist/pdf-ocr-SFIWMJQL.cjs +0 -19
  83. package/dist/seal-YCK6TM5I.js +0 -10
  84. package/dist/visual-S5ZNFWFH.js +0 -20
  85. /package/dist/{-QHQ2QKM7.js.map → -PLOEMNCA.js.map} +0 -0
  86. /package/dist/{chunk-LO5A36FU.js.map → chunk-3BJW5KXR.js.map} +0 -0
  87. /package/dist/{chunk-AINZICPE.js.map → chunk-64MCJ5GC.js.map} +0 -0
  88. /package/dist/{chunk-DBFAQJCX.js.map → chunk-64V65GZM.js.map} +0 -0
  89. /package/dist/{chunk-N47I6OS7.js.map → chunk-6LJ22335.js.map} +0 -0
  90. /package/dist/{chunk-I4HF4UCA.js.map → chunk-6Z4NAN36.js.map} +0 -0
  91. /package/dist/{chunk-ZMGWKGSC.js.map → chunk-7MIA3IFO.js.map} +0 -0
  92. /package/dist/{chunk-G6G25HUO.js.map → chunk-7TLZ56ZK.js.map} +0 -0
  93. /package/dist/{chunk-F5PISJEI.js.map → chunk-BMQATDUY.js.map} +0 -0
  94. /package/dist/{chunk-LQSF4JSV.js.map → chunk-BZC24YXS.js.map} +0 -0
  95. /package/dist/{chunk-E5L6DUOE.js.map → chunk-EL7BGP7X.js.map} +0 -0
  96. /package/dist/{chunk-75INFYVC.js.map → chunk-G4DVIZTZ.js.map} +0 -0
  97. /package/dist/{chunk-KBL24ZCP.js.map → chunk-H6EXISSP.js.map} +0 -0
  98. /package/dist/{chunk-PALYDA3M.js.map → chunk-K7FP2VOU.js.map} +0 -0
  99. /package/dist/{chunk-JDVOYDIA.js.map → chunk-KFJP2HYL.js.map} +0 -0
  100. /package/dist/{chunk-FU3SCGE7.js.map → chunk-LZVOL2H2.js.map} +0 -0
  101. /package/dist/{chunk-42XYVZ2B.js.map → chunk-M5SPGZKY.js.map} +0 -0
  102. /package/dist/{chunk-BLKAJD2G.js.map → chunk-NT4LPP2I.js.map} +0 -0
  103. /package/dist/{chunk-6HIDMA5O.js.map → chunk-PQW2RPZZ.js.map} +0 -0
  104. /package/dist/{chunk-TYYKK5DX.js.map → chunk-PY72S2AG.js.map} +0 -0
  105. /package/dist/{chunk-WINHSKFD.js.map → chunk-VUSPHKQ6.js.map} +0 -0
  106. /package/dist/{chunk-7ITWGPNB.js.map → chunk-ZQZDGIN4.js.map} +0 -0
  107. /package/dist/{chunks-BJRBKGKZ.js.map → chunks-YV22WKEN.js.map} +0 -0
  108. /package/dist/{formula-KHPAZKOK.js.map → formula-I7GNHDP4.js.map} +0 -0
  109. /package/dist/{formula-XAPMN6HX.js.map → formula-L4ISZCZ7.js.map} +0 -0
  110. /package/dist/{image-ocr-RNPHQ4C2.js.map → image-ocr-BSAPJIFP.js.map} +0 -0
  111. /package/dist/{image-ocr-N5LAIHRV.js.map → image-ocr-I7IVLLPD.js.map} +0 -0
  112. /package/dist/{model-bundle-XP4AHFLT.js.map → model-bundle-M3GRBX2A.js.map} +0 -0
  113. /package/dist/{models-AD2KAUNC.js.map → models-5RXMJK6N.js.map} +0 -0
  114. /package/dist/{parse-worker-v2-7UHOQ2TK.js.map → parse-worker-v2-72KKZMDO.js.map} +0 -0
  115. /package/dist/{pdf-ocr-KHY3P4EP.js.map → pdf-ocr-CR4W75XF.js.map} +0 -0
  116. /package/dist/{pdf-ocr-LFDH6DFD.js.map → pdf-ocr-FL32Z4MB.js.map} +0 -0
  117. /package/dist/{profile-io-UP7H2J6I.js.map → profile-io-FTGHBFAH.js.map} +0 -0
  118. /package/dist/{rasterize-XBCDG4MD.js.map → rasterize-346O4XV4.js.map} +0 -0
  119. /package/dist/{redact-doc-CJ6W6YNR.js.map → redact-doc-O6UVSWKP.js.map} +0 -0
  120. /package/dist/{render-K5UDHXRI.js.map → render-CUR3VCK5.js.map} +0 -0
  121. /package/dist/{seal-YCK6TM5I.js.map → seal-QUUK6RBL.js.map} +0 -0
  122. /package/dist/{setup-S66RLBBM.js.map → setup-6EA7CJZU.js.map} +0 -0
  123. /package/dist/{visual-S5ZNFWFH.js.map → visual-EMOEYBC4.js.map} +0 -0
  124. /package/dist/{watch-PB7IOD73.js.map → watch-EQRSWNAQ.js.map} +0 -0
package/README.md CHANGED
@@ -12,7 +12,7 @@ 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.20 검증](docs/benchmarks.md)
15
+ - 🇰🇷 **한국 공문서 표 구조 100%** — 원본 HWPX 2,424문서의 보이는 표 **10,342개 전부 구조 일치**. [4.21.22 검증](docs/benchmarks.md)
16
16
 
17
17
  쓸모 있었다면 GitHub ⭐ 하나 눌러주세요. 다른 사람이 이 도구를 찾는 데 도움이 됩니다.
18
18
 
@@ -100,27 +100,29 @@ await writeFile("보고서.hwpx", Buffer.from(hwpx))
100
100
 
101
101
  ## 검증 결과
102
102
 
103
- **4.21.20 · 2026-10-11 배포 검증**. 고정 코퍼스와 참조 기준으로 측정한 결과입니다.
103
+ **4.21.22 · 2026-10-11 배포 검증**. 고정 코퍼스와 참조 기준으로 측정한 결과입니다.
104
104
 
105
105
  | 대상 | 규모 | 결과 |
106
106
  | --- | --- | --- |
107
107
  | HWPX | 2,424문서 · 10,342표 | 표 구조 일치 **10,342/10,342 · 100%** |
108
108
  | HWP 5.x ↔ HWPX | 1,130쌍 · 4,315표 | 짝 문서의 표 구조 일치 **100%** |
109
- | PDF 글 | 744쌍 | 글자 재현율 **99.85%** · 정확도 **99.64%** · 읽기 순서 **99.23%** · 어절 F1 **99.00%** |
109
+ | PDF 글 | 744쌍 | 글자 재현율 **99.85%** · 정확도 **99.67%** · 읽기 순서 **99.23%** · 어절 F1 **99.02%** |
110
110
  | PDF 표 | 708쌍 · 2,331표 | 표 탐지 **99.83%** · 구조 일치 **97.98%** · 칸 F1 **0.991** |
111
111
  | PDF 전체 | 1,911문서 중 1,729건 채점 | 글 커버리지 **99.80%** |
112
112
  | OCR | 53문서 · 102쪽 | CER **0.0412** · 글자 재현율 **99.02%** |
113
113
 
114
114
  표 구조 점수와 셀 내용·화면 재현은 별도 지표입니다. 채점 범위·제외 기준·전 벤치 문서별 비교는 [벤치마크 상세](docs/benchmarks.md)에 있습니다.
115
115
 
116
- 외부 PDF 벤치 **opendataloader-bench 200문서**는 4.21.20 배포 측정에서 기본값 종합 **0.963**, OCR 끔 **0.939**입니다. [옵션별 결과와 재현 방법](docs/benchmarks.md#pdf--markdown--opendataloader-bench)
116
+ 외부 PDF 벤치 **opendataloader-bench 200문서**는 4.21.22 배포 측정에서 기본값 종합 **0.963**, OCR 끔 **0.939**입니다. [옵션별 결과와 재현 방법](docs/benchmarks.md#pdf--markdown--opendataloader-bench)
117
117
 
118
118
  ## 최근 업데이트
119
119
 
120
- 최신 배포: **[4.21.20](https://github.com/chrisryugj/kordoc/releases/tag/v4.21.20)** · 2026-10-11
120
+ 최신 배포: **[4.21.22](https://github.com/chrisryugj/kordoc/releases/tag/v4.21.22)** · 2026-10-11
121
121
 
122
122
  | 버전 | 주요 변경 |
123
123
  | --- | --- |
124
+ | 4.21.22 | PDF 양쪽 정렬 영문 참고문헌 줄을 열로 읽어 낱말이 뒤섞이던 것 고침 (web052 읽기 순서 → 1, score 커버리지 2문서 → 1) |
125
+ | 4.21.21 | PDF 쪽 테두리 틀 안 바닥글 걷기 · 첨부 이름표("<붙임2>"·"<별지 서식 제3호>")·강의 번호를 머리말로 지우던 것 고침 (PDF 글 정확도 99.64 → 99.67%, 어절 F1 99.00 → 99.02%) |
124
126
  | 4.21.20 | PDF 괘선 없는 표 칸의 어절 가운데 꺾임을 붙여 씀("남⏎편이") · 채우기·패치 서식 보존(바뀐 문단만 줄 배치 캐시 삭제·강조 표지·균등 띄어쓰기·라벨 칸 방향) (PDF 어절 F1 98.987 → 98.998%) |
125
127
  | 4.21.19 | PDF 위아래로 쌓인 표와 사이 글줄을 한 표로 묶던 괘선 격자 버리기 — 지역 머리·각주가 제 표와 떨어지던 것 (PDF 읽기 순서 99.16 → 99.23%) |
126
128
  | 4.21.18 | 쪽 넘김 문단 잇기도 줄 끝 공백 글리프를 어절 경계로 — "지원⏎활동이"·"계정⏎정보를" 을 띄워 씀 (PDF 어절 F1 98.986 → 98.987%, 5문서 상승) |
@@ -54,17 +54,17 @@ import {
54
54
  unknownFontWarnings,
55
55
  usesGaejosikMunche,
56
56
  validateHwpx
57
- } from "./chunk-BLKAJD2G.js";
57
+ } from "./chunk-NT4LPP2I.js";
58
58
  import {
59
59
  blocksToPages
60
- } from "./chunk-FU3SCGE7.js";
60
+ } from "./chunk-LZVOL2H2.js";
61
61
  import {
62
62
  applySplices,
63
63
  buildParagraphSplices,
64
64
  buildRangeSplices,
65
65
  placeSealHwpx,
66
66
  scanSectionXml
67
- } from "./chunk-KBL24ZCP.js";
67
+ } from "./chunk-H6EXISSP.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-G6G25HUO.js";
75
+ } from "./chunk-7TLZ56ZK.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-N47I6OS7.js";
100
+ } from "./chunk-6LJ22335.js";
101
101
  import "./chunk-7FCNOKOR.js";
102
- import "./chunk-ZMGWKGSC.js";
102
+ import "./chunk-7MIA3IFO.js";
103
103
  import "./chunk-VQFA55IC.js";
104
- import "./chunk-PALYDA3M.js";
104
+ import "./chunk-K7FP2VOU.js";
105
105
  import {
106
106
  blocksToMarkdown,
107
107
  flattenLayoutTables,
108
108
  hasStructuredCellContent
109
- } from "./chunk-LO5A36FU.js";
110
- import "./chunk-LQSF4JSV.js";
109
+ } from "./chunk-3BJW5KXR.js";
110
+ import "./chunk-BZC24YXS.js";
111
111
  import {
112
112
  VERSION
113
- } from "./chunk-7ITWGPNB.js";
113
+ } from "./chunk-ZQZDGIN4.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=-QHQ2QKM7.js.map
207
+ //# sourceMappingURL=-PLOEMNCA.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  escapeHtml,
4
4
  sanitizeHref
5
- } from "./chunk-7ITWGPNB.js";
5
+ } from "./chunk-ZQZDGIN4.js";
6
6
 
7
7
  // src/shared/symbol-fonts.ts
8
8
  var WINGDINGS = [
@@ -1062,4 +1062,4 @@ export {
1062
1062
  visibleText,
1063
1063
  escapeHtmlCellText
1064
1064
  };
1065
- //# sourceMappingURL=chunk-LO5A36FU.js.map
1065
+ //# sourceMappingURL=chunk-3BJW5KXR.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  KordocError
3
- } from "./chunk-F5PISJEI.js";
3
+ } from "./chunk-BMQATDUY.js";
4
4
 
5
5
  // src/pdf/formula/models.ts
6
6
  import { createHash as createHash2 } from "crypto";
@@ -308,4 +308,4 @@ export {
308
308
  ensureFormulaModels,
309
309
  ensureSingleModel
310
310
  };
311
- //# sourceMappingURL=chunk-AINZICPE.js.map
311
+ //# sourceMappingURL=chunk-64MCJ5GC.js.map
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  parse
4
- } from "./chunk-BLKAJD2G.js";
4
+ } from "./chunk-NT4LPP2I.js";
5
5
  import {
6
6
  classifyError,
7
7
  sanitizeError,
8
8
  toArrayBuffer
9
- } from "./chunk-7ITWGPNB.js";
9
+ } from "./chunk-ZQZDGIN4.js";
10
10
 
11
11
  // src/cli/worker-parse.ts
12
12
  import { readFileSync, statSync } from "fs";
@@ -26,4 +26,4 @@ async function parseWorkerFile(absPath, options) {
26
26
  export {
27
27
  parseWorkerFile
28
28
  };
29
- //# sourceMappingURL=chunk-DBFAQJCX.js.map
29
+ //# sourceMappingURL=chunk-64V65GZM.js.map
@@ -9,7 +9,7 @@ import {
9
9
  HEADING_RATIO_H3,
10
10
  tidyScriptTags,
11
11
  unframeLayoutTables
12
- } from "./chunk-ZMGWKGSC.js";
12
+ } from "./chunk-7MIA3IFO.js";
13
13
  import {
14
14
  parsePageRange
15
15
  } from "./chunk-VQFA55IC.js";
@@ -22,7 +22,7 @@ import {
22
22
  findChildByLocalName,
23
23
  hwpFaceToCssStack,
24
24
  parseRenderStyles
25
- } from "./chunk-PALYDA3M.js";
25
+ } from "./chunk-K7FP2VOU.js";
26
26
  import {
27
27
  MAX_COLS,
28
28
  MAX_ROWS,
@@ -33,18 +33,18 @@ import {
33
33
  flattenLayoutTables,
34
34
  mapPuaText,
35
35
  markNonLayoutTable
36
- } from "./chunk-LO5A36FU.js";
36
+ } from "./chunk-3BJW5KXR.js";
37
37
  import {
38
38
  loadSharp,
39
39
  rasterizePageSvg
40
- } from "./chunk-LQSF4JSV.js";
40
+ } from "./chunk-BZC24YXS.js";
41
41
  import {
42
42
  KordocError,
43
43
  escapeHtml,
44
44
  precheckZipSize,
45
45
  sanitizeHref,
46
46
  toArrayBuffer
47
- } from "./chunk-7ITWGPNB.js";
47
+ } from "./chunk-ZQZDGIN4.js";
48
48
 
49
49
  // src/render/svg-render.ts
50
50
  import JSZip from "jszip";
@@ -7804,4 +7804,4 @@ export {
7804
7804
  cropRect,
7805
7805
  extractRenderedRegions
7806
7806
  };
7807
- //# sourceMappingURL=chunk-N47I6OS7.js.map
7807
+ //# sourceMappingURL=chunk-6LJ22335.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  UNRULED_REGION_TABLES,
7
7
  extractPageBlocksWithLines
8
- } from "./chunk-LY4ITNAL.js";
8
+ } from "./chunk-SQSGBKCL.js";
9
9
  import {
10
10
  OCR_DET_MODEL,
11
11
  OCR_REC_DICT,
@@ -13,10 +13,10 @@ import {
13
13
  ensureOcrModels,
14
14
  getOcrModelsDir,
15
15
  parseCharacterDict
16
- } from "./chunk-WINHSKFD.js";
16
+ } from "./chunk-VUSPHKQ6.js";
17
17
  import {
18
18
  OPTIONAL_DEP_INSTALL_HINT
19
- } from "./chunk-7ITWGPNB.js";
19
+ } from "./chunk-ZQZDGIN4.js";
20
20
 
21
21
  // src/ocr/ruling-lines.ts
22
22
  var INK_LUMA_MAX = 205;
@@ -2133,4 +2133,4 @@ export {
2133
2133
  groupOcrLines,
2134
2134
  ocrItemsToBlocks
2135
2135
  };
2136
- //# sourceMappingURL=chunk-I4HF4UCA.js.map
2136
+ //# sourceMappingURL=chunk-6Z4NAN36.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  visibleText
4
- } from "./chunk-LO5A36FU.js";
4
+ } from "./chunk-3BJW5KXR.js";
5
5
 
6
6
  // src/script-tags.ts
7
7
  var LITERAL_TAG = /<(?=\/?(?:u|sup|sub)>)/g;
@@ -304,4 +304,4 @@ export {
304
304
  HEADING_RATIO_H2,
305
305
  HEADING_RATIO_H3
306
306
  };
307
- //# sourceMappingURL=chunk-ZMGWKGSC.js.map
307
+ //# sourceMappingURL=chunk-7MIA3IFO.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  assignTableIds,
4
4
  blocksToMarkdown
5
- } from "./chunk-LO5A36FU.js";
5
+ } from "./chunk-3BJW5KXR.js";
6
6
 
7
7
  // src/chunks.ts
8
8
  var LIST_MARKER_RE = /^(?:[□■◇◆○◎●◦ㅇ•▪▸▶※-]|\d{1,3}[.)]|[가나다라마바사아자차카타파하][.)]|\([가나다라마바사아자차카타파하0-9]{1,3}\)|[①-⑳㉮-㉻㈎-㈛])\s/;
@@ -82,4 +82,4 @@ function blocksToChunks(blocks, options) {
82
82
  export {
83
83
  blocksToChunks
84
84
  };
85
- //# sourceMappingURL=chunk-G6G25HUO.js.map
85
+ //# sourceMappingURL=chunk-7TLZ56ZK.js.map
@@ -1,5 +1,5 @@
1
1
  // src/utils.ts
2
- var VERSION = true ? "4.21.20" : "0.0.0-dev";
2
+ var VERSION = true ? "4.21.22" : "0.0.0-dev";
3
3
  function toArrayBuffer(buf) {
4
4
  if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {
5
5
  return buf.buffer;
@@ -159,4 +159,4 @@ export {
159
159
  classifyError,
160
160
  partExtension
161
161
  };
162
- //# sourceMappingURL=chunk-F5PISJEI.js.map
162
+ //# sourceMappingURL=chunk-BMQATDUY.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  KordocError,
4
4
  OPTIONAL_DEP_INSTALL_HINT
5
- } from "./chunk-7ITWGPNB.js";
5
+ } from "./chunk-ZQZDGIN4.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-LQSF4JSV.js.map
91
+ //# sourceMappingURL=chunk-BZC24YXS.js.map
@@ -10,10 +10,10 @@ import {
10
10
  extractPageBlocksWithLines,
11
11
  getOcrModelsDir,
12
12
  parseCharacterDict
13
- } from "./chunk-F5KWC7I3.js";
13
+ } from "./chunk-GYQGKVTQ.js";
14
14
  import {
15
15
  OPTIONAL_DEP_INSTALL_HINT
16
- } from "./chunk-F5PISJEI.js";
16
+ } from "./chunk-BMQATDUY.js";
17
17
 
18
18
  // src/ocr/ruling-lines.ts
19
19
  var INK_LUMA_MAX = 205;
@@ -2130,4 +2130,4 @@ export {
2130
2130
  groupOcrLines,
2131
2131
  ocrItemsToBlocks
2132
2132
  };
2133
- //# sourceMappingURL=chunk-E5L6DUOE.js.map
2133
+ //# sourceMappingURL=chunk-EL7BGP7X.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  KordocError
4
- } from "./chunk-7ITWGPNB.js";
4
+ } from "./chunk-ZQZDGIN4.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-75INFYVC.js.map
92
+ //# sourceMappingURL=chunk-G4DVIZTZ.js.map
@@ -4,15 +4,15 @@ import {
4
4
  HEADING_RATIO_H2,
5
5
  HEADING_RATIO_H3,
6
6
  tidyScriptTags
7
- } from "./chunk-JDVOYDIA.js";
7
+ } from "./chunk-KFJP2HYL.js";
8
8
  import {
9
9
  ensureModelsIn,
10
10
  getModelsDir
11
- } from "./chunk-AINZICPE.js";
11
+ } from "./chunk-64MCJ5GC.js";
12
12
  import {
13
13
  safeMax,
14
14
  safeMin
15
- } from "./chunk-F5PISJEI.js";
15
+ } from "./chunk-BMQATDUY.js";
16
16
 
17
17
  // src/ocr/models.ts
18
18
  import { join } from "path";
@@ -5744,6 +5744,20 @@ function detectSpecialKoreanTables(blocks) {
5744
5744
  flushKvTable();
5745
5745
  return result;
5746
5746
  }
5747
+ function tracksPages(occ) {
5748
+ const nums = occ.map((o) => [...o.text.matchAll(/\d+/g)].map((m) => +m[0]));
5749
+ if (!nums.length || nums.some((n) => n.length !== nums[0].length)) return false;
5750
+ return nums[0].some((_, j) => new Set(occ.map((o, k) => o.page - nums[k][j])).size === 1);
5751
+ }
5752
+ function looseVaryingNumber(occ) {
5753
+ const nums = occ.map((o) => [...o.text.matchAll(/\d+/g)]);
5754
+ if (!nums.length || nums.some((n) => n.length !== nums[0].length)) return false;
5755
+ const loose = (text, m) => !/\p{L}/u.test(text[m.index - 1] ?? " ") && !/\p{L}/u.test(text[m.index + m[0].length] ?? " ");
5756
+ for (let j = 0; j < nums[0].length; j++) {
5757
+ if (new Set(nums.map((n) => n[j][0])).size > 1 && occ.every((o, k) => loose(o.text, nums[k][j]))) return true;
5758
+ }
5759
+ return false;
5760
+ }
5747
5761
  function removeHeaderFooterBlocks(blocks, pageHeights, warnings, notes, tables = false, context = []) {
5748
5762
  if (context.length && !tables) {
5749
5763
  const removed = removeHeaderFooterBlocks([...blocks, ...context], pageHeights, [], notes).filter((index) => index < blocks.length);
@@ -5773,6 +5787,7 @@ function removeHeaderFooterBlocks(blocks, pageHeights, warnings, notes, tables =
5773
5787
  const patternCount = /* @__PURE__ */ new Map();
5774
5788
  const patternPages = /* @__PURE__ */ new Map();
5775
5789
  const patternNumbers = /* @__PURE__ */ new Map();
5790
+ const patternOcc = /* @__PURE__ */ new Map();
5776
5791
  for (const e of entries) {
5777
5792
  const norm = e.text.replace(/\d+/g, "#");
5778
5793
  patternCount.set(norm, (patternCount.get(norm) || 0) + 1);
@@ -5782,13 +5797,18 @@ function removeHeaderFooterBlocks(blocks, pageHeights, warnings, notes, tables =
5782
5797
  const pages = patternPages.get(norm) || /* @__PURE__ */ new Set();
5783
5798
  pages.add(e.page);
5784
5799
  patternPages.set(norm, pages);
5800
+ patternOcc.set(norm, [...patternOcc.get(norm) ?? [], e]);
5785
5801
  }
5786
5802
  const repeatedPatterns = /* @__PURE__ */ new Set();
5787
5803
  for (const [p, count] of patternCount) {
5788
5804
  const pages = [...patternPages.get(p) ?? []];
5789
5805
  const span2 = pages.length ? Math.max(...pages) - Math.min(...pages) + 1 : 0;
5790
- const pageNumbered = !tables && (patternNumbers.get(p)?.size ?? 0) > 1;
5791
- if (count >= MIN_REPEAT2 && pages.length >= MIN_REPEAT2 && (pages.length >= span2 * 0.4 || pageNumbered)) {
5806
+ const varying = !tables && (patternNumbers.get(p)?.size ?? 0) > 1;
5807
+ const occ = patternOcc.get(p) ?? [];
5808
+ const dense = pages.length >= span2 * 0.4;
5809
+ const loose = looseVaryingNumber(occ) && (entries === bottomEntries || dense || tracksPages(occ));
5810
+ const pageNumbered = varying && (loose || dense && new Set(occ.map((o) => o.text)).size * 2 <= occ.length);
5811
+ if (count >= MIN_REPEAT2 && pages.length >= MIN_REPEAT2 && (varying ? pageNumbered : dense)) {
5792
5812
  repeatedPatterns.add(p);
5793
5813
  }
5794
5814
  }
@@ -5826,6 +5846,59 @@ function removeHeaderFooterBlocks(blocks, pageHeights, warnings, notes, tables =
5826
5846
  }
5827
5847
  return [...removeSet].sort((a, b) => a - b);
5828
5848
  }
5849
+ function runningLinePatterns(removed, pageHeights) {
5850
+ const occ = /* @__PURE__ */ new Map();
5851
+ for (const b of removed) {
5852
+ const ph = b.bbox && b.pageNumber ? pageHeights.get(b.bbox.page) || pageHeights.get(b.pageNumber) : void 0;
5853
+ const key = b.text ? runningKey(b.text) : "";
5854
+ if (!ph || !b.bbox || !b.pageNumber || !/\p{L}/u.test(key) || ph - b.bbox.y <= ph * 0.5) continue;
5855
+ (occ.get(key) ?? occ.set(key, []).get(key)).push({ page: b.pageNumber, nums: (b.text.match(/\d+/g) ?? []).join(",") });
5856
+ }
5857
+ const out = /* @__PURE__ */ new Map();
5858
+ for (const [key, list] of occ) {
5859
+ if (!pageNumberAtEnd(key)) continue;
5860
+ const offsets = new Set(list.map((o) => o.page - +o.nums));
5861
+ if (offsets.size === 1) out.set(key, [...offsets][0]);
5862
+ }
5863
+ return out;
5864
+ }
5865
+ var runningKey = (s) => s.replace(/\d+/g, "#").replace(/\s+/g, " ").trim();
5866
+ var pageNumberAtEnd = (key) => (key.match(/#/g) ?? []).length === 1 && /#\s*[)\]]?$/.test(key);
5867
+ function stripAbsorbedRunningLines(blocks, pageHeights, running) {
5868
+ if (!running.size) return blocks;
5869
+ const matches = (line, page) => {
5870
+ const offset = running.get(runningKey(line));
5871
+ return offset !== void 0 && page - +(line.match(/\d+/g) ?? []).pop() === offset;
5872
+ };
5873
+ const out = [];
5874
+ for (const b of blocks) {
5875
+ const ph = b.bbox && b.pageNumber ? pageHeights.get(b.bbox.page) || pageHeights.get(b.pageNumber) : void 0;
5876
+ if (!ph || !b.bbox || !b.pageNumber || b.bbox.y > ph * 0.12) {
5877
+ out.push(b);
5878
+ continue;
5879
+ }
5880
+ if (b.type === "paragraph" && b.text) {
5881
+ const lines = b.text.split("\n");
5882
+ let hi = lines.length;
5883
+ while (hi > 0 && !lines[hi - 1].trim()) hi--;
5884
+ if (hi > 0 && matches(lines[hi - 1], b.pageNumber)) {
5885
+ const text = lines.slice(0, hi - 1).join("\n").trim();
5886
+ if (!text) continue;
5887
+ b.text = text;
5888
+ }
5889
+ } else if (b.type === "table" && b.table && b.table.cells.length) {
5890
+ const t = b.table, last = t.cells.length - 1;
5891
+ if (matches(t.cells[last].map((c) => c.text.trim()).filter(Boolean).join(" "), b.pageNumber) && !t.cells.slice(0, last).some((row, i) => row.some((c) => i + (c.rowSpan || 1) - 1 >= last))) {
5892
+ t.cells.pop();
5893
+ if (!t.cells.length) continue;
5894
+ t.rows = t.cells.length;
5895
+ t.hasHeader = t.hasHeader && t.rows > 1;
5896
+ }
5897
+ }
5898
+ out.push(b);
5899
+ }
5900
+ return out;
5901
+ }
5829
5902
 
5830
5903
  // src/pdf/table-meta.ts
5831
5904
  var CLIP_TABLES = /* @__PURE__ */ new WeakSet();
@@ -6582,7 +6655,7 @@ function isProseSpread(items) {
6582
6655
  const avgLen = items.reduce((s, i) => s + i.text.length, 0) / items.length;
6583
6656
  if (items.length >= 4 && maxGap < 40 && avgLen < 5) return true;
6584
6657
  const minGap = safeMin(gaps);
6585
- return minGap > 0 && maxGap - minGap <= Math.max(2, maxGap * 0.15) && items.filter((i) => /^\P{L}*\p{Ll}/u.test(i.text)).length * 2 >= items.length;
6658
+ return minGap > 0 && maxGap - minGap <= Math.max(2, maxGap * 0.15) && (items.filter((i) => /^\P{L}*\p{Ll}/u.test(i.text)).length * 2 >= items.length || items.some((i) => /\p{L}[,.;:]["”’)]?$/u.test(i.text)));
6586
6659
  }
6587
6660
  function detectColumns(yLines) {
6588
6661
  const allItems = yLines.flat();
@@ -8874,6 +8947,8 @@ export {
8874
8947
  detectTableCaptions,
8875
8948
  detectKoreanListBlocks,
8876
8949
  removeHeaderFooterBlocks,
8950
+ runningLinePatterns,
8951
+ stripAbsorbedRunningLines,
8877
8952
  CLIP_TABLES,
8878
8953
  FRAME_TITLE_BLOCKS,
8879
8954
  TABLE_COLXS,
@@ -8896,4 +8971,4 @@ export {
8896
8971
  UNRULED_REGION_TABLES,
8897
8972
  mergeOcrImageRegions
8898
8973
  };
8899
- //# sourceMappingURL=chunk-F5KWC7I3.js.map
8974
+ //# sourceMappingURL=chunk-GYQGKVTQ.js.map