模板引擎開發(三) 自定義標籤的處理

2022-07-04 19:45:09 字數 2708 閱讀 7950

自定義標籤大致可以理解為乙個html**塊,也可以指向乙個html檔案。

在模板頁中,很多地方需要相同的內容,例如頁面的頭部、尾部等,這個時候,可以利用自定義標籤來定義html**,然後在模板頁中引用就可以了。

自定義標籤的格式如下:

頁面頂部的頂部的自定義標籤;

<

tag

uid="5895643"

>

<

name

>pagetop

name

>

<

type

>page

type

>

<

intro

>

所有頁面的頂部

]]>

intro

>

<

page

>pagetop.html

page

>

<

context

>

logo 資訊化動力核心

]]>

context

>

tag>

上述**,標明了自定義標籤的唯一標識、名稱、型別(指定某個頁面)、介紹、html檔名、html**塊;

說到這裡就簡單了,我們只需要把自定義標籤從模板頁中檢索出來,替換成html**就行了。**如下:

///

///將模板內容中的所有自定義標籤,替換為實際的值

/// ///

要處理的模板物件

///public

string

transact(templatebuider.pagetransact.html html)

";regex rex = new

regex(patt, regexoptions.singleline);

matchcollection mc =rex.matches(html.htmlcontext);

for (int i = 0; i < mc.count; i++)

);if (custom == null) continue

;

//轉換自定義標籤中的路徑,使之與當前模板頁為相對路徑

string context =_replacepath(html, custom);

//將自定義標籤合併到的模板

html.htmlcontext = microsoft.visualbasic.strings.replace(html.htmlcontext, ma.value, context, 1, -1

, microsoft.visualbasic.comparemethod.text);

}return

html.htmlcontext;

}

可這個時候,有個問題。各個模板頁並不在乙個資料夾下,路徑各不相同,自定義標籤中的html如果有超連結,在模板頁引用後,如果只是簡單的替換,這些超連結就有可能出錯,找不到指定的內容。所以,我們必須將自定義標籤中的鏈結物件轉換成當前模板的路徑名。

思路是這樣的,首先找出自定義標籤的路徑,如果自定義標籤是指向html檔案的,則按html路徑;如果是純html**,則以當前模板庫的路徑為路徑;自定義標籤中的所有鏈結,包括超連結、css引用、js引用、iframe等,轉換為相對於自定義標籤路徑的路徑;然後找當前模板頁的路徑;將所有的鏈結轉換為當前模板頁的路徑。

這中間牽涉到乙個演算法,從a檔案到b檔案的相對路徑。舉例說:a檔案在/3/4/5/q/w/a.html,b檔案在/3/4/6/s/b.html,如果a檔案中寫乙個超連結引用b檔案,這個超連結怎麼寫?

我這裡寫了乙個方法。計算兩個檔案的相對路徑,**如下:

///

///計算兩個檔案的相對路徑

/// ///

用於參照的檔案,就從當前檔案開始查詢另乙個檔案

///目標檔案,就是求它的相對路徑

///返回targetfile相對於basefile的相對路徑

private

string _getrelativepath(string basefile, string

targetfile)

string path = ""

;

while (basefile.indexof("

/") > -1

)

return path +targetfile;

}

///

///將模板頁中的路徑處理成相對於當前模板頁的路徑

/// ///

//////

private

string

_replacepath(templatebuider.pagetransact.html html, templatemanager.tags.customtag tag)

return

context;

}

在上述**中,根路徑不處理、站外鏈結不處理、以{開頭的鏈結不處理。

總結

我的這個自定義標籤功能並不強,雖然自定義標籤中也可以有其它元件,但其本質未變,只是html**塊的替換。本來想寫帶引數的自定義標籤呢,這樣就更類似於asp.net的使用者控制項,精力有限,暫時先這樣吧。

自定義模板引擎

類檔案my config.class.php class smarty 呼叫模板 public function display temp reg 替換成 arr 模式單元雙引號加 place this arr 1 獲取替換後的 html preg replace reg place str 編譯檔...

自定義模板標籤

原生標籤 django模板標籤 tags 的分類 tag 簡單標籤 處理資料,返回乙個字串或者給context設定或新增變數。inclusion tag 包含標籤 處理資料,返回乙個渲染過的模板。熟悉django的都知道,我們一般在檢視view裡設定context,然後通過它來傳遞資料給模板。乙個c...

VSTO之旅系列 三 自定義Excel UI

本專題概要 引言 在上乙個專題中為大家介紹如何建立excel的解決方案,相信大家通過從上面乙個專題之後了解了excel的物件模型,以及office兩種解決方案的,看完上乙個專題之後,肯定很多朋友想為excel自定義屬於自己的ui介面,例如,有這樣的一些疑問 是否可以使用vsto來自定義選項卡呢?是否...