StrCase2

Lembram daquela exemplo do layers maiúsculos e minúsculos? me ocorreu que derrepente eu posso querer só a primeira letra maiúscula e o resto minúscula... ou invertido, sei lá... mas o strcase so faz dum jeito ou do outro... entao bolei na corrida isto:
(defun strcase2 (str opcao / tmp s)
  (
cond
;tudo minusculo:
    ((or (equal t opcao)(= opcao "minus"))
     (
strcase str t))
;tudo maiusculo:
    ((or (null opcao) (= opcao "maius"))
     (
strcase str))
;primeira letra da sentença:
    ((= opcao "prma")
     (
setq str (strcase str t))
     (
vl-string-subst
       (strcase (substr str 1 1))
       (
substr str 1 1) str))
;primeira letra de cada sentença em maiusculo:
    ((= opcao "plsm")
     (
setq str (strcase str t)
           tmp nil)
     (
repeat (strlen str)
       (
setq s   (substr str 1 1)
             str (strcat (substr str 2 (strlen str))
                         (
strcase s tmp))
             tmp (not (wcmatch s "*.*"))))
     str)
;inverter tudo:
    ((= opcao "invr")
     (
repeat (strlen str)
       (
setq s   (substr str 1 1)
             str (strcat
                   (substr str 2 (strlen str))
                   (
strcase s (= s (strcase s))))))
     str)
;nenhuma das opções:
    (t str)))

Para usar:
(strcase2 "abc def ghi" t) ou (strcase2 "abc def ghi" "minus") -> "abc def ghi"
(strcase2 "abc def ghi" nil) ou (strcase2 "abc def ghi" "maius") -> "ABC DEF GHI"
(strcase2 "abc def ghi" "prma") -> "Abc def ghi"
(strcase2 "abc def ghi" "plsm") -> "Abc Def Ghi"
(strcase2 "aBc dEf gHi" "invr") -> "AbC DeF GhI"
assim ficou mais completo... depois eu coloco uma rotina completa usando isso

Nenhum comentário:

Postar um comentário