<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FNardog%2F5</id>
	<title>Module:Sandbox/Nardog/5 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FNardog%2F5"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Nardog/5&amp;action=history"/>
	<updated>2026-05-26T06:04:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Nardog/5&amp;diff=145878&amp;oldid=prev</id>
		<title>imported&gt;Legoktm: Replace Module:No globals with require( &quot;strict&quot; )</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Nardog/5&amp;diff=145878&amp;oldid=prev"/>
		<updated>2022-10-23T21:07:52Z</updated>

		<summary type="html">&lt;p&gt;Replace &lt;a href=&quot;/research/Module:No_globals&quot; title=&quot;Module:No globals&quot;&gt;Module:No globals&lt;/a&gt; with require( &amp;quot;strict&amp;quot; )&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function multiFind(s, t)&lt;br /&gt;
	local i, j = mw.ustring.find(s, t[1])&lt;br /&gt;
	for n = 2, #t do&lt;br /&gt;
		local i2, j2 = mw.ustring.find(s, t[n])&lt;br /&gt;
		if i2 and (not i or i2 &amp;lt; i) then&lt;br /&gt;
			i, j = i2, j2&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return i, j&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wrapSpaces(s)&lt;br /&gt;
	return mw.ustring.gsub(s, &amp;#039;(%s+)&amp;#039;, &amp;#039;&amp;lt;span class=&amp;quot;wrap&amp;quot;&amp;gt;%1&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function escapeAndWrapSpaces(s)&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		&amp;#039;%[%[[^%]|]-%s[^%]|]-|&amp;#039;, -- Piped links&lt;br /&gt;
		&amp;#039;&amp;lt;/?[A-Za-z][^&amp;gt;]-%s[^&amp;gt;]-&amp;gt;&amp;#039; -- HTML tags&lt;br /&gt;
	}&lt;br /&gt;
	s = mw.ustring.gsub(s, &amp;#039;%[%[([^%]|]-%s[^%]|]-)%]%]&amp;#039;, &amp;#039;[[%1|%1]]&amp;#039;) -- Pipe unpiped links&lt;br /&gt;
	local i, j = multiFind(s, patterns)&lt;br /&gt;
	if i then -- Match found&lt;br /&gt;
		local remaining, escaped = {}, {}&lt;br /&gt;
		repeat&lt;br /&gt;
			table.insert(remaining, mw.ustring.sub(s, 1, i - 1)) -- What precedes the match&lt;br /&gt;
			table.insert(escaped, mw.ustring.sub(s, i, j)) -- The match&lt;br /&gt;
			s = mw.ustring.sub(s, j + 1) -- Truncate&lt;br /&gt;
			i, j = multiFind(s, patterns)&lt;br /&gt;
		until not i&lt;br /&gt;
		table.insert(remaining, s) -- What follows the last match&lt;br /&gt;
		s = {}&lt;br /&gt;
		for k, v in ipairs(remaining) do&lt;br /&gt;
			v = wrapSpaces(v)&lt;br /&gt;
			table.insert(s, v)&lt;br /&gt;
			table.insert(s, escaped[k])&lt;br /&gt;
		end&lt;br /&gt;
		s = table.concat(s)&lt;br /&gt;
	else&lt;br /&gt;
		s = wrapSpaces(s)&lt;br /&gt;
	end&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function checkNamespace()&lt;br /&gt;
	return require(&amp;#039;Module:Category handler&amp;#039;).main{ true }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCats(cats)&lt;br /&gt;
	local s = &amp;#039;&amp;#039;&lt;br /&gt;
	if cats and cats[1] and checkNamespace() then&lt;br /&gt;
		s = {}&lt;br /&gt;
		for _, v in ipairs(cats) do&lt;br /&gt;
			table.insert(s, &amp;#039;[[Category:&amp;#039; .. v .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		s = table.concat(s)&lt;br /&gt;
	end&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderError(s)&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;&amp;#039; .. s .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; ..&lt;br /&gt;
		renderCats({ &amp;#039;IPA template errors&amp;#039; })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, isConv)&lt;br /&gt;
	local function resolveSynonym(s)&lt;br /&gt;
		s = s:lower()&lt;br /&gt;
		return mw.loadData(&amp;#039;Module:Lang/ISO 639 synonyms&amp;#039;)[s] or s&lt;br /&gt;
	end&lt;br /&gt;
	local function getLangName(s)&lt;br /&gt;
		return require(&amp;#039;Module:Lang&amp;#039;)._name_from_tag({ s, link = args.link, template = &amp;#039;IPA&amp;#039; })&lt;br /&gt;
	end&lt;br /&gt;
	local function makeLink(s, target)&lt;br /&gt;
		return args.link == &amp;#039;yes&amp;#039;&lt;br /&gt;
			and string.format(&amp;#039;[[%s%s]]&amp;#039;, target and target .. &amp;#039;|&amp;#039; or &amp;#039;&amp;#039;, s)&lt;br /&gt;
			or s&lt;br /&gt;
	end&lt;br /&gt;
	local function makeSmallText(s)&lt;br /&gt;
		if args.small == &amp;#039;no&amp;#039; then -- Defaults to yes&lt;br /&gt;
			return s&lt;br /&gt;
		end&lt;br /&gt;
		local span = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;font-size&amp;#039;, &amp;#039;85%&amp;#039;)&lt;br /&gt;
			:wikitext(s)&lt;br /&gt;
		return tostring(span)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ret, cats = {}, {}&lt;br /&gt;
	local s, label, langCode&lt;br /&gt;
	if args[2] then&lt;br /&gt;
		local data = mw.loadData(&amp;#039;Module:Sandbox/Nardog/5d&amp;#039;)&lt;br /&gt;
		&lt;br /&gt;
		local convArgs&lt;br /&gt;
		if isConv then&lt;br /&gt;
			convArgs = mw.clone(args)&lt;br /&gt;
			table.remove(convArgs, 1)&lt;br /&gt;
		else&lt;br /&gt;
			s = args[2]&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		langCode = resolveSynonym(args[1])&lt;br /&gt;
		local langData = data.langs[langCode]&lt;br /&gt;
		local langName = langData and langData.name&lt;br /&gt;
		langName = langName and makeLink(langName, langData.link)&lt;br /&gt;
			or getLangName(langCode, args.link)&lt;br /&gt;
		local key = langData and langData.key or data.defKey&lt;br /&gt;
		label = args.label&lt;br /&gt;
		if langName:sub(1, 5) == &amp;#039;&amp;lt;span&amp;#039; then&lt;br /&gt;
			return langName .. renderCats({ &amp;#039;IPA template errors&amp;#039; })&lt;br /&gt;
		elseif not label then&lt;br /&gt;
			local function returnLabel()&lt;br /&gt;
				local labelCode = isConv and args[2] or args[3]&lt;br /&gt;
				if labelCode then&lt;br /&gt;
					if labelCode == &amp;#039;&amp;#039; then&lt;br /&gt;
						return &amp;#039;&amp;#039;&lt;br /&gt;
					end&lt;br /&gt;
					local customCodes = langData and langData.labels&lt;br /&gt;
					if customCodes and customCodes[labelCode] then&lt;br /&gt;
						return customCodes[labelCode]&lt;br /&gt;
					end&lt;br /&gt;
					local dialects = langData and langData.dialects&lt;br /&gt;
					if dialects then&lt;br /&gt;
						for codePat, labelPat in pairs(data.defDiaCodes) do&lt;br /&gt;
							for diaCode, diaName in pairs(dialects) do&lt;br /&gt;
								if labelCode == codePat:format(diaCode) then&lt;br /&gt;
									return labelPat:format(makeLink(&lt;br /&gt;
										diaName, dialects[diaCode .. &amp;#039;-link&amp;#039;]))&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					local defLabelMatch = data.defLabels[labelCode]&lt;br /&gt;
					if defLabelMatch then&lt;br /&gt;
						return defLabelMatch:format(langName)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			label = returnLabel()&lt;br /&gt;
			if label then&lt;br /&gt;
				if isConv then&lt;br /&gt;
					table.remove(convArgs, 1)&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				local defLabel = langData and langData.defLabel or data.defLabel&lt;br /&gt;
				label = defLabel:format(langName)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if label and label ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			label = makeSmallText(label) or label&lt;br /&gt;
			table.insert(ret, label .. &amp;#039; &amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isConv then&lt;br /&gt;
			local module = langData and langData.convModule&lt;br /&gt;
			if module then&lt;br /&gt;
				local hasError&lt;br /&gt;
				s, hasError = require(module).main(convArgs)&lt;br /&gt;
				if hasError then&lt;br /&gt;
					local errorCat = langData.convErrorCat&lt;br /&gt;
					if errorCat then&lt;br /&gt;
						table.insert(cats, errorCat)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if langData.convArgs then&lt;br /&gt;
					for k, v in pairs (langData.convArgs) do&lt;br /&gt;
						args[k] = args[k] or v&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if langData.convStyles then&lt;br /&gt;
					table.insert(ret, 1, mw.getCurrentFrame():extensionTag{&lt;br /&gt;
						name = &amp;#039;templatestyles&amp;#039;,&lt;br /&gt;
						args = { src = langData.convStyles }&lt;br /&gt;
					})&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return renderError(&amp;#039;IPA convert module not found for \&amp;#039;&amp;#039; .. langCode .. &amp;#039;\&amp;#039;&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		s = langData and langData.slashes and &amp;#039;/&amp;#039; .. s .. &amp;#039;/&amp;#039; or &amp;#039;[&amp;#039; .. s .. &amp;#039;]&amp;#039;&lt;br /&gt;
		s = string.format(&amp;#039;[[%s|%s]]&amp;#039;, key, s)&lt;br /&gt;
		if langData.iso then&lt;br /&gt;
			langCode = langData.iso ~= &amp;#039;none&amp;#039; and langData.iso&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		s = args[1]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Transcription&lt;br /&gt;
	do&lt;br /&gt;
		local span = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;lang&amp;#039;, (langCode or &amp;#039;und&amp;#039;) .. &amp;#039;-fonipa&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;IPA&amp;#039;)&lt;br /&gt;
			:addClass(args.class)&lt;br /&gt;
		-- wrap=all: Do nothing&lt;br /&gt;
		-- wrap=none: Never break&lt;br /&gt;
		-- Otherwise: Break at spaces only&lt;br /&gt;
		if args.wrap ~= &amp;#039;all&amp;#039; then&lt;br /&gt;
			span:addClass(&amp;#039;nowrap&amp;#039;)&lt;br /&gt;
			if args.wrap ~= &amp;#039;none&amp;#039; then&lt;br /&gt;
				s = escapeAndWrapSpaces(s)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if not args[2] and args.tooltip ~= &amp;#039;&amp;#039; then -- tooltip is added unless blank&lt;br /&gt;
			span:attr(&amp;#039;title&amp;#039;, args.tooltip or&lt;br /&gt;
				&amp;#039;Representation in the International Phonetic Alphabet (IPA)&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		s = tostring(span:wikitext(s))&lt;br /&gt;
		table.insert(ret, s)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Audio&lt;br /&gt;
	local audio = args.audio ~= &amp;#039;&amp;#039; and args.audio or not isConv and args[4] ~= &amp;#039;&amp;#039; and args[4]&lt;br /&gt;
	if audio then&lt;br /&gt;
		audio = &amp;#039;(&amp;#039; .. mw.getCurrentFrame():expandTemplate{&lt;br /&gt;
			title = &amp;#039;Template:Audio&amp;#039;,&lt;br /&gt;
			args = { audio, &amp;#039;listen&amp;#039;, help = &amp;#039;no&amp;#039; }&lt;br /&gt;
		} .. &amp;#039;)&amp;#039;&lt;br /&gt;
		audio = makeSmallText(audio) or audio&lt;br /&gt;
		table.insert(ret, &amp;#039; &amp;#039; .. audio)&lt;br /&gt;
		table.insert(cats, &amp;#039;Pages including recorded pronunciations&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Categories&lt;br /&gt;
	table.insert(ret, renderCats(cats))&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	-- local args = frame:getParent().args&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	for i, v in ipairs(args) do&lt;br /&gt;
		local s = mw.text.trim(v)&lt;br /&gt;
		args[i] = (s ~= &amp;#039;&amp;#039; or i == 3) and s&lt;br /&gt;
	end&lt;br /&gt;
	return args[1] and p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._convert(args)&lt;br /&gt;
	return p._main(args, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.convert(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	-- for i, v in ipairs(frame:getParent().args) do&lt;br /&gt;
	for i, v in ipairs(frame.args[1] and frame.args or frame:getParent().args) do&lt;br /&gt;
		local s = mw.text.trim(v)&lt;br /&gt;
		if s ~= &amp;#039;&amp;#039; or i == 2 then&lt;br /&gt;
			table.insert(args, s)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- for k, v in pairs(frame:getParent().args) do&lt;br /&gt;
	for k, v in pairs(frame.args[1] and frame.args or frame:getParent().args) do&lt;br /&gt;
		if type(k) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return args[1] and args[2] and p._convert(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Legoktm</name></author>
	</entry>
</feed>