kordoc 4.24.0 → 4.24.1
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 +26 -54
- package/dist/{-VEOO4BOM.js → -TSN4SWFV.js} +11 -11
- package/dist/{chunk-ENCAYXDI.js → chunk-2SMANR76.js} +4 -4
- package/dist/{chunk-GEY6ZMXH.js → chunk-4BCQ3FQS.js} +43 -23
- package/dist/{chunk-GEY6ZMXH.js.map → chunk-4BCQ3FQS.js.map} +1 -1
- package/dist/{chunk-OHDGEGDJ.cjs → chunk-4VNIEHWM.cjs} +23 -23
- package/dist/chunk-4VNIEHWM.cjs.map +1 -0
- package/dist/{chunk-Z62PHCSU.js → chunk-5EP6VFP5.js} +3 -3
- package/dist/{chunk-IHNIPVPJ.cjs → chunk-5QBTJ4LA.cjs} +6 -6
- package/dist/chunk-5QBTJ4LA.cjs.map +1 -0
- package/dist/{chunk-4VPN5MHS.js → chunk-6H7D4QTM.js} +2 -2
- package/dist/{chunk-G4HWEM6Q.js → chunk-AJ3DJSO6.js} +4 -4
- package/dist/{chunk-P35SCAJN.js → chunk-B77K6J3U.js} +2 -2
- package/dist/{chunk-DBPDAG7N.js → chunk-BIVO2GMU.js} +2 -2
- package/dist/{chunk-6YDPTTIY.js → chunk-G7SKCXQG.js} +2 -2
- package/dist/chunk-GS7T56RP.cjs.map +1 -1
- package/dist/{chunk-PX6X4YOR.js → chunk-HP24FYLJ.js} +4 -4
- package/dist/chunk-J55UQC5H.cjs.map +1 -1
- package/dist/{chunk-FHFPQ6MX.cjs → chunk-JSI5T77E.cjs} +24 -24
- package/dist/chunk-JSI5T77E.cjs.map +1 -0
- package/dist/{chunk-DZT3CHNZ.cjs → chunk-KGOVG47P.cjs} +3 -3
- package/dist/chunk-KGOVG47P.cjs.map +1 -0
- package/dist/{chunk-55DOBEGD.js → chunk-L2OJUIII.js} +2 -2
- package/dist/{chunk-CKCJU42Y.js → chunk-LBPUPT6S.js} +6 -6
- package/dist/{chunk-ZGNHJCDR.js → chunk-LEL5UBGR.js} +2 -2
- package/dist/{chunk-O2SLKE4L.js → chunk-LEUS275C.js} +2 -2
- package/dist/{chunk-DM5YPONO.js → chunk-MI25BZSU.js} +2 -2
- package/dist/{chunk-OJISMR2Z.js → chunk-NAPPGU3W.js} +2 -2
- package/dist/{chunk-DKWEZWCF.cjs → chunk-RIQVVWVF.cjs} +3 -3
- package/dist/chunk-RIQVVWVF.cjs.map +1 -0
- package/dist/{chunk-EN3PK6OT.js → chunk-RS2Q64N5.js} +2 -2
- package/dist/{chunk-XLY5ZJRP.js → chunk-RVKOFZAT.js} +2 -2
- package/dist/{chunk-H5PDQ66I.js → chunk-SWCO5NP6.js} +3 -3
- package/dist/chunk-TK3FDAEE.cjs.map +1 -1
- package/dist/{chunk-HOXHBG4C.cjs → chunk-TYXXTWPH.cjs} +2 -2
- package/dist/chunk-TYXXTWPH.cjs.map +1 -0
- package/dist/{chunk-IZYYKE5F.js → chunk-V2GW3M2F.js} +2 -2
- package/dist/{chunk-P6FNIU5P.js → chunk-W4P3QPSB.js} +2 -2
- package/dist/{chunk-3M2BIQLZ.js → chunk-WYYUWBTS.js} +2 -2
- package/dist/{chunk-Z5G6QNVH.js → chunk-YE4T2P6F.js} +2 -2
- package/dist/{chunk-SRUBDR3Z.js → chunk-ZR3BPESP.js} +3 -3
- package/dist/chunks-HPPVNSBT.js +10 -0
- package/dist/cli.js +41 -30
- package/dist/cli.js.map +1 -1
- package/dist/{formula-R3OWFGCZ.cjs → formula-5DGAZK6N.cjs} +9 -9
- package/dist/formula-5DGAZK6N.cjs.map +1 -0
- package/dist/{formula-4GRNVWIQ.js → formula-6J26PNHL.js} +4 -4
- package/dist/{formula-6Y467S4R.js → formula-PNZX2ZAZ.js} +3 -3
- package/dist/{image-ocr-EBKG45KF.cjs → image-ocr-I4PGBAJ7.cjs} +17 -17
- package/dist/image-ocr-I4PGBAJ7.cjs.map +1 -0
- package/dist/{image-ocr-ZLL66KNO.js → image-ocr-RPHNFU7I.js} +6 -6
- package/dist/{image-ocr-CGJJCD4E.js → image-ocr-UNTKJLQL.js} +9 -9
- package/dist/index.cjs +616 -596
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +38 -18
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +36 -33
- package/dist/mcp.js.map +1 -1
- package/dist/{model-bundle-RD4KSNTB.js → model-bundle-ZSDEJFA7.js} +5 -5
- package/dist/{models-OLGCZBXI.js → models-JS66XYKO.js} +5 -5
- package/dist/page-range-QHHFTL7X.cjs.map +1 -1
- package/dist/{parse-worker-v2-YZY2GQY5.js → parse-worker-v2-JHPEY3MI.js} +20 -13
- package/dist/parse-worker-v2-JHPEY3MI.js.map +1 -0
- package/dist/{parser-J22QBXPP.js → parser-N64TUIWU.js} +9 -9
- package/dist/{parser-DX4I3GT7.cjs → parser-NMV5GTKC.cjs} +157 -157
- package/dist/parser-NMV5GTKC.cjs.map +1 -0
- package/dist/{parser-IHCFHLHN.js → parser-YKATDDQV.js} +12 -12
- package/dist/pdf-ocr-JXK752RC.cjs +31 -0
- package/dist/pdf-ocr-JXK752RC.cjs.map +1 -0
- package/dist/{pdf-ocr-TYIH23RP.js → pdf-ocr-KTKR2JQH.js} +9 -9
- package/dist/{pdf-ocr-H2247ZZH.js → pdf-ocr-W3LDJYCA.js} +6 -6
- package/dist/{profile-io-GH3TYTNJ.js → profile-io-JRODOL7A.js} +3 -3
- package/dist/{rasterize-7TFTVFMB.js → rasterize-2DMR7RGP.js} +3 -3
- package/dist/{redact-doc-DSSQOO3A.js → redact-doc-TC6QSTPM.js} +11 -11
- package/dist/{render-NKXZQINI.js → render-WEUU5EDS.js} +7 -7
- package/dist/seal-LSALFURW.js +10 -0
- package/dist/{setup-JVLMX2TH.js → setup-LKJKGMKJ.js} +3 -3
- package/dist/visual-PHZHJRY5.js +21 -0
- package/dist/{watch-5RZVHAKI.js → watch-HHFVXB3G.js} +12 -12
- package/package.json +1 -1
- package/dist/chunk-DKWEZWCF.cjs.map +0 -1
- package/dist/chunk-DZT3CHNZ.cjs.map +0 -1
- package/dist/chunk-FHFPQ6MX.cjs.map +0 -1
- package/dist/chunk-HOXHBG4C.cjs.map +0 -1
- package/dist/chunk-IHNIPVPJ.cjs.map +0 -1
- package/dist/chunk-OHDGEGDJ.cjs.map +0 -1
- package/dist/chunks-LV5EJBZ4.js +0 -10
- package/dist/formula-R3OWFGCZ.cjs.map +0 -1
- package/dist/image-ocr-EBKG45KF.cjs.map +0 -1
- package/dist/parse-worker-v2-YZY2GQY5.js.map +0 -1
- package/dist/parser-DX4I3GT7.cjs.map +0 -1
- package/dist/pdf-ocr-WU7SZHWM.cjs +0 -31
- package/dist/pdf-ocr-WU7SZHWM.cjs.map +0 -1
- package/dist/seal-JIVSSI3Z.js +0 -10
- package/dist/visual-BKVZN6HP.js +0 -21
- /package/dist/{-VEOO4BOM.js.map → -TSN4SWFV.js.map} +0 -0
- /package/dist/{chunk-ENCAYXDI.js.map → chunk-2SMANR76.js.map} +0 -0
- /package/dist/{chunk-Z62PHCSU.js.map → chunk-5EP6VFP5.js.map} +0 -0
- /package/dist/{chunk-4VPN5MHS.js.map → chunk-6H7D4QTM.js.map} +0 -0
- /package/dist/{chunk-G4HWEM6Q.js.map → chunk-AJ3DJSO6.js.map} +0 -0
- /package/dist/{chunk-P35SCAJN.js.map → chunk-B77K6J3U.js.map} +0 -0
- /package/dist/{chunk-DBPDAG7N.js.map → chunk-BIVO2GMU.js.map} +0 -0
- /package/dist/{chunk-6YDPTTIY.js.map → chunk-G7SKCXQG.js.map} +0 -0
- /package/dist/{chunk-PX6X4YOR.js.map → chunk-HP24FYLJ.js.map} +0 -0
- /package/dist/{chunk-55DOBEGD.js.map → chunk-L2OJUIII.js.map} +0 -0
- /package/dist/{chunk-CKCJU42Y.js.map → chunk-LBPUPT6S.js.map} +0 -0
- /package/dist/{chunk-ZGNHJCDR.js.map → chunk-LEL5UBGR.js.map} +0 -0
- /package/dist/{chunk-O2SLKE4L.js.map → chunk-LEUS275C.js.map} +0 -0
- /package/dist/{chunk-DM5YPONO.js.map → chunk-MI25BZSU.js.map} +0 -0
- /package/dist/{chunk-OJISMR2Z.js.map → chunk-NAPPGU3W.js.map} +0 -0
- /package/dist/{chunk-EN3PK6OT.js.map → chunk-RS2Q64N5.js.map} +0 -0
- /package/dist/{chunk-XLY5ZJRP.js.map → chunk-RVKOFZAT.js.map} +0 -0
- /package/dist/{chunk-H5PDQ66I.js.map → chunk-SWCO5NP6.js.map} +0 -0
- /package/dist/{chunk-IZYYKE5F.js.map → chunk-V2GW3M2F.js.map} +0 -0
- /package/dist/{chunk-P6FNIU5P.js.map → chunk-W4P3QPSB.js.map} +0 -0
- /package/dist/{chunk-3M2BIQLZ.js.map → chunk-WYYUWBTS.js.map} +0 -0
- /package/dist/{chunk-Z5G6QNVH.js.map → chunk-YE4T2P6F.js.map} +0 -0
- /package/dist/{chunk-SRUBDR3Z.js.map → chunk-ZR3BPESP.js.map} +0 -0
- /package/dist/{chunks-LV5EJBZ4.js.map → chunks-HPPVNSBT.js.map} +0 -0
- /package/dist/{formula-4GRNVWIQ.js.map → formula-6J26PNHL.js.map} +0 -0
- /package/dist/{formula-6Y467S4R.js.map → formula-PNZX2ZAZ.js.map} +0 -0
- /package/dist/{image-ocr-ZLL66KNO.js.map → image-ocr-RPHNFU7I.js.map} +0 -0
- /package/dist/{image-ocr-CGJJCD4E.js.map → image-ocr-UNTKJLQL.js.map} +0 -0
- /package/dist/{model-bundle-RD4KSNTB.js.map → model-bundle-ZSDEJFA7.js.map} +0 -0
- /package/dist/{models-OLGCZBXI.js.map → models-JS66XYKO.js.map} +0 -0
- /package/dist/{parser-J22QBXPP.js.map → parser-N64TUIWU.js.map} +0 -0
- /package/dist/{parser-IHCFHLHN.js.map → parser-YKATDDQV.js.map} +0 -0
- /package/dist/{pdf-ocr-H2247ZZH.js.map → pdf-ocr-KTKR2JQH.js.map} +0 -0
- /package/dist/{pdf-ocr-TYIH23RP.js.map → pdf-ocr-W3LDJYCA.js.map} +0 -0
- /package/dist/{profile-io-GH3TYTNJ.js.map → profile-io-JRODOL7A.js.map} +0 -0
- /package/dist/{rasterize-7TFTVFMB.js.map → rasterize-2DMR7RGP.js.map} +0 -0
- /package/dist/{redact-doc-DSSQOO3A.js.map → redact-doc-TC6QSTPM.js.map} +0 -0
- /package/dist/{render-NKXZQINI.js.map → render-WEUU5EDS.js.map} +0 -0
- /package/dist/{seal-JIVSSI3Z.js.map → seal-LSALFURW.js.map} +0 -0
- /package/dist/{setup-JVLMX2TH.js.map → setup-LKJKGMKJ.js.map} +0 -0
- /package/dist/{visual-BKVZN6HP.js.map → visual-PHZHJRY5.js.map} +0 -0
- /package/dist/{watch-5RZVHAKI.js.map → watch-HHFVXB3G.js.map} +0 -0
package/README.md
CHANGED
|
@@ -11,16 +11,16 @@ HWP 3.x·5.x, HWPX, HWPML, PDF, XLS·XLSX, DOCX, PPTX, PNG·JPG·WebP를 Markdow
|
|
|
11
11
|
|
|
12
12
|
[English](README-EN.md) · [상세 사용법](docs/usage.md) · [벤치마크](docs/benchmarks.md) · [변경 이력](CHANGELOG.md)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
- 🇰🇷 **한국 공문서 표 구조 100%** — 원본 HWPX 2,429문서의 보이는 표 **10,461개 전부 구조 일치**. [4.22.0 검증](docs/benchmarks.md)
|
|
14
|
+

