<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://fandata.nl/index.php?action=history&amp;feed=atom&amp;title=Module%3ACspFunctions</id>
	<title>Module:CspFunctions - Bewerkingsoverzicht</title>
	<link rel="self" type="application/atom+xml" href="https://fandata.nl/index.php?action=history&amp;feed=atom&amp;title=Module%3ACspFunctions"/>
	<link rel="alternate" type="text/html" href="https://fandata.nl/index.php?title=Module:CspFunctions&amp;action=history"/>
	<updated>2026-08-09T19:19:07Z</updated>
	<subtitle>Bewerkingsoverzicht voor deze pagina op de wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://fandata.nl/index.php?title=Module:CspFunctions&amp;diff=892637&amp;oldid=prev</id>
		<title>Admin: Nieuwe pagina aangemaakt met &#039;local p = {}  --[[ function p.getSlotData(page,slot)  This function returns a Lua table with structured content of the slot.  function arguments: - page (optional):...&#039;</title>
		<link rel="alternate" type="text/html" href="https://fandata.nl/index.php?title=Module:CspFunctions&amp;diff=892637&amp;oldid=prev"/>
		<updated>2023-09-18T13:02:25Z</updated>

		<summary type="html">&lt;p&gt;Nieuwe pagina aangemaakt met &amp;#039;local p = {}  --[[ function p.getSlotData(page,slot)  This function returns a Lua table with structured content of the slot.  function arguments: - page (optional):...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nieuwe pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
function p.getSlotData(page,slot)&lt;br /&gt;
&lt;br /&gt;
This function returns a Lua table with structured content of the slot.&lt;br /&gt;
&lt;br /&gt;
function arguments:&lt;br /&gt;
- page (optional): pagename of the page for which you want the slot content, defaults to current page&lt;br /&gt;
- slot (optional): slot of which you want the content, defaults to &amp;quot;main&amp;quot;&lt;br /&gt;
&lt;br /&gt;
debug console tests:&lt;br /&gt;
p.getSlotData() &lt;br /&gt;
p.getSlotData(&amp;#039;Wiki:Testpagina sidebar code&amp;#039;,&amp;#039;ws-data&amp;#039;) &lt;br /&gt;
p.getSlotData(&amp;#039;Template:Sidebar item&amp;#039;,&amp;#039;ws-class-props&amp;#039;) &lt;br /&gt;
--]]&lt;br /&gt;
function p.getSlotData(page,slot)&lt;br /&gt;
  	-- get page from function arguments or default to current page&lt;br /&gt;
  	if page == nil or page == &amp;#039;&amp;#039; then&lt;br /&gt;
    	page = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    end&lt;br /&gt;
  	-- get slot from function arguments or default to main&lt;br /&gt;
  	if slot == nil or slot == &amp;#039;&amp;#039; then&lt;br /&gt;
    	slot = &amp;#039;main&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
    -- get data from the slot (works for both json and wikitext slots)&lt;br /&gt;
    local slotData = {}&lt;br /&gt;
    slotData = mw.slots.slotData(slot,page)&lt;br /&gt;
