aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2020-09-09 17:10:33 +0100
committerMatthew Wild <mwild1@gmail.com>2020-09-09 17:10:33 +0100
commitc00bd4515da975d5db8004b2b92809e04aeaec32 (patch)
tree30aca2c3e00aa809020322a48f57445e0e21d3ba
parent97fc84beed9a3187537b9c8f3d68c7ea34fa82ac (diff)
downloadprosody-c00bd4515da975d5db8004b2b92809e04aeaec32.tar.gz
prosody-c00bd4515da975d5db8004b2b92809e04aeaec32.zip
util.interpolation: Add '~' as the opposite of '&' (render sub-block if falsy)
One more magic character consumed!
-rw-r--r--spec/util_interpolation_spec.lua12
-rw-r--r--util/interpolation.lua3
2 files changed, 14 insertions, 1 deletions
diff --git a/spec/util_interpolation_spec.lua b/spec/util_interpolation_spec.lua
index 76000d94..98ed3b74 100644
--- a/spec/util_interpolation_spec.lua
+++ b/spec/util_interpolation_spec.lua
@@ -32,7 +32,15 @@ local template_map = [[
local expect_map = [[
FOO: bar
]]
-
+local template_not = [[
+{thing~Thing is nil}{thing&Thing is not nil}
+]]
+local expect_not_true = [[
+Thing is not nil
+]]
+local expect_not_nil = [[
+Thing is nil
+]]
describe("util.interpolation", function ()
it("renders", function ()
local render = require "util.interpolation".new("%b{}", string.upper, { sort = function (t) table.sort(t) return t end });
@@ -43,5 +51,7 @@ describe("util.interpolation", function ()
assert.equal(expect_func_pipe, render(template_func_pipe, { foo = { "c", "a", "d", "b", } }));
-- assert.equal("", render(template_func_pipe, { foo = nil })); -- FIXME
assert.equal(expect_map, render(template_map, { foo = { foo = "bar" } }));
+ assert.equal(expect_not_true, render(template_not, { thing = true }));
+ assert.equal(expect_not_nil, render(template_not, { thing = nil }));
end);
end);
diff --git a/util/interpolation.lua b/util/interpolation.lua
index e0ccf47b..808a45f2 100644
--- a/util/interpolation.lua
+++ b/util/interpolation.lua
@@ -64,6 +64,9 @@ local function new_render(pat, escape, funcs)
elseif opt == '&' then
if not value then return ""; end
return render(s_sub(block, e), values);
+ elseif opt == '~' then
+ if value then return ""; end
+ return render(s_sub(block, e), values);
elseif opt == '?' and not value then
return render(s_sub(block, e), values);
elseif value ~= nil then