<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://test.st34an.tech/index.php?action=history&amp;feed=atom&amp;title=Module%3AUtilities</id>
	<title>Module:Utilities - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://test.st34an.tech/index.php?action=history&amp;feed=atom&amp;title=Module%3AUtilities"/>
	<link rel="alternate" type="text/html" href="https://test.st34an.tech/index.php?title=Module:Utilities&amp;action=history"/>
	<updated>2026-04-10T17:37:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://test.st34an.tech/index.php?title=Module:Utilities&amp;diff=39&amp;oldid=prev</id>
		<title>Jsrs701: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://test.st34an.tech/index.php?title=Module:Utilities&amp;diff=39&amp;oldid=prev"/>
		<updated>2026-04-10T07:25:49Z</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 07:25, 10 April 2026&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 mediawikidb:diff:1.41:old-38:rev-39 --&gt;
&lt;/table&gt;</summary>
		<author><name>Jsrs701</name></author>
	</entry>
	<entry>
		<id>https://test.st34an.tech/index.php?title=Module:Utilities&amp;diff=38&amp;oldid=prev</id>
		<title>bob&gt;Djpwikiadmin at 00:34, 7 September 2023</title>
		<link rel="alternate" type="text/html" href="https://test.st34an.tech/index.php?title=Module:Utilities&amp;diff=38&amp;oldid=prev"/>
		<updated>2023-09-07T00:34:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local decode = mw.text.decode&lt;br /&gt;
