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:
(?s).*[code](.*?)[/code].*
A qual aplico no conteudo desejado. Para recuperar o conteudo, uso
Matcher matcher = Pattern.compile(bb.getBeforeUseRegexp()).matcher(p.getText());
no caso, bb.getBeforeUseRegexp()) contem a regexp mostrada anteriormente. Depois uso
String contents = matcher.group(1);
para pegar o conteudo entre [code] e [/code], vindo examente o que preciso. Apos isso, faco
contents = contents.replaceAll(bb.getBeforeReplace(), "&"+ bb.getBeforeReplaceWith());
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
(?s)[code](.*?)[/code]
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)code[/code], no final de tudo…
Sem contar que essa “solucao” que fiz ate agora ta uma gambiarra soh aparentemente…
Rafael