From b98004330bf3ef372a0f0ef5c7daf1f96fd7873a Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 19 Sep 2022 10:28:06 +0200 Subject: [PATCH] Handle non-breaking spaces during justification --- src/library/text/shaping.rs | 21 +++++++++++++++------ tests/ref/text/linebreak.png | Bin 18957 -> 18981 bytes tests/ref/text/shorthands.png | Bin 4375 -> 4842 bytes tests/typ/text/shorthands.typ | 8 ++++++++ tools/support/typst.tmLanguage.json | 4 ++-- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/library/text/shaping.rs b/src/library/text/shaping.rs index 9465fbd94..1bac626dd 100644 --- a/src/library/text/shaping.rs +++ b/src/library/text/shaping.rs @@ -58,12 +58,12 @@ pub struct ShapedGlyph { impl ShapedGlyph { /// Whether the glyph is a space. pub fn is_space(&self) -> bool { - self.c == ' ' + matches!(self.c, ' ' | '\u{00A0}' | ' ') } /// Whether the glyph is justifiable. pub fn is_justifiable(&self) -> bool { - matches!(self.c, ' ' | ',' | ' ' | '。' | '、') + self.is_space() || matches!(self.c, ',' | '。' | '、') } } @@ -508,12 +508,14 @@ fn track_and_space(ctx: &mut ShapingContext) { .get(TextNode::SPACING) .map(|abs| Em::from_length(abs, ctx.size)); - if tracking.is_zero() && spacing.is_one() { - return; - } - let mut glyphs = ctx.glyphs.iter_mut().peekable(); while let Some(glyph) = glyphs.next() { + // Make non-breaking space same width as normal space. + if glyph.c == '\u{00A0}' { + let face = ctx.fonts.get(glyph.face_id); + glyph.x_advance -= nbsp_delta(face).unwrap_or_default(); + } + if glyph.is_space() { glyph.x_advance = spacing.relative_to(glyph.x_advance); } @@ -524,6 +526,13 @@ fn track_and_space(ctx: &mut ShapingContext) { } } +/// Difference between non-breaking and normal space. +fn nbsp_delta(face: &Face) -> Option { + let space = face.ttf().glyph_index(' ')?.0; + let nbsp = face.ttf().glyph_index('\u{00A0}')?.0; + Some(face.advance(nbsp)? - face.advance(space)?) +} + /// Resolve the font variant with `BOLD` and `ITALIC` factored in. pub fn variant(styles: StyleChain) -> FontVariant { let mut variant = FontVariant::new( diff --git a/tests/ref/text/linebreak.png b/tests/ref/text/linebreak.png index 1a3f49dfcd0dc7a11081bf06116fac71e754d0d7..77eef20ed957290499f2fb8ad83f8c87878ec739 100644 GIT binary patch literal 18981 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 AuK)l5 literal 18957 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 Uqb=YX;{X5v07*qoM6N<$f}I~fSpWb4 diff --git a/tests/ref/text/shorthands.png b/tests/ref/text/shorthands.png index c21d49df2e2d5e0457d701a7864d0d18668c4e0e..ddb679f5b374b61235592c5562a16896a966b665 100644 GIT binary patch literal 4842 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 VDZ5lR6aN}wX=~`+LaW(D{~slB`Op9W literal 4375 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 W;Ven;^7=nN9$ISps^!X-5&r^XpDdgJ diff --git a/tests/typ/text/shorthands.typ b/tests/typ/text/shorthands.typ index 2efd1ad1d..5c94dab02 100644 --- a/tests/typ/text/shorthands.typ +++ b/tests/typ/text/shorthands.typ @@ -3,6 +3,14 @@ --- The non-breaking~space does work. +--- +// Make sure non-breaking and normal space always +// have the same width. Even if the font decided +// differently. +#set text("Latin Modern Roman") +a b \ +a~b + --- - En dash: -- - Em dash: --- diff --git a/tools/support/typst.tmLanguage.json b/tools/support/typst.tmLanguage.json index 8e1a66c44..36ffade73 100644 --- a/tools/support/typst.tmLanguage.json +++ b/tools/support/typst.tmLanguage.json @@ -128,7 +128,7 @@ "captures": { "1": { "name": "punctuation.definition.label.typst" } } }, { - "begin": "(#)(pub|let|set|show|wrap)\\b", + "begin": "(#)(pub|let|set|rule|select|show|wrap)\\b", "end": "\n|(;)|(?=])", "beginCaptures": { "0": { "name": "keyword.other.typst" }, @@ -239,7 +239,7 @@ }, { "name": "keyword.other.typst", - "match": "\\b(pub|let|set|show|wrap|as|in|from)\\b" + "match": "\\b(pub|let|set|rule|select|show|wrap|as|in|from)\\b" }, { "name": "keyword.control.conditional.typst",