De klasse WikiParser bevat methoden waarmee Wiki-invoertekst wordt omgezet naar gelijkwaardige tekst in HTML-indeling. Dit is geen bijzonder krachtige Wiki-conversietoepassing, maar deze toont wel enkele geschikte toepassingen van reguliere expressies voor patroonovereenkomst en tekenreeksomzetting.
De constructorfunctie initialiseert in combinatie met de methode
setWikiData()
als volgt een voorbeeldtekenreeks van Wiki-invoertekst:
public function WikiParser()
{
wikiData = setWikiData();
}
Wanneer de gebruiker klikt op de knop Test in de voorbeeldtoepassing, roept deze de methode
parseWikiString()
van het WikiParser-object aan. Deze methode roept een aantal andere methoden aan, die omgekeerd de tekenreeks in HTML-indeling samenstellen.
public function parseWikiString(wikiString:String):String
{
var result:String = parseBold(wikiString);
result = parseItalic(result);
result = linesToParagraphs(result);
result = parseBullets(result);
return result;
}
Elk van de aangeroepen methoden,
parseBold()
,
parseItalic()
,
linesToParagraphs()
en
parseBullets()
, maakt gebruik van de methode
replace()
van de tekenreeks. Hiermee kunnen overeenkomende patronen, die gedefinieerd zijn door een reguliere expressie, worden vervangen en Wiki-invoertekst vervolgens worden omgezet in tekst in HTML-indeling.
Vetgedrukte en cursieve patronen omzetten
De methode
parseBold()
zoekt naar een vetgedrukt Wiki-tekstpatroon (zoals
'''foo'''
) en zet dit als volgt om in een gelijkwaardig patroon in HTML-indeling (zoals
<b>foo</b>
):
private function parseBold(input:String):String
{
var pattern:RegExp = /'''(.*?)'''/g;
return input.replace(pattern, "<b>$1</b>");
}
Houd er rekening mee dat het gedeelte
(.?*)
van de reguliere expressie overeenkomt met een willekeurig aantal tekens (
*
) tussen de twee gedefinieerde
'''
patronen. De kwantor
?
maakt de overeenkomst nongreedy, zodat voor een tekenreeks als
'''aaa''' bbb '''ccc'''
de eerste overeenkomende tekenreeks
'''aaa'''
is in plaats van de complete tekenreeks (die begint en eindigt met het patroon
'''
).
De ronde haakjes in de reguliere expressie definiëren een vastgelegde groep, en de methode
replace()
verwijst naar deze groep door gebruik te maken van de code
$1
in de vervangende tekenreeks. De markering
g
(
global
) in de reguliere expressie zorgt ervoor dat de methode
replace()
alle overeenkomsten in de tekenreeks (dus niet alleen de eerste) vervangt.
De methode
parseItalic()
werkt hetzelfde als de methode
parseBold()
, behalve dat deze controleert op twee apostroffen (
''
) als scheidingsteken voor cursief gedrukte tekst (in plaats van drie):
private function parseItalic(input:String):String
{
var pattern:RegExp = /''(.*?)''/g;
return input.replace(pattern, "<i>$1</i>");
}
Bullet-patronen omzetten
Zoals uit het onderstaande voorbeeld blijkt, zoekt de methode
parseBullet()
naar Wiki-regelpatroon met bullets (zoals
* foo
) en zet deze in een vergelijkbaar patroon in HTML-indeling (zoals
<li>foo</li>
):
private function parseBullets(input:String):String
{
var pattern:RegExp = /^\*(.*)/gm;
return input.replace(pattern, "<li>$1</li>");
}
Het symbool
^
aan het begin van de reguliere expressie komt overeen met het begin van een regel. De markering
m
(
multiline
) in de reguliere expressie zorgt ervoor dat de reguliere expressie overeenkomt met het symbool
^
aan het begin van de regel, in plaats van aan het begin van de tekenreeks.
Het patroon
\*
komt overeen met een asteriskteken (de backslash wordt gebruikt om een letterlijke asterisk aan te geven in plaats van een kwantor
*
).
De ronde haakjes in de reguliere expressie definiëren een vastgelegde groep, en de methode
replace()
verwijst naar deze groep door gebruik te maken van de code
$1
in de vervangende tekenreeks. De markering
g
(
global
) in de reguliere expressie zorgt ervoor dat de methode
replace()
alle overeenkomsten in de tekenreeks (dus niet alleen de eerste) vervangt.
Wiki-patronen voor alinea's converteren
De methode
linesToParagraphs()
converteert elke regel in de ingevoerde Wiki-tekenreeks naar een HTML-tag
<p>
voor alinea's. Deze regels in de methode verwijderen lege regels van de ingevoerde Wiki-tekenreeks:
var pattern:RegExp = /^$/gm;
var result:String = input.replace(pattern, "");
De symbolen
^
en
$
van de reguliere expressie komen overeen met het begin en einde van een regel. De markering
m
(
multiline
) in de reguliere expressie zorgt ervoor dat de reguliere expressie overeenkomt met het ^-symbool aan het begin van de regel, in plaats van het begin van de tekenreeks.
De methode
replace()
vervangt alle overeenkomende subtekenreeksen (lege regels) door een lege tekenreeks (
""
). De markering
g
(
global
) in de reguliere expressie zorgt ervoor dat de methode
replace()
alle overeenkomsten in de tekenreeks (dus niet alleen de eerste) vervangt.