Jump to content

Module:Sandbox/Alex 21

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Alex 21 (talk | contribs) at 13:28, 7 September 2019 (Template parameter value). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}

function trimspaces(s)
	return string.gsub(s, "^%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 = args[2]
	local parameter = args[4]
	local numberedParameter = (tonumber(parameter) ~= nil)
	
	local templateCount = 0
	local parameterCount = 0
	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 content = string.gsub(targettitle:getContent() or "", "[\r\n]", "")
	
	while templateCount ~= templateMatch do
		if content == nil then return "" end
		content = string.match(content, '{{' .. template .. "(.+)")
		templateCount = templateCount + 1
	end
	
	while parameterCount ~= parameterMatch do
		if content == nil then return "" end
		content = string.match(content, '|%s*' .. (numberedParameter and "" or parameter .. '%s*=%s*') .. '([^|].*)')
		parameterCount = parameterCount + 1
	end
	
	if content == nil then return "" end
	
	content = string.gsub(content, "</?%a*include%a*>", "")
	-- content = string.match(content, '^([^|}]*{{[^}]+}}[^|}]*)|') or string.match(content, '^([^|\]]*\[\[[^\]]+\]\][^|\]]*)|') or string.match(content, '([^|}]+)')
	
	local content_concat = ""
	local content_remain = content
	local content_remain2 = ""
	
	while content_remain ~= nil do
	    local content, content_remain2 = string.match(content_remain, "^([^%|%[%]]*%[%[[^%]]+%]%][^%|%[%]]*)(.*)")
	    if content == nil then content = string.match(content_remain, '([^|}]+)') end
	    content_concat = content_concat ..  content
	    content_remain = content_remain2
	end
	content = content_concat
	
	content = frame:preprocess{text = content}
	content = trimspaces(content)
	
	return content
end

return p