<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Adebug</id>
	<title>Module:debug - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Adebug"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:debug&amp;action=history"/>
	<updated>2026-04-03T18:34:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:debug&amp;diff=477617&amp;oldid=prev</id>
		<title>Sware at 15:19, 15 November 2025</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:debug&amp;diff=477617&amp;oldid=prev"/>
		<updated>2025-11-15T15:19:48Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://linguifex.com/w/index.php?title=Module:debug&amp;amp;diff=477617&amp;amp;oldid=230890&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:debug&amp;diff=230890&amp;oldid=prev</id>
		<title>Sware: Blanked the page</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:debug&amp;diff=230890&amp;oldid=prev"/>
		<updated>2021-07-13T20:15:02Z</updated>

		<summary type="html">&lt;p&gt;Blanked the page&lt;/p&gt;
&lt;a href=&quot;https://linguifex.com/w/index.php?title=Module:debug&amp;amp;diff=230890&amp;amp;oldid=198947&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:debug&amp;diff=198947&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;local export = {}  local escape do 	local escapes = { 		[&quot;\a&quot;] = &quot;a&quot;, [&quot;\b&quot;] = &quot;b&quot;, [&quot;\f&quot;] = &quot;f&quot;, [&quot;\n&quot;] = &quot;n&quot;, [&quot;\r&quot;] = &quot;r&quot;, 		[&quot;\t&quot;] = &quot;t&quot;, [&quot;\v&quot;] = &quot;v&quot;, [&quot;\\&quot;] = &quot;\\&quot;, [&quot;\&quot;...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:debug&amp;diff=198947&amp;oldid=prev"/>
		<updated>2020-07-23T13:11:10Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local export = {}  local escape do 	local escapes = { 		[&amp;quot;\a&amp;quot;] = &amp;quot;a&amp;quot;, [&amp;quot;\b&amp;quot;] = &amp;quot;b&amp;quot;, [&amp;quot;\f&amp;quot;] = &amp;quot;f&amp;quot;, [&amp;quot;\n&amp;quot;] = &amp;quot;n&amp;quot;, [&amp;quot;\r&amp;quot;] = &amp;quot;r&amp;quot;, 		[&amp;quot;\t&amp;quot;] = &amp;quot;t&amp;quot;, [&amp;quot;\v&amp;quot;] = &amp;quot;v&amp;quot;, [&amp;quot;\\&amp;quot;] = &amp;quot;\\&amp;quot;, [&amp;quot;\&amp;quot;...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local escape&lt;br /&gt;
do&lt;br /&gt;
	local escapes = {&lt;br /&gt;
		[&amp;quot;\a&amp;quot;] = &amp;quot;a&amp;quot;, [&amp;quot;\b&amp;quot;] = &amp;quot;b&amp;quot;, [&amp;quot;\f&amp;quot;] = &amp;quot;f&amp;quot;, [&amp;quot;\n&amp;quot;] = &amp;quot;n&amp;quot;, [&amp;quot;\r&amp;quot;] = &amp;quot;r&amp;quot;,&lt;br /&gt;
		[&amp;quot;\t&amp;quot;] = &amp;quot;t&amp;quot;, [&amp;quot;\v&amp;quot;] = &amp;quot;v&amp;quot;, [&amp;quot;\\&amp;quot;] = &amp;quot;\\&amp;quot;, [&amp;quot;\&amp;quot;&amp;quot;] = &amp;#039;&amp;quot;&amp;#039;, [&amp;quot;&amp;#039;&amp;quot;] = &amp;quot;&amp;#039;&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local function helper(char)&lt;br /&gt;
		return escapes[char] and &amp;quot;\\&amp;quot; .. escapes[char]&lt;br /&gt;
			or (&amp;quot;\\%03d&amp;quot;):format(char:byte())&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Escape control characters, backslash, double quote, and bytes that aren&amp;#039;t&lt;br /&gt;
	-- used in UTF-8.&lt;br /&gt;
	-- Escape stuff that can&amp;#039;t be saved in a MediaWiki page, like invalid UTF-8&lt;br /&gt;
	-- and NFD character sequences? Hard.&lt;br /&gt;
	-- Similar to string.format(&amp;quot;%q&amp;quot;, str), which does not use C-like simple&lt;br /&gt;
	-- escapes and does not escape bytes that are not used in UTF-8.&lt;br /&gt;
	escape = function (str)&lt;br /&gt;
		return (str:gsub(&amp;quot;[%z\1-\31\\\&amp;quot;\127\192\193\245-\255]&amp;quot;, helper))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
export.escape = escape&lt;br /&gt;
&lt;br /&gt;
-- Convert a value to a string&lt;br /&gt;
function export.dump(value, prefix, tsort)&lt;br /&gt;
	local t = type(value)&lt;br /&gt;
	&lt;br /&gt;
	prefix = prefix or &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if t == &amp;quot;string&amp;quot; then&lt;br /&gt;
		return &amp;#039;&amp;quot;&amp;#039; .. escape(value) .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
	elseif t == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local str_table = {}&lt;br /&gt;
		&lt;br /&gt;
		table.insert(str_table, &amp;quot; {&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		for key, val in require(&amp;quot;Module:table&amp;quot;).sortedPairs(value, tsort) do&lt;br /&gt;
			table.insert(str_table, &amp;quot; &amp;quot; .. prefix .. &amp;quot;\t[&amp;quot; .. export.dump(key, prefix .. &amp;quot;\t&amp;quot;) .. &amp;quot;] = &amp;quot; .. export.dump(val, prefix .. &amp;quot;\t&amp;quot;):gsub(&amp;quot;^ &amp;quot;, &amp;quot;&amp;quot;) .. &amp;quot;,&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(str_table, &amp;quot; &amp;quot; .. prefix .. &amp;quot;}&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		return table.concat(str_table, &amp;quot;\n&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		return tostring(value)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function export.highlight_dump(value, prefix, tsort, options)&lt;br /&gt;
	options = options or {}&lt;br /&gt;
	&lt;br /&gt;
	local func = options.modified and &amp;quot;modified_dump&amp;quot; or &amp;quot;dump&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local dump = export[func](value, prefix, tsort)&lt;br /&gt;
	&lt;br /&gt;
	-- Remove spaces at beginnings of lines (which are simply to force a &amp;lt;pre&amp;gt;&amp;lt;/pre&amp;gt; tag).&lt;br /&gt;
	dump = dump:gsub(&amp;quot;^ &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	dump = dump:gsub(&amp;quot;\n &amp;quot;, &amp;quot;\n&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	return export.highlight(dump)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Returns true if table contains a table as one of its values&lt;br /&gt;
local function containsTable(t)&lt;br /&gt;
	for key, value in pairs(t) do&lt;br /&gt;
		if type(value) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function containsTablesWithSize(t, size)&lt;br /&gt;
	for key, value in pairs(t) do&lt;br /&gt;
		if type(value) == &amp;quot;table&amp;quot; and require(&amp;quot;Module:table&amp;quot;).size(value) ~= size then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
	Convert a value to a string.&lt;br /&gt;
	Like dump below, but if a table has consecutive numbered keys and does not&lt;br /&gt;
	have a table as one of its values, it will be placed on a single line.&lt;br /&gt;
	Used by [[Module:User:Erutuon/script recognition]].&lt;br /&gt;
]=]&lt;br /&gt;
function export.modified_dump(value, prefix, tsort)&lt;br /&gt;
	local t = type(value)&lt;br /&gt;
	&lt;br /&gt;
	prefix = prefix or &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if t == &amp;quot;string&amp;quot; then&lt;br /&gt;
		return &amp;#039;&amp;quot;&amp;#039; .. value .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
	elseif t == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local str_table = {}&lt;br /&gt;
		&lt;br /&gt;
		local containsTable = containsTable(value)&lt;br /&gt;
		local consecutive = require(&amp;quot;Module:table&amp;quot;).isArray(value)&lt;br /&gt;
		if consecutive and not containsTable or containsTable and containsTablesWithSize(value, 3) then&lt;br /&gt;
			table.insert(str_table, &amp;quot;{&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			for key, val in require(&amp;quot;Module:table&amp;quot;).sortedPairs(value, tsort) do&lt;br /&gt;
				if containsTable then&lt;br /&gt;
					table.insert(str_table, &amp;quot;\n\t&amp;quot; .. prefix)&lt;br /&gt;
				else&lt;br /&gt;
					table.insert(str_table, &amp;quot; &amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				if type(key) == &amp;quot;string&amp;quot; then&lt;br /&gt;
					table.insert(str_table, &amp;quot;[&amp;quot; .. export.modified_dump(key) .. &amp;quot;] = &amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				table.insert(str_table, type(key) == &amp;quot;number&amp;quot; and type(val) == &amp;quot;number&amp;quot; and string.format(&amp;quot;0x%05X&amp;quot;, val) or export.modified_dump(val))&lt;br /&gt;
				&lt;br /&gt;
				if not (consecutive and #value == 3) or type(key) == &amp;quot;number&amp;quot; and value[key + 1] then&lt;br /&gt;
					table.insert(str_table, &amp;quot;,&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if containsTable then&lt;br /&gt;
				table.insert(str_table, &amp;quot;\n&amp;quot; .. prefix)&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(str_table, &amp;quot; &amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			table.insert(str_table, &amp;quot;}&amp;quot;)&lt;br /&gt;
			return table.concat(str_table)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(str_table, &amp;quot; {&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		for key, val in require(&amp;quot;Module:table&amp;quot;).sortedPairs(value, tsort) do&lt;br /&gt;
			table.insert(str_table, &amp;quot; &amp;quot; .. prefix .. &amp;quot;\t[&amp;quot; .. export.modified_dump(key, prefix .. &amp;quot;\t&amp;quot;) .. &amp;quot;] = &amp;quot; .. export.modified_dump(val, prefix .. &amp;quot;\t&amp;quot;):gsub(&amp;quot;^ &amp;quot;, &amp;quot;&amp;quot;) .. &amp;quot;,&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(str_table, &amp;quot; &amp;quot; .. prefix .. &amp;quot;}&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		return table.concat(str_table, &amp;quot;\n&amp;quot;)&lt;br /&gt;
	elseif t == &amp;quot;number&amp;quot; and value &amp;gt; 46 then&lt;br /&gt;
		return string.format(&amp;quot;0x%05X&amp;quot;, value)&lt;br /&gt;
	else&lt;br /&gt;
		return tostring(value)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
function export.track(key)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	if key then&lt;br /&gt;
		if type(key) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
			key = { key }&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		for i, value in pairs(key) do&lt;br /&gt;
			pcall(frame.expandTemplate, frame, { title = &amp;#039;tracking/&amp;#039; .. value })&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;#039;No tracking key supplied to the function &amp;quot;&amp;#039; .. track .. &amp;#039;&amp;quot;.&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Trigger a script error from a template&lt;br /&gt;
function export.error(frame)&lt;br /&gt;
	error(frame.args[1] or &amp;quot;(no message specified)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Convenience function for generating syntaxhighlight tags.&lt;br /&gt;
	Display defaults to block.&lt;br /&gt;
	Options is a table. To display inline text with HTML highlighting:&lt;br /&gt;
		{ inline = true, lang = &amp;quot;html&amp;quot; }&lt;br /&gt;
]]&lt;br /&gt;
function export.highlight(content, options)&lt;br /&gt;
	if type(content) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		options = content&lt;br /&gt;
		options = {&lt;br /&gt;
			lang = options.lang or &amp;quot;lua&amp;quot;,&lt;br /&gt;
			inline = options.inline and true&lt;br /&gt;
		}&lt;br /&gt;
		return function(content)&lt;br /&gt;
			return mw.getCurrentFrame():extensionTag{&lt;br /&gt;
				name = &amp;quot;syntaxhighlight&amp;quot;,&lt;br /&gt;
				content = content,&lt;br /&gt;
				args = options&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &amp;quot;syntaxhighlight&amp;quot;,&lt;br /&gt;
			content = content,&lt;br /&gt;
			args = {&lt;br /&gt;
				lang = options and options.lang or &amp;quot;lua&amp;quot;,&lt;br /&gt;
				inline = options and options.inline and true or nil&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.track_unrecognized_args(args, template_name)&lt;br /&gt;
	local function track(code)&lt;br /&gt;
		export.track(template_name .. &amp;quot;/&amp;quot; .. code)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
    track(&amp;quot;unrecognized arg&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local arg_list = {}&lt;br /&gt;
	for arg, value in pairs(args) do&lt;br /&gt;
		track(&amp;quot;unrecognized arg/&amp;quot; .. arg)&lt;br /&gt;
		table.insert(arg_list, (&amp;quot;|%s=%s&amp;quot;):format(arg, value))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	mw.log(&lt;br /&gt;
		(&amp;quot;Unrecognized parameter%s in {{%s}}: %s.&amp;quot;):format(&lt;br /&gt;
			arg_list[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;,&lt;br /&gt;
			template_name,&lt;br /&gt;
			table.concat(arg_list, &amp;quot;, &amp;quot;)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>