一个用于动态生成静态页面的类——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"
代码:
1
using System;2
using System.Collections.Generic;3
using System.Text;4
using System.Text.RegularExpressions;5
using System.Collections;6
using System.IO;7

8

9
/// <summary>10
/// 表示一个文本模板,该类使用一个字符串作为模板,通过将模板中的标志替换为对应的值(模板中的标志用 {标志名} 表示)生成新的文本11
/// </summary>12
public class TextTemplate13
{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
/// 用指定的模板初始化TextTemplate27
/// </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}KMUN78
/// 调用Split("Tag2")后生成两个模板:79
/// ABCD{TAG1}EFG80
/// HIJ{TAG3}KMUN81
/// <param name="splitTag"></param>82
/// <returns></returns>83
public TextTemplate[] Split(string splitTag);84
}85

86
internal class TextTemplateTag87
{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 Name99
{100
get { return _name; }101
}102

103
public int Position104
{105
get { return _position; }106
}107

108
public int Length109
{110
get { return _length; }111
}112
}
实例代码:
1
static class Program2
{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文件,只需定义以下模板:
在设置标志 CONNECTIONSTRING 的值即可,这种方法比用XMLDocument类要方便得多。
总结:
TextTemplate的优点有:
1、模板只在初始化时就分析并分割存储,当使用同一模板生成多个页面时,只是简单的件模板内容和标志的值连接起来,不需要每次都去分析模板,如果使用string的Replace方法则每一次都要去分析字符串,而且如果标志值中含有标志,会影响生成的页面。
2、模板可以从文件读入,因此模板文件可以使用各种网页制作工具编辑。
TextTemplate虽然简单,但是功能很多...



浙公网安备 33010602011771号