&lt;br /&gt;
    --mw.log(&amp;#039;slotData = .. &amp;#039;)&lt;br /&gt;
   	--mw.logObject(slotData)&lt;br /&gt;
    return slotData&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
function p.afExportSlots(frame)&lt;br /&gt;
&lt;br /&gt;
frame args:&lt;br /&gt;
slots 	(text)	comma-separated list of slots, defaults to &amp;quot;ws-class-props,ws-base-props,ws-data&amp;quot;&lt;br /&gt;
page 	(text)	defaults to current page&lt;br /&gt;
&lt;br /&gt;
{{#invoke:CspFunctions|afExportSlots}}&lt;br /&gt;
{{#invoke:CspFunctions|afExportSlots|page=Template:Sidebar item|slots=ws-base-props,ws-class-props}}&lt;br /&gt;
&lt;br /&gt;
debug console tests:&lt;br /&gt;
=p.afExportSlots(mw.getCurrentFrame():newChild{title=&amp;quot;whatever&amp;quot;,args={[&amp;quot;page&amp;quot;]=&amp;quot;Template:Sidebar item&amp;quot;,[&amp;quot;slots&amp;quot;]=&amp;quot;ws-base-props,ws-class-props&amp;quot;}}) &lt;br /&gt;
=p.afExportSlots(mw.getCurrentFrame():newChild{title=&amp;quot;whatever&amp;quot;,args={[&amp;quot;addClassDefinition&amp;quot;]=&amp;quot;&amp;quot;}}) &lt;br /&gt;
--]]&lt;br /&gt;
function p.afExportSlots(frame)&lt;br /&gt;
&lt;br /&gt;
-- get slots and page from frame args or set default value&lt;br /&gt;
local slots = frame.args[&amp;quot;slots&amp;quot;]&lt;br /&gt;
if slots == nil or slots == &amp;quot;&amp;quot; then slots = &amp;quot;ws-class-props,ws-base-props,ws-data&amp;quot; end&lt;br /&gt;
local page = frame.args[&amp;quot;page&amp;quot;]&lt;br /&gt;
if page == nil or page == &amp;quot;&amp;quot; then page = mw.title.getCurrentTitle().fullText end&lt;br /&gt;
  &lt;br /&gt;
-- get slot data for each slot and add to data table&lt;br /&gt;
local data = {}&lt;br /&gt;
data[1] = {}&lt;br /&gt;
for slot in string.gmatch(slots, &amp;#039;([^,]+)&amp;#039;) do&lt;br /&gt;
    local slotData = p.getSlotData(page,slot)&lt;br /&gt;
    if slotData == nil then slotData = &amp;quot;&amp;quot; end &lt;br /&gt;
    data[1][slot] = slotData&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
--mw.logObject(data) &lt;br /&gt;
return mw.af.export(data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
function p.getSlotContent(frame)&lt;br /&gt;
&lt;br /&gt;
{{#invoke:CspFunctions|getSlotContent|page=Template:Sidebar item|slot=ws-class-props}}&lt;br /&gt;
{{#invoke:CspFunctions|getSlotContent|page=Template:Sidebar item|slot=ws-class-props|nowiki}}&lt;br /&gt;
&lt;br /&gt;
This function returns a string with the exact content of a slot.&lt;br /&gt;
&lt;br /&gt;
frame arguments:&lt;br /&gt;
- page (optional): pagename of the page for which you want the slot content, defaults to current page&lt;br /&gt;
- slot (optional): slot of which you want the content, defaults to &amp;quot;main&amp;quot;&lt;br /&gt;
- 1 (optional: nowiki / preprocess): uses mw.text.nowiki or frame:preprocess on the content before returning it&lt;br /&gt;
&lt;br /&gt;
debug console tests:&lt;br /&gt;
p.getSlotContent() &lt;br /&gt;
p.getSlotContent{args={[&amp;#039;page&amp;#039;]=&amp;#039;Wiki:Testpagina sidebar code&amp;#039;,[&amp;#039;slot&amp;#039;]=&amp;#039;ws-data&amp;#039;}}&lt;br /&gt;
p.getSlotContent{args={[&amp;#039;page&amp;#039;]=&amp;#039;Template:Sidebar item&amp;#039;,[&amp;#039;slot&amp;#039;]=&amp;#039;ws-class-props&amp;#039;}}&lt;br /&gt;
--]]&lt;br /&gt;
function p.getSlotContent(frame)&lt;br /&gt;
  	-- get page from frame arguments or default to current page&lt;br /&gt;
    local page = frame.args[&amp;quot;page&amp;quot;]&lt;br /&gt;
  	if page == nil or page == &amp;#039;&amp;#039; then&lt;br /&gt;
    	page = mw.title.getCurrentTitle().fullText&lt;br /&gt;
    end&lt;br /&gt;
  	-- get slot from frame arguments or default to main&lt;br /&gt;
    local slot = frame.args[&amp;quot;slot&amp;quot;]&lt;br /&gt;
  	if slot == nil or slot == &amp;#039;&amp;#039; then&lt;br /&gt;
    	slot = &amp;#039;main&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
    -- get data from the slot&lt;br /&gt;
    local slotContent = mw.slots.slotContent(slot,page)&lt;br /&gt;
    if slotContent == nil then slotContent = &amp;quot;&amp;quot; end&lt;br /&gt;
  &lt;br /&gt;
    local result = slotContent&lt;br /&gt;
    -- apply the nowiki or preprocess options if needed&lt;br /&gt;
    if frame.args[1] == &amp;quot;nowiki&amp;quot; then&lt;br /&gt;
    	result = mw.text.nowiki(slotContent)&lt;br /&gt;
    elseif frame.args[1] == &amp;quot;preprocess&amp;quot; then&lt;br /&gt;
    	result = frame:preprocess(slotContent)&lt;br /&gt;
    end&lt;br /&gt;
      &lt;br /&gt;
    --mw.log(&amp;#039;result = .. &amp;#039;)&lt;br /&gt;
    --mw.log(result)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
function p.ClassToClassDefinitionPage(frame)&lt;br /&gt;
&lt;br /&gt;
This function returns the Class definition pagename based on a class input.&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{{#invoke:CspFunctions|ClassToClassDefinitionPage|Person}}&lt;br /&gt;
returns &amp;quot;Wiki:Class definition/Person&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If you want to call this inside another Lua function, make sure to include the class&lt;br /&gt;
as a frame argument, for example:&lt;br /&gt;
p.ClassToClassDefinitionPage{args={&amp;quot;Person&amp;quot;}}&lt;br /&gt;
returns &amp;quot;Wiki:Class definition/Person&amp;quot;&lt;br /&gt;
&lt;br /&gt;
frame args used:&lt;br /&gt;
1 	(text) class, for example &amp;quot;Person&amp;quot; or &amp;quot;Application page&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=p.ClassToClassDefinitionPage{args={&amp;quot;Person&amp;quot;}}&lt;br /&gt;
--]]&lt;br /&gt;
function p.ClassToClassDefinitionPage(frame)&lt;br /&gt;
  local class = frame.args[1]&lt;br /&gt;
  if class == &amp;quot;&amp;quot; or class == nil then&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
  local classDefinitionPage = &amp;quot;Wiki:Class definition/&amp;quot; .. class&lt;br /&gt;
  return classDefinitionPage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
function p.preprocess(frame)&lt;br /&gt;
&lt;br /&gt;
{{#invoke:CspFunctions|preprocess|_content=...}}&lt;br /&gt;
{{#invoke:CspFunctions|preprocess|_content={{#time:r|now}} }}&lt;br /&gt;
{{#invoke:CspFunctions|preprocess|_content={{{Intro|}}} {{#time:r|now}} |_args=parent args}}&lt;br /&gt;
&lt;br /&gt;
frame args used:&lt;br /&gt;
_content	(wikitext) for example &amp;quot;{{#time:r|now}}&amp;quot;&lt;br /&gt;
_args 		(optional: &amp;quot;parent args&amp;quot;) use this to add parent args to frame args, so that {{{Example|}}} &lt;br /&gt;
			parameter calls inside the wikitext will work with parameters from a parent page.&lt;br /&gt;
			Note that parent args do not overwrite frame args if they have the same name.&lt;br /&gt;
&lt;br /&gt;
debug console tests:&lt;br /&gt;
=p.preprocess(mw.getCurrentFrame():newChild{title=&amp;quot;test&amp;quot;,args={[&amp;quot;_content&amp;quot;]=&amp;quot;{{#time:r|now}}&amp;quot;}}) &lt;br /&gt;
=p.preprocess(mw.getCurrentFrame():newChild{args={[&amp;quot;Intro&amp;quot;]=&amp;quot;The current time is: &amp;quot;}}:newChild{title=&amp;quot;test&amp;quot;,args={[&amp;quot;_content&amp;quot;]=&amp;quot;{{{Intro|}}} {{#time:r|now}}&amp;quot;,[&amp;quot;_args&amp;quot;]=&amp;quot;parent args&amp;quot;}}) &lt;br /&gt;
--]]&lt;br /&gt;
function p.preprocess(frame)&lt;br /&gt;
  local content = frame.args[&amp;quot;_content&amp;quot;]&lt;br /&gt;
  if frame.args[&amp;quot;_args&amp;quot;] == &amp;quot;parent args&amp;quot; then&lt;br /&gt;
    modifiedArgs = {}&lt;br /&gt;
    for key,value in pairs(frame:getParent().args) do modifiedArgs[key] = value end&lt;br /&gt;
    for key,value in pairs(frame.args) do modifiedArgs[key] = value end&lt;br /&gt;
    modifiedFrame = frame:newChild{args=modifiedArgs}&lt;br /&gt;
    return modifiedFrame:preprocess(content)&lt;br /&gt;
  else&lt;br /&gt;
    return frame:preprocess(content)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
function p.getParentArg(frame)&lt;br /&gt;
&lt;br /&gt;
{{#invoke:CspFunctions|getParentArg|$pageData}}&lt;br /&gt;
{{#invoke:CspFunctions|getParentArg|$classData}}&lt;br /&gt;
&lt;br /&gt;
This function loops through  parents using frame:getParent until the specified parameter &lt;br /&gt;
is found in one of the parent frames or  the maximum number of 10 iterations is reached.&lt;br /&gt;
&lt;br /&gt;
debug console tests&lt;br /&gt;
=p.getParentArg(mw.getCurrentFrame():newChild{title=&amp;quot;whatever&amp;quot;,args={&amp;quot;a1&amp;quot;,&amp;quot;a2&amp;quot;,[&amp;quot;un&amp;quot;]=&amp;quot;ua&amp;quot;,&amp;quot;a3&amp;quot;}}) &lt;br /&gt;
=p.getParentArg(mw.getCurrentFrame():newChild{title=&amp;quot;Template:SHA&amp;quot;,args={&amp;quot;sha1&amp;quot;,&amp;quot;sha2&amp;quot;,[&amp;quot;ASH&amp;quot;]=&amp;quot;SAH&amp;quot;}}:newChild{title=&amp;quot;Module:Module&amp;quot;,args={&amp;quot;a1&amp;quot;,&amp;quot;a2&amp;quot;,[&amp;quot;un&amp;quot;]=&amp;quot;ua&amp;quot;,&amp;quot;a3&amp;quot;}})&lt;br /&gt;
=p.getParentArg(mw.getCurrentFrame():newChild{args={[&amp;quot;test&amp;quot;]=&amp;quot;123&amp;quot;}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={&amp;quot;test&amp;quot;}})&lt;br /&gt;
=p.getParentArg(mw.getCurrentFrame():newChild{args={[&amp;quot;test&amp;quot;]=&amp;quot;123&amp;quot;}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={&amp;quot;test&amp;quot;}})&lt;br /&gt;
=p.getParentArg(mw.getCurrentFrame():newChild{args={[&amp;quot;test&amp;quot;]=&amp;quot;123&amp;quot;}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={&amp;quot;test&amp;quot;}})&lt;br /&gt;
--]]&lt;br /&gt;
function p.getParentArg(frame)&lt;br /&gt;
  local i = 1&lt;br /&gt;
  local result = nil&lt;br /&gt;
  local parent = frame&lt;br /&gt;
  &lt;br /&gt;
  while i &amp;lt;= 10 and result == nil and parent ~= nil do&lt;br /&gt;
    parent = parent:getParent()&lt;br /&gt;
    if parent ~= nil then&lt;br /&gt;
      result = parent.args[frame.args[1]]&lt;br /&gt;
      mw.log(&amp;quot;i = &amp;quot; .. tostring(i) .. &amp;quot;, result = &amp;quot; .. tostring(result) )&lt;br /&gt;
    else&lt;br /&gt;
      mw.log(&amp;quot;i = &amp;quot;.. tostring(i) .. &amp;quot;, no parent&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    i = i+1&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if result == nil then result = &amp;quot;&amp;quot; end&lt;br /&gt;
  &lt;br /&gt;
  return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
function p.gmatch(frame)&lt;br /&gt;
&lt;br /&gt;
This function applies the pattern matching function mw.ustring.match to an input string and returns a string containing matched values (only unique values).&lt;br /&gt;
&lt;br /&gt;
frame args used:&lt;br /&gt;
1 	input to which pattern matching will be applied&lt;br /&gt;
2 	pattern &lt;br /&gt;
3 	optional separator, defaults to &amp;quot;,&amp;quot;&lt;br /&gt;
4 	optional conjunction (separator between final 2 items), defaults to separator&lt;br /&gt;
&lt;br /&gt;
examples use case:&lt;br /&gt;
{{#invoke:CspFunctions|gmatch|&amp;#039;sub-header sidebar&amp;#039; &amp;#039;main sidebar&amp;#039;|([^ \&amp;#039;&amp;quot;]+)|,}} will return: sub-header,sidebar,main&lt;br /&gt;
&lt;br /&gt;
debug console test:&lt;br /&gt;
=p.gmatch(mw.getCurrentFrame():newChild{args={&amp;quot;&amp;#039;sub-header sidebar&amp;#039; &amp;#039;main sidebar&amp;#039;&amp;quot;,&amp;#039;([^ \&amp;#039;&amp;quot;]+)&amp;#039;,&amp;quot;,&amp;quot;}}) &lt;br /&gt;
&lt;br /&gt;
--]]&lt;br /&gt;
function p.gmatch(frame)&lt;br /&gt;
  local layoutAreas = frame.args[1]&lt;br /&gt;
  local pattern = frame.args[2]&lt;br /&gt;
  local separator = frame.args[3]&lt;br /&gt;
  local conjunction = frame.args[4]&lt;br /&gt;
  &lt;br /&gt;
  if separator == nil then separator = &amp;quot;&amp;quot; end&lt;br /&gt;
  if conjunction == nil then conjunction = separator end&lt;br /&gt;
  &lt;br /&gt;
  local resultTable = {}&lt;br /&gt;
  local duplicateCheck = {}&lt;br /&gt;
  for item in mw.ustring.gmatch(layoutAreas,pattern) do&lt;br /&gt;
    if duplicateCheck[item] == nil then&lt;br /&gt;
      table.insert(resultTable,item)&lt;br /&gt;
      duplicateCheck[item] = true&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  return mw.text.listToText(resultTable,separator,conjunction)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>