kordoc 4.16.2 → 4.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +14 -13
  2. package/dist/{-4G6MA4X6.js → -PRAKO6M4.js} +11 -11
  3. package/dist/{chunk-AUWGDP4G.js → chunk-2KF5WZCR.js} +2 -2
  4. package/dist/{chunk-UTP2WCHS.js → chunk-4GSF2R7T.js} +4 -4
  5. package/dist/{chunk-TXUKTOG2.js → chunk-4XVNQAK5.js} +219 -23
  6. package/dist/chunk-4XVNQAK5.js.map +1 -0
  7. package/dist/chunk-5CDUL6PH.js +250 -0
  8. package/dist/chunk-5CDUL6PH.js.map +1 -0
  9. package/dist/{chunk-4VODJKFL.js → chunk-6RGGYQQC.js} +3 -3
  10. package/dist/{chunk-DES2LGFZ.js → chunk-A55JGNKD.js} +2 -2
  11. package/dist/chunk-AKB72TEH.cjs +248 -0
  12. package/dist/chunk-AKB72TEH.cjs.map +1 -0
  13. package/dist/{chunk-LEIAEWZ7.js → chunk-BFT5IM2R.js} +2 -2
  14. package/dist/{chunk-KIOQ4N37.js → chunk-BLPR4HRF.js} +2 -2
  15. package/dist/{chunk-JELRWAZC.js → chunk-BZG7K44Z.js} +2 -2
  16. package/dist/{chunk-F4NRLLY4.js → chunk-EFO6JZY6.js} +2 -2
  17. package/dist/chunk-GS7T56RP.cjs.map +1 -1
  18. package/dist/{chunk-JFLAM3MM.js → chunk-I5DJOP62.js} +2 -2
  19. package/dist/chunk-I5DJOP62.js.map +1 -0
  20. package/dist/chunk-J55UQC5H.cjs.map +1 -1
  21. package/dist/{chunk-QOCS7W7R.js → chunk-K2VYABZ3.js} +86 -43
  22. package/dist/chunk-K2VYABZ3.js.map +1 -0
  23. package/dist/chunk-MJBCXW5R.js +248 -0
  24. package/dist/chunk-MJBCXW5R.js.map +1 -0
  25. package/dist/{chunk-MLIS253L.js → chunk-ML4NHUR7.js} +2 -2
  26. package/dist/{chunk-GO5IFOUF.js → chunk-N6V7LQBL.js} +2 -2
  27. package/dist/{chunk-FKUDAIJI.cjs → chunk-O7OUX6NU.cjs} +12 -12
  28. package/dist/chunk-O7OUX6NU.cjs.map +1 -0
  29. package/dist/{chunk-S2PL227Q.js → chunk-PHID6WNG.js} +2 -2
  30. package/dist/{chunk-IQGIT2VX.js → chunk-QJWVMPB6.js} +34 -17
  31. package/dist/chunk-QJWVMPB6.js.map +1 -0
  32. package/dist/{chunk-STM3ORY7.cjs → chunk-QNJLLF4J.cjs} +2 -2
  33. package/dist/chunk-QNJLLF4J.cjs.map +1 -0
  34. package/dist/{chunk-FSDJLAOW.js → chunk-QPJXYJIK.js} +55 -1
  35. package/dist/chunk-QPJXYJIK.js.map +1 -0
  36. package/dist/{chunk-XTFN5WKS.cjs → chunk-R2BUANHQ.cjs} +6 -6
  37. package/dist/chunk-R2BUANHQ.cjs.map +1 -0
  38. package/dist/{chunk-OXLPVQYK.js → chunk-TDQ6XDB3.js} +3 -3
  39. package/dist/{chunk-SFEQYKYJ.js → chunk-WN6OD2CQ.js} +218 -22
  40. package/dist/chunk-WN6OD2CQ.js.map +1 -0
  41. package/dist/{chunk-5KS5PWJR.js → chunk-WY5JAR4O.js} +2 -2
  42. package/dist/{chunk-CEIATRDW.cjs → chunk-WYON5ANU.cjs} +3 -3
  43. package/dist/chunk-WYON5ANU.cjs.map +1 -0
  44. package/dist/{chunk-WDQTFAXY.cjs → chunk-XEPKOC2O.cjs} +240 -44
  45. package/dist/chunk-XEPKOC2O.cjs.map +1 -0
  46. package/dist/{chunk-7KNGSQU7.js → chunk-YZ5HHS6A.js} +2 -2
  47. package/dist/{chunk-P6ZDXTV6.js → chunk-ZF6KHPB7.js} +2 -2
  48. package/dist/chunks-YBFBLJ4G.js +10 -0
  49. package/dist/cli.js +36 -54
  50. package/dist/cli.js.map +1 -1
  51. package/dist/{formula-NARUOXRX.js → formula-7MMFBRGJ.js} +4 -4
  52. package/dist/{formula-WIMV5TUX.cjs → formula-ECNOZT36.cjs} +9 -9
  53. package/dist/formula-ECNOZT36.cjs.map +1 -0
  54. package/dist/{formula-EPKLPDU7.js → formula-SHBXRXOJ.js} +3 -3
  55. package/dist/{image-ocr-3WJ4QH3T.js → image-ocr-P6ECJCT2.js} +8 -8
  56. package/dist/{image-ocr-5BUJQ4TK.js → image-ocr-QCT3A7X5.js} +6 -6
  57. package/dist/{image-ocr-AXWXR6JV.cjs → image-ocr-VUDSP2B4.cjs} +15 -15
  58. package/dist/image-ocr-VUDSP2B4.cjs.map +1 -0
  59. package/dist/index.cjs +768 -710
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.d.cts +4 -0
  62. package/dist/index.d.ts +4 -0
  63. package/dist/index.js +106 -48
  64. package/dist/index.js.map +1 -1
  65. package/dist/mcp.js +38 -43
  66. package/dist/mcp.js.map +1 -1
  67. package/dist/{model-bundle-IMBW7D2Z.js → model-bundle-OUHGCEZY.js} +5 -5
  68. package/dist/{models-SY75IBOE.js → models-6D6LMOTH.js} +5 -5
  69. package/dist/page-range-QHHFTL7X.cjs.map +1 -1
  70. package/dist/{parser-ZQM3664Z.js → parser-CTRB7PKD.js} +257 -46
  71. package/dist/parser-CTRB7PKD.js.map +1 -0
  72. package/dist/{parser-2LU4EVU3.cjs → parser-RQ4PJRTJ.cjs} +411 -200
  73. package/dist/parser-RQ4PJRTJ.cjs.map +1 -0
  74. package/dist/{parser-N6476XAC.js → parser-ZPRQ3SSU.js} +260 -49
  75. package/dist/parser-ZPRQ3SSU.js.map +1 -0
  76. package/dist/pdf-ocr-462ZFSHX.js +15 -0
  77. package/dist/pdf-ocr-L35FQYGP.js +18 -0
  78. package/dist/pdf-ocr-STK5EQFF.cjs +16 -0
  79. package/dist/pdf-ocr-STK5EQFF.cjs.map +1 -0
  80. package/dist/{profile-io-GJPKCYPT.js → profile-io-YZUW6MAN.js} +3 -3
  81. package/dist/{rasterize-UOALJQDS.js → rasterize-OUR2QJXX.js} +3 -3
  82. package/dist/{redact-doc-22SYW3KH.js → redact-doc-4OQKG4SM.js} +11 -11
  83. package/dist/{render-MJ4H3R23.js → render-XNO6PZJO.js} +7 -7
  84. package/dist/seal-CJ7C44JN.js +10 -0
  85. package/dist/{setup-2URYVUEO.js → setup-UU3EIHNI.js} +3 -3
  86. package/dist/visual-QRMRFPUK.js +20 -0
  87. package/dist/{watch-ALXZGTOB.js → watch-SR6Q5SQN.js} +12 -12
  88. package/package.json +2 -2
  89. package/dist/chunk-3IB7LBHC.js +0 -57
  90. package/dist/chunk-3IB7LBHC.js.map +0 -1
  91. package/dist/chunk-62W7QCEX.cjs +0 -57
  92. package/dist/chunk-62W7QCEX.cjs.map +0 -1
  93. package/dist/chunk-CEIATRDW.cjs.map +0 -1
  94. package/dist/chunk-FKUDAIJI.cjs.map +0 -1
  95. package/dist/chunk-FSDJLAOW.js.map +0 -1
  96. package/dist/chunk-IQGIT2VX.js.map +0 -1
  97. package/dist/chunk-J3IF6KGW.js +0 -59
  98. package/dist/chunk-J3IF6KGW.js.map +0 -1
  99. package/dist/chunk-JFLAM3MM.js.map +0 -1
  100. package/dist/chunk-QOCS7W7R.js.map +0 -1
  101. package/dist/chunk-SFEQYKYJ.js.map +0 -1
  102. package/dist/chunk-STM3ORY7.cjs.map +0 -1
  103. package/dist/chunk-TXUKTOG2.js.map +0 -1
  104. package/dist/chunk-WDQTFAXY.cjs.map +0 -1
  105. package/dist/chunk-XTFN5WKS.cjs.map +0 -1
  106. package/dist/chunks-NUNIKS2J.js +0 -10
  107. package/dist/formula-WIMV5TUX.cjs.map +0 -1
  108. package/dist/image-ocr-AXWXR6JV.cjs.map +0 -1
  109. package/dist/parser-2LU4EVU3.cjs.map +0 -1
  110. package/dist/parser-N6476XAC.js.map +0 -1
  111. package/dist/parser-ZQM3664Z.js.map +0 -1
  112. package/dist/pdf-ocr-6DEE23IP.js +0 -15
  113. package/dist/pdf-ocr-GHEJVPX2.cjs +0 -16
  114. package/dist/pdf-ocr-GHEJVPX2.cjs.map +0 -1
  115. package/dist/pdf-ocr-MQTWODVU.js +0 -18
  116. package/dist/seal-XWMRUTI4.js +0 -10
  117. package/dist/visual-USPS4QRC.js +0 -20
  118. /package/dist/{-4G6MA4X6.js.map → -PRAKO6M4.js.map} +0 -0
  119. /package/dist/{chunk-AUWGDP4G.js.map → chunk-2KF5WZCR.js.map} +0 -0
  120. /package/dist/{chunk-UTP2WCHS.js.map → chunk-4GSF2R7T.js.map} +0 -0
  121. /package/dist/{chunk-4VODJKFL.js.map → chunk-6RGGYQQC.js.map} +0 -0
  122. /package/dist/{chunk-DES2LGFZ.js.map → chunk-A55JGNKD.js.map} +0 -0
  123. /package/dist/{chunk-LEIAEWZ7.js.map → chunk-BFT5IM2R.js.map} +0 -0
  124. /package/dist/{chunk-KIOQ4N37.js.map → chunk-BLPR4HRF.js.map} +0 -0
  125. /package/dist/{chunk-JELRWAZC.js.map → chunk-BZG7K44Z.js.map} +0 -0
  126. /package/dist/{chunk-F4NRLLY4.js.map → chunk-EFO6JZY6.js.map} +0 -0
  127. /package/dist/{chunk-MLIS253L.js.map → chunk-ML4NHUR7.js.map} +0 -0
  128. /package/dist/{chunk-GO5IFOUF.js.map → chunk-N6V7LQBL.js.map} +0 -0
  129. /package/dist/{chunk-S2PL227Q.js.map → chunk-PHID6WNG.js.map} +0 -0
  130. /package/dist/{chunk-OXLPVQYK.js.map → chunk-TDQ6XDB3.js.map} +0 -0
  131. /package/dist/{chunk-5KS5PWJR.js.map → chunk-WY5JAR4O.js.map} +0 -0
  132. /package/dist/{chunk-7KNGSQU7.js.map → chunk-YZ5HHS6A.js.map} +0 -0
  133. /package/dist/{chunk-P6ZDXTV6.js.map → chunk-ZF6KHPB7.js.map} +0 -0
  134. /package/dist/{chunks-NUNIKS2J.js.map → chunks-YBFBLJ4G.js.map} +0 -0
  135. /package/dist/{formula-NARUOXRX.js.map → formula-7MMFBRGJ.js.map} +0 -0
  136. /package/dist/{formula-EPKLPDU7.js.map → formula-SHBXRXOJ.js.map} +0 -0
  137. /package/dist/{image-ocr-3WJ4QH3T.js.map → image-ocr-P6ECJCT2.js.map} +0 -0
  138. /package/dist/{image-ocr-5BUJQ4TK.js.map → image-ocr-QCT3A7X5.js.map} +0 -0
  139. /package/dist/{model-bundle-IMBW7D2Z.js.map → model-bundle-OUHGCEZY.js.map} +0 -0
  140. /package/dist/{models-SY75IBOE.js.map → models-6D6LMOTH.js.map} +0 -0
  141. /package/dist/{pdf-ocr-6DEE23IP.js.map → pdf-ocr-462ZFSHX.js.map} +0 -0
  142. /package/dist/{pdf-ocr-MQTWODVU.js.map → pdf-ocr-L35FQYGP.js.map} +0 -0
  143. /package/dist/{profile-io-GJPKCYPT.js.map → profile-io-YZUW6MAN.js.map} +0 -0
  144. /package/dist/{rasterize-UOALJQDS.js.map → rasterize-OUR2QJXX.js.map} +0 -0
  145. /package/dist/{redact-doc-22SYW3KH.js.map → redact-doc-4OQKG4SM.js.map} +0 -0
  146. /package/dist/{render-MJ4H3R23.js.map → render-XNO6PZJO.js.map} +0 -0
  147. /package/dist/{seal-XWMRUTI4.js.map → seal-CJ7C44JN.js.map} +0 -0
  148. /package/dist/{setup-2URYVUEO.js.map → setup-UU3EIHNI.js.map} +0 -0
  149. /package/dist/{visual-USPS4QRC.js.map → visual-QRMRFPUK.js.map} +0 -0
  150. /package/dist/{watch-ALXZGTOB.js.map → watch-SR6Q5SQN.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  escapeHtml,
3
3
  sanitizeHref
4
- } from "./chunk-MLIS253L.js";
4
+ } from "./chunk-ML4NHUR7.js";
5
5
 
