kordoc 4.12.2 → 4.12.3
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 +12 -1
- package/dist/{-EZH6NKTE.js → -FWGDIOV4.js} +8 -8
- package/dist/{chunk-OEYECZGV.js → chunk-2DAFWDV2.js} +9 -5
- package/dist/chunk-2DAFWDV2.js.map +1 -0
- package/dist/{chunk-5RPYBC2Q.js → chunk-3KQOI6R6.js} +27 -2
- package/dist/chunk-3KQOI6R6.js.map +1 -0
- package/dist/{chunk-DBGEUDBY.js → chunk-6L3B44DH.js} +2 -2
- package/dist/{chunk-ONNAHSPV.cjs → chunk-7BIXTQZ3.cjs} +14 -10
- package/dist/chunk-7BIXTQZ3.cjs.map +1 -0
- package/dist/{chunk-IOJX4Q63.js → chunk-B63QEHYL.js} +3 -3
- package/dist/{chunk-JCMBQC5N.js → chunk-BAZMKQZW.js} +2 -2
- package/dist/{chunk-V5BUPZ6I.cjs → chunk-BOATAEXU.cjs} +7 -4
- package/dist/chunk-BOATAEXU.cjs.map +1 -0
- package/dist/{chunk-KX7IYCCZ.js → chunk-CKYDP34A.js} +3 -3
- package/dist/{chunk-7XUXSDH5.js → chunk-DUGUCM7K.js} +9 -5
- package/dist/chunk-DUGUCM7K.js.map +1 -0
- package/dist/{chunk-2LKYJ4G3.cjs → chunk-FFITS3NY.cjs} +6 -6
- package/dist/{chunk-2LKYJ4G3.cjs.map → chunk-FFITS3NY.cjs.map} +1 -1
- package/dist/{chunk-2B7OIEJJ.js → chunk-HB56YANA.js} +5 -2
- package/dist/chunk-HB56YANA.js.map +1 -0
- package/dist/{chunk-2HBYWA5X.js → chunk-IC6HHXFL.js} +2 -2
- package/dist/{chunk-LD2K4K5V.js → chunk-INFYDSZL.js} +111 -22
- package/dist/chunk-INFYDSZL.js.map +1 -0
- package/dist/{chunk-62IU4NV3.cjs → chunk-ISCI5LKN.cjs} +2 -2
- package/dist/{chunk-62IU4NV3.cjs.map → chunk-ISCI5LKN.cjs.map} +1 -1
- package/dist/{chunk-XXDZ2KTW.js → chunk-KLO6RHX2.js} +2 -2
- package/dist/{chunk-MUYU4JI5.js → chunk-KRE2SREV.js} +2 -2
- package/dist/{chunk-QBCMFNHS.js → chunk-OJDMMZ5Z.js} +2 -2
- package/dist/{chunk-UL2MDA5C.js → chunk-PL4V523B.js} +3 -3
- package/dist/{chunk-FBLMVHDK.js → chunk-PUZZFYLV.js} +2 -2
- package/dist/{chunk-2LO525TL.js → chunk-SJEPQOVW.js} +2 -2
- package/dist/{chunk-QM2RSJ2S.js → chunk-TWKXX343.js} +3 -3
- package/dist/{chunk-2LPBIW2B.cjs → chunk-W3H2H55O.cjs} +3 -3
- package/dist/{chunk-2LPBIW2B.cjs.map → chunk-W3H2H55O.cjs.map} +1 -1
- package/dist/{chunk-FVBR7SC3.js → chunk-YBZJMAE2.js} +2 -2
- package/dist/{chunk-Q6ETEJFK.js → chunk-ZASGH5EN.js} +5 -2
- package/dist/chunk-ZASGH5EN.js.map +1 -0
- package/dist/chunks-VICNQMNE.js +10 -0
- package/dist/cli.js +30 -23
- package/dist/cli.js.map +1 -1
- package/dist/{formula-NW33S4TA.js → formula-R7IWAAYR.js} +3 -3
- package/dist/{formula-6RQX4NMJ.js → formula-YJWKEPUK.js} +4 -4
- package/dist/{formula-NBEO6CFC.cjs → formula-ZYHUXTK5.cjs} +9 -9
- package/dist/{formula-NBEO6CFC.cjs.map → formula-ZYHUXTK5.cjs.map} +1 -1
- package/dist/{image-ocr-V4KY373B.cjs → image-ocr-6O6ZXKUD.cjs} +11 -11
- package/dist/{image-ocr-V4KY373B.cjs.map → image-ocr-6O6ZXKUD.cjs.map} +1 -1
- package/dist/{image-ocr-SO56VETS.js → image-ocr-G4JVF2UH.js} +7 -7
- package/dist/{image-ocr-CAVU2TNZ.js → image-ocr-OLTSKQWD.js} +5 -5
- package/dist/index.cjs +455 -366
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +107 -18
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +20 -17
- package/dist/mcp.js.map +1 -1
- package/dist/{model-bundle-EIJF34DR.js → model-bundle-IFD2D5CW.js} +5 -5
- package/dist/{models-6V4CPQXC.js → models-FJ3IUNTB.js} +5 -5
- package/dist/{parser-OBHNXEQM.js → parser-I7TC35V6.js} +31 -10
- package/dist/parser-I7TC35V6.js.map +1 -0
- package/dist/{parser-GIREMEPD.js → parser-JRT3B6OK.js} +31 -10
- package/dist/parser-JRT3B6OK.js.map +1 -0
- package/dist/{parser-OMT25WH2.cjs → parser-YLLIYOIZ.cjs} +59 -38
- package/dist/parser-YLLIYOIZ.cjs.map +1 -0
- package/dist/pdf-ocr-ADUP2LPU.cjs +14 -0
- package/dist/{pdf-ocr-TFYVK4FI.cjs.map → pdf-ocr-ADUP2LPU.cjs.map} +1 -1
- package/dist/pdf-ocr-ATJTB2B3.js +13 -0
- package/dist/pdf-ocr-P75KSZFV.js +16 -0
- package/dist/{profile-io-PZVMM66V.js → profile-io-BPJQQZLQ.js} +3 -3
- package/dist/{rasterize-NRWP2C6L.js → rasterize-ALCNU53T.js} +2 -2
- package/dist/render-MDLTQUUV.js +10 -0
- package/dist/seal-K4K3KPE3.js +10 -0
- package/dist/{setup-V55AJP6H.js → setup-O2DALZKF.js} +3 -3
- package/dist/{watch-7CQSMDDP.js → watch-GPWYJAS2.js} +9 -9
- package/package.json +1 -1
- package/dist/chunk-2B7OIEJJ.js.map +0 -1
- package/dist/chunk-5RPYBC2Q.js.map +0 -1
- package/dist/chunk-7XUXSDH5.js.map +0 -1
- package/dist/chunk-LD2K4K5V.js.map +0 -1
- package/dist/chunk-OEYECZGV.js.map +0 -1
- package/dist/chunk-ONNAHSPV.cjs.map +0 -1
- package/dist/chunk-Q6ETEJFK.js.map +0 -1
- package/dist/chunk-V5BUPZ6I.cjs.map +0 -1
- package/dist/chunks-TT7ZE5QQ.js +0 -10
- package/dist/parser-GIREMEPD.js.map +0 -1
- package/dist/parser-OBHNXEQM.js.map +0 -1
- package/dist/parser-OMT25WH2.cjs.map +0 -1
- package/dist/pdf-ocr-IRXQ5GBM.js +0 -13
- package/dist/pdf-ocr-SL4GCOGS.js +0 -16
- package/dist/pdf-ocr-TFYVK4FI.cjs +0 -14
- package/dist/render-V5ZPTZQ7.js +0 -10
- package/dist/seal-LVG2DGAB.js +0 -10
- /package/dist/{-EZH6NKTE.js.map → -FWGDIOV4.js.map} +0 -0
- /package/dist/{chunk-DBGEUDBY.js.map → chunk-6L3B44DH.js.map} +0 -0
- /package/dist/{chunk-IOJX4Q63.js.map → chunk-B63QEHYL.js.map} +0 -0
- /package/dist/{chunk-JCMBQC5N.js.map → chunk-BAZMKQZW.js.map} +0 -0
- /package/dist/{chunk-KX7IYCCZ.js.map → chunk-CKYDP34A.js.map} +0 -0
- /package/dist/{chunk-2HBYWA5X.js.map → chunk-IC6HHXFL.js.map} +0 -0
- /package/dist/{chunk-XXDZ2KTW.js.map → chunk-KLO6RHX2.js.map} +0 -0
- /package/dist/{chunk-MUYU4JI5.js.map → chunk-KRE2SREV.js.map} +0 -0
- /package/dist/{chunk-QBCMFNHS.js.map → chunk-OJDMMZ5Z.js.map} +0 -0
- /package/dist/{chunk-UL2MDA5C.js.map → chunk-PL4V523B.js.map} +0 -0
- /package/dist/{chunk-FBLMVHDK.js.map → chunk-PUZZFYLV.js.map} +0 -0
- /package/dist/{chunk-2LO525TL.js.map → chunk-SJEPQOVW.js.map} +0 -0
- /package/dist/{chunk-QM2RSJ2S.js.map → chunk-TWKXX343.js.map} +0 -0
- /package/dist/{chunk-FVBR7SC3.js.map → chunk-YBZJMAE2.js.map} +0 -0
- /package/dist/{chunks-TT7ZE5QQ.js.map → chunks-VICNQMNE.js.map} +0 -0
- /package/dist/{formula-NW33S4TA.js.map → formula-R7IWAAYR.js.map} +0 -0
- /package/dist/{formula-6RQX4NMJ.js.map → formula-YJWKEPUK.js.map} +0 -0
- /package/dist/{image-ocr-SO56VETS.js.map → image-ocr-G4JVF2UH.js.map} +0 -0
- /package/dist/{image-ocr-CAVU2TNZ.js.map → image-ocr-OLTSKQWD.js.map} +0 -0
- /package/dist/{model-bundle-EIJF34DR.js.map → model-bundle-IFD2D5CW.js.map} +0 -0
- /package/dist/{models-6V4CPQXC.js.map → models-FJ3IUNTB.js.map} +0 -0
- /package/dist/{pdf-ocr-IRXQ5GBM.js.map → pdf-ocr-ATJTB2B3.js.map} +0 -0
- /package/dist/{pdf-ocr-SL4GCOGS.js.map → pdf-ocr-P75KSZFV.js.map} +0 -0
- /package/dist/{profile-io-PZVMM66V.js.map → profile-io-BPJQQZLQ.js.map} +0 -0
- /package/dist/{rasterize-NRWP2C6L.js.map → rasterize-ALCNU53T.js.map} +0 -0
- /package/dist/{render-V5ZPTZQ7.js.map → render-MDLTQUUV.js.map} +0 -0
- /package/dist/{seal-LVG2DGAB.js.map → seal-K4K3KPE3.js.map} +0 -0
- /package/dist/{setup-V55AJP6H.js.map → setup-O2DALZKF.js.map} +0 -0
- /package/dist/{watch-7CQSMDDP.js.map → watch-GPWYJAS2.js.map} +0 -0
|
@@ -17,6 +17,7 @@ var SIZE_KEYS = [
|
|
|
17
17
|
"table",
|
|
18
18
|
"bodyTitle"
|
|
19
19
|
];
|
|
20
|
+
var LEVEL_STYLE_KEYS = ["font", "pt", "bold"];
|
|
20
21
|
var DOC_HEAD_KEYS = ["org", "to", "via", "title"];
|
|
21
22
|
var DOC_FOOT_KEYS = [
|
|
22
23
|
"sender",
|
|
@@ -59,6 +60,7 @@ function buildGongmunOptions(input) {
|
|
|
59
60
|
if (input.h2Marker) g.h2Marker = input.h2Marker;
|
|
60
61
|
if (input.fonts) g.fonts = input.fonts;
|
|
61
62
|
if (input.sizes) g.sizes = input.sizes;
|
|
63
|
+
if (input.levels && Object.keys(input.levels).length > 0) g.levels = input.levels;
|
|
62
64
|
if (input.bullet2) g.bullet2 = input.bullet2;
|
|
63
65
|
if (input.suppressSingle !== void 0) g.suppressSingle = input.suppressSingle;
|
|
64
66
|
if (input.docHead) g.docHead = input.docHead;
|
|
@@ -68,6 +70,26 @@ function buildGongmunOptions(input) {
|
|
|
68
70
|
if (input.press) g.press = input.press;
|
|
69
71
|
return g;
|
|
70
72
|
}
|
|
73
|
+
function parseLevelsSpec(spec) {
|
|
74
|
+
const out = {};
|
|
75
|
+
for (const item of spec.split(",").map((s) => s.trim()).filter(Boolean)) {
|
|
76
|
+
const eq = item.indexOf("=");
|
|
77
|
+
if (eq <= 0) throw new Error(`--levels: '${item}' \u2014 'depth=\uAE00\uAF34/pt/bold' \uAF34\uC774\uC5B4\uC57C \uD568`);
|
|
78
|
+
const depth = item.slice(0, eq).trim();
|
|
79
|
+
const st = {};
|
|
80
|
+
for (const part of item.slice(eq + 1).split("/").map((s) => s.trim()).filter(Boolean)) {
|
|
81
|
+
if (/^\d+(\.\d+)?$/.test(part)) st.pt = Number(part);
|
|
82
|
+
else if (/^(bold|b)$/i.test(part)) st.bold = true;
|
|
83
|
+
else if (/^plain$/i.test(part)) st.bold = false;
|
|
84
|
+
else st.font = part;
|
|
85
|
+
}
|
|
86
|
+
out[depth] = st;
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
function levelFontRecord(levels) {
|
|
91
|
+
return Object.fromEntries(Object.entries(levels).map(([d, st]) => [`levels.${d}`, st.font]));
|
|
92
|
+
}
|
|
71
93
|
|
|
72
94
|
export {
|
|
73
95
|
BODY_FONTS,
|
|
@@ -75,6 +97,7 @@ export {
|
|
|
75
97
|
BULLET2_CHARS,
|
|
76
98
|
FONT_ROLE_KEYS,
|
|
77
99
|
SIZE_KEYS,
|
|
100
|
+
LEVEL_STYLE_KEYS,
|
|
78
101
|
DOC_HEAD_KEYS,
|
|
79
102
|
DOC_FOOT_KEYS,
|
|
80
103
|
NOTICE_HEAD_KEYS,
|
|
@@ -83,6 +106,8 @@ export {
|
|
|
83
106
|
LINE_SPACING_RANGE,
|
|
84
107
|
SIZE_PT_RANGE,
|
|
85
108
|
APPROVAL_MAX,
|
|
86
|
-
buildGongmunOptions
|
|
109
|
+
buildGongmunOptions,
|
|
110
|
+
parseLevelsSpec,
|
|
111
|
+
levelFontRecord
|
|
87
112
|
};
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
113
|
+
//# sourceMappingURL=chunk-3KQOI6R6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hwpx/gongmun-surface.ts"],"sourcesContent":["/**\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 = [\"box\", \"number\", \"none\"] as const\nexport const BULLET2_CHARS = [\"ㅇ\", \"○\"] 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\", \"to\", \"via\", \"title\"] as const\n/** 기안문 결문 키 */\nexport const DOC_FOOT_KEYS = [\n \"sender\", \"drafter\", \"reviewer\", \"approver\", \"cooperator\", \"docNum\", \"receive\",\n \"address\", \"site\", \"phone\", \"fax\", \"email\", \"disclosure\",\n] 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 h2Marker?: (typeof H2_MARKERS)[number]\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 docHead?: NonNullable<GongmunOptions[\"docHead\"]>\n docFoot?: NonNullable<GongmunOptions[\"docFoot\"]>\n reportInfo?: string\n noticeHead?: NonNullable<GongmunOptions[\"noticeHead\"]>\n press?: NonNullable<GongmunOptions[\"press\"]>\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) {\n g.cover = { ...(input.org ? { org: input.org } : {}), ...(input.date ? { date: input.date } : {}) }\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.h2Marker) g.h2Marker = input.h2Marker\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.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 return g\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":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
blocksToMarkdown
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZASGH5EN.js";
|
|
5
5
|
|
|
6
6
|
// src/chunks.ts
|
|
7
7
|
var LIST_MARKER_RE = /^(?:[□■◇◆○◎●◦ㅇ•▪▸▶※-]|\d{1,3}[.)]|[가나다라마바사아자차카타파하][.)]|\([가나다라마바사아자차카타파하0-9]{1,3}\)|[①-⑳㉮-㉻㈎-㈛])\s/;
|
|
@@ -79,4 +79,4 @@ function blocksToChunks(blocks, options) {
|
|
|
79
79
|
export {
|
|
80
80
|
blocksToChunks
|
|
81
81
|
};
|
|
82
|
-
//# sourceMappingURL=chunk-
|
|
82
|
+
//# sourceMappingURL=chunk-6L3B44DH.js.map
|
|
@@ -6,7 +6,7 @@ var _chunkT7GRHAIWcjs = require('./chunk-T7GRHAIW.cjs');
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkISCI5LKNcjs = require('./chunk-ISCI5LKN.cjs');
|
|
10
10
|
|
|
11
11
|
// src/pdf/image-regions.ts
|
|
12
12
|
var _pdfmjs = require('pdfjs-dist/legacy/build/pdf.mjs');
|
|
@@ -962,6 +962,9 @@ function linesIntersect(a, b) {
|
|
|
962
962
|
var CLIP_EDGE_TOL = 1.5;
|
|
963
963
|
var CLIP_MIN_GROUP = 2;
|
|
964
964
|
var CLIP_MAX_PAGE_FRAC = 0.75;
|
|
965
|
+
var TITLED_FRAME_MIN_TOP = 0.2;
|
|
966
|
+
var TITLED_FRAME_MIN_WIDTH = 0.6;
|
|
967
|
+
var HEADER_BAND = 0.08;
|
|
965
968
|
var CLIP_MIN_W2 = 4;
|
|
966
969
|
var CLIP_MIN_H2 = 2;
|
|
967
970
|
var STROKE_NEAR = 2;
|
|
@@ -1007,7 +1010,7 @@ function edgeStroked(lines, dir, pos, a1, a2) {
|
|
|
1007
1010
|
}
|
|
1008
1011
|
return false;
|
|
1009
1012
|
}
|
|
1010
|
-
function buildClipCellGrids(rects, strokedH, strokedV, pageWidth, pageHeight) {
|
|
1013
|
+
function buildClipCellGrids(rects, strokedH, strokedV, pageWidth, pageHeight, textPoints = []) {
|
|
1011
1014
|
const pageArea = pageWidth * pageHeight;
|
|
1012
1015
|
const sameRect = (a, b) => Math.abs(a.x1 - b.x1) <= CLIP_EDGE_TOL && Math.abs(a.x2 - b.x2) <= CLIP_EDGE_TOL && Math.abs(a.y1 - b.y1) <= CLIP_EDGE_TOL && Math.abs(a.y2 - b.y2) <= CLIP_EDGE_TOL;
|
|
1013
1016
|
const cells = [];
|
|
@@ -1055,7 +1058,8 @@ function buildClipCellGrids(rects, strokedH, strokedV, pageWidth, pageHeight) {
|
|
|
1055
1058
|
const groupSize = (i) => _nullishCoalesce(_optionalChain([groups, 'access', _4 => _4.get, 'call', _5 => _5(find(i)), 'optionalAccess', _6 => _6.length]), () => ( 0));
|
|
1056
1059
|
const isGridMember = (i) => groupSize(i) >= CLIP_MIN_GROUP;
|
|
1057
1060
|
const framed = (r) => edgeStroked(strokedH, "h", r.y1, r.x1, r.x2) && edgeStroked(strokedH, "h", r.y2, r.x1, r.x2) && edgeStroked(strokedV, "v", r.x1, r.y1, r.y2) && edgeStroked(strokedV, "v", r.x2, r.y1, r.y2);
|
|
1058
|
-
const
|
|
1061
|
+
const titledFrame = (r) => r.y1 >= pageHeight * TITLED_FRAME_MIN_TOP && r.x2 - r.x1 >= pageWidth * TITLED_FRAME_MIN_WIDTH && textPoints.some((p) => p.y < r.y1 && p.y > pageHeight * HEADER_BAND && p.x >= r.x1 - CLIP_EDGE_TOL && p.x <= r.x2 + CLIP_EDGE_TOL) && textPoints.some((p) => p.x > r.x1 && p.x < r.x2 && p.y > r.y1 && p.y < r.y2);
|
|
1062
|
+
const loneFrame = (i) => isContainer[i] && !isGridMember(i) && (framed(cells[i]) || titledFrame(cells[i]));
|
|
1059
1063
|
const parentAttachable = (i) => parent[i] >= 0 && (isGridMember(parent[i]) || loneFrame(parent[i]));
|
|
1060
1064
|
const onlyChild = (i) => parent[i] >= 0 && parent.filter((p) => p === parent[i]).length === 1;
|
|
1061
1065
|
const grids = [];
|
|
@@ -3042,14 +3046,14 @@ function isProseSpread(items) {
|
|
|
3042
3046
|
for (let i = 1; i < sorted.length; i++) {
|
|
3043
3047
|
gaps.push(sorted[i].x - (sorted[i - 1].x + sorted[i - 1].w));
|
|
3044
3048
|
}
|
|
3045
|
-
const maxGap =
|
|
3049
|
+
const maxGap = _chunkISCI5LKNcjs.safeMax.call(void 0, gaps);
|
|
3046
3050
|
const avgLen = items.reduce((s, i) => s + i.text.length, 0) / items.length;
|
|
3047
3051
|
return maxGap < 40 && avgLen < 5;
|
|
3048
3052
|
}
|
|
3049
3053
|
function detectColumns(yLines) {
|
|
3050
3054
|
const allItems = yLines.flat();
|
|
3051
3055
|
if (allItems.length === 0) return null;
|
|
3052
|
-
const pageWidth =
|
|
3056
|
+
const pageWidth = _chunkISCI5LKNcjs.safeMax.call(void 0, allItems.map((i) => i.x + i.w)) - _chunkISCI5LKNcjs.safeMin.call(void 0, allItems.map((i) => i.x));
|
|
3053
3057
|
if (pageWidth < 100) return null;
|
|
3054
3058
|
let bigoLineIdx = -1;
|
|
3055
3059
|
for (let i = 0; i < yLines.length; i++) {
|
|
@@ -3372,7 +3376,7 @@ function extractPageBlocksWithLines(items, pageNum, opList, pageWidth, pageHeigh
|
|
|
3372
3376
|
if (items.length === 0) return [];
|
|
3373
3377
|
const extracted = extractLines(opList.fnArray, opList.argsArray);
|
|
3374
3378
|
let { horizontals, verticals } = extracted;
|
|
3375
|
-
const clipResult = detectTables ? buildClipCellGrids(extracted.clipRects, horizontals, verticals, pageWidth, pageHeight) : { grids: [], containers: [] };
|
|
3379
|
+
const clipResult = detectTables ? buildClipCellGrids(extracted.clipRects, horizontals, verticals, pageWidth, pageHeight, items.map((it) => ({ x: it.x + it.w / 2, y: it.y + it.h / 2 }))) : { grids: [], containers: [] };
|
|
3376
3380
|
const clipGrids = clipResult.grids;
|
|
3377
3381
|
if (extraLines) {
|
|
3378
3382
|
horizontals = horizontals.concat(extraLines.horizontals);
|
|
@@ -3674,7 +3678,7 @@ function extractBlocksWithGrids(items, pageNum, grids, horizontals, verticals) {
|
|
|
3674
3678
|
if (gutterX !== null) {
|
|
3675
3679
|
const gx = gutterX;
|
|
3676
3680
|
const allY = remaining.map((i) => i.y);
|
|
3677
|
-
const pageH =
|
|
3681
|
+
const pageH = _chunkISCI5LKNcjs.safeMax.call(void 0, allY) - _chunkISCI5LKNcjs.safeMin.call(void 0, allY);
|
|
3678
3682
|
const gapThreshold = Math.max(15, pageH * 0.03);
|
|
3679
3683
|
const sides = [
|
|
3680
3684
|
remaining.filter((i) => i.x + i.w <= gx),
|
|
@@ -3694,7 +3698,7 @@ function extractBlocksWithGrids(items, pageNum, grids, horizontals, verticals) {
|
|
|
3694
3698
|
finalTextBlocks = detectListBlocks(textBlocks);
|
|
3695
3699
|
} else {
|
|
3696
3700
|
const allY = remaining.map((i) => i.y);
|
|
3697
|
-
const pageH =
|
|
3701
|
+
const pageH = _chunkISCI5LKNcjs.safeMax.call(void 0, allY) - _chunkISCI5LKNcjs.safeMin.call(void 0, allY);
|
|
3698
3702
|
const groups = xyCutOrder(remaining, Math.max(15, pageH * 0.03));
|
|
3699
3703
|
const textBlocks = [];
|
|
3700
3704
|
for (const group of groups) {
|
|
@@ -3902,7 +3906,7 @@ function extractPageBlocksFallback(items, pageNum, fullPage = false, detectTable
|
|
|
3902
3906
|
blocks.push({ type: "paragraph", text: tableText, pageNumber: pageNum, bbox, style: dominantStyle(items) });
|
|
3903
3907
|
} else {
|
|
3904
3908
|
const allY = items.map((i) => i.y);
|
|
3905
|
-
const pageHeight =
|
|
3909
|
+
const pageHeight = _chunkISCI5LKNcjs.safeMax.call(void 0, allY) - _chunkISCI5LKNcjs.safeMin.call(void 0, allY);
|
|
3906
3910
|
const gapThreshold = Math.max(15, pageHeight * 0.03);
|
|
3907
3911
|
const orderedGroups = proseCutX !== null ? splitTwoColumnProse(items, proseCutX) : xyCutOrder(items, gapThreshold);
|
|
3908
3912
|
for (const group of orderedGroups) {
|
|
@@ -3941,4 +3945,4 @@ function extractPageBlocksFallback(items, pageNum, fullPage = false, detectTable
|
|
|
3941
3945
|
|
|
3942
3946
|
|
|
3943
3947
|
exports.extractImageRegions = extractImageRegions; exports.filterHiddenText = filterHiddenText; exports.collapseEvenSpacing = collapseEvenSpacing; exports.normalizeItems = normalizeItems; exports.computeMedianFontSizeFromFreq = computeMedianFontSizeFromFreq; exports.detectHeadings = detectHeadings; exports.detectMarkerHeadings = detectMarkerHeadings; exports.detectTableCaptions = detectTableCaptions; exports.detectKoreanListBlocks = detectKoreanListBlocks; exports.removeHeaderFooterBlocks = removeHeaderFooterBlocks; exports.extractPageBlocksWithLines = extractPageBlocksWithLines; exports.mergeCrossPageTables = mergeCrossPageTables;
|
|
3944
|
-
//# sourceMappingURL=chunk-
|
|
3948
|
+
//# sourceMappingURL=chunk-7BIXTQZ3.cjs.map
|