pass buffer from outer scope, export some locals from _G

This commit is contained in:
leaf corcoran
2014-02-01 11:44:12 -08:00
parent a122f54d0e
commit 8b67327708
2 changed files with 18 additions and 9 deletions

View File

@@ -1,10 +1,15 @@
local VERSION = "1.0.1" local VERSION = "1.0.2"
local insert, concat local insert, concat
do do
local _obj_0 = table local _obj_0 = table
insert, concat = _obj_0.insert, _obj_0.concat insert, concat = _obj_0.insert, _obj_0.concat
end end
local setfenv = setfenv or function(fn, env) local load, setfenv, assert, type, error, tostring, tonumber, setmetatable
do
local _obj_0 = _G
load, setfenv, assert, type, error, tostring, tonumber, setmetatable = _obj_0.load, _obj_0.setfenv, _obj_0.assert, _obj_0.type, _obj_0.error, _obj_0.tostring, _obj_0.tonumber, _obj_0.setmetatable
end
setfenv = setfenv or function(fn, env)
local name local name
local i = 1 local i = 1
while true do while true do
@@ -225,10 +230,13 @@ do
end end
return nil, err return nil, err
end end
return function(env) return function(env, buffer)
if env == nil then if env == nil then
env = { } env = { }
end end
if buffer == nil then
buffer = { }
end
local combined_env = setmetatable({ }, { local combined_env = setmetatable({ }, {
__index = function(self, name) __index = function(self, name)
local val = env[name] local val = env[name]
@@ -239,12 +247,12 @@ do
end end
}) })
setfenv(fn, combined_env) setfenv(fn, combined_env)
return fn(tostring, concat, html_escape) return fn(buffer, #buffer, tostring, concat, html_escape)
end end
end, end,
chunks_to_lua = function(self) chunks_to_lua = function(self)
local buffer = { local buffer = {
"local _b, _b_i, _tostring, _concat, _escape = {}, 0, ..." "local _b, _b_i, _tostring, _concat, _escape = ..."
} }
local buffer_i = #buffer local buffer_i = #buffer
local push local push

View File

@@ -1,6 +1,7 @@
VERSION = "1.0.2" VERSION = "1.0.2"
import insert, concat from table import insert, concat from table
import load, setfenv, assert, type, error, tostring, tonumber, setmetatable from _G
setfenv = setfenv or (fn, env) -> setfenv = setfenv or (fn, env) ->
local name local name
@@ -178,20 +179,20 @@ class Parser
return nil, err return nil, err
(env={}) -> (env={}, buffer={}) ->
combined_env = setmetatable {}, __index: (name) => combined_env = setmetatable {}, __index: (name) =>
val = env[name] val = env[name]
val = _G[name] if val == nil val = _G[name] if val == nil
val val
setfenv fn, combined_env setfenv fn, combined_env
fn tostring, concat, html_escape fn buffer, #buffer, tostring, concat, html_escape
-- generates the code of the template -- generates the code of the template
chunks_to_lua: => chunks_to_lua: =>
-- todo: find a no-conflict name for buffer -- todo: find a no-conflict name for locals
buffer = { buffer = {
"local _b, _b_i, _tostring, _concat, _escape = {}, 0, ..." "local _b, _b_i, _tostring, _concat, _escape = ..."
} }
buffer_i = #buffer buffer_i = #buffer