kordoc 3.2.1 → 3.4.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.
@@ -31,7 +31,7 @@ import {
31
31
  patchHwpxBlocks,
32
32
  renderHtml,
33
33
  scanSectionXml
34
- } from "./chunk-LPKAF45D.js";
34
+ } from "./chunk-YFNBHLLM.js";
35
35
  import {
36
36
  detectFormat,
37
37
  detectOle2Format,
@@ -44,7 +44,7 @@ import {
44
44
  import {
45
45
  VERSION,
46
46
  blocksToMarkdown
47
- } from "./chunk-F4A7OTBT.js";
47
+ } from "./chunk-MHYDBT2Q.js";
48
48
  import "./chunk-MOL7MDBG.js";
49
49
  export {
50
50
  HwpxSession,
@@ -88,4 +88,4 @@ export {
88
88
  renderHtml,
89
89
  scanSectionXml
90
90
  };
91
- //# sourceMappingURL=-NMUBDTYV.js.map
91
+ //# sourceMappingURL=-56JCPGII.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/utils.ts
4
- var VERSION = true ? "3.2.1" : "0.0.0-dev";
4
+ var VERSION = true ? "3.4.0" : "0.0.0-dev";
5
5
  function toArrayBuffer(buf) {
6
6
  if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {
7
7
  return buf.buffer;
@@ -634,4 +634,4 @@ export {
634
634
  HEADING_RATIO_H2,
635
635
  HEADING_RATIO_H3
636
636
  };
637
- //# sourceMappingURL=chunk-F4A7OTBT.js.map
637
+ //# sourceMappingURL=chunk-MHYDBT2Q.js.map
@@ -23,7 +23,7 @@ import {
23
23
  sanitizeHref,
24
24
  stripDtd,
25
25
  toArrayBuffer
26
- } from "./chunk-F4A7OTBT.js";
26
+ } from "./chunk-MHYDBT2Q.js";
27
27
  import {
28
28
  parsePageRange
29
29
  } from "./chunk-MOL7MDBG.js";
@@ -22029,14 +22029,7 @@ async function patchHwp(original, editedMarkdown, options) {
22029
22029
  const editedUnits = splitMarkdownUnits(editedMarkdown);
22030
22030
  const pairs = alignUnits(origUnits.map((u) => u.raw), editedUnits.map((u) => u.raw));
22031
22031
  const paraMap = resolveParaMappings(origBlocks, scans);
22032
- const scanTables = scans.flatMap((s) => s.tables);
22033
- const obTableOrdinals = /* @__PURE__ */ new Map();
22034
- {
22035
- let ordinal = 0;
22036
- for (let i = 0; i < origBlocks.length; i++) {
22037
- if (origBlocks[i].type === "table" && origBlocks[i].table) obTableOrdinals.set(i, ordinal++);
22038
- }
22039
- }
22032
+ const tableMap = resolveTableMappings(origBlocks, scans.flatMap((s) => s.tables));
22040
22033
  for (const [oi, ei] of pairs) {
22041
22034
  if (oi !== null && ei !== null) {
22042
22035
  const orig = origUnits[oi];
@@ -22046,8 +22039,7 @@ async function patchHwp(original, editedMarkdown, options) {
22046
22039
  origBlocks,
22047
22040
  paraMap,
22048
22041
  scans,
22049
- scanTables,
22050
- obTableOrdinals,
22042
+ tableMap,
22051
22043
  skipped
22052
22044
  });
22053
22045
  } else if (oi !== null) {
@@ -22132,6 +22124,46 @@ function resolveParaMappings(blocks, scans) {
22132
22124
  }
22133
22125
  return result;
22134
22126
  }
22127
+ function resolveTableMappings(blocks, scanTables) {
22128
+ const result = /* @__PURE__ */ new Map();
22129
+ let si = 0;
22130
+ for (let i = 0; i < blocks.length; i++) {
22131
+ const table = blocks[i].table;
22132
+ if (blocks[i].type !== "table" || !table) continue;
22133
+ const cands = [];
22134
+ for (let k = si; k < scanTables.length; k++) {
22135
+ if (scanTables[k].rows === table.rows && scanTables[k].cols === table.cols) cands.push(k);
22136
+ }
22137
+ if (cands.length === 0) continue;
22138
+ let pick = cands[0];
22139
+ if (cands.length > 1) {
22140
+ let best = tableContentScore(table, scanTables[cands[0]]);
22141
+ for (let ci = 1; ci < cands.length; ci++) {
22142
+ const sc = tableContentScore(table, scanTables[cands[ci]]);
22143
+ if (sc > best) {
22144
+ best = sc;
22145
+ pick = cands[ci];
22146
+ }
22147
+ }
22148
+ }
22149
+ result.set(i, scanTables[pick]);
22150
+ si = pick + 1;
22151
+ }
22152
+ return result;
22153
+ }
22154
+ function tableContentScore(irTable, scanTable) {
22155
+ let matched = 0;
22156
+ for (const [key, scanCell] of scanTable.cells) {
22157
+ const comma = key.indexOf(",");
22158
+ const r = Number(key.slice(0, comma)), c = Number(key.slice(comma + 1));
22159
+ const irCell = irTable.cells[r]?.[c];
22160
+ if (!irCell) continue;
22161
+ const a = normForMatch(scanCell.paras.map((p) => p.rawText).join(" "));
22162
+ const b = normForMatch(stripCellTokens(irCell.text));
22163
+ if (a && a === b) matched++;
22164
+ }
22165
+ return matched;
22166
+ }
22135
22167
  function handleModified(orig, edited, ctx) {
22136
22168
  const block = ctx.origBlocks[orig.blockIdx];
22137
22169
  const skip = (reason) => {
@@ -22144,12 +22176,10 @@ function handleModified(orig, edited, ctx) {
22144
22176
  if (orig.fragment) return skip("\uBB38\uB2E8 \uBD84\uC808(\uAC15\uC81C \uC904\uBC14\uAFC8/\uBCD1\uD569 \uC720\uB2DB) \u2014 \uBD80\uBD84 \uC218\uC815\uC740 \uBBF8\uC9C0\uC6D0 (v1)");
22145
22177
  if (block.type === "table" && block.table) {
22146
22178
  if (orig.kind !== edited.kind) return skip("\uD45C \u2194 \uBE44\uD45C \uBCC0\uACBD\uC740 \uBBF8\uC9C0\uC6D0 (\uD45C \uAD6C\uC870 \uBCC0\uACBD)");
22147
- if (ctx.obTableOrdinals.size !== ctx.scanTables.length) return skip("\uD45C \uAC1C\uC218 \uBD88\uC77C\uCE58 \u2014 \uC18C\uC2A4\uB9F5 \uC2E0\uB8B0 \uBD88\uAC00");
22148
- const ordinal = ctx.obTableOrdinals.get(orig.blockIdx);
22149
- const scanTable = ordinal !== void 0 ? ctx.scanTables[ordinal] : void 0;
22150
- if (!scanTable) return skip("\uD45C \uC18C\uC2A4\uB9F5 \uB9E4\uD551 \uC2E4\uD328");
22179
+ const scanTable = ctx.tableMap.get(orig.blockIdx);
22180
+ if (!scanTable) return skip("\uD45C \uC18C\uC2A4\uB9F5 \uB9E4\uD551 \uC2E4\uD328 \u2014 \uD45C \uAC1C\uC218/\uAD6C\uC870 \uBD88\uC77C\uCE58\uB85C \uC2E0\uB8B0 \uBD88\uAC00");
22151
22181
  if (orig.kind === "gfm-table") return patchGfmCells(scanTable, orig, edited, ctx, skip);
22152
- if (orig.kind === "html-table") return skip("HTML \uD45C(\uBCD1\uD569/\uC904\uBC14\uAFC8 \uC140) \uC218\uC815\uC740 HWP5 \uBBF8\uC9C0\uC6D0 (v1)");
22182
+ if (orig.kind === "html-table") return patchHtmlCells5(block.table, scanTable, orig, edited, ctx, skip);
22153
22183
  return patchTextChunk5(block.table, scanTable, orig, edited, ctx, skip);
22154
22184
  }
22155
22185
  if ((block.type === "paragraph" || block.type === "heading") && orig.kind === "text" && edited.kind === "text") {
@@ -22206,35 +22236,87 @@ function patchGfmCells(scanTable, orig, edited, ctx, skip) {
22206
22236
  ctx.skipped.push({ reason, before: summarize(origRows[r][c]), after: summarize(editedRows[r][c]) });
22207
22237
  return 0;
22208
22238
  };
22209
- const before = gfmCellToPlain(origRows[r][c]);
22210
- const after = gfmCellToPlain(editedRows[r][c]);
22211
- if (before === null || after === null) {
22212
- cellSkip("\uC11C\uC2DD/\uB9C1\uD06C/\uC774\uBBF8\uC9C0 \uD3EC\uD568 \uC140 \uC218\uC815\uC740 \uBBF8\uC9C0\uC6D0 (v1)");
22213
- continue;
22214
- }
22215
- if (after.includes("\n")) {
22216
- cellSkip("\uC140 \uB0B4 \uC904\uBC14\uAFC8 \uCD94\uAC00\uB294 \uBBF8\uC9C0\uC6D0 (v1)");
22217
- continue;
22218
- }
22219
22239
  const cell = scanTable.cells.get(`${r},${c}`);
22220
22240
  if (!cell) {
22221
22241
  cellSkip("\uBCD1\uD569 \uC601\uC5ED \uC140 \u2014 \uC575\uCEE4 \uC140\uC774 \uC544\uB2C8\uBBC0\uB85C \uBBF8\uC9C0\uC6D0");
22222
22242
  continue;
22223
22243
  }
22224
- if (cell.paras.length !== 1) {
22225
- cellSkip("\uBCF5\uC218 \uBB38\uB2E8 \uC140 \uC218\uC815\uC740 \uBBF8\uC9C0\uC6D0 (v1)");
22244
+ const beforeParts = origRows[r][c].split(/<br\s*\/?>/i);
22245
+ const afterParts = editedRows[r][c].split(/<br\s*\/?>/i);
22246
+ if (beforeParts.length !== cell.paras.length || afterParts.length !== cell.paras.length) {
22247
+ cellSkip("\uC140 \uBB38\uB2E8 \uC218 \uBCC0\uACBD \u2014 \uBBF8\uC9C0\uC6D0 (\uBB38\uB2E8 \uCD94\uAC00/\uC0AD\uC81C)");
22226
22248
  continue;
22227
22249
  }
22228
- const para = cell.paras[0];
22229
- if (normForMatch(para.rawText) !== normForMatch(before)) {
22230
- cellSkip("\uC140 \uD14D\uC2A4\uD2B8 \uBD88\uC77C\uCE58 \u2014 \uC18C\uC2A4\uB9F5 \uC2E0\uB8B0 \uBD88\uAC00");
22231
- continue;
22250
+ for (let k = 0; k < cell.paras.length; k++) {
22251
+ const before = gfmCellToPlain(beforeParts[k]);
22252
+ const after = gfmCellToPlain(afterParts[k]);
22253
+ if (before === null || after === null) {
22254
+ cellSkip("\uC11C\uC2DD/\uB9C1\uD06C/\uC774\uBBF8\uC9C0 \uD3EC\uD568 \uC140 \uC218\uC815\uC740 \uBBF8\uC9C0\uC6D0 (v1)");
22255
+ break;
22256
+ }
22257
+ if (before === after) continue;
22258
+ if (after.includes("\n")) {
22259
+ cellSkip("\uC140 \uB0B4 \uC904\uBC14\uAFC8 \uCD94\uAC00\uB294 \uBBF8\uC9C0\uC6D0 (v1)");
22260
+ break;
22261
+ }
22262
+ const para = cell.paras[k];
22263
+ if (normForMatch(para.rawText) !== normForMatch(before)) {
22264
+ cellSkip("\uC140 \uD14D\uC2A4\uD2B8 \uBD88\uC77C\uCE58 \u2014 \uC18C\uC2A4\uB9F5 \uC2E0\uB8B0 \uBD88\uAC00");
22265
+ break;
22266
+ }
22267
+ if (sanitizeText(after) !== after) {
22268
+ cellSkip("\uACF5\uBC31 \uC815\uADDC\uD654 \uBD88\uC548\uC815 \uD14D\uC2A4\uD2B8 \u2014 \uBBF8\uC9C0\uC6D0");
22269
+ break;
22270
+ }
22271
+ applied += stageParaPatch(ctx.scans[para.sectionIndex], para, after, cellSkip);
22232
22272
  }
22233
- if (sanitizeText(after) !== after) {
22234
- cellSkip("\uACF5\uBC31 \uC815\uADDC\uD654 \uBD88\uC548\uC815 \uD14D\uC2A4\uD2B8 \u2014 \uBBF8\uC9C0\uC6D0");
22273
+ }
22274
+ }
22275
+ return applied;
22276
+ }
22277
+ function extractImgTags5(inner) {
22278
+ return (inner.match(/<img\s(?:"[^"]*"|'[^']*'|[^>"'])*?>/gi) || []).join(" ");
22279
+ }
22280
+ function patchHtmlCells5(table, scanTable, orig, edited, ctx, skip) {
22281
+ if (replicateTableToHtml(table) !== orig.raw) return skip("\uD45C \uC88C\uD45C \uC7AC\uD604 \uBD88\uC77C\uCE58 \u2014 \uB9E4\uD551 \uC2E0\uB8B0 \uBD88\uAC00");
22282
+ const replica = replicateHtmlTable(table);
22283
+ const origRows = parseHtmlTable(orig.raw);
22284
+ if (!origRows || origRows.length !== replica.length || origRows.some((r, i) => r.cells.length !== replica[i].cells.length || r.cells.some((c, j) => c.inner !== replica[i].cells[j].inner))) {
22285
+ return skip("\uC140 \uACBD\uACC4 \uBAA8\uD638 (\uB9AC\uD130\uB7F4 \uD0DC\uADF8 \uC758\uC2EC) \u2014 \uB9E4\uD551 \uC2E0\uB8B0 \uBD88\uAC00");
22286
+ }
22287
+ const editedRows = parseHtmlTable(edited.raw);
22288
+ if (!editedRows) return skip("\uD3B8\uC9D1\uB41C HTML \uD45C \uD30C\uC2F1 \uC2E4\uD328");
22289
+ if (editedRows.length !== replica.length) return skip("\uD45C \uD589 \uCD94\uAC00/\uC0AD\uC81C\uB294 \uBBF8\uC9C0\uC6D0 (\uD45C \uAD6C\uC870 \uBCC0\uACBD)");
22290
+ let applied = 0;
22291
+ for (let r = 0; r < replica.length; r++) {
22292
+ if (editedRows[r].cells.length !== replica[r].cells.length) {
22293
+ skip(`\uD45C ${r + 1}\uD589 \uC140 \uC218 \uBCC0\uACBD\uC740 \uBBF8\uC9C0\uC6D0`);
22294
+ continue;
22295
+ }
22296
+ for (let c = 0; c < replica[r].cells.length; c++) {
22297
+ const oc = replica[r].cells[c];
22298
+ const ec = editedRows[r].cells[c];
22299
+ if (oc.colSpan !== ec.colSpan || oc.rowSpan !== ec.rowSpan) {
22300
+ skip("\uC140 \uBCD1\uD569(colspan/rowspan) \uBCC0\uACBD\uC740 \uBBF8\uC9C0\uC6D0");
22235
22301
  continue;
22236
22302
  }
22237
- applied += stageParaPatch(ctx.scans[para.sectionIndex], para, after, cellSkip);
22303
+ if (oc.inner === ec.inner) continue;
22304
+ const origContent = htmlCellInnerToLines(oc.inner);
22305
+ const editedContent = htmlCellInnerToLines(ec.inner);
22306
+ if (origContent.hadNonText || editedContent.hadNonText) {
22307
+ if (extractImgTags5(oc.inner) !== extractImgTags5(ec.inner)) {
22308
+ skip("\uC140 \uB0B4 \uC774\uBBF8\uC9C0 \uBCC0\uACBD\uC740 \uBBF8\uC9C0\uC6D0");
22309
+ continue;
22310
+ }
22311
+ if (extractTopLevelTables(oc.inner).join("\n") !== extractTopLevelTables(ec.inner).join("\n")) {
22312
+ skip("\uC140 \uB0B4 \uC911\uCCA9\uD45C \uC218\uC815\uC740 HWP5 \uBBF8\uC9C0\uC6D0 (v1)");
22313
+ continue;
22314
+ }
22315
+ }
22316
+ if (origContent.lines.join("\n") !== editedContent.lines.join("\n")) {
22317
+ const newLines = editedContent.lines.map((l) => unescapeGfm(l));
22318
+ applied += applyCellEdit5(table, scanTable, oc.gridR, oc.gridC, newLines, ctx, oc.inner, ec.inner, origContent.lines.length);
22319
+ }
22238
22320
  }
22239
22321
  }
22240
22322
  return applied;
@@ -22326,15 +22408,103 @@ function gfmCellToPlain(md2) {
22326
22408
  let t = md2.trim();
22327
22409
  const bold = t.match(/^\*\*([\s\S]+)\*\*$/);
22328
22410
  if (bold) t = bold[1];
22329
- if (/[*`]|!\[|\]\(|<(?!br\s*\/?>)/i.test(t)) return null;
22411
+ if (/[*`]|!\[|\]\(/.test(t)) return null;
22412
+ if (/<(?!br\s*\/?>)[a-zA-Z/]/i.test(t)) return null;
22330
22413
  return unescapeGfm(unescapeGfmCell(t));
22331
22414
  }
22332
- var PARA_BREAK = Buffer.from([13, 0]);
22415
+ function splitParaText(data) {
22416
+ const toks = [];
22417
+ let i = 0;
22418
+ while (i + 1 < data.length) {
22419
+ const ch = data.readUInt16LE(i);
22420
+ const start = i;
22421
+ i += 2;
22422
+ if (ch >= 32) {
22423
+ let units = 1;
22424
+ if (ch >= 55296 && ch <= 56319 && i + 1 < data.length) {
22425
+ const lo = data.readUInt16LE(i);
22426
+ if (lo >= 56320 && lo <= 57343) {
22427
+ i += 2;
22428
+ units = 2;
22429
+ }
22430
+ }
22431
+ toks.push({ start, end: i, units, plain: true, visible: true });
22432
+ continue;
22433
+ }
22434
+ switch (ch) {
22435
+ case 0:
22436
+ case 24:
22437
+ case 25:
22438
+ case 30:
22439
+ case 31:
22440
+ toks.push({ start, end: i, units: 1, plain: false, visible: true });
22441
+ break;
22442
+ case 9:
22443
+ if (i + 14 <= data.length) i += 14;
22444
+ toks.push({ start, end: i, units: 1, plain: false, visible: true });
22445
+ break;
22446
+ case 13:
22447
+ toks.push({ start, end: i, units: 1, plain: false, visible: false });
22448
+ break;
22449
+ case 10:
22450
+ if (i + 16 <= data.length && data.readUInt16LE(i) === 11) {
22451
+ i += 16;
22452
+ toks.push({ start, end: i, units: 1, plain: false, visible: false });
22453
+ } else {
22454
+ if (i + 14 <= data.length) i += 14;
22455
+ toks.push({ start, end: i, units: 1, plain: false, visible: true });
22456
+ }
22457
+ break;
22458
+ default: {
22459
+ const ext = isExtendedOnlyCtrlChar(ch);
22460
+ const inl = ch >= 4 && ch <= 9 || ch >= 19 && ch <= 20;
22461
+ if ((ext || inl) && i + 14 <= data.length) i += 14;
22462
+ toks.push({ start, end: i, units: 1, plain: false, visible: false });
22463
+ break;
22464
+ }
22465
+ }
22466
+ }
22467
+ if (i !== data.length) return null;
22468
+ let firstP = -1, lastP = -1;
22469
+ for (let k = 0; k < toks.length; k++) if (toks[k].plain) {
22470
+ if (firstP < 0) firstP = k;
22471
+ lastP = k;
22472
+ }
22473
+ if (firstP < 0) return null;
22474
+ for (let k = firstP; k <= lastP; k++) if (!toks[k].plain) return null;
22475
+ for (let k = 0; k < firstP; k++) if (toks[k].visible) return null;
22476
+ for (let k = lastP + 1; k < toks.length; k++) if (toks[k].visible) return null;
22477
+ const prefixEnd = toks[firstP].start;
22478
+ const coreEnd = toks[lastP].end;
22479
+ const prefixUnits = prefixEnd / 2;
22480
+ const suffixUnits = (data.length - coreEnd) / 2;
22481
+ return {
22482
+ prefix: data.subarray(0, prefixEnd),
22483
+ prefixUnits,
22484
+ core: data.subarray(prefixEnd, coreEnd).toString("utf16le"),
22485
+ suffix: data.subarray(coreEnd),
22486
+ suffixUnits
22487
+ };
22488
+ }
22489
+ function rebuildCharShape(csData, coreStartUnit) {
22490
+ const pairs = [];
22491
+ for (let o = 0; o + 8 <= csData.length; o += 8) pairs.push([csData.readUInt32LE(o), csData.readUInt32LE(o + 4)]);
22492
+ if (pairs.length === 0) return { buf: Buffer.from(csData.subarray(0, 8)), count: 1 };
22493
+ let coreId = pairs[0][1];
22494
+ for (const [p, id] of pairs) if (p <= coreStartUnit) coreId = id;
22495
+ const kept = pairs.filter(([p]) => p < coreStartUnit);
22496
+ if (kept.length === 0 || kept[kept.length - 1][1] !== coreId) kept.push([coreStartUnit, coreId]);
22497
+ const buf = Buffer.alloc(kept.length * 8);
22498
+ kept.forEach(([p, id], k) => {
22499
+ buf.writeUInt32LE(p >>> 0, k * 8);
22500
+ buf.writeUInt32LE(id >>> 0, k * 8 + 4);
22501
+ });
22502
+ return { buf, count: kept.length };
22503
+ }
22333
22504
  function stageParaPatch(scan, para, newPlain, skip) {
22334
22505
  if (!scan.safe) return skip("\uC139\uC158 \uB808\uCF54\uB4DC \uC7AC\uC9C1\uB82C\uD654 \uBD88\uC77C\uCE58 \u2014 \uC548\uC804\uC744 \uC704\uD574 \uC774 \uC139\uC158\uC740 \uBBF8\uC9C0\uC6D0");
22335
22506
  if (para.textIdx === -1) return skip("\uBE48 \uBB38\uB2E8 \uD14D\uC2A4\uD2B8 \uCD94\uAC00\uB294 \uBBF8\uC9C0\uC6D0 (v1)");
22336
22507
  if (para.textIdx === -2) return skip("\uBCF5\uC218 PARA_TEXT \uB808\uCF54\uB4DC \uBB38\uB2E8 \u2014 \uBBF8\uC9C0\uC6D0 (v1)");
22337
- if (para.ctrlMask !== 0) return skip("\uCEE8\uD2B8\uB864 \uBB38\uC790 \uD3EC\uD568 \uBB38\uB2E8(\uD0ED/\uAC1C\uCCB4/\uD544\uB4DC/\uD2B9\uC218\uACF5\uBC31) \u2014 \uBBF8\uC9C0\uC6D0 (v1)");
22338
22508
  if (para.rangeTagCount > 0) return skip("\uBC94\uC704 \uD0DC\uADF8(\uD615\uAD11\uD39C/\uAD50\uC815\uBD80\uD638) \uBB38\uB2E8 \u2014 \uBBF8\uC9C0\uC6D0 (v1)");
22339
22509
  if (para.charShapeIdx < 0 || para.lineSegIdx < 0) return skip("\uBB38\uB2E8 \uB808\uCF54\uB4DC \uAD6C\uC131 \uBE44\uC815\uD615 \u2014 \uBBF8\uC9C0\uC6D0");
22340
22510
  if (scan.repl.has(para.headerIdx)) return skip("\uB3D9\uC77C \uBB38\uB2E8 \uC911\uBCF5 \uC218\uC815 \u2014 \uCCAB \uC218\uC815\uB9CC \uC801\uC6A9");
@@ -22343,36 +22513,25 @@ function stageParaPatch(scan, para, newPlain, skip) {
22343
22513
  const headerRec = records[para.headerIdx];
22344
22514
  const textRec = records[para.textIdx];
22345
22515
  const charShapeRec = records[para.charShapeIdx];
22346
- const lineSegRec = records[para.lineSegIdx];
22347
- if (charShapeRec.data.length < 8 || lineSegRec.data.length < 36) {
22348
- return skip("CHAR_SHAPE/LINE_SEG \uB808\uCF54\uB4DC \uBE44\uC815\uD615 \u2014 \uBBF8\uC9C0\uC6D0");
22516
+ if (charShapeRec.data.length < 8) {
22517
+ return skip("CHAR_SHAPE \uB808\uCF54\uB4DC \uBE44\uC815\uD615 \u2014 \uBBF8\uC9C0\uC6D0");
22518
+ }
22519
+ const seg = splitParaText(textRec.data);
22520
+ if (!seg) {
22521
+ return skip(para.ctrlMask !== 0 ? "\uCEE8\uD2B8\uB864 \uBB38\uC790(\uD0ED/\uD544\uB4DC/\uD2B9\uC218\uACF5\uBC31 \uB4F1 \uD14D\uC2A4\uD2B8 \uC911\uAC04) \uD3EC\uD568 \uBB38\uB2E8 \u2014 \uBBF8\uC9C0\uC6D0 (v1)" : "PARA_TEXT \uC7AC\uAD6C\uC131 \uBD88\uC77C\uCE58 \u2014 \uC6D0\uBB38 \uBCF4\uC874 \uBD88\uAC00\uB85C \uBBF8\uC9C0\uC6D0");
22349
22522
  }
22350
- const hadBreak = textRec.data.length >= 2 && textRec.data.readUInt16LE(textRec.data.length - 2) === 13;
22351
- const expect = hadBreak ? Buffer.concat([Buffer.from(para.rawText, "utf16le"), PARA_BREAK]) : Buffer.from(para.rawText, "utf16le");
22352
- if (!expect.equals(textRec.data)) return skip("PARA_TEXT \uC7AC\uAD6C\uC131 \uBD88\uC77C\uCE58 \u2014 \uC6D0\uBB38 \uBCF4\uC874 \uBD88\uAC00\uB85C \uBBF8\uC9C0\uC6D0");
22523
+ if (seg.core !== para.rawText) return skip("PARA_TEXT \uC7AC\uAD6C\uC131 \uBD88\uC77C\uCE58 \u2014 \uC6D0\uBB38 \uBCF4\uC874 \uBD88\uAC00\uB85C \uBBF8\uC9C0\uC6D0");
22353
22524
  const lead = para.rawText.match(/^\s*/)[0];
22354
22525
  const trail = para.rawText.match(/\s*$/)[0];
22355
22526
  const newRaw = para.rawText.trim() === para.rawText ? newPlain : lead + newPlain + trail;
22356
- const newText = hadBreak ? Buffer.concat([Buffer.from(newRaw, "utf16le"), PARA_BREAK]) : Buffer.from(newRaw, "utf16le");
22527
+ const newText = Buffer.concat([seg.prefix, Buffer.from(newRaw, "utf16le"), seg.suffix]);
22357
22528
  scan.repl.set(para.textIdx, newText);
22358
22529
  const newHeader = Buffer.from(headerRec.data);
22359
- const nChars = newRaw.length + (hadBreak ? 1 : 0);
22530
+ const nChars = seg.prefixUnits + newRaw.length + seg.suffixUnits;
22360
22531
  newHeader.writeUInt32LE((para.nCharsRaw & 2147483648 | nChars) >>> 0, 0);
22361
- if (charShapeRec.data.length > 8) {
22362
- newHeader.writeUInt16LE(1, 12);
22363
- scan.repl.set(para.charShapeIdx, Buffer.from(charShapeRec.data.subarray(0, 8)));
22364
- }
22365
- const csData = scan.repl.get(para.charShapeIdx) ?? Buffer.from(charShapeRec.data);
22366
- if (csData.readUInt32LE(0) !== 0) {
22367
- csData.writeUInt32LE(0, 0);
22368
- scan.repl.set(para.charShapeIdx, csData);
22369
- }
22370
- if (lineSegRec.data.length > 36 || lineSegRec.data.readUInt32LE(0) !== 0) {
22371
- const seg = Buffer.from(lineSegRec.data.subarray(0, 36));
22372
- seg.writeUInt32LE(0, 0);
22373
- newHeader.writeUInt16LE(1, 16);
22374
- scan.repl.set(para.lineSegIdx, seg);
22375
- }
22532
+ const cs = rebuildCharShape(charShapeRec.data, seg.prefixUnits);
22533
+ scan.repl.set(para.charShapeIdx, cs.buf);
22534
+ newHeader.writeUInt16LE(cs.count, 12);
22376
22535
  scan.repl.set(para.headerIdx, newHeader);
22377
22536
  return 1;
22378
22537
  }
@@ -22961,7 +23120,7 @@ async function parseHwp(buffer, options) {
22961
23120
  async function parsePdf(buffer, options) {
22962
23121
  let parsePdfDocument;
22963
23122
  try {
22964
- const mod = await import("./parser-HC5NXB3F.js");
23123
+ const mod = await import("./parser-PQDICHD5.js");
22965
23124
  parsePdfDocument = mod.parsePdfDocument;
22966
23125
  } catch {
22967
23126
  return {
@@ -23086,4 +23245,4 @@ export {
23086
23245
  parseHwpml,
23087
23246
  fillForm
23088
23247
  };
23089
- //# sourceMappingURL=chunk-LPKAF45D.js.map
23248
+ //# sourceMappingURL=chunk-YFNBHLLM.js.map