1 ! Copyright (C) 2022 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license
4 USING: combinators kernel sequences splitting strings unicode ;
10 : case-index ( str -- i/f )
11 dup [ lower? ] find drop [
12 over [ lower? not ] find-from drop
13 [ nip ] [ length ] if*
16 : split-case ( str -- words )
17 >graphemes [ dup empty? not ] [
20 [ f 0 rot [ length ] keep <slice> ] if* concat
23 : split-tokens ( str -- words )
24 " -_." split [ split-case ] map concat ;
26 : case1 ( str quot glue -- str' )
27 [ split-tokens ] [ map ] [ join ] tri* ; inline
29 : case2 ( str first-quot rest-quot glue -- str' )
31 [ split-tokens 0 over ]
32 [ change-nth dup rest-slice ]
39 : >camelcase ( str -- str' ) [ >lower ] [ >title ] "" case2 ;
41 : >pascalcase ( str -- str' ) [ >title ] "" case1 ;
43 : >snakecase ( str -- str' ) [ >lower ] "_" case1 ;
45 : >adacase ( str -- str' ) [ >title ] "_" case1 ;
47 : >macrocase ( str -- str' ) [ >upper ] "_" case1 ;
49 : >kebabcase ( str -- str' ) [ >lower ] "-" case1 ;
51 : >traincase ( str -- str' ) [ >title ] "-" case1 ;
53 : >cobolcase ( str -- str' ) [ >upper ] "-" case1 ;
55 : >lowercase ( str -- str' ) [ >lower ] " " case1 ;
57 : >uppercase ( str -- str' ) [ >upper ] " " case1 ;
59 : >titlecase ( str -- str' ) [ >title ] " " case1 ;
61 : >sentencecase ( str -- str' ) [ >title ] [ >lower ] " " case2 ;
63 : >dotcase ( str -- str' ) [ >lower ] "." case1 ;