Modulo:Carriera sportivo

La documentazione per questo modulo può essere creata in Modulo:Carriera sportivo/man

local getArgs = require('Modulo:Arguments').getArgs
local p = {}

--i pattern supportati devono avere sempre 3 gruppi: (prefisso)(nome squadra)(suffisso)
local supportedPatterns = {
	'(→ *)(.*)(.-)',                         --per i trasferimenti
	'(<[^<>]*>)(.*)(< */[^<>]*>)',           --per i tag (riconosce anche {{TA}} e simili)
	'(.-)(.*)(%c\'"`UNIQ---ref.*QINU`"\'%c)' --per le note
}

local function makeTag(name, content, attributes)
	return string.format('<%s %s>%s</%s>', name, attributes or '', content or '', name)
end

local function makeTd(content, attributes)
	return makeTag('td', content, attributes)
end

local function getYearFromRange(range)
	--se l'intervallo temporale ha un formato riconosciuto, allora ricava l'ultimo anno e decrementalo di uno
	--altrimenti, se l'intervallo temporale è costituito solo da un anno, allora usa quest'ultimo
	--l'anno iniziale ammette anche i punti interrogativi
	return ( range:find('^[%d?][%d?][%d?][%d?] *[\-–] *%d%d%d%d$') and (tonumber(range:sub(-4)) - 1) )
		or ( range:find('^%d%d%d%d$') and range )
		or ''
end

local function unformat(content)
	local newContent = content
	local matchedPatterns = {}
	repeat
		local matched = false
		for i = 1, #supportedPatterns do
			local prefix, middle, suffix = newContent:match('^'..supportedPatterns[i]..'$')
			if middle and newContent ~= middle then
				matched = true
				newContent = middle
				--salvo la coppia prefisso-suffisso in prima posizione in modo che venga pescata dalla cima dello stack
				table.insert(matchedPatterns, 1, {prefix, suffix})
			end
		end
	until (not matched) --continuo il loop finché non ottengo più match
	return newContent, matchedPatterns
end

local function reformat(content, wrappers)
	local newContent = content
	for i = 1, #wrappers do
		local wrapper = wrappers[i]
		newContent = wrapper[1] .. newContent .. wrapper[2]
	end
	return newContent
end

function p.getList(frame)
	local args = getArgs(frame)
	local sport = args['sport'] or ''
	local pos = mw.title.getCurrentTitle().namespace == 0 and args['pos'] or ''
	
	--parsing preliminare per controllare che la terza colonna contenga almeno un valore
	local hasScore = false
	local rowNum = 0
	while true do
		local startIndex = rowNum * 3
		local team  = args[startIndex + 2]
		local score = args[startIndex + 3]
		if not team then break end
		if score then hasScore = true break end
		rowNum = rowNum + 1
	end
	
	local res = ''
	rowNum = 0
	while true do
		local startIndex = rowNum * 3
		local range = args[startIndex + 1] or ''
		local team  = args[startIndex + 2]
		local score = args[startIndex + 3] or ''
		
		local _, spaceCount = string.gsub(score, " ", "")
		if spaceCount <= 1 then score = makeTag('span', score, 'class="nowrap"') end
		
		if not team then break end
		
		if sport ~= '' then
			local year = getYearFromRange(range)
			local cleanedTeam, matchedPatterns = unformat(team)
			
			--chiamata protetta per verificare l'esistenza del template
			local success, result = pcall(frame.expandTemplate, frame, {
				title = string.format('Template:%s %s', sport, cleanedTeam),
				args = { pos, year }
			})
			if success then team = reformat(result, matchedPatterns) end
		end
		
		local range_cell = makeTd(range)
		local team_cell  = makeTd(team, not hasScore and 'colspan="2"' or '')
		local score_cell = hasScore and makeTd(score, '') or ''
		local content = range_cell .. team_cell .. score_cell
		local rowStyle = 'style="background:white"'
		res = res .. makeTag('tr', content, rowStyle)
		
		rowNum = rowNum + 1
	end
	
	return res
end

return p