Editing Module:Unsubst

Jump to: navigation, search

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 save 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 = {
['$params'] = 'parameter list',
+
['$N'] = 'template name', -- Deprecated, but keeping until it is removed from transcluding templates
['$aliases'] = 'parameter aliases',
+
['$B'] = 'template content',
['$flags'] = 'flags',
 
['$B'] = 'template content'
 
 
}
 
}
  
function p.main(frame, body)
+
p[''] = function ( frame )
-- 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 75: Line 29:
 
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
-- Pull information from parameter aliases
+
title = titleobj.text
local aliases = {}
+
elseif titleobj.namespace == 0 then -- NS_MAIN
if frame.args['$aliases'] then
+
title = ':' .. titleobj.text
local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' )
+
else
for k, v in ipairs( list ) do
+
title = titleobj.prefixedText
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
 
  
-- Remove empty parameters, if specified
+
-- Build the invocation body with numbered args first, then named
if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then
+
local ret = '{{' .. title
local tmp = 0
 
 
for k, v in ipairs( args ) do
 
for k, v in ipairs( args ) do
if v ~= '' or ( args[k+1] and args[k+1] ~= '' ) or ( args[k+2] and args[k+2] ~= '' ) then
+
if string.find( v, '=', 1, true ) then
tmp = k
+
-- likely something like 1=foo=bar, we need to do it as a named arg
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
if v == '' then
+
ret = ret .. '|' .. k .. '=' .. v
if not (type(k) == 'number' and k < tmp) then args[k] = nil end
 
end
 
 
end
 
end
 +
 +
return ret .. '}}'
 +
else
 +
---- Not substing
 +
-- Just return the "body"
 +
return frame.args['$B'] .. (frame.args['$N'] and frame:getParent():getTitle() == mw.title.getCurrentTitle().prefixedText and '[[Category:Calls to Module:Unsubst that use $N]]' or '')
 
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

Please note that all contributions to All About Ayrshire 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 All About Ayrshire:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)

Template used on this page: