Changeset

3028:ded630a87563

mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
author Kim Alvefur <zash@zash.se>
date Sun, 20 May 2018 17:49:00 +0200
parents 3027:ce34cbc10b5b
children 3029:7878dc2dbf59
files mod_pastebin/mod_pastebin.lua
diffstat 1 files changed, 21 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/mod_pastebin/mod_pastebin.lua	Sun May 20 17:47:39 2018 +0200
+++ b/mod_pastebin/mod_pastebin.lua	Sun May 20 17:49:00 2018 +0200
@@ -71,6 +71,24 @@
 	return pastes[pasteid];
 end
 
+local function replace_tag(s, replacement)
+	local once = false;
+	s:maptags(function (tag)
+		if tag.name == replacement.name and tag.attr.xmlns == replacement.attr.xmlns then
+			if not once then
+				once = true;
+				return replacement;
+			else
+				return nil;
+			end
+		end
+		return tag;
+	end);
+	if not once then
+		s:add_child(replacement);
+	end
+end
+
 function check_message(data)
 	local origin, stanza = data.origin, data.stanza;
 
@@ -83,17 +101,9 @@
 		if not nick then return; end
 	end
 
-	local body, bodyindex, htmlindex;
-	for k,v in ipairs(stanza) do
-		if v.name == "body" then
-			body, bodyindex = v, k;
-		elseif v.name == "html" and v.attr.xmlns == xmlns_xhtmlim then
-			htmlindex = k;
-		end
-	end
+	local body = stanza:get_child_text();
 
 	if not body then return; end
-	body = body:get_text();
 
 	--module:log("debug", "Body(%s) length: %d", type(body), #(body or ""));
 
@@ -112,7 +122,7 @@
 		local summary = (body:sub(1, max_summary_length):gsub(utf8_pattern, drop_invalid_utf8) or ""):match("[^\n]+") or "";
 		summary = summary:match("^%s*(.-)%s*$");
 		local summary_prefixed = summary:match("[,:]$");
-		stanza[bodyindex][1] = (summary_prefixed and (summary.." ") or "")..url;
+		replace_tag(stanza, st.stanza("body"):text(summary));
 
 		if html_preview then
 			local line_count = select(2, body:gsub("\n", "%0")) + 1;
@@ -120,7 +130,7 @@
 			local html = st.stanza("html", { xmlns = xmlns_xhtmlim }):tag("body", { xmlns = xmlns_xhtml });
 			html:tag("p"):text(summary.." "):up();
 			html:tag("a", { href = url }):text(link_text):up();
-			stanza[htmlindex or #stanza+1] = html;
+			replace_tag(stanza, html);
 		end
 	end
 end