日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

由浅入深:自己动手开发模板引擎——解释型模板引擎(二)

發布時間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 由浅入深:自己动手开发模板引擎——解释型模板引擎(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

受到群里兄弟們的竭力邀請,老陳終于決定來分享一下.NET下的模板引擎開發技術。本系列文章將會帶您由淺入深的全面認識模板引擎的概念、設計、分析和實戰應用,一步一步的帶您開發出完全屬于自己的模板引擎。關于模板引擎的概念,我去年在百度百科上錄入了自己的解釋(請參考:模板引擎)。老陳曾經自己開發了一套網鳥Asp.Net模板引擎,雖然我自己并不樂意去推廣它,但這已經無法阻擋群友的喜愛了!

概述

本課我們主要討論“命令解釋器”的實現。命令就是指令,指令也是構成更加復雜的模板引擎的基本元素之一。至此我們可以歸納出來,模板引擎在工作的過程中,首先將字符流轉換為Token流,然后再將Token流轉換為Element集合(也算是流),然后將特定的Element單獨拿出來或組合在一起形成指令、語句等。寫一個模板引擎,和寫一個小型的編譯器幾乎相當,因此我們需要耐心、細心!

目標

解析并運行如下模板代碼結構:

  • /_Page_Footer.shtml
  • /_Page_Header.shtml
  • /_Public_Footer.shtml
  • /_Public_Header.shtml
  • /Index.shtml
  • 文件"/_Page_Footer.shtml"包含的代碼:

    <!--#include file="_Public_Footer.shtml" -->

    文件"/_Page_Header.shtml"包含的代碼:

    <!--#include file="_Public_Header.shtml" -->

    文件"/_Public_Footer.shtml"包含的代碼:

    </body>
    </html>

    文件"/_Public_Header.shtml"包含的代碼:

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>{UserName}的博客</title>
    </head>
    <body>

    文件"/Index.shtml"包含的代碼:

    1 <!--#include file="_Page_Header.shtml" -->
    2 <ul>
    3 <li>博主姓名:{UserName}</li>
    4 <li>創建日期:{CreationTime:yyyy年MM月dd日 HH:mm:ss}</li>
    5 <li>粉絲數量:{FunsCount:D4}</li>
    6 </ul>
    7 <!--#include file="_Page_Footer.shtml" -->

    今天的模板內容被切分成了5個部分,嵌套層次達到了3層,解析難度比較大。實際上在編寫本文之前,我自己的解釋型模板引擎在內部是使用正則表達式的方式來實現嵌套指令解析的。不過,我們今天不會這么做了!

    使用正則表達式實現

    本節課的目的是說明命令解釋器的實現,本著循序漸進的原則,我們首先考慮使用正則表達式來實現“<!--#include file="_Page_Header.shtml" -->”命令,在以后的課程中我們將會學習更加復雜的代碼解析方法。

    我們需要按照順序使用正則表達式遞歸的讀取和合并代碼文檔,具體實現如下:

    1 /// <summary> 2 /// 表示 #Include 命令解釋器。 3 /// </summary> 4 public static class IncludeCommandParser 5 { 6 private static int _nestedCount; 7 8 /// <summary> 9 /// 處置包含文檔。 10 /// </summary> 11 /// <param name="templateString">包含模板代碼的字符串。</param> 12 /// <param name="basePath">處置包含命令時要使用的基準路徑。</param> 13 /// <returns>返回 <see cref="string"/></returns> 14 public static string Parse(string templateString, string basePath) 15 { 16 if (String.IsNullOrWhiteSpace(templateString)) return String.Empty; 17 if (String.IsNullOrWhiteSpace(basePath)) return templateString; 18 19 if (Directory.Exists(basePath) == false) throw new DirectoryNotFoundException(); 20 21 return _ProcessSSIElement(templateString, basePath); 22 } 23 24 private static string _ProcessSSIElement(string templateString, string basePath) 25 { 26 if (_nestedCount > 10) return templateString; 27 28 var matches = Regex.Matches(templateString, @"<!--#include file=""([^""]+)""\s*-->", RegexOptions.IgnoreCase | RegexOptions.Singleline); 29 30 foreach (Match match in matches) 31 { 32 var file = new FileInfo(Path.Combine(basePath, match.Groups[1].Value.Replace('/', '\\'))); 33 34 if (file.Exists == false) continue; 35 36 var subTemplate = File.ReadAllText(file.FullName).Trim(); 37 38 subTemplate = _ProcessSSIElement(subTemplate, Path.GetDirectoryName(file.FullName)); 39 40 templateString = templateString.Replace(match.Groups[0].Value, subTemplate); 41 } 42 43 _nestedCount++; 44 45 return templateString; 46 } 47 }

    測試代碼:

    1 [Test] 2 public void LoadFileTest() 3 { 4 var fileName = Path.Combine(Environment.CurrentDirectory, "Templates\\Index.shtml"); 5 6 Assert.AreEqual(File.Exists(fileName), true); 7 8 this._templateString = File.ReadAllText(fileName); 9 10 Assert.NotNull(this._templateString); 11 12 Trace.WriteLine(this._templateString); 13 14 Assert.Greater(this._templateString.IndexOf("{CreationTime:yyyy年MM月dd日 HH:mm:ss}", StringComparison.Ordinal), 0); 15 } 16 17 [Test] 18 public void ProcessTest() 19 { 20 this.LoadFileTest(); 21 22 Trace.WriteLine("本次輸出:"); 23 24 var basePath = Path.Combine(Environment.CurrentDirectory, "Templates"); 25 var templateEngine = TemplateEngine.FromString(this._templateString, basePath); 26 27 templateEngine.SetVariable("url", "http://www.ymind.net/"); 28 templateEngine.SetVariable("UserName", "陳彥銘"); 29 templateEngine.SetVariable("title", "陳彥銘的博客"); 30 templateEngine.SetVariable("FunsCount", 98); 31 templateEngine.SetVariable("CreationTime", new DateTime(2012, 4, 3, 16, 30, 24)); 32 33 var html = templateEngine.Process(); 34 Trace.WriteLine(html); 35 }

    運行結果:

    1 <!--#include file="_Page_Header.shtml" --> 2 <ul> 3 <li>博主姓名:{UserName}</li> 4 <li>創建日期:{CreationTime:yyyy年MM月dd日 HH:mm:ss}</li> 5 <li>粉絲數量:{FunsCount:D4}個</li> 6 </ul> 7 <!--#include file="_Page_Footer.shtml" --> 8 9 本次輸出: 10 <!DOCTYPE HTML> 11 <html> 12 <head> 13 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 14 <title>陳彥銘的博客</title> 15 </head> 16 <body> 17 <ul> 18 <li>博主姓名:陳彥銘</li> 19 <li>創建日期:2012年04月03日 16:30:24</li> 20 <li>粉絲數量:0098個</li> 21 </ul> 22 </body> 23 </html>


    運行結果達到了我們的期望值!

    總結和代碼下載

    本課只是簡單的介紹命令解釋器的實現思路,實際上還有其他很多辦法可以實現。

    從下節課開始,我們將會接觸到更多代碼標記的解析方式,每篇博文篇幅不會太長,但一定會挑重點、擊中要害!

    本節課的內容較為簡單,不提供代碼下載。


    模板引擎系列教程的規模比原來預想的還要龐大,因為我不想僅僅帖出各種代碼就了事,希望能從更多的角度給大家分享。因此,該系列文章以后全部劃入周末寫作。平時只寫文字性內容,或小篇幅技術文章。

    希望大家能夠諒解!

    轉載于:https://www.cnblogs.com/ymind/archive/2012/04/15/progressively-develop-templateEngine-yourself-Interpreted-type-2.html

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的由浅入深:自己动手开发模板引擎——解释型模板引擎(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久午夜夜伦鲁鲁片 | 香蕉伊思人视频 | 国产欧美综合视频 | 久久亚洲aⅴ无码精品 | 亚洲色成人一区二区三区小说 | 久草在在线 | 超碰97免费 | 18无套直看片红桃 | 国产二级片 | 永久免费av网站 | 羞羞网站在线观看 | 亚洲第一综合网 | 欧美日韩亚洲一区二区 | 日韩欧美色图 | 91在线免费视频 | 91欧美在线| 91视频久久久久 | 黄色av大片 | 亚洲作爱视频 | 国产xxx69麻豆国语对白 | 福利一区二区视频 | 成人在线观看小视频 | 国产欧美色图 | 国产欧美一区二区精品久久久 | 欧美自拍偷拍一区 | 国产污污网站 | 你懂的在线视频网站 | 欧美成人不卡视频 | 激烈的性高湖波多野结衣 | 国产福利视频在线 | 午夜做爰xxxⅹ性高湖视频美国 | 美女av网站| 中国美女洗澡免费看网站 | 色综合激情网 | 国产欧美久久久精品免费 | 丰满少妇在线观看资源站 | 16一17女人毛片| 在线免费成人 | 久久久一区二区三区 | 一区二区三区精 | 99热网站 | 国产精品成人电影在线观看 | 国产精品扒开腿做爽爽爽视频 | 91porny九色91啦中文 | 夜夜嗨av一区二区三区 | 男女插插插网站 | 无码国产精品一区二区免费16 | www.浪潮av.com | 亚洲成人基地 | 性欧美free| 欧美天堂一区 | 亚洲女人在线 | 九月激情网 | 国产精品午夜在线观看 | www.日日夜夜 | 九一在线观看免费高清视频 | 精品国产伦一区二区三 | a天堂中文在线观看 | 日韩毛片视频 | 玖玖免费 | 精品三级在线观看 | 91瑟瑟| 九九综合久久 | 国产成人午夜 | 日美韩一区二区三区 | 午夜黄网| 欧美xxxxx少妇 | 自拍愉拍 | www.777奇米影视 | 99视频网| 国产aa视频 | 久久精品免费播放 | 痴汉电车在线观看 | 91亚洲视频 | 亚洲喷水 | 亚洲免费黄色网 | 奇米影视亚洲春色 | 午夜不卡影院 | 在线观看你懂的网址 | 大胸美女啪啪 | 国产精品 色 | 男生和女生操操 | 色婷婷激情综合 | 天天弄天天操 | 91麻豆精品国产91久久久更新时间 | 91丝袜国产在线播放 | 欧美国产精品一区二区三区 | 日韩在线精品 | 日韩 欧美 国产 综合 | 久久永久视频 | 狠狠爱综合网 | 亚洲福利天堂 | 免费三级在线 | 中文字幕国产专区 | 国产成人综合亚洲 | 久久69| 国产精品无码久久久久成人app | 国产精品久久久久久69 | 国产东北女人做受av |