起因是今天看到清清的这个贴:
http://topic.csdn.net/u/20110704/00/dc87b91e-b4ca-4d4a-acd1-fa7a354aa7a4.html
我一直有用模板引擎,但不是用来生成前端html,而是生成各种文本.
之前用的是一个自己hosting asp.net弄的自制版(俺不是做web滴=3=).呃...怎么说呢?asp.net
咋说还是面向后台开发生成html的,对于用来生成普通文本就像用高射炮打蚊子.总之就是用起来
各种不爽.后来联系了清洁工,结果很遗憾的他是为了html前端而做的东西,同样生成html很方便,但用来
生成格式化文本就比较烦了,因为他省掉一些代码块标记的代价是以行为单位,代码无法和文本
混插.在和清洁工讨论一番过后,我想把他的acetemplate拿来改改将就用,结果打开源码看到满篇的
正则表达式我晕了
对于正则小白的我来说看那玩意就像看天书哇...不过兴趣已经被提起来了木办法╮(╯_╰)╭,在用 asp.net前自己有过做类似东西.但自发现
asp.net可以当模板引擎用后就懒了.于是今天这回就决定趁着兴头上做了.最后..今天忙里偷闲几个小时最后弄了这么个东西出来:
template test.rar文件包括:
rabbit-template.js 引擎脚本
test.txt test.wsf用的测试模板 
test.wsf windows script下测试脚本
test.html 测试用作web前端的模板引擎(只在google chrome下做过测试并通过)以下是脚本标记语法:#expr# 内插js表达式
#$script 单行代码(本行内#$后面的字符全部解释为javascript语句)
#%n 内插对象索引 n必须为整数 (对象由format函数调用时指定,参考test.wsf)
#{script} 多行代码({}中为多行的代码)
#[script] 同#{} 用于处理代码结尾为{时的情况
## 转义为#写代码的时间就几小时,几乎没啥注释.所以可读性很杯具(只保证日后我能看懂维护,但阅读习惯
和我不同的人看起来估计头十分大)我是正则白痴,没有使用正则表达式.引擎是自己写的字符串扫描器.对非正则表达式字符串处理
有兴趣的童鞋可以用来做参考(只要你不在乎那杯具的可读性)
最后介绍下大体原理,方便有兴趣的人阅读代码.如前所述,标记一个特殊块的起始为一个井号"#"井号的第一个字符被认为是一个command,每一个command有一个cmdlet对应处理(找不到对应的cmdlet的命令
由名为default的cmdlet处理).cmdlet为可扩展;也就是说如果实用需要可以扩展出自己的cmdlet.(源码299-361行)脚本里实现了一个字符串流.用于对字符串进行扫描(源码103行).同时在此基础上扩充了一个stringbuilder
用于生成可执行脚本(源码181行)cmdlet实质上是一条函数,它接受一个字符做参数字符包含了触发改cmdlet处理的command.cmdlet函数中的this为一个扫描上下文对象,它包含源文本流对象reader和脚本输出流对象script(源码267行)扫描器保证每个cmdlet被调用时,字符串流的指针指向command之后的第一个字符.即如果有模板文本:abc#%1def当cmdlet %被调用时,此时的流指针指向"1".cmdlet保证完成以下工作:
1.读取command需要的文本块.
2.处理读取到的文本块并将结果写入script
3.cmdlet处理完成后保证流指针指向cmdlet处理过的文本块的后面.还是以前面的例子为例,当cmdlet %执行完毕后,它应该保证流指针指向1后面的d=========================================华丽丽的PS分割线=============================================PS1:多行代码块的标记#[] 和#{}中的javascript代码在包含的括号不配对时会出错(即使就javascript语法来
说那是正确的).这是因为我没对字符串内容进行处理造成的,写一个字符串块处理函数跳过即可修正.但俺暂时
没那个兴趣PS2:经考虑可能会添加一个类似xml中CDATA节作用的cmdlet.PS3:没PS3,俺是穷人,玩不起三公主