kordoc 4.16.0 → 4.16.2

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 (145) hide show
  1. package/README.md +344 -1135
  2. package/dist/{-VQNLLLPE.js → -4G6MA4X6.js} +11 -11
  3. package/dist/chunk-3IB7LBHC.js +57 -0
  4. package/dist/chunk-3IB7LBHC.js.map +1 -0
  5. package/dist/{chunk-6LMKQM7I.js → chunk-4VODJKFL.js} +3 -3
  6. package/dist/{chunk-UDX7TSOC.js → chunk-5KS5PWJR.js} +2 -2
  7. package/dist/chunk-62W7QCEX.cjs +57 -0
  8. package/dist/chunk-62W7QCEX.cjs.map +1 -0
  9. package/dist/{chunk-NNYF2AGC.js → chunk-7KNGSQU7.js} +4 -4
  10. package/dist/chunk-7KNGSQU7.js.map +1 -0
  11. package/dist/{chunk-DYENR3PX.js → chunk-AUWGDP4G.js} +2 -2
  12. package/dist/{chunk-H6KMTYYZ.cjs → chunk-CEIATRDW.cjs} +3 -3
  13. package/dist/{chunk-H6KMTYYZ.cjs.map → chunk-CEIATRDW.cjs.map} +1 -1
  14. package/dist/{chunk-N6TPODYL.js → chunk-DES2LGFZ.js} +2 -2
  15. package/dist/{chunk-PQRP4NSF.js → chunk-F4NRLLY4.js} +2 -2
  16. package/dist/{chunk-B5NEGP65.cjs → chunk-FKUDAIJI.cjs} +692 -33
  17. package/dist/chunk-FKUDAIJI.cjs.map +1 -0
  18. package/dist/{chunk-XWA625AN.js → chunk-FSDJLAOW.js} +3 -1
  19. package/dist/chunk-FSDJLAOW.js.map +1 -0
  20. package/dist/{chunk-PIMB2YNO.js → chunk-GO5IFOUF.js} +2 -2
  21. package/dist/{chunk-476OYHGZ.js → chunk-IQGIT2VX.js} +37 -7
  22. package/dist/chunk-IQGIT2VX.js.map +1 -0
  23. package/dist/chunk-J3IF6KGW.js +59 -0
  24. package/dist/chunk-J3IF6KGW.js.map +1 -0
  25. package/dist/{chunk-C75WE52C.js → chunk-JELRWAZC.js} +2 -2
  26. package/dist/{chunk-46DZF3RK.js → chunk-JFLAM3MM.js} +2 -2
  27. package/dist/{chunk-A3QDRMVD.js → chunk-KIOQ4N37.js} +2 -2
  28. package/dist/{chunk-TGD7UFHD.js → chunk-LEIAEWZ7.js} +4 -4
  29. package/dist/chunk-LEIAEWZ7.js.map +1 -0
  30. package/dist/{chunk-GOQBON77.js → chunk-MLIS253L.js} +2 -2
  31. package/dist/{chunk-JB5X5NNL.js → chunk-OXLPVQYK.js} +680 -21
  32. package/dist/chunk-OXLPVQYK.js.map +1 -0
  33. package/dist/{chunk-RC4C7Q33.js → chunk-P6ZDXTV6.js} +2 -2
  34. package/dist/{chunk-CB5XDCSL.js → chunk-QOCS7W7R.js} +5034 -4569
  35. package/dist/chunk-QOCS7W7R.js.map +1 -0
  36. package/dist/{chunk-3JWMDL3S.js → chunk-S2PL227Q.js} +2 -2
  37. package/dist/{chunk-HIVK5V27.js → chunk-SFEQYKYJ.js} +133 -110
  38. package/dist/chunk-SFEQYKYJ.js.map +1 -0
  39. package/dist/{chunk-NWODPYBD.cjs → chunk-STM3ORY7.cjs} +2 -2
  40. package/dist/{chunk-NWODPYBD.cjs.map → chunk-STM3ORY7.cjs.map} +1 -1
  41. package/dist/{chunk-43FKGDDO.js → chunk-TXUKTOG2.js} +213 -30
  42. package/dist/chunk-TXUKTOG2.js.map +1 -0
  43. package/dist/{chunk-XHOZB2WP.js → chunk-UTP2WCHS.js} +681 -22
  44. package/dist/chunk-UTP2WCHS.js.map +1 -0
  45. package/dist/{chunk-MH6MAL64.cjs → chunk-WDQTFAXY.cjs} +217 -114
  46. package/dist/chunk-WDQTFAXY.cjs.map +1 -0
  47. package/dist/{chunk-DRY3L5KQ.cjs → chunk-XTFN5WKS.cjs} +7 -7
  48. package/dist/chunk-XTFN5WKS.cjs.map +1 -0
  49. package/dist/chunks-NUNIKS2J.js +10 -0
  50. package/dist/cli.js +33 -30
  51. package/dist/cli.js.map +1 -1
  52. package/dist/{formula-FNQYHMIY.js → formula-EPKLPDU7.js} +3 -3
  53. package/dist/{formula-5775PTP2.js → formula-NARUOXRX.js} +4 -4
  54. package/dist/{formula-VEFKYXPB.cjs → formula-WIMV5TUX.cjs} +9 -9
  55. package/dist/{formula-VEFKYXPB.cjs.map → formula-WIMV5TUX.cjs.map} +1 -1
  56. package/dist/{image-ocr-PYZU4TO7.js → image-ocr-3WJ4QH3T.js} +8 -8
  57. package/dist/{image-ocr-YA2MQBRP.js → image-ocr-5BUJQ4TK.js} +6 -6
  58. package/dist/{image-ocr-6JZR734G.cjs → image-ocr-AXWXR6JV.cjs} +15 -15
  59. package/dist/{image-ocr-6JZR734G.cjs.map → image-ocr-AXWXR6JV.cjs.map} +1 -1
  60. package/dist/index.cjs +1900 -1406
  61. package/dist/index.cjs.map +1 -1
  62. package/dist/index.d.cts +24 -6
  63. package/dist/index.d.ts +24 -6
  64. package/dist/index.js +1282 -788
  65. package/dist/index.js.map +1 -1
  66. package/dist/mcp.js +34 -28
  67. package/dist/mcp.js.map +1 -1
  68. package/dist/{model-bundle-O6J7ORVC.js → model-bundle-IMBW7D2Z.js} +5 -5
  69. package/dist/{models-YMOKZGCI.js → models-SY75IBOE.js} +5 -5
  70. package/dist/{parser-YAQV7FBO.cjs → parser-2LU4EVU3.cjs} +360 -219
  71. package/dist/parser-2LU4EVU3.cjs.map +1 -0
  72. package/dist/{parser-3B6I2XL7.js → parser-N6476XAC.js} +225 -84
  73. package/dist/parser-N6476XAC.js.map +1 -0
  74. package/dist/{parser-PXATL5DM.js → parser-ZQM3664Z.js} +222 -81
  75. package/dist/parser-ZQM3664Z.js.map +1 -0
  76. package/dist/pdf-ocr-6DEE23IP.js +15 -0
  77. package/dist/pdf-ocr-GHEJVPX2.cjs +16 -0
  78. package/dist/{pdf-ocr-T2JXQATA.cjs.map → pdf-ocr-GHEJVPX2.cjs.map} +1 -1
  79. package/dist/pdf-ocr-MQTWODVU.js +18 -0
  80. package/dist/{profile-io-ZTV2MKRT.js → profile-io-GJPKCYPT.js} +3 -3
  81. package/dist/{rasterize-MMUZ537K.js → rasterize-UOALJQDS.js} +3 -3
  82. package/dist/{redact-doc-S42XGV5D.js → redact-doc-22SYW3KH.js} +11 -11
  83. package/dist/{render-WCWPZKJ7.js → render-MJ4H3R23.js} +7 -7
  84. package/dist/seal-XWMRUTI4.js +10 -0
  85. package/dist/{setup-D35LKZCH.js → setup-2URYVUEO.js} +3 -3
  86. package/dist/visual-USPS4QRC.js +20 -0
  87. package/dist/{watch-AX64CIMN.js → watch-ALXZGTOB.js} +12 -12
  88. package/package.json +1 -1
  89. package/dist/chunk-43FKGDDO.js.map +0 -1
  90. package/dist/chunk-476OYHGZ.js.map +0 -1
  91. package/dist/chunk-B5NEGP65.cjs.map +0 -1
  92. package/dist/chunk-CB5XDCSL.js.map +0 -1
  93. package/dist/chunk-DRY3L5KQ.cjs.map +0 -1
  94. package/dist/chunk-HIVK5V27.js.map +0 -1
  95. package/dist/chunk-JB5X5NNL.js.map +0 -1
  96. package/dist/chunk-MH6MAL64.cjs.map +0 -1
  97. package/dist/chunk-NNYF2AGC.js.map +0 -1
  98. package/dist/chunk-QJERJZJ6.js +0 -11
  99. package/dist/chunk-QJERJZJ6.js.map +0 -1
  100. package/dist/chunk-TGD7UFHD.js.map +0 -1
  101. package/dist/chunk-UQ6TZDW6.js +0 -13
  102. package/dist/chunk-UQ6TZDW6.js.map +0 -1
  103. package/dist/chunk-XHOZB2WP.js.map +0 -1
  104. package/dist/chunk-XWA625AN.js.map +0 -1
  105. package/dist/chunk-ZY5K3LPM.cjs +0 -11
  106. package/dist/chunk-ZY5K3LPM.cjs.map +0 -1
  107. package/dist/chunks-JD25E5PM.js +0 -10
  108. package/dist/parser-3B6I2XL7.js.map +0 -1
  109. package/dist/parser-PXATL5DM.js.map +0 -1
  110. package/dist/parser-YAQV7FBO.cjs.map +0 -1
  111. package/dist/pdf-ocr-2TTO5PX2.js +0 -15
  112. package/dist/pdf-ocr-T2JXQATA.cjs +0 -16
  113. package/dist/pdf-ocr-WF2NQA6X.js +0 -18
  114. package/dist/seal-WHK4GOHR.js +0 -10
  115. package/dist/visual-WL4TDE5B.js +0 -20
  116. /package/dist/{-VQNLLLPE.js.map → -4G6MA4X6.js.map} +0 -0
  117. /package/dist/{chunk-6LMKQM7I.js.map → chunk-4VODJKFL.js.map} +0 -0
  118. /package/dist/{chunk-UDX7TSOC.js.map → chunk-5KS5PWJR.js.map} +0 -0
  119. /package/dist/{chunk-DYENR3PX.js.map → chunk-AUWGDP4G.js.map} +0 -0
  120. /package/dist/{chunk-N6TPODYL.js.map → chunk-DES2LGFZ.js.map} +0 -0
  121. /package/dist/{chunk-PQRP4NSF.js.map → chunk-F4NRLLY4.js.map} +0 -0
  122. /package/dist/{chunk-PIMB2YNO.js.map → chunk-GO5IFOUF.js.map} +0 -0
  123. /package/dist/{chunk-C75WE52C.js.map → chunk-JELRWAZC.js.map} +0 -0
  124. /package/dist/{chunk-46DZF3RK.js.map → chunk-JFLAM3MM.js.map} +0 -0
  125. /package/dist/{chunk-A3QDRMVD.js.map → chunk-KIOQ4N37.js.map} +0 -0
  126. /package/dist/{chunk-GOQBON77.js.map → chunk-MLIS253L.js.map} +0 -0
  127. /package/dist/{chunk-RC4C7Q33.js.map → chunk-P6ZDXTV6.js.map} +0 -0
  128. /package/dist/{chunk-3JWMDL3S.js.map → chunk-S2PL227Q.js.map} +0 -0
  129. /package/dist/{chunks-JD25E5PM.js.map → chunks-NUNIKS2J.js.map} +0 -0
  130. /package/dist/{formula-FNQYHMIY.js.map → formula-EPKLPDU7.js.map} +0 -0
  131. /package/dist/{formula-5775PTP2.js.map → formula-NARUOXRX.js.map} +0 -0
  132. /package/dist/{image-ocr-PYZU4TO7.js.map → image-ocr-3WJ4QH3T.js.map} +0 -0
  133. /package/dist/{image-ocr-YA2MQBRP.js.map → image-ocr-5BUJQ4TK.js.map} +0 -0
  134. /package/dist/{model-bundle-O6J7ORVC.js.map → model-bundle-IMBW7D2Z.js.map} +0 -0
  135. /package/dist/{models-YMOKZGCI.js.map → models-SY75IBOE.js.map} +0 -0
  136. /package/dist/{pdf-ocr-2TTO5PX2.js.map → pdf-ocr-6DEE23IP.js.map} +0 -0
  137. /package/dist/{pdf-ocr-WF2NQA6X.js.map → pdf-ocr-MQTWODVU.js.map} +0 -0
  138. /package/dist/{profile-io-ZTV2MKRT.js.map → profile-io-GJPKCYPT.js.map} +0 -0
  139. /package/dist/{rasterize-MMUZ537K.js.map → rasterize-UOALJQDS.js.map} +0 -0
  140. /package/dist/{redact-doc-S42XGV5D.js.map → redact-doc-22SYW3KH.js.map} +0 -0
  141. /package/dist/{render-WCWPZKJ7.js.map → render-MJ4H3R23.js.map} +0 -0
  142. /package/dist/{seal-WHK4GOHR.js.map → seal-XWMRUTI4.js.map} +0 -0
  143. /package/dist/{setup-D35LKZCH.js.map → setup-2URYVUEO.js.map} +0 -0
  144. /package/dist/{visual-WL4TDE5B.js.map → visual-USPS4QRC.js.map} +0 -0
  145. /package/dist/{watch-AX64CIMN.js.map → watch-ALXZGTOB.js.map} +0 -0
