<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://wiki-raamsdonk.nl/index.php?action=history&amp;feed=atom&amp;title=Module%3ACategory_description</id>
	<title>Module:Category description - Bewerkingsoverzicht</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-raamsdonk.nl/index.php?action=history&amp;feed=atom&amp;title=Module%3ACategory_description"/>
	<link rel="alternate" type="text/html" href="https://wiki-raamsdonk.nl/index.php?title=Module:Category_description&amp;action=history"/>
	<updated>2026-05-07T19:08:32Z</updated>
	<subtitle>Bewerkingsoverzicht voor deze pagina op de wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://wiki-raamsdonk.nl/index.php?title=Module:Category_description&amp;diff=128758&amp;oldid=prev</id>
		<title>Colani: 1 versie geïmporteerd: Category:Commons templates-i18n</title>
		<link rel="alternate" type="text/html" href="https://wiki-raamsdonk.nl/index.php?title=Module:Category_description&amp;diff=128758&amp;oldid=prev"/>
		<updated>2024-07-29T10:03:03Z</updated>

		<summary type="html">&lt;p&gt;1 versie geïmporteerd: Category:Commons templates-i18n&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nieuwe pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- =============================================================================&lt;br /&gt;
-- Routines for the automatic generation of complete category description pages&lt;br /&gt;
-- with navigation, using Wikidata&lt;br /&gt;
-- =============================================================================&lt;br /&gt;
&lt;br /&gt;
require(&amp;quot;strict&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local arguments    = require &amp;quot;Module:Arguments&amp;quot;&lt;br /&gt;
local autocat      = require &amp;quot;Module:Autocat&amp;quot;&lt;br /&gt;
local navbox       = require &amp;quot;Module:Navbox&amp;quot;&lt;br /&gt;
local wdLabel      = require &amp;quot;Module:Wikidata label&amp;quot;&lt;br /&gt;
local wdStatements = require &amp;quot;Module:Wikidata statements&amp;quot;&lt;br /&gt;
local specialRules = require &amp;quot;Module:Navigation by Wikidata/special rules&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
-- Escape magic characters for a regular expression&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function regExEscape(pattern)&lt;br /&gt;
	return string.gsub(pattern, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$])&amp;quot;, &amp;quot;%%%1&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
