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.
- package/README.md +3 -2
- package/dist/{-OTAPIBUW.js → -YNDBG7XO.js} +17 -11
- package/dist/{chunk-HX24KLQN.js → chunk-2CHTPRDU.js} +2 -2
- package/dist/{chunk-N5QRS6VT.js → chunk-2EVBM5NZ.js} +2 -2
- package/dist/{chunk-VCGGP7SY.js → chunk-2URKNOOQ.js} +2 -2
- package/dist/{chunk-3GVPNEIG.js → chunk-4AI32TFY.js} +2 -2
- package/dist/{chunk-G4PPT5CR.js → chunk-4XLDFJGY.js} +6 -6
- package/dist/{chunk-B3Z2PY4R.cjs → chunk-5KLO56CJ.cjs} +2 -2
- package/dist/{chunk-B3Z2PY4R.cjs.map → chunk-5KLO56CJ.cjs.map} +1 -1
- package/dist/{chunk-3AVHW7UT.js → chunk-5NBUT7GX.js} +2 -2
- package/dist/{chunk-MW42GCQ4.js → chunk-67DVZL4W.js} +2 -2
- package/dist/{chunk-7QLKNWMN.js → chunk-6BUW4PJ3.js} +4 -4
- package/dist/{chunk-XOX5L7WN.js → chunk-6O2AUXFB.js} +2 -2
- package/dist/{chunk-WITGYMV5.js → chunk-A5HW2Z5T.js} +4 -4
- package/dist/{chunk-MKEBORZM.js → chunk-GZFL6UOS.js} +2 -2
- package/dist/{chunk-TLGOPNMC.cjs → chunk-I22NWH6W.cjs} +24 -24
- package/dist/{chunk-TLGOPNMC.cjs.map → chunk-I22NWH6W.cjs.map} +1 -1
- package/dist/{chunk-BXZW4Q5G.cjs → chunk-IOBVLL5A.cjs} +6 -6
- package/dist/{chunk-BXZW4Q5G.cjs.map → chunk-IOBVLL5A.cjs.map} +1 -1
- package/dist/{chunk-DKZZVFTK.cjs → chunk-KLVN3EW7.cjs} +3 -3
- package/dist/{chunk-DKZZVFTK.cjs.map → chunk-KLVN3EW7.cjs.map} +1 -1
- package/dist/{chunk-TLU4OKIO.js → chunk-LJSKKGWU.js} +2 -2
- package/dist/{chunk-NUQG356J.cjs → chunk-M6QZYQRH.cjs} +3 -3
- package/dist/{chunk-NUQG356J.cjs.map → chunk-M6QZYQRH.cjs.map} +1 -1
- package/dist/{chunk-RTFUKVOX.js → chunk-MA4NIAYO.js} +3 -3
- package/dist/{chunk-MI2YNEQJ.js → chunk-MSUBZT53.js} +4025 -2640
- package/dist/chunk-MSUBZT53.js.map +1 -0
- package/dist/{chunk-3YHUMMZ5.js → chunk-QE2XH2ZI.js} +8 -1
- package/dist/chunk-QE2XH2ZI.js.map +1 -0
- package/dist/{chunk-SJYHFKKB.js → chunk-QO4PT3NN.js} +2 -2
- package/dist/{chunk-XIDMSNU2.cjs → chunk-QXIZ5XSB.cjs} +23 -23
- package/dist/{chunk-XIDMSNU2.cjs.map → chunk-QXIZ5XSB.cjs.map} +1 -1
- package/dist/{chunk-DQBY4PQ4.js → chunk-S7B74SOM.js} +8 -6
- package/dist/{chunk-DQBY4PQ4.js.map → chunk-S7B74SOM.js.map} +1 -1
- package/dist/{chunk-JO5OR4F5.js → chunk-TFXWP5QI.js} +2 -2
- package/dist/{chunk-S2WH5IZ3.js → chunk-UIZYWW3J.js} +2 -2
- package/dist/{chunk-S2WH5IZ3.js.map → chunk-UIZYWW3J.js.map} +1 -1
- package/dist/{chunk-OWO3RVJY.js → chunk-VRIHNSYF.js} +2 -2
- package/dist/{chunk-M7SCUHXE.js → chunk-W67KQWMU.js} +4 -4
- package/dist/{chunk-NV3WEN4C.js → chunk-XCSWST2A.js} +3 -3
- package/dist/{chunk-VROCP4X4.js → chunk-Y3LLNEU3.js} +2 -2
- package/dist/{chunk-VROCP4X4.js.map → chunk-Y3LLNEU3.js.map} +1 -1
- package/dist/{chunk-6LTGCEGP.js → chunk-YFCE7J37.js} +2 -2
- package/dist/chunks-LX2EPPSD.js +10 -0
- package/dist/cli.js +148 -141
- package/dist/cli.js.map +1 -1
- package/dist/{formula-E5G3A3NZ.js → formula-JASN5ELL.js} +3 -3
- package/dist/{formula-2ISHDHXF.cjs → formula-Z7JPTFAV.cjs} +9 -9
- package/dist/{formula-2ISHDHXF.cjs.map → formula-Z7JPTFAV.cjs.map} +1 -1
- package/dist/{formula-WHYRNHRE.js → formula-ZULPRKJR.js} +4 -4
- package/dist/{image-ocr-5WJQITNQ.js → image-ocr-2ZWU6O5O.js} +6 -6
- package/dist/{image-ocr-6J7B5UVA.js → image-ocr-IYFAHFQH.js} +9 -9
- package/dist/{image-ocr-MRTNIUZQ.cjs → image-ocr-MJVZFMXW.cjs} +17 -17
- package/dist/{image-ocr-MRTNIUZQ.cjs.map → image-ocr-MJVZFMXW.cjs.map} +1 -1
- package/dist/index.cjs +3318 -1931
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +114 -3
- package/dist/index.d.ts +114 -3
- package/dist/index.js +2734 -1347
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +134 -32
- package/dist/mcp.js.map +1 -1
- package/dist/{model-bundle-CNNDBCIQ.js → model-bundle-FD5ORLT4.js} +5 -5
- package/dist/{models-PQYMCKFR.js → models-CNXDF4BB.js} +5 -5
- package/dist/{parse-worker-v2-Z3W53OUZ.js → parse-worker-v2-GZIAKU6M.js} +12 -12
- package/dist/{parser-2YUGVORR.cjs → parser-MTUCDPDX.cjs} +157 -157
- package/dist/{parser-2YUGVORR.cjs.map → parser-MTUCDPDX.cjs.map} +1 -1
- package/dist/{parser-UYBCCGY4.js → parser-OQ4FLNBE.js} +12 -12
- package/dist/{parser-YHUWM4KF.js → parser-WTOPH3C2.js} +9 -9
- package/dist/pdf-ocr-EW34T34R.cjs +31 -0
- package/dist/{pdf-ocr-6Q34QQ7A.cjs.map → pdf-ocr-EW34T34R.cjs.map} +1 -1
- package/dist/{pdf-ocr-6JSBUWUO.js → pdf-ocr-IBZRT65M.js} +9 -9
- package/dist/{pdf-ocr-DE7PYWN7.js → pdf-ocr-V346MK77.js} +6 -6
- package/dist/{profile-io-DCZ4DINU.js → profile-io-UFTSKMWU.js} +3 -3
- package/dist/{rasterize-6XD2LLEN.js → rasterize-SXIF5J5K.js} +3 -3
- package/dist/{redact-doc-2BLB3IOP.js → redact-doc-P6XQ6B6U.js} +11 -11
- package/dist/{render-YPZMJSZL.js → render-QW56QMUE.js} +7 -7
- package/dist/seal-HMXHWFBA.js +10 -0
- package/dist/{setup-GUE2OUWB.js → setup-RIZUPKAE.js} +3 -3
- package/dist/visual-X7OFXY4M.js +21 -0
- package/dist/{watch-EILA6XGX.js → watch-TAHHXY7Z.js} +12 -12
- package/package.json +1 -1
- package/THIRD_PARTY/hwp-auto-docfit.LICENSE +0 -23
- package/dist/chunk-3YHUMMZ5.js.map +0 -1
- package/dist/chunk-MI2YNEQJ.js.map +0 -1
- package/dist/chunks-GMADIKNS.js +0 -10
- package/dist/pdf-ocr-6Q34QQ7A.cjs +0 -31
- package/dist/seal-32KIG7OS.js +0 -10
- package/dist/visual-Y32AKOM4.js +0 -21
- /package/dist/{-OTAPIBUW.js.map → -YNDBG7XO.js.map} +0 -0
- /package/dist/{chunk-HX24KLQN.js.map → chunk-2CHTPRDU.js.map} +0 -0
- /package/dist/{chunk-N5QRS6VT.js.map → chunk-2EVBM5NZ.js.map} +0 -0
- /package/dist/{chunk-VCGGP7SY.js.map → chunk-2URKNOOQ.js.map} +0 -0
- /package/dist/{chunk-3GVPNEIG.js.map → chunk-4AI32TFY.js.map} +0 -0
- /package/dist/{chunk-G4PPT5CR.js.map → chunk-4XLDFJGY.js.map} +0 -0
- /package/dist/{chunk-3AVHW7UT.js.map → chunk-5NBUT7GX.js.map} +0 -0
- /package/dist/{chunk-MW42GCQ4.js.map → chunk-67DVZL4W.js.map} +0 -0
- /package/dist/{chunk-7QLKNWMN.js.map → chunk-6BUW4PJ3.js.map} +0 -0
- /package/dist/{chunk-XOX5L7WN.js.map → chunk-6O2AUXFB.js.map} +0 -0
- /package/dist/{chunk-WITGYMV5.js.map → chunk-A5HW2Z5T.js.map} +0 -0
- /package/dist/{chunk-MKEBORZM.js.map → chunk-GZFL6UOS.js.map} +0 -0
- /package/dist/{chunk-TLU4OKIO.js.map → chunk-LJSKKGWU.js.map} +0 -0
- /package/dist/{chunk-RTFUKVOX.js.map → chunk-MA4NIAYO.js.map} +0 -0
- /package/dist/{chunk-SJYHFKKB.js.map → chunk-QO4PT3NN.js.map} +0 -0
- /package/dist/{chunk-JO5OR4F5.js.map → chunk-TFXWP5QI.js.map} +0 -0
- /package/dist/{chunk-OWO3RVJY.js.map → chunk-VRIHNSYF.js.map} +0 -0
- /package/dist/{chunk-M7SCUHXE.js.map → chunk-W67KQWMU.js.map} +0 -0
- /package/dist/{chunk-NV3WEN4C.js.map → chunk-XCSWST2A.js.map} +0 -0
- /package/dist/{chunk-6LTGCEGP.js.map → chunk-YFCE7J37.js.map} +0 -0
- /package/dist/{chunks-GMADIKNS.js.map → chunks-LX2EPPSD.js.map} +0 -0
- /package/dist/{formula-E5G3A3NZ.js.map → formula-JASN5ELL.js.map} +0 -0
- /package/dist/{formula-WHYRNHRE.js.map → formula-ZULPRKJR.js.map} +0 -0
- /package/dist/{image-ocr-5WJQITNQ.js.map → image-ocr-2ZWU6O5O.js.map} +0 -0
- /package/dist/{image-ocr-6J7B5UVA.js.map → image-ocr-IYFAHFQH.js.map} +0 -0
- /package/dist/{model-bundle-CNNDBCIQ.js.map → model-bundle-FD5ORLT4.js.map} +0 -0
- /package/dist/{models-PQYMCKFR.js.map → models-CNXDF4BB.js.map} +0 -0
- /package/dist/{parse-worker-v2-Z3W53OUZ.js.map → parse-worker-v2-GZIAKU6M.js.map} +0 -0
- /package/dist/{parser-UYBCCGY4.js.map → parser-OQ4FLNBE.js.map} +0 -0
- /package/dist/{parser-YHUWM4KF.js.map → parser-WTOPH3C2.js.map} +0 -0
- /package/dist/{pdf-ocr-6JSBUWUO.js.map → pdf-ocr-IBZRT65M.js.map} +0 -0
- /package/dist/{pdf-ocr-DE7PYWN7.js.map → pdf-ocr-V346MK77.js.map} +0 -0
- /package/dist/{profile-io-DCZ4DINU.js.map → profile-io-UFTSKMWU.js.map} +0 -0
- /package/dist/{rasterize-6XD2LLEN.js.map → rasterize-SXIF5J5K.js.map} +0 -0
- /package/dist/{redact-doc-2BLB3IOP.js.map → redact-doc-P6XQ6B6U.js.map} +0 -0
- /package/dist/{render-YPZMJSZL.js.map → render-QW56QMUE.js.map} +0 -0
- /package/dist/{seal-32KIG7OS.js.map → seal-HMXHWFBA.js.map} +0 -0
- /package/dist/{setup-GUE2OUWB.js.map → setup-RIZUPKAE.js.map} +0 -0
- /package/dist/{visual-Y32AKOM4.js.map → visual-X7OFXY4M.js.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
85
|
+
//# sourceMappingURL=chunk-QO4PT3NN.js.map
|
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkIOBVLL5Acjs = require('./chunk-IOBVLL5A.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _chunkM6QZYQRHcjs = require('./chunk-M6QZYQRH.cjs');
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
var
|
|
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
|
|
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
|
|
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)
|
|
2150
|
+
if (e) _chunkIOBVLL5Acjs.CELL_EDGES.set(to, e);
|
|
2151
2151
|
}
|
|
2152
2152
|
function hasOpenCellSeam(a, b) {
|
|
2153
|
-
const u =
|
|
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 =
|
|
2157
|
+
const u = _chunkIOBVLL5Acjs.CELL_EDGES.get(a), d = _chunkIOBVLL5Acjs.CELL_EDGES.get(b);
|
|
2158
2158
|
if (!u || !d) return;
|
|
2159
|
-
|
|
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
|
|
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 >=
|
|
5395
|
-
else if (ratio >=
|
|
5396
|
-
else if (ratio >=
|
|
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 *
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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])
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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-
|
|
9121
|
+
//# sourceMappingURL=chunk-QXIZ5XSB.cjs.map
|