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.
- package/NOTICE +25 -0
- package/README.md +2 -1
- package/THIRD_PARTY/hwp-auto-docfit.LICENSE +23 -0
- package/dist/{-3JIHF2AL.js → -TTRGLREH.js} +11 -11
- package/dist/{chunk-I2TBI7PN.js → chunk-2U475PJF.js} +2 -2
- package/dist/{chunk-R2JM2HOJ.js → chunk-4DIMX2KU.js} +4 -4
- package/dist/{chunk-GNUGD4RO.js → chunk-4WOG2SLT.js} +2 -2
- package/dist/{chunk-QZ63HXEG.js → chunk-527NBMUE.js} +6 -6
- package/dist/{chunk-PWQ2BVAT.js → chunk-7H5GT7HM.js} +22 -3
- package/dist/{chunk-PWQ2BVAT.js.map → chunk-7H5GT7HM.js.map} +1 -1
- package/dist/{chunk-T2DZTOGG.cjs → chunk-AXQDWE42.cjs} +12 -12
- package/dist/{chunk-T2DZTOGG.cjs.map → chunk-AXQDWE42.cjs.map} +1 -1
- package/dist/{chunk-ORGWGR4K.cjs → chunk-CJFIHH2N.cjs} +6 -6
- package/dist/{chunk-ORGWGR4K.cjs.map → chunk-CJFIHH2N.cjs.map} +1 -1
- package/dist/{chunk-XPM7WC54.js → chunk-CKFKC22O.js} +4 -4
- package/dist/{chunk-JK7N4R4K.js → chunk-CPZ2LLZA.js} +2 -2
- package/dist/{chunk-6ZBORHFB.js → chunk-CS2VWXDS.js} +2 -2
- package/dist/{chunk-EUCBMW6C.js → chunk-DPD2L5UK.js} +3 -3
- package/dist/{chunk-AOVMOCTK.js → chunk-GHAJHXYA.js} +2 -2
- package/dist/{chunk-4CS7XE2Q.js → chunk-JYV3XQYW.js} +2 -2
- package/dist/{chunk-MZ6XNFZL.cjs → chunk-K5GCIB2I.cjs} +2 -2
- package/dist/{chunk-MZ6XNFZL.cjs.map → chunk-K5GCIB2I.cjs.map} +1 -1
- package/dist/{chunk-5PGOZBEQ.cjs → chunk-KDCPBF4X.cjs} +22 -22
- package/dist/{chunk-5PGOZBEQ.cjs.map → chunk-KDCPBF4X.cjs.map} +1 -1
- package/dist/{chunk-NV46IWKF.js → chunk-LQ4IDHET.js} +234 -24
- package/dist/chunk-LQ4IDHET.js.map +1 -0
- package/dist/{chunk-U6AJU2VD.js → chunk-MNPPMJBN.js} +2 -2
- package/dist/{chunk-J75TVRJB.js → chunk-MXADBQ7E.js} +2 -2
- package/dist/{chunk-B4R443MV.js → chunk-NVBX2NKZ.js} +2 -2
- package/dist/{chunk-TM4T4NYJ.js → chunk-OX5FA2MU.js} +2 -2
- package/dist/{chunk-WQAGDJIP.cjs → chunk-RMDFN5ZF.cjs} +3 -3
- package/dist/{chunk-WQAGDJIP.cjs.map → chunk-RMDFN5ZF.cjs.map} +1 -1
- package/dist/{chunk-QYJPU4FZ.js → chunk-TM7IOP4P.js} +2 -2
- package/dist/{chunk-OKHKEYTL.js → chunk-URQM5TBD.js} +2 -2
- package/dist/{chunk-VO22VAR3.js → chunk-VVKMBLG2.js} +2 -2
- package/dist/{chunk-JXJDXDOU.js → chunk-WLNEQGQC.js} +3 -3
- package/dist/{chunk-56ZWAREM.js → chunk-WLWWODBQ.js} +2 -2
- package/dist/{chunk-RVBQT2PD.cjs → chunk-WWOU6ZQ3.cjs} +3 -3
- package/dist/{chunk-RVBQT2PD.cjs.map → chunk-WWOU6ZQ3.cjs.map} +1 -1
- package/dist/{chunk-AKSCTGKG.js → chunk-X5YHJHWB.js} +2 -2
- package/dist/chunks-3NIFJFRQ.js +10 -0
- package/dist/cli.js +366 -44
- package/dist/cli.js.map +1 -1
- package/dist/{formula-STIFIS57.js → formula-D6GGALWI.js} +3 -3
- package/dist/{formula-RNATQ3FQ.cjs → formula-FE6LEZTT.cjs} +9 -9
- package/dist/{formula-RNATQ3FQ.cjs.map → formula-FE6LEZTT.cjs.map} +1 -1
- package/dist/{formula-RSTTP626.js → formula-KWOAYEOG.js} +4 -4
- package/dist/{image-ocr-XKSAEEXP.js → image-ocr-XDODV43Y.js} +9 -9
- package/dist/{image-ocr-7L5TBBPA.cjs → image-ocr-XGGIYCZ2.cjs} +15 -15
- package/dist/{image-ocr-7L5TBBPA.cjs.map → image-ocr-XGGIYCZ2.cjs.map} +1 -1
- package/dist/{image-ocr-R6ZDFBAN.js → image-ocr-YYTFOUSY.js} +6 -6
- package/dist/index.cjs +682 -459
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +242 -19
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +22 -22
- package/dist/{model-bundle-NGTKULP7.js → model-bundle-WPFLIKYM.js} +5 -5
- package/dist/{models-QOSU5SYL.js → models-WJ5QYELV.js} +5 -5
- package/dist/{parser-AIQBU7FS.cjs → parser-6P5ZRWXG.cjs} +132 -132
- package/dist/{parser-AIQBU7FS.cjs.map → parser-6P5ZRWXG.cjs.map} +1 -1
- package/dist/{parser-5GUEP6EK.js → parser-LY67CB7A.js} +8 -8
- package/dist/{parser-3G4G6SST.js → parser-QKLUIMHG.js} +11 -11
- package/dist/pdf-ocr-6L4EDRVO.js +20 -0
- package/dist/pdf-ocr-J7DHJJ3I.js +16 -0
- package/dist/pdf-ocr-MODN6GBT.cjs +17 -0
- package/dist/{pdf-ocr-7OAFUDM4.cjs.map → pdf-ocr-MODN6GBT.cjs.map} +1 -1
- package/dist/{profile-io-ZVNMDLLS.js → profile-io-I4ORJOE4.js} +3 -3
- package/dist/{rasterize-Y2RLMVCL.js → rasterize-MZU5LIA5.js} +3 -3
- package/dist/{redact-doc-PNRDDBI3.js → redact-doc-NEUEBXFH.js} +11 -11
- package/dist/{render-S3ALARVO.js → render-IL2DYXDP.js} +7 -7
- package/dist/seal-O5DKZGTR.js +10 -0
- package/dist/{setup-JH66VSFZ.js → setup-PGOCB7YG.js} +3 -3
- package/dist/visual-PYV4ZMLH.js +20 -0
- package/dist/{watch-KMB2FTOD.js → watch-2F5AMHCW.js} +12 -12
- package/package.json +1 -1
- package/dist/chunk-NV46IWKF.js.map +0 -1
- package/dist/chunks-2EC2R7PY.js +0 -10
- package/dist/pdf-ocr-7OAFUDM4.cjs +0 -17
- package/dist/pdf-ocr-DAXS5RX4.js +0 -16
- package/dist/pdf-ocr-R3VGX6F2.js +0 -20
- package/dist/seal-EJWPS5VK.js +0 -10
- package/dist/visual-GDXMKDVY.js +0 -20
- /package/dist/{-3JIHF2AL.js.map → -TTRGLREH.js.map} +0 -0
- /package/dist/{chunk-I2TBI7PN.js.map → chunk-2U475PJF.js.map} +0 -0
- /package/dist/{chunk-R2JM2HOJ.js.map → chunk-4DIMX2KU.js.map} +0 -0
- /package/dist/{chunk-GNUGD4RO.js.map → chunk-4WOG2SLT.js.map} +0 -0
- /package/dist/{chunk-QZ63HXEG.js.map → chunk-527NBMUE.js.map} +0 -0
- /package/dist/{chunk-XPM7WC54.js.map → chunk-CKFKC22O.js.map} +0 -0
- /package/dist/{chunk-JK7N4R4K.js.map → chunk-CPZ2LLZA.js.map} +0 -0
- /package/dist/{chunk-6ZBORHFB.js.map → chunk-CS2VWXDS.js.map} +0 -0
- /package/dist/{chunk-EUCBMW6C.js.map → chunk-DPD2L5UK.js.map} +0 -0
- /package/dist/{chunk-AOVMOCTK.js.map → chunk-GHAJHXYA.js.map} +0 -0
- /package/dist/{chunk-4CS7XE2Q.js.map → chunk-JYV3XQYW.js.map} +0 -0
- /package/dist/{chunk-U6AJU2VD.js.map → chunk-MNPPMJBN.js.map} +0 -0
- /package/dist/{chunk-J75TVRJB.js.map → chunk-MXADBQ7E.js.map} +0 -0
- /package/dist/{chunk-B4R443MV.js.map → chunk-NVBX2NKZ.js.map} +0 -0
- /package/dist/{chunk-TM4T4NYJ.js.map → chunk-OX5FA2MU.js.map} +0 -0
- /package/dist/{chunk-QYJPU4FZ.js.map → chunk-TM7IOP4P.js.map} +0 -0
- /package/dist/{chunk-OKHKEYTL.js.map → chunk-URQM5TBD.js.map} +0 -0
- /package/dist/{chunk-VO22VAR3.js.map → chunk-VVKMBLG2.js.map} +0 -0
- /package/dist/{chunk-JXJDXDOU.js.map → chunk-WLNEQGQC.js.map} +0 -0
- /package/dist/{chunk-56ZWAREM.js.map → chunk-WLWWODBQ.js.map} +0 -0
- /package/dist/{chunk-AKSCTGKG.js.map → chunk-X5YHJHWB.js.map} +0 -0
- /package/dist/{chunks-2EC2R7PY.js.map → chunks-3NIFJFRQ.js.map} +0 -0
- /package/dist/{formula-STIFIS57.js.map → formula-D6GGALWI.js.map} +0 -0
- /package/dist/{formula-RSTTP626.js.map → formula-KWOAYEOG.js.map} +0 -0
- /package/dist/{image-ocr-XKSAEEXP.js.map → image-ocr-XDODV43Y.js.map} +0 -0
- /package/dist/{image-ocr-R6ZDFBAN.js.map → image-ocr-YYTFOUSY.js.map} +0 -0
- /package/dist/{model-bundle-NGTKULP7.js.map → model-bundle-WPFLIKYM.js.map} +0 -0
- /package/dist/{models-QOSU5SYL.js.map → models-WJ5QYELV.js.map} +0 -0
- /package/dist/{parser-5GUEP6EK.js.map → parser-LY67CB7A.js.map} +0 -0
- /package/dist/{parser-3G4G6SST.js.map → parser-QKLUIMHG.js.map} +0 -0
- /package/dist/{pdf-ocr-DAXS5RX4.js.map → pdf-ocr-6L4EDRVO.js.map} +0 -0
- /package/dist/{pdf-ocr-R3VGX6F2.js.map → pdf-ocr-J7DHJJ3I.js.map} +0 -0
- /package/dist/{profile-io-ZVNMDLLS.js.map → profile-io-I4ORJOE4.js.map} +0 -0
- /package/dist/{rasterize-Y2RLMVCL.js.map → rasterize-MZU5LIA5.js.map} +0 -0
- /package/dist/{redact-doc-PNRDDBI3.js.map → redact-doc-NEUEBXFH.js.map} +0 -0
- /package/dist/{render-S3ALARVO.js.map → render-IL2DYXDP.js.map} +0 -0
- /package/dist/{seal-EJWPS5VK.js.map → seal-O5DKZGTR.js.map} +0 -0
- /package/dist/{setup-JH66VSFZ.js.map → setup-PGOCB7YG.js.map} +0 -0
- /package/dist/{visual-GDXMKDVY.js.map → visual-PYV4ZMLH.js.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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}(?:[^*]|\*(?!\*\*))
|
|
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
|
|
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:
|
|
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 \
|
|
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:
|
|
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
|
|
29230
|
-
if (orig.raw ===
|
|
29231
|
-
applied += handleModifiedUnit(orig,
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
30662
|
+
//# sourceMappingURL=chunk-LQ4IDHET.js.map
|