From 3ed5e48ef3704f763b56256321e22c92cf5d4afd Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Wed, 27 Jul 2022 15:08:18 -0700 Subject: [PATCH] tokencase: adding token case conversions --- extra/tokencase/authors.txt | 1 + extra/tokencase/tokencase-tests.factor | 15 ++++++ extra/tokencase/tokencase.factor | 63 ++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 extra/tokencase/authors.txt create mode 100644 extra/tokencase/tokencase-tests.factor create mode 100644 extra/tokencase/tokencase.factor diff --git a/extra/tokencase/authors.txt b/extra/tokencase/authors.txt new file mode 100644 index 0000000000..e091bb8164 --- /dev/null +++ b/extra/tokencase/authors.txt @@ -0,0 +1 @@ +John Benediktsson diff --git a/extra/tokencase/tokencase-tests.factor b/extra/tokencase/tokencase-tests.factor new file mode 100644 index 0000000000..d182c49d48 --- /dev/null +++ b/extra/tokencase/tokencase-tests.factor @@ -0,0 +1,15 @@ +USING: tokencase tools.test ; + +{ "myNameIsFactor" } [ "My-name.Is_Factor" >camelcase ] unit-test +{ "MyNameIsFactor" } [ "My-name.Is_Factor" >pascalcase ] unit-test +{ "my_name_is_factor" } [ "My-name.Is_Factor" >snakecase ] unit-test +{ "My_Name_Is_Factor" } [ "My-name.Is_Factor" >adacase ] unit-test +{ "MY_NAME_IS_FACTOR" } [ "My-name.Is_Factor" >macrocase ] unit-test +{ "my-name-is-factor" } [ "My-name.Is_Factor" >kebabcase ] unit-test +{ "My-Name-Is-Factor" } [ "My-name.Is_Factor" >traincase ] unit-test +{ "MY-NAME-IS-FACTOR" } [ "My-name.Is_Factor" >cobolcase ] unit-test +{ "my name is factor" } [ "My-name.Is_Factor" >lowercase ] unit-test +{ "MY NAME IS FACTOR" } [ "My-name.Is_Factor" >uppercase ] unit-test +{ "My Name Is Factor" } [ "My-name.Is_Factor" >titlecase ] unit-test +{ "My name is factor" } [ "My-name.Is_Factor" >sentencecase ] unit-test +{ "my.name.is.factor" } [ "My-name.Is_Factor" >dotcase ] unit-test diff --git a/extra/tokencase/tokencase.factor b/extra/tokencase/tokencase.factor new file mode 100644 index 0000000000..226dd3d22a --- /dev/null +++ b/extra/tokencase/tokencase.factor @@ -0,0 +1,63 @@ +! Copyright (C) 2022 John Benediktsson +! See http://factorcode.org/license.txt for BSD license + +USING: combinators kernel sequences splitting strings unicode ; + +IN: tokencase + + ] if* + ] produce nip ; + +: split-tokens ( str -- words ) + " -_." split [ split-case ] map concat ; + +: case1 ( str quot glue -- str' ) + [ split-tokens ] [ map ] [ join ] tri* ; inline + +: case2 ( str first-quot rest-quot glue -- str' ) + { + [ split-tokens 0 over ] + [ change-nth dup rest-slice ] + [ map! drop ] + [ join ] + } spread ; inline + +PRIVATE> + +: >camelcase ( str -- str' ) [ >lower ] [ >title ] "" case2 ; + +: >pascalcase ( str -- str' ) [ >title ] "" case1 ; + +: >snakecase ( str -- str' ) [ >lower ] "_" case1 ; + +: >adacase ( str -- str' ) [ >title ] "_" case1 ; + +: >macrocase ( str -- str' ) [ >upper ] "_" case1 ; + +: >kebabcase ( str -- str' ) [ >lower ] "-" case1 ; + +: >traincase ( str -- str' ) [ >title ] "-" case1 ; + +: >cobolcase ( str -- str' ) [ >upper ] "-" case1 ; + +: >lowercase ( str -- str' ) [ >lower ] " " case1 ; + +: >uppercase ( str -- str' ) [ >upper ] " " case1 ; + +: >titlecase ( str -- str' ) [ >title ] " " case1 ; + +: >sentencecase ( str -- str' ) [ >title ] [ >lower ] " " case2 ; + +: >dotcase ( str -- str' ) [ >lower ] "." case1 ; -- 2.34.1