La classe WikiParser comprende metodi che convertono testo di Wiki nell'output HTML equivalente. Non si tratta di un'applicazione di conversione Wiki particolarmente versatile, ma illustra degnamente alcuni impieghi delle espressioni regolari per la ricerca di modelli e la conversione di stringhe.
La funzione di costruzione, insieme al metodo
setWikiData()
, si limita a inizializzare una stringa campione di testo Wiki nel modo seguente:
public function WikiParser()
{
wikiData = setWikiData();
}
Quando l'utente seleziona il pulsante Test dell'applicazione, l'applicazione chiama il metodo
parseWikiString()
dell'oggetto WikiParser. Questo metodo chiama, a sua volta, altri metodi che si occupano di assemblare la stringa HTML convertita.
public function parseWikiString(wikiString:String):String
{
var result:String = parseBold(wikiString);
result = parseItalic(result);
result = linesToParagraphs(result);
result = parseBullets(result);
return result;
}
Ognuno dei metodi chiamati,
parseBold()
,
parseItalic()
,
linesToParagraphs()
e
parseBullets()
, usa il metodo
replace()
della stringa per sostituire le corrispondenze dei modelli individuate, definite da un'espressione regolare, allo scopo di trasformare il testo Wiki in testo HTML.
Conversione dei modelli in grassetto e corsivo
Il metodo
parseBold()
cerca un modello di testo grassetto Wiki (come
'''foo'''
) e lo converte nell'equivalente HTML (come
<b>foo</b>
) nel modo seguente:
private function parseBold(input:String):String
{
var pattern:RegExp = /'''(.*?)'''/g;
return input.replace(pattern, "<b>$1</b>");
}
Si noti che la porzione
(.?*)
dell'espressione regolare cerca qualsiasi numero di caratteri (
*
) tra i due modelli di definizione
'''
. Il quantificatore
?
rende la corrispondenza “lazy”, vale a dire che la prima corrispondenza trovata per la stringa
'''aaa''' bbb '''ccc'''
sarà
'''aaa'''
e non l'intera stringa (che inizia e finisce con
'''
).
Le parentesi all'interno dell'espressione regolare definiscono un gruppo di cattura e il metodo
replace()
fa riferimento a tale gruppo mediante il codice
$1
della stringa di sostituzione. Il flag
g
(
global
) dell'espressione regolare fa in modo che il metodo
replace()
sostituisca tutte le corrispondenze nella stringa (e non solo la prima).
Il metodo
parseItalic()
opera in modo analogo al metodo
parseBold()
, con l'eccezione che cerca due, e non tre, apostrofi (
''
) come delimitatori del testo in corsivo:
private function parseItalic(input:String):String
{
var pattern:RegExp = /''(.*?)''/g;
return input.replace(pattern, "<i>$1</i>");
}
Conversione di modelli puntati
Come illustra l'esempio seguente, il metodo
parseBullet()
cerca il modello riga puntata Wiki (come
* foo
) e lo converte nel suo equivalente HTML (come
<li>foo</li>
):
private function parseBullets(input:String):String
{
var pattern:RegExp = /^\*(.*)/gm;
return input.replace(pattern, "<li>$1</li>");
}
Il simbolo
^
all'inizio dell'espressione regolare corrisponde alla posizione iniziale di una riga. Il flag
m
(
multiline
) nell'espressione regolare fa in modo che il simbolo
^
corrisponda alla posizione iniziale di una riga, non semplicemente di una stringa.
Il modello
\*
cerca il carattere asterisco (la barra rovesciata segnala l'impiego del valore letterale dell'asterisco e non del suo valore di quantificatore
*
).
Le parentesi all'interno dell'espressione regolare definiscono un gruppo di cattura e il metodo
replace()
fa riferimento a tale gruppo mediante il codice
$1
della stringa di sostituzione. Il flag
g
(
global
) dell'espressione regolare fa in modo che il metodo
replace()
sostituisca tutte le corrispondenze nella stringa (e non solo la prima).
Conversione modelli Wiki di paragrafo
Il metodo
linesToParagraphs()
converte ogni riga della stringa di input Wiki in un tag di paragrafo HTML
<p>
. Queste righe del metodo eliminano le righe vuote dalla stringa di input Wiki:
var pattern:RegExp = /^$/gm;
var result:String = input.replace(pattern, "");
I simboli
^
e
$
dell'espressione regolare corrispondono alla posizione iniziale e finale di una riga. Il flag
m
(
multiline
) nell'espressione regolare fa in modo che il simbolo ^ corrisponda alla posizione iniziale di una riga, non semplicemente di una stringa.
Il metodo
replace()
sostituisce tutte le sottostringhe individuate (righe vuote) con una stringa vuota (
""
). Il flag
g
(
global
) dell'espressione regolare fa in modo che il metodo
replace()
sostituisca tutte le corrispondenze nella stringa (e non solo la prima).