<?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%3Atable_tools</id>
	<title>Module:table tools - 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%3Atable_tools"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:table_tools&amp;action=history"/>
	<updated>2026-04-22T00:58:33Z</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:table_tools&amp;diff=495035&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:table_tools&amp;diff=495035&amp;oldid=prev"/>
		<updated>2026-04-21T12:00:08Z</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;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:00, 21 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&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;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:table_tools&amp;diff=495034&amp;oldid=prev</id>
		<title>wikt&gt;SurjectionBot: (bot) slight optimization to 5.2 compat: prefer unpack to table.unpack</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:table_tools&amp;diff=495034&amp;oldid=prev"/>
		<updated>2025-04-24T12:26:45Z</updated>

		<summary type="html">&lt;p&gt;(bot) slight optimization to 5.2 compat: prefer unpack to table.unpack&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 m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local u = mw.ustring.char&lt;br /&gt;
local unpack = unpack or table.unpack -- Lua 5.2 compatibility&lt;br /&gt;
local notes_ranges = {&lt;br /&gt;
  -- First three represent symbols in ISO-8859-1&lt;br /&gt;
  -- Including ÷ (U+00F7) × (U+00D7) § (U+00B7) ¤ (U+00A4)&lt;br /&gt;
  {0xA1,0xBF},&lt;br /&gt;
  {0xD7,0xD7}, -- ×&lt;br /&gt;
  {0xF7,0xF7}, -- ÷&lt;br /&gt;
  -- Next two are &amp;quot;General Punctuation&amp;quot; minus non-spacing chars&lt;br /&gt;
  -- First one includes † (U+2020) ‡ (U+2021) • (U+2022)  ※ (U+203B) ⁕ (U+2055)&lt;br /&gt;
  {0x2010,0x2027},&lt;br /&gt;
  {0x2030,0x205E},&lt;br /&gt;
  -- Next one is &amp;quot;Superscripts and Subscripts&amp;quot; and &amp;quot;Currency Symbols&amp;quot;&lt;br /&gt;
  {0x2070,0x20CF},&lt;br /&gt;
  -- Next one is a whole series of symbol ranges&lt;br /&gt;
  {0x2100,0x2B5F},&lt;br /&gt;
  -- Next one is &amp;quot;Supplemental Punctuation&amp;quot;&lt;br /&gt;
  {0x2E00,0x2E3F}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local unicode_ranges = {}&lt;br /&gt;
for _, range in ipairs(notes_ranges) do&lt;br /&gt;
  table.insert(unicode_ranges, u(range[1]) .. &amp;quot;-&amp;quot; .. u(range[2]))&lt;br /&gt;
end&lt;br /&gt;
local unicode_range_str = table.concat(unicode_ranges, &amp;quot;&amp;quot;)&lt;br /&gt;
local notes_re = &amp;quot;[%*%~%@%#%$%%%^%&amp;amp;%+0-9_ &amp;quot; .. unicode_range_str .. &amp;quot;]*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local function manipulate_entry(entries, f)&lt;br /&gt;
	entries = entries or &amp;quot;&amp;quot;&lt;br /&gt;
	entries = mw.text.split(mw.ustring.gsub(entries, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;), &amp;quot;%s*,%s*&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local sep = &amp;quot;&amp;quot;&lt;br /&gt;
	local ret = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, entry in ipairs(entries) do&lt;br /&gt;
		ret = ret .. sep .. (entry == &amp;quot;-&amp;quot; and &amp;quot;—&amp;quot; or entry == &amp;quot;&amp;quot; and &amp;quot;&amp;quot; or f(entry))&lt;br /&gt;
		sep = &amp;quot;, &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gather_args(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for key, val in pairs(frame.args) do&lt;br /&gt;
		if val ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			args[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local i = 1&lt;br /&gt;
	for _, val in ipairs(frame:getParent().args) do&lt;br /&gt;
		if val and val ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			while args[i] do&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
			args[i] = val&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local lang = args[&amp;quot;lang&amp;quot;]&lt;br /&gt;
	&lt;br /&gt;
	if not lang then&lt;br /&gt;
		lang = args[1]&lt;br /&gt;
		local n = 1&lt;br /&gt;
		while args[n] do&lt;br /&gt;
			args[n] = args[n + 1]&lt;br /&gt;
			n = n + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return lang, args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.separate_notes(entry)&lt;br /&gt;
	local notes&lt;br /&gt;
	entry, notes = mw.ustring.match(entry, &amp;quot;^(.-)(&amp;quot; .. notes_re .. &amp;quot;)$&amp;quot;)&lt;br /&gt;
	return entry, notes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.superscript_notes(notes)&lt;br /&gt;
	if notes ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		notes = &amp;quot;&amp;lt;sup&amp;gt;&amp;quot; .. mw.ustring.gsub(notes, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;) .. &amp;quot;&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return notes&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
function export.get_notes(entry)&lt;br /&gt;
	local notes&lt;br /&gt;
	entry, notes = export.separate_notes(entry)&lt;br /&gt;
	notes = export.superscript_notes(notes)	&lt;br /&gt;
	return entry, notes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.separate_initial_notes(entry)&lt;br /&gt;
	local notes&lt;br /&gt;
	notes, entry = mw.ustring.match(entry, &amp;quot;^(&amp;quot; .. notes_re .. &amp;quot;)(.*)$&amp;quot;)&lt;br /&gt;
	return notes, entry&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
function export.get_initial_notes(entry)&lt;br /&gt;
	local notes&lt;br /&gt;
	notes, entry = export.separate_initial_notes(entry)&lt;br /&gt;
	notes = export.superscript_notes(notes)	&lt;br /&gt;
	return notes, entry&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.linkify_entry(lang, entries, prep)&lt;br /&gt;
	if type(lang) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local args&lt;br /&gt;
		lang, args = gather_args(lang)&lt;br /&gt;
		if (args[&amp;quot;prep&amp;quot;] or &amp;quot;&amp;quot;) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			local mod, func = unpack(mw.text.split(args[&amp;quot;prep&amp;quot;], &amp;quot;#&amp;quot;, true))&lt;br /&gt;
			prep = require(&amp;quot;Module:&amp;quot; .. mod)[func]&lt;br /&gt;
		end&lt;br /&gt;
		entries = args[1]&lt;br /&gt;
	end&lt;br /&gt;
	lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(lang)&lt;br /&gt;
	&lt;br /&gt;
	local function f(entry)&lt;br /&gt;
		local e, notes = export.get_notes(entry)&lt;br /&gt;
		local ep = prep and prep(e)&lt;br /&gt;
		return m_links.language_link{lang = lang, term = ep or e, alt = ep and e} .. notes&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return manipulate_entry(entries, f)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.translit_entry(lang, entries)&lt;br /&gt;
	if type(lang) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local args&lt;br /&gt;
		lang, args = gather_args(lang)&lt;br /&gt;
		entries = args[1]&lt;br /&gt;
	end&lt;br /&gt;
	lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(lang)&lt;br /&gt;
&lt;br /&gt;
	local function f(entry)&lt;br /&gt;
		local e, notes = export.get_notes(entry)&lt;br /&gt;
		return ((lang:transliterate(e)) or e) .. notes&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return manipulate_entry(m_links.remove_links(entries), f)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.format_entry(lang, entries)&lt;br /&gt;
	if type(lang) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local args&lt;br /&gt;
		lang, args = gather_args(lang)&lt;br /&gt;
		entries = args[1]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return manipulate_entry(m_links.remove_links(entries), function(entry) local e, n = export.get_notes(entry); return e .. n end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.first_entry(lang, entries)&lt;br /&gt;
	if type(lang) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local args&lt;br /&gt;
		lang, args = gather_args(lang)&lt;br /&gt;
		entries = args[1]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local entry = mw.text.split(mw.ustring.gsub(entries, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;), &amp;quot;%s*,%s*&amp;quot;)[1]&lt;br /&gt;
	&lt;br /&gt;
	local e, notes = export.get_notes(entry)&lt;br /&gt;
	return e .. notes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>wikt&gt;SurjectionBot</name></author>
	</entry>
</feed>