<?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%2FJts1882%2FTest</id>
	<title>Module:Sandbox/Jts1882/Test - 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%2FJts1882%2FTest"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Jts1882/Test&amp;action=history"/>
	<updated>2026-04-21T02:08:09Z</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/Jts1882/Test&amp;diff=145651&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/Jts1882/Test&amp;diff=145651&amp;oldid=prev"/>
		<updated>2022-10-23T21:13:15Z</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 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;
&lt;br /&gt;
function p.lighthouse(frame)&lt;br /&gt;
	local page = frame.args[&amp;#039;page&amp;#039;]&lt;br /&gt;
	local qid = frame.args[&amp;#039;qid&amp;#039;]&lt;br /&gt;
	local property = frame.args[&amp;#039;property&amp;#039;]&lt;br /&gt;
	local text = page .. &amp;quot;: instance of :&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	--local item = mw.wikibase.getEntity(&amp;#039;P&amp;#039;..prop)  --(&amp;#039;P5354&amp;#039;)&lt;br /&gt;
	if page then&lt;br /&gt;
		qid = mw.wikibase.getEntityIdForTitle(page)&lt;br /&gt;
		text = page .. &amp;#039;: instance of :&amp;#039;&lt;br /&gt;
	elseif qid then&lt;br /&gt;
		text = mw.wikibase.getLabel(qid) .. &amp;#039; (&amp;#039; .. qid .. &amp;#039;): instance of :&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;No page or qid given&amp;quot; &lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	local statements = mw.wikibase.getBestStatements(qid, &amp;#039;P31&amp;#039;)   -- get instance of&lt;br /&gt;
	for index, statement in pairs( statements ) do&lt;br /&gt;
    	local instanceOfId&lt;br /&gt;
    	if statement and statement.mainsnak and statement.mainsnak.datavalue then&lt;br /&gt;
    		instanceOfId = statement.mainsnak.datavalue.value.id&lt;br /&gt;
    		text = text .. &amp;#039;\n:::&amp;#039; .. instanceOfId .. &amp;#039; (&amp;#039; .. mw.wikibase.getLabel(instanceOfId) .. &amp;#039;) &amp;#039;&lt;br /&gt;
    		&lt;br /&gt;
    		--local item2 = mw.wikibase.getEntity(instanceOfId)  -- returns full claims table [expensive,so just use best statements]&lt;br /&gt;
    	    --local statements2 = item2:getBestStatements( &amp;#039;P279&amp;#039;)  &lt;br /&gt;
    		&lt;br /&gt;
    		local instanceOfStatements = mw.wikibase.getBestStatements(instanceOfId, &amp;#039;P279&amp;#039;)&lt;br /&gt;
     	&lt;br /&gt;
     		text = text .. &amp;#039;[subclass: &amp;#039;&lt;br /&gt;
    		for _, instanceOfStatement in pairs( instanceOfStatements ) do&lt;br /&gt;
    			if instanceOfStatement.mainsnak and instanceOfStatement.mainsnak.datavalue then&lt;br /&gt;
    		    	local subclassId = instanceOfStatement.mainsnak.datavalue.value.id&lt;br /&gt;
    		    	text = text .. &amp;#039;\n:::::&amp;#039; .. subclassId .. &amp;#039; (&amp;#039; .. mw.wikibase.getLabel(subclassId) .. &amp;#039;) &amp;#039;&lt;br /&gt;
    			end&lt;br /&gt;
    		end&lt;br /&gt;
    		text = text .. &amp;#039;]; &amp;#039;&lt;br /&gt;
    	end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
function p.testExpensive(frame, page, mode)&lt;br /&gt;
	&lt;br /&gt;
	local mode = frame.args[&amp;#039;mode&amp;#039;]&lt;br /&gt;
	if not mode then mode = &amp;quot;makeTitle&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	local title&lt;br /&gt;
    local page = frame.args[&amp;#039;page&amp;#039;] &lt;br /&gt;
   	if not page then p.errormsg(&amp;quot;Target page not found&amp;quot;) end -- TODO check for page existence here&lt;br /&gt;
    &lt;br /&gt;
    if mode == &amp;quot;new&amp;quot; then&lt;br /&gt;
   		title = mw.title.new( page) -- , ns)&lt;br /&gt;
   	else &lt;br /&gt;
   		title = mw.title.makeTitle( &amp;quot;Template&amp;quot;, page) &lt;br /&gt;
   	end&lt;br /&gt;
   	if not title then return p.errormsg(&amp;quot;Title object not created&amp;quot;) end 	&lt;br /&gt;
    &lt;br /&gt;
    if not title.exists then &lt;br /&gt;
    	return &amp;quot;Invalid page name = &amp;quot; .. title.text  .. &amp;quot; (using mw.title.&amp;quot; .. mode .. &amp;quot;)&amp;quot; &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
   	return &amp;quot;Title = &amp;quot; ..title.text   .. &amp;quot; (using mw.title.&amp;quot; .. mode .. &amp;quot;)&amp;quot; &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getdomain(frame)&lt;br /&gt;
	local url = frame.args[1]&lt;br /&gt;
	&lt;br /&gt;
	local domain =  string.match( url, &amp;quot;%/%/(.-)%/&amp;quot; )&lt;br /&gt;
	local domain2 = mw.uri.new(url).host&lt;br /&gt;
	return domain .. &amp;quot;|&amp;quot; .. domain2&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getclade(frame)&lt;br /&gt;
    &lt;br /&gt;
    local page = frame.args[&amp;#039;page&amp;#039;] &lt;br /&gt;
   	if not page then p.errormsg(&amp;quot;Target page not found&amp;quot;) end -- TODO check for page existence here&lt;br /&gt;
&lt;br /&gt;
   	local title = mw.title.new( page) -- , ns)&lt;br /&gt;
   	if not title then p.errormsg(&amp;quot;Title not retrieved from page&amp;quot;) end &lt;br /&gt;
   	&lt;br /&gt;
	local content = title:getContent()&lt;br /&gt;
		&lt;br /&gt;
    local cladogram = p.matchClade(content)&lt;br /&gt;
    &lt;br /&gt;
    if 1==2 then&lt;br /&gt;
    	return  frame:preprocess(p.matchClade(cladogram))&lt;br /&gt;
    else -- now do something with it&lt;br /&gt;
    	return p.parseCladogram(frame, cladogram)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
function p.parseCladogram(frame, cladogram)&lt;br /&gt;
	&lt;br /&gt;
	local pattern = &amp;#039;|1=(.+)[|}]&amp;#039;&lt;br /&gt;
    --local value = p.matchClade(cladogram, pattern)&lt;br /&gt;
    for match in cladogram:gmatch(pattern) do      -- most inclusive&lt;br /&gt;
	   if match:find(&amp;quot;^{{clade&amp;quot;) then&lt;br /&gt;
	   	 local value = p.matchClade(match)&lt;br /&gt;
	   	 return p.parseCladogram(frame, value)&lt;br /&gt;
	   	 --return frame:preprocess(p.matchClade(match)) --found clade&lt;br /&gt;
	   else&lt;br /&gt;
	   	return &amp;quot;no clade found&amp;quot; .. match&lt;br /&gt;
	   end	&lt;br /&gt;
	   return &amp;quot;no match found in match : &amp;quot; ..match&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--return frame:preprocess(value)&lt;br /&gt;
	return &amp;quot;no match found in cladogram: &amp;quot; .. cladogram&lt;br /&gt;
end&lt;br /&gt;
function p.matchClade(content, pattern)&lt;br /&gt;
&lt;br /&gt;
	if not pattern then&lt;br /&gt;
		pattern = &amp;#039;{{clade.-}}&amp;#039;                -- least inclusive (until first &amp;quot;}}&amp;quot;)&lt;br /&gt;
		pattern       = &amp;#039;{{clade.+}}&amp;#039;                -- most inclusive (until last &amp;quot;}}&amp;quot;, e.g. the taxonbar close)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    for match in content:gmatch(pattern) do      -- most inclusive&lt;br /&gt;
		for match2 in match:gmatch(&amp;#039;%b{}&amp;#039;) do    -- match paired brackets&lt;br /&gt;
		    return match2&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.getpage(frame)&lt;br /&gt;
    local page = frame.args[&amp;#039;page&amp;#039;] &lt;br /&gt;
    local wrap = frame.args[&amp;#039;wrap&amp;#039;] &lt;br /&gt;
   	if not page then p.errormsg(&amp;quot;Target page not found&amp;quot;) end -- TODO check for page existence here&lt;br /&gt;
   	&lt;br /&gt;
   	local title = mw.title.new( page) -- , ns)&lt;br /&gt;
	if title then &lt;br /&gt;
		local content = title:getContent()&lt;br /&gt;
		&lt;br /&gt;
		if wrap then&lt;br /&gt;
			content = &amp;#039;&amp;lt;&amp;#039; .. wrap .. &amp;#039;&amp;gt;&amp;#039; .. tostring(content) .. &amp;#039;&amp;lt;/&amp;#039; .. wrap .. &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return content&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = function(frame) -- called from template&lt;br /&gt;
	pargs = frame:getParent().args&lt;br /&gt;
	local output &lt;br /&gt;
	local page = pargs[&amp;#039;page&amp;#039;] &lt;br /&gt;
	if not page then p.errormsg(&amp;quot;Target page not found&amp;quot;) end -- TODO check for page existence here&lt;br /&gt;
	&lt;br /&gt;
	local section =  pargs[&amp;#039;section&amp;#039;] or pargs[&amp;#039;section1&amp;#039;] or pargs[1] &lt;br /&gt;
	if section then&lt;br /&gt;
		output = p._section(frame, page, section)&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local label =  pargs[&amp;#039;label&amp;#039;] or pargs[&amp;#039;label1&amp;#039;] or pargs[1] &lt;br /&gt;
	if label then&lt;br /&gt;
		output = p._label(frame, page, label)&lt;br /&gt;
	end   &lt;br /&gt;
	&lt;br /&gt;
	local subtree =  pargs[&amp;#039;subtree&amp;#039;] or pargs[&amp;#039;subtree1&amp;#039;] or pargs[1] &lt;br /&gt;
	if subtree then&lt;br /&gt;
		output = p._label(frame, page, subtree)&lt;br /&gt;
	end  &lt;br /&gt;
	&lt;br /&gt;
	local wrap = pargs[&amp;#039;wrap&amp;#039;] &lt;br /&gt;
	if wrap and (label or subtree) then&lt;br /&gt;
		local label1 = label or string.lower(subtree)&lt;br /&gt;
		if wrap ~= &amp;quot;&amp;quot; then label1 = wrap end&lt;br /&gt;
		output = &amp;quot;{{clade |label1=&amp;quot; .. p.firstToUpper(label1) .. &amp;quot;|1=&amp;quot; .. output .. &amp;quot;}}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
	&lt;br /&gt;
	if output then&lt;br /&gt;
		return frame:preprocess(output)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
   return p.errormsg(&amp;quot;No valid option for transclusion&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.test = function(frame)&lt;br /&gt;
&lt;br /&gt;
	--mw.title.makeTitle( namespace, title, fragment, interwiki )&lt;br /&gt;
	--mw.title.new( text, namespace )&lt;br /&gt;
	local page = &amp;quot;User:Jts1882/sandbox/test/Passeriformes&amp;quot;  --&amp;quot;Atelopus andinus&amp;quot;&lt;br /&gt;
	local section = &amp;quot;Passeriformes&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local ns = 1&lt;br /&gt;
	if page:find(&amp;quot;^User&amp;quot;) then ns = 2 end&lt;br /&gt;
	if page:find(&amp;quot;^Template&amp;quot;) then ns = 10 end  -- TODO check number&lt;br /&gt;
	&lt;br /&gt;
	--mw.site.namespaces.User.id -- returns 2&lt;br /&gt;
	&lt;br /&gt;
	--TEST PAGE = User:Jts1882/sandbox &lt;br /&gt;
	return p._section(frame,page, &amp;quot;Passeroidea &amp;quot;, &amp;quot;Corvida&amp;quot;, &amp;quot;Tyranni&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.test_working_prototype = function(frame)&lt;br /&gt;
&lt;br /&gt;
	--mw.title.makeTitle( namespace, title, fragment, interwiki )&lt;br /&gt;
	--mw.title.new( text, namespace )&lt;br /&gt;
	local page = &amp;quot;User:Jts1882/sandbox/test/Passeriformes&amp;quot;  --&amp;quot;Atelopus andinus&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local ns = 1&lt;br /&gt;
	if page:find(&amp;quot;^User&amp;quot;) then ns = 2 end&lt;br /&gt;
	if page:find(&amp;quot;^Template&amp;quot;) then ns = 10 end  -- TODO check number&lt;br /&gt;
	&lt;br /&gt;
	--mw.site.namespaces.User.id -- returns 2&lt;br /&gt;
	&lt;br /&gt;
	--TEST PAGE = User:Jts1882/sandbox &lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.new( page) -- , ns)&lt;br /&gt;
	if title then &lt;br /&gt;
		local content = title:getContent()&lt;br /&gt;
		&lt;br /&gt;
		local pattern = &amp;quot;&amp;lt;section begin=Passeriformes /&amp;gt;(.+)&amp;lt;section end=Passeriformes /&amp;gt;&amp;quot;&lt;br /&gt;
		pattern = &amp;quot;{{#tag:section||begin=Test}}(.+){{#tag:section||end=Test}}&amp;quot;&lt;br /&gt;
		local value = string.match( content , pattern )&lt;br /&gt;
		if value then&lt;br /&gt;
			return  frame:preprocess(value)&lt;br /&gt;
			--return value&lt;br /&gt;
	    else&lt;br /&gt;
	    	return  &amp;quot;no match found&amp;quot;&lt;br /&gt;
    	end&lt;br /&gt;
	&lt;br /&gt;
	   return content&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;Hello&amp;quot;	&lt;br /&gt;
end&lt;br /&gt;
--================================== exclude LABEL ================================================&lt;br /&gt;
&lt;br /&gt;
p.xlabel = function (frame, page, ...)&lt;br /&gt;
	local page = frame.args[1] --&amp;quot;User:Jts1882/sandbox/test/Passeriformes&amp;quot;&lt;br /&gt;
	local label = frame.args[1] or frame.args[&amp;#039;label&amp;#039;] or frame.args[&amp;#039;label1&amp;#039;]&lt;br /&gt;
	                      -- page , target tree,  subtrees to exclude ...&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--                       page,   include clade, multple clades to exclude |&lt;br /&gt;
	return p._xlabel (frame, page, frame.args[2], frame.args[3], frame.args[4], frame.args[5])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
p._xlabel = function (frame, page, target, ...)&lt;br /&gt;
--	local page = &amp;quot;User:Jts1882/sandbox/test/Passeriformes&amp;quot;&lt;br /&gt;
--	local label = frame.args[1] or frame.args[&amp;#039;label&amp;#039;]&lt;br /&gt;
	local args = { ... }&lt;br /&gt;
	local output = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if not args[1] then return p.errormsg (&amp;quot;Label name not provided&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
	local fullOutput =  p._label(frame, page, target) &lt;br /&gt;
	--local fullOutput =  p._section(frame, page, target) &lt;br /&gt;
&lt;br /&gt;
	output=fullOutput&lt;br /&gt;
&lt;br /&gt;
	local title = mw.title.new( mw.text.trim(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;
	if title and title.exists then &lt;br /&gt;
		local content = title:getContent()&lt;br /&gt;
&lt;br /&gt;
		for k,v in pairs(args) do&lt;br /&gt;
			local section = mw.text.trim(v)&lt;br /&gt;
			local targetType = &amp;quot;label%d&amp;quot;&lt;br /&gt;
			local cladePrefix = &amp;quot;%d&amp;quot;&lt;br /&gt;
			if string.upper( section) == section then&lt;br /&gt;
				 targetType = &amp;quot;target%u&amp;quot;               -- by convention subtrees must be uppercase&lt;br /&gt;
				 cladePrefix = &amp;quot;subclade%u&amp;quot;&lt;br /&gt;
		    end&lt;br /&gt;
&lt;br /&gt;
			--                label      = [[        name       ]]                 |n=   {...}&lt;br /&gt;
            local pattern = &amp;quot;(&amp;quot;..targetType..&amp;quot;=[%s%p]*&amp;quot;..section .. &amp;quot;[%s%p]*.-&amp;quot;..cladePrefix..&amp;quot;=.-)(%b{})&amp;quot;&lt;br /&gt;
                                                                                        -- ^^ this .- skips section tags before clade&lt;br /&gt;
                                                                   -- ^^this .- skips |sublabel and styling following the label (but can return wrong clade when a subtree)&lt;br /&gt;
          &lt;br /&gt;
            &lt;br /&gt;
            --for value in string.gmatch( fullOutput , pattern ) do&lt;br /&gt;
            local value = string.match( fullOutput , pattern ) &lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            if value then&lt;br /&gt;
            	local trimmedTree, matches = string.gsub(fullOutput, pattern, &amp;quot;%1&amp;quot;..&amp;quot;replacement string&amp;quot;)--replaces pattern with capture %1&lt;br /&gt;
 &lt;br /&gt;
            	--output = output .. trimmedTree&lt;br /&gt;
            	--output = output .. &amp;quot;&amp;lt;pre&amp;gt;&amp;quot; .. trimmedTree .. &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;&lt;br /&gt;
                fullOutput = trimmedTree&lt;br /&gt;
            else&lt;br /&gt;
            	output = output .. p.errormsg (&amp;quot;Failed to capture subclade with label &amp;quot;..section)&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
		&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;
    if output ~= &amp;quot;&amp;quot; then &lt;br /&gt;
		return  frame:preprocess(fullOutput)&lt;br /&gt;
	else &lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Section for label not found&amp;lt;/span&amp;gt;&amp;#039; &lt;br /&gt;
    end&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--=============================== extract LABELS or SUBTREES=======================================&lt;br /&gt;
p.label = function (frame, page, ...)&lt;br /&gt;
	local page = frame.args[1] --&amp;quot;User:Jts1882/sandbox/test/Passeriformes&amp;quot;&lt;br /&gt;
	local label = frame.args[1] or frame.args[&amp;#039;label&amp;#039;] or frame.args[&amp;#039;label1&amp;#039;]&lt;br /&gt;
	local wrap = frame.args[&amp;#039;wrap&amp;#039;] &lt;br /&gt;
	&lt;br /&gt;
	local output = p._label (frame, page, frame.args[2], frame.args[3], frame.args[4], frame.args[5] )&lt;br /&gt;
	if wrap then&lt;br /&gt;
		local label1 = string.lower(frame.args[2])&lt;br /&gt;
		if wrap ~= &amp;quot;&amp;quot; then label1 = wrap end&lt;br /&gt;
		output = &amp;quot;{{clade |label1=&amp;quot; .. p.firstToUpper(label1) .. &amp;quot;|1=&amp;quot; .. output .. &amp;quot;}}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
	return frame:preprocess(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p._label = function (frame, page, ... )&lt;br /&gt;
--	local page = &amp;quot;User:Jts1882/sandbox/test/Passeriformes&amp;quot;&lt;br /&gt;
--	local label = frame.args[1] or frame.args[&amp;#039;label&amp;#039;]&lt;br /&gt;
	local args = { ... }&lt;br /&gt;
	local output = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if not args[1] then return p.errormsg (&amp;quot;Label name not provided&amp;quot;) end&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.new( mw.text.trim(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;
	if title and title.exists then &lt;br /&gt;
		local content = title:getContent()&lt;br /&gt;
		local targetType = &amp;quot;label%d&amp;quot;&lt;br /&gt;
		local cladePrefix = &amp;quot;%d&amp;quot;&lt;br /&gt;
		for k,v in pairs(args) do&lt;br /&gt;
			local section = mw.text.trim(v)&lt;br /&gt;
			if string.upper( section) == section then&lt;br /&gt;
				 targetType = &amp;quot;target%u&amp;quot;               -- by convention subtrees must be uppercase&lt;br /&gt;
				 cladePrefix = &amp;quot;subclade%u&amp;quot;&lt;br /&gt;
		    end&lt;br /&gt;
&lt;br /&gt;
			--               label =   [[        name     ]]   |n=   {...}&lt;br /&gt;
            --local pattern = &amp;quot;label%d=[%s%p]*&amp;quot;..section .. &amp;quot;[%s%p]*%d=(%b{})&amp;quot;&lt;br /&gt;
                                                                -- the .- skips section tags before clade&lt;br /&gt;
            --local pattern = &amp;quot;label%d=[%s%p]*&amp;quot;..section .. &amp;quot;[%s%p]*%d=.-(%b{})&amp;quot;&lt;br /&gt;
                                                   -- this .- skips |sublabel and styling following the label (but can return wrong clade when a subtree)&lt;br /&gt;
            --local pattern = &amp;quot;label%d=[%s%p]*&amp;quot;..section .. &amp;quot;.-%d=.-(%b{})&amp;quot;&lt;br /&gt;
            local pattern = targetType..&amp;quot;=[%s%p]*&amp;quot;..section .. &amp;quot;[%s%p]*.-&amp;quot;..cladePrefix..&amp;quot;=.-(%b{})&amp;quot;&lt;br /&gt;
            &lt;br /&gt;
            -- for subtrees (how to capture right )&lt;br /&gt;
            --local pattern = &amp;quot;[%u]=[%s%p]*&amp;quot;..section .. &amp;quot;.-%d=.-(%b{})&amp;quot;&lt;br /&gt;
            &lt;br /&gt;
            &lt;br /&gt;
            local value = string.match( content , pattern )&lt;br /&gt;
            &lt;br /&gt;
	&lt;br /&gt;
            &lt;br /&gt;
            if value then&lt;br /&gt;
            	&lt;br /&gt;
                -- what if we have something like {FABIDS}   &amp;quot;{%u}&amp;quot;&lt;br /&gt;
                local pattern = &amp;quot;({%u-})&amp;quot;&lt;br /&gt;
	            if string.find(value, pattern ) then          -- if a subtree that hasn&amp;#039;t been substituted.&lt;br /&gt;
	            	 --local i,j,target = string.find(value, pattern) -- only one subtree&lt;br /&gt;
	            	 for target in string.gmatch( value , pattern ) do&lt;br /&gt;
	            	   	 local subtree = p._label (frame, page, target) &lt;br /&gt;
		            	 if subtree then&lt;br /&gt;
		            	 	value = string.gsub(value, target, subtree)&lt;br /&gt;
		            	 end&lt;br /&gt;
		            	 --return value  &lt;br /&gt;
		            	 --value = value .. &amp;quot; (subtree needs transcluding)&amp;quot;&lt;br /&gt;
	            	 end&lt;br /&gt;
	            end&lt;br /&gt;
	            --if (1==1) then return &amp;quot;Captured pattern=&amp;quot; .. (value or &amp;quot;no match&amp;quot;)  end             	&lt;br /&gt;
            	&lt;br /&gt;
            	section = string.lower(section)&lt;br /&gt;
            	output = output .. value&lt;br /&gt;
            	--output = output ..  &amp;quot;{{clade |label1=&amp;quot; .. p.firstToUpper(section) .. &amp;quot;|1=&amp;quot; .. value .. &amp;quot;}}&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
            	output = output .. p.errormsg (&amp;quot;Failed to capture subclade with label &amp;quot;..section)&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
		&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;
    if output ~= &amp;quot;&amp;quot; then &lt;br /&gt;
		--return  frame:preprocess(output)&lt;br /&gt;
		return output -- preprocess in entry function&lt;br /&gt;
	else &lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Section for label not found&amp;lt;/span&amp;gt;&amp;#039; &lt;br /&gt;
    end&lt;br /&gt;
end	&lt;br /&gt;
p.section = function (frame)&lt;br /&gt;
	-------------------------target page  ---- sections&lt;br /&gt;
	return frame:preprocess(p._section(frame, mw.text.trim(frame.args[1]),frame.args[2],frame.args[3],frame.args[4],frame.args[5]))&lt;br /&gt;
end&lt;br /&gt;
p._section = function (frame,page,...)&lt;br /&gt;
	local args = { ... }&lt;br /&gt;
	local output = &amp;quot;&amp;quot;&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;
	if title and title.exists then &lt;br /&gt;
		local content = title:getContent()&lt;br /&gt;
		&lt;br /&gt;
		content = string.gsub( content , &amp;quot;%&amp;lt;%!%-%-.-%-%-%&amp;gt;&amp;quot;, &amp;quot;&amp;quot; ) -- strip out comments&lt;br /&gt;
		&lt;br /&gt;
		for k,v in pairs(args) do&lt;br /&gt;
			local section = mw.text.trim(v)&lt;br /&gt;
			--[[ note: using the non-greedy - in (.-) to allow capture of several sections &lt;br /&gt;
			    this allows internal clade structures to be closed without capturing sisters clades&lt;br /&gt;
			    e.g. see section Tyranni in User:Jts1882/sandbox/test/Passeriformes&lt;br /&gt;
			]]&lt;br /&gt;
			local pattern = &amp;quot;&amp;lt;section begin=&amp;quot;..section..&amp;quot;[ ]*/&amp;gt;(.-)&amp;lt;section end=&amp;quot;..section..&amp;quot;[ ]*/&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
			for value in string.gmatch( content , pattern ) do&lt;br /&gt;
			    if value then &lt;br /&gt;
					if frame.args.wrap or frame:getParent().args.wrap then&lt;br /&gt;
						local label1 = frame.args.wrap or frame:getParent().args.wrap &lt;br /&gt;
						if label1 == &amp;quot;&amp;quot; then label1 = section end&lt;br /&gt;
						value =  &amp;quot;{{clade |label1=&amp;quot; .. label1 .. &amp;quot;|1=&amp;quot; .. value .. &amp;quot;}}&amp;quot;&lt;br /&gt;
				    end&lt;br /&gt;
					output = output .. value&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&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;
    if output ~= &amp;quot;&amp;quot; then &lt;br /&gt;
		--return  frame:preprocess(output)&lt;br /&gt;
		return output -- leave preprocessing for entry function&lt;br /&gt;
	else &lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Section not found&amp;lt;/span&amp;gt;&amp;#039; &lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
p.xsection = function (frame)&lt;br /&gt;
	local page = frame.args[1] --&amp;quot;User:Jts1882/sandbox/test/Passeriformes&amp;quot;&lt;br /&gt;
	local label = frame.args[1] or frame.args[&amp;#039;label&amp;#039;] or frame.args[&amp;#039;label1&amp;#039;]&lt;br /&gt;
	                                       -- page , target tree,  sections to exclude ...	&lt;br /&gt;
	return frame:preprocess(p._xsection(frame, page ,frame.args[2],frame.args[3],frame.args[4],frame.args[5]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p._xsection = function (frame,page, target, ...)&lt;br /&gt;
	local args = { ... }&lt;br /&gt;
	local output = &amp;quot;&amp;quot;&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;
	&lt;br /&gt;
	&lt;br /&gt;
	                                            &lt;br /&gt;
	if title and title.exists then &lt;br /&gt;
		local content = title:getContent()&lt;br /&gt;
		local fullOutput =  p._section(frame, page, target) &lt;br /&gt;
	    output=fullOutput&lt;br /&gt;
	    &lt;br /&gt;
		&lt;br /&gt;
		for k,v in pairs(args) do&lt;br /&gt;
			local section = mw.text.trim(v)&lt;br /&gt;
			--[[ note: using the non-greedy - in (.-) to allow capture of several sections &lt;br /&gt;
			    this allows internal clade structures to be closed without capturing sisters clades&lt;br /&gt;
			    e.g. see section Tyranni in User:Jts1882/sandbox/test/Passeriformes&lt;br /&gt;
			]]&lt;br /&gt;
			local pattern = &amp;quot;(&amp;lt;section begin=&amp;quot;..section..&amp;quot;[ ]*/&amp;gt;)(.-)(&amp;lt;section end=&amp;quot;..section..&amp;quot;[ ]*/&amp;gt;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            local value = string.match( fullOutput , pattern ) &lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
            if value then&lt;br /&gt;
            	local trimmedTree, matches = string.gsub(fullOutput, pattern, &amp;quot;replacement string&amp;quot;)--replaces pattern with capture %1&lt;br /&gt;
 &lt;br /&gt;
            	output = output .. trimmedTree&lt;br /&gt;
            	output = output .. &amp;quot;&amp;lt;pre&amp;gt;&amp;quot; .. trimmedTree .. &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;&lt;br /&gt;
                fullOutput = trimmedTree&lt;br /&gt;
            else&lt;br /&gt;
            	output = output .. p.errormsg (&amp;quot;Failed to capture subclade with label &amp;quot;..section)&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
		&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;
    if output ~= &amp;quot;&amp;quot; then &lt;br /&gt;
		--return  frame:preprocess(output)&lt;br /&gt;
		return output -- leave preprocessing for entry function&lt;br /&gt;
	else &lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Section not found&amp;lt;/span&amp;gt;&amp;#039; &lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
end &lt;br /&gt;
function p.populations(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local page = &amp;quot;List of countries by population (United Nations)&amp;quot;&lt;br /&gt;
	local output = &amp;quot;&amp;quot;&lt;br /&gt;
	local data = {}&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;
	if title and title.exists then &lt;br /&gt;
		local content = title:getContent()&lt;br /&gt;
&lt;br /&gt;
		local pattern = &amp;quot;&amp;lt;section begin=date_1[ ]*/&amp;gt;(.-)&amp;lt;section end=date_1[ ]*/&amp;gt;&amp;quot;&lt;br /&gt;
		for value in string.gmatch( content , pattern ) do&lt;br /&gt;
			data[&amp;#039;date&amp;#039;]=value                                    -- date of latest data &lt;br /&gt;
		end&lt;br /&gt;
		local pattern = &amp;quot;&amp;lt;section begin=date[ ]*/&amp;gt;(.-)&amp;lt;section end=date[ ]*/&amp;gt;&amp;quot;&lt;br /&gt;
		for value in string.gmatch( content , pattern ) do&lt;br /&gt;
			data[&amp;#039;date2&amp;#039;]=value                                    -- date of previous data &lt;br /&gt;
		   data[&amp;#039;date2&amp;#039;]=mw.getContentLanguage():formatDate(&amp;#039;j F Y&amp;#039;, value)&lt;br /&gt;
		end		&lt;br /&gt;
		data[&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;
        local ay =  (frame:callParserFunction{ name = &amp;#039;#time&amp;#039;, args = { &amp;quot;U&amp;quot;, data[&amp;#039;today&amp;#039;] } }&lt;br /&gt;
                   - frame:callParserFunction{ name = &amp;#039;#time&amp;#039;, args = { &amp;quot;U&amp;quot;, data[&amp;#039;date2&amp;#039;] } })&lt;br /&gt;
                       /60/60/24/365.2425 -- number of years since first date until today‬&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		for k,v in pairs(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;
			local pattern = &amp;quot;&amp;lt;section begin=&amp;quot;..section..&amp;quot;[ ]*/&amp;gt;(.-)&amp;lt;section end=&amp;quot;..section..&amp;quot;[ ]*/&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
			for value in string.gmatch( content , pattern ) do&lt;br /&gt;
			    if value then &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;
                    total = total + data[count][&amp;#039;populationNumber&amp;#039;]&lt;br /&gt;
                    &lt;br /&gt;
                    local section = country .. &amp;quot;_0&amp;quot;&lt;br /&gt;
		           	local pattern2 = &amp;quot;&amp;lt;section begin=&amp;quot;..section..&amp;quot;[ ]*/&amp;gt;(.-)&amp;lt;section end=&amp;quot;..section..&amp;quot;[ ]*/&amp;gt;&amp;quot;&lt;br /&gt;
		           	for value2 in  string.gmatch( content , pattern2 ) 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[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;] = math.log( 2 ) / math.log(1 + data[count][&amp;#039;populationGrowth&amp;#039;])&lt;br /&gt;
&lt;br /&gt;
	                    data[count][&amp;#039;populationProjected&amp;#039;] = math.pow(data[count][&amp;#039;populationNumber2&amp;#039;], 1 - ay ) &lt;br /&gt;
	                                                       * math.pow(data[count][&amp;#039;populationNumber&amp;#039;], ay)&lt;br /&gt;
	                    totalProjected = totalProjected + data[count][&amp;#039;populationProjected&amp;#039;] &lt;br /&gt;
	                end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&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;
		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;
        table.sort(data, sort_function)&lt;br /&gt;
        &lt;br /&gt;
        local i = 1&lt;br /&gt;
        -- output table&lt;br /&gt;
        output = &amp;#039;{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:right;&amp;quot; &amp;#039; &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;today&amp;#039;] .. &amp;#039;)&amp;#039; &lt;br /&gt;
                  .. &amp;#039;\n!rowspan=2|Pct of total&amp;#039;&lt;br /&gt;
                  .. &amp;#039;\n!rowspan=2|Population&amp;lt;br/&amp;gt;(&amp;#039; .. data[&amp;#039;date&amp;#039;] .. &amp;#039;)&amp;#039; &lt;br /&gt;
                  --.. &amp;#039;\n!rowspan=2|Pct of total&amp;#039;&lt;br /&gt;
                  .. &amp;#039;\n!rowspan=2|Previous Population&amp;lt;br/&amp;gt;(&amp;#039; .. data[&amp;#039;date2&amp;#039;] .. &amp;#039;)&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;
                  .. &amp;#039;\n|-\n!Increment&amp;#039;&lt;br /&gt;
                  .. &amp;#039;\n!Rate&amp;#039;                  &lt;br /&gt;
        while (data[i]) do&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;flagcountry&amp;quot;, args = {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; .. fn.formatNum(data[i][&amp;#039;populationProjected&amp;#039;],&amp;quot;en&amp;quot;,0)  &lt;br /&gt;
           output = output .. &amp;#039;\n| &amp;#039; .. mm._precision_format(data[i][&amp;#039;populationProjected&amp;#039;]/totalProjected*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; .. fn.formatNum(data[i][&amp;#039;populationNumber&amp;#039;]/total*100,&amp;quot;en&amp;quot;,2) .. &amp;quot;%&amp;quot;&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;
        output = output .. &amp;#039;\n|-\n! !! Total&amp;#039; &lt;br /&gt;
                        .. &amp;#039;\n! style=&amp;quot;text-align:right;&amp;quot; |&amp;#039; .. fn.formatNum(mm._round(totalProjected,0),&amp;quot;en&amp;quot;,0) &lt;br /&gt;
                        .. &amp;#039;\n! style=&amp;quot;text-align:right;&amp;quot; | 100% &amp;#039;&lt;br /&gt;
                        .. &amp;#039;\n! style=&amp;quot;text-align:right;&amp;quot; |&amp;#039; .. fn.formatNum(total,&amp;quot;en&amp;quot;,0) &lt;br /&gt;
                        --.. &amp;#039;\n! style=&amp;quot;text-align:right;&amp;quot; | 100% &amp;#039;&lt;br /&gt;
                        .. &amp;#039;\n! || || ||&amp;#039; -- ..test&lt;br /&gt;
        output = output .. &amp;#039;\n|}&amp;#039;&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;
   &lt;br /&gt;
   return output&lt;br /&gt;
end&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;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Legoktm</name></author>
	</entry>
</feed>