麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

使用Lua編寫Web端模板引擎的實例代碼分享

2024-07-21 23:05:02
字體:
來源:轉載
供稿:網友

ltemplate.lua

local insert = table.insertlocal remove = table.removelocal concat = table.concatlocal format = string.formatlocal loaded = {}local partten = "(.-){#([^#].-[^#])#}()"local content = {}local cur_content = nillocal function ob_start() cur_content = {} insert(content, cur_content)endlocal function ob_get_clean() local ret = concat(cur_content) remove(content) cur_content = content[#content] return retendlocal function echo(value) insert(cur_content, value)endlocal 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()endfor 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?ver=20131219&date=20131110185237" 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="/js/2012/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="/js/2012/jquery.form.js"></script> <script type="text/javascript" src="/js/2011/fancybox/jquery.fancybox-1.3.4.pack.js"></script> <script type="text/javascript" src="/js/2012/poshytip/jquery.poshytip.min.js"></script> <script type="text/javascript" src="/js/2011/oschina.js?ver=20121007"></script> <script type="text/javascript" src="/js/2012/less-1.3.0.min.js"></script> <script type="text/javascript" src="/js/scrolltopcontrol.js"></script> <script type='text/javascript' src='/js/jquery/jquery.atwho.js?ver=2013112501'></script> <link rel="stylesheet" type="text/css" href="/js/jquery/jquery.atwho.css" /> <link rel="alternate" type="application/rss+xml" <link rel="EditURI" type="application/rsd+xml" <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://my.oschina.net/action/xmlrpc/wlwmanifest?space=1397642" /> {# echo(header) #}</head><body>{# echo(content) #}<body></html>

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.867s
user  0m1.862ssys   0m0.004s

總結

由此可見渲染的速度還是非常快的,可以將此原型用于嵌入式設備中的頁面上(用大量js實現的嵌入式設備頁面兼容性不好)。而且嵌入式設備的界面需要簡單明確,所以也不用太豐富的模版功能。

原理很簡單:

1.用lua版的正則把模版內{#與#}之間的內容挖出來,原樣輸出成lua代碼,其它部分則生成使用echo打印到某個緩沖區的lua代碼。

2.將這個生成出來的代碼使用loadstring編譯。

3.通過setfenv實現loadstring后的模擬環境配置(用以提供模版內使用的echo,ob_start等函數,以及傳入的參數)

4.執行這個編譯后的函數即可。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品国产一区二区在线观看 | 91性高湖久久久久久久久网站 | 国产午夜电影在线观看 | 欧美视频在线一区二区三区 | 欧美一级黄色影院 | 欧美四级在线观看 | 午夜精品毛片 | 欧美性受ⅹ╳╳╳黑人a性爽 | 日本在线播放一区 | 亚洲精品久久久久久下一站 | 姑娘第四集免费看视频 | 国产一国产精品一级毛片 | 特黄一级小说 | 免费看一级片 | 国产91丝袜在线播放 | 国产午夜精品一区二区三区不卡 | 91香蕉国产亚洲一区二区三区 | 在线成人免费视频 | 老a影视网站在线观看免费 国产精品久久久久久久久久尿 | 日韩在线播放第一页 | 欧美性生活视频免费 | 国产91精品久久久久久 | 精品国产91一区二区三区 | 久久精品2019中文字幕 | 国产精品视频免费在线观看 | 福利在线国产 | 欧美一级淫片a免费播放口 91九色蝌蚪国产 | 97伦理 | 国产在线精品一区二区三区不卡 | 国产一级毛片国语版 | 黄色av免费网站 | 欧美成人精品一区 | 久久久久久久国产视频 | 久久精品视频在线看99 | 日韩美香港a一级毛片免费 欧美一级淫片007 | 黄色特级片黄色特级片 | 污片在线观看视频 | 成人在线观看免费 | 超碰人人做人人爱 | 91美女视频在线观看 | 国产一区精品在线观看 |