好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 使用Lua編寫Web端模板引擎的實例代碼分享

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

熱門標簽:艾比利外呼系統 免費門店地圖標注注冊入駐 杞縣地圖標注app 外呼系統一天耗費多少流量 昆明電話外呼系統好么 衡水外呼線路解決 電話機器人每天搜索多少次 海口智能語音電銷機器人好用嗎 陜西便宜電銷機器人軟件

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> childapos;s personal page - 開源中國社區/title>
   link rel="stylesheet/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="/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" title="lostchild最新博客"  />
 link rel="EditURI" type="application/rsd+xml" title="RSD"  />
 link rel="wlwmanifest" type="application/wlwmanifest+xml"  />
 {# 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.862s
sys   0m0.004s

總結

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

原理很簡單:

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

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

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

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

您可能感興趣的文章:
  • java web驗證碼實現代碼分享
  • JavaWeb學習筆記分享(必看篇)
  • Java Web端程序實現文件下載的方法分享
  • 使用AJAX實現Web頁面進度條的實例分享
  • 分享js粘帖屏幕截圖到web頁面插件screenshot-paste
  • 利用jQuery設計一個簡單的web音樂播放器的實例分享
  • 分享提高ASP.NET Web應用性能的技巧
  • PHP Web木馬掃描器代碼分享
  • 一張Web前端的思維導圖分享
  • 手機Web APP如何實現分享多平臺功能

標簽:營口 昌都 宿遷 臨滄 海口 西寧 南京 泰安

巨人網絡通訊聲明:本文標題《使用Lua編寫Web端模板引擎的實例代碼分享》,本文關鍵詞  使用,Lua,編寫,Web,端,模板,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用Lua編寫Web端模板引擎的實例代碼分享》相關的同類信息!
  • 本頁收集關于使用Lua編寫Web端模板引擎的實例代碼分享的相關信息資訊供網民參考!
  • 推薦文章