Module:Template parameter value/sandbox

Revision as of 22:40, 15 June 2022 by imported>Guarapiranga
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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