Diff

util/interpolation.lua @ 6775:22c8deb43daf

Merge 0.10->trunk
author Kim Alvefur <zash@zash.se>
date Tue, 11 Aug 2015 10:29:25 +0200
parent 6772:805baeca56b6
child 10348:3852fc91b2fc
line wrap: on
line diff
--- a/util/interpolation.lua	Mon Jul 27 09:38:40 2015 +0100
+++ b/util/interpolation.lua	Tue Aug 11 10:29:25 2015 +0200
@@ -1,6 +1,6 @@
 -- Simple template language
 --
--- The new() function takes a pattern and an escape function and returns 
+-- The new() function takes a pattern and an escape function and returns
 -- a render() function.  Both are required.
 --
 -- The function render() takes a string template and a table of values.
@@ -9,14 +9,14 @@
 -- symbol.
 --
 -- Variants are:
--- {name} is substituted for values["name"] and is escaped using the 
+-- {name} is substituted for values["name"] and is escaped using the
 -- second argument to new_render().  To disable the escaping, use {name!}.
 -- {name.item} can be used to access table items.
 -- To renter lists of items: {name# item number {idx} is {item} }
 -- Or key-value pairs: {name% t[ {idx} ] = {item} }
--- To show a defaults for missing values {name? sub-template } can be used, 
+-- To show a defaults for missing values {name? sub-template } can be used,
 -- which renders a sub-template if values["name"] is false-ish.
--- {name& sub-template } does the opposite, the sub-template is rendered 
+-- {name& sub-template } does the opposite, the sub-template is rendered
 -- if the selected value is anything but false or nil.
 
 local type, tostring = type, tostring;
@@ -24,7 +24,7 @@
 local s_sub, s_gsub, s_match = string.sub, string.gsub, string.match;
 local t_concat = table.concat;
 
-local function new_render(pat, escape)
+local function new_render(pat, escape, funcs)
 	-- assert(type(pat) == "string", "bad argument #1 to 'new_render' (string expected)");
 	-- assert(type(escape) == "function", "bad argument #2 to 'new_render' (function expected)");
 	local function render(template, values)
@@ -42,6 +42,14 @@
 					if not value then break; end
 				end
 			end
+			if funcs then
+				while value ~= nil and opt == '|' do
+					local f;
+					f, opt, e = s_match(block, "^([%a_][%w_.]*)(%p?)()", e);
+					f = funcs[f];
+					if f then value = f(value); end
+				end
+			end
 			if opt == '#' or opt == '%' then
 				if type(value) ~= "table" then return ""; end
 				local iter = opt == '#' and ipairs or pairs;