<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.teopedia.org/w-lib/index.php?action=history&amp;feed=atom&amp;title=Module%3AHPB-SB_authors</id>
	<title>Module:HPB-SB authors - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.teopedia.org/w-lib/index.php?action=history&amp;feed=atom&amp;title=Module%3AHPB-SB_authors"/>
	<link rel="alternate" type="text/html" href="https://en.teopedia.org/w-lib/index.php?title=Module:HPB-SB_authors&amp;action=history"/>
	<updated>2026-11-13T17:02:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.2</generator>
	<entry>
		<id>https://en.teopedia.org/w-lib/index.php?title=Module:HPB-SB_authors&amp;diff=47304&amp;oldid=prev</id>
		<title>24pmBot1 at 15:37, 8 October 2026</title>
		<link rel="alternate" type="text/html" href="https://en.teopedia.org/w-lib/index.php?title=Module:HPB-SB_authors&amp;diff=47304&amp;oldid=prev"/>
		<updated>2026-10-08T15:37:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:37, 8 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l165&quot;&gt;Line 165:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 165:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	table.insert(out, &amp;#039;Has &amp;quot;Kislingbury, Emily&amp;quot;: &amp;#039; .. tostring(map[&amp;#039;Kislingbury, Emily&amp;#039;] ~= nil))&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	table.insert(out, &amp;#039;Has &amp;quot;Kislingbury, Emily&amp;quot;: &amp;#039; .. tostring(map[&amp;#039;Kislingbury, Emily&amp;#039;] ~= nil))&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	return table.concat(out, &amp;#039;&amp;lt;br&amp;gt;\n&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	return table.concat(out, &amp;#039;&amp;lt;br&amp;gt;\n&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;end&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;-- TEMPORARY diagnostic helper for the author-name cleanup project: dumps every&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;-- unique raw author string with the wiki pages it appears on, tab/semicolon&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;-- separated, for offline analysis. Safe to remove once that project is done.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;function p.rawnames(frame)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	local rows = fetchAllRows(frame)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	local map, order = groupByAuthor(rows)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	table.sort(order)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	local out = {}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	for _, name in ipairs(order) do&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		local pages = {}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		local seen = {}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		for _, r in ipairs(map[name]) do&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			if not seen[r.page] then&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;				seen[r.page] = true&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;				table.insert(pages, r.page)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			end&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		end&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		table.insert(out, name .. &#039;\t&#039; .. table.concat(pages, &#039;;&#039;))&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	end&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	return &#039;&amp;lt;pre&amp;gt;&#039; .. table.concat(out, &#039;\n&#039;) .. &#039;&amp;lt;/pre&amp;gt;&#039;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;return p&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;return p&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key prod_en_teopedia_org-lib__:diff:1.41:old-37227:rev-47304:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>24pmBot1</name></author>
	</entry>
	<entry>
		<id>https://en.teopedia.org/w-lib/index.php?title=Module:HPB-SB_authors&amp;diff=37227&amp;oldid=prev</id>
		<title>24pmBot1: Created page with &quot;local p = {}  -- Separators matching Template:HPB-SB authors raw row local FS = mw.ustring.char(0x2063) -- field separator (INVISIBLE SEPARATOR) local RS = mw.ustring.char(0x2064) -- record terminator (INVISIBLE PLUS) local AS = mw.ustring.char(0x2062) -- author-value separator (INVISIBLE TIMES)  local function isempty(s) 	return s == nil or s == &#039;&#039; end  -- plain-text split, no Lua pattern magic involved local function split_plain(str, sep) 	local parts = {} 	local start...&quot;</title>
		<link rel="alternate" type="text/html" href="https://en.teopedia.org/w-lib/index.php?title=Module:HPB-SB_authors&amp;diff=37227&amp;oldid=prev"/>
		<updated>2026-10-04T07:13:13Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  -- Separators matching Template:HPB-SB authors raw row local FS = mw.ustring.char(0x2063) -- field separator (INVISIBLE SEPARATOR) local RS = mw.ustring.char(0x2064) -- record terminator (INVISIBLE PLUS) local AS = mw.ustring.char(0x2062) -- author-value separator (INVISIBLE TIMES)  local function isempty(s) 	return s == nil or s == &amp;#039;&amp;#039; end  -- plain-text split, no Lua pattern magic involved local function split_plain(str, sep) 	local parts = {} 	local start...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Separators matching Template:HPB-SB authors raw row&lt;br /&gt;
local FS = mw.ustring.char(0x2063) -- field separator (INVISIBLE SEPARATOR)&lt;br /&gt;
local RS = mw.ustring.char(0x2064) -- record terminator (INVISIBLE PLUS)&lt;br /&gt;
local AS = mw.ustring.char(0x2062) -- author-value separator (INVISIBLE TIMES)&lt;br /&gt;
&lt;br /&gt;
local function isempty(s)&lt;br /&gt;
	return s == nil or s == &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- plain-text split, no Lua pattern magic involved&lt;br /&gt;
local function split_plain(str, sep)&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	local start = 1&lt;br /&gt;
	while true do&lt;br /&gt;
		local s, e = string.find(str, sep, start, true)&lt;br /&gt;
		if not s then&lt;br /&gt;
			table.insert(parts, string.sub(str, start))&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(parts, string.sub(str, start, s - 1))&lt;br /&gt;
		start = e + 1&lt;br /&gt;
	end&lt;br /&gt;
	return parts&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim(s)&lt;br /&gt;
	return (mw.ustring.gsub(s or &amp;#039;&amp;#039;, &amp;#039;^%s*(.-)%s*$&amp;#039;, &amp;#039;%1&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Fetch one page (offset-limited) of raw item rows via the helper template.&lt;br /&gt;
local function fetchRows(frame, offset, limit)&lt;br /&gt;
	local query = table.concat({&lt;br /&gt;
		&amp;#039;{{#ask: [[HPB SB item author::+]]&amp;#039;,&lt;br /&gt;
		&amp;#039;|?HPB SB item author=a|+sep=&amp;#039; .. AS,&lt;br /&gt;
		&amp;#039;|?HPB SB item ID=id&amp;#039;,&lt;br /&gt;
		&amp;#039;|?HPB SB volume=vol&amp;#039;,&lt;br /&gt;
		&amp;#039;|?HPB SB volume page=pg&amp;#039;,&lt;br /&gt;
		&amp;#039;|?HPB SB item title=t&amp;#039;,&lt;br /&gt;
		&amp;#039;|?HPB SB item untitled=u&amp;#039;,&lt;br /&gt;
		&amp;#039;|?HPB SB item source title=s&amp;#039;,&lt;br /&gt;
		&amp;#039;|?HPB SB item source details=d&amp;#039;,&lt;br /&gt;
		&amp;#039;|?HPB SB item publication date=p&amp;#039;,&lt;br /&gt;
		&amp;#039;|?#=page&amp;#039;,&lt;br /&gt;
		&amp;#039;| mainlabel=-&amp;#039;,&lt;br /&gt;
		&amp;#039;| link=none&amp;#039;,&lt;br /&gt;
		&amp;#039;| headers=hide&amp;#039;,&lt;br /&gt;
		&amp;#039;| named args=yes&amp;#039;,&lt;br /&gt;
		&amp;#039;| format=template&amp;#039;,&lt;br /&gt;
		&amp;#039;| template=HPB-SB authors raw row&amp;#039;,&lt;br /&gt;
		&amp;#039;| sort=HPB SB item author&amp;#039;,&lt;br /&gt;
		&amp;#039;| order=asc&amp;#039;,&lt;br /&gt;
		&amp;#039;| limit=&amp;#039; .. tostring(limit),&lt;br /&gt;
		&amp;#039;| offset=&amp;#039; .. tostring(offset),&lt;br /&gt;
		&amp;#039;}}&amp;#039;&lt;br /&gt;
	}, &amp;#039;\n&amp;#039;)&lt;br /&gt;
	local text = frame:preprocess(query)&lt;br /&gt;
	local records = split_plain(text, RS)&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	for _, rec in ipairs(records) do&lt;br /&gt;
		if rec ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			local f = split_plain(rec, FS)&lt;br /&gt;
			if #f &amp;gt;= 9 then&lt;br /&gt;
				table.insert(rows, {&lt;br /&gt;
					a = f[1], page = f[2], t = f[3], u = f[4],&lt;br /&gt;
					vol = f[5], pg = f[6], s = f[7], d = f[8], p = f[9]&lt;br /&gt;
				})&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return rows&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Collect ALL matching item rows across the whole dataset, working around&lt;br /&gt;
-- Semantic MediaWiki&amp;#039;s server-side per-query result cap ($smwgQMaxLimit)&lt;br /&gt;
-- by chaining several offset-paginated #ask calls. A page can legitimately&lt;br /&gt;
-- come back shorter than requested without being the last one, so a short&lt;br /&gt;
-- page is NOT treated as a stop condition -- only a truly empty page is.&lt;br /&gt;
local function fetchAllRows(frame)&lt;br /&gt;
	local allRows = {}&lt;br /&gt;
	local step = 500&lt;br /&gt;
	local offset = 0&lt;br /&gt;
	local maxIterations = 20 -- safety stop, far above what&amp;#039;s needed today&lt;br /&gt;
	for i = 1, maxIterations do&lt;br /&gt;
		local rows = fetchRows(frame, offset, step)&lt;br /&gt;
		if #rows == 0 then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		for _, r in ipairs(rows) do&lt;br /&gt;
			table.insert(allRows, r)&lt;br /&gt;
		end&lt;br /&gt;
		offset = offset + step&lt;br /&gt;
	end&lt;br /&gt;
	return allRows&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Build a name -&amp;gt; {items...} map, splitting any multi-valued author field.&lt;br /&gt;
local function groupByAuthor(rows)&lt;br /&gt;
	local map = {}&lt;br /&gt;
	local order = {}&lt;br /&gt;
	for _, r in ipairs(rows) do&lt;br /&gt;
		local names = split_plain(r.a, AS)&lt;br /&gt;
		for _, name in ipairs(names) do&lt;br /&gt;
			name = trim(name)&lt;br /&gt;
			if name ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				if not map[name] then&lt;br /&gt;
					map[name] = {}&lt;br /&gt;
					table.insert(order, name)&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(map[name], r)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return map, order&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderItem(frame, r)&lt;br /&gt;
	return frame:expandTemplate{ title = &amp;#039;HPB-SB author items&amp;#039;, args = {&lt;br /&gt;
		[&amp;#039;untitled&amp;#039;] = r.u, [&amp;#039;wiki page&amp;#039;] = r.page, [&amp;#039;title&amp;#039;] = r.t,&lt;br /&gt;
		[&amp;#039;source&amp;#039;] = r.s, [&amp;#039;details&amp;#039;] = r.d, [&amp;#039;publication&amp;#039;] = r.p,&lt;br /&gt;
		[&amp;#039;volume&amp;#039;] = r.vol, [&amp;#039;page&amp;#039;] = r.pg&lt;br /&gt;
	}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function showName(frame, name)&lt;br /&gt;
	local ok, result = pcall(function()&lt;br /&gt;
		return frame:expandTemplate{ title = &amp;#039;CTD show name&amp;#039;, args = { [1] = name, [&amp;#039;mode&amp;#039;] = &amp;#039;full LF&amp;#039; } }&lt;br /&gt;
	end)&lt;br /&gt;
	if ok and not isempty(result) then&lt;br /&gt;
		return result&lt;br /&gt;
	end&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Main entry point: {{#invoke: HPB-SB authors | list }}&lt;br /&gt;
function p.list(frame)&lt;br /&gt;
	local rows = fetchAllRows(frame)&lt;br /&gt;
	local map, order = groupByAuthor(rows)&lt;br /&gt;
	table.sort(order)&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, name in ipairs(order) do&lt;br /&gt;
		table.insert(out, &amp;#039;&amp;lt;h3&amp;gt;&amp;#039; .. showName(frame, name) .. &amp;#039;&amp;lt;/h3&amp;gt;&amp;#039;)&lt;br /&gt;
		table.insert(out, &amp;#039;&amp;lt;ol&amp;gt;&amp;#039;)&lt;br /&gt;
		local items = map[name]&lt;br /&gt;
		table.sort(items, function(a, b) return (a.t or &amp;#039;&amp;#039;) &amp;lt; (b.t or &amp;#039;&amp;#039;) end)&lt;br /&gt;
		for _, r in ipairs(items) do&lt;br /&gt;
			table.insert(out, renderItem(frame, r))&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(out, &amp;#039;&amp;lt;/ol&amp;gt;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(out, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Diagnostic helper: {{#invoke: HPB-SB authors | debug }}&lt;br /&gt;
function p.debug(frame)&lt;br /&gt;
	local rows = fetchAllRows(frame)&lt;br /&gt;
	local map, order = groupByAuthor(rows)&lt;br /&gt;
	table.sort(order)&lt;br /&gt;
	local out = {}&lt;br /&gt;
	table.insert(out, &amp;#039;Total rows fetched: &amp;#039; .. tostring(#rows))&lt;br /&gt;
	table.insert(out, &amp;#039;Unique authors: &amp;#039; .. tostring(#order))&lt;br /&gt;
	table.insert(out, &amp;#039;Has &amp;quot;Kingsford, Anna&amp;quot;: &amp;#039; .. tostring(map[&amp;#039;Kingsford, Anna&amp;#039;] ~= nil))&lt;br /&gt;
	table.insert(out, &amp;#039;Has &amp;quot;Kislingbury, Emily&amp;quot;: &amp;#039; .. tostring(map[&amp;#039;Kislingbury, Emily&amp;#039;] ~= nil))&lt;br /&gt;
	return table.concat(out, &amp;#039;&amp;lt;br&amp;gt;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>24pmBot1</name></author>
	</entry>
</feed>