typst_library/text/
case.rs1use crate::foundations::{Cast, Content, Str, cast, func};
2use crate::text::TextElem;
3
4#[func(title = "Lowercase")]
13pub fn lower(
14    text: Caseable,
16) -> Caseable {
17    case(text, Case::Lower)
18}
19
20#[func(title = "Uppercase")]
29pub fn upper(
30    text: Caseable,
32) -> Caseable {
33    case(text, Case::Upper)
34}
35
36fn case(text: Caseable, case: Case) -> Caseable {
38    match text {
39        Caseable::Str(v) => Caseable::Str(case.apply(&v).into()),
40        Caseable::Content(v) => Caseable::Content(v.set(TextElem::case, Some(case))),
41    }
42}
43
44pub enum Caseable {
46    Str(Str),
47    Content(Content),
48}
49
50cast! {
51    Caseable,
52    self => match self {
53        Self::Str(v) => v.into_value(),
54        Self::Content(v) => v.into_value(),
55    },
56    v: Str => Self::Str(v),
57    v: Content => Self::Content(v),
58}
59
60#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Cast)]
62pub enum Case {
63    Lower,
65    Upper,
67}
68
69impl Case {
70    pub fn apply(self, text: &str) -> String {
72        match self {
73            Self::Lower => text.to_lowercase(),
74            Self::Upper => text.to_uppercase(),
75        }
76    }
77}