Repository navigation
Conversation
apply_table_ops could insert rows (insert_row_by_clone) but no columns. insert_column_by_clone inserts count columns right of grid column ref_col (left of it with side "left"), cloning it: - each new column is as wide as ref_col, and the table grows by it; - each new cell takes the format of the cell of the same row in ref_col, and its text unless blank is set, which leaves one empty paragraph as Hangul does; - a cell merged across the new columns grows its colSpan and width, next to a merged cell ending (on the left, starting) at ref_col each new column gets an empty cell of its format and rows, and a cell merged down ref_col is cloned with its rows; - cell zones move with their columns. Eighteen Hangul-saved files: 3x3 tables made by Hangul and the same tables after Hangul inserted columns (right, left, three, right of a wider column, merged cells across, ending at and down the column, formats per row, a table as wide as the text). With blank the inserted tables match Hangul's cell for cell, but for the stored width of a cell merged across the new column, which Hangul leaves as it was and draws by the grid. The row insertion shares its paragraph id helper (_fresh_ids). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tables written by other programs can hold hp:tc elements with their paragraphs straight inside, without hp:subList, hp:cellAddr, hp:cellSpan or hp:cellSz. Deleting a row or a column, inserting rows or columns, setting or fitting column widths and splitting the table stopped on an AssertionError there, and inserting a row or reordering rows refused it for an unrelated reason. _guard_flat, which every one of these edits calls first, now refuses such a table as it refuses one holding a table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
delete_column on the only column of a one-column table, or on every column, stopped on a ZeroDivisionError sharing out the freed width among no columns left. delete_row on every row left a table without rows and refused it only for the grid it left. Hangul does not delete the last row or column either; both now refuse and point to delete_table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
insert_row_by_clone inserted rows below ref_row only, keeping the text of the cells it clones. It now takes side "above" to insert before the row, and blank to leave each new cell one empty paragraph of its format as Hangul does: - each new row is as high as ref_row, and each new cell takes the format of the cell of the same column in ref_row, a cell merged across columns there included; - above the row, a cell merged across the new rows grows its rowSpan over them, and over a merged cell starting at ref_row each new row gets an empty cell of its format, as below the row for one ending there; - cell zones now move with their rows, below the row too. Twenty Hangul-saved files: 3x3 tables made by Hangul and the same tables after Hangul inserted rows (below, above, three, next to a taller row, merged cells across, ending at and starting at the row, a cell merged across columns, formats per column). With blank the inserted tables match Hangul's cell for cell; Hangul also stores the table's laid-out height anew, which python-hwpx leaves as it was. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
delete_row and delete_column left the table's hp:cellzone entries where they were, so a zone drew its border fill on the cells that moved into its rows or columns. A zone now keeps the lines it covers that stay, moved back over the deleted ones before it, and goes when none stays; the zone list goes with its last zone, as OWPML wants one in it. A row the column deletion leaves without cells folds its zones into its neighbours, as a cell merge folds such a line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 6, 2026
# Conflicts: # src/hwpx/table_patch.py
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
바뀐 점
행 삽입
insert_row_by_clone(hwpx.table_patch.apply_table_ops)은 기준 행 아래에만 넣을 수 있었고, 기준 칸의 글까지 복제했다. 이제 두 선택지를 받는다.side: "above": 기준 행 위에 넣는다.blank: true: 새 칸에 그 칸 서식의 빈 문단 하나만 둔다(한/글과 같음).한/글의 동작
한/글로 3×3 표를 만들고, 칸에 커서를 둔 채 줄을 추가해 저장했다.
sz의 높이를 배치 높이로 다시 저장한다. python-hwpx는 전처럼 그대로 두고, 한/글은 열 때 표를 다시 배치한다.insert_row_by_clone은 이 규칙을 따른다. 위쪽 삽입은 아래쪽 규칙을 뒤집은 것이다.칸 영역
칸 영역(
hp:cellzone)은 그 영역 칸들에 테두리·배경을 주고, 한/글은 이를 그린다. 행 삽입과 행·열 삭제가 영역을 옮기지 않아, 남은 영역이 다른 칸에 테두리를 그렸다. 이제 영역이 칸과 함께 움직인다._shift_zones를 쓴다.코드
table_patch.py_clone_row_template과_insert_row_by_clone이side,blank를 받는다._shift_zone_columns를 행·열 공용_shift_zones로 바꿈._drop_zone_lines(행·열 삭제),_collapse_zone_line(빈 행 접기)을 더함.side,blank를 넘긴다.apply_table_ops설명.테스트
tests/test_insert_row_sides.py를 더하고, 한/글 저장본 스무 개(기준 표 5, 한/글이 행을 넣은 표 15)를 함께 넣는다.blank: true로 같은 행을 넣는다.rowCnt와 표 폭이 같은지, 표 높이는 그대로인지 본다.side의 거부.tests/test_table_ops_delete_zones.py를 더한다. 행·열 삭제에서 영역이 당겨지고, 줄고, 없어지는지, 마지막 영역과 함께 목록이 없어지는지 본다. 고치기 전에는 영역이 있는 3판이 모두 틀렸다.이 PR은 #430 위에 쌓았다. #430이 병합되면 그 커밋들은 이 PR의 diff에서 빠진다.
🤖 Generated with Claude Code