Regexps endiabradas  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

A situacao eh a seguinte:

todos ja conhecem os bbcodes, essas tagzinhas entre colchetes que usamos o tempo todo aqui no forum, nao?!.. Pois bem, estava eu fazendo a implementaco delas no jforum, testando aqui e acola, quando me liguei do fato que as tags contidas dentro de uma tag code ( [code] ) nao podem ser processadas.. ou seja, devem ser consideradas como texto literal, ao inves de rolar o processamento.

Mexe aqui, arruma ali e nada parece funcionar, chegando ao ponto de fazer uns hacks bisonhos que funcionam parcialmente. Fiz da seguinte maneira:

Na definicao das tags, especifiquei que, antes de fazer o replace das tags [code] e [/code] pelo respectivo codigo HTML, deveria ser feito um outro processamento, o qual faria o trabalho sujo de evitar que outras possiveis bb tags dentro da tag code fossem processadas.. Logicamente nao desejo que as demais tags, que se encontram fora de [code] / [/code], sejam afetadas, o que resulta na necessidade de pegar somente o texto entre [code] e [/code]. Para tanto, usei a seguinte regex:




A qual aplico no conteudo desejado. Para recuperar o conteudo, uso



no caso, bb.getBeforeUseRegexp()) contem a regexp mostrada anteriormente. Depois uso



para pegar o conteudo entre [code] e [/code], vindo examente o que preciso. Apos isso, faco



onde bb.getBeforeReplace() contem "[" e bb.getBeforeReplaceWith() contem "#91;". Isso faz com que o caracter de abertura de colchete seja transformado no seu respectivo codigo HTML, evitando assim que as outras regexp detectem a tag. Isso funciona ok.

Feito isso, eh hora de aplicar a regexp "real", ou seja, a que ira substituir [code] e [/code] pelas respectivas tags HTML. Para esse caso, uso a regexp



que faz o trabalho sujo como deveria...

Ou quase. Pois agora ha os problemas em si dessa implementacao:

Logicamente, matcher.group(1) nao ira resolver o caso caso eu tenha varias tags [code] na mensagem, pois somente uma das tags sera considerada.
Eu precisaria pegar e processar todos os grupos de possiveis tags "code" existentes na mensagem, aplicar o replace do caracterer de colchete e somente entao aplicar a regexp (?s), no final de tudo..

Sem contar que essa "solucao" que fiz ate agora ta uma gambiarra soh aparentemente...

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
danieldestro
Moderador
[Avatar]

Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline

deixe-me pensar....
ok....bom cara, vc tem q montar aquelas arvores que se usam em compiladores, nao eh?
ai vc pode estruturar as partes na arvore e trabalha dentro de uma arvore ...
entendeu?

mais ou menos assim:




isso viraria uma arvore assim:



ai vc faz as trocas (ou nao) nos nós da árvore....dá uma olhada.. nao lembro o nome dessas arvores em compiladores..... creio que sejam arvores de automatos.... nao fui um bom aluno de COMP.

gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol
[WWW]
Vegetto
GUJ Ranger

Membro desde: 22/06/2003 15:39:49
Mensagens: 797
Localização: Campinas
Offline

Rafael Steil wrote:Logicamente, matcher.group(1) nao ira resolver o caso caso eu tenha varias tags [code] na mensagem, pois somente uma das tags sera considerada.


E, se, enquanto houver tags [code] você faz esse replace...

Mas isso só iria fazer aumentar a "gambiarra" que você diz estar fazendo
danieldestro
Moderador
[Avatar]

Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline

Pode ser também né....
E no seu XML de config vc definiria:


gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol
[WWW]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Vegetto wrote:
Rafael Steil wrote:Logicamente, matcher.group(1) nao ira resolver o caso caso eu tenha varias tags [code] na mensagem, pois somente uma das tags sera considerada.


E, se, enquanto houver tags [code] você faz esse replace...

Mas isso só iria fazer aumentar a "gambiarra" que você diz estar fazendo


Nao resolve, pois a regexp nao pega todos os code de uma unica vez, e ficar rodando ela de novo ficaria retornando sempre o mesmo pecado de codigo..

Uma possivel solucao seria eu processar uma parte, fazer o replace pelo html, entao reprocessar desde o inicio, verificar se teve match, fazer replace pelo html, preproecessar....

Mas se tiver que chegar nesse ponto, faco manipulacao de strings no braco.

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
Vegetto
GUJ Ranger

Membro desde: 22/06/2003 15:39:49
Mensagens: 797
Localização: Campinas
Offline

Ceeerto, é realmente isso é muito sujo...

Você chegou a dar uma olhada na implementação dessa funcionalidade no phpBB ? Ou lá é com gambiarra também?
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Bom, achei uma solucao usando a implementacao atual, e vai ficar assim ate algo melhor aparecer

Basicamente, coloquei o processamento em um while() e mudei os replaceAll() por replaceFirst().. ou seja, processo um pedaco, entao faco o match de novo, reprocesso etc etc..

tipo:



Funcionando esta..

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Vegetto wrote:Ceeerto, é realmente isso é muito sujo...

Você chegou a dar uma olhada na implementação dessa funcionalidade no phpBB ? Ou lá é com gambiarra também?


O que eu faco com 30 linhas de codigo, o phpbb faz com 500 .. eh q no phpbb eles usam um minimo de regexp, e fazem trocentas verificacoes e manipulacoes no braco a mais..

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
Vegetto
GUJ Ranger

Membro desde: 22/06/2003 15:39:49
Mensagens: 797
Localização: Campinas
Offline

Pultz, que droga, não sabia que o código deles era tão porquinho
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Vegetto wrote:Pultz, que droga, não sabia que o código deles era tão porquinho


Porco eh o codigo do Nuke On JBoss... eh de dar vontade de vomitar.

O codigo do phpbb nao eh porco, os caras program direitinho. Mas devido a algumas escolhas deles em relacao a arquitetura, seguranca, e mesmo por causa de como algumas coias sao feitas em php ( nao estou dizendo que seja ruim ), o codigo eh maior.. Codigo menor nao significa necessariamente codigo melhor

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
danieldestro
Moderador
[Avatar]

Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline

Mas de 500 pra 30 linhas? Concluímos que...

haahahahhaah

abraços

gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team