Модуль:Demo (Bk;rl,&Demo)
Перейти к навигации
Перейти к поиску
local p = {}
local getArgs = require('Модуль:Arguments').getArgs
local function hasValue(param)
if param and param:find('%S') then
return true
end
end
--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)
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
orphan.args[k] = orphan.args[k] or v
end
end
parent.args = mw.clone(orphan.args)
setmetatable(orphan.args, nil)
for _, k in ipairs(onlyTheseKeys) do
rawset(orphan.args, k, nil)
end
end
return orphan, parent
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 ''
local kill_categories = not frame.args.save_categories
local tag, sep
if code:match'nowiki' then
local placeholder, preserve = ('6'):char(), {}
-- We replace "}%-" and "%-{" because of some server bug probably connected to
-- [[mw:Parsoid/MediaWiki DOM spec/Language conversion blocks]] and leading to
-- =mw.text.unstripNoWiki(mw.getCurrentFrame():preprocess('<nowiki>}-</nowiki>'))
-- outputting '}-' instead of "}-", while it's ok with "<nowiki>} -</nowiki>"
code = mw.text.unstripNoWiki(code)
:gsub('<', '<')
:gsub('>', '>')
:gsub('}%-', '}-')
:gsub('%-{', '-{')
if (mw.text.trim(code):match'\n') then
tag = 'pre'
sep = ''
end
noWiki = code:gsub('%%', placeholder)
for k in noWiki:gmatch('&.-;') do
table.insert(preserve, (k:gsub('&', '&')))
noWiki = noWiki:gsub('(&.-;)', '%%%s')
end
noWiki = mw.text.nowiki(noWiki):format(unpack(preserve)):gsub(placeholder, '%%')
end
return {
source = noWiki or code,
output = orphan:preprocess(code)
:gsub(kill_categories and '%[%[Категория:.-%]%]' or '', '')
:gsub(kill_categories and '%[%[К:.-%]%]' or '', '')
:gsub(kill_categories and '%[%[Category:.-%]%]' or '', ''),
frame = frame,
args = getArgs(frame),
tag = tag,
sep = sep
}
end
function p.main(frame, demoTable)
local show = demoTable or p.get(frame)
local args = show.args
local yesno = require('Module:Yesno')
args.reverse = yesno(args.reverse, false)
args.tag = hasValue(args.tag) and args.tag or hasValue(show.tag) and show.tag or "code"
args.sep = args.sep or args.br or show.sep
args.sep = tonumber(args.sep) and ('<br>'):rep(args.sep or 0) or args.sep or (args.tag == 'pre' and '' or ' → ')
if show[args.result_arg] then
return show[args.result_arg]
end
return args.reverse
and string.format(
'%s%s<%s%s%s>%s</%s>',
show.output,
args.sep,
args.tag,
hasValue(args.class) and string.format(' class="%s"', args.class) or '',
hasValue(args.style) and string.format(' style="%s"', args.style) or '',
show.source,
args.tag
)
or string.format(
'<%s%s%s>%s</%s>%s%s',
args.tag,
hasValue(args.class) and string.format(' class="%s"', args.class) or '',
hasValue(args.style) and string.format(' style="%s"', args.style) or '',
show.source,
args.tag,
args.sep,
show.output
)
end
--passing of args into other module without preprocessing
function p.module(frame)
local orphan, frame = disinherit(frame, {
'demo_template',
'demo_module',
'demo_module_func',
'demo_main',
'demo_br',
'demo_result_arg',
'demo_save_categories'
})
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 or frame.args.demo_sep, frame.args.demo_result_arg
local kill_categories = not save_categories
if demoModule then
local named = {insert = function(self, ...) table.insert(self, ...) return self end}
local source = {insert = named.insert, '{{', frame.args.demo_template or frame.args.demo_module, '\n'}
if not template then
source:insert(2, '#invoke:'):insert(4, '|'):insert(5, demoFunc)
end
local insertNamed = #source + 1
for k, v in pairs(orphan.args) do
local nan, insert = type(k) ~= 'number', {v}
local target = nan and named or source
target:insert'|'
if nan then
target:insert(k):insert'=':insert'\n'
table.insert(insert, 1, #target)
end
target:insert(unpack(insert))
local nowiki = v:match('nowiki')
if nowiki or v:match('{{.-}}') then
orphan.args[k] = frame:preprocess(nowiki and mw.text.unstripNoWiki(v) or v)
end
end
source:insert'}}'
table.insert(source, insertNamed, table.concat(named))
return p.main(orphan, {
source = mw.text.encode(table.concat(source), "<>'|=~"),
output = tostring(demoModule(orphan)):gsub(kill_categories and '%[%[Категория:.-%]%]' or '', ''):gsub(kill_categories and '%[%[К:.-%]%]' or '', ''):gsub(kill_categories and '%[%[Category:.-%]%]' or '', ''),
frame = frame
})
else
return "ERROR: Invalid module function: "..demoFunc
end
end
return p