Camel Case Stripper

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

Anúncios

3 comentários

  1. O haskell possui uma ferramenta chamada HsColour, que marca o código fonte com estilos CSS.

    No meu blog, incluí os estilos no “template” da página.

    Será que não tem algo parecido para o SmallTalk?

  2. Rafael, no Squeak tinha uma ferramenta que gerava um HTML bem legal para um método. Na imagem do Pharo ainda não sei como fazer isso. Talvez tenha sido retirado da imagem para emagrecê-la.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s