Parseando valores ${campo}

opa…
pessoal… to fazendo uma linguagem de script pra interpretar o template da saída de um programa…

é o seguinte… incialmente to fazendo tudo na mao… acho que nao valerá a pena usar alguma API só pra fazer esse parse… pq vai ser usado numa classe só…
só se tiver uma API free, simples e pequena… pq to tendo que usar aqui na empresa… e eles nunca compram API… e nem precisam :mrgreen:

um arquivo de template seria mais ou menos assim:
Citação:

Olá ${nome}, vc tem ${idade} anos!

to parseando isso no braço mesmo… usando indexOf(), subString() e replaceFirst()

talvez essa nao é a melhor maneira… mas pelo menos agora como testes, to fazendo assim mesmo…

o problema é quando tento fazer o replace de ${campo} por o valor correspondete no HashMap…
o erro acontece pq caracteres $,.{}; e outros são inválidos para esse tipo de operação…

alguem tem uma ideia de como eu posso fazer um replace disso?

abraços

Porque em vez de fazer você não usa o que já está pronto, como o Velocity ou o FreeMarker?

Já ouviu falar de “regular expression”?

ja… só que a aplicação nao rola em ambiente web…
nao sei se funcionaria fora de um ambiente web… mas mesmo que funcionasse, eu gostaria de tratar isso na mão mesmo… pra servir também como forma de aprendizado… um desafio mesmo… gosto disso

ja… só que pelo jeito eu nao to sabendo usar…
pq qdo eu faço, por exemplo, um [i]replaceFirst("${nome}",“Badawi”)[i] aparece o seguinte erro…

sei que é por causa desses esquemas dos escapes…

alguem pode me ajudar com isso?

abraços

Nenhum dos dois esquemas de templates que eu citei precisam de um sistema web, os dois podem ser utilizados normalmente em uma aplicação desktop.

opa… valeu ae pela resposta…
mas eu to querendo fazer isso no braço mesmo… eu sei que Velocity faz isso muito bem e tal… mas eu quero fazer isso na mao mesmo… pra aprendizado…
e tb pq nao sei se valeria a pena o uso de uma poderosa ferramenta pra tratar um parse de template… que nao é nem 5% do que a aplicão faz.

to querendo isso, pq a aplicação gera como se fosse um relatório (mas nao é relatório) e envia ao cliente por email… o que quero é fazer uma funcionalidade pro admin da aplicação poder mudar o template do email…

sei que poderia usar até o Jasper… mas nao gosto do jasper… e como ja disse, quero fazer o gerenciador de templates na mão mesmo… pelo simples fato de gostar de fazer isso

abraços e valeu pelas respostas! :smiley:

Já que vc quer aprender, baixa o código do Velocity e dá uma olhada. O melhor jeito de aprender é vendo como se faz.

to fazendo isso…
mas como o FreeMaker

mas agredeceria se alguem pudesse me ajudar como fazer o replace disso ${nome} por isso Daniel

abraços

tada-da-da
http://www.guj.com.br/posts/list/19118.java

valeu Lipe! :smiley: :smiley:

Para casos simples, leia a documentação aqui java.text.MessageFormat

Shoes

aeeeeeeeeeeeee!!!

consegui!!
fiz assim:

Map map = new HashMap();
        map.put("nomeUser", "Daniel Badawi");
        map.put("nomeProjeto", "TaskNotifier");

        StringBuffer str = new StringBuffer("bla bla bla ${nomeUser} bla bla bla ${nomeProjeto}");
       
        while (str.indexOf("${") != -1) {
            String tag = str.substring(str.indexOf("${"),
                    (str.indexOf("}") + 1));
            String valueTag = str.substring((str.indexOf("${") + 2), str
                    .indexOf("}"));

            str.replace(str.indexOf("${"), str.indexOf("}") + 1, map.get(
                    valueTag).toString());

        }

        System.out.println(str.toString());

recebe como entrada a String bla bla bla ${nomeUser} bla bla bla ${nomeProjeto}
e a saída fica assim:
bla bla bla Daniel Badawi bla bla bla TaskNotifier

abraços!

para duvidas sobre expressões regulares, sempre consulte: http://guia-er.sourceforge.net/

hehehe, tem o guia todo de gratis na net :smiley:

String pattern = “${[w]+}”;

Acho que isso funfa!

galera!
consegui fazer uma engine bem legal…
inclusive com controle de fluxo!! (por enquanto só co for)
mas isso ja é um bom caminho!

abraços e valeu ae!

Interessante Daniel, eu tenho um troço desses, por enquanto num é Java, mas a idéia é a mesma. No meu caso, em vez de catar cada ${ como tu faz, eu faço diferente. Em Java seria equivalente a percorrer cada elemento do Map, chamando então um relpaceAll(nome, valor) no template.

Tua abordagem me parece mais rápida, e isso vai ajudar pacas pra mim, porque geralmente os templates são grandes…

Daniel, o seu método ainda pode ser melhorado para ser “um pouco mais” performático, já que ele sempre vai procurar o índice do ‘${’ desde o início do SringBuffer. Você poderia manter a última posição alcançada e percorrer a partir dela.

sim sim!
estou melhorando cada vez mais…
meu chefe curtiu muito essa ideia, pq ele vai poder mudar o template a hora que quiser, via browser mesmo…
aí ele ja quis ficar programando nessas tagzinhas, só que ainda nao tava muito legal… entao decidi tocar o projeto pra frente…

ja dei umas pequenas melhoradas… principalmente na tag de Looping… agora eu to fazendo a estruta dela assim:

[loop id="users"]
${users.nome}
[/loop]

saida:

outra melhoria:

[bean id="project"/]
${project.nomeProjeto}

saida:

só que ainda to com um pé atrás com essa… pq uma vez que o o objeto é passado para a view através de um Map, nao tem muito a utilidade de se se ter uma tag [bean]…

outra melhoria (que ja tinha feito desde o inicio mas que ainda nao tava 100%):
no método de Bussines, Action… o que for que seja que jogue os dados para a View…

SimpleTag.setAttribute("users",umListDeUsers);

o Attribute no caso é um unico Map que será enviado para a View…
e é com a chave desse atributo que as tags encontram…

ta até ficando bunitinho isso aí! eheheh

só preciso melhorar a engine de parser… ja modifiquei legal ela em relação ao ultimo post… nada perto do ideal, mas ta bem melhor que antes…
só que tag com atributos ex: [loop id=“xxx”] ainda ta bem porco o parser dela… mas com o tempo eu vo melhorando…

comentários, críticas (construtivas), opniões, sujestões, são sempre bem vindas! :smiley:
abraços!

heehehehe!!
to curtindo pra caralho programar essses esquemas de script… eheh
e tá até rapidinho o processamento delas!
por ser totalmente interpretado, tem um desempenho legal até…

acabei de colocar em produção aqui na empresa… e ele processou e gerou um arquivo texto de 30kb… com 15 tags de loops e com aproximadamente 70 tags de valor (referente aos loopings)

e a sáida foi instânea… jogando toda a saída no System.out.println(), a velocidade foi muito boa (considerando que eu nao nenhum expert em algoritmos de performance) que parece até que ta imprimindo o um monte de System.out.println() de Strings puras e tratadas…

minha mae ia ficar orgulhosa de mim! hehehe (se ela conhecesse java, é claro) :smiley: :smiley: :lol: :lol:

Pergunta: por que não utilizar uma linguagem de script como Groovy, BeanShell ou VTL diretamente mesmo?