我自己寫了一套建站系統,關於為什么我要自己寫一套建站系統,而不是用網上開源的(將來我的也會開源),個中原由很多人都問過我,當然是有原因的,回頭再作解釋。今天就說說建站系統中的模板引擎的開發。
建站系統是基於.net的,為了方便使用,我也編寫了模版處理的功能,當然也需要通過一些標簽化語言將模板生成靜態網頁。我采用了類似於織夢的語言標簽,當然也有自己的特色,真正實現功能時,與織夢已經有了很大差別。我大致把實現的思路給大家講解一下,今天寫頭一篇,先介紹一下我的模板標簽,后續逐步講解如何實現其功能的。
標簽分為三大類:值標簽、組件標簽、自定義標簽
一、 值標簽
沒有任何屬性,可以出現在HTML的任何位置,類似於.net中的public值輸出。
例如:
{%=SiteName%} 輸出網站名稱
值標簽分為全局值標簽與局部值標簽,二者使用方法相同。
1. 全局值標簽
全局值標簽,指在網站所有頁面都可以引用的值。
如上例中的網站名稱{%=SiteName%}
2. 局部值標簽
局部值標簽,指出現某特定環境下的引用值;如新聞欄目的頁面,系統已知當前頁面是某個新聞的欄目,可直接引用{%=NewsColumnName%},顯示當前欄目的名稱。支持格式化化。
例如:
{%=NaTitle%}輸出新聞文章的標題
{%=NaCrtTime:yyyy年M月d日%}輸出新聞文章的創建時間,並格式化為年月日
一、 組件標簽
組件標簽主要用在頁面body主體之內,表現較為復雜的內容。可以帶有屬性。類似於.net中的組件。本來打算是<尖括號的,為了保持與html標簽的一致,后來考慮到檢索的效率問題,采用了中括號。
如新聞列表,
[ list:NewsArticle count="10" sort="1" class="news" title="新聞列表" ]
<a href="news_{%#newsId%}.html">{%#newsTitle%}</a>
[/ list:NewsArticle ]
實際生成的HTML代碼如下
<dl count="10" sort="1" class="news">
<dt>新聞列表</dt>
<dd><a href="news_1.html">北方沙塵天氣將持續</a></dd>
……
</dl>
上述標簽中,屬性為選填項;
組件按具體使用況,分為以下幾類:
1. 列表標簽
如:
List:NewsArticle,循環顯示文章列表,並生成dl、dd的HTML標簽,支持分頁
可以設置屬性,顯示多少條信息,哪個欄目下的文章等;
組件標簽內的html代碼將會被循環輸出。
2. 循環標簽
循環標簽與List功能相近,但不支持分頁
repeat:NewsArticle,循環顯示文章列表,純輸出,不生成多余HTML標簽
3. 單項信息標簽
內容標簽,如下例,輸出id為2的新聞文章
[Details:NewsArticle id=”2”]
……
[/ Details:NewsArticle];
組件標簽內的Html代碼會同步輸出,由於不是列表組件,不會循環輸出。
4. 標簽的簡寫
標簽前綴支持簡寫
List簡寫l、li
Repeat簡寫r、rp
Details簡寫d、de
標簽后綴同樣支持簡單,例如newsArticle,可以簡寫為na;
具體查看模板系統配置文件Template.config
二、 值綁定標簽
用於在組件標簽中顯示當前記錄的相關屬性
如前面實例如中的{%#newsTitle%}。支持格式化
如:{%#crtTime:yyyy年M月d日%}輸出 2013年3月1日
如:{%#index:00%}輸出01
類似於.net中的<%# Eval("crtTime","{0:yyyy年M月d日}")%>
三、 自定義標簽
主要用於展現一些通用內容,如頁面頂部與底部。類似於.net的組件引用。
如展示頁面頂部
{%@PageTop%}
自定義標簽中的超鏈接、圖片鏈接等所有的鏈接地址,會根據自定義標簽當前所有的頁面路徑自動轉換。