From fa9a9f6668b9589dc513957fa2939cb3f6454d4c Mon Sep 17 00:00:00 2001 From: lens0021 Date: Mon, 25 Nov 2024 22:07:46 +0900 Subject: [PATCH 1/4] Use the bash native capitalizing method if available, or fallback to other functions --- src/std/text.ab | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/std/text.ab b/src/std/text.ab index 0ad3bbba..3d620575 100644 --- a/src/std/text.ab +++ b/src/std/text.ab @@ -142,8 +142,26 @@ pub fun char_at(text: Text, index: Num): Text { } /// Capitalize the first letter of the given `text`. +#[allow_absurd_cast] pub fun capitalize(text: Text): Text { - return trust $ echo "{text}" | sed "s/^\(.\)/\U\1/" $ + trust { + if len(text) == 0: return text + const bash_version = $ echo \"\$\{BASH_VERSINFO[0]}\" $ as Num + if { + bash_version >= 4 { + return $ echo \"\$\{text^}\" $ + } else { + // GNU sed supports \U + $ re='\bCopyright\b.+\bFree Software Foundation\b'; [[ \$(sed --version 2>/dev/null) =~ \$re ]] $ + if status == 0: + return trust $ echo "{text}" | sed "s/^\(.\)/\U\1/" $ + else { + let first_letter = upper(char_at(text, 0)) + return first_letter + slice(text, 1) + } + } + } + } } /// Pads `text` with the specified `pad` character on left until it reaches the desired `length`. @@ -166,3 +184,7 @@ pub fun rpad(text: Text, pad: Text, length: Num): Text { pub fun zfill(text: Text, length: Num): Text { return lpad(text, "0", length) } + +main(args) { + echo capitalize("aaa") +} From a8186e3c8626f9e0dce0c83175eb2ea7c78ab54e Mon Sep 17 00:00:00 2001 From: Lens0021 / Leslie Date: Tue, 26 Nov 2024 22:55:22 +0900 Subject: [PATCH 2/4] Remove redundant trust --- src/std/text.ab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/std/text.ab b/src/std/text.ab index 3d620575..b9339f3a 100644 --- a/src/std/text.ab +++ b/src/std/text.ab @@ -154,7 +154,7 @@ pub fun capitalize(text: Text): Text { // GNU sed supports \U $ re='\bCopyright\b.+\bFree Software Foundation\b'; [[ \$(sed --version 2>/dev/null) =~ \$re ]] $ if status == 0: - return trust $ echo "{text}" | sed "s/^\(.\)/\U\1/" $ + return $ echo "{text}" | sed "s/^\(.\)/\U\1/" $ else { let first_letter = upper(char_at(text, 0)) return first_letter + slice(text, 1) From c3028a90b9c5f27fa011a3931358d5abf49dc864 Mon Sep 17 00:00:00 2001 From: Lens0021 / Leslie Date: Tue, 26 Nov 2024 23:24:42 +0900 Subject: [PATCH 3/4] cleanup --- src/std/text.ab | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/std/text.ab b/src/std/text.ab index b9339f3a..20ccef16 100644 --- a/src/std/text.ab +++ b/src/std/text.ab @@ -184,7 +184,3 @@ pub fun rpad(text: Text, pad: Text, length: Num): Text { pub fun zfill(text: Text, length: Num): Text { return lpad(text, "0", length) } - -main(args) { - echo capitalize("aaa") -} From c0a60e4a65fbbe2b0ffa34aba572ffb434be6214 Mon Sep 17 00:00:00 2001 From: lens0021 Date: Wed, 27 Nov 2024 09:30:17 +0900 Subject: [PATCH 4/4] Flatten if chain Co-authored-by: hdwalters --- src/std/text.ab | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/std/text.ab b/src/std/text.ab index 20ccef16..6a94a4e9 100644 --- a/src/std/text.ab +++ b/src/std/text.ab @@ -145,22 +145,20 @@ pub fun char_at(text: Text, index: Num): Text { #[allow_absurd_cast] pub fun capitalize(text: Text): Text { trust { - if len(text) == 0: return text + if len(text) == 0 { + return text + } const bash_version = $ echo \"\$\{BASH_VERSINFO[0]}\" $ as Num - if { - bash_version >= 4 { - return $ echo \"\$\{text^}\" $ - } else { - // GNU sed supports \U - $ re='\bCopyright\b.+\bFree Software Foundation\b'; [[ \$(sed --version 2>/dev/null) =~ \$re ]] $ - if status == 0: - return $ echo "{text}" | sed "s/^\(.\)/\U\1/" $ - else { - let first_letter = upper(char_at(text, 0)) - return first_letter + slice(text, 1) - } - } + if bash_version >= 4 { + return $ echo \"\$\{text^}\" $ + } + // GNU sed supports \U + $ re='\bCopyright\b.+\bFree Software Foundation\b'; [[ \$(sed --version 2>/dev/null) =~ \$re ]] $ + if status == 0 { + return $ echo "{text}" | sed "s/^\(.\)/\U\1/" $ } + const first_letter = upper(char_at(text, 0)) + return first_letter + slice(text, 1) } }