|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
<sub>같은 법령 별표 한 건을 HWP·HWPX·PDF·스캔 이미지로 넣은 실제 출력입니다. 네 경우 모두 병합 칸(`rowspan`·`colspan`)을 같은 짜임의 표로 읽습니다. 스캔 이미지는 OCR이 자동으로 켜집니다.</sub>
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
- 📊 **PDF 공개 벤치 종합 0.964**: opendataloader-bench 200문서, 공개 리더보드 12개 파서보다 높은 점수(4.22.14 측정). [측정 조건](docs/benchmarks.md#pdf--markdown--opendataloader-bench)
|
|
19
|
+
- 🇰🇷 **한국 공문서 표 구조 100%**: 원본 HWPX 2,424문서의 보이는 표 **10,342개 전부 구조 일치**. [검증 결과](#검증-결과)
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
쓸모 있었다면 GitHub ⭐ 하나 눌러주세요. 다른 사람이 이 도구를 찾는 데 도움이 됩니다.
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
영상: [공개 벤치 측정 과정](https://youtu.be/9kRbwiTRQLs)(2026-09-27 판, 1분 31초) · [양식 일괄 채우기 시연](https://youtu.be/Q13GmgDcIw0)
|
|
24
24
|
|
|
25
25
|
## 설치
|
|
26
26
|
|
|
@@ -38,7 +38,7 @@ CLI는 설치 없이 `npx kordoc`으로 실행할 수 있습니다. PDF·OCR 의
|
|
|
38
38
|
npx -y kordoc setup
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
Claude Desktop·Claude Code·Cursor·Codex 등 설치된 클라이언트에 MCP를 등록합니다. 클라이언트를 재시작하면
|
|
41
|
+
Claude Desktop·Claude Code·Cursor·Codex 등 설치된 클라이언트에 MCP를 등록합니다. 클라이언트를 재시작하면 파싱·비교·생성·검수·렌더 등 **18개 도구**를 사용할 수 있습니다.
|
|
42
42
|
|
|
43
43
|
Claude Code 플러그인:
|
|
44
44
|
|
|
@@ -60,12 +60,11 @@ npx kordoc 문서.pdf --format json --pages 1-3
|
|
|
60
60
|
npx kordoc 스캔본.pdf --ocr -o 스캔본.md
|
|
61
61
|
npx kordoc generate 보고서.md --preset 보고서 -o 보고서.hwpx
|
|
62
62
|
npx kordoc fill --template gian -j 값.json -o 기안문.hwpx
|
|
63
|
+
npx kordoc lint 보고서.hwpx --gate --preset 보고서
|
|
63
64
|
```
|
|
64
65
|
|
|
65
66
|
`--jobs`는 파일 단위 병렬 변환이며 메모리 사용도 늘어납니다. [병렬 변환 안내](docs/parallel-batch.md)
|
|
66
67
|
|
|
67
|
-
보고서·계획서·개조식·서울방침은 `#` 제목 바로 뒤 인용문(`> …하고자 함`)이 요약 상자가 됩니다(개조식은 표지가 있을 때(기본) 본문 첫 쪽 제목 상자 아래 — `cover:false` 면 첫 `#` 이 장 머리라 인용문은 ※ 참고). 보고 목적 한 문장(쉼표 허용) 3줄 이내로 쓰고, 넘거나 두 문장 이상이면 경고합니다. 업무보고는 `> ▪ …` 인용문이 자리와 관계없이 성과 요약 상자가 됩니다.
|
|
68
|
-
|
|
69
68
|
### JavaScript / TypeScript
|
|
70
69
|
|
|
71
70
|
```typescript
|
|
@@ -91,12 +90,13 @@ await writeFile("보고서.hwpx", Buffer.from(hwpx))
|
|
|
91
90
|
| 작업 | 기능 |
|
|
92
91
|
| --- | --- |
|
|
93
92
|
| 읽기 | 문서 → Markdown·IR·쪽별 본문·RAG 청크, 로컬 OCR |
|
|
94
|
-
| 비교·편집 | 블록·셀 단위 비교, HWPX·HWP 서식 보존
|
|
95
|
-
| 작성 | Markdown → HWPX, 공문서
|
|
93
|
+
| 비교·편집 | 블록·셀 단위 비교, HWPX·HWP 서식 보존 패치, 견본 서식 그대로 새 내용 쓰기 |
|
|
94
|
+
| 작성 | Markdown → HWPX, 공문서 프리셋·부서 서식 견본(`--template`), 표·수식·차트 |
|
|
96
95
|
| 양식 | 필드·누름틀 채우기, 표준 기안문 2종, 도장 날인 |
|
|
97
|
-
|
|
|
96
|
+
| 검수 | 표기법·공공언어, 구성·AI 문체 게이트, 예산 산출근거 검산, 열린 문서 블록 단위 검수(`lint-blocks`) |
|
|
97
|
+
| 보기·보안 | HWPX·HWP 미리보기·영역 추출, 개인정보 마스킹 |
|
|
98
98
|
|
|
99
|
-
서식 보존 패치용 Markdown은 `--keep-layout-tables`로 추출합니다.
|
|
99
|
+
서식 보존 패치용 Markdown은 `--keep-layout-tables`로 추출합니다. 적용하지 못한 편집은 건너뛴 사유로 보고합니다. [서식 보존 편집](docs/usage.md#서식-보존-편집) · [CLI 전체](docs/usage.md#-cli)
|
|
100
100
|
|
|
101
101
|
## 검증 결과
|
|
102
102
|
|
|
@@ -113,54 +113,23 @@ await writeFile("보고서.hwpx", Buffer.from(hwpx))
|
|
|
113
113
|
| 법령 별표 | 272건 · 346표 | HWP **346/346**, PDF **342/346 · 98.84%** |
|
|
114
114
|
| PDF 전체 | 1,911문서 중 1,729건 채점 | 글 커버리지 **99.80%** |
|
|
115
115
|
| OCR | 53문서 · 102쪽 | CER **0.0409** · 글자 재현율 **99.02%** |
|
|
116
|
+
| opendataloader-bench | PDF 200문서 | 종합 기본값 **0.964** · OCR 끔 **0.939** |
|
|
116
117
|
|
|
117
|
-
표 구조 점수와 셀 내용·화면 재현은 별도 지표입니다. 중첩표 100%는 위 101표에 한정하며 전체 PDF·조판의 완전 일치를 뜻하지 않습니다. 채점 범위·제외
|
|
118
|
-
|
|
119
|
-
**4.22.15 (2026-10-19)**: "이 서식대로 써줘" 요청을 어느 AI 에서든 같은 경로로 처리합니다. 견본을 `--keep-layout-tables` 로 읽어 내용만 새로 쓴 뒤 `patch` 하면, 늘어난 줄은 같은 항목 부호(□·ㅇ·-) 견본 문단을 복제해 같은 들여쓰기·글꼴·굵기로 들어가고 지운 줄은 문단째 빠집니다. 같은 견본·같은 요청으로 Codex 를 돌려 보니 종전엔 새 내용을 원본 문단 자리에 억지로 맞춰 ○ 줄 서식이 어긋났고, 개선 뒤엔 줄 수가 달라도 견본 서식 그대로 나왔습니다. [사용법](docs/usage.md#서식-보존-편집)
|
|
120
|
-
|
|
121
|
-
**4.22.14 개선 검증(2026-10-19)**: 4.22.13과 같은 채점기·코퍼스로 다시 잰 결과 파서 출력(opendataloader-bench 네 모드·PDF 글·표·별표·OCR·기타 포맷·왕복·생성)은 문서별로 4.22.13과 같고, 렌더(한컴 PDF 짝) 글 조각 위치(1.5pt 안) **86,051/90,433→86,508/90,518**, 쪽 수 **1,421→1,423/1,431**로 개선했습니다. 조판 저장본 대조는 두 줄 이상 문단 **24,940→24,941/25,187**입니다. 칸 안 표가 든 칸 높이, 한컴이 첫 쪽 조각만 적은 표의 쪽 넘김, 줄 끝 글자 자간, 구역 첫 문단의 줄 시작(앞면·뒷면 서식 표), 한컴 사용자 기호(글머리 가운데점 등) 폭을 바로잡았습니다. [상세](docs/benchmarks.md)
|
|
122
|
-
|
|
123
|
-
빈 행을 접을 때 기존 논리 격자 안의 병합 모서리 셀을 보존합니다. 재현 PDF의 번호 기호 6종은 복원했으며, HTML 선 출력과 미등록 글꼴 기호는 [남은 한계](docs/parsing-loss-reproductions.md)로 기록했습니다.
|
|
124
|
-
|
|
125
|
-
외부 PDF 벤치 **opendataloader-bench 200문서**는 4.22.14 배포 후보의 동일 코퍼스 재검증에서 기본값 종합 **0.964**, OCR 끔 **0.939**입니다. [옵션별 결과와 재현 방법](docs/benchmarks.md#pdf--markdown--opendataloader-bench)
|
|
118
|
+
표 구조 점수와 셀 내용·화면 재현은 별도 지표입니다. 중첩표 100%는 위 101표에 한정하며 전체 PDF·조판의 완전 일치를 뜻하지 않습니다. 채점 범위·제외 기준·옵션별 수치·재현 방법은 [벤치마크 상세](docs/benchmarks.md)에 있습니다.
|
|
126
119
|
|
|
127
120
|
## 최근 업데이트
|
|
128
121
|
|
|
129
|
-
최신 배포: **[4.24.
|
|
122
|
+
최신 배포: **[4.24.1](https://github.com/chrisryugj/kordoc/releases/tag/v4.24.1)** · 2026-10-21
|
|
130
123
|
|
|
131
124
|
| 버전 | 주요 변경 |
|
|
132
125
|
| --- | --- |
|
|
133
|
-
| 4.24.
|
|
134
|
-
| 4.
|
|
135
|
-
| 4.23.
|
|
136
|
-
| 4.
|
|
137
|
-
| 4.22.
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
| 4.22.14 | 렌더·조판 보정 — 칸 안 표가 줄을 밀지 않은 칸 높이, 첫 쪽 조각만 저장한 표의 넘침 여유 해제, 줄 끝 글자 자간, 구역 첫 문단 줄 시작(앞면·뒷면 서식 표), 한컴 사용자 기호 전각 폭(한컴 PDF 글 조각 위치 86,051 → 86,508, 쪽 수 1,421 → 1,423, 조판 두 줄+ 24,940 → 24,941), COM 폴백 보안 모듈 등록 이름(#166) — 파서 출력은 4.22.13과 같음 |
|
|
141
|
-
| 4.22.13 | 쪽 넘김·칸 안 표 렌더 보정 — 꼬리말 0 쪽 번호, 갈라 저장한 칸이 있는 표의 넘침 여유 해제, 첫 줄도 안 드는 갈라 저장 행은 다음 쪽, 칸 안 표에 밀린 줄, 쪽을 넘는 칸 안 표(한컴 PDF 글 조각 위치 85,968 → 86,051, 그림 3,869 → 3,872, 쪽 수 1,413 → 1,421) — 파서 출력·조판 지표는 4.22.12와 같음 |
|
|
142
|
-
| 4.22.12 | 글상자 렌더 보정 — 지금 크기(curSz)·쪽 좌표 캐시 재조판·글 영역 폭 없는 글상자·옛한글 자모 폭, 제 표에 밀린 쪽 나누기 문단, 같은 너비 행 없는 표의 가장 긴 길 열 경계(한컴 PDF 글 조각 위치 85,837 → 85,968, 그림 3,866 → 3,869) — 파서 출력·조판 지표는 4.22.11과 같음 |
|
|
143
|
-
| 4.22.11 | 렌더 보정 — 갈린 칸 안 표의 이어진 쪽 시작·갈린 행 마지막 조각의 개체 바닥·여러 행 칸 내용 높이·갈린 가운데 칸 마지막 조각 정렬(한컴 PDF 글 조각 위치 85,496 → 85,837), 빈 문단 그림이 쪽 아래로 밀리던 4.21.31 회귀 수정 — 파서 출력·조판은 4.22.10과 같음 |
|
|
144
|
-
| 4.22.10 | MCP `parse_document` OCR 모델 인수(#165), 렌더 표 보정 — 행마다 다른 칸 너비의 열 경계·병합 칸 행 성장·갈라 저장한 칸·쪽 바닥 첫 행·갈린 가운데 칸 다음 쪽 조각(한컴 PDF 글 조각 위치 84,468 → 85,496, 쪽 수 1,410 → 1,413) — 파서 출력·조판은 4.22.9와 같음 |
|
|
145
|
-
| 4.22.9 | 굴림체·돋움체 반각 기호 폭·글머리표 예약 폭 조판 보정(본문 첫 줄 위치 76,676 → 76,729, 표 칸 205,007 → 205,015), 렌더의 갈라 저장한 가운데 칸·행 단위 표 쪽 넘김·개체 뒤 자동 탭 보정(한컴 PDF 글 조각 위치 82,816 → 84,468) — 파서 출력은 4.22.8과 같음 |
|
|
146
|
-
| 4.22.8 | PDF 표 아래 캡션 순서·한 단 본문의 가짜 2단 기각·그림 영역 OCR 지도 표 오판 정리(ODL 기본값 0.96305 → 0.96367), 칸 높이 고정 표 나눔·Wingdings 기호 폭·표만 든 줄 높이 조판 보정 — 본문 첫 줄 위치 76,631 → 76,676, 표 칸 205,005 → 205,007 |
|
|
147
|
-
| 4.22.7 | 단어 안 밑줄·빈칸 선의 불필요한 이스케이프 정리(ODL 기본값 0.96291 → 0.96305), 쪽에서 갈리는 표의 캡션·문단 위 여백, 한글 2024 초기 빌드 글머리표 공백 압축 — 본문 첫 줄 위치 76,525 → 76,631, 표 칸 204,958 → 205,005(문서별 하락 0) |
|
|
148
|
-
| 4.22.6 | 손글씨 OCR 모델 프리셋(#164), 글자 겹치기 원 번호·한컴 번호 PUA 를 HWPX·HWP·PDF 에서 같게, PDF 한컴 글꼴 기호 복원, 칸 나눔 표·종이 기준 그림·옮긴 문단 조판 보정 — 본문 첫 줄 위치 76,443 → 76,525, 표 칸 204,869 → 204,958 |
|
|
149
|
-
| 4.22.5 | 0폭 탭·기호 폭·글머리표 예약·표 분할·줄 높이 보정, PDF 부분 셀 병합·본문 절 제목·누락 기호 복원 |
|
|
150
|
-
| 4.22.4 | 그림·테두리·공백·세로쓰기 기준선·따옴표 조판 보정, PDF 글머리 칸·주석·양식 제목·쪽 경계 목록 행 복원 |
|
|
151
|
-
| 4.22.3 | 넘친 표 점유 높이·그림 옆 줄 조각·선택 하이픈 조판 개선, PDF 감싸개 안 표 이어짐과 반복 자료행 복원, 빈 행을 접을 때 병합 모서리 셀 보존 |
|
|
152
|
-
| 4.22.2 | 부분 편집 문단 위치·그림 어울림·고정폭 빈칸 조판 개선, PDF 독립 제목·번호 행 보존 및 연락처·음영 행 내용 복원 |
|
|
153
|
-
| 4.22.1 | 텍스트층 PDF의 그림 영역 OCR에서 회전 보정·고해상도 재인식 좌표 혼합 수정. 전체 스캔의 기울기 보정 유지 |
|
|
154
|
-
| 4.22.0 | PDF 중첩표 94/101 → 101/101, 쪽 경계 셀·HWP 캡션·표 칸 안 각주 보존. OCR 줄 좌표·모델 선택 추가, 수식 OCR 설치 경량화 |
|
|
155
|
-
| 4.21.33 | 미주 단 흐름, 갈리는 표의 각주, 칸 간격 — 본문 줄 위치 일치 95.9% → 97.5%, 표 칸 99.5% → 99.7% |
|
|
156
|
-
| 4.21.32 | 렌더·reflow 쪽 배치 개선 — 쪽을 넘는 표 칸과 떠 있는 개체. 표 칸 줄 위치 일치 97.4% → 99.5%, 본문 87.2% → 95.9% |
|
|
157
|
-
| 4.21.31 | 렌더·reflow 조판 일치, 각주 안 표 구조 보존(#149), 인라인 수식 옵션(#150), 보안 점검 반영 |
|
|
158
|
-
| 4.21.23 | HWP·HWPX 그림 속 글 OCR(`ocr: true`, #143) |
|
|
159
|
-
| 4.21.0 | 중앙부처 기관 서식 `--agency`, 보도자료 담당 표 |
|
|
160
|
-
|
|
161
|
-
OCR 줄의 상자·신뢰도는 `--ocr --ocr-lines --format json`으로 받습니다. `--ocr-det`·`--ocr-det-long-side`로 검출 모델과 해상도를 선택할 수 있습니다. [OCR 줄·모델 사용법](docs/usage.md#ocr-줄모델-선택)
|
|
162
|
-
|
|
163
|
-
버전별 상세는 [변경 이력](CHANGELOG.md)에 있습니다.
|
|
126
|
+
| 4.24.1 | 검수 수정: 블록 검수 희소 표 메모리 폭주·천원 규칙 이차 시간·예산 검산(목록 줄·소계(A)·비율 행), `generate --template` 견본 덮어쓰기 차단 |
|
|
127
|
+
| 4.24.0 | 블록 단위 검수 `lintBlocks`: 열린 문서의 문단·표 칸을 블록으로 넘기면 지적을 블록 id·블록 안 위치로 돌려줌(CLI `lint-blocks`, MCP `lint_document`, 워커, Python SDK) |
|
|
128
|
+
| 4.23.1 | 견본 생성 제목표 결재선 칸을 직위별로, 산출근거 줄·표 칸 천원 단위 오탐 제거 |
|
|
129
|
+
| 4.23.0 | 부서 서식 견본으로 새 문서 생성(`generate --template`), 예산 문서 검수(`lint --budget`), MCP `lint_document` |
|
|
130
|
+
| 4.22.18 | kordoc 생성 보고서의 제목 틀·장 띠·요약 상자 패치, 변경 추적 HWP 패치 결과가 한글에 보이지 않던 문제 |
|
|
131
|
+
|
|
132
|
+
이전 버전과 상세 내용은 [변경 이력](CHANGELOG.md)에 있습니다.
|
|
164
133
|
|
|
165
134
|
## 자주 묻는 질문
|
|
166
135
|
|
|
@@ -176,6 +145,9 @@ OCR 줄의 상자·신뢰도는 `--ocr --ocr-lines --format json`으로 받습
|
|
|
176
145
|
**Q. RAG 색인용으로 쓸 수 있나요?**
|
|
177
146
|
`--format chunks`가 제목 경로를 붙인 구조 청크와 독립 표 청크를 냅니다. 표를 HTML 없이 받으려면 `--table-format gfm`(API는 `tableFormat: "gfm"`)을 씁니다. Python·Java에서는 [Python SDK](sdk/python/README.md)·[Java SDK](sdk/java/README.md)로 부릅니다.
|
|
178
147
|
|
|
148
|
+
**Q. OCR 줄 좌표나 다른 모델이 필요하면?**
|
|
149
|
+
`--ocr --ocr-lines --format json`이 줄별 상자·신뢰도를 내고, `--ocr-det`·`--ocr-det-long-side`로 검출 모델과 해상도를 고릅니다. [OCR 줄·모델 선택](docs/usage.md#ocr-줄모델-선택)
|
|
150
|
+
|
|
179
151
|
## 문서·보안
|
|
180
152
|
|
|
181
153
|
- [상세 사용법](docs/usage.md): 전체 CLI·MCP 도구·API·지원 포맷
|
|
@@ -58,10 +58,10 @@ import {
|
|
|
58
58
|
usesGaejosikMunche,
|
|
59
59
|
usesLogicStructure,
|
|
60
60
|
validateHwpx
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-4BCQ3FQS.js";
|
|
62
62
|
import {
|
|
63
63
|
blocksToChunks
|
|
64
|
-
} from "./chunk-
|
|
64
|
+
} from "./chunk-MI25BZSU.js";
|
|
65
65
|
import {
|
|
66
66
|
SPACE_EM_FIXED,
|
|
67
67
|
SPACE_EM_FONT,
|
|
@@ -86,20 +86,20 @@ import {
|
|
|
86
86
|
renderSceneToHtml,
|
|
87
87
|
simulateWrap,
|
|
88
88
|
simulateWrapKeepWord
|
|
89
|
-
} from "./chunk-
|
|
90
|
-
import "./chunk-
|
|
89
|
+
} from "./chunk-LBPUPT6S.js";
|
|
90
|
+
import "./chunk-LEL5UBGR.js";
|
|
91
91
|
import {
|
|
92
92
|
blocksToPages
|
|
93
|
-
} from "./chunk-
|
|
93
|
+
} from "./chunk-RS2Q64N5.js";
|
|
94
94
|
import "./chunk-VKVDMH7X.js";
|
|
95
95
|
import "./chunk-VQFA55IC.js";
|
|
96
96
|
import "./chunk-BYMPPVT3.js";
|
|
97
|
-
import "./chunk-
|
|
97
|
+
import "./chunk-W4P3QPSB.js";
|
|
98
98
|
import {
|
|
99
99
|
blocksToMarkdown,
|
|
100
100
|
flattenLayoutTables,
|
|
101
101
|
hasStructuredCellContent
|
|
102
|
-
} from "./chunk-
|
|
102
|
+
} from "./chunk-BIVO2GMU.js";
|
|
103
103
|
import {
|
|
104
104
|
ValueCursor,
|
|
105
105
|
applySplices,
|
|
@@ -113,11 +113,11 @@ import {
|
|
|
113
113
|
isLabelCell,
|
|
114
114
|
placeSealHwpx,
|
|
115
115
|
scanSectionXml
|
|
116
|
-
} from "./chunk-
|
|
117
|
-
import "./chunk-
|
|
116
|
+
} from "./chunk-5EP6VFP5.js";
|
|
117
|
+
import "./chunk-L2OJUIII.js";
|
|
118
118
|
import {
|
|
119
119
|
VERSION
|
|
120
|
-
} from "./chunk-
|
|
120
|
+
} from "./chunk-YE4T2P6F.js";
|
|
121
121
|
import {
|
|
122
122
|
DEFAULT_REDACT_RULES,
|
|
123
123
|
redactMarkdown,
|
|
@@ -227,4 +227,4 @@ export {
|
|
|
227
227
|
usesLogicStructure,
|
|
228
228
|
validateHwpx
|
|
229
229
|
};
|
|
230
|
-
//# sourceMappingURL=-
|
|
230
|
+
//# sourceMappingURL=-TSN4SWFV.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
UNRULED_REGION_TABLES,
|
|
7
7
|
extractPageBlocksWithLines
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ZR3BPESP.js";
|
|
9
9
|
import {
|
|
10
10
|
validateOcrOptions
|
|
11
11
|
} from "./chunk-BYMPPVT3.js";
|
|
@@ -16,11 +16,11 @@ import {
|
|
|
16
16
|
ocrSourcePath,
|
|
17
17
|
parseCharacterDict,
|
|
18
18
|
resolveOcrModels
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-V2GW3M2F.js";
|
|
20
20
|
import {
|
|
21
21
|
KordocError,
|
|
22
22
|
OPTIONAL_DEP_INSTALL_HINT
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-YE4T2P6F.js";
|
|
24
24
|
|
|
25
25
|
// src/ocr/ruling-lines.ts
|
|
26
26
|
var INK_LUMA_MAX = 205;
|
|
@@ -2215,4 +2215,4 @@ export {
|
|
|
2215
2215
|
groupOcrLines,
|
|
2216
2216
|
ocrItemsToBlocks
|
|
2217
2217
|
};
|
|
2218
|
-
//# sourceMappingURL=chunk-
|
|
2218
|
+
//# sourceMappingURL=chunk-2SMANR76.js.map
|
|
@@ -51,10 +51,10 @@ import {
|
|
|
51
51
|
resolveParaHeading,
|
|
52
52
|
simulateWrap,
|
|
53
53
|
takeTocLeaders
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-LBPUPT6S.js";
|
|
55
55
|
import {
|
|
56
56
|
blocksToPages
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-RS2Q64N5.js";
|
|
58
58
|
import {
|
|
59
59
|
bmpToPng,
|
|
60
60
|
inlineImagesIntoMarkdown
|
|
@@ -76,7 +76,7 @@ import {
|
|
|
76
76
|
tidyScriptTags,
|
|
77
77
|
unframeLayoutTables,
|
|
78
78
|
wrapScript
|
|
79
|
-
} from "./chunk-
|
|
79
|
+
} from "./chunk-W4P3QPSB.js";
|
|
80
80
|
import {
|
|
81
81
|
MAX_COLS,
|
|
82
82
|
MAX_ROWS,
|
|
@@ -99,7 +99,7 @@ import {
|
|
|
99
99
|
noteTableHtml,
|
|
100
100
|
sanitizeText,
|
|
101
101
|
visibleText
|
|
102
|
-
} from "./chunk-
|
|
102
|
+
} from "./chunk-BIVO2GMU.js";
|
|
103
103
|
import {
|
|
104
104
|
ANNOTATION_BLANK_RE,
|
|
105
105
|
ValueCursor,
|
|
@@ -132,7 +132,7 @@ import {
|
|
|
132
132
|
resolveUnmatched,
|
|
133
133
|
scanInlineSegments,
|
|
134
134
|
scanSectionXml
|
|
135
|
-
} from "./chunk-
|
|
135
|
+
} from "./chunk-5EP6VFP5.js";
|
|
136
136
|
import {
|
|
137
137
|
MAX_DECOMPRESS_SIZE,
|
|
138
138
|
MAX_XML_DEPTH,
|
|
@@ -149,7 +149,7 @@ import {
|
|
|
149
149
|
localName,
|
|
150
150
|
rawTextContent,
|
|
151
151
|
readZipEntry
|
|
152
|
-
} from "./chunk-
|
|
152
|
+
} from "./chunk-L2OJUIII.js";
|
|
153
153
|
import {
|
|
154
154
|
KordocError,
|
|
155
155
|
classifyError,
|
|
@@ -165,7 +165,7 @@ import {
|
|
|
165
165
|
toArrayBuffer,
|
|
166
166
|
unescapeHtml,
|
|
167
167
|
unzipLimitBytes
|
|
168
|
-
} from "./chunk-
|
|
168
|
+
} from "./chunk-YE4T2P6F.js";
|
|
169
169
|
|
|
170
170
|
// src/table/visual.ts
|
|
171
171
|
import { readFile as readFile2 } from "fs/promises";
|
|
@@ -19329,7 +19329,7 @@ var MIN_SIDE = 24;
|
|
|
19329
19329
|
async function ocrEmbeddedImages(blocks, options, warnings) {
|
|
19330
19330
|
const ocr = options?.ocr;
|
|
19331
19331
|
if (ocr !== true && ocr !== "force" && typeof ocr !== "function") return false;
|
|
19332
|
-
const { parseImageDocument } = await import("./image-ocr-
|
|
19332
|
+
const { parseImageDocument } = await import("./image-ocr-UNTKJLQL.js");
|
|
19333
19333
|
let inserted = false, unreadable = 0;
|
|
19334
19334
|
let failed = null;
|
|
19335
19335
|
const walk = async (list, depth) => {
|
|
@@ -28501,6 +28501,11 @@ function scheduleLineYear(m) {
|
|
|
28501
28501
|
const before = (m.input ?? "").slice(Math.max(0, at - 40), at);
|
|
28502
28502
|
return SCHEDULE_LEADER.test(before) ? null : "";
|
|
28503
28503
|
}
|
|
28504
|
+
var calcLineCache;
|
|
28505
|
+
function isCalcLine(line) {
|
|
28506
|
+
if (calcLineCache?.line !== line) calcLineCache = { line, calc: /[×✕]|\s=\s/.test(line) };
|
|
28507
|
+
return calcLineCache.calc;
|
|
28508
|
+
}
|
|
28504
28509
|
var WEEKDAYS = "\uC77C\uC6D4\uD654\uC218\uBAA9\uAE08\uD1A0";
|
|
28505
28510
|
function weekdayCheck(m) {
|
|
28506
28511
|
const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
@@ -28611,7 +28616,7 @@ var RULES = [
|
|
|
28611
28616
|
severity: "error",
|
|
28612
28617
|
pattern: /(?<![\d,])\d+\s*천\s*원/g,
|
|
28613
28618
|
skipTable: true,
|
|
28614
|
-
check: (m) =>
|
|
28619
|
+
check: (m) => isCalcLine(m.input ?? "") ? null : "",
|
|
28615
28620
|
message: "\uAE08\uC561\uC740 '\uCC9C\uC6D0'\uC73C\uB85C \uC904\uC774\uC9C0 \uC54A\uACE0 \uC544\uB77C\uBE44\uC544 \uC22B\uC790\uB85C",
|
|
28616
28621
|
suggest: "\uC608) 345,000\uC6D0"
|
|
28617
28622
|
},
|
|
@@ -29544,7 +29549,7 @@ var NUM = String.raw`\d[\d,]*(?:\.\d+)?`;
|
|
|
29544
29549
|
var MUL = String.raw`[×xX*✕]`;
|
|
29545
29550
|
var FACTOR = String.raw`${NUM}\s{0,2}(?:%|[가-힣]{1,3})?`;
|
|
29546
29551
|
var CALC_RE = new RegExp(
|
|
29547
|
-
String.raw`(?<![\d,.])(?<![
|
|
29552
|
+
String.raw`(?<![\d,.])(?<![+−×xX✕]\s{0,8})(?<!\S\s{0,8}[\-*]\s{0,8})(${FACTOR}(?:\s{0,3}${MUL}\s{0,3}${FACTOR}){1,8})\s{0,3}=\s{0,3}(${NUM})\s{0,2}(원|천원|만원|백만원|억원)`,
|
|
29548
29553
|
"g"
|
|
29549
29554
|
);
|
|
29550
29555
|
var FACTOR_RE = new RegExp(String.raw`(${NUM})\s{0,2}(%|[가-힣]{1,3})?`, "g");
|
|
@@ -29591,8 +29596,9 @@ function checkCalc(line, no, out) {
|
|
|
29591
29596
|
});
|
|
29592
29597
|
}
|
|
29593
29598
|
}
|
|
29594
|
-
var SUBTOTAL_RE = /^소\s
|
|
29599
|
+
var SUBTOTAL_RE = /^소\s*계\s*(?:\([^)]{1,10}\))?$/;
|
|
29595
29600
|
var NON_ADDITIVE_HEAD = /률|율|비율|%|단가|평균/;
|
|
29601
|
+
var NON_ADDITIVE_ROW = /^(?:구성비|비중|평균|단가|환율|[가-힣]{0,4}(?:비율|증감률|증감율|집행률|집행율|달성률|달성율))(?:\(%\))?$/;
|
|
29596
29602
|
var plainCell = (c) => c.replace(/[*_`]/g, "").trim();
|
|
29597
29603
|
function cellNum(c) {
|
|
29598
29604
|
const t = plainCell(c);
|
|
@@ -29632,7 +29638,7 @@ function checkTable(rows, out) {
|
|
|
29632
29638
|
});
|
|
29633
29639
|
}
|
|
29634
29640
|
const subs = body.filter((r) => SUBTOTAL_RE.test(label(r)));
|
|
29635
|
-
const parts = subs.length ? subs : body.filter((r) => r !== total);
|
|
29641
|
+
const parts = subs.length ? subs : body.filter((r) => r !== total && !NON_ADDITIVE_ROW.test(label(r).replace(/\s+/g, "")));
|
|
29636
29642
|
for (let c = 0; c < cols; c++) {
|
|
29637
29643
|
const cell2 = plainCell(total.cells[c] ?? "");
|
|
29638
29644
|
if (cell2 === "" || cell2 === "-" || cell2 === "\u2013" || NON_ADDITIVE_HEAD.test(plainCell(rows[0].cells[c] ?? ""))) continue;
|
|
@@ -29901,6 +29907,7 @@ function runLintSuite(text, opts = {}) {
|
|
|
29901
29907
|
var MARKDOWN_STRUCTURE = /^\s*(?:```|~~~|#|\||>)/;
|
|
29902
29908
|
var safeLine = (text) => text.replace(/[\r\n]/g, " ");
|
|
29903
29909
|
var safeCell = (text) => safeLine(text).replace(/\|/g, "\uFF5C");
|
|
29910
|
+
var MAX_DENSE_CELLS = 1e5;
|
|
29904
29911
|
function blocksToLines(blocks) {
|
|
29905
29912
|
const lines = [];
|
|
29906
29913
|
const paragraph = (block) => {
|
|
@@ -29925,12 +29932,23 @@ function blocksToLines(blocks) {
|
|
|
29925
29932
|
}
|
|
29926
29933
|
const rows = cells.reduce((n, c) => Math.max(n, c.table.row + 1), 0);
|
|
29927
29934
|
const cols = cells.reduce((n, c) => Math.max(n, c.table.col + 1), 0);
|
|
29928
|
-
const
|
|
29935
|
+
const range = (n) => Array.from({ length: n }, (_, i) => i);
|
|
29936
|
+
const used = (k) => [...new Set(cells.map((c) => c.table[k]))].sort((a, b2) => a - b2);
|
|
29937
|
+
const dense = rows * cols <= Math.max(MAX_DENSE_CELLS, cells.length * 4);
|
|
29938
|
+
const rowNos = dense ? range(rows) : used("row");
|
|
29939
|
+
const colNos = dense ? range(cols) : used("col");
|
|
29940
|
+
const at = /* @__PURE__ */ new Map();
|
|
29941
|
+
for (const c of cells) {
|
|
29942
|
+
const key = `${c.table.row},${c.table.col}`;
|
|
29943
|
+
const before = at.get(key);
|
|
29944
|
+
if (before) paragraph(before);
|
|
29945
|
+
at.set(key, c);
|
|
29946
|
+
}
|
|
29929
29947
|
lines.push({ text: "", segments: [] });
|
|
29930
|
-
for (
|
|
29948
|
+
for (const [ri, r] of rowNos.entries()) {
|
|
29931
29949
|
let text = "|";
|
|
29932
29950
|
const segments = [];
|
|
29933
|
-
for (
|
|
29951
|
+
for (const c of colNos) {
|
|
29934
29952
|
text += " ";
|
|
29935
29953
|
const cell2 = at.get(`${r},${c}`);
|
|
29936
29954
|
if (cell2) {
|
|
@@ -29941,7 +29959,7 @@ function blocksToLines(blocks) {
|
|
|
29941
29959
|
text += " |";
|
|
29942
29960
|
}
|
|
29943
29961
|
lines.push({ text, segments });
|
|
29944
|
-
if (
|
|
29962
|
+
if (ri === 0) lines.push({ text: "|" + " --- |".repeat(colNos.length), segments: [] });
|
|
29945
29963
|
}
|
|
29946
29964
|
lines.push({ text: "", segments: [] });
|
|
29947
29965
|
}
|
|
@@ -29956,7 +29974,8 @@ function locate(lines, f) {
|
|
|
29956
29974
|
if (seg2) {
|
|
29957
29975
|
const found = line.text.indexOf(f.match, Math.max(seg2.start, at));
|
|
29958
29976
|
const start = found >= seg2.start && found < seg2.start + seg2.length ? found : at;
|
|
29959
|
-
|
|
29977
|
+
const offset = Math.min(Math.max(0, start - seg2.start), seg2.length);
|
|
29978
|
+
return { block: seg2.block, offset, room: seg2.length - offset };
|
|
29960
29979
|
}
|
|
29961
29980
|
return { block: null, offset: null };
|
|
29962
29981
|
}
|
|
@@ -29965,7 +29984,7 @@ function locate(lines, f) {
|
|
|
29965
29984
|
const body = line.text.slice(seg.start, seg.start + seg.length);
|
|
29966
29985
|
const first = f.match ? body.indexOf(f.match) : -1;
|
|
29967
29986
|
const unique = first >= 0 && body.indexOf(f.match, first + 1) < 0;
|
|
29968
|
-
return { block: seg.block, offset: unique ? first : null };
|
|
29987
|
+
return { block: seg.block, offset: unique ? first : null, ...unique ? { room: seg.length - first } : {} };
|
|
29969
29988
|
}
|
|
29970
29989
|
function lintBlocks(blocks, opts = {}) {
|
|
29971
29990
|
const lines = blocksToLines(blocks);
|
|
@@ -29973,11 +29992,12 @@ function lintBlocks(blocks, opts = {}) {
|
|
|
29973
29992
|
const findings = [];
|
|
29974
29993
|
const take = (category, list) => {
|
|
29975
29994
|
for (const f of list ?? []) {
|
|
29976
|
-
const { block, offset } = locate(lines, f);
|
|
29995
|
+
const { block, offset, room } = locate(lines, f);
|
|
29996
|
+
const length = room === void 0 ? f.match.length : Math.min(f.match.length, room);
|
|
29977
29997
|
findings.push({
|
|
29978
29998
|
block,
|
|
29979
29999
|
offset,
|
|
29980
|
-
length
|
|
30000
|
+
length,
|
|
29981
30001
|
category,
|
|
29982
30002
|
rule: f.rule,
|
|
29983
30003
|
severity: f.severity,
|
|
@@ -33039,7 +33059,7 @@ function scriptsOff(r, off) {
|
|
|
33039
33059
|
}
|
|
33040
33060
|
async function parseImage(buffer, options) {
|
|
33041
33061
|
try {
|
|
33042
|
-
const { parseImageDocument } = await import("./image-ocr-
|
|
33062
|
+
const { parseImageDocument } = await import("./image-ocr-UNTKJLQL.js");
|
|
33043
33063
|
const { blocks, warnings, lines } = await parseImageDocument(buffer, options);
|
|
33044
33064
|
stripScriptTags({ blocks });
|
|
33045
33065
|
return {
|
|
@@ -33103,7 +33123,7 @@ async function parseHwp(buffer, options) {
|
|
|
33103
33123
|
async function parsePdf(buffer, options) {
|
|
33104
33124
|
let parsePdfDocument;
|
|
33105
33125
|
try {
|
|
33106
|
-
const mod = await import("./parser-
|
|
33126
|
+
const mod = await import("./parser-YKATDDQV.js");
|
|
33107
33127
|
parsePdfDocument = mod.parsePdfDocument;
|
|
33108
33128
|
} catch {
|
|
33109
33129
|
return {
|
|
@@ -33336,4 +33356,4 @@ export {
|
|
|
33336
33356
|
parseHwpml,
|
|
33337
33357
|
fillForm
|
|
33338
33358
|
};
|
|
33339
|
-
//# sourceMappingURL=chunk-
|
|
33359
|
+
//# sourceMappingURL=chunk-4BCQ3FQS.js.map
|