Module:Template parameter value: Difference between revisions

From The Global Wiki
Jump to navigation Jump to search
en>Pppery
(Undid revision 890688034 by Oshwah (talk) Protection is handled by Template:Documentation)
 
en>Plastikspork
(Fix for simple piped links)
Line 1: Line 1:
<includeonly>{{safesubst:#invoke:Template parameter value|main}}</includeonly><noinclude>
local p = {}
{{documentation}}
local escape = require("Module:String")._escapePattern
</noinclude>
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 = 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 content = string.gsub(targettitle:getContent() or "", "[\r\n]", "")
-- Escape some pipes
content = string.gsub(content, '(%[%[[^%[{}]*)|([^%[%]{}]*%]%])', '%1' .. pipemarker ..'%2')
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, '([^|}]+)')
content = string.gsub(content, pipemarker, '|')
content = frame:preprocess{text = content}
content = trimspaces(content)
return content
end
 
return p

Revision as of 13:57, 25 May 2021

Documentation for this module may be created at Module:Template parameter value/doc

local p = {}
local escape = require("Module:String")._escapePattern
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 = 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 content = string.gsub(targettitle:getContent() or "", "[\r\n]", "")
	
	-- Escape some pipes
	content = string.gsub(content, '(%[%[[^%[{}]*)|([^%[%]{}]*%]%])', '%1' .. pipemarker ..'%2')
	
	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, '([^|}]+)')
	content = string.gsub(content, pipemarker, '|')
	content = frame:preprocess{text = content}
	content = trimspaces(content)
	
	return content
end

return p