kordoc 4.22.18 → 4.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +3 -2
  2. package/dist/{-OTAPIBUW.js → -YNDBG7XO.js} +17 -11
  3. package/dist/{chunk-HX24KLQN.js → chunk-2CHTPRDU.js} +2 -2
  4. package/dist/{chunk-N5QRS6VT.js → chunk-2EVBM5NZ.js} +2 -2
  5. package/dist/{chunk-VCGGP7SY.js → chunk-2URKNOOQ.js} +2 -2
  6. package/dist/{chunk-3GVPNEIG.js → chunk-4AI32TFY.js} +2 -2
  7. package/dist/{chunk-G4PPT5CR.js → chunk-4XLDFJGY.js} +6 -6
  8. package/dist/{chunk-B3Z2PY4R.cjs → chunk-5KLO56CJ.cjs} +2 -2
  9. package/dist/{chunk-B3Z2PY4R.cjs.map → chunk-5KLO56CJ.cjs.map} +1 -1
  10. package/dist/{chunk-3AVHW7UT.js → chunk-5NBUT7GX.js} +2 -2
  11. package/dist/{chunk-MW42GCQ4.js → chunk-67DVZL4W.js} +2 -2
  12. package/dist/{chunk-7QLKNWMN.js → chunk-6BUW4PJ3.js} +4 -4
  13. package/dist/{chunk-XOX5L7WN.js → chunk-6O2AUXFB.js} +2 -2
  14. package/dist/{chunk-WITGYMV5.js → chunk-A5HW2Z5T.js} +4 -4
  15. package/dist/{chunk-MKEBORZM.js → chunk-GZFL6UOS.js} +2 -2
  16. package/dist/{chunk-TLGOPNMC.cjs → chunk-I22NWH6W.cjs} +24 -24
  17. package/dist/{chunk-TLGOPNMC.cjs.map → chunk-I22NWH6W.cjs.map} +1 -1
  18. package/dist/{chunk-BXZW4Q5G.cjs → chunk-IOBVLL5A.cjs} +6 -6
  19. package/dist/{chunk-BXZW4Q5G.cjs.map → chunk-IOBVLL5A.cjs.map} +1 -1
  20. package/dist/{chunk-DKZZVFTK.cjs → chunk-KLVN3EW7.cjs} +3 -3
  21. package/dist/{chunk-DKZZVFTK.cjs.map → chunk-KLVN3EW7.cjs.map} +1 -1
  22. package/dist/{chunk-TLU4OKIO.js → chunk-LJSKKGWU.js} +2 -2
  23. package/dist/{chunk-NUQG356J.cjs → chunk-M6QZYQRH.cjs} +3 -3
  24. package/dist/{chunk-NUQG356J.cjs.map → chunk-M6QZYQRH.cjs.map} +1 -1
  25. package/dist/{chunk-RTFUKVOX.js → chunk-MA4NIAYO.js} +3 -3
  26. package/dist/{chunk-MI2YNEQJ.js → chunk-MSUBZT53.js} +4025 -2640
  27. package/dist/chunk-MSUBZT53.js.map +1 -0
  28. package/dist/{chunk-3YHUMMZ5.js → chunk-QE2XH2ZI.js} +8 -1
  29. package/dist/chunk-QE2XH2ZI.js.map +1 -0
  30. package/dist/{chunk-SJYHFKKB.js → chunk-QO4PT3NN.js} +2 -2
  31. package/dist/{chunk-XIDMSNU2.cjs → chunk-QXIZ5XSB.cjs} +23 -23
  32. package/dist/{chunk-XIDMSNU2.cjs.map → chunk-QXIZ5XSB.cjs.map} +1 -1
  33. package/dist/{chunk-DQBY4PQ4.js → chunk-S7B74SOM.js} +8 -6
  34. package/dist/{chunk-DQBY4PQ4.js.map → chunk-S7B74SOM.js.map} +1 -1
  35. package/dist/{chunk-JO5OR4F5.js → chunk-TFXWP5QI.js} +2 -2
  36. package/dist/{chunk-S2WH5IZ3.js → chunk-UIZYWW3J.js} +2 -2
  37. package/dist/{chunk-S2WH5IZ3.js.map → chunk-UIZYWW3J.js.map} +1 -1
  38. package/dist/{chunk-OWO3RVJY.js → chunk-VRIHNSYF.js} +2 -2
  39. package/dist/{chunk-M7SCUHXE.js → chunk-W67KQWMU.js} +4 -4
  40. package/dist/{chunk-NV3WEN4C.js → chunk-XCSWST2A.js} +3 -3
  41. package/dist/{chunk-VROCP4X4.js → chunk-Y3LLNEU3.js} +2 -2
  42. package/dist/{chunk-VROCP4X4.js.map → chunk-Y3LLNEU3.js.map} +1 -1
  43. package/dist/{chunk-6LTGCEGP.js → chunk-YFCE7J37.js} +2 -2
  44. package/dist/chunks-LX2EPPSD.js +10 -0
  45. package/dist/cli.js +148 -141
  46. package/dist/cli.js.map +1 -1
  47. package/dist/{formula-E5G3A3NZ.js → formula-JASN5ELL.js} +3 -3
  48. package/dist/{formula-2ISHDHXF.cjs → formula-Z7JPTFAV.cjs} +9 -9
  49. package/dist/{formula-2ISHDHXF.cjs.map → formula-Z7JPTFAV.cjs.map} +1 -1
  50. package/dist/{formula-WHYRNHRE.js → formula-ZULPRKJR.js} +4 -4
  51. package/dist/{image-ocr-5WJQITNQ.js → image-ocr-2ZWU6O5O.js} +6 -6
  52. package/dist/{image-ocr-6J7B5UVA.js → image-ocr-IYFAHFQH.js} +9 -9
  53. package/dist/{image-ocr-MRTNIUZQ.cjs → image-ocr-MJVZFMXW.cjs} +17 -17
  54. package/dist/{image-ocr-MRTNIUZQ.cjs.map → image-ocr-MJVZFMXW.cjs.map} +1 -1
  55. package/dist/index.cjs +3318 -1931
  56. package/dist/index.cjs.map +1 -1
  57. package/dist/index.d.cts +114 -3
  58. package/dist/index.d.ts +114 -3
  59. package/dist/index.js +2734 -1347
  60. package/dist/index.js.map +1 -1
  61. package/dist/mcp.js +134 -32
  62. package/dist/mcp.js.map +1 -1
  63. package/dist/{model-bundle-CNNDBCIQ.js → model-bundle-FD5ORLT4.js} +5 -5
  64. package/dist/{models-PQYMCKFR.js → models-CNXDF4BB.js} +5 -5
  65. package/dist/{parse-worker-v2-Z3W53OUZ.js → parse-worker-v2-GZIAKU6M.js} +12 -12
  66. package/dist/{parser-2YUGVORR.cjs → parser-MTUCDPDX.cjs} +157 -157
  67. package/dist/{parser-2YUGVORR.cjs.map → parser-MTUCDPDX.cjs.map} +1 -1
  68. package/dist/{parser-UYBCCGY4.js → parser-OQ4FLNBE.js} +12 -12
  69. package/dist/{parser-YHUWM4KF.js → parser-WTOPH3C2.js} +9 -9
  70. package/dist/pdf-ocr-EW34T34R.cjs +31 -0
  71. package/dist/{pdf-ocr-6Q34QQ7A.cjs.map → pdf-ocr-EW34T34R.cjs.map} +1 -1
  72. package/dist/{pdf-ocr-6JSBUWUO.js → pdf-ocr-IBZRT65M.js} +9 -9
  73. package/dist/{pdf-ocr-DE7PYWN7.js → pdf-ocr-V346MK77.js} +6 -6
  74. package/dist/{profile-io-DCZ4DINU.js → profile-io-UFTSKMWU.js} +3 -3
  75. package/dist/{rasterize-6XD2LLEN.js → rasterize-SXIF5J5K.js} +3 -3
  76. package/dist/{redact-doc-2BLB3IOP.js → redact-doc-P6XQ6B6U.js} +11 -11
  77. package/dist/{render-YPZMJSZL.js → render-QW56QMUE.js} +7 -7
  78. package/dist/seal-HMXHWFBA.js +10 -0
  79. package/dist/{setup-GUE2OUWB.js → setup-RIZUPKAE.js} +3 -3
  80. package/dist/visual-X7OFXY4M.js +21 -0
  81. package/dist/{watch-EILA6XGX.js → watch-TAHHXY7Z.js} +12 -12
  82. package/package.json +1 -1
  83. package/THIRD_PARTY/hwp-auto-docfit.LICENSE +0 -23
  84. package/dist/chunk-3YHUMMZ5.js.map +0 -1
  85. package/dist/chunk-MI2YNEQJ.js.map +0 -1
  86. package/dist/chunks-GMADIKNS.js +0 -10
  87. package/dist/pdf-ocr-6Q34QQ7A.cjs +0 -31
  88. package/dist/seal-32KIG7OS.js +0 -10
  89. package/dist/visual-Y32AKOM4.js +0 -21
  90. /package/dist/{-OTAPIBUW.js.map → -YNDBG7XO.js.map} +0 -0
  91. /package/dist/{chunk-HX24KLQN.js.map → chunk-2CHTPRDU.js.map} +0 -0
  92. /package/dist/{chunk-N5QRS6VT.js.map → chunk-2EVBM5NZ.js.map} +0 -0
  93. /package/dist/{chunk-VCGGP7SY.js.map → chunk-2URKNOOQ.js.map} +0 -0
  94. /package/dist/{chunk-3GVPNEIG.js.map → chunk-4AI32TFY.js.map} +0 -0
  95. /package/dist/{chunk-G4PPT5CR.js.map → chunk-4XLDFJGY.js.map} +0 -0
  96. /package/dist/{chunk-3AVHW7UT.js.map → chunk-5NBUT7GX.js.map} +0 -0
  97. /package/dist/{chunk-MW42GCQ4.js.map → chunk-67DVZL4W.js.map} +0 -0
  98. /package/dist/{chunk-7QLKNWMN.js.map → chunk-6BUW4PJ3.js.map} +0 -0
  99. /package/dist/{chunk-XOX5L7WN.js.map → chunk-6O2AUXFB.js.map} +0 -0
  100. /package/dist/{chunk-WITGYMV5.js.map → chunk-A5HW2Z5T.js.map} +0 -0
  101. /package/dist/{chunk-MKEBORZM.js.map → chunk-GZFL6UOS.js.map} +0 -0
  102. /package/dist/{chunk-TLU4OKIO.js.map → chunk-LJSKKGWU.js.map} +0 -0
  103. /package/dist/{chunk-RTFUKVOX.js.map → chunk-MA4NIAYO.js.map} +0 -0
  104. /package/dist/{chunk-SJYHFKKB.js.map → chunk-QO4PT3NN.js.map} +0 -0
  105. /package/dist/{chunk-JO5OR4F5.js.map → chunk-TFXWP5QI.js.map} +0 -0
  106. /package/dist/{chunk-OWO3RVJY.js.map → chunk-VRIHNSYF.js.map} +0 -0
  107. /package/dist/{chunk-M7SCUHXE.js.map → chunk-W67KQWMU.js.map} +0 -0
  108. /package/dist/{chunk-NV3WEN4C.js.map → chunk-XCSWST2A.js.map} +0 -0
  109. /package/dist/{chunk-6LTGCEGP.js.map → chunk-YFCE7J37.js.map} +0 -0
  110. /package/dist/{chunks-GMADIKNS.js.map → chunks-LX2EPPSD.js.map} +0 -0
  111. /package/dist/{formula-E5G3A3NZ.js.map → formula-JASN5ELL.js.map} +0 -0
  112. /package/dist/{formula-WHYRNHRE.js.map → formula-ZULPRKJR.js.map} +0 -0
  113. /package/dist/{image-ocr-5WJQITNQ.js.map → image-ocr-2ZWU6O5O.js.map} +0 -0
  114. /package/dist/{image-ocr-6J7B5UVA.js.map → image-ocr-IYFAHFQH.js.map} +0 -0
  115. /package/dist/{model-bundle-CNNDBCIQ.js.map → model-bundle-FD5ORLT4.js.map} +0 -0
  116. /package/dist/{models-PQYMCKFR.js.map → models-CNXDF4BB.js.map} +0 -0
  117. /package/dist/{parse-worker-v2-Z3W53OUZ.js.map → parse-worker-v2-GZIAKU6M.js.map} +0 -0
  118. /package/dist/{parser-UYBCCGY4.js.map → parser-OQ4FLNBE.js.map} +0 -0
  119. /package/dist/{parser-YHUWM4KF.js.map → parser-WTOPH3C2.js.map} +0 -0
  120. /package/dist/{pdf-ocr-6JSBUWUO.js.map → pdf-ocr-IBZRT65M.js.map} +0 -0
  121. /package/dist/{pdf-ocr-DE7PYWN7.js.map → pdf-ocr-V346MK77.js.map} +0 -0
  122. /package/dist/{profile-io-DCZ4DINU.js.map → profile-io-UFTSKMWU.js.map} +0 -0
  123. /package/dist/{rasterize-6XD2LLEN.js.map → rasterize-SXIF5J5K.js.map} +0 -0
  124. /package/dist/{redact-doc-2BLB3IOP.js.map → redact-doc-P6XQ6B6U.js.map} +0 -0
  125. /package/dist/{render-YPZMJSZL.js.map → render-QW56QMUE.js.map} +0 -0
  126. /package/dist/{seal-32KIG7OS.js.map → seal-HMXHWFBA.js.map} +0 -0
  127. /package/dist/{setup-GUE2OUWB.js.map → setup-RIZUPKAE.js.map} +0 -0
  128. /package/dist/{visual-Y32AKOM4.js.map → visual-X7OFXY4M.js.map} +0 -0
  129. /package/dist/{watch-EILA6XGX.js.map → watch-TAHHXY7Z.js.map} +0 -0
