Aldeia Numaboa

  • Increase font size
  • Default font size
  • Decrease font size

GeSHi à moda da casa

Indique esta página Imprimir PDF
(5 votos, média 4.0 de 5)
Índice do Artigo
GeSHi à moda da casa
Mais um trato
Todas as páginas

Depois de usar o plugin do GeSHi por um tempo, esbarrei num pequeno problema. Como as tags <pre> são usadas como marcadores para o GeSHi, fiquei sem as ditas cujas para criar outros efeitos além do destaque de texto. De alguma forma eu não estava muito satisfeita com este "sequestro" da tag por que bateu uma espécie de sensação de perda...

A primeira etapa

Quem usa o CMS Joomla sabe que a maioria dos plugins que atuam no conteúdo das páginas são acionados por marcadores do tipo {nome do plugin}. Como minha primeira idéia foi a de recuperar a tag <pre>, o mais lógico seria alterar o plugin de forma que outro marcador chamasse o GeSHi. Poderia ser alguma coisa do tipo {geshi} ou até mesmo <geshi>. Abri o plugin /plugins/content/geshi.php para dar uma olhada no código. Logo no início, na função plgContentGeshi(), achei o que procurava:

Plugin original do GeSHi
  1. ...
  2. /**
  3. * Code Highlighting Plugin
  4. *
  5. * Replaces <pre>...</pre> tags with highlighted text
  6. */
  7. function plgContentGeshi( &$row, &$params, $page=0 )
  8. {
  9. // simple performance check to determine whether bot should process further
  10. if ( JString::strpos( $row->text, 'pre>' ) === false ) {
  11. return true;
  12. }
  13.  
  14. // Get Plugin info
  15. $plugin =& JPluginHelper::getPlugin('content', 'geshi');
  16.  
  17. // define the regular expression for the bot
  18. $regex = "#<pre xml:\s*(.*?)>(.*?)</pre>#s";
  19.  
  20. $GLOBALS['_MAMBOT_GESHI_PARAMS'] =& $params;
  21.  
  22. // perform the replacement
  23. $row->text = preg_replace_callback( $regex, 'plgContentGeshi_replacer', $row->text );
  24.  
  25. return true;
  26. }

Observe a linha 35. Nesta linha é criado um regex todo complicado que identifica tudo o que estiver entre as tags <pre> e </pre>. Oba! É aí mesmo que precisamos mudar alguma coisa sorriso

Mas tem mais um pequeno detalhe. Para evitar que todo o código do plugin seja executado mesmo se não houver o marcador apropriado, a linha 27 faz uma checagem inicial: se no texto não existir nenhuma ocorrência da string 'pre>', então retorne.

Pois bem, agora precisamos decidir como o GeSHi será chamado. Só para ficar entre o modo tradicional de chamar plugins com {nome do plugin} e a forma tradicional de indicar as tags com <nome da tag>, resolvi ficar em cima do muro e criar os novos marcadores como <geshi>...</geshi>. Apenas duas pequenas alterações fizeram o milagre:

Novo plugin GeSHi
  1. ...
  2. /**
  3. * Code Highlighting Plugin
  4. *
  5. * Replaces <pre>...</pre> tags with highlighted text
  6. * Troquei por <geshi>...</geshi>
  7. */
  8. function plgContentGeshi( &$row, &$params, $page=0 )
  9. {
  10. // simple performance check to determine whether bot should process further
  11. if ( JString::strpos( $row->text, 'geshi>' ) === false ) {
  12. return true;
  13. }
  14.  
  15. // Get Plugin info
  16. $plugin =& JPluginHelper::getPlugin('content', 'geshi');
  17.  
  18. // define the regular expression for the bot
  19. $regex = "#<geshi\s*(.*?)>(.*?)</geshi>#s";
  20.  
  21. $GLOBALS['_MAMBOT_GESHI_PARAMS'] =& $params;
  22.  
  23. // perform the replacement
  24. $row->text = preg_replace_callback( $regex, 'plgContentGeshi_replacer', $row->text );
  25.  
  26. return true;
  27. }

Não vou entrar em maiores detalhes sobre o novo regex que criei por que isto foge do assunto principal. A única coisa que fiz foi eliminar o xml: e trocar pre por geshi. O fato é que, assim que alterei o código fonte, criei uma página de teste e as tags <geshi>...<geshi> funcionaram perfeitamente. A primeira estapa foi vencida comemora

A segunda etapa

Como estava acostumada a usar o plugin indicando a linguagem de programação desejada, a linha 59 do código do plugin não foi nenhuma surpresa.

Plugin original do GeSHi
  1. $lang = JArrayHelper::getValue( $args, 'lang', 'php' );

Esta linha "cisca" o parâmetro 'lang' que determina a linguagem que deve ser usada. Se não for especificada, será usada a linguagem default PHP; se for especificada, então a linguagem definida será usada. Por exemplo, se eu quiser um destaque para a linguagem Javascript, coloco o seguinte no texto:

<geshi lang="javascript">var i = 0;</geshi>

Olhando na linha seguinte, verifiquei que havia mais um parâmetro que poderia ser usado para que as linhas de código fossem numeradas. O trecho do plugin original que permite numerar as linhas é o seguinte:

Plugin original do GeSHi
  1. $lang = JArrayHelper::getValue( $args, 'lang', 'php' );
  2. $lines = JArrayHelper::getValue( $args, 'lines', 'false' );

Quando o parâmetro lines é verdadeiro, o plugin manda para o script do GeSHi o seguinte:

Plugin original do GeSHi
  1. $geshi = new GeSHi( $text, $lang );
  2. if ($lines == 'true') {
  3. $geshi->enable_line_numbers( GESHI_NORMAL_LINE_NUMBERS );
  4. }

Toca conferir! Coloquei na página de teste uma chamada do tipo

<geshi lines="true">qualquer coisa</geshi>

e o resultado foi o seguinte:

  1. qualquer coisa

Não é que deu certo? A linha foi numerada! E daí, sabe como é que é, "trair e coçar, é só começar". Assim que "traí" o plugin do GeSHi, a coceira começou - e a coceira foi a seguinte: toda vez que eu chamasse o GeSHi para que mostrasse o código com linhas numeradas, a primeira linha receberia o número 1. E se a primeira linha de código fosse a 81, como mostrei um pouco mais acima? Bem, aí é só fazer o seguinte:



Atualização Dom, 12.07.2009 14:06  

Na Aldeia

Há 83 visitantes online

3304 registros
0 hoje
9 nesta semana
41 neste mês

Boas vindas: Xico

Estatística

Artigos: 1063
Leituras: 6036631
Arquivados: 21
Downloads: 533
Baixados: 172238
Glossário: 1208
Bibliografia: 25
Links: 90

Visitas de onde

Top 5:
Brasil flag 73%Brasil (47548)
Portugal flag 5%Portugal (3071)
EUA flag 3%EUA (2135)
Rússia flag 0%Rússia (259)
Holanda flag 0%Holanda (239)
65147 visitas de 100 países

Hoje:155
Ontem:2587
No mês:39332
Mês passado:25815
Total:65147
Recorde:3037
No dia:04.03.10
Leituras hoje:19423
Leituras Total:280975
Bots hoje:89
Dados desde:16.02.2010

Login

Kanji da hora




Faça contato







Juro por Deus que estou morta de vergonha. Ao invés do nosso presidente ouvir os apelos e tentar ajudar, ele "tira sarro" de prisioneiros políticos perseguidos pelo seu lunático amigo Castro, apreciador do frango ensopado de dona Letícia.

Leia Mais