-- Convert a pattern into a Lua-style regular expression&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeRegEx(pattern, variable)&lt;br /&gt;
	-- Change underlines into spaces&lt;br /&gt;
	local regex = string.gsub(pattern, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
	-- Escape any magic characters in the pattern&lt;br /&gt;
	regex = regExEscape(regex)&lt;br /&gt;
	-- Change &amp;lt;&amp;lt;...&amp;gt;&amp;gt; into regex placeholders&lt;br /&gt;
	-- We use non-greedy matching (&amp;quot;..-&amp;quot; instead of &amp;quot;.*&amp;quot;), see for example&lt;br /&gt;
	-- the category &amp;quot;Seasons in Ebenthal in Kärnten&amp;quot; with two &amp;quot;in&amp;quot;&lt;br /&gt;
	regex = string.gsub(regex, &amp;quot;&amp;lt;&amp;lt;&amp;quot; .. variable .. &amp;quot;&amp;gt;&amp;gt;&amp;quot;, &amp;quot;(..-)&amp;quot;)&lt;br /&gt;
	regex = string.gsub(regex, &amp;quot;&amp;lt;&amp;lt;[^&amp;gt;]+&amp;gt;&amp;gt;&amp;quot;, &amp;quot;..-&amp;quot;)&lt;br /&gt;
	-- Add beginning and end marks&lt;br /&gt;
	regex = &amp;quot;^&amp;quot; .. regex .. &amp;quot;$&amp;quot;&lt;br /&gt;
	return regex&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
-- Find out the pattern variables and their content for the current page&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getVariableList(pagename, pattern)&lt;br /&gt;
	local variableList = {} 	-- sorted&lt;br /&gt;
	local variableTable = {}	-- unsorted but indexed by variable name&lt;br /&gt;
	for placeholder in string.gmatch(pattern, &amp;quot;&amp;lt;&amp;lt;([^&amp;gt;]+)&amp;gt;&amp;gt;&amp;quot;) do&lt;br /&gt;
		local variable = {}&lt;br /&gt;
		-- Split the placeholder at each &amp;quot;:&amp;quot; to separate modifiers&lt;br /&gt;
		for part in string.gmatch(placeholder, &amp;quot;[^:]+&amp;quot;) do&lt;br /&gt;
			if not variable.name then&lt;br /&gt;
				variable.name = part&lt;br /&gt;
			elseif part == &amp;quot;hyphen&amp;quot; then&lt;br /&gt;
				variable.hyphen = true&lt;br /&gt;
			elseif part == &amp;quot;the&amp;quot; then&lt;br /&gt;
				variable.the = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- Determine variable content in current page name and assigned Wikidata item id&lt;br /&gt;
		variable.content = assert(&lt;br /&gt;
			string.match(pagename, makeRegEx(pattern, placeholder)),&lt;br /&gt;
			&amp;quot;“&amp;quot; .. pagename .. &amp;quot;” does not match “&amp;quot; .. pattern .. &amp;quot;”&amp;quot;&lt;br /&gt;
		)&lt;br /&gt;
		-- Remove hyphens if necessary&lt;br /&gt;
		if variable.hyphen then&lt;br /&gt;
			variable.content = string.gsub(variable.content, &amp;quot;-&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Optionally remove the &amp;quot;the&amp;quot; prefix from the category name, but only&lt;br /&gt;
		-- if the unmodified category name does not exist; this keeps names like&lt;br /&gt;
		-- &amp;quot;The Bahamas&amp;quot; unchanged&lt;br /&gt;
		variable.item = mw.wikibase.getEntityIdForTitle(&amp;#039;Category:&amp;#039; .. variable.content)&lt;br /&gt;
		if not variable.item and variable.the and string.find(variable.content, &amp;quot;the &amp;quot;) == 1 then&lt;br /&gt;
			variable.content = string.sub(variable.content, 4)&lt;br /&gt;
			variable.item = mw.wikibase.getEntityIdForTitle(&amp;#039;Category:&amp;#039; .. variable.content)&lt;br /&gt;
		end&lt;br /&gt;
		-- Find out which wikidata entity matches the variable content&lt;br /&gt;
		if not variable.item then&lt;br /&gt;
			error(&amp;quot;Page “Category:&amp;quot; .. variable.content .. &amp;quot;” not found&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		variable.item = wdStatements.getOneItemId(variable.item, &amp;quot;P301&amp;quot;) or variable.item&lt;br /&gt;
		table.insert(variableList, variable)&lt;br /&gt;
		variableTable[variable.name] = variable&lt;br /&gt;
	end&lt;br /&gt;
	return variableList, variableTable&lt;br /&gt;
end&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
-- Fill in variable contents in a pattern, potentially keeping one placeholder&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function fillVariables(pattern, variableTable, keep, replacement)&lt;br /&gt;
	local result = {pattern = pattern}&lt;br /&gt;
	for placeholder in string.gmatch(pattern, &amp;quot;&amp;lt;&amp;lt;([^&amp;gt;]+)&amp;gt;&amp;gt;&amp;quot;) do&lt;br /&gt;
		local variable&lt;br /&gt;
		local modifiers = {}&lt;br /&gt;
		-- Split the placeholder at each &amp;quot;:&amp;quot; to separate modifiers&lt;br /&gt;
		for part in string.gmatch(placeholder, &amp;quot;[^:]+&amp;quot;) do&lt;br /&gt;
			if not variable then&lt;br /&gt;
				variable = assert(variableTable[part],&lt;br /&gt;
					&amp;quot;Unknown placeholder “&amp;quot; .. placeholder .. &amp;quot;”&amp;quot;)&lt;br /&gt;
			elseif part == &amp;quot;label&amp;quot; then&lt;br /&gt;
				modifiers.label = &amp;quot;yes&amp;quot;&lt;br /&gt;
			elseif part == &amp;quot;hyphen&amp;quot; then&lt;br /&gt;
				modifiers.hyphen = &amp;quot;yes&amp;quot;&lt;br /&gt;
			elseif part == &amp;quot;the&amp;quot; then&lt;br /&gt;
				modifiers.the = &amp;quot;yes&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if variable.name == keep then&lt;br /&gt;
			-- This becomes the complete argument list for Navigation_by/...&lt;br /&gt;
			result.item = variable.item&lt;br /&gt;
			-- Remove modifiers from placeholder&lt;br /&gt;
			result.pattern = string.gsub(result.pattern, placeholder, replacement)&lt;br /&gt;
			result.hyphen = modifiers.hyphen&lt;br /&gt;
			result.the = modifiers.the&lt;br /&gt;
			result.style = &amp;quot;block&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			-- Fill in the actual value for placeholder&lt;br /&gt;
			local value, lang&lt;br /&gt;
			if modifiers.label then&lt;br /&gt;
				value, lang = mw.wikibase.getLabelWithLang(variable.item)&lt;br /&gt;
				if not value then&lt;br /&gt;
					value = variable.item&lt;br /&gt;
					lang = &amp;quot;en&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				value = variable.content&lt;br /&gt;
				lang = &amp;quot;en&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			if not modifiers.label or lang == &amp;quot;en&amp;quot; then&lt;br /&gt;
				if modifiers.hyphen then&lt;br /&gt;
					value = value:gsub(&amp;quot; &amp;quot;, &amp;quot;-&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				if modifiers.the and specialRules[variable.item] and specialRules[variable.item].the then&lt;br /&gt;
					value = &amp;quot;the &amp;quot; .. value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			result.pattern = string.gsub(result.pattern, &amp;quot;&amp;lt;&amp;lt;&amp;quot; .. placeholder .. &amp;quot;&amp;gt;&amp;gt;&amp;quot;, value)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
-- Determine navigation data for a page and a pattern&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getTitleAndNavigationBlocks(args, variableList, variableTable)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local title = args.title or &amp;quot;&amp;quot;&lt;br /&gt;
	local blocks = &amp;quot;&amp;quot;&lt;br /&gt;
	for index, variable in ipairs(variableList) do&lt;br /&gt;
		-- Compile title line&lt;br /&gt;
		if args[variable.name .. &amp;quot;:title&amp;quot;] ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
			if title ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				title = title .. &amp;quot; - &amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			title = title .. wdLabel._getLabel(variable.item, nil, &amp;quot;wikipedia&amp;quot;, &amp;quot;ucfirst&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Build navigation blocks&lt;br /&gt;
		local navigationArgs = fillVariables(args.pattern, variableTable, variable.name, args[variable.name] or variable.name)&lt;br /&gt;
		-- Level &amp;quot;siblings&amp;quot;&lt;br /&gt;
		navigationArgs.level = &amp;quot;siblings&amp;quot;&lt;br /&gt;
		if args[variable.name .. &amp;quot;:parent:pattern&amp;quot;] then&lt;br /&gt;
			local parentArgs = fillVariables(args[variable.name .. &amp;quot;:parent:pattern&amp;quot;], variableTable, variable.name, variable.name)&lt;br /&gt;
			navigationArgs[&amp;quot;title:pattern&amp;quot;] = parentArgs.pattern&lt;br /&gt;
			navigationArgs[&amp;quot;title:hyphen&amp;quot;] = parentArgs.hyphen&lt;br /&gt;
			navigationArgs[&amp;quot;title:the&amp;quot;] = parentArgs.the&lt;br /&gt;
		end&lt;br /&gt;
		navigationArgs.redlinks = args[variable.name .. &amp;quot;:redlinks&amp;quot;]&lt;br /&gt;
		if args[variable.name .. &amp;quot;:autocat&amp;quot;] then&lt;br /&gt;
			navigationArgs[&amp;quot;autocat&amp;quot;] = args[variable.name .. &amp;quot;:autocat&amp;quot;]&lt;br /&gt;
			navigationArgs[&amp;quot;autocat:parent&amp;quot;] = args[variable.name .. &amp;quot;:autocat:parent&amp;quot;]&lt;br /&gt;
			if args[variable.name .. &amp;quot;:autocat:candidates&amp;quot;] then&lt;br /&gt;
				navigationArgs[&amp;quot;autocat:candidates&amp;quot;] = fillVariables(args[variable.name .. &amp;quot;:autocat:candidates&amp;quot;], variableTable).pattern&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local block = frame:expandTemplate{&lt;br /&gt;
			title = &amp;quot;Navigation by/&amp;quot; .. variable.name,&lt;br /&gt;
			args = navigationArgs&lt;br /&gt;
		}&lt;br /&gt;
		blocks = blocks .. block .. &amp;quot;\n&amp;quot;&lt;br /&gt;
		navigationArgs[&amp;quot;title:pattern&amp;quot;] = nil&lt;br /&gt;
		navigationArgs[&amp;quot;title:hyphen&amp;quot;] = nil&lt;br /&gt;
		navigationArgs[&amp;quot;title:the&amp;quot;] = nil&lt;br /&gt;
		navigationArgs[&amp;quot;autocat&amp;quot;] = nil&lt;br /&gt;
		navigationArgs[&amp;quot;autocat:parent&amp;quot;] = nil&lt;br /&gt;
		navigationArgs[&amp;quot;autocat:candidates&amp;quot;] = nil&lt;br /&gt;
		-- Level &amp;quot;children&amp;quot;&lt;br /&gt;
		if args[variable.name .. &amp;quot;:children&amp;quot;] ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
			navigationArgs.level = &amp;quot;children&amp;quot;&lt;br /&gt;
			if args[variable.name .. &amp;quot;:children:pattern&amp;quot;] then&lt;br /&gt;
				local childrenArgs = fillVariables(args[variable.name .. &amp;quot;:children:pattern&amp;quot;], variableTable, variable.name, variable.name)&lt;br /&gt;
				navigationArgs[&amp;quot;title:pattern&amp;quot;] = navigationArgs.pattern&lt;br /&gt;
				navigationArgs[&amp;quot;title:hyphen&amp;quot;] = navigationArgs.hyphen&lt;br /&gt;
				navigationArgs[&amp;quot;title:the&amp;quot;] = navigationArgs.the&lt;br /&gt;
				navigationArgs.pattern = childrenArgs.pattern&lt;br /&gt;
				navigationArgs.hyphen = childrenArgs.hyphen&lt;br /&gt;
				navigationArgs.the = childrenArgs.the&lt;br /&gt;
			end&lt;br /&gt;
			navigationArgs.redlinks = args[variable.name .. &amp;quot;:children:redlinks&amp;quot;] or args[variable.name .. &amp;quot;:redlinks&amp;quot;]&lt;br /&gt;
			local block = frame:expandTemplate{&lt;br /&gt;
				title = &amp;quot;Navigation by/&amp;quot; .. variable.name,&lt;br /&gt;
				args = navigationArgs&lt;br /&gt;
			}&lt;br /&gt;
			blocks = blocks .. block .. &amp;quot;\n&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return title, blocks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
-- Build a box with description and navigation blocks&lt;br /&gt;
-- Arguments: name, title, description, remarks, pattern, pagename&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p._categoryDescription(args)&lt;br /&gt;
	if not args.pattern then&lt;br /&gt;
		error(&amp;quot;Missing “pattern” parameter&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	local categories = &amp;quot;&amp;quot;&lt;br /&gt;
	local boxargs = {&lt;br /&gt;
		name = args.name,&lt;br /&gt;
		title = args.title,&lt;br /&gt;
		titlestyle = &amp;quot;font-size: 114%;&amp;quot;,&lt;br /&gt;
		above = args.description,&lt;br /&gt;
		abovestyle = &amp;quot;font-size: 114%;&amp;quot;,&lt;br /&gt;
		listclass = &amp;quot;hlist&amp;quot;,&lt;br /&gt;
		below = args.remarks,&lt;br /&gt;
		belowstyle = &amp;quot;font-size: 114%;&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	if args.lang then&lt;br /&gt;
		boxargs.lang = args.lang&lt;br /&gt;
		boxargs.dir = mw.language.new(args.lang):getDir()&lt;br /&gt;
	end&lt;br /&gt;
	if args.pagename then&lt;br /&gt;
		local variableList, variableTable = getVariableList(args.pagename, args.pattern)&lt;br /&gt;
		if args.autocat and mw.title.getCurrentTitle().text == args.pagename then&lt;br /&gt;
			categories = autocat.autoCat(fillVariables(args.autocat, variableTable).pattern)&lt;br /&gt;
		end&lt;br /&gt;
		if boxargs.above then&lt;br /&gt;
			boxargs.above = fillVariables(boxargs.above, variableTable).pattern&lt;br /&gt;
		end&lt;br /&gt;
		if boxargs.below then&lt;br /&gt;
			boxargs.below = fillVariables(boxargs.below, variableTable).pattern&lt;br /&gt;
		end&lt;br /&gt;
		local blocks&lt;br /&gt;
		boxargs.title, blocks = getTitleAndNavigationBlocks(args, variableList, variableTable)&lt;br /&gt;
		local count = 0&lt;br /&gt;
		for line in string.gmatch(blocks, &amp;quot;[^\n]+&amp;quot;) do&lt;br /&gt;
			if string.sub(line, 1, 1) == &amp;quot;;&amp;quot; then&lt;br /&gt;
				line = string.gsub(line, &amp;quot;^; *&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				count = count + 1&lt;br /&gt;
				boxargs[&amp;quot;group&amp;quot; .. tostring(count)] = line&lt;br /&gt;
				boxargs[&amp;quot;list&amp;quot; .. tostring(count)] = &amp;quot;&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				if count == 0 then&lt;br /&gt;
					count = count + 1&lt;br /&gt;
					boxargs[&amp;quot;list&amp;quot; .. tostring(count)] = &amp;quot;&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				boxargs[&amp;quot;list&amp;quot; .. tostring(count)] = (&lt;br /&gt;
					boxargs[&amp;quot;list&amp;quot; .. tostring(count)] .. line .. &amp;quot;\n&amp;quot;&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return categories .. navbox._navbox(boxargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
-- Function wrapper for usage with #invoke&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.categoryDescription(frame)&lt;br /&gt;
	return p._categoryDescription(arguments.getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =============================================================================&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Colani</name></author>
	</entry>
</feed>