/// This always returns true for headings because their contents are always
/// shown (although headings can be collapsed in an outline view).
pub fn is_shown(&self) -> bool {
- self.details.kind() == ItemKind::Heading || self.show
+ self.details.is_heading() || self.show
}
}
}
pub fn next(&mut self) {
- let Some(cur) = self.cur.take() else {
- return;
- };
- if let Some(first_child) = cur.details.children().first() {
- self.cur = Some(first_child.clone());
- self.stack.push((cur, 1));
- } else {
- while let Some((item, index)) = self.stack.pop() {
- if let Some(child) = item.details.children().get(index) {
- self.cur = Some(child.clone());
- self.stack.push((item, index + 1));
- return;
+ fn inner(this: &mut ItemCursor) {
+ let Some(cur) = this.cur.take() else {
+ return;
+ };
+ if let Some(first_child) = cur.details.children().first() {
+ this.cur = Some(first_child.clone());
+ this.stack.push((cur, 1));
+ } else {
+ while let Some((item, index)) = this.stack.pop() {
+ if let Some(child) = item.details.children().get(index) {
+ this.cur = Some(child.clone());
+ this.stack.push((item, index + 1));
+ return;
+ }
}
}
}
+
+ inner(self);
+ while let Some(cur) = &self.cur
+ && !cur.is_shown()
+ {
+ inner(self);
+ }
}
// Returns the label for the heading with the given `level` in the stack
Details, Item,
drivers::cairo::{px_to_xr, xr_to_pt},
pivot::{
- Axis2, Coord2, Rect2,
+ Axis2, Coord2, PivotTable, Rect2,
look::{BorderStyle, Color, FontStyle, HorzAlign, Stroke},
},
render::{Device, Extreme, Pager, Params},
params: ¶ms,
context,
};
+ let item = if let Some(text) = item.details.as_text() {
+ Arc::new(Item::new(PivotTable::from(dbg!(text).clone())))
+ } else {
+ item
+ };
let (layer_iterator, pager) = match &item.details {
Details::Table(pivot_table) => {
let mut layer_iterator = pivot_table.layers(printing);
}
fn borders(&self, printing: bool) -> EnumMap<Border, BorderStyle> {
+ fn resolve_border_style(
+ border: Border,
+ borders: &EnumMap<Border, BorderStyle>,
+ show_grid_lines: bool,
+ ) -> BorderStyle {
+ let style = borders[border];
+ if style.stroke != Stroke::None {
+ style
+ } else {
+ let style = borders[border.fallback()];
+ if style.stroke != Stroke::None || !show_grid_lines {
+ style
+ } else {
+ BorderStyle {
+ stroke: Stroke::Dashed,
+ color: Color::BLACK,
+ }
+ }
+ }
+ }
+
EnumMap::from_fn(|border| {
resolve_border_style(
border,
}
}
}
-
-fn resolve_border_style(
- border: Border,
- borders: &EnumMap<Border, BorderStyle>,
- show_grid_lines: bool,
-) -> BorderStyle {
- let style = borders[border];
- if style.stroke != Stroke::None {
- style
- } else {
- let style = borders[border.fallback()];
- if style.stroke != Stroke::None || !show_grid_lines {
- style
- } else {
- BorderStyle {
- stroke: Stroke::Dashed,
- color: Color::BLACK,
- }
- }
- }
-}
for c in 0..self.page.table.n()[self.axis] {
let position = cp[c * 2 + 3];
if position > range.end {
- if self.page.table.cell_width(self.axis, c) >= device.params().min_break[self.axis]
+ if c == 0
+ || self.page.table.cell_width(self.axis, c)
+ >= device.params().min_break[self.axis]
{
// XXX various way to choose a better breakpoint
return (range.end, range.end);
"text-decoration" => Some((Style::Underline, value == "underline")),
"font-family" => Some((Style::Face(value.into()), true)),
"font-size" => value
+ .strip_suffix("pt")
+ .unwrap_or(&value)
.parse::<i32>()
.ok()
.map(|size| (Style::Size(size as f64 * 0.75), true)),
Markup::Text(unescape(&text).unwrap_or(Cow::from(text)).into_owned()),
);
}
- Node::Element(br) if br.name.eq_ignore_ascii_case("br") => {
+ // SPSS often starts paragraphs with an initial `<BR>` that it
+ // ignores, but it does honor `<br>`. So weird.
+ Node::Element(br) if br.name == "br" => {
add_markup(&mut retval, Markup::Text('\n'.into()));
}
Node::Element(element) => {
9 => look::Border::DataLeft,
10 => look::Border::DataLeft,
11 => look::Border::Dimension(RowColBorder(HeadingRegion::Rows, Axis2::X)),
- 12 => look::Border::Dimension(RowColBorder(HeadingRegion::Rows, Axis2::X)),
+ 12 => look::Border::Dimension(RowColBorder(HeadingRegion::Rows, Axis2::Y)),
13 => look::Border::Dimension(RowColBorder(HeadingRegion::Columns, Axis2::X)),
- 14 => look::Border::Dimension(RowColBorder(HeadingRegion::Columns, Axis2::X)),
+ 14 => look::Border::Dimension(RowColBorder(HeadingRegion::Columns, Axis2::Y)),
15 => look::Border::Category(RowColBorder(HeadingRegion::Rows, Axis2::X)),
- 16 => look::Border::Category(RowColBorder(HeadingRegion::Rows, Axis2::X)),
+ 16 => look::Border::Category(RowColBorder(HeadingRegion::Rows, Axis2::Y)),
17 => look::Border::Category(RowColBorder(HeadingRegion::Columns, Axis2::X)),
- 18 => look::Border::Category(RowColBorder(HeadingRegion::Columns, Axis2::X)),
+ 18 => look::Border::Category(RowColBorder(HeadingRegion::Columns, Axis2::Y)),
_ => return None,
};