Jump to content

Editing Module:Unsubst

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
local checkType = require('libraryUtil').checkType
local p = {}
local p = {}
local BODY_PARAM = '$B'


local specialParams = {
local specialParams = {
['$N'] = 'template name', -- Deprecated, but keeping until it is removed from transcluding templates
['$params'] = 'parameter list',
['$B'] = 'template content',
['$aliases'] = 'parameter aliases',
['$flags'] = 'flags',
['$B'] = 'template content'
}
}


p[''] = function ( frame )
function p.main(frame, body)
if not frame:getParent() then
-- If we are substing, this function returns a template invocation, and if
error( '{{#invoke:Unsubst|}} makes no sense without a parent frame' )
-- not, it returns the template body. The template body can be specified in
-- 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
 
error( '{{#invoke:Unsubst|}} requires parameter $B (template content)' )
-- Sanity check for the frame object.
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
 
if mw.isSubsting() then
-- Find the invocation name.
---- substing
local mTemplateInvocation = require('Module:Template invocation')
-- Combine passed args with passed defaults
local name = mTemplateInvocation.name(frame:getParent():getTitle())
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 29: Line 75:
args[k] = v
args[k] = v
end
end
end


-- Build an equivalent template invocation
-- Trim parameters, if not specified otherwise
-- First, find the title to use
if not string.find( ','..(frame.args['$flags'] or '')..',', ',%s*keep%-whitespace%s*,' ) then
local titleobj = mw.title.new(frame:getParent():getTitle())
for k, v in pairs( args ) do args[k] = mw.ustring.match(v, '^%s*(.*)%s*$') or '' end
local title
end
if titleobj.namespace == 10 then -- NS_TEMPLATE
 
title = titleobj.text
-- Pull information from parameter aliases
elseif titleobj.namespace == 0 then -- NS_MAIN
local aliases = {}
title = ':' .. titleobj.text
if frame.args['$aliases'] then
else
local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' )
title = titleobj.prefixedText
for k, v in ipairs( list ) do
local tmp = mw.text.split( v, '%s*>%s*' )
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
end
for k, v in pairs( aliases ) do
if args[k] and ( not args[v] or args[v] == '' ) then
args[v] = args[k]
end
end
args[k] = nil
end


-- Build the invocation body with numbered args first, then named
-- Remove empty parameters, if specified
local ret = '{{' .. title
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then
local tmp = 0
for k, v in ipairs( args ) do
for k, v in ipairs( args ) do
if string.find( v, '=', 1, true ) then
if v ~= '' or ( args[k+1] and args[k+1] ~= '' ) or ( args[k+2] and args[k+2] ~= '' ) then
-- likely something like 1=foo=bar, we need to do it as a named arg
tmp = k
else
break
break
end
end
ret = ret .. '|' .. v
args[k] = nil
end
end
for k, v in pairs( args ) do
for k, v in pairs( args ) do
ret = ret .. '|' .. k .. '=' .. v
if v == '' then
if not (type(k) == 'number' and k < tmp) then args[k] = nil end
end
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
end
for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end
return ret .. '}}'
args = tmp
else
---- Not substing
-- Just return the "body"
return frame.args['$B'] .. (frame.args['$N'] and frame:getParent():getTitle() == mw.title.getCurrentTitle().prefixedText and '' or '')
end
end
return mTemplateInvocation.invocation(name, args)
end
end
p[''] = p.main -- For backwards compatibility


return p
return p
Please note that all contributions to Micro Pedia may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Micro Pedia:Copyrights for details). Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)

Template used on this page: