summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-05-22 16:03:22 +0200
committerLaurenz <laurmaedje@gmail.com>2023-05-22 16:05:13 +0200
commita3227f4ef3b759faa506109c0235df5ffd2a4b7d (patch)
treee62d8d04e389cfb71a4ec3213dc322366b920a8a
parentef1bf742f6b73e60a8adb40281140314dc3e7ff4 (diff)
Fix PDF outline bugs
Fixes #1098 Fixes #1143 Fixes #1151
-rw-r--r--library/src/text/raw.rs8
-rw-r--r--src/export/pdf/outline.rs29
2 files changed, 14 insertions, 23 deletions
diff --git a/library/src/text/raw.rs b/library/src/text/raw.rs
index 796180b4..1cec723e 100644
--- a/library/src/text/raw.rs
+++ b/library/src/text/raw.rs
@@ -36,7 +36,7 @@ use crate::prelude::*;
///
/// Display: Raw Text / Code
/// Category: text
-#[element(Synthesize, Show, Finalize, LocalName, Figurable)]
+#[element(Synthesize, Show, Finalize, LocalName, Figurable, PlainText)]
pub struct RawElem {
/// The raw text.
///
@@ -246,6 +246,12 @@ impl LocalName for RawElem {
impl Figurable for RawElem {}
+impl PlainText for RawElem {
+ fn plain_text(&self, text: &mut EcoString) {
+ text.push_str(&self.text());
+ }
+}
+
/// Highlight a syntax node in a theme by calling `f` with ranges and their
/// styles.
fn highlight_themed<F>(
diff --git a/src/export/pdf/outline.rs b/src/export/pdf/outline.rs
index d4e4c8ef..539647eb 100644
--- a/src/export/pdf/outline.rs
+++ b/src/export/pdf/outline.rs
@@ -5,7 +5,6 @@ use pdf_writer::{Finish, Ref, TextStr};
use super::{AbsExt, PdfContext, RefExt};
use crate::geom::Abs;
use crate::model::Content;
-use crate::util::NonZeroExt;
/// Construct the outline for the document.
#[tracing::instrument(skip_all)]
@@ -13,13 +12,13 @@ pub fn write_outline(ctx: &mut PdfContext) -> Option<Ref> {
let mut tree: Vec<HeadingNode> = vec![];
for heading in ctx.introspector.query(&item!(heading_func).select()) {
let leaf = HeadingNode::leaf((*heading).clone());
- if let Some(last) = tree.last_mut() {
- if last.try_insert(leaf.clone(), NonZeroUsize::ONE) {
- continue;
- }
+
+ let mut children = &mut tree;
+ while children.last().map_or(false, |last| last.level < leaf.level) {
+ children = &mut children.last_mut().unwrap().children;
}
- tree.push(leaf);
+ children.push(leaf);
}
if tree.is_empty() {
@@ -64,21 +63,6 @@ impl HeadingNode {
fn len(&self) -> usize {
1 + self.children.iter().map(Self::len).sum::<usize>()
}
-
- fn try_insert(&mut self, child: Self, level: NonZeroUsize) -> bool {
- if level >= child.level {
- return false;
- }
-
- if let Some(last) = self.children.last_mut() {
- if last.try_insert(child.clone(), level.saturating_add(1)) {
- return true;
- }
- }
-
- self.children.push(child);
- true
- }
}
/// Write an outline item and all its children.
@@ -111,7 +95,8 @@ fn write_outline_item(
outline.count(-(node.children.len() as i32));
}
- outline.title(TextStr(node.element.plain_text().trim()));
+ let body = node.element.expect_field::<Content>("body");
+ outline.title(TextStr(body.plain_text().trim()));
let loc = node.element.location().unwrap();
let pos = ctx.introspector.position(loc);