diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-10-18 00:02:38 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-10-18 00:04:12 +0200 |
| commit | c0e972b91a7bf8d22cd24a38fc92a9c6214c8a0c (patch) | |
| tree | 19362eb993f15ef1b9bceeac821852bb6edfe955 /src/library/text | |
| parent | e21822665591dc19766275da1e185215a6b945ef (diff) | |
Reduce dependencies from compiler on library
Diffstat (limited to 'src/library/text')
| -rw-r--r-- | src/library/text/lang.rs | 74 | ||||
| -rw-r--r-- | src/library/text/mod.rs | 16 |
2 files changed, 14 insertions, 76 deletions
diff --git a/src/library/text/lang.rs b/src/library/text/lang.rs deleted file mode 100644 index f2193f05..00000000 --- a/src/library/text/lang.rs +++ /dev/null @@ -1,74 +0,0 @@ -use crate::geom::Dir; -use crate::model::Value; - -/// A code for a natural language. -#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] -pub struct Lang([u8; 3], u8); - -impl Lang { - /// The code for the english language. - pub const ENGLISH: Self = Self(*b"en ", 2); - - /// Construct a language from a two- or three-byte ISO 639-1/2/3 code. - pub fn from_str(iso: &str) -> Option<Self> { - let len = iso.len(); - if matches!(len, 2 ..= 3) && iso.is_ascii() { - let mut bytes = [b' '; 3]; - bytes[.. len].copy_from_slice(iso.as_bytes()); - bytes.make_ascii_lowercase(); - Some(Self(bytes, len as u8)) - } else { - None - } - } - - /// Return the language code as an all lowercase string slice. - pub fn as_str(&self) -> &str { - std::str::from_utf8(&self.0[.. usize::from(self.1)]).unwrap_or_default() - } - - /// The default direction for the language. - pub fn dir(self) -> Dir { - match self.as_str() { - "ar" | "dv" | "fa" | "he" | "ks" | "pa" | "ps" | "sd" | "ug" | "ur" - | "yi" => Dir::RTL, - _ => Dir::LTR, - } - } -} - -castable! { - Lang, - Expected: "string", - Value::Str(string) => Self::from_str(&string) - .ok_or("expected two or three letter language code (ISO 639-1/2/3)")?, -} - -/// A code for a region somewhere in the world. -#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] -pub struct Region([u8; 2]); - -impl Region { - /// Construct a region from its two-byte ISO 3166-1 alpha-2 code. - pub fn from_str(iso: &str) -> Option<Self> { - if iso.is_ascii() { - let mut bytes: [u8; 2] = iso.as_bytes().try_into().ok()?; - bytes.make_ascii_uppercase(); - Some(Self(bytes)) - } else { - None - } - } - - /// Return the region code as an all uppercase string slice. - pub fn as_str(&self) -> &str { - std::str::from_utf8(&self.0).unwrap_or_default() - } -} - -castable! { - Region, - Expected: "string", - Value::Str(string) => Self::from_str(&string) - .ok_or("expected two letter region code (ISO 3166-1 alpha-2)")?, -} diff --git a/src/library/text/mod.rs b/src/library/text/mod.rs index c9bf2e57..299357de 100644 --- a/src/library/text/mod.rs +++ b/src/library/text/mod.rs @@ -1,7 +1,6 @@ //! Text handling and paragraph layout. mod deco; -mod lang; mod link; mod par; mod quotes; @@ -11,7 +10,6 @@ mod shaping; mod shift; pub use deco::*; -pub use lang::*; pub use link::*; pub use par::*; pub use quotes::*; @@ -290,6 +288,20 @@ castable! { }), } +castable! { + Lang, + Expected: "string", + Value::Str(string) => Self::from_str(&string) + .ok_or("expected two or three letter language code (ISO 639-1/2/3)")?, +} + +castable! { + Region, + Expected: "string", + Value::Str(string) => Self::from_str(&string) + .ok_or("expected two letter region code (ISO 3166-1 alpha-2)")?, +} + /// The direction of text and inline objects in their line. #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] pub struct HorizontalDir(pub Dir); |
