typst_library/text/
case.rs1use crate::foundations::{cast, func, Cast, Content, Str};
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) => {
41 Caseable::Content(v.styled(TextElem::set_case(Some(case))))
42 }
43 }
44}
45
46pub enum Caseable {
48 Str(Str),
49 Content(Content),
50}
51
52cast! {
53 Caseable,
54 self => match self {
55 Self::Str(v) => v.into_value(),
56 Self::Content(v) => v.into_value(),
57 },
58 v: Str => Self::Str(v),
59 v: Content => Self::Content(v),
60}
61
62#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Cast)]
64pub enum Case {
65 Lower,
67 Upper,
69}
70
71impl Case {
72 pub fn apply(self, text: &str) -> String {
74 match self {
75 Self::Lower => text.to_lowercase(),
76 Self::Upper => text.to_uppercase(),
77 }
78 }
79}