Releases: airmang/python-hwpx
Releases · airmang/python-hwpx
v2.16.0
[2.16.0] - 2026-06-29
추가
- M3 문서 작성 (S-057):
create_document_from_plan이document_type(공문/보고서/가정통신문)을 보고 실제 한컴-harvest 프로파일(hwpx.design.compose)로 라우팅합니다. 미매칭 유형은 기존 제로베이스 경로를 유지하고-> HwpxDocument반환 계약을 보존합니다. 공문은 결문 메타document_plan.gyeolmun = {issuer, productionNumber, enforcementDate, disclosure}를 지원합니다. hwpx.design.profiles.home_notice— 실제 가정통신문에서 harvest한 디자인 프로파일.- 공문 구조 hard-gate:
inspect_official_document_style(source, *, document_type="공문")이 시행문 척추(수신·발신명의·시행·공개구분·끝.)를 ERROR 심각도로 검사하고structure_pass를 반환합니다. 표 셀까지 읽는 table-aware 텍스트 추출(실 시행문의 두문/결문은 표 안에 있음)을 추가했고, 진짜 시행문(tests/fixtures/m3_gongmun_gold/seoul_sihaengmun.hwpx)을 앵커로 삼습니다. inspect_document_authoring_quality에korean_proofing_status(정직unverified/llm_proofed_not_oracle_verified, 거짓 통과 없음)와verify_render=True시 실제 한컴 렌더 영수증render_checked/visual_complete를 추가했습니다.
비고
- 각주(footnote) 작성은 한컴 렌더가 확인되지 않아 honest-deferred(
unverified) 상태입니다.
v2.15.0
[2.15.0] - 2026-06-27
추가
HwpxDocument.set_paragraph_format(keep_with_next=, keep_lines=, page_break_before=)— 문단 keep-together 플래그를 엔진ensure_paragraph_format(break_setting=)로 전달한다(새 paraPr 발행, 기존 paraPr 미수정 = 무손실). 시험지 조판 등에서 한 문항이 단/쪽 경계에서 잘리지 않게 묶을 때 쓴다.hwpx.exam: re-typeset an authored exam (Markdown) into a school form.hwpx
— Exam IR + strict md parser, form profiler (role→existing form style),
keep-together body composition (insert into the form's body region, never
append; 관리박스 + footer preserved byte-identical), and an oracle convergence
drivercompose_exam_into_form. The driver renders via Hancom and, when the
composed 문항 are in the extractable text layer, verifies 문항-split / overflow
/ placeholder integrity (inserting column/page breaks to converge); when they
are not (forms whose body Hancom exports as vector curves) or no oracle is
available, it returnsrender_checked/splits=None+needs_reviewrather
than a silent pass (Constitution V — honest unverified).find_seal_anchor— 발신명의가 좁은 표 셀에서 여러 줄로 wrap된 경우도 앵커를 찾는 fallback(연속 줄 윈도우, 최대 3줄). 단일 줄 매칭이 우선이라 기존 동작 불변; spurious 다중줄 매칭은 윈도우·동일페이지로 차단.
수정
paragraph.add_picture—treat_as_char=True(inline)인데pos_overrides(PAPER relTo/offset)를 주면 모순된 inline/floating<hp:pos>를 방출하던 것을ValueError로 fail-fast. floating 배치는treat_as_char=False에서만.
v2.13.0
[2.13.0] - 2026-06-24
추가
hwpx.conformance— VisualComplete 적합성 코퍼스 + 배지 등급(plan §2 Phase G).hwpx-conformance run이 코퍼스를 4개 배지 등급(Open-Safe/Semantic-Safe/Form-Safe/VisualComplete)으로 채점하고 등급별 통과율을 산출합니다. 임계값은 엄격 기본값(구조 등급 100%, 폼셋 overflow 0%, VisualComplete ≥95%). golden 베이스라인(tests/conformance/golden/structural.json) 대비 회귀를 숫자로 감지하며(--check), CI가 구조 등급을 추적합니다. 어슈어런스 등급은 절대 섞지 않습니다(§0.0): 한컴이 없는 구조 실행은 VisualComplete를unverified로 보고하고, 오라클 실행(도달 가능한 한컴 백엔드)만 VisualComplete를 검증합니다. 케이스에before(+선택적editMask)를 선언하면 VisualComplete가 오라클의 before/after diff 경로로 게이트됩니다(마스크 밖 변경·글자 겹침을 잡음).expectVisualDefect는 일부러 깨뜨린 쌍을 positive control로 삼아 게이트가 결함을 실제로 잡는지 검증합니다. (실측: 실제 한컴-저장 코퍼스에서 clean 쌍은 통과, out-of-slot 변경은 catch.)
v2.11.1
[2.11.1] - 2026-06-12
수정
create_document_from_plan()의headingblock과 builderHeading이 기본 템플릿의개요 N/Outline N문단 스타일을 실제로 적용하도록 수정했습니다. 생성 문서가 한컴 개요/문서 탐색과 MCP outline readback에서 구조화된 제목으로 인식됩니다.- document-plan 기본 스타일 preset에 제목 18pt, 부제 12pt, 장 제목 14pt 글자 크기와 함초롬바탕 폰트를 적용해 보고서 생성 시 제목/본문 시각 위계가 명확하게 보이도록 했습니다.
v2.11.0
[2.11.0] - 2026-06-12
추가
- 시드 결정적 퍼징 수렴 루프
hwpx.tools.fuzz(시나리오 카탈로그·생성기·3중 오라클 러너·최소화)와tests/fixtures/fuzz_regressions회귀 박제 수트를 추가했습니다. - 레이아웃 근사 프리뷰 렌더러
hwpx.tools.layout_preview를 추가했습니다(페이지 박스·표·여백 근사 HTML/PNG — 에이전트 자기검증용). - section XML 바이트 splice 기반 문단 패치 경로
hwpx.patch를 추가했습니다(미수정 영역 바이트 보존). - 그림 자산 안전 삽입·치환 API(
add_picture및 치환 워크플로)와 manifest 검증을 추가했습니다. - 기존 문서 서식 편집 API를 추가했습니다: 문단 정렬·줄간격·들여쓰기·문단 간격, 용지·여백·방향, 머리말/꼬리말·쪽번호, 불릿/번호 형식.
- 누름틀(클릭히어 필드) 1급 조회·채움 API를 추가했습니다.
- 공문서 작성규정 lint
hwpx.tools.official_lint(항목기호 위계·"끝." 표시·붙임·날짜 표기)와 결재란 프리셋을 추가했습니다. - 고급 생성기
hwpx.tools.advanced_generators를 추가했습니다: 사진대지(build_image_grid)·회의 명패(build_meeting_nameplates)·표 기반 조직도. - 신구대조 문단 diff와 참조 정합 lint
hwpx.tools.doc_diff를 추가했습니다. - 메일머지 대량 생성과 표 합계·평균 계산 유틸
hwpx.tools.mail_merge를 추가했습니다. - 참조 문서 서식 프로파일 추출·적용과 템플릿 레지스트리
hwpx.tools.style_profile을 추가했습니다. - template analyzer 리포트를 강화했습니다(열너비 재구성·cell margin·vertAlign).
변경
hwpx.oxml.document모놀리스(5,700여 줄)를 요소별 모듈(_document_impl외 18개)로 분할했습니다. 공개 API는 변하지 않습니다.
수정
- 신뢰할 수 없는 입력 파싱을 강건화했습니다(
hwpx.opc.security): XML entity 선언 거부와 깊이/크기 한도, ZIP 압축비·멤버 수 한도를 적용해 entity 폭탄·압축 폭탄 입력을 안전하게 거부합니다.
v2.10.3
[2.10.3] - 2026-06-09
추가
hwpx.tools.validate_editor_open_safety()와EditorOpenSafetyReport를 추가해 package validation, document validation, 재오픈 검증을 한 곳에서 확인할 수 있게 했습니다.
수정
- 텍스트를 줄이는 저수준 편집 뒤 stale
hp:linesegarray가 남아 한컴 편집기에서 열리지 않을 수 있는 문제를 막기 위해, 저장 직전 plain-text 문단의 무효한 layout cache를 제거합니다. - 편집된 section과 public 저수준 section write 경로는 모든
hp:lineSegArraylayout cache를 제거해, 복합 문단처럼 stale 여부를 안전하게 계산하기 어려운 경우도 편집기가 다시 계산하도록 했습니다. - public 저수준 section/header XML write 경로도 Hancom-compatible root namespace 선언과
standalone="yes"XML declaration을 보정해 generic XML serializer 출력이 그대로 저장되지 않도록 했습니다. HwpxDocument.to_bytes(),save_to_path(),save_to_stream()이 생성된 패키지의 editor-open safety를 확인한 뒤에만 결과를 반환하거나 쓰도록 보강했습니다.save_to_path()는 safety 실패 시 기존 대상 파일을 교체하지 않습니다.HwpxPackage.save()도 editor-open safety를 기본 검증해 저수준 package 직접 편집이 unsafe HWPX를 bytes/path/stream으로 내보내지 않도록 막습니다.- public
HwpxPackage.save()에서 editor-open safety 검증을 우회하는 파라미터를 제공하지 않도록 정리했습니다. 검증 실패 상태의 bytes snapshot은 package 내부 진단 토큰이 있는 경로에서만 생성하며, unchecked 경로는 caller-provided file path/stream에 직접 쓸 수 없습니다. HwpxDocument._to_bytes_raw()의 open-safety bypass 인자를 제거해 document 객체에서 unchecked bytes를 얻는 실수성 우회 경로를 더 좁혔습니다.- private archive writer도 save 내부 컨텍스트에서만 동작하게 해,
_write_archive()/_write_zip_entry()직접 호출로 editor-open safety 검증을 건너뛴 ZIP을 만드는 실수성 우회 경로를 막았습니다. - 문서/package 저장 중 open-safety, 실제 파일 쓰기, stream short write가 실패하면 dirty 상태를 성공처럼 정리하지 않도록 보강했습니다. seek 가능하고 안전하게 복원 가능한 stream은 쓰기 실패 시 원래 내용으로 rollback합니다.
- archive pack CLI가 재패킹 결과를 editor-open safety 리포트로 재검증하고, 실패 시 기존 output을 보존합니다. 성공 시
PackResult.open_safety와 CLIopen_safety_ok=true출력으로 handoff evidence를 제공합니다. - repair/recover 출력도 CRC와 package validation 뒤에 editor-open safety를 재검증하고, section의
hp:lineSegArraylayout cache 제거와 section/header root namespace 및standalone="yes"보정을 적용합니다. 실패 시 기존 output은 보존하고, 성공 시RepairResult.open_safety로 handoff evidence를 제공합니다. - template form-fit apply가 최종 목적지에 먼저 복사하지 않고 temp 파일에서 저장 및 editor-open safety 검증을 끝낸 뒤에만 교체하도록 보강했습니다.
- builder
Document.save_to_path()리포트에editor_open_safetyhard gate와 세부 리포트를 포함합니다. - template form-fit paragraph clone 경로가 텍스트를 직접 바꿀 때도 layout cache를 제거합니다.
- package validator가 실제 텍스트 길이를 넘어서는
lineseg/@textpos를 hard error로 보고하도록 보강했습니다. EditorOpenSafetyReport.ok가 package/reopen뿐 아니라 document validation 실행 실패와 hard error도 반영하도록 보강했습니다.- 저장 직전 paragraph의
styleIDRef가Normal/본문처럼 header style 이름으로 잘못 들어간 경우, 일치하는 numeric style id로 정규화해 저수준 편집 산출물이 document validation에서 차단되거나 편집기 오픈 리스크를 만들지 않도록 했습니다. HwpxPackage.save(updates=...)같은 순수 package 저수준 저장 경로도 header style 이름으로 된 paragraphstyleIDRef를 numeric id로 정규화해, MCP를 거치지 않는 직접 ZIP/XML 편집 산출물도 같은 safety 보정을 받도록 했습니다.
v2.10.2
[2.10.2] - 2026-06-06
추가
hwpx.tools.markdown_export.export_markdown()와HwpxDocument.export_rich_markdown()을 추가해 풍부한 Markdown 변환을 지원합니다. 인라인 서식(굵게/기울임/취소선/색상/하이라이트), 표 병합 셀(colspan/rowspan HTML), 중첩 표 재귀,rect/ellipse/polygon도형 내부 paragraph, BinData 이미지 추출,Ⅰ./1.패턴 기반 헤딩 감지(#/##), 각주·미주(정확 위치 마커 +fn1/en1일련번호 + 본문 인라인 서식), 하이퍼링크([text](url)) 보존을 한 번에 처리합니다. 기존HwpxDocument.export_markdown()은 그대로 유지됩니다.HwpxOxmlNote에 본문 paragraph 접근/편집 helper를 추가했습니다:body_paragraphproperty,add_run(text, *, char_pr_id_ref=..., bold=..., italic=..., underline=..., color=..., font=..., size=..., highlight=..., strike=..., attributes=...),add_hyperlink(url, display_text, *, char_pr_id_ref=...). XML 직접 조작 없이 각주 본문에 혼합 서식 run과 하이퍼링크를 추가할 수 있습니다.get_table_map()결과에 본문 표 anchorlocation, 셀 문단별table_cell_paragraphlocation,caption_text,preceding_paragraph_text를 추가했습니다.- 새 컨버터와 helper에 대한 회귀 테스트를
tests/test_markdown_export.py에 추가했습니다.
변경
HwpxOxmlTableCell.text가 셀 내부 여러 문단을 줄바꿈으로 보존하고,set_text(..., preserve_format=True, split_paragraphs=True)경로에서 기존 runcharPrIDRef를 유지하도록 개선했습니다.
수정
HwpxOxmlParagraph.add_footnote()/add_endnote()의char_pr_id_ref인자가 외부 호스팅 run에만 적용되고 각주 본문 run은 항상charPrIDRef="0"으로 하드코딩되던 문제를 수정했습니다. 인자가 사용자 의도대로 본문 run에도 적용됩니다.
v2.10.1
[2.10.1] - 2026-06-04
추가
document_planauthoring을 builder lowering 중심으로 확장하고 v2 builder node, TOC, government_report preset을 지원합니다.- 정부보고서 계산/파싱 유틸리티(
hwpx.tools.report_utils,hwpx.tools.report_parser)와 computed field 치환을 추가했습니다. - generic element coverage inventory, table cleanup, table profile/caption/unit preservation, id reference integrity checker를 추가했습니다.
linesegarray,transMatrix,scaMatrix,rotMatrix, edit/combo box control을 first-class OXML 모델로 승격했습니다.
변경
- builder save report의 hard gate가 id integrity를 실제 검사 결과로 반영하도록 강화했습니다.
- 패키지 rewrite 시
mimetype엔트리를 보존하도록 OPC 저장 경로를 정리했습니다.
v2.10.0
[2.10.0] - 2026-06-02
추가
hwpx.builder공개 패키지를 추가했습니다.Document,Section,Paragraph,Run,Heading,Bullet,NumberedList,Table,Image,Header,Footer,PageNumber,PageBreak,Metadata,PageSize,Margins노드로 조립형 HWPX 생성을 지원합니다.BuilderSaveReport와ReopenReport를 추가해 builder 저장 후 package validation, document error/lint, reopen, feature flags, visual review 필요 여부를 확인할 수 있게 했습니다.- 머리글/바닥글 리치 content, 자동 쪽번호, 리치 런 서식(color/font/size/highlight/strike), 다단계 목록, 표 병합/음영/열너비, 이미지 배치를 위한
HwpxDocumentfacade 및 OXML wrapper 메서드를 추가했습니다. hwpx.document_plan.v1, 운영 계획서 품질 프로필, template form-fit authoring, proposal/form-fill 품질 검증 흐름을 강화했습니다.- hwpxlib sample corpus 기반 oracle fixture와 builder vertical slice 통합 테스트를 추가했습니다.
src/hwpx/tools/_schemas/owpml/에 2011 Hancom 네임스페이스용 subset XSD 번들을 추가했습니다 (header.xsd,body.xsd,paralist.xsd,core.xsd,xml.xsd,NOTICE).hwpx.oxml.load_compound_schema()와SchemaImportError를 추가해 offline compound XSD 로딩을 지원합니다.- fixture matrix 기반 Phase 1 validation 리포트(
shared/hwpx/HWPX_STACK_VALIDATION_2026-04-20_pre-phase1.md,..._post-phase1.md)와 회귀 테스트를 추가했습니다.
변경
validate_document().ok는 error 기준으로 유지하고 schema warning은 lint/warning으로 분리해 가시화합니다.HwpxDocument.save_to_path()기반 저장/재오픈 검증 경로를 builder와 authoring workflow에서 일관되게 사용하도록 정리했습니다.hwpx-validate는 이제 기본 strict 모드로 Phase 1 subset schema bundle을 사용합니다.--no-strict로 warning-only 분류를 지원합니다.HwpxDocument.validate()는 기본strict=False로 동작하며,validate_on_save_strict옵션으로 저장 시 strict 검증을 제어할 수 있습니다.- 패키지 배포물(sdist/wheel)에 OWPML subset schema bundle이 포함되도록 package-data를 확장했습니다.
수정
- split-run placeholder, template form-fit, proposal/document-plan 생성 경로의 회귀를 보강했습니다.
- builder vertical slice에서 Hancom Office HWP 재오픈과 구조 hard gate가 통과하도록 머리글/바닥글 lowering과 page number control 배치를 정렬했습니다.
v2.9.1
[2.9.1] - 2026-04-27
상호운용성(interop) 버그 묶음 릴리즈입니다. 외부 기여자들이 보고하고 수정한 세 가지 문제를 정리합니다.
수정
HwpxOxmlTableCell._ensure_text_element와ensure_run_style내 modifier가 lxml 엘리먼트 상에서 또한ET.SubElement를 호출해TypeError를 발생시키던 경로를 기본 헬퍼_append_child로 정리했습니다. 이제cell.text = ...와paragraph.add_run(..., bold=True)가 monkey-patch 없이 정상 동작합니다 (#30, @hhy827)._paragraph_id/_object_id/_memo_id가uuid4().int & 0xFFFFFFFF로부터 signed int32 범위를 벗어나는 값을 약 50% 확률로 생성하던 문제를 수정했습니다. id 값을 signed 32-bit 양수 범위(0 <= x < 2^31)로 클램프해 downstream 소비자와의 상호운용성을 확보했습니다 (#34, @seonghoony).HwpxDocument.new()의 seed로 쓰이는 번들Skeleton.hwpx에 signed int32 범위를 벗어나는<hp:p id="3121190098">가 포함돼 있던 문제를 수정했습니다 (#35, @seonghoony).pyproject.toml에 PEP 639licenseexpression과 같이 남아 있던 legacyLicense :: OSI Approved :: Apache Software Licenseclassifier를 제거해setuptools>=77에서의 소스 설치/바이너리 빌드 실패를 해소했습니다.
추가
- 위 세 버그에 대한 회귀 테스트를 추가했습니다 (
tests/test_document_formatting.py,tests/test_id_generator_range.py,tests/test_skeleton_template_ids.py). - 머지된 기여를 인정하는
CONTRIBUTORS.md를 추가하고README.md/CONTRIBUTING.md에서 연결했습니다.
변경
- License relicensed to Apache-2.0 (sole author, full consent). Previous license terms no longer apply to future releases.