Documentation for this module may be created at Module:Template parameter value/sandbox/doc
local p = {}
local escape = require('Module:String')._escapePattern
local function allcases(s)
return (s or ''):gsub('([%^%$%(%)%%%.%[%]%*%+%-])', '%%%1')
:gsub('%a', function(letter) return '['..letter:upper()..letter:lower()..']' end)
end
function trimspaces(s)
return s:gsub('^%s*(.-)%s*$', '%1')
end
local function getTitle(title)
local success, titleObj = pcall(mw.title.new, title)
if success then return titleObj
else return nil end
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Template parameter value'
})
local template = escape(args[2])
local parameter = escape(args[4])
local numberedParameter = (tonumber(parameter) ~= nil)
local templateCount = 0
local parameterCount = 0
local pipemarker = '~_~TPVPIPEMARKER~_~'
local templateMatch = tonumber(args[3] or 1)
local parameterMatch = tonumber(args[5] or 1)*(numberedParameter and parameter or 1)
local targetTitle = getTitle(args[1])
if targetTitle == nil then return '' end
-- local redirectTarget = mw.title.new(targetTitle).redirectTarget
-- if redirectTarget then targetTitle = redirectTarget end
local content = string.gsub(targetTitle:getContent() or '', '[\r\n]', '')
-- Escape some pipes
content = content:gsub('(%[%[[^%[{}]*)|([^%[%]{}]*%]%])', '%1' .. pipemarker ..'%2')
while templateCount ~= templateMatch do
if content == nil then return '' end
content = string.match(content, '{{' .. allcases(template) .. '(.+)')
templateCount = templateCount + 1
end
while parameterCount ~= parameterMatch do
if content == nil then return '' end
content = string.match(content, '|%s*' .. (numberedParameter and '' or allcases(parameter) .. '%s*=%s*') .. '([^|].*)')
parameterCount = parameterCount + 1
end
if content == nil then return '' end
content = content:gsub('</?%a*include%a*>', '')
content = content:match('^([^|}]*{{[^}]+}}[^|}]*)|') or content:match('([^|}]+)')
content = content:gsub(pipemarker, '|')
content = frame:preprocess{text = content}
content = trimspaces(content)
return content
end
return p