模板引擎開發(fā)(二)-值標(biāo)簽的處理
前面發(fā)了一篇,看到一些朋友評論,我說明一下。
我這個模板引擎不是為了MVC使用的,而是純粹是為了供網(wǎng)頁制作人員使用,通過一些簡單的標(biāo)簽,能將網(wǎng)站后臺填寫的內(nèi)容在前臺展示出來,生成靜態(tài)化的網(wǎng)頁,類似于織夢CMS的思路。
我之前也研究了一下NVelocity,它的確比我寫的強(qiáng)大,我當(dāng)初研究它只是研究它是以什么算法處理文檔的,為什么這么快,不過沒有研究出個明堂,呵呵。我這個處理引擎現(xiàn)在的執(zhí)行速度只能算一般般,全站靜態(tài)化生成的單線程處理需要二十幾秒。當(dāng)然也有數(shù)據(jù)庫的原因,我測試時使用的是Access數(shù)據(jù)庫。后續(xù)還要重構(gòu)和優(yōu)化代碼,想辦法提升執(zhí)行速度。
本文主要描述值標(biāo)簽的處理。
值標(biāo)簽分為“全局值標(biāo)簽”與“局部值標(biāo)簽”兩類,全局值標(biāo)簽顧名思義就是在整網(wǎng)站模板中,都起作用;局部值標(biāo)簽只在特定的頁面起作用。這兩類的標(biāo)簽樣式都是一樣的。
例如:
{%=orgSiteName%}企業(yè)網(wǎng)站的名稱,這是一個全局值標(biāo)簽
{%=pdname%}當(dāng)前產(chǎn)品的名稱,這是一個局部值標(biāo)簽
值標(biāo)簽可以帶格式化,例如:
{%=pdPushTime:yyyy年M月d日%}當(dāng)前產(chǎn)品的發(fā)布時間,輸出格式為年月日
值標(biāo)簽的處理很簡單,首先是檢索{%=%}字符。我用了正則表達(dá)式
string patt = @"{%=\s*(\S[^\s%]+)\s*%}";
Regex rex = new Regex(patt, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline);
MatchCollection mc = rex.Matches(context);
上述代碼可以看出,值標(biāo)簽書寫時允許帶有空格、大小寫不敏感。
變量mc即匹配出的對象。我們接著循環(huán)處理mc即可。如下:
for (int i = 0; i < mc.Count; i++)
{
Match ma = mc[i];
//值標(biāo)簽{%=tag%}中的tag
string key = ma.Groups[1].Value.Trim();
//是否有格式符
bool isFormat = key.IndexOf(":") > -1;
string format = isFormat ? key.Substring(key.IndexOf(":") + 1) : "";
key = isFormat ? key.Substring(0, key.IndexOf(":")) : key;
if (!isFormat)……//如果沒有格式符
if (isFormat) ……//如果有格式符
}
上述代碼中,我們?nèi)〉搅酥禈?biāo)簽中的具體標(biāo)簽與其格式符,當(dāng)然格式符可以為空(如{%=orgsitename%} 沒有格式符)。
取到這兩個值后,可以格式化了
/// <summary>
/// 將變量格式化,格式化遵循C#格式規(guī)則
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static string _format(object obj,string format)
{
string val = "";
if (obj is DateTime) val = ((DateTime)obj).ToString(format);
if (obj is int) val = ((int)obj).ToString(format);
if (obj is long) val = ((long)obj).ToString(format);
return val;
}
最后把處理后的實際值把標(biāo)簽替換掉就可以了。
在值標(biāo)簽的處理過程中,主要是正則表達(dá)式。
浙公網(wǎng)安備 33010602011771號