Crab Log

Camel Case Stripper

Novembro 1, 2009 · 3 Comentários

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).

Categorias: Smalltalk