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.
Files changed (121) hide show
  1. package/README.md +12 -1
  2. package/dist/{-EZH6NKTE.js → -FWGDIOV4.js} +8 -8
  3. package/dist/{chunk-OEYECZGV.js → chunk-2DAFWDV2.js} +9 -5
  4. package/dist/chunk-2DAFWDV2.js.map +1 -0
  5. package/dist/{chunk-5RPYBC2Q.js → chunk-3KQOI6R6.js} +27 -2
  6. package/dist/chunk-3KQOI6R6.js.map +1 -0
  7. package/dist/{chunk-DBGEUDBY.js → chunk-6L3B44DH.js} +2 -2
  8. package/dist/{chunk-ONNAHSPV.cjs → chunk-7BIXTQZ3.cjs} +14 -10
  9. package/dist/chunk-7BIXTQZ3.cjs.map +1 -0
  10. package/dist/{chunk-IOJX4Q63.js → chunk-B63QEHYL.js} +3 -3
  11. package/dist/{chunk-JCMBQC5N.js → chunk-BAZMKQZW.js} +2 -2
  12. package/dist/{chunk-V5BUPZ6I.cjs → chunk-BOATAEXU.cjs} +7 -4
  13. package/dist/chunk-BOATAEXU.cjs.map +1 -0
  14. package/dist/{chunk-KX7IYCCZ.js → chunk-CKYDP34A.js} +3 -3
  15. package/dist/{chunk-7XUXSDH5.js → chunk-DUGUCM7K.js} +9 -5
  16. package/dist/chunk-DUGUCM7K.js.map +1 -0
  17. package/dist/{chunk-2LKYJ4G3.cjs → chunk-FFITS3NY.cjs} +6 -6
  18. package/dist/{chunk-2LKYJ4G3.cjs.map → chunk-FFITS3NY.cjs.map} +1 -1
  19. package/dist/{chunk-2B7OIEJJ.js → chunk-HB56YANA.js} +5 -2
  20. package/dist/chunk-HB56YANA.js.map +1 -0
  21. package/dist/{chunk-2HBYWA5X.js → chunk-IC6HHXFL.js} +2 -2
  22. package/dist/{chunk-LD2K4K5V.js → chunk-INFYDSZL.js} +111 -22
  23. package/dist/chunk-INFYDSZL.js.map +1 -0
  24. package/dist/{chunk-62IU4NV3.cjs → chunk-ISCI5LKN.cjs} +2 -2
  25. package/dist/{chunk-62IU4NV3.cjs.map → chunk-ISCI5LKN.cjs.map} +1 -1
  26. package/dist/{chunk-XXDZ2KTW.js → chunk-KLO6RHX2.js} +2 -2
  27. package/dist/{chunk-MUYU4JI5.js → chunk-KRE2SREV.js} +2 -2
  28. package/dist/{chunk-QBCMFNHS.js → chunk-OJDMMZ5Z.js} +2 -2
  29. package/dist/{chunk-UL2MDA5C.js → chunk-PL4V523B.js} +3 -3
  30. package/dist/{chunk-FBLMVHDK.js → chunk-PUZZFYLV.js} +2 -2
  31. package/dist/{chunk-2LO525TL.js → chunk-SJEPQOVW.js} +2 -2
  32. package/dist/{chunk-QM2RSJ2S.js → chunk-TWKXX343.js} +3 -3
  33. package/dist/{chunk-2LPBIW2B.cjs → chunk-W3H2H55O.cjs} +3 -3
  34. package/dist/{chunk-2LPBIW2B.cjs.map → chunk-W3H2H55O.cjs.map} +1 -1
  35. package/dist/{chunk-FVBR7SC3.js → chunk-YBZJMAE2.js} +2 -2
  36. package/dist/{chunk-Q6ETEJFK.js → chunk-ZASGH5EN.js} +5 -2
  37. package/dist/chunk-ZASGH5EN.js.map +1 -0
  38. package/dist/chunks-VICNQMNE.js +10 -0
  39. package/dist/cli.js +30 -23
  40. package/dist/cli.js.map +1 -1
  41. package/dist/{formula-NW33S4TA.js → formula-R7IWAAYR.js} +3 -3
  42. package/dist/{formula-6RQX4NMJ.js → formula-YJWKEPUK.js} +4 -4
  43. package/dist/{formula-NBEO6CFC.cjs → formula-ZYHUXTK5.cjs} +9 -9
  44. package/dist/{formula-NBEO6CFC.cjs.map → formula-ZYHUXTK5.cjs.map} +1 -1
  45. package/dist/{image-ocr-V4KY373B.cjs → image-ocr-6O6ZXKUD.cjs} +11 -11
  46. package/dist/{image-ocr-V4KY373B.cjs.map → image-ocr-6O6ZXKUD.cjs.map} +1 -1
  47. package/dist/{image-ocr-SO56VETS.js → image-ocr-G4JVF2UH.js} +7 -7
  48. package/dist/{image-ocr-CAVU2TNZ.js → image-ocr-OLTSKQWD.js} +5 -5
  49. package/dist/index.cjs +455 -366
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.cts +17 -0
  52. package/dist/index.d.ts +17 -0
  53. package/dist/index.js +107 -18
  54. package/dist/index.js.map +1 -1
  55. package/dist/mcp.js +20 -17
  56. package/dist/mcp.js.map +1 -1
  57. package/dist/{model-bundle-EIJF34DR.js → model-bundle-IFD2D5CW.js} +5 -5
  58. package/dist/{models-6V4CPQXC.js → models-FJ3IUNTB.js} +5 -5
  59. package/dist/{parser-OBHNXEQM.js → parser-I7TC35V6.js} +31 -10
  60. package/dist/parser-I7TC35V6.js.map +1 -0
  61. package/dist/{parser-GIREMEPD.js → parser-JRT3B6OK.js} +31 -10
  62. package/dist/parser-JRT3B6OK.js.map +1 -0
  63. package/dist/{parser-OMT25WH2.cjs → parser-YLLIYOIZ.cjs} +59 -38
  64. package/dist/parser-YLLIYOIZ.cjs.map +1 -0
  65. package/dist/pdf-ocr-ADUP2LPU.cjs +14 -0
  66. package/dist/{pdf-ocr-TFYVK4FI.cjs.map → pdf-ocr-ADUP2LPU.cjs.map} +1 -1
  67. package/dist/pdf-ocr-ATJTB2B3.js +13 -0
  68. package/dist/pdf-ocr-P75KSZFV.js +16 -0
  69. package/dist/{profile-io-PZVMM66V.js → profile-io-BPJQQZLQ.js} +3 -3
  70. package/dist/{rasterize-NRWP2C6L.js → rasterize-ALCNU53T.js} +2 -2
  71. package/dist/render-MDLTQUUV.js +10 -0
  72. package/dist/seal-K4K3KPE3.js +10 -0
  73. package/dist/{setup-V55AJP6H.js → setup-O2DALZKF.js} +3 -3
  74. package/dist/{watch-7CQSMDDP.js → watch-GPWYJAS2.js} +9 -9
  75. package/package.json +1 -1
  76. package/dist/chunk-2B7OIEJJ.js.map +0 -1
  77. package/dist/chunk-5RPYBC2Q.js.map +0 -1
  78. package/dist/chunk-7XUXSDH5.js.map +0 -1
  79. package/dist/chunk-LD2K4K5V.js.map +0 -1
  80. package/dist/chunk-OEYECZGV.js.map +0 -1
  81. package/dist/chunk-ONNAHSPV.cjs.map +0 -1
  82. package/dist/chunk-Q6ETEJFK.js.map +0 -1
  83. package/dist/chunk-V5BUPZ6I.cjs.map +0 -1
  84. package/dist/chunks-TT7ZE5QQ.js +0 -10
  85. package/dist/parser-GIREMEPD.js.map +0 -1
  86. package/dist/parser-OBHNXEQM.js.map +0 -1
  87. package/dist/parser-OMT25WH2.cjs.map +0 -1
  88. package/dist/pdf-ocr-IRXQ5GBM.js +0 -13
  89. package/dist/pdf-ocr-SL4GCOGS.js +0 -16
  90. package/dist/pdf-ocr-TFYVK4FI.cjs +0 -14
  91. package/dist/render-V5ZPTZQ7.js +0 -10
  92. package/dist/seal-LVG2DGAB.js +0 -10
  93. /package/dist/{-EZH6NKTE.js.map → -FWGDIOV4.js.map} +0 -0
  94. /package/dist/{chunk-DBGEUDBY.js.map → chunk-6L3B44DH.js.map} +0 -0
  95. /package/dist/{chunk-IOJX4Q63.js.map → chunk-B63QEHYL.js.map} +0 -0
  96. /package/dist/{chunk-JCMBQC5N.js.map → chunk-BAZMKQZW.js.map} +0 -0
  97. /package/dist/{chunk-KX7IYCCZ.js.map → chunk-CKYDP34A.js.map} +0 -0
  98. /package/dist/{chunk-2HBYWA5X.js.map → chunk-IC6HHXFL.js.map} +0 -0
  99. /package/dist/{chunk-XXDZ2KTW.js.map → chunk-KLO6RHX2.js.map} +0 -0
  100. /package/dist/{chunk-MUYU4JI5.js.map → chunk-KRE2SREV.js.map} +0 -0
  101. /package/dist/{chunk-QBCMFNHS.js.map → chunk-OJDMMZ5Z.js.map} +0 -0
  102. /package/dist/{chunk-UL2MDA5C.js.map → chunk-PL4V523B.js.map} +0 -0
  103. /package/dist/{chunk-FBLMVHDK.js.map → chunk-PUZZFYLV.js.map} +0 -0
  104. /package/dist/{chunk-2LO525TL.js.map → chunk-SJEPQOVW.js.map} +0 -0
  105. /package/dist/{chunk-QM2RSJ2S.js.map → chunk-TWKXX343.js.map} +0 -0
  106. /package/dist/{chunk-FVBR7SC3.js.map → chunk-YBZJMAE2.js.map} +0 -0
  107. /package/dist/{chunks-TT7ZE5QQ.js.map → chunks-VICNQMNE.js.map} +0 -0
  108. /package/dist/{formula-NW33S4TA.js.map → formula-R7IWAAYR.js.map} +0 -0
  109. /package/dist/{formula-6RQX4NMJ.js.map → formula-YJWKEPUK.js.map} +0 -0
  110. /package/dist/{image-ocr-SO56VETS.js.map → image-ocr-G4JVF2UH.js.map} +0 -0
  111. /package/dist/{image-ocr-CAVU2TNZ.js.map → image-ocr-OLTSKQWD.js.map} +0 -0
  112. /package/dist/{model-bundle-EIJF34DR.js.map → model-bundle-IFD2D5CW.js.map} +0 -0
  113. /package/dist/{models-6V4CPQXC.js.map → models-FJ3IUNTB.js.map} +0 -0
  114. /package/dist/{pdf-ocr-IRXQ5GBM.js.map → pdf-ocr-ATJTB2B3.js.map} +0 -0
  115. /package/dist/{pdf-ocr-SL4GCOGS.js.map → pdf-ocr-P75KSZFV.js.map} +0 -0
  116. /package/dist/{profile-io-PZVMM66V.js.map → profile-io-BPJQQZLQ.js.map} +0 -0
  117. /package/dist/{rasterize-NRWP2C6L.js.map → rasterize-ALCNU53T.js.map} +0 -0
  118. /package/dist/{render-V5ZPTZQ7.js.map → render-MDLTQUUV.js.map} +0 -0
  119. /package/dist/{seal-LVG2DGAB.js.map → seal-K4K3KPE3.js.map} +0 -0
  120. /package/dist/{setup-V55AJP6H.js.map → setup-O2DALZKF.js.map} +0 -0
  121. /package/dist/{watch-7CQSMDDP.js.map → watch-GPWYJAS2.js.map} +0 -0
