<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ekatrafoundation.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=2604%3A3D08%3A9476%3ABE00%3A20C9%3A491B%3A5951%3A7E35</id>
	<title>Ekatra Foundation - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ekatrafoundation.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=2604%3A3D08%3A9476%3ABE00%3A20C9%3A491B%3A5951%3A7E35"/>
	<link rel="alternate" type="text/html" href="https://wiki.ekatrafoundation.org/wiki/Special:Contributions/2604:3D08:9476:BE00:20C9:491B:5951:7E35"/>
	<updated>2026-05-23T13:39:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://wiki.ekatrafoundation.org/index.php?title=Module:Demo&amp;diff=91071</id>
		<title>Module:Demo</title>
		<link rel="alternate" type="text/html" href="https://wiki.ekatrafoundation.org/index.php?title=Module:Demo&amp;diff=91071"/>
		<updated>2024-04-01T00:24:19Z</updated>

		<summary type="html">&lt;p&gt;2604:3D08:9476:BE00:20C9:491B:5951:7E35: Created page with &amp;quot;local p = {}  --creates a frame object that cannot access any of the parent&amp;#039;s args --unless a table containing a list keys of not to inherit is provided function disinherit(frame, onlyTheseKeys) 	local parent = frame:getParent() or frame 	local orphan = parent:newChild{} 	orphan.getParent = parent.getParent --returns nil 	orphan.args = {} 	if onlyTheseKeys then 		local family = {parent, frame} 		for f = 1, 2 do 			for k, v in pairs(family[f] and family[f].args or {}) do...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
