Module:CspFunctions
- getSlotData
- afExportSlots
- getSlotContent
- ClassToClassDefinitionPage
- preprocess
- getParentArg
- gmatch
getSlotData
slotData was introduced in a later version. Not working here at the time of writing.
{{#invoke:CspFunctions|getSlotData|page=|slot=}}
Luafout op regel 29: attempt to call field 'slotData' (a nil value)
cf. slotdata parser function {{#slotdata:main Boek/1878866 }}
getSlotContent
{{#invoke:CspFunctions|getSlotContent|page=Boek/1878866|slot=main}}
Geloof niet zomaar alles, ook niet op andere planeten! Hier probeert een oplichter je een spreuk aan te smeren die nooit getest is, daar krijg je een gloednieuw ruimteschip aangeboden waar later wel iets mis mee blijkt. Pas ook op bij ruimteraces of drakengevechten, want overal willen mensen of andere wezens geld aan je verdienen. Laat deze bundel een waarschuwing zijn! Word je wakker met een kunstbeen, blijk je bijvoorbeeld zomaar een proefpersoon te zijn in een bijzonder project...
Same as{{#slot:main|Boek/1878866}}
Geloof niet zomaar alles, ook niet op andere planeten! Hier probeert een oplichter je een spreuk aan te smeren die nooit getest is, daar krijg je een gloednieuw ruimteschip aangeboden waar later wel iets mis mee blijkt. Pas ook op bij ruimteraces of drakengevechten, want overal willen mensen of andere wezens geld aan je verdienen. Laat deze bundel een waarschuwing zijn! Word je wakker met een kunstbeen, blijk je bijvoorbeeld zomaar een proefpersoon te zijn in een bijzonder project...
getSlotContent nowiki
local p = {} --[[ function p.getSlotData(page,slot) This function returns a Lua table with structured content of the slot. function arguments: - page (optional): pagename of the page for which you want the slot content, defaults to current page - slot (optional): slot of which you want the content, defaults to "main" debug console tests: p.getSlotData() p.getSlotData('Wiki:Testpagina sidebar code','ws-data') p.getSlotData('Template:Sidebar item','ws-class-props') --]] function p.getSlotData(page,slot) -- get page from function arguments or default to current page if page == nil or page == '' then page = mw.title.getCurrentTitle().fullText end -- get slot from function arguments or default to main if slot == nil or slot == '' then slot = 'main' end -- get data from the slot (works for both json and wikitext slots) local slotData = {} slotData = mw.slots.slotData(slot,page) --mw.log('slotData = .. ') --mw.logObject(slotData) return slotData end --[[ function p.afExportSlots(frame) frame args: slots (text) comma-separated list of slots, defaults to "ws-class-props,ws-base-props,ws-data" page (text) defaults to current page {{#invoke:CspFunctions|afExportSlots}} {{#invoke:CspFunctions|afExportSlots|page=Template:Sidebar item|slots=ws-base-props,ws-class-props}} debug console tests: =p.afExportSlots(mw.getCurrentFrame():newChild{title="whatever",args={["page"]="Template:Sidebar item",["slots"]="ws-base-props,ws-class-props"}}) =p.afExportSlots(mw.getCurrentFrame():newChild{title="whatever",args={["addClassDefinition"]=""}}) --]] function p.afExportSlots(frame) -- get slots and page from frame args or set default value local slots = frame.args["slots"] if slots == nil or slots == "" then slots = "ws-class-props,ws-base-props,ws-data" end local page = frame.args["page"] if page == nil or page == "" then page = mw.title.getCurrentTitle().fullText end -- get slot data for each slot and add to data table local data = {} data[1] = {} for slot in string.gmatch(slots, '([^,]+)') do local slotData = p.getSlotData(page,slot) if slotData == nil then slotData = "" end data[1][slot] = slotData end --mw.logObject(data) return mw.af.export(data) end --[[ function p.getSlotContent(frame) {{#invoke:CspFunctions|getSlotContent|page=Template:Sidebar item|slot=ws-class-props}} {{#invoke:CspFunctions|getSlotContent|page=Template:Sidebar item|slot=ws-class-props|nowiki}} This function returns a string with the exact content of a slot. frame arguments: - page (optional): pagename of the page for which you want the slot content, defaults to current page - slot (optional): slot of which you want the content, defaults to "main" - 1 (optional: nowiki / preprocess): uses mw.text.nowiki or frame:preprocess on the content before returning it debug console tests: p.getSlotContent() p.getSlotContent{args={['page']='Wiki:Testpagina sidebar code',['slot']='ws-data'}} p.getSlotContent{args={['page']='Template:Sidebar item',['slot']='ws-class-props'}} --]] function p.getSlotContent(frame) -- get page from frame arguments or default to current page local page = frame.args["page"] if page == nil or page == '' then page = mw.title.getCurrentTitle().fullText end -- get slot from frame arguments or default to main local slot = frame.args["slot"] if slot == nil or slot == '' then slot = 'main' end -- get data from the slot local slotContent = mw.slots.slotContent(slot,page) if slotContent == nil then slotContent = "" end local result = slotContent -- apply the nowiki or preprocess options if needed if frame.args[1] == "nowiki" then result = mw.text.nowiki(slotContent) elseif frame.args[1] == "preprocess" then result = frame:preprocess(slotContent) end --mw.log('result = .. ') --mw.log(result) return result end --[[ function p.ClassToClassDefinitionPage(frame) This function returns the Class definition pagename based on a class input. Example: {{#invoke:CspFunctions|ClassToClassDefinitionPage|Person}} returns "Wiki:Class definition/Person" If you want to call this inside another Lua function, make sure to include the class as a frame argument, for example: p.ClassToClassDefinitionPage{args={"Person"}} returns "Wiki:Class definition/Person" frame args used: 1 (text) class, for example "Person" or "Application page" =p.ClassToClassDefinitionPage{args={"Person"}} --]] function p.ClassToClassDefinitionPage(frame) local class = frame.args[1] if class == "" or class == nil then return end local classDefinitionPage = "Wiki:Class definition/" .. class return classDefinitionPage end --[[ function p.preprocess(frame) {{#invoke:CspFunctions|preprocess|_content=...}} {{#invoke:CspFunctions|preprocess|_content={{#time:r|now}} }} {{#invoke:CspFunctions|preprocess|_content={{{Intro|}}} {{#time:r|now}} |_args=parent args}} frame args used: _content (wikitext) for example "{{#time:r|now}}" _args (optional: "parent args") use this to add parent args to frame args, so that {{{Example|}}} parameter calls inside the wikitext will work with parameters from a parent page. Note that parent args do not overwrite frame args if they have the same name. debug console tests: =p.preprocess(mw.getCurrentFrame():newChild{title="test",args={["_content"]="{{#time:r|now}}"}}) =p.preprocess(mw.getCurrentFrame():newChild{args={["Intro"]="The current time is: "}}:newChild{title="test",args={["_content"]="{{{Intro|}}} {{#time:r|now}}",["_args"]="parent args"}}) --]] function p.preprocess(frame) local content = frame.args["_content"] if frame.args["_args"] == "parent args" then modifiedArgs = {} for key,value in pairs(frame:getParent().args) do modifiedArgs[key] = value end for key,value in pairs(frame.args) do modifiedArgs[key] = value end modifiedFrame = frame:newChild{args=modifiedArgs} return modifiedFrame:preprocess(content) else return frame:preprocess(content) end end --[[ function p.getParentArg(frame) {{#invoke:CspFunctions|getParentArg|$pageData}} {{#invoke:CspFunctions|getParentArg|$classData}} This function loops through parents using frame:getParent until the specified parameter is found in one of the parent frames or the maximum number of 10 iterations is reached. debug console tests =p.getParentArg(mw.getCurrentFrame():newChild{title="whatever",args={"a1","a2",["un"]="ua","a3"}}) =p.getParentArg(mw.getCurrentFrame():newChild{title="Template:SHA",args={"sha1","sha2",["ASH"]="SAH"}}:newChild{title="Module:Module",args={"a1","a2",["un"]="ua","a3"}}) =p.getParentArg(mw.getCurrentFrame():newChild{args={["test"]="123"}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={"test"}}) =p.getParentArg(mw.getCurrentFrame():newChild{args={["test"]="123"}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={"test"}}) =p.getParentArg(mw.getCurrentFrame():newChild{args={["test"]="123"}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={}}:newChild{args={"test"}}) --]] function p.getParentArg(frame) local i = 1 local result = nil local parent = frame while i <= 10 and result == nil and parent ~= nil do parent = parent:getParent() if parent ~= nil then result = parent.args[frame.args[1]] mw.log("i = " .. tostring(i) .. ", result = " .. tostring(result) ) else mw.log("i = ".. tostring(i) .. ", no parent") end i = i+1 end if result == nil then result = "" end return result end --[[ function p.gmatch(frame) This function applies the pattern matching function mw.ustring.match to an input string and returns a string containing matched values (only unique values). frame args used: 1 input to which pattern matching will be applied 2 pattern 3 optional separator, defaults to "," 4 optional conjunction (separator between final 2 items), defaults to separator examples use case: {{#invoke:CspFunctions|gmatch|'sub-header sidebar' 'main sidebar'|([^ \'"]+)|,}} will return: sub-header,sidebar,main debug console test: =p.gmatch(mw.getCurrentFrame():newChild{args={"'sub-header sidebar' 'main sidebar'",'([^ \'"]+)',","}}) --]] function p.gmatch(frame) local layoutAreas = frame.args[1] local pattern = frame.args[2] local separator = frame.args[3] local conjunction = frame.args[4] if separator == nil then separator = "" end if conjunction == nil then conjunction = separator end local resultTable = {} local duplicateCheck = {} for item in mw.ustring.gmatch(layoutAreas,pattern) do if duplicateCheck[item] == nil then table.insert(resultTable,item) duplicateCheck[item] = true end end return mw.text.listToText(resultTable,separator,conjunction) end return p