@@ -65,6 +65,7 @@ function buildGongmunOptions(input) {
65
65
  if (input.pageNumbers !== void 0) g.pageNumbers = input.pageNumbers;
66
66
  if (input.endMark !== void 0) g.endMark = input.endMark;
67
67
  if (input.bodyTitleBox !== void 0) g.bodyTitleBox = input.bodyTitleBox;
68
+ if (input.chapterFit !== void 0) g.chapterFit = input.chapterFit;
68
69
  if (input.h2Marker) g.h2Marker = input.h2Marker;
69
70
  if (input.bandColor) g.bandColor = input.bandColor;
70
71
  if (input.bandTextColor) g.bandTextColor = input.bandTextColor;
@@ -80,6 +81,7 @@ function buildGongmunOptions(input) {
80
81
  if (input.press) g.press = input.press;
81
82
  if (input.summary) g.summary = input.summary;
82
83
  if (input.docInfo) g.docInfo = input.docInfo;
84
+ if (input.checklist !== void 0) g.checklist = input.checklist;
83
85
  return g;
84
86
  }
85
87
  function parseLevelsSpec(spec) {
@@ -123,4 +125,4 @@ export {
123
125
  parseLevelsSpec,
124
126
  levelFontRecord
125
127
  };
126
- //# sourceMappingURL=chunk-XWA625AN.js.map
128
+ //# sourceMappingURL=chunk-FSDJLAOW.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 = [\"band\", \"roman\", \"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\", \"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 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}\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.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 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-TGD7UFHD.js";
4
+ } from "./chunk-LEIAEWZ7.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-PIMB2YNO.js.map
82
+ //# sourceMappingURL=chunk-GO5IFOUF.js.map
@@ -5,8 +5,9 @@ import {
5
5
  import {
6
6
  HEADING_RATIO_H1,
7
7
  HEADING_RATIO_H2,
8
- HEADING_RATIO_H3
9
- } from "./chunk-UQ6TZDW6.js";
8
+ HEADING_RATIO_H3,
9
+ tidyScriptTags
10
+ } from "./chunk-J3IF6KGW.js";
10
11
  import {
11
12
  parsePageRange
12
13
  } from "./chunk-VQFA55IC.js";
@@ -19,7 +20,7 @@ import {
19
20
  findChildByLocalName,
20
21
  hwpFaceToCssStack,
21
22
  parseRenderStyles
22
- } from "./chunk-46DZF3RK.js";
23
+ } from "./chunk-JFLAM3MM.js";
23
24
  import {
24
25
  MAX_COLS,
25
26
  MAX_ROWS,
@@ -30,18 +31,18 @@ import {
30
31
  flattenLayoutTables,
31
32
  mapPuaText,
32
33
  markNonLayoutTable
33
- } from "./chunk-TGD7UFHD.js";
34
+ } from "./chunk-LEIAEWZ7.js";
34
35
  import {
35
36
  loadSharp,
36
37
  rasterizePageSvg
37
- } from "./chunk-3JWMDL3S.js";
38
+ } from "./chunk-S2PL227Q.js";
38
39
  import {
39
40
  KordocError,
40
41
  escapeHtml,
41
42
  precheckZipSize,
42
43
  sanitizeHref,
43
44
  toArrayBuffer
44
- } from "./chunk-RC4C7Q33.js";
45
+ } from "./chunk-P6ZDXTV6.js";
45
46
 
