一个用于动态生成静态页面的类——TextTemplate

动态生成静态页面有许多好处,比如生成html网页有利于被搜索引擎收录。同时,由于减少了数据访问,减轻对数据库访问的压力,提高了网页打开速度。于是自己编写了一个用于动态生成静态页面的类——TextTemplate(名称似乎和静态页面没有关系,这是因为它还有其他功能,这些功能将在下文提及)

 

笔者之前发布的.net文档生成工具中的页面和编译CHM所需的工程文件(HHP)和内容文件(HHC)都是用这个类生成的。

 

基本思路:

 

使用一个字符串作为页面模板,再页面中包含用若干标志(用 {标志名} 表示),生成页面时,将标志替换为对应的值。

 

实现方法:

 

在初始化TextTemplate实例时读入模板,以标志为分割点将模板分割成几部分,生成页面时只需简单的将模板内容和标志的值连接起来。例如:

假如有一个模板 ABCD{TAG1}EFG{TAG2}HIJ{TAG3}KMUN

初始化时将模板分割成 "ABCD","EFG","HIJ","KMUN"四个字符串,

假设TAG1=“123”,TAG2=“456”,TAG3=“789”

则生成是相当于执行"ABCD"+"123"+"EFG"+"456"+"HIJ"+"789"+"KMUN"

 

代码:

 

完整代码下载

 


  1using System;
  2using System.Collections.Generic;
  3using System.Text;
  4using System.Text.RegularExpressions;
  5using System.Collections;
  6using System.IO;
  7
  8
  9/// <summary>
 10/// 表示一个文本模板,该类使用一个字符串作为模板,通过将模板中的标志替换为对应的值(模板中的标志用 {标志名} 表示)生成新的文本
 11/// </summary>

 12public class TextTemplate
 13{
 14    TextTemplateTag[] _tags;
 15    String[] _contentParts;
 16    int _tagCount;
 17
 18    private TextTemplate()
 19    {
 20        _tagCount = 0;
 21        _tags = null;
 22        _contentParts = null;
 23    }

 24
 25    /// <summary>
 26    /// 用指定的模板初始化TextTemplate
 27    /// </summary>
 28    /// <param name="content">模板内容</param>

 29    public TextTemplate(String content);
 30
 31    /// <summary>
 32    /// 用指定的模板初始化TextTemplate,模板内容重文件读入
 33    /// </summary>
 34    /// <param name="file">模板文件位置</param>
 35    /// <param name="encoding">文件使用的编码</param>

 36    public TextTemplate(string file, Encoding encoding);
 37
 38    /// <summary>
 39    /// 读入模板并以标志为分割点分割模板
 40    /// </summary>
 41    /// <param name="content"></param>

 42    private void FromString(String content);
 43
 44    /// <summary>
 45    /// 用指定的值生成文本
 46    /// </summary>
 47    /// <param name="values">各标志对应的值(用标志名作为key)</param>
 48    /// <returns>生成的文本</returns>

 49    public string Render(Hashtable values);
 50
 51    /// <summary>
 52    /// 用指定的值生成文本
 53    /// </summary>
 54    /// <param name="args">各标志对应的值(忽略标志名,第一个标志对应第一个参数,以此类推)</param>
 55    /// <returns>生成的文本</returns>

 56    public string Render(params object[] args);
 57
 58    /// <summary>
 59    /// 用指定的值生成文本,并保存到文件中
 60    /// </summary>
 61    /// <param name="file">要保存的文件路径</param>
 62    /// <param name="encoding">文件的编码</param>
 63    /// <param name="values">各标志对应的值(用标志名作为key)</param>

 64    public void SaveAs(string file, Encoding encoding, Hashtable values);
 65
 66    /// <summary>
 67    /// 用指定的值生成文本,并保存到文件中
 68    /// </summary>
 69    /// <param name="file">要保存的文件路径</param>
 70    /// <param name="encoding">文件的编码</param>
 71    /// <param name="args">各标志对应的值(忽略标志名,第一个标志对应第一个参数,以此类推)</param>

 72    public void SaveAs(string file, Encoding encoding, params object[] args);
 73
 74    /// <summary>
 75    /// 将模板以指定的分隔标志分隔成小模板
 76    /// </summary>
 77    /// 假如有一个模板 ABCD{TAG1}EFG{TAG2}HIJ{TAG3}KMUN
 78    /// 调用Split("Tag2")后生成两个模板:
 79    /// ABCD{TAG1}EFG
 80    /// HIJ{TAG3}KMUN
 81    /// <param name="splitTag"></param>
 82    /// <returns></returns>

 83    public TextTemplate[] Split(string splitTag);
 84}

 85
 86internal class TextTemplateTag
 87{
 88    int _position, _length;
 89    string _name;
 90
 91    public TextTemplateTag(string name, int pos, int len)
 92    {
 93        _name = name;
 94        _position = pos;
 95        _length = len;
 96    }

 97
 98    public string Name
 99    {
100        get return _name; }
101    }

102
103    public int Position
104    {
105        get return _position; }
106    }

107
108    public int Length
109    {
110        get return _length; }
111    }

112}

 

 

实例代码:

 

 

 


 1static class Program
 2{
 3    [STAThread]
 4    static void Main()
 5    {
 6        TextTemplate temp = new TextTemplate("<img src='{src}' alt='{alt}' />");
 7        Console.WriteLine(temp.Render("pic.bmp","Image"));
 8        Hashtable values = new Hashtable();
 9        values.Add("src""pic.bmp");
10        values.Add("alt""image");
11        Console.WriteLine(temp.Render(values));
12    }

13}

 

输出为:
<img src='pic.bmp' alt='Image' />
<img src='pic.bmp' alt='image' />

 

 

其他应用:

 

TextTemplate还可以用来在安装网站时生成Web.Config文件,只需定义以下模板:

 

Code

 

在设置标志 CONNECTIONSTRING 的值即可,这种方法比用XMLDocument类要方便得多。

 

总结:

 

TextTemplate的优点有:

1、模板只在初始化时就分析并分割存储,当使用同一模板生成多个页面时,只是简单的件模板内容和标志的值连接起来,不需要每次都去分析模板,如果使用string的Replace方法则每一次都要去分析字符串,而且如果标志值中含有标志,会影响生成的页面。

2、模板可以从文件读入,因此模板文件可以使用各种网页制作工具编辑。

 

TextTemplate虽然简单,但是功能很多...

posted @ 2008-09-03 20:22  冰封的心  阅读(269)  评论(0)    收藏  举报