summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library/mod.rs2
-rw-r--r--src/library/utility.rs10
-rw-r--r--tests/typ/utility/strings.typ8
3 files changed, 20 insertions, 0 deletions
diff --git a/src/library/mod.rs b/src/library/mod.rs
index a549aa72..d02c9608 100644
--- a/src/library/mod.rs
+++ b/src/library/mod.rs
@@ -63,6 +63,8 @@ pub fn new() -> Scope {
std.def_func("rgb", rgb);
std.def_func("min", min);
std.def_func("max", max);
+ std.def_func("lower", lower);
+ std.def_func("upper", upper);
// Colors.
std.def_const("white", RgbaColor::WHITE);
diff --git a/src/library/utility.rs b/src/library/utility.rs
index 84f1d7ab..b26ed154 100644
--- a/src/library/utility.rs
+++ b/src/library/utility.rs
@@ -75,3 +75,13 @@ fn minmax(args: &mut Arguments, goal: Ordering) -> TypResult<Value> {
}
Ok(extremum)
}
+
+/// `lower`: Convert a string to lowercase.
+pub fn lower(_: &mut EvalContext, args: &mut Arguments) -> TypResult<Value> {
+ Ok(args.expect::<Str>("string")?.to_lowercase().into())
+}
+
+/// `upper`: Convert a string to uppercase.
+pub fn upper(_: &mut EvalContext, args: &mut Arguments) -> TypResult<Value> {
+ Ok(args.expect::<Str>("string")?.to_uppercase().into())
+}
diff --git a/tests/typ/utility/strings.typ b/tests/typ/utility/strings.typ
new file mode 100644
index 00000000..7c708175
--- /dev/null
+++ b/tests/typ/utility/strings.typ
@@ -0,0 +1,8 @@
+// Test string functions.
+// Ref: false
+
+---
+#let memes = "ArE mEmEs gReAt?";
+#test(lower(memes), "are memes great?")
+#test(upper(memes), "ARE MEMES GREAT?")
+#test(upper("Ελλάδα"), "ΕΛΛΆΔΑ")