local u = mw.ustring.char&lt;br /&gt;
&lt;br /&gt;
local data = mw.loadData(&amp;quot;Module:utilities/data&amp;quot;)&lt;br /&gt;
local notneeded = data.notneeded&lt;br /&gt;
local neededhassubpage = data.neededhassubpage&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
function export.require_when_needed(text)&lt;br /&gt;
	return setmetatable({}, {&lt;br /&gt;
		__index = function(t, k)&lt;br /&gt;
			t = require(text)&lt;br /&gt;
			return t[k]&lt;br /&gt;
		end,&lt;br /&gt;
		__call = function(t, ...)&lt;br /&gt;
			t = require(text)&lt;br /&gt;
			return t(...)&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A helper function to escape magic characters in a string.&lt;br /&gt;
-- Magic characters: ^$()%.[]*+-?&lt;br /&gt;
function export.pattern_escape(text)&lt;br /&gt;
	if type(text) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		text = text.args[1]&lt;br /&gt;
	end&lt;br /&gt;
	return (text:gsub(&amp;quot;[%^$()%%.[%]*+%-?]&amp;quot;, &amp;quot;%%%0&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A helper function to resolve HTML entities into plaintext.&lt;br /&gt;
-- Iterates over entities in a string, and decodes them into plaintext. We use iteration (instead of decoding the whole string in one go) because it means we can avoid loading the lookup string unnecessarily, as it uses more memory.&lt;br /&gt;
local entities&lt;br /&gt;
function export.get_entities(text)&lt;br /&gt;
	return (text:gsub(&amp;quot;&amp;amp;(#?[%w]-);&amp;quot;, function(entity)&lt;br /&gt;
		-- Check if mw.text.decode is able to decode the entity.&lt;br /&gt;
		if (&lt;br /&gt;
			entity == &amp;quot;lt&amp;quot; or&lt;br /&gt;
			entity == &amp;quot;gt&amp;quot; or&lt;br /&gt;
			entity == &amp;quot;amp&amp;quot; or&lt;br /&gt;
			entity == &amp;quot;quot&amp;quot; or&lt;br /&gt;
			entity == &amp;quot;nbsp&amp;quot;&lt;br /&gt;
		) then&lt;br /&gt;
			return decode(&amp;quot;&amp;amp;&amp;quot; .. entity .. &amp;quot;;&amp;quot;)&lt;br /&gt;
		-- Catch hex entities beginning with &amp;amp;#X, which are valid but unsupported by mw.text.decode.&lt;br /&gt;
		elseif entity:sub(1, 1) == &amp;quot;#&amp;quot; then&lt;br /&gt;
			entity = entity:lower()&lt;br /&gt;
			return decode(&amp;quot;&amp;amp;&amp;quot; .. entity .. &amp;quot;;&amp;quot;)&lt;br /&gt;
		-- [[Module:utilities/data/entities]] is a lookup string of every named HTML entity (except the ones listed above), as they aren&amp;#039;t covered by mw.text.decode.&lt;br /&gt;
		-- mw.text.decode can decode lots of named entities if the second parameter is true, but around 600 are still not covered, and it&amp;#039;s less efficient than doing it this way anyway.&lt;br /&gt;
		else&lt;br /&gt;
			entities = entities or require(&amp;quot;Module:utilities/data/entities&amp;quot;)&lt;br /&gt;
			return entities:match(&amp;quot;%f[%Z]&amp;quot; .. entity .. &amp;quot;(%Z+)&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A helper function to convert plaintext into HTML entities where these match the characters given in set.&lt;br /&gt;
-- By default, this resolves any pre-existing entities into plaintext first, to allow mixed input and to avoid accidental double-conversion. This can be turned off with the raw parameter.&lt;br /&gt;
function export.make_entities(text, set, raw)&lt;br /&gt;
	text = not raw and export.get_entities(text) or text&lt;br /&gt;
	return mw.text.encode(text, set)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A helper function to strip wiki markup, giving the plaintext of what is displayed on the page.&lt;br /&gt;
function export.get_plaintext(text)&lt;br /&gt;
	text = text&lt;br /&gt;
		:gsub(&amp;quot;%[%[&amp;quot;, &amp;quot;\1&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;%]%]&amp;quot;, &amp;quot;\2&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	-- Remove strip markers and HTML tags.&lt;br /&gt;
	text = mw.text.unstrip(text)&lt;br /&gt;
		:gsub(&amp;quot;&amp;lt;[^&amp;lt;&amp;gt;\1\2]+&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
	-- Parse internal links for the display text, and remove categories.&lt;br /&gt;
	text = require(&amp;quot;Module:links&amp;quot;).remove_links(text)&lt;br /&gt;
	&lt;br /&gt;
	-- Remove files.&lt;br /&gt;
	for _, falsePositive in ipairs({&amp;quot;File&amp;quot;, &amp;quot;Image&amp;quot;}) do&lt;br /&gt;
		text = text:gsub(&amp;quot;\1&amp;quot; .. falsePositive .. &amp;quot;:[^\1\2]+\2&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Parse external links for the display text.&lt;br /&gt;
	text = text:gsub(&amp;quot;%[(https?://[^%[%]]+)%]&amp;quot;,&lt;br /&gt;
		function(capture)&lt;br /&gt;
			return capture:match(&amp;quot;https?://[^%s%]]+%s([^%]]+)&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
		end)&lt;br /&gt;
	&lt;br /&gt;
	text = text&lt;br /&gt;
		:gsub(&amp;quot;\1&amp;quot;, &amp;quot;[[&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;\2&amp;quot;, &amp;quot;]]&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	-- Any remaining square brackets aren&amp;#039;t involved in links, but must be escaped to avoid creating new links.&lt;br /&gt;
	text = text:gsub(&amp;quot;[%[%]]&amp;quot;, mw.text.nowiki)&lt;br /&gt;
		&lt;br /&gt;
	-- Strip bold, italics and soft hyphens.&lt;br /&gt;
	text = text&lt;br /&gt;
		:gsub(&amp;quot;(&amp;#039;*)&amp;#039;&amp;#039;&amp;#039;(.-&amp;#039;*)&amp;#039;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;%1%2&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;(&amp;#039;*)&amp;#039;&amp;#039;(.-&amp;#039;*)&amp;#039;&amp;#039;&amp;quot;, &amp;quot;%1%2&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;­&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	-- Get any HTML entities.&lt;br /&gt;
	-- Note: don&amp;#039;t decode URL percent encoding, as it shouldn&amp;#039;t be used in display text and may cause problems if % is used.&lt;br /&gt;
	text = export.get_entities(text)&lt;br /&gt;
	&lt;br /&gt;
	return mw.text.trim(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.plain_gsub(text, pattern, replacement)&lt;br /&gt;
	local invoked = false&lt;br /&gt;
	&lt;br /&gt;
	if type(text) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		invoked = true&lt;br /&gt;
		&lt;br /&gt;
		if text.args then&lt;br /&gt;
			local frame = text&lt;br /&gt;
			&lt;br /&gt;
			local params = {&lt;br /&gt;
				[1] = {},&lt;br /&gt;
				[2] = {},&lt;br /&gt;
				[3] = { allow_empty = true },&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame.args, params, nil, &amp;quot;utilities&amp;quot;, &amp;quot;plain_gsub&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			text = args[1]&lt;br /&gt;
			pattern = args[2]&lt;br /&gt;
			replacement = args[3]&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;quot;If the first argument to plain_gsub is a table, it should be a frame object.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if not ( type(pattern) == &amp;quot;string&amp;quot; or type(pattern) == &amp;quot;number&amp;quot; ) then&lt;br /&gt;
			error(&amp;quot;The second argument to plain_gsub should be a string or a number.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if not ( type(replacement) == &amp;quot;string&amp;quot; or type(replacement) == &amp;quot;number&amp;quot; ) then&lt;br /&gt;
			error(&amp;quot;The third argument to plain_gsub should be a string or a number.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	pattern = export.pattern_escape(pattern)&lt;br /&gt;
	&lt;br /&gt;
	local gsub = require(&amp;quot;Module:string utilities&amp;quot;).gsub&lt;br /&gt;
	if invoked then&lt;br /&gt;
		return (gsub(text, pattern, replacement))&lt;br /&gt;
	else&lt;br /&gt;
		return gsub(text, pattern, replacement)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Format the categories with the appropriate sort key. CATEGORIES is a list of&lt;br /&gt;
categories.&lt;br /&gt;
	-- LANG is an object encapsulating a language; if nil, the object for&lt;br /&gt;
	   language code &amp;#039;und&amp;#039; (undetermined) will be used.&lt;br /&gt;
	-- SORT_KEY is placed in the category invocation, and indicates how the&lt;br /&gt;
	   page will sort in the respective category. Normally this should be nil,&lt;br /&gt;
	   and a default sort key based on the subpage name (the part after the&lt;br /&gt;
	   colon) will be used.&lt;br /&gt;
	-- SORT_BASE lets you override the default sort key used when SORT_KEY is&lt;br /&gt;
	   nil. Normally, this should be nil, and a language-specific default sort&lt;br /&gt;
	   key is computed from the subpage name (e.g. for Russian this converts&lt;br /&gt;
	   Cyrillic ё to a string consisting of Cyrillic е followed by U+10FFFF,&lt;br /&gt;
	   so that effectively ё sorts after е instead of the default Wikimedia&lt;br /&gt;
	   sort, which (I think) is based on Unicode sort order and puts ё after я,&lt;br /&gt;
	   the last letter of the Cyrillic alphabet.&lt;br /&gt;
	-- FORCE_OUTPUT forces normal output in all namespaces. Normally, nothing&lt;br /&gt;
	   is output if the page isn&amp;#039;t in the main, Appendix:, Reconstruction: or&lt;br /&gt;
	   Citations: namespaces.&lt;br /&gt;
	-- SC is a script object; if nil, the default will be used from the sort&lt;br /&gt;
	   base.&lt;br /&gt;
]]&lt;br /&gt;
function export.format_categories(categories, lang, sort_key, sort_base, force_output, sc)&lt;br /&gt;
	if type(lang) == &amp;quot;table&amp;quot; and not lang.getCode then&lt;br /&gt;
		error(&amp;quot;The second argument to format_categories should be a language object.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local title_obj = mw.title.getCurrentTitle()	&lt;br /&gt;
	local allowedNamespaces = {&lt;br /&gt;
		[0] = true, [100] = true, [114] = true, [118] = true -- (main), Appendix, Citations, Reconstruction&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if force_output or allowedNamespaces[title_obj.namespace] or title_obj.prefixedText == &amp;quot;Wiktionary:Sandbox&amp;quot; then&lt;br /&gt;
		local headword_data = mw.loadData(&amp;quot;Module:headword/data&amp;quot;)&lt;br /&gt;
		local pagename = headword_data.pagename&lt;br /&gt;
		local pagename_defaultsort = headword_data.pagename_defaultsort&lt;br /&gt;
		&lt;br /&gt;
		-- Generate a default sort key.&lt;br /&gt;
		if sort_key ~= &amp;quot;-&amp;quot; then&lt;br /&gt;
			if not lang then&lt;br /&gt;
				lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(&amp;quot;und&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			sort_base = (lang:makeSortKey(sort_base or pagename, sc))&lt;br /&gt;
			if sort_key and sort_key ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				-- Gather some statistics regarding sort keys&lt;br /&gt;
				if not no_track and sort_key:uupper() == sort_base then&lt;br /&gt;
					table.insert(categories, &amp;quot;Sort key tracking/redundant&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				sort_key = sort_base&lt;br /&gt;
			end&lt;br /&gt;
			-- If the sort key is empty, remove it.&lt;br /&gt;
			if sort_key == &amp;quot;&amp;quot; then&lt;br /&gt;
				sort_key = nil&lt;br /&gt;
			end&lt;br /&gt;
		-- If the sort key is &amp;quot;-&amp;quot;, bypass the process of generating a sort key altogether. This is desirable when categorising (e.g.) translation requests, as the pages to be categorised are always in English/Translingual.&lt;br /&gt;
		else&lt;br /&gt;
			sort_key = sort_base and sort_base:uupper() or pagename_defaultsort&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local out_categories = {}&lt;br /&gt;
		for key, cat in ipairs(categories) do&lt;br /&gt;
			out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. (sort_key and &amp;quot;|&amp;quot; .. sort_key or &amp;quot;&amp;quot;) .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.catfix(lang, sc)&lt;br /&gt;
	if not lang then&lt;br /&gt;
		require(&amp;quot;Module:debug&amp;quot;).track(&amp;quot;catfix/no lang&amp;quot;)&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif type(lang) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		require(&amp;quot;Module:debug&amp;quot;).track(&amp;quot;catfix/lang not table&amp;quot;)&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local canonicalName = lang:getCanonicalName() or error(&amp;#039;The first argument to the function &amp;quot;catfix&amp;quot; should be a language object from Module:languages.&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if sc and not sc.getCode then&lt;br /&gt;
		error(&amp;#039;The second argument to the function &amp;quot;catfix&amp;quot; should be a script object from Module:scripts.&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- To add script classes to links on pages created by category boilerplate templates.&lt;br /&gt;
	if not sc then&lt;br /&gt;
		sc = data.catfix_scripts[lang:getCode()]&lt;br /&gt;
		if sc then&lt;br /&gt;
			sc = require(&amp;quot;Module:scripts&amp;quot;).getByCode(sc)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;lt;span id=\&amp;quot;catfix\&amp;quot; style=\&amp;quot;display:none;\&amp;quot; class=\&amp;quot;CATFIX-&amp;quot; .. mw.uri.anchorEncode(canonicalName) .. &amp;quot;\&amp;quot;&amp;gt;&amp;quot; ..&lt;br /&gt;
		require(&amp;quot;Module:script utilities&amp;quot;).tag_text(&amp;quot;&amp;amp;nbsp;&amp;quot;, lang, sc, nil) ..&lt;br /&gt;
		&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.catfix_template(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {},&lt;br /&gt;
		[2] = { alias_of = &amp;quot;sc&amp;quot; },&lt;br /&gt;
		[&amp;quot;sc&amp;quot;] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params, nil, &amp;quot;utilities&amp;quot;, &amp;quot;catfix_template&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(args[1]) or require(&amp;quot;Module:languages&amp;quot;).err(args[1], 1)&lt;br /&gt;
	&lt;br /&gt;
	local sc = args.sc&lt;br /&gt;
	if sc then&lt;br /&gt;
		sc = require(&amp;quot;Module:scripts&amp;quot;).getByCode(sc) or error(&amp;#039;The script code &amp;quot;&amp;#039; .. sc .. &amp;#039;&amp;quot;, provided in the second parameter, is not valid.&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return export.catfix(lang, sc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Not exporting because it is not used yet.&lt;br /&gt;
local function getDateTense(frame) &lt;br /&gt;
	local name_num_mapping = {[&amp;quot;January&amp;quot;] = 1, [&amp;quot;February&amp;quot;] = 2, [&amp;quot;March&amp;quot;] = 3, [&amp;quot;April&amp;quot;] = 4, [&amp;quot;May&amp;quot;] = 5, [&amp;quot;June&amp;quot;] = 6, &lt;br /&gt;
		[&amp;quot;July&amp;quot;] = 7, [&amp;quot;August&amp;quot;] = 8, [&amp;quot;September&amp;quot;] = 9, [&amp;quot;October&amp;quot;] = 10, [&amp;quot;November&amp;quot;] = 11, [&amp;quot;December&amp;quot;] = 12, &lt;br /&gt;
		[1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 5, [6] = 6, [7] = 7, [8] = 8, [9] = 9, [10] = 10, [11] = 11, [12] = 12}&lt;br /&gt;
	local month = name_num_mapping[frame.args[2]]&lt;br /&gt;
	local date = os.time({year = frame.args[1], day = frame.args[3], month = month})&lt;br /&gt;
	local today = os.time() -- 12 AM/PM&lt;br /&gt;
	local diff = os.difftime(date, today)&lt;br /&gt;
	local daylength = 24 * 3600&lt;br /&gt;
	&lt;br /&gt;
	if diff &amp;lt; -daylength / 2 then return &amp;quot;past&amp;quot;&lt;br /&gt;
	else &lt;br /&gt;
		if diff &amp;gt; daylength / 2  then return &amp;quot;future&amp;quot;&lt;br /&gt;
		else return &amp;quot;present&amp;quot; end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.make_id(lang, str)&lt;br /&gt;
	--[[	If called with invoke, first argument is a frame object.&lt;br /&gt;
			If called by a module, first argument is a language object. ]]&lt;br /&gt;
	local invoked = false&lt;br /&gt;
	&lt;br /&gt;
	if type(lang) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		if lang.args then&lt;br /&gt;
			invoked = true&lt;br /&gt;
			&lt;br /&gt;
			local frame = lang&lt;br /&gt;
			&lt;br /&gt;
			local params = {&lt;br /&gt;
				[1] = {},&lt;br /&gt;
				[2] = {},&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params, nil, &amp;quot;utilities&amp;quot;, &amp;quot;make_id&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local langCode = args[1]&lt;br /&gt;
			str = args[2]&lt;br /&gt;
			&lt;br /&gt;
			local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			lang = m_languages.getByCode(langCode) or m_languages.err(langCode, 1)&lt;br /&gt;
		elseif not lang.getCanonicalName then&lt;br /&gt;
			error(&amp;quot;The first argument to make_id should be a language object.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not ( type(str) == &amp;quot;string&amp;quot; or type(str) == &amp;quot;number&amp;quot; ) then&lt;br /&gt;
		error(&amp;quot;The second argument to make_id should be a string or a number.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local id = require(&amp;quot;Module:senseid&amp;quot;).anchor(lang, str)&lt;br /&gt;
	&lt;br /&gt;
	if invoked then&lt;br /&gt;
		return &amp;#039;&amp;lt;li class=&amp;quot;senseid&amp;quot; id=&amp;quot;&amp;#039; .. id .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return id&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Given a type (as a string) and an arbitrary number of entities, checks whether all of those entities are language, family, script, writing system or Wikimedia language objects. Useful for error handling in functions that require one of these kinds of object.&lt;br /&gt;
-- If noErr is set, the function returns false instead of throwing an error, which allows customised error handling to be done in the calling function.&lt;br /&gt;
function export.check_object(typ, noErr, ...)&lt;br /&gt;
	local function fail(message)&lt;br /&gt;
		if noErr then&lt;br /&gt;
			return false&lt;br /&gt;
		else&lt;br /&gt;
			error(message, 3)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local objs = {...}&lt;br /&gt;
	if #objs == 0 then&lt;br /&gt;
		return fail(&amp;quot;Must provide at least one object to check.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	for _, obj in ipairs{...} do&lt;br /&gt;
		if type(obj) ~= &amp;quot;table&amp;quot; or type(obj.hasType) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
			return fail(&amp;quot;Function expected a &amp;quot; .. typ .. &amp;quot; object, but received a &amp;quot; .. type(obj) .. &amp;quot; instead.&amp;quot;)&lt;br /&gt;
		elseif not (typ == &amp;quot;object&amp;quot; or obj:hasType(typ)) then&lt;br /&gt;
			for _, wrong_type in ipairs{&amp;quot;family&amp;quot;, &amp;quot;language&amp;quot;, &amp;quot;script&amp;quot;, &amp;quot;Wikimedia language&amp;quot;, &amp;quot;writing system&amp;quot;} do&lt;br /&gt;
				if obj:hasType(wrong_type) then&lt;br /&gt;
					return fail(&amp;quot;Function expected a &amp;quot; .. typ .. &amp;quot; object, but received a &amp;quot; .. wrong_type .. &amp;quot; object instead.&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return fail(&amp;quot;Function expected a &amp;quot; .. typ .. &amp;quot; object, but received another type of object instead.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>bob&gt;Djpwikiadmin</name></author>
	</entry>
</feed>