圆月山庄资源网 Design By www.vgjia.com
ltemplate.lua
local insert = table.insert local remove = table.remove local concat = table.concat local format = string.format local loaded = {} local partten = "(.-){#([^#].-[^#])#}()" local content = {} local cur_content = nil local function ob_start() cur_content = {} insert(content, cur_content) end local function ob_get_clean() local ret = concat(cur_content) remove(content) cur_content = content[#content] return ret end local function echo(value) insert(cur_content, value) end local function include(path, params) local bitcode = loaded[path] if not bitcode then local fp = io.open(path, "rb") local template = fp:read('*a') fp:close() local results = {} local last_endpos = 0 for outside, inside, endpos in template:gmatch(partten) do insert(results, format("echo(%q)", outside)) insert(results, inside) last_endpos = endpos end insert(results, format("echo(%q)", template:sub(last_endpos))) results = concat(results, "\n") bitcode = assert(loadstring(results)) loaded[path] = bitcode end local env = { include = include, echo = echo, ob_start = ob_start, ob_get_clean = ob_get_clean } setmetatable(env, {__index = function(tb, k) return params[k] or _G[k] end}) setfenv(bitcode, env) bitcode() end for i = 1, 100000 do ob_start() include(arg[1], { params = { a = '1234', b = '4321' } }) ob_get_clean() end
master.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html lang='zh-CN' xml:lang='zh-CN' xmlns='http://www.w3.org/1999/xhtml'> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="Content-Language" content="zh-CN"/> <meta name="robots" content="index, follow" /> <link rel="shortcut icon" type="image/x-icon" href="/img/favicon.ico" /> <title> child's personal page - 开源中国社区</title> <link rel="stylesheet/less" href="http://my.oschina.net/lostchild/styles.less" type="text/css" media="screen" /> <link rel="stylesheet" href="/js/2012/poshytip/tip-yellowsimple/tip-yellowsimple.css" type="text/css" /> <link rel="stylesheet" type="text/css" href="/js/2011/fancybox/jquery.fancybox-1.3.4.css" media="screen" /> <script type="text/javascript" src="/UploadFiles/2021-04-08/jquery-1.7.1.min.js">temp.html,继承master.html
{# ob_start() #} <script> alert("hello World") </script> {# local header = ob_get_clean() #} {# ob_start() #} <table> {# for k, v in pairs(params) do #} <tr> <td>{# echo(k) #}</td> <td>{# echo(v) #}</td> </tr> {# end #} </table> {# local content = ob_get_clean() #} {# include('master.html', {header = header, content = content}) #}循环十万次测试渲染速度(阿里云最便宜一款vps)
[root@AY130801221248587d02Z ~]# time lua ltemplate.lua temp.htmlreal 0m1.867suser 0m1.862s sys 0m0.004s总结
由此可见渲染的速度还是非常快的,可以将此原型用于嵌入式设备中的页面上(用大量js实现的嵌入式设备页面兼容性不好)。而且嵌入式设备的界面需要简单明确,所以也不用太丰富的模版功能。
原理很简单:
1.用lua版的正则把模版内{#与#}之间的内容挖出来,原样输出成lua代码,其它部分则生成使用echo打印到某个缓冲区的lua代码。
2.将这个生成出来的代码使用loadstring编译。
3.通过setfenv实现loadstring后的模拟环境配置(用以提供模版内使用的echo,ob_start等函数,以及传入的参数)
4.执行这个编译后的函数即可。
标签:
Lua,Web,模板,模板引擎
圆月山庄资源网 Design By www.vgjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
圆月山庄资源网 Design By www.vgjia.com
暂无评论...
更新日志
2024年11月13日
2024年11月13日
- 刘欢《雨中的树(新歌加精选)2CD》德国HD24K金碟[WAV+CUE]
- 郑源 《世间情歌》6N纯银SQCD[WAV+CUE][1G]
- 群星《粤潮2HQII》头版限量编号[低速原抓WAV+CUE][991M]
- 群星《2023好听新歌21》十倍音质 U盘音乐[WAV分轨][1G]
- 《热血传奇》双11感恩回馈 超值狂欢30天
- 原神5.2版本活动汇总 5.2版本活动有哪些
- 张敬轩.2010-NO.ELEVEN【环球】【WAV+CUE】
- 黄丽玲.2006-失恋无罪【艾回】【WAV+CUE】
- 阿达娃.2024-Laluna【W8VES】【FLAC分轨】
- 宝可梦大集结段位等级划分表大全 大集结段位一览
- 龙腾世纪影障守护者工坊与装备如何升级 工坊与装备升级说明
- 龙腾世纪影障守护者全成就攻略分享 龙腾世纪4全成就列表一览
- 《剑星》更新四套全新战衣!
- 卡普空老将伊津野英昭宣布入职腾讯光子 开发3A动作
- 38岁梅根·福克斯官宣怀孕:将迎来第四个孩子