@clazic/kordoc 2.4.15 → 2.4.16
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/dist/{chunk-YHPNDX7A.js → chunk-QR27D67R.js} +2 -2
- package/dist/{chunk-ZER7GYXK.js → chunk-RH6IBTHH.js} +2 -2
- package/dist/{chunk-ZER7GYXK.js.map → chunk-RH6IBTHH.js.map} +1 -1
- package/dist/cli.js +5 -5
- package/dist/index.cjs +84 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +84 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +2 -2
- package/dist/{utils-ZQA6RCXN.js → utils-HHJDSSR6.js} +2 -2
- package/dist/{watch-ULSOWHFE.js → watch-YAILKKKP.js} +3 -3
- package/package.json +1 -1
- /package/dist/{chunk-YHPNDX7A.js.map → chunk-QR27D67R.js.map} +0 -0
- /package/dist/{utils-ZQA6RCXN.js.map → utils-HHJDSSR6.js.map} +0 -0
- /package/dist/{watch-ULSOWHFE.js.map → watch-YAILKKKP.js.map} +0 -0
package/dist/cli.js
CHANGED
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
markdownToHwpx,
|
|
5
5
|
markdownToXlsx,
|
|
6
6
|
parse
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-RH6IBTHH.js";
|
|
8
8
|
import "./chunk-YW5G6BCJ.js";
|
|
9
9
|
import {
|
|
10
10
|
VERSION,
|
|
11
11
|
toArrayBuffer
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-QR27D67R.js";
|
|
13
13
|
import "./chunk-MOL7MDBG.js";
|
|
14
14
|
import "./chunk-7FMKAV4P.js";
|
|
15
15
|
import "./chunk-34WIGIQC.js";
|
|
@@ -177,7 +177,7 @@ async function runParse(files, opts) {
|
|
|
177
177
|
saveImages(absPath);
|
|
178
178
|
}
|
|
179
179
|
} catch (err) {
|
|
180
|
-
const { sanitizeError } = await import("./utils-
|
|
180
|
+
const { sanitizeError } = await import("./utils-HHJDSSR6.js");
|
|
181
181
|
process.stderr.write(`
|
|
182
182
|
[kordoc] ERROR: ${fileName} \u2014 ${sanitizeError(err)}
|
|
183
183
|
`);
|
|
@@ -259,7 +259,7 @@ program.command("convert <input>").description("\uB9C8\uD06C\uB2E4\uC6B4 \uD30C\
|
|
|
259
259
|
`));
|
|
260
260
|
}
|
|
261
261
|
} catch (err) {
|
|
262
|
-
const { sanitizeError } = await import("./utils-
|
|
262
|
+
const { sanitizeError } = await import("./utils-HHJDSSR6.js");
|
|
263
263
|
process.stderr.write(` FAIL
|
|
264
264
|
`);
|
|
265
265
|
process.stderr.write(` \u2192 ${sanitizeError(err)}
|
|
@@ -291,7 +291,7 @@ program.command("init-env").description("kordoc\uC6A9 .env \uD15C\uD50C\uB9BF \u
|
|
|
291
291
|
}
|
|
292
292
|
});
|
|
293
293
|
program.command("watch <dir>").description("\uB514\uB809\uD1A0\uB9AC \uAC10\uC2DC \u2014 \uC0C8 \uBB38\uC11C \uC790\uB3D9 \uBCC0\uD658").option("--webhook <url>", "\uACB0\uACFC \uC804\uC1A1 \uC6F9\uD6C5 URL").option("-d, --out-dir <dir>", "\uBCC0\uD658 \uACB0\uACFC \uCD9C\uB825 \uB514\uB809\uD1A0\uB9AC").option("-p, --pages <range>", "\uD398\uC774\uC9C0/\uC139\uC158 \uBC94\uC704").option("--format <type>", "\uCD9C\uB825 \uD615\uC2DD: markdown \uB610\uB294 json", "markdown").option("--silent", "\uC9C4\uD589 \uBA54\uC2DC\uC9C0 \uC228\uAE30\uAE30").action(async (dir, opts) => {
|
|
294
|
-
const { watchDirectory } = await import("./watch-
|
|
294
|
+
const { watchDirectory } = await import("./watch-YAILKKKP.js");
|
|
295
295
|
await watchDirectory({
|
|
296
296
|
dir,
|
|
297
297
|
outDir: opts.outDir,
|
package/dist/index.cjs
CHANGED
|
@@ -3138,7 +3138,7 @@ var import_jszip2 = __toESM(require("jszip"), 1);
|
|
|
3138
3138
|
var import_xmldom = require("@xmldom/xmldom");
|
|
3139
3139
|
|
|
3140
3140
|
// src/utils.ts
|
|
3141
|
-
var VERSION = true ? "2.4.
|
|
3141
|
+
var VERSION = true ? "2.4.15" : "0.0.0-dev";
|
|
3142
3142
|
function toArrayBuffer(buf) {
|
|
3143
3143
|
if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {
|
|
3144
3144
|
return buf.buffer;
|
|
@@ -11441,13 +11441,32 @@ async function runUnifiedOcrPipeline(inputPath, options = {}) {
|
|
|
11441
11441
|
currentStage = "render";
|
|
11442
11442
|
markStageStart("render", "PDF \uD398\uC774\uC9C0 \uC774\uBBF8\uC9C0 \uC0DD\uC131 \uC911");
|
|
11443
11443
|
logStage("info", "render", "start", "PDF \uD398\uC774\uC9C0 \uB80C\uB354\uB9C1 \uC2DC\uC791", { pdf: workingPdfPath, dpi });
|
|
11444
|
-
|
|
11444
|
+
const renderWithProgress = await renderPdfToPngWithProgress(
|
|
11445
|
+
workingPdfPath,
|
|
11446
|
+
(0, import_path5.join)(imagesDir, "page"),
|
|
11447
|
+
dpi,
|
|
11448
|
+
(current, total) => {
|
|
11449
|
+
markStageProgress(
|
|
11450
|
+
"render",
|
|
11451
|
+
Math.round(current / total * 100),
|
|
11452
|
+
current,
|
|
11453
|
+
total,
|
|
11454
|
+
`\uD398\uC774\uC9C0 ${current}/${total} \uB80C\uB354\uB9C1`
|
|
11455
|
+
);
|
|
11456
|
+
}
|
|
11457
|
+
);
|
|
11445
11458
|
const images = await listPageImages(imagesDir);
|
|
11446
11459
|
if (images.length === 0) throw new UnifiedOcrError("RENDER_FAILED", "render", "\uD398\uC774\uC9C0 \uC774\uBBF8\uC9C0 \uC0DD\uC131 \uC2E4\uD328: \uACB0\uACFC \uC774\uBBF8\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
11447
|
-
|
|
11460
|
+
if (!renderWithProgress.emittedPerPageProgress) {
|
|
11461
|
+
markStageProgress("render", 100, images.length, images.length, `\uD398\uC774\uC9C0 ${images.length}\uC7A5 \uC0DD\uC131`);
|
|
11462
|
+
}
|
|
11448
11463
|
timingsMs.render = elapsedMs(renderStart);
|
|
11449
11464
|
markStageDone("render", "\uC774\uBBF8\uC9C0 \uC0DD\uC131 \uC644\uB8CC");
|
|
11450
|
-
logStage("info", "render", "done", "\uD398\uC774\uC9C0 \uC774\uBBF8\uC9C0 \uC0DD\uC131 \uC644\uB8CC", {
|
|
11465
|
+
logStage("info", "render", "done", "\uD398\uC774\uC9C0 \uC774\uBBF8\uC9C0 \uC0DD\uC131 \uC644\uB8CC", {
|
|
11466
|
+
pages: images.length,
|
|
11467
|
+
elapsedMs: timingsMs.render,
|
|
11468
|
+
pageCountSource: renderWithProgress.pageCountSource
|
|
11469
|
+
});
|
|
11451
11470
|
const probeStart = import_node_perf_hooks.performance.now();
|
|
11452
11471
|
currentStage = "probe";
|
|
11453
11472
|
markStageStart("probe", "\uBAA8\uB378 \uC18D\uB3C4 \uD504\uB85C\uBE0C \uC218\uD589 \uC911");
|
|
@@ -11645,6 +11664,49 @@ async function renderPdfToPng(pdfPath, prefixPath, dpi) {
|
|
|
11645
11664
|
throw new UnifiedOcrError("RENDER_FAILED", "render", err instanceof Error ? err.message : String(err));
|
|
11646
11665
|
}
|
|
11647
11666
|
}
|
|
11667
|
+
async function getPdfPageCount(pdfPath) {
|
|
11668
|
+
const stdout = await runCommandWithStdout("pdfinfo", [pdfPath]);
|
|
11669
|
+
const m = stdout.match(/^\s*Pages:\s*(\d+)\s*$/mi);
|
|
11670
|
+
if (!m) {
|
|
11671
|
+
throw new Error("pdfinfo \uCD9C\uB825\uC5D0\uC11C \uD398\uC774\uC9C0 \uC218\uB97C \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.");
|
|
11672
|
+
}
|
|
11673
|
+
const n = Number(m[1]);
|
|
11674
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
11675
|
+
throw new Error(`\uC798\uBABB\uB41C \uD398\uC774\uC9C0 \uC218: ${m[1]}`);
|
|
11676
|
+
}
|
|
11677
|
+
return n;
|
|
11678
|
+
}
|
|
11679
|
+
async function renderPdfToPngWithProgress(pdfPath, prefixPath, dpi, onPageDone) {
|
|
11680
|
+
let totalPages = 0;
|
|
11681
|
+
try {
|
|
11682
|
+
totalPages = await getPdfPageCount(pdfPath);
|
|
11683
|
+
} catch {
|
|
11684
|
+
totalPages = 0;
|
|
11685
|
+
}
|
|
11686
|
+
if (totalPages > 0) {
|
|
11687
|
+
try {
|
|
11688
|
+
for (let page = 1; page <= totalPages; page++) {
|
|
11689
|
+
await runCommand("pdftoppm", [
|
|
11690
|
+
"-png",
|
|
11691
|
+
"-r",
|
|
11692
|
+
String(dpi),
|
|
11693
|
+
"-f",
|
|
11694
|
+
String(page),
|
|
11695
|
+
"-l",
|
|
11696
|
+
String(page),
|
|
11697
|
+
pdfPath,
|
|
11698
|
+
prefixPath
|
|
11699
|
+
]);
|
|
11700
|
+
onPageDone(page, totalPages);
|
|
11701
|
+
}
|
|
11702
|
+
return { emittedPerPageProgress: true, pageCountSource: "pdfinfo" };
|
|
11703
|
+
} catch (err) {
|
|
11704
|
+
throw new UnifiedOcrError("RENDER_FAILED", "render", err instanceof Error ? err.message : String(err));
|
|
11705
|
+
}
|
|
11706
|
+
}
|
|
11707
|
+
await renderPdfToPng(pdfPath, prefixPath, dpi);
|
|
11708
|
+
return { emittedPerPageProgress: false, pageCountSource: "fallback" };
|
|
11709
|
+
}
|
|
11648
11710
|
async function runCommand(cmd, args) {
|
|
11649
11711
|
await new Promise((resolvePromise, reject) => {
|
|
11650
11712
|
const child = (0, import_child_process4.spawn)(cmd, args, { stdio: "pipe" });
|
|
@@ -11659,6 +11721,24 @@ async function runCommand(cmd, args) {
|
|
|
11659
11721
|
});
|
|
11660
11722
|
});
|
|
11661
11723
|
}
|
|
11724
|
+
async function runCommandWithStdout(cmd, args) {
|
|
11725
|
+
return await new Promise((resolvePromise, reject) => {
|
|
11726
|
+
const child = (0, import_child_process4.spawn)(cmd, args, { stdio: "pipe" });
|
|
11727
|
+
let stdout = "";
|
|
11728
|
+
let stderr = "";
|
|
11729
|
+
child.stdout.on("data", (d) => {
|
|
11730
|
+
stdout += String(d);
|
|
11731
|
+
});
|
|
11732
|
+
child.stderr.on("data", (d) => {
|
|
11733
|
+
stderr += String(d);
|
|
11734
|
+
});
|
|
11735
|
+
child.on("error", reject);
|
|
11736
|
+
child.on("close", (code) => {
|
|
11737
|
+
if (code === 0) resolvePromise(stdout);
|
|
11738
|
+
else reject(new Error(`${cmd} \uC2E4\uD328 (code=${code}): ${stderr.trim()}`));
|
|
11739
|
+
});
|
|
11740
|
+
});
|
|
11741
|
+
}
|
|
11662
11742
|
async function assertSofficeAvailable() {
|
|
11663
11743
|
try {
|
|
11664
11744
|
await runCommand("soffice", ["--version"]);
|