曾经思考过很多种方案,但是一一否决了。一种方案是使用XML方案,从CSDN剽窃过来的思路,用XML文件保存数据,然后定义一个XSL,在客户端解析。这种方案最大的缺点是无法处理复杂的页面布局。设想一个很复杂的页面,你很难定义出合适的XSL,而且在客户端的开销也可能不被接受。另一种是使用JavaScript,将数据作为JS文件存储,但是并不是所有的客户端都支持JavaScript,而且我认为这种结构不好,也不容易管理。最后一种方式是使用模板。很多人在模板中定义特殊的字符串,然后一点点的进行替换,效率低,容易错,很难支持页面版面和内容的变更。
综合思考了这些问题,我还是使用了定义模板的方式,但是和前面所说的模板方式不同。我期望能实现一些自定义的数据控件,使用在模板中。在生成静态页面的过程中,首先解析原始的模板文件,自动将控件识别出来,然后使用自定义的数据结构对这些数据控件进行自动绑定。很多高手一看就明白,这种方式和Asp.Net的方式有几分相似。其实我的灵感就来自它,当然以我的水平,达不到它的境界。采用这种方式,你可以在一定范围内自由改变设计而不需改变程序。即使对版式的改变很大,如果数据没有变动或变动很小,程序则不需变化或只需很小的变化。
毕竟我经验尚浅,必有很多不合适的地方,希望大家能提出静态网页生成的更好思路,也欢迎大家批评指正。
说了半天废话,现在言归正传,我们来考虑怎么实现这个想法。如上所述,我把整个过程分为两个步骤:先解析模板,然后数据绑定。现阶段,我只实现了模板解析。在这里先提出自定义数据控件的设计,我使用了html的格式:<flag name=value>body</flag>。 这样,我就可以使用和解析html语言一致的方式解析自定义控件了。
在实际实现之前,我翻看了编译原理方面的书籍,大略看了一下其中的词法分析。这玩意真的挺复杂,没看懂。不过不管怎么样,还是有收获的,特别是那个有限自动机所谓的状态转换启发了我。先不考虑特
殊的html语法,一般的html标签都是形如<flag name=value>body</flag>的格式。我定义了字符扫描的五种状态:空状态,正在查找控件,正在查找控件头部,正在查找控件内容,正在查找控件结尾。(注:在写这篇文章的时候,我觉得“正在查找控件”是多余的,但是暂且这样吧)这样几种状态的转换依赖我定义的五种边界字符:非边界字符,开始边界字符,结束边界字符,封闭边界字符,简短形式的结束边界字符。所有的这些都以枚举的形式定义在源码中。
时间不早了,我要回家了,今天先写到这里。源码结构我觉得还是比较清晰的,注释也比较多,如果有人有兴趣详细研究它的实现方式的话,直接看源代码应该就可以了。如果还是不太明白或者我有时间的话,会接下去把思路完整的写下来。
BTW:现在基本完成了解析部分。结构已经完成了,但是很有很多Bug,调试很麻烦,希望有心人能够多多反馈。
本文作者:未知