Changeset

13499:1f93e4f78c53

util.xtemplate: Fix error on applying each() to zero stanzas
author Kim Alvefur <zash@zash.se>
date Thu, 11 Jul 2024 15:04:29 +0200
parents 13498:aefbc76ac8d2
children 13501:05f028de4c45
files spec/util_xtemplate_spec.lua teal-src/prosody/util/xtemplate.tl util/xtemplate.lua
diffstat 3 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/spec/util_xtemplate_spec.lua	Sun Jul 07 18:40:25 2024 +0200
+++ b/spec/util_xtemplate_spec.lua	Thu Jul 11 15:04:29 2024 +0200
@@ -38,6 +38,10 @@
 				x:reset();
 				assert.same("12345", xtemplate.render("{foo/bar|each(i){{#}}}", x));
 			end)
+			it("handles missing inputs", function ()
+				local x = st.stanza("root");
+				assert.same("", xtemplate.render("{foo/bar|each(i){{#}}}", x));
+			end)
 		end)
 	end)
 end)
--- a/teal-src/prosody/util/xtemplate.tl	Sun Jul 07 18:40:25 2024 +0200
+++ b/teal-src/prosody/util/xtemplate.tl	Thu Jul 11 15:04:29 2024 +0200
@@ -54,7 +54,10 @@
 			if tmpl then tmpl = s_sub(tmpl, 2, -2); end
 			if args then args = s_sub(args, 2, -2); end
 
-			if func == "each" and tmpl and st.is_stanza(value) then
+			if func == "each" and tmpl then
+				if not st.is_stanza(value) then
+					return pre_blank..post_blank;
+				end
 				if not args then value, args = root, path; end
 				local ns, name = s_match(args, "^(%b{})(.*)$");
 				if ns then ns = s_sub(ns, 2, -2); else name, ns = args, nil; end
--- a/util/xtemplate.lua	Sun Jul 07 18:40:25 2024 +0200
+++ b/util/xtemplate.lua	Thu Jul 11 15:04:29 2024 +0200
@@ -39,7 +39,8 @@
 			if tmpl then tmpl = s_sub(tmpl, 2, -2); end
 			if args then args = s_sub(args, 2, -2); end
 
-			if func == "each" and tmpl and st.is_stanza(value) then
+			if func == "each" and tmpl then
+				if not st.is_stanza(value) then return pre_blank .. post_blank end
 				if not args then value, args = root, path; end
 				local ns, name = s_match(args, "^(%b{})(.*)$");
 				if ns then