<?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%3AClade%2Ftransclude</id>
	<title>Module:Clade/transclude - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AClade%2Ftransclude"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Clade/transclude&amp;action=history"/>
	<updated>2026-04-22T01:48:53Z</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:Clade/transclude&amp;diff=135667&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:Clade/transclude&amp;diff=135667&amp;oldid=prev"/>
		<updated>2022-10-22T09:10:18Z</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;
&lt;br /&gt;
local DEBUG=false&lt;br /&gt;
--DEBUG=true -- comment out or not runtime or debug&lt;br /&gt;
&lt;br /&gt;
local p ={}&lt;br /&gt;
local pargs ={}&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 selectedTree -- subtree extracted from page content&lt;br /&gt;
	local modifiedTree -- subtree after pruning and grafting&lt;br /&gt;
	&lt;br /&gt;
	-- (1) get page&lt;br /&gt;
	local page = pargs[&amp;#039;page&amp;#039;] or frame.args[&amp;#039;page&amp;#039;]&lt;br /&gt;
	if not page then &lt;br /&gt;
		return p.errorMsg(&amp;quot;Target page not provided&amp;quot;) &lt;br /&gt;
    end &lt;br /&gt;
	&lt;br /&gt;
	-- (2) get content of page (move from _section(), _label, etc)&lt;br /&gt;
	local content&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 then  &lt;br /&gt;
		if  title.exists then&lt;br /&gt;
	  		content = title:getContent()&lt;br /&gt;
			if not content then return p.errorMsg(&amp;quot;Content of &amp;quot; .. page .. &amp;quot; not loaded.&amp;quot;) end&lt;br /&gt;
		else&lt;br /&gt;
			return p.errorMsg(&amp;#039;Page with title &amp;quot;&amp;#039; .. page .. &amp;#039;&amp;quot; not found.&amp;#039;) &lt;br /&gt;
    	end&lt;br /&gt;
	end&lt;br /&gt;
	-- (3) select from content&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;
		selectedTree = p._section(frame, content, section)&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;
		selectedTree = p._label(frame, content, label)&lt;br /&gt;
	end   &lt;br /&gt;
	--TODO does this need to be separate from label?&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;
		selectedTree = p._label(frame, content, subtree)&lt;br /&gt;
	end  &lt;br /&gt;
	&lt;br /&gt;
    if not selectedTree then -- if none of options retrieve anything&lt;br /&gt;
    	p.errorMsg(&amp;quot;Nothing retrieved for selection option &amp;quot; .. (label or subtree or section or &amp;quot;none&amp;quot;))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
if DEBUG then return selectedTree end      --- returns the code captured without processing&lt;br /&gt;
    &lt;br /&gt;
	--(4) modify content (excise and replace; prune and graft)&lt;br /&gt;
	local exclude = pargs[&amp;#039;exclude&amp;#039;] or pargs[&amp;#039;exclude1&amp;#039;]&lt;br /&gt;
	if exclude then&lt;br /&gt;
	    if pargs[&amp;#039;exclude&amp;#039;] then pargs[&amp;#039;exclude1&amp;#039;] = pargs[&amp;#039;exclude&amp;#039;] end&lt;br /&gt;
		if pargs[&amp;#039;replace&amp;#039;] then pargs[&amp;#039;replace1&amp;#039;] = pargs[&amp;#039;replace&amp;#039;] end&lt;br /&gt;
		&lt;br /&gt;
		modifiedTree = selectedTree&lt;br /&gt;
		&lt;br /&gt;
	    local i = 1&lt;br /&gt;
	    while pargs[&amp;#039;exclude&amp;#039;..i] do&lt;br /&gt;
	       local exclude = pargs[&amp;#039;exclude&amp;#039;..i]&lt;br /&gt;
		   local replace = pargs[&amp;#039;replace&amp;#039;..i] or &amp;quot;&amp;amp;nbsp;&amp;quot;  -- must be something&lt;br /&gt;
		   modifiedTree = p._xlabel(frame, modifiedTree, exclude, replace)&lt;br /&gt;
		   i=i+1&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		modifiedTree = selectedTree&lt;br /&gt;
	end&lt;br /&gt;
	--(5) other options&lt;br /&gt;
	----- suppress hidden elements&lt;br /&gt;
	if pargs[&amp;#039;nohidden&amp;#039;] then&lt;br /&gt;
		modifiedTree = modifiedTree:gsub(&amp;quot;lade hidden&amp;quot;, &amp;quot;lade&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	----- suppress authorities (or anything in small tags)&lt;br /&gt;
	if pargs[&amp;#039;noauthority&amp;#039;] then&lt;br /&gt;
		modifiedTree = modifiedTree:gsub(&amp;quot;&amp;lt;small&amp;gt;.-&amp;lt;/small&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end	&lt;br /&gt;
	----- suppress images&lt;br /&gt;
	if pargs[&amp;#039;noimages&amp;#039;] then&lt;br /&gt;
		modifiedTree = modifiedTree:gsub(&amp;quot;%[%[File:.-%]%]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	----- wrap in outer clade &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;
		local styleString = &amp;quot;&amp;quot; &lt;br /&gt;
		if  pargs[&amp;#039;style&amp;#039;] then  styleString = &amp;#039;|style=&amp;#039; .. pargs[&amp;#039;style&amp;#039;]  end&lt;br /&gt;
		&lt;br /&gt;
		if wrap ~= &amp;quot;&amp;quot; then label1 = wrap end&lt;br /&gt;
		output = &amp;quot;{{clade &amp;quot; .. styleString .. &amp;quot; |label1=&amp;quot; .. p.firstToUpper(label1) .. &amp;quot;|1=&amp;quot; .. modifiedTree .. &amp;quot; }}&amp;quot; -- last space before double brace important&lt;br /&gt;
    else&lt;br /&gt;
    	output	= modifiedTree&lt;br /&gt;
    end&lt;br /&gt;
	&lt;br /&gt;
	--(6) return final tree&lt;br /&gt;
	if output then&lt;br /&gt;
		if pargs[&amp;#039;raw&amp;#039;] then&lt;br /&gt;
			return output&lt;br /&gt;
		else&lt;br /&gt;
			return frame:preprocess(output)&lt;br /&gt;
		end&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;
&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, content, ... )&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 mode = &amp;quot;label&amp;quot;&lt;br /&gt;
	local targetType = &amp;quot;label(%d)&amp;quot;                   -- standard label of form |labelN= (captures N)&lt;br /&gt;
	local cladePrefix = &amp;quot;(%d)&amp;quot;                       -- standard node of form |N= (captures N)&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;
			 mode        = &amp;quot;subtree&amp;quot;&lt;br /&gt;
			 targetType  = &amp;quot;target(%u)&amp;quot;               -- targets of form targetX (X=uppercase letter)&lt;br /&gt;
			 cladePrefix = &amp;quot;subclade(%u)&amp;quot;             -- subclades of form subcladeX (captures X)&lt;br /&gt;
	    end&lt;br /&gt;
        &lt;br /&gt;
        --[=[ the pattern to capture is one of two forms: labelN=Name |N={...} &lt;br /&gt;
                                                         targetX=NAME |subcladeX={...} &lt;br /&gt;
        		          labelN      =  [[        name        ]]        |N           =    {...}&lt;br /&gt;
        		   or    targetX      =  [[        name        ]]        |subcladeX   =    {...}&lt;br /&gt;
        ]=]&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;
                                                                               -- 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;
        local index1, index2, selectedTree = string.match( content , pattern )&lt;br /&gt;
        -- note index1 and index2 should match (X=X or N=N)&lt;br /&gt;
&lt;br /&gt;
        if selectedTree then &lt;br /&gt;
            --[[ the tree can contain markers for subtrees like {FABIDS} &lt;br /&gt;
                    when the form is |N={FABIDS} we want to substitute the subtree&lt;br /&gt;
                    but not when the form is |targetX={FABIDS}&lt;br /&gt;
            ]]&lt;br /&gt;
            &lt;br /&gt;
            local pattern2 = &amp;quot;({%u-})&amp;quot;   -- this captures both |N={FABIDS} and |targetX={FABIDS}&lt;br /&gt;
                                         -- we only want to substitute a subtree in the first kind &lt;br /&gt;
                                         -- will exclude second with pattern3 test below&lt;br /&gt;
            &lt;br /&gt;
            if string.find(selectedTree, pattern2 ) then          -- if a subtree that hasn&amp;#039;t been substituted.&lt;br /&gt;
            	--local i,j,target = string.find(value, pattern2) -- only one subtree&lt;br /&gt;
            	local i=0&lt;br /&gt;
            	for bracedMarker in string.gmatch( selectedTree , pattern2 ) do&lt;br /&gt;
                    i=i+1&lt;br /&gt;
&lt;br /&gt;
                    -- bracedMarker is either a marker in the tree or part of following&lt;br /&gt;
                    --     targetX={bracedMarker} ... |subcladeX=s  then&lt;br /&gt;
                    local pattern3 = &amp;quot;target(%u)=[%s]*&amp;quot;..bracedMarker&lt;br /&gt;
&lt;br /&gt;
                    --?? if selectedTree == bracedMarker&lt;br /&gt;
			        if not string.find(selectedTree, pattern3 ) then&lt;br /&gt;
                     &lt;br /&gt;
	            	  	local subtree = p._label (frame, content, bracedMarker) &lt;br /&gt;
		            	if subtree then&lt;br /&gt;
&lt;br /&gt;
		            	 	--[[ method 1: the subtree code is substituted into main tree&lt;br /&gt;
		            	 	        this substitutes the subtree within the clade structure before processing&lt;br /&gt;
		            	 	        thus there will be a problem with large trees exceeding the expansion depth&lt;br /&gt;
		            	 	        however, they can be pruned before processing&lt;br /&gt;
		            	 	  ]]&lt;br /&gt;
--disable method 1		            	 	selectedTree = string.gsub(selectedTree, bracedMarker, subtree, 1)&lt;br /&gt;
&lt;br /&gt;
		            	 	--[[method 2: add the subtree code before the final double brace&lt;br /&gt;
		            	 	    substitute &amp;quot;|targetX={FABIDS} |subcladeX=subtree&amp;quot; before last double brace of selectedTree&lt;br /&gt;
		            	 	    use capture in pattern3 to find X&lt;br /&gt;
		            	 	  ]]&lt;br /&gt;
		            	 	local i,j,X = string.find(content, pattern3)&lt;br /&gt;
		            	 	  &lt;br /&gt;
		            	 	if selectedTree == bracedMarker then&lt;br /&gt;
		            	 	    selectedTree = subtree&lt;br /&gt;
		            	 	else &lt;br /&gt;
		            	 	   	  selectedTree = selectedTree:sub(1,-3)  -- trim final double brace&lt;br /&gt;
		            	 	          .. &amp;quot;\n|target&amp;quot; .. X .. &amp;quot;=&amp;quot; .. bracedMarker &lt;br /&gt;
		            	 	          .. &amp;quot;\n|subclade&amp;quot; .. X .. &amp;quot;=&amp;quot; .. subtree .. &amp;quot;&amp;quot;&lt;br /&gt;
		            	 	          .. &amp;quot;\n }}&amp;quot;&lt;br /&gt;
		            	 	end &lt;br /&gt;
		            	end&lt;br /&gt;
	            	end --substitution of subtree&lt;br /&gt;
            	end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
        	output = output .. selectedTree&lt;br /&gt;
        else&lt;br /&gt;
        	output = output .. p.errorMsg (&amp;quot;Failed to capture subclade with &amp;quot; .. mode .. &amp;quot; &amp;quot; ..section)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
    if output ~= &amp;quot;&amp;quot; then &lt;br /&gt;
		return output -- preprocess moved to 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;
&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, targetTree, exclude, replace)&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	local fullOutput =  targetTree&lt;br /&gt;
	--local fullOutput =  p._section(frame, page, target) &lt;br /&gt;
&lt;br /&gt;
	local output=targetTree -- return unmodified tree if nothing happens&lt;br /&gt;
	local section = exclude&lt;br /&gt;
	&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;
    local value = string.match( fullOutput , pattern ) &lt;br /&gt;
    if value then&lt;br /&gt;
    	local trimmedTree, matches = string.gsub(fullOutput, pattern, &amp;quot;%1&amp;quot;..replace)--replaces pattern with capture %1&lt;br /&gt;
        return trimmedTree&lt;br /&gt;
    else&lt;br /&gt;
    	local message = &amp;quot;&amp;quot;&lt;br /&gt;
    	if string.upper(section) == section then &lt;br /&gt;
    		message = &amp;quot;; subtree may have been substituted, try label&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    	output = output .. p.warningMsg (&amp;quot;Failed to capture subclade for exclusion with label &amp;quot;..section..message)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if output ~= &amp;quot;&amp;quot; then &lt;br /&gt;
		return  output .. &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Nothing pruned&amp;lt;/span&amp;gt;&amp;#039; &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; -- shouldn&amp;#039;t get here &lt;br /&gt;
    end&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
--======================================== SECTION ==================================&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,content,...)&lt;br /&gt;
	local args = { ... }&lt;br /&gt;
	local output = &amp;quot;&amp;quot;&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;
    if pargs[&amp;#039;norefs&amp;#039;] or pargs[&amp;#039;noref&amp;#039;] then                                                -- strip out references&lt;br /&gt;
	   --output =   mw.text.killMarkers( output ) &lt;br /&gt;
	   if output:find(&amp;quot;&amp;lt;ref&amp;quot;)  then                       &lt;br /&gt;
			output = output:gsub(&amp;#039;&amp;lt;ref[%w%p%s]-%/&amp;gt;&amp;#039;, &amp;quot;&amp;quot;) &lt;br /&gt;
			output = output:gsub(&amp;quot;&amp;lt;ref.-&amp;lt;%/ref&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)                                      -- %C works, %w%p%s%c doesn&amp;#039;t&lt;br /&gt;
	   end&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;
&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;
p.warningMsg = function (message)&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;warning&amp;quot; style=&amp;quot;color:#ac6600;font-size:larger;&amp;quot;&amp;gt;&amp;#039; .. message .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end	&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;WOSlinker</name></author>
	</entry>
</feed>