<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://70.231.62.181/index.php?action=history&amp;feed=atom&amp;title=Module%3ALang%2Fdata%2Fmake_is_latn_data</id>
	<title>Module:Lang/data/make is latn data - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://70.231.62.181/index.php?action=history&amp;feed=atom&amp;title=Module%3ALang%2Fdata%2Fmake_is_latn_data"/>
	<link rel="alternate" type="text/html" href="http://70.231.62.181/index.php?title=Module:Lang/data/make_is_latn_data&amp;action=history"/>
	<updated>2026-04-22T05:01:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>http://70.231.62.181/index.php?title=Module:Lang/data/make_is_latn_data&amp;diff=20179623&amp;oldid=prev</id>
		<title>imported&gt;Trappist the monk: Trappist the monk moved page Module:Sandbox/trappist the monk/make is latn data to Module:Lang/data/make is latn data: get it out of the sandbox;</title>
		<link rel="alternate" type="text/html" href="http://70.231.62.181/index.php?title=Module:Lang/data/make_is_latn_data&amp;diff=20179623&amp;oldid=prev"/>
		<updated>2025-01-16T14:01:40Z</updated>

		<summary type="html">&lt;p&gt;Trappist the monk moved page &lt;a href=&quot;/index.php?title=Module:Sandbox/trappist_the_monk/make_is_latn_data&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:Sandbox/trappist the monk/make is latn data (page does not exist)&quot;&gt;Module:Sandbox/trappist the monk/make is latn data&lt;/a&gt; to &lt;a href=&quot;/index.php/Module:Lang/data/make_is_latn_data&quot; title=&quot;Module:Lang/data/make is latn data&quot;&gt;Module:Lang/data/make is latn data&lt;/a&gt;: get it out of the sandbox;&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;
