<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://159.13.49.45/index.php?action=history&amp;feed=atom&amp;title=Module%3ALabelled_list_hatnote</id>
	<title>Module:Labelled list hatnote - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://159.13.49.45/index.php?action=history&amp;feed=atom&amp;title=Module%3ALabelled_list_hatnote"/>
	<link rel="alternate" type="text/html" href="http://159.13.49.45/index.php?title=Module:Labelled_list_hatnote&amp;action=history"/>
	<updated>2026-04-03T21:58:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://159.13.49.45/index.php?title=Module:Labelled_list_hatnote&amp;diff=371&amp;oldid=prev</id>
		<title>Nat: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://159.13.49.45/index.php?title=Module:Labelled_list_hatnote&amp;diff=371&amp;oldid=prev"/>
		<updated>2025-04-07T11:03:04Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&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 11:03, 7 April 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key mediawiki:diff:1.41:old-370:rev-371 --&gt;
&lt;/table&gt;</summary>
		<author><name>Nat</name></author>
	</entry>
	<entry>
		<id>http://159.13.49.45/index.php?title=Module:Labelled_list_hatnote&amp;diff=370&amp;oldid=prev</id>
		<title>wikipedia&gt;Pppery: Don&#039;t Lua error when out of expensive parser function calls</title>
		<link rel="alternate" type="text/html" href="http://159.13.49.45/index.php?title=Module:Labelled_list_hatnote&amp;diff=370&amp;oldid=prev"/>
		<updated>2025-01-09T20:41:44Z</updated>

		<summary type="html">&lt;p&gt;Don&amp;#039;t Lua error when out of expensive parser function calls&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                               Labelled list                                --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module does the core work of creating a hatnote composed of a list    --&lt;br /&gt;