46
47
  // src/render/svg-render.ts
47
48
  import JSZip from "jszip";
@@ -3003,6 +3004,14 @@ function isExtendedOnlyCtrlChar(ch) {
3003
3004
  function appendParaText(state, data, resolveControl) {
3004
3005
  let result = "";
3005
3006
  let i = 0;
3007
+ const wbase = state.wpos ?? 0;
3008
+ const setScript = (want) => {
3009
+ const cur = state.script ?? null;
3010
+ if (cur === want) return;
3011
+ if (cur) result += `</${cur}>`;
3012
+ if (want) result += `<${want}>`;
3013
+ state.script = want;
3014
+ };
3006
3015
  const base = state.text.length;
3007
3016
  const resolveAt = (byteOffset, extended) => {
3008
3017
  const ctrlId = data.readUInt32LE(byteOffset);
@@ -3013,6 +3022,7 @@ function appendParaText(state, data, resolveControl) {
3013
3022
  };
3014
3023
  while (i + 1 < data.length) {
3015
3024
  const ch = data.readUInt16LE(i);
3025
+ if (state.scriptAt) setScript(ch >= 32 ? state.scriptAt(wbase + i / 2) : null);
3016
3026
  i += 2;
3017
3027
  switch (ch) {
3018
3028
  // ── char 타입 (2바이트만, 확장 데이터 없음) ──
@@ -3084,6 +3094,8 @@ function appendParaText(state, data, resolveControl) {
3084
3094
  break;
3085
3095
  }
3086
3096
  }
3097
+ if (state.scriptAt) setScript(null);
3098
+ state.wpos = wbase + Math.floor(data.length / 2);
3087
3099
  state.text += result;
3088
3100
  }
3089
3101
  function extractEquationText(data) {
@@ -5409,6 +5421,7 @@ function parseParagraph(records, start, end, ctx) {
5409
5421
  const paraShapeId = header.data.length >= 10 ? header.data.readUInt16LE(8) : -1;
5410
5422
  const textRecords = [];
5411
5423
  const charShapeIds = [];
5424
+ const charShapeRuns = [];
5412
5425
  const ctrls = [];
5413
5426
  let i = start + 1;
5414
5427
  while (i < end) {
@@ -5427,6 +5440,7 @@ function parseParagraph(records, start, end, ctx) {
5427
5440
  } else if (rec.tagId === TAG_CHAR_SHAPE && rec.level === baseLevel + 1 && rec.data.length >= 8) {
5428
5441
  for (let offset = 0; offset + 7 < rec.data.length; offset += 8) {
5429
5442
  charShapeIds.push(rec.data.readUInt32LE(offset + 4));
5443
+ charShapeRuns.push([rec.data.readUInt32LE(offset), rec.data.readUInt32LE(offset + 4)]);
5430
5444
  }
5431
5445
  }
5432
5446
  i++;
@@ -5440,6 +5454,7 @@ function parseParagraph(records, start, end, ctx) {
5440
5454
  const state = createParaTextState();
5441
5455
  state.leaderMark = true;
5442
5456
  state.dollarMark = true;
5457
+ state.scriptAt = scriptLookup(charShapeRuns, ctx.docInfo);
5443
5458
  const resolver = (idx, id) => {
5444
5459
  let ctrl = idx >= 0 && idx < ctrls.length ? ctrls[idx] : void 0;
5445
5460
  if (!ctrl || ctrl.idRaw !== id && ctrl.id !== id) {
@@ -5481,6 +5496,7 @@ function parseParagraph(records, start, end, ctx) {
5481
5496
  const leaderAt = text.indexOf(LEADER_TAB_MARK);
5482
5497
  if (leaderAt >= 0) text = text.slice(0, leaderAt);
5483
5498
  if (text.includes(LITERAL_DOLLAR_MARK)) text = text.replaceAll(LITERAL_DOLLAR_MARK, "\\$");
5499
+ text = tidyScriptTags(text);
5484
5500
  let headingLevel = 0;
5485
5501
  let headMarker = null;
5486
5502
  const ps = ctx.docInfo && paraShapeId >= 0 && paraShapeId < ctx.docInfo.paraShapes.length ? ctx.docInfo.paraShapes[paraShapeId] : null;
@@ -5846,6 +5862,20 @@ function pictureToImageBlock(data, ctx) {
5846
5862
  const storageId = item && item.storageId > 0 ? item.storageId : binDataId;
5847
5863
  return { type: "image", text: String(storageId), pageNumber: ctx.page };
5848
5864
  }
5865
+ function scriptLookup(runs, docInfo) {
5866
+ if (!docInfo || !runs.length) return void 0;
5867
+ const kindOf = (id) => {
5868
+ const f = docInfo.charShapes[id]?.attrFlags ?? 0;
5869
+ return f & 1 << 15 ? "sup" : f & 1 << 16 ? "sub" : null;
5870
+ };
5871
+ if (!runs.some(([, id]) => kindOf(id))) return void 0;
5872
+ let k = -1;
5873
+ return (pos) => {
5874
+ if (k >= 0 && runs[k][0] > pos) k = -1;
5875
+ while (k + 1 < runs.length && runs[k + 1][0] <= pos) k++;
5876
+ return k >= 0 ? kindOf(runs[k][1]) : null;
5877
+ };
5878
+ }
5849
5879
  function resolveCharStyle(charShapeIds, docInfo) {
5850
5880
  if (charShapeIds.length === 0 || docInfo.charShapes.length === 0) return void 0;
5851
5881
  const freq = /* @__PURE__ */ new Map();
@@ -7338,4 +7368,4 @@ export {
7338
7368
  cropRect,
7339
7369
  extractRenderedRegions
7340
7370
  };
7341
- //# sourceMappingURL=chunk-476OYHGZ.js.map
7371
+ //# sourceMappingURL=chunk-IQGIT2VX.js.map