Software /
code /
prosody
Comparison
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 |
comparison
equal
deleted
inserted
replaced
6770:cb84731b2dfd | 6775:22c8deb43daf |
---|---|
1 -- Simple template language | 1 -- Simple template language |
2 -- | 2 -- |
3 -- The new() function takes a pattern and an escape function and returns | 3 -- The new() function takes a pattern and an escape function and returns |
4 -- a render() function. Both are required. | 4 -- a render() function. Both are required. |
5 -- | 5 -- |
6 -- The function render() takes a string template and a table of values. | 6 -- The function render() takes a string template and a table of values. |
7 -- Sequences like {name} in the template string are substituted | 7 -- Sequences like {name} in the template string are substituted |
8 -- with values from the table, optionally depending on a modifier | 8 -- with values from the table, optionally depending on a modifier |
9 -- symbol. | 9 -- symbol. |
10 -- | 10 -- |
11 -- Variants are: | 11 -- Variants are: |
12 -- {name} is substituted for values["name"] and is escaped using the | 12 -- {name} is substituted for values["name"] and is escaped using the |
13 -- second argument to new_render(). To disable the escaping, use {name!}. | 13 -- second argument to new_render(). To disable the escaping, use {name!}. |
14 -- {name.item} can be used to access table items. | 14 -- {name.item} can be used to access table items. |
15 -- To renter lists of items: {name# item number {idx} is {item} } | 15 -- To renter lists of items: {name# item number {idx} is {item} } |
16 -- Or key-value pairs: {name% t[ {idx} ] = {item} } | 16 -- Or key-value pairs: {name% t[ {idx} ] = {item} } |
17 -- To show a defaults for missing values {name? sub-template } can be used, | 17 -- To show a defaults for missing values {name? sub-template } can be used, |
18 -- which renders a sub-template if values["name"] is false-ish. | 18 -- which renders a sub-template if values["name"] is false-ish. |
19 -- {name& sub-template } does the opposite, the sub-template is rendered | 19 -- {name& sub-template } does the opposite, the sub-template is rendered |
20 -- if the selected value is anything but false or nil. | 20 -- if the selected value is anything but false or nil. |
21 | 21 |
22 local type, tostring = type, tostring; | 22 local type, tostring = type, tostring; |
23 local pairs, ipairs = pairs, ipairs; | 23 local pairs, ipairs = pairs, ipairs; |
24 local s_sub, s_gsub, s_match = string.sub, string.gsub, string.match; | 24 local s_sub, s_gsub, s_match = string.sub, string.gsub, string.match; |
25 local t_concat = table.concat; | 25 local t_concat = table.concat; |
26 | 26 |
27 local function new_render(pat, escape) | 27 local function new_render(pat, escape, funcs) |
28 -- assert(type(pat) == "string", "bad argument #1 to 'new_render' (string expected)"); | 28 -- assert(type(pat) == "string", "bad argument #1 to 'new_render' (string expected)"); |
29 -- assert(type(escape) == "function", "bad argument #2 to 'new_render' (function expected)"); | 29 -- assert(type(escape) == "function", "bad argument #2 to 'new_render' (function expected)"); |
30 local function render(template, values) | 30 local function render(template, values) |
31 -- assert(type(template) == "string", "bad argument #1 to 'render' (string expected)"); | 31 -- assert(type(template) == "string", "bad argument #1 to 'render' (string expected)"); |
32 -- assert(type(values) == "table", "bad argument #2 to 'render' (table expected)"); | 32 -- assert(type(values) == "table", "bad argument #2 to 'render' (table expected)"); |
38 if not value and name:find(".", 2, true) then | 38 if not value and name:find(".", 2, true) then |
39 value = values; | 39 value = values; |
40 for word in name:gmatch"[^.]+" do | 40 for word in name:gmatch"[^.]+" do |
41 value = value[word]; | 41 value = value[word]; |
42 if not value then break; end | 42 if not value then break; end |
43 end | |
44 end | |
45 if funcs then | |
46 while value ~= nil and opt == '|' do | |
47 local f; | |
48 f, opt, e = s_match(block, "^([%a_][%w_.]*)(%p?)()", e); | |
49 f = funcs[f]; | |
50 if f then value = f(value); end | |
43 end | 51 end |
44 end | 52 end |
45 if opt == '#' or opt == '%' then | 53 if opt == '#' or opt == '%' then |
46 if type(value) ~= "table" then return ""; end | 54 if type(value) ~= "table" then return ""; end |
47 local iter = opt == '#' and ipairs or pairs; | 55 local iter = opt == '#' and ipairs or pairs; |