Module

TemplateSource

From Dogcraft Wiki

Meant to be used with the {{Template source}} template. Returns the plaintext contents of a template. Obeys the mostly the same behaviours as transclusion would, respects <onlyinclude>, <includeonly>, and <noinclude> tags. This module is primarily meant to be used as input to <syntaxhighlight>, which doesn't handle some tags (like <templatestyles> or <categorytree>) correctly.

Example

The source of the {{Pagetabs}} template, wrapped in a <syntaxhighlight> tag.

{{#tag:syntaxhighlight|{{#invoke:TemplateSource|templateSource|Template:Pagetabs}}|lang=html|line=1}} generates:

{{#ifeq: {{NAMESPACE}} | {{ns:Template}} | {{#ifeq: {{#sub:{{ROOTPAGENAME}}|0|3}} | Tab | [[Category:Tabs]] |}} |}}<templatestyles src="Pagetabs/styles.css" /><div class="pagetabs noexcerpt noscrollbar" {{#if:{{{styles|}}}|style="{{{styles}}}|}} ><!--
--><div>[[{{{tab1|}}}|{{{title1|{{{tab1|}}}}}}]]</div><!--
--><div>[[{{{tab2|}}}|{{{title2|{{{tab2|}}}}}}]]</div><!--
-->{{#if:{{{tab3|}}}|<div>[[{{{tab3|}}}|{{{title3|{{{tab3|}}}}}}]]</div>}}<!--
-->{{#if:{{{tab4|}}}|<div>[[{{{tab4|}}}|{{{title4|{{{tab4|}}}}}}]]</div>}}<!--
-->{{#if:{{{tab5|}}}|<div>[[{{{tab5|}}}|{{{title5|{{{tab5|}}}}}}]]</div>}}<!--
-->{{#if:{{{tab6|}}}|<div>[[{{{tab6|}}}|{{{title6|{{{tab6|}}}}}}]]</div>}}<!--
--></div>
<hr />
<!-- moved to Template:Tab Userpage <div class="pagetabsmore">{{Pagetabs/pagetabsmore|username=|style=position:absolute; bottom:24px;}}</div> -->

local p = {}

function handleOnlyInclude( text )
	onlyincludes = {}
	
	for capture in mw.ustring.gmatch( text, '<onlyinclude>(.-)</onlyinclude>' ) do
		table.insert(onlyincludes, capture)
	end
	
	return table.concat(onlyincludes, '')
end

function stripNoinclude( text )
	stripCompleteNoincludes = mw.ustring.gsub( text, '<noinclude>.-</noinclude>', '' )
	stripDanglingNoincludes = mw.ustring.gsub( stripCompleteNoincludes, '<noinclude>.*', '' )
	return stripDanglingNoincludes
end

function stripIncludeonlyTags( text )
	stripIncludeonlyOpenTags = mw.ustring.gsub( text, '<includeonly>', '' )
	stripIncludeonlyCloseTags = mw.ustring.gsub( stripIncludeonlyOpenTags, '</includeonly>', '' )
	return stripIncludeonlyCloseTags
end

function templateText( template )
	template = tostring(template)
	pageContent = mw.title.new( template ):getContent()
	
	-- stripping includeonlys
	strippedIncludeOnly = stripIncludeonlyTags( pageContent )
	
	-- handling onlyinclude tags
	handledOnlyInclude = handleOnlyInclude( strippedIncludeOnly )
	if mw.ustring.len( handledOnlyInclude ) > 0 then
		strippedNoIncludesInsideOnlyIncludes = stripNoinclude( handledOnlyInclude )
		return mw.text.nowiki( strippedNoIncludesInsideOnlyIncludes )
	end
	
	-- handling normal noincludes
	strippedNoIncludes = stripNoinclude( strippedIncludeOnly )
	return mw.text.nowiki( strippedNoIncludes )
end

function p.templateSource( frame )
	template = frame.args[1] or ''
	text = templateText( template )
	return mw.text.decode( text )
end

return p
Background Takeshi by Edo