Skip to content

Commit

Permalink
Don’t try to break tables after the header or before the footer
Browse files Browse the repository at this point in the history
Related to #1027.
  • Loading branch information
liZe committed Apr 2, 2020
1 parent ab47de3 commit da146c6
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 4 deletions.
6 changes: 6 additions & 0 deletions weasyprint/layout/blocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -800,6 +800,11 @@ def find_earlier_page_break(children, absolute_boxes, fixed_boxes):

previous_in_flow = None
for index, child in reversed_enumerate(children):
if isinstance(child, boxes.TableRowGroupBox) and (
child.is_header or child.is_footer):
# We don’t want to break pages before table headers or footers.
continue

if child.is_in_normal_flow():
if previous_in_flow is not None and (
block_level_page_break(child, previous_in_flow) not in
Expand All @@ -810,6 +815,7 @@ def find_earlier_page_break(children, absolute_boxes, fixed_boxes):
resume_at = (children[index].index, None)
break
previous_in_flow = child

if child.is_in_normal_flow() and (
child.style['break_inside'] not in ('avoid', 'avoid-page')):
breakable_box_types = (
Expand Down
8 changes: 5 additions & 3 deletions weasyprint/layout/tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -278,12 +278,14 @@ def body_groups_layout(skip_stack, position_y, max_position_y,
next_page = {'break': 'any', 'page': None}

for i, group in enumerate(table.children[skip:]):
index_group = i + skip
group.index = index_group

if group.is_header or group.is_footer:
continue

# Index is useless for headers and footers, as we never want to
# break pages after the header or before the footer.
index_group = i + skip
group.index = index_group

if new_table_children:
page_break = block_level_page_break(
new_table_children[-1], group)
Expand Down
62 changes: 61 additions & 1 deletion weasyprint/tests/test_layout/test_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -2032,7 +2032,7 @@ def test_table_page_breaks(html, rows, positions):


@assert_no_logs
def test_table_page_breaks_complex():
def test_table_page_breaks_complex_1():
pages = render_pages('''
<style>
@page { size: 100px }
Expand Down Expand Up @@ -2085,6 +2085,66 @@ def test_table_page_breaks_complex():
]


@assert_no_logs
def test_table_page_breaks_complex_2():
pages = render_pages('''
<style>
@page { size: 250px }
td { height: 40px }
table { table-layout: fixed; width: 100%; break-before: avoid }
</style>
<table>
<thead>
<tr><td>head 1</td></tr>
</thead>
<tbody>
<tr><td>row 1 1</td></tr>
<tr><td>row 1 2</td></tr>
<tr><td>row 1 3</td></tr>
</tbody>
<tfoot>
<tr><td>foot 1</td></tr>
</tfoot>
</table>
<table>
<thead>
<tr><td>head 2</td></tr>
</thead>
<tbody>
<tr><td>row 2 1</td></tr>
<tr><td>row 2 2</td></tr>
<tr><td>row 2 3</td></tr>
</tbody>
<tfoot>
<tr><td>foot 2</td></tr>
</tfoot>
</table>
''')
rows_per_page = []
for i, page in enumerate(pages):
groups = []
html, = page.children
body, = html.children
for table_wrapper in body.children:
table, = table_wrapper.children
for group in table.children:
assert group.children, 'found an empty table group'
rows = []
for row in group.children:
cell, = row.children
line, = cell.children
text, = line.children
rows.append(text.text)
groups.append(rows)
rows_per_page.append(groups)
assert rows_per_page == [
[['head 1'], ['row 1 1'], ['row 1 2'], ['foot 1']],
[['head 1'], ['row 1 3'], ['foot 1'],
['head 2'], ['row 2 1'], ['foot 2']],
[['head 2'], ['row 2 2'], ['row 2 3'], ['foot 2']],
]


@assert_no_logs
def test_table_page_break_after():
page1, page2, page3, page4, page5, page6 = render_pages('''
Expand Down

0 comments on commit da146c6

Please sign in to comment.