<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://4strona.duckdns.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Modu%C5%82%3ADesignAssignmentsAPI</id>
	<title>Moduł:DesignAssignmentsAPI - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://4strona.duckdns.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Modu%C5%82%3ADesignAssignmentsAPI"/>
	<link rel="alternate" type="text/html" href="http://4strona.duckdns.org/wiki/index.php?title=Modu%C5%82:DesignAssignmentsAPI&amp;action=history"/>
	<updated>2026-07-30T16:22:12Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>http://4strona.duckdns.org/wiki/index.php?title=Modu%C5%82:DesignAssignmentsAPI&amp;diff=157&amp;oldid=prev</id>
		<title>Fuhrer: 1 wersja</title>
		<link rel="alternate" type="text/html" href="http://4strona.duckdns.org/wiki/index.php?title=Modu%C5%82:DesignAssignmentsAPI&amp;diff=157&amp;oldid=prev"/>
		<updated>2026-07-24T10:04:21Z</updated>

		<summary type="html">&lt;p&gt;1 wersja&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&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;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Wersja z 10:04, 24 lip 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;pl&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Brak różnic)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key 3strona_wiki:diff:1.41:old-156:rev-157 --&gt;
&lt;/table&gt;</summary>
		<author><name>Fuhrer</name></author>
	</entry>
	<entry>
		<id>http://4strona.duckdns.org/wiki/index.php?title=Modu%C5%82:DesignAssignmentsAPI&amp;diff=156&amp;oldid=prev</id>
		<title>mediawiki&gt;NBaca-WMF o 04:45, 7 sty 2026</title>
		<link rel="alternate" type="text/html" href="http://4strona.duckdns.org/wiki/index.php?title=Modu%C5%82:DesignAssignmentsAPI&amp;diff=156&amp;oldid=prev"/>
		<updated>2026-01-07T04:45:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Module:DesignAssignmentsAPI&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function trim(value)&lt;br /&gt;
	if not value then return &amp;quot;&amp;quot; end&lt;br /&gt;
	return mw.text.trim(value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function normalizeWhitespace(value)&lt;br /&gt;
	return trim((value or &amp;quot;&amp;quot;):gsub(&amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderWikitext(value)&lt;br /&gt;
	if not value or value == &amp;quot;&amp;quot; then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rendered = tostring(value)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;%[%[([^%]|]+)|([^%]]+)%]%]&amp;quot;, &amp;quot;%2&amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;%[%[([^%]]+)%]%]&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;%[https?://[^%s%]]+%s+([^%]]+)%]&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;%[https?://[^%]]+%]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;{{%s*[^|}]+%s*|%s*([^}]+)%s*}}&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;{{[^}]+}}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;&amp;lt;%s*[Bb][Rr]%s*/?&amp;gt;&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
	rendered = rendered:gsub(&amp;quot;&amp;lt;[^&amp;gt;]+&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	rendered = mw.text.decode(rendered)&lt;br /&gt;
	return normalizeWhitespace(rendered)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function splitNames(value)&lt;br /&gt;
	local cleaned = value or &amp;quot;&amp;quot;&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;%b()&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;[Bb][Aa][Cc][Kk][Ff][Ii][Ll][Ll][Ee][Dd]%s+[Bb][Yy]&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;%s+[Aa][Nn][Dd]%s+&amp;quot;, &amp;quot;|&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;%s+[Ww][Ii][Tt][Hh]%s+&amp;quot;, &amp;quot;|&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;%s*/%s*&amp;quot;, &amp;quot;|&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;%s*&amp;amp;%s*&amp;quot;, &amp;quot;|&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;%s*;%s*&amp;quot;, &amp;quot;|&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;%s*%+%s*&amp;quot;, &amp;quot;|&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;%s*,%s*&amp;quot;, &amp;quot;|&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local parts = mw.text.split(cleaned, &amp;quot;|&amp;quot;, true)&lt;br /&gt;
	local names = {}&lt;br /&gt;
	local seen = {}&lt;br /&gt;
	for _, part in ipairs(parts) do&lt;br /&gt;
		local name = normalizeWhitespace(part)&lt;br /&gt;
		if name ~= &amp;quot;&amp;quot; and not seen[name] then&lt;br /&gt;
			seen[name] = true&lt;br /&gt;
			table.insert(names, name)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return names&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function extractDesignerNames(cellText)&lt;br /&gt;
	local names = {}&lt;br /&gt;
	local seen = {}&lt;br /&gt;
&lt;br /&gt;
	for link in cellText:gmatch(&amp;quot;%[%[([^%]]-)%]%]&amp;quot;) do&lt;br /&gt;
		local target, display = link:match(&amp;quot;^(.-)|(.+)$&amp;quot;)&lt;br /&gt;
		local value = display or target&lt;br /&gt;
		local name = normalizeWhitespace(renderWikitext(value))&lt;br /&gt;
		if name ~= &amp;quot;&amp;quot; and not seen[name] then&lt;br /&gt;
			seen[name] = true&lt;br /&gt;
			table.insert(names, name)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if #names &amp;gt; 0 then&lt;br /&gt;
		return names&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rawText = normalizeWhitespace(renderWikitext(cellText))&lt;br /&gt;
	if rawText == &amp;quot;&amp;quot; then&lt;br /&gt;
		return {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return splitNames(rawText)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function extractManagerNames(cellText)&lt;br /&gt;
	local source = nil&lt;br /&gt;
	for line in cellText:gmatch(&amp;quot;[^\n]+&amp;quot;) do&lt;br /&gt;
		local lower = line:lower()&lt;br /&gt;
		if lower:find(&amp;quot;area managed&amp;quot;) or lower:find(&amp;quot;managed by&amp;quot;) then&lt;br /&gt;
			source = line&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	source = source or cellText&lt;br /&gt;
	local cleaned = normalizeWhitespace(renderWikitext(source))&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;^area%s+managed%s+by%s*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;^managed%s+by%s*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;area%s+managed%s+by%s*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;%s+area%s+manager.*$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	cleaned = cleaned:gsub(&amp;quot;backfilled by.*$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	cleaned = normalizeWhitespace(cleaned)&lt;br /&gt;
	if cleaned == &amp;quot;&amp;quot; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local names = splitNames(cleaned)&lt;br /&gt;
	if #names == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(names, &amp;quot;, &amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function extractTeamName(cellText)&lt;br /&gt;
	local bold = cellText:match(&amp;quot;&amp;#039;&amp;#039;&amp;#039;(.-)&amp;#039;&amp;#039;&amp;#039;&amp;quot;)&lt;br /&gt;
	if bold then&lt;br /&gt;
		return normalizeWhitespace(renderWikitext(bold))&lt;br /&gt;
	end&lt;br /&gt;
	return normalizeWhitespace(renderWikitext(cellText))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function splitLineCells(line)&lt;br /&gt;
	local isHeader = line:match(&amp;quot;^%s*!&amp;quot;) ~= nil&lt;br /&gt;
	local delimiter = isHeader and &amp;quot;!!&amp;quot; or &amp;quot;||&amp;quot;&lt;br /&gt;
	local rawParts = mw.text.split(line, delimiter, true)&lt;br /&gt;
	local cells = {}&lt;br /&gt;
&lt;br /&gt;
	for _, part in ipairs(rawParts) do&lt;br /&gt;
		local content = part:gsub(&amp;quot;^%s*[!|]%s*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		local attr, value = content:match(&amp;quot;^%s*([^|]+)%|%s*(.-)%s*$&amp;quot;)&lt;br /&gt;
		if attr and attr:match(&amp;quot;=&amp;quot;) then&lt;br /&gt;
			content = value&lt;br /&gt;
		end&lt;br /&gt;
		content = trim(content)&lt;br /&gt;
		table.insert(cells, content)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return cells&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parseTable(lines, startIdx)&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	local current = nil&lt;br /&gt;
	local inRow = false&lt;br /&gt;
&lt;br /&gt;
	local function pushRow()&lt;br /&gt;
		if current and #current &amp;gt; 0 then&lt;br /&gt;
			table.insert(rows, current)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i = startIdx, #lines do&lt;br /&gt;
		local line = lines[i]&lt;br /&gt;
		if line:match(&amp;quot;^%s*|}&amp;quot;) then&lt;br /&gt;
			pushRow()&lt;br /&gt;
			break&lt;br /&gt;
		elseif line:match(&amp;quot;^%s*|%-&amp;quot;) then&lt;br /&gt;
			pushRow()&lt;br /&gt;
			current = {}&lt;br /&gt;
			inRow = true&lt;br /&gt;
		elseif line:match(&amp;quot;^%s*|%+&amp;quot;) then&lt;br /&gt;
			-- caption; ignore&lt;br /&gt;
		elseif not inRow then&lt;br /&gt;
			-- header or pre-row content; ignore&lt;br /&gt;
		elseif line:match(&amp;quot;^%s*[!|]&amp;quot;) then&lt;br /&gt;
			local cells = splitLineCells(line)&lt;br /&gt;
			for _, cell in ipairs(cells) do&lt;br /&gt;
				table.insert(current, cell)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if current and #current &amp;gt; 0 then&lt;br /&gt;
				current[#current] = current[#current] .. &amp;quot;\n&amp;quot; .. line&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return rows&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function findProductTeamsTable(lines)&lt;br /&gt;
	local productIndex = nil&lt;br /&gt;
	for i, line in ipairs(lines) do&lt;br /&gt;
		if line:lower():match(&amp;quot;^===%s*product teams%s*===&amp;quot;) then&lt;br /&gt;
			productIndex = i&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not productIndex then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i = productIndex, #lines do&lt;br /&gt;
		local line = lines[i]&lt;br /&gt;
		if line:match(&amp;quot;^%s*{|&amp;quot;) and line:match(&amp;quot;wikitable&amp;quot;) then&lt;br /&gt;
			return i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addTeam(record, teamName)&lt;br /&gt;
	for _, existing in ipairs(record.teams) do&lt;br /&gt;
		if existing == teamName then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(record.teams, teamName)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.json()&lt;br /&gt;
	local title = mw.title.new(&amp;quot;Design&amp;quot;)&lt;br /&gt;
	if not title then&lt;br /&gt;
		return mw.text.jsonEncode({ error = &amp;quot;Page not found&amp;quot; })&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local content = title:getContent()&lt;br /&gt;
	if not content then&lt;br /&gt;
		return mw.text.jsonEncode({ error = &amp;quot;No content&amp;quot; })&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local lines = mw.text.split(content, &amp;quot;\n&amp;quot;, true)&lt;br /&gt;
	local tableStart = findProductTeamsTable(lines)&lt;br /&gt;
	if not tableStart then&lt;br /&gt;
		return mw.text.jsonEncode({ error = &amp;quot;Product teams table not found&amp;quot; })&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rows = parseTable(lines, tableStart + 1)&lt;br /&gt;
	local designers = {}&lt;br /&gt;
	local areaManagers = {}&lt;br /&gt;
&lt;br /&gt;
	local currentAreaName = nil&lt;br /&gt;
	local currentManager = nil&lt;br /&gt;
&lt;br /&gt;
	for _, row in ipairs(rows) do&lt;br /&gt;
		local cellCount = #row&lt;br /&gt;
		if cellCount &amp;gt; 0 then&lt;br /&gt;
			local teamCell = row[1] or &amp;quot;&amp;quot;&lt;br /&gt;
			local managerCell = row[cellCount] or &amp;quot;&amp;quot;&lt;br /&gt;
			local designerCell = row[math.min(3, cellCount)] or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
			local managerText = renderWikitext(managerCell):lower()&lt;br /&gt;
			if managerText:find(&amp;quot;area managed&amp;quot;) then&lt;br /&gt;
				local areaName = nil&lt;br /&gt;
				local boldArea = managerCell:match(&amp;quot;&amp;#039;&amp;#039;&amp;#039;(.-)&amp;#039;&amp;#039;&amp;#039;&amp;quot;)&lt;br /&gt;
				if boldArea then&lt;br /&gt;
					areaName = normalizeWhitespace(renderWikitext(boldArea))&lt;br /&gt;
				else&lt;br /&gt;
					local withoutItalics = managerCell:gsub(&amp;quot;&amp;#039;&amp;#039;.-&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
					areaName = normalizeWhitespace(renderWikitext(withoutItalics))&lt;br /&gt;
					areaName = areaName:gsub(&amp;quot;area managed by.*$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
					areaName = normalizeWhitespace(areaName)&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				local managerNames = extractManagerNames(managerCell)&lt;br /&gt;
				if managerNames then&lt;br /&gt;
					local names = splitNames(managerNames)&lt;br /&gt;
					local primaryName = names[1]&lt;br /&gt;
					currentManager = primaryName&lt;br /&gt;
					currentAreaName = areaName ~= &amp;quot;&amp;quot; and areaName or primaryName&lt;br /&gt;
					if primaryName then&lt;br /&gt;
						areaManagers[mw.ustring.lower(primaryName)] = {&lt;br /&gt;
							name = primaryName,&lt;br /&gt;
							area = currentAreaName or &amp;quot;&amp;quot;&lt;br /&gt;
						}&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local names = extractDesignerNames(designerCell)&lt;br /&gt;
			local teamName = extractTeamName(teamCell)&lt;br /&gt;
&lt;br /&gt;
			for _, name in ipairs(names) do&lt;br /&gt;
				if name ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					local key = mw.ustring.lower(name)&lt;br /&gt;
					local existing = designers[key]&lt;br /&gt;
					if existing then&lt;br /&gt;
						addTeam(existing, teamName)&lt;br /&gt;
						table.sort(existing.teams)&lt;br /&gt;
						if not existing.manager and currentManager then&lt;br /&gt;
							existing.manager = currentManager&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						designers[key] = {&lt;br /&gt;
							name = name,&lt;br /&gt;
							teams = { teamName },&lt;br /&gt;
							manager = currentManager&lt;br /&gt;
						}&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for key, info in pairs(areaManagers) do&lt;br /&gt;
		local existing = designers[key]&lt;br /&gt;
		local normalizedArea = (info.area ~= &amp;quot;&amp;quot; and info.area) or &amp;quot;Product &amp;amp; Technology&amp;quot;&lt;br /&gt;
		if existing then&lt;br /&gt;
			addTeam(existing, normalizedArea)&lt;br /&gt;
			table.sort(existing.teams)&lt;br /&gt;
			existing.manager = &amp;quot;Rita Ho&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			designers[key] = {&lt;br /&gt;
				name = info.name,&lt;br /&gt;
				teams = { normalizedArea },&lt;br /&gt;
				manager = &amp;quot;Rita Ho&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ritaKey = mw.ustring.lower(&amp;quot;Rita Ho&amp;quot;)&lt;br /&gt;
	local rita = designers[ritaKey]&lt;br /&gt;
	if rita then&lt;br /&gt;
		addTeam(rita, &amp;quot;Product &amp;amp; Technology&amp;quot;)&lt;br /&gt;
		table.sort(rita.teams)&lt;br /&gt;
		rita.manager = &amp;quot;Selena Deckelmann&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		designers[ritaKey] = {&lt;br /&gt;
			name = &amp;quot;Rita Ho&amp;quot;,&lt;br /&gt;
			teams = { &amp;quot;Product &amp;amp; Technology&amp;quot; },&lt;br /&gt;
			manager = &amp;quot;Selena Deckelmann&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local list = {}&lt;br /&gt;
	for _, record in pairs(designers) do&lt;br /&gt;
		table.sort(record.teams)&lt;br /&gt;
		table.insert(list, record)&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(list, function(a, b) return a.name &amp;lt; b.name end)&lt;br /&gt;
&lt;br /&gt;
	return mw.text.jsonEncode(list)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>mediawiki&gt;NBaca-WMF</name></author>
	</entry>
</feed>