A classe WikiParser inclui métodos que convertem texto de entrada Wiki em saída HTML equivalente. Esse não é um aplicativo de conversão Wiki muito robusto, mas ele ilustra alguns bons usos de expressões regulares para correspondência de padrão e conversão de strings.
A função de construtor, junto com o método
setWikiData()
, simplesmente inicializa uma string de amostra do texto de entrada Wiki, como se segue:
public function WikiParser()
{
wikiData = setWikiData();
}
Quando o usuário clica no botão Testar no aplicativo de amostra, o aplicativo chama o método
parseWikiString()
do objeto WikiParser. Esse método chama vários outros métodos, que por sua vez montam a string HTML resultante.
public function parseWikiString(wikiString:String):String
{
var result:String = parseBold(wikiString);
result = parseItalic(result);
result = linesToParagraphs(result);
result = parseBullets(result);
return result;
}
Cada um dos métodos chamados —
parseBold()
,
parseItalic()
,
linesToParagraphs()
e
parseBullets()
— usa o método
replace()
da string para substituir os padrões de correspondência, definidos por uma expressão regular, para transformar o texto de entrada Wiki em texto no formato HTML.
Conversão de padrões negrito e itálico
O método
parseBold()
procura padrão de texto negrito Wiki (como
'''foo'''
) e o transforma em seu equivalente em HTML (como
<b>foo</b>
), como se segue:
private function parseBold(input:String):String
{
var pattern:RegExp = /'''(.*?)'''/g;
return input.replace(pattern, "<b>$1</b>");
}
Observe que a parte
(.?*)
de uma pressão regular corresponde a vários caracteres (
*
) entre os dois padrões de definição
'''
. O quantificador
?
torna a correspondência não greedy, para que uma string como
'''aaa''' bbb '''ccc'''
, a primeira string correspondida será
'''aaa'''
e não a string inteira (que começa e termina com o padrão
'''
).
Os parênteses na expressão regular definem um grupo de captura, e o método
replace()
se refere a esse grupo utilizando o código
$1
na string de substituição. O sinalizador
g
(
global
) na expressão regular garante que o método
replace()
substitua todas as correspondências na string (não simplesmente a primeira).
O método
parseItalic()
funciona de forma semelhante ao método
parseBold()
, exceto pelo fato de ele verificar dois apóstrofes (
''
) como o delimitador para texto itálico (não três):
private function parseItalic(input:String):String
{
var pattern:RegExp = /''(.*?)''/g;
return input.replace(pattern, "<i>$1</i>");
}
Conversão de padrões de bullet
Como mostra o exemplo a seguir, o método
parseBullet()
procura o padrão de linha de bullet Wiki (como
* foo
) e o transforma em seu equivalente HTML (como
<li>foo</li>
):
private function parseBullets(input:String):String
{
var pattern:RegExp = /^\*(.*)/gm;
return input.replace(pattern, "<li>$1</li>");
}
O símbolo
^
no início de uma expressão regular corresponde ao início de uma linha. O sinalizador
m
(
multiline
) na expressão regular faz com que essa expressão corresponda o símbolo
^
ao início de uma linha, e não simplesmente ao início da string.
O padrão
\*
corresponde a um caractere asterisco (a barra invertida é usada para sinalizar um asterisco literal em vez de um quantificador
*
).
Os parênteses na expressão regular definem um grupo de captura, e o método
replace()
se refere a esse grupo utilizando o código
$1
na string de substituição. O sinalizador
g
(
global
) na expressão regular garante que o método
replace()
substitua todas as correspondências na string (não simplesmente a primeira).
Conversão de padrões Wiki de parágrafos
O método
linesToParagraphs()
converte cada linha na string Wiki de entrada em uma tag de parágrafo HTML
<p>
. Essas linhas no método retiram linhas vazias da string Wiki de entrada:
var pattern:RegExp = /^$/gm;
var result:String = input.replace(pattern, "");
Os símbolos
^
e
$
de uma expressão regular correspondem ao início e ao fim de uma linha. O sinalizador
m
(
multiline
) na expressão regular faz com que essa expressão corresponda o símbolo ^ ao início de uma linha, e não simplesmente ao início da string.
O método
replace()
substitui todas as substrings correspondentes (linhas vazias) por uma string vazia (
""
). O sinalizador
g
(
global
) na expressão regular garante que o método
replace()
substitua todas as correspondências na string (não simplesmente a primeira).