From 0b3df7548e8386ed31131edb2170ef93aa202dd3 Mon Sep 17 00:00:00 2001 From: Tobias Schmitz Date: Wed, 7 May 2025 17:39:03 +0200 Subject: [PATCH] refactor: use enum to better convey intent --- crates/typst-layout/src/inline/shaping.rs | 2 +- crates/typst-layout/src/modifiers.rs | 30 +++++++++++++++-------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/crates/typst-layout/src/inline/shaping.rs b/crates/typst-layout/src/inline/shaping.rs index 277237a27..bb76f7fe0 100644 --- a/crates/typst-layout/src/inline/shaping.rs +++ b/crates/typst-layout/src/inline/shaping.rs @@ -327,7 +327,7 @@ impl<'a> ShapedText<'a> { offset += width; } - frame.modify(&FrameModifiers::get_in(self.styles).set_text(self.styles)); + frame.modify(&FrameModifiers::for_text_in(self.styles)); frame } diff --git a/crates/typst-layout/src/modifiers.rs b/crates/typst-layout/src/modifiers.rs index 3502a9710..31ed8ba89 100644 --- a/crates/typst-layout/src/modifiers.rs +++ b/crates/typst-layout/src/modifiers.rs @@ -21,7 +21,8 @@ use typst_library::model::{Destination, LinkElem}; pub struct FrameModifiers { /// A destination to link to. dest: Option, - expand_text_height: Option, + /// Used to determine if the link box should be expanded. + link_kind: LinkKind, /// Whether the contents of the frame should be hidden. hidden: bool, } @@ -31,20 +32,29 @@ impl FrameModifiers { pub fn get_in(styles: StyleChain) -> Self { Self { dest: LinkElem::current_in(styles), - expand_text_height: None, + link_kind: LinkKind::default(), hidden: HideElem::hidden_in(styles), } } - pub fn set_text(mut self, styles: StyleChain) -> Self { - if self.dest.is_some() { - let height = Em::one().resolve(styles); - self.expand_text_height = Some(height); + pub fn for_text_in(styles: StyleChain) -> Self { + let mut modifiers = Self::get_in(styles); + if modifiers.dest.is_some() { + let em = Em::one().resolve(styles); + modifiers.link_kind = LinkKind::Text(em); } - self + modifiers } } +#[derive(Clone, Debug, Default)] +enum LinkKind { + /// Contains the font size. + Text(Abs), + #[default] + Other, +} + /// Applies [`FrameModifiers`]. pub trait FrameModify { /// Apply the modifiers in-place. @@ -65,9 +75,9 @@ impl FrameModify for Frame { if let Some(dest) = &modifiers.dest { let mut pos = Point::zero(); let mut size = self.size(); - if let Some(height) = modifiers.expand_text_height { - let expand_top = 0.25 * height; - let expand_bottom = 0.25 * height; + if let LinkKind::Text(em) = modifiers.link_kind { + let expand_top = 0.25 * em; + let expand_bottom = 0.25 * em; pos.y -= expand_top; size.y += expand_top + expand_bottom; }