Compare commits

..

No commits in common. "54443a67c2e14f8a3a5000bfd03099781925e5e2" and "c7e00f7ab2a1e205145f610c9eb926841418003a" have entirely different histories.

4 changed files with 11 additions and 96 deletions

View File

@ -671,14 +671,14 @@ impl<'a> CellGrid<'a> {
let mut rows = vec![]; let mut rows = vec![];
// Number of content columns: Always at least one. // Number of content columns: Always at least one.
let num_cols = tracks.x.len().max(1); let columns = tracks.x.len().max(1);
// Number of content rows: At least as many as given, but also at least // Number of content rows: At least as many as given, but also at least
// as many as needed to place each item. // as many as needed to place each item.
let num_rows = { let r = {
let len = entries.len(); let len = entries.len();
let given = tracks.y.len(); let given = tracks.y.len();
let needed = len / num_cols + (len % num_cols).clamp(0, 1); let needed = len / columns + (len % columns).clamp(0, 1);
given.max(needed) given.max(needed)
}; };
@ -690,7 +690,7 @@ impl<'a> CellGrid<'a> {
}; };
// Collect content and gutter columns. // Collect content and gutter columns.
for x in 0..num_cols { for x in 0..columns {
cols.push(get_or(tracks.x, x, auto)); cols.push(get_or(tracks.x, x, auto));
if has_gutter { if has_gutter {
cols.push(get_or(gutter.x, x, zero)); cols.push(get_or(gutter.x, x, zero));
@ -698,7 +698,7 @@ impl<'a> CellGrid<'a> {
} }
// Collect content and gutter rows. // Collect content and gutter rows.
for y in 0..num_rows { for y in 0..r {
rows.push(get_or(tracks.y, y, auto)); rows.push(get_or(tracks.y, y, auto));
if has_gutter { if has_gutter {
rows.push(get_or(gutter.y, y, zero)); rows.push(get_or(gutter.y, y, zero));
@ -936,27 +936,6 @@ struct RowGroupData {
range: Option<Range<usize>>, range: Option<Range<usize>>,
span: Span, span: Span,
kind: RowGroupKind, kind: RowGroupKind,
/// Start of the range of indices of hlines at the top of the row group.
/// This is always the first index after the last hline before we started
/// building the row group - any upcoming hlines would appear at least at
/// this index.
///
/// These hlines were auto-positioned and appeared before any auto-pos
/// cells, so they will appear at the first possible row (above the
/// first row spanned by the row group).
top_hlines_start: usize,
/// End of the range of indices of hlines at the top of the row group.
///
/// This starts as `None`, meaning that, if we stop the loop before we find
/// any auto-pos cells, all auto-pos hlines after the last hline (after the
/// index `top_hlines_start`) should be moved to the top of the row group.
///
/// It becomes `Some(index of last hline at the top)` when an auto-pos cell
/// is found, as auto-pos hlines after any auto-pos cells appear below
/// them, not at the top of the row group.
top_hlines_end: Option<usize>,
} }
impl<'x> CellGridResolver<'_, '_, 'x> { impl<'x> CellGridResolver<'_, '_, 'x> {
@ -1128,13 +1107,8 @@ impl<'x> CellGridResolver<'_, '_, 'x> {
bail!(span, "cannot have more than one header"); bail!(span, "cannot have more than one header");
} }
row_group_data = Some(RowGroupData { row_group_data =
range: None, Some(RowGroupData { range: None, span, kind: RowGroupKind::Header });
span,
kind: RowGroupKind::Header,
top_hlines_start: pending_hlines.len(),
top_hlines_end: None,
});
*repeat_header = repeat; *repeat_header = repeat;
@ -1159,13 +1133,8 @@ impl<'x> CellGridResolver<'_, '_, 'x> {
bail!(span, "cannot have more than one footer"); bail!(span, "cannot have more than one footer");
} }
row_group_data = Some(RowGroupData { row_group_data =
range: None, Some(RowGroupData { range: None, span, kind: RowGroupKind::Footer });
span,
kind: RowGroupKind::Footer,
top_hlines_start: pending_hlines.len(),
top_hlines_end: None,
});
*repeat_footer = repeat; *repeat_footer = repeat;
@ -1332,9 +1301,8 @@ impl<'x> CellGridResolver<'_, '_, 'x> {
// Cell's header or footer must expand to include the cell's // Cell's header or footer must expand to include the cell's
// occupied positions, if possible. // occupied positions, if possible.
if let Some(RowGroupData { if let Some(RowGroupData { range: group_range, kind, .. }) =
range: group_range, kind, top_hlines_end, .. &mut row_group_data
}) = &mut row_group_data
{ {
*group_range = Some( *group_range = Some(
expand_row_group( expand_row_group(
@ -1348,14 +1316,6 @@ impl<'x> CellGridResolver<'_, '_, 'x> {
) )
.at(cell_span)?, .at(cell_span)?,
); );
if top_hlines_end.is_none()
&& local_auto_index > first_available_row * columns
{
// Auto index was moved, so upcoming auto-pos hlines should
// no longer appear at the top.
*top_hlines_end = Some(pending_hlines.len());
}
} }
// Let's resolve the cell so it can determine its own fields // Let's resolve the cell so it can determine its own fields
@ -1468,19 +1428,6 @@ impl<'x> CellGridResolver<'_, '_, 'x> {
} }
}; };
let top_hlines_end = row_group.top_hlines_end.unwrap_or(pending_hlines.len());
for (_, top_hline, has_auto_y) in pending_hlines
.get_mut(row_group.top_hlines_start..top_hlines_end)
.unwrap_or(&mut [])
{
if *has_auto_y {
// Move this hline to the top of the child, as it was
// placed before the first automatically positioned cell
// and had an automatic index.
top_hline.index = group_range.start;
}
}
match row_group.kind { match row_group.kind {
RowGroupKind::Header => { RowGroupKind::Header => {
if group_range.start != 0 { if group_range.start != 0 {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 579 B

View File

@ -437,38 +437,6 @@
) )
) )
--- grid-footer-top-hlines-with-only-row-pos-cell ---
// Top hlines should attach to the top of the footer.
#set page(margin: 2pt)
#set text(6pt)
#table(
columns: 3,
inset: 2.5pt,
table.footer(
table.hline(stroke: red),
table.vline(stroke: blue),
table.cell(x: 2, y: 2)[a],
table.hline(stroke: 3pt),
table.vline(stroke: 3pt),
)
)
--- grid-footer-top-hlines-with-row-and-auto-pos-cell ---
#set page(margin: 2pt)
#set text(6pt)
#table(
columns: 3,
inset: 2.5pt,
table.footer(
table.hline(stroke: red),
table.vline(stroke: blue),
table.cell(x: 2, y: 2)[a],
[b],
table.hline(stroke: 3pt),
table.vline(stroke: 3pt),
)
)
--- grid-footer-below-rowspans --- --- grid-footer-below-rowspans ---
// Footer should go below the rowspans. // Footer should go below the rowspans.
#set page(margin: 2pt) #set page(margin: 2pt)