<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      模板引擎開發(fā)(三)-自定義標(biāo)簽的處理

      自定義標(biāo)簽大致可以理解為一個(gè)HTML代碼塊,也可以指向一個(gè)HTML文件。

      在模板頁中,很多地方需要相同的內(nèi)容,例如頁面的頭部、尾部等,這個(gè)時(shí)候,可以利用自定義標(biāo)簽來定義HTML代碼,然后在模板頁中引用就可以了。

      自定義標(biāo)簽的格式如下:
      {%@ pageTop%} 頁面頂部的頂部的自定義標(biāo)簽;

      自定義標(biāo)簽中的HTML代碼,我用了XML來記錄,當(dāng)然也有可視化的編輯界面來操作,在這里就不再綴述,只是說明一下原理即可,XML如下:

        <Tag Uid="5895643">
            <Name>PageTop</Name>
            <Type>page</Type>
            <Intro><![CDATA[所有頁面的頂部]]></Intro>
            <Page>PageTop.html</Page>
            <Context><![CDATA[<div id="pagetop">logo 信息化動(dòng)力核心 </div>
      <div></div>]]></Context>
          </Tag>

      上述代碼,標(biāo)明了自定義標(biāo)簽的唯一標(biāo)識(shí)、名稱、類型(指定某個(gè)頁面)、介紹、html文件名、html代碼塊;

      說到這里就簡(jiǎn)單了,我們只需要把自定義標(biāo)簽從模板頁中檢索出來,替換成HTML代碼就行了。代碼如下:

      /// <summary>
              /// 將模板內(nèi)容中的所有自定義標(biāo)簽,替換為實(shí)際的值
              /// </summary>
              /// <param name="html">要處理的模板對(duì)象</param>
              /// <returns></returns>
              public string Transact(TemplateBuider.PageTransact.Html html)
              {
                  string patt = @"{%@\s*(\S[^\s%]+)\s*%}";
                  Regex rex = new Regex(patt, RegexOptions.Singleline);
                  MatchCollection mc = rex.Matches(html.HtmlContext);
                  for (int i = 0; i < mc.Count; i++)
                  {
                      Match ma = mc[i];
                      string key = ma.Groups[1].Value;
                      //獲取當(dāng)前標(biāo)簽對(duì)象
                      Song.TemplateManager.Tags.CustomTag custom = _tags.Find(delegate(TemplateManager.Tags.CustomTag p) { return p.Name.ToLower() == key.ToLower(); });
                      if (custom == null) continue;
                      //轉(zhuǎn)換自定義標(biāo)簽中的路徑,使之與當(dāng)前模板頁為相對(duì)路徑
                      string context =_replacePath(html, custom);
                      //將自定義標(biāo)簽合并到的模板
                      html.HtmlContext = Microsoft.VisualBasic.Strings.Replace(html.HtmlContext, ma.Value, context, 1, -1, Microsoft.VisualBasic.CompareMethod.Text);
                  }
                  return html.HtmlContext;
              }

      上述代碼有一些是我系統(tǒng)中相關(guān)方法,大家不必關(guān)注,關(guān)鍵是正則表達(dá)式。

       

      可這個(gè)時(shí)候,有個(gè)問題。各個(gè)模板頁并不在一個(gè)文件夾下,路徑各不相同,自定義標(biāo)簽中的HTML如果有超鏈接,在模板頁引用后,如果只是簡(jiǎn)單的替換,這些超鏈接就有可能出錯(cuò),找不到指定的內(nèi)容。所以,我們必須將自定義標(biāo)簽中的鏈接對(duì)象轉(zhuǎn)換成當(dāng)前模板的路徑名。

      思路是這樣的,首先找出自定義標(biāo)簽的路徑,如果自定義標(biāo)簽是指向HTML文件的,則按Html路徑;如果是純HTML代碼,則以當(dāng)前模板庫的路徑為路徑;自定義標(biāo)簽中的所有鏈接,包括超鏈接、CSS引用、Js引用、iframe等,轉(zhuǎn)換為相對(duì)于自定義標(biāo)簽路徑的路徑;然后找當(dāng)前模板頁的路徑;將所有的鏈接轉(zhuǎn)換為當(dāng)前模板頁的路徑。

      這中間牽涉到一個(gè)算法,從A文件到B文件的相對(duì)路徑。舉例說:A文件在/3/4/5/q/w/a.html,B文件在/3/4/6/s/b.html,如果A文件中寫一個(gè)超鏈接引用B文件,這個(gè)超鏈接怎么寫?
      我這里寫了一個(gè)方法。計(jì)算兩個(gè)文件的相對(duì)路徑,代碼如下:

             /// <summary>
              /// 計(jì)算兩個(gè)文件的相對(duì)路徑
              /// </summary>
              /// <param name="baseFile">用于參照的文件,就從當(dāng)前文件開始查找另一個(gè)文件</param>
              /// <param name="targetFile">目標(biāo)文件,就是求它的相對(duì)路徑</param>
              /// <returns>返回targetFile相對(duì)于baseFile的相對(duì)路徑</returns>
              private string _getRelativePath(string baseFile, string targetFile)
              {
                  baseFile = baseFile.Replace("\\", "/");
                  baseFile = baseFile.ToLower();
                  targetFile = targetFile.ToLower();
                  //
                  while (baseFile.IndexOf("/") > -1 && targetFile.IndexOf("/") > -1)
                  {
                      string b = baseFile.Substring(0, baseFile.IndexOf("/"));
                      string t = targetFile.Substring(0, targetFile.IndexOf("/"));
                      if (b != t) break;                
                      baseFile = baseFile.Substring(baseFile.IndexOf("/") + 1);
                      targetFile = targetFile.Substring(targetFile.IndexOf("/") + 1);               
                  }
                  string path = "";
                  while (baseFile.IndexOf("/") > -1)
                  {
                      baseFile = baseFile.Substring(baseFile.IndexOf("/") + 1);
                      path += "../";
                  }
                  return path + targetFile;
              }

      有了上面的方法,就好處理了,真正的超鏈接轉(zhuǎn)換,就是正則匹配處理了。方法如下:

              /// <summary>
              /// 將模板頁中的路徑處理成相對(duì)于當(dāng)前模板頁的路徑
              /// </summary>
              /// <param name="html"></param>
              /// <param name="tag"></param>
              /// <returns></returns>
              private string _replacePath(TemplateBuider.PageTransact.Html html, TemplateManager.Tags.CustomTag tag)
              {
                  string context = tag.Context;
                  //處理自定義標(biāo)簽中的超鏈接,使其相對(duì)于當(dāng)前文件路徑            
                  string cutomPath = _cutomPath(tag);
                  //將超鏈接處理為相對(duì)于模板頁的路徑
                  string linkExpr = @"(?<=\s+)(?<key>href|src|action|background[^=""']*)=([""'])?(?<value>[^'"">]*)\1?";
                  Regex regex = new Regex(linkExpr, RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);
                  MatchCollection mc = regex.Matches(tag.Context);
                  foreach (Match m in mc)
                  {
                      string link = m.Groups["value"].Value.Trim();
                      if (link == "") continue;
                      //外網(wǎng)鏈接不處理,如Http://開頭的超鏈接
                      if (new Regex(@"[a-zA-z]+://[^\s]*", RegexOptions.Singleline).IsMatch(link))
                          continue;
                      //根路徑不處理,如/manage/index.aspx,第一個(gè)字符是/
                      if (new Regex(@"^\/\w+.").IsMatch(link))
                          continue;
                      //如果是參數(shù)標(biāo)簽,則不處理
                      if (new Regex(@"^{.+").IsMatch(link))
                          continue;
                      //將超鏈接轉(zhuǎn)換為相對(duì)于靜態(tài)化目錄的路徑
                      link = _getCutomLinkPath(cutomPath, link);
                      //將超鏈接轉(zhuǎn)換為基于當(dāng)前模板頁的相對(duì)路徑
                      link = _getRelativePath(html.TagetFile, link);
                      link = m.Groups[2].Value + "=\"" + link + "\"";
                      context = context.Replace(m.Value, link);
                  }
                  return context;
              }        

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

      總結(jié)

      我的這個(gè)自定義標(biāo)簽功能并不強(qiáng),雖然自定義標(biāo)簽中也可以有其它組件,但其本質(zhì)未變,只是HTML代碼塊的替換。本來想寫帶參數(shù)的自定義標(biāo)簽?zāi)兀@樣就更類似于asp.net的用戶控件,精力有限,暫時(shí)先這樣吧。

      posted @ 2013-06-26 22:08  songsoft  閱讀(4016)  評(píng)論(2)    收藏  舉報(bào)
      主站蜘蛛池模板: aaa少妇高潮大片免费看| 精品久久人人做爽综合| 欧美丰满熟妇hdxx| 久久av中文字幕资源网| 色一情一乱一区二区三区码| 亚洲性日韩精品一区二区| 四虎国产精品永久在线看| 国产亚洲久久久久久久| 日本一道本高清一区二区| 激情内射亚洲一区二区三区| 国产激情一区二区三区四区| 在线播放国产精品一品道| 国产亚洲av夜间福利香蕉149| 在线一区二区中文字幕| 中文字幕 日韩 人妻 无码| 亚洲高清WWW色好看美女| 肉色丝袜足j视频国产| 国产成人精品无人区一区| 91中文字幕在线一区| 国产成人无码一二三区视频| 天堂网亚洲综合在线| 深夜福利国产精品中文字幕| 亚洲精品天堂成人片AV在线播放 | 蜜臀av日韩精品一区二区| 国产不卡一区不卡二区| 无码高潮爽到爆的喷水视频| 91孕妇精品一区二区三区| 亚洲国产青草衣衣一二三区| 久久精品国产99久久6| 亚洲成人av在线系列| 欧美videos粗暴| 五月天天天综合精品无码| 亚洲精品欧美综合二区| 少妇人妻偷人精品无码视频新浪| 免费又大粗又爽又黄少妇毛片 | 开心婷婷五月激情综合社区 | 亚洲三级香港三级久久 | 国产伦一区二区三区视频| 日韩人妻无码精品久久| 国产欧美一区二区精品仙草咪| 在线精品自拍亚洲第一区|