pywpdoc 0.44.0rc1__tar.gz
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.
- pywpdoc-0.44.0rc1/CHANGELOG.md +577 -0
- pywpdoc-0.44.0rc1/LICENSE +21 -0
- pywpdoc-0.44.0rc1/MANIFEST.in +9 -0
- pywpdoc-0.44.0rc1/PKG-INFO +165 -0
- pywpdoc-0.44.0rc1/README.ko.md +128 -0
- pywpdoc-0.44.0rc1/README.md +130 -0
- pywpdoc-0.44.0rc1/pyproject.toml +63 -0
- pywpdoc-0.44.0rc1/setup.cfg +4 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/__init__.py +27 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/__init__.py +26 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/_hwpx_section.py +86 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/_hwpx_story.py +35 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/_hwpx_table.py +37 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/authoring.py +273 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/common/__init__.py +3 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/common/document.py +133 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/common_api.py +9 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/core/__init__.py +11 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/core/contracts.py +153 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/core/defaults.py +18 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/core/enums.py +32 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/core/errors.py +39 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/core/proxy.py +22 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/core/snapshot.py +27 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/core/units.py +54 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/data/default.hwpx +0 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/data/default_2020.hwpx +0 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/document.py +866 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/__init__.py +11 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/backend.py +166 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/comparison_safety.py +79 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/fragments.py +177 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/media.py +105 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/metadata.py +101 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/paragraph.py +126 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/revisions.py +747 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/section.py +111 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/snapshot.py +587 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/story.py +107 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/styles.py +241 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/table.py +303 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/table_geometry.py +85 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/text.py +148 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/docx/traversal.py +81 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/enum/__init__.py +10 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/enum/section.py +3 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/enum/style.py +3 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/enum/table.py +3 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/enum/text.py +40 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/errors.py +36 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/__init__.py +16 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/backend.py +140 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/comparison_safety.py +60 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/media.py +72 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/metadata.py +92 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/paragraph.py +135 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/revisions.py +1474 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/section.py +53 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/snapshot.py +287 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/story.py +72 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/styles.py +120 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/table.py +246 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/table_geometry.py +18 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/hwpx/text.py +26 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/metadata.py +190 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/model.py +2796 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/package.py +84 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/py.typed +0 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/reverse.py +129 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/shared.py +8 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/styles.py +1697 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/_engine/validation.py +377 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/__init__.py +19 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/drawing/__init__.py +18 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/drawing/model.py +224 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/structure/__init__.py +4 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/structure/traversal.py +23 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/text/__init__.py +13 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/text/fragments.py +77 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/text/map.py +90 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/text/match.py +71 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/text/mutation.py +63 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/core/text/traversal.py +29 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/document.py +189 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/docx/__init__.py +8 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/__init__.py +14 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/compare/__init__.py +11 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/compare/api.py +747 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/compare/model.py +124 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/find/__init__.py +5 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/find/api.py +55 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/find/model.py +19 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/regex/__init__.py +4 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/regex/api.py +132 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/replace/__init__.py +5 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/replace/api.py +72 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/replace/preview.py +123 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/__init__.py +16 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/api.py +78 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/check.py +308 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/context.py +93 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/model.py +21 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/parser.py +52 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/renderer.py +158 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/sections.py +186 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/structure/__init__.py +11 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/structure/model.py +71 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/structure/parser.py +93 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/features/template/structure/rows.py +268 -0
- pywpdoc-0.44.0rc1/src/pywpdoc/hwpx/__init__.py +7 -0
- pywpdoc-0.44.0rc1/src/pywpdoc.egg-info/PKG-INFO +165 -0
- pywpdoc-0.44.0rc1/src/pywpdoc.egg-info/SOURCES.txt +113 -0
- pywpdoc-0.44.0rc1/src/pywpdoc.egg-info/dependency_links.txt +1 -0
- pywpdoc-0.44.0rc1/src/pywpdoc.egg-info/requires.txt +11 -0
- pywpdoc-0.44.0rc1/src/pywpdoc.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
## 0.44.0rc1 — release structure candidate (not published)
|
|
2
|
+
|
|
3
|
+
- Consolidate product implementation under `src/pywpdoc/`, with internal `_engine`; pre-release legacy import shims are deliberately omitted.
|
|
4
|
+
- Consolidate deterministic business QA, Windows COM validation tools, and historical synthetic fixtures under `tests/`.
|
|
5
|
+
- Introduce authentic native-rendered README image assets and unified README metadata for GitHub/PyPI.
|
|
6
|
+
- Prepare CI and manual-approval PyPI Trusted Publishing workflows.
|
|
7
|
+
- No intentional changes to business document algorithms. The 0.44.0rc1 packaged wheel passed focused Windows Word/Hancom native tests: 11/11 core cases and 7/7 extended QA stages (no new PDF/pixel-layout run).
|
|
8
|
+
- Add explicit portable `pywpdoc.Document` methods, optional image-format sniffing, and a documented no-argument `add_section` contract without changing the backend engines.
|
|
9
|
+
- Introduce bilingual MkDocs API manual, tested DOCX/HWPX examples, API contract tests, and CI docs-build gate; [API manual deployed to GitHub Pages](https://rydolabs.github.io/PyWPDoc/).
|
|
10
|
+
|
|
11
|
+
# 0.43.1rc2 — Untracked-format safety and CI candidate (2026-10-15)
|
|
12
|
+
|
|
13
|
+
- `compare(everywhere=False)` now rejects untracked DOCX table-border, cell-border, shading, merge and geometry changes rather than silently accepting them.
|
|
14
|
+
- Body-only compare also checks DOCX drawing appearance/payload, and native HWPX table geometry and image data for out-of-scope changes.
|
|
15
|
+
- Public source's default `pytest` skips the explicitly declared private fixture cases when the licensed source fixture is absent; public Actions still use the narrower published CI selector.
|
|
16
|
+
- Windows native Actions and QA launchers select and validate the current wheel version instead of assuming 0.43.0.
|
|
17
|
+
- Native Microsoft Word / Hancom 2020 verification of this release candidate is pending.
|
|
18
|
+
|
|
19
|
+
# 0.43.1rc1 — Safety stabilization candidate (2026-10-15)
|
|
20
|
+
|
|
21
|
+
- Restore native DOCX package when rebuilding DOCX to DOCX; reject missing payloads.
|
|
22
|
+
- Reject unsupported DOCX to HWPX rebuild explicitly.
|
|
23
|
+
- Reject body-only comparisons when excluded table/story content has changed.
|
|
24
|
+
- Preflight strict template rendering before any changes.
|
|
25
|
+
- Cache native run-to-paragraph linkage to remove quadratic HWPX text replacement traversal.
|
|
26
|
+
- Avoid exact sub-line-height Word table rows when rebuilding simple HWPX tables.
|
|
27
|
+
- 709 existing tests + 16 new defect regressions passed locally (725 total). Windows GUI revalidation pending.
|
|
28
|
+
|
|
29
|
+
## v0.43.0 — 보수적 정규식 검색·치환 (2026-10-13)
|
|
30
|
+
|
|
31
|
+
- Added `Document.find_regex(pattern, *, everywhere=True, flags=0, count=-1)` and `Document.replace_regex(pattern, replacement, *, everywhere=True, flags=0, count=-1)` for DOCX/HWPX.
|
|
32
|
+
- Reused core `TextMap`, safe-boundary checks, paragraph traversal and structure-preserving `replace_text_range` without changing existing literal APIs or native Track Changes writers.
|
|
33
|
+
- Python `re` capture groups/backreference expansion; unsupported zero-width matches and invalid replacements are rejected before mutation, opaque-boundary matches are skipped.
|
|
34
|
+
- Regression tests: 623/623 (588 preexisting + 35 new). See `REGEX_FIND_REPLACE_V0430_KO.md` and `QA_REGEX_V0430.md`.
|
|
35
|
+
|
|
36
|
+
## v0.42.0 — 검색·치환 미리보기 및 JSON 변경 보고 (2026-10-13)
|
|
37
|
+
|
|
38
|
+
- Added `Document.preview_replace(search, replacement, *, everywhere=True, case_sensitive=True, count=-1)` to inspect literal replacement candidates without modifying DOCX/HWPX.
|
|
39
|
+
- Uses exactly the existing replace matcher and text traversal; supports split runs, safe hyperlink joins, global replacement limits, case folding and body-only filtering.
|
|
40
|
+
- Added immutable `ReplacementPreviewReport` / `ReplacementPreviewMatch`, `to_dict()`, and `to_json()` (Korean Unicode preserved).
|
|
41
|
+
- Reports original zero-based logical paragraph offsets and before/after logical text; opaque/native non-text elements are not reconstituted in this preview.
|
|
42
|
+
- Matching across unsafe field/revision/content-control boundaries remains excluded. Successful preview does not promise future writer success if document or backend changes.
|
|
43
|
+
- Existing `replace_text()`, `find()`, `render_template()`, and Track Changes writers unchanged.
|
|
44
|
+
- QA: `REPLACE_PREVIEW_V0420_KO.md` and `tests/test_replace_preview_v0420.py`.
|
|
45
|
+
|
|
46
|
+
## v0.41.0 — 템플릿 사전 검사 (2026-10-13)
|
|
47
|
+
|
|
48
|
+
- `Document.check_template()` 추가 (DOCX/HWPX 공통, 읽기 전용).
|
|
49
|
+
- 누락된 활성 변수·섹션/반복 문맥·템플릿 문법·불안전 텍스트 경계 검사.
|
|
50
|
+
- 구조적 반복 행 문맥은 기존 렌더러의 행 탐지 로직 재사용.
|
|
51
|
+
- `TemplateCheckReport`/`TemplateCheckIssue` 및 `to_dict()` 제공.
|
|
52
|
+
- 기존 `render_template()` 구현 및 인수는 변경 없음.
|
|
53
|
+
- 테스트/제한 범위: `TEMPLATE_PREFLIGHT_V0410_KO.md`.
|
|
54
|
+
|
|
55
|
+
# Changelog
|
|
56
|
+
|
|
57
|
+
## 0.40.0 (QA batch diagnostics add-on; no product version bump)
|
|
58
|
+
|
|
59
|
+
- Added a single-file Hancom 2020 native batch probe with ten isolated text/format/structure cases, one-edit-session instructions, per-case validation and issue reports.
|
|
60
|
+
- Added `quality/run_batch_checks.py` to run all pytest cases and the native diagnostic gate independently; pytest failure never stops native analysis.
|
|
61
|
+
- Linked text marker TcIds and format anchor IDs to matching header change IDs to prevent other scenarios' revisions from producing false passes.
|
|
62
|
+
- Kept HWPX structural Track Changes fail-closed; case-level structural observations are never a native writer enablement signal.
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
- Record Hancom 2020 confirmation for the v0.39.0 semantic named-style identity QA.
|
|
66
|
+
- Keep HWPX table-row structural Track Changes fail-closed because no verified `hp:tr` revision anchor exists in current native evidence.
|
|
67
|
+
- Add a read-only HWPX row-tracking analyzer that compares package entries, header TrackChange records, inline marker scope, paragraph/run anchors, table row matrices, and possible history/version-log parts.
|
|
68
|
+
- Add isolated native Hancom 2020 row-insert and row-delete probe fixtures plus expected-final references and machine-readable manifests.
|
|
69
|
+
- Enrich `compare-hwpx-table-row-track-unsupported` context with the verified TrackChange type set and public marker scope so callers can distinguish an intentional evidence boundary from a generic unsupported feature.
|
|
70
|
+
|
|
71
|
+
## 0.39.0
|
|
72
|
+
|
|
73
|
+
- Record Hancom 2020 GUI confirmation for v0.38.0 embedded image-bullet Accept/Reject behavior.
|
|
74
|
+
- Compare HWPX paragraph named-style identity semantically instead of comparing raw header-local `styleIDRef` numbers.
|
|
75
|
+
- Allow equivalent named styles with different local ids across unrelated documents to participate in ordinary ParaShape tracking.
|
|
76
|
+
- Detect the inverse collision where equal numeric style ids resolve to different style identities and fail closed rather than silently missing the change.
|
|
77
|
+
- Resolve `nextStyleIDRef` by target style identity so self/next-style local id differences do not create false revisions.
|
|
78
|
+
- Keep actual named-style identity changes fail-closed; no unsupported style-identity TrackChange record is synthesized.
|
|
79
|
+
- Add `qa_hwpx_style_identity_v0390` and release-QA hash/structure checks.
|
|
80
|
+
|
|
81
|
+
## 0.38.0
|
|
82
|
+
|
|
83
|
+
- Added cross-document HWPX image-bullet import/remap for ParaShape Track Changes.
|
|
84
|
+
- Image bullets now carry their OPF manifest entry and embedded `BinData` payload into the NEW-based review clone.
|
|
85
|
+
- Resolved bullet comparison includes binary payload identity, preventing equal local `binaryItemIDRef` values from masking different images.
|
|
86
|
+
- Added payload deduplication when the OLD image already exists in the target package.
|
|
87
|
+
- Extended validation to reject dangling image-bullet manifest and BinData references.
|
|
88
|
+
- Kept external/non-embedded image dependencies and named-style identity changes fail-closed.
|
|
89
|
+
|
|
90
|
+
## 0.37.0
|
|
91
|
+
|
|
92
|
+
- Hancom 2020 GUI confirmation recorded for v0.36.0 HWPX ParaShape tracking.
|
|
93
|
+
- Added cross-document ParaShape resource import/remap for tabPr, paragraph borderFill, numbering, text bullets, and nested paraHead charPr dependencies.
|
|
94
|
+
- Paragraph-format comparison now resolves header-local resource meaning instead of comparing numeric ids across documents.
|
|
95
|
+
- Added validator checks for ParaShape dependency references.
|
|
96
|
+
- Image bullets and named-style identity changes remain fail-closed.
|
|
97
|
+
|
|
98
|
+
## 0.36.0
|
|
99
|
+
|
|
100
|
+
- HWPX ParaShape Track Changes candidate: `trackChange@type="ParaShape"` + OLD `parashapeID` + changed `hp:p@paraTcId`.
|
|
101
|
+
- Grounded the paragraph anchor/header contract in Hancom's public OWPML model.
|
|
102
|
+
- Fixed ParaShape-only revision plans being skipped by an early-return condition.
|
|
103
|
+
- Added alignment, line-spacing, mixed-format, overlap, named-style, and missing-OLD-paraPr safety coverage.
|
|
104
|
+
- Added `qa_hwpx_parashape_v0360` and `QA_INDEX_V0360.json`; Hancom 2020 GUI Accept/Reject remains pending.
|
|
105
|
+
|
|
106
|
+
## 0.35.0 - HWPX cross-document CharShape resource import/remap
|
|
107
|
+
|
|
108
|
+
- Extend native-backed HWPX CharShape Track Changes across independently-authored documents whose OLD character resources are absent from NEW.
|
|
109
|
+
- Resolve `charPr` semantics through referenced font definitions and border fills instead of comparing raw numeric IDs only.
|
|
110
|
+
- Import/deduplicate OLD fonts per language block and self-contained border fills, remap `fontRef`/`borderFillIDRef`, then author `trackChange@charshapeID` against the remapped OLD shape.
|
|
111
|
+
- Keep the NEW input immutable; imports are applied only to the NEW-derived review clone.
|
|
112
|
+
- Add validator checks for dangling `charPr` font and border-fill references.
|
|
113
|
+
- Fail closed for embedded-font payloads or unverified external border-fill dependencies.
|
|
114
|
+
- Preserve the Hancom 2020-native CharShape anchor contract (`run@paraTcId`) and keep ParaShape tracking fail-closed.
|
|
115
|
+
- v0.34.4 Hancom 2020 GUI display + Accept/Reject QA was user-confirmed before this increment.
|
|
116
|
+
|
|
117
|
+
## 0.34.4 - Hancom 2020-native CharShape tracking candidate
|
|
118
|
+
|
|
119
|
+
- Re-enabled HWPX **character-format** Track Changes from a real Hancom 2020-authored oracle supplied during GUI QA.
|
|
120
|
+
- Match Hancom 2020 native authoring: `trackChange(type="CharShape", charshapeID=<old charPr>)` plus `hp:run@paraTcId=<change id>`.
|
|
121
|
+
- Preserve `trackchageConfig` tracking bit behavior (`flags |= 1`) and native author metadata.
|
|
122
|
+
- Character-format-only and mixed text + character-format comparisons are enabled again.
|
|
123
|
+
- Keep HWPX paragraph-format (`ParaShape`) Track Changes fail-closed pending an independent native ParaShape oracle.
|
|
124
|
+
- Add a machine-readable native-oracle contract receipt and release QA with identical OLD/NEW/TRACKED text covering font, bold, and size changes.
|
|
125
|
+
- Full regression: 452/452 passed before packaging.
|
|
126
|
+
|
|
127
|
+
## 0.34.3
|
|
128
|
+
|
|
129
|
+
- Correct release QA packaging so unrelated HWPX formatting OLD/NEW and text TRACKED artifacts cannot be presented as one scenario.
|
|
130
|
+
- Add `scenario_id` manifests, SHA-256 checks, and `QA_INDEX_V0343.json`.
|
|
131
|
+
- Keep HWPX formatting Track Changes fail-closed pending a native Hancom-authored fixture.
|
|
132
|
+
- Preserve supported HWPX text Track Changes, paragraph structural tracking, DOCX formatting revisions, and v0.34.1 Hancom 2020 compatibility fixes.
|
|
133
|
+
|
|
134
|
+
## 0.34.2 - HWPX formatting Track Changes safety rollback
|
|
135
|
+
|
|
136
|
+
- Retracted HWPX CharShape/ParaShape Track Changes from the supported surface after Hancom 2020 GUI QA showed that the synthesized revisions were not displayed as formatting changes.
|
|
137
|
+
- HWPX character/paragraph formatting differences now fail closed with `compare-hwpx-format-track-unsupported` before any review metadata is authored.
|
|
138
|
+
- Mixed HWPX text + formatting comparisons also fail before partial review output is produced.
|
|
139
|
+
- HWPX text revisions and whole-paragraph structural revisions remain supported; DOCX formatting revisions remain supported.
|
|
140
|
+
- Kept the v0.34.1 Hancom 2020 creation profile and font-size unit fixes.
|
|
141
|
+
- Full regression: 439/439 passed.
|
|
142
|
+
|
|
143
|
+
## 0.34.1 - Hancom 2020 creation compatibility
|
|
144
|
+
|
|
145
|
+
- Fixed HWPX font-size normalization for foreign EMU-backed length objects such as `docx.shared.Pt`; 14pt now serializes as `charPr@height="1400"`.
|
|
146
|
+
- Added validation for invalid/non-positive HWPX font-size inputs.
|
|
147
|
+
- Added a Hancom 2020-targeted real-authored blank HWPX skeleton and made it the default for new HWPX documents.
|
|
148
|
+
- Added `compatibility="latest"` to explicitly retain the previous 13.x / xmlVersion 1.5 creation skeleton.
|
|
149
|
+
- Preserved `version.xml` byte-for-byte when opening/editing existing HWPX documents and when producing compare output from NEW.
|
|
150
|
+
- Preserved the existing header/footer style-ID contract while using the 2020-targeted skeleton.
|
|
151
|
+
- Full regression: 439/439 passed.
|
|
152
|
+
|
|
153
|
+
## 0.34.0 - Tracked HWPX formatting comparison
|
|
154
|
+
|
|
155
|
+
- Added HWPX `CharShape` Track Changes anchored by `hp:run@charTcId`.
|
|
156
|
+
- Added HWPX `ParaShape` Track Changes anchored by `hp:p@paraTcId`.
|
|
157
|
+
- Kept the current/new shape references in body XML and linked revision metadata to the prior shape definition for reject semantics.
|
|
158
|
+
- Added format-only Accept/Reject projection tests and mixed text + format coverage.
|
|
159
|
+
- Added fail-closed boundaries for missing prior header definitions, named-style identity changes, and pre-existing format revision anchors.
|
|
160
|
+
- Preserved the v0.33.0 baseline; full suite: 431/431 passed.
|
|
161
|
+
|
|
162
|
+
## 0.33.0 - Tracked DOCX formatting comparison
|
|
163
|
+
|
|
164
|
+
- Added DOCX run-format Track Changes using native `w:rPrChange` with previous run properties.
|
|
165
|
+
- Added DOCX paragraph-format Track Changes using native `w:pPrChange` with previous paragraph properties.
|
|
166
|
+
- Added format-aware planning that ignores harmless run fragmentation and splits revisions at both old/new run boundaries.
|
|
167
|
+
- Added mixed text + formatting revision coverage and explicit section-format fail-closed behavior.
|
|
168
|
+
- Kept HWPX format-only changes fail-closed until a verified native CharShape/ParaShape anchoring contract is available.
|
|
169
|
+
- Preserved the v0.32.0 baseline; full suite: 425/425 passed.
|
|
170
|
+
|
|
171
|
+
## 0.32.0 - Tracked body-paragraph comparison
|
|
172
|
+
|
|
173
|
+
- Added top-level body block alignment so paragraph insert/delete preserves position around table anchors.
|
|
174
|
+
- Added DOCX whole-paragraph Track Changes with revision-marked paragraph content and paragraph marks.
|
|
175
|
+
- Added HWPX whole-paragraph insert/delete ranges with `paraend="1"`.
|
|
176
|
+
- Added adjacent multi-paragraph, empty-paragraph, table-adjacent, and mixed structural/inline revision coverage.
|
|
177
|
+
- Added fail-closed boundaries for unsafe paragraph imports and multi-section structural edits.
|
|
178
|
+
- Preserved the v0.31.0 baseline; full suite: 418/418 passed.
|
|
179
|
+
|
|
180
|
+
## 0.31.0 - Tracked DOCX table-row comparison
|
|
181
|
+
|
|
182
|
+
- Added backend-neutral table-row revision planning.
|
|
183
|
+
- Added native DOCX row insert/delete revisions with `w:trPr/w:ins` and `w:trPr/w:del`.
|
|
184
|
+
- Kept HWPX row structural Track Changes fail-closed because no verified row-level OWPML grammar was established.
|
|
185
|
+
- Added Accept-All => new / Reject-All => old structural projection tests.
|
|
186
|
+
- Preserved the v0.30.0 baseline; full suite: 399/399 passed.
|
|
187
|
+
|
|
188
|
+
## 0.30.0 - Structural table-row capability and repetition
|
|
189
|
+
|
|
190
|
+
- Added backend-neutral structural table traversal and minimal row
|
|
191
|
+
clone/insert/remove contracts.
|
|
192
|
+
- Added DOCX row cloning with fresh drawing identities while preserving native
|
|
193
|
+
row/cell structure, horizontal merges, nested tables, formatting, and media
|
|
194
|
+
relationships.
|
|
195
|
+
- Added HWPX row cloning with refreshed paragraph/object identities, stale
|
|
196
|
+
layout-cache removal, preserved nested structure/media references, and native
|
|
197
|
+
merge-aware removal.
|
|
198
|
+
- Added `render_template(..., sections=True, table_rows=True)` for an outer
|
|
199
|
+
Mustache section that wraps an entire table row.
|
|
200
|
+
- Added sequence repetition, inverted row conditions, item context with parent
|
|
201
|
+
fallback, fragmented markers, nested-table content rendering, and single-pass
|
|
202
|
+
protection for template-like data values.
|
|
203
|
+
- Vertical merge ambiguity and emptying a table fail closed.
|
|
204
|
+
- `everywhere=False` retains the historical no-table template scope.
|
|
205
|
+
- Preserved all v0.29.0 baselines; full suite: 388/388 passed.
|
|
206
|
+
|
|
207
|
+
## 0.29.0 - Tracked text comparison
|
|
208
|
+
|
|
209
|
+
- Added `Document.compare(new, author=..., date=..., everywhere=True)` as an
|
|
210
|
+
isolated high-level comparison feature.
|
|
211
|
+
- Added backend-neutral `RevisionPlan`, `ParagraphRevision`, and `TextEdit`
|
|
212
|
+
models; alignment/diff policy remains outside DOCX/HWPX XML writers.
|
|
213
|
+
- Added DOCX native revision output using `w:ins`, `w:del`, `w:delText`,
|
|
214
|
+
reviewer/date metadata, and `w:trackRevisions`.
|
|
215
|
+
- Added HWPX native revision output using insert/delete begin/end markers,
|
|
216
|
+
`trackChanges`, `trackChangeAuthors`, and track-change configuration metadata.
|
|
217
|
+
- Comparison is non-destructive and writes revisions into a cloned copy of the
|
|
218
|
+
newer document.
|
|
219
|
+
- Structural paragraph/table-row insert/delete and unsafe complex inline
|
|
220
|
+
structures fail closed in this increment.
|
|
221
|
+
- Added Accept->new / Reject->old projection tests, table-cell comparison,
|
|
222
|
+
metadata, no-op-copy, mismatch, and fail-closed regressions for both formats.
|
|
223
|
+
- Preserved all v0.28.2 baselines; full suite: 355/355 passed.
|
|
224
|
+
- Microsoft Word/Hancom GUI review of generated tracked-change files remains an
|
|
225
|
+
explicit external release QA item.
|
|
226
|
+
|
|
227
|
+
## 0.25.0 - Logicless template v1
|
|
228
|
+
|
|
229
|
+
- Added `pywpdoc.Document.render_template()` as a third isolated high-level
|
|
230
|
+
feature family.
|
|
231
|
+
- Added independent template `parser`, `context`, `renderer`, and `api` modules.
|
|
232
|
+
- Added `{{name}}`, dotted `{{customer.name}}`, current-context resolution,
|
|
233
|
+
run-split tags, body/table/header/footer traversal, and explicit missing-value
|
|
234
|
+
policies (`keep`, `empty`, `error`).
|
|
235
|
+
- Template does not import `find` or `replace`; it reuses only lower-level
|
|
236
|
+
`pywpdoc.core.text` mapping/traversal/mutation primitives.
|
|
237
|
+
- Mustache control tags are explicitly rejected in v1 rather than silently
|
|
238
|
+
mis-rendered; sections/loops/table-row repetition are reserved for later
|
|
239
|
+
independent submodules.
|
|
240
|
+
- Preserved immutable v0.21.5 baseline; full suite is 284/284.
|
|
241
|
+
|
|
242
|
+
## 0.24.0 - Isolated high-level replace feature
|
|
243
|
+
|
|
244
|
+
- Added `pywpdoc.Document.replace_text()` as a thin facade over an independent
|
|
245
|
+
`pywpdoc.features.replace` module.
|
|
246
|
+
- Extracted literal-span matching into `pywpdoc.core.text.match`, shared by
|
|
247
|
+
`find` and `replace` without sibling-feature imports.
|
|
248
|
+
- Added `pywpdoc.core.text.mutation` for backend-neutral logical range mutation.
|
|
249
|
+
- Added architecture tests prohibiting sibling feature dependencies.
|
|
250
|
+
- Added real-document replacement isolation regression for HWPX and DOCX.
|
|
251
|
+
- Preserved immutable v0.21.5 baseline; full suite is 268/268.
|
|
252
|
+
|
|
253
|
+
# v0.21.4
|
|
254
|
+
|
|
255
|
+
- Fixed DOCX snapshot cell-border serialization. HWPX native cell borders now replace the provisional Word borders instead of appending duplicate `w:top`/`w:left`/`w:bottom`/`w:right` nodes.
|
|
256
|
+
- This fixes renderer-dependent missing table edges, including the lower outline of the application table in the school-notice Common rebuild sample.
|
|
257
|
+
- Added a regression asserting exactly one OOXML node per cell edge and preserving the HWPX 0.5 mm bottom border as `w:bottom w:sz="11"`.
|
|
258
|
+
- Full regression: 223/223 passed.
|
|
259
|
+
|
|
260
|
+
# 0.21.2
|
|
261
|
+
- Roll back the v0.21.0/v0.21.1 rich header/footer auto-reservation heuristic. HWPX save no longer estimates story height, rewrites header/footer areas, or injects a 0.5 mm clearance.
|
|
262
|
+
- Keep the verified section/page geometry fix that invalidates stale `hp:linesegarray` caches after page size, orientation, or margin changes.
|
|
263
|
+
- Keep the earlier rich-story `hp:subList/@textHeight="0"` policy and logical/control story synchronization.
|
|
264
|
+
- Add a regression proving that a rich header preserves the caller-authored native header area instead of silently auto-fitting it.
|
|
265
|
+
- Full regression: 219/219 passed.
|
|
266
|
+
- Add a reverse-rebuild diagnostic for a real Hancom school-notice HWPX: page geometry, top-level block order, 3 tables, 3 rectangles, and 1 picture reconstruct semantically; the rebuilt document intentionally carries 0 persisted `linesegarray` caches versus 52 in the Hancom source, forcing Hancom to re-layout on open.
|
|
267
|
+
|
|
268
|
+
# 0.21.1
|
|
269
|
+
- Fix v0.21.0 rich-header over-reservation: HWPX now keeps the caller-authored header/footer area as the baseline and adds only the rich-story overflow beyond the corresponding page margin, plus a minimal 0.5 mm clearance.
|
|
270
|
+
- Preserve v0.21 stale `hp:linesegarray` invalidation.
|
|
271
|
+
- Add regressions for DOCX-like compact header/body spacing and repeated-save idempotency.
|
|
272
|
+
|
|
273
|
+
# 0.21.0
|
|
274
|
+
|
|
275
|
+
- Fix native HWPX section-geometry mutation to invalidate stale `hp:linesegarray` paragraph layout caches instead of carrying coordinates from the bundled skeleton into a changed page box.
|
|
276
|
+
- Add native rich header/footer extent calculation from paragraph line metrics, table row/cell content, and cell margins.
|
|
277
|
+
- Rich HWPX stories now reserve enough native header/footer area before save; final table-cell edits are included in the calculation.
|
|
278
|
+
- Save-time normalization also upgrades older rich stories with a fixed `textHeight` to the content-sized form while preserving simple one-line stories.
|
|
279
|
+
- Keep the fix entirely below the Common facade; DOCX behavior is unchanged.
|
|
280
|
+
- Add 3 engine regressions; full regression is 220/220 passed.
|
|
281
|
+
- Real Hancom GUI verification remains required before declaring visual parity with DOCX.
|
|
282
|
+
|
|
283
|
+
# 0.20.0
|
|
284
|
+
|
|
285
|
+
- Split document core-properties ownership into backend-local `hwpx/metadata.py` and `docx/metadata.py` modules.
|
|
286
|
+
- Standalone HWPX and DOCX backends now return backend-owned `CoreProperties` objects while preserving `.native` escape hatches.
|
|
287
|
+
- Verify shared string metadata fields: title, author, subject, comments, keywords, language, and last-modified-by.
|
|
288
|
+
- Normalize shared created/modified datetime semantics to UTC-naive second precision inside each backend, not Common.
|
|
289
|
+
- Add 10 metadata isolation/roundtrip regressions; full regression is 217/217 passed.
|
|
290
|
+
|
|
291
|
+
# 0.19.0
|
|
292
|
+
|
|
293
|
+
- Split picture/media ownership into backend-local `hwpx/media.py` and `docx/media.py` modules.
|
|
294
|
+
- Standalone HWPX and DOCX backends now return backend-owned `Picture` objects from `add_picture()` and `pictures`.
|
|
295
|
+
- Add a verified shared picture subset: physical width/height/size, resize, embedded bytes, save/reopen persistence.
|
|
296
|
+
- Keep HWPX BinData/manifest/package behavior in the native HWPX engine; the standalone media module is an adapter rather than a duplicate implementation.
|
|
297
|
+
- Keep DOCX HWPUNIT/core-length to EMU translation inside `docx/media.py`; Common remains delegation-only.
|
|
298
|
+
- Fail closed for DOCX floating-picture requests (`treat_as_char=False`) until a verified anchor mapping exists.
|
|
299
|
+
- Add 11 media isolation/contract regressions; full regression is 207/207 passed.
|
|
300
|
+
|
|
301
|
+
# 0.18.0
|
|
302
|
+
|
|
303
|
+
- Lower HWPX Section/Header/Footer behavior beneath the standalone wrappers.
|
|
304
|
+
- Make `hwpx/section.py` and `hwpx/story.py` thin adapters only.
|
|
305
|
+
- Add native HWPX policy modules `_hwpx_section.py`, `_hwpx_story.py`, `_hwpx_table.py`.
|
|
306
|
+
- New HWPX stories use the skeleton's native `Header`/`머리말` style for the initial paragraph.
|
|
307
|
+
- `HeaderFooter.text` no longer leaks nested-table cell text; `all_text` preserves recursive expert access.
|
|
308
|
+
- Keep story-table width, cell margin, and TOP alignment behavior in the native HWPX layer.
|
|
309
|
+
- 194 regression tests pass; original notice remains 12/12 exact rebuild.
|
|
310
|
+
|
|
311
|
+
# v0.17.0
|
|
312
|
+
|
|
313
|
+
- Split Section/page setup routing into backend-owned `section.py` modules.
|
|
314
|
+
- Split Header/Footer block-story wrappers into backend-owned `story.py` modules.
|
|
315
|
+
- Common remains delegation-only and receives no page geometry, story mutation, or header-table sizing logic.
|
|
316
|
+
- DOCX even-page story access enables the required Word even/odd header setting inside the DOCX backend.
|
|
317
|
+
- Header tables default to section content width independently in both backends.
|
|
318
|
+
- Added section/story module isolation, persisted geometry, story block, add-section, support-gap, and HWPX mirror regressions.
|
|
319
|
+
- Final regression: 186/186 passed; original notice 12/12 exact rebuild.
|
|
320
|
+
|
|
321
|
+
# v0.16.0
|
|
322
|
+
|
|
323
|
+
- Split standalone style ownership into `docx/styles.py` and `hwpx/styles.py`.
|
|
324
|
+
- `Styles`, `Style`, `StyleFont`, and `StyleParagraphFormat` are backend-owned public types.
|
|
325
|
+
- Added backend-local DOCX `clone_from` direct-format copying; Common remains delegation-only.
|
|
326
|
+
- Paragraph/Run accept backend Style wrappers with one-way `paragraph -> styles` dependency.
|
|
327
|
+
- Added style isolation, clone independence, apply/next/delete, common-delegation, and minimal protocol regressions.
|
|
328
|
+
- Final regression: 167/167 passed; original notice 12/12 exact rebuild.
|
|
329
|
+
|
|
330
|
+
# Changelog
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
## 0.21.3
|
|
334
|
+
|
|
335
|
+
- Common에 `Document.rebuild()` / `export_snapshot()` / `rebuild_from()` 구조 보존 경로를 추가했다. Common은 `DocumentSnapshot`만 전달하고 포맷별 export/import는 각 backend가 소유한다.
|
|
336
|
+
- HWPX→HWPX `preserve_layout=True`는 native package payload를 보존해 변경 없는 rebuild에서 package part hash가 모두 동일하도록 했다. `hp:linesegarray`를 임의 삭제하지 않는다.
|
|
337
|
+
- HWPX→DOCX portable importer를 추가했다. 페이지 geometry, HWPX layout slot, run/paragraph 서식, 표/병합/셀 테두리·채움, 그림, text box를 Word 구조로 변환한다.
|
|
338
|
+
- DOCX 변환에서 `lineseg/@spacing`을 paragraph `space-after`로 중복 계산하던 문제를 제거했다. 한 줄 문단은 다음 cached line top을 이용해 measured advance를 유지한다.
|
|
339
|
+
- HWPX text box 내부의 borderless positioning grid를 Word에서 별도 nested table로 중복 배치하지 않고 host paragraph/tab 구조로 변환해 fixed slot clipping을 방지한다.
|
|
340
|
+
- Common HWPX same-format rebuild package fidelity, HWPX→DOCX reopen, inline positioning-grid flattening 회귀를 추가했다.
|
|
341
|
+
|
|
342
|
+
## 0.15.0
|
|
343
|
+
|
|
344
|
+
- Split table ownership inside each independent backend into `table.py` and `table_geometry.py`.
|
|
345
|
+
- `backend.py` now composes/delegates table creation instead of owning Table/Row/Column/Cell implementations.
|
|
346
|
+
- Keep Common API unchanged and thin; no table geometry or option normalization moved into Common.
|
|
347
|
+
- Normalize standalone backend `Row.height`, `Column.width`, and `Cell.width` around shared physical Length semantics.
|
|
348
|
+
- DOCX backend column-width setter now synchronizes rendered cell widths (`tcW`) as part of the backend contract, without changing python-docx native behavior.
|
|
349
|
+
- Add architecture, geometry, merge, nested-table, vertical-alignment, width, and height regression gates.
|
|
350
|
+
- Regression result: 153/153 passed; original notice exact rebuild remains 12/12.
|
|
351
|
+
|
|
352
|
+
## 0.14.0
|
|
353
|
+
|
|
354
|
+
- First feature-module isolation pass: split paragraph/run wrappers and text operations into backend-owned `paragraph.py` / `text.py` modules for both DOCX and HWPX.
|
|
355
|
+
- Common remains delegation-only; it owns no text replacement or paragraph mutation behavior.
|
|
356
|
+
- DOCX document-wide replace traversal moved out of the backend facade into `docx.text`.
|
|
357
|
+
- HWPX text operations are routed through a narrow backend boundary while the mature native HWPX engine remains the implementation owner.
|
|
358
|
+
- HWPX standalone backend `Paragraph.add_run()` now starts a new unstyled run from the paragraph style instead of leaking direct formatting from the previous sibling run; native expert API behavior remains unchanged.
|
|
359
|
+
- Added module dependency gates plus backend-direct replace count/scope/direct-format isolation tests.
|
|
360
|
+
- Regression result: 139/139 passed; original notice exact rebuild remains 12/12.
|
|
361
|
+
|
|
362
|
+
## 0.13.0
|
|
363
|
+
|
|
364
|
+
- Architecture-only refactor: independent HWPX backend, independent DOCX backend, thin common facade.
|
|
365
|
+
- Added backend-neutral `core/` units, enums, errors, defaults, and minimal Protocol contracts.
|
|
366
|
+
- Moved cross-run DOCX replace, page/table geometry, cell padding, vertical alignment, and nested-table sizing out of common and into the owning backend.
|
|
367
|
+
- Preserved the legacy top-level HWPX expert API and the `common_api.UnifiedDocument` compatibility import.
|
|
368
|
+
- Added AST dependency-boundary/geometry-delegation tests and direct standalone backend contract tests.
|
|
369
|
+
- Regression result: 128/128 passed; original notice exact rebuild remains 12/12.
|
|
370
|
+
|
|
371
|
+
## 0.12.3
|
|
372
|
+
|
|
373
|
+
- Common-created DOCX/HWPX table cells now persist the same default vertical alignment: TOP.
|
|
374
|
+
- Fixed the visual mismatch where HWPX native cells defaulted to CENTER while Word rendered missing `w:vAlign` as TOP.
|
|
375
|
+
- `UnifiedCell.vertical_alignment` now maps TOP/CENTER/BOTTOM through one python-docx-shaped enum for both backends.
|
|
376
|
+
- Common proxy setters now honor wrapper properties before falling through to native objects.
|
|
377
|
+
- Persisted-XML cross-format tests now verify outer and nested cell vertical alignment in addition to physical geometry.
|
|
378
|
+
- Regression suite expanded to 104 tests.
|
|
379
|
+
|
|
380
|
+
## 0.12.2
|
|
381
|
+
|
|
382
|
+
- Fixed common-API nested table geometry by sizing nested tables to the parent cell content box rather than the raw cell width.
|
|
383
|
+
- Normalized common-created table cell padding to 1.8 mm horizontal and 0.5 mm vertical for both HWPX and DOCX.
|
|
384
|
+
- Strengthened cross-format geometry tests to inspect persisted parent cell width, padding, content-box width, and nested table width.
|
|
385
|
+
|
|
386
|
+
## 0.12.1
|
|
387
|
+
|
|
388
|
+
- Common API preview geometry parity hotfix.
|
|
389
|
+
- `UnifiedDocument.new()` now normalizes new DOCX/HWPX documents to the same A4 page and margin geometry; opened documents are never rewritten.
|
|
390
|
+
- Common top-level `add_table()` now uses the full current body width when width is omitted, matching python-docx semantics instead of leaking the HWPX native 1-inch-per-column default.
|
|
391
|
+
- Added persisted-XML cross-format geometry contract tests for page, margins, body width, table width, column widths, and nested-table width with 0.05 mm tolerance.
|
|
392
|
+
- Regression suite expanded to 102 tests.
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
## 0.12.0
|
|
396
|
+
|
|
397
|
+
- HWPX v1.0 release-candidate stabilization.
|
|
398
|
+
- Targeted edits preserve unrelated package-part bytes rather than reserializing unchanged XML.
|
|
399
|
+
- Paragraph-style assignment uses generic charPr 3-way rebase so direct run formatting survives style changes.
|
|
400
|
+
- `Paragraph.style = None` returns to verified default paragraph style.
|
|
401
|
+
- `Run.clear()` invalidates stale line-layout cache.
|
|
402
|
+
- Structured public error families: `HwpxValueError`, `HwpxStateError`, `HwpxUnsupportedError`; validation reports are serializable.
|
|
403
|
+
- Experimental `python_hwpx_next.common_api.UnifiedDocument` backend-boundary preview for DOCX/HWPX.
|
|
404
|
+
- Automatic regression expanded to 99 tests: 71 HWPX, 20 native cross-format, 8 common-preview.
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
## 0.11.0
|
|
408
|
+
|
|
409
|
+
- v1.0 전 core-semantics 안정화 릴리스.
|
|
410
|
+
- `Paragraph.replace()` 추가: 여러 run/hyperlink 경계를 넘는 structure-preserving replace.
|
|
411
|
+
- `Document.replace(..., everywhere=True)` 추가: body/table/shape/header/footer/note semantic stories를 대상으로 하고 mirrored header/footer 중복 편집을 방지하며 memo body는 보존.
|
|
412
|
+
- visible Run/Hyperlink/tab/line-break 변경 시 stale `hp:linesegarray` 제거.
|
|
413
|
+
- `Document.paragraphs`를 python-docx 의미로 정정: HWPX 내부 secPr carrier 및 table-only wrapper를 숨김.
|
|
414
|
+
- `Row.cells`를 python-docx처럼 logical grid cells로 정정. HWPX physical XML cells는 `Row.physical_cells` escape hatch로 분리.
|
|
415
|
+
- `HwpxError` / `HwpxValidationError` 추가. validation failure는 기존 `ValueError` 호환을 유지하면서 code/report를 노출.
|
|
416
|
+
- `python-docx>=1.2,<2`를 test extra에 추가하고 `tests/test_cross_format_contract.py` 도입.
|
|
417
|
+
- HWPX/DOCX 양쪽에서 mixed text, paragraph insertion, nested table visibility, merged-row logical cells, core properties, section margin/orientation, next paragraph style, cross-run replace 의미론을 병렬 검증.
|
|
418
|
+
- 자동 회귀 80개로 확대.
|
|
419
|
+
|
|
420
|
+
## 0.10.0
|
|
421
|
+
|
|
422
|
+
- `WD_STYLE_TYPE` 추가. PARAGRAPH/CHARACTER는 지원하고 TABLE/LIST는 검증될 때까지 fail-closed.
|
|
423
|
+
- `Styles` iteration을 python-docx 의미로 수정: ID가 아니라 `Style` 객체를 반환.
|
|
424
|
+
- `Styles.default()`의 verified paragraph subset 추가.
|
|
425
|
+
- `Style.next_paragraph_style`을 HWPX `nextStyleIDRef`에 매핑.
|
|
426
|
+
- `Run.style` character-style facade 추가.
|
|
427
|
+
- `Paragraph.contains_page_break` 추가.
|
|
428
|
+
- section carrier 앞 `insert_paragraph_before()`가 `secPr`와 section-start controls를 새 첫 문단으로 이동하도록 안전화.
|
|
429
|
+
- `Row.height` setter 및 vertical-merge-aware logical row height 계산 추가.
|
|
430
|
+
- `Cell.merge(other_cell)`, `Cell.add_table()`, `Cell.tables`, `Cell.iter_inner_content()` 추가.
|
|
431
|
+
- `Cell.text` setter가 nested table을 포함한 기존 cell story를 제거하고 single paragraph/run으로 교체하도록 python-docx 의미로 수정.
|
|
432
|
+
- Header/Footer block container에 `tables`, `add_table()`, `iter_inner_content()` 추가. logical/control mirror equality를 테스트로 고정.
|
|
433
|
+
- Header/Footer `add_paragraph(..., style=...)`가 style 인자를 실제 적용하도록 수정.
|
|
434
|
+
- header/footer field의 charPr 선택식 우선순위 버그 정리.
|
|
435
|
+
- `Document.tables`를 python-docx처럼 body top-level tables로 의미 정정하고 `Document.all_tables` recursive escape hatch 추가.
|
|
436
|
+
- 자동 회귀 57개로 확대.
|
|
437
|
+
|
|
438
|
+
## 0.9.0
|
|
439
|
+
|
|
440
|
+
- `Table.columns` / `Column.width` 추가.
|
|
441
|
+
- 병합 셀을 고려해 열 폭 변경 시 physical cell width와 table width를 함께 동기화.
|
|
442
|
+
- 기존 logical column width 추정이 병합 셀을 우선해 잘못된 폭을 읽던 문제 수정; 단일-span 셀을 우선.
|
|
443
|
+
- `Cell.vertical_alignment` 및 `WD_CELL_VERTICAL_ALIGNMENT` / `WD_ALIGN_VERTICAL` 추가.
|
|
444
|
+
- `Section`에 python-docx-shaped page facade 추가: page width/height, margins, header/footer distance, gutter.
|
|
445
|
+
- `Section.orientation` 및 `WD_ORIENT` 추가. HWPX `WIDELY`(portrait) / `NARROWLY`(landscape) mapping 사용.
|
|
446
|
+
- `Document.core_properties` 추가: HWPX `Contents/content.hpf`의 검증된 metadata subset 편집.
|
|
447
|
+
- `Document.settings` typed foundation 및 `CaretPosition` 추가.
|
|
448
|
+
- `Style.delete()`가 dangling style ref를 만들지 않도록 참조 repoint + dense style-id compaction.
|
|
449
|
+
- 자동 회귀 49개로 확대.
|
|
450
|
+
|
|
451
|
+
## 0.8.0
|
|
452
|
+
|
|
453
|
+
- `Paragraph.text` / `Run.text`가 `\t`, `\n`을 한컴 native mixed-content `hp:tab` / `hp:lineBreak`로 왕복.
|
|
454
|
+
- `Paragraph.insert_paragraph_before()` 추가.
|
|
455
|
+
- `Paragraph.clear()` / `Run.clear()` section setup 보존 강화.
|
|
456
|
+
- `ParagraphFormat.tab_stops`, `TabStops`, `TabStop`, `WD_TAB_ALIGNMENT`, `WD_TAB_LEADER` 추가.
|
|
457
|
+
- `Document.iter_inner_content()`와 `Paragraph.iter_inner_content()` 추가.
|
|
458
|
+
- `Section.even_page_header/footer`, `odd_page_header/footer` 추가.
|
|
459
|
+
- 기본 `Document.save()`를 atomic validated save로 강화.
|
|
460
|
+
|
|
461
|
+
## 0.22.0 - PyWPDoc namespace architecture milestone
|
|
462
|
+
|
|
463
|
+
- Added new `pywpdoc` public namespace and distribution name.
|
|
464
|
+
- `pywpdoc.Document` is now the high-level format-neutral entry point.
|
|
465
|
+
- Added direct backend namespaces `pywpdoc.hwpx` and `pywpdoc.docx`.
|
|
466
|
+
- Preserved the verified `python_hwpx_next` v0.21.5 implementation/import path
|
|
467
|
+
during staged migration instead of performing a big-bang internal rename.
|
|
468
|
+
- Added explicit common `Document.unwrap()` backend escape hatch.
|
|
469
|
+
- Added inert `pywpdoc.features` boundary and dependency architecture tests.
|
|
470
|
+
- Added immutable v0.21.5 baseline manifest and real-document regression gates.
|
|
471
|
+
- Preserved v0.21.5 DOCX layout-slot `AT_LEAST` fix.
|
|
472
|
+
- Legacy baseline: 224/224 passed; full suite: 236/236 passed.
|
|
473
|
+
- HWPX->DOCX font visual parity remains a deferred known issue.
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
## 0.23.0 - First isolated high-level feature
|
|
477
|
+
|
|
478
|
+
- Added `pywpdoc.Document.find()` as the first high-level feature module.
|
|
479
|
+
- Added backend-neutral `TextMap` and text traversal primitives under `pywpdoc.core.text`.
|
|
480
|
+
- Added minimal `iter_text_paragraphs()` backend capability for HWPX/DOCX.
|
|
481
|
+
- Added a separate read-only DOCX traversal module so search does not create missing header/footer parts.
|
|
482
|
+
- Added cross-backend run-boundary, table/header, case/limit, direct-backend, read-only isolation, and architecture tests.
|
|
483
|
+
- Preserved the immutable v0.21.5 baseline and all v0.22.0 migration tests.
|
|
484
|
+
- Full suite: 249/249 passed.
|
|
485
|
+
- HWPX->DOCX font visual parity remains deferred.
|
|
486
|
+
|
|
487
|
+
## 0.26.0
|
|
488
|
+
|
|
489
|
+
- added an experimental backend-neutral Drawing placement/transform model;
|
|
490
|
+
- added pure Mustache section parsing and structural repeat plan primitives,
|
|
491
|
+
without enabling them in the public v1 renderer;
|
|
492
|
+
- added repository-only DOCX OPC/package validation and an external Open XML
|
|
493
|
+
SDK validator adapter for release CI;
|
|
494
|
+
- added architecture gates preventing Drawing/template structure from depending
|
|
495
|
+
on concrete backends;
|
|
496
|
+
- preserved all existing public behavior and v0.21.5 baseline outputs.
|
|
497
|
+
|
|
498
|
+
## 0.27.0
|
|
499
|
+
|
|
500
|
+
- added backend-neutral `TextFragment` layer below `TextMap`;
|
|
501
|
+
- DOCX high-level text features now mutate native `w:t` fragments rather than
|
|
502
|
+
replacing whole run text;
|
|
503
|
+
- added safe transparent fragmentation across multiple `w:t`, hyperlinks,
|
|
504
|
+
bookmarks, proofing markers, and significant whitespace;
|
|
505
|
+
- added hard/opaque boundary tracking for fields, revisions, SDT/content
|
|
506
|
+
controls, tabs/breaks, drawings/objects, math, and unknown semantic nodes;
|
|
507
|
+
- `find`/`replace_text` skip matches crossing opaque boundaries;
|
|
508
|
+
- `render_template` fails closed with `template-unsafe-text-boundary` for a tag
|
|
509
|
+
crossing such a boundary;
|
|
510
|
+
- added DOCX fragmentation torture and save/reopen regression coverage;
|
|
511
|
+
- preserved all v0.26 baselines and existing public template syntax.
|
|
512
|
+
|
|
513
|
+
## 0.28.0
|
|
514
|
+
|
|
515
|
+
- connected the isolated Mustache section parser to `render_template()` behind
|
|
516
|
+
the backward-compatible `sections=True` opt-in;
|
|
517
|
+
- added normal (`#`) and inverted (`^`) inline sections, list repetition,
|
|
518
|
+
nested sections, current-context `{{.}}`, and parent-context fallback;
|
|
519
|
+
- reused v0.27 TextFragment/TextMap handling so section markers may span safe
|
|
520
|
+
run/native-text fragmentation;
|
|
521
|
+
- kept field/revision/SDT/tab/object boundaries fail-safe;
|
|
522
|
+
- kept table-row/block repetition separate from inline text expansion;
|
|
523
|
+
- preserved default control-tag fail-closed behavior and all earlier baseline
|
|
524
|
+
tests;
|
|
525
|
+
- expanded the full suite to 329 tests.
|
|
526
|
+
|
|
527
|
+
## 0.28.1
|
|
528
|
+
|
|
529
|
+
- corrected the v0.28 cross-format section sample to request `Table Grid`
|
|
530
|
+
explicitly on both HWPX and DOCX instead of relying on backend defaults;
|
|
531
|
+
- preserved `add_table(style=None)` behavior (DOCX remains `Normal Table`; HWPX
|
|
532
|
+
remains backend-owned);
|
|
533
|
+
- added structural regressions proving DOCX `TableGrid` survives template
|
|
534
|
+
rendering/reopen and HWPX uses a solid black borderFill for the explicit grid;
|
|
535
|
+
- added repository-only LibreOffice raster QA that verifies the rendered DOCX
|
|
536
|
+
contains visible horizontal and vertical table borders;
|
|
537
|
+
- no runtime/document-generation behavior was changed outside the corrected
|
|
538
|
+
comparison fixture; full suite: 333/333 passed.
|
|
539
|
+
|
|
540
|
+
## 0.28.2
|
|
541
|
+
|
|
542
|
+
- fixed HWPX all-story paragraph traversal for real Hancom-authored files that
|
|
543
|
+
legally reuse paragraph `id` values (commonly `id="0"`) across unrelated
|
|
544
|
+
table-cell paragraphs;
|
|
545
|
+
- replaced broad HWPX paragraph-id deduplication with semantic header/footer
|
|
546
|
+
mirror suppression and explicit memo-field exclusion;
|
|
547
|
+
- fixed DOCX physical-cell traversal to use the underlying XML cell node as the
|
|
548
|
+
dedupe identity instead of Python `id(cell._tc)`, which can be reused for
|
|
549
|
+
short-lived lxml/python-docx proxy objects;
|
|
550
|
+
- added user-authored Word/Hancom template documents as permanent real-authoring
|
|
551
|
+
regression fixtures;
|
|
552
|
+
- added cross-format `find`, `replace_text`, `render_template(sections=True)`,
|
|
553
|
+
and save/reopen coverage for the manually authored fixtures;
|
|
554
|
+
- preserved all v0.28.1 baselines; full suite: 340/340 passed.
|
|
555
|
+
|
|
556
|
+
## 0.31.0
|
|
557
|
+
|
|
558
|
+
- extended the backend-neutral comparison plan with structural `TableRowRevision`
|
|
559
|
+
entries while keeping v0.29 text revision objects backward-compatible;
|
|
560
|
+
- added conservative minimum-cost alignment for top-level body table rows;
|
|
561
|
+
- DOCX comparison now emits native row insertion/deletion revisions under
|
|
562
|
+
`w:trPr` using `w:ins` / `w:del`, alongside existing inline text revisions;
|
|
563
|
+
- added old/new paragraph index mapping so row insertion/deletion may coexist
|
|
564
|
+
with later cell-text edits in the same table;
|
|
565
|
+
- tracked deletion materializes the old DOCX row into the review copy and fails
|
|
566
|
+
closed for relationship-bearing/control-heavy rows or vertical merges until a
|
|
567
|
+
safe cross-package import layer exists;
|
|
568
|
+
- HWPX structural row changes fail closed with
|
|
569
|
+
`compare-hwpx-table-row-track-unsupported`; the public OWPML model verified
|
|
570
|
+
for this increment exposes tracked insert/delete ranges inside paragraph text
|
|
571
|
+
but no row-level revision grammar equivalent to DOCX `w:trPr` revisions;
|
|
572
|
+
- unchanged-row tables retain the v0.29 paragraph alignment path, preserving
|
|
573
|
+
text comparison behavior for same-structure complex/vertically merged tables;
|
|
574
|
+
- added Accept-All/Reject-All row projection regressions for insertions,
|
|
575
|
+
deletions, mixed row/text changes, adjacent multi-row changes, metadata, and
|
|
576
|
+
non-destructive input handling;
|
|
577
|
+
- preserved all v0.30.0 regression tests; full suite: **399/399 passed**.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Rydolabs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
include README.md README.ko.md LICENSE pyproject.toml CHANGELOG.md
|
|
2
|
+
recursive-include src/pywpdoc/_engine/data *.hwpx
|
|
3
|
+
include src/pywpdoc/_engine/py.typed
|
|
4
|
+
prune tests
|
|
5
|
+
prune docs
|
|
6
|
+
prune examples
|
|
7
|
+
prune scripts
|
|
8
|
+
recursive-exclude .github *
|
|
9
|
+
global-exclude __pycache__ *.py[cod] *.log
|