mirror of
https://github.com/typst/typst
synced 2025-06-29 00:32:53 +08:00
Rename is_cjk_script() to is_cj_script() (#2829)
This commit is contained in:
parent
8a69d3bfb6
commit
058f24f95e
@ -7,7 +7,7 @@ use unicode_script::{Script, UnicodeScript};
|
|||||||
|
|
||||||
use self::linebreak::{breakpoints, Breakpoint};
|
use self::linebreak::{breakpoints, Breakpoint};
|
||||||
use self::shaping::{
|
use self::shaping::{
|
||||||
is_gb_style, is_of_cjk_script, shape, ShapedGlyph, ShapedText, BEGIN_PUNCT_PAT,
|
is_gb_style, is_of_cj_script, shape, ShapedGlyph, ShapedText, BEGIN_PUNCT_PAT,
|
||||||
END_PUNCT_PAT,
|
END_PUNCT_PAT,
|
||||||
};
|
};
|
||||||
use crate::diag::{bail, SourceResult};
|
use crate::diag::{bail, SourceResult};
|
||||||
@ -639,16 +639,16 @@ fn add_cjk_latin_spacing(items: &mut [Item]) {
|
|||||||
.and_then(|shaped| shaped.glyphs.first())
|
.and_then(|shaped| shaped.glyphs.first())
|
||||||
});
|
});
|
||||||
|
|
||||||
// Case 1: CJK followed by a Latin character
|
// Case 1: CJ followed by a Latin character
|
||||||
if glyph.is_cjk_script() && next.map_or(false, |g| g.is_letter_or_number()) {
|
if glyph.is_cj_script() && next.map_or(false, |g| g.is_letter_or_number()) {
|
||||||
// The spacing is default to 1/4 em, and can be shrunk to 1/8 em.
|
// The spacing is default to 1/4 em, and can be shrunk to 1/8 em.
|
||||||
glyph.x_advance += Em::new(0.25);
|
glyph.x_advance += Em::new(0.25);
|
||||||
glyph.adjustability.shrinkability.1 += Em::new(0.125);
|
glyph.adjustability.shrinkability.1 += Em::new(0.125);
|
||||||
text.width += Em::new(0.25).at(text.size);
|
text.width += Em::new(0.25).at(text.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Case 2: Latin followed by a CJK character
|
// Case 2: Latin followed by a CJ character
|
||||||
if glyph.is_cjk_script() && prev.map_or(false, |g| g.is_letter_or_number()) {
|
if glyph.is_cj_script() && prev.map_or(false, |g| g.is_letter_or_number()) {
|
||||||
glyph.x_advance += Em::new(0.25);
|
glyph.x_advance += Em::new(0.25);
|
||||||
glyph.x_offset += Em::new(0.25);
|
glyph.x_offset += Em::new(0.25);
|
||||||
glyph.adjustability.shrinkability.0 += Em::new(0.125);
|
glyph.adjustability.shrinkability.0 += Em::new(0.125);
|
||||||
@ -1028,7 +1028,7 @@ fn line<'a>(
|
|||||||
// Deal with CJK punctuation at line ends.
|
// Deal with CJK punctuation at line ends.
|
||||||
let gb_style = is_gb_style(shaped.lang, shaped.region);
|
let gb_style = is_gb_style(shaped.lang, shaped.region);
|
||||||
let maybe_adjust_last_glyph = trimmed.ends_with(END_PUNCT_PAT)
|
let maybe_adjust_last_glyph = trimmed.ends_with(END_PUNCT_PAT)
|
||||||
|| (p.cjk_latin_spacing && trimmed.ends_with(is_of_cjk_script));
|
|| (p.cjk_latin_spacing && trimmed.ends_with(is_of_cj_script));
|
||||||
|
|
||||||
// Usually, we don't want to shape an empty string because:
|
// Usually, we don't want to shape an empty string because:
|
||||||
// - We don't want the height of trimmed whitespace in a different
|
// - We don't want the height of trimmed whitespace in a different
|
||||||
@ -1056,7 +1056,7 @@ fn line<'a>(
|
|||||||
punct.shrink_right(shrink_amount);
|
punct.shrink_right(shrink_amount);
|
||||||
reshaped.width -= shrink_amount.at(reshaped.size);
|
reshaped.width -= shrink_amount.at(reshaped.size);
|
||||||
} else if p.cjk_latin_spacing
|
} else if p.cjk_latin_spacing
|
||||||
&& last_glyph.is_cjk_script()
|
&& last_glyph.is_cj_script()
|
||||||
&& (last_glyph.x_advance - last_glyph.x_offset) > Em::one()
|
&& (last_glyph.x_advance - last_glyph.x_offset) > Em::one()
|
||||||
{
|
{
|
||||||
// If the last glyph is a CJK character adjusted by [`add_cjk_latin_spacing`],
|
// If the last glyph is a CJK character adjusted by [`add_cjk_latin_spacing`],
|
||||||
@ -1078,10 +1078,10 @@ fn line<'a>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deal with CJK characters at line starts.
|
// Deal with CJ characters at line starts.
|
||||||
let text = &p.bidi.text[range.start..end];
|
let text = &p.bidi.text[range.start..end];
|
||||||
let maybe_adjust_first_glyph = text.starts_with(BEGIN_PUNCT_PAT)
|
let maybe_adjust_first_glyph = text.starts_with(BEGIN_PUNCT_PAT)
|
||||||
|| (p.cjk_latin_spacing && text.starts_with(is_of_cjk_script));
|
|| (p.cjk_latin_spacing && text.starts_with(is_of_cj_script));
|
||||||
|
|
||||||
// Reshape the start item if it's split in half.
|
// Reshape the start item if it's split in half.
|
||||||
let mut first = None;
|
let mut first = None;
|
||||||
@ -1116,7 +1116,7 @@ fn line<'a>(
|
|||||||
reshaped.width -= amount_abs;
|
reshaped.width -= amount_abs;
|
||||||
width -= amount_abs;
|
width -= amount_abs;
|
||||||
} else if p.cjk_latin_spacing
|
} else if p.cjk_latin_spacing
|
||||||
&& first_glyph.is_cjk_script()
|
&& first_glyph.is_cj_script()
|
||||||
&& first_glyph.x_offset > Em::zero()
|
&& first_glyph.x_offset > Em::zero()
|
||||||
{
|
{
|
||||||
// If the first glyph is a CJK character adjusted by [`add_cjk_latin_spacing`],
|
// If the first glyph is a CJK character adjusted by [`add_cjk_latin_spacing`],
|
||||||
|
@ -107,9 +107,9 @@ impl ShapedGlyph {
|
|||||||
self.is_justifiable
|
self.is_justifiable
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Whether the glyph is part of a CJK script.
|
/// Whether the glyph is part of Chinese or Japanese script (i.e. CJ, not CJK).
|
||||||
pub fn is_cjk_script(&self) -> bool {
|
pub fn is_cj_script(&self) -> bool {
|
||||||
is_cjk_script(self.c, self.script)
|
is_cj_script(self.c, self.script)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_cjk_punctuation(&self) -> bool {
|
pub fn is_cjk_punctuation(&self) -> bool {
|
||||||
@ -360,7 +360,7 @@ impl<'a> ShapedText<'a> {
|
|||||||
pub fn cjk_justifiable_at_last(&self) -> bool {
|
pub fn cjk_justifiable_at_last(&self) -> bool {
|
||||||
self.glyphs
|
self.glyphs
|
||||||
.last()
|
.last()
|
||||||
.map(|g| g.is_cjk_script() || g.is_cjk_punctuation())
|
.map(|g| g.is_cj_script() || g.is_cjk_punctuation())
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -934,15 +934,17 @@ fn is_space(c: char) -> bool {
|
|||||||
matches!(c, ' ' | '\u{00A0}' | ' ')
|
matches!(c, ' ' | '\u{00A0}' | ' ')
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Whether the glyph is part of a CJK script.
|
/// Whether the glyph is part of Chinese or Japanese script (i.e. CJ, not CJK).
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(super) fn is_of_cjk_script(c: char) -> bool {
|
pub(super) fn is_of_cj_script(c: char) -> bool {
|
||||||
is_cjk_script(c, c.script())
|
is_cj_script(c, c.script())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Whether the glyph is part of a CJK script.
|
/// Whether the glyph is part of Chinese or Japanese script (i.e. CJ, not CJK).
|
||||||
|
/// The function is dedicated to typesetting Chinese or Japanese, which do not
|
||||||
|
/// have spaces between words, so K is not checked here.
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_cjk_script(c: char, script: Script) -> bool {
|
fn is_cj_script(c: char, script: Script) -> bool {
|
||||||
use Script::*;
|
use Script::*;
|
||||||
// U+30FC: Katakana-Hiragana Prolonged Sound Mark
|
// U+30FC: Katakana-Hiragana Prolonged Sound Mark
|
||||||
matches!(script, Hiragana | Katakana | Han) || c == '\u{30FC}'
|
matches!(script, Hiragana | Katakana | Han) || c == '\u{30FC}'
|
||||||
@ -1016,7 +1018,7 @@ fn is_justifiable(
|
|||||||
) -> bool {
|
) -> bool {
|
||||||
// GB style is not relevant here.
|
// GB style is not relevant here.
|
||||||
is_space(c)
|
is_space(c)
|
||||||
|| is_cjk_script(c, script)
|
|| is_cj_script(c, script)
|
||||||
|| is_cjk_left_aligned_punctuation(c, x_advance, stretchability, true)
|
|| is_cjk_left_aligned_punctuation(c, x_advance, stretchability, true)
|
||||||
|| is_cjk_right_aligned_punctuation(c, x_advance, stretchability)
|
|| is_cjk_right_aligned_punctuation(c, x_advance, stretchability)
|
||||||
|| is_cjk_center_aligned_punctuation(c, true)
|
|| is_cjk_center_aligned_punctuation(c, true)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user