kordoc 3.0.0 → 3.1.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 +559 -527
- package/dist/{-K5SLEFZD.js → -UCE73NNK.js} +26 -6
- package/dist/{chunk-MEPHGCPQ.js → chunk-5CJGKKMZ.js} +1 -1
- package/dist/chunk-5CJGKKMZ.js.map +1 -0
- package/dist/{chunk-MUOQXDZ4.cjs → chunk-DCZVOIEO.cjs} +1 -1
- package/dist/chunk-DCZVOIEO.cjs.map +1 -0
- package/dist/{chunk-3WRJQQIO.cjs → chunk-FJON4QNB.cjs} +2 -2
- package/dist/chunk-FJON4QNB.cjs.map +1 -0
- package/dist/{chunk-SBVRCJFH.js → chunk-GE43BE46.js} +1 -1
- package/dist/chunk-GS7T56RP.cjs +8 -0
- package/dist/chunk-GS7T56RP.cjs.map +1 -0
- package/dist/{chunk-SA2PERJ5.js → chunk-KR6DSGM7.js} +2 -2
- package/dist/chunk-KR6DSGM7.js.map +1 -0
- package/dist/chunk-MOL7MDBG.js +0 -0
- package/dist/{chunk-326STEDU.js → chunk-VMUP5WPI.js} +2903 -1633
- package/dist/chunk-VMUP5WPI.js.map +1 -0
- package/dist/{chunk-NHXKJWR7.js → chunk-ZZNSI4GV.js} +2 -2
- package/dist/chunk-ZZNSI4GV.js.map +1 -0
- package/dist/cli.js +10 -8
- package/dist/cli.js.map +1 -1
- package/dist/{detect-RI2MQ33K.js → detect-PJZMUL2Z.js} +2 -2
- package/dist/{formula-XGG6ZP42.cjs → formula-5NKVS2LR.cjs} +4 -2
- package/dist/formula-5NKVS2LR.cjs.map +1 -0
- package/dist/formula-JCNF43NE.js +0 -0
- package/dist/{formula-3AQUUIRF.js → formula-RXVSQPXI.js} +1 -1
- package/dist/index.cjs +3284 -2011
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +289 -6
- package/dist/index.d.ts +289 -6
- package/dist/index.js +2903 -1633
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +5 -5
- package/dist/mcp.js.map +1 -1
- package/dist/page-range-737B4EZW.js +0 -0
- package/dist/page-range-LNMXJU6W.js +7 -0
- package/dist/page-range-P7SDW6LR.cjs +8 -0
- package/dist/page-range-P7SDW6LR.cjs.map +1 -0
- package/dist/{parser-AU2NLC44.js → parser-4L7UFVEP.js} +3 -3
- package/dist/parser-4L7UFVEP.js.map +1 -0
- package/dist/{parser-4IVYHKSL.js → parser-QTJL6IQY.js} +5 -5
- package/dist/parser-QTJL6IQY.js.map +1 -0
- package/dist/{parser-5KHU732L.cjs → parser-XULVNDMN.cjs} +19 -18
- package/dist/parser-XULVNDMN.cjs.map +1 -0
- package/dist/{provider-SNONEZNW.cjs → provider-5K7O3Z2O.cjs} +4 -2
- package/dist/provider-5K7O3Z2O.cjs.map +1 -0
- package/dist/{provider-AKROB7WQ.js → provider-7H4CPZYS.js} +1 -1
- package/dist/provider-7H4CPZYS.js.map +1 -0
- package/dist/{provider-2SEHU2FM.js → provider-H4WWSPOV.js} +1 -1
- package/dist/provider-H4WWSPOV.js.map +1 -0
- package/dist/setup-57FB3LSP.js +0 -0
- package/dist/{watch-5DDN4BUI.js → watch-FPDSHB23.js} +4 -4
- package/dist/watch-FPDSHB23.js.map +1 -0
- package/package.json +98 -98
- package/dist/chunk-326STEDU.js.map +0 -1
- package/dist/chunk-3WRJQQIO.cjs.map +0 -1
- package/dist/chunk-MEPHGCPQ.js.map +0 -1
- package/dist/chunk-MUOQXDZ4.cjs.map +0 -1
- package/dist/chunk-NHXKJWR7.js.map +0 -1
- package/dist/chunk-SA2PERJ5.js.map +0 -1
- package/dist/formula-XGG6ZP42.cjs.map +0 -1
- package/dist/page-range-3C7UGGEK.cjs +0 -7
- package/dist/page-range-3C7UGGEK.cjs.map +0 -1
- package/dist/page-range-H35FN3OQ.js +0 -7
- package/dist/parser-4IVYHKSL.js.map +0 -1
- package/dist/parser-5KHU732L.cjs.map +0 -1
- package/dist/parser-AU2NLC44.js.map +0 -1
- package/dist/provider-2SEHU2FM.js.map +0 -1
- package/dist/provider-AKROB7WQ.js.map +0 -1
- package/dist/provider-SNONEZNW.cjs.map +0 -1
- package/dist/watch-5DDN4BUI.js.map +0 -1
- /package/dist/{-K5SLEFZD.js.map → -UCE73NNK.js.map} +0 -0
- /package/dist/{chunk-SBVRCJFH.js.map → chunk-GE43BE46.js.map} +0 -0
- /package/dist/{detect-RI2MQ33K.js.map → detect-PJZMUL2Z.js.map} +0 -0
- /package/dist/{formula-3AQUUIRF.js.map → formula-RXVSQPXI.js.map} +0 -0
- /package/dist/{page-range-H35FN3OQ.js.map → page-range-LNMXJU6W.js.map} +0 -0
package/dist/index.d.ts
CHANGED
|
@@ -260,7 +260,7 @@ interface PatchOptions {
|
|
|
260
260
|
/** 패치 후 재파싱 자동 검증 (기본 true) */
|
|
261
261
|
verify?: boolean;
|
|
262
262
|
}
|
|
263
|
-
/** patchHwpx 결과 */
|
|
263
|
+
/** patchHwpx / patchBlocks 결과 */
|
|
264
264
|
interface PatchResult {
|
|
265
265
|
success: boolean;
|
|
266
266
|
/** 패치된 HWPX (success=true) */
|
|
@@ -269,8 +269,18 @@ interface PatchResult {
|
|
|
269
269
|
applied: number;
|
|
270
270
|
/** 매핑 실패 항목 (이유 포함) */
|
|
271
271
|
skipped: PatchSkip[];
|
|
272
|
-
/**
|
|
272
|
+
/**
|
|
273
|
+
* 무손실 검증 (patchHwpx/patchHwp 전용): 패치본 재파싱 vs 편집 마크다운의
|
|
274
|
+
* 잔차 diff — modified/added/removed가 0이어야 의도가 전부 반영된 것.
|
|
275
|
+
* session.patchBlocks는 이 필드를 채우지 않는다 (changes 참조).
|
|
276
|
+
*/
|
|
273
277
|
verification?: DiffResult;
|
|
278
|
+
/**
|
|
279
|
+
* 변경 가시화 (session.patchBlocks 전용): 패치 전 → 후 문서 diff —
|
|
280
|
+
* 적용된 편집 수만큼 modified가 나오는 것이 정상. verification과 의미가
|
|
281
|
+
* 정반대이므로 혼용 금지.
|
|
282
|
+
*/
|
|
283
|
+
changes?: DiffResult;
|
|
274
284
|
/** 실패 사유 (success=false) */
|
|
275
285
|
error?: string;
|
|
276
286
|
}
|
|
@@ -317,6 +327,28 @@ declare function isLabelCell(text: string): boolean;
|
|
|
317
327
|
* 테이블의 label-value 패턴을 감지.
|
|
318
328
|
*/
|
|
319
329
|
declare function extractFormFields(blocks: IRBlock[]): FormResult;
|
|
330
|
+
/** 양식 필드 타입 — 폼 UI 위젯 선택의 근거 (데이트피커/체크박스 등) */
|
|
331
|
+
type FormFieldType = "text" | "date" | "phone" | "email" | "amount" | "checkbox" | "idnum";
|
|
332
|
+
/** 타입이 추론된 양식 필드 */
|
|
333
|
+
interface FormFieldSchema extends FormField {
|
|
334
|
+
type: FormFieldType;
|
|
335
|
+
/** 라벨에 필수 표시(※·*·★·"(필수)")가 있을 때만 true */
|
|
336
|
+
required?: boolean;
|
|
337
|
+
/** 값이 비어 있거나 플레이스홀더(밑줄/괄호 빈칸)뿐 — 채움 대상 */
|
|
338
|
+
empty: boolean;
|
|
339
|
+
}
|
|
340
|
+
interface FormSchemaResult {
|
|
341
|
+
fields: FormFieldSchema[];
|
|
342
|
+
/** 양식 확신도 (0-1, extractFormFields와 동일) */
|
|
343
|
+
confidence: number;
|
|
344
|
+
}
|
|
345
|
+
/** 필드 타입 추론 — 기존 값의 패턴 우선, 없으면 라벨 키워드 */
|
|
346
|
+
declare function inferFieldType(label: string, value: string): FormFieldType;
|
|
347
|
+
/**
|
|
348
|
+
* 양식 필드 인식 + 타입/필수/빈값 추론 — 폼 UI 자동 생성용 (v3.1).
|
|
349
|
+
* extractFormFields 결과에 type(date/phone/amount/checkbox/...)·required·empty를 부여한다.
|
|
350
|
+
*/
|
|
351
|
+
declare function extractFormSchema(blocks: IRBlock[]): FormSchemaResult;
|
|
320
352
|
|
|
321
353
|
/** 양식 서식 필드 값 채우기 — IRBlock[] 기반 in-place 교체 */
|
|
322
354
|
|
|
@@ -350,10 +382,26 @@ interface FillResult {
|
|
|
350
382
|
declare function fillFormFields(blocks: IRBlock[], values: Record<string, string>): FillResult;
|
|
351
383
|
|
|
352
384
|
/**
|
|
353
|
-
* HWPX 원본 서식 유지 채우기 —
|
|
385
|
+
* HWPX 원본 서식 유지 채우기 — section XML 오프셋 splice (v3.1, 바이트 보존)
|
|
354
386
|
*
|
|
355
|
-
*
|
|
356
|
-
*
|
|
387
|
+
* v3.0까지는 xmldom 전체 재직렬화 방식이라 변경하지 않은 영역도 속성 순서·
|
|
388
|
+
* 공백·자기닫힘 표기가 바뀔 수 있었다. v3.1부터 patchHwpx와 동일한
|
|
389
|
+
* source-map splice + ZIP in-place 재조립을 사용해, 변경 문단 외 XML과
|
|
390
|
+
* 비변경 ZIP 엔트리를 1바이트도 건드리지 않는다.
|
|
391
|
+
*
|
|
392
|
+
* 전략 (v3.0과 동일, 적용 순서 보존):
|
|
393
|
+
* 0. 인셀 패턴 — 체크박스 □→☑, 괄호 빈칸 ( )→(값), 어노테이션 (한자:)→(한자:값)
|
|
394
|
+
* 1. 인접 라벨-값 셀 — label | value (패턴 적용 셀은 값을 앞에 삽입해 어노테이션 보존)
|
|
395
|
+
* 2. 헤더+데이터 행 — 첫 행이 전부 라벨이면 열 단위 매칭 (나중 쓰기 우선 — v3.0 동일)
|
|
396
|
+
* 3. 인라인 "라벨: 값" — 표 밖 본문/글상자/머리말·꼬리말·각주 문단
|
|
397
|
+
*
|
|
398
|
+
* 적용 범위는 v3.0과 동일하게 머리말/꼬리말 등 ctrl 내부 표·문단을 포함하고
|
|
399
|
+
* (scan.orphanTables/excludedParagraphs), 셀 라벨 판정은 v3.0과 동일하게
|
|
400
|
+
* 글상자(drawText) 문단을 제외한다. 패턴 매칭·범위 치환은 hp:t 연결 텍스트
|
|
401
|
+
* (t-도메인) 좌표로 수행해 사이에 끼인 tab/br 요소를 건드리지 않는다.
|
|
402
|
+
*
|
|
403
|
+
* v3.0과의 의도적 차이: 인셀 패턴(전략 0)은 문단 단위로 매칭한다 — 문단
|
|
404
|
+
* 경계에 걸친 패턴(극히 드묾)은 채우지 않는다.
|
|
357
405
|
*/
|
|
358
406
|
|
|
359
407
|
/** 채우기 결과 */
|
|
@@ -412,6 +460,122 @@ interface MarkdownToHwpxOptions {
|
|
|
412
460
|
*/
|
|
413
461
|
declare function markdownToHwpx(markdown: string, options?: MarkdownToHwpxOptions): Promise<ArrayBuffer>;
|
|
414
462
|
|
|
463
|
+
/**
|
|
464
|
+
* HWPX 라운드트립 소스맵 — section XML 문자열에서 문단/표 셀의 문자 범위를 추적.
|
|
465
|
+
*
|
|
466
|
+
* DOM 재직렬화를 거치지 않고(속성 순서·공백·자기닫힘 표기까지 보존하기 위해)
|
|
467
|
+
* 정규식 토크나이저로 태그를 순회하며, 각 <hp:p>가 소유한 <hp:t> 콘텐츠 범위를
|
|
468
|
+
* 기록한다. 패치는 이 범위에 대한 문자열 splice로만 수행되어
|
|
469
|
+
* 변경 문단 외 XML 바이트가 그대로 보존된다 (filler-hwpx.ts 패턴의 오프셋 버전).
|
|
470
|
+
*/
|
|
471
|
+
/** <hp:t> 콘텐츠 범위 — [contentStart, contentEnd) 가 여는/닫는 태그 사이 */
|
|
472
|
+
interface TRange {
|
|
473
|
+
contentStart: number;
|
|
474
|
+
contentEnd: number;
|
|
475
|
+
/** 자기닫힘 <hp:t/> — 범위가 태그 전체이며, 치환 시 태그째 교체 */
|
|
476
|
+
selfClosing?: boolean;
|
|
477
|
+
/** 자기닫힘 치환용 네임스페이스 프리픽스 (예: "hp") */
|
|
478
|
+
prefix?: string;
|
|
479
|
+
}
|
|
480
|
+
type ScanParaKind = "body" | "cell" | "draw" | "excluded";
|
|
481
|
+
/** 스캔된 문단 — 소유한 hp:t 범위와 합산 텍스트 */
|
|
482
|
+
interface ScanParagraph {
|
|
483
|
+
sectionIndex: number;
|
|
484
|
+
kind: ScanParaKind;
|
|
485
|
+
/** <hp:p ...> 여는 태그 시작 위치 (문서 순서 정렬용) */
|
|
486
|
+
start: number;
|
|
487
|
+
/** 소유 hp:t 콘텐츠 범위 (문서 순서) */
|
|
488
|
+
tRanges: TRange[];
|
|
489
|
+
/** hp:t 텍스트 합산 (엔티티 디코딩, 내부 태그는 공백화) */
|
|
490
|
+
text: string;
|
|
491
|
+
/** hp:t가 하나도 없을 때 텍스트 삽입 가능한 위치 (첫 run 닫는 태그 앞) */
|
|
492
|
+
runInsertPos?: number;
|
|
493
|
+
/** runInsertPos에 삽입할 때 쓸 t 태그 prefix (예: "hp") */
|
|
494
|
+
runPrefix?: string;
|
|
495
|
+
/** 자기닫힘 <hp:run/> 태그 범위 — t 삽입 시 펼쳐서 사용 (한컴 빈 문단 패턴) */
|
|
496
|
+
selfCloseRun?: {
|
|
497
|
+
start: number;
|
|
498
|
+
end: number;
|
|
499
|
+
};
|
|
500
|
+
/** 글상자(drawText) 경유 문단 — 셀 라벨 판정 등에서 본문과 구분 (v3.1) */
|
|
501
|
+
inTextbox?: boolean;
|
|
502
|
+
}
|
|
503
|
+
/** 스캔된 표 셀 — 앵커 좌표와 셀 내부 문단 */
|
|
504
|
+
interface ScanCell {
|
|
505
|
+
rowAddr?: number;
|
|
506
|
+
colAddr?: number;
|
|
507
|
+
colSpan: number;
|
|
508
|
+
rowSpan: number;
|
|
509
|
+
paragraphs: ScanParagraph[];
|
|
510
|
+
/** 셀 내부 중첩표 (문서 순서) */
|
|
511
|
+
tables: ScanTable[];
|
|
512
|
+
}
|
|
513
|
+
/** 스캔된 표 */
|
|
514
|
+
interface ScanTable {
|
|
515
|
+
sectionIndex: number;
|
|
516
|
+
start: number;
|
|
517
|
+
/** 최상위 표 여부 (다른 표/ctrl/캡션 내부가 아님) */
|
|
518
|
+
topLevel: boolean;
|
|
519
|
+
/** 비어있지 않은 행들 (tr 순서) */
|
|
520
|
+
rows: ScanCell[][];
|
|
521
|
+
/** 앵커 좌표 → 셀 ("r,c") */
|
|
522
|
+
cellByAnchor: Map<string, ScanCell>;
|
|
523
|
+
}
|
|
524
|
+
/** 섹션 하나의 스캔 결과 */
|
|
525
|
+
interface SectionScan {
|
|
526
|
+
sectionIndex: number;
|
|
527
|
+
xml: string;
|
|
528
|
+
/** body + draw 문단 (문서 순서) — 본문 텍스트 매핑 대상 */
|
|
529
|
+
bodyParagraphs: ScanParagraph[];
|
|
530
|
+
/** 최상위 표 (문서 순서) */
|
|
531
|
+
tables: ScanTable[];
|
|
532
|
+
/** 머리말/꼬리말 문단 텍스트 (OB 앞/뒤 배치 블록 식별용) */
|
|
533
|
+
headerTexts: string[];
|
|
534
|
+
footerTexts: string[];
|
|
535
|
+
/**
|
|
536
|
+
* 파서 비가시 영역(머리말/꼬리말/각주/캡션/메모 등 ctrl 내부) 문단 — v3.1.
|
|
537
|
+
* patcher 매핑 대상이 아니며, filler가 이 영역의 인라인 패턴을 채울 때 사용.
|
|
538
|
+
*/
|
|
539
|
+
excludedParagraphs: ScanParagraph[];
|
|
540
|
+
/**
|
|
541
|
+
* 어느 셀에도 속하지 않는 비최상위 표(머리말/꼬리말 등 ctrl 내부) — v3.1.
|
|
542
|
+
* filler 전용. patcher의 표 서수 매핑(tables)에는 포함되지 않는다.
|
|
543
|
+
*/
|
|
544
|
+
orphanTables: ScanTable[];
|
|
545
|
+
}
|
|
546
|
+
/** 문자열 splice 편집 — [start, end) 를 replacement로 치환 */
|
|
547
|
+
interface SpliceEdit {
|
|
548
|
+
start: number;
|
|
549
|
+
end: number;
|
|
550
|
+
replacement: string;
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* section XML 한 개를 스캔하여 소스맵을 만든다.
|
|
554
|
+
* 토크나이저는 xmldom과 무관하게 동작하며, 위치(오프셋) 정보가 핵심이다.
|
|
555
|
+
*/
|
|
556
|
+
declare function scanSectionXml(xml: string, sectionIndex: number): SectionScan;
|
|
557
|
+
/**
|
|
558
|
+
* 문단 텍스트 치환용 splice 생성 — filler-hwpx.ts replaceCellText와 동일 전략:
|
|
559
|
+
* 첫 hp:t에 새 텍스트(이스케이프), 나머지 hp:t는 비움. run 구조/charPr 보존.
|
|
560
|
+
* t가 없으면 첫 run 끝에 <hp:t> 삽입. 실패 시 null.
|
|
561
|
+
*
|
|
562
|
+
* IR 텍스트는 sanitize로 양끝 공백이 제거된 상태라, 통째 교체 시 원본의
|
|
563
|
+
* 선행 공백(들여쓰기)/후행 공백이 소실된다 — 원본 t-도메인 텍스트에서
|
|
564
|
+
* 양끝 공백을 복원해 새 텍스트에 입힌다 (재파싱 IR은 동일하게 유지됨).
|
|
565
|
+
*/
|
|
566
|
+
declare function buildParagraphSplices(para: ScanParagraph, newText: string, xml?: string): SpliceEdit[] | null;
|
|
567
|
+
/**
|
|
568
|
+
* t-도메인 텍스트(paraTText 좌표계)의 [start, end) 범위만 치환하는 정밀 splice
|
|
569
|
+
* — run/탭 구조 보존 (v3.1).
|
|
570
|
+
*
|
|
571
|
+
* 좌표계가 t-도메인이므로 tab/br이 사이에 끼어 있어도 동작한다 (해당 요소는
|
|
572
|
+
* 건드리지 않고 t 콘텐츠만 수술). hp:t 콘텐츠에 엔티티/내부 태그가 있으면
|
|
573
|
+
* 오프셋 정합이 깨지므로 null을 반환한다 (호출자가 폴백 결정).
|
|
574
|
+
*/
|
|
575
|
+
declare function buildRangeSplices(para: ScanParagraph, xml: string, start: number, end: number, replacement: string): SpliceEdit[] | null;
|
|
576
|
+
/** splice 일괄 적용 — 겹침 검증 후 뒤에서부터 치환 */
|
|
577
|
+
declare function applySplices(xml: string, splices: SpliceEdit[]): string;
|
|
578
|
+
|
|
415
579
|
/**
|
|
416
580
|
* HWPX 서식 보존 무손실 라운드트립 패치 — v3.0 킬러기능.
|
|
417
581
|
*
|
|
@@ -433,6 +597,125 @@ declare function markdownToHwpx(markdown: string, options?: MarkdownToHwpxOption
|
|
|
433
597
|
*/
|
|
434
598
|
declare function patchHwpx(original: Uint8Array, editedMarkdown: string, options?: PatchOptions): Promise<PatchResult>;
|
|
435
599
|
|
|
600
|
+
/**
|
|
601
|
+
* HWP 5.x 바이너리 서식 보존 무손실 라운드트립 패치 — patchHwpx의 HWP5 대응.
|
|
602
|
+
*
|
|
603
|
+
* parse()로 얻은 마크다운을 편집한 뒤 patchHwp()에 넘기면, 원본 HWP의
|
|
604
|
+
* CFB/레코드 구조를 그대로 두고 변경된 문단/표 셀의 PARA_TEXT만 치환한다.
|
|
605
|
+
* 연쇄 갱신: PARA_HEADER nChars, CHAR_SHAPE 위치, LINE_SEG 재구성, 레코드
|
|
606
|
+
* 크기 재계산 → 섹션 스트림 재직렬화 → deflate 재압축 → CFB 재조립.
|
|
607
|
+
*
|
|
608
|
+
* 안전 게이트 (하나라도 깨지면 해당 수정은 graceful skip — 파일 무결성 우선):
|
|
609
|
+
* - 섹션 레코드 재직렬화가 원본과 바이트 동일해야 패치 허용
|
|
610
|
+
* - ctrlMask=0(순수 텍스트) + PARA_TEXT 1개 + 레코드 텍스트 재구성 일치 문단만 수정
|
|
611
|
+
* - 배포용/암호화/DRM 문서는 전체 거부
|
|
612
|
+
*
|
|
613
|
+
* 지원: 본문 문단/헤딩 텍스트 수정, GFM 표 셀 텍스트 수정 (좌표 기반).
|
|
614
|
+
* 미지원(graceful skip): 블록 추가/삭제, 표 구조 변경, HTML 표 셀, 캡션·각주·
|
|
615
|
+
* 머리말/꼬리말, 컨트롤(탭/개체/필드) 포함 문단. skipped[]에 사유 보고.
|
|
616
|
+
*/
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* 원본 HWP 5.x와 편집된 마크다운으로 서식 보존 패치본을 만든다.
|
|
620
|
+
*
|
|
621
|
+
* @param original 원본 HWP 바이트 (OLE2/CFB)
|
|
622
|
+
* @param editedMarkdown parse(original).markdown을 편집한 마크다운
|
|
623
|
+
*/
|
|
624
|
+
declare function patchHwp(original: Uint8Array, editedMarkdown: string, options?: PatchOptions): Promise<PatchResult>;
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* HWPX 문서 세션 — 에디터 통합용 블록 단위 증분 패치 API (v3.1).
|
|
628
|
+
*
|
|
629
|
+
* patchHwpx가 "편집된 마크다운 전체"를 받아 내부에서 LCS 정렬하는 것과 달리,
|
|
630
|
+
* 세션은 블록 인덱스로 직접 편집을 지정한다 (에디터의 블록 클릭-편집에 대응).
|
|
631
|
+
*
|
|
632
|
+
* 설계 원칙:
|
|
633
|
+
* - 매핑은 patcher와 동일한 알고리즘 재사용 (정규화 텍스트 버킷 + 표 서수) —
|
|
634
|
+
* "n회 연속 patchBlocks ≡ 일괄 patchHwpx" 동등성이 성립하는 근거.
|
|
635
|
+
* - 패치 후 상태는 새 바이트에서 전체 재구축 (오프셋 리베이스 대신 재스캔 —
|
|
636
|
+
* 성능보다 정합성). patchBlocks 호출 후 이전 블록 인덱스는 무효이며
|
|
637
|
+
* session.blocks를 다시 읽어야 한다.
|
|
638
|
+
* - capability()는 patcher의 graceful-skip 게이트를 사전 판정으로 노출 —
|
|
639
|
+
* 에디터가 편집 전에 잠금 UI를 띄울 수 있는 단일 진실 소스.
|
|
640
|
+
*/
|
|
641
|
+
|
|
642
|
+
/** 블록 편집 가능성 — 에디터 잠금 UI의 근거 */
|
|
643
|
+
type BlockCapability = "text" | "cell-text" | "locked";
|
|
644
|
+
interface CellCapability {
|
|
645
|
+
editable: boolean;
|
|
646
|
+
/** 편집 불가 사유 (한국어) */
|
|
647
|
+
reason?: string;
|
|
648
|
+
}
|
|
649
|
+
interface BlockCapabilityInfo {
|
|
650
|
+
capability: BlockCapability;
|
|
651
|
+
/** locked 사유 (한국어) */
|
|
652
|
+
reason?: string;
|
|
653
|
+
/** 표 블록: IRTable 격자 좌표(row×col)별 셀 편집 가능 여부 */
|
|
654
|
+
cells?: CellCapability[][];
|
|
655
|
+
}
|
|
656
|
+
/** 블록 → 원본 위치 참조 (에디터 하이라이트/점프용) */
|
|
657
|
+
interface BlockSourceRef {
|
|
658
|
+
kind: "paragraph" | "table";
|
|
659
|
+
/** 0-based 섹션 인덱스 */
|
|
660
|
+
sectionIndex: number;
|
|
661
|
+
/** 섹션 XML 내 시작 문자 오프셋 (<hp:p>/<hp:tbl> 여는 태그) */
|
|
662
|
+
xmlStart: number;
|
|
663
|
+
}
|
|
664
|
+
/** 블록 단위 편집 — patchBlocks 입력 */
|
|
665
|
+
interface BlockEdit {
|
|
666
|
+
/** session.blocks 기준 0-based 블록 인덱스 */
|
|
667
|
+
blockIndex: number;
|
|
668
|
+
/**
|
|
669
|
+
* 문단/헤딩 블록의 새 텍스트 (평문).
|
|
670
|
+
* 빈 문자열(비우기)은 미지원 — patchHwpx의 "블록 삭제 미지원"과 정합
|
|
671
|
+
* (비우면 재파싱 시 블록 핸들이 사라져 세션으로 복구 불가).
|
|
672
|
+
*/
|
|
673
|
+
newText?: string;
|
|
674
|
+
/** 표 블록의 셀 편집 (IRTable 격자 좌표 기준). 이미지가 든 셀은 이미지
|
|
675
|
+
* 토큰(``/`[이미지: ...]`)을 유지한 채 텍스트만 수정해야 한다. */
|
|
676
|
+
cells?: Array<{
|
|
677
|
+
row: number;
|
|
678
|
+
col: number;
|
|
679
|
+
text: string;
|
|
680
|
+
}>;
|
|
681
|
+
}
|
|
682
|
+
declare class HwpxSession {
|
|
683
|
+
private state;
|
|
684
|
+
private constructor();
|
|
685
|
+
/** HWPX 바이트로 세션을 연다 (입력은 복사되어 외부 변이와 격리) */
|
|
686
|
+
static open(input: Uint8Array | ArrayBuffer): Promise<HwpxSession>;
|
|
687
|
+
/** 현재 문서의 IR 블록 — patchBlocks 후 갱신되므로 호출마다 다시 읽을 것 */
|
|
688
|
+
get blocks(): IRBlock[];
|
|
689
|
+
/** 현재 문서의 마크다운 */
|
|
690
|
+
get markdown(): string;
|
|
691
|
+
/** 현재 문서 바이트 (복사본) */
|
|
692
|
+
get bytes(): Uint8Array;
|
|
693
|
+
/** 블록 → 원본 위치 참조. 매핑 실패 시 undefined */
|
|
694
|
+
sourceRef(blockIndex: number): BlockSourceRef | undefined;
|
|
695
|
+
/** 블록 편집 가능성 사전 판정 — patcher graceful-skip 게이트의 사전 버전 */
|
|
696
|
+
capability(blockIndex: number): BlockCapabilityInfo;
|
|
697
|
+
/** 전 블록의 편집 가능성 */
|
|
698
|
+
capabilities(): BlockCapabilityInfo[];
|
|
699
|
+
/**
|
|
700
|
+
* 블록 단위 증분 패치 — 적용 후 세션 상태가 새 바이트로 갱신된다.
|
|
701
|
+
*
|
|
702
|
+
* - 호출은 내부적으로 직렬화된다 (동시 호출 시 도착 순서대로 누적 적용)
|
|
703
|
+
* - 무변경 편집(현재 텍스트와 동일)은 조용히 건너뜀 (applied/skipped 모두 제외)
|
|
704
|
+
* - 변경이 하나도 적용되지 않으면 반환 data는 현재 문서와 바이트 동일
|
|
705
|
+
* - changes는 "패치 전 → 후" 문서 diff — modified 수가 기대 편집 수와
|
|
706
|
+
* 일치하는지 확인 용도. patchHwpx의 verification(잔차 검증)과 의미가 다르다.
|
|
707
|
+
*/
|
|
708
|
+
patchBlocks(edits: BlockEdit[], options?: PatchOptions): Promise<PatchResult>;
|
|
709
|
+
private opQueue;
|
|
710
|
+
private patchBlocksInner;
|
|
711
|
+
/** 문단/헤딩 평문 편집 — patcher.patchParagraphUnit의 평문 입력 버전 */
|
|
712
|
+
private patchParagraphPlain;
|
|
713
|
+
}
|
|
714
|
+
/** HWPX 문서 세션 열기 */
|
|
715
|
+
declare function openHwpxDocument(input: Uint8Array | ArrayBuffer): Promise<HwpxSession>;
|
|
716
|
+
/** 원샷 블록 패치 — 세션 없이 한 번에 (stateless RPC용) */
|
|
717
|
+
declare function patchHwpxBlocks(original: Uint8Array | ArrayBuffer, edits: BlockEdit[], options?: PatchOptions): Promise<PatchResult>;
|
|
718
|
+
|
|
436
719
|
/**
|
|
437
720
|
* Print Renderer — Markdown / IRBlock[] → PDF (puppeteer-core 기반).
|
|
438
721
|
*
|
|
@@ -578,4 +861,4 @@ interface FillFormOutput {
|
|
|
578
861
|
*/
|
|
579
862
|
declare function fillForm(input: string | ArrayBuffer | Buffer, values: Record<string, string>, outputFormat?: FillOutputFormat): Promise<FillFormOutput>;
|
|
580
863
|
|
|
581
|
-
export { type BlockDiff, type BoundingBox, type CellContext, type CellDiff, type DiffChangeType, type DiffResult, type DocumentMetadata, type DocumentQualitySummary, type ErrorCode, type ExtractedImage, type FileType, type FillFormOutput, type FillOutputFormat, type FillResult, type FormField, type FormResult, type HwpxFillResult, type HwpxTheme, type IRBlock, type IRBlockType, type IRCell, type IRTable, type ImageData, type InlineStyle, type MarkdownToHwpxOptions, type OcrProvider, type OutlineItem, type PageMargin, type PageQuality, type ParseFailure, type ParseOptions, type ParseResult, type ParseSuccess, type ParseWarning, type PatchOptions, type PatchResult, type PatchSkip, type PrintOptions, type PrintPreset, VERSION, type WarningCode, type WatchOptions, blocksToMarkdown, blocksToPdf, compare, detectFormat, detectOle2Format, detectZipFormat, diffBlocks, extractFormFields, fillForm, fillFormFields, fillHwpx, isHwpxFile, isLabelCell, isOldHwpFile, isPdfFile, isZipFile, markdownToHwpx, markdownToPdf, parse, parseDocx, parseHwp, parseHwp3, parseHwpml, parseHwpx, parsePdf, parseXls, parseXlsx, patchHwpx, renderHtml };
|
|
864
|
+
export { type BlockCapability, type BlockCapabilityInfo, type BlockDiff, type BlockEdit, type BlockSourceRef, type BoundingBox, type CellCapability, type CellContext, type CellDiff, type DiffChangeType, type DiffResult, type DocumentMetadata, type DocumentQualitySummary, type ErrorCode, type ExtractedImage, type FileType, type FillFormOutput, type FillOutputFormat, type FillResult, type FormField, type FormFieldSchema, type FormFieldType, type FormResult, type FormSchemaResult, type HwpxFillResult, HwpxSession, type HwpxTheme, type IRBlock, type IRBlockType, type IRCell, type IRTable, type ImageData, type InlineStyle, type MarkdownToHwpxOptions, type OcrProvider, type OutlineItem, type PageMargin, type PageQuality, type ParseFailure, type ParseOptions, type ParseResult, type ParseSuccess, type ParseWarning, type PatchOptions, type PatchResult, type PatchSkip, type PrintOptions, type PrintPreset, type ScanCell, type ScanParaKind, type ScanParagraph, type ScanTable, type SectionScan, type SpliceEdit, type TRange, VERSION, type WarningCode, type WatchOptions, applySplices, blocksToMarkdown, blocksToPdf, buildParagraphSplices, buildRangeSplices, compare, detectFormat, detectOle2Format, detectZipFormat, diffBlocks, extractFormFields, extractFormSchema, fillForm, fillFormFields, fillHwpx, inferFieldType, isHwpxFile, isLabelCell, isOldHwpFile, isPdfFile, isZipFile, markdownToHwpx, markdownToPdf, openHwpxDocument, parse, parseDocx, parseHwp, parseHwp3, parseHwpml, parseHwpx, parsePdf, parseXls, parseXlsx, patchHwp, patchHwpx, patchHwpxBlocks, renderHtml, scanSectionXml };
|