<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.2swagg.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AFunni_categorizer2</id>
	<title>Module:Funni categorizer2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.2swagg.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AFunni_categorizer2"/>
	<link rel="alternate" type="text/html" href="https://wiki.2swagg.net/index.php?title=Module:Funni_categorizer2&amp;action=history"/>
	<updated>2026-11-13T00:49:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.2swagg.net/index.php?title=Module:Funni_categorizer2&amp;diff=1631&amp;oldid=prev</id>
		<title>Bulgogi2 at 02:23, 11 October 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.2swagg.net/index.php?title=Module:Funni_categorizer2&amp;diff=1631&amp;oldid=prev"/>
		<updated>2026-10-11T02:23:46Z</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 02:23, 11 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-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&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;local 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;local p = {}&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;local core = require(&amp;#039;Module:Infobox categorizer&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;local core = require(&amp;#039;Module:Infobox categorizer&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local config = mw.loadData(&#039;Module:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Soyjak &lt;/del&gt;categorizer2/config&#039;)&lt;/div&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;local config = mw.loadData(&#039;Module:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Funni &lt;/ins&gt;categorizer2/config&#039;)&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; 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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local where = &#039;Module:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Soyjak &lt;/del&gt;categorizer2/config&#039;&lt;/div&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;local where = &#039;Module:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Funni &lt;/ins&gt;categorizer2/config&#039;&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;local dims = core.need(config, &amp;#039;dimensions&amp;#039;, where)&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;local dims = core.need(config, &amp;#039;dimensions&amp;#039;, where)&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;local maintenance = core.need(config, &amp;#039;maintenance&amp;#039;, where)&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;local maintenance = core.need(config, &amp;#039;maintenance&amp;#039;, where)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff:1.41:old-1583:rev-1631:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Bulgogi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.2swagg.net/index.php?title=Module:Funni_categorizer2&amp;diff=1583&amp;oldid=prev</id>
		<title>Bulgogi2: Created page with &quot;local p = {} local core = require(&#039;Module:Infobox categorizer&#039;) local config = mw.loadData(&#039;Module:Soyjak categorizer2/config&#039;)  local where = &#039;Module:Soyjak categorizer2/config&#039; local dims = core.need(config, &#039;dimensions&#039;, where) local maintenance = core.need(config, &#039;maintenance&#039;, where) local invalidOverrideCat = core.need(maintenance, &#039;invalidOverride&#039;, where .. &#039;.maintenance&#039;) local usingOverrideCat = core.need(maintenance, &#039;usingOverride&#039;, where .. &#039;.maintenance&#039;)...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.2swagg.net/index.php?title=Module:Funni_categorizer2&amp;diff=1583&amp;oldid=prev"/>
		<updated>2026-10-11T00:56:27Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {} local core = require(&amp;#039;Module:Infobox categorizer&amp;#039;) local config = mw.loadData(&amp;#039;Module:Soyjak categorizer2/config&amp;#039;)  local where = &amp;#039;Module:Soyjak categorizer2/config&amp;#039; local dims = core.need(config, &amp;#039;dimensions&amp;#039;, where) local maintenance = core.need(config, &amp;#039;maintenance&amp;#039;, where) local invalidOverrideCat = core.need(maintenance, &amp;#039;invalidOverride&amp;#039;, where .. &amp;#039;.maintenance&amp;#039;) local usingOverrideCat = core.need(maintenance, &amp;#039;usingOverride&amp;#039;, where .. &amp;#039;.maintenance&amp;#039;)...&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;
local core = require(&amp;#039;Module:Infobox categorizer&amp;#039;)&lt;br /&gt;
local config = mw.loadData(&amp;#039;Module:Soyjak categorizer2/config&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local where = &amp;#039;Module:Soyjak categorizer2/config&amp;#039;&lt;br /&gt;
local dims = core.need(config, &amp;#039;dimensions&amp;#039;, where)&lt;br /&gt;
local maintenance = core.need(config, &amp;#039;maintenance&amp;#039;, where)&lt;br /&gt;
local invalidOverrideCat = core.need(maintenance, &amp;#039;invalidOverride&amp;#039;, where .. &amp;#039;.maintenance&amp;#039;)&lt;br /&gt;
local usingOverrideCat = core.need(maintenance, &amp;#039;usingOverride&amp;#039;, where .. &amp;#039;.maintenance&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local D = {}&lt;br /&gt;
for _, key in ipairs({&lt;br /&gt;
	&amp;#039;type&amp;#039;,&lt;br /&gt;
	&amp;#039;year&amp;#039;,&lt;br /&gt;
	&amp;#039;site&amp;#039;,&lt;br /&gt;
	&amp;#039;parent&amp;#039;,&lt;br /&gt;
	&amp;#039;posts&amp;#039;,&lt;br /&gt;
}) do&lt;br /&gt;
	D[key] = core.need(dims, key, where .. &amp;#039;.dimensions&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local types = core.compileAliasSet({ core.need(config, &amp;#039;types&amp;#039;, where) }, { match = &amp;#039;substring&amp;#039; })&lt;br /&gt;
local sites = core.compileAliasSet({ mw.loadData(&amp;#039;Module:Infobox categorizer/sites&amp;#039;) }, { match = &amp;#039;substring&amp;#039; })&lt;br /&gt;
local variants = core.compileAliasSet({ mw.loadData(&amp;#039;Module:Infobox categorizer/variants&amp;#039;) })&lt;br /&gt;
local siteBucket = core.fromMap(config.siteBuckets or {}) -- unused now, for future folding split sites back into Other-site categories&lt;br /&gt;
local misuseCfg = core.need(config, &amp;#039;misuse&amp;#039;, where)&lt;br /&gt;
local misuse =&lt;br /&gt;
	core.compileAliasSet({ { { category = &amp;#039;trend&amp;#039;, aliases = core.need(misuseCfg, &amp;#039;aliases&amp;#039;, where .. &amp;#039;.misuse&amp;#039;) } } })&lt;br /&gt;
core.need(misuseCfg, &amp;#039;warning&amp;#039;, where .. &amp;#039;.misuse&amp;#039;)&lt;br /&gt;
core.need(misuseCfg, &amp;#039;maintenance&amp;#039;, where .. &amp;#039;.misuse&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local function aliasOverride(compiled)&lt;br /&gt;
	return function(value)&lt;br /&gt;
		return core.parseAliasSetOverride(value, compiled)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function typeOverride(value)&lt;br /&gt;
	return core.parseExactOverride(value, { &amp;#039;variant&amp;#039;, &amp;#039;subvariant&amp;#039; })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function variantCanon(value)&lt;br /&gt;
	local found, valid = core.parseAliasSetOverride(value, variants)&lt;br /&gt;
	return valid and found[1] or value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function maint(dim, key)&lt;br /&gt;
	return dim.maintenance and dim.maintenance[key]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._categories(args)&lt;br /&gt;
	local out = core.newList()&lt;br /&gt;
	local function has(field)&lt;br /&gt;
		return core.trim(args[field]) ~= &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function emit(pattern, state)&lt;br /&gt;
		for _, value in ipairs(state.values) do&lt;br /&gt;
			out:add(core.fill(pattern, value))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local typeMatches = core.matchAliasSets(args.type, types)&lt;br /&gt;
	local misused = #core.matchAliasSets(args.type, misuse) &amp;gt; 0&lt;br /&gt;
	if misused then&lt;br /&gt;
		mw.addWarning(misuseCfg.warning)&lt;br /&gt;
		out:add(misuseCfg.maintenance)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local detectedType = &amp;#039;variant&amp;#039;&lt;br /&gt;
	for _, value in ipairs(typeMatches) do&lt;br /&gt;
		if value == &amp;#039;subvariant&amp;#039; then detectedType = &amp;#039;subvariant&amp;#039; end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local kind = core.resolve {&lt;br /&gt;
		candidates = { detectedType },&lt;br /&gt;
		override = args.category_type,&lt;br /&gt;
		parse = typeOverride,&lt;br /&gt;
		max = 1,&lt;br /&gt;
	}&lt;br /&gt;
	local classification = kind.values[1]&lt;br /&gt;
	if kind.source ~= &amp;#039;override&amp;#039; and has(&amp;#039;type&amp;#039;) and #typeMatches == 0 and not misused then&lt;br /&gt;
		out:add(maint(D.type, &amp;#039;unrecognized&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local year = core.resolve {&lt;br /&gt;
		candidates = core.findYears(args.origin),&lt;br /&gt;
		override = args.category_year,&lt;br /&gt;
		parse = core.parseYearOverride,&lt;br /&gt;
		suppress = args.noyearcat, -- backward compatability&lt;br /&gt;
		max = 1,&lt;br /&gt;
	}&lt;br /&gt;
	if year.source ~= &amp;#039;suppressed&amp;#039; then&lt;br /&gt;
		if year.values[1] then&lt;br /&gt;
			out:add(core.fill(D.year.name[classification], year.values[1]))&lt;br /&gt;
		else&lt;br /&gt;
			out:add(D.year.undated[classification])&lt;br /&gt;
		end&lt;br /&gt;
		if year.overflow then out:add(maint(D.year, &amp;#039;overflow&amp;#039;)) end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local site = core.resolve {&lt;br /&gt;
		candidates = core.matchAliasSets(args.origin, sites),&lt;br /&gt;
		override = args.category_site,&lt;br /&gt;
		parse = aliasOverride(sites),&lt;br /&gt;
		canon = siteBucket,&lt;br /&gt;
	}&lt;br /&gt;
	emit(D.site.name[classification], site)&lt;br /&gt;
	if site.source == &amp;#039;detected&amp;#039; and site.undetected then out:add(maint(D.site, &amp;#039;unrecognized&amp;#039;)) end&lt;br /&gt;
&lt;br /&gt;
	local parent = core.resolve {&lt;br /&gt;
		candidates = core.findLinkTargets(args.based_on),&lt;br /&gt;
		override = args.category_parent,&lt;br /&gt;
		parse = core.parseLinkTargetOverride,&lt;br /&gt;
		canon = variantCanon,&lt;br /&gt;
		applicable = classification == &amp;#039;subvariant&amp;#039;,&lt;br /&gt;
		suppress = args.noparentcat,&lt;br /&gt;
		max = 3,&lt;br /&gt;
	}&lt;br /&gt;
	if parent.source == &amp;#039;detected&amp;#039; or parent.source == &amp;#039;override&amp;#039; then&lt;br /&gt;
		emit(D.parent.name, parent)&lt;br /&gt;
		if #parent.values == 0 then out:add(maint(D.parent, &amp;#039;undetected&amp;#039;)) end&lt;br /&gt;
		if parent.overflow then out:add(maint(D.parent, &amp;#039;overflow&amp;#039;)) end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if classification == &amp;#039;variant&amp;#039; then&lt;br /&gt;
		local counts = core.readDataAttr(args.booru_posts, &amp;#039;boorusearch-count&amp;#039;)&lt;br /&gt;
		if #counts == 0 then&lt;br /&gt;
			out:add(maint(D.posts, &amp;#039;missing&amp;#039;))&lt;br /&gt;
		else&lt;br /&gt;
			out:add(core.pickBand(core.parseNumber(counts[1]), D.posts.bands))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if core.anyCustomized(kind, year, site, parent) then out:add(usingOverrideCat) end&lt;br /&gt;
&lt;br /&gt;
	if core.anyInvalid(kind, year, site, parent) then out:add(invalidOverrideCat) end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = core.makeMain(p._categories, config.namespaces)&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Bulgogi2</name></author>
	</entry>
</feed>