kordoc 3.10.1 → 3.12.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/README.md +12 -0
- package/dist/{-LPEXY73L.js → -OPZIF3QT.js} +5 -5
- package/dist/{chunk-7UXZTZBJ.cjs → chunk-2C5GCXPJ.cjs} +2 -2
- package/dist/{chunk-7UXZTZBJ.cjs.map → chunk-2C5GCXPJ.cjs.map} +1 -1
- package/dist/{chunk-GFS4QWB6.js → chunk-7Z43WEML.js} +2 -2
- package/dist/{chunk-YXEE3DEQ.js → chunk-BUDM6ULT.js} +2 -2
- package/dist/{chunk-UR34PYAC.js → chunk-ILR7GF3W.js} +2 -2
- package/dist/{chunk-I6CX2RK4.js → chunk-NGKIAZ6G.js} +2 -2
- package/dist/{chunk-RMGYE4LT.js → chunk-RUYSNNYZ.js} +5 -5
- package/dist/cli.js +7 -7
- package/dist/index.cjs +118 -118
- package/dist/index.js +2 -2
- package/dist/mcp.js +5 -5
- package/dist/{parser-LJOS7VZM.js → parser-5FSEFR3R.js} +118 -3
- package/dist/parser-5FSEFR3R.js.map +1 -0
- package/dist/{parser-664URIIW.js → parser-AWEGMHHV.js} +117 -2
- package/dist/parser-AWEGMHHV.js.map +1 -0
- package/dist/{parser-AT22HMF5.cjs → parser-PCTX7LGN.cjs} +129 -14
- package/dist/parser-PCTX7LGN.cjs.map +1 -0
- package/dist/render-ATQNKOT2.js +9 -0
- package/dist/{watch-CZF6NA2V.js → watch-Y7BAYXJE.js} +5 -5
- package/package.json +1 -1
- package/dist/parser-664URIIW.js.map +0 -1
- package/dist/parser-AT22HMF5.cjs.map +0 -1
- package/dist/parser-LJOS7VZM.js.map +0 -1
- package/dist/render-XWOEGE3U.js +0 -9
- /package/dist/{-LPEXY73L.js.map → -OPZIF3QT.js.map} +0 -0
- /package/dist/{chunk-GFS4QWB6.js.map → chunk-7Z43WEML.js.map} +0 -0
- /package/dist/{chunk-YXEE3DEQ.js.map → chunk-BUDM6ULT.js.map} +0 -0
- /package/dist/{chunk-UR34PYAC.js.map → chunk-ILR7GF3W.js.map} +0 -0
- /package/dist/{chunk-I6CX2RK4.js.map → chunk-NGKIAZ6G.js.map} +0 -0
- /package/dist/{chunk-RMGYE4LT.js.map → chunk-RUYSNNYZ.js.map} +0 -0
- /package/dist/{render-XWOEGE3U.js.map → render-ATQNKOT2.js.map} +0 -0
- /package/dist/{watch-CZF6NA2V.js.map → watch-Y7BAYXJE.js.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
sanitizeHref,
|
|
20
20
|
stripDtd,
|
|
21
21
|
toArrayBuffer
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-NGKIAZ6G.js";
|
|
23
23
|
import {
|
|
24
24
|
parsePageRange
|
|
25
25
|
} from "./chunk-GE43BE46.js";
|
|
@@ -25548,7 +25548,7 @@ async function parseHwp(buffer, options) {
|
|
|
25548
25548
|
async function parsePdf(buffer, options) {
|
|
25549
25549
|
let parsePdfDocument;
|
|
25550
25550
|
try {
|
|
25551
|
-
const mod = await import("./parser-
|
|
25551
|
+
const mod = await import("./parser-AWEGMHHV.js");
|
|
25552
25552
|
parsePdfDocument = mod.parsePdfDocument;
|
|
25553
25553
|
} catch {
|
|
25554
25554
|
return {
|
package/dist/mcp.js
CHANGED
|
@@ -10,22 +10,22 @@ import {
|
|
|
10
10
|
parse,
|
|
11
11
|
patchHwp,
|
|
12
12
|
patchHwpx
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-RUYSNNYZ.js";
|
|
14
14
|
import {
|
|
15
15
|
detectFormat,
|
|
16
16
|
detectZipFormat
|
|
17
17
|
} from "./chunk-MEPHGCPQ.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-ILR7GF3W.js";
|
|
19
19
|
import {
|
|
20
20
|
blocksToMarkdown
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-BUDM6ULT.js";
|
|
22
22
|
import "./chunk-MOL7MDBG.js";
|
|
23
23
|
import {
|
|
24
24
|
KordocError,
|
|
25
25
|
VERSION,
|
|
26
26
|
sanitizeError,
|
|
27
27
|
toArrayBuffer
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-7Z43WEML.js";
|
|
29
29
|
|
|
30
30
|
// src/mcp.ts
|
|
31
31
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
@@ -196,7 +196,7 @@ server.tool(
|
|
|
196
196
|
break;
|
|
197
197
|
case "pdf":
|
|
198
198
|
try {
|
|
199
|
-
const { extractPdfMetadataOnly } = await import("./parser-
|
|
199
|
+
const { extractPdfMetadataOnly } = await import("./parser-5FSEFR3R.js");
|
|
200
200
|
metadata = await extractPdfMetadataOnly(buffer);
|
|
201
201
|
} catch {
|
|
202
202
|
metadata = void 0;
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
HEADING_RATIO_H2,
|
|
5
5
|
HEADING_RATIO_H3,
|
|
6
6
|
blocksToMarkdown
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-BUDM6ULT.js";
|
|
8
8
|
import {
|
|
9
9
|
parsePageRange
|
|
10
10
|
} from "./chunk-MOL7MDBG.js";
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
KordocError,
|
|
13
13
|
safeMax,
|
|
14
14
|
safeMin
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-7Z43WEML.js";
|
|
16
16
|
|
|
17
17
|
// src/pdf/line-extract.ts
|
|
18
18
|
import { OPS } from "pdfjs-dist/legacy/build/pdf.mjs";
|
|
@@ -201,10 +201,120 @@ function classifyAndAdd(seg, lineWidth, horizontals, verticals) {
|
|
|
201
201
|
function preprocessLines(horizontals, verticals) {
|
|
202
202
|
let h = horizontals.filter((l) => l.lineWidth <= MAX_LINE_WIDTH);
|
|
203
203
|
let v = verticals.filter((l) => l.lineWidth <= MAX_LINE_WIDTH);
|
|
204
|
+
h = dropShadingStacks(h, "h");
|
|
205
|
+
v = dropShadingStacks(v, "v");
|
|
204
206
|
h = mergeParallelLines(h, "h");
|
|
205
207
|
v = mergeParallelLines(v, "v");
|
|
206
208
|
return { horizontals: h, verticals: v };
|
|
207
209
|
}
|
|
210
|
+
var STACK_GAP = 2;
|
|
211
|
+
var STACK_MIN_LINES = 6;
|
|
212
|
+
function dropShadingStacks(lines, dir) {
|
|
213
|
+
if (lines.length < STACK_MIN_LINES) return lines;
|
|
214
|
+
const groups = /* @__PURE__ */ new Map();
|
|
215
|
+
for (const l of lines) {
|
|
216
|
+
const key = dir === "h" ? `${Math.round(l.x1)}:${Math.round(l.x2)}` : `${Math.round(l.y1)}:${Math.round(l.y2)}`;
|
|
217
|
+
const arr = groups.get(key);
|
|
218
|
+
if (arr) arr.push(l);
|
|
219
|
+
else groups.set(key, [l]);
|
|
220
|
+
}
|
|
221
|
+
const dropped = /* @__PURE__ */ new Set();
|
|
222
|
+
for (const group of groups.values()) {
|
|
223
|
+
if (group.length < STACK_MIN_LINES) continue;
|
|
224
|
+
group.sort((a, b) => dir === "h" ? a.y1 - b.y1 : a.x1 - b.x1);
|
|
225
|
+
let runStart = 0;
|
|
226
|
+
for (let i = 1; i <= group.length; i++) {
|
|
227
|
+
const gap = i < group.length ? dir === "h" ? group[i].y1 - group[i - 1].y1 : group[i].x1 - group[i - 1].x1 : Infinity;
|
|
228
|
+
if (gap < STACK_GAP) continue;
|
|
229
|
+
if (i - runStart >= STACK_MIN_LINES) {
|
|
230
|
+
for (let j = runStart; j < i; j++) dropped.add(group[j]);
|
|
231
|
+
}
|
|
232
|
+
runStart = i;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return dropped.size ? lines.filter((l) => !dropped.has(l)) : lines;
|
|
236
|
+
}
|
|
237
|
+
var EDGE_ALIGN_TOL = 3;
|
|
238
|
+
var EDGE_MIN_RULES = 3;
|
|
239
|
+
var EDGE_MIN_SPAN = 12;
|
|
240
|
+
var EDGE_INSET = 15;
|
|
241
|
+
var EDGE_NEAR = 10;
|
|
242
|
+
var EDGE_CONNECT_TOL = 5;
|
|
243
|
+
var CHAIN_Y_TOL = 1.5;
|
|
244
|
+
var CHAIN_GAP = 3;
|
|
245
|
+
function chainCollinearRules(horizontals) {
|
|
246
|
+
if (horizontals.length <= 1) return horizontals;
|
|
247
|
+
const sorted = [...horizontals].sort((a, b) => a.y1 - b.y1 || a.x1 - b.x1);
|
|
248
|
+
const rules = [];
|
|
249
|
+
let bandStart = 0;
|
|
250
|
+
const flushBand = (end) => {
|
|
251
|
+
const band = sorted.slice(bandStart, end).sort((a, b) => a.x1 - b.x1);
|
|
252
|
+
let cur = { ...band[0] };
|
|
253
|
+
for (let i = 1; i < band.length; i++) {
|
|
254
|
+
const seg = band[i];
|
|
255
|
+
if (seg.x1 - cur.x2 <= CHAIN_GAP) {
|
|
256
|
+
if (seg.x2 > cur.x2) cur.x2 = seg.x2;
|
|
257
|
+
if (seg.lineWidth > cur.lineWidth) cur.lineWidth = seg.lineWidth;
|
|
258
|
+
} else {
|
|
259
|
+
rules.push(cur);
|
|
260
|
+
cur = { ...seg };
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
rules.push(cur);
|
|
264
|
+
};
|
|
265
|
+
for (let i = 1; i <= sorted.length; i++) {
|
|
266
|
+
if (i === sorted.length || sorted[i].y1 - sorted[bandStart].y1 > CHAIN_Y_TOL) {
|
|
267
|
+
flushBand(i);
|
|
268
|
+
bandStart = i;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return rules;
|
|
272
|
+
}
|
|
273
|
+
function closeOpenTableEdges(horizontals, verticals) {
|
|
274
|
+
if (horizontals.length < EDGE_MIN_RULES) return verticals;
|
|
275
|
+
const groups = [];
|
|
276
|
+
for (const hl of chainCollinearRules(horizontals)) {
|
|
277
|
+
let placed = false;
|
|
278
|
+
for (const g2 of groups) {
|
|
279
|
+
if (Math.abs(g2[0].x1 - hl.x1) <= EDGE_ALIGN_TOL && Math.abs(g2[0].x2 - hl.x2) <= EDGE_ALIGN_TOL) {
|
|
280
|
+
g2.push(hl);
|
|
281
|
+
placed = true;
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (!placed) groups.push([hl]);
|
|
286
|
+
}
|
|
287
|
+
const synthesized = [];
|
|
288
|
+
for (const g2 of groups) {
|
|
289
|
+
if (g2.length < EDGE_MIN_RULES) continue;
|
|
290
|
+
let yMin = Infinity, yMax = -Infinity, x1 = 0, x2 = 0;
|
|
291
|
+
for (const hl of g2) {
|
|
292
|
+
if (hl.y1 < yMin) yMin = hl.y1;
|
|
293
|
+
if (hl.y1 > yMax) yMax = hl.y1;
|
|
294
|
+
x1 += hl.x1;
|
|
295
|
+
x2 += hl.x2;
|
|
296
|
+
}
|
|
297
|
+
x1 /= g2.length;
|
|
298
|
+
x2 /= g2.length;
|
|
299
|
+
if (yMax - yMin < EDGE_MIN_SPAN) continue;
|
|
300
|
+
const crossCount = (v) => {
|
|
301
|
+
let n = 0;
|
|
302
|
+
for (const hl of g2) {
|
|
303
|
+
if (v.x1 >= hl.x1 - EDGE_CONNECT_TOL && v.x1 <= hl.x2 + EDGE_CONNECT_TOL && hl.y1 >= v.y1 - EDGE_CONNECT_TOL && hl.y1 <= v.y2 + EDGE_CONNECT_TOL) n++;
|
|
304
|
+
}
|
|
305
|
+
return n;
|
|
306
|
+
};
|
|
307
|
+
const hasInterior = verticals.some((v) => v.x1 > x1 + EDGE_INSET && v.x1 < x2 - EDGE_INSET && crossCount(v) >= 2);
|
|
308
|
+
if (!hasInterior) continue;
|
|
309
|
+
for (const edgeX of [x1, x2]) {
|
|
310
|
+
const closed = verticals.some((v) => Math.abs(v.x1 - edgeX) <= EDGE_NEAR && v.y1 <= yMax + EDGE_CONNECT_TOL && v.y2 >= yMin - EDGE_CONNECT_TOL);
|
|
311
|
+
if (!closed) {
|
|
312
|
+
synthesized.push({ x1: edgeX, y1: yMin, x2: edgeX, y2: yMax, lineWidth: 0.5 });
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return synthesized.length ? [...verticals, ...synthesized] : verticals;
|
|
317
|
+
}
|
|
208
318
|
function mergeParallelLines(lines, dir) {
|
|
209
319
|
if (lines.length <= 1) return lines;
|
|
210
320
|
const sorted = [...lines].sort((a, b) => {
|
|
@@ -2218,6 +2328,10 @@ function detectHeadings(blocks, medianFontSize) {
|
|
|
2218
2328
|
function shouldDemoteTable(table) {
|
|
2219
2329
|
const allCells = table.cells.flatMap((row) => row.map((c) => c.text.trim())).filter(Boolean);
|
|
2220
2330
|
const allText = allCells.join(" ");
|
|
2331
|
+
if (table.rows >= 2 && table.cols >= 2 && table.cells[0].every((c) => {
|
|
2332
|
+
const t = c.text.trim();
|
|
2333
|
+
return t.length > 0 && t.length <= 12 && !/[□■◆○●▶ㅇ<>]/.test(t);
|
|
2334
|
+
}) && table.cells.slice(1).some((row) => row.some((c) => c.text.trim() !== ""))) return false;
|
|
2221
2335
|
if (table.rows <= 3 && table.cols <= 3) {
|
|
2222
2336
|
const totalCells2 = table.rows * table.cols;
|
|
2223
2337
|
const emptyCells2 = totalCells2 - allCells.length;
|
|
@@ -2555,6 +2669,7 @@ function extractPageBlocksWithLines(items, pageNum, opList, pageWidth, pageHeigh
|
|
|
2555
2669
|
let { horizontals, verticals } = extractLines(opList.fnArray, opList.argsArray);
|
|
2556
2670
|
({ horizontals, verticals } = filterPageBorderLines(horizontals, verticals, pageWidth, pageHeight));
|
|
2557
2671
|
({ horizontals, verticals } = preprocessLines(horizontals, verticals));
|
|
2672
|
+
verticals = closeOpenTableEdges(horizontals, verticals);
|
|
2558
2673
|
markStrikethroughItems(items, horizontals);
|
|
2559
2674
|
wrapStrikethroughRuns(items);
|
|
2560
2675
|
const grids = buildTableGrids(horizontals, verticals);
|
|
@@ -3359,4 +3474,4 @@ export {
|
|
|
3359
3474
|
parsePdfDocument,
|
|
3360
3475
|
removeHeaderFooterBlocks
|
|
3361
3476
|
};
|
|
3362
|
-
//# sourceMappingURL=parser-
|
|
3477
|
+
//# sourceMappingURL=parser-5FSEFR3R.js.map
|