&lt;br /&gt;
local title_object = mw.title.getCurrentTitle ();								-- get this module&amp;#039;s title object&lt;br /&gt;
if not title_object.fullText:find (&amp;#039;/doc$&amp;#039;) then								-- are we are looking at the ~/doc page or the module page?&lt;br /&gt;
	local module_doc_title = title_object.fullText .. &amp;#039;/doc&amp;#039;;					-- looking at the module page so make a page name for this module&amp;#039;s doc page&lt;br /&gt;
	title_object = mw.title.new (module_doc_title);								-- reset title object to this module&amp;#039;s doc page&lt;br /&gt;
end&lt;br /&gt;
local content = title_object:getContent();										-- get the doc page content&lt;br /&gt;
&lt;br /&gt;
local common_scripts_singles_t = {};											-- these used when constructing final output&lt;br /&gt;
local common_scripts_ranges_t = {};&lt;br /&gt;
local latn_scripts_singles_t = {};&lt;br /&gt;
local latn_scripts_ranges_t = {};&lt;br /&gt;
local extension_scripts_singles_t = {};&lt;br /&gt;
local extension_scripts_ranges_t = {};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; Z Y Y Y _ L A T N _ C O D E P O I N T S _ G E T &amp;gt;-----------------------------&lt;br /&gt;
&lt;br /&gt;
extract zyyy-script (common) and latn codepoints from Module:Unicode data/scripts.  There are individual codepoints&lt;br /&gt;
and ranges of codepoints.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function zyyy_latn_codepoints_get ()&lt;br /&gt;
	local unicode_scripts = mw.loadData (&amp;#039;Module:Unicode data/scripts&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	for code_point, script in pairs (unicode_scripts.singles) do				-- spin through the ~/scripts.singles table&lt;br /&gt;
		if &amp;#039;Latn&amp;#039; == script then&lt;br /&gt;
			latn_scripts_singles_t[code_point] = true;							-- not a sequence so we can check for duplicates later&lt;br /&gt;
		elseif &amp;#039;Zyyy&amp;#039; == script then&lt;br /&gt;
			common_scripts_singles_t[code_point] = true;						-- not a sequence so we can check for duplicates later&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i, code_points_t in ipairs (unicode_scripts.ranges) do					-- spin through the ~/scripts.ranges table&lt;br /&gt;
		if &amp;#039;Latn&amp;#039; == code_points_t[3] then&lt;br /&gt;
			table.insert (latn_scripts_ranges_t, {code_points_t[1], code_points_t[2]});&lt;br /&gt;
		elseif &amp;#039;Zyyy&amp;#039; == code_points_t[3] then&lt;br /&gt;
			table.insert (common_scripts_ranges_t, {code_points_t[1], code_points_t[2]});&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T E N S I O N _ C O D E P O I N T S _ G E T &amp;gt;-----------------------------&lt;br /&gt;
&lt;br /&gt;
read a local copy of the current unicode ScriptExtensions-xx.x.x.txt file (hidden in this module&amp;#039;s doc page).&lt;br /&gt;
extract latn-script codepoints and ranges.  Convert codepoints from hex to decimal (same format as codepoints&lt;br /&gt;
extracted from Unicode data/scripts).&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function extension_codepoints_get ()&lt;br /&gt;
	local line_pattern = &amp;#039;%x+[^\r\n]+&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	for line in content:gmatch (line_pattern) do								-- read each line of extensions text file&lt;br /&gt;
		local single = line:match (&amp;#039;(%x+)%s*;[^#]*Latn[^#]*#%s*%a%a%s*(.+)&amp;#039;);&lt;br /&gt;
		if single then&lt;br /&gt;
			extension_scripts_singles_t[tonumber (&amp;#039;0x&amp;#039; .. single)] = true;		-- convert hex index to decimal and save&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local range_t = {};														-- a single codepoint-range&lt;br /&gt;
		range_t[1], range_t[2] = line:match (&amp;#039;(%x+)%.%.(%x+)%s*;[^#]*Latn[^#]*#%s*%a%a%s*%[%d+%]%s*(.+)&amp;#039;);&lt;br /&gt;
		if range_t[1] then&lt;br /&gt;
			range_t[1] = tonumber (&amp;#039;0x&amp;#039; .. range_t[1]);							-- convert hex index to decimal&lt;br /&gt;
			range_t[2] = tonumber (&amp;#039;0x&amp;#039; .. range_t[2]);							-- convert hex index to decimal&lt;br /&gt;
			table.insert (extension_scripts_ranges_t, range_t);					-- and save&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; B I N A R Y _ S E A R C H &amp;gt;---------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function binary_search (target, ranges_t)&lt;br /&gt;
	local idx_bot = 1;															-- initialize to index of first key&lt;br /&gt;
	local idx_top = #ranges_t;													-- initialize to index of last key (number of keys)&lt;br /&gt;
&lt;br /&gt;
	if (target &amp;lt; ranges_t[idx_bot][1]) or (target &amp;gt; ranges_t[idx_top][2]) then	-- invalid; target out of range&lt;br /&gt;
		return;																	-- TODO: return something meaningful?&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local idx_mid;&lt;br /&gt;
	local flag = false;&lt;br /&gt;
&lt;br /&gt;
	while 1 do&lt;br /&gt;
		idx_mid = math.ceil ((idx_bot + idx_top) / 2);							-- get the mid-point in the sequence&lt;br /&gt;
		if (target &amp;gt;= ranges_t[idx_mid][1]) and (target &amp;lt;= ranges_t[idx_mid][2]) then		-- indexed low value &amp;lt;= target &amp;lt;= indexed high value&lt;br /&gt;
			return true;														-- we found the range that holds the &amp;lt;target&amp;gt; character; return true&lt;br /&gt;
		&lt;br /&gt;
		elseif (target &amp;gt; ranges_t[idx_mid][2]) then								-- is &amp;lt;target&amp;gt; &amp;gt; indexed high value?&lt;br /&gt;
			idx_bot = idx_mid;													-- adjust &amp;lt;idx_bot&amp;gt; up&lt;br /&gt;
&lt;br /&gt;
		else																	-- here when &amp;lt;target&amp;gt; less than indexed low value&lt;br /&gt;
			idx_top = idx_mid - 1;												-- adjust &amp;lt;idx_top&amp;gt; down&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if flag then&lt;br /&gt;
			break;																-- here when we just evaluated the last range and &amp;lt;target&amp;gt; not found&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
		if not flag and (idx_bot == idx_top) then								-- set true just before we evaluate the last range&lt;br /&gt;
			flag = true;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P A N D _ R A N G E &amp;gt;-----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
expand range &amp;lt;range_t&amp;gt;[1] to &amp;lt;range_t&amp;gt;[2] into &amp;lt;out_t&amp;gt; as singles:&lt;br /&gt;
	{10, 15} -&amp;gt; {10, 11, 12, 13, 14, 15}&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function expand_range (range_t, out_t)&lt;br /&gt;
	for i=range_t[1], range_t[2] do&lt;br /&gt;
		table.insert (out_t, i);&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A K E _ R A N G E S _ F R O M _ S I N G L E S &amp;gt;------------------------------&lt;br /&gt;
&lt;br /&gt;
search &amp;lt;scripts_singles_t&amp;gt; and for ranges of contiguous codepoints to be added to the ranges list.  Singles&lt;br /&gt;
ranges added to the ranges will be removed from the final singles list later during output formatting.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_ranges_from_singles (scripts_singles_t, ranges_from_singles_t)&lt;br /&gt;
	local singles_t = {};														-- sequence of singles suitable for sorting&lt;br /&gt;
	for k, _ in pairs (scripts_singles_t) do&lt;br /&gt;
		table.insert (singles_t, k);											-- add codepoint to singles_t&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.sort (singles_t);														-- ascending sort to get them all in increasing order&lt;br /&gt;
	local bottom, top;															-- bottom and top of extracted range&lt;br /&gt;
&lt;br /&gt;
	for i, single in ipairs (singles_t) do&lt;br /&gt;
		if not bottom and (single + 1) == singles_t[i+1] then					-- if (singles_t[i]+1) same value as next element ([i+1])&lt;br /&gt;
			bottom = single;													-- set new range bottom value&lt;br /&gt;
			top = singles_t[i+1];												-- set new range top value&lt;br /&gt;
			table.remove (singles_t, i);										-- remove range bottom value from table (&amp;lt;i&amp;gt; now indexes top range value)&lt;br /&gt;
&lt;br /&gt;
			while (top + 1) == singles_t[i+1] do								-- if (singles_t[i]+1) same value as next element ([i+1])&lt;br /&gt;
				top = singles_t[i+1];											-- set new top&lt;br /&gt;
				table.remove (singles_t, i);									-- remove range bottom value from table (&amp;lt;i&amp;gt; now indexes new top range value)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if bottom then															-- not nil when we have extracted a range&lt;br /&gt;
			mw.log (string.format (&amp;#039;%s–%s (%.4X..%.4X) extracted from singles_t&amp;#039;, bottom, top, bottom, top));&lt;br /&gt;
			table.insert (ranges_from_singles_t, {bottom, top})					-- save the extracted range&lt;br /&gt;
			bottom = nil;														-- unset these for the next range&lt;br /&gt;
			top = nil;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A I N &amp;gt;---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Sandbox/trappist the monk/is latn|main}}&lt;br /&gt;
&lt;br /&gt;
build composite lists (single and ranges) of common- and latn-script codepoints.&lt;br /&gt;
&lt;br /&gt;
Duplicates are singles and ranges swallowed.&lt;br /&gt;
&lt;br /&gt;
When a range has a different length from another range with the same starting point, this function takes the&lt;br /&gt;
longest range.&lt;br /&gt;
&lt;br /&gt;
When a range is a subset of a larger range, the subset range is removed from the list.&lt;br /&gt;
&lt;br /&gt;
Contiguous ranges (ending codepoint of one range is one less than the starting codepoint of the next range) are&lt;br /&gt;
joined to make a single range.&lt;br /&gt;
&lt;br /&gt;
Expands all ranges into singles and combines with separately defined singles to create one long list of singles&lt;br /&gt;
because why not?&lt;br /&gt;
&lt;br /&gt;
Finally the lists are made all pretty-like and rendered for copy pasta into an appropriate data module for use&lt;br /&gt;
by Module:Lang.&lt;br /&gt;
&lt;br /&gt;
TODO: detect and remove overlapping ranges where one range starts in one range and ends in another range?&lt;br /&gt;
TODO: there are contiguous codepoints listed in the singles list; combine these into ranges&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main (frame)&lt;br /&gt;
	zyyy_latn_codepoints_get();													-- get common- and latn-script codepoints from [[Module:Unicode data/scripts]]&lt;br /&gt;
	extension_codepoints_get();													-- get latn-script codepoints from local copy of unicode scripts text file&lt;br /&gt;
	&lt;br /&gt;
	local scripts_singles_t = {};&lt;br /&gt;
	for _, scripts_t in ipairs ({latn_scripts_singles_t, common_scripts_singles_t, extension_scripts_singles_t}) do&lt;br /&gt;
		for k, v in pairs (scripts_t) do&lt;br /&gt;
			scripts_singles_t[k] = v;											-- duplicates (if any) are swallowed&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ranges_from_singles_t = {};											-- a sequence of sequences&lt;br /&gt;
	make_ranges_from_singles (scripts_singles_t, ranges_from_singles_t);		-- add contiguous singles in &amp;lt;scripts_singles_t&amp;gt; to &amp;lt;ranges_from_singles_t&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	local temp_t = {};															-- for ranges; &amp;lt;k&amp;gt; is range low value, &amp;lt;v&amp;gt; is range high value&lt;br /&gt;
	for _, ranges_t in ipairs ({latn_scripts_ranges_t, common_scripts_ranges_t, extension_scripts_ranges_t, ranges_from_singles_t}) do&lt;br /&gt;
		for _, range_t in pairs (ranges_t) do&lt;br /&gt;
			if temp_t[range_t[1]] then&lt;br /&gt;
				if temp_t[range_t[1]] ~= range_t[2] then&lt;br /&gt;
					mw.log (range_t[1] .. &amp;#039;–&amp;#039; .. range_t[2] .. string.format (&amp;#039; (%x..%x) &amp;#039;, range_t[1], range_t[2]) .. &amp;#039;does not match: &amp;#039; .. temp_t[range_t[1]] .. string.format (&amp;#039; (%x)&amp;#039;, temp_t[range_t[1]]));&lt;br /&gt;
					if temp_t[range_t[1]] &amp;gt; range_t[2] then&lt;br /&gt;
						range_t[2] = temp_t[range_t[1]];						-- use the greater high value&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					mw.log (range_t[1] .. &amp;#039;–&amp;#039; .. range_t[2] .. string.format (&amp;#039; (%x..%x) &amp;#039;, range_t[1], range_t[2]) .. &amp;#039; is duplicate&amp;#039;);	-- log and overwrite existing range&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			temp_t[range_t[1]] = range_t[2];									-- add to temp table&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local scripts_ranges_t = {};&lt;br /&gt;
	for k, v in pairs (temp_t) do												-- make a sequence of codepoint range sequences&lt;br /&gt;
		table.insert (scripts_ranges_t, {k, v});&lt;br /&gt;
	end&lt;br /&gt;
	local function sort (a_t, b_t)												-- local function to ascending sort range tables&lt;br /&gt;
		return a_t[1] &amp;lt; b_t[1];&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.sort (scripts_ranges_t, sort);										-- ascending sort the range sequence&lt;br /&gt;
&lt;br /&gt;
	for k, v_t in ipairs (scripts_ranges_t) do									-- remove ranges that are subsets of other ranges; must be sorted first&lt;br /&gt;
		if k == #scripts_ranges_t then&lt;br /&gt;
			break;																-- done because there is no scripts_ranges_t[k+1]&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if (scripts_ranges_t[k+1][1] &amp;lt; v_t[2]) and (scripts_ranges_t[k+1][2] &amp;lt; v_t[2]) then	-- next range start and end less than current range end&lt;br /&gt;
			mw.log (&amp;#039;removed subrange&amp;#039; .. scripts_ranges_t[k+1][1] .. &amp;#039;–&amp;#039; .. scripts_ranges_t[k+1][2] .. string.format (&amp;#039; (%x..%x) &amp;#039;, scripts_ranges_t[k+1][1], scripts_ranges_t[k+1][2]));&lt;br /&gt;
			table.remove (scripts_ranges_t, k+1)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local i = 1;																-- indexer&lt;br /&gt;
	while i ~= #scripts_ranges_t do												-- join contiguous ranges into a single range;&lt;br /&gt;
		if (scripts_ranges_t[i][2] + 1) == scripts_ranges_t[i+1][1] then		-- example: if {0, 64+1} == {65, 90} then join&lt;br /&gt;
			mw.log (string.format (&amp;#039;joined: %s..%s and %s..%s&amp;#039;, scripts_ranges_t[i][1], scripts_ranges_t[i][2], scripts_ranges_t[i+1][1], scripts_ranges_t[i+1][2]))&lt;br /&gt;
			scripts_ranges_t[i][2] = scripts_ranges_t[i+1][2];					-- join&lt;br /&gt;
			table.remove (scripts_ranges_t, i+1);								-- remove joined&lt;br /&gt;
		else&lt;br /&gt;
			i = i+1;															-- not contiguous, bump the indexer&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local singles_out_t = {};													-- sequence to hold singles_out_t&lt;br /&gt;
	local expanded_out_t = {};													-- sequence to hold singles + explanded ranges&lt;br /&gt;
	for k, _ in pairs (scripts_singles_t) do&lt;br /&gt;
		if binary_search (k, scripts_ranges_t) then								-- omit singles that are included in ranges_out_t&lt;br /&gt;
			mw.log (string.format (&amp;#039;removed: %s (%X)&amp;#039;, k, k));&lt;br /&gt;
		else&lt;br /&gt;
			table.insert (singles_out_t, k);&lt;br /&gt;
			table.insert (expanded_out_t, k);&lt;br /&gt;
		end&lt;br /&gt;
	end		&lt;br /&gt;
	table.sort (singles_out_t);&lt;br /&gt;
	for i, v in ipairs (singles_out_t) do&lt;br /&gt;
		local single_str = string.format (&amp;#039;[%s] = true,&amp;#039;, v);&lt;br /&gt;
		local rep = math.ceil ((80 - (4 + single_str:len())) / 4);&lt;br /&gt;
		singles_out_t[i] = string.format (&amp;#039;\t%s%s-- %.4X&amp;#039;, single_str, string.rep (&amp;#039;\t&amp;#039;, rep), v);&lt;br /&gt;
	end		&lt;br /&gt;
	table.insert (singles_out_t, 1, &amp;#039;&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local singles_t = {&amp;#039;);	-- opening stuff&lt;br /&gt;
	table.insert (singles_out_t, &amp;#039;\t}&amp;lt;/syntaxhighlight&amp;gt;&amp;#039;);						-- to close the table&lt;br /&gt;
&lt;br /&gt;
	local ranges_out_t = {};&lt;br /&gt;
	for _, v_t in ipairs (scripts_ranges_t) do&lt;br /&gt;
		local range_str = string.format (&amp;#039;{%s, %s},&amp;#039;, v_t[1], v_t[2]);&lt;br /&gt;
		local rep = math.ceil ((80 - (4 + range_str:len())) / 4);&lt;br /&gt;
		table.insert (ranges_out_t, string.format (&amp;#039;\t%s%s-- %.4X..%.4X&amp;#039;, range_str, string.rep (&amp;#039;\t&amp;#039;, rep), v_t[1], v_t[2]));&lt;br /&gt;
		expand_range (v_t, expanded_out_t);										-- expand this range into &amp;lt;expanded_out_t&amp;gt;&lt;br /&gt;
	end		&lt;br /&gt;
	table.insert (ranges_out_t, 1, &amp;#039;&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local ranges_t = {&amp;#039;);	-- opening stuff&lt;br /&gt;
	table.insert (ranges_out_t, &amp;#039;\t}&amp;lt;/syntaxhighlight&amp;gt;&amp;#039;);						-- to close the table&lt;br /&gt;
&lt;br /&gt;
	table.sort (expanded_out_t);&lt;br /&gt;
	for i, v in ipairs (expanded_out_t) do&lt;br /&gt;
		local single_str = string.format (&amp;#039;[%s] = true,&amp;#039;, v);&lt;br /&gt;
		local rep = math.ceil ((80 - (4 + single_str:len())) / 4);&lt;br /&gt;
		expanded_out_t[i] = string.format (&amp;#039;\t%s%s-- %.4X&amp;#039;, single_str, string.rep (&amp;#039;\t&amp;#039;, rep), v);&lt;br /&gt;
	end		&lt;br /&gt;
	table.insert (expanded_out_t, 1, &amp;#039;&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local singles_t = {&amp;#039;);	-- opening stuff&lt;br /&gt;
	table.insert (expanded_out_t, &amp;#039;\t}&amp;lt;/syntaxhighlight&amp;gt;&amp;#039;);						-- to close the table&lt;br /&gt;
	&lt;br /&gt;
	return frame:preprocess (table.concat ({									-- make a big string and done&lt;br /&gt;
		table.concat (singles_out_t, &amp;#039;\n&amp;#039;),&lt;br /&gt;
		&amp;#039;\n\n&amp;#039;,&lt;br /&gt;
		table.concat (ranges_out_t, &amp;#039;\n&amp;#039;),&lt;br /&gt;
		&amp;#039;\n\n&amp;#039;,&lt;br /&gt;
		table.concat (expanded_out_t, &amp;#039;\n&amp;#039;),&lt;br /&gt;
		}));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T S &amp;gt;---------------------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	main = main,&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>imported&gt;Trappist the monk</name></author>
	</entry>
</feed>