@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/cli.js CHANGED
@@ -4,12 +4,12 @@ import {
4
4
  markdownToHwpx,
5
5
  markdownToXlsx,
6
6
  parse
7
- } from "./chunk-ZER7GYXK.js";
7
+ } from "./chunk-RH6IBTHH.js";
8
8
  import "./chunk-YW5G6BCJ.js";
9
9
  import {
10
10
  VERSION,
11
11
  toArrayBuffer
12
- } from "./chunk-YHPNDX7A.js";
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-ZQA6RCXN.js");
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-ZQA6RCXN.js");
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-ULSOWHFE.js");
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.14" : "0.0.0-dev";
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
- await renderPdfToPng(workingPdfPath, (0, import_path5.join)(imagesDir, "page"), dpi);
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
- markStageProgress("render", 100, images.length, images.length, `\uD398\uC774\uC9C0 ${images.length}\uC7A5 \uC0DD\uC131`);
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", { pages: images.length, elapsedMs: timingsMs.render });
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"]);