--creates a frame object that cannot access any of the parent&#039;s args&lt;br /&gt;
--unless a table containing a list keys of not to inherit is provided&lt;br /&gt;
function disinherit(frame, onlyTheseKeys)&lt;br /&gt;
	local parent = frame:getParent() or frame&lt;br /&gt;
	local orphan = parent:newChild{}&lt;br /&gt;
	orphan.getParent = parent.getParent --returns nil&lt;br /&gt;
	orphan.args = {}&lt;br /&gt;
	if onlyTheseKeys then&lt;br /&gt;
		local family = {parent, frame}&lt;br /&gt;
		for f = 1, 2 do&lt;br /&gt;
			for k, v in pairs(family[f] and family[f].args or {}) do&lt;br /&gt;
				orphan.args[k] = orphan.args[k] or v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		parent.args = mw.clone(orphan.args)&lt;br /&gt;
		setmetatable(orphan.args, nil)&lt;br /&gt;
		for _, k in ipairs(onlyTheseKeys) do&lt;br /&gt;
			rawset(orphan.args, k, nil)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return orphan, parent&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getSeparator(args, default)&lt;br /&gt;
	local br = tonumber(args.br) and (&#039;&amp;lt;br&amp;gt;&#039;):rep(args.br) or args.br&lt;br /&gt;
	local sep = args.sep or br or default&lt;br /&gt;
	return #sep &amp;gt; 0 and &#039; &#039; .. sep .. &#039; &#039; or sep&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get(frame, arg, passArgs)&lt;br /&gt;
	local orphan, frame = disinherit(frame, passArgs and {arg or 1})&lt;br /&gt;
	local code = frame.args[arg or 1] or &#039;&#039;&lt;br /&gt;
	if code:match&#039;UNIQ%-%-nowiki&#039; then&lt;br /&gt;
		code = mw.text.unstripNoWiki(code)&lt;br /&gt;
			:gsub(&#039;&amp;amp;lt;&#039;, &#039;&amp;lt;&#039;)&lt;br /&gt;
			:gsub(&#039;&amp;amp;gt;&#039;, &#039;&amp;gt;&#039;)&lt;br /&gt;
			:gsub(&#039;&amp;amp;quot;&#039;, &#039;&amp;quot;&#039;)&lt;br /&gt;
			-- Replace `&amp;amp;#125;%-` with `}-` because of some server quirk leading to&lt;br /&gt;
			-- =mw.text.unstripNoWiki(mw.getCurrentFrame():preprocess(&#039;&amp;lt;nowiki&amp;gt;}-&amp;lt;/nowiki&amp;gt;&#039;))&lt;br /&gt;
			-- outputting `&amp;amp;#125;-` instead of `}-`, while it&#039;s ok with `&amp;lt;nowiki&amp;gt;} -&amp;lt;/nowiki&amp;gt;`&lt;br /&gt;
			:gsub(&#039;&amp;amp;#125;%-&#039;, &#039;}-&#039;)&lt;br /&gt;
			-- The same with `-&amp;amp;#123;`&lt;br /&gt;
			:gsub(&#039;%-&amp;amp;#123;&#039;, &#039;-{&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local kill_categories = frame.args.demo_kill_categories or frame.args.nocat&lt;br /&gt;
	return {&lt;br /&gt;
		source = code,&lt;br /&gt;
		output = orphan:preprocess(code):gsub(kill_categories and &#039;%[%[Category.-%]%]&#039; or &#039;&#039;, &#039;&#039;),&lt;br /&gt;
		frame = frame&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, demoTable)&lt;br /&gt;
	local show = demoTable or p.get(frame)&lt;br /&gt;
	local args = show.frame.args&lt;br /&gt;
	if show[args.result_arg] then&lt;br /&gt;
		return show[args.result_arg]&lt;br /&gt;
	end&lt;br /&gt;
	local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
	args.reverse = yesno(args.reverse, false)&lt;br /&gt;
	args.sep = getSeparator(args, &#039;&#039;)&lt;br /&gt;
	local source = frame:extensionTag{&lt;br /&gt;
		name = &#039;syntaxhighlight&#039;,&lt;br /&gt;
		args = {&lt;br /&gt;
			lang = &#039;wikitext&#039;,&lt;br /&gt;
			style = args.style&lt;br /&gt;
		},&lt;br /&gt;
		content = show.source&lt;br /&gt;
	}&lt;br /&gt;
	return args.reverse and&lt;br /&gt;
		show.output .. args.sep .. source or&lt;br /&gt;
		source .. args.sep .. show.output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Alternate function to return an inline result&lt;br /&gt;
function p.inline(frame, demoTable)&lt;br /&gt;
	local show = demoTable or p.get(frame)&lt;br /&gt;
	local args = show.frame.args&lt;br /&gt;
	if show[args.result_arg] then&lt;br /&gt;
		return show[args.result_arg]&lt;br /&gt;
	end&lt;br /&gt;
	local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
	args.reverse = yesno(args.reverse, false)&lt;br /&gt;
	args.sep = getSeparator(args, args.reverse and &#039;←&#039; or &#039;→&#039;)&lt;br /&gt;
	local source =  frame:extensionTag{&lt;br /&gt;
		name = &#039;syntaxhighlight&#039;,&lt;br /&gt;
		args = {&lt;br /&gt;
			lang = &#039;wikitext&#039;,&lt;br /&gt;
			inline = true,&lt;br /&gt;
			style = args.style&lt;br /&gt;
		},&lt;br /&gt;
		content = show.source&lt;br /&gt;
	}&lt;br /&gt;
	return args.reverse and&lt;br /&gt;
		show.output .. args.sep .. source or&lt;br /&gt;
		source .. args.sep .. show.output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--passing of args into other module without preprocessing&lt;br /&gt;
function p.module(frame)&lt;br /&gt;
	local orphan, frame = disinherit(frame, {&lt;br /&gt;
		&#039;demo_template&#039;,&lt;br /&gt;
		&#039;demo_module&#039;,&lt;br /&gt;
		&#039;demo_module_func&#039;,&lt;br /&gt;
		&#039;demo_main&#039;,&lt;br /&gt;
		&#039;demo_sep&#039;,&lt;br /&gt;
		&#039;demo_br&#039;,&lt;br /&gt;
		&#039;demo_result_arg&#039;,&lt;br /&gt;
		&#039;demo_kill_categories&#039;,&lt;br /&gt;
		&#039;nocat&#039;&lt;br /&gt;
	})&lt;br /&gt;
	local template = frame.args.demo_template and &#039;Template:&#039;..frame.args.demo_template&lt;br /&gt;
	local demoFunc = frame.args.demo_module_func or &#039;main\n&#039;&lt;br /&gt;
	local demoModule = require(&#039;Module:&#039; .. frame.args.demo_module)[demoFunc:match(&#039;^%s*(.-)%s*$&#039;)]&lt;br /&gt;
	frame.args.br, frame.args.result_arg = frame.args.demo_sep or frame.args.demo_br, frame.args.demo_result_arg&lt;br /&gt;
	local kill_categories = frame.args.demo_kill_categories or frame.args.nocat&lt;br /&gt;
	if demoModule then&lt;br /&gt;
		local named = {insert = function(self, ...) table.insert(self, ...) return self end}&lt;br /&gt;
		local source = {insert = named.insert, &#039;{{&#039;, frame.args.demo_template or frame.args.demo_module, &#039;\n&#039;}&lt;br /&gt;
		if not template then&lt;br /&gt;
			source:insert(2, &#039;#invoke:&#039;):insert(4, &#039;|&#039;):insert(5, demoFunc)&lt;br /&gt;
		end&lt;br /&gt;
		local insertNamed = #source + 1&lt;br /&gt;
		for k, v in pairs(orphan.args) do&lt;br /&gt;
			local nan, insert = type(k) ~= &#039;number&#039;, {v}&lt;br /&gt;
			local target = nan and named or source&lt;br /&gt;
			target:insert&#039;|&#039;&lt;br /&gt;
			if nan then&lt;br /&gt;
				target:insert(k):insert&#039;=&#039;:insert&#039;\n&#039;&lt;br /&gt;
				table.insert(insert, 1, #target)&lt;br /&gt;
			end&lt;br /&gt;
			target:insert(unpack(insert))&lt;br /&gt;
			local nowiki = v:match(&#039;nowiki&#039;)&lt;br /&gt;
			if nowiki or v:match(&#039;{{.-}}&#039;) then&lt;br /&gt;
				orphan.args[k] = frame:preprocess(nowiki and mw.text.unstripNoWiki(v) or v)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		source:insert&#039;}}&#039;&lt;br /&gt;
		table.insert(source, insertNamed, table.concat(named))&lt;br /&gt;
		return p.main(orphan, {&lt;br /&gt;
			source = table.concat(source), &amp;quot;&amp;lt;&amp;gt;&#039;|=~&amp;quot;,&lt;br /&gt;
			output = tostring(demoModule(orphan)):gsub(kill_categories and &#039;%[%[Category.-%]%]&#039; or &#039;&#039;, &#039;&#039;),&lt;br /&gt;
			frame = frame&lt;br /&gt;
		})&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;ERROR: Invalid module function: &amp;quot;..demoFunc&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>2604:3D08:9476:BE00:20C9:491B:5951:7E35</name></author>
	</entry>
	<entry>
		<id>https://wiki.ekatrafoundation.org/index.php?title=Template:Demo&amp;diff=91057</id>
		<title>Template:Demo</title>
		<link rel="alternate" type="text/html" href="https://wiki.ekatrafoundation.org/index.php?title=Template:Demo&amp;diff=91057"/>
		<updated>2024-04-01T00:23:27Z</updated>

		<summary type="html">&lt;p&gt;2604:3D08:9476:BE00:20C9:491B:5951:7E35: Created page with &amp;quot;{{#invoke:Demo|main}}&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Demo|main}}&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>2604:3D08:9476:BE00:20C9:491B:5951:7E35</name></author>
	</entry>
</feed>