نسخهٔ فعلی |
متن شما |
خط ۱: |
خط ۱: |
| 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',
| |
| ['$flags'] = 'flags',
| |
| ['$B'] = 'template content', | | ['$B'] = 'template content', |
| ['$template-name'] = 'template invocation name override',
| |
| } | | } |
|
| |
|
| 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
| |
| | |
| -- 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 not frame.args['$B'] then |
| -- Find the invocation name.
| | error( '{{#invoke:Unsubst|}} requires parameter $B (template content)' ) |
| local mTemplateInvocation = require('Module:Template invocation')
| |
| local name
| |
| | |
| if frame.args['$template-name'] and '' ~= frame.args['$template-name'] then | |
| name = frame.args['$template-name'] -- override whatever the template name is with this name | |
| else
| |
| name = mTemplateInvocation.name(frame:getParent():getTitle())
| |
| end | | end |
| | | |
| -- Combine passed args with passed defaults | | if mw.isSubsting() then |
| local args = {}
| | ---- substing |
| if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*override%s*,' ) then
| | -- Combine passed args with passed defaults |
| for k, v in pairs( frame:getParent().args ) do
| | local args = {} |
| 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 |
خط ۸۲: |
خط ۲۹: |
| 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'] |
| 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 |