心血来潮之作...基于javascript的文本模板引擎

ChrisAK 2011-07-05 08:23:17
加精
起因是今天看到清清的这个贴:
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,俺是穷人,玩不起三公主
...全文
3079 145 打赏 收藏 转发到动态 举报
写回复
用AI写文章
145 条回复
切换为时间正序
请发表友善的回复…
发表回复
BraveRu 2011-09-09
  • 打赏
  • 举报
回复
哈哈,受教啦。
长笛党希望 2011-07-11
  • 打赏
  • 举报
回复
看看,。,。,,。
tirrer 2011-07-11
  • 打赏
  • 举报
回复
路过,打酱油的,不过粗略的看了一下,还可以~我建议你还是不要怕花钱~~
aummer177 2011-07-11
  • 打赏
  • 举报
回复
学习哈
紫龙神 2011-07-11
  • 打赏
  • 举报
回复
收下,接分!!
阿K 2011-07-11
  • 打赏
  • 举报
回复
好东西啊。。。
chen_bruce 2011-07-11
  • 打赏
  • 举报
回复
我好像也在看天书啊!
水中钓鱼的猫 2011-07-11
  • 打赏
  • 举报
回复
DeathSteps 2011-07-10
  • 打赏
  • 举报
回复
楼主强大,像我也是个正则白痴!
随缘不变 2011-07-10
  • 打赏
  • 举报
回复
弄下来看看
skyaspnet 2011-07-10
  • 打赏
  • 举报
回复
看看。。。
burangyongqq 2011-07-08
  • 打赏
  • 举报
回复
真不错!!!
亚丁号 2011-07-08
  • 打赏
  • 举报
回复
hutc_2008 2011-07-08
  • 打赏
  • 举报
回复
一切为了积分!!!!
qwe065560 2011-07-08
  • 打赏
  • 举报
回复
tiankongfeiwu2008 2011-07-08
  • 打赏
  • 举报
回复
近段时间在学习JS,关注JS!!!!
soft小兵 2011-07-07
  • 打赏
  • 举报
回复
研究下...
boxun123 2011-07-07
  • 打赏
  • 举报
回复
学习学习
tw19811101110 2011-07-07
  • 打赏
  • 举报
回复
学习学习
licip 2011-07-07
  • 打赏
  • 举报
回复
支持一下,加油!
加载更多回复(112)

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