package/README.md CHANGED
@@ -89,7 +89,18 @@ MCP 등록 대신 스킬(SKILL.md) 형태로 쓰려면:
89
89
 
90
90
  ---
91
91
 
92
- ## v4.12.2 변경사항
92
+ ## v4.12.3 변경사항
93
+
94
+ 공문서 작성 쪽 라운드. 실결재 기안문 206건·보고서 337건의 항목부호 단계별 글꼴을 실측해 **위계 폰트 옵션**을 넣고, 표기법 검수의 쌍점·날짜 룰 오탐을 법정 서식 근거로 좁혔습니다. 별표 코퍼스 3차(183쌍)를 더해 게이트 모수는 hwpx ~1,390·pdf ~950·hwp쌍 ~860 입니다.
95
+
96
+ - **🔤 위계 폰트 `levels`**: 항목부호 단계(0~7)마다 글꼴·크기·굵기를 지정합니다 — `--levels "0=HY견고딕/17/bold,1=한컴돋움/15/bold,2=휴먼명조/14"`, MCP `levels`. 실측: 법정 8단계(1. 가. 1))는 본문과 동일이 90% 라 기본값은 그대로이고, 전자결재 기안문의 □/ㅇ/- 계열은 □ HY견고딕 +2~3pt 굵게 · ㅇ 한컴돋움 굵게 · - 휴먼명조가 지배 관행입니다(`docs/gongmunseo-reference.md` 2.7). 내어쓰기 폭도 그 단계 글자 크기로 맞춥니다. 미지정이면 산출물 불변.
97
+ - **📝 표기법 룰 좁힘**: `COLON_SPACE` 는 표 셀을 건너뜁니다 — 법정 별지서식 자체가 "성 명 :" 라벨 셀을 쓰므로(서식 595건의 표 셀 801건 전부 라벨) 규칙 대상이 아닙니다. 본문의 "일 시 : 값"(기안문 206건 중 100건, 414건)은 편람상 위반이라 그대로 경고합니다. HTML 태그·마크다운 강조 닫힘 뒤 쌍점("성명:</td>", "과정:** 붙임") 오탐도 제거. `DATE_NO_SPACE` 는 법제처 연혁 표기(`<개정 2012.2.14>`·`삭제 <2016.2.29.>`·`[시행일:2017.9.8.]`)를 제외합니다(서식 156건 → 10건). 기안문의 문서번호 인용 "○○과-123(2026.7.1.)호"(103건)는 편람 날짜 표기 위반이라 유지.
98
+ - **📄 PDF 가운뎃점**: 한컴 PDF 가 가운뎃점(ㆍ)을 조합형 아래아(U+119E)로 내던 것을 되돌립니다(별지서식 573쌍 실측 340자·41문서).
99
+ - **📄 PDF 1×1 표 줄 보존**: 선서문 안쪽 상자처럼 중첩표 없는 1×1 표는 줄마다 문단으로 내어 "선 서 나는 헌법을 …" 처럼 제목 줄이 본문에 붙지 않습니다(표 셀 줄바꿈 보존 정책과 정합).
100
+ - **📄 PDF 제목 아래 틀**: 테두리 없는 1칸 틀(별표 1×1 프레임·선서문 바깥 틀)을 "페이지 반복 클립" 으로 가르려던 가설은 반증됐고(본문 영역 클립은 쪽마다 좌표가 다르고 별표는 1쪽), 대신 **제목 아래(윗변 ≥ 20%)·본문 폭(≥ 60%)·위에 글이 있는** 컨테이너를 틀로 봅니다. 채용공고 2단 상자는 폭 조건으로 제외(pdf-table-gt 게이트 유지).
101
+ - **🖋️ HWP 결재 기호 하나 더**: 한컴 PDF 실렌더로 확인한 네모 안 "인"(U+F00E1, HWP5 A0E1)을 "(인)" 으로 냅니다. HWP5 하이픈 제어문자(0x18)는 한컴이 그리지 않으므로("60g/㎡") 더 이상 "-" 를 내지 않습니다.
102
+ - **📊 별표 코퍼스 3차**: `licbyl-byl2/` 183쌍(seed 20260907). 하위 30건 분해 — 1×1 틀 PDF 미감지 8 · HWP 레이아웃 해체 vs PDF 1열 유지 15 · 구조 차 7(수식 셀·쪽 경계 셀 분할·줄바꿈, 파서 결함 없음). HWP↔PDF 셀 일치 별표 0.728 → 0.746, 3차 0.772 → 0.787, 서식 0.965 유지.
103
+
93
104
 