-- prefixed by a colon-terminated label, i.e. &amp;quot;LABEL: [andList of pages]&amp;quot;,    --&lt;br /&gt;
-- for {{see also}} and similar templates.                                    --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local mHatnote = require(&amp;#039;Module:Hatnote&amp;#039;)&lt;br /&gt;
local mHatlist = require(&amp;#039;Module:Hatnote list&amp;#039;)&lt;br /&gt;
local mArguments --initialize lazily&lt;br /&gt;
local yesno --initialize lazily&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Defaults global to this module&lt;br /&gt;
local defaults = {&lt;br /&gt;
	label = &amp;#039;See also&amp;#039;, --Final fallback for label argument&lt;br /&gt;
	labelForm = &amp;#039;%s: %s&amp;#039;,&lt;br /&gt;
	prefixes = {&amp;#039;label&amp;#039;, &amp;#039;label &amp;#039;, &amp;#039;l&amp;#039;},&lt;br /&gt;
	template = &amp;#039;Module:Labelled list hatnote&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Localizable message strings&lt;br /&gt;
local msg = {&lt;br /&gt;
	errorSuffix = &amp;#039;#Errors&amp;#039;,&lt;br /&gt;
	noInputWarning = &amp;#039;no page names specified&amp;#039;,&lt;br /&gt;
	noOutputWarning =&lt;br /&gt;
		&amp;quot;&amp;#039;&amp;#039;&amp;#039;[[%s]] — no output: none of the target pages exist.&amp;#039;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Helper function that pre-combines display parameters into page arguments.&lt;br /&gt;
-- Also compresses sparse arrays, as a desirable side-effect.&lt;br /&gt;
function p.preprocessDisplays (args, prefixes)&lt;br /&gt;
	-- Prefixes specify which parameters, in order, to check for display options&lt;br /&gt;
	-- They each have numbers auto-appended, e.g. &amp;#039;label1&amp;#039;, &amp;#039;label 1&amp;#039;, &amp;amp; &amp;#039;l1&amp;#039;&lt;br /&gt;
	prefixes = prefixes or defaults.prefixes&lt;br /&gt;
	local indices = {}&lt;br /&gt;
	local sparsePages = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if type(k) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			indices[#indices + 1] = k&lt;br /&gt;
			local display&lt;br /&gt;
			for i = 1, #prefixes do&lt;br /&gt;
				display = args[prefixes[i] .. k]&lt;br /&gt;
				if display then break end&lt;br /&gt;
			end&lt;br /&gt;
			sparsePages[k] = display and&lt;br /&gt;
				string.format(&amp;#039;%s|%s&amp;#039;, string.gsub(v, &amp;#039;|.*$&amp;#039;, &amp;#039;&amp;#039;), display) or v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(indices)&lt;br /&gt;
	local pages = {}&lt;br /&gt;
	for k, v in ipairs(indices) do pages[#pages + 1] = sparsePages[v] end&lt;br /&gt;
	return pages&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Helper function to get a page target from a processed page string&lt;br /&gt;
--e.g. &amp;quot;Page|Label&amp;quot; → &amp;quot;Page&amp;quot; or &amp;quot;Target&amp;quot; → &amp;quot;Target&amp;quot;&lt;br /&gt;
local function getTarget(pagename)&lt;br /&gt;
 	local pipe = string.find(pagename, &amp;#039;|&amp;#039;)&lt;br /&gt;
	return string.sub(pagename, 0, pipe and pipe - 1 or nil)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Produces a labelled pages-list hatnote.&lt;br /&gt;
-- The main frame (template definition) takes 1 or 2 arguments, for a singular&lt;br /&gt;
-- and (optionally) plural label respectively:&lt;br /&gt;
-- * {{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}}&lt;br /&gt;
-- The resulting template takes pagename &amp;amp; label parameters normally.&lt;br /&gt;
function p.labelledList (frame)&lt;br /&gt;
	mArguments = require(&amp;#039;Module:Arguments&amp;#039;)&lt;br /&gt;
	yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
	local labels = {frame.args[1] or defaults.label}&lt;br /&gt;
	labels[2] = frame.args[2] or labels[1]&lt;br /&gt;
	labels[3] = frame.args[3] --no defaulting&lt;br /&gt;
	labels[4] = frame.args[4] --no defaulting&lt;br /&gt;
	local template = frame:getParent():getTitle()&lt;br /&gt;
	local args = mArguments.getArgs(frame, {parentOnly = true})&lt;br /&gt;
	local pages = p.preprocessDisplays(args)&lt;br /&gt;
	local options = {&lt;br /&gt;
		category = yesno(args.category),&lt;br /&gt;
		extraclasses = frame.args.extraclasses,&lt;br /&gt;
		ifexists = yesno(frame.args.ifexists),&lt;br /&gt;
		namespace = frame.args.namespace or args.namespace,&lt;br /&gt;
		selfref = yesno(frame.args.selfref or args.selfref),&lt;br /&gt;
		template = template&lt;br /&gt;
	}&lt;br /&gt;
	return p._labelledList(pages, labels, options)&lt;br /&gt;
end&lt;br /&gt;
local function exists(title)&lt;br /&gt;
	local success, result = pcall(function() return title.exists end)&lt;br /&gt;
	if success then&lt;br /&gt;
		return result&lt;br /&gt;
	else&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._labelledList (pages, labels, options)&lt;br /&gt;
	if options.ifexists then&lt;br /&gt;
		for k = #pages, 1, -1 do --iterate backwards to allow smooth removals&lt;br /&gt;
			local v = pages[k]&lt;br /&gt;
			local title = mw.title.new(getTarget(v), namespace)&lt;br /&gt;
			if (v == &amp;#039;&amp;#039;) or title == nil or not exists(title) then&lt;br /&gt;
				table.remove(pages, k)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	labels = labels or {}&lt;br /&gt;
	label = (#pages == 1 and labels[1] or labels[2]) or defaults.label&lt;br /&gt;
	for k, v in pairs(pages) do &lt;br /&gt;
		if mHatnote.findNamespaceId(v) ~= 0 then&lt;br /&gt;
			label =&lt;br /&gt;
				(&lt;br /&gt;
					#pages == 1 and&lt;br /&gt;
					(labels[3] or labels[1] or defaults.label) or&lt;br /&gt;
					(labels[4] or labels[2] or defaults.label)&lt;br /&gt;
				) or defaults.label&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #pages == 0 then&lt;br /&gt;
		if options.ifexists then&lt;br /&gt;
			mw.addWarning(&lt;br /&gt;
				string.format(&lt;br /&gt;
					msg.noOutputWarning, options.template or defaults.template&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
			return &amp;#039;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			return mHatnote.makeWikitextError(&lt;br /&gt;
				msg.noInputWarning,&lt;br /&gt;
				(options.template or defaults.template) .. msg.errorSuffix,&lt;br /&gt;
				options.category&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local text = string.format(&lt;br /&gt;
		options.labelForm or defaults.labelForm,&lt;br /&gt;
		label,&lt;br /&gt;
		mHatlist.andList(pages, true)&lt;br /&gt;
	)&lt;br /&gt;
	local hnOptions = {&lt;br /&gt;
		extraclasses = options.extraclasses,&lt;br /&gt;
		selfref = options.selfref&lt;br /&gt;
	}&lt;br /&gt;
	return mHatnote._hatnote(text, hnOptions)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wikipedia&gt;Pppery</name></author>
	</entry>
</feed>