mirror of
				https://github.com/Ysurac/openmptcprouter-feeds.git
				synced 2025-03-09 15:40:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
-- Copyright 2008 Steven Barth <steven@midlink.org>
 | 
						|
-- Licensed to the public under the Apache License 2.0.
 | 
						|
 | 
						|
local util = require "luci.util"
 | 
						|
local config = require "luci.config"
 | 
						|
local tparser = require "luci.template.parser"
 | 
						|
 | 
						|
local tostring, pairs, loadstring = tostring, pairs, loadstring
 | 
						|
local setmetatable, loadfile = setmetatable, loadfile
 | 
						|
local getfenv, setfenv, rawget = getfenv, setfenv, rawget
 | 
						|
local assert, type, error = assert, type, error
 | 
						|
 | 
						|
--- LuCI template library.
 | 
						|
module "luci.template"
 | 
						|
 | 
						|
config.template = config.template or {}
 | 
						|
viewdir = config.template.viewdir or util.libpath() .. "/view"
 | 
						|
 | 
						|
 | 
						|
-- Define the namespace for template modules
 | 
						|
context = util.threadlocal()
 | 
						|
 | 
						|
--- Render a certain template.
 | 
						|
-- @param name		Template name
 | 
						|
-- @param scope		Scope to assign to template (optional)
 | 
						|
function render(name, scope)
 | 
						|
	return Template(name):render(scope or getfenv(2))
 | 
						|
end
 | 
						|
 | 
						|
--- Render a template from a string.
 | 
						|
-- @param template	Template string
 | 
						|
-- @param scope		Scope to assign to template (optional)
 | 
						|
function render_string(template, scope)
 | 
						|
	return Template(nil, template):render(scope or getfenv(2))
 | 
						|
end
 | 
						|
 | 
						|
 | 
						|
-- Template class
 | 
						|
Template = util.class()
 | 
						|
 | 
						|
-- Shared template cache to store templates in to avoid unnecessary reloading
 | 
						|
Template.cache = setmetatable({}, {__mode = "v"})
 | 
						|
 | 
						|
 | 
						|
-- Constructor - Reads and compiles the template on-demand
 | 
						|
function Template.__init__(self, name, template)
 | 
						|
	if name then
 | 
						|
		self.template = self.cache[name]
 | 
						|
		self.name = name
 | 
						|
	else
 | 
						|
		self.name = "[string]"
 | 
						|
	end
 | 
						|
 | 
						|
	-- Create a new namespace for this template
 | 
						|
	self.viewns = context.viewns
 | 
						|
	
 | 
						|
	-- If we have a cached template, skip compiling and loading
 | 
						|
	if not self.template then
 | 
						|
 | 
						|
		-- Compile template
 | 
						|
		local err
 | 
						|
		local sourcefile
 | 
						|
 | 
						|
		if name then
 | 
						|
			sourcefile = viewdir .. "/" .. name .. ".htm"
 | 
						|
			self.template, _, err = tparser.parse(sourcefile)
 | 
						|
		else
 | 
						|
			sourcefile = "[string]"
 | 
						|
			self.template, _, err = tparser.parse_string(template)
 | 
						|
		end
 | 
						|
 | 
						|
		-- If we have no valid template throw error, otherwise cache the template
 | 
						|
		if not self.template then
 | 
						|
			error("Failed to load template '" .. name .. "'.\n" ..
 | 
						|
			      "Error while parsing template '" .. sourcefile .. "':\n" ..
 | 
						|
			      (err or "Unknown syntax error"))
 | 
						|
		elseif name then
 | 
						|
			self.cache[name] = self.template
 | 
						|
		end
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
 | 
						|
-- Renders a template
 | 
						|
function Template.render(self, scope)
 | 
						|
	scope = scope or getfenv(2)
 | 
						|
	
 | 
						|
	-- Put our predefined objects in the scope of the template
 | 
						|
	setfenv(self.template, setmetatable({}, {__index =
 | 
						|
		function(tbl, key)
 | 
						|
			return rawget(tbl, key) or self.viewns[key] or scope[key]
 | 
						|
		end}))
 | 
						|
	
 | 
						|
	-- Now finally render the thing
 | 
						|
	local stat, err = util.copcall(self.template)
 | 
						|
	if not stat then
 | 
						|
		error("Failed to execute template '" .. self.name .. "'.\n" ..
 | 
						|
		      "A runtime error occurred: " .. tostring(err or "(nil)"))
 | 
						|
	end
 | 
						|
end
 |