<?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%3ACountry_population</id>
	<title>Module:Country population - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ACountry_population"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Country_population&amp;action=history"/>
	<updated>2026-05-26T22:03:03Z</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:Country_population&amp;diff=135844&amp;oldid=prev</id>
		<title>imported&gt;WOSlinker: use require(&#039;strict&#039;) instead of require(&#039;Module:No globals&#039;)</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Country_population&amp;diff=135844&amp;oldid=prev"/>
		<updated>2022-10-21T21:21:51Z</updated>

		<summary type="html">&lt;p&gt;use require(&amp;#039;strict&amp;#039;) instead of require(&amp;#039;Module:No globals&amp;#039;)&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 fn = require(&amp;#039;Module:Formatnum&amp;#039;)&lt;br /&gt;
local mm = require(&amp;#039;Module:Math&amp;#039;)&lt;br /&gt;
local p ={}&lt;br /&gt;
--local pargs ={}&lt;br /&gt;
local args={}&lt;br /&gt;
local data={}&lt;br /&gt;
&lt;br /&gt;
p.getArgs =function(frameArgs)&lt;br /&gt;
    for k,v in pairs(frameArgs) do&lt;br /&gt;
    	args[k]=v&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = function(frame) -- entry point for template&lt;br /&gt;
	&lt;br /&gt;
	p.getArgs(frame:getParent().args)                  -- need to copy arguments because of the way frame arguments are handled&lt;br /&gt;
		&lt;br /&gt;
	if args[&amp;#039;list&amp;#039;] then p.getCountriesFromList(args[&amp;#039;list&amp;#039;]) end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;#039;mode&amp;#039;] == &amp;quot;piechart&amp;quot; then&lt;br /&gt;
		return p._piechart(frame)&lt;br /&gt;
	else&lt;br /&gt;
		return p._populations(frame)&lt;br /&gt;
	end&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
function p.getCountriesFromList(list)&lt;br /&gt;
	local country_lists = {&lt;br /&gt;
		[&amp;#039;South America&amp;#039;]  = { &amp;quot;ARG&amp;quot;,&amp;quot;BOL&amp;quot;,&amp;quot;BRA&amp;quot;,&amp;quot;CHL&amp;quot;,&amp;quot;COL&amp;quot;,&amp;quot;ECU&amp;quot;,&amp;quot;GUY&amp;quot;,&amp;quot;PRY&amp;quot;,&amp;quot;PER&amp;quot;,&amp;quot;SUR&amp;quot;,&amp;quot;URY&amp;quot;,&amp;quot;VEN&amp;quot;,&amp;quot;BVT&amp;quot;,&amp;quot;FLK&amp;quot;,&amp;quot;SGS&amp;quot;,&amp;quot;GUF&amp;quot; },&lt;br /&gt;
		[&amp;#039;North America&amp;#039;]  = { &amp;quot;ATG&amp;quot;,&amp;quot;BHS&amp;quot;,&amp;quot;BLZ&amp;quot;,&amp;quot;BRB&amp;quot;,&amp;quot;CAN&amp;quot;,&amp;quot;CRI&amp;quot;,&amp;quot;CUB&amp;quot;,&amp;quot;DMA&amp;quot;,&amp;quot;DOM&amp;quot;,&amp;quot;GRD&amp;quot;,&amp;quot;GTM&amp;quot;,&amp;quot;HND&amp;quot;,&amp;quot;HTI&amp;quot;,&amp;quot;JAM&amp;quot;,&amp;quot;KNA&amp;quot;,&amp;quot;LCA&amp;quot;,&amp;quot;MEX&amp;quot;,&amp;quot;NIC&amp;quot;,&amp;quot;PAN&amp;quot;,&amp;quot;SLV&amp;quot;,&amp;quot;TTO&amp;quot;,&amp;quot;USA&amp;quot;,&amp;quot;VCT&amp;quot; },&lt;br /&gt;
		[&amp;#039;Arab countries&amp;#039;] = { &amp;quot;EGY&amp;quot;,&amp;quot;DZA&amp;quot;,&amp;quot;SDN&amp;quot;,&amp;quot;IRQ&amp;quot;,&amp;quot;MAR&amp;quot;,&amp;quot;SAU&amp;quot;,&amp;quot;YEM&amp;quot;,&amp;quot;SYR&amp;quot;,&amp;quot;TUN&amp;quot;,&amp;quot;JOR&amp;quot;,&amp;quot;ARE&amp;quot;,&amp;quot;LBN&amp;quot;,&amp;quot;LBY&amp;quot;,&amp;quot;PSE&amp;quot;,&amp;quot;OMN&amp;quot;,&amp;quot;KWT&amp;quot;,&amp;quot;MRT&amp;quot;,&amp;quot;QAT&amp;quot;,&amp;quot;BHR&amp;quot;,&amp;quot;DJI&amp;quot;,&amp;quot;COM&amp;quot; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	---local i=1&lt;br /&gt;
	for k,v in pairs( country_lists[list] ) do&lt;br /&gt;
	     --args[i] = v&lt;br /&gt;
	     args[k] = v&lt;br /&gt;
	     --i=i+1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getPattern(section)&lt;br /&gt;
	local pattern = &amp;#039;&amp;lt;section begin=&amp;#039; .. section ..&amp;#039;[ ]*/&amp;gt;(.-)&amp;lt;section end=&amp;#039;..section..&amp;#039;[ ]*/&amp;gt;&amp;#039;&lt;br /&gt;
	return pattern&lt;br /&gt;
end&lt;br /&gt;
function p.getPopulationData(frame)&lt;br /&gt;
&lt;br /&gt;
    local page = &amp;quot;List of countries by population (United Nations)&amp;quot;&lt;br /&gt;
	data[&amp;#039;dates&amp;#039;] = {}&lt;br /&gt;
	data[&amp;#039;total&amp;#039;] = {}&lt;br /&gt;
	data.total[&amp;#039;latest&amp;#039;] = 0&lt;br /&gt;
	data.total[&amp;#039;previous&amp;#039;] = 0&lt;br /&gt;
	data.total[&amp;#039;projected&amp;#039;] = 0&lt;br /&gt;
	&lt;br /&gt;
	--local total = 0&lt;br /&gt;
	--local totalProjected = 0&lt;br /&gt;
	local count = 0&lt;br /&gt;
	local title = mw.title.new( page) -- , ns)  -- creates object if page doesn&amp;#039;t exist (and valid page name)&lt;br /&gt;
	                                            --TODO: could use mw.title.makeTitle(), but that needs ns&lt;br /&gt;
	&lt;br /&gt;
	local content = title:getContent()&lt;br /&gt;
    &lt;br /&gt;
    -- get dates &lt;br /&gt;
	for value in string.gmatch( content , p.getPattern(&amp;quot;date_1&amp;quot;) ) do&lt;br /&gt;
		data.dates[&amp;#039;latest&amp;#039;]=value                                    -- date of latest data &lt;br /&gt;
	end&lt;br /&gt;
	for value in string.gmatch( content , p.getPattern(&amp;quot;date_0&amp;quot;) ) do&lt;br /&gt;
	    data.dates[&amp;#039;previous&amp;#039;]=mw.getContentLanguage():formatDate(&amp;#039;j F Y&amp;#039;, value)&lt;br /&gt;
	end		&lt;br /&gt;
	data.dates[&amp;#039;today&amp;#039;] = mw.getContentLanguage():formatDate(&amp;#039;j F Y&amp;#039;)      -- today&amp;#039;s date (for formatting see https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time)&lt;br /&gt;
    &lt;br /&gt;
    -- get population data for each country passes as parameter&lt;br /&gt;
	for k,v in ipairs(args) do&lt;br /&gt;
		local country = mw.text.trim(v)&lt;br /&gt;
		&lt;br /&gt;
		-- get population data from section &lt;br /&gt;
	    local section = country .. &amp;quot;_1&amp;quot;&lt;br /&gt;
		for value in string.gmatch( content , p.getPattern(section) ) do&lt;br /&gt;
&lt;br /&gt;
	    	count=count+1&lt;br /&gt;
	    	data[count] = {}&lt;br /&gt;
	        data[count][&amp;#039;country&amp;#039;] = country&lt;br /&gt;
			data[count][&amp;#039;populationString&amp;#039;] = frame:preprocess(value)&lt;br /&gt;
			local raw = string.gsub(data[count][&amp;#039;populationString&amp;#039;], &amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) -- strip formatting from number string&lt;br /&gt;
            data[count][&amp;#039;populationNumber&amp;#039;] = tonumber(raw)&lt;br /&gt;
            data.total[&amp;#039;latest&amp;#039;] = data.total[&amp;#039;latest&amp;#039;] + data[count][&amp;#039;populationNumber&amp;#039;]&lt;br /&gt;
            &lt;br /&gt;
            local section = country .. &amp;quot;_0&amp;quot;&lt;br /&gt;
           	for value2 in  string.gmatch( content , p.getPattern(section) ) do&lt;br /&gt;
				data[count][&amp;#039;populationString2&amp;#039;] = frame:preprocess(value2)&lt;br /&gt;
				local raw = string.gsub(data[count][&amp;#039;populationString2&amp;#039;], &amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) -- strip formatting from number string&lt;br /&gt;
                data[count][&amp;#039;populationNumber2&amp;#039;] = tonumber(raw)&lt;br /&gt;
                data.total[&amp;#039;previous&amp;#039;] = data.total[&amp;#039;previous&amp;#039;] + data[count][&amp;#039;populationNumber2&amp;#039;]&lt;br /&gt;
                &lt;br /&gt;
                data[count][&amp;#039;populationIncrement&amp;#039;]=data[count][&amp;#039;populationNumber&amp;#039;] - data[count][&amp;#039;populationNumber2&amp;#039;]&lt;br /&gt;
                data[count][&amp;#039;populationGrowth&amp;#039;] =data[count][&amp;#039;populationIncrement&amp;#039;]/data[count][&amp;#039;populationNumber2&amp;#039;]&lt;br /&gt;
                data[count][&amp;#039;populationDouble&amp;#039;] = p.getPopulationDoubleTime(data[count][&amp;#039;populationNumber&amp;#039;],data[count][&amp;#039;populationNumber2&amp;#039;])&lt;br /&gt;
&lt;br /&gt;
                data[count][&amp;#039;populationProjected&amp;#039;] = p.getPopulationProjection(data[count][&amp;#039;populationNumber&amp;#039;],data[count][&amp;#039;populationNumber2&amp;#039;])&lt;br /&gt;
                data.total[&amp;#039;projected&amp;#039;] = data.total[&amp;#039;projected&amp;#039;] + data[count][&amp;#039;populationProjected&amp;#039;] &lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- estimate time to double population based on latest growth rate&lt;br /&gt;
function p.getPopulationDoubleTime(latest,previous)&lt;br /&gt;
	local growth = (latest - previous) / previous&lt;br /&gt;
    local doubleTime = math.log( 2 ) / math.log(1 + growth)&lt;br /&gt;
    return doubleTime&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- estimate today&amp;#039;s population based on latest growth rate&lt;br /&gt;
function p.getPopulationProjection(latest,previous)&lt;br /&gt;
	local ay =  ( mw.getCurrentFrame():callParserFunction{ name = &amp;#039;#time&amp;#039;, args = { &amp;quot;U&amp;quot;, data.dates[&amp;#039;today&amp;#039;] } }&lt;br /&gt;
                - mw.getCurrentFrame():callParserFunction{ name = &amp;#039;#time&amp;#039;, args = { &amp;quot;U&amp;quot;, data.dates[&amp;#039;previous&amp;#039;] } })&lt;br /&gt;
                /60/60/24/365.2425 -- number of years since first date until today‬&lt;br /&gt;
	local projected = math.pow(previous, 1 - ay ) * math.pow(latest, ay)&lt;br /&gt;
    return projected&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ sort rows by population (defaults to latest population)&lt;br /&gt;
     TODO add options for sorting columns&lt;br /&gt;
  ]]&lt;br /&gt;
function p.sortPopulationData(ByColumn)&lt;br /&gt;
	&lt;br /&gt;
    local sort_function = function( a,b )&lt;br /&gt;
	    if (tonumber(a.populationNumber) &amp;gt; tonumber(b.populationNumber)) then                -- primary sort on &amp;#039;population&amp;#039; -&amp;gt; a before b&lt;br /&gt;
	        return true&lt;br /&gt;
	    end&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
    table.sort(data, sort_function)&lt;br /&gt;
end&lt;br /&gt;
--[[  Function to get flag icon and handle special cases &lt;br /&gt;
      1.  There is an issue of non-standard sizes when used with static rank column &lt;br /&gt;
	      The three countries with extra height (and the required size parameter) are &lt;br /&gt;
	           Nepal/NPL (size=12px), Switzerland/CHE (size=15px), Vatican/VAT (size=15px)&lt;br /&gt;
	           a few have lower default heights so it doesn&amp;#039;t matter (Poland, New Caledonia)&lt;br /&gt;
      2. Alias, e.g. NEP-&amp;gt;NPL, TRI-&amp;gt;TTO&lt;br /&gt;
  ]]&lt;br /&gt;
function p.getFlagLabel(countryCode)&lt;br /&gt;
	local output &lt;br /&gt;
	local templateArgs = { countryCode }&lt;br /&gt;
	&lt;br /&gt;
	local size&lt;br /&gt;
    if countryCode == &amp;quot;CHE&amp;quot; or countryCode == &amp;quot;VAT&amp;quot; then&lt;br /&gt;
    	size=&amp;quot;15px&amp;quot;&lt;br /&gt;
    elseif countryCode == &amp;quot;NPL&amp;quot; then&lt;br /&gt;
    	size=&amp;quot;12px&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if size then templateArgs[&amp;#039;size&amp;#039;] = size end&lt;br /&gt;
&lt;br /&gt;
	-- simple version&lt;br /&gt;
	--output = mw.getCurrentFrame():expandTemplate{ title = &amp;quot;flagcountry&amp;quot;, args = templateArgs } &lt;br /&gt;
	&lt;br /&gt;
	-- method with fixed-height div and overflow&lt;br /&gt;
    output = &amp;#039;&amp;lt;div style=&amp;quot;height:15px;overflow:visible;&amp;quot; &amp;gt;&amp;#039;&lt;br /&gt;
		  .. mw.getCurrentFrame():expandTemplate{ title = &amp;quot;flagcountry&amp;quot;, args = templateArgs  }&lt;br /&gt;
	      .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return output		          	        &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ output table of data as Wikitext table&lt;br /&gt;
  ]]&lt;br /&gt;
function p.tabulateDataWikitext(frame)&lt;br /&gt;
&lt;br /&gt;
    local output&lt;br /&gt;
    local i = 1&lt;br /&gt;
    -- output table&lt;br /&gt;
    output = &amp;#039;{| class=&amp;quot;wikitable sortable mw-datatable&amp;quot; style=&amp;quot;text-align:right;&amp;quot; &amp;#039;    -- table&lt;br /&gt;
    output = &amp;#039;|-class=wrap&amp;#039;&lt;br /&gt;
    output = output                                                        --headers (top row)&lt;br /&gt;
              .. &amp;#039;\n!rowspan=2|#&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!rowspan=2|Country&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!rowspan=2|Projected population&amp;lt;br/&amp;gt;(&amp;#039; .. data[&amp;#039;dates&amp;#039;][&amp;#039;today&amp;#039;] .. &amp;#039;)&amp;#039; &lt;br /&gt;
              .. &amp;#039;\n!rowspan=2|Pct of&amp;lt;br/&amp;gt;total&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!colspan=2|UN Population estimates&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!colspan=2|Annual growth&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!rowspan=2|Doubling time&amp;lt;br/&amp;gt;(years)&amp;#039;&lt;br /&gt;
            &lt;br /&gt;
              .. &amp;#039;\n|-&amp;#039;                                                    -- headers (second row)&lt;br /&gt;
              .. &amp;#039;\n!&amp;#039; .. data.dates[&amp;#039;latest&amp;#039;] &lt;br /&gt;
              .. &amp;#039;\n!&amp;#039; .. data.dates[&amp;#039;previous&amp;#039;] &lt;br /&gt;
              .. &amp;#039;\n!Increment&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!Rate&amp;#039;                  &lt;br /&gt;
    &lt;br /&gt;
    while (data[i]) do                                                     -- add rows&lt;br /&gt;
       output = output .. &amp;#039;\n|-\n|&amp;#039; ..  i &lt;br /&gt;
       output = output .. &amp;#039;\n|style=&amp;quot;text-align:left;&amp;quot; |&amp;#039; .. frame:expandTemplate{ title = &amp;quot;flag+link&amp;quot;, args = {&amp;#039;Demographics of&amp;#039;, data[i][&amp;#039;country&amp;#039;] }  }&lt;br /&gt;
       output = output .. &amp;#039;\n| &amp;#039; .. mm._precision_format(data[i][&amp;#039;populationProjected&amp;#039;],0)  &lt;br /&gt;
       output = output .. &amp;#039;\n| &amp;#039; .. mm._precision_format(data[i][&amp;#039;populationProjected&amp;#039;]/data.total[&amp;#039;projected&amp;#039;]*100,2) .. &amp;quot;%&amp;quot; -- projected&lt;br /&gt;
       output = output .. &amp;#039;\n| &amp;#039; .. data[i][&amp;#039;populationString&amp;#039;] &lt;br /&gt;
       output = output .. &amp;#039;\n| &amp;#039; .. data[i][&amp;#039;populationString2&amp;#039;] &lt;br /&gt;
       output = output .. &amp;#039;\n| &amp;#039; .. mm._precision_format(data[i][&amp;#039;populationIncrement&amp;#039;],0) &lt;br /&gt;
       output = output .. &amp;#039;\n| &amp;#039; .. mm._round(data[i][&amp;#039;populationGrowth&amp;#039;]*100,2) .. &amp;quot;%&amp;quot;&lt;br /&gt;
       output = output .. &amp;#039;\n| &amp;#039; .. mm._round(data[i][&amp;#039;populationDouble&amp;#039;],0)&lt;br /&gt;
       i=i+1&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local newcell = &amp;#039;\n! style=&amp;quot;text-align:right;&amp;quot; | &amp;#039;    &lt;br /&gt;
    output = output .. &amp;#039;\n|-&amp;#039;                                              -- totals row&lt;br /&gt;
        .. &amp;#039;\n! !! Total&amp;#039; &lt;br /&gt;
        .. newcell .. fn.formatNum(mm._round(data.total[&amp;#039;projected&amp;#039;],0),&amp;quot;en&amp;quot;,0) &lt;br /&gt;
        .. newcell .. &amp;#039;100%&amp;#039;&lt;br /&gt;
        .. newcell .. fn.formatNum(data.total[&amp;#039;latest&amp;#039;],&amp;quot;en&amp;quot;,0) &lt;br /&gt;
        .. newcell .. fn.formatNum(data.total[&amp;#039;previous&amp;#039;],&amp;quot;en&amp;quot;,0) &lt;br /&gt;
        .. newcell .. fn.formatNum(data.total[&amp;#039;latest&amp;#039;]-data.total[&amp;#039;previous&amp;#039;],&amp;quot;en&amp;quot;,0)&lt;br /&gt;
        .. newcell .. fn.formatNum((data.total[&amp;#039;latest&amp;#039;]-data.total[&amp;#039;previous&amp;#039;])/data.total[&amp;#039;previous&amp;#039;]*100,&amp;quot;en&amp;quot;,2)..&amp;quot;%&amp;quot;&lt;br /&gt;
        .. newcell .. mm._precision_format(p.getPopulationDoubleTime(data.total[&amp;#039;latest&amp;#039;],data.total[&amp;#039;previous&amp;#039;]),0)&lt;br /&gt;
                                 &lt;br /&gt;
    output = output .. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
    return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ output table of data as use Lua HTML Library&lt;br /&gt;
]]&lt;br /&gt;
function p.tabulateData(frame)&lt;br /&gt;
    &lt;br /&gt;
    local hideYearsCols = false&lt;br /&gt;
    if args[&amp;#039;hide_years&amp;#039;] == &amp;quot;true&amp;quot; then hideYearsCols = true end -- note the frame argument is a string, not a boolean&lt;br /&gt;
    local doublingFootnote = args[&amp;#039;doubling_note&amp;#039;] or &amp;quot;&amp;quot;&lt;br /&gt;
    local growthFootnote = args[&amp;#039;growth_note&amp;#039;] or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local i = 1&lt;br /&gt;
    local static = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
                                         &lt;br /&gt;
    static:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 1):wikitext(&amp;#039;&amp;lt;br/&amp;gt;&amp;#039;):cssText(&amp;#039;border-bottom-color:#eaecf0;&amp;#039;)&lt;br /&gt;
    static:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;&amp;lt;br/&amp;gt;&amp;#039;):cssText(&amp;#039;border-top-color:#eaecf0;&amp;#039;)&lt;br /&gt;
    while (data[i]) do                                                     -- add rows&lt;br /&gt;
		static:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;td&amp;#039;):wikitext(i)&lt;br /&gt;
		i=i+1&lt;br /&gt;
	end&lt;br /&gt;
    static:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;&amp;lt;br/&amp;gt;&amp;#039;)&lt;br /&gt;
    local numRows=i-1&lt;br /&gt;
&lt;br /&gt;
    local tbl = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable&amp;#039;)             -- start table&lt;br /&gt;
                                       :addClass(&amp;#039;sortable&amp;#039;)&lt;br /&gt;
                                       :addClass(&amp;#039;srn-datatable&amp;#039;)&lt;br /&gt;
                                       :addClass(&amp;#039;static-row-numbers&amp;#039;)   -- prefix with row numbers using css and templatestyles&lt;br /&gt;
--									   :addClass(&amp;#039;nowrap&amp;#039;)&lt;br /&gt;
                                       :css(&amp;#039;text-align&amp;#039;,&amp;#039;right&amp;#039;)&lt;br /&gt;
                                       &lt;br /&gt;
    local row = tbl:tag(&amp;#039;tr&amp;#039;)                                             -- header row&lt;br /&gt;
                   :addClass(&amp;#039;static-row-header&amp;#039;)                                -- for templatestyles in some skins&lt;br /&gt;
			--:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2):wikitext(&amp;#039;#&amp;#039;)&lt;br /&gt;
	row	    :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2):wikitext(&amp;#039;Country&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2):wikitext(&amp;#039;Projected population&amp;lt;br/&amp;gt;(&amp;#039; .. data[&amp;#039;dates&amp;#039;][&amp;#039;today&amp;#039;] .. &amp;#039;)&amp;#039; )&lt;br /&gt;
		    :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2):wikitext(&amp;#039;Pct of&amp;lt;br/&amp;gt;total&amp;#039;)&lt;br /&gt;
    if not hideYearsCols then&lt;br /&gt;
		row :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, 2):wikitext(&amp;#039;UN Population estimates&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	row	    :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, 2):wikitext(&amp;#039;Annual growth&amp;#039;..growthFootnote)&lt;br /&gt;
		    :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2):wikitext(&amp;#039;Doubling time&amp;lt;br/&amp;gt;(years)&amp;#039;..doublingFootnote)&lt;br /&gt;
    &lt;br /&gt;
    row = tbl:tag(&amp;#039;tr&amp;#039;)                                                    -- headers (second row)&lt;br /&gt;
             :addClass(&amp;#039;static-row-header&amp;#039;)                                -- for templatestyles in some skins&lt;br /&gt;
    if not hideYearsCols then&lt;br /&gt;
		row :tag(&amp;#039;th&amp;#039;):wikitext(data.dates[&amp;#039;latest&amp;#039;] )&lt;br /&gt;
		    :tag(&amp;#039;th&amp;#039;):wikitext(data.dates[&amp;#039;previous&amp;#039;] )&lt;br /&gt;
    end&lt;br /&gt;
	row		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Increment&amp;#039;)&lt;br /&gt;
		    :tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Rate&amp;#039;)     &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    i = 1&lt;br /&gt;
    while (data[i]) do                                                     -- add country rows&lt;br /&gt;
		&lt;br /&gt;
		local row=tbl:tag(&amp;#039;tr&amp;#039;) &lt;br /&gt;
		&lt;br /&gt;
		if p.norank(i) then &lt;br /&gt;
			row:addClass(&amp;#039;static-row-numbers-norank&amp;#039;)  -- add class to suppress display of rank number&lt;br /&gt;
	    end&lt;br /&gt;
	    &lt;br /&gt;
		--row :tag(&amp;#039;td&amp;#039;):wikitext(i)  &lt;br /&gt;
		row		:tag(&amp;#039;td&amp;#039;):cssText(&amp;quot;text-align:left;&amp;quot;)&lt;br /&gt;
			              :wikitext( frame:expandTemplate{ title = &amp;quot;flag+link&amp;quot;, args = { &amp;#039;Demographics of&amp;#039;, data[i][&amp;#039;country&amp;#039;] } } )&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext( mm._precision_format(data[i][&amp;#039;populationProjected&amp;#039;],0)  )&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext( mm._precision_format(data[i][&amp;#039;populationProjected&amp;#039;]/data.total[&amp;#039;projected&amp;#039;]*100,2) .. &amp;quot;%&amp;quot; ) -- % of projected &lt;br /&gt;
		if not hideYearsCols then&lt;br /&gt;
			row	:tag(&amp;#039;td&amp;#039;):wikitext( data[i][&amp;#039;populationString&amp;#039;] )&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext( data[i][&amp;#039;populationString2&amp;#039;] )&lt;br /&gt;
		end&lt;br /&gt;
		row		:tag(&amp;#039;td&amp;#039;):wikitext( mm._precision_format(data[i][&amp;#039;populationIncrement&amp;#039;],0) )&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext( mm._precision_format(data[i][&amp;#039;populationGrowth&amp;#039;]*100,2) .. &amp;quot;%&amp;quot; )&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext( mm._precision_format(data[i][&amp;#039;populationDouble&amp;#039;],0) )&lt;br /&gt;
		i=i+1&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local style = { [&amp;#039;text-align&amp;#039;]=&amp;#039;right&amp;#039; }    &lt;br /&gt;
    row = tbl:tag(&amp;#039;tr&amp;#039;)                                             -- totals row&lt;br /&gt;
            :addClass(&amp;#039;static-row-header&amp;#039;)                                -- for templatestyles in some skins&lt;br /&gt;
		    --:tag(&amp;#039;th&amp;#039;)           :wikitext()&lt;br /&gt;
	row	    :tag(&amp;#039;th&amp;#039;)           :wikitext(&amp;#039;Total&amp;#039;)&lt;br /&gt;
		    :tag(&amp;#039;th&amp;#039;):css(style):wikitext( fn.formatNum(mm._round(data.total[&amp;#039;projected&amp;#039;],0),&amp;quot;en&amp;quot;,0) ) &lt;br /&gt;
		    :tag(&amp;#039;th&amp;#039;):css(style):wikitext( &amp;#039;100%&amp;#039; )&lt;br /&gt;
	if not hideYearsCols then&lt;br /&gt;
	   row  :tag(&amp;#039;th&amp;#039;):css(style):wikitext( fn.formatNum(data.total[&amp;#039;latest&amp;#039;],  &amp;quot;en&amp;quot;,0) )&lt;br /&gt;
		    :tag(&amp;#039;th&amp;#039;):css(style):wikitext( fn.formatNum(data.total[&amp;#039;previous&amp;#039;],&amp;quot;en&amp;quot;,0) )&lt;br /&gt;
	end&lt;br /&gt;
	row		:tag(&amp;#039;th&amp;#039;):css(style):wikitext( fn.formatNum(data.total[&amp;#039;latest&amp;#039;]  - data.total[&amp;#039;previous&amp;#039;],&amp;quot;en&amp;quot;,0) )&lt;br /&gt;
		    :tag(&amp;#039;th&amp;#039;):css(style):wikitext( fn.formatNum((data.total[&amp;#039;latest&amp;#039;] - data.total[&amp;#039;previous&amp;#039;]) / data.total[&amp;#039;previous&amp;#039;] * 100,&amp;quot;en&amp;quot;,2)..&amp;quot;%&amp;quot; )&lt;br /&gt;
		    :tag(&amp;#039;th&amp;#039;):css(style):wikitext( mm._precision_format(p.getPopulationDoubleTime(data.total[&amp;#039;latest&amp;#039;],data.total[&amp;#039;previous&amp;#039;]),0) )&lt;br /&gt;
	                             &lt;br /&gt;
    -- return tostring(tbl) -- return table without row numbers&lt;br /&gt;
    &lt;br /&gt;
    -- use separate column for static row numbers&lt;br /&gt;
    -- return &amp;#039;{|\n|style=&amp;quot;vertical-align:top;&amp;quot; |&amp;#039; .. tostring(static) .. &amp;#039;\n|&amp;#039; .. tostring(tbl) .. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
    -- use css method and templatestyles to prefix row numbers&lt;br /&gt;
    return p.templateStyle( frame, &amp;quot;Template:Static_row_numbers/styles.css&amp;quot; ) .. tostring(tbl)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[  function p.norank(i)&lt;br /&gt;
          check norank parameter for territories that won&amp;#039;t display rank number in first column&lt;br /&gt;
  ]]&lt;br /&gt;
function p.norank(i)&lt;br /&gt;
	if args[&amp;#039;norank&amp;#039;] then                                                          -- if norank variable&lt;br /&gt;
		if  string.find( args[&amp;#039;norank&amp;#039;], data[i][&amp;#039;country&amp;#039;], 1, true ) ~= nil then  -- contains the country code&lt;br /&gt;
			return true                                                             -- return true&lt;br /&gt;
	    end&lt;br /&gt;
	--if data[i][&amp;#039;country&amp;#039;] == &amp;quot;FLK&amp;quot; or data[i][&amp;#039;country&amp;#039;] == &amp;quot;GUF&amp;quot; then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false                                                                    -- end return false&lt;br /&gt;
end&lt;br /&gt;
--[[  function p.populations(frame) -- currently the main entry function&lt;br /&gt;
         takes list of country codes&lt;br /&gt;
         gets population data from &amp;quot;List of countries by population (United Nations)&amp;quot;&lt;br /&gt;
         outputs sorted table&lt;br /&gt;
  ]]&lt;br /&gt;
function p.populations(frame) -- entru point for invoke (uses frame arguments)&lt;br /&gt;
    &lt;br /&gt;
    args = frame.args  --TODO handle parent args for template&lt;br /&gt;
    return p._populations(frame)&lt;br /&gt;
end&lt;br /&gt;
function p._populations(frame)&lt;br /&gt;
   &lt;br /&gt;
    local page = &amp;quot;List of countries by population (United Nations)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local title = mw.title.new( page) -- , ns)  -- creates object if page doesn&amp;#039;t exist (and valid page name)&lt;br /&gt;
	                                            --TODO: could use mw.title.makeTitle(), but that needs ns&lt;br /&gt;
    local output = &amp;quot;&amp;quot;&lt;br /&gt;
	if title and title.exists then &lt;br /&gt;
		local content = title:getContent()&lt;br /&gt;
&lt;br /&gt;
        if not p.getPopulationData(frame) then&lt;br /&gt;
        	return p.errormsg(&amp;quot;Error retrieving data.&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
		&lt;br /&gt;
		p.sortPopulationData(&amp;quot;latest&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        --output =  p.tabulateDataWikitext(frame) -- version building table with Wikitext&lt;br /&gt;
        output =  p.tabulateData(frame)           -- version building table with mw.html library&lt;br /&gt;
        &lt;br /&gt;
    else&lt;br /&gt;
    	return  &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;No page title found&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local test = &amp;quot;test: &amp;quot; &lt;br /&gt;
	local number=5435.12345 &lt;br /&gt;
	test= 	fn.formatNum(5435.12345,&amp;quot;en&amp;quot;,0)&lt;br /&gt;
	--test=   frame:expandTemplate{ title = &amp;quot;formatnum&amp;quot;, args = { totalProjected ,&amp;quot;en&amp;quot;,0 } }&lt;br /&gt;
	--test=frame:callParserFunction{ name = &amp;#039;formatnum&amp;#039;, args = { totalProjected, decs=2 } }   &lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   return output            --.. test&lt;br /&gt;
end&lt;br /&gt;
-- function for pie chart&lt;br /&gt;
function p.piechart(frame)&lt;br /&gt;
    &lt;br /&gt;
    args = frame.args  --TODO handle parent args for template&lt;br /&gt;
    return p._piechart(frame)&lt;br /&gt;
end&lt;br /&gt;
function p._piechart(frame)&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    local page = &amp;quot;List of countries by population (United Nations)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local title = mw.title.new( page) -- , ns)  -- creates object if page doesn&amp;#039;t exist (and valid page name)&lt;br /&gt;
	                                            --TODO: could use mw.title.makeTitle(), but that needs ns&lt;br /&gt;
    local output = &amp;quot;&amp;quot;&lt;br /&gt;
	if title and title.exists then &lt;br /&gt;
		local content = title:getContent()&lt;br /&gt;
&lt;br /&gt;
        if not p.getPopulationData(frame) then&lt;br /&gt;
        	return p.errormsg(&amp;quot;Error retrieving data.&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
		&lt;br /&gt;
		p.sortPopulationData(&amp;quot;latest&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        --output =  p.tabulateDataWikitext(frame) -- version building table with Wikitext&lt;br /&gt;
        output =  p.makePieChart(frame)           -- version building table with mw.html library&lt;br /&gt;
        &lt;br /&gt;
    else&lt;br /&gt;
    	return  &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;No page title found&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   return output            --.. test&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makePieChart(frame)   &lt;br /&gt;
   &lt;br /&gt;
   --local args=frame.args&lt;br /&gt;
   local templateArgs = {}&lt;br /&gt;
   &lt;br /&gt;
   templateArgs[&amp;#039;caption&amp;#039;] = args[&amp;#039;caption&amp;#039;] or &amp;quot;&amp;quot; --&amp;#039;South American population by country&amp;#039;  --.. &amp;#039; (top 8)&amp;#039;&lt;br /&gt;
   templateArgs[&amp;#039;thumb&amp;#039;] = args[&amp;#039;thumb&amp;#039;] or &amp;quot;right&amp;quot;&lt;br /&gt;
   templateArgs[&amp;#039;other&amp;#039;] = args[&amp;#039;other&amp;#039;] or nil&lt;br /&gt;
   local maxSlices = tonumber(args[&amp;#039;slices&amp;#039;]) -- nil if not a number&lt;br /&gt;
   if type(maxSlices) ~= &amp;quot;number&amp;quot; or maxSlices &amp;gt; 30 or maxSlices &amp;lt; 1 then&lt;br /&gt;
	   maxSlices = 30 -- limit of template                                -- get number from data&lt;br /&gt;
   end&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   local i=1&lt;br /&gt;
   while data[i] and i &amp;lt;= maxSlices do&lt;br /&gt;
	   --templateArgs[&amp;#039;label&amp;#039;..i] = data[i][&amp;#039;country&amp;#039;] &lt;br /&gt;
	   templateArgs[&amp;#039;label&amp;#039;..i] = mw.getCurrentFrame():expandTemplate{ title = &amp;quot;getalias&amp;quot;, args = { data[i][&amp;#039;country&amp;#039;], raw=&amp;#039;y&amp;#039;, &amp;#039;shortname&amp;#039; } }&lt;br /&gt;
	   templateArgs[&amp;#039;value&amp;#039;..i] = mm._round( data[i][&amp;#039;populationNumber&amp;#039;]/data.total[&amp;#039;latest&amp;#039;]*100,1)&lt;br /&gt;
	   templateArgs[&amp;#039;color&amp;#039;..i] = args[&amp;#039;color&amp;#039;..i] or nil&lt;br /&gt;
	   i=i+1&lt;br /&gt;
   end&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
--[[{{Pie chart&lt;br /&gt;
|caption= South American population by country (top 8)&lt;br /&gt;
|other = yes&lt;br /&gt;
|label1 = {{getalias|BRA}}&lt;br /&gt;
|value1 = {{#expr: {{country population|BRA|raw=y}} / {{xyz|Total}} * 100 round 1}}&lt;br /&gt;
|label2 = {{getalias|COL}}&lt;br /&gt;
|value2 = {{#expr: {{country population|COL|raw=y}} / {{xyz|Total}} * 100 round 1}}&lt;br /&gt;
|label3 = {{getalias|ARG}}&lt;br /&gt;
|value3 = {{#expr: {{country population|ARG|raw=y}} / {{xyz|Total}} * 100 round 1}}&lt;br /&gt;
|label4 = {{getalias|PER}}&lt;br /&gt;
|value4 = {{#expr: {{country population|PER|raw=y}} / {{xyz|Total}} * 100 round 1}}&lt;br /&gt;
|label5 = {{getalias|VEN}}&lt;br /&gt;
|value5 = {{#expr: {{country population|VEN|raw=y}} / {{xyz|Total}} * 100 round 1}}&lt;br /&gt;
|label6 = {{getalias|CHL}}&lt;br /&gt;
|value6 = {{#expr: {{country population|CHL|raw=y}} / {{xyz|Total}} * 100 round 1}}&lt;br /&gt;
|label7 = {{getalias|ECU}}&lt;br /&gt;
|value7 = {{#expr: {{country population|ECU|raw=y}} / {{xyz|Total}} * 100 round 1}}&lt;br /&gt;
|label8 = {{getalias|BOL}}&lt;br /&gt;
|value8 = {{#expr: {{country population|BOL|raw=y}} / {{xyz|Total}} * 100 round 1}}&lt;br /&gt;
}}  ]] &lt;br /&gt;
   &lt;br /&gt;
   local chart = mw.getCurrentFrame():expandTemplate{ title = &amp;quot;Pie chart&amp;quot;, args = templateArgs  }&lt;br /&gt;
   &lt;br /&gt;
   return chart&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.firstToUpper(str)&lt;br /&gt;
    return (str:gsub(&amp;quot;^%l&amp;quot;, string.upper))&lt;br /&gt;
end&lt;br /&gt;
p.errormsg = function (message)&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;&amp;#039; .. message .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; &lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
-- Test why was the sort being applied to the wrong level? Fixed &lt;br /&gt;
function p.test(frame) -- meant test()&lt;br /&gt;
&lt;br /&gt;
    local tbl = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable&amp;#039;):addClass(&amp;#039;sortable&amp;#039;):addClass(&amp;#039;mw-datatable&amp;#039;)&lt;br /&gt;
                                                   :css(&amp;#039;text-align&amp;#039;,&amp;#039;right&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    tbl:tag(&amp;#039;tr&amp;#039;)                                             -- header row&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2):wikitext(&amp;#039;#&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2):wikitext(&amp;#039;A&amp;#039;)&lt;br /&gt;
	    :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2):wikitext(&amp;#039;B&amp;#039;)&lt;br /&gt;
	    :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, 2):wikitext(&amp;#039;C+D&amp;#039;):addClass(&amp;#039;unsortable&amp;#039;)&lt;br /&gt;
	    :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, 2):wikitext(&amp;#039;E+F&amp;#039;):addClass(&amp;#039;unsortable&amp;#039;)&lt;br /&gt;
	    :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2):wikitext(&amp;#039;G&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    tbl:tag(&amp;#039;tr&amp;#039;)                                                    -- headers (second row)&lt;br /&gt;
	    :tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;C&amp;#039;):addClass(&amp;#039;sortable&amp;#039;)&lt;br /&gt;
	    :tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;D&amp;#039;):addClass(&amp;#039;sortable&amp;#039;)&lt;br /&gt;
	    :tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;E&amp;#039;):addClass(&amp;#039;sortable&amp;#039;)&lt;br /&gt;
	    :tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;F&amp;#039;)   :addClass(&amp;#039;sortable&amp;#039;)  &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    local i = 1&lt;br /&gt;
    while (i&amp;lt;5) do                                                     -- add rows&lt;br /&gt;
		tbl:tag(&amp;#039;tr&amp;#039;) &lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(i)  &lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(&amp;quot;A&amp;quot;..i)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(&amp;quot;B&amp;quot;..i)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(tostring(math.fmod(5-i,2)) .. &amp;#039;C&amp;#039; .. i )&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(&amp;quot;D&amp;quot;..i)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(&amp;quot;E&amp;quot;..i)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(tostring(math.fmod(5-i,2)) .. &amp;#039;F&amp;#039; .. i )&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(&amp;quot;G&amp;quot;..i)&lt;br /&gt;
		i=i+1&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local output = &amp;#039;{| class=&amp;quot;wikitable sortable mw-datatable&amp;quot; style=&amp;quot;text-align:right;&amp;quot; &amp;#039;    -- table&lt;br /&gt;
    output = output&lt;br /&gt;
              .. &amp;#039;\n!rowspan=2|#&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!rowspan=2|A&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!rowspan=2|B&amp;#039; &lt;br /&gt;
              .. &amp;#039;\n!colspan=2|C+D&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!colspan=2|E+F&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!rowspan=2|G&amp;#039;&lt;br /&gt;
            &lt;br /&gt;
              .. &amp;#039;\n|-&amp;#039;                                                    -- headers (second row)&lt;br /&gt;
              .. &amp;#039;\n!C&amp;#039; &lt;br /&gt;
              .. &amp;#039;\n!D&amp;#039; &lt;br /&gt;
              .. &amp;#039;\n!E&amp;#039;&lt;br /&gt;
              .. &amp;#039;\n!F&amp;#039;                  &lt;br /&gt;
    i=1&lt;br /&gt;
    while (i&amp;lt;5) do                                                     -- add rows&lt;br /&gt;
       output = output .. &amp;#039;\n|-\n|&amp;#039; ..  i &lt;br /&gt;
       output = output .. &amp;#039;\n|A&amp;#039; .. i &lt;br /&gt;
       output = output .. &amp;#039;\n|B&amp;#039; .. i&lt;br /&gt;
       output = output .. &amp;#039;\n|&amp;#039; .. tostring(math.fmod(5-i,2)) .. &amp;#039;C&amp;#039; .. i &lt;br /&gt;
       output = output .. &amp;#039;\n|D&amp;#039; .. i &lt;br /&gt;
       output = output .. &amp;#039;\n|E&amp;#039; .. i &lt;br /&gt;
       output = output .. &amp;#039;\n|&amp;#039; .. tostring(math.fmod(5-i,2)) .. &amp;#039;F&amp;#039; .. i &lt;br /&gt;
       output = output .. &amp;#039;\n|G&amp;#039; .. i&lt;br /&gt;
       i=i+1&lt;br /&gt;
    end&lt;br /&gt;
    output = output .. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    return output .. tostring(tbl)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- function for static rank column&lt;br /&gt;
&lt;br /&gt;
function p.rank(frame)&lt;br /&gt;
&lt;br /&gt;
	--args = frame.args           -- for module TODO allow invoke to work&lt;br /&gt;
	args = frame:getParent().args -- parent arguments for template&lt;br /&gt;
	args = frame.args -- invoke arguments for template&lt;br /&gt;
	&lt;br /&gt;
	local caption         = args[&amp;#039;caption&amp;#039;]          &lt;br /&gt;
	local valign          = args[&amp;#039;valign&amp;#039;] or &amp;quot;top&amp;quot;&lt;br /&gt;
	local rowHeader       = args[&amp;#039;row-header&amp;#039;] &lt;br /&gt;
	local headerPadding   = args[&amp;#039;header-padding&amp;#039;] or &amp;quot;0px&amp;quot;&lt;br /&gt;
	local textAlign       = args[&amp;#039;text-align&amp;#039;] or &amp;quot;right&amp;quot;&lt;br /&gt;
	local style           = args[&amp;#039;style&amp;#039;] or &amp;quot;&amp;quot;&lt;br /&gt;
	local headerHeight    = args[&amp;#039;header-height&amp;#039;] or &amp;quot;&amp;quot;&lt;br /&gt;
	local headerLines     = args[&amp;#039;header-lines&amp;#039;]  or 1&lt;br /&gt;
	local headerText      = args[&amp;#039;header-text&amp;#039;] or &amp;quot;&amp;quot;&lt;br /&gt;
	local rows            = tonumber(args[&amp;#039;rows&amp;#039;]) or 0&lt;br /&gt;
	local rowHeader       = args[&amp;#039;row-header&amp;#039;] &lt;br /&gt;
	local rowHeight       = args[&amp;#039;row-height&amp;#039;] &lt;br /&gt;
	&lt;br /&gt;
	local marginRight = &amp;quot;0px&amp;quot;&lt;br /&gt;
	if rowHeader then marginRight = &amp;quot;-8px&amp;quot; end&lt;br /&gt;
	local headerValign    = &amp;quot;bottom&amp;quot;&lt;br /&gt;
	if rowHeader then headerValign = &amp;quot;center&amp;quot; end     -- copied from template; should be middle?&lt;br /&gt;
	local linebreaks = &amp;quot;&amp;quot;&lt;br /&gt;
	if headerLines then&lt;br /&gt;
		local i=0&lt;br /&gt;
		while i&amp;lt;tonumber(headerLines) do&lt;br /&gt;
			linebreaks = linebreaks ..  &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
			i=i+1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
{| &lt;br /&gt;
|+&amp;#039;&amp;#039;&amp;#039;{{{caption| }}}&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| valign={{{valign|top}}} |&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-right:{{#if:{{{row-header|}}}|-8px|0px}}; padding:{{{header-padding|0px}}}; text-align:{{{text-align|right}}};{{{style|}}}&amp;quot;&lt;br /&gt;
! style=height:{{{header-height|}}} valign={{{header-valign|{{#if: {{{row-header|}}} | center | bottom}}}}} | {{#if:{{{header-lines|}}}|{{repeat|{{#expr:{{{header-lines}}}-1}}|&amp;lt;br&amp;gt;}}}}{{{header-text|}}}&lt;br /&gt;
]]&lt;br /&gt;
    local heightClass = &amp;quot;static-rank-col&amp;quot;&lt;br /&gt;
    if rowHeight and rowHeight == &amp;quot;large&amp;quot; then&lt;br /&gt;
    	heightClass = &amp;quot;static-rank-col-large&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
	local output =      &amp;#039;\n{| class=&amp;quot;&amp;#039;..heightClass..&amp;#039;&amp;quot;&amp;#039;                                                          --start static rank table&lt;br /&gt;
    if caption then&lt;br /&gt;
    	output = output  .. &amp;quot;\n|+&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. caption .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    output = output  .. &amp;#039;\n|valign=&amp;#039; .. valign .. &amp;#039; |&amp;#039;&lt;br /&gt;
        	    	 .. &amp;#039;\n{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-right:&amp;#039;..marginRight&lt;br /&gt;
                    		                      ..&amp;#039;; padding:&amp;#039;..headerPadding&lt;br /&gt;
                            		              ..&amp;#039;; text-align:&amp;#039;..textAlign &lt;br /&gt;
                                    		      ..&amp;#039;;&amp;#039;.. style&lt;br /&gt;
        		     .. &amp;#039;\n! style=&amp;quot;height:&amp;#039;..headerHeight..&amp;#039;;&amp;quot; valign=&amp;quot;&amp;#039;..headerValign ..&amp;#039;;&amp;quot; | &amp;#039; &lt;br /&gt;
            		 ..  linebreaks .. headerText&lt;br /&gt;
&lt;br /&gt;
--[[ {{#ifexpr:{{{rows}}}=0|&amp;lt;br /&amp;gt;&lt;br /&gt;
{{end}}}}{{#ifexpr:{{{rows}}}&amp;gt;=1|{{Static column row |row-height={{{row-height|}}} |number=1 |row-header={{{row-header| }}} }}}}{{#ifexpr:{{{rows}}}=1|&amp;lt;br /&amp;gt;&lt;br /&gt;
{{end}}}}{{#ifexpr:{{{rows}}}&amp;gt;=2|{{Static column row |row-height={{{row-height|}}} |number=2 |row-header={{{row-header| }}} }}}}{{#ifexpr:{{{rows}}}=2|&amp;lt;br /&amp;gt;&lt;br /&gt;
{{end}}}&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
	local i=0&lt;br /&gt;
	while i&amp;lt;rows do&lt;br /&gt;
		i=i+1&lt;br /&gt;
	    --output = output .. &amp;#039;\n|-\n|&amp;#039; .. tostring(i)           -- simple unformatted version&lt;br /&gt;
	    &lt;br /&gt;
--[[	    &amp;lt;br /&amp;gt;&lt;br /&gt;
|- {{#if: {{{row-height|}}}|style=&amp;quot;height:{{{row-height|}}}&amp;quot;|}}&lt;br /&gt;
{{#if: {{{row-header|}}} | ! | {{!}} }} {{{number}}}&lt;br /&gt;
]] &lt;br /&gt;
                                                          -- version emulating Template:Static column row                                                &lt;br /&gt;
          local rowStyle = &amp;quot;&amp;quot;&lt;br /&gt;
          if rowHeight then rowStyle  = &amp;#039;style=&amp;quot;height:&amp;#039;..rowHeight..&amp;#039;;&amp;quot; |&amp;#039; end&lt;br /&gt;
          local cellType = &amp;quot;|&amp;quot;&lt;br /&gt;
          if rowHeader then cellType = &amp;quot;!&amp;quot; end&lt;br /&gt;
          output = output .. &amp;#039;\n|-&amp;#039; .. rowStyle &lt;br /&gt;
                          .. &amp;#039;\n&amp;#039; .. cellType .. tostring(i) .. &amp;#039;&amp;lt;br /&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output = output .. &amp;#039;\n|}&amp;#039;                                                      -- close the static rank table&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	output = output .. &amp;#039;\n|&amp;#039;     -- new cell for the main table&lt;br /&gt;
&lt;br /&gt;
	--output = output .. &amp;#039;\n|}&amp;#039;  -- unnecessary: the table will be closed with an {{end}} template&lt;br /&gt;
&lt;br /&gt;
	return p.templateStyle( frame, &amp;quot;Static column begin/styles.css&amp;quot; ) .. output&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
function p.templateStyle( frame, src )&lt;br /&gt;
   return frame:extensionTag( &amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, { src = src } );&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;WOSlinker</name></author>
	</entry>
</feed>