WikiParser 類別所包含的方法,可以將 Wiki 輸入文字轉換為對等的 HTML 輸出。這並不是非常完備的 Wiki 轉換應用程式,但是卻示範出規則運算式在模式比對與字串轉換上,一些不錯的使用方式。
建構函數以及
setWikiData()
方法只會初始化 Wiki 輸入文字的樣本字串,如下所示:
public function WikiParser()
{
wikiData = setWikiData();
}
當使用者按下樣本應用程式的「測試」按鈕時,應用程式就會叫用 WikiParser 物件的
parseWikiString()
方法。這個方法會呼叫其它幾個方法,而這幾個方法則進而組合所產生的 HTML 字串。
public function parseWikiString(wikiString:String):String
{
var result:String = parseBold(wikiString);
result = parseItalic(result);
result = linesToParagraphs(result);
result = parseBullets(result);
return result;
}
所呼叫的每個方法—
parseBold()
、
parseItalic()
、
linesToParagraphs()
和
parseBullets()
—都使用字串的
replace()
方法取代由規則運算式所定義的比對模式,以便將輸入 Wiki 文字轉換成 HTML 格式的文字。
轉換粗體和斜體模式
parseBold()
方法會尋找 Wiki 粗體文字模式 (例如
'''foo'''
),並將其轉換為 HTML 的對等模式 (如
<b>foo</b>
),如下所示:
private function parseBold(input:String):String
{
var pattern:RegExp = /'''(.*?)'''/g;
return input.replace(pattern, "<b>$1</b>");
}
請注意,規則運算式的
(.?*)
部分會比對兩個定義
'''
模式之間,任何數目的字元 (
*
)。此
?
數量詞讓比對變成非貪婪,因此對於
'''aaa''' bbb '''ccc'''
這樣的字串而言,第一個相符的字串會是
'''aaa'''
,而非整個字串 (以
'''
模式開始和結束)。
規則運算式中的括號定義擷取群組,而
replace()
方法則在取代字串中使用
$1
程式碼,以參考這個群組。規則運算式中的
g
(
global
) 旗標會確保
replace()
方法取代字串中所有相符項目 (不只是第一個)。
parseItalic()
方法運作方式與
parseBold()
方法類似,只不過它會查找兩個 (而不是三個) 所有格符號 (
''
) 做為斜體文字分隔符號:
private function parseItalic(input:String):String
{
var pattern:RegExp = /''(.*?)''/g;
return input.replace(pattern, "<i>$1</i>");
}
轉換項目符號模式
如下列範例所示,
parseBullet()
方法會尋找 Wiki 項目符號行模式 (如
* foo
),並將其轉換為 HTML 對等模式 (如
<li>foo</li>
):
private function parseBullets(input:String):String
{
var pattern:RegExp = /^\*(.*)/gm;
return input.replace(pattern, "<li>$1</li>");
}
位於規則運算式開頭的
^
符號與行開頭相符。規則運算式中的
m
(
multiline
) 旗標會造成規則運算式比對
^
行開頭,而不僅是字串開頭。
\*
模式會比對星號字元 (用反斜線來表示常值星號,而非
*
數量詞)。
規則運算式中的括號定義擷取群組,而
replace()
方法則在取代字串中使用
$1
程式碼,以參考這個群組。規則運算式中的
g
(
global
) 旗標會確保
replace()
方法取代字串中所有相符項目 (不只是第一個)。
轉換段落 Wiki 模式
linesToParagraphs()
方法會將輸入 Wiki 字串中的每一行,轉換為 HTML
<p>
段落標籤。方法中的這幾行會去除輸入 Wiki 字串的空行:
var pattern:RegExp = /^$/gm;
var result:String = input.replace(pattern, "");
規則運算式的
^
和
$
符號會比對行的開頭和結尾。規則運算式中的
m
(
multiline
) 旗標會造成規則運算式比對 ^ 行開頭,而不僅是字串開頭。
replace()
方法會以空字串 (
""
) 取代所有相符的子字串 (空行)。規則運算式中的
g
(
global
) 旗標會確保
replace()
方法取代字串中所有相符項目 (不只是第一個)。