94
105
  별지서식 라운드 2. 코퍼스를 서식 279쌍·별표 90쌍 더 모아(총 1,995파일) HWP·HWPX·PDF 세 파서가 **같은 IR 모양**을 내도록 맞췄습니다. HWP↔PDF 셀 텍스트 일치 0.927 → 0.965, PDF 표 GT cellExact 0.945 → 0.980 을 실측했고 게이트 플로어를 그 수치로 올렸습니다.
95
106
 
@@ -56,7 +56,7 @@ import {
56
56
  unknownFontWarnings,
57
57
  usesGaejosikMunche,
58
58
  validateHwpx
59
- } from "./chunk-LD2K4K5V.js";
59
+ } from "./chunk-INFYDSZL.js";
60
60
  import "./chunk-7FCNOKOR.js";
61
61
  import "./chunk-N3DLQ2YH.js";
62
62
  import "./chunk-MOL7MDBG.js";
@@ -66,7 +66,7 @@ import {
66
66
  buildRangeSplices,
67
67
  placeSealHwpx,
68
68
  scanSectionXml
69
- } from "./chunk-KX7IYCCZ.js";
69
+ } from "./chunk-CKYDP34A.js";
70
70
  import {
71
71
  DEFAULT_REDACT_RULES,
72
72
  redactMarkdown,
@@ -74,10 +74,10 @@ import {
74
74
  } from "./chunk-DZIXKL7E.js";
75
75
  import {
76
76
  blocksToChunks
77
- } from "./chunk-DBGEUDBY.js";
77
+ } from "./chunk-6L3B44DH.js";
78
78
  import {
79
79
  blocksToMarkdown
80
- } from "./chunk-Q6ETEJFK.js";
80
+ } from "./chunk-ZASGH5EN.js";
81
81
  import {
82
82
  SPACE_EM_FIXED,
83
83
  SPACE_EM_FONT,
@@ -87,11 +87,11 @@ import {
87
87
  renderHwpxToSvg,
88
88
  simulateWrap,
89
89
  simulateWrapKeepWord
90
- } from "./chunk-IOJX4Q63.js";
91
- import "./chunk-FVBR7SC3.js";
90
+ } from "./chunk-B63QEHYL.js";
91
+ import "./chunk-YBZJMAE2.js";
92
92
  import {
93
93
  VERSION
94
- } from "./chunk-FBLMVHDK.js";
94
+ } from "./chunk-PUZZFYLV.js";
95
95
  export {
96
96
  BUILTIN_TEMPLATES,
97
97
  DEFAULT_REDACT_RULES,
@@ -169,4 +169,4 @@ export {
169
169
  usesGaejosikMunche,
170
170
  validateHwpx
171
171
  };
172
- //# sourceMappingURL=-EZH6NKTE.js.map
172
+ //# sourceMappingURL=-FWGDIOV4.js.map
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  safeMax,
9
9
  safeMin
10
- } from "./chunk-FBLMVHDK.js";
10
+ } from "./chunk-PUZZFYLV.js";
11
11
 
