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}