Module:Demo: Difference between revisions
From Zoophilia Wiki
Jump to navigationJump to search
meta>Codehydro reduce decoding when nowiki tags are not present |
meta>Codehydro html entities are now visible in pre; allow modules to be demonstrated directly |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
function | --creates a frame object that cannot access any of the parent's args | ||
--unless a table containing a list keys of not to inherit is provided | |||
function disinherit(frame, onlyTheseKeys) | |||
frame = frame:getParent() or frame | frame = frame:getParent() or frame | ||
local orphan = frame:newChild{} | local orphan = frame:newChild{} | ||
-- | orphan.getParent = frame.getParent --returns nil | ||
if | if onlyTheseKeys then | ||
orphan.args = mw.clone(frame.args) | orphan.args = mw.clone(frame.args) | ||
for _, k in ipairs(onlyTheseKeys) do | |||
orphan.args[k] = nil | |||
end | |||
end | end | ||
orphan. | return orphan, frame | ||
local | end | ||
function p.get(frame, arg, passArgs) | |||
local orphan, frame = disinherit(frame, passArgs and {arg or 1}) | |||
local code, noWiki, preserve = frame.args[arg or 1] or '' | |||
if code:match'nowiki' then | |||
local placeholder, preserve = ('6'):char(), {} | |||
code = mw.text.unstripNoWiki(code) | |||
noWiki = code:gsub('%%', placeholder):gsub('<', '<'):gsub('>', '>') | |||
for k in noWiki:gmatch('&.-;') do | |||
if not preserve[k] then | |||
preserve[k] = true | |||
table.insert(preserve, (k:gsub('&', '&'))) | |||
noWiki = noWiki:gsub('(&.-;)', '%%%s') | |||
end | |||
end | |||
noWiki = mw.text.nowiki(noWiki):format(unpack(preserve)):gsub(placeholder, '%%') | |||
end | end | ||
return { | return { | ||
source = | source = noWiki or code, | ||
output = orphan:preprocess( | output = orphan:preprocess(code), | ||
frame = frame | frame = frame | ||
} | } | ||
end | end | ||
function p.main(frame) | function p.main(frame, demoTable) | ||
local show = p.get(frame) | local show = demoTable or p.get(frame) | ||
local | local args = show.frame.args | ||
args.br = tonumber(args.br or 1) and ('<br>'):rep(args.br or 1) or args.br or '' | |||
for k | if show[args.result_arg] then | ||
return show[args.result_arg] | |||
end | |||
return string.format('<pre%s>%s</pre>%s%s', args.style and string.format(" style='%s'", args.style) or '', show.source, args.br, show.output) | |||
end | |||
--passing of args into other module without preprocessing | |||
function p.module(frame) | |||
local orphan, frame = disinherit(frame, { | |||
'demo_template', | |||
'demo_module_func', | |||
'demo_main', | |||
'demo_br', | |||
'demo_result_arg' | |||
}) | |||
local template = frame.args.demo_template and 'Template:'..frame.args.demo_template | |||
local demoFunc = frame.args.demo_module_func or 'main\n' | |||
local demoModule = require('Module:%'..frame.args.demo_module)[demoFunc:match('^%s*(.-)%s*$')] | |||
frame.args.br, frame.args.result_arg = frame.args.demo_br, frame.args.demo_result_arg | |||
if demoModule then | |||
local source = template and {'{{', template and '' or '#invoke:', frame.args.demo_template or frame.args.demo_module, template and '' or '|', demoFunc} | |||
for k, v in pairs(frame.args) do | |||
table.insert( | |||
source, | |||
tonumber(k) and | |||
'|'..v | |||
or ('|%s = %s'):format(k, v) | |||
) | |||
end | end | ||
return p.main(frame, { | |||
source = mw.text.nowiki(table.concat(source)), | |||
output = demoModule(orphan), | |||
frame = frame | |||
}) | |||
else | else | ||
return "ERROR: Invalid module function: "..demoFunc | |||
return | |||
end | end | ||
end | end | ||
return p | return p |
Revision as of 23:23, 26 January 2015
Documentation for this module may be created at Module:Demo/doc
local p = {}
--creates a frame object that cannot access any of the parent's args
--unless a table containing a list keys of not to inherit is provided
function disinherit(frame, onlyTheseKeys)
frame = frame:getParent() or frame
local orphan = frame:newChild{}
orphan.getParent = frame.getParent --returns nil
if onlyTheseKeys then
orphan.args = mw.clone(frame.args)
for _, k in ipairs(onlyTheseKeys) do
orphan.args[k] = nil
end
end
return orphan, frame
end
function p.get(frame, arg, passArgs)
local orphan, frame = disinherit(frame, passArgs and {arg or 1})
local code, noWiki, preserve = frame.args[arg or 1] or ''
if code:match'nowiki' then
local placeholder, preserve = ('6'):char(), {}
code = mw.text.unstripNoWiki(code)
noWiki = code:gsub('%%', placeholder):gsub('<', '<'):gsub('>', '>')
for k in noWiki:gmatch('&.-;') do
if not preserve[k] then
preserve[k] = true
table.insert(preserve, (k:gsub('&', '&')))
noWiki = noWiki:gsub('(&.-;)', '%%%s')
end
end
noWiki = mw.text.nowiki(noWiki):format(unpack(preserve)):gsub(placeholder, '%%')
end
return {
source = noWiki or code,
output = orphan:preprocess(code),
frame = frame
}
end
function p.main(frame, demoTable)
local show = demoTable or p.get(frame)
local args = show.frame.args
args.br = tonumber(args.br or 1) and ('<br>'):rep(args.br or 1) or args.br or ''
if show[args.result_arg] then
return show[args.result_arg]
end
return string.format('<pre%s>%s</pre>%s%s', args.style and string.format(" style='%s'", args.style) or '', show.source, args.br, show.output)
end
--passing of args into other module without preprocessing
function p.module(frame)
local orphan, frame = disinherit(frame, {
'demo_template',
'demo_module_func',
'demo_main',
'demo_br',
'demo_result_arg'
})
local template = frame.args.demo_template and 'Template:'..frame.args.demo_template
local demoFunc = frame.args.demo_module_func or 'main\n'
local demoModule = require('Module:%'..frame.args.demo_module)[demoFunc:match('^%s*(.-)%s*$')]
frame.args.br, frame.args.result_arg = frame.args.demo_br, frame.args.demo_result_arg
if demoModule then
local source = template and {'{{', template and '' or '#invoke:', frame.args.demo_template or frame.args.demo_module, template and '' or '|', demoFunc}
for k, v in pairs(frame.args) do
table.insert(
source,
tonumber(k) and
'|'..v
or ('|%s = %s'):format(k, v)
)
end
return p.main(frame, {
source = mw.text.nowiki(table.concat(source)),
output = demoModule(orphan),
frame = frame
})
else
return "ERROR: Invalid module function: "..demoFunc
end
end
return p