diff --git a/parley/src/layout/mod.rs b/parley/src/layout/mod.rs index 07229ce7..5e1b91c3 100644 --- a/parley/src/layout/mod.rs +++ b/parley/src/layout/mod.rs @@ -22,6 +22,7 @@ use accesskit::{Node, NodeId, Role, TextDirection, TreeUpdate}; use alignment::unjustify; #[cfg(feature = "accesskit")] use alloc::vec::Vec; +use alloc::{string::String, sync::Arc}; use core::{cmp::Ordering, ops::Range}; use data::{ClusterData, LayoutData, LayoutItem, LayoutItemKind, LineData, LineItemData, RunData}; #[cfg(feature = "accesskit")] @@ -314,6 +315,8 @@ pub struct Style { pub(crate) line_height: LayoutLineHeight, /// Per-cluster overflow-wrap setting pub(crate) overflow_wrap: OverflowWrap, + /// Replace graphemes with another grapheme. + pub(crate) grapheme_replacement: Option>, } /// Underline or strikethrough decoration. diff --git a/parley/src/resolve/mod.rs b/parley/src/resolve/mod.rs index 8373ea00..9fea2524 100644 --- a/parley/src/resolve/mod.rs +++ b/parley/src/resolve/mod.rs @@ -8,7 +8,7 @@ pub(crate) mod tree; pub(crate) use range::RangedStyleBuilder; -use alloc::{vec, vec::Vec}; +use alloc::{string::String, sync::Arc, vec, vec::Vec}; use super::style::{ Brush, FontFamily, FontFeature, FontSettings, FontStack, FontStyle, FontVariation, FontWeight, @@ -157,6 +157,7 @@ impl ResolveContext { StyleProperty::LetterSpacing(value) => LetterSpacing(*value * scale), StyleProperty::WordBreak(value) => WordBreak(*value), StyleProperty::OverflowWrap(value) => OverflowWrap(*value), + StyleProperty::GraphemeReplacement(value) => GraphemeReplacement(value.clone()), } } @@ -193,6 +194,7 @@ impl ResolveContext { letter_spacing: raw_style.letter_spacing * scale, word_break: raw_style.word_break, overflow_wrap: raw_style.overflow_wrap, + grapheme_replacement: raw_style.grapheme_replacement.clone(), } } @@ -374,6 +376,8 @@ pub(crate) enum ResolvedProperty { WordBreak(WordBreakStrength), /// Control over "emergency" line-breaking. OverflowWrap(OverflowWrap), + /// Replace graphemes with another grapheme. + GraphemeReplacement(Option>), } /// Flattened group of style properties. @@ -411,6 +415,8 @@ pub(crate) struct ResolvedStyle { pub(crate) word_break: WordBreakStrength, /// Control over "emergency" line-breaking. pub(crate) overflow_wrap: OverflowWrap, + /// Replace graphemes with another grapheme. + pub(crate) grapheme_replacement: Option>, } impl ResolvedStyle { @@ -440,6 +446,7 @@ impl ResolvedStyle { LetterSpacing(value) => self.letter_spacing = value, WordBreak(value) => self.word_break = value, OverflowWrap(value) => self.overflow_wrap = value, + GraphemeReplacement(value) => self.grapheme_replacement = value, } } @@ -468,6 +475,7 @@ impl ResolvedStyle { LetterSpacing(value) => nearly_eq(self.letter_spacing, *value), WordBreak(value) => self.word_break == *value, OverflowWrap(value) => self.overflow_wrap == *value, + GraphemeReplacement(value) => self.grapheme_replacement == *value, } } @@ -478,6 +486,7 @@ impl ResolvedStyle { strikethrough: self.strikethrough.as_layout_decoration(&self.brush), line_height: self.line_height.resolve(self.font_size), overflow_wrap: self.overflow_wrap, + grapheme_replacement: self.grapheme_replacement.clone(), } } } diff --git a/parley/src/style/mod.rs b/parley/src/style/mod.rs index f13f5a1a..0f6e2e23 100644 --- a/parley/src/style/mod.rs +++ b/parley/src/style/mod.rs @@ -7,7 +7,7 @@ mod brush; mod font; mod styleset; -use alloc::borrow::Cow; +use alloc::{borrow::Cow, string::String, sync::Arc}; pub use brush::*; pub use font::{ @@ -140,6 +140,8 @@ pub enum StyleProperty<'a, B: Brush> { WordBreak(WordBreakStrength), /// Control over "emergency" line-breaking. OverflowWrap(OverflowWrap), + /// Replace graphemes with another grapheme. + GraphemeReplacement(Option>), } /// Unresolved styles. @@ -189,6 +191,8 @@ pub struct TextStyle<'a, B: Brush> { pub word_break: WordBreakStrength, /// Control over "emergency" line-breaking. pub overflow_wrap: OverflowWrap, + /// Replace graphemes with another grapheme. + pub grapheme_replacement: Option>, } impl Default for TextStyle<'_, B> { @@ -216,6 +220,7 @@ impl Default for TextStyle<'_, B> { letter_spacing: Default::default(), word_break: Default::default(), overflow_wrap: Default::default(), + grapheme_replacement: Default::default(), } } } diff --git a/parley/src/tests/test_builders.rs b/parley/src/tests/test_builders.rs index 28cf23e9..ff8fb3ad 100644 --- a/parley/src/tests/test_builders.rs +++ b/parley/src/tests/test_builders.rs @@ -184,6 +184,7 @@ fn create_root_style() -> TextStyle<'static, ColorBrush> { letter_spacing: 1.5, word_break: WordBreakStrength::BreakAll, overflow_wrap: OverflowWrap::Anywhere, + grapheme_replacement: None, // TODO: Set a non-default value } }