Module:Unsubst: Difference between revisions
From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
Content added Content deleted
m (all uses removed) |
(add parameter list, aliases, flags; use Module:Template invocation) |
||
Line 1: | Line 1: | ||
local checkType = require('libraryUtil').checkType |
|||
local p = {} |
local p = {} |
||
local BODY_PARAM = '$B' |
|||
local specialParams = { |
local specialParams = { |
||
['$ |
['$params'] = 'parameter list', |
||
['$aliases'] = 'parameter aliases', |
|||
['$flags'] = 'flags', |
|||
['$B'] = 'template content' |
|||
} |
} |
||
function p.main(frame, body) |
|||
-- If we are substing, this function returns a template invocation, and if |
|||
if not frame:getParent() then |
|||
-- not, it returns the template body. The template body can be specified in |
|||
error( '{{#invoke:Unsubst|}} makes no sense without a parent frame' ) |
|||
-- the body parameter, or in the template parameter defined in the |
|||
-- BODY_PARAM variable. This function can be called from Lua or from |
|||
-- #invoke. |
|||
-- Return the template body if we aren't substing. |
|||
if not mw.isSubsting() then |
|||
if body ~= nil then |
|||
return body |
|||
elseif frame.args[BODY_PARAM] ~= nil then |
|||
return frame.args[BODY_PARAM] |
|||
else |
|||
error(string.format( |
|||
"no template content specified (use parameter '%s' from #invoke)", |
|||
BODY_PARAM |
|||
), 2) |
|||
end |
|||
end |
end |
||
if not frame.args['$B'] then |
|||
-- Sanity check for the frame object. |
|||
error( '{{#invoke:Unsubst|}} requires parameter $B (template content)' ) |
|||
if type(frame) ~= 'table' |
|||
or type(frame.getParent) ~= 'function' |
|||
or not frame:getParent() |
|||
then |
|||
error( |
|||
"argument #1 to 'main' must be a frame object with a parent " .. |
|||
"frame available", |
|||
2 |
|||
) |
|||
end |
end |
||
-- Find the invocation name. |
|||
if mw.isSubsting() then |
|||
local mTemplateInvocation = require('Module:Template invocation') |
|||
---- substing |
|||
local name = mTemplateInvocation.name(frame:getParent():getTitle()) |
|||
-- Combine passed args with passed defaults |
|||
local args = {} |
|||
-- Combine passed args with passed defaults |
|||
local args = {} |
|||
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*override%s*,' ) then |
|||
for k, v in pairs( frame:getParent().args ) do |
|||
args[k] = v |
|||
end |
|||
for k, v in pairs( frame.args ) do |
|||
if not specialParams[k] then |
|||
if v == '__DATE__' then |
|||
v = mw.getContentLanguage():formatDate( 'F Y' ) |
|||
end |
|||
args[k] = v |
|||
end |
|||
end |
|||
else |
|||
for k, v in pairs( frame.args ) do |
for k, v in pairs( frame.args ) do |
||
if not specialParams[k] then |
if not specialParams[k] then |
||
Line 28: | Line 75: | ||
args[k] = v |
args[k] = v |
||
end |
end |
||
end |
|||
-- Trim parameters, if not specified otherwise |
|||
-- Build an equivalent template invocation |
|||
if not string.find( ','..(frame.args['$flags'] or '')..',', ',%s*keep%-whitespace%s*,' ) then |
|||
-- First, find the title to use |
|||
for k, v in pairs( args ) do args[k] = mw.ustring.match(v, '%s*(.*)%s*') or '' end |
|||
local titleobj = mw.title.new(frame:getParent():getTitle()) |
|||
end |
|||
local title |
|||
if titleobj.namespace == 10 then -- NS_TEMPLATE |
|||
-- Remove empty parameters, if specified |
|||
title = titleobj.text |
|||
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then |
|||
elseif titleobj.namespace == 0 then -- NS_MAIN |
|||
for k, v in pairs( args ) do |
|||
title = ':' .. titleobj.text |
|||
if v == '' then args[k] = nil end |
|||
else |
|||
title = titleobj.prefixedText |
|||
end |
end |
||
end |
|||
-- Pull information from parameter aliases |
|||
-- Build the invocation body with numbered args first, then named |
|||
local aliases = {} |
|||
if frame.args['$aliases'] then |
|||
for k, v in ipairs( args ) do |
|||
local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' ) |
|||
if string.find( v, '=', 1, true ) then |
|||
for k, v in ipairs( list ) do |
|||
-- likely something like 1=foo=bar, we need to do it as a named arg |
|||
local tmp = mw.text.split( v, '%s*>%s*' ) |
|||
break |
|||
aliases[tonumber(mw.ustring.match(tmp[1], '^[1-9][0-9]*$')) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], '^[1-9][0-9]*$'))) or tmp[2]) |
|||
end |
|||
ret = ret .. '|' .. v |
|||
args[k] = nil |
|||
end |
end |
||
end |
|||
for k, v in pairs( args ) do |
|||
for k, v in pairs( aliases ) do |
|||
ret = ret .. '|' .. k .. '=' .. v |
|||
if args[k] and ( not args[v] or args[v] == '' ) then |
|||
args[v] = args[k] |
|||
end |
end |
||
args[k] = nil |
|||
return ret .. '}}' |
|||
else |
|||
---- Not substing |
|||
-- Just return the "body" |
|||
return frame.args['$B'] |
|||
end |
end |
||
-- Order parameters |
|||
if frame.args['$params'] then |
|||
local params, tmp = mw.text.split( frame.args['$params'], '%s*,%s*' ), {} |
|||
for k, v in ipairs(params) do |
|||
v = tonumber(mw.ustring.match(v, '^[1-9][0-9]*$')) or v |
|||
if args[v] then tmp[v], args[v] = args[v], nil end |
|||
end |
|||
for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end |
|||
args = tmp |
|||
end |
|||
return mTemplateInvocation.invocation(name, args) |
|||
end |
end |
||
p[''] = p.main -- For backwards compatibility |
|||
return p |
return p |