Module
TemplateSource
From Dogcraft Wiki
No edit summary |
mNo edit summary |
||
| (52 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
function | function handleOnlyInclude( text ) | ||
return | 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 | end | ||
return p | return p | ||
Latest revision as of 20:46, 31 January 2026
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