@@ -66,6 +66,7 @@ async function loadGenerationImages(markdown, imageDir, assertPath) {
66
66
  var BODY_FONTS = ["myeongjo", "gothic"];
67
67
  var H2_MARKERS = ["band", "roman", "box", "number", "none"];
68
68
  var BULLET2_CHARS = ["\u3147", "\u25CB", "\u25E6", "\u274D"];
69
+ var TOTAL_ROWS = ["top", "bottom", "keep"];
69
70
  var FONT_ROLE_KEYS = ["body", "heading", "ref", "table"];
70
71
  var SIZE_KEYS = [
71
72
  "dae",
@@ -136,6 +137,7 @@ function buildGongmunOptions(input) {
136
137
  if (input.levels && Object.keys(input.levels).length > 0) g.levels = input.levels;
137
138
  if (input.bullet2) g.bullet2 = input.bullet2;
138
139
  if (input.suppressSingle !== void 0) g.suppressSingle = input.suppressSingle;
140
+ if (input.totalRow) g.totalRow = input.totalRow;
139
141
  if (input.docHead) g.docHead = input.docHead;
140
142
  if (input.docFoot) g.docFoot = input.docFoot;
141
143
  if (input.reportInfo) g.reportInfo = input.reportInfo;
@@ -147,6 +149,9 @@ function buildGongmunOptions(input) {
147
149
  if (input.agency?.trim()) g.agency = input.agency.trim();
148
150
  return g;
149
151
  }
152
+ function templateConflictMessage(names) {
153
+ return `\uBD80\uC11C \uC11C\uC2DD \uACAC\uBCF8(template)\uC740 ${names.join(", ")} \uC640 \uD568\uAED8 \uC4F8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uCABD\xB7\uAE00\uAF34\xB7\uBB38\uB2E8\xB7\uD45C \uC11C\uC2DD\uC740 \uACAC\uBCF8\uC774 \uC815\uD569\uB2C8\uB2E4. \uACAC\uBCF8\uB9CC \uC8FC\uAC70\uB098 \uACAC\uBCF8 \uC5C6\uC774 \uD504\uB9AC\uC14B\uC73C\uB85C \uC0DD\uC131\uD558\uC138\uC694`;
154
+ }
150
155
  function parseLevelsSpec(spec) {
151
156
  const out = {};
152
157
  for (const item of spec.split(",").map((s) => s.trim()).filter(Boolean)) {
@@ -173,6 +178,7 @@ export {
173
178
  BODY_FONTS,
174
179
  H2_MARKERS,
175
180
  BULLET2_CHARS,
181
+ TOTAL_ROWS,
176
182
  FONT_ROLE_KEYS,
177
183
  SIZE_KEYS,
178
184
  LEVEL_STYLE_KEYS,
@@ -186,7 +192,8 @@ export {
186
192
  SIZE_PT_RANGE,
187
193
  APPROVAL_MAX,
188
194
  buildGongmunOptions,
195
+ templateConflictMessage,
189
196
  parseLevelsSpec,
190
197
  levelFontRecord
191
198
  };
192
- //# sourceMappingURL=chunk-3YHUMMZ5.js.map
199
+ //# sourceMappingURL=chunk-QE2XH2ZI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/generate-images.ts","../src/hwpx/gongmun-surface.ts"],"sourcesContent":["/** CLI/MCP image references share Unicode handling and filesystem confinement. */\nimport { constants } from \"fs\"\nimport { open, realpath } from \"fs/promises\"\nimport { isAbsolute, relative, resolve, sep } from \"path\"\n\n/** 그림 한 장·전체 읽기 상한 — 문서가 가리키는 폴더 안 큰 파일을 통째 메모리에 올리지 않는다 */\nconst MAX_IMAGE_BYTES = 50 * 1024 * 1024\nconst MAX_TOTAL_IMAGE_BYTES = 256 * 1024 * 1024\n\nfunction isChild(directory: string, target: string): boolean {\n const rel = relative(directory, target)\n return rel !== \"\" && rel !== \"..\" && !rel.startsWith(`..${sep}`) && !isAbsolute(rel)\n}\n\nexport async function loadGenerationImages(\n markdown: string,\n imageDir: string,\n assertPath?: (path: string) => void,\n): Promise<{ images: Record<string, Uint8Array>; warnings: string[] }> {\n const directory = await realpath(resolve(imageDir))\n assertPath?.(directory)\n const images: Record<string, Uint8Array> = Object.create(null)\n const warnings: string[] = []\n const seen = new Set<string>()\n let total = 0\n for (const match of markdown.matchAll(/!\\[[^\\]]*\\]\\(([^)\\s]+)\\)/g)) {\n const url = match[1]\n // Remote URLs are not fetched; inline data is handled by the generator.\n if (/^[a-z][a-z0-9+.-]*:/i.test(url) || seen.has(url)) continue\n seen.add(url)\n let name = url\n try { name = decodeURIComponent(url) } catch { /* Keep literal malformed percent sequences. */ }\n const candidate = resolve(directory, name)\n const skip = (reason: string) => warnings.push(`이미지 건너뜀: ${url} (${reason})`)\n if (isAbsolute(name) || name.includes(\"\\\\\") || name.includes(\"\\0\") || /^[a-z][a-z0-9+.-]*:/i.test(name) || !isChild(directory, candidate)) {\n skip(\"이미지 폴더 밖\")\n continue\n }\n try {\n // Check the file, not just its directory: leaf and ancestor symlinks can escape.\n const target = await realpath(candidate)\n if (!isChild(directory, target)) {\n skip(\"이미지 폴더 밖\")\n continue\n }\n assertPath?.(target)\n const file = await open(target, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK)\n try {\n const st = await file.stat()\n if (!st.isFile()) {\n skip(\"일반 파일 아님\")\n continue\n }\n if (st.size > MAX_IMAGE_BYTES || total + st.size > MAX_TOTAL_IMAGE_BYTES) {\n skip(\"파일이 너무 큼\")\n continue\n }\n total += st.size\n images[url] = new Uint8Array(await file.readFile())\n } finally {\n await file.close()\n }\n } catch (err) {\n skip((err as NodeJS.ErrnoException)?.code === \"ENOENT\" ? \"파일 없음\" : \"파일 접근 불가\")\n }\n }\n return { images, warnings }\n}\n","/**\n * 공문서 옵션 표면 SSOT (v4.0.4, 인벤토리 영역1-1) — CLI(commander)와 MCP(zod)가\n * 각자 손배선하던 GongmunOptions 조립을 한 곳으로 모은다.\n *\n * 실측 드리프트의 뿌리는 두 가지였다:\n * 1. 값 집합(열거·중첩 키 목록·범위)이 세 곳(gongmun.ts 타입 / commander 검증 /\n * zod shape)에 각자 사경 — line_spacing이 MCP에 빠지고 sizes.bodyTitle이\n * zod에 누락되는 식. → 여기의 상수에서 양쪽이 파생한다.\n * 2. 조립 의미론(cover 우선순위, 조건부 대입)이 두 벌 복붙. → buildGongmunOptions\n * 하나로 통일 — 옵션 신설 시 이 파일과 표면별 플래그/파라미터 선언만 만지면 된다.\n *\n * 표면 문법(플래그 이름·설명문·kv 파싱)은 각 표면의 것 — 여기는 값과 의미만 담는다.\n */\n\nimport type { GongmunOptions, GongmunPreset } from \"./gongmun.js\"\n\n// ─── 값 집합 (CLI 검증·MCP zod 공통 파생원) ──────────────\n\nexport const BODY_FONTS = [\"myeongjo\", \"gothic\"] as const\nexport const H2_MARKERS = [\"band\", \"roman\", \"box\", \"number\", \"none\"] as const\nexport const BULLET2_CHARS = [\"ㅇ\", \"○\", \"◦\", \"❍\"] as const\nexport const TOTAL_ROWS = [\"top\", \"bottom\", \"keep\"] as const\n\n/** 요소별 글꼴 오버라이드 역할 키 (GongmunOptions.fonts) */\nexport const FONT_ROLE_KEYS = [\"body\", \"heading\", \"ref\", \"table\"] as const\n/** 개조식 요소별 크기 키 (gaejosik.ts GaejosikSizeOverrides와 정합 — 드리프트 시 컴파일 에러) */\nexport const SIZE_KEYS = [\n \"dae\", \"cham\", \"chapter\", \"coverTitle\", \"coverSub\",\n \"tocLabel\", \"tocRoman\", \"tocItem\", \"table\", \"bodyTitle\",\n] as const\n/** 단계별 위계 타이포 키 (GongmunOptions.levels[depth]) */\nexport const LEVEL_STYLE_KEYS = [\"font\", \"pt\", \"bold\"] as const\n/** 기안문 두문 키 (별지 제1호서식) */\nexport const DOC_HEAD_KEYS = [\"org\", \"slogan\", \"to\", \"via\", \"title\"] as const\n/** 기안문 결문 키 */\nexport const DOC_FOOT_KEYS = [\n \"sender\", \"drafter\", \"reviewer\", \"approver\", \"cooperator\", \"recipients\", \"docNum\", \"receive\",\n \"zip\", \"address\", \"site\", \"phone\", \"fax\", \"email\", \"disclosure\",\n] as const\n/** 보고서 표지 문서정보표 키 */\nexport const DOC_INFO_KEYS = [\"docNum\", \"date\", \"disclosure\", \"policyNo\"] as const\n/** 공고문 두문·결문 키 */\nexport const NOTICE_HEAD_KEYS = [\"no\", \"date\", \"sender\"] as const\n/** 보도자료 담당 표 키 */\nexport const PRESS_CONTACT_KEYS = [\"dept\", \"manager\", \"phone\"] as const\n\n/** 수치 범위 — MCP zod와 문서화가 공유 (라이브러리 검증은 gongmun.ts 방어선) */\nexport const BODY_PT_RANGE = { min: 6, max: 40 } as const\nexport const LINE_SPACING_RANGE = { min: 50, max: 300 } as const\nexport const SIZE_PT_RANGE = { min: 6, max: 60 } as const\nexport const APPROVAL_MAX = 6\n\n// SIZE_KEYS ⊆ GaejosikSizeOverrides 컴파일 타임 잠금 — gaejosik.ts에 키가 늘면\n// 여기(와 이를 파생하는 MCP zod·CLI 안내문)도 갱신을 강제한다\ntype SizeKey = (typeof SIZE_KEYS)[number]\ntype _SizeKeysMatch = SizeKey extends keyof NonNullable<GongmunOptions[\"sizes\"]>\n ? (keyof NonNullable<GongmunOptions[\"sizes\"]> extends SizeKey ? true : never)\n : never\nconst _sizeKeysLock: _SizeKeysMatch = true\nvoid _sizeKeysLock\n\n// ─── 조립 (두 표면 공통 의미론) ──────────────────────────\n\n/**\n * 표면 중립 입력 — CLI는 플래그·kv 파싱 결과를, MCP는 zod 통과 파라미터를 이 모양으로\n * 넘긴다. 모든 필드가 \"명시된 것만 정의\"(미지정 undefined) 규약 — --no-x 기본값 같은\n * 표면 고유 사정은 어댑터가 undefined로 정돈해서 넘겨야 한다.\n */\nexport interface GongmunSurfaceInput {\n preset: GongmunPreset\n font?: (typeof BODY_FONTS)[number]\n bodyPt?: number\n lineSpacing?: number\n org?: string\n date?: string\n cover?: boolean\n toc?: boolean\n approval?: string[]\n pageNumbers?: boolean\n endMark?: boolean\n bodyTitleBox?: boolean\n chapterFit?: boolean\n h2Marker?: (typeof H2_MARKERS)[number]\n /** 띠 제목 번호칸 채움색·글자색 (#RRGGBB) */\n bandColor?: string\n bandTextColor?: string\n fonts?: NonNullable<GongmunOptions[\"fonts\"]>\n sizes?: NonNullable<GongmunOptions[\"sizes\"]>\n levels?: NonNullable<GongmunOptions[\"levels\"]>\n bullet2?: (typeof BULLET2_CHARS)[number]\n suppressSingle?: boolean\n totalRow?: (typeof TOTAL_ROWS)[number]\n docHead?: NonNullable<GongmunOptions[\"docHead\"]>\n docFoot?: NonNullable<GongmunOptions[\"docFoot\"]>\n reportInfo?: string\n noticeHead?: NonNullable<GongmunOptions[\"noticeHead\"]>\n press?: NonNullable<GongmunOptions[\"press\"]>\n /** 보고서 요약 박스 (v5) */\n summary?: string\n /** 보고서 표지 문서정보표 (v5) */\n docInfo?: NonNullable<GongmunOptions[\"docInfo\"]>\n /** 서울 사전 검토항목 점검표 */\n checklist?: NonNullable<GongmunOptions[\"checklist\"]>\n /** 표지 부서명 (v5 — cover와 함께) */\n dept?: string\n /** 표지 우상단 취급 표시 — \"대외주의\" 등 (업무보고 프리셋, cover와 함께) */\n coverLabel?: string\n /** 기관 서식 — 중앙행정기관 이름 또는 \"공통\" (agency.ts) */\n agency?: string\n}\n\n/**\n * 중립 입력 → GongmunOptions. 종전 CLI(cli.ts:535~612)·MCP(mcp.ts:792~814) 복붙\n * 두 벌의 의미론을 그대로 보존한 단일 조립:\n * - cover: false(끄기)가 최우선 → org/date 지정 시 객체(=켜짐) → true(강제 켜기)\n * → 미지정이면 프리셋 기본(resolveGongmun)\n * - 나머지는 \"명시된 것만 대입\" — 프리셋 기본값을 undefined로 덮지 않는다\n */\nexport function buildGongmunOptions(input: GongmunSurfaceInput): GongmunOptions {\n const g: GongmunOptions = { preset: input.preset }\n if (input.font) g.bodyFont = input.font\n // NaN도 대입 — CLI의 비숫자 플래그(--pt abc)가 라이브러리 방어선(assertFiniteRange)\n // 에서 명시적 에러로 죽는 기존 경로 보존 (truthiness로 거르면 무증상 폐기가 된다)\n if (input.bodyPt !== undefined) g.bodyPt = input.bodyPt\n if (input.lineSpacing !== undefined) g.lineSpacing = input.lineSpacing\n if (input.cover === false) {\n g.cover = false\n } else if (input.org || input.date || input.dept || input.coverLabel) {\n g.cover = {\n ...(input.org ? { org: input.org } : {}), ...(input.date ? { date: input.date } : {}),\n ...(input.dept ? { dept: input.dept } : {}), ...(input.coverLabel ? { label: input.coverLabel } : {}),\n }\n } else if (input.cover === true) {\n g.cover = true\n }\n if (input.toc !== undefined) g.toc = input.toc\n if (input.approval && input.approval.length > 0) g.approval = input.approval\n if (input.pageNumbers !== undefined) g.pageNumbers = input.pageNumbers\n if (input.endMark !== undefined) g.endMark = input.endMark\n if (input.bodyTitleBox !== undefined) g.bodyTitleBox = input.bodyTitleBox\n if (input.chapterFit !== undefined) g.chapterFit = input.chapterFit\n if (input.h2Marker) g.h2Marker = input.h2Marker\n if (input.bandColor) g.bandColor = input.bandColor\n if (input.bandTextColor) g.bandTextColor = input.bandTextColor\n if (input.fonts) g.fonts = input.fonts\n if (input.sizes) g.sizes = input.sizes\n if (input.levels && Object.keys(input.levels).length > 0) g.levels = input.levels\n if (input.bullet2) g.bullet2 = input.bullet2\n if (input.suppressSingle !== undefined) g.suppressSingle = input.suppressSingle\n if (input.totalRow) g.totalRow = input.totalRow\n if (input.docHead) g.docHead = input.docHead\n if (input.docFoot) g.docFoot = input.docFoot\n if (input.reportInfo) g.reportInfo = input.reportInfo\n if (input.noticeHead) g.noticeHead = input.noticeHead\n if (input.press) g.press = input.press\n if (input.summary) g.summary = input.summary\n if (input.docInfo) g.docInfo = input.docInfo\n if (input.checklist !== undefined) g.checklist = input.checklist\n if (input.agency?.trim()) g.agency = input.agency.trim()\n return g\n}\n\n/**\n * 부서 서식 견본(template) 과 함께 준 서식 옵션 오류 문구 — CLI 플래그(--preset)·MCP 파라미터(preset) 이름을 그대로 받는다.\n * 견본이 쪽 설정·글꼴·문단 모양·표 서식을 정하므로 두 표면 모두 조용히 버리지 않고 멈춘다.\n */\nexport function templateConflictMessage(names: string[]): string {\n return `부서 서식 견본(template)은 ${names.join(\", \")} 와 함께 쓸 수 없습니다 — 쪽·글꼴·문단·표 서식은 견본이 정합니다. 견본만 주거나 견본 없이 프리셋으로 생성하세요`\n}\n\n/**\n * `--levels` 문법 파싱 — `0=HY견고딕/17/bold,1=한컴돋움/15/bold,2=휴먼명조/14`.\n * 항목은 쉼표, depth 뒤 `=`, 속성은 `/` 구분: 숫자=pt, bold·b=굵게, plain=굵게 해제, 그 외=글꼴명.\n * 값 범위·depth 검증은 라이브러리 방어선(validateGongmunOptions)이 맡는다.\n */\nexport function parseLevelsSpec(spec: string): NonNullable<GongmunOptions[\"levels\"]> {\n const out: NonNullable<GongmunOptions[\"levels\"]> = {}\n for (const item of spec.split(\",\").map((s) => s.trim()).filter(Boolean)) {\n const eq = item.indexOf(\"=\")\n if (eq <= 0) throw new Error(`--levels: '${item}' — 'depth=글꼴/pt/bold' 꼴이어야 함`)\n const depth = item.slice(0, eq).trim()\n const st: NonNullable<GongmunOptions[\"levels\"]>[string] = {}\n for (const part of item.slice(eq + 1).split(\"/\").map((s) => s.trim()).filter(Boolean)) {\n if (/^\\d+(\\.\\d+)?$/.test(part)) st.pt = Number(part)\n else if (/^(bold|b)$/i.test(part)) st.bold = true\n else if (/^plain$/i.test(part)) st.bold = false\n else st.font = part\n }\n out[depth] = st\n }\n return out\n}\n\n/** levels 의 글꼴명을 unknownFontWarnings 입력(역할 → 글꼴명)으로 — 역할 이름은 `levels.<depth>` */\nexport function levelFontRecord(levels: NonNullable<GongmunOptions[\"levels\"]>): Record<string, string | undefined> {\n return Object.fromEntries(Object.entries(levels).map(([d, st]) => [`levels.${d}`, st.font]))\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  assignTableIds,
4
4
  blocksToMarkdown
5
- } from "./chunk-3AVHW7UT.js";
5
+ } from "./chunk-5NBUT7GX.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-SJYHFKKB.js.map
85
+ //# sourceMappingURL=chunk-QO4PT3NN.js.map
@@ -4,15 +4,15 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkBXZW4Q5Gcjs = require('./chunk-BXZW4Q5G.cjs');
7
+ var _chunkIOBVLL5Acjs = require('./chunk-IOBVLL5A.cjs');
8
8
 
9
9
 
10
10
 
11
- var _chunkNUQG356Jcjs = require('./chunk-NUQG356J.cjs');
11
+ var _chunkM6QZYQRHcjs = require('./chunk-M6QZYQRH.cjs');
12
12
 
13
13
 
14
14
 
15
- var _chunkB3Z2PY4Rcjs = require('./chunk-B3Z2PY4R.cjs');
15
+ var _chunk5KLO56CJcjs = require('./chunk-5KLO56CJ.cjs');
16
16
 
17
17
  // src/ocr/models.ts
18
18
  var _path = require('path');
@@ -56,7 +56,7 @@ var OCR_REC_DICT = {
56
56
  sizeMb: 1
57
57
  };
58
58
  function getOcrModelsDir() {
59
- return _chunkNUQG356Jcjs.getModelsDir.call(void 0, "ppocr");
59
+ return _chunkM6QZYQRHcjs.getModelsDir.call(void 0, "ppocr");
60
60
  }
61
61
  var DEFAULT_OCR_MODELS = Object.freeze({
62
62
  det: { spec: OCR_DET_MODEL },
@@ -98,7 +98,7 @@ async function ensureOcrModelsFor(sel, onProgress) {
98
98
  if (!stamp || verifiedInProcess.get(path) !== stamp) todo.push(s.spec);
99
99
  }
100
100
  if (!todo.length) return;
101
- await _chunkNUQG356Jcjs.ensureModelsIn.call(void 0, dir, todo, onProgress);
101
+ await _chunkM6QZYQRHcjs.ensureModelsIn.call(void 0, dir, todo, onProgress);
102
102
  for (const spec of todo) {
103
103
  const path = _path.join.call(void 0, dir, spec.filename), stamp = await fileStamp(path);
104
104
  if (stamp) verifiedInProcess.set(path, stamp);
@@ -2147,16 +2147,16 @@ function recordOpenEndCellEdges(grid, cells, horizontals) {
2147
2147
  }
2148
2148
  function takeClipCellEdges(from, to) {
2149
2149
  const e = CLIP_CELL_EDGES.get(from);
2150
- if (e) _chunkBXZW4Q5Gcjs.CELL_EDGES.set(to, e);
2150
+ if (e) _chunkIOBVLL5Acjs.CELL_EDGES.set(to, e);
2151
2151
  }
2152
2152
  function hasOpenCellSeam(a, b) {
2153
- const u = _chunkBXZW4Q5Gcjs.CELL_EDGES.get(a), d = _chunkBXZW4Q5Gcjs.CELL_EDGES.get(b);
2153
+ const u = _chunkIOBVLL5Acjs.CELL_EDGES.get(a), d = _chunkIOBVLL5Acjs.CELL_EDGES.get(b);
2154
2154
  return !!u && !!d && u.t && !u.b && !d.t && d.b && u.l && u.r && d.l && d.r;
2155
2155
  }
2156
2156
  function joinCellEdges(a, b) {
2157
- const u = _chunkBXZW4Q5Gcjs.CELL_EDGES.get(a), d = _chunkBXZW4Q5Gcjs.CELL_EDGES.get(b);
2157
+ const u = _chunkIOBVLL5Acjs.CELL_EDGES.get(a), d = _chunkIOBVLL5Acjs.CELL_EDGES.get(b);
2158
2158
  if (!u || !d) return;
2159
- _chunkBXZW4Q5Gcjs.CELL_EDGES.set(a, { t: u.t, b: d.b, l: u.l || d.l, r: u.r || d.r });
2159
+ _chunkIOBVLL5Acjs.CELL_EDGES.set(a, { t: u.t, b: d.b, l: u.l || d.l, r: u.r || d.r });
2160
2160
  }
2161
2161
 
2162
2162
  // src/pdf/cell-extract.ts
@@ -2332,7 +2332,7 @@ function tagScripts(text, lines) {
2332
2332
  const [s, e, kind] = marks[m];
2333
2333
  out = out.slice(0, s) + `<${kind}>` + out.slice(s, e) + `</${kind}>` + out.slice(e);
2334
2334
  }
2335
- return _chunkBXZW4Q5Gcjs.tidyScriptTags.call(void 0, out);
2335
+ return _chunkIOBVLL5Acjs.tidyScriptTags.call(void 0, out);
2336
2336
  }
2337
2337
 
2338
2338
  // src/pdf/line-wrap.ts
@@ -5391,9 +5391,9 @@ function detectHeadings(blocks, medianFontSize) {
5391
5391
  if (/^\d+$/.test(text) && !isChapterNumber(block, blocks[bi + 1], medianFontSize)) continue;
5392
5392
  const ratio = block.style.fontSize / medianFontSize;
5393
5393
  let level = 0;
5394
- if (ratio >= _chunkBXZW4Q5Gcjs.HEADING_RATIO_H1) level = 1;
5395
- else if (ratio >= _chunkBXZW4Q5Gcjs.HEADING_RATIO_H2) level = 2;
5396
- else if (ratio >= _chunkBXZW4Q5Gcjs.HEADING_RATIO_H3) level = 3;
5394
+ if (ratio >= _chunkIOBVLL5Acjs.HEADING_RATIO_H1) level = 1;
5395
+ else if (ratio >= _chunkIOBVLL5Acjs.HEADING_RATIO_H2) level = 2;
5396
+ else if (ratio >= _chunkIOBVLL5Acjs.HEADING_RATIO_H3) level = 3;
5397
5397
  if (level > 0) {
5398
5398
  block.type = "heading";
5399
5399
  block.level = level;
@@ -5406,7 +5406,7 @@ function isChapterNumber(block, next, medianFontSize) {
5406
5406
  const nextSize = _nullishCoalesce(_optionalChain([next, 'optionalAccess', _159 => _159.style, 'optionalAccess', _160 => _160.fontSize]), () => ( 0));
5407
5407
  const text = _nullishCoalesce(_optionalChain([next, 'optionalAccess', _161 => _161.text, 'optionalAccess', _162 => _162.trim, 'call', _163 => _163()]), () => ( ""));
5408
5408
  const a = block.bbox, b = _optionalChain([next, 'optionalAccess', _164 => _164.bbox]);
5409
- return /^\d{1,2}$/.test(_nullishCoalesce(_optionalChain([block, 'access', _165 => _165.text, 'optionalAccess', _166 => _166.trim, 'call', _167 => _167()]), () => ( ""))) && size >= medianFontSize * 2.5 && !!next && (next.type === "paragraph" || next.type === "heading") && next.pageNumber === block.pageNumber && nextSize >= medianFontSize * _chunkBXZW4Q5Gcjs.HEADING_RATIO_H1 && text.length > 0 && text.length <= 80 && !/^[\d\s.]+$/.test(text) && !!a && !!b && a.y > b.y && a.y - (b.y + b.height) <= size * 2;
5409
+ return /^\d{1,2}$/.test(_nullishCoalesce(_optionalChain([block, 'access', _165 => _165.text, 'optionalAccess', _166 => _166.trim, 'call', _167 => _167()]), () => ( ""))) && size >= medianFontSize * 2.5 && !!next && (next.type === "paragraph" || next.type === "heading") && next.pageNumber === block.pageNumber && nextSize >= medianFontSize * _chunkIOBVLL5Acjs.HEADING_RATIO_H1 && text.length > 0 && text.length <= 80 && !/^[\d\s.]+$/.test(text) && !!a && !!b && a.y > b.y && a.y - (b.y + b.height) <= size * 2;
5410
5410
  }
5411
5411
  function mergeStackedHeadingLines(blocks, medianFontSize) {
5412
5412
  for (let i = 0; i < blocks.length - 1; ) {
@@ -6944,16 +6944,16 @@ function isProseSpread(items) {
6944
6944
  for (let i = 1; i < sorted.length; i++) {
6945
6945
  gaps.push(sorted[i].x - (sorted[i - 1].x + sorted[i - 1].w));
6946
6946
  }
6947
- const maxGap = _chunkB3Z2PY4Rcjs.safeMax.call(void 0, gaps);
6947
+ const maxGap = _chunk5KLO56CJcjs.safeMax.call(void 0, gaps);
6948
6948
  const avgLen = items.reduce((s, i) => s + i.text.length, 0) / items.length;
6949
6949
  if (items.length >= 4 && maxGap < 40 && avgLen < 5) return true;
6950
- const minGap = _chunkB3Z2PY4Rcjs.safeMin.call(void 0, gaps);
6950
+ const minGap = _chunk5KLO56CJcjs.safeMin.call(void 0, gaps);
6951
6951
  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)));
6952
6952
  }
6953
6953
  function detectColumns(yLines) {
6954
6954
  const allItems = yLines.flat();
6955
6955
  if (allItems.length === 0) return null;
6956
- const pageWidth = _chunkB3Z2PY4Rcjs.safeMax.call(void 0, allItems.map((i) => i.x + i.w)) - _chunkB3Z2PY4Rcjs.safeMin.call(void 0, allItems.map((i) => i.x));
6956
+ const pageWidth = _chunk5KLO56CJcjs.safeMax.call(void 0, allItems.map((i) => i.x + i.w)) - _chunk5KLO56CJcjs.safeMin.call(void 0, allItems.map((i) => i.x));
6957
6957
  if (pageWidth < 100) return null;
6958
6958
  let bigoLineIdx = -1;
6959
6959
  for (let i = 0; i < yLines.length; i++) {
@@ -7445,7 +7445,7 @@ function rebuildUnitLine(items, grid) {
7445
7445
  function prependUnitRow(cells, cols, line, usedItems) {
7446
7446
  const text = cleanCellText(line.map((item) => item.text).join(""));
7447
7447
  cells.unshift(Array.from({ length: cols }, (_, c) => ({ text: c === 0 ? text : "", colSpan: c === 0 ? cols : 1, rowSpan: 1 })));
7448
- for (const cell of cells[0]) _chunkBXZW4Q5Gcjs.CELL_EDGES.set(cell, NO_EDGES);
7448
+ for (const cell of cells[0]) _chunkIOBVLL5Acjs.CELL_EDGES.set(cell, NO_EDGES);
7449
7449
  for (const item of line) usedItems.add(item);
7450
7450
  }
7451
7451
  function attachUnitRow(items, grid, cells, cols, usedItems) {
@@ -7977,7 +7977,7 @@ function recordFrameTitle(table, source, pageNum) {
7977
7977
  const [label, spacer, title] = cells;
7978
7978
  if (!/^(?:붙임|별첨|첨부|부록)\s*\d{1,3}$/.test(label.text.trim()) || spacer.text.trim() || !title.text.trim()) return;
7979
7979
  if (cells.some((c) => {
7980
- const e = _chunkBXZW4Q5Gcjs.CELL_EDGES.get(c);
7980
+ const e = _chunkIOBVLL5Acjs.CELL_EDGES.get(c);
7981
7981
  return !e || e.t || e.b || e.l || e.r;
7982
7982
  })) return;
7983
7983
  const xs = TABLE_COLXS.get(table), style = dominantStyle(source), fs = _nullishCoalesce(_optionalChain([style, 'optionalAccess', _358 => _358.fontSize]), () => ( 0));
@@ -8558,7 +8558,7 @@ function extractBlocksWithGrids(items, pageNum, pageWidth, pageHeight, grids, ho
8558
8558
  groupSizes.push(1);
8559
8559
  }
8560
8560
  const allY = remaining.map((i) => i.y);
8561
- const pageH = _chunkB3Z2PY4Rcjs.safeMax.call(void 0, allY) - _chunkB3Z2PY4Rcjs.safeMin.call(void 0, allY);
8561
+ const pageH = _chunk5KLO56CJcjs.safeMax.call(void 0, allY) - _chunk5KLO56CJcjs.safeMin.call(void 0, allY);
8562
8562
  const gapThreshold = Math.max(15, pageH * 0.03);
8563
8563
  const sides = frameColumnTextBands(remaining, spanning, gx);
8564
8564
  const textBlocks = [];
@@ -8574,7 +8574,7 @@ function extractBlocksWithGrids(items, pageNum, pageWidth, pageHeight, grids, ho
8574
8574
  finalTextBlocks.push(...detectListBlocks(textBlocks));
8575
8575
  } else {
8576
8576
  const allY = remaining.map((i) => i.y);
8577
- const pageH = _chunkB3Z2PY4Rcjs.safeMax.call(void 0, allY) - _chunkB3Z2PY4Rcjs.safeMin.call(void 0, allY);
8577
+ const pageH = _chunk5KLO56CJcjs.safeMax.call(void 0, allY) - _chunk5KLO56CJcjs.safeMin.call(void 0, allY);
8578
8578
  const gapThreshold = Math.max(15, pageH * 0.03);
8579
8579
  const groups = xyCutOrder(remaining, gapThreshold);
8580
8580
  const textBlocks = [];
@@ -8902,7 +8902,7 @@ function extractPageBlocksFallback(items, pageNum, fullPage = false, detectTable
8902
8902
  blocks.push(...columnTextToBlocks(tableText, pageNum, bbox, dominantStyle(items)));
8903
8903
  } else {
8904
8904
  const allY = items.map((i) => i.y);
8905
- const pageHeight = _chunkB3Z2PY4Rcjs.safeMax.call(void 0, allY) - _chunkB3Z2PY4Rcjs.safeMin.call(void 0, allY);
8905
+ const pageHeight = _chunk5KLO56CJcjs.safeMax.call(void 0, allY) - _chunk5KLO56CJcjs.safeMin.call(void 0, allY);
8906
8906
  const gapThreshold = Math.max(15, pageHeight * 0.03);
8907
8907
  const orderedGroups = proseCutX !== null ? splitTwoColumnProse(items, proseCutX) : xyCutOrder(items, gapThreshold, 0, void 0, minGap);
8908
8908
  for (const group of orderedGroups) {
@@ -9118,4 +9118,4 @@ function rowParagraphs(block) {
9118
9118
 
9119
9119
 
9120
9120
  exports.DEFAULT_OCR_MODELS = DEFAULT_OCR_MODELS; exports.resolveOcrModels = resolveOcrModels; exports.ocrSelectionKey = ocrSelectionKey; exports.ocrSourcePath = ocrSourcePath; exports.ensureOcrModelsFor = ensureOcrModelsFor; exports.ocrModelsCached = ocrModelsCached; exports.parseCharacterDict = parseCharacterDict; exports.extractLines = extractLines; exports.extractImageRegions = extractImageRegions; exports.NO_EDGES = NO_EDGES; exports.hasOpenCellSeam = hasOpenCellSeam; exports.joinCellEdges = joinCellEdges; exports.filterHiddenText = filterHiddenText; exports.collapseEvenSpacing = collapseEvenSpacing; exports.computeBBox = computeBBox; exports.dominantStyle = dominantStyle; exports.normalizeItems = normalizeItems; exports.groupByY = groupByY; exports.mergeLineSimple = mergeLineSimple; exports.WrapLexicon = WrapLexicon; exports.startsNewItem = startsNewItem; exports.wrapJoiner = wrapJoiner; exports.joinPageBreakWraps = joinPageBreakWraps; exports.splitPageBreakWraps = splitPageBreakWraps; exports.latinSoftWrap = latinSoftWrap; exports.TOC_BLOCKS = TOC_BLOCKS; exports.computeMedianFontSizeFromFreq = computeMedianFontSizeFromFreq; exports.detectHeadings = detectHeadings; exports.mergeStackedHeadingLines = mergeStackedHeadingLines; exports.detectTypographyHeadings = detectTypographyHeadings; exports.detectDocumentStyleHeadings = detectDocumentStyleHeadings; exports.detectSiblingStyleHeadings = detectSiblingStyleHeadings; exports.detectRepeatedPageLabels = detectRepeatedPageLabels; exports.detectPageLeadHeadings = detectPageLeadHeadings; exports.refineDocumentStyleHeadings = refineDocumentStyleHeadings; exports.detectMarkerHeadings = detectMarkerHeadings; exports.detectTableCaptions = detectTableCaptions; exports.detectKoreanListBlocks = detectKoreanListBlocks; exports.removeHeaderFooterBlocks = removeHeaderFooterBlocks; exports.runningLinePatterns = runningLinePatterns; exports.stripAbsorbedRunningLines = stripAbsorbedRunningLines; exports.CLIP_TABLES = CLIP_TABLES; exports.FRAME_TITLE_BLOCKS = FRAME_TITLE_BLOCKS; exports.TABLE_COLXS = TABLE_COLXS; exports.TABLE_ROWYS = TABLE_ROWYS; exports.TABLE_TAIL = TABLE_TAIL; exports.PART_COLXS = PART_COLXS; exports.EMPTY_PARTS = EMPTY_PARTS; exports.IMAGE_CELLS = IMAGE_CELLS; exports.FILLER_CELLS = FILLER_CELLS; exports.CONT_PARTS = CONT_PARTS; exports.CELL_LINES = CELL_LINES; exports.ROW_RULES = ROW_RULES; exports.trimTrailingEmptyTableCols = trimTrailingEmptyTableCols; exports.restoreImageBullets = restoreImageBullets; exports.detectRightArrowRegions = detectRightArrowRegions; exports.removeSideTabs = removeSideTabs; exports.extractPageBlocksWithLines = extractPageBlocksWithLines; exports.UNRULED_REGION_TABLES = UNRULED_REGION_TABLES; exports.mergeOcrImageRegions = mergeOcrImageRegions;
9121
- //# sourceMappingURL=chunk-XIDMSNU2.cjs.map
9121
+ //# sourceMappingURL=chunk-QXIZ5XSB.cjs.map