Klasa WikiParser zawiera metody, które konwertują wejściowy tekst Wiki na odpowiednie wyjściowe dane HTML. Nie jest to zbyt stabilna aplikacja konwersji Wiki, ale ilustruje kilka dobrych zastosowań wyrażeń regularnych do dopasowywania wzorców i konwersji ciągów znaków.
Funkcja konstruktora razem z metodą
setWikiData()
inicjuje przykładowy ciąg znaków wejściowego tekstu Wiki, co ilustruje poniższy przykład:
public function WikiParser()
{
wikiData = setWikiData();
}
Gdy użytkownik kliknie przycisk Test w przykładowej aplikacji, aplikacja wywołuje metodę
parseWikiString()
obiektu WikiParser. Metoda wywołuje kilka innych metod, które w odpowiedzi gromadzą wynikowy ciąg znaków HTML.
public function parseWikiString(wikiString:String):String
{
var result:String = parseBold(wikiString);
result = parseItalic(result);
result = linesToParagraphs(result);
result = parseBullets(result);
return result;
}
Każda z wywołanych metod —
parseBold()
,
parseItalic()
,
linesToParagraphs()
i
parseBullets()
— używa metody
replace()
ciągu znaków w celu zasępienia dopasowanych wzorców, zdefiniowanych przez wyrażenie regularne, aby dokonać transformacji wejściowego tekstu Wiki na tekst w formacie HTML.
Konwertowanie wzorców pogrubionych i kursywy
Metoda
parseBold()
wyszukuje pogrubiony wzorzec tekstu Wiki (np.
'''foo'''
) i przekształca go na jego odpowiedni tekst w formacie HTML (np.
<b>foo</b>
), co ilustruje poniższy przykład:
private function parseBold(input:String):String
{
var pattern:RegExp = /'''(.*?)'''/g;
return input.replace(pattern, "<b>$1</b>");
}
Należy zauważyć, że fragment
(.?*)
wyrażenia regularnego dopasowuje dowolną ilość znaków (
*
) między dwoma definiującymi wzorcami
'''
. Kwantyfikator
?
zmienia dopasowanie na nongreedy, dlatego dla przykładowego ciągu znaków
'''aaa''' bbb '''ccc'''
, pierwszym dopasowanym ciągiem będzie
'''aaa'''
, a nie cały ciąg (który rozpoczyna się i kończy wzorcem
'''
).
Nawiasy okrągłe w wyrażeniu regularnym definiują grupę przechwyconą, a metoda
replace()
odwołuje się do tej grupy za pomocą kodu
$1
w ciągu zastępowania. Flaga
g
(
global
) w wyrażeniu regularnym zapewnia, że metoda
replace()
zastąpi wszystkie dopasowania w ciągu znaków (nie tylko pierwsze).
Metoda
parseItalic()
działa podobnie do metody
parseBold()
poza tym, że sprawdza dwa apostrofy (
''
) tak, jak separator dla kursywy (nie trzy):
private function parseItalic(input:String):String
{
var pattern:RegExp = /''(.*?)''/g;
return input.replace(pattern, "<i>$1</i>");
}
Konwertowanie wzorców punktów
Tak jak ilustruje poniższy przykład metoda
parseBullet()
wyszukuje wzorca wiersza punktu Wiki (np.
* foo
) i przekształca go na odpowiedni tekst w formacie HTML (np.
<li>foo</li>
):
private function parseBullets(input:String):String
{
var pattern:RegExp = /^\*(.*)/gm;
return input.replace(pattern, "<li>$1</li>");
}
Symbol
^
na początku wyrażenia regularnego dopasowuje początek wiersza. Flaga
m
(
multiline
) w wyrażeniu regularnym powoduje, że wyrażenie regularne dopasuje symbol
^
do początku wiersza, a nie do początku ciągu znaków.
Wzorzec
\*
dopasowuje znak gwiazdki (odwrócony ukośnik używany jest do sygnalizowania literalnej gwiazdki zamiast kwantyfikatora
*
).
Nawiasy okrągłe w wyrażeniu regularnym definiują grupę przechwyconą, a metoda
replace()
odwołuje się do tej grupy za pomocą kodu
$1
w ciągu zastępowania. Flaga
g
(
global
) w wyrażeniu regularnym zapewnia, że metoda
replace()
zastąpi wszystkie dopasowania w ciągu znaków (nie tylko pierwszy).
Konwertowanie wzorców akapitów Wiki
Metoda
linesToParagraphs()
konwertuje każdy wiersz w wejściowym ciągu znaków Wiki na znacznik akapitu HTML
<p>
. Te wiersze metody usuwają puste wiersze z wejściowego ciągu znaków Wiki:
var pattern:RegExp = /^$/gm;
var result:String = input.replace(pattern, "");
Symbole
^
i
$
wyrażenia regularnego dopasowują początek i koniec wiersza. Flaga
m
(
multiline
) w wyrażeniu regularnym powoduje, że wyrażenie regularne dopasuje symbol ^ do początku wiersza, a nie do początku ciągu znaków.
Metoda
replace()
zastępuje wszystkie dopasowane podciągi (puste wiersze) pustym ciągiem znaków (
""
). Flaga
g
(
global
) w wyrażeniu regularnym zapewnia, że metoda
replace()
zastąpi wszystkie dopasowania w ciągu znaków (nie tylko pierwsze).