Resolvi implementar um camel case stripper em Smalltalk (Pharo). Talvez fosse mais fácil fazê-lo usando expressões regulares mas usei técnicas de parsing. Veja o código abaixo:
Criando a class:
Object subclass: #CamelCaseStripper instanceVariableNames: 'read word char write' classVariableNames: '' poolDictionaries: '' category: 'FAM-Utils'
O método principal:
strip "Ver CamelCaseStripper example" self readChar. self readWord. [word isEmptyOrNil] whileFalse: [ write add: word. self readWord. ]. ^write asArray
A lógica para separar as ‘corcovas’:
readWord | wordWrite | wordWrite := WriteStream on: String new. char ifNotNil: [ char isLowercase ifTrue: [ self writeLowercaseTo: wordWrite ] ifFalse: [ "Uppercase" wordWrite nextPut: char. self readChar. char ifNotNil: [ char isUppercase ifTrue: [ self writeUppercaseTo: wordWrite] ifFalse: [ self writeLowercaseTo: wordWrite ] ] ] ]. word := wordWrite contents
E, finalmente, os métodos chamados:
writeLowercaseTo: wordWrite [ char notNil and: [ char isLowercase ] ] whileTrue: [ wordWrite nextPut: char. self readChar ]
e
writeUppercaseTo: wordWrite [ char notNil and: [ char isUppercase ] and: [self nextChar isUppercase]] whileTrue: [ wordWrite nextPut: char. self readChar ]
No class side veja como usar a classe:
example |stripper| stripper := CamelCaseStripper from: 'prefixWABrushTag'. stripper strip "--> #('prefix' 'WA' 'Brush' 'Tag')"
Outros detalhes podem ser vistos em CamelCaseStripper.st.
Coloquei também um método de conveniência em String:
camelCaseStrip ^(CamelCaseStripper from: self) strip
Agora o uso fica como a seguir:
'ABCdefGHIjk' camelCaseStrip "--> #('AB' 'Cdef' 'GH' 'Ijk')"
Nota: Estou usando o site http://www.hilite.me/ para code beautifier mas não estou gostando das barras de rolagem horizontais. Acho que a identação do hilite me é exagerada. No futuro vou tentar usar http://pastie.org (acho que precisa de um plugin para o WordPress: Show Pastie Code in Comments WordPress Plugin).