La clase WikiParser incluye métodos que convierten texto Wiki de entrada en la salida HTML equivalente. Esta aplicación de conversión de Wiki no es muy sólida, pero ilustra algunos usos útiles de las expresiones regulares para la detección de patrones y la conversión de cadenas.
La función constructora, junto con el método
setWikiData()
, simplemente inicializa una cadena de ejemplo de texto de entrada de Wiki, de la manera siguiente:
public function WikiParser()
{
wikiData = setWikiData();
}
Cuando el usuario hace clic en el botón Test de la aplicación de ejemplo, la aplicación invoca al método
parseWikiString()
del objeto WikiParser. Este método llama a otros métodos, que a su vez crean la cadena 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 uno de los métodos llamados,
parseBold()
,
parseItalic()
,
linesToParagraphs()
y
parseBullets()
utiliza el método
replace()
de la cadena para sustituir patrones coincidentes, definidos por una expresión regular, a fin de transformar el texto de entrada del Wiki en texto con formato HTML.
Conversión de patrones en negrita y en cursiva
El método
parseBold()
busca un patrón de texto de Wiki en negrita (como
'''foo'''
) y lo transforma en su equivalente HTML (como
<b>foo</b>
), de la manera siguiente:
private function parseBold(input:String):String
{
var pattern:RegExp = /'''(.*?)'''/g;
return input.replace(pattern, "<b>$1</b>");
}
Hay que tener en cuenta que la parte
(.?*)
de la expresión regular detecta un número arbitrario de caracteres (
*
) entre los dos patrones delimitadores
'''
. El cuantificador
?
hace que no se detecte la mayor cantidad posible de caracteres, de forma que para una cadena como
'''aaa''' bbb '''ccc'''
, la primera cadena detectada será
'''aaa'''
y no la cadena completa (que empieza y termina con el patrón
'''
).
Los paréntesis de la expresión regular definen un grupo de captura y el método
replace()
hace referencia a este grupo mediante el código
$1
en la cadena de sustitución. El indicador
g
(
global
) de la expresión regular garantiza que el método
replace()
sustituye todas las coincidencias de la cadena (no solo la primera).
El método
parseItalic()
funciona de forma similar al método
parseBold()
, con la diferencia de que busca dos apóstrofes (
''
), no tres, como delimitador del texto en cursiva:
private function parseItalic(input:String):String
{
var pattern:RegExp = /''(.*?)''/g;
return input.replace(pattern, "<i>$1</i>");
}
Conversión de patrones de viñetas
Como se indica en el siguiente ejemplo, el método
parseBullet()
busca el patrón de línea de viñeta del Wiki (como
* foo
) y la transforma en su equivalente HTML (como
<li>foo</li>
):
private function parseBullets(input:String):String
{
var pattern:RegExp = /^\*(.*)/gm;
return input.replace(pattern, "<li>$1</li>");
}
El símbolo
^
al principio de la expresión regular detecta el principio de una línea. El indicador
m
(
multiline
) de la expresión regular hace que la expresión regular detecte el símbolo
^
en cada principio de línea, no solo al principio de la cadena.
El patrón
\*
detecta un asterisco (se utiliza la barra diagonal inversa para indicar un asterisco literal en lugar del cuantificador
*
).
Los paréntesis de la expresión regular definen un grupo de captura y el método
replace()
hace referencia a este grupo mediante el código
$1
en la cadena de sustitución. El indicador
g
(
global
) de la expresión regular garantiza que el método
replace()
sustituye todas las coincidencias de la cadena (no solo la primera).
Conversión de patrones de párrafo de Wiki
El método
linesToParagraphs()
convierte cada línea de la cadena de entrada de Wiki en una etiqueta de párrafo HTML,
<p>
. Estas líneas del método eliminan las líneas vacías de la cadena de Wiki de entrada:
var pattern:RegExp = /^$/gm;
var result:String = input.replace(pattern, "");
Los símbolos
^
y
$
hacen que la expresión regular detecte el principio y el final de una línea. El indicador
m
(
multiline
) de la expresión regular hace que la expresión regular detecte el símbolo ^ en cada principio de línea, no solo al principio de la cadena.
El método
replace()
sustituye todas las subcadenas coincidentes (líneas vacías) con una cadena vacía (
""
). El indicador
g
(
global
) de la expresión regular garantiza que el método
replace()
sustituye todas las coincidencias de la cadena (no solo la primera).