From 08554380f8813d4105c13abacb08fff8e5a0f318 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Thu, 19 May 2022 13:11:00 +0200 Subject: [PATCH] Fix generated strong and emphasized text --- src/library/structure/heading.rs | 6 +++--- src/library/text/mod.rs | 12 ++++++------ src/library/text/raw.rs | 11 +++++------ src/library/text/shaping.rs | 4 ++-- src/model/content.rs | 14 +++++++++++++- tests/ref/structure/heading.png | Bin 24525 -> 24767 bytes tests/typ/structure/heading.typ | 2 ++ 7 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/library/structure/heading.rs b/src/library/structure/heading.rs index 70589de06..1cfcb6d01 100644 --- a/src/library/structure/heading.rs +++ b/src/library/structure/heading.rs @@ -1,6 +1,6 @@ use crate::library::layout::BlockSpacing; use crate::library::prelude::*; -use crate::library::text::{FontFamily, TextNode, TextSize, Toggle}; +use crate::library::text::{FontFamily, TextNode, TextSize}; /// A section heading. #[derive(Debug, Hash)] @@ -103,11 +103,11 @@ impl Show for HeadingNode { } if resolve!(Self::STRONG) { - map.set(TextNode::STRONG, Toggle); + realized = realized.strong(); } if resolve!(Self::EMPH) { - map.set(TextNode::EMPH, Toggle); + realized = realized.emph(); } if resolve!(Self::UNDERLINE) { diff --git a/src/library/text/mod.rs b/src/library/text/mod.rs index ae7024e59..1b83b0f4f 100644 --- a/src/library/text/mod.rs +++ b/src/library/text/mod.rs @@ -110,10 +110,10 @@ impl TextNode { /// Whether the font weight should be increased by 300. #[property(skip, fold)] - pub const STRONG: Toggle = false; + pub const BOLD: Toggle = false; /// Whether the the font style should be inverted. #[property(skip, fold)] - pub const EMPH: Toggle = false; + pub const ITALIC: Toggle = false; /// A case transformation that should be applied to the text. #[property(skip)] pub const CASE: Option = None; @@ -508,7 +508,7 @@ impl Fold for Decoration { } } -/// Strong text, rendered in boldface. +/// Strong text, rendered in boldface by default. #[derive(Debug, Hash)] pub struct StrongNode(pub Content); @@ -529,11 +529,11 @@ impl Show for StrongNode { } fn realize(&self, _: &mut Context, _: StyleChain) -> TypResult { - Ok(self.0.clone().styled(TextNode::STRONG, Toggle)) + Ok(self.0.clone().styled(TextNode::BOLD, Toggle)) } } -/// Emphasized text, rendered with an italic face. +/// Emphasized text, rendered with an italic face by default. #[derive(Debug, Hash)] pub struct EmphNode(pub Content); @@ -554,6 +554,6 @@ impl Show for EmphNode { } fn realize(&self, _: &mut Context, _: StyleChain) -> TypResult { - Ok(self.0.clone().styled(TextNode::EMPH, Toggle)) + Ok(self.0.clone().styled(TextNode::ITALIC, Toggle)) } } diff --git a/src/library/text/raw.rs b/src/library/text/raw.rs index 9db9c4434..75964efe6 100644 --- a/src/library/text/raw.rs +++ b/src/library/text/raw.rs @@ -7,7 +7,7 @@ use syntect::highlighting::{ }; use syntect::parsing::SyntaxSet; -use super::{FontFamily, Hyphenate, TextNode, Toggle}; +use super::{FontFamily, Hyphenate, TextNode}; use crate::library::layout::BlockSpacing; use crate::library::prelude::*; use crate::source::SourceId; @@ -137,27 +137,26 @@ impl Show for RawNode { /// Style a piece of text with a syntect style. fn styled(piece: &str, foreground: Paint, style: Style) -> Content { - let mut styles = StyleMap::new(); let mut body = Content::Text(piece.into()); let paint = style.foreground.into(); if paint != foreground { - styles.set(TextNode::FILL, paint); + body = body.styled(TextNode::FILL, paint); } if style.font_style.contains(FontStyle::BOLD) { - styles.set(TextNode::STRONG, Toggle); + body = body.strong(); } if style.font_style.contains(FontStyle::ITALIC) { - styles.set(TextNode::EMPH, Toggle); + body = body.emph(); } if style.font_style.contains(FontStyle::UNDERLINE) { body = body.underlined(); } - body.styled_with_map(styles) + body } /// The lazily-loaded syntect syntax definitions. diff --git a/src/library/text/shaping.rs b/src/library/text/shaping.rs index 29973bc79..68499a013 100644 --- a/src/library/text/shaping.rs +++ b/src/library/text/shaping.rs @@ -517,11 +517,11 @@ pub fn variant(styles: StyleChain) -> FontVariant { styles.get(TextNode::STRETCH), ); - if styles.get(TextNode::STRONG) { + if styles.get(TextNode::BOLD) { variant.weight = variant.weight.thicken(300); } - if styles.get(TextNode::EMPH) { + if styles.get(TextNode::ITALIC) { variant.style = match variant.style { FontStyle::Normal => FontStyle::Italic, FontStyle::Italic => FontStyle::Normal, diff --git a/src/model/content.rs b/src/model/content.rs index 6956d3806..ff10de5d4 100644 --- a/src/model/content.rs +++ b/src/model/content.rs @@ -14,7 +14,9 @@ use crate::diag::StrResult; use crate::library::layout::{FlowChild, FlowNode, PageNode, PlaceNode, Spacing}; use crate::library::prelude::*; use crate::library::structure::{DocNode, ListItem, ListNode, ORDERED, UNORDERED}; -use crate::library::text::{DecoNode, ParChild, ParNode, UNDERLINE}; +use crate::library::text::{ + DecoNode, EmphNode, ParChild, ParNode, StrongNode, UNDERLINE, +}; use crate::util::EcoString; /// Composable representation of styled content. @@ -164,6 +166,16 @@ impl Content { self.clone().styled_with_entry(StyleEntry::Unguard(sel)) } + /// Make this content strong. + pub fn strong(self) -> Self { + Self::show(StrongNode(self)) + } + + /// Make this content emphasized. + pub fn emph(self) -> Self { + Self::show(EmphNode(self)) + } + /// Underline this content. pub fn underlined(self) -> Self { Self::show(DecoNode::(self)) diff --git a/tests/ref/structure/heading.png b/tests/ref/structure/heading.png index 7ad228ab34c67cba7b262060b7a70041579fbaa2..96ffcb80a84d543d4312a475472bdf9b879134a0 100644 GIT binary patch delta 4015 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 Vnj&HM!o2_h002ovPDHLkV1k3u1V{h? delta 3761 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 byX5}>N@&~iUqL%i00000NkvXXu0mjfgz;Cl diff --git a/tests/typ/structure/heading.typ b/tests/typ/structure/heading.typ index 496181bd0..d37d8796a 100644 --- a/tests/typ/structure/heading.typ +++ b/tests/typ/structure/heading.typ @@ -46,6 +46,8 @@ multiline. = Heading #set heading(family: "Roboto", fill: eastern) +#show it: heading as it.body +#show it: strong as it.body + [!] ===== Heading 🌍 #heading(level: 5)[Heading]