12
12
  // src/pdf/image-regions.ts
13
13
  import { OPS } from "pdfjs-dist/legacy/build/pdf.mjs";
@@ -963,6 +963,9 @@ function linesIntersect(a, b) {
963
963
  var CLIP_EDGE_TOL = 1.5;
964
964
  var CLIP_MIN_GROUP = 2;
965
965
  var CLIP_MAX_PAGE_FRAC = 0.75;
966
+ var TITLED_FRAME_MIN_TOP = 0.2;
967
+ var TITLED_FRAME_MIN_WIDTH = 0.6;
968
+ var HEADER_BAND = 0.08;
966
969
  var CLIP_MIN_W2 = 4;
967
970
  var CLIP_MIN_H2 = 2;
968
971
  var STROKE_NEAR = 2;
@@ -1008,7 +1011,7 @@ function edgeStroked(lines, dir, pos, a1, a2) {
1008
1011
  }
1009
1012
  return false;
1010
1013
  }
1011
- function buildClipCellGrids(rects, strokedH, strokedV, pageWidth, pageHeight) {
1014
+ function buildClipCellGrids(rects, strokedH, strokedV, pageWidth, pageHeight, textPoints = []) {
1012
1015
  const pageArea = pageWidth * pageHeight;
1013
1016
  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;
1014
1017
  const cells = [];
@@ -1056,7 +1059,8 @@ function buildClipCellGrids(rects, strokedH, strokedV, pageWidth, pageHeight) {
1056
1059
  const groupSize = (i) => groups.get(find(i))?.length ?? 0;
1057
1060
  const isGridMember = (i) => groupSize(i) >= CLIP_MIN_GROUP;
1058
1061
  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);
1059
- const loneFrame = (i) => isContainer[i] && !isGridMember(i) && framed(cells[i]);
1062
+ 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);
1063
+ const loneFrame = (i) => isContainer[i] && !isGridMember(i) && (framed(cells[i]) || titledFrame(cells[i]));
1060
1064
  const parentAttachable = (i) => parent[i] >= 0 && (isGridMember(parent[i]) || loneFrame(parent[i]));
1061
1065
  const onlyChild = (i) => parent[i] >= 0 && parent.filter((p) => p === parent[i]).length === 1;
1062
1066
  const grids = [];
@@ -3373,7 +3377,7 @@ function extractPageBlocksWithLines(items, pageNum, opList, pageWidth, pageHeigh
3373
3377
  if (items.length === 0) return [];
3374
3378
  const extracted = extractLines(opList.fnArray, opList.argsArray);
3375
3379
  let { horizontals, verticals } = extracted;
3376
- const clipResult = detectTables ? buildClipCellGrids(extracted.clipRects, horizontals, verticals, pageWidth, pageHeight) : { grids: [], containers: [] };
3380
+ 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: [] };
3377
3381
  const clipGrids = clipResult.grids;
3378
3382
  if (extraLines) {
3379
3383
  horizontals = horizontals.concat(extraLines.horizontals);
@@ -3942,4 +3946,4 @@ export {
3942
3946
  extractPageBlocksWithLines,
3943
3947
  mergeCrossPageTables
3944
3948
  };
3945
- //# sourceMappingURL=chunk-OEYECZGV.js.map
3949
+ //# sourceMappingURL=chunk-2DAFWDV2.js.map