6
6
  // src/shared/symbol-fonts.ts
7
7
  var WINGDINGS = [
@@ -1133,4 +1133,4 @@ export {
1133
1133
  inlineImagesIntoMarkdown,
1134
1134
  blocksToPages
1135
1135
  };
1136
- //# sourceMappingURL=chunk-7KNGSQU7.js.map
1136
+ //# sourceMappingURL=chunk-YZ5HHS6A.js.map
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/utils.ts
4
4
  import { format } from "util";
5
- var VERSION = true ? "4.16.2" : "0.0.0-dev";
5
+ var VERSION = true ? "4.17.0" : "0.0.0-dev";
6
6
  function toArrayBuffer(buf) {
7
7
  if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {
8
8
  return buf.buffer;
@@ -159,4 +159,4 @@ export {
159
159
  OPTIONAL_DEP_INSTALL_HINT,
160
160
  classifyError
161
161
  };
162
- //# sourceMappingURL=chunk-P6ZDXTV6.js.map
162
+ //# sourceMappingURL=chunk-ZF6KHPB7.js.map
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ blocksToChunks
4
+ } from "./chunk-N6V7LQBL.js";
5
+ import "./chunk-BFT5IM2R.js";
6
+ import "./chunk-ZF6KHPB7.js";
7
+ export {
8
+ blocksToChunks
9
+ };
10
+ //# sourceMappingURL=chunks-YBFBLJ4G.js.map
package/dist/cli.js CHANGED
@@ -1,15 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  parseFormatProfileJson
4
- } from "./chunk-5KS5PWJR.js";
4
+ } from "./chunk-WY5JAR4O.js";
5
5
  import {
6
6
  BODY_FONTS,
7
7
  BULLET2_CHARS,
8
8
  H2_MARKERS,
9
9
  buildGongmunOptions,
10
10
  levelFontRecord,
11
+ loadGenerationImages,
11
12
  parseLevelsSpec
12
- } from "./chunk-FSDJLAOW.js";
13
+ } from "./chunk-QPJXYJIK.js";
13
14
  import {
14
15
  BUILTIN_TEMPLATES,
15
16
  PRESET_ALIAS,
@@ -30,24 +31,24 @@ import {
30
31
  resolveBuiltinTemplate,
31
32
  unknownFontWarnings,
32
33
  usesGaejosikMunche
33
- } from "./chunk-QOCS7W7R.js";
34
- import "./chunk-AUWGDP4G.js";
35
- import "./chunk-4VODJKFL.js";
34
+ } from "./chunk-K2VYABZ3.js";
35
+ import "./chunk-2KF5WZCR.js";
36
+ import "./chunk-6RGGYQQC.js";
36
37
  import "./chunk-3WSNLH4B.js";
37
- import "./chunk-GO5IFOUF.js";
38
+ import "./chunk-N6V7LQBL.js";
38
39
  import {
39
40
  detectFormat,
40
41
  detectImageMime,
41
42
  detectZipFormat
42
- } from "./chunk-IQGIT2VX.js";
43
+ } from "./chunk-QJWVMPB6.js";
43
44
  import "./chunk-7FCNOKOR.js";
44
- import "./chunk-J3IF6KGW.js";
45
+ import "./chunk-5CDUL6PH.js";
45
46
  import "./chunk-VQFA55IC.js";
46
- import "./chunk-JFLAM3MM.js";
47
+ import "./chunk-I5DJOP62.js";
47
48
  import {
48
49
  blocksToMarkdown
49
- } from "./chunk-LEIAEWZ7.js";
50
- import "./chunk-S2PL227Q.js";
50
+ } from "./chunk-BFT5IM2R.js";
51
+ import "./chunk-PHID6WNG.js";
51
52
  import {
52
53
  KordocError,
53
54
  VERSION,
@@ -55,7 +56,7 @@ import {
55
56
  routeConsoleToStderr,
56
57
  sanitizeError,
57
58
  toArrayBuffer
58
- } from "./chunk-P6ZDXTV6.js";
59
+ } from "./chunk-ZF6KHPB7.js";
59
60
 
60
61
  // src/cli.ts
61
62
  import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, mkdirSync as mkdirSync4, statSync as statSync4 } from "fs";
@@ -74,7 +75,7 @@ function registerDocCommands(program2) {
74
75
  if (command.getOptionValueSource("format") === "default" && program2.getOptionValueSource("format") === "cli") {
75
76
  opts.format = rootOpts.format;
76
77
  }
77
- const { watchDirectory } = await import("./watch-ALXZGTOB.js");
78
+ const { watchDirectory } = await import("./watch-SR6Q5SQN.js");
78
79
  await watchDirectory({
79
80
  dir,
80
81
  outDir: opts.outDir,
@@ -132,7 +133,7 @@ function registerDocCommands(program2) {
132
133
  if (!opts.silent) process.stderr.write(`[kordoc] ${inputName} \uD30C\uC2F1 \uC911...
133
134
  `);
134
135
  if (opts.dryRun) {
135
- const result2 = await parse(arrayBuffer, { keepTrailingEmptyCols: true });
136
+ const result2 = await parse(arrayBuffer, { keepTrailingEmptyCols: true, layoutTables: "keep" });
136
137
  if (!result2.success) {
137
138
  process.stderr.write(`[kordoc] \uD30C\uC2F1 \uC2E4\uD328: ${result2.error}
138
139
  `);
@@ -240,7 +241,7 @@ function registerDocCommands(program2) {
240
241
  return;
241
242
  }
242
243
  }
243
- const result = await parse(arrayBuffer, { keepTrailingEmptyCols: true });
244
+ const result = await parse(arrayBuffer, { keepTrailingEmptyCols: true, layoutTables: "keep" });
244
245
  if (!result.success) {
245
246
  process.stderr.write(`[kordoc] \uD30C\uC2F1 \uC2E4\uD328: ${result.error}
246
247
  `);
@@ -296,7 +297,7 @@ function registerDocCommands(program2) {
296
297
  });
297
298
  program2.command("seal <file>").description('\uB3C4\uC7A5/\uC11C\uBA85 \uC774\uBBF8\uC9C0\uB97C \uC575\uCEE4 \uBB38\uAD6C \uC704\uC5D0 \uBD80\uC720 \uBC30\uCE58 (\uD45C/\uD398\uC774\uC9C0 \uBD88\uD655\uC7A5) \u2014 kordoc seal \uC2E0\uCCAD\uC11C.hwpx --image \uB3C4\uC7A5.png --anchor "(\uC778)" -o \uACB0\uACFC.hwpx').requiredOption("--image <path>", "\uB3C4\uC7A5/\uC11C\uBA85 \uC774\uBBF8\uC9C0 (\uD22C\uBA85 \uBC30\uACBD PNG \uAD8C\uC7A5)").option("--anchor <text>", "\uC575\uCEE4 \uBB38\uAD6C", "(\uC778)").option("-n, --occurrence <num>", "\uAC19\uC740 \uC575\uCEE4\uAC00 \uC5EC\uB7FF\uC77C \uB54C 0-based \uC120\uD0DD", "0").option("--size-mm <num>", "\uB3C4\uC7A5 \uD55C \uBCC0 \uD06C\uAE30 mm (\uAE30\uBCF8: \uC904\uB192\uC774\xD71.6, 7~18 \uD074\uB7A8\uD504)").option("--mode <mode>", "overlap(\uBB38\uAD6C \uC704 \uACB9\uCE68) | right(\uC624\uB978\uCABD \uC606) | auto", "auto").option("--dx <mm>", "x \uBBF8\uC138\uC870\uC815 mm", "0").option("--dy <mm>", "y \uBBF8\uC138\uC870\uC815 mm", "0").option("-o, --output <path>", "\uCD9C\uB825 \uACBD\uB85C (\uAE30\uBCF8: <\uC785\uB825>.sealed.hwpx)").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (file, opts) => {
298
299
  try {
299
- const { placeSealHwpx, detectFormat: detectFormat2 } = await import("./-4G6MA4X6.js");
300
+ const { placeSealHwpx, detectFormat: detectFormat2 } = await import("./-PRAKO6M4.js");
300
301
  const rootOpts = program2.opts();
301
302
  const output = opts.output ?? rootOpts.output;
302
303
  const silent = opts.silent ?? rootOpts.silent;
@@ -374,7 +375,7 @@ function registerDocCommands(program2) {
374
375
  });
375
376
  program2.command("patch <original> <edited>").description("\uC11C\uC2DD \uBCF4\uC874 \uB77C\uC6B4\uB4DC\uD2B8\uB9BD \uD328\uCE58 \u2014 \uD3B8\uC9D1\uB41C \uB9C8\uD06C\uB2E4\uC6B4\uC744 \uC6D0\uBCF8 HWPX/HWP\uC5D0 in-place \uBC18\uC601 (kordoc patch \uC6D0\uBCF8.hwpx \uD3B8\uC9D1.md -o \uCD9C\uB825.hwpx). \uBBF8\uC801\uC6A9(skip) \uD3B8\uC9D1\uC774 \uC788\uC73C\uBA74 exit 2").option("-o, --output <path>", "\uCD9C\uB825 \uACBD\uB85C (\uAE30\uBCF8: <\uC6D0\uBCF8>.patched.hwpx|.hwp)").option("--no-verify", "\uD328\uCE58 \uD6C4 \uC7AC\uD30C\uC2F1 \uC790\uB3D9 \uAC80\uC99D \uC0DD\uB7B5").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (original, edited, opts) => {
376
377
  try {
377
- const { patchHwpx, patchHwp, detectFormat: detectFormat2 } = await import("./-4G6MA4X6.js");
378
+ const { patchHwpx, patchHwp, detectFormat: detectFormat2 } = await import("./-PRAKO6M4.js");
378
379
  const rootOpts = program2.opts();
379
380
  const output = opts.output ?? rootOpts.output;
380
381
  const silent = opts.silent ?? rootOpts.silent;
@@ -415,7 +416,7 @@ function registerDocCommands(program2) {
415
416
  });
416
417
  program2.command("validate <file>").description("HWPX \uAD6C\uC870 \uAC80\uC99D \u2014 ZIP\xB7mimetype\xB7\uD544\uC218 \uD30C\uC77C\xB7XML \uC6F0\uD3FC\uB4DC\xB7secCnt\xB7manifest \uCC38\uC870 (\uD55C\uCEF4\uB3C5\uC2A4 \uAC70\uBD80 \uC694\uC778 \uC0AC\uC804 \uCC28\uB2E8)").option("--json", "\uACB0\uACFC\uB97C JSON\uC73C\uB85C stdout\uC5D0 \uCD9C\uB825").action(async (file, opts) => {
417
418
  try {
418
- const { validateHwpx } = await import("./-4G6MA4X6.js");
419
+ const { validateHwpx } = await import("./-PRAKO6M4.js");
419
420
  const buf = new Uint8Array(readFileSync(resolve(file)));
420
421
  const result = await validateHwpx(buf);
421
422
  if (opts.json) {
@@ -442,7 +443,7 @@ function registerDocCommands(program2) {
442
443
 
443
444
  // src/cli/commands-generate.ts
444
445
  import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2, statSync as statSync2 } from "fs";
445
- import { basename as basename2, dirname as dirname2, isAbsolute, relative, resolve as resolve2 } from "path";
446
+ import { basename as basename2, dirname as dirname2, resolve as resolve2 } from "path";
446
447
  function registerGenerateCommands(program2) {
447
448
  program2.command("generate <markdown>").alias("gen").description("\uB9C8\uD06C\uB2E4\uC6B4 \u2192 \uACF5\uBB38\uC11C HWPX \uC0DD\uC131 \u2014 kordoc generate \uBCF4\uACE0\uC11C.md -o \uBCF4\uACE0\uC11C.hwpx --preset \uBCF4\uACE0\uC11C (markdown\uC5D0 '-' \uC9C0\uC815 \uC2DC stdin)").option("-o, --output <path>", "\uCD9C\uB825 HWPX \uACBD\uB85C (\uAE30\uBCF8: <\uC785\uB825>.hwpx)").option("--preset <name>", "\uACF5\uBB38\uC11C \uD504\uB9AC\uC14B: \uAE30\uC548\uBB38(official)\xB7\uBCF4\uACE0\uC11C(report)\xB7\uACC4\uD68D\uC11C(plan)\xB7\uD1B5\uC9C0(notice)\xB7\uD68C\uC758\uB85D(minutes)\xB7\uAC1C\uC870\uC2DD(gaejosik \u2014 \uD45C\uC9C0\xB7\uBAA9\uCC28\xB7\uC7A5\uD5E4\uB354 \uC790\uB3D9)\xB7\uC5C5\uBB34\uBCF4\uACE0(ministry \u2014 \uC911\uC559\uBD80\uCC98 \uC5C5\uBB34\uBCF4\uACE0: \uC7A5 \uB760\xB7\uC808 \uC22B\uC790\uCE78\xB7\uC18C\uC81C\uBAA9 \uBC15\uC2A4\xB7\u2460 \uD56D\uBAA9 \uB760\xB7\uC131\uACFC \uC694\uC57D\uBC15\uC2A4\xB7\uBCC4\uCCA8 \uB760)\xB7\uC11C\uC6B8\uBC29\uCE68(bangchim \u2014 \uC11C\uC6B8\uC2DC \uBC29\uCE68\uC11C: \uC81C\uBAA9\uD45C\xB7\uD30C\uB791 \uBD80\uC81C\xB7\uC694\uC57D\uBC15\uC2A4\xB7[\u2160] \uC7A5 \uC0C1\uC790\xB7\uC808 \uB760\xB7\u2776 \uACFC\uC81C)\xB7\uBCF4\uB3C4\uC790\uB8CC(press)", "\uAE30\uC548\uBB38").option("--font <type>", "\uBCF8\uBB38 \uAE00\uAF34: myeongjo(\uD568\uCD08\uB86C\uBC14\uD0D5) \uB610\uB294 gothic(\uB9D1\uC740 \uACE0\uB515)").option("--pt <size>", "\uBCF8\uBB38 \uAE00\uC790 \uD06C\uAE30(pt)").option("--line-spacing <percent>", "\uBCF8\uBB38 \uC904\uAC04\uACA9(%)").option("--profile <path>", "\uC11C\uC2DD \uD504\uB85C\uD544 JSON (kordoc profile\uB85C \uCD94\uCD9C) \u2014 \uCC38\uC870 \uBB38\uC11C\uC758 \uD45C \uD14C\uB450\uB9AC\xB7\uC74C\uC601\xB7\uC5F4\uD3ED\xB7\uC140 \uAE00\uAF34 \uC7AC\uD604").option("--org <name>", "\uD45C\uC9C0 \uAE30\uAD00\uBA85 (\uD45C\uC9C0\uB97C \uCF1C\uB294 \uD504\uB9AC\uC14B \uACF5\uD1B5)").option("--date <date>", "\uD45C\uC9C0 \uB0A0\uC9DC (\uAE30\uBCF8 \uC624\uB298 \u2014 'YYYY. M. D.')").option("--toc", "\uBAA9\uCC28 \uD398\uC774\uC9C0 \uAC15\uC81C \uCF1C\uAE30 (\uAC1C\uC870\uC2DD \uC678 \uD504\uB9AC\uC14B\uC5D0\uC11C\uB3C4 h2 \uBAA9\uB85D\uC73C\uB85C \uC0DD\uC131)").option("--no-toc", "\uBAA9\uCC28 \uD398\uC774\uC9C0 \uB044\uAE30 (\uAC1C\uC870\uC2DD \uD504\uB9AC\uC14B \uAE30\uBCF8 \uCF1C\uC9D0)").option("--cover", "\uD45C\uC9C0 \uD398\uC774\uC9C0 \uAC15\uC81C \uCF1C\uAE30 (\uAC1C\uC870\uC2DD \uC678 \uD504\uB9AC\uC14B\uC5D0\uC11C\uB3C4 \uCCAB h1\uC744 \uD45C\uC9C0\uB85C)").option("--no-cover", "\uD45C\uC9C0 \uD398\uC774\uC9C0 \uB044\uAE30 (\uAC1C\uC870\uC2DD \uD504\uB9AC\uC14B \uAE30\uBCF8 \uCF1C\uC9D0)").option("--approval <labels>", "\uACB0\uC7AC\uB780 \uC9C1\uC704 \uB77C\uBCA8 (\uC27C\uD45C \uAD6C\uBD84, \uC608: \uB2F4\uB2F9,\uD300\uC7A5,\uACFC\uC7A5) \u2014 \uBB38\uC11C \uCD5C\uC0C1\uB2E8 \uC6B0\uCE21").option("--page-numbers", "\uCABD\uBC88\uD638 \uAC15\uC81C \uCF1C\uAE30 (\uD558\uB2E8 \uC911\uC559 '- 1 -')").option("--no-page-numbers", "\uCABD\uBC88\uD638 \uB044\uAE30 (\uAC1C\uC870\uC2DD\xB7\uBCF4\uACE0\uC11C\xB7\uACC4\uD68D\uC11C \uAE30\uBCF8 \uCF1C\uC9D0)").option("--end-mark", "\uBCF8\uBB38 \uB05D '\uB05D.' \uD45C\uC2DC \uAC15\uC81C \uCF1C\uAE30").option("--no-end-mark", "'\uB05D.' \uD45C\uC2DC \uB044\uAE30 (\uAE30\uC548\uBB38 \uAE30\uBCF8 \uCF1C\uC9D0)").option("--no-body-title-box", "\uBCF8\uBB38 \uCCAB \uD398\uC774\uC9C0 \uC81C\uBAA9 \uBC18\uBCF5 \uBC15\uC2A4 \uB044\uAE30 (\uAC1C\uC870\uC2DD+\uD45C\uC9C0 \uAE30\uBCF8 \uCF1C\uC9D0)").option("--chapter-fit", "\uAC1C\uC870\uC2DD \uC7A5 \uD5E4\uB354 \uC81C\uBAA9 \uCE78\uC744 \uAE00\uC790 \uD3ED\uC5D0 \uB9DE\uCDA4 (\uAE30\uBCF8: \uBCF8\uBB38 \uD3ED\uAE4C\uC9C0)").option("--h2-marker <type>", "h2 \uC7A5 \uC81C\uBAA9 \uD45C\uAE30: band(\uB85C\uB9C8\uC790 \uCC44\uC6C0 \uCE78 + \uC81C\uBAA9 \uB760 \uD45C \u2014 \uBCF4\uACE0\uC11C\xB7\uACC4\uD68D\uC11C \uAE30\uBCF8)\xB7roman(\u2160. \uD14D\uC2A4\uD2B8)\xB7number(1. \u2014 \uD1B5\uC9C0 \uAE30\uBCF8)\xB7box(\uC7A5 \uC5C6\uC774 \u25A1 \uB300\uD56D\uBAA9)\xB7none").option("--band-color <hex>", "\uB760 \uC81C\uBAA9 \uBC88\uD638\uCE78 \uCC44\uC6C0\uC0C9 #RRGGBB (\uAE30\uBCF8 #003366 \u2014 \uC2E4\uCE21 \uCD5C\uB2E4. \uAD50\uC721\uCCAD\uD615 \uBC1D\uC740 \uB760: #DFE6F7)").option("--band-text-color <hex>", "\uB760 \uC81C\uBAA9 \uBC88\uD638 \uAE00\uC790\uC0C9 #RRGGBB (\uAE30\uBCF8 #FFFFFF \u2014 \uBC1D\uC740 \uB760\uBA74 #000000)").option("--summary <text>", "\uBCF4\uACE0\uC11C \uC694\uC57D \uBC15\uC2A4 (\uC81C\uBAA9\uD45C \uC544\uB798 \uC74C\uC601 \uC0C1\uC790 \u2014 \uB9C8\uD06C\uB2E4\uC6B4 \uC81C\uBAA9 \uC9C1\uD6C4 \uC778\uC6A9\uBB38(>)\uC73C\uB85C\uB3C4 \uC9C0\uC815)").option("--doc-info <spec>", "\uBCF4\uACE0\uC11C \uD45C\uC9C0 \uBB38\uC11C\uC815\uBCF4\uD45C: docNum=\uC2A4\uB9C8\uD2B8\uB3C4\uC2DC\uACFC-123,date=2026. 9. 6.,disclosure=\uACF5\uAC1C,policyNo= (--cover\uC640 \uD568\uAED8)").option("--dept <name>", "\uD45C\uC9C0 \uBD80\uC11C\uBA85 (\uAE30\uAD00\uBA85 \uC544\uB798 \uAD04\uD638)").option("--checklist [na]", "\uC11C\uC6B8 \uC0AC\uC804 \uAC80\uD1A0\uD56D\uBAA9 \uC810\uAC80\uD45C(\uBCF4\uACE0\uC11C\xB7\uACC4\uD68D\uC11C\xB7\uC11C\uC6B8\uBC29\uCE68) \u2014 \uAC12 \uC5C6\uC73C\uBA74 \uBE48 \uC11C\uC2DD, \uD574\uB2F9\uC5C6\uC74C \uBB38\uD56D \uBC88\uD638\uB97C \uC8FC\uBA74(6,7,8) \uB098\uBA38\uC9C0\uB294 \uAC80\uD1A0\uC644\uB8CC").option("--cover-label <text>", "\uD45C\uC9C0 \uC6B0\uC0C1\uB2E8 \uCDE8\uAE09 \uD45C\uC2DC \u2014 '\uB300\uC678\uC8FC\uC758'\xB7'\uBE44\uACF5\uAC1C' \uBE68\uAC04 \uD14C\uB450\uB9AC \uBC15\uC2A4 (\uC5C5\uBB34\uBCF4\uACE0 \uD504\uB9AC\uC14B \uC2E4\uCE21)").option("--fonts <spec>", "\uC694\uC18C\uBCC4 \uAE00\uAF34 \uC624\uBC84\uB77C\uC774\uB4DC: body=\uB098\uB214\uBA85\uC870,heading=\uB098\uB214\uACE0\uB515,ref=\uD55C\uC591\uC911\uACE0\uB515,table=\uB9D1\uC740 \uACE0\uB515").option("--sizes <spec>", "\uAC1C\uC870\uC2DD \uC694\uC18C\uBCC4 \uD06C\uAE30(pt): dae=16,cham=13,table=12,coverTitle=30 \u2026").option("--levels <spec>", "\uD56D\uBAA9\uBD80\uD638 \uB2E8\uACC4\uBCC4 \uC704\uACC4 \uD0C0\uC774\uD3EC: 0=HY\uACAC\uACE0\uB515/17/bold,1=\uD55C\uCEF4\uB3CB\uC6C0/15/bold,2=\uD734\uBA3C\uBA85\uC870/14 (depth 0~7, \uC22B\uC790=pt\xB7bold\xB7plain\xB7\uAE00\uAF34\uBA85)").option("--bullet2 <char>", "2\uB2E8\uACC4 \uD56D\uBAA9\uBD80\uD638: \u3147(\uC774\uC751 \u2014 \uAE30\uC548\uBB38\xB7\uACF5\uACE0\uBB38 \uC2E4\uCE21 \uC9C0\uBC30) \uB610\uB294 \u25CB(\uC6D0 \u2014 \uBCF4\uACE0\uC11C \uC591\uC2DD)").option("--suppress-single", "\uB2E8\uC77C \uD615\uC81C \uD56D\uBAA9 \uBD80\uD638 \uC0DD\uB7B5 (\uD3B8\uB78C \uADDC\uC815 \u2014 \uAE30\uBCF8\uC740 \uD558\uB098\uC5EC\uB3C4 \uBD80\uD638 \uBD80\uC5EC)").option("--doc-head <spec>", "\uAE30\uC548\uBB38 \uB450\uBB38\uD45C: org=\uAE30\uAD00\uBA85,slogan=\uC6D0\uD6C8,to=\uC218\uC2E0\uCC98,title=\uC81C\uBAA9 (\uBCC4\uC9C0 \uC81C1\uD638\uC11C\uC2DD\xB7\uC11C\uC6B8 \uC2E4\uACB0\uC7AC 6\uD589 \uD45C)").option("--doc-foot <spec>", "\uAE30\uC548\uBB38 \uACB0\uBB38\uD45C: sender=\uBC1C\uC2E0\uBA85\uC758,drafter=\uC8FC\uBB34\uAD00 \uD64D\uAE38\uB3D9,reviewer=\uACFC\uC7A5 \uAE40\uCCA0\uC218,approver=\uAD6D\uC7A5 \uBC15\uC601\uD76C,cooperator=\uD611\uC870\uC790,docNum=\uC2DC\uD589(\uACFC-\uBC88\uD638 (\uB0A0\uC9DC)),receive=\uC811\uC218,zip=\uC6B0\uD3B8\uBC88\uD638,address=\uC8FC\uC18C,site=\uD648\uD398\uC774\uC9C0,phone=\uC804\uD654,fax=\uC804\uC1A1,email=\uBA54\uC77C,disclosure=\uACF5\uAC1C\uAD6C\uBD84").option("--report-info <text>", "\uBCF4\uACE0\uC11C \uB2F4\uB2F9\uC790 \uD589(\uC81C\uBAA9\uD45C \uC544\uB798) / \uAE30\uC548\uBB38 \uC6B0\uC0C1\uB2E8 \uBCF4\uACE0\uC815\uBCF4 \uD589 \u2014 \uC608: '(2026. 7. 11., \uACFC\uC7A5 \uD64D\uAE38\uB3D9, \u260E02-120)'").option("--notice-head <spec>", "\uACF5\uACE0\uBB38 \uB450\uBB38\xB7\uACB0\uBB38: no=\uACF5\uACE0 \uC81C2026-1\uD638,date=2026\uB144 7\uC6D4 11\uC77C,sender=\uD589\uC815\uC548\uC804\uBD80\uC7A5\uAD00").option("--press-head <spec>", "\uBCF4\uB3C4\uC790\uB8CC \uBA38\uB9AC: release=\uBCF4\uB3C4\uC2DC\uC810,distribute=\uBC30\uD3EC\uC77C,dept=\uB2F4\uB2F9\uBD80\uC11C,manager=\uB2F4\uB2F9\uC790,phone=\uC5F0\uB77D\uCC98").option("--press-sub <items>", "\uBCF4\uB3C4\uC790\uB8CC \uBD80\uC81C (\uC138\uBBF8\uCF5C\uB860 \uAD6C\uBD84, \uC81C\uBAA9 \uC544\uB798 '- \u2026 -')").option("--plain", "\uACF5\uBB38\uC11C \uBAA8\uB4DC \uB044\uAE30 (\uBC94\uC6A9 \uB9C8\uD06C\uB2E4\uC6B4 \uBCC0\uD658)").option("--paper <size>", "\uC6A9\uC9C0: A4\xB7A3\xB7B4\xB7B5\xB7Letter \uB610\uB294 '210x297'(mm)").option("--landscape", "\uC6A9\uC9C0 \uAC00\uB85C \uBC29\uD5A5").option("--columns <n>", "\uB2E4\uB2E8 \uAC1C\uC218 (1~8)").option("--header <text>", "\uBA38\uB9AC\uB9D0 \uD14D\uC2A4\uD2B8 (\uBAA8\uB4E0 \uCABD, \uC778\uB77C\uC778 \uB9C8\uD06C\uB2E4\uC6B4 \uD5C8\uC6A9)").option("--footer <text>", "\uAF2C\uB9AC\uB9D0 \uD14D\uC2A4\uD2B8").option("--image-dir <dir>", "\uB9C8\uD06C\uB2E4\uC6B4 \uC774\uBBF8\uC9C0 \uCC38\uC870(![](x.png))\uB97C \uC774 \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uC77D\uC5B4 \uC2E4\uB370\uC774\uD130 \uC784\uBCA0\uB4DC").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (markdown, opts) => {
448
449
  try {
@@ -579,32 +580,12 @@ function registerGenerateCommands(program2) {
579
580
  let imageBytes;
580
581
  if (opts.imageDir) {
581
582
  const dir = resolve2(String(opts.imageDir));
582
- const skipped = [];
583
- for (const m of md.matchAll(/!\[[^\]]*\]\(([^)\s]+)\)/g)) {
584
- const url = m[1];
585
- if (/^[a-z][a-z0-9+.-]*:/i.test(url)) continue;
586
- let name = url;
587
- try {
588
- name = decodeURIComponent(url);
589
- } catch {
590
- }
591
- const file = resolve2(dir, name);
592
- const rel = relative(dir, file);
593
- if (!rel || rel.startsWith("..") || isAbsolute(rel)) {
594
- skipped.push(`${url} (\uC774\uBBF8\uC9C0 \uD3F4\uB354 \uBC16)`);
595
- continue;
596
- }
597
- try {
598
- ;
599
- (imageBytes ??= {})[url] = new Uint8Array(readFileSync2(file));
600
- } catch {
601
- skipped.push(`${url} (\uD30C\uC77C \uC5C6\uC74C)`);
602
- }
603
- }
583
+ const loaded = await loadGenerationImages(md, dir);
584
+ imageBytes = loaded.images;
604
585
  if (!silent) {
605
586
  process.stderr.write(`[kordoc] \uC774\uBBF8\uC9C0 \uC784\uBCA0\uB4DC: ${Object.keys(imageBytes ?? {}).length}\uAC1C (${dir})
606
587
  `);
607
- for (const s of skipped) process.stderr.write(`[kordoc] \u26A0 \uC774\uBBF8\uC9C0 \uAC74\uB108\uB700: ${s}
588
+ for (const warning of loaded.warnings) process.stderr.write(`[kordoc] \u26A0 ${warning}
608
589
  `);
609
590
  }
610
591
  }
@@ -701,7 +682,7 @@ function registerGenerateCommands(program2) {
701
682
  });
702
683
  program2.command("redact <files...>").description("\uAC1C\uC778\uC815\uBCF4 \uC11C\uC2DD \uBCF4\uC874 \uB9C8\uC2A4\uD0B9 \u2014 \uC8FC\uBBFC\xB7\uC678\uAD6D\uC778\uB4F1\uB85D\uBC88\uD638\xB7\uC804\uD654\xB7\uC774\uBA54\uC77C\xB7\uCE74\uB4DC\xB7\uACC4\uC88C\xB7\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638\xB7\uC5EC\uAD8C\xB7\uC6B4\uC804\uBA74\uD5C8(--rules \uB85C \uC778\uBA85\xB7\uC8FC\uC18C opt-in)\uB97C \uD0D0\uC9C0\uD574 HWPX/HWP\uB294 \uC6D0\uBCF8 \uC11C\uC2DD \uADF8\uB300\uB85C \uAC19\uC740 \uAE38\uC774\uB85C \uAC00\uB9B0 \uD30C\uC77C(\uBCF8\uBB38\xB7\uD45C\xB7\uBA38\uB9AC\uB9D0/\uAF2C\uB9AC\uB9D0\xB7\uAC01\uC8FC\xB7\uAE00\uC0C1\uC790\xB7\uBBF8\uB9AC\uBCF4\uAE30\xB7\uBA54\uD0C0\uB370\uC774\uD130 \uD3EC\uD568), \uADF8 \uC678 \uD3EC\uB9F7(PDF \uB4F1)\uC740 \uC6D0\uBCF8\uC744 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uACE0 \uB9C8\uC2A4\uD0B9\uB41C \uB9C8\uD06C\uB2E4\uC6B4\uB9CC \uCD9C\uB825. \uC790\uB3D9 \uAC80\uCD9C \uBCF4\uC870 \uB3C4\uAD6C\uC774\uBBC0\uB85C \uACB0\uACFC\uB294 \uBC18\uB4DC\uC2DC \uC0AC\uB78C\uC774 \uCD5C\uC885 \uD655\uC778\uD558\uC138\uC694 (\uC774\uBBF8\uC9C0 \uC18D \uAE00\uC790\uB294 \uD0D0\uC9C0 \uBD88\uAC00)").option("--rules <csv>", "\uC801\uC6A9 \uB8F0 (\uAE30\uBCF8: rrn,phone,email,card,account,brn,passport,driver \u2014 crn(\uBC95\uC778\uB4F1\uB85D\uBC88\uD638),ip,name(\uC778\uBA85),address(\uC8FC\uC18C)\uB294 opt-in)").option("--mask-char <ch>", "\uB9C8\uC2A4\uD06C \uBB38\uC790 1\uAE00\uC790 (\uAE30\uBCF8: \u25CF)").option("-o, --output <path>", "\uCD9C\uB825 \uACBD\uB85C (\uB2E8\uC77C \uD30C\uC77C \uC2DC)").option("-d, --out-dir <dir>", "\uCD9C\uB825 \uB514\uB809\uD1A0\uB9AC (\uB2E4\uC911 \uD30C\uC77C \uC2DC)").option("--dry-run", "\uD0D0\uC9C0 \uB9AC\uD3EC\uD2B8\uB9CC \uCD9C\uB825, \uD30C\uC77C \uBBF8\uC0DD\uC131").option("--json", "\uB9AC\uD3EC\uD2B8\uB97C JSON\uC73C\uB85C stdout \uCD9C\uB825").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (files, opts) => {
703
684
  const { ALL_REDACT_RULES, DEFAULT_REDACT_RULES, redactText } = await import("./redact-NV2QCDGE.js");
704
- const { redactDocument } = await import("./redact-doc-22SYW3KH.js");
685
+ const { redactDocument } = await import("./redact-doc-4OQKG4SM.js");
705
686
  const rootOpts = program2.opts();
706
687
  const output = opts.output ?? rootOpts.output;
707
688
  const outDir = opts.outDir ?? rootOpts.outDir;
@@ -863,7 +844,7 @@ function registerRenderCommands(program2) {
863
844
  const absPath = resolve3(file);
864
845
  const stem = file.replace(/\.hwpx?$/i, "");
865
846
  if (fmt === "svg" && !outDir && !pages && !/\.hwp$/i.test(absPath)) {
866
- const { renderHwpxToSvg } = await import("./render-MJ4H3R23.js");
847
+ const { renderHwpxToSvg } = await import("./render-XNO6PZJO.js");
867
848
  const buffer = readFileSync3(absPath);
868
849
  const result = await renderHwpxToSvg(toArrayBuffer(buffer), { highlights, reflow: opts.reflow, reflowMode: opts.reflowMode });
869
850
  const outPath = resolve3(output ?? stem + ".svg");
@@ -877,7 +858,7 @@ function registerRenderCommands(program2) {
877
858
  }
878
859
  return;
879
860
  }
880
- const { renderDocument } = await import("./render-MJ4H3R23.js");
861
+ const { renderDocument } = await import("./render-XNO6PZJO.js");
881
862
  const { scene, assets } = await renderDocument(absPath, {
882
863
  format: fmt,
883
864
  pages,
@@ -927,7 +908,7 @@ function registerRenderCommands(program2) {
927
908
  if (!outDir) throw new KordocError("--out-dir \uC774 \uD544\uC694\uD569\uB2C8\uB2E4 (crop \uC740 \uD30C\uC77C \uC5EC\uB7EC \uAC1C\uB97C \uB0C5\uB2C8\uB2E4)");
928
909
  const types = String(opts.target).split(",").map((t) => t.trim()).filter(Boolean);
929
910
  for (const t of types) if (!["table", "image", "paragraph", "shape"].includes(t)) throw new KordocError(`--target \uC720\uD615 \uC624\uB958: ${t}`);
930
- const { extractRenderedRegions } = await import("./render-MJ4H3R23.js");
911
+ const { extractRenderedRegions } = await import("./render-XNO6PZJO.js");
931
912
  const regions = await extractRenderedRegions(resolve3(file), {
932
913
  types,
933
914
  format: fmt,
@@ -965,7 +946,7 @@ function registerRenderCommands(program2) {
965
946
  if (policy !== "none" && !outDir) throw new KordocError("--visual \uC740 crop \uD30C\uC77C\uC744 \uB0B4\uBBC0\uB85C --out-dir \uC774 \uD544\uC694\uD569\uB2C8\uB2E4");
966
947
  const cropFmt = String(opts.cropFormat);
967
948
  if (!["png", "jpeg"].includes(cropFmt)) throw new KordocError(`--crop-format \uC740 png|jpeg: ${cropFmt}`);
968
- const { extractTables } = await import("./visual-USPS4QRC.js");
949
+ const { extractTables } = await import("./visual-QRMRFPUK.js");
969
950
  const tables = await extractTables(resolve3(file), { policy, format: cropFmt, paddingPt: Number(opts.padding) || 0 });
970
951
  const dir = outDir ? resolve3(outDir) : void 0;
971
952
  if (dir) mkdirSync3(dir, { recursive: true });
@@ -1009,7 +990,7 @@ function registerRenderCommands(program2) {
1009
990
  });
1010
991
  program2.command("render-worker").description("persistent \uB80C\uB354 \uC6CC\uCEE4 \u2014 stdin NDJSON \uC694\uCCAD \u2192 \uC870\uD310 SVG \uD30C\uC77C \uCD9C\uB825 (\uD504\uB85C\uC138\uC2A4 \uC720\uC9C0, \uCF5C\uB4DC\uC2A4\uD0C0\uD2B8 \uC81C\uAC70)").action(async () => {
1011
992
  const { createInterface } = await import("readline");
1012
- const { renderHwpxToSvg } = await import("./render-MJ4H3R23.js");
993
+ const { renderHwpxToSvg } = await import("./render-XNO6PZJO.js");
1013
994
  const rl = createInterface({ input: process.stdin });
1014
995
  const write = (o) => void process.stdout.write(JSON.stringify(o) + "\n");
1015
996
  write({ ready: true, version: VERSION });
@@ -1058,12 +1039,12 @@ function registerSystemCommands(program2) {
1058
1039
  await startMcpServer();
1059
1040
  });
1060
1041
  program2.command("setup").description("\uB300\uD654\uD615 \uC124\uCE58 \uB9C8\uBC95\uC0AC \u2014 AI \uD074\uB77C\uC774\uC5B8\uD2B8 \uC790\uB3D9 \uB4F1\uB85D (Mac/Win/Linux)").action(async () => {
1061
- const { runSetup } = await import("./setup-2URYVUEO.js");
1042
+ const { runSetup } = await import("./setup-UU3EIHNI.js");
1062
1043
  await runSetup();
1063
1044
  });
1064
1045
  program2.command("check-formula-models").description("PDF \uC218\uC2DD OCR \uBAA8\uB378(MFD + MFR + tokenizer, ~155MB) \uC0C1\uD0DC \uD655\uC778 \u2014 \uC5C6\uAC70\uB098 SHA \uBD88\uC77C\uCE58\uBA74 \uB2E4\uC6B4\uB85C\uB4DC").option("--status-only", "\uC0C1\uD0DC\uB9CC JSON \uC73C\uB85C \uCD9C\uB825 (\uB2E4\uC6B4\uB85C\uB4DC \uC548 \uD568)").action(async (opts) => {
1065
1046
  try {
1066
- const { getFormulaModelStatus, ensureFormulaModels, getFormulaModelsDir } = await import("./formula-NARUOXRX.js");
1047
+ const { getFormulaModelStatus, ensureFormulaModels, getFormulaModelsDir } = await import("./formula-7MMFBRGJ.js");
1067
1048
  const dir = getFormulaModelsDir();
1068
1049
  if (opts.statusOnly) {
1069
1050
  const status = await getFormulaModelStatus();
@@ -1117,7 +1098,7 @@ function registerSystemCommands(program2) {
1117
1098
  });
1118
1099
  program2.command("check-ocr-models").description("\uD14D\uC2A4\uD2B8 OCR \uBAA8\uB378(PP-OCRv5 korean det+rec, ~18MB) \uC0C1\uD0DC \uD655\uC778 \u2014 \uC5C6\uAC70\uB098 SHA \uBD88\uC77C\uCE58\uBA74 \uB2E4\uC6B4\uB85C\uB4DC").option("--status-only", "\uC0C1\uD0DC\uB9CC JSON \uC73C\uB85C \uCD9C\uB825 (\uB2E4\uC6B4\uB85C\uB4DC \uC548 \uD568)").action(async (opts) => {
1119
1100
  try {
1120
- const { getOcrModelStatus, ensureOcrModels, getOcrModelsDir } = await import("./models-SY75IBOE.js");
1101
+ const { getOcrModelStatus, ensureOcrModels, getOcrModelsDir } = await import("./models-6D6LMOTH.js");
1121
1102
  const dir = getOcrModelsDir();
1122
1103
  if (opts.statusOnly) {
1123
1104
  const status = await getOcrModelStatus();
@@ -1171,7 +1152,7 @@ function registerSystemCommands(program2) {
1171
1152
  });
1172
1153
  program2.command("models").description("OCR/\uC218\uC2DD \uBAA8\uB378 \uC624\uD504\uB77C\uC778 \uC0AC\uC774\uB4DC\uB85C\uB4DC \u2014 \uD3D0\uC1C4\uB9DD \uBC18\uC785\uC6A9 \uB0B4\uBCF4\uB0B4\uAE30/\uAC00\uC838\uC624\uAE30 (SHA-256 \uAC80\uC99D)").option("--status", "\uCE90\uC2DC\uC5D0 \uC124\uCE58\uB41C \uBAA8\uB378 \uC0C1\uD0DC\uB97C JSON \uC73C\uB85C \uCD9C\uB825").option("--export <dir>", "\uB85C\uCEEC \uCE90\uC2DC \u2192 \uBC88\uB4E4 \uB514\uB809\uD1A0\uB9AC\uB85C \uB0B4\uBCF4\uB0B4\uAE30 (\uC628\uB77C\uC778 PC\uC5D0\uC11C \uC2E4\uD589)").option("--import <dir>", "\uBC88\uB4E4 \uB514\uB809\uD1A0\uB9AC \u2192 \uB85C\uCEEC \uCE90\uC2DC\uB85C \uC124\uCE58 (\uB0B4\uBD80\uB9DD PC\uC5D0\uC11C \uC2E4\uD589)").action(async (opts) => {
1173
1154
  try {
1174
- const { exportModels, importModels, modelCacheStatus } = await import("./model-bundle-IMBW7D2Z.js");
1155
+ const { exportModels, importModels, modelCacheStatus } = await import("./model-bundle-OUHGCEZY.js");
1175
1156
  if (opts.status) {
1176
1157
  process.stdout.write(JSON.stringify(await modelCacheStatus(), null, 2) + "\n");
1177
1158
  return;
@@ -1273,7 +1254,7 @@ function registerWorkerCommands(program2) {
1273
1254
 
1274
1255
  // src/cli.ts
1275
1256
  var program = new Command();
1276
- program.name("kordoc").description("\uBAA8\uB450 \uD30C\uC2F1\uD574\uBC84\uB9AC\uACA0\uB2E4 \u2014 HWP, HWPX, PDF, XLSX, DOCX, \uC774\uBBF8\uC9C0(PNG/JPG/WebP) \u2192 Markdown").version(VERSION).argument("<files...>", "\uBCC0\uD658\uD560 \uD30C\uC77C \uACBD\uB85C (HWP, HWPX, PDF, XLSX, DOCX, PNG/JPG/WebP \u2014 \uC774\uBBF8\uC9C0\uB294 OCR \uC790\uB3D9 \uC801\uC6A9)").option("-o, --output <path>", "\uCD9C\uB825 \uD30C\uC77C \uACBD\uB85C (\uB2E8\uC77C \uD30C\uC77C \uC2DC)").option("-d, --out-dir <dir>", "\uCD9C\uB825 \uB514\uB809\uD1A0\uB9AC (\uB2E4\uC911 \uD30C\uC77C \uC2DC)").option("-p, --pages <range>", "\uD398\uC774\uC9C0 \uBC94\uC704 (\uC608: 1-3, 1,3,5) \u2014 \uD55C\uCEF4 \uC800\uC7A5\uBCF8\uC740 \uC2E4\uC81C \uD398\uC774\uC9C0, \uC870\uD310 \uCE90\uC2DC \uC5C6\uC73C\uBA74 \uC139\uC158 \uADFC\uC0AC").option("--format <type>", "\uCD9C\uB825 \uD615\uC2DD: markdown (\uAE30\uBCF8), json, chunks (RAG\uC6A9 \uAD6C\uC870 \uCCAD\uD06C JSON \u2014 \uD5E4\uB529\xB7\uAC1C\uC870\uC2DD \uC704\uACC4 breadcrumb + \uD45C \uB3C5\uB9BD \uCCAD\uD06C)", "markdown").option("--no-header-footer", "PDF \uBA38\uB9AC\uAE00/\uBC14\uB2E5\uAE00 \uC790\uB3D9 \uC81C\uAC70 \uB044\uAE30 (\uAE30\uBCF8: \uC81C\uAC70\uD568)").option("--no-tables", "PDF \uD45C \uAC10\uC9C0 \uB044\uAE30 \u2014 \uD14C\uB450\uB9AC \uBC15\uC2A4\uB97C \uD45C\uB85C \uC624\uC778\uD574 \uC77D\uAE30 \uC21C\uC11C\uAC00 \uB4A4\uC9D1\uD788\uB294 \uBB38\uC11C(2\uB2E8 \uC2DC\uD5D8\uC9C0 \uB4F1)\uC5D0\uC11C \uC790\uC5F0 \uC77D\uAE30\uC21C \uD14D\uC2A4\uD2B8\uB9CC \uBF51\uB294\uB2E4 (#64)").option("--formula-ocr", "PDF \uC218\uC2DD OCR \uD65C\uC131\uD654 (MFD+MFR ONNX, \uCCAB \uC0AC\uC6A9 \uC2DC \uBAA8\uB378 ~155MB \uC790\uB3D9 \uB2E4\uC6B4\uB85C\uB4DC)").option("--ocr", "\uC2A4\uCE94/\uC774\uBBF8\uC9C0 PDF \uD14D\uC2A4\uD2B8 OCR (\uB0B4\uC7A5 PP-OCRv5 korean, \uCCAB \uC0AC\uC6A9 \uC2DC \uBAA8\uB378 ~18MB \uC790\uB3D9 \uB2E4\uC6B4\uB85C\uB4DC \u2014 OCR \uD544\uC694 \uD398\uC774\uC9C0\uB9CC \uC778\uC2DD)").option("--ocr-force", "\uC804 \uD398\uC774\uC9C0 \uAC15\uC81C OCR (\uD14D\uC2A4\uD2B8\uCE35\uC774 \uC788\uC5B4\uB3C4 \uBB34\uC2DC\uD558\uACE0 \uC7AC\uC778\uC2DD)").option("--dedupe-headers", "HWP5 \uB808\uC774\uC544\uC6C3 \uD45C \uD398\uC774\uC9C0 \uBC18\uBCF5 \uB7EC\uB2DD \uD5E4\uB354 \uC911\uBCF5 \uC81C\uAC70 (\uAE30\uBCF8 off \u2014 \uBD99\uC784\uBCC4 \uC7AC\uBC88\uD638 \uC624\uC0AD\uC81C \uC8FC\uC758)").option("--keep-empty-cols", "\uD45C \uC624\uB978\uCABD \uB05D \uBE48 \uC5F4(\uC11C\uC2DD \uC785\uB825\uB780) \uBCF4\uC874 (#47, \uAE30\uBCF8 off: \uD6C4\uD589 \uBE48 \uC5F4 \uD2B8\uB9BC)").option("--keep-empty-paragraphs", "\uBE48 \uBB38\uB2E8 \uBCF4\uC874 \u2014 \uBCF8\uBB38\uC740 \uBE48 paragraph \uBE14\uB85D, \uD45C \uC140\uC740 \uBE48 \uC904\uB85C (#57, \uAE30\uBCF8 off: \uBE48 \uBB38\uB2E8 \uC81C\uAC70)").option("--include-field-placeholders", "\uBBF8\uAE30\uC785 \uB204\uB984\uD2C0 \uC548\uB0B4\uBB38\uB3C4 \uCD9C\uB825 \u2014 \uBE48 \uC11C\uC2DD\uC758 \uCE78 \uC6A9\uB3C4 \uBCF4\uC874 (#92, \uAE30\uBCF8 off: \uC778\uC1C4\uB418\uC9C0 \uC54A\uB294 \uC548\uB0B4\uBB38 \uC81C\uC678)").option("--inline-images", "\uC774\uBBF8\uC9C0\uB97C base64 data URI \uB85C \uB9C8\uD06C\uB2E4\uC6B4\uC5D0 \uC778\uB77C\uC778 (BMP\u2192PNG \uC555\uCD95, HWP5 \uC804\uC6A9 \u2014 \uC778\uB77C\uC778\uB41C \uACBD\uC6B0\uB9CC \uD30C\uC77C \uBBF8\uC800\uC7A5, \uADF8 \uC678 \uD3EC\uB9F7\uC740 \uC800\uC7A5 \uC720\uC9C0)").option("--image-refs", "--format json \uC5D0\uC11C \uC774\uBBF8\uC9C0 \uBC14\uC774\uD2B8\uB97C \uC778\uB77C\uC778\uD558\uC9C0 \uC54A\uACE0 \uD30C\uC77C \uCC38\uC870(images/<\uBB38\uC11C \uC774\uB984>/<\uD30C\uC77C\uBA85>)\uB9CC \uB0A8\uAE40 (#65 \u2014 \uC774\uBBF8\uC9C0\uAC00 \uC218\uBC31 \uC7A5\uC778 \uBB38\uC11C\uC758 \uC9C1\uB82C\uD654 \uD55C\uACC4 \uD68C\uD53C, -o/-d \uC640 \uD568\uAED8 \uC0AC\uC6A9)").option("--password <pw>", "\uC554\uD638\uB85C \uBCF4\uD638\uB41C \uBB38\uC11C\uC758 \uC5F4\uAE30 \uC554\uD638 (#59, HWPX\xB7HWP3\xB7HWP5. \uD55C\uCEF4 DRM \uBB38\uC11C\uB294 \uD574\uB2F9 \uC5C6\uC74C)").option("--html-tables", "\uBAA8\uB4E0 \uD45C\uB97C HTML \uB85C \u2014 \uD30C\uC774\uD504 \uD45C\uB3C4 HTML \uD45C\uB85C, \uD0DC\uADF8\uB9C8\uB2E4 \uD55C \uC904\uC529 \uB4E4\uC5EC\uC368 \uB0C4").option("--script-tags", "\uC704\xB7\uC544\uB798\uCCA8\uC790\uB97C <sup>\xB7<sub> \uB85C \uD45C\uAE30 \u2014 PDF \uB294 \uAE30\uBCF8 \uB054(\uB17C\uBB38\xB7\uC218\uC2DD PDF \uC5D0 \uAD8C\uC7A5), HWPX\xB7HWP\xB7DOCX \uB294 \uAE30\uBCF8 \uCF2C").option("--no-script-tags", '\uCCA8\uC790 \uD45C\uAE30 \uB044\uAE30 \u2014 \uBAA8\uB4E0 \uD615\uC2DD\uC5D0\uC11C \uD3C9\uBB38("104 m2")').option("--plain", "\uD3C9\uBB38 Markdown \u2014 \uADF8\uB9BC \uC790\uB9AC \uD45C\uC2DC\xB7\uB9C1\uD06C URL\xB7\uBC11\uC904/\uAD75\uAC8C \uD45C\uAE30\uB97C \uBE7C\uACE0 \uAE00\uB9CC (\uC81C\uBAA9\xB7\uBAA9\uB85D\xB7\uD45C \uAD6C\uC870\uB294 \uC720\uC9C0, \uC0C9\uC778\xB7RAG \uC6A9)").option("--no-images", "\uC774\uBBF8\uC9C0 \uBC14\uC774\uD2B8\uB97C \uCD94\uCD9C\xB7\uCD9C\uB825\uD558\uC9C0 \uC54A\uC74C: \uAE00\uC790\uB9CC \uD544\uC694\uD560 \uB54C (\uADF8\uB9BC \uC790\uB9AC \uD45C\uC2DC\uB294 \uB0A8\uAE40, PDF \uB294 PNG \uC778\uCF54\uB529\uC744 \uAC74\uB108\uB700)").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (files, opts) => {
1257
+ program.name("kordoc").description("\uBAA8\uB450 \uD30C\uC2F1\uD574\uBC84\uB9AC\uACA0\uB2E4 \u2014 HWP, HWPX, PDF, XLSX, DOCX, \uC774\uBBF8\uC9C0(PNG/JPG/WebP) \u2192 Markdown").version(VERSION).argument("<files...>", "\uBCC0\uD658\uD560 \uD30C\uC77C \uACBD\uB85C (HWP, HWPX, PDF, XLSX, DOCX, PNG/JPG/WebP \u2014 \uC774\uBBF8\uC9C0\uB294 OCR \uC790\uB3D9 \uC801\uC6A9)").option("-o, --output <path>", "\uCD9C\uB825 \uD30C\uC77C \uACBD\uB85C (\uB2E8\uC77C \uD30C\uC77C \uC2DC)").option("-d, --out-dir <dir>", "\uCD9C\uB825 \uB514\uB809\uD1A0\uB9AC (\uB2E4\uC911 \uD30C\uC77C \uC2DC)").option("-p, --pages <range>", "\uD398\uC774\uC9C0 \uBC94\uC704 (\uC608: 1-3, 1,3,5) \u2014 \uD55C\uCEF4 \uC800\uC7A5\uBCF8\uC740 \uC2E4\uC81C \uD398\uC774\uC9C0, \uC870\uD310 \uCE90\uC2DC \uC5C6\uC73C\uBA74 \uC139\uC158 \uADFC\uC0AC").option("--format <type>", "\uCD9C\uB825 \uD615\uC2DD: markdown (\uAE30\uBCF8), json, chunks (RAG\uC6A9 \uAD6C\uC870 \uCCAD\uD06C JSON \u2014 \uD5E4\uB529\xB7\uAC1C\uC870\uC2DD \uC704\uACC4 breadcrumb + \uD45C \uB3C5\uB9BD \uCCAD\uD06C)", "markdown").option("--no-header-footer", "PDF \uBA38\uB9AC\uAE00/\uBC14\uB2E5\uAE00 \uC790\uB3D9 \uC81C\uAC70 \uB044\uAE30 (\uAE30\uBCF8: \uC81C\uAC70\uD568)").option("--no-tables", "PDF \uD45C \uAC10\uC9C0 \uB044\uAE30 \u2014 \uD14C\uB450\uB9AC \uBC15\uC2A4\uB97C \uD45C\uB85C \uC624\uC778\uD574 \uC77D\uAE30 \uC21C\uC11C\uAC00 \uB4A4\uC9D1\uD788\uB294 \uBB38\uC11C(2\uB2E8 \uC2DC\uD5D8\uC9C0 \uB4F1)\uC5D0\uC11C \uC790\uC5F0 \uC77D\uAE30\uC21C \uD14D\uC2A4\uD2B8\uB9CC \uBF51\uB294\uB2E4 (#64)").option("--formula-ocr", "PDF \uC218\uC2DD OCR \uD65C\uC131\uD654 (MFD+MFR ONNX, \uCCAB \uC0AC\uC6A9 \uC2DC \uBAA8\uB378 ~155MB \uC790\uB3D9 \uB2E4\uC6B4\uB85C\uB4DC)").option("--ocr", "\uC2A4\uCE94/\uC774\uBBF8\uC9C0 PDF \uD14D\uC2A4\uD2B8 OCR (\uB0B4\uC7A5 PP-OCRv5 korean, \uCCAB \uC0AC\uC6A9 \uC2DC \uBAA8\uB378 ~18MB \uC790\uB3D9 \uB2E4\uC6B4\uB85C\uB4DC \u2014 OCR \uD544\uC694 \uD398\uC774\uC9C0\uB9CC \uC778\uC2DD)").option("--ocr-force", "\uC804 \uD398\uC774\uC9C0 \uAC15\uC81C OCR (\uD14D\uC2A4\uD2B8\uCE35\uC774 \uC788\uC5B4\uB3C4 \uBB34\uC2DC\uD558\uACE0 \uC7AC\uC778\uC2DD)").option("--dedupe-headers", "HWP5 \uB808\uC774\uC544\uC6C3 \uD45C \uD398\uC774\uC9C0 \uBC18\uBCF5 \uB7EC\uB2DD \uD5E4\uB354 \uC911\uBCF5 \uC81C\uAC70 (\uAE30\uBCF8 off \u2014 \uBD99\uC784\uBCC4 \uC7AC\uBC88\uD638 \uC624\uC0AD\uC81C \uC8FC\uC758)").option("--keep-empty-cols", "\uD45C \uC624\uB978\uCABD \uB05D \uBE48 \uC5F4(\uC11C\uC2DD \uC785\uB825\uB780) \uBCF4\uC874 (#47, \uAE30\uBCF8 off: \uD6C4\uD589 \uBE48 \uC5F4 \uD2B8\uB9BC)").option("--keep-empty-paragraphs", "\uBE48 \uBB38\uB2E8 \uBCF4\uC874 \u2014 \uBCF8\uBB38\uC740 \uBE48 paragraph \uBE14\uB85D, \uD45C \uC140\uC740 \uBE48 \uC904\uB85C (#57, \uAE30\uBCF8 off: \uBE48 \uBB38\uB2E8 \uC81C\uAC70)").option("--include-field-placeholders", "\uBBF8\uAE30\uC785 \uB204\uB984\uD2C0 \uC548\uB0B4\uBB38\uB3C4 \uCD9C\uB825 \u2014 \uBE48 \uC11C\uC2DD\uC758 \uCE78 \uC6A9\uB3C4 \uBCF4\uC874 (#92, \uAE30\uBCF8 off: \uC778\uC1C4\uB418\uC9C0 \uC54A\uB294 \uC548\uB0B4\uBB38 \uC81C\uC678)").option("--inline-images", "\uC774\uBBF8\uC9C0\uB97C base64 data URI \uB85C \uB9C8\uD06C\uB2E4\uC6B4\uC5D0 \uC778\uB77C\uC778 (BMP\u2192PNG \uC555\uCD95, HWP5 \uC804\uC6A9 \u2014 \uC778\uB77C\uC778\uB41C \uACBD\uC6B0\uB9CC \uD30C\uC77C \uBBF8\uC800\uC7A5, \uADF8 \uC678 \uD3EC\uB9F7\uC740 \uC800\uC7A5 \uC720\uC9C0)").option("--image-refs", "--format json \uC5D0\uC11C \uC774\uBBF8\uC9C0 \uBC14\uC774\uD2B8\uB97C \uC778\uB77C\uC778\uD558\uC9C0 \uC54A\uACE0 \uD30C\uC77C \uCC38\uC870(images/<\uBB38\uC11C \uC774\uB984>/<\uD30C\uC77C\uBA85>)\uB9CC \uB0A8\uAE40 (#65 \u2014 \uC774\uBBF8\uC9C0\uAC00 \uC218\uBC31 \uC7A5\uC778 \uBB38\uC11C\uC758 \uC9C1\uB82C\uD654 \uD55C\uACC4 \uD68C\uD53C, -o/-d \uC640 \uD568\uAED8 \uC0AC\uC6A9)").option("--password <pw>", "\uC554\uD638\uB85C \uBCF4\uD638\uB41C \uBB38\uC11C\uC758 \uC5F4\uAE30 \uC554\uD638 (#59, HWPX\xB7HWP3\xB7HWP5. \uD55C\uCEF4 DRM \uBB38\uC11C\uB294 \uD574\uB2F9 \uC5C6\uC74C)").option("--html-tables", "\uBAA8\uB4E0 \uD45C\uB97C HTML \uB85C \u2014 \uD30C\uC774\uD504 \uD45C\uB3C4 HTML \uD45C\uB85C, \uD0DC\uADF8\uB9C8\uB2E4 \uD55C \uC904\uC529 \uB4E4\uC5EC\uC368 \uB0C4").option("--keep-layout-tables", "\uD14C\uB450\uB9AC\uAC00 \uC548 \uBCF4\uC774\uB294 \uD2C0 \uD45C\uB3C4 \uC6D0\uBCF8 \uD45C \uAD6C\uC870 \uADF8\uB300\uB85C (\uAE30\uBCF8: \uBCF4\uC774\uB294 \uB300\uB85C \u2014 \uD2C0\uC740 \uAE00, \uCE78\uC73C\uB85C \uC870\uB9BD\uD55C \uBD84\uC218\uB294 \uC218\uC2DD). patch \uB85C \uB418\uB3CC\uB9B4 \uD3B8\uC9D1\uBCF8\uC740 \uC774 \uC635\uC158\uC73C\uB85C \uBF51\uB294\uB2E4").option("--script-tags", "\uC704\xB7\uC544\uB798\uCCA8\uC790\uB97C <sup>\xB7<sub> \uB85C \uD45C\uAE30 \u2014 PDF \uB294 \uAE30\uBCF8 \uB054(\uB17C\uBB38\xB7\uC218\uC2DD PDF \uC5D0 \uAD8C\uC7A5), HWPX\xB7HWP\xB7DOCX \uB294 \uAE30\uBCF8 \uCF2C").option("--no-script-tags", '\uCCA8\uC790 \uD45C\uAE30 \uB044\uAE30 \u2014 \uBAA8\uB4E0 \uD615\uC2DD\uC5D0\uC11C \uD3C9\uBB38("104 m2")').option("--plain", "\uD3C9\uBB38 Markdown \u2014 \uADF8\uB9BC \uC790\uB9AC \uD45C\uC2DC\xB7\uB9C1\uD06C URL\xB7\uBC11\uC904/\uAD75\uAC8C \uD45C\uAE30\uB97C \uBE7C\uACE0 \uAE00\uB9CC (\uC81C\uBAA9\xB7\uBAA9\uB85D\xB7\uD45C \uAD6C\uC870\uB294 \uC720\uC9C0, \uC0C9\uC778\xB7RAG \uC6A9)").option("--no-images", "\uC774\uBBF8\uC9C0 \uBC14\uC774\uD2B8\uB97C \uCD94\uCD9C\xB7\uCD9C\uB825\uD558\uC9C0 \uC54A\uC74C: \uAE00\uC790\uB9CC \uD544\uC694\uD560 \uB54C (\uADF8\uB9BC \uC790\uB9AC \uD45C\uC2DC\uB294 \uB0A8\uAE40, PDF \uB294 PNG \uC778\uCF54\uB529\uC744 \uAC74\uB108\uB700)").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (files, opts) => {
1277
1258
  const validFormats = ["markdown", "json", "chunks"];
1278
1259
  if (!validFormats.includes(opts.format)) {
1279
1260
  process.stderr.write(`[kordoc] \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD615\uC2DD: ${opts.format} (markdown, json, chunks)
@@ -1323,6 +1304,7 @@ program.name("kordoc").description("\uBAA8\uB450 \uD30C\uC2F1\uD574\uBC84\uB9AC\
1323
1304
  if (opts.plain) parseOptions.plain = true;
1324
1305
  if (opts.scriptTags !== void 0) parseOptions.scriptTags = opts.scriptTags;
1325
1306
  if (opts.htmlTables) parseOptions.htmlTables = true;
1307
+ if (opts.keepLayoutTables) parseOptions.layoutTables = "keep";
1326
1308
  if (!opts.silent) {
1327
1309
  parseOptions.onProgress = (current, total) => {
1328
1310
  process.stderr.write(`\r[kordoc] ${filePrefix}${fileName} (${format}) [${current}/${total}]`);
@@ -1369,7 +1351,7 @@ program.name("kordoc").description("\uBAA8\uB450 \uD30C\uC2F1\uD574\uBC84\uB9AC\
1369
1351
  `);
1370
1352
  }
1371
1353
  } else if (opts.format === "chunks") {
1372
- const { blocksToChunks } = await import("./chunks-NUNIKS2J.js");
1354
+ const { blocksToChunks } = await import("./chunks-YBFBLJ4G.js");
1373
1355
  output = JSON.stringify(blocksToChunks(result.blocks), null, 2);
1374
1356
  } else {
1375
1357
  output = markdown;