Mercurial > prosody-modules
comparison mod_http_muc_log/mod_http_muc_log.lua @ 1625:c427de617ada
mod_http_muc_log: Alter template language to more simply allow optional bits in templates
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 11 Mar 2015 13:29:23 +0100 |
| parents | 2c8b985ebde5 |
| children | 1a6d6221c5f6 |
comparison
equal
deleted
inserted
replaced
| 1624:0f20390f6fa5 | 1625:c427de617ada |
|---|---|
| 32 end | 32 end |
| 33 | 33 |
| 34 module:depends"http"; | 34 module:depends"http"; |
| 35 | 35 |
| 36 local function render(template, values) | 36 local function render(template, values) |
| 37 --[[ DOC | 37 -- This function takes a string template and a table of values. |
| 38 {name} is substituted for values["name"] and is XML escaped | 38 -- Sequences like {name} in the template string are substituted |
| 39 {name!} is substituted without XML escaping | 39 -- with values from the table, optionally depending on a modifier |
| 40 {name?} is optional and is replaced with an empty string if no value exists | 40 -- symbol. |
| 41 {name# sub-template } renders a sub-template using an array of values | 41 -- |
| 42 ]] | 42 -- Variants are: |
| 43 -- {name} is substituted for values["name"] and is XML escaped | |
| 44 -- {name? sub-template } renders a sub-template if values["name"] is false-ish | |
| 45 -- {name& sub-template } renders a sub-template if values["name"] is true-ish | |
| 46 -- {name# sub-template } renders a sub-template using an array of values | |
| 47 -- {name!} is substituted *without* XML escaping | |
| 43 return (template:gsub("%b{}", function (block) | 48 return (template:gsub("%b{}", function (block) |
| 44 local name, opt, e = block:sub(2, -2):match("([%a_][%w_]*)(%p?)()"); | 49 local name, opt, e = block:sub(2, -2):match("^([%a_][%w_]*)(%p?)()"); |
| 45 local value = values[name]; | 50 local value = values[name]; |
| 46 if opt == '#' then | 51 if opt == '#' then |
| 47 if not value or not value[1] then return ""; end | 52 if not value or not value[1] then return ""; end |
| 48 local out, subtpl = {}, block:sub(e+1, -2); | 53 local out, subtpl = {}, block:sub(e+1, -2); |
| 49 for i=1, #value do | 54 for i=1, #value do |
| 50 out[i] = render(subtpl, value[i]); | 55 out[i] = render(subtpl, value[i]); |
| 51 end | 56 end |
| 52 return t_concat(out); | 57 return t_concat(out); |
| 53 end | 58 elseif opt == '&' then |
| 54 if value ~= nil then | 59 if not value then return ""; end |
| 60 return render(block:sub(e+1, -2), values); | |
| 61 elseif opt == '?' and not value then | |
| 62 return render(block:sub(e+1, -2), values); | |
| 63 elseif value ~= nil then | |
| 55 if type(value) ~= "string" then | 64 if type(value) ~= "string" then |
| 56 value = tostring(value); | 65 value = tostring(value); |
| 57 end | 66 end |
| 58 if opt ~= '!' then | 67 if opt ~= '!' then |
| 59 return xml_escape(value); | 68 return xml_escape(value); |
| 60 end | 69 end |
| 61 return value; | 70 return value; |
| 62 elseif opt == '?' then | |
| 63 return block:sub(e+1, -2); | |
| 64 end | 71 end |
| 65 end)); | 72 end)); |
| 66 end | 73 end |
| 67 | 74 |
| 68 local template = "Could not load template" | 75 local template = "Could not load template" |
| 160 if i > 1 and tmp.wday == 2 then | 167 if i > 1 and tmp.wday == 2 then |
| 161 days = {}; | 168 days = {}; |
| 162 weeks[#weeks+1] = { days = days }; | 169 weeks[#weeks+1] = { days = days }; |
| 163 n = 1; | 170 n = 1; |
| 164 end | 171 end |
| 165 if d[i] then | 172 days[n], n = { wday = tmp.wday, day = i, href = d[i] and datetime.date(d[i]) }, n+1; |
| 166 days[n], n = { wday = tmp.wday, links = {{ href = datetime.date(d[i]), day = i }} }, n+1; | |
| 167 else | |
| 168 days[n], n = { wday = tmp.wday, plain = i }, n+1; | |
| 169 end | |
| 170 end | 173 end |
| 171 end | 174 end |
| 172 table.sort(year, sort_m); | 175 table.sort(year, sort_m); |
| 173 end | 176 end |
| 174 table.sort(years, sort_Y); | 177 table.sort(years, sort_Y); |
