kordoc 4.19.2 → 4.20.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 (124) hide show
  1. package/NOTICE +25 -0
  2. package/README.md +2 -1
  3. package/THIRD_PARTY/hwp-auto-docfit.LICENSE +23 -0
  4. package/dist/{-3JIHF2AL.js → -TTRGLREH.js} +11 -11
  5. package/dist/{chunk-I2TBI7PN.js → chunk-2U475PJF.js} +2 -2
  6. package/dist/{chunk-R2JM2HOJ.js → chunk-4DIMX2KU.js} +4 -4
  7. package/dist/{chunk-GNUGD4RO.js → chunk-4WOG2SLT.js} +2 -2
  8. package/dist/{chunk-QZ63HXEG.js → chunk-527NBMUE.js} +6 -6
  9. package/dist/{chunk-PWQ2BVAT.js → chunk-7H5GT7HM.js} +22 -3
  10. package/dist/{chunk-PWQ2BVAT.js.map → chunk-7H5GT7HM.js.map} +1 -1
  11. package/dist/{chunk-T2DZTOGG.cjs → chunk-AXQDWE42.cjs} +12 -12
  12. package/dist/{chunk-T2DZTOGG.cjs.map → chunk-AXQDWE42.cjs.map} +1 -1
  13. package/dist/{chunk-ORGWGR4K.cjs → chunk-CJFIHH2N.cjs} +6 -6
  14. package/dist/{chunk-ORGWGR4K.cjs.map → chunk-CJFIHH2N.cjs.map} +1 -1
  15. package/dist/{chunk-XPM7WC54.js → chunk-CKFKC22O.js} +4 -4
  16. package/dist/{chunk-JK7N4R4K.js → chunk-CPZ2LLZA.js} +2 -2
  17. package/dist/{chunk-6ZBORHFB.js → chunk-CS2VWXDS.js} +2 -2
  18. package/dist/{chunk-EUCBMW6C.js → chunk-DPD2L5UK.js} +3 -3
  19. package/dist/{chunk-AOVMOCTK.js → chunk-GHAJHXYA.js} +2 -2
  20. package/dist/{chunk-4CS7XE2Q.js → chunk-JYV3XQYW.js} +2 -2
  21. package/dist/{chunk-MZ6XNFZL.cjs → chunk-K5GCIB2I.cjs} +2 -2
  22. package/dist/{chunk-MZ6XNFZL.cjs.map → chunk-K5GCIB2I.cjs.map} +1 -1
  23. package/dist/{chunk-5PGOZBEQ.cjs → chunk-KDCPBF4X.cjs} +22 -22
  24. package/dist/{chunk-5PGOZBEQ.cjs.map → chunk-KDCPBF4X.cjs.map} +1 -1
  25. package/dist/{chunk-NV46IWKF.js → chunk-LQ4IDHET.js} +234 -24
  26. package/dist/chunk-LQ4IDHET.js.map +1 -0
  27. package/dist/{chunk-U6AJU2VD.js → chunk-MNPPMJBN.js} +2 -2
  28. package/dist/{chunk-J75TVRJB.js → chunk-MXADBQ7E.js} +2 -2
  29. package/dist/{chunk-B4R443MV.js → chunk-NVBX2NKZ.js} +2 -2
  30. package/dist/{chunk-TM4T4NYJ.js → chunk-OX5FA2MU.js} +2 -2
  31. package/dist/{chunk-WQAGDJIP.cjs → chunk-RMDFN5ZF.cjs} +3 -3
  32. package/dist/{chunk-WQAGDJIP.cjs.map → chunk-RMDFN5ZF.cjs.map} +1 -1
  33. package/dist/{chunk-QYJPU4FZ.js → chunk-TM7IOP4P.js} +2 -2
  34. package/dist/{chunk-OKHKEYTL.js → chunk-URQM5TBD.js} +2 -2
  35. package/dist/{chunk-VO22VAR3.js → chunk-VVKMBLG2.js} +2 -2
  36. package/dist/{chunk-JXJDXDOU.js → chunk-WLNEQGQC.js} +3 -3
  37. package/dist/{chunk-56ZWAREM.js → chunk-WLWWODBQ.js} +2 -2
  38. package/dist/{chunk-RVBQT2PD.cjs → chunk-WWOU6ZQ3.cjs} +3 -3
  39. package/dist/{chunk-RVBQT2PD.cjs.map → chunk-WWOU6ZQ3.cjs.map} +1 -1
  40. package/dist/{chunk-AKSCTGKG.js → chunk-X5YHJHWB.js} +2 -2
  41. package/dist/chunks-3NIFJFRQ.js +10 -0
  42. package/dist/cli.js +366 -44
  43. package/dist/cli.js.map +1 -1
  44. package/dist/{formula-STIFIS57.js → formula-D6GGALWI.js} +3 -3
  45. package/dist/{formula-RNATQ3FQ.cjs → formula-FE6LEZTT.cjs} +9 -9
  46. package/dist/{formula-RNATQ3FQ.cjs.map → formula-FE6LEZTT.cjs.map} +1 -1
  47. package/dist/{formula-RSTTP626.js → formula-KWOAYEOG.js} +4 -4
  48. package/dist/{image-ocr-XKSAEEXP.js → image-ocr-XDODV43Y.js} +9 -9
  49. package/dist/{image-ocr-7L5TBBPA.cjs → image-ocr-XGGIYCZ2.cjs} +15 -15
  50. package/dist/{image-ocr-7L5TBBPA.cjs.map → image-ocr-XGGIYCZ2.cjs.map} +1 -1
  51. package/dist/{image-ocr-R6ZDFBAN.js → image-ocr-YYTFOUSY.js} +6 -6
  52. package/dist/index.cjs +682 -459
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.cts +5 -0
  55. package/dist/index.d.ts +5 -0
  56. package/dist/index.js +242 -19
  57. package/dist/index.js.map +1 -1
  58. package/dist/mcp.js +22 -22
  59. package/dist/{model-bundle-NGTKULP7.js → model-bundle-WPFLIKYM.js} +5 -5
  60. package/dist/{models-QOSU5SYL.js → models-WJ5QYELV.js} +5 -5
  61. package/dist/{parser-AIQBU7FS.cjs → parser-6P5ZRWXG.cjs} +132 -132
  62. package/dist/{parser-AIQBU7FS.cjs.map → parser-6P5ZRWXG.cjs.map} +1 -1
  63. package/dist/{parser-5GUEP6EK.js → parser-LY67CB7A.js} +8 -8
  64. package/dist/{parser-3G4G6SST.js → parser-QKLUIMHG.js} +11 -11
  65. package/dist/pdf-ocr-6L4EDRVO.js +20 -0
  66. package/dist/pdf-ocr-J7DHJJ3I.js +16 -0
  67. package/dist/pdf-ocr-MODN6GBT.cjs +17 -0
  68. package/dist/{pdf-ocr-7OAFUDM4.cjs.map → pdf-ocr-MODN6GBT.cjs.map} +1 -1
  69. package/dist/{profile-io-ZVNMDLLS.js → profile-io-I4ORJOE4.js} +3 -3
  70. package/dist/{rasterize-Y2RLMVCL.js → rasterize-MZU5LIA5.js} +3 -3
  71. package/dist/{redact-doc-PNRDDBI3.js → redact-doc-NEUEBXFH.js} +11 -11
  72. package/dist/{render-S3ALARVO.js → render-IL2DYXDP.js} +7 -7
  73. package/dist/seal-O5DKZGTR.js +10 -0
  74. package/dist/{setup-JH66VSFZ.js → setup-PGOCB7YG.js} +3 -3
  75. package/dist/visual-PYV4ZMLH.js +20 -0
  76. package/dist/{watch-KMB2FTOD.js → watch-2F5AMHCW.js} +12 -12
  77. package/package.json +1 -1
  78. package/dist/chunk-NV46IWKF.js.map +0 -1
  79. package/dist/chunks-2EC2R7PY.js +0 -10
  80. package/dist/pdf-ocr-7OAFUDM4.cjs +0 -17
  81. package/dist/pdf-ocr-DAXS5RX4.js +0 -16
  82. package/dist/pdf-ocr-R3VGX6F2.js +0 -20
  83. package/dist/seal-EJWPS5VK.js +0 -10
  84. package/dist/visual-GDXMKDVY.js +0 -20
  85. /package/dist/{-3JIHF2AL.js.map → -TTRGLREH.js.map} +0 -0
  86. /package/dist/{chunk-I2TBI7PN.js.map → chunk-2U475PJF.js.map} +0 -0
  87. /package/dist/{chunk-R2JM2HOJ.js.map → chunk-4DIMX2KU.js.map} +0 -0
  88. /package/dist/{chunk-GNUGD4RO.js.map → chunk-4WOG2SLT.js.map} +0 -0
  89. /package/dist/{chunk-QZ63HXEG.js.map → chunk-527NBMUE.js.map} +0 -0
  90. /package/dist/{chunk-XPM7WC54.js.map → chunk-CKFKC22O.js.map} +0 -0
  91. /package/dist/{chunk-JK7N4R4K.js.map → chunk-CPZ2LLZA.js.map} +0 -0
  92. /package/dist/{chunk-6ZBORHFB.js.map → chunk-CS2VWXDS.js.map} +0 -0
  93. /package/dist/{chunk-EUCBMW6C.js.map → chunk-DPD2L5UK.js.map} +0 -0
  94. /package/dist/{chunk-AOVMOCTK.js.map → chunk-GHAJHXYA.js.map} +0 -0
  95. /package/dist/{chunk-4CS7XE2Q.js.map → chunk-JYV3XQYW.js.map} +0 -0
  96. /package/dist/{chunk-U6AJU2VD.js.map → chunk-MNPPMJBN.js.map} +0 -0
  97. /package/dist/{chunk-J75TVRJB.js.map → chunk-MXADBQ7E.js.map} +0 -0
  98. /package/dist/{chunk-B4R443MV.js.map → chunk-NVBX2NKZ.js.map} +0 -0
  99. /package/dist/{chunk-TM4T4NYJ.js.map → chunk-OX5FA2MU.js.map} +0 -0
  100. /package/dist/{chunk-QYJPU4FZ.js.map → chunk-TM7IOP4P.js.map} +0 -0
  101. /package/dist/{chunk-OKHKEYTL.js.map → chunk-URQM5TBD.js.map} +0 -0
  102. /package/dist/{chunk-VO22VAR3.js.map → chunk-VVKMBLG2.js.map} +0 -0
  103. /package/dist/{chunk-JXJDXDOU.js.map → chunk-WLNEQGQC.js.map} +0 -0
  104. /package/dist/{chunk-56ZWAREM.js.map → chunk-WLWWODBQ.js.map} +0 -0
  105. /package/dist/{chunk-AKSCTGKG.js.map → chunk-X5YHJHWB.js.map} +0 -0
  106. /package/dist/{chunks-2EC2R7PY.js.map → chunks-3NIFJFRQ.js.map} +0 -0
  107. /package/dist/{formula-STIFIS57.js.map → formula-D6GGALWI.js.map} +0 -0
  108. /package/dist/{formula-RSTTP626.js.map → formula-KWOAYEOG.js.map} +0 -0
  109. /package/dist/{image-ocr-XKSAEEXP.js.map → image-ocr-XDODV43Y.js.map} +0 -0
  110. /package/dist/{image-ocr-R6ZDFBAN.js.map → image-ocr-YYTFOUSY.js.map} +0 -0
  111. /package/dist/{model-bundle-NGTKULP7.js.map → model-bundle-WPFLIKYM.js.map} +0 -0
  112. /package/dist/{models-QOSU5SYL.js.map → models-WJ5QYELV.js.map} +0 -0
  113. /package/dist/{parser-5GUEP6EK.js.map → parser-LY67CB7A.js.map} +0 -0
  114. /package/dist/{parser-3G4G6SST.js.map → parser-QKLUIMHG.js.map} +0 -0
  115. /package/dist/{pdf-ocr-DAXS5RX4.js.map → pdf-ocr-6L4EDRVO.js.map} +0 -0
  116. /package/dist/{pdf-ocr-R3VGX6F2.js.map → pdf-ocr-J7DHJJ3I.js.map} +0 -0
  117. /package/dist/{profile-io-ZVNMDLLS.js.map → profile-io-I4ORJOE4.js.map} +0 -0
  118. /package/dist/{rasterize-Y2RLMVCL.js.map → rasterize-MZU5LIA5.js.map} +0 -0
  119. /package/dist/{redact-doc-PNRDDBI3.js.map → redact-doc-NEUEBXFH.js.map} +0 -0
  120. /package/dist/{render-S3ALARVO.js.map → render-IL2DYXDP.js.map} +0 -0
  121. /package/dist/{seal-EJWPS5VK.js.map → seal-O5DKZGTR.js.map} +0 -0
  122. /package/dist/{setup-JH66VSFZ.js.map → setup-PGOCB7YG.js.map} +0 -0
  123. /package/dist/{visual-GDXMKDVY.js.map → visual-PYV4ZMLH.js.map} +0 -0
  124. /package/dist/{watch-KMB2FTOD.js.map → watch-2F5AMHCW.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  blocksToPages
4
- } from "./chunk-VO22VAR3.js";
4
+ } from "./chunk-VVKMBLG2.js";
5
5
  import {
6
6
  allLinesegRemovalSplices,
7
7
  applySplices,
@@ -14,8 +14,9 @@ import {
14
14
  paraTText,
15
15
  paraTextPureT,
16
16
  patchZipEntries,
17
+ readZipEntries,
17
18
  scanSectionXml
18
- } from "./chunk-PWQ2BVAT.js";
19
+ } from "./chunk-7H5GT7HM.js";
19
20
  import {
20
21
  CONVERT_MAP,
21
22
  FLAG_COMPRESSED,
@@ -65,7 +66,7 @@ import {
65
66
  romanNumeral,
66
67
  simulateWrap,
67
68
  takeTocLeaders
68
- } from "./chunk-QZ63HXEG.js";
69
+ } from "./chunk-527NBMUE.js";
69
70
  import {
70
71
  CELL_EDGES,
71
72
  HEADING_RATIO_H1,
@@ -77,7 +78,7 @@ import {
77
78
  tidyScriptTags,
78
79
  unframeLayoutTables,
79
80
  wrapScript
80
- } from "./chunk-AOVMOCTK.js";
81
+ } from "./chunk-GHAJHXYA.js";
81
82
  import {
82
83
  parsePageRange
83
84
  } from "./chunk-VQFA55IC.js";
@@ -97,7 +98,7 @@ import {
97
98
  localName,
98
99
  rawTextContent,
99
100
  readZipEntry
100
- } from "./chunk-QYJPU4FZ.js";
101
+ } from "./chunk-TM7IOP4P.js";
101
102
  import {
102
103
  MAX_COLS,
103
104
  MAX_ROWS,
@@ -112,7 +113,7 @@ import {
112
113
  hasStructuredCellContent,
113
114
  mapPuaText,
114
115
  noteSuffix
115
- } from "./chunk-B4R443MV.js";
116
+ } from "./chunk-NVBX2NKZ.js";
116
117
  import {
117
118
  KordocError,
118
119
  classifyError,
@@ -128,7 +129,7 @@ import {
128
129
  toArrayBuffer,
129
130
  unescapeHtml,
130
131
  unzipLimitBytes
131
- } from "./chunk-OKHKEYTL.js";
132
+ } from "./chunk-URQM5TBD.js";
132
133
 
133
134
  // src/table/visual.ts
134
135
  import { readFile as readFile2 } from "fs/promises";
@@ -21512,7 +21513,7 @@ function parseInlineMarkdown(text) {
21512
21513
  }
21513
21514
  return spans;
21514
21515
  }
21515
- var INLINE_REGEX = /(`[^`]+`|\*{3}(?:[^*]|\*(?!\*\*))+\*{3}|\*{2}(?:[^*]|\*(?!\*))+\*{2}|\*(?:[^*]|\*{2}(?:[^*]|\*(?!\*))+\*{2})+\*|(?<![^\s\p{P}\p{S}\x00])(?<!_)_{2}(?=\S)[^_]+(?<=\S)_{2}(?!_)(?![^\s\p{P}\p{S}\x00])|(?<![^\s\p{P}\p{S}\x00])(?<!_)_(?=\S)[^_]+(?<=\S)_(?!_)(?![^\s\p{P}\p{S}\x00]))/gu;
21516
+ var INLINE_REGEX = /(`[^`]+`|\*{3}(?=\S)(?:[^*]|\*(?!\*\*))+(?<=\S)\*{3}|\*{2}(?=\S)(?:[^*]|\*(?!\*))+(?<=\S)\*{2}|\*(?=\S)(?:[^*]|\*{2}(?:[^*]|\*(?!\*))+\*{2})+(?<=\S)\*|(?<![^\s\p{P}\p{S}\x00])(?<!_)_{2}(?=\S)[^_]+(?<=\S)_{2}(?!_)(?![^\s\p{P}\p{S}\x00])|(?<![^\s\p{P}\p{S}\x00])(?<!_)_(?=\S)[^_]+(?<=\S)_(?!_)(?![^\s\p{P}\p{S}\x00]))/gu;
21516
21517
  function emphasisSpans(text, depth = 0) {
21517
21518
  const spans = [];
21518
21519
  let lastIdx = 0;
@@ -25289,7 +25290,7 @@ function markerRunXml(marker, charPr2, lay) {
25289
25290
  var NBSP = "\xA0";
25290
25291
  var OPENER_BEFORE = /[\s(\[{>「『〈《【〔‘“·/:,~—–-]/u;
25291
25292
  function bindSpaces(s) {
25292
- return s.replace(/(\d{4}|['’]\d{2})\. (\d{1,2})\. (\d{1,2})\.(?!\d)/g, `$1.${NBSP}$2.${NBSP}$3.`).replace(/(\d{4}|['’]\d{2})\. (\d{1,2})\.(?!\d)/g, `$1.${NBSP}$2.`).replace(/(?<![\d.])(\d{1,2})\. (\d{1,2})\.(?!\d)/g, `$1.${NBSP}$2.`).replace(/(\d{1,2}:\d{2}) ([~∼-]) (\d{1,2}:\d{2})/g, `$1${NBSP}$2${NBSP}$3`).replace(/(\d(?:조|억|만|천)?) 원/g, `$1${NBSP}\uC6D0`);
25293
+ return s.replace(/(\d{4}|['’]\d{2})\. (\d{1,2})\. (\d{1,2})\.(?!\d)/g, `$1.${NBSP}$2.${NBSP}$3.`).replace(/(\d{4}|['’]\d{2})\. (\d{1,2})\.(?!\d)/g, `$1.${NBSP}$2.`).replace(/(?<![\d.])(\d{1,2})\. (\d{1,2})\.(?!\d)/g, `$1.${NBSP}$2.`).replace(/(\d{1,2}:\d{2}) ([~∼-]) (\d{1,2}:\d{2})/g, `$1${NBSP}$2${NBSP}$3`).replace(/(\d(?:조|억|만|천)?) 원/g, `$1${NBSP}\uC6D0`).replace(/(?<=[가-힣A-Za-z0-9))*.]) 등(?=(?:으로서|으로써|으로|에서|에게|까지|부터|이며|이고|이다|이나|이라|과|와|을|를|은|는|이|가|의|에|도|만)?[,,.))」』’”]*(?:\s|$))/g, `${NBSP}\uB4F1`).replace(/(?<=[가-힣A-Za-z]) (?=\d+(?:\.\d+)?[,,](?:\s|$))/g, NBSP).replace(/(?<=\d[,,][ \u00a0]+[가-힣A-Za-z]+) (?=\d+(?:\.\d+)?[^\s,,\d]*(?:\s|$))/g, NBSP);
25293
25294
  }
25294
25295
  function neighbor(s, i, dir) {
25295
25296
  for (let k = i + dir; k >= 0 && k < s.length; k += dir) if (!/[*_~]/.test(s[k])) return s[k];
@@ -26049,12 +26050,39 @@ function legalDepthOf(marker) {
26049
26050
  return 6;
26050
26051
  }
26051
26052
 
26053
+ // src/hwpx/paste-clean.ts
26054
+ var INVISIBLE = /[\u200b\u200c\u2060\ufeff]/g;
26055
+ var CITATION_TAG = /[ \t]?【[^【】†\n]*†[^【】\n]*】/g;
26056
+ var ESCAPED_BOLD = /(?<![\\*])\\\*\\\*(?=[^\s\\*<])([^\\\n<]+?)(?<=[^\s\\*>])\\\*\\\*(?!\\\*)/g;
26057
+ function cleanPastedMarkdown(md) {
26058
+ let removed = 0;
26059
+ let fence = null;
26060
+ const count = (re, s, to) => s.replace(re, (...a) => {
26061
+ removed++;
26062
+ return typeof to === "string" ? to : to(...a);
26063
+ });
26064
+ const lines = md.split("\n").map((line) => {
26065
+ const f = line.match(/^\s*(```+|~~~+)/);
26066
+ if (f) {
26067
+ fence = fence === null ? f[1][0] : fence === f[1][0] ? null : fence;
26068
+ return line;
26069
+ }
26070
+ if (fence !== null) return line;
26071
+ let out = count(INVISIBLE, line, "");
26072
+ out = count(CITATION_TAG, out, "");
26073
+ return count(ESCAPED_BOLD, out, (_m, inner) => `**${inner}**`);
26074
+ });
26075
+ return { md: lines.join("\n"), removed };
26076
+ }
26077
+
26052
26078
  // src/hwpx/generator.ts
26053
26079
  async function markdownToHwpx(markdown, options) {
26054
26080
  const theme = resolveTheme(options?.theme);
26055
26081
  const gongmun = options?.gongmun ? resolveGongmun(options.gongmun) : null;
26056
26082
  const page = resolvePage(options?.page);
26057
- const { md, defs } = extractFootnoteDefs(markdown);
26083
+ const pasted = cleanPastedMarkdown(markdown);
26084
+ if (pasted.removed > 0) options?.warnings?.push(`\uBD99\uC5EC\uB123\uAE30 \uD754\uC801 ${pasted.removed}\uAC1C \uC815\uB9AC (\uBCF4\uC774\uC9C0 \uC54A\uB294 \uAE00\uC790\xB7\uC778\uC6A9 \uD45C\uC2DC\xB7\uC774\uC2A4\uCF00\uC774\uD504\uB41C \uAD75\uAC8C)`);
26085
+ const { md, defs } = extractFootnoteDefs(pasted.md);
26058
26086
  beginInlineDoc(defs);
26059
26087
  try {
26060
26088
  if (gongmun && usesV5Engine(gongmun.preset)) {
@@ -26790,14 +26818,71 @@ var DISCRIM_FIXES = [
26790
26818
  ["\uADC0\uBA38\uAC70\uB9AC", "\uCCAD\uAC01\uC7A5\uC560\uC778"]
26791
26819
  ];
26792
26820
  var DISCRIM_RE = new RegExp(DISCRIM_FIXES.map(([w]) => w).sort((a, b) => b.length - a.length).join("|"), "g");
26821
+ var PLAIN_FIXES = [
26822
+ ["\uAE08\uBC88", "\uC774\uBC88"],
26823
+ ["\uAE08\uC77C", "\uC624\uB298"],
26824
+ ["\uBA85\uC77C", "\uB0B4\uC77C"],
26825
+ ["\uC791\uC77C", "\uC5B4\uC81C"],
26826
+ ["\uC775\uC77C", "\uB2E4\uC74C \uB0A0"],
26827
+ ["\uACE0\uC218\uBD80\uC9C0", "\uB454\uCE58"],
26828
+ ["\uBD88\uCCA0\uC8FC\uC57C", "\uBC24\uB0AE\uC5C6\uC774"]
26829
+ ];
26830
+ var SPELLING_FIXES = [
26831
+ ["\uBA87\uC77C", "\uBA70\uCE60"],
26832
+ ["\uAC2F\uC218", "\uAC1C\uC218"],
26833
+ ["\uB42C\uC2B5\uB2C8\uB2E4", "\uB410\uC2B5\uB2C8\uB2E4"],
26834
+ ["\uB42C\uB2E4", "\uB410\uB2E4"],
26835
+ ["\uC660\uB9CC\uD558\uBA74", "\uC6EC\uB9CC\uD558\uBA74"],
26836
+ ["\uC5B4\uC758\uC5C6\uB2E4", "\uC5B4\uC774\uC5C6\uB2E4"],
26837
+ ["\uB418\uC694", "\uB3FC\uC694"]
26838
+ ];
26839
+ var wordRe = (fixes) => new RegExp(
26840
+ "(?<![\uAC00-\uD7A3A-Za-z0-9])(?:" + fixes.map(([w]) => w).sort((a, b) => b.length - a.length).join("|") + ")(?=(?:\uC73C\uB85C|\uBD80\uD130|\uAE4C\uC9C0|\uB3D9\uC548|\uC774\uB098|\uC740|\uB294|\uC774|\uAC00|\uC744|\uB97C|\uC5D0|\uC758|\uB3C4|\uB9CC|\uB85C|\uACFC|\uC640|\uAC04)?(?![\uAC00-\uD7A3A-Za-z0-9]))",
26841
+ "g"
26842
+ );
26843
+ var PLAIN_RE = wordRe(PLAIN_FIXES);
26844
+ var SPELLING_RE = wordRe(SPELLING_FIXES);
26845
+ var WEEKDAYS = "\uC77C\uC6D4\uD654\uC218\uBAA9\uAE08\uD1A0";
26846
+ function weekdayCheck(m) {
26847
+ const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];
26848
+ const date = new Date(y, mo - 1, d);
26849
+ if (date.getFullYear() !== y || date.getMonth() !== mo - 1 || date.getDate() !== d) return null;
26850
+ const right = WEEKDAYS[date.getDay()];
26851
+ return right === m[4] ? null : `${m[0].trim()} \u2192 ${y}. ${mo}. ${d}.(${right})`;
26852
+ }
26853
+ var HANGUL_DIGIT = { \uC77C: 1, \uC774: 2, \uC0BC: 3, \uC0AC: 4, \uC624: 5, \uC721: 6, \uCE60: 7, \uD314: 8, \uAD6C: 9, \uC601: 0 };
26854
+ var HANGUL_SMALL = { \uC2ED: 10, \uBC31: 100, \uCC9C: 1e3 };
26855
+ var HANGUL_BIG = { \uB9CC: 1e4, \uC5B5: 1e8, \uC870: 1e12 };
26856
+ function hangulToNumber(s) {
26857
+ let total = 0, section = 0, digit = 0;
26858
+ for (const ch of s) {
26859
+ if (ch in HANGUL_DIGIT) digit = HANGUL_DIGIT[ch];
26860
+ else if (ch in HANGUL_SMALL) {
26861
+ section += (digit || 1) * HANGUL_SMALL[ch];
26862
+ digit = 0;
26863
+ } else if (ch in HANGUL_BIG) {
26864
+ total += (section + digit || 1) * HANGUL_BIG[ch];
26865
+ section = 0;
26866
+ digit = 0;
26867
+ } else return null;
26868
+ }
26869
+ return total + section + digit;
26870
+ }
26871
+ function moneyHangulCheck(m) {
26872
+ const n = Number(m[1].replace(/,/g, ""));
26873
+ const h = hangulToNumber(m[2].replace(/\s/g, ""));
26874
+ if (!Number.isFinite(n) || h === null || h === n) return null;
26875
+ return `\uAE08${m[1]}\uC6D0(\uAE08${hangulAmount(n)}\uC6D0)`;
26876
+ }
26793
26877
  var RULES = [
26794
26878
  // 날짜 ─ 온점 뒤 한 칸, 0 패딩 금지, 연도 4자리, 끝 마침표
26795
26879
  // 법령 연혁 표기 `<개정 2012.2.14>`·`삭제 <2016.2.29.>`·`[시행일:2017.9.8.]` 는 법제처 정본 형식(별지서식 표제) —
26796
26880
  // 편람 날짜 규칙 대상이 아니다 (v4.12.3: 서식 595건 DATE 156건 전부 이 꼴, 기안문 0건)
26881
+ // 날짜 모양이 시작되는 자리에서만 뒤쪽 검사 — 뒤쪽 검사(\s*)를 모든 자리에서 먼저 하면 긴 공백 줄에서 이차 폭주(2만 칸 0.7초)
26797
26882
  {
26798
26883
  code: "DATE_NO_SPACE",
26799
26884
  severity: "error",
26800
- pattern: /(?<!<(?:개정|신설|전문개정|전부개정|일부개정|제정)\s*)(?<!삭제\s*<)(?<!시행일\s*:\s*)\b\d{4}\.\d{1,2}\.\d{1,2}\.?/g,
26885
+ pattern: /\b(?=\d{4}\.\d{1,2}\.\d)(?<!<(?:개정|신설|전문개정|전부개정|일부개정|제정)\s*)(?<!삭제\s*<)(?<!시행일\s*:\s*)\d{4}\.\d{1,2}\.\d{1,2}\.?/g,
26801
26886
  message: "\uB0A0\uC9DC \uC628\uC810 \uB4A4\uC5D0 \uD55C \uCE78\uC529 \uB744\uC6CC\uC57C \uD568",
26802
26887
  suggest: "\uC608) 2025. 1. 6."
26803
26888
  },
@@ -26844,7 +26929,7 @@ var RULES = [
26844
26929
  code: "TIME_24H",
26845
26930
  severity: "warning",
26846
26931
  pattern: /(?<!\d)24\s*시(?!각)/g,
26847
- message: "'24\uC2DC'\uBCF4\uB2E4 \uC775\uC77C 00:00 \uB610\uB294 '18:00\uAE4C\uC9C0' \uAD8C\uC7A5",
26932
+ message: "'24\uC2DC'\uBCF4\uB2E4 \uB2E4\uC74C \uB0A0 00:00 \uB610\uB294 '18:00\uAE4C\uC9C0' \uAD8C\uC7A5",
26848
26933
  suggest: "\uC608) 18:00"
26849
26934
  },
26850
26935
  {
@@ -26855,10 +26940,11 @@ var RULES = [
26855
26940
  suggest: "\uC608) 13:20"
26856
26941
  },
26857
26942
  // 금액 ─ '천원' 금지, 금+숫자 붙여쓰기
26943
+ // 숫자 런 첫머리에서만 시작 — 아니면 긴 숫자 줄에서 시작 자리마다 런을 다시 훑어 이차 폭주(숫자 5만 자 2.9초)
26858
26944
  {
26859
26945
  code: "MONEY_CHEONWON",
26860
26946
  severity: "error",
26861
- pattern: /\d+\s*천\s*원/g,
26947
+ pattern: /(?<!\d)\d+\s*천\s*원/g,
26862
26948
  message: "\uAE08\uC561\uC740 '\uCC9C\uC6D0'\uC73C\uB85C \uC904\uC774\uC9C0 \uC54A\uACE0 \uC544\uB77C\uBE44\uC544 \uC22B\uC790\uB85C",
26863
26949
  suggest: "\uC608) 345,000\uC6D0"
26864
26950
  },
@@ -26907,6 +26993,14 @@ var RULES = [
26907
26993
  },
26908
26994
  // ── 편람 보강 (v4.12.1) — pyhwpxlib Gongmun 검사·hwpx-skill gonmun_lint 대조로 빈 축 보충 ──
26909
26995
  // 금액 한글 병기 — 규정 시행규칙 제2조: 아라비아 숫자 다음 괄호 안에 한글로 적는다
26996
+ // 한글 금액은 글자 묶음 사이에만 공백 — 공백 수량자가 겹치면 닫는 괄호 없는 긴 공백 줄에서 폭주했다(160칸 9.8초)
26997
+ {
26998
+ code: "MONEY_HANGUL_MISMATCH",
26999
+ severity: "error",
27000
+ pattern: /금\s?(\d[\d,]*)원\s*[((]\s*(?:금\s*)?([일이삼사오육칠팔구십백천만억조영]+(?:\s+[일이삼사오육칠팔구십백천만억조영]+)*)\s*원?\s*[))]/g,
27001
+ check: moneyHangulCheck,
27002
+ message: "\uBCD1\uAE30\uD55C \uD55C\uAE00 \uAE08\uC561\uC774 \uC22B\uC790\uC640 \uB2E4\uB984"
27003
+ },
26910
27004
  {
26911
27005
  code: "MONEY_NO_HANGUL",
26912
27006
  severity: "warning",
@@ -26917,6 +27011,22 @@ var RULES = [
26917
27011
  // 물결표 앞뒤 붙여쓰기 — 기간·범위는 "2. 20.∼2. 24." 처럼 붙여 씀. 숫자·날짜·시각 범위(앞은 숫자·
26918
27012
  // 온점·괄호·년월일시분, 뒤는 숫자·연도 생략부호)에만 건다 — "기간( 부터 ~ 까지)" 기입란·"~ ※ 비고"·
26919
27013
  // "~ 수리완료시까지" 처럼 낱말이 붙는 물결표는 범위 표기가 아니다 (v4.12.2, 별지서식 47→30·기안문 32→27 실측)
27014
+ // 기간·시각 범위의 대시 — 점 날짜(연·월·일)나 시:분 사이만 잡아 전화번호(02-123-4567)·조항(제4조-2)·코드(IT-2026-01)는
27015
+ // 걸리지 않는다. 자동 치환은 하지 않는다(명세 (d) 물결표 자동 치환 위험 — 검수만)
27016
+ {
27017
+ code: "RANGE_DASH",
27018
+ severity: "warning",
27019
+ pattern: /\d{2,4}\.\s*\d{1,2}\.\s*\d{1,2}\.?\s*[-–—]\s*(?:\d{2,4}\.\s*)?\d{1,2}\.\s*\d{1,2}\.?|(?<![\d:])\d{1,2}:\d{2}\s*[-–—]\s*\d{1,2}:\d{2}(?![\d:])/g,
27020
+ message: "\uAE30\uAC04\xB7\uC2DC\uAC01 \uBC94\uC704\uB294 \uBB3C\uACB0\uD45C(\u223C)\uB85C",
27021
+ suggest: "\uC608) 2026. 3. 1.\u223C6. 30., 14:00\u223C16:00"
27022
+ },
27023
+ {
27024
+ code: "WEEKDAY_MISMATCH",
27025
+ severity: "error",
27026
+ pattern: /(?<![\d.])(\d{4})\.\s*(\d{1,2})\.\s*(\d{1,2})\.?\s*\(([월화수목금토일])\)/g,
27027
+ check: weekdayCheck,
27028
+ message: "\uB0A0\uC9DC\uC640 \uC694\uC77C\uC774 \uB9DE\uC9C0 \uC54A\uC74C"
27029
+ },
26920
27030
  {
26921
27031
  code: "TILDE_SPACE",
26922
27032
  severity: "warning",
@@ -26943,6 +27053,39 @@ var RULES = [
26943
27053
  suggest: "\uC608) \uCF58\uD150\uCE20\xB7\uC560\uD50C\uB9AC\uCF00\uC774\uC158\xB7\uBA54\uC2DC\uC9C0\xB7\uC6CC\uD06C\uC20D\xB7\uC2A4\uCF00\uC904\xB7\uCF58\uC149\uD2B8"
26944
27054
  },
26945
27055
  // 차별·비하 표현 — 행안부 공문서 작성 지침·국립국어원 순화어
27056
+ // 표 줄은 건너뜀 — 법정 서식 라벨 칸("전일 지침 | 금일 지침")은 바꿀 대상이 아니다 (gate-fill·licbyl 801건 실측 7건 전부 표 라벨)
27057
+ {
27058
+ code: "PLAIN_LANGUAGE",
27059
+ severity: "warning",
27060
+ skipTable: true,
27061
+ pattern: PLAIN_RE,
27062
+ message: "\uACF5\uACF5\uC5B8\uC5B4 \uC26C\uC6B4 \uB9D0\uB85C \uBC14\uAFD4 \uC4F0\uAE30 \uAD8C\uC7A5 (\uD2C0\uB9B0 \uB9D0\uC740 \uC544\uB2D8)"
27063
+ },
27064
+ {
27065
+ code: "SPELLING_ERROR",
27066
+ severity: "warning",
27067
+ pattern: SPELLING_RE,
27068
+ message: "\uB9DE\uCDA4\uBC95 \uC624\uAE30"
27069
+ },
27070
+ // 끝 표시·붙임 표시 2타 (규칙 제2조제2항·편람) — 생성 경로는 official 프리셋이 스스로 맞춘다
27071
+ {
27072
+ code: "END_MARK_SPACE",
27073
+ severity: "warning",
27074
+ documentOnly: true,
27075
+ rawSource: true,
27076
+ pattern: /(?<=\.)(?:[ \t\u3000]?|[ \t\u3000]{3,})끝\.[ \t\u3000]*$/g,
27077
+ message: "'\uB05D.'\uC740 \uC55E \uAE00 \uB9C8\uCE68\uD45C\uC5D0\uC11C 2\uD0C0 \uB744\uC6C0",
27078
+ suggest: "\uC608) \u2026\uBC14\uB78D\uB2C8\uB2E4. \uB05D."
27079
+ },
27080
+ {
27081
+ code: "BUNIM_SPACE",
27082
+ severity: "warning",
27083
+ documentOnly: true,
27084
+ rawSource: true,
27085
+ pattern: /^[ \t\u3000]*붙임(?:[ \t\u3000]|[ \t\u3000]{3,})(?=[^ \t\u3000::])(?=.*(?<!\d)\d+\s*부\.(?:[ \t\u3000]*끝\.)?[ \t\u3000]*$)/g,
27086
+ message: "'\uBD99\uC784' \uB4A4\uB294 2\uD0C0 \uB744\uC6C0",
27087
+ suggest: "\uC608) \uBD99\uC784 \uACC4\uD68D\uC11C 1\uBD80. \uB05D."
27088
+ },
26946
27089
  {
26947
27090
  code: "DISCRIMINATORY_TERM",
26948
27091
  severity: "warning",
@@ -26962,6 +27105,7 @@ var RULES = [
26962
27105
  {
26963
27106
  code: "AI_BOLD_OVERUSE",
26964
27107
  severity: "warning",
27108
+ rawSource: true,
26965
27109
  pattern: /(?:\*\*[^*\n]+\*\*[^*\n]*){3}/g,
26966
27110
  message: "\uD55C \uC904\uC5D0 \uAC15\uC870(**) 3\uD68C \uC774\uC0C1 \u2014 \uAC15\uC870 \uB0A8\uBC1C\uC740 \uC0DD\uC131\uD615 AI \uBB38\uCCB4 \uD754\uC801",
26967
27111
  suggest: "\uB9AC\uB4DC\uC5B4\xB7\uD575\uC2EC \uC218\uCE58 \uD55C \uACF3\uB9CC \uAC15\uC870"
@@ -26984,15 +27128,19 @@ function lintGongmunText(text, opts) {
26984
27128
  const tableLine = /^\s*\|/.test(line) || /<t[dhr][\s>]/i.test(line);
26985
27129
  for (const r of RULES) {
26986
27130
  if (r.skipTable && tableLine) continue;
27131
+ if (r.documentOnly && !opts?.document) continue;
27132
+ if (r.rawSource && opts?.parsed) continue;
26987
27133
  r.pattern.lastIndex = 0;
26988
27134
  for (const m of line.matchAll(r.pattern)) {
27135
+ const checked = r.check ? r.check(m) : void 0;
27136
+ if (checked === null) continue;
26989
27137
  findings.push({
26990
27138
  line: i + 1,
26991
- match: m[0].trim(),
27139
+ match: m[0].trim() || m[0],
26992
27140
  rule: r.code,
26993
27141
  severity: r.severity,
26994
27142
  message: r.message,
26995
- suggest: dictSuggest(r.code, m[0]) ?? r.suggest
27143
+ suggest: checked ?? dictSuggest(r.code, m[0]) ?? r.suggest
26996
27144
  });
26997
27145
  }
26998
27146
  }
@@ -27016,7 +27164,7 @@ function dictSuggest(code, match) {
27016
27164
  const d = m.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/);
27017
27165
  if (d) return `${m} \u2192 ${d[1]}. ${Number(d[2])}. ${Number(d[3])}.`;
27018
27166
  }
27019
- const table2 = code === "LOANWORD_ERROR" ? LOANWORD_FIXES : code === "DISCRIMINATORY_TERM" ? DISCRIM_FIXES : null;
27167
+ const table2 = code === "LOANWORD_ERROR" ? LOANWORD_FIXES : code === "DISCRIMINATORY_TERM" ? DISCRIM_FIXES : code === "PLAIN_LANGUAGE" ? PLAIN_FIXES : code === "SPELLING_ERROR" ? SPELLING_FIXES : null;
27020
27168
  if (!table2) return void 0;
27021
27169
  const hit = table2.find(([w]) => w === match.trim());
27022
27170
  return hit ? `${hit[0]} \u2192 ${hit[1]}` : void 0;
@@ -27262,6 +27410,60 @@ function muncheLintWarnings(text, limit = 10) {
27262
27410
  // src/roundtrip/patcher.ts
27263
27411
  import JSZip10 from "jszip";
27264
27412
 
27413
+ // src/roundtrip/integrity.ts
27414
+ import { DOMParser as DOMParser5 } from "@xmldom/xmldom";
27415
+ import { inflateRawSync as inflateRawSync5 } from "zlib";
27416
+ var LINESEG_RE = /<(\w+:)?linesegarray\b[^>]*?(?:\/>|>[\s\S]*?<\/\1linesegarray>)/g;
27417
+ var TAG_RE = /<[^>]+>/g;
27418
+ var sameBytes = (a, b) => Buffer.compare(a, b) === 0;
27419
+ function xmlError(xml) {
27420
+ let error = null;
27421
+ try {
27422
+ new DOMParser5({ onError: (level, msg2) => {
27423
+ if (level !== "warning" && !error) error = String(msg2);
27424
+ } }).parseFromString(xml, "text/xml");
27425
+ } catch (e) {
27426
+ error ??= e instanceof Error ? e.message : String(e);
27427
+ }
27428
+ return error;
27429
+ }
27430
+ var textOnly = (xml, s) => !s.replacement.includes("<") && !xml.slice(s.start, s.end).includes("<");
27431
+ function checkPatchIntegrity(original, patched, replacements, sections) {
27432
+ const issues = [];
27433
+ const a = readZipEntries(original), b = readZipEntries(patched);
27434
+ const names = (m) => [...m.keys()].join("\n");
27435
+ if (names(a) !== names(b)) issues.push("ZIP \uC5D4\uD2B8\uB9AC \uBAA9\uB85D\xB7\uC21C\uC11C\uAC00 \uC6D0\uBCF8\uACFC \uB2E4\uB984");
27436
+ for (const [name, entry] of a) {
27437
+ if (replacements.has(name)) continue;
27438
+ const out = b.get(name);
27439
+ if (!out || out.method !== entry.method || !sameBytes(out.compData, entry.compData)) issues.push(`\uAD50\uCCB4\uD558\uC9C0 \uC54A\uC740 \uC5D4\uD2B8\uB9AC\uC758 \uBC14\uC774\uD2B8\uAC00 \uBC14\uB01C: ${name}`);
27440
+ }
27441
+ const decoder = new TextDecoder();
27442
+ const originalText = (name) => {
27443
+ const e = a.get(name);
27444
+ if (!e) return null;
27445
+ try {
27446
+ return decoder.decode(e.method === 8 ? inflateRawSync5(e.compData) : e.compData);
27447
+ } catch {
27448
+ return null;
27449
+ }
27450
+ };
27451
+ for (const [name, data] of replacements) {
27452
+ if (!/\.xml$/i.test(name)) continue;
27453
+ const err = xmlError(decoder.decode(data));
27454
+ const before = originalText(name);
27455
+ if (err && before !== null && !xmlError(before)) issues.push(`\uAD50\uCCB4\uD55C XML \uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC74C: ${name} \u2014 ${err.split("\n")[0]}`);
27456
+ }
27457
+ for (const { name, xml, splices } of sections) {
27458
+ if (!splices.every((s) => textOnly(xml, s))) continue;
27459
+ const data = replacements.get(name);
27460
+ if (!data) continue;
27461
+ const tags = (x) => (x.replace(LINESEG_RE, "").match(TAG_RE) ?? []).join("");
27462
+ if (tags(xml) !== tags(decoder.decode(data))) issues.push(`\uAE00\uB9CC \uACE0\uCE5C \uC139\uC158\uC758 \uD0DC\uADF8\xB7\uC18D\uC131\uC774 \uBC14\uB01C: ${name}`);
27463
+ }
27464
+ return issues;
27465
+ }
27466
+
27265
27467
  // src/roundtrip/table-rows.ts
27266
27468
  var ROW_OBJECT_RE = /<(?:[A-Za-z0-9_]+:)?(?:tbl|pic|equation|ole|container|shape|drawingObject|drawText|video|chart|fieldBegin|fieldEnd|ctrl)\b/;
27267
27469
  var TAG_AT_RE = /<[A-Za-z0-9_:]+(?:"[^"]*"|'[^']*'|[^>"'])*>/y;
@@ -29226,9 +29428,9 @@ async function patchHwpx(original, editedMarkdown, options) {
29226
29428
  for (const [oi, ei] of pairs) {
29227
29429
  if (oi !== null && ei !== null) {
29228
29430
  const orig = origUnits[oi];
29229
- const edited = editedUnits[ei];
29230
- if (orig.raw === edited.raw) continue;
29231
- applied += handleModifiedUnit(orig, edited, {
29431
+ const edited2 = editedUnits[ei];
29432
+ if (orig.raw === edited2.raw) continue;
29433
+ applied += handleModifiedUnit(orig, edited2, {
29232
29434
  origBlocks,
29233
29435
  paraMap,
29234
29436
  scans,
@@ -29245,10 +29447,12 @@ async function patchHwpx(original, editedMarkdown, options) {
29245
29447
  }
29246
29448
  }
29247
29449
  const replacements = /* @__PURE__ */ new Map();
29450
+ const edited = [];
29248
29451
  const encoder = new TextEncoder();
29249
29452
  try {
29250
29453
  for (let i = 0; i < scans.length; i++) {
29251
29454
  if (sectionSplices[i].length === 0) continue;
29455
+ edited.push({ name: sectionPaths[i], xml: scans[i].xml, splices: [...sectionSplices[i]] });
29252
29456
  const claimed = sectionSplices[i].filter((s) => s.end > s.start);
29253
29457
  sectionSplices[i].push(...allLinesegRemovalSplices(scans[i].xml).filter((ls) => !claimed.some((c) => ls.start >= c.start && ls.end <= c.end)));
29254
29458
  const newXml = applySplices(scans[i].xml, sectionSplices[i]);
@@ -29273,6 +29477,8 @@ async function patchHwpx(original, editedMarkdown, options) {
29273
29477
  }
29274
29478
  let verification;
29275
29479
  if (options?.verify !== false) {
29480
+ const issues = replacements.size > 0 ? checkPatchIntegrity(original, data, replacements, edited) : [];
29481
+ if (issues.length) return { success: false, applied, skipped, error: `\uD328\uCE58\uBCF8 \uBB34\uACB0\uC131 \uAC80\uC0AC \uC2E4\uD328 \u2014 \uD328\uCE58 \uC911\uB2E8: ${issues.join("; ")}` };
29276
29482
  try {
29277
29483
  const reparsed = await parseHwpxDocument(u8ToArrayBuffer(data), { layoutTables: "keep" });
29278
29484
  verification = diffUnitLists(splitMarkdownUnits(reparsed.markdown), editedUnits);
@@ -29642,7 +29848,7 @@ async function resolveHeaderEntryName(zip) {
29642
29848
 
29643
29849
  // src/validate.ts
29644
29850
  import JSZip11 from "jszip";
29645
- import { DOMParser as DOMParser5 } from "@xmldom/xmldom";
29851
+ import { DOMParser as DOMParser6 } from "@xmldom/xmldom";
29646
29852
  var REQUIRED_FILES = [
29647
29853
  "mimetype",
29648
29854
  "META-INF/container.xml",
@@ -29688,7 +29894,7 @@ async function validateHwpx(buffer) {
29688
29894
  const text = await zip.files[name].async("string");
29689
29895
  let firstError = null;
29690
29896
  try {
29691
- new DOMParser5({
29897
+ new DOMParser6({
29692
29898
  onError(level, msg2) {
29693
29899
  if (level !== "warning" && firstError === null) firstError = String(msg2);
29694
29900
  }
@@ -30166,7 +30372,7 @@ function scriptsOff(r, off) {
30166
30372
  }
30167
30373
  async function parseImage(buffer, options) {
30168
30374
  try {
30169
- const { parseImageDocument } = await import("./image-ocr-XKSAEEXP.js");
30375
+ const { parseImageDocument } = await import("./image-ocr-XDODV43Y.js");
30170
30376
  const { blocks, warnings } = await parseImageDocument(buffer, options);
30171
30377
  stripScriptTags({ blocks });
30172
30378
  return {
@@ -30226,7 +30432,7 @@ async function parseHwp(buffer, options) {
30226
30432
  async function parsePdf(buffer, options) {
30227
30433
  let parsePdfDocument;
30228
30434
  try {
30229
- const mod = await import("./parser-3G4G6SST.js");
30435
+ const mod = await import("./parser-QKLUIMHG.js");
30230
30436
  parsePdfDocument = mod.parsePdfDocument;
30231
30437
  } catch {
30232
30438
  return {
@@ -30393,6 +30599,8 @@ async function extractTables(input, options = {}) {
30393
30599
  export {
30394
30600
  toPlainMarkdown,
30395
30601
  toHtmlTables,
30602
+ extractHwpxStyles,
30603
+ resolveSectionPaths,
30396
30604
  extractHwpxMetadataOnly,
30397
30605
  formatFillValue,
30398
30606
  ValueCursor,
@@ -30411,6 +30619,8 @@ export {
30411
30619
  PRESET_ALIAS,
30412
30620
  normalizeGongmunPreset,
30413
30621
  incompatibleGongmunWarnings,
30622
+ parseMarkdownToBlocks,
30623
+ parseLeadingMarker,
30414
30624
  markdownToHwpx,
30415
30625
  compare,
30416
30626
  diffBlocks,
@@ -30449,4 +30659,4 @@ export {
30449
30659
  parseHwpml,
30450
30660
  fillForm
30451
30661
  };
30452
- //# sourceMappingURL=chunk-NV46IWKF.js.map
30662
+ //# sourceMappingURL=chunk-LQ4IDHET.js.map