Module:Sandbox/psemdel/CR

local p = {} local wiki, onwikidata wiki = string.match(mw.site.server, "%a+") if wiki == "www" then wiki = "fr" onwikidata = true else onwikidata = false end local contentLanguage = mw.getContentLanguage local wikilang = contentLanguage:getCode local wikibase = mw.wikibase local localframe -- Value may be given by functions which use frame functions like getReference

-- == Structure of the code == -- I) Constant -- II) Basic functions (fooA) -- III) Functions less basic called from other functions -A) Time functions (new) -B) Time functions (obsolete) -C) Link functions (new) -D) Link functions (obsolete) -E) Functions for the output, like table -F) Jersey, flag functions -G) Other (winner) -- IV) Translation -- V) Main functions - A) Function race reference - B) Calendar - C) Victory - D) Stage infobox - E) List of teams - F) Classifications - G) Infobox - H) Team roster - I) Function list of winners (palmarès) - J) List of stages --Tipps: search "--==" to navigate between the sections

--== I) Classes declared as global == -- Class of a cycling race. Class is: 1.UWT, 2.UWT, 1.HC, ... add new classes, no problem local class = { "Q22231106", "Q22231107", "Q22231108", "Q22231109", "Q22231110", "Q22231111", "Q22231112",	"Q22231113", "Q22231114", "Q22231115", "Q22231116", "Q22231117", "Q22231118", "Q22231119", "Q23015458",	"Q23005601", "Q23005603" } local classes = {	Q22231106 = true, Q22231107 = true, Q22231108 = true, Q22231109 = true, Q22231110 = true, Q22231111 = true,	Q22231112 = true, Q22231113 = true, Q22231114 = true, Q22231115 = true, Q22231116 = true, Q22231117 = true,	Q22231118 = true, Q22231119 = true, Q23015458 = true, Q23005601 = true, Q23005603 = true }

local class_2x = {"Q22231107", "Q23005603", "Q22231115", "Q22231109", "Q22231112", "Q22231113", "Q22231117"} --multi stage races local class_without2x = { "Q22231106", "Q22231108", "Q22231110", "Q22231111", "Q22231114", "Q22231116", "Q22231118", "Q22231119", "Q23015458",	"Q23005601", "Q23005603" } local class_champ = {	"Q22231118", "Q22231119", "Q23015458"}

local class_sort={["Q22231106"]='01', ["Q22231107"]='01', ["Q23005601"]='01', ["Q23005603"]='01', ["Q22231115"]='01', -- 1.UWT, 2.UWT, 1.WWT, 2.WWT, 2.Ncup ["Q22231114"]='02', ["Q22231109"]='03', ["Q22231108"]='04', ["Q22231112"]='05', ["Q22231110"]='06', -- 1.Ncup, 2.HC, 1.HC, 2.1, 1.1 ["Q22231113"]='07', ["Q22231117"]='07', ["Q22231111"]='08', ["Q22231116"]='08', ["Q22231119"]='09', --2.2, 2.2U, 1.2, 1.2U, CN		["Q22231118"]='13', ["Q23015458"]='15' } local stages = {'Q18131152', 'Q20646667', 'Q20646670', 'Q20680270', 'Q20646668', 'Q20679712', 'Q2348250', 'Q2266066', 'Q485321'} -- UCI Europe Tour,..., UCI ProTour, UCI World Calendar, UCI WorldTour, UCI Women’s WorldTour, UCI Women's Road World Rankings local UCI_Circuits = {'Q1194340', 'Q1063423', 'Q1063430', 'Q268357', 'Q1039648', 'Q1329578', 'Q12270097', 'Q635366', 'Q21075974', 'Q1693153'}

local available, translations = pcall(require, "Module:Cycling race/lang") local available_list = available and type(translations.list) == "function" local available_lang_priority = available == true and type(translations.lang_priority) == "table"

local textalign = "left" local floattable = "left" local floatinfobox = "right" if wiki == "ar" or wiki == "fa" or wiki == "ur" or wiki == "he"	then textalign = "right" floattable = "right" floatinfobox = "left" end

--== II) basic functions (fooA) -- Get any value for a property which is not deprecated local function firstValue(QID, PID, field)	local ss = wikibase.getAllStatements(QID, PID)	for _, s in pairs(ss) do		if s.rank ~= 'deprecated' and s.mainsnak.snaktype == 'value' then			return field and s.mainsnak.datavalue.value[field] or s.mainsnak.datavalue.value		end	end end

-- Go from season of a team to the team local function getParentID(teamID) return firstValue(teamID, 'P361', 'id') -- P361 is 'part of' or firstValue(teamID, 'P5138', 'id') -- P5138 is 'season of club or team' end

-- Get a label in any of the languages in the fallback list of language codes local function getLabelFallback(itemID, fallback) local label for _, lang in ipairs(fallback) do		label = mw.wikibase.getLabelByLang(itemID, lang) if label then break end end return label end

-- Get a sitelink from the local wiki or from the fallback list of language codes local function getSitelinkFallback(itemID, fallback) local link = mw.wikibase.getSitelink(itemID) if link then return link end for _, lang in ipairs(fallback) do link = mw.wikibase.getSitelink(itemID, lang .. 'wiki') if link then return link end end return nil end

function fooA (mode,entity,property,var) --Obsolete local snak if mode=="value" then snak=entity.claims[property][var].mainsnak.datavalue.value else snak=entity.claims[property][var].mainsnak.datavalue.value[mode] end return snak, entity.claims[property][var].rank end

function fooB (mode, entity_var, property, var1, var2, ref, var3) --Obsolete local snak if mode == 'value' then snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value else snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value[mode] end return snak end

function fooC (mode, entity_var, property, var1, quali, var2) --Obsolete local snak if mode == 'value' then snak = entity_var.claims[property][var1].references[var2].snaks[ref][var3].datavalue.value else snak = entity_var.claims[property][var1].qualifiers[quali][var2].datavalue.value[mode] end return snak end

function foo1 (arg) --Obsolete local entity = mw.wikibase.getEntity( arg ) end

function foo2 (entity_var, property, var) --Obsolete local snak = entity_var.claims[property][var].mainsnak.datavalue.value.amount end

function foo3 (entity_var, property, var1, quali, var2) --Obsolete local snak = entity_var.claims[property][var1].qualifiers[quali][var2].datavalue.value.amount end

-- Iterator to get all statements for an entity and property which are not deprecated and have a value local function nextStatement(state, i)	local s	repeat i = i + 1 local s = state[i] if s and s.rank ~= 'deprecated' and s.mainsnak.snaktype == 'value' then return i, s		end until s == nil end local function statements(QID, PID) return nextStatement, wikibase.getAllStatements(QID, PID), 0 end

-- Iterator to get all qualifier values for a property for a statement local function nextQualifier(state, i)	local q	repeat i = i + 1 local q = state[i] if q and q.snaktype == 'value' then return i, q.datavalue end until q == nil end local function qualifiers(statement, PID) return nextQualifier, statement.qualifiers and statement.qualifiers[PID] or {}, 0 end

--== III) Functions less basic called from other functions == --=== A) Time functions (new) === -- Get a Wikidata statement for an entity and property valid at the given timevalue local function getStatementForTime(ID, property, time) for _, s in statements(ID, property) do		local start, startPrecision, END, endPrecision local q = s.qualifiers if q then if q.P580 and q.P580[1] and	q.P580[1].snaktype == 'value' then -- P580 is start time start = q.P580[1].datavalue.value.time startPrecision = q.P580[1].datavalue.value.precision if startPrecision == 9 then -- precision is years start = string.sub(start, 1, 5) -- Cut of everything after year elseif startPrecision == 10 then -- precision is months start = string.sub(start, 1, 8) -- Cut of everything after month end end if q.P582 and q.P582[1] and q.P582[1].snaktype == 'value' then -- P582 is end time END = q.P582[1].datavalue.value.time endPrecision = q.P582[1].datavalue.value.precision end end if not start or start <= time then if not END then return s			end if endPrecision == 9 then -- precision 9 is 'years' END = string.sub(END, 1, 6) .. '13' -- Set month to 13 elseif endPrecision == 10 then -- precision 10 is 'months' END = string.sub(END, 1, 9) .. '32' -- Set day to 32 end if END > time then return s			end end end end

-- Get start time of race as a timevalue ('+2016-01-01T00:00:00Z') or nil local function getTimeOfRace (raceID) local timeOfRace local p580 = mw.wikibase.getBestStatements(raceID, "P580") -- P580 is start time if p580[1] and p580[1].mainsnak.snaktype == 'value' then timeOfRace = p580[1].mainsnak.datavalue.value.time else local p585 = mw.wikibase.getBestStatements(raceID, "P585") -- P585 is point in time if p585[1] and p585[1].mainsnak.snaktype == 'value' then timeOfRace = p585[1].mainsnak.datavalue.value.time else local link = getSitelinkFallback(raceID, {'en', 'fr', 'de'}) if link then local year = string.match(link, '%d%d%d%d') if year then timeOfRace = year .. '-01-01T00:00:00Z' end end end end return timeOfRace, '> Wikidata is missing data about start time (P580) or point in time (P582)' end

local function getStartEndTime(sTime, eTime, mode) -- Note: Add the formats to "formats" and use func_date local wiki = wiki local lang = contentLanguage local starttime, endtime --local format = formats[wiki] or formats[''] if mode==nil then mode='long' end -- Timevalues is like "+2015-07-04T00:00:00Z" local _, _, y, m, d = string.find(sTime, "(%d+)-(%d+)-(%d+)") local _, _, y2, m2, d2 = string.find(eTime, "(%d+)-(%d+)-(%d+)") if y ~= y2 then if mode=='long' then starttime = lang:formatDate( "j F Y", sTime ) else starttime = lang:formatDate( "j M Y", sTime ) end elseif m ~= m2 then if mode=='long' then starttime = lang:formatDate( "j F", sTime ) else starttime = lang:formatDate( "j M", sTime ) end else starttime = lang:formatDate( "j", sTime ) end

if wiki == "ar" then if y ~= y2 then starttime = lang:formatDate( "d F Y", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "d F", sTime ) else starttime = lang:formatDate( "d F", sTime ) end elseif wiki == "br" then if y ~= y2 then starttime = lang:formatDate( "j", sTime ) .." a viz ".. lang:formatDate( "F Y", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "j", sTime ) .." a viz ".. lang:formatDate( "F", sTime ) else starttime = lang:formatDate( "j", sTime ) .." " end elseif wiki == "ca" or wiki == "es" or wiki == "ast" then if y ~= y2 then starttime = lang:formatDate( "j", sTime ) .." de ".. lang:formatDate( "F", sTime ) .." de ".. lang:formatDate( "Y", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "j", sTime ) .." de ".. lang:formatDate( "F", sTime ) else starttime = lang:formatDate( "j", sTime ) .." " end elseif wiki == "cs" then if y ~= y2 then starttime = lang:formatDate( "j. xg Y", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "j. xg", sTime ) else starttime = lang:formatDate( "j", sTime ) end elseif wiki == "de" or wiki == "da" or wiki == "fo" or wiki == "no" then if y ~= y2 then starttime = lang:formatDate( "j. F Y", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "j. F", sTime ) else starttime = lang:formatDate( "j.", sTime ) end elseif wiki == "fi" then if y ~= y2 then starttime = lang:formatDate( 'j. F"ta" Y', sTime ) elseif m ~= m2 then starttime = lang:formatDate( 'j. F"ta"', sTime ) else starttime = lang:formatDate( "j.", sTime ) end elseif wiki == "en" then if y ~= y2 then starttime = lang:formatDate( "F d, Y", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "F d", sTime ) else starttime = lang:formatDate( "F d", sTime ) end elseif wiki == "eo" then if y ~= y2 then starttime = lang:formatDate( "j", sTime ) .."-a de ".. lang:formatDate( "F Y", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "j", sTime ) .."-a de ".. lang:formatDate( "F", sTime ) else starttime = lang:formatDate( "j", sTime ) .."-a " end elseif wiki == "eu" then if y ~= y2 then starttime = lang:formatDate( "Y", sTime ) ..".eko ".. lang:formatDate( "F", sTime ) .."k ".. lang:formatDate( "j", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "F", sTime ) .."k ".. lang:formatDate( "j", sTime ) else starttime = lang:formatDate( "F", sTime ) .."k ".. lang:formatDate( "j", sTime ) end elseif wiki == "hu" then if y ~= y2 then starttime = lang:formatDate( "Y", sTime ) ..". ".. lang:formatDate( "F j", sTime ) .."." elseif m ~= m2 then starttime = lang:formatDate( "F j", sTime ) .."." else starttime = lang:formatDate( "F j", sTime ) .."." end elseif wiki == "ja" then if y ~= y2 then starttime = lang:formatDate( "Y年m月d日", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "Y年m月d日", sTime ) else starttime = lang:formatDate( "Y年m月d日", sTime ) end elseif wiki == "lv" then if y ~= y2 then starttime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", sTime ) else starttime = lang:formatDate( "Y. \\g\\a\\d\\a j.", sTime ) end elseif wiki == "pl" then local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"} if y ~= y2 then starttime = lang:formatDate( "j ", sTime ) .. date_pl[tonumber(lang:formatDate( "n", sTime ))] .. lang:formatDate( " Y", sTime ) elseif m ~= m2 then starttime = lang:formatDate( "j ", sTime ) .. date_pl[tonumber(lang:formatDate( "n", sTime ))] else starttime = lang:formatDate( "j", sTime ) end end if mode=='long' or y ~= y2 then endtime = lang:formatDate("j F Y", eTime) else endtime = lang:formatDate("j M", eTime) end if wiki == "ar" then if y ~= y2 then endtime = lang:formatDate( "d F Y", eTime ) elseif m ~= m2 then endtime = lang:formatDate( "d F Y", eTime ) else endtime = lang:formatDate( "d، Y", eTime ) end elseif wiki == "br" then endtime = lang:formatDate( "j", eTime ) .." a viz ".. lang:formatDate( "F Y", eTime ) elseif wiki == "ca" or wiki == "es" or wiki == "ast" then endtime = lang:formatDate( "j", eTime ) .." de ".. lang:formatDate( "F", eTime ) .." de ".. lang:formatDate( "Y", eTime ) elseif wiki == "cs" then endtime = lang:formatDate( "j. xg Y", eTime ) elseif wiki == "de" or wiki == "da" or wiki == "fi" or wiki == "fo" or wiki == "no" then endtime = lang:formatDate( "j. F Y", eTime ) elseif wiki == "en" then if y ~= y2 then endtime = lang:formatDate( "F d, Y", eTime ) elseif m ~= m2 then endtime = lang:formatDate( "F d, Y", eTime ) else endtime = lang:formatDate( "d, Y", eTime ) --suspect way to write it		end elseif wiki == "eo" then endtime = lang:formatDate( "j", eTime ) .."-a de ".. lang:formatDate( "F Y", eTime ) elseif wiki == "eu" then endtime = lang:formatDate( "Y", eTime ) ..".eko ".. lang:formatDate( "F", eTime ) .."k ".. lang:formatDate( "j", eTime ) elseif wiki == "fi" then endtime = lang:formatDate('j F"ta" Y', eTime) elseif wiki == "hu" then endtime = lang:formatDate( "Y", eTime ) ..". ".. lang:formatDate( "F j", eTime ) .."." elseif wiki == "ja" then if y ~= y2 then endtime = lang:formatDate( "Y年m月d日", eTime ) elseif m ~= m2 then endtime = lang:formatDate( "m月d日", eTime ) else endtime = lang:formatDate( "d日", eTime ) end elseif wiki == "lv" then if y ~= y2 then endtime = lang:formatDate( "Y. \\g\\a\\d\\a j. F", eTime ) elseif m ~= m2 then endtime = lang:formatDate( "j. F", eTime ) else endtime = lang:formatDate( "j. F", eTime ) end elseif wiki == "pl" then local date_pl = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"} endtime = lang:formatDate( "j ", eTime ) .. date_pl[tonumber(lang:formatDate( "n", eTime ))] .. lang:formatDate( " Y", eTime ) end return starttime, endtime end

local formats = { [''] = { long = 'j F Y', small = 'j M', onlyday = 'j' }, ar = { long = 'j F Y', small = 'j F', onlyday = 'j' }, br = { long = 'j "a viz" F Y', small = 'j "a viz" M', onlyday = 'j' }, ca = { long = 'j "de" F "de" Y', small = 'j "de" M', onlyday = 'j' }, cs = { long = 'j. xg Y', small = 'j. M', onlyday = 'j' }, da = { long = 'j. F Y', small = 'j. M', onlyday = 'j.' }, -- copy of de de = { long = 'j. F Y', small = 'j. M', onlyday = 'j.' }, eo = { long = 'j"-a de" F Y', small = 'j"-a de" M', onlyday = 'j' }, en = { long = 'F d, Y', small = 'M d', onlyday = 'd' }, es = { long = 'j "de" F "de" Y', small = 'j "de" M', onlyday = 'j' }, -- copy of ca	eu = { long = 'Y".eko" F"k" j', small = 'M"k" j', onlyday = 'j' }, fi = { long = 'j. F"ta" Y', small = 'j. M', onlyday = 'j.' }, fo = { long = 'j. F Y', small = 'j. M', onlyday = 'j.' }, -- copy of de	he = { long = 'j xg Y', small = 'j F', onlyday = 'j' }, hu = { long = 'Y. F j.', small = 'M. j', onlyday = 'j' }, ja = { long = 'Y年m月d日', small = 'm月d日', onlyday = 'd日' }, lv = { long = 'Y. "gada" j. F', small = 'j. M', onlyday = 'j.' }, hu = { long = 'j xg Y', small = 'j M', onlyday = 'j' }, no = { long = 'j. F Y', small = 'j. M', onlyday = 'j.' }, -- copy of de } function func_date (date, mode) --	local date = '+2016-05-20' --	local mode = 'small' local contentLanguage = contentLanguage local format = formats[wiki] or formats[''] return contentLanguage:formatDate(format[mode], date) end

-- get the year for a race as a string, or an empty string local function getYear(raceID) local year = firstValue(raceID, 'P580', 'time') or -- P580 is 'start time' firstValue(raceID, 'P585', 'time') -- P585 is 'point in time' if year then return string.sub(year, 2, 5) end return '' end

--=== B) Time functions (obsolete) === -- Kaldt med timeStartEnd_entity(entity, 'P1448', 'text', startOfSeason) local function timeStartEnd_entity(entity, property, mode, timeofrace)	-- mode = 'numeric-id', property = 'P54', Qid = 'Q123'	--local entity = 	mw.wikibase.getEntity(Qid)	local a, b = pcall(fooA, mode, entity, property, 1)    -- holdets første officielle navn ifølge entity	local starttime, endtime = '+0000-01-01', '+9999-12-31'	local available_lang_priority = available_lang_priority

if a == true then local timeStartEnd = {} local num = 1 local v		for _, v in pairs(entity.claims[property]) do			if pcall(function local test = v.mainsnak.datavalue.value[mode] end) then -- test if not 'unnown value' if pcall(function starttime = v.qualifiers["P580"][1].datavalue.value.time end) then starttime = v.qualifiers["P580"][1].datavalue.value.time -- starttid fot officiel navn local _,_,year,m,d = string.find(starttime,"(%d+)-(%d+)-(%d+)") if m == '00' and d == '00' then starttime = '+'..year..'-01-01T00:00:00Z' end end if pcall(function endtime = v.qualifiers["P582"][1].datavalue.value.time end) then endtime = v.qualifiers["P582"][1].datavalue.value.time -- sluttid for officielt navn local _,_,year,m,d = string.find(endtime,"(%d+)-(%d+)-(%d+)") if m == '00' and d == '00' then endtime = '+'..year..'-12-31T23:59:59Z' end if m == '01' and d == '01' then endtime = '+'..year..'-12-31T23:59:59Z' end end if v.qualifiers then if (not v.qualifiers["P580"] or starttime <= timeofrace) and (not v.qualifiers["P582"] or endtime >= timeofrace) then if available_lang_priority == true and property == "P1448" then local test = false pcall(function if type( v.qualifiers["P1448"])=='table' then test=true end end) if test == false then timeStartEnd[num] = v.mainsnak.datavalue.value[mode] else local lang_module, lang_WD local language= '' local zaehler for i,j in ipairs(translations.lang_priority) do										lang_module = j										for number in pairs(v.qualifiers["P1448"]) do											lang_WD = v.qualifiers["P1448"][number].datavalue.value.language if lang_WD == lang_module then zaehler = number break end end -- for number in pairs if lang_WD == lang_module then language = lang_WD  break end end -- for i,j if language~='' then -- a WD translation matching translations.lang_priority exist local t = v.qualifiers["P1448"][zaehler].datavalue.value.text timeStartEnd[num] = t		 							else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]-- no matching between lang module and "official name" qualifier end -- if language~='' end -- test if official name qualifier exist else timeStartEnd[num] = v.mainsnak.datavalue.value[mode] end -- if property == "P1448" num = num + 1 end else timeStartEnd[num] = v.mainsnak.datavalue.value[mode] num = num + 1 end end end return a, timeStartEnd[1] else return false, '' end end

function timeStartEnd_entity(entity, property, mode, timeofrace) -- mode = 'numeric-id', property = 'P54', Qid = 'Q123' --local entity = 	mw.wikibase.getEntity(Qid) local a, b = pcall(fooA, mode, entity, property, 1) local starttime, endtime = '+0000-01-01', '+9999-12-31' local available_lang_priority = available_lang_priority

if a == true then local timeStartEnd = {} local num = 1 local v		for _, v in pairs(entity.claims[property]) do			if pcall(function local test = v.mainsnak.datavalue.value[mode] end) then -- test if not 'unnown value' if pcall(function starttime = v.qualifiers["P580"][1].datavalue.value.time end) then starttime = v.qualifiers["P580"][1].datavalue.value.time local _,_,year,m,d = string.find(starttime,"(%d+)-(%d+)-(%d+)") if m == '00' and d == '00' then starttime = '+'..year..'-01-01T00:00:00Z' end end if pcall(function endtime = v.qualifiers["P582"][1].datavalue.value.time end) then endtime = v.qualifiers["P582"][1].datavalue.value.time local _,_,year,m,d = string.find(endtime,"(%d+)-(%d+)-(%d+)") if m == '00' and d == '00' then endtime = '+'..year..'-12-31T23:59:59Z' end if m == '01' and d == '01' then endtime = '+'..year..'-12-31T23:59:59Z' end end if v.qualifiers then if (not v.qualifiers["P580"] or starttime <= timeofrace) and (not v.qualifiers["P582"] or endtime >= timeofrace) then if available_lang_priority == true and property == "P1448" then local test = false pcall(function if type( v.qualifiers["P1448"])=='table' then test=true end end) if test == false then timeStartEnd[num] = v.mainsnak.datavalue.value[mode] else local lang_module, lang_WD local language= '' local zaehler for i,j in ipairs(translations.lang_priority) do										lang_module = j										for number in pairs(v.qualifiers["P1448"]) do											lang_WD = v.qualifiers["P1448"][number].datavalue.value.language if lang_WD == lang_module then zaehler = number break end end -- for number in pairs if lang_WD == lang_module then language = lang_WD  break end end -- for i,j if language~='' then -- a WD translation matching translations.lang_priority exist local t = v.qualifiers["P1448"][zaehler].datavalue.value.text timeStartEnd[num] = t		 							else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]-- no matching between lang module and "official name" qualifier end -- if language~='' end -- test if official name qualifier exist else timeStartEnd[num] = v.mainsnak.datavalue.value[mode] end -- if property == "P1448" num = num + 1 end else timeStartEnd[num] = v.mainsnak.datavalue.value[mode] num = num + 1 end end end return a, timeStartEnd[1] else return false, '' end end

function timeStartEnd(Qid, property, mode, timeofrace) -- mode = 'numeric-id', property = 'P54', Qid = 'Q123' local entity = 	mw.wikibase.getEntity(Qid) local a, b = pcall(fooA, mode, entity, property, 1) local starttime, endtime local available_lang_priority = available_lang_priority

if a == true then local timeStartEnd = {} local num = 1 local v		for _, v in pairs(entity.claims[property]) do			if pcall(function local test = v.mainsnak.datavalue.value[mode] end) then -- test if not 'unnown value' if pcall(function starttime = v.qualifiers["P580"][1].datavalue.value.time end) then starttime = v.qualifiers["P580"][1].datavalue.value.time local _,_,year,m,d = string.find(starttime,"(%d+)-(%d+)-(%d+)") if m == '00' and d == '00' then starttime = '+'..year..'-01-01T00:00:00Z' end end if pcall(function endtime = v.qualifiers["P582"][1].datavalue.value.time end) then endtime = v.qualifiers["P582"][1].datavalue.value.time local _,_,year,m,d = string.find(endtime,"(%d+)-(%d+)-(%d+)") if m == '00' and d == '00' then endtime = '+'..year..'-12-31T00:00:00Z' end if m == '01' and d == '01' then endtime = '+'..year..'-12-31T00:00:00Z' end end if v.qualifiers then if (not v.qualifiers["P580"] or starttime <= timeofrace) and (not v.qualifiers["P582"] or endtime >= timeofrace) then if available_lang_priority == true and property == "P1448" then local test = false pcall(function if type( v.qualifiers["P1448"])=='table' then test=true end end) if test == false then timeStartEnd[num] = v.mainsnak.datavalue.value[mode] else local lang_module, lang_WD local language= '' local zaehler for i,j in ipairs(translations.lang_priority) do										lang_module = j										for number in pairs(v.qualifiers["P1448"]) do											lang_WD = v.qualifiers["P1448"][number].datavalue.value.language if lang_WD == lang_module then zaehler = number break end end -- for number in pairs if lang_WD == lang_module then language = lang_WD  break end end -- for i,j if language~='' then -- a WD translation matching translations.lang_priority exist local t = v.qualifiers["P1448"][zaehler].datavalue.value.text timeStartEnd[num] = t		 							else timeStartEnd[num] = v.mainsnak.datavalue.value[mode]-- no matching between lang module and "official name" qualifier end -- if language~='' end -- test if official name qualifier exist else timeStartEnd[num] = v.mainsnak.datavalue.value[mode] end -- if property == "P1448" num = num + 1 end else timeStartEnd[num] = v.mainsnak.datavalue.value[mode] num = num + 1 end end end return a, timeStartEnd[1] else return false, '' end end

--=== C) Link functions (new) === local function getOfficialName(teamID, timeOfRace)	local p1448 = getStatementForTime(teamID, 'P1448', timeOfRace) -- P1448 is official name	if p1448 then		if available_lang_priority and p1448.qualifiers and p1448.qualifiers.P1448 then			local q = p1448.qualifiers.P1448			local wantedLanguages = {}			local best = 999			local name			for i, lang in ipairs(translations.lang_priority) do				wantedLanguages[lang] = i			end			for _, l in pairs(q) do				if l.snaktype == 'value' then					local lang = l.datavalue.value.language					if wantedLanguages[lang] and wantedLanguages[lang] < best then						best = wantedLanguages[lang]						name = l.datavalue.value.text					end				end			end			if name	then return name, true end		end		return p1448.mainsnak.datavalue.value.text, false	end	return wikibase.getLabel(teamID) -- No official name, try label end

local function getRiderLink(riderID) local sitelink = wikibase.getSitelink(riderID) if sitelink then if wiki == "de" then -- Russian riders get label as alias, to shorten the name local label = wikibase.getLabelByLang(riderID, wiki) if label then local p27 = wikibase.getBestStatements(riderID, 'P27') -- P27 is country of citizenship if p27[1] and p27[1].mainsnak.snaktype == 'value' then local c = p27[1].mainsnak.datavalue.value['numeric-id'] if c==159 or c==184 or c==212 or c==232 then -- Q159, Q184, Q212, Q232 is Russia, Belarus, Ukraine, Kazakhstan return "" .. label .. "" end end end end return "" .. mw.text.trim(mw.ustring.gsub(sitelink, "%b", "")) .. "" end

-- No WP article. Display label, and make it a red link if no other article uses the title local link local label = wikibase.getLabelByLang(riderID, wiki) if label then if wiki == 'ar' then local title = mw.title.new(label) if title and title.exists then link = label else link = mw.getCurrentFrame:expandTemplate{ title = 'Ill-WD2', args = {id=riderID,target='en',label=Label} } --"" .. Label.. "" end else if black_list(wiki, label) then link = label else local title = mw.title.new(label) if title and title.exists then link = label else link = "" .. label.. "" end end end return link end

-- No label in the local language. Try other languages, but don't link. if wiki == 'ar' then link = getLabelFallback(riderID, {'en', 'fr', 'de'}) else link = getLabelFallback(riderID, {'en', 'de'}) end if link then link = mw.ustring.gsub(link, "%b", "") else link = "(label missing)" end return link end

-- Get the name of a country local function getCountryName(countryID) local name = '' if available_list then name = translations.list(countryID) end if name == '' then local label, lang = wikibase.getLabelWithLang(countryID) -- Uses standard language fallback. Should not return nil, nil, as all countries have English labels. if lang == wikilang then name = label elseif lang then name = label .. ' (' .. lang .. ')' end end return name end

-- Get sitelink with no wiki no formating local function getRawTeamLink(teamID) local sitelink local parentID = getParentID(teamID) if parentID then -- try parent team first sitelink = mw.wikibase.getSitelink(parentID) end if not sitelink then sitelink = mw.wikibase.getSitelink(teamID) end return sitelink end

-- Get sitelink, categoryID and maybe country for a team.	Returns sitelink, team category ID, countryID (only countryID if country arg is true local function getTeamLinkCat(teamID, timeOfRace, country)	local name, sitelink, parentID	-- Find team category	local catID = firstValue(teamID, 'P31', 'id') -- P31 is 'instance of'	-- Find country if needed	local countryID	if country or catID == 'Q23726798' or catID == 'Q20738667' then		countryID = firstValue(teamID, 'P17', 'id') -- P17 is country	end	if countryID and (catID == 'Q23726798' or catID == 'Q20738667') then		-- It is a national cycling team		name = getCountryName(countryID)		if catID == 'Q20738667' then -- national cycling team U23			local s			if wiki == 'fr' then s = ' espoirs'			elseif wiki == 'mk' then s = ' под 23 години'			elseif wiki == 'ar' then s = ' تحت 23'			elseif wiki == 'es' then s = ' sub-23'			else s = ' U23'			end name = name .. s		end sitelink = getRawTeamLink(teamID) else -- It is not a national cycling team local isLocal parentID = getParentID(teamID) if parentID then -- try parent team first sitelink = wikibase.getSitelink(parentID) name, isLocal = getOfficialName(parentID, timeOfRace) end if not sitelink then sitelink = wikibase.getSitelink(teamID) end

if not name or (not isLocal and available_lang_priority) then local partName, partIsLocal = getOfficialName(teamID, timeOfRace) if partName and (not name or partIsLocal) then name = partName end end end if sitelink then if name then sitelink =  .. name ..  else sitelink =  .. sitelink ..  end else if name then sitelink = name else sitelink = (ParentID and wikibase.getLabel(ParentID)) or				wikibase.getLabel(TeamID) or 'No name' end end return sitelink, catID, countryID end

local function getReference(statement) local function formatRefDate(date, precision) if precision == 9 then -- Precision is year return string.sub(date, 2, 5) elseif precision == 10 then -- Precision is month return contentLanguage:formatDate("F Y", string.sub(date, 2, 8)) elseif precision >= 11 then -- Precision is day (or less) return func_date (date, 'long') end end

local ref = statement.references if not ref or not ref[1] then return nil end local text ref = ref[1].snaks if ref.P854 and ref.P854[1] and ref.P854[1].snaktype == 'value' then -- P854 is 'reference URL' local refURL = ref.P854[1].datavalue.value local refTitle = '' local refDate = '' local refRetrieved = '' local refLang = '' if ref.P1476 and ref.P1476[1] and ref.P1476[1].snaktype == 'value' then -- P1476 is 'title URL' refTitle = ref.P1476[1].datavalue.value.text local lang = ref.P1476[1].datavalue.value.language if lang ~= wikilang then refLang = '(' .. lang .. ')' end end if ref.P577 and ref.P577[1] and ref.P577[1].snaktype == 'value' then -- P577 is 'publication date' local value = ref.P577[1].datavalue.value refDate = formatRefDate(value.time, value.precision) if (wiki == 'ar') then refDate = '، ' .. refDate else refDate = ', ' .. refDate end end if ref.P813 and ref.P813[1] and ref.P813[1].snaktype == 'value' then -- P813 is 'retrieved' local value = ref.P813[1].datavalue.value refRetrieved = formatRefDate(value.time, value.precision) if wiki == "de" then refRetrieved = ", (abgerufen am " .. refRetrieved .. ')' elseif wiki == "ar" then refRetrieved = " تاريخ الوصول " .. refRetrieved .. '.'			elseif wiki == "fr" then refRetrieved = " (consulté le " .. refRetrieved .. ')' else refRetrieved = " Retrieved " .. refRetrieved .. '.'			end end local domain = mw.ustring.match(refURL, '//([^/]+)') if string.sub(domain, 1, 4) == 'www.' then domain = string.sub(domain, 5) end local refText if wiki == "fr" then -- fr: "(en) « Lloyd Mondory ... EPO », sur velonews.competitor.com (consulté le 30 april 2016), 30 octobre 2015." local sur = ', sur ' .. domain .. ' '			refText = refLang .. ' « ['.. refURL .. ' '.. refTitle .. '] »' .. sur .. refRetrieved .. refDate .. '.'		elseif wiki == "de" then local In = ' In: ' .. domain .. ' '			refText = ' ['.. refURL.. ' '.. refTitle.. '.] ' ..				In .. refDate .. refRetrieved ..'.' else local at = ', ' .. domain .. ' '			refText = refLang .. ' [' .. refURL .. ' ' .. refTitle .. ']' .. at .. refDate .. '.' .. refRetrieved end return localframe:extensionTag('ref', refText, {name=refText}) end end

function black_list(wiki, Label) -- List of Wikipedia articles with the same lemma as the non existing rider article. Those lemmas are printed		as text "black" in the tables, not "blue" or "red". This way there will be no false wikilinks at the WhatLinksHere entry.		List should be updated maybe once a year. local black_list = {} if wiki=='de' then black_list={ ["Ryan Anderson"]=true, ["Chris Butler"]=true, ["Josef Černý"]=true, ["Brad Evans"]=true, ["Robert Fontaine"]=true, ["Carlos Giménez"]=true, ["George Harper"]=true, ["Mathias Jørgensen"]=true, ["Luis Lemus"]=true, ["David Lozano"]=true, ["Jan Maas"]=true, ["James McLaughlin"]=true, ["Nikolaj Michajlow"]=true, ["Antonio Molina"]=true, ["Ben O'Connor"]=true, ["Andrea Peron"]=true, ["Cristian Rodríguez"]=true, ["Nick Schultz"]=true, ["Adam Stachowiak"]=true, ["Michel Vermote"]=true, ["Johannes Weber"]=true, ["Martin Weiss"]=true, ["Christopher Williams"]=true, ["Samuel Williams"]=true, ["Peter Williams"]=true, ['Stephen Williams']=true, ["Michael Woods"]=true, ["Michael Wright"] = true, ["Edoardo Zardini"]=true, ["Georg Zimmermann"]=true } end if wiki=='en' then black_list={ ["Tiago da Silva"]=true, ["Jan Maas"]=true, ["Alexander Meier"]=true, ["James McLaughlin"]=true, ["Andrea Nencini"]=true, ["Johannes Weber"]=true } end if wiki=='fr' then black_list={['Pierre Barbier']=true, ['Jessica Cutler']=true, ['Fernanda da Silva']=true, ['Guillaume Delvaux']=true, ['Willy De Waele']=true, ['Jules Dubois']=true, ['Jean Dupont']=true, ['Robert Fontaine']=true, ['René Fournier']=true, ['Pierre Gauthier']=true, ['Marc Goossens']=true, ['Claude Guyot']=true, ['Amy Hill']=true, ['Liang Hongyu']=true, ['Marcus Johansson']=true, ['Mathias Jørgensen']=true, ['José Mendoza']=true, ['Daniel Müller']=true, ['Henri Parmentier']=true, ['Jean Raynal']=true, ['Pascal Robert']=true, ['Jean-Yves Roy']=true, ['Michael Shermer']=true, ['Juris Silovs']=true, ['Jacques Simon']=true, ['Guy Thomas']=true, ['Ryan Thomas']=true, ['Hans Vonk']=true, ['Jan Wijnants']=true } end return black_list[Label] end

local function getImage(QID) local wikilang = wikilang local p18 = wikibase.getBestStatements(QID, 'P18') -- P18 is 'image' local first for _, image in pairs(p18) do		if image.mainsnak.snaktype == 'value' then if not first then first = image.mainsnak.datavalue.value end local q = image.qualifiers if q then for _, caption in pairs(q.P2096) do -- P2096 is 'caption' if caption.snaktype == 'value' and caption.datavalue.value.language == wikilang then return image.mainsnak.datavalue.value, caption.datavalue.value.text end end end end end return first end

-- Get link for race or competition local function raceLink(QID) local sitelink = wikibase.getSitelink(QID) local instanceOf = firstValue(QID, 'P31', 'id') -- P31 is 'instance of' if instanceOf == 'Q1137352' then -- Q1137352 is 'French Road Cycling Cup' local label2 = wikibase.getLabel(instanceOf) if sitelink then if label2 then return  .. label2 ..  end return  .. sitelink ..  end local sitelink2 = wikibase.getSitelink(instanceOf) if sitelink2 then return  .. mw.ustring.gsub(sitelink2, " %b", "") ..  end if label2 then return label2 end end if sitelink then return "".. sitelink.. "" end return wikibase.getLabel(QID) or '' end

local function getPlaceLink(placeID) local link local sitelink = wikibase.getSitelink(placeID) if sitelink then if wiki == 'en' then -- For English, delete string ", ..." from e.g. "Unley, South Australia" return  .. string.gsub(sitelink, ',.*', ) .. '' end -- For others, delete " (...)" form e.g. "Unley (South Australia)" return  .. mw.ustring.gsub(sitelink, ' %b', ) .. '' end local label = wikibase.getLabel(placeID) or '' if wiki == 'ar' then local title = mw.title.new(label) if title and title.exists then return label end return mw.getCurrentFrame:expandTemplate{title = 'Ill-WD2', args = {id = placeID, target='en', label=label}} --  .. label..  end return contentLanguage:ucfirst(label) end

local function classLink(class) local link = wikibase.getSitelink('Q22348500') -- Q22348500 is 'cycling race class' local label = getLabelFallback(class, {wikilang, 'en', 'fr', 'de'}) if not label then return '' end if link then return  .. label ..  end return label end

-- Get local content to a infoboxe from template args local function getLocalContent(contents, args)

for _, content in pairs(contents) do		local name = content.name local nameNoShy = mw.ustring.gsub(name, '&#173;', '') -- filter soft hyphen out local name_plural = content.name_plural local name_pluralNoShy = name_plural and mw.ustring.gsub(name_plural, '&#173;', '') -- filter soft hyphen out if args[nameNoShy] and args[nameNoShy] ~= '' then if content.special then local _, _, newname, value = mw.ustring.find(args[nameNoShy], '([^:]+):(.*)') if value and mw.text.trim(value) ~= '' then content.name = mw.text.trim(newname) content.content = mw.text.trim(value) end else content.content = mw.text.trim(args[nameNoShy]) end elseif args[name_pluralNoShy] and args[name_pluralNoShy] ~= '' then content.name = content.name_plural content.content = mw.text.trim(args[name_pluralNoShy]) end end end

local function getTeam(riderID, timeOfRace, q)	-- q: qualifiers of statement in race entity where the rider is the value local teamID, link if q.P54 and q.P54[1].snaktype == 'value' then -- P54 is member of sports team teamID = q.P54[1].datavalue.value.id		link = getTeamLinkCat(teamID, timeOfRace) else p54 = getStatementForTime(riderID, 'P54', timeOfRace) if p54 then teamID = p54.mainsnak.datavalue.value.id			link = getTeamLinkCat(teamID, timeOfRace) end end return link end

-- Make a table row for infoboxes with links to previous and next local function getPreviousNextLine(raceID) local previousID = firstValue(raceID, 'P155', 'id') -- P155 is 'follows' local nextID = firstValue(raceID, 'P156', 'id') -- P156 is 'followed by' if not previousID and not nextID then return '' end local previousText, nextText = ,  if previousID then local year = getYear(previousID) local link = wikibase.getSitelink(previousID) if link then previousText = ' &#x25C0; ' .. year .. ' ' else previousText = ' &#x25C0; ' .. year end end if nextID then local year = getYear(nextID) local link = wikibase.getSitelink(nextID) if link then nextText = ' ' .. year .. ' &#x25B6; ' else nextText = year .. ' &#x25B6; ' end end local direction = contentLanguage:getDir return " " .. previousText .. " " .. nextText .. " " end

--=== D) Link functions (obsolete) === function wdLink (id)	return "" end

function WPlink(Qnumber, ...) local link='' local entity = mw.wikibase.getEntity( Qnumber ) local Sitelink = entity:getSitelink -- link to WParticle local Sitelink2 = Sitelink local Label = entity:getLabel or '' local a, b	local official_name = ""

if arg[1] == nil then if pcall(foo1, Qnumber) then if Sitelink ~= nil then if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia" if Sitelink~=nil then local i, _ = mw.ustring.find(Sitelink, ",") if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink, 1, i-1) end end end link = "" .. mw.text.trim(mw.ustring.gsub(Sitelink2, "%b", "")..' ') .. "" if wiki == "de" then -- ru riders get label as alias, to shorten the name local a, b = pcall(fooA, 'numeric-id', entity, 'P27', 1) if a == true and (b==159 or b==184 or b==212 or b==232) then link = "" .. Label .. "" end end elseif Label ~= '' then if wiki == 'ar' then local title = mw.title.new(Label) if title and title.exists then link = Label else link = mw.getCurrentFrame:expandTemplate{ title = 'Ill-WD2', args = {id=Qnumber,target='en',label=Label} }--"" .. Label.. "" end elseif wiki == 'he' then local Label_he = mw.wikibase.getLabelByLang( Qnumber, 'he' ) if Label_he then link =  .. Label ..  else link = Label end else if black_list(wiki, Label) == true then link = Label -- function black_list: articles that are printed as text, not wikilinks else -- detect if there is a different local article with the same name local title = mw.title.new(Label) if title and title.exists then link = Label else link = "" .. Label.. "" end end end else link = Label end else return "unknown ID in function WPlink" end if link == '' then link = entity:getLabel('fr') or entity:getLabel('en') or entity:getLabel('de') or '' if wiki == "ar" then link = entity:getLabel or entity:getLabel('en') or entity:getLabel('fr') or entity:getLabel('de') or '' end if link ~= '' then link = mw.ustring.gsub(link, "%b", "") else link = "(label missing)" end end end -- if arg[1] == nil

if arg[1] == 'team' then -- add '(team of the winner)' a, b = timeStartEnd(Qnumber, 'P1448', 'text', arg[2]) --officialName(entity) local a1, b1 = pcall(fooA, 'numeric-id', entity, 'P361', 1) if a1== true then local a2, b2 = timeStartEnd('Q'..b1, 'P1448', 'text', arg[2]) if a2== true then a = a2 b = b2	end entity = mw.wikibase.getEntity( 'Q'..b1 ) Sitelink2 = entity:getSitelink -- link to WParticle end if a == true then official_name = b end

if available_lang_priority == false then a, b = pcall(fooA, 'text', entity, 'P1448', 2) -- test if more then two official names if a == true then a, b = timeStartEnd(Qnumber, 'P1448', 'text', arg[2]) --officialName(entity) if a == true then official_name = b end else a, b = pcall(fooA, 'text', entity, 'P1448', 1) if a == true then official_name = b end end end

if Sitelink ~= nil then if official_name == nil then link = "".. mw.text.trim(mw.ustring.gsub(Sitelink,"%b","").. ' ') .. "" else if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia" local i, _ = mw.ustring.find(Sitelink, ",") if i ~= nil then Sitelink = mw.ustring.sub(Sitelink, 1, i-1) end end link = link .. '".. official_name.. '' end end if link == '' and Sitelink2 ~= nil then -- code goes from season item to team item if official_name == nil or official_name == '' then link = "".. mw.text.trim(mw.ustring.gsub(Sitelink2,"%b","").. ' ') .. "" else if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia" local i, _ = mw.ustring.find(Sitelink2, ",") if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink2, 1, i-1) end end link = link .. '".. official_name.. '' end end

if Sitelink == nil and Sitelink2 == nil then if official_name ~='' then link = official_name else link = entity:getLabel end if link == nil then link = "(label missing)" end end

-- mw.log('Sitelink=', Sitelink, 'Sitelink2=', Sitelink2, 'official_name=', official_name) end -- end arg[1] if arg[1] == 'pure' then if pcall(foo1, Qnumber) then if wiki == "en" then --delete string ", ..." from e.g. "Unley, South Australia" if Sitelink~=nil then local i, _ = mw.ustring.find(Sitelink, ",") if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink, 1, i-1) end end end if Sitelink ~= nil then link = "" .. mw.text.trim(mw.ustring.gsub(Sitelink2, "%b", "")..' ') .. "" elseif wiki == 'ar' then local title = mw.title.new(Label) if title and title.exists then link = Label else link = mw.getCurrentFrame:expandTemplate{ title = 'Ill-WD2', args = {id=Qnumber,target='en',label=Label} }--"" .. Label.. "" end else link = mw.ustring.gsub(Label, "^(%a)", function (x) return mw.ustring.upper(x) end) end end end if arg[1] == 'race' then -- for infobox "Competitions" local a, b = pcall(fooA, 'numeric-id', entity, 'P31', 1) if a == true and b == 1137352 then local entity_race = mw.wikibase.getEntity( 'Q' .. b ) local Label_race = entity_race:getLabel or '' local Sitelink_race = entity_race:getSitelink or '' if Label_race ~=  and Sitelink ~= nil then link =  .. Label_race .. '' elseif Sitelink ~= nil then link =  .. Sitelink ..  else if Sitelink_race ~=  then link =  .. mw.text.trim(mw.ustring.gsub(Sitelink_race, "%b", "") .. ' ') .. '' else link = Label_race or Label end end if onwikidata == true then link = ..entity_race:getLabel('fr').. end

else if Sitelink ~= nil then link = "".. Sitelink.. "" else link = Label end end end if arg[1] == "Q22348500" then -- add weblink from item "Q22348500" if available local Sitelink_claas = mw.wikibase.getEntity( 'Q22348500' ):getSitelink if pcall(foo1, Qnumber) then --Sitelink_claas if Sitelink == nil then if Sitelink_claas ~= nil then link = "" .. Label .. "" elseif entity:getLabel( 'ar' )~=nil then link = entity:getLabel( 'ar' ) elseif entity:getLabel( 'fr' )~=nil then link = entity:getLabel( 'fr' ) elseif entity:getLabel( 'en' )~=nil then link = entity:getLabel( 'en' ) elseif entity:getLabel( 'de' )~=nil then link = entity:getLabel( 'de' ) else link = Label end end end end return link end

function WPlink_entity(entity, ...) local link='' local Sitelink = entity:getSitelink -- link to WParticle local Sitelink2 = Sitelink local Label = entity:getLabel or '' local a, b	local official_name = ""

if arg[1] == 'team' then -- add '(team of the winner)' a, b = timeStartEnd_entity(entity, 'P1448', 'text', arg[2]) --officialName(entity) local a1, b1 = pcall(fooA, 'numeric-id', entity, 'P361', 1) if a1== true then entity = mw.wikibase.getEntity( 'Q'..b1 ) local a2, b2 = timeStartEnd_entity(entity, 'P1448', 'text', arg[2]) if a2== true then a = a2 b = b2	end

Sitelink2 = entity:getSitelink -- link to WParticle end if a == true then official_name = b end

if available_lang_priority == false then a, b = pcall(fooA, 'text', entity, 'P1448', 2) -- test if more then two official names if a == true then a, b = timeStartEnd_entity(entity, 'P1448', 'text', arg[2]) --officialName(entity) if a == true then official_name = b end else a, b = pcall(fooA, 'text', entity, 'P1448', 1) if a == true then official_name = b end end end

if Sitelink ~= nil then if official_name == nil then link = "".. mw.text.trim(mw.ustring.gsub(Sitelink,"%b","").. ' ').. "" else if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia" local i, _ = mw.ustring.find(Sitelink, ",") if i ~= nil then Sitelink = mw.ustring.sub(Sitelink, 1, i-1) end end link = link .. '".. official_name.. '' end end if link == '' and Sitelink2 ~= nil then -- code goes from season item to team item if official_name == nil then link = "".. mw.text.trim(mw.ustring.gsub(Sitelink2,"%b","").. ' ').. "" else if wiki=="en" then --delete string ", ..." from e.g. "Unley, South Australia" local i, _ = mw.ustring.find(Sitelink2, ",") if i ~= nil then Sitelink2 = mw.ustring.sub(Sitelink2, 1, i-1) end end link = link .. '".. official_name.. '' end end

if Sitelink == nil and Sitelink2 == nil then if official_name ~='' then link = official_name else link = entity:getLabel end if link == nil then link = "(label missing)" end end

end -- end arg[1] return link end

function transform(q_number, command, timeofrace) -- transforms Q/q-number into flag / WPlink / WDlink local wd = " " else --look into P17 (country) to get the Qnumber of that country a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( q_number ), 'P17', 1) if a == true then return flag("Q"..b, timeofrace).." "..WPlink( q_number )..wd..q_number.."]]" else return WPlink( q_number )..wd..q_number.."]]" end end end if command == "f" then -- no WDitem icon --look into P27 (country of citizenship) to get the Qnumber of that country a, b = timeStartEnd(q_number, "P27", 'numeric-id', timeofrace) if a == true then return flag('Q'..b, timeofrace).." "..WPlink( q_number ) else --look into P17 (country) to get the Qnumber of that country a, b = pcall(fooA, 'numeric-id', mw.wikibase.getEntity( q_number ), 'P17', 1) if a == true then return flag("Q"..b, timeofrace).." "..WPlink( q_number, 'team', timeofrace ) else return WPlink( q_number, 'team', timeofrace ) end end end if command == "c" then return WPlink( q_number, "Q22348500" ) end -- find "class"-items if command == "t" then return WPlink( q_number, 'team', timeofrace ) end if command =="2t" then return q_number end return q_number end

function national_team(riderID, startOfSeason, entity, property, k)	-- property: statement where the rider is the value -- k: loop local national_team, team, nationality, teamID -- national team for U23 or older riders if pcall(function		local i,j, s		for _, v in pairs(entity.claims[property][k].qualifiers['P54']) do -- for property 'member of sports team'			teamID = 'Q'.. v.datavalue.value['numeric-id'] break		end

national_team = mw.wikibase.getEntity( teamID ) -- calculate s for national team item a, b = pcall(fooA, 'numeric-id', national_team, 'P31', 1) -- test if country if a == true and b == 20738667 then -- Q20738667 = national cycling team U23 if wiki == 'fr' then s = ' espoirs' elseif wiki == 'mk' then s = ' под 23 години' elseif wiki == 'ar' then s = ' تحت 23' elseif wiki == 'es' then s = ' sub-23' elseif wiki == 'ast' then s = ' sub-23' else s = ' U23' end elseif a == true and (b == 1194951 or b == 23726798) then s = '' end -- Q1194951 = national sports team, Q23726798 = national cycling team

a, b = timeStartEnd(riderID, "P27", 'numeric-id', startOfSeason) if a == true then local nation = mw.wikibase.getEntityObject( 'Q'..b ) nationality = nation:getLabel or nation:getLabel('en') .. ' (en)' if national_team:getSitelink == nil then team = nationality.. s			else team = "".. nationality.. s.. '' end end

a, b = timeStartEnd(riderID, "P17", 'numeric-id', startOfSeason) if a == true then --team = 'abc'.. b --riderID local nation = mw.wikibase.getEntityObject( 'Q'..b ) nationality = nation:getLabel or nation:getLabel('en') .. ' (en)' if national_team:getSitelink == nil then team = nationality.. s			else team = "".. nationality.. s.. '' end end end) then	else		--standard team		pcall(function a, b = timeStartEnd(riderID, 'P54', 'numeric-id', startOfSeason) if a == true then national_team = mw.wikibase.getEntity( 'Q'..b ) --		g.team[rank] = national_team:getLabel or g.country[rank].. s			team = WPlink('Q'..b, 'team', startOfSeason) end -- guest team if teamID ~= nil then team = WPlink(teamID, 'team') end end)	end

return team end

function references(entity, property, var1) local ref1, ref2, ref2b, ref3, ref4 = "", " ", "", "", "" local url, ref local lang = mw.language.getContentLanguage local a, b

if onwikidata then lang = mw.getLanguage('fr') end

a, b = pcall(fooB, 'value', entity, property, var1, 1, 'P854', 1) -- url if a == true then ref1 = b end a, b = pcall(fooB, 'text', entity, property, var1, 1, 'P1476', 1) -- Originaltitel der webpage, "language": "fr" if a == true then ref2 = b		ref2b= entity.claims[property][var1].references[1].snaks['P1476'][1].datavalue.value.language or '' if ref2b == wiki then ref2b = '' else ref2b = '(' .. ref2b .. ') ' end end a, b = pcall(fooB, 'time', entity, property, var1, 1, 'P577', 1) -- publication date if a == true then local _, _, year, m, d = string.find(b,"(%d+)-(%d+)-(%d+)") if d ~= '00' and m ~= '00' then if wiki == "de" then ref3 = ', ' .. lang:formatDate( "j. F Y", b) elseif wiki == "ar" then ref3 = '، ' .. lang:formatDate( "j F Y", b) .. '.'			elseif wiki == "en" then ref3 = ', ' .. lang:formatDate( "Y F, j", b) .. '.'			elseif wiki == "fr" then ref3 = ', ' .. lang:formatDate( "j F Y", b) else ref3 = ', ' .. func_date (b, 'long') .. '.' --lang:formatDate( "j n Y", b) .. '.'			end elseif d == '00' and m ~= '00' then d = '01' if wiki == "de" then ref3 = ', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d ) elseif wiki == "ar" then ref3 ='، ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )..'.' elseif wiki == "en" then ref3 =', ' .. lang:formatDate( "Y F", year..'-'..m..'-'..d )..'.' elseif wiki == "fr" then ref3 =', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d ) else ref3 = ', ' .. lang:formatDate( "F Y", year..'-'..m..'-'..d )..'.' end else ref3 = year end end a, b = pcall(fooB, 'time', entity, property, var1, 1, 'P813', 1) -- Retrieved if a == true then if wiki == "de" then ref4 = ", (abgerufen am " .. lang:formatDate( "j. F Y", b).. ')' elseif wiki == "ar" then ref4 = " تاريخ الوصول " .. lang:formatDate( "j F Y", b) .. '.'		elseif wiki == "en" then ref4 = " Retrieved " .. lang:formatDate( "Y F, j", b) .. '.'		elseif wiki == "fr" then ref4 = " (consulté le " .. lang:formatDate( "j F Y", b) .. ')' else ref4 = " Retrieved " .. func_date (b, 'long').. '.' --lang:formatDate( "j n Y", b) .. '.'		end end

if ref1~= then --and ref2~= then local _, start = string.find( ref1, '//' ) local ende, _ = string.find( ref1, '/', start + 1 ) local s = string.sub(ref1, start + 1, ende - 1) local s2 = string.gsub(s, "www.", "") if wiki == "fr" then -- fr: "(en) « Lloyd Mondory ... EPO », sur velonews.competitor.com (consulté le 30 april 2016), 30 octobre 2015." if ref2~=' ' then url= ', sur ' .. s2 .. ' ' else url='' end ref = ref2b .. '« ['.. ref1.. ' '.. ref2.. '] »' .. url .. ref4 .. ref3 ..'.' elseif wiki == "en" then -- en: "Inflation ... recession", Pittsburgh Post-Gazette, October 16, 2009. Retrieved 2010-01-21. if ref2~=' ' then url= ', ' .. s2 .. ' ' else url='' end ref = '"['.. ref1.. ' '.. ref2.. '"]'.. ref2b .. url .. ref3 .. ref4 elseif wiki == "de" then if ref2~=' ' then url= ' In: ' .. s2 .. ' ' else url='' end ref = ' ['.. ref1.. ' '.. ref2.. '.] '.. url.. ref3 .. ref4 ..'.' else if ref2~=' ' then url= ' ' .. s2 .. ' ' else url='' end ref = ref2b .. '['.. ref1.. ' '.. ref2.. '] ' .. url.. ref3 .. ref4 end return ref or '' else return '' end end

--=== E) Function for the output === function tableA(s, tableBody)	local s = s	local tableBody = tableBody	local available_list = available_list	local entity = mw.wikibase.getEntityObject( s.item )

local error_message = '' if wiki == "ar" and s.item == "" or not s.item then return "" end if s.error_message == 1 then error_message = func_error_message(wiki, 1) error_message = mw.ustring.gsub(error_message, "<1>", s.property) error_message = mw.ustring.gsub(error_message, "<2>", mw.wikibase.label( s.item )) error_message = mw.ustring.gsub(error_message, "<3>", s.item) error_message = ' ' end

local tableHeader2_size = table.getn(s.header_2) local tableStart = ' '

return ' ' end

--=== E) Jersey, flag functions === function flag (countryID, date)

local trackingCategory = '' -- If you uncomment the line under this comment, all pages with look-up misses in	the flag table will be placed in a tracking category. You can use this to find more flags	to add to the table. -- trackingCategory = '' local flags = { Q16 = {'CAN', {'Flag of Canada.svg', '+1965-02-15'}}, Q17 = {'JPN', {'Flag of Japan.svg', '+1999-08-13'}}, Q20 = {'NOR', {'Flag of Norway.svg', '+1821-07-13'}}, Q27 = {'IRL', {'Flag of Ireland.svg', '+1937-12-29'}}, Q28 = {'HUN', {'Flag of Hungary.svg', '+1957-05-23'}}, Q29 = {'ESP', {'Flag of Spain.svg', '+1981-12-06'}, {'Flag of Spain (1977–1981).svg', '+1977-01-21', '+1981-12-06'}, {'Flag of Spain (1945–1977).svg', '+1945-10-11', '+1977-01-21'}, {'Flag of Spain (1938–1945).svg', '+1939', '+1945-10-11'}, {'Flag of the Second Spanish Republic.svg', '+1931-04-14', '+1939'}, {'Flag of Spain (1785–1873, 1875–1931).svg', '+1874', '+1931-04-13'}}, Q30 = {'USA', {'Flag of the United States.svg', '+1960-07-04'}}, Q31 = {'BEL', {'Flag of Belgium (civil).svg'}}, Q32 = {'LUX', {'Flag of Luxembourg.svg'}}, Q33 = {'FIN', {'Flag of Finland.svg', '+1918-05-29'}}, Q34 = {'SWE', {'Flag of Sweden.svg'}}, Q35 = {'DEN', {'Flag of Denmark.svg'}}, Q36 = {'POL', {'Flag of Poland.svg'}}, Q37 = {'LTU', {'Flag of Lithuania.svg', '+2004-09-01'}, {'Flag of Lithuania (1988-2004).svg', '+1990-03-11', '+2004-09-01'}}, Q38 = {'ITA', {'Flag of Italy.svg', '+1946-06-19'}, {'Flag of Italy (1861–1946).svg', '+1861', '+1946-06-19'}}, Q39 = {'SUI', {'Flag of Switzerland.svg', '+1889-12-12'}}, Q40 = {'AUT', {'Flag of Austria.svg', '+1945-05-01'}}, Q41 = {'GRE', {'Flag of Greece.svg', '+1978'}}, Q43 = {'TUR', {'Flag of Turkey.svg'}}, Q45 = {'POR', {'Flag of Portugal.svg', '+1911-06-30'}}, Q55 = {'NED', {'Flag of the Netherlands.svg', '+1806'}}, Q77 = {'URU', {'Flag of Uruguay.svg'}}, Q96 = {'MEX', {'Flag of Mexico.svg', '+1968-09-16'}, {'Flag of Mexico (1934-1968).svg', '+1934', '+1968-09-16'}}, Q114 = {'KEN', {'Flag of Kenya.svg'}}, Q115 = {'ETH', {'Flag of Ethiopia.svg', '+1996-10-31'}}, Q142 = {'FRA', {'Flag of France.svg', '+1794-05-20'}}, Q145 = {'GBR', {'Flag of the United Kingdom.svg'}}, Q148 = {'CHN', {"Flag of the People's Republic of China.svg", '+1985'}}, Q155 = {'BRA', {'Flag of Brazil.svg', '+1992-05-11'}, {'Flag of Brazil (1968–1992).svg', '+1968-05-28', '+1992-05-11'}}, Q159 = {'RUS', {'Flag of Russia.svg', '+1993-12-11'}, {'Flag of Russia (1991–1993).svg', '+1991-08-22', '+1993-12-11'}, {'Flag of the Russian Soviet Federative Socialist Republic.svg', '+1954', '+1991-08-22'}, {'Flag of the Russian Soviet Federative Socialist Republic (1937–1954).svg', '+1937', '+1954'}}, Q183 = {'GER', {'Flag of Germany.svg', '+1949-05-23'}, {'Flag of the German Reich (1935–1945).svg', '+1935-09-15', '+1945-05-23'}, {'Flag of the German Reich (1933–1935).svg', '+1933-03-12', '+1935-09-15'}, {'Flag of Germany (3-2 aspect ratio).svg', '+1919-04-11', '+1933-03-12'}, {'Flag of the German Empire.svg', '+1871-04-16', '+1919-04-11'}}, Q184 = {'BLR', {'Flag of Belarus.svg', '+2012-05-11'}, {'Flag of Belarus (1995–2012).svg', '+1995-06-07', '+2012-05-11'}}, Q191 = {'EST', {'Flag of Estonia.svg'}}, Q211 = {'LAT', {'Flag of Latvia.svg'}}, Q212 = {'UKR', {'Flag of Ukraine.svg', '+1992-01-28'}}, Q213 = {'CZE', {'Flag of the Czech Republic.svg', '+1920-03-30'}}, Q214 = {'SVK', {'Flag of Slovakia.svg'}}, Q215 = {'SLO', {'Flag of Slovenia.svg'}}, Q217 = {'MDA', {'Flag of Moldova.svg'}}, Q218 = {'ROU', {'Flag of Romania.svg', '+1989-12-27'}, {'Flag of Romania (1965-1989).svg', '+1989-12-27', '+1965'}, {'Flag of Romania (1952-1965).svg', '+1952', '+1965'}, {'Flag of Romania (1948-1952).svg', '+1948-01-08', '+1952'}, {'Flag of Romania.svg', '12. april 1867-04-12', '+1948-01-08'}}, Q219 = {'BUL', {'Flag of Bulgaria.svg', '+1990-11-22'}, {'Flag of Bulgaria (1971 – 1990).svg', '+1971-05-18', '+1990-11-22'}}, Q222 = {'ALB', {'Flag of Albania.svg', '+1992'}}, Q224 = {'CRO', {'Flag of Croatia.svg', '+1990-12-21'}, {'Flag of Croatia (white chequy).svg', '+1990-06-27', '+1990-12-21'}}, Q227 = {'AZE', {'Flag of Azerbaijan.svg'}}, Q228 = {'AND', {'Flag of Andorra.svg'}}, Q229 = {'CYP', {'Flag of Cyprus.svg', '+2006-08-20'}, {'Flag of Cyprus (1960-2006).svg', '+1960-08-16', '+2006-08-20'}}, Q232 = {'KAZ', {'Flag of Kazakhstan.svg'}}, Q238 = {'SMR', {'Flag of San Marino.svg'}}, Q241 = {'CUB', {'Flag of Cuba.svg'}}, Q252 = {'INA', {'Flag of Indonesia.svg'}}, Q258 = {'RSA', {'Flag of South Africa.svg', '+1994-04-27'}, {'Flag of South Africa (1928–1994).svg', '+1928-05-31', '+1994-04-27'}}, Q262 = {'ALG', {'Flag of Algeria.svg'}}, Q265 = {'UZB', {'Flag of Uzbekistan.svg'}}, Q298 = {'CHI', {'Flag of Chile.svg'}}, Q334 = {'SGP', {'Flag of Singapore.svg'}}, Q347 = {'LIE', {'Flag of Liechtenstein.svg'}}, Q398 = {'BRN', {'Flag of Bahrain.svg', '+2002-02-14'}}, Q403 = {'SRB', {'Flag of Serbia.svg', '+2004-08-18'}, {'Flag of Serbia (1992–2004).svg', '+1992-04-27', '+2004-08-17'}}, Q408 = {'AUS', {'Flag of Australia.svg'}}, Q414 = {'ARG', {'Flag of Argentina.svg'}}, Q664 = {'NZL', {'Flag of New Zealand.svg'}}, Q711 = {'MGL', {'Flag of Mongolia.svg'}}, Q717 = {'VEN', {'Flag of Venezuela.svg', '+2006'}}, Q736 = {'ECU', {'Flag of Ecuador.svg'}}, Q739 = {'COL', {'Flag of Colombia.svg'}}, Q750 = {'BOL', {'Flag of Bolivia.svg', '+1851-10-31'}}, Q786 = {'DOM', {'Flag of the Dominican Republic.svg'}}, Q794 = {'IRI', {'Flag of Iran.svg', '+1980-07-29'}, {'Flag of Iran (1964–1980).svg', '+1964', '+1980-07-29'}}, Q800 = {'CRC', {'Flag of Costa Rica (state).svg', '+1906-11-27'}}, Q801 = {'ISR', {'Flag of Israel.svg'}}, Q817 = {'KUW', {'Flag of Kuwait.svg', '+1961-09-07'}}, Q833 = {'MAS', {'Flag of Malaysia.svg', '+1963-09-16'}}, Q842 = {'OMA', {'Flag of Oman.svg', '+1995'}}, Q846 = {'QAT', {'Flag of Qatar.svg'}}, Q865 = {'TPE', {'Flag of the Republic of China.svg', '+1928-12-17'}}, Q869 = {'THA', {'Flag of Thailand.svg'}}, Q878 = {'UAE', {'Flag of the United Arab Emirates.svg'}}, Q884 = {'KOR', {'Flag of South Korea.svg', '+1997-10'}}, Q928 = {'PHI', {'Flag of the Philippines.svg', '+1998'}}, Q948 = {'TUN', {'Flag of Tunisia.svg', '+1999-07-03'}}, Q965 = {'BUR', {'Flag of Burkina Faso.svg'}}, Q986 = {'ERI', {'Flag of Eritrea.svg'}}, Q1000 = {'GAB', {'Flag of Gabon.svg', '+1960-08-09'}}, Q1008 = {'CIV', {"Flag of Côte d'Ivoire.svg"}}, Q1009 = {'CMR', {'Flag of Cameroon.svg'}}, Q1028 = {'MAR', {'Flag of Morocco.svg'}}, Q1036 = {'UGA', {'Flag of Uganda.svg', '+1962-10-09'}}, Q1037 = {'RWA', {'Flag of Rwanda.svg', '+2001-10-25'}, {'Flag of Rwanda (1962–2001).svg', '+1962', '+2001-10-25'}}, Q9676 = {'IMN', {'Flag of the Isle of Man.svg'}}, Q15180 = {'URS', {'Flag of the Soviet Union.svg', '+1980-08-15', '+1991-12-25'}, {'Flag of the Soviet Union (1955–1980).svg', '+1955-08-19', '+1980-08-14'}}, Q16957 = {'GDR', {'Flag of East Germany.svg', '+1959-10-01'}, {'Flag of Germany.svg', '+1949-10-07', '+1959-10-01'}}, --German Democratic Republic Q8646 = {'HKG', {'Flag of Hong Kong.svg'}}, Q29999 = {'NED', {'Flag of the Netherlands.svg', '+1690'}}, --Kingdom of the Netherlands Q33946 = {'TCH', {'Flag of the Czech Republic.svg', '+1920'}}, -- Czechoslovakia (1918–1992) Q36704 = {'YUG', {'Flag of Yugoslavia (1992–2003).svg', '+1992-04-27', '+2003-02-04'}, --Yugoslavia {'Flag of Yugoslavia (1943–1992).svg', '+1946', '+1992-04-27'}}, Q83286 = {'YUG', {'Flag of Yugoslavia (1943–1992).svg'}}, --Socialist Federal Republic of Yugoslavia Q172579 = {'ITA', {'Flag of Italy (1861–1946).svg'}}, --Kingdom of Italy (1861-1946) Q713750 = {'FRG', {'Flag of Germany.svg'}}, --West Germany Q13474305 = {'ESP', {'Flag of Spain (1945–1977).svg', '+1945-10-11', '+1977-01-21'}, -- Francoist Spain (1935-1976) {'Flag of Spain (1938–1945).svg', '+1939', '+1945-10-11'}, {'Flag of the Second Spanish Republic.svg', '+1931-04-14', '+1939'}}, }	local entry = flags[countryID] local IOC local file if entry then for i, v in ipairs(entry) do			if i == 1 then IOC = v			else if not date then file = v[1] break else local from = v[2] local to = v[3] if (not from or from <= date) and (not to or to > date) then file = v[1] break end end end end end if file then return '' elseif not date then local p41 = mw.wikibase.getBestStatements(countryID, "P41") -- P41 is flag image if p41[1] and p41[1].mainsnak.snaktype == 'value' then return '' .. trackingCategory end else -- Search flag for specific date local p41 = getStatementForTime(countryID, "P41", date) -- P41 is flag image if p41 then return '' .. trackingCategory end end return trackingCategory end

function jersey(wiki, winner_classification, item, timeofrace) local jersey, jersey_name = ,  local jerseyWPID = '' local starttime, endtime = '', '+2500' local a1, b1

-- 1. Item of race, e.g. Tour de France = 'Q33881' -- 2. type of winner, names are the ones in variable t_s -- 3. and 4. start and end time. '+2500' means year 2500. Always beginning with a '+' -- 5. item of the jersey -- 6. item of the Wikipedia article of that jersey

local data={{'Q33881', 'montagne', '+1975', '+2500', 'Q25265958', 'Q927157'}, -- Tour de France {'Q33881', 'leader', '+1919', '+2500', 'Q24257871', 'Q738903'}, {'Q33881', 'points', '+1953', '+1967', 'Q24645209', 'Q175399'}, -- Jersey green.svg {'Q33881', 'points', '+1968', '+1968', 'Q26919974', 'Q175399'},	-- 	Jersey red.svg {'Q33881', 'points', '+1969', '+2500', 'Q24645209', 'Q175399'}, -- Jersey green.svg {'Q33881', 'jeune', '+1975', '+2500', 'Q24645383', 'Q2254180'}, -- Jersey white.svg {'Q33881', 'winner_fighting', '+2003', '+2500', 'Q27644113', 'Q2094179'}, -- Jersey red number.svg {'Q33881', 'winner_fighting2', '+2003', '+2500', 'Q27644113', 'Q2094179'}, -- Jersey red number.svg {'Q33881', 'equipe', '+2006', '+2500', 'Q27644112', 'Q1436680'},	-- Jersey yellow number.svg

{'Q33861', 'leader', '+1931', '+2500', 'Q24257763', 'Q1164275'}, -- Giro d'Italia, Jersey pink.svg {'Q33861', 'points', '+1967', '+1968', 'Q26919974', 'Q641083'}, -- Jersey red.svg {'Q33861', 'points', '+1969', '+2009', 'Q26945272', 'Q641083'}, -- Jersey violet.svg {'Q33861', 'points', '+2010', '+2016', 'Q26919974', 'Q641083'}, -- Jersey red.svg {'Q33861', 'points', '+2017', '+2500', 'Q26945272', 'Q641083'}, -- Jersey violet.svg {'Q33861', 'montagne', '+1974', '+2011', 'Q24645209', 'Q641060'}, -- Jersey green.svg {'Q33861', 'montagne', '+2012', '+2500', 'Q24687409', 'Q641060'}, -- Jersey blue.svg {'Q33861', 'jeune', '+1976', '+2500', 'Q24645383', 'Q641662'}, -- Jersey white.svg

{'Q33937', 'leader', '+1935', '+1936', 'Q24258056', 'Q3278226'}, -- Vuelta a España, Jersey orange.svg {'Q33937', 'leader', '+1941', '+1941', 'Q26696171', 'Q640430'}, -- Jersey white.svg {'Q33937', 'leader', '+1942', '+1942', 'Q24258056', 'Q3278226'}, -- Jersey orange.svg {'Q33937', 'leader', '+1945', '+1945', 'Q24257872', 'Q2534046'}, -- Jersey red.svg {'Q33937', 'leader', '+1946', '+1950', 'Q26696171', 'Q640430'}, -- Jersey white.svg {'Q33937', 'leader', '+1955', '+1976', 'Q24257871', 'Q738903'}, -- Jersey yellow.svg {'Q33937', 'leader', '+1977', '+1977', 'Q24258056', 'Q3278226'}, -- Jersey orange.svg {'Q33937', 'leader', '+1978', '+1998', 'Q24257871', 'Q738903'}, -- Jersey yellow.svg {'Q33937', 'leader', '+1999', '+2009', 'Q24257991', 'Q27665179'}, -- Jersey gold.svg {'Q33937', 'leader', '+2010', '+2500', 'Q24257872', 'Q2534046'}, -- Jersey red.svg {'Q33937', 'points', '+1945', '+1986', 'Q24687409', 'Q2746711'}, -- Jersey blue.svg {'Q33937', 'points', '+1987', '+1989', 'Q24645209', 'Q11638007'}, -- Jersey green.svg {'Q33937', 'points', '+1990', '+2009', 'Q24687409', 'Q2746711'}, -- Jersey blue.svg {'Q33937', 'points', '+2010', '+2500', 'Q24645209', 'Q11638007'}, -- Jersey green.svg {'Q33937', 'montagne', '+1935', '+1985', 'Q27670182', 'Q11638007'}, -- Jersey green.svg {'Q33937', 'montagne', '+1986', '+1986', 'Q27670174', 'Q3278226'}, -- Jersey orange.svg {'Q33937', 'montagne', '+1987', '+1987', 'Q27670178', 'Q2534046'}, -- Jersey red.svg {'Q33937', 'montagne', '+1988', '+1989', 'Q27670105', 'Q27670115'}, -- Jersey blackdots.png {'Q33937', 'montagne', '+1990', '+2005', 'Q27670182', 'Q11638007'}, -- Jersey green.svg {'Q33937', 'montagne', '+2006', '+2008', 'Q27670174', 'Q3278226'}, -- Jersey orange.svg {'Q33937', 'montagne', '+2009', '+2009', 'Q27670126', 'Q27670163'}, -- Jersey granate.svg {'Q33937', 'montagne', '+2010', '+2500', 'Q25265959', 'Q27670167'}, -- Jersey bluedots.svg

{'Q2091354', 'leader', '+2011', '+2500', 'Q24257871', 'Q30020298'}, -- Tour of Norway, Jersey yellow.svg {'Q2091354', 'points', '+2011', '+2017', 'Q24645209', 'Q30020298'}, -- Jersey green.svg {'Q2091354', 'points', '+2018', '+2500', 'Q28820618', 'Q30020298'}, -- MaillotCyan.PNG {'Q2091354', 'montagne', '+2011', '+2015', 'Q25265958', 'Q30020298'}, -- Jersey polkadot.svg {'Q2091354', 'montagne', '+2016', '+2017', 'Q27670174', 'Q30020298'}, -- Jersey orange.svg {'Q2091354', 'montagne', '+2018', '+2500', 'Q25265958', 'Q30020298'}, -- Jersey polkadot.svg {'Q2091354', 'jeune', '+2011', '+2500', 'Q24645383', 'Q30020298'}, -- Jersey white.svg {'Q2091354', 'winner_fighting', '+2017', '+2017', 'Q29957114', 'Q30020298'}, -- MaillotCyan.PNG {'Q128713', 'leader', '+2013', '+2017', 'Q24257871', 'Q30020299'}, -- Tour des Fjords, Jersey yellow.svg {'Q128713', 'leader', '+2018', '+2500', 'Q29594434', 'Q30020299'}, -- MaillotCyan.PNG {'Q128713', 'points', '+2013', '+2014', 'Q24645209', 'Q30020299'}, -- Jersey green.svg {'Q128713', 'points', '+2015', '+2017', 'Q24687409', 'Q30020299'}, -- Jersey blue.svg {'Q128713', 'points', '+2018', '+2500', 'Q25265938', 'Q30020299'}, -- Jersey violet.svg {'Q128713', 'montagne', '+2013', '+2500', 'Q25265958', 'Q30020299'}, -- Jersey polkadot.svg {'Q128713', 'jeune', '+2013', '+2500', 'Q24645383', 'Q30020299'}, -- Jersey white.svg {'Q128713', 'winner_fighting', '+2015', '+2015', 'Q30035038', 'Q30020299'}, -- Jersey green.svg {'Q128713', 'winner_fighting', '+2016', '+2017', 'Q30035039', 'Q30020299'}, -- Jersey orange.svg {'Q128961', 'leader', '+2013', '+2500', 'Q24687408', 'Q30020300'}, -- Arctic Race of Norway, Jersey blue.svg {'Q128961', 'points', '+2013', '+2500', 'Q24645209', 'Q30020300'}, -- Jersey green.svg {'Q128961', 'montagne', '+2013', '+2014', 'Q27670178', 'Q30020300'}, -- Jersey red.svg {'Q128961', 'montagne', '+2015', '+2500', 'Q27670174', 'Q30020300'}, -- Jersey orange.svg {'Q128961', 'jeune', '+2013', '+2500', 'Q24645383', 'Q30020300'}, -- Jersey white.svg {'Q128961', 'winner_fighting', '+2014', '+2500', 'Q27644113', 'Q30020300'}, -- Jersey red number.svg {'Q17619325', 'leader', '+2014', '+2014', 'Q24257871', 'Q30020302'}, -- Ladies Tour of Norway, Jersey yellow.svg {'Q17619325', 'leader', '+2015', '+2016', 'Q26945272', 'Q30020302'}, -- Jersey violet.svg {'Q17619325', 'leader', '+2017', '+2500', 'Q24257871', 'Q30020302'}, -- Jersey yellow.svg {'Q17619325', 'points', '+2014', '+2500', 'Q24645209', 'Q30020302'}, -- Jersey green.svg {'Q17619325', 'montagne', '+2014', '+2500', 'Q25265958', 'Q30020302'}, -- Jersey polkadot.svg {'Q17619325', 'jeune', '+2014', '+2500', 'Q24645383', 'Q30020302'}, -- Jersey white.svg {'Q17619325', 'winner_fighting', '+2016', '+2500', 'Q30035039', 'Q30020302'}} -- Jersey orange.svg

--timeofrace = '+1968-07-01T00:00:00Z' timeofrace = string.sub(timeofrace, string.find(timeofrace, "+%d%d%d%d")) for k, v in pairs(item) do		for key, value in pairs(data) do			if v == value[1] then if winner_classification == value[2] then if (timeofrace >= value[3]) and (timeofrace <= value[4]) then jersey = value[5] jerseyWPID = value[6] end end end end end

if jersey~='' then --and (timeofrace > starttime) and (timeofrace < endtime) then local entity_jersey = mw.wikibase.getEntity(jersey) jersey = entity_jersey.claims['P18'][1].mainsnak.datavalue.value jersey_name = entity_jersey:getLabel(wikilang) or '' if jerseyWPID~= '' then local entity = mw.wikibase.getEntity( jerseyWPID ) local Sitelink = entity:getSitelink(wiki..'wiki') -- link to WParticle if Sitelink~= nil then jerseyWPID = wiki..':'..Sitelink else jerseyWPID = '' end end return jersey, jersey_name, jerseyWPID else return , , '' end end

--=== G) Other (winner, getkm) === function winner(raceID, winners, timeOfRace, countryflag, WDlink_on, team, ref)	local p1346 = wikibase.getAllStatements(raceID, 'P1346') -- P1346 is 'winner'	for _, winner in pairs(p1346) do		local wID = winner.mainsnak.snaktype == 'value' and winner.mainsnak.datavalue.value.id		local wOf, wCause, wCriterion, riderLink		local q = winner.qualifiers		if q then			if q.P642 and q.P642[1].snaktype == 'value' then				for _, q642 in pairs(q.P642) do					wOf = q642.datavalue.value.id -- P642 is 'of'					if not wOf then						-- Try P1346 (winner) instead						-- Assume Q20882667 ('overall winner general classification') if neither are found						wOf = q.P1346 and q.P1346[1].snaktype == 'value' and q.P1346[1].datavalue.value.id or 'Q20882667'					end					wCause = q.P828 and q.P828[1].snaktype == 'value' and q.P828[1].datavalue.value.id						-- P828 is 'has cause' wCriterion = q.P1013 and q.P1013[1].snaktype == 'value' and q.P1013[1].datavalue.value.id						-- P1013 is 'criterion used' if winners[wOf] then if wID then -- The winner can be a rider or a team, so check if it is a human. local isHuman local p31 = wikibase.getBestStatements(wID, 'P31') -- P31 is 'instance of' for _, iOf in pairs (p31) do								if iOf.mainsnak.snaktype == 'value' and iOf.mainsnak.datavalue.value['numeric-id'] == 5 then -- Q5 is 'human' isHuman = true break end end local reference = ref and getReference(winner) local _, countryID if isHuman then riderLink = getRiderLink(wID) if reference then riderLink = riderLink .. reference end if team then riderTeam = getTeam(wID, timeOfRace, q)									if riderTeam then riderLink = riderLink .. ' (' .. riderTeam .. ')' end end else riderLink, _, countryID = getTeamLinkCat(wID, timeOfRace, countryflag) if reference then riderLink = riderLink .. reference end end if countryflag then if not countryID then local p27 = getStatementForTime(wID, 'P27', timeOfRace) --P27 is country of citizenship if p27 then countryID = p27.mainsnak.datavalue.value.id									end end if countryID then riderLink = flag(countryID, timeOfRace) .. ' ' .. riderLink end end if WDlink_on then riderLink = riderLink .. ' ' .. wdLink(wID) end else riderLink = wCriterion and contentLanguage:ucfirst(wikibase.getLabel(wCriterion) or ) or  if wCause then local cause = wikibase.getLabel(wCause) if cause then riderLink = riderLink .. ' (' .. cause .. ')' end end end if winners[wOf] == '' then winners[wOf] = riderLink else winners[wOf] = winners[wOf] .. ' ' .. riderLink end end end end end end end

local function getKm(wiki) local km	if wiki == "ar" then km = 'كم' elseif wiki == "mk" then km = 'км' elseif wiki == "ru" then km = 'км' elseif wiki == "ja" then km = 'キロメートル' else km = 'km' end return km end local function getDistance(raceID, addUnit) local p = mw.wikibase.getBestStatements(raceID, 'P3157') -- P3157 is 'event distance' if not p[1] then p = mw.wikibase.getBestStatements(raceID, 'P2043') -- P2043 is 'length' end local km, unit local text local wiki = wiki local lang = contentLanguage if p[1] and p[1].mainsnak.snaktype == 'value' then km = tonumber(p[1].mainsnak.datavalue.value.amount) unit = p[1].mainsnak.datavalue.value.unit if unit == 'http://www.wikidata.org/entity/Q828224' then -- Q828224 is 'kilometre' -- The unit should always be km. Skip if it isn't.			text = lang:formatNum(km) if wiki == 'fo' then text = string.gsub(text, "%.", ",") end if addUnit then text = text .. ' ' .. getKm(wiki) end if wiki == 'en' then -- Show miles also local miles = math.modf(10*km/1.609344)/10 text = text .. ' (' .. lang:formatNum(miles)				if addUnit then					text = text .. ' mi'				end				text = text .. ')' end end end return text end

local function getKmh(wiki) local kmh if wiki == "ar" then kmh = 'كم/س' elseif wiki == "da" then kmh = 'km/t' elseif wiki == "fo" then kmh = 'km/t' elseif wiki == "nl" then kmh = 'km/u' elseif wiki == "no" then kmh = 'km/t' elseif wiki == "mk" then kmh = 'км/ч' elseif wiki == "ru" then kmh = 'км/ч' elseif wiki == "ja" then kmh = 'キロメートル毎時' else kmh = 'km/h' end return kmh end

local function getSpeed(raceID, addUnit) local p = mw.wikibase.getBestStatements(raceID, 'P2052') -- P2052 is 'speed' local kmh, unit local text local wiki = wiki local lang = contentLanguage if p[1] and p[1].mainsnak.snaktype == 'value' then kmh = tonumber(p[1].mainsnak.datavalue.value.amount) unit = p[1].mainsnak.datavalue.value.unit if unit == 'http://www.wikidata.org/entity/Q180154' then -- Q180154 is 'kilometre per hour' -- The unit should always be km/h. Skip if it isn't.			text = lang:formatNum(kmh) if wiki == 'fo' then text = string.gsub(text, "%.", ",") end if addUnit then text = text .. ' ' .. getKmh(wiki) end if wiki == 'en' then -- Show miles per hour also local mih = math.modf(1000*kmh/1.609344)/1000 text = text .. ' (' .. lang:formatNum(mih)				if addUnit then					text = text .. ' mi/h'				end				text = text .. ')' end end end return text end

function number(gender, b, wiki) local str if b=="" then return "" end if wiki == "ca" then if b==1 then str = b.."r" elseif b==2 then str = b.."n" elseif b==3 then str = b.."r" elseif b==4 then str = b.."t" else str = b.."è" end elseif wiki=="en" then if b==1 then str="1st" elseif b==2 then str="2nd" elseif b==3 then str="3rd" else str=b.."th" end elseif wiki=="es" then if gender == 'm' or gender == 'n' then str = b..".º" elseif gender == 'f' then str = b..".ª" else str = b.."." end elseif wiki=="fr" then if b==1 then if gender == 'm' then str="1er" elseif gender == 'f' or gender == 'n' then str="1re" else str="1e" end else str=b.."e" end elseif wiki=="nl" then str=b.."e" elseif wiki=="ru" then str=b.."-й" elseif wiki=="eo" then str=b.."-a" elseif wiki=="ast" then if gender == 'm' or gender == 'n' then str = b.."ᵘ" elseif gender == 'f' then str = b..".ª" else str = b.."." end else str = b .. ". "	end return str end

function calculate_time(t) local time = tonumber(t) local h, m, s = 0, 0, 0 local str = ''

if time == nil then return '' end if time < 60 then s = time elseif time < 3600 then m = math.modf(time/60) s = time - m*60 else h = math.modf(time/3600) m = math.modf((time - h*3600)/60) s = time - h*3600 - m*60 end

if h>0 then str = str..mw.ustring.format ('%i'..unit(2), h) end if m>=0 and h>0 then str = str.. mw.ustring.format('%02i'..unit(3), m) end if m>0 and h==0 then str = str.. mw.ustring.format('%i'..unit(3), m) end if s>=0 and (h>0 or m>0) then str = str.. mw.ustring.format('%02i'..unit(4), s) end if s>=0 and h==0 and m==0 then str = str.. mw.ustring.format('%i'..unit(4), s) end return str --time..': '..h..' '..m..' '..s end

function func_error_message(wiki,x) local l10nDef = { ["en"] = {'Property <1> is missing in item "<2>" (<3>)'}, ["ar"] = {'الخاصية <1> غير موجودة في العنصر "<2>" (<3>)'}, }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default return l10n[x] end

function changetemplate -- for eoWiki local frame = mw.getCurrentFrame local n = frame:expandTemplate {title="sxangxu sxablonon2", args = {["sxablono"] = "Cycling race/infobox"}} return n end

function getMissingLabelTrackingCategory local l10nDef = { ["//cs.wikipedia.org"] = '', ["//lv.wikipedia.org"] = '', ["//he.wikipedia.org"] = '', }	local l10n = l10nDef[mw.site.server] if not l10n then l10n = '' end return l10n end

--== IV) Translation == local function race_reference_translate(wiki, x)	local l10nDef = {		["ar"] = {"مصدر: ", "مصادر: "},		["fr"] = {"Source : ", "Sources : "},		["en"] = {"Source: ", "Sources: "},		["de"] = {"Quelle: ","Quellen: "},		["da"] = {"Kilde: ","Kilder: "},		["es"] = {"Fuente: ","Fuentes: "},		["he"] = {"מקור : ", "מקורות : "},		["ast"] = {"Fonte: ","Fontes: "},		["lv"] = {"Avots: ", "Avoti: "},	}	local l10n = l10nDef[wiki] or l10nDef["en"] -- default	return l10n[x] end

function calendar_translate(wiki, x, title) local l10nDef = { ["ar"] = { "تقويم الاتحاد الدولي للدراجات", "التاريخ", "#", "السباق", "البلد", "الصنف", "الفائز", "الثاني", "الثالث", "متصدر الترتيب العام", "طواف العالم للدراجات للنساء", "", "طواف العالم للدراجات", "طواف أوروبا للدراجات" , "طواف آسيا للدراجات" , "طواف أمريكا للدراجات" , "طواف أفريقيا للدراجات" , "طواف أوقيانوسيا للدراجات", "بطولات وطنية", "سباق الطريق", "سباق فردي ضد الساعة" }, ["fr"] = {"Calendrier UCI", "Date", "n°","Course", "Pays", "Classe", "Vainqueur", "Deuxième", "Troisième", "Leader du classement général","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","Championnats nationaux","Course en ligne","Contre-la-montre"}, ["en"] = {"UCI Calendar", "Date", "#","Race", "Country", "Class", "Winner", "Second", "Third", "Overall leader","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","National championship","Road race","Individual time trial"}, ["de"] = {"UCI Kalender", "Datum", "Nr.","Rennen", "Staat", "Klasse", "Sieger", "Zweiter", "Dritter", "Gesamt&shy;führender","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","Nationale Straßen-Radsportmeister","Straßenrennen","Einzelzeitfahren"}, ["da"] = {"","Dato", "#","Løb", "Land", "Klasse", "Vinder","Toer", "Treer", "Førende rytter","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","Nationalt mesterskab","Landevej","Enkeltstart"}, ["es"] = {"Calendario UCI", "Fecha", "#","Carrera", "País", "Clase", "Ganador","Segundo", "Tercero", "Líder","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","Campeonato nacional","Carrera de ruta","Contrarreloj individual"}, ["ja"] = {"", "開催日", "#","レース", "国", "国", "勝者","準優勝", "3位", "全体リーダー","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","National championship","Road race","Individual time trial"}, ["lv"] = {"", "Datums", "#","Sacensības", "Valsts", "Kategorija", "Uzvarētājs","Otrais", "Trešais", "Kopvērtējuma līderis","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","National championship","Road race","Individual time trial"}, ["mk"] = {"", "Датум","#", "Трка", "Земја", "Класа", "Победник", "Второпласиран", "Третопласиран", "Cевкупен лидер","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","National championship","Road race","Individual time trial"}, ["no"] = {"", "Dato", "#","Ritt", "Land", "Klasse", "Vinner", "Andreplass", "Tredjeplass", "Sammenlagt&shy;leder","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","Nasjonalt mesterskap","Landevei","Tempo"}, ["ru"] = {"", "Дата", "№","Гонка", "Страна", "Класс", "Победитель","Второй", "Третий", "Лидер генеральной классификации","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","National championship","Road race","Individual time trial"}, ["he"] = {"UCI Calendar", "תאריך", "#","מרוץ", "מדינה", "Class", "מנצח", "שני", "שלישי", "Overall leader","UCI Women's World Tour","","UCI World Tour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","אלוף לאומי","Road race","Individual time trial"}, ["ast"] = {"Calendariu UCI", "Data", "#","Carrera", "País", "Clas", "Ganador","Segundu", "Terceru", "Líder","UCI WorldTour Femenín 2018","","UCI WorldTour","UCI Europe Tour","UCI Asia Tour","UCI America Tour","UCI Africa Tour","UCI Oceania Tour","Campeonatu nacional","Carrera de ruta","Contrarreló individual"}, }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default if x==1000 then --code return title else return l10n[x] end end

function victories_translate(wiki, x)	local l10nDef = { ["ar"] = {"التصنيف العام", "سجل الفوز", "التاريخ", "السباق", "البلد", "الصنف", "الفائز","مرحلة","المقدمة"}, ["fr"] = {"Classement général", "Victoires", "Date", "Course", "Pays", "Classe", "Vainqueur","étape","Prologue"}, ["en"] = {"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","stage","Prologue"}, ["de"] = {"Gesamtwertung", "Siege", "Datum", "Rennen", "Staat", "Klasse", "Sieger","Etappe","Prolog"}, ["da"] = {"Samlede stilling", "Sejre", "Dato", "Løb", "Land", "Klasse", "Vinder","etape","Prolog"}, ["es"] = {"Clasificación general", "Victorias", "Fecha", "Carrera", "País", "Clase", "Ganador","etapa","Prólogo"}, ["ja"] = {"General classification", "Victories", "開催日", "レース", "国", "国", "勝者","ステージ","プロローグ"}, ["lv"] = {"Kopvērtējums", "Uzvaras", "Datums", "Sacensības", "Valsts", "Kategorija", "Uzvarētājs","Posms","Prologs"}, ["mk"] = {"General classification", "Victories", "Датум", "Трка", "Земја", "Класа", "Победник","Етапа","Пролог"}, ["no"] = {"Sammenlagt", "Seire", "Dato", "Ritt", "Land", "Klasse", "Vinner","etappe","Prolog"}, ["ru"] = {"Генеральная классификация", "Победы", "Дата", "Гонка", "Страна", "Класс", "Победитель","Этап","Пролог"}, ["ast"] = {"Clasificación xeneral", "Victories", "Data", "Carrera", "País", "Clas", "Ganador","etapa","Prólogu"}, ["br"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Tennad","Prolog"}, ["ca"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","etapa","Pròleg"}, ["cs"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","etapa","Prolog"}, ["eo"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Etapo","Prologo"}, ["eu"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Etapa","Aitzinetapa"}, ["fi"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Etappi","Prologi"}, ["fo"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","teinur","Forteinur"}, ["la"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Statio","Incipit prologus"}, ["it"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Tappa","Prologo"}, ["hu"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Szakasz","Prolog"}, ["lb"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","etapp","Prolog"}, ["nl"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Etappe","Proloog"}, ["pl"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Etap","Prologu"}, ["pt"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Etapa","Prólogo"}, ["ro"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Etapa","Prolog"}, ["sk"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Etapa","Prológ"}, ["sv"]={"General classification", "Victories", "Date", "Race", "Country", "Class", "Winner","Etapp","Prolog"}, }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default return l10n[x] end

function stageinfobox_translate(x) -- This function permits to translate fields of the infobox for stages. Take the line below, give a Wikipedia		(ex : mk), and translate all fields. By default, English values are taken. local l10nDef = { ["fr"] = {"Généralités", "Course", "Type", "Date", "Dates", "Distance", "Pays", "Pays", "Lieu de départ", "Lieu d'arrivée", "Partants", "Arrivants", "Vitesse moyenne", "Coût", "Résultats de l’étape", "Vainqueur", "Deuxième", "Troisième", "Combatif", "Classement général à l’issue de l’étape", "Leader", "Deuxième", "Troisième", "Classements annexes à l’issue de l’étape", "Points", "Montagne", "Sprints", "Jeune", "Super- combatif", "Combiné", "Étapes volantes", "Régularité", "Équipe", "Équipe aux points", "Image", "Légende", "Carte", "Vue en coupe", "Documentation", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Fuga"}, ["ar"] = {"تفاصيل السباق", "سباق", "نوع", "تاريخ", "تاريخ", "مسافة", "بلد", "بلدان", "نقطة البداية", "نقطة النهاية", "الدراجين في البداية", "الدراجين في النهاية", "متوسط السرعة", "الكلفة", "نتائج المرحلة", "الفائز", "الثاني", "الثالث", "متمرس", "التصنيف العام بعد المرحلة", "القائد", "الثاني", "الثالث", "التصنيفات الثانوية بعد المرحلة", "النقاط", "الجبل", "سباقات السرعة", "شاب", "تصنيف القتال", "ممتزجة", "سباقات السرعة", "الانتظام", "فريق", "فريق حسب النقاط", "صورة", "أسطورة", "بطاقة", "عرض الاقسام", "توثيق", "سيما كوبي", "سيما بانتاني", "أزوري دي إيطاليا", "فوجا بيناريلو"}, ["en"] = {"Race details", "Race", "Type", "Date", "Dates", "Distance", "Country", "Countries", "Journey origin", "Lieu d'arrivée", "Starting riders", "Arriving riders", "Average speed", "Cost", "Stage results", "Winner", "Second", "Third", "Combative", "General classification after stage", "Leader", "Second", "Third", "Secondary classifications after stage", "Points", "Mountain", "Sprints", "Young", "Combativity", "Combinated", "Intermediate sprints", "Regularity", "Team", "Team by points", "Image", "Legend", "Card", "Sectional view", "Documentation", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Breakaway"}, ["ja"] = {"レース詳細", "レース", "種類", "日付", "日付", "距離", "国", "国", "スタート", "ゴール", "スタート選手", "ゴール選手", "平均速度", "Cost", "ステージ結果", "優勝", "2位", "3位", "Combative", "ステージ後クラス", "1位", "2位", "3位", "ステージ後副次的クラス", "ポイント賞", "山岳賞", "スプリント賞", "新人賞", "敢闘賞", "コンビネーション賞", "Metas volantes", "Regularity", "チーム", "ポイント順位", "画像", "凡例", "カード", "断面図", "ドキュメンテーション", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Breakaway"}, ["ca"] = {"Detalls de la cursa", "Cursa", "Tipus", "Data", "Dates", "Distància", "País", "Països", "Origen de la cursa", "Lloc d’arribada", "Corredors sortits", "Corredors arrivats", "Velocitat mitjana", "Duració", "Resultats de l’etapa", "Guanyador", "Segon", "Tercer", "Combatiu", "Classificació general després de l'etapa", "Líder", "Segon", "Tercer", "Classificacions secundàries després de l'etapa ", "Punts", "Muntanya", "Esprints ", "Jove", "Combativitat", "Combinada", "Metes volants", "Regularitat", "Equip", "Equip per punts", "Image", "Legend", "Card", "Sectional view", "Documentation", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Fuga"}, ["da"] = {"Etapedetaljer", "Rute", "Type", "Dato", "Datoer", "Distance", "Land", "Lande", "Startby", "Målby", "Startende ryttere", "Fuldførende ryttere", "Gennemsnitlig fart", "Omkostninger", "Etaperesultat", "Vinder", "Toer", "Treer", "Mest angrebsivrige", "Samlede stilling efter etapen", "Førende rytter", "Toer", "Treer", "Klassementerne efter etapen", "Point", "Bjerg", "Sprint", "Ungdom", "Mest angrebsivrige", "Kombination", "Indlagt spurt", "Regularitet", "Hold", "Hold efter point", "Billede", "Billedtekst", "Kort", "Profil", "Dokumentation", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Breakaway"}, ["es"] = {"Detalles de la carrera", "Carrera", "Tipo", "Fecha", "Fechas", "Distancia", "País", "Países", "Lugar de inicio", "Lugar de llegada", "Ciclistas participantes", "Ciclistas finalizados", "Velocidad media", "Duración", "Resultados de la etapa", "Ganador", "Segundo", "Tercero", "Combativo", "Clasificación general después de la etapa", "Líder", "Segundo", "Tercero", "Clasificaciones secundarias despúes de la etapa", "Puntos", "Montaña", "Esprint", "Joven", "Combatividad", "Combinada", "Metas volantes", "Regularidad", "Equipo", "Equipo por puntos", "Imagen", "Leyenda", "Card", "Sectional view", "Documentation", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Fuga"}, ["fo"] = {"Smálutir um kapping", "Kapping", "Slag", "Dagur", "Dagar", "Fjarstøða", "Land", "Lond", "Byrjunarbýur", "Málbýur", "Byrjandi súkklarar", "Fullførandi súkklarar", "Miðalferð", "Kostnaður", "Teinaúrslit", "Vinnari", "Annað pláss", "Triðja pláss", "Álopsheiður", "Høvuðskappingin eftir teinin", "Førandi súkklari", "Tveyari", "Tríari", "Aðrar kappingar eftir teinin", "Stig", "Fjøll", "Spurtar", "Ungdóms", "Álopsheiður", "Kombinatiónsheiður", "Metas volantes", "Regularitetur", "Lið", "Lið eftir stigum", "Mynd", "Myndatekstur", "Kort", "Brotpartur", "Skjalfesting", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Breakaway"}, ["lb"] = {"Allgemenges", "Course", "Typ", "Datum", "Datumer", "Distanz", "Land", "Land", "Depart", "Arrivée", "Um Start", "Ukomm", "Vitess-moyenne", "Käschten", "Résultater vun der Etapp", "Gewënner", "Zweeten", "Drëtten", "Combativ", "Generalklassement no der Etapp", "Éischten", "Zweeten", "Drëtten", "Aner Klassementer no der Etapp", "Punkten", "Bierg", "Sprint", "Bescht Jonken", "Super- combativ", "Combiné", "Fligend Etappen", "Regelméissegkeet", "Equipe", "Equipe no Punkten", "Fichier", "Legend", "Kaart", "Profil", "Dokumentatioun", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Breakaway"}, ["no"] = {"Etappedetaljer", "Etappe", "Type", "Dato", "Datoer", "Distanse", "Land", "Land", "Startsted", "Målsted", "Startende ryttere", "Fullførende ryttere", "Snittfart", "Omkostninger", "Etapperesultat", "Vinner", "Andre", "Tredje", "Offensiv", "Sammenlagtstilling etter etappen", "Sammenlagtleder", "Andre", "Tredje", "Klassifisering etter etappen", "Poeng", "Klatring", "Spurt", "Ungdom", "Offensiv", "Kombinasjon", "Innlagte spurter", "Regularitet", "Lag", "Lag (poeng)", "Bilde", "Bildetekst", "Kart", "Profil", "Dokumentasjon", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Brudd"}, ["pt"] = {"Detalhes da corrida", "Corrida", "Tipo", "Data", "Datas", "Distância", "País", "Países", "Origem da viagem", "Local de chegada", "Partida dos ciclistas", "Chegada dos ciclistas", "Velocidade média", "Custo", "Resultados da etapa", "Vencedor", "Segundo", "Terceiro", "Combativo", "Classificação geral após a etapa", "Líder", "Segundo", "Terceiro", "Classificação secundária após a etapa", "Pontos", "Montanha", "Corridas de velocidade", "Jovem", "Combatividade", "Combinados", "Metas volantes", "Regularidade", "Equipe", "Equipe por pontos", "Imagem", "Legenda", "Ficha", "Vista secional", "Documentação", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Fuga"}, ["nl"] = {"Race details", "Wedstrijd", "Soort", "Datum", "Datums", "Afstand", "Land", "Landen", "Start van de etappe", "Aankomstplaats", "Coureurs aan de start", "Coureurs bij de finish", "Gemiddelde snelheid", "Kosten", "Etappeuitslag", "Winnaar", "Tweede", "Derde", "Combative", "Algemeen klassement na de etappe", "Leider", "Tweede", "Derde", "Bijkomende uitslagen na de wedstrijd", "Punten", "Berg", "Sprints", "Jongeren", "Combativity", "Combinatie", "Metas volantes", "Regularity", "Team", "Team by points", "Afbeelding", "Legend", "Card", "Sectional view", "Documentation", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Breakaway"}, ["ru"] = {"Детали гонки", "Гонка", "Тип", "Дата", "Даты", "Дистанция", "Страна", "Страны", "Место старта", "Место финиша", "Стартовало гонщиков", "Финишировало гонщиков", "Средняя скорость", "Затраты", "Результаты этапа", "Победитель", "Второй", "Третий", "Боец", "Генеральная классификация после этапа", "Лидер", "Второй", "Третий", "Классификации после этапа", "Очки", "Горная", "Спринтерская", "Молодёжная", "Бойцовская", "Комбинированная", "Промежуточные финиши", "Регулярность", "Командная по времени", "Командная по очкам", "Изображение", "Описание", "Карта", "Сектора", "Документация", "Cima Coppi", "Cima Pantani", "Azzurri d'Italia", "Breakaway"}, ["ast"] = {"Detalles de la carrera", "Carrera", "Tipu", "Data", "Dates", "Distancia", "País", "Países", "Llugar d'entamu", "Llugar de llegada", "Ciclistes participantes", "Ciclistes acabaos", "Velocidá media", "Duración", "Resultaos de la etapa", "Ganador", "Segundu", "Terceru", "Combativu", "Clasificación xeneral depués de la etapa", "Líder", "Segundu", "Terceru", "Clasificaciones secundaries depués de la etapa", "Puntos", "Monte", "Esprint", "Mozu", "Combatividá", "Combinada", "Metes volantes", "Regularidá", "Equipu", "Equipu per puntos", "Imaxe", "Lleenda", "Card", "Sectional view", "Documentación", "Cume Coppi", "Cume Pantani", "Azzurri d'Italia", "Fuga"} }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default return l10n[x] end

function getSquadTableColumn(x) local l10nDef = { -- note (in the table), note (below the table) ["ar"] = {"المتسابق", "تاريخ الولادة", "الفريق السابق", "ملاحظة", "ملاحظة", "البلد", "قائمة الفريق"}, ["fr"] = {"Cycliste", "Date de naissance", "Équipe précédente", "note", "note", "Pays", "Effectif"}, ["en"] = {"Rider", "Date of birth", "Previous team", "note", "note", "Country", "Team roster"}, ["br"] = {"Reder", "Deiziad genel", "Previous team", "note", "note", "Bro", "Team roster"}, ["ca"] = {"Ciclista", "Data de naixement", "Equip previ", "Nota", "Nota", "Pais", "Team roster"}, ["cs"] = {"Cyklista", "Datum narození", "Previous team", "note", "note", "Stát", "Team roster"}, ["da"] = {"Rytter", "Fødselsdag", "Seneste hold", "note", "note", "Land", "Trup"}, ["de"] = {"Name", "Geburtsdatum", "Vorheriges Team", "Anm.", "Anmerkung", "Land", "Team roster"}, ["eo"] = {"Antaŭnomo Nomo", "Naskiĝtago", "Previous team", "note", "note", "Lando", "Team roster"}, ["es"] = {"Corredor", "Fecha de nacimiento", "Equipo previo", "Nota", "Nota", "Pais", "Integrantes del Equipo"}, ["eu"] = {"Izena", "Jaiotze-data", "Aurreko taldea", "Oharra", "Oharra", "Herrialdea", "Team roster"}, ["fi"] = {"Ajaja", "Syntymäaika", "Edellinen joukkue", "huomio", "huomio", "Maa", "Team roster"}, ["fo"] = {"Súkklari", "Føðingardagur", "Undanfarna lið", "note", "note", "Land", "Team roster"}, ["he"] = {"רוכב", "תאריך לידה", "קבוצה קודמת", "הערה", "הערה", "מדינה", "סגל הקבוצה"}, ["hu"] = {"Név", "Születésnap", "Előző csapat", "jegyzet", "jegyzet", "Ország", "Team roster"}, ["it"] = {"Ciclista", "Data di nascita", "Previous team", "Nota", "Nota", "Paese", "Team roster"}, ["ja"] = {"選手名", "生年月日", "前所属", "脚注", "脚注", "国", "Team roster"}, ["lb"] = {"Coureur", "Gebuertsdatum", "Equipe virdrun", "Nott", "Nott", "Staat", "Team roster"}, ["lv"] = {"Braucējs", "Dzimšanas datums", "Iepriekšējā komanda", "piezīme", "piezīme", "Valsts", "Komandas sastāvs"}, ["mk"] = {"Велосипедист", "Датум на раѓање", "Претходна екипа", "Фуснота", "Фуснота", "Држава", "Team roster"}, ["nl"] = {"Naam", "Geboortedatum", "Vorige ploeg", "noot", "noot", "Nationaliteit", "Renners"}, ["no"] = {"Rytter", "Fødselsdato", "Tidligere lag", "note", "note", "Land", "Ryttere"}, ["pl"] = {"Imię i nazwisko", "Data urodzenia", "Poprzednia grupa", "Przypis", "Przypis", "Państwo", "Team roster"}, ["pt"] = {"Ciclista", "Data de nascimento", "Equipe anterior", "Nota", "Nota", "Pais", "Integrantes da equipe"}, ["ro"] = {"Ciclist", "Data nașterii", "Previous team", "note", "note", "Țară", "Team roster"}, ["ru"] = {"Гонщик", "Дата рождения", "Предыдущая команда", "Примечание", "Примечание", "Страна", "Состав"}, ["sv"] = {"Namn", "Födelsedatum", "Previous team", "not", "not", "Land", "Team roster"}, ["zh"] = {"車手", "出生日期", "Previous team", "脚注", "脚注", "国家", "Team roster"}, ["ast"] = {"Corredor", "Data de nacencia", "Equipu previu", "Nota", "Nota", "País", "Integrantes del Equipu"}, }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default return l10n[x] end

function infobox_translate(x) -- This function permits to translate fields of the infobox, take the line below, give a Wikipedia (ex : mk), and translate all fields. By default, English values are taken. -- l10nDef["//??.wikipedia.org"] = {"RACE DETAILS", "COURSE", "COMPETITION", "COMPETITIONS", "STAGES", "DATE", "DATES", "DISTANCE", "COUNTRY", "COUNTRIES", -- "JOURNEY ORIGIN", "JOURNEY DESTINATION", "TEAMS", "STARTING RIDERS", "ARRIVING RIDERS", "AVERAGE SPEED", "COST", "PALMARES", "WINNER", "SECOND", "THIRD", -- "POINTS", "MOUNTAINS", "SPRINTS", "YOUTH", "COMBATIVITY", "COMBINATION", "TEAM", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentation", -- "METAS VOLANTES", "REGULARIDAD", "TEAM POINTS"} local l10nDef = { ["ar"] = {"تفاصيل السباق", "سلسلة", "منافسة", "مسابقات", "مراحل", "التاريخ", "التواريخ", "المسافات", "البلد", "البلدان", "نقطة البداية", "نقطة النهاية", "الفرق", "عدد المتسابقين في البداية", "عدد المتسابقين في النهاية", "متوسط السرعة", "الكلفة", "المنصة", "الفائز", "الثاني", "الثالث", "حسب النقاط", "تسلق الجبل", "سباقات السرعة", "أفضل شاب", "تصنيف القتال", "مجموعة", "الفريق", "صورة", "تعليق", "خريطة", "مميز 1", "مميز 2", "توثيق", "سباقات السرعة", "انتظام", "نقاط الفريق", "فوجا بيناريلو", "أزوري دي إيطاليا","Rookie"}, ["fr"] = {"Généralités", "Course", "Compétition", "Compétitions", "Étapes", "Date", "Dates", "Distance", "Pays", "Pays", "Lieu de départ", "Lieu d'arrivée", "Équipes", "Partants", "Arrivants", "Vitesse moyenne", "Coût", "Résultats", "Vainqueur", "Deuxième", "Troisième", "Classement par points", "Meilleur grimpeur", "Meilleur sprinteur", "Meilleur jeune", "Super-combatif", "Meilleur au combiné", "Meilleure équipe", "Image", "Légende", "Carte", "Special 1", "Special 2", "Documentation", "Étapes volantes", "Régularité", "Meilleure équipe aux points", "Fuga", "Azzurri d'Italia", "Néophyte"}, ["en"] = {"Race details", "Course", "Competition", "Competitions", "Stages", "Date", "Dates", "Distance", "Country", "Countries", "Journey origin", "Journey destination", "Teams", "Starting riders", "Arriving riders", "Average speed", "Cost", "Palmares", "Winner", "Second", "Third", "Points", "Mountains", "Sprints", "Youth", "Combativity", "Combination", "Team", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentation", "Intermediate sprints", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["ja"] = {"レース詳細", "コース", "競技", "競技", "ステージ", "日付", "日付", "距離", "距離", "国", "スタート", "ゴール", "チーム", "参加人数", "完走人数", "平均速度", "Cost", "結果", "優勝", "準優勝", "3位", "ポイント賞", "山岳賞", "スプリント賞", "新人賞", "敢闘賞", "チーム総合時間賞", "チーム", "画像", "キャプション", "地図", "Special 1", "Special 2", "ドキュメンテーション", "Metas volantes", "Regularidad", "チームポイント", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["br"] = {"Hollegezhioù", "Redadeg", "Kevezadeg", "Kevezadegoù", "Tennadoù", "Deiziad", "Deiziadoù", "Hed", "Bro", "Broioù", "Lec'h loc'hañ", "Lec'h degouezhout", "Skipailhoù", "Loc'herien", "Erruerien", "Tizh keitat", "Koust", "Disoc'hoù", "Gounezer", "Eil", "Trede", "Renkadur a-boentoù", "Kraper gwellañ", "Sprinter gwellañ", "Yaouank gwellañ", "Stourmer meur", "Gwellañ el liesrenkadur", "Skipailh gwellañ", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentation", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["ca"] = {"Detalls de la cursa", "Cursa", "Competició", "Competicions", "Etapes", "Data", "Dates", "Distància", "País", "Països", "Sortida", "Arribada", "Equips", "Inscrits", "Finalitzen", "Velocitat mitjana", "Cost", "Palmarès", "Vencedor", "Segon", "Tercer", "Punts", "Muntanya", "Esprints", "Joves", "Combativitat", "Combinada", "Equip", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentació", "Metas volantes", "Regularidad", "Team points", "Fuga", "Azzurri d'Italia", "Rookie"}, ["cs"] = {"Přehled", "Závod", "Soutěž", "Soutěže", "Počet etap", "Datum", "Datum", "Celková délka", "Země", "Země", "Start", "Cíl", "Týmy", "Běžci", "Příjezdy", "Rychlostní průměr", "Náklady", "Konečné pořadí", "Celkový vítěz", "2. místo", "3. místo", "Vítěz bodovací soutěže", "Nejlepší vrchař", "Nejlepší sprinter", "Nejlepší mladý jezdec", "Nejaktivnější jezdec", "Nejlepší kombinovaná", "Nejlepší družstvo", "Picture", "Caption", "Map", "Special 1", "Special 2", "Dokumentace", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["da"] = {"Løbsdetaljer", "Rute", "Konkurrence", "Konkurrencer", "Etaper", "Dato", "Datoer", "Distance", "Land", "Lande", "Startby", "Målby", "Hold", "Startende ryttere", "Fuldførende ryttere", "Gennemsnitlig fart", "Pris", "Resultater", "Vinder", "Toer", "Treer", "Pointtrøje", "Bjergtrøje", "Sprinttrøje", "Ungdomstrøje", "Mest angrebsivrige", "Kombinationstrøje", "Holdkonkurrence", "Billede", "Billedtekst", "Kort", "Special 1", "Special 2", "Dokumentation", "Indlagt spurt", "Regularitet", "Holdkonkurrence efter point", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["de"] = {"Allgemeines", "Ausgabe", "Rennserie", " Wettbewerb", "Etappen", "Datum", "Datum", "Gesamtlänge", "Austragungsland", "Austragungsländer", "Start", "Ziel", "Teams", "Fahrer am Start", "Fahrer im Ziel", "Durchschnitts&#173;geschwindigkeit", "Kosten", "Ergebnis", "Sieger", "Zweiter", "Dritter", "Punktewertung", "Bergwertung", "Sprintwertung", "Nachwuchswertung", "Kämpferischster Fahrer", "Kombinationswertung", "Teamwertung", "Bild", "Beschriftung", "Karte", "Special 1", "Special 2", "Dokumentation", "Metas volantes", "Regularidad", "Teamwertung (Punkte)", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["eo"] = {"Gxeneralajxo", "Bicikla konkurso", "Konkuro", "Konkuroj", "Etapoj", "Dato", "Datoj", "Longo", "Lando", "Landoj", "Komencloko", "Alvenloko", "Teamoj", "Startantoj", "Alvenantoj", "Averagxa rapido", "Kosto", "Rezultoj", "Venkinto", "Dua pozicio", "Tria pozicio", "Klasifiko laux poentoj", "Plej bona grimpanto", "Plej bona sprinto", "Plej bona juno", "Superbatalema", "Plej bona por kombino", "Plej bona teamo", "Picture", "Caption", "Map", "Special 1", "Special 2", "Dokumentado", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["es"] = {"Detalles", "Carrera", "Competición", "Competiciones", "Etapas", "Fecha", "Fechas", "Distancia total", "País", "Países", "Lugar de inicio", "Lugar de llegada", "Equipos", "Ciclistas participantes", "Ciclistas finalizados", "Velocidad media", "Costo", "Clasificación final", "Ganador", "Segundo", "Tercero", "Puntos", "Montaña", "Metas volantes", "Jóvenes", "Combatividad", "Combinada", "Equipo", "Imagen", "Leyenda", "Mapa", "Especial 1", "Especial 2", "Documentación", "Metas volantes", "Regularidad", "Team points", "Fuga", "Azzurri d'Italia", "Novatos"}, ["eu"] = {"Lasterketaren xehetasunak", "Ibilbidea", "Lehiaketa", "Lehiaketak", "Etapak", "Data", "Datak", "Distantzia", "Herrialdea", "Herrialdeak", "Jardunaldiko abiapuntua", "Jardunaldiko helmuga", "Taldeak", "Abiatutako txirrindulariak", "Iritsitako txirrindulariak", "Batez besteko abiadura", "Kostua", "Azken sailkapena", "Irabazlea", "Bigarrena", "Hirugarrena", "Puntuak", "Mendiak", "Esprintak", "Gazteak", "Saiatuena", "Konbinatua", "Taldeak", "Picture", "Caption", "Map", "Special 1", "Special 2", "Dokumentazioa", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["fi"] = {"Kilpailun tiedot", "Nimi", "Kilpailu", "Kilpailut", "Etapit", "Päivä", "Päivät", "Matka", "Maa", "Maat", "Lähtöpaikka", "Saapumispaikka", "Joukkueet", "Osallistuneet pyöräilijät", "Maaliin saapuneet pyöräilijät", "Keskinopeus", "Kustannukset", "Lopputilanne", "Voittaja", "Toinen", "Kolmas", "Pistekilpailu", "Mäkikirikilpailu", "Sprintit", "Nuoret", "Yritteliäin", "Yhdistelmä", "Joukkue", "Kuva", "Kuvateksti", "Kartta", "Special 1", "Special 2", "Ohjesivu", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["fo"] = {"Smálutir", "Leið", "Kapping", "Kappingar", "Teinar", "Dagfesting", "Dagfestingar", "Strekki", "Land", "Lond", "Byrjunarbýur", "Málbýur", "Lið", "Byrjandi súkklarar", "Fullførandi súkklarar", "Miðalferð", "Kostnaður", "Palmares", "Vinnari", "Nr. 2", "Nr. 3", "Stig", "Fjøll", "Spurtar", "Ungdómur", "Mest álopssinnaður", "Kombinatión", "Lið", "Picture", "Caption", "Map", "Special 1", "Special 2", "Dokumentation", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["lb"] = {"Detailer", "Course", "Kompetitioun", "Kompetitiounen", "Etappen", "Datum", "Datumer", "Distanz", "Land", "Länner", "Depart", "Arrivée", "Equippen", "Um Depart", "Ukomm", "Vitess-Moyenne", "Käschten", "Palmarès", "Gewënner", "Zweeten", "Drëtten", "Beschte Sprinter", "Biergpräis", "Sprinter", "Beschte Jonken", "Kombativitéit", "Kombinatioun", "Equipe", "Picture", "Caption", "Map", "Special 1", "Special 2", "Dokumentatioun", "Étapes volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["lv"] = {"Sacensību informācija", "Sacensības", "Kategorija", "Sacensības", "Posmi", "Datums", "Datumi", "Distance", "Valsts", "Valstis", "Starts", "Finišs", "Komandas", "Braucēji startā", "Braucēji finišā", "Vidējais ātrums", "Izmaksas", "Rezultāti", "Uzvarētājs", "Otrais", "Trešais", "Punkti", "Kalnu karalis", "Sprints", "Jaunais braucējs", "Cīnītājs", "Kombinācija", "Komanda", "Atēls", "Paraksts", "Karte", "Papildinformācija 1", "Papildinformācija 2", "Dokumentācija", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["mk"] = {"Детали за трката", "Издание", "Натпреварување", "Натпреварувања", "Етапи", "Датум", "Датуми", "Растојание", "Држава", "Држави", "Поаѓалиште", "Одредиште", "Екипи", "Возачи на почеток", "Возачи на крај", "Просечна брзина", "Трошоци", "Добитници на наградите", "Победник", "Второпласиран", "Третопласиран", "Бодовен", "Планински", "Спринтерски", "Младински", "Борбеност", "Комбиниран", "Екипен", "слика", "опис", "местоположбена карта", "Special 1", "Special 2", "Документација", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["nl"] = {"Wedstrijddetails", "Koers", "Wedstrijd", "Wedstrijden", "Etappes", "Datum", "Datums", "Afstand", "Land", "Landen", "Startplaats", "Finishplaats", "Teams", "Aantal coureurs aan de start", "Aantal coureurs bij de aankomst", "Gemiddelde snelheid", "Kosten", "Palmares", "Winnaar", "Tweede", "Derde", "Punten", "Bergen", "Sprints", "Jeugd", "Aanvalslust", "Combinatie", "Team", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentatie", "Metas volantes", "Regularidad", "Teampunten", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["no"] = {"Detaljer", "Ritt", "Konkurranse", "Konkurranser", "Etapper", "Dato", "Datoer", "Distanse", "Land", "Land", "Startsted", "Målsted", "Lag", "Startende ryttere", "Fullførende ryttere", "Gjennomsnittsfart", "Kostnad", "Resultater", "Vinner", "2. plass", "3. plass", "Poeng", "Klatring", "Spurt", "Ungdom", "Mest offensive", "Kombinasjon", "Lagkonkurranse", "Bilde", "Bildetekst", "Kart", "Spesial 1", "Spesial 2", "Dokumentasjon", "Innlagte spurter", "Regularitet", "Lagkonkurranse (poeng)", "Brudd", "Azzurri d'Italia", "Rookie"}, ["pl"] = {"Wyrażenia ogólne", "Wyścig", "Konkurencja", "Konkursy", "Etapów", "Data", "Daty", "Dystans", "Państwo", "Państwy", "Odejście", "Przyjazd", "Zespoły", "Zgłoszenia", "Ukończyło wyścig", "Średnia prędkość", "Koszt", "Podium", "Pierwsze miejsce", "Drugie miejsce", "Trzecie miejsce", "Punktowa", "Górska", "Sprinterska", "Młodzieżowa", "Najaktywniejszych", "Kombinowana", "Drużynowa", "Picture", "Caption", "Map", "Special 1", "Special 2", "Dokumentacja", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["pt"] = {"Detalhes", "Corrida", "Válida para", "Válida para", "Etapas", "Data", "Data", "Distância", "País", "Países", "Partida", "Chegada", "Nº de equipes", "Ciclistas que iniciaram", "Ciclistas que finalizaram", "Velocidade média", "Custo", "Classificação final", "Vencedor", "Segundo", "Terceiro", "Prêmio por pontos", "Prêmio de montanha", "Sprints", "Juventude", "Disputa", "Combinação", "Equipes", "Imagem", "Legenda", "Mapa", "Special 1", "Special 2", "Documentação", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["ro"] = {"Detalii cursă", "Cursă", "Competiție", "Competiții", "Etape", "Dată", "Date", "Distanță", "Țară", "Țări", "Start", "Sosire", "Echipe", "Cicliști la start", "Cicliști la sosire", "Viteză medie", "Cost", "Palmares", "Câștigător", "Al doilea", "Al treilea", "Clasament pe puncte", "Cel mai bun cățărător", "Cel mai bun sprinter", "Cel mai bun tânăr", "Combativitate", "Combinat", "Echipă", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentație", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["ru"] = {"Детали гонки", "Маршрут", "Соревнование", "Соревнования", "Этапы", "Дата", "Даты", "Дистанция", "Страна", "Страны", "Место старта", "Место финиша", "Команды", "Стартовало гонщиков", "Финишировало гонщиков", "Средняя скорость", "Призовые", "Призёры", "Победитель", "Второй", "Третий", "Очковая", "Горная", "Спринтерская", "Молодёжная", "Бойцовская", "Комбинированная", "Командная по времени", "Вид", "Описание", "Карта", "Сектор 1", "Сектор 2", "Документация", "Промежуточные финиши", "Регулярность", "Командная по очкам", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["sv"] = {"Race details", "Course", "Competition", "Competitions", "Stages", "Date", "Dates", "Distance", "Country", "Countries", "Journey origin", "Journey destination", "Teams", "Starting riders", "Arriving riders", "Average speed", "Cost", "Palmares", "Winner", "Second", "Third", "Points", "Mountains", "Sprints", "Youth", "Combativity", "Combination", "Team", "Picture", "Caption", "Map", "Special 1", "Special 2", "Documentation", "Metas volantes", "Regularidad", "Team points", "Breakaway", "Azzurri d'Italia", "Rookie"}, ["ast"] = {"Detalles", "Carrera", "Competición", "Competiciones", "Etapes", "Data", "Dates", "Distancia total", "País", "Países", "Llugar d'entamu", "Llugar de llegada", "Equipos", "Ciclistes participantes", "Ciclistes acabaos", "Velocidá media", "Costu", "Clasificación final", "Ganador", "Segundu", "Terceru", "Puntos", "Monte", "Metes volantes", "Mozos", "Combatividá", "Combinada", "Equipu", "Imaxe", "Lleenda", "Mapa", "Especial 1", "Especial 2", "Documentación", "Metes volantes", "Regularidá", "Team points", "Fuga", "Azzurri d'Italia", "Rookie"} }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default return l10n[x] end

function unit(x) local l10nDef = { ["ar"] = {"", " س ", " دقيقة ", " ث", ' كم/س', " نقطة", " نقطة"}, ["fr"] = {"en", " h ", " min ", " s", ' km/h', " pt", " pts"}, ["br"] = {"", "e ", "' ", '"', ' km/h', " pt", " pts"},		["da"] = {"", "t ", "' ", '"', ' km/t', " point", " point"}, ["de"] = {"", " h ", " min ", " s", ' km/h', " P.", " P."}, ["en"] = {"", "h ", "' ", '"', ' km/h', " pt", " pts"},		["es"] = {"", " h ", " min ", " s", ' km/h', " pt  ", " pts"},		["eu"] = {"", " h ", " min ", " s", ' km/h', " pt", " pt"},		["fo"] = {"", "t ", "' ", '"', ' km/t', " pt", " pts"}, ["fi"] = {"", ".", ".", "", ' km/h', " pt", " pts"}, ["hu"] = {"", " óra ", ":", "", ' km/h', " pt", " pts"}, ["it"] = {"", "h", "'", '"', ' km/h', " pt", " pts"},		["ja"] = {"", "時間", "分", '秒', 'km/h', "ポイント", "ポイント"},		["lb"] = {"", " h ", " min ", " s", ' km/h', " pt", " pts"},		["mk"] = {"", "ч ", "' ", "", ' км/ч', " pt", " pts"},		["nl"] = {"", "u", "'", '"', ' km/u', " pt", " pts"}, ["no"] = {"", "t ", "' ", '"', ' km/t', " poeng", " poeng"},		["pt"] = {"", "h", "m", "s", ' km/h', " pt", " pts"},		["ru"] = {"", "ч ", "' ", "", ' км/ч', " очко", " очков"},		["ast"] = {"", " h ", " min ", " s", ' km/h', " pt ", " pts"}	}	local l10n = l10nDef[wiki]	if not l10n then l10n = l10nDef["en"] end -- default for lv,cs,en,ca,ro,pt,pl,sv	return l10n[x] end

function func_month(x) local l10nDef = { ["ar"] = {"يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"}, ["fr"] = {"janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."}, ["en"] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}, ["be"] = {"studz.", "liut.", "sak.", "kras.", "mai.", "cherv.", "lip.", "zhniven'", "veras", "kastr.", "list.", "snezh."}, ["bg"] = {"ian.", "fevr.", "mart", "april", "mai", "iuni", "iuli", "avg.", "sept.", "okt.", "noem.", "dek."}, ["br"] = {"Genver", "C'hwevrer", "Meurzh", "Ebrel", "Mae", "Mezheven", "Gouere", "Eost", "Gwengolo", "Here", "Du", "Kerzu"}, ["ca"] = {"gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"}, ["cs"] = {"led.", "ún.", "bře.", "dub.", "kvě.", "čvn.", "čvc.", "srp.", "září.", "říj.", "list.", "pros."}, ["da"] = {"jan.", "febr.", "marts", "april", "maj", "juni", "juli", "aug.", "sept.", "okt.", "nov.", "dec."}, ["de"] = {"Jan.", "Feb.", "März", "Apr.", "Mai", "Juni", "Juli", "Aug.", "Sept.", "Okt.", "Nov.", "Dez."}, ["eo"] = {"janu.", "febr.", "marto", "apr.", "majo", "jun.", "jul.", "auxg.", "sept.", "okt.", "nov.", "dec."}, ["es"] = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"}, ["et"] = {"jaan.", "veebr.", "märts", "apr.", "mai", "juuni", "juuli", "aug.", "sept.", "okt.", "nov.", "dets."}, ["eu"] = {"urtarrila", "otsaila", "martxoa", "apirila", "maiatza", "ekaina", "uztaila", "abuztua", "iraila", "urria", "azaroa", "abendua"}, ["fi"] = {"tammikuuta", "helmikuuta", "maaliskuuta", "huhtikuuta", "toukokuuta", "kesäkuuta", "heinäkuuta", "elokuuta", "syyskuuta", "lokakuuta", "marraskuuta", "joulukuuta"}, ["fo"] = {"januar", "februar", "mars", "apríl", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"}, ["hu"] = {"január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"}, ["id"] = {"Djan.", "Peb.", "Mrt.", "Apr.", "Mai", "Djuni", "Djuli", "Ag.", "Sept.", "Okt.", "Nop.", "Des."}, ["it"] = {"genn.", "febbr.", "mar.", "apr.", "magg.", "giugno", "luglio", "ag.", "sett.", "ott.", "nov.", "dic."}, ["ja"] = {"1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"}, ["la"] = {"Ian.", "Febr.", "Mart.", "Apr.", "Mai.", "Iun.", "Iul.", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."}, ["lb"] = {"Januar", "Februar", "Mäerz", "Abrëll", "Mee", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}, ["lt"] = {"saus.", "vas.", "kovas", "bal.", "geg.", "birz", "liepa", "rugp.", "rugs.", "spalis", "lapkr.", "gr."}, ["lv"] = {"janvāris", "februāris", "marts", "aprīlis", "maijs", "jūnijs", "jūlijs", "augusts", "septembris", "oktobris", "novembris", "decembris"}, ["mk"] = {"јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември"}, ["ms"] = {"Jan.", "Feb.", "Mac", "Apr.", "Mei", "Jun", "Julai", "Og", "Sept.", "Okt.", "Nov.", "Dis."}, ["no"] = {"jan.", "feb.", "mar.", "apr.", "mai", "jun.", "jul.", "aug.", "sep.", "okt.", "nov.", "des."}, ["nl"] = {"jan.", "feb.", "maart", "apr.", "mei", "juni", "juli", "aug.", "sept.", "okt.", "nov.", "dec."}, ["pl"] = {"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"}, ["pt"] = {"jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"}, ["ro"] = {"Ian.", "Feb.", "Mar.", "Apr.", "Mai", "Iun.", "Iul.", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."}, ["ru"] = {"января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"}, ["sh"] = {"sijec.", "velj.", "ozuj.", "trav.", "svib.", "lip.", "srp.", "kol.", "ruj.", "list.", "stud.", "pros."}, ["sk"] = {"jan.", "feb.", "mar.", "apr.", "máj", "jún.", "júl.", "aug.", "sept.", "okt.", "nov.", "dec."}, ["sl"] = {"jan.", "feb.", "mar.", "apr.", "maj", "jun.", "jul.", "avg.", "sept.", "okt.", "nov.", "dec."}, ["sv"] = {"jan.", "febr.", "mars", "april", "maj", "juni", "juli", "aug.", "sept.", "okt.", "nov.", "dec."}, ["zh"] = {"1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"}, ["ast"] = {"xineru", "febreru", "marzu", "abril", "mayu", "xunu", "xunetu", "agostu", "setiembre", "ochobre", "payares", "avientu"}, }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default return l10n[x] end

function headoftable(x) -- En-tête du tableau listant les étapes local l10nDef={ ["ar"] = {"المرحلة", "التاريخ", "الدورة", "المسافة (كم)", "الفائز بالمرحلة", "القائد العام"}, ["fr"] = {"Étape", "Date", "Villes étapes", "Distance (km)", "Vainqueur d'étape", "Leader du classement général"}, ["en"] = {"Stage", "Date", "Course", "Distance - km (mi)", "Stage winner", "Overall leader"}, ["br"] = {"Tennad", "Deiziad", "Kêr loc'hañ ha kêr degouezhout", "Hed (km)", "Trec'hour", "E penn ar renkamant hollek"}, ["ca"] = {"Etapa", "Data", "Ciutats d'etapa", "Distància (km)", "Vencedor de l'etapa", "Líder de la general"}, ["cs"] = {"Etapa", "Datum", "Trasa", "Vzdálenost (km)", "Vítěz", "Průběžný lídr"}, ["da"] = {"Etape", "Dato", "Start – Mål", "Afstand (km)", "Etapevinder", "Førende rytter"}, ["de"] = {"Etappe", "Datum", "Etappenorte", "Länge (km)", "Etappen&shy;sieger", "Gesamt&shy;führender"}, ["eo"] = {"Etapo", "Dato", "Etapa urbo", "Longo (km)", "Venkinto de la etapo", "Estro de la gxeneralo klasado"}, ["es"] = {"Etapa", "Fecha", "Recorrido", "Distancia (km)", "Ganador", "Líder"}, ["eu"] = {"Etapa", "Data", "Ibilbidea", "Distantzia (km)", "Irabazlea", "Liderra"}, ["fi"] = {"Etappi", "Päivä", "Reitti", "Pituus (km)", "Voittaja", "Kokonaiskilpailun johtaja"}, ["fo"] = {"Teinur", "Dagur", "Byrjan – Mál", "Vegalongd (km)", "Teina&shy;vinnari", "Gula troyggjan"}, ["hu"] = {"Szakasz", "Időpont", "Végpontok", "Hossz (km)", "Szakasz&shy;győztes", "Általános vezető"}, ["it"] = {"Tappa", "Data", "Percorso", "Distanza (km)", "Vincitore di tappa", "Leader cl. generale"}, ["ja"] = {"ステージ", "開催日", "コース", "距離 (km)", "ステージ勝者", "全体リーダー"}, ["la"] = {"Statio", "Dies", "Iter", "Distantia (km)", "Victor", "Altiore princeps"}, ["lb"] = {"Etapp", "Datum", "Etappestied", "Längt (km)", "Gewënner", "General&shy;klassement"}, ["lv"] = {"Posms", "Datums", "Maršruts", "Posma garums (km)", "Uzvarētājs", "Kopvērtējuma līderis"}, ["mk"] = {"Етапа", "Датум", "Тек", "Растојание (км)", "Победник", "Cевкупен лидер"}, ["nl"] = {"Etappe", "Datum", "Start – Finish", "Afstand (km)", "Winnaar", "Klassements&shy;leider"}, ["no"] = {"Etappe", "Dato", "Start – Målgang", "Distanse (km)", "Etappe&shy;vinner", "Sammenlagt&shy;leder"}, ["pl"] = {"Etap", "Data", "Start – Meta", "Dystans (km)", "Zwycięzca etapu", "Lider"}, ["pt"] = {"Etapa", "Data", "Percurso", "Distância (km)", "Vencedor", "Líder geral"}, ["ro"] = {"Etapa", "Dată", "Start – Sosire", "Distanță (km)", "Câștigător", "Liderul global"}, ["ru"] = {"Этап", "Дата", "Маршрут", "Длина (км)", "Победитель", "Лидер генеральной классификации"}, ["sk"] = {"Etapa", "Dátum", "Trasa", "Vzdialenosť (km)", "Víťaz", "Priebežný líder"}, ["sv"] = {"Etapp", "Datum", "Start – mål", "Distans (km)", "Skede vinnare", "Övergripande ledare"}, ["ast"] = {"Etapa", "Data", "Percorríu", "Distancia (km)", "Ganador", "Líder"}, }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default return l10n[x] end

function headoftableII(x) -- En-têtes des tableaux générant les classements local l10nDef = { ["ar"] = {"العداء", "البلد", "الفريق", "الوقت", "إزاحة الوقت", "السرعة", "النقاط", "تصنيف الفرق ضد الساعة", "التصنيف العام", "تصنيف النقاط", "تصنيف الجبال", "تصنيف أفضل عداء", "تصنيف أفضل شاب", "تصنيف الفرق حسب الوقت", "ترتيب الفرق حسب النقاط", "تصنيف المجموعة", "تصنيف أفضل مقاتل", "التصنيف تحت 23"}, ["fr"] = {"Coureur", "Pays", "Équipe", "Temps", "Écart de temps", "Vitesse moy.", "Points", "Classement de l'étape", "Classement général", "Classement par points", "Classement de la montagne", "Classement des sprints", "Classement du meilleur jeune", "Classement par équipes", "Classement par équipes aux points", "Classement du combiné", "Classement de la combativité", "Classement du meilleur jeune"}, ["en"] = {"Rider", "Country", "Team", "Time", "Time Gap", "Speed", "Points", "Stage classification", "General classification", "Points classification", "Mountains classification", "Sprints classification", "Best young classification", "Teams classification", "Points classification for teams", "Combination classification", "Combative classification", "U23 classification"}, ["br"] = {"Reder", "Bro", "Skipailh", "Amzer", "Time Gap", "Speed", "Poentoù", "Renkadur an tennad", "Renkadur hollek", "Renkadur a-boentoù", "Renkadur ar menez", "Renkadur ar sprintoù", "Renkadur ar yaouank gwellañ", "Renkadur a-skipailh", "Renkadur a-skipailh", "Combination classification", "Combative classification", "U23 classification"}, ["ca"] = {"Corredor", "País", "Equip", "Temps", "Time Gap", "Velocitat", "Punts", "Classificació de l'etapa", "Classificació general", "Classificació per punts", "Classificació de la muntanya", "Classificació dels esprints", "Classificació del millor jove", "Classificació per equips", "Classificació per equips", "Classificació de la combinada", "Classificació de la combativitat", "Classificació sub-23"}, ["da"] = {"Rytter", "Land", "Hold", "Tid", "Tidsforskel", "Gns. fart", "Point", "Etaperesultat", "Samlede stilling", "Pointkonkurrence", "Bjergkonkurrence", "Sprintkonkurrence", "Ungdomskonkurrence", "Holdkonkurrence", "Holdkonkurrence efter point", "Kombinationskonkurrence", "Mest angrebsivrige rytter", "U23-konkurrence"}, ["de"] = {"Fahrer", "Land", "Team", "Zeit", "Zeitabstand", "Geschw.", "Punkte", "Etappenergebnis", "Gesamtwertung", "Punktewertung", "Bergwertung", "Sprintwertung", "Nachwuchswertung", "Mannschaftswertung", "Mannschaftswertung", "Combination classification", "Combative classification", "U23 classification"}, ["eo"] = {"Kuranto", "Lando", "Teamo", "Tempo", "Time Gap", "Rapido", "Poentoj", "Etapa klasifiko", "Gxenerala klasifiko", "Klasifiko laux poentoj", "Klasifiko por la montaro", "Klasifiko por la sprintoj", "Klasifiko de la plej bona juno", "Klasifiko po teamo", "Klasifiko po teamo", "Combination classification", "Combative classification", "U23 classification"}, ["es"] = {"Ciclista", "País", "Equipo", "Tiempo", "Intervalo de tiempo", "Velocidad media", "Puntos", "Clasificación de la etapa", "Clasificación general", "Clasificación por puntos", "Clasificación de la montaña", "Clasificación de las metas volantes", "Clasificación del mejor joven", "Clasificación por equipos", "Clasificación por equipos", "Clasificación de la combinada", "Clasificación de la combatividad", "Clasificación sub-23"}, ["eu"] = {"Txirrindularia", "Herrialdea", "Taldea", "Denbora", "Time Gap", "Speed", "Puntua", "Etapako sailkapena", "Sailkapen orokorra", "Puntukako sailkapena", "Mendiko sailkapena", "Esprinetako sailkapena", "Gazte onenaren sailkapena", "Taldekako sailkapena", "Taldekako sailkapena", "Combination classification", "Combative classification", "U23 classification"}, ["fi"] = {"Pyöräilijä", "Maa", "Joukkue", "Aika", "Aikaero", "Nopeus", "Pisteet", "Etapin tulokset", "Kokonaistilanne", "Pistekilpailu", "Vuoristokilpailu", "Sprinttikilpailu", "Nuorten kilpailu", "Joukkuekilpailu", "Joukkuekilpailu", "Combination classification", "Combative classification", "U23 classification"}, ["fo"] = {"Súkklari", "Land", "Lið", "Tíð", "Time Gap", "Ferð", "Stig", "Teinaplasering", "Samlað plasering", "Stigkappingin", "Fjallakappingin", "Spurtkappingin", "Ungdómskappingin", "Liðkappingin", "Liðkappingin", "Kombinatiónsheiðurkappingin", "Combative classification", "U23 classification"}, ["hu"] = {"Versenyző", "Ország", "Équipe", "Idő", "Időkülönbség", "Átlagsebesség", "Pont", "Szakasz verseny", "Összetett verseny", "Pontverseny", "Hegyi pontverseny", "Gyorsulverseny", "Fiatalok versenye", "Csapatverseny", "Csapatverseny", "Combination classification", "Combative classification", "U23 classification"}, ["lb"] = {"Coureur", "Land", "Equipe", "Zäit", "Time Gap", "Vitesse", "Punkten", "Etappeklassement", "Generalklassement", "Klassement no Punkten", "Biergpräis", "Sprintklassement", "Beschte Jonken", "Equippeklassement", "Equippeklassement", "Combinéklassement", "Combative classification", "U23 classification"}, ["lv"] = {"Braucējs", "Valsts", "Komanda", "Laiks", "laika atstarpe", "Ātrums", "Punkti", "Posma rezultāti", "Kopvērtējums", "Punktu klasifikācija", "Kalnu klasifikācija", "Sprinta klasifikācija", "Jauno braucēju klasifikācija", "Komandu klasifikācija", "Komandu klasifikācija", "Kombinācijas klasifikācija", "Cīnītāja klasifikācija", "U23 klasifikācija"}, ["mk"] = {"Возач", "Земја", "Екипа", "Време", "Разлика", "Брзина", "Бодови", "Етапен резултат", "Генерален пласман", "Бодовен пласман", "Планински пласман", "Спринтерски пласман", "Пласман за млад возач", "Екипен пласман", "Екипен пласман", "Combination classification", "Combative classification", "U23 classification"}, ["no"] = {"Rytter", "Land", "Lag", "Tid", "Tidsforskjell", "Fart", "Poeng", "Etappeplassering", "Sammenlagtplassering", "Poengkonkurranse", "Klatrekonkurranse", "Spurtkonkurranse", "Ungdomskonkurranse", "Lagkonkurranse", "Lagkonkurranse (poeng)", "Kombinasjonkonkurranse", "Mest offensive rytter", "U23-konkurranse"}, ["nl"] = {"Renner", "Land", "Ploeg", "Tijd", "Tijdsverschil", "Snelheid", "Punten", "Etappeklassement", "Algemeen Klassement", "Puntenklassement", "Bergklassement", "Sprintklassement", "Jongerenklassement", "Ploegenklassement", "Ploegenklassement", "Combinatieklassement", "Combative classification", "U23 classification"}, ["pt"] = {"Ciclista", "País", "Equipe", "Tempo", "Intervalo de tempo", "Rapidez", "Pontos", "Classificação por etapas", "Classificação geral", "Classificação por pontos", "Classificação da montanha", "Classificação por velocidade", "Classificação dos jovens", "Classificação por equipes", "Classificação por equipes", "Classificação de combinados", "Classificação da combatividade", "Classificação U23"}, ["ro"] = {"Ciclist", "Țară", "Echipă", "Timp", "Time Gap", "Viteză", "Puncte", "Clasamentul etapei", "Clasament general", "Clasament pe puncte", "Clasament cățărători", "Clasament sprinteri", "Clasamentul celui mai bun tânăr", "Clasament pe echipe", "Clasament pe echipe", "Combination classification", "Combative classification", "U23 classification"}, ["ru"] = {"Гонщик", "Страна", "Команда", "Время", "Отставание", "Скорость", "Очки", "Результаты этапа", "Генеральная классификация", "Очковая классификация", "Горная классификация", "Спринтерская классификация", "Молодёжная классификация", "Командная классификация по времени", "Командная классификация по очкам", "Комбинированная классификация", "Бойцовская калссификация", "Классификация U23"}, ["ast"] = {"Ciclista", "País", "Equipu", "Tiempu", "Intervalu de tiempu", "Velocidá media", "Puntos", "Clasificación de la etapa", "Clasificación xeneral", "Clasificación per puntos", "Clasificación de monte", "Clasificación de les metes volantes", "Clasificación del meyor mozu", "Clasificación per equipos", "Clasificación per equipos", "Clasificación de la combinada", "Clasificación de la combatividá", "Clasificación sub-23"}, }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default return l10n[x] end

function headoftableIII(x) -- En-tête du tableau listant les équipes participantes (P1923) local l10nDef = { ["ar"] = {"اسم الفريق", "البلد", "الرمز", "فريق عالمي", "فرق عالمية", "فريق برو", "فرق برو", "فريق قاري محترف", "فرق قارية محترفة", "فريق قاري", "فرق قارية", "فريق وطني", "فرق وطنية", "فريق إقليمي ونادي", "فرق إقليمية وأندية", "فريق دراجات محترف", "فرق دراجات محترفة", "فريق هواة دراجات", "فرق هواة دراجات", "مجموعة رياضية أولى", "مجموعات رياضية أولى", "مجموعة رياضية ثانية", "مجموعات رياضية ثانية", "مجموعة رياضية ثالثة", "مجموعات رياضية ثالثة", "فريق مختلط", "فرق مختلطة", "فريق إناث محترف", "فرق إناث محترفة", "فريق هواة دراجات إناث", "فرق هواة دراجات إناث"}, ["fr"] = {"Nom de l'équipe", "Pays", "Code", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Équipe continentale professionnelle", "Équipes continentales professionnelles", "Équipe continentale", "Équipes continentales", "Équipe nationale", "Équipes nationales", "Équipe régionale et de club", "Équipes régionales et de clubs", "Équipe cycliste professionnelle", "Équipes cyclistes professionnelles", "Équipe cycliste amateur", "Équipes cyclistes amateurs", "Groupe sportif I", "Groupes sportifs I", "Groupe sportif II", "Groupes sportifs II", "Groupe sportif III", "Groupes sportifs III", "Équipe mixte", "Équipes mixtes", "Équipe féminine professionnelle", "Équipes féminines professionnelles", "Équipe cycliste amateur féminine", "Équipe cycliste amateur féminines"}, ["en"] = {"Team name", "Country", "Code", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professional continental team", "Professional continental teams", "Continental team", "Continental teams", "National team", "National teams", "Regional and club team", "Regional and club teams", "Professional cycling team", "Professional cycling teams", "Amateur cycling team", "Amateur cycling teams", "Trade Team I", "Trade Teams I", "Trade Team II", "Trade Teams II", "Trade Team III", "Trade Teams III", "Mixed team", "Mixed teams", "Professional woman team", "Professional women teams", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["ja"] = {"チーム名", "国", "コード", "ワールドチーム", "ワールドチーム", "プロチーム", "プロチーム", "プロフェッショナルコンチネンタルチーム", "プロフェッショナルコンチネンタルチーム", "コンチネンタルチーム", "コンチネンタルチーム", "ナショナルチーム", "ナショナルチーム", "地域・クラブチーム", "地域・クラブチーム", "プロ自転車チーム", "プロ自転車チーム", "アマ自転車チーム", "アマ自転車チーム", "Groupe sportif I", "Groupes sportifs I", "Groupe sportif II", "Groupes sportifs II", "Groupe sportif III", "Groupes sportifs III", "Mixt team", "Mixt teams", "プロ女子チーム", "プロ女子チーム", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["br"] = {"Anv skipailh", "Bro", "Kod", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Skipailh kevandir a-vicher", "Skipailhoù kevandir a-vicher", "Skipailh kevandir", "Skipailhoù kevandir", "Skipailh bro", "Skipailhoù bro", "Skipailh rannvro ha klub", "Skipailhoù rannvro ha club", "Skipailh marc'h-houarn a-vicher", "Skipailhoù marc'h-houarn a-vicher", "Skipailh marc'h-houarn amatour", "Skipailhoù marc'h-houarn amatour", "Strollad sport I", "Strolladoù sport I", "Strollad sport II", "Strolladoù sport II", "Strollad sport III", "Strolladoù sport III", "Skipailh kemmesk", "Skipailhoù kemmesk", "Skipailh merc'hed", "Skipailhoù merc'hed", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["ca"] = {"Nom de l'equip", "País", "Codi", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Equip continental professional", "Equips continentals professionals", "Equip continental", "Equips continentals", "Equip nacional", "Equips nacionals", "Equip regional i de club", "Equips regionals i de clubs", "Equip ciclista professional", "Equips ciclistes professionals", "Equip ciclista amateur", "Equips ciclistes amateurs", "Grup esportiu I", "Grups esportius I", "Grup esportiu II", "Grups esportius II", "Grup esportiu III", "Grups esportius III", "Equip mixt", "Equips mixtos", "Equip femení", "Equips femenins", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["da"] = {"Holdnavn", "Land", "Kode", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professionelt kontinentalhold", "Professionelle kontinentalhold", "Kontinentalhold", "Kontinentalhold", "Landshold", "Landshold", "Regional- og klubhold", "Regional- og klubhold", "Prohold", "Prohold", "Amatørhold", "Amatørhold", "Sportsgruppe I", "Sportsgruppe I", "Sportsgruppe II", "Sportsgruppe II", "Sportsgruppe III", "Sportsgruppe III", "Mix-hold", "Mix-hold", "Kvindehold", "Kvindehold", "Amatørkvindehold", "Amatørkvindehold"}, ["de"] = {"Team", "Land", "Code", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professional Continental Team", "Professional Continental Teams", "Continental Team", "Continental Teams", "Nationalmannschaft", "Nationalmannschaften", "Regionale Teams und Vereine", "Regionale Teams und Vereine", "Profi-Radsportteam", "Profi-Radsportteams", "Amateurmannschaft", "Amateurmannschaften", "Groupe Sortif I", "Groupes Sportifs I", "Groupe Sportif II", "Groupes Sportifs II", "Groupe Sportif III", "Groupes Sportifs III", "Mixed Team", "Mixed Teams", "UCI Women's Team", "UCI Women's Teams", "Sonstiges Frauenteam", "Sonstige Frauenteams"}, ["eo"] = {"Nomo de la teamo", "Lando", "Kodo", "Monda teamo", "Mondaj teamoj", "ProTeamo", "ProTeamoj", "Profesiista kontinenta teamo", "Profesiistaj kontinentaj teamoj", "Kontinenta teamo", "Kontinentaj teamoj", "Nacia teamo", "Naciaj teamoj", "Regiona aux kluba teamo", "Regionaj aux klubaj teamoj", "Profesiista bicikla teamo", "Profesiistaj biciklaj teamoj", "Amatora bicikla teamo", "Amatoraj biciklaj teamoj", "Sporta grupo 1", "Sportaj grupoj 1", "Sporta grupo 2", "Sportaj grupoj 2", "Sporta grupo 3", "Sportaj grupoj 3", "Miksa teamo", "Miksaj teamoj", "Ina teamo", "Inaj teamoj", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["es"] = {"Nombre del equipo", "País", "Código", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Equipo continental profesional", "Equipos continentales profesionales", "Equipo continental", "Equipos continentales", "Equipo nacional", "Equipos nacionales", "Equipo regional y de club", "Equipos regionales y de clubes", "Equipo ciclista profesional", "Equipos ciclistas profesionales", "Equipo ciclista aficionado", "Equipos ciclistas aficionados", "Grupo deportivo I", "Grupos deportivos I", "Grupo deportivo II", "Grupos deportivos II", "Grupo deportivo III", "Grupos deportivos III", "Equipo mixto", "Equipos mixtos", "Equipo femenino", "Equipos femeninos", "Equipo femenino de ciclismo amateur", "Equipos femeninos de ciclismo amateur"}, ["eu"] = {"Taldearen izena", "Herrialdea", "Kodea", "Munduko taldea", "Munduko taldeak", "Pro taldea", "Pro taldeak", "Kontinenteko talde profesionala", "Kontinenteko talde profesionala", "Kontinenteko taldea", "Kontinenteko taldeak", "Estatuko taldea", "Estatuko taldeak", "Eskualdeko eta klubeko taldea", "Eskualdeko eta klubeko taldeak", "Txirrindulari talde profesionala", "Txirrindulari talde profesionalak", "Txirrindulari talde amateurra", "Txirrindulari talde amateurrak", "I. mailako kirol taldea", "I. mailako kirol taldeak", "II. mailako kirol taldea", "II. mailako kirol taldeak", "III. mailako kirol taldea", "III. mailako kirol taldeak", "Talde mistoa", "Talde mistoak", "Emakume taldea", "Emakume taldeak", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["fi"] = {"Joukkueen nimi", "Maa", "Koodi", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professional continental -joukkue", "Professional continental -joukkueet", "Continental-joukkue", "Continental-joukkueet", "Maajoukkue", "Maajoukkueet", "Alue- ja seurajoukkue", "Alue- ja seurajoukkueet", "Ammattilaispyöräilytalli", "Ammattilaispyöräilytallit", "Amatööripyöräilytalli", "Amatööripyöräilytallit", "Groupe sportif I", "Groupes sportifs I", "Groupe sportif II", "Groupes sportifs II", "Groupe sportif III", "Groupes sportifs III", "Mixt team", "Mixt teams", "Naisten ammattilaisjoukkue", "Naisten ammattilaisjoukkueet", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["fo"] = {"Liðnavn", "Land", "Kota", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professionelt kontinentallið", "Professionel kontinentallið", "Kontinentallið", "Kontinental lið", "Landslið", "Landslið", "Regional- og klublið", "Regional- og felagslið", "Prolið", "Prolið", "Amatørlið", "Amatørlið", "Ítróttarbólkur I", "Ítróttarbólkur I", "Ítróttarbólkur II", "Ítróttarbólkur II", "Ítróttarbólkur III", "Ítróttarbólkur III", "Blandaðlið", "Blandaðlið", "Kvinulið", "Kvinnulið", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["he"] = {"שם קבוצה", "מדינה", "קוד", "WorldTeam", "קבוצות World Tour", "קבוצת פרו", "קבוצות פרו", "קבוצת קונטיננטל-פרו", "קבוצות קונטיננטל-פרו", "קבוצת קונטיננטל", "קבוצות קונטיננטל", "קבוצה לאומית", "קבוצות לאומיות", "Regional and club team", "Regional and club teams", "קבוצת רכיבה מקצועית", "קבוצות רכיבה מקצועיות", "Amateur cycling team", "Amateur cycling teams", "Groupe sportif I", "Groupes sportifs I", "Groupe sportif II", "Groupes sportifs II", "Groupe sportif III", "Groupes sportifs III", "Mixt team", "Mixt teams", "Professional woman team", "Professional women teams", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["lb"] = {"Equippennumm", "Land", "Code", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professionell Kontinentalequipe", "Professionell Kontinentalequippen", "Kontinentalequipe", "Kontinentalequippen", "Nationalequipe", "Nationalequippen", "Regional- a Klubequipe", "Regional- a Klubequippen", "Professionell Vëlosequipe", "Professionell Vëlosequippen", "Amateursequipe", "Amateursequippen", "Sportsgrupp I", "Sportsgruppen I", "Sportsgrupp II", "Sportsgruppen II", "Sportsgrupp III", "Sportsgruppen III", "Gemëscht Equipe", "Gemëscht Equippen", "Dammenequipe", "Dammenequippen", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["lv"] = {"Komandas nosaukums", "Valsts", "Kods", "WorldTeam", "WorldTeam komandas", "ProTeam", "ProTeam komandas", "Profesionālā kontinentālā komanda", "Profesionālās kontinentālās komandas", "Kontinentālā komanda", "Kontinentālās komandas", "Nacionālā izlase", "Nacionālās izlases", "Reģionālā vai klubu komanda", "Reģionālās vai klubu komandas", "Profesionāla riteņbraukšanas komanda", "Profesionālas riteņbraukšanas komandas", "Amatieru riteņbraukšanas komanda", "Amatieru riteņbraukšanas komandas", "1. sporta grupa", "1. sporta grupa", "2. sporta grupa", "3. sporta grupa", "3. sporta grupa", "3. sporta grupa", "Jauktā komanda", "Jauktās komandas", "Profesionāla sieviešu komanda", "Profesionālas sieviešu komandas", "Amatieru sieviešu komanda", "Amatieru sieviešu komandas"}, ["mk"] = {"Име на екипата", "Земја", "Код", "Екипа од Светската турнеја UCI", "Екипи од Светската турнеја UCI", "ProTeam", "ProTeams", "Професионална континентална екипа", "Професионални континентални екипи", "Континентална екипа", "Континентални екипи", "Национална екипа", "Национални екипи", "Регионална екипа и клуб", "Регионални екипи и клубови", "Професионална велосипедска екипа", "Професионални велосипедски екипи", "Аматерска велосипедска екипа", "Аматерски велосипедски екипи", "Groupe sportif I", "Groupes sportifs I", "Groupe sportif II", "Groupes sportifs II", "Groupe sportif III", "Groupes sportifs III", "Мешана екипа", "Мешани екипи", "Професионална женска екипа", "Професионални женски екипи", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["nl"] = {"Teamnaam", "Land", "Code", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Professional continental team", "Professional continental teams", "Continental team", "Continental teams", "National team", "National teams", "Regional and club team", "Regional and club teams", "Professional cycling team", "Professional cycling teams", "Amateurteam", "Amateurteams", "Groupe sportif I", "Groupes sportifs I", "Groupe sportif II", "Groupes sportifs II", "Groupe sportif III", "Groupes sportifs III", "Gemengd team", "Gemengde teams", "Professioneel vrouwenteam", "Professionele vrouwenteams", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["no"] = {"Lagnavn", "Land", "Kode", "WorldTour-lag", "WorldTour-lag", "ProTour-lag", "ProTour-lag", "Profesjonelt kontinentallag", "Profesjonelle kontinentallag", "Kontinentallag", "Kontinentallag", "Landslag", "Landslag", "Regional- og klubblag", "Regional- og klubblag", "Profflag", "Profflag", "Amatørlag", "Amatørlag", "Trade Team I", "Trade Teams I", "Trade Team II", "Trade Teams II", "Trade Team III", "Trade Teams III", "Mix-lag", "Mix-lag", "Profflag", "Profflag", "Amatørlag", "Amatørlag"}, ["pt"] = {"Nome da equipe", "País", "Código", "Equipe WorldTeam", "Equipes WorldTeam", "Equipe ProTeam", "Equipes ProTeam", "Equipe profissional Continental", "Equipes profissionais Continentais", "Equipe Continental", "Equipes Continentais", "Equipe nacional", "Equipes nacionais", "Equipe regional e clube", "Equipes regionais e clubes", "Equipe profissional de ciclismo", "Equipes profissionais de ciclismo", "Equipe amadora de ciclismo", "Equipes amadoras de ciclismo", "Grupo esportivo I", "Grupos esportivos I", "Grupo esportivo II", "Grupos esportivos II", "Grupo esportivo III", "Grupos esportivos III", "Equipe mista", "Equipes mistas", "Equipe feminina profissional", "Equipes femininas profissionais", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["ro"] = {"Numele echipei", "Țară", "Cod", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Echipă continentală profesionistă", "Echipe continentale profesioniste", "Echipă continentală", "Echipe continentale", "Echipă națională", "Echipe naționale", "Echipă regională și de club", "Echipe regionale și de club", "Echipă ciclistă profesionistă", "Echipe cicliste profesioniste", "Echipă ciclistă de amatori", "Echipe cicliste de amatori", "Grup sportiv I", "Grupuri sportive I", "Grup sportiv II", "Grupuri sportive II", "Grup sportiv III", "Grupuri sportive III", "Echipă mixtă", "Echipe mixte", "Echipă feminină", "Echipe feminine", "Women's amateur cycling team", "Women's amateur cycling teams"}, ["ru"] = {"Команда", "Страна", "Код", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Профессиональная континентальная команда", "Профессиональные континентальные команды", "Континентальная команда", "Континентальные команды", "Национальная команда", "Национальные команды", "Региональная команда или клуб", "Региональные команды и клубы", "Профессиональная велокоманда", "Профессиональные велокоманды", "Любительская велокоманда", "Любительские велокоманды", "Groupe sportif I", "Groupes sportifs I", "Groupe sportif II", "Groupes sportifs II", "Groupe sportif III", "Groupes sportifs III", "Смешанная велокоманда", "Смешанные велокоманды", "Женская профессиональная команда", "Женские профессиональные команды", "Женская любительская велокоманда", "Женские любительские велокоманды"}, ["ast"] = {"Nome del equipu", "País", "Códigu", "WorldTeam", "WorldTeams", "ProTeam", "ProTeams", "Equipu continental profesional", "Equipos continentales profesionales", "Equipu continental", "Equipos continentales", "Equipu nacional", "Equipos nacionales", "Equipu rexonal y de club", "Equipos rexonales y de clubes", "Equipu ciclista profesional", "Equipos ciclistes profesionales", "Equipu ciclista aficionáu", "Equipos ciclistes aficionaos", "Grupu deportivu I", "Grupos deportivos I", "Grupu deportivu II", "Grupos deportivos II", "Grupu deportivu III", "Grupos deportivos III", "Equipu mestu", "Equipos mestos", "Equipu femenín", "Equipos femeninos", "Equipu femenín de ciclismu amateur", "Equipos femeninos de ciclismu amateur"}, }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default return l10n[x] end

function headoftableIV(x) -- En-tête du tableau du palmarès d'une course cycliste local l10nDef = { ["ar"] = {"السنة", "الفائز", "الثاني", "الثالث"}, ["fr"] = {"Année", "Vainqueur", "Deuxième", "Troisième"}, ["en"] = {"Year", "Winner", "Second", "Third"}, ["br"] = {"Bloavezh", "1añ", "2l", "3de"}, ["ca"] = {"Any", "Vencedor", "Segon", "Tercer"}, ["cs"] = {"Ročník", "Vítěz", "Druhý", "Třetí"}, ["da"] = {"År", "Vinder", "Toer", "Treer"}, ["de"] = {"Jahr", "Sieger", "Zweiter", "Dritter"}, ["eo"] = {"Jaro", "Venkinto", "Dua pozicio", "Tria pozicio"}, ["es"] = {"Año", "Ganador", "Segundo", "Tercero"}, ["eu"] = {"Urtea", "Irabazlea", "Bigarrena", "Hirugarrena"}, ["fi"] = {"Vuosi", "Voittaja", "Toinen", "Kolmas"}, ["fo"] = {"Ár", "Vinnari", "Nr. 2", "Nr. 3"}, ["hu"] = {"Év", "Versenyző", "Második", "Harmadik"}, ["it"] = {"Anno", "Vincitore", "Secondo", "Terzo"}, ["ja"] = {"年", "優勝", "準優勝", "3位"}, ["lb"] = {"Joer", "Gewënner", "Zweeten", "Drëtten"}, ["lv"] = {"Gads", "Uzvarētājs", "Otrais", "Trešais"}, ["mk"] = {"Година", "Победник", "Второпласиран", "Третопласиран"}, ["nl"] = {"Jaar", "Winnaar", "Tweede", "Derde"}, ["no"] = {"År", "Vinner", "Andreplass", "Tredjeplass"}, ["pl"] = {"Rok", "Pierwsze", "Drugie", "Trzecie"}, ["pt"] = {"Ano", "Vencedor", "Segundo", "Terceiro"}, ["ro"] = {"An", "Câștigător", "Locul doi", "Locul trei"}, ["ru"] = {"Год", "Победитель", "Второй", "Третий"}, ["sr"] = {"Година", "Победник", "Други", "Трећи"}, ["sv"] = {"År", "Vinnare", "Andra", "Tredje"}, ["ast"] = {"Añu", "Ganador", "Segundu", "Terceru"}, }	return l10nDef[wiki][x] end

function typeofstage(x, typ) -- plain, hilly, inter, ... must be "" or "any text" -- l10nDef[""] = {plain = "", hilly="", inter=, mount=, time_prologue=, time_team=, time_indiv=, uphill=, rest=''} local l10nDef = { ["ar"] = {plain = "مرحلة مستوية", hilly="مرحلة التلال", inter='مرحلة متوسطة', mount='مرحلة جبلية', time_prologue='مرحلة سباق ضد الساعة', time_team='مرحلة سباق الفرق ضد الساعة', time_indiv='مرحلة سباق فردي ضد الساعة', uphill='مرحلة تسلق الجبل ضد الساعة', rest='يوم راحة'}, ["fr"] = {plain = "étape de plaine", hilly="étape vallonnée", inter='étape de moyenne montagne', mount='étape de montagne', time_prologue='prologue', time_team='contre-la-montre par équipes', time_indiv='contre-la-montre individuel', uphill='contre-la-montre en côte', rest='étape de repos'}, ["en"] = {plain = "plain stage", hilly="hilly stage", inter='intermediate stage', mount='mountain stage', time_prologue='time trial stage', time_team='team time trial stage', time_indiv='individual time trial stage', uphill='uphill time trial stage', rest='rest day'}, ["br"] = {plain = "tennad plaen", hilly="tennad digompez", inter='tennad damveneziek', mount='tennad meneziek', time_prologue=, time_team='ABEU a-skipailhoù', time_indiv='ABEU', uphill=, rest='devezh diskuizh'}, ["ca"] = {plain = "etapa plana", hilly="etapa accidentada", inter='etapa de mitja muntanya', mount='etapa de muntanya', time_prologue='pròleg', time_team='contrarellotge per equips', time_indiv='contrarellotge individual', uphill='', rest='etapa de descans'}, ["cs"] = {plain = "rovinatá etapa", hilly="", inter='kopcovitá etapa', mount='horská etapa', time_prologue='prolog', time_team='týmová časovka', time_indiv='individuální časovka', uphill=, rest=}, ["da"] = {plain = "flad etape", hilly="kuperet etape", inter='middel bjergetape', mount='bjergetape', time_prologue='prolog', time_team='holdtidskørsel', time_indiv='enkeltstart', uphill='bjergenkeltstart', rest='hviledag'}, ["de"] = {plain = "Flachetappe", hilly="Hügelige Etappe", inter='Mittelschwere Etappe', mount='Hochgebirgsetappe', time_prologue='Prolog', time_team='Teamzeitfahren', time_indiv='Einzelzeitfahren', uphill='Bergzeitfahren', rest='Ruhetag'}, ["eo"] = {plain = "ebena etapo", hilly="malebena etapo", inter='mezgranda montaro etapo', mount='montara etapo', time_prologue='prologo', time_team='teama kontraux-la-kronometro', time_indiv='individua kontraux-la-kronometro', uphill='malebena kontraux-la-kronometro', rest='ripoza etapo'}, ["es"] = {plain = "etapa llana", hilly="etapa escarpada", inter='etapa de media montaña', mount='etapa de montaña', time_prologue='prólogo', time_team='contrarreloj por equipos', time_indiv='contrarreloj individual', uphill='cronoescalada', rest='jornada de descanso'}, ["eu"] = {plain = "etapa laua", hilly="etapa gorabeheratsua", inter='bitarteko etapa', mount='mendiko etapa', time_prologue='aitzinetapa', time_team='taldekako erlojupekoa', time_indiv='banakako erlojupekoa', uphill='erlojupeko igoera', rest='atseden eguna'}, ["fi"] = {plain = "Tasamaaetappi", hilly="Mäkietappi", inter='Keskivaikea vuorietappi', mount='Vuorietappi', time_prologue='', time_team='Joukkueaika-ajo', time_indiv='Henkilökohtainen aika-ajo', uphill='mäkiaika-ajo', rest='välipäivä'}, ["fo"] = {plain = "Slætt", hilly="Slætt við brúgvasteinum", inter='Óslætt', mount='Fjallateinur', time_prologue='Forteinur', time_team='Liðsúkkling', time_indiv='Einkultstartur', uphill='', rest='Hvílidagur'}, ["hu"] = {plain = "sík szakasz", hilly="dombos szakasz", inter='közepes hegyi szakasz', mount='hegyi szakasz', time_prologue='prolog', time_team='csapat időfutam', time_indiv='egyéni időfutam', uphill='hegyi időfutam', rest=''}, ["ja"] = {plain = "平坦ステージ", hilly="丘陵ステージ", inter='中間ステージ', mount='山岳ステージ', time_prologue='タイムトライアルステージ', time_team='チームタイムトライアルステージ', time_indiv='個人タイムトライアルステージ', uphill='アップヒルタイムトライアルステージ', rest='休養日'}, ["lb"] = {plain = "Flaach Etapp", hilly="Hiwweleg Etapp", inter='Mëttelschwéier Etapp', mount='Biergetapp', time_prologue='Prolog', time_team='Contre-la-montre (Equipe)', time_indiv='Contre-la-montre (Eenzel)', uphill='Biergcourse', rest='Roudag'}, ["lv"] = {plain = "līdzenuma posms", hilly="paugurains posms", inter='vidēju kalnu posms', mount='kalnu posms', time_prologue='individuālais brauciens', time_team='komandu brauciens', time_indiv='individuālais brauciens', uphill='individuālais brauciens kalnā', rest='atpūtas diena'}, ["mk"] = {plain = "рамна етапа", hilly="ридеста етапа", inter='среднопланинска етапа', mount='планинска етапа', time_prologue='пролог', time_team='екипен хронометар', time_indiv='индивидуален хронометар', uphill='', rest='ден за одмор'}, ["nl"] = {plain = "vlakke rit", hilly="heuvelrit", inter='heuvelrit', mount='bergrit', time_prologue='proloog', time_team='ploegentijdrit', time_indiv='individuele tijdrit', uphill='klimtijdrit', rest='rustdag'}, ["no"] = {plain = "flat etappe", hilly="kupert etappe", inter='middels klatreetappe', mount='klatreetappe', time_prologue='prolog', time_team='lagtempo', time_indiv='temporitt', uphill='klatretempoetappe', rest='hviledag'}, ["pl"] = {plain = "płaski", hilly="", inter='pagórkowaty', mount='górski', time_prologue='prologu', time_team='jazda drużynowa na czas', time_indiv='jazda indywidualna na czas', uphill=, rest=}, ["pt"] = {plain = "etapa plana", hilly="", inter='média montanha', mount='alta montanha', time_prologue='prólogo', time_team='contrarrelógio por equipes', time_indiv='contrarrelógio individual', uphill=, rest=}, ["ro"] = {plain = "etapă de plat", hilly="etapă valonată", inter='etapă intermediară', mount='etapă de munte', time_prologue='prolog', time_team='contratimp pe echipe', time_indiv='contratimp individual', uphill='', rest='zi de repaus'}, ["ru"] = {plain = "равнинный", hilly="холмистый", inter='среднегорный', mount='горный', time_prologue='пролог', time_team='командная разделка', time_indiv='индивидуальная разделка', uphill='горная разделка', rest='день отдыха'}, ["sv"] = {plain = "Flack etapp", hilly="", inter='Kuperat', mount='Bergsetapp', time_prologue='Prolog', time_team='Lagtempoetapp', time_indiv='Tempoetapp', uphill='', rest='Vilodag'}, ["ast"] = {plain = "etapa llana", hilly="etapa escarpada", inter='etapa de mediu monte', mount='etapa de monte', time_prologue='prólogu', time_team='contrarreló per equipos', time_indiv='contrarreloj individual', uphill='cronoescalada', rest='xornada de descansu'}, }	local l10n = l10nDef[wiki] if not l10n then l10n = l10nDef["en"] end -- default

if x=='plain stage' then return "" end if x=='hilly stage' then return "" end if x=='intermediate stage' then return "" end if x=='mountain stage' then return "" end if x=='uphill time trial stage' then return "" end if x=='rest day' then return "" end if x=='time trial stage' then if typ==2348250 then return "" end if typ==2266066 then return "" end if typ==485321 then return "" end end end

function func_prologue -- returns the word "Prologue" local l10nDef = { ["fr"]="Prologue", ["ar"]="المقدمة", ["en"]="Prologue", ["br"]="Prolog", ["ca"]="Pròleg", ["cs"]="Prolog", ["de"]="Prolog", ["da"]="Prolog", ["eo"]="Prologo", ["es"]="Prólogo", ["eu"]="Aitzinetapa", ["fi"]="Prologi", ["fo"]="Forteinur", ["hu"]="Prolog", ["it"]="Prologo", ["ja"]="プロローグ", ["la"]="Incipit prologus", ["lb"]="Prolog", ["lv"]="Prologs", ["mk"]="Пролог", ["nl"]="Proloog", ["no"]="Prolog", ["pl"]="Prologu", ["pt"]="Prólogo", ["ro"]="Prolog", ["ru"]="Пролог", ["sk"]="Prológ", ["sv"]="Prolog", ["ast"]="Prólogu"}

if l10nDef[wiki] ~= nil then return l10nDef[wiki] else return l10nDef["en"] end -- if no translation, show en translation end

function stageLink(x, a, b) -- x= 10a: a = 10, b = a. x = 5: a = 5, b = "" local l10nDef = {["fr"]="étape", ["en"]="stage", ["ar"]="مرحلة", ["br"]="Tennad", ["ca"]="etapa", ["cs"]="etapa", ["de"]="Etappe", ["da"]="etape", ["eo"]="Etapo", ["es"]="etapa", ["eu"]="Etapa", ["fi"]="Etappi", ["fo"]="teinur", ["hu"]="Szakasz", ["it"]="Tappa", ["ja"]="ステージ", ["la"]="Statio", ["lb"]="etapp", ["lv"]="Posms", ["mk"]="Етапа", ["nl"]="Etappe", ["no"]="etappe", ["pl"]="Etap", ["pt"]="Etapa", ["ro"]="Etapa", ["ru"]="Этап", ["sk"]="Etapa", ["sv"]="Etapp", ["ast"]="etapa" }

local word1, word2 word2=l10nDef[wiki] if word2 == nil then word2=l10nDef["en"] end -- if no translation, show en translation local word = word2

-- fr: étape,  étape if wiki=="fr" or wiki=="lb" then if b == "" then -- series_ordinal without character if a == "1" then word1 = "1re "..word else word1 = a.."e "..word end -- table text = étape,  étape, if a == "1" then word2 = "#1re "..word else word2 = "#"..a.."e "..word end --text of section header = #1re étape, #2e étape return word1, word2 end if b ~= "" then -- series_ordinal with character: instead of eg "1a re" it is "1re a" if a == "1" then word1 = "1re "..b.." "..word else word1 = a.."e "..b.." "..word end -- table text = étape,  étape, if a == "1" then word2 = "#1re "..b.." "..word else word2 = "#"..a.."e"..b.." "..word end --text of section header = #1re étape, #2e étape return word1, word2 end end if wiki=="de" or wiki=="da" or wiki=="fo" or wiki=="no" then return a..". "..b.." "..word, "#"..a..". "..b.." "..word end if wiki=="ca" then return a.."a "..b.." "..word, "#"..a..". "..b.." "..word end if wiki=="es" then return a..".a "..b.." "..word, "#"..a..". "..b.." "..word end if wiki=="ast" then return a.."ª "..b.." "..word, "#"..a..". "..b.." "..word end -- default word1 = x                 -- table text = 1, 2a, 3 word2 = "#"..word.." ".. x -- text of section header = #Etappe 2a, #Stage 4 return word1, word2 end

--== V) Main functions --=== A) Function race reference === local function race_reference(raceID) -- Allow to display the reference below the classifications -- local bases={ {"ProCyclingStats", "P2327", "http://www.procyclingstats.com/race.php?id="}, {"Cycling Quotient", "P2648", "http://www.cqranking.com/men/asp/gen/race.asp?raceid="}, {"Cycling Archives", "P2330", "http://www.siteducyclisme.net/ritfiche.php?ritid="}, {"Cycling Quotient", "P2708", "http://www.cqranking.com/women/asp/gen/race.asp?raceid="} }	local links = {} for _, base in pairs(bases) do		local p = mw.wikibase.getBestStatements(raceID, base[2]) if p[1] and p[1].mainsnak.snaktype == 'value' then table.insert(links, ' [' .. base[3] .. p[1].mainsnak.datavalue.value .. " " .. base[1] ..']') end end if #links == 1 then return race_reference_translate(wiki, 1) .. table.concat(links) elseif #links > 1 then return race_reference_translate(wiki, 1) .. table.concat(links) else return '' end end

--=== B) Calendar === function p.calendarcustom(frame)	- function to display calendar óf any competition -	- based on victories function -	- author: psemdel -	local countryflagonlytemp, numberingtemp, displayclasstemp,onlywinnertemp, displayteamtemp, displayleadertemp   local headertemp, data_typetemp={}, {}    local ll=1

if frame.args[1] ~= nil then calendarID=	string.gsub(frame.args[1], "%c", "") end --date headertemp[ll]=2 data_typetemp[ll] = '' ll=ll+1 numberingtemp=false if frame.args[2] ~= nil and tonumber(frame.args[2]) ==1 then numberingtemp =true headertemp[ll]=3 data_typetemp[ll] = '' ll=ll+1 end countryflagonlytemp=true if frame.args[3] ~= nil and tonumber(frame.args[3]) ==1 then countryflagonlytemp =false end -- country -- headertemp[ll]=5 data_typetemp[ll] = '' ll=ll+1

--race-- headertemp[ll]=4 data_typetemp[ll] = '' ll=ll+1 displayclasstemp =false if frame.args[4] ~= nil and tonumber(frame.args[4]) ==1 then displayclasstemp =true headertemp[ll]=6 data_typetemp[ll] = '' ll=ll+1 end

if frame.args[5] ~= nil then if tonumber(frame.args[5]) ==1 then onlywinnertemp =0 headertemp[ll]=7 --winner data_typetemp[ll] = '' ll=ll+1 headertemp[ll]=8 --second data_typetemp[ll] = '' ll=ll+1 headertemp[ll]=9 --third data_typetemp[ll] = '' ll=ll+1 else onlywinnertemp =1 headertemp[ll]=7 data_typetemp[ll] = '' ll=ll+1 end else onlywinnertemp=1 headertemp[ll]=7 data_typetemp[ll] = '' ll=ll+1 end displayleadertemp =false if frame.args[6] ~= nil and tonumber(frame.args[6]) ==1 then displayleadertemp=true headertemp[ll]=10 data_typetemp[ll] = '' ll=ll+1 end displayteamtemp =false if frame.args[7] ~= nil and tonumber(frame.args[7]) ==1 then displayteamtemp =true end local titletemp=wikibase.getLabel(calendarID)

local s = { header_function = calendar_translate, -- translations are in function Calendar_translate header_1 = 1000, -- translation 1 in function Calendar_translate is printed in the upper part of the table header header_2 = headertemp,-- translations 2, 3, 4, 5, 6 in function Calendar_translate are printed in this order title=titletemp,					-- in the lower part of the table header. The second value 3 in {4, 3} tells where the icon will go. country_column = 2, flag_column = 2, data_sort_type = data_typetemp, -- see https://meta.wikimedia.org/wiki/Help:Sorting item = calendarID, property = 'P527', no_country = {}, country = true, countryflagonly=countryflagonlytemp, error_message = 0, country = true, only_winner = onlywinnertemp, numbering = numberingtemp, error_message = 0, displayed_class =nil, displayteam=displayteamtemp, displayclass=displayclasstemp, leadercolumn=displayleadertemp, }	return tableA(s, calendar_main(s)) end

function p.calendar(frame) - function to display UCI calendar of one year - based on WWTcalendar function - - author: Mr. Ibrahem - local calendarID = "" if wiki == "ar" then frame = frame:getParent end UCI = {} UCI["WT"] = { -- Q635366 ['2018'] = 'Q42317185',['2017'] = 'Q21857932',['2016'] = 'Q20970765', ['2015'] = 'Q18192726',['2014'] = 'Q14979277',['2013'] = 'Q1031504', ['2012'] = 'Q849059', ['2011'] = 'Q849092' }	UCI["europe"] = { -- Q1194340 ['2018'] = 'Q44497477',['2017'] = 'Q27915850',['2016'] = 'Q21029681', ['2015'] = 'Q18342122',['2014'] = 'Q15041668',['2013'] = 'Q1280387', ['2012'] = 'Q961709',['2010–11'] = 'Q751208',['2009–10'] = 'Q212197', ['2008–09'] = 'Q1811548',['2007–08'] = 'Q1788011',['2006–07'] = 'Q1780660', ['2005–06'] = 'Q1455600',['2005'] = 'Q1431816' }	UCI["asia"] = { -- Q1063423 ['2018'] = 'Q42204070',['2017'] = 'Q27679728',['2016'] = 'Q21622227', ['2015'] = 'Q18341318',['2013–14'] = 'Q15041671',['2012–13'] = 'Q1606048', ['2011–12'] = 'Q2117797',['2010–11'] = 'Q633349',['2009–10'] = 'Q630798', ['2008–09'] = 'Q565160',['2007–08'] = 'Q1506934',['2006–07'] = 'Q966011', ['2005–06'] = 'Q459817',['2005'] = 'Q469479', }	UCI["america"] = { -- Q1063430 ['2018'] = 'Q42199340',['2017'] = 'Q27704415',['2016'] = 'Q21621040',['2015'] = 'Q18413668', ['2013–14'] = 'Q15041669',['2012–13'] = 'Q129177',['2011–12'] = 'Q1239608',['2010–11'] = 'Q1849269', ['2009–10'] = 'Q1303982',['2008–09'] = 'Q1536927',['2007–08'] = 'Q31716',['2006–07'] = 'Q31714', ['2005–06'] = 'Q1429246',['2005'] = 'Q1431880', }	UCI["africa"] = { -- Q268357 ['2018'] = 'Q42202027', ['2017'] = 'Q27679848', ['2016'] = 'Q21622217', ['2015'] = 'Q18342124', ['2013–14'] = 'Q15041670', ['2012–13'] = 'Q327399', ['2011–12'] = 'Q2296721',['2010–11'] = 'Q1386870', ['2009–10'] = 'Q2067266', ['2008–09'] = 'Q1812465',['2007–08'] = 'Q676684', ['2006–07'] = 'Q1436886', ['2005–06'] = 'Q1758917',['2005'] = 'Q1759404', }	UCI["oceania"] = { -- Q1039648 ['2018'] = 'Q42205000', ['2017'] = 'Q27887426', ['2016'] = 'Q21559636', ['2015'] = 'Q18413671', ['2014'] = 'Q15246814', ['2013'] = 'Q129134', ['2011–12'] = 'Q1591132', ['2011'] = 'Q2298207', ['2009–10'] = 'Q665283', ['2008–09'] = 'Q964517', ['2007–08'] = 'Q1788621', ['2006–07'] = 'Q1473640', ['2005–06'] = 'Q1429165', ['2005'] = 'Q937636', }

UCI["WWT"] = { ['2018'] = 'Q41787783', ['2017'] = 'Q27431192', ['2016'] = 'Q21034783', }

UCI["women"] = { ['2018'] = 'Q47005682', ['2017'] = 'Q27765666', ['2016'] = 'Q22696468', ['2015'] = 'Q18348936', ['2014'] = 'Q15831496', ['2013'] = 'Q6425932', ['2012'] = 'Q2466796', ['2011'] = 'Q2466792', ['2010'] = 'Q2933831', ['2009'] = 'Q2933830', ['2008'] = 'Q2933828', ['2007'] = 'Q3650627', ['2006'] = 'Q16154659', }

header_1_tab = {["WT"]=13 ,["europe"]=14 ,["asia"]=15,["america"]=16 ,["africa"]=17 ,["oceania"]=18, ["WWT"]=11, ["women"]=1} header_1_number = 12 display_code_tab ={["WT"]=1 ,["europe"]=2 ,["asia"]=2,["america"]=2 ,["africa"]=2 ,["oceania"]=2, ["WWT"]=1, ["women"]=2} --Can depends on the wiki header_2_tab_code1= {2, 3,5, 4, 7, 8, 9, 10} header_2_tab_code2= {2, 5, 4, 6, 7} data_sort_type_code1={, 'unsortable', , , ,,} data_sort_type_code2={, 'unsortable', , , ,,} only_winner_code1 = 0 only_winner_code2 = 1 numbering_code1= true numbering_code2=false displayteam_code1=false displayteam_code2=true displayclass_code1=false displayclass_code2=true leadercolumn_code1=true leadercolumn_code2=false

for key, v in pairs(UCI) do		if calendarID == "" and frame.args[key] then year = frame.args[key] year = string.gsub( year, "%c", "") if v[year] then calendarID = v[year] header_1_number = header_1_tab[key] display_code=display_code_tab[key] end end end if wiki == "ar" and calendarID == "" then return "" end if display_code==1 then header_2temp= header_2_tab_code1 data_sort_typetemp=data_sort_type_code1 only_winnertemp=only_winner_code1 numberingtemp=numbering_code1 displayteamtemp=displayteam_code1 displayclasstemp=displayclass_code1 leadercolumntemp=leadercolumn_code1 else header_2temp= header_2_tab_code2 data_sort_typetemp=data_sort_type_code2 only_winnertemp=only_winner_code2 numberingtemp=numbering_code2 displayteamtemp=displayteam_code2 displayclasstemp=displayclass_code2 leadercolumntemp=leadercolumn_code2 end

local s = { header_function = calendar_translate, -- translations are in function Calendar_translate header_1 = header_1_number, -- t		header_2 = header_2temp,-- -- in the lower part of the table header. The second value 3 in {4, 3} tells where the icon will go. country_column = 2, flag_column = 2, data_sort_type ={, 'unsortable', , , ,,},  -- -- see https://meta.wikimedia.org/wiki/Help:Sorting item = calendarID, property = 'P527', no_country = {}, country = true, countryflagonly=true, only_winner = only_winnertemp, numbering = numberingtemp, error_message = 0, displayed_class = { "Q23005603", -- "Q22231110", -- 1.1 "Q22231109", -- 2.HC			"Q22231111", -- 1.2 "Q22231108", -- 1.HC			"Q22231106", -- 1.UWT "Q22231107", -- 2.UWT "Q22231113", -- 2.2 "Q22231112", -- 2.1 "Q22231113", -- 2.2 "Q22231109", -- 2.HC			"Q22231118", -- CC			}, displayteam=displayteamtemp, displayclass=displayclasstemp, leadercolumn=leadercolumntemp }	return tableA(s, calendar_main(s)) end

- Definition sub-functions for calendar and victory -- local function fn_date(entityID, functionName) --to move as a general function local tempdate, dateOfRace, sortkey, sortkeyDate local outputtable={} local sTime = firstValue(entityID, 'P580', 'time') -- P580 is 'start time' local eTime = firstValue(entityID, 'P582', 'time') -- P582 is 'end time' if sTime and eTime then local startTime, endTime = getStartEndTime(sTime, eTime, 'small') local _, _, y, m, d = string.find(sTime, "(%d+)-(%d+)-(%d+)") if functionName==nil then --calendar tempdate = startTime .. ' – ' .. endTime --mettre year en option! sortkeyDate =sTime else --victory, general classification tempdate =endTime sortkeyDate =eTime end dateOfRace = eTime else -- This function give a format to dates when P585 (date) is used in a single day race local pTime = firstValue(entityID, 'P585', 'time') -- P585 is 'point in time' if pTime then tempdate = func_date (pTime, 'small') dateOfRace = pTime sortkeyDate = pTime end end local _, _, y, m, d = string.find(sortkeyDate, "(%d+)-(%d+)-(%d+)") if y~= nil and m~= nil and d~=nil then sortkey = y..m..d	elseif y~= nil and m~= nil then sortkey = y..m	elseif y~= nil then sortkey = y	else sortkey = '0000' end

outputtable[1]=dateOfRace outputtable[2]=''..tempdate.. ' '	outputtable[3]=sortkey return outputtable end

local function fn_country(entityID, dateOfRace,countryflagonly, ParentID) -- This function gives countries where the race take place -- ParentID taken from fn_race, optional local country, countryname, outputtable= {}, {}, {} local countryID for _, p17 in statements(entityID, 'P17') do -- P17 is 'country' --we have to select the right one countryID = p17.mainsnak.datavalue.value.id		countryname[#countryname + 1] = getCountryName(countryID) if countryflagonly==true or not countryname[#countryname] then country[#country + 1]=flag(countryID, dateOfRace) else country[#country + 1]=flag(countryID, dateOfRace)..countryname[#countryname] end end --no country in entity, look by parent if countryID == nil and ParentID ~= nil then for _, p17 in statements(ParentID, 'P17') do -- P17 is 'country' --we have to select the right one countryID = p17.mainsnak.datavalue.value.id			countryname[#countryname + 1] = getCountryName(countryID) if countryflagonly==true or not countryname[#countryname] then country[#country + 1]=flag(countryID, dateOfRace) else country[#country + 1]=flag(countryID, dateOfRace)..countryname[#countryname] end end end if countryname[1] then outputtable[2]=countryname[1] beginofstr=''		if country[1] then outputtable[1]=beginofstr..country[1]..' ' else outputtable[1]=beginofstr..' ' end else outputtable[2]='' outputtable[1]=' ' end return outputtable end

local function commastage(stageID,racelabel) --how to write "stage, " local outputtable={} local stagenumber='' local substage = '' local stagenumberonly, stageletter outputtable[1]='' outputtable[2]='' local p1545 = wikibase.getBestStatements(stageID, 'P1545') --name for championship if p1545[1] and p1545[1].mainsnak.snaktype == 'value' then stagenumber = p1545[1].mainsnak.datavalue.value end if stagenumber=='0' then stagenumber= victories_translate(wiki,9) else if stagenumber==nil then stagenumber= victories_translate(wiki,8) else --look for substage local i,j = string.find(stagenumber, "%a+") --if letter in the stage number if i ~= nil then --we have to do something local k,l = string.find(stagenumber, "%d+") --select the number in the stage number stagenumberonly = string.sub(stagenumber, k, l)--cut the string in 2 stageletter = string.sub(stagenumber, i, j)				stagenumber=stagenumberonly if stageletter ~= nil then substage=stageletter end end stagenumber=number('f', stagenumber, wiki)..substage..' '..victories_translate(wiki,8) end end

local comma = ", " if wiki == 'ar' then comma = " ، " end if wiki == 'fr' then local correpondance={ {name="^Trois", article= " des "}, {name="^Quatre", article= " des "}, {name="^Boucles", article= " des "}, {name="^Triptyque", article= " du "}, {name="^Tour", article= " du "}, {name="^Grand Prix", article= " du "}, {name="^Circuit", article= " du "}, {name="^Mémorial", article= " du "}, {name="^Trophée", article= " du "}, {name="^Ronde", article= " de la "}, {name="^Semaine", article= " de la "}, {name="^Classica", article= " de la "}, {name="^Flèche", article= " de la "}, {name="^Course", article= " de la "}, {name="^Classique", article= " de la "}, {name="Race", article= " de la "}, {name="^Étoile", article= " de l'"}, {name="^La", article= " de "} }		for ii, v in ipairs(correpondance) do 			local i, _ = mw.ustring.find(racelabel, correpondance[ii].name) if i ~= nil then comma = correpondance[ii].article end end end if wiki == 'fr' or wiki == "lb" or wiki=="ca" or wiki=="es" or wiki=="ast" then outputtable[1]=stagenumber..comma elseif wiki=="de" or wiki=="da" or wiki=="fo" or wiki=="no" or wiki=="ru" or wiki=="en" then outputtable[2]=comma..stagenumber end return outputtable end

local function getmainraceLink(entityID,entity_type,stageID, functionName) --the link to the edition but with a general name local instanceOf, label, Sitelink, isclass, prefix, postfix Sitelink=wikibase.getSitelink(entityID) prefix=; postfix= for _, p31 in statements(entityID, 'P31') do		instanceOf = p31.mainsnak.datavalue.value.id		isclass=0 for i=1,#class do--we don't want the class, but the main race if instanceOf == class[i] then isclass=1 end end if isclass==0 then local p2561 = wikibase.getBestStatements(instanceOf, 'P2561') --name for championship if p2561[1] and p2561[1].mainsnak.snaktype == 'value' then label = p2561[1].mainsnak.datavalue.value.text end			--if label==nil then --if label==nil then --should be with a "today" --	local p1448 = wikibase.getBestStatements(instanceOf, 'P1448') --official name --	if p1448[1] and p1448[1].mainsnak.snaktype == 'value' then label = "blibli" end --p1448[1].mainsnak.datavalue.value.text end --end if label==nil then label=wikibase.label(instanceOf) end if Sitelink==nil then --only if no link to the race direct Sitelink=wikibase.getSitelink(instanceOf) end if Sitelink==nil and entity_type=='champ' then --only for champ local p361=wikibase.getBestStatements(instanceOf, 'P361') if p361[1] and p361[1].mainsnak.snaktype == 'value' then Sitelink=wikibase.getSitelink(p361[1].mainsnak.datavalue.value.id) end end end end --look for link to the race if nothing --if different languages have to be added, a language table can be created if entity_type=='2' then if functionName~=nil then --calendar=nil if wiki == 'fr' then prefix= victories_translate(wiki,1)..', ' --general classification else postfix = ', '..victories_translate(wiki,1) end end elseif entity_type=='stage' then --how to write "stage, " is concentrated in one function local commatable=commastage(stageID, label) prefix= commatable[1] postfix=commatable[2] end

if Sitelink == nil then if label==nil then return prefix..wikibase.label(entityID)..postfix else return prefix..label..postfix end else if label ==nil then return prefix....wikibase.label(entityID)....postfix else return prefix....label....postfix end end end

local function fn_getclassinfo(entityID,displayed_class) --get the class of the race local display=false local outputtable={} local entity_type, class_text, sortkey_class if displayed_class==nil then display=true else for i=1,#displayed_class do 			if entityID ==displayed_class[i] then display=true break end end end --is it a championship? for i=1,#class_champ do		if entityID == class_champ[i] then entity_type = 'champ' class_text = mw.wikibase.label(class_champ[i]) sortkey_class = class_sort[class_champ[i]] end end if entity_type==nil then for i=1,#class_2x do -- #class = number of elements in class if entityID == class_2x[i] then entity_type = '2' class_text = mw.wikibase.label(class_2x[i]) sortkey_class = class_sort[class_2x[i]] end end if entity_type==nil then for i=1,#class_without2x do				if entityID == class_without2x[i] then entity_type = '1' class_text = mw.wikibase.label(class_without2x[i]) sortkey_class = class_sort[class_without2x[i]] end end end if entity_type==nil then entity_type = 'nada' end--to allow display of race without class... end if display==false then else outputtable[1]=entity_type outputtable[2]=class_text outputtable[3]=sortkey_class outputtable[4]=entityID --save the class end return outputtable end

local function fn_race(entityID,displayed_class,displayclass, functionName)--return link to the race and class --first function read from victory main local Sitelink,instanceOf,circuitID,parentCircuitID, displayedCircuitID, Circuitlink local Classlink, entity_type, classID, class_text local inputtable, outputtable={}, {} local display=false local stageID=entityID

for _, p31 in statements(entityID, 'P31') do		instanceOf = p31.mainsnak.datavalue.value.id for i=1,#stages do --is it a stage? if instanceOf == stages[i] then entity_type = 'stage' --then the class is one stage above! local ParentID=getParentID(entityID) entityID=ParentID outputtable[3]=ParentID --as we read it here, no need to read it afterwards display=true for _, p31bis in statements(ParentID, 'P31') do					instanceOfbis = p31bis.mainsnak.datavalue.value.id 					inputtable=fn_getclassinfo(instanceOfbis,displayed_class) if inputtable[1]==nil or inputtable[1]=='nada' then else class_text =inputtable[2] sortkey_class=inputtable[3] classID=inputtable[4] end end end end if entity_type==nil then --bypass if stage inputtable=fn_getclassinfo(instanceOf,displayed_class) if inputtable[1]==nil then elseif inputtable[1]=='nada' then --no display="inputtable[1]==nil" inputtable[1]=='nada'--> display but empty display=true else display=true entity_type=inputtable[1] class_text =inputtable[2] sortkey_class=inputtable[3] classID=inputtable[4] end end end --Now we have the class and know the type of race it is	--Get the circuit, if we display it only if class_text ~=nil then Classlink = class_text else Classlink = sortkey_class= end

if display then if entity_type == 'stage' then Sitelink=getmainraceLink(entityID,entity_type,stageID, functionName) else Sitelink=getmainraceLink(entityID,entity_type,nil, functionName) end outputtable[1]=''..Sitelink.. ' '		if displayclass == true then if classID=='Q23005601' or classID=='Q23005603' then --1WWT 2WWT clear displayedCircuitID = 'Q21075974' elseif classID=='Q22231106' or classID=='Q22231107' then --1UWT 2UWT clear displayedCircuitID = 'Q635366' else --we have to look in the item for _, p361 in statements(entityID, 'P361') do					circuitID = p361.mainsnak.datavalue.value.id for _, p31 in statements(circuitID, 'P31') do --is it a UCI circuit? parentCircuitID = p31.mainsnak.datavalue.value.id						for i=1,#UCI_Circuits do							if parentCircuitID == UCI_Circuits[i] then --Yes it is								displayedCircuitID=circuitID break end end end end end if displayedCircuitID~=nil then Circuitlink = wikibase.getSitelink(displayedCircuitID) --we display the circuit of the year if Circuitlink ~= nil then Classlink = ..class_text.. end end -- class outputtable[2]=''..Classlink.. ' '		end end return outputtable end

local function fn_rider(entityID,dateOfRace,displayteam,only_winner) local winRows = '' local win, winners = {},{} if only_winner == 1 then winners= {Q20882667 = , Q20882747=} -- first, general or stage elseif only_winner == 0 then winners= { Q20882667 = , Q20882668 = ,Q20882669 = ''} -- Q20882668 is 'second overall' else --3 winners= { Q47640757='' } -- World Tour -- name not used here end winner(entityID, winners, dateOfRace, true, WDlink_on, displayteam, true) if only_winner==0 then winRows = winRows .. ''..winners.Q20882667.. ' '		winRows = winRows .. ''..winners.Q20882668.. ' '		winRows = winRows .. ''..winners.Q20882669.. ' '		return winRows else local tempwinner if only_winner == 1 then if winners.Q20882667~=nil and winners.Q20882667~='' then tempwinner=winners.Q20882667 else tempwinner=winners.Q20882747 end else tempwinner=winners.Q47640757 end return winRows .. ''..tempwinner.. ' '	end end

function calendar_main(s)--Display the UCI women calendar of one year local calendarID=s.item local sortkey_class, sortkey local tBody = '' local tableBody, sortindex = {}, {} local timeofrace, displayed_class if displayed_class==nil then	displayed_class=class  else  	displayed_class=s.displayed_class   end

local p527 = wikibase.getBestStatements(calendarID, s.property) -- P27 is country of citizenship if p527[1] and p527[1].mainsnak.snaktype == 'value' then --every thing fine else s.error_message = 2 return '' end

- Begin of the main part of the code if calendarID ~= nil then local kk=0 local fn_racetable,fn_datetable, fn_countrytable ={}, {},{}

for _, p527 in statements(calendarID, 'P527') do			RaceID = p527.mainsnak.datavalue.value.id			 Create a row fn_racetable=fn_race(RaceID,displayed_class,s.displayclass) if fn_racetable[1]~=nil then --otherwise the class is not display tBody = '' fn_datetable=fn_date(RaceID) dateOfRace=fn_datetable[1] tBody = tBody..fn_datetable[2] sortkey=fn_datetable[3] kk=kk+1 --only if displayed if s.numbering==true then tBody = tBody..''..tostring(kk).. ' '				end if s.country == true then fn_countrytable=fn_country(RaceID,dateOfRace,s.countryflagonly,fn_racetable[3]) --fn_racetable[1] is parentID tBody = tBody..fn_countrytable[1] end tBody = tBody..fn_racetable[1] if fn_racetable[2] then	tBody = tBody..fn_racetable[2] end tBody = tBody..fn_rider(RaceID,dateOfRace,s.displayteam,s.only_winner) if s.leadercolumn==true then tBody = tBody..fn_rider(RaceID,dateOfRace,s.displayteam,3) end tBody = tBody.. ' '				 Add the row to the table local number = table.getn(tableBody) --Insertion sort if number == 0 then table.insert(sortindex, sortkey) table.insert(tableBody, tBody) elseif sortkey >= sortindex[number] then table.insert(sortindex, sortkey) table.insert(tableBody, tBody) else for i=number,2,-1 do						if sortkey >= sortindex[i] then table.insert(sortindex, i+1, sortkey) table.insert(tableBody, i+1, tBody) break end end end end end return table.concat (tableBody) end -- no calendar end

function p.nationalchampionships(frame) local calendarID = "" local mode = "" if wiki == "ar" then frame = frame:getParent end UCI = {} UCI["women"] = { ['2018'] = 'Q47088675', ['2017'] = 'Q28005879', ['2016'] = 'Q22021840', ['2015'] = 'Q19296998', ['2014'] = 'Q15621925', ['2013'] = 'Q3339162', ['2012'] = 'Q1333003', ['2011'] = 'Q1143844', ['2010'] = 'Q1568490', ['2009'] = 'Q263224', ['2008'] = 'Q826505', ['2007'] = 'Q43286248', ['2006'] = 'Q43286261', ['2005'] = 'Q1335357', ['2004'] = 'Q43286272', ['2003'] = 'Q43286289', ['2002'] = 'Q43286297', ['2001'] = 'Q43286309' }	UCI["men"] =UCI["women"]

for key, v in pairs(UCI) do		if calendarID == "" and frame.args[key] then --mw.log("find arg " .. key) year = frame.args[key] year = string.gsub( year, "%c", "") modetemp=key if v[year] then calendarID = v[year] end end end

local s = { header_function = calendar_translate, -- translations are in function Calendar_translate header_1 = 19, -- header_2 = {5, 20, 21}, country_column = 1, flag_column = 1, data_sort_type ={, , ''},  -- -- see https://meta.wikimedia.org/wiki/Help:Sorting item = calendarID, property = 'P527', year = year, mode=modetemp, no_country = {}, error_message = 0, displayteam=true }	return tableA(s, nationalchampionships_main(s)) end

function nationalchampionships_main(s)--Display the list of national champions for one year local calendarID=s.item local sortkey_class, tRoadrace, tITT local tBody = '' local tableBody, sortindex = {}, {} local p527 = wikibase.getBestStatements(calendarID, s.property) -- P27 is country of citizenship if p527[1] and p527[1].mainsnak.snaktype == 'value' then --every thing fine else s.error_message = 2 return '' end

if calendarID ~= nil then local championshipID, RaceIDRoadrace, sortkey local fn_datetable, fn_countrytable ={}, {}

for _, p527 in statements(calendarID, 'P527') do			championshipID = p527.mainsnak.datavalue.value.id			tRoadrace='' tITT='' for _, p527bis in statements(championshipID, 'P527') do				RaceID = p527bis.mainsnak.datavalue.value.id				Racelabel= mw.wikibase.label(RaceID) if Racelabel~=nil then Racelabelmod=mw.ustring.gsub( Racelabel, '-', 'x' ) testMenRoadrace=string.find( Racelabel, 'Course en ligne masculine aux' ) testMenITT=string.find( Racelabelmod, 'Contrexlaxmontre masculin aux' ) testWomenRoadrace=string.find( Racelabel, 'Course en ligne féminine aux' ) testWomenITT=string.find( Racelabelmod, 'Contrexlaxmontre féminin aux' ) end --fn_datetable[3] ~= nil then year =fn_datetable[3] end--otherwise keep the old one if s.mode=="women" then if testWomenRoadrace ~= nil then tRoadrace=fn_rider(RaceID,s.year,s.displayteam,1) end if testWomenITT ~= nil then	tITT=fn_rider(RaceID,s.year,s.displayteam,1) end else--men if testMenRoadrace ~= nil then tRoadrace=fn_rider(RaceID,year,s.displayteam,1) end if testMenITT ~= nil then tITT=fn_rider(RaceID,s.year,s.displayteam,1)end end fn_countrytable=fn_country(RaceID,dateOfRace,s.countryflagonly) sortkey=fn_countrytable[2] if fn_countrytable[1]==nil then tBody=' '..tRoadrace..tITT -- else tBody=fn_countrytable[1]..tRoadrace..tITT end tBody = tBody.. ' '			end Add the row to the table local number = table.getn(tableBody) --Insertion sort if number == 0 then table.insert(sortindex, sortkey) table.insert(tableBody, tBody) elseif sortkey >= sortindex[number] then table.insert(sortindex, sortkey) table.insert(tableBody, tBody) else for i=number,2,-1 do					if sortkey >= sortindex[i] then table.insert(sortindex, i+1, sortkey) table.insert(tableBody, i+1, tBody) break end end end--this championship end return table.concat (tableBody) end -- no calendar end

--=== C) Victory === function p.victories(frame)	local s = {		header_function = victories_translate, -- translations are in function victories_translate		header_1 = 2, -- translation 1 in function victories_translate is printed in the upper part of the table header		header_2 = {3, 4, 5, 6, 7},-- translations 2, 3, 4, 5, 6 in function victories_translate are printed in this order										-- in the lower part of the table header. The second value 3 in {4, 3} tells where the icon will go.		data_type = {'date', 'race', 'country', 'class', 'rider'},		country_column = 3,		countryflagonly=false,		flag_column = 2,		data_sort_type = {, 'unsortable', , , }, -- see https://meta.wikimedia.org/wiki/Help:Sorting		item = frame.args[1],		property = 'P2522',		no_country = {},		error_message = 0	}	return tableA(s, victory_main(s, Qnumber)) end

function victory_main(s, Qnumber) local s = s	 _, _, s.item = string.find(s.item, "(%w+)")

local p2522 = wikibase.getBestStatements(s.item, s.property) if p2522[1] and p2522[1].mainsnak.snaktype == 'value' then --every thing fine else s.error_message = 2 return '' end local country = true for _, value in pairs(s.no_country) do -- get data if country should be printed in this wiki if value == wiki then country = false end end local sortkey, sortkey_class local tBody = '' local tableBody, sortindex, fn_countrytable, fn_datetable, fn_racetable = {}, {}, {}, {}, {}

for _, p2522 in statements(s.item, 'P2522') do		RaceID = p2522.mainsnak.datavalue.value.id		tBody = '' -- start the table row fn_datetable=fn_date(RaceID, 'victory') dateOfRace=fn_datetable[1] sortkey=fn_datetable[2] fn_racetable=fn_race(RaceID,nil ,true, 'victory')--displayed_class=nil if fn_racetable[1]~= nil then --otherwise class not to be displayed tBody = tBody..fn_datetable[2] tBody = tBody..fn_racetable[1] if country==true then fn_countrytable=fn_country(RaceID,dateOfRace,s.countryflagonly,fn_racetable[3]) --fn_racetable[3] is parentID tBody = tBody..fn_countrytable[1] end tBody = tBody..fn_racetable[2] tBody = tBody..fn_rider(RaceID,dateOfRace,false,1) tBody = tBody.. ' ' -- end the table row local number = table.getn(tableBody) --Insertion sort if number == 0 then table.insert(sortindex, sortkey) table.insert(tableBody, tBody) elseif sortkey >= sortindex[number] then table.insert(sortindex, sortkey) table.insert(tableBody, tBody) else for i=number,2,-1 do					if sortkey >= sortindex[i] then table.insert(sortindex, i+1, sortkey) table.insert(tableBody, i+1, tBody) break end end end end end return table.concat (tableBody) end

--== D) Stage infobox function p.stageinfobox(frame)	local vvv= 	local tab	local entityId = frame.args[1]	local lang = mw.language.getContentLanguage	local timeofrace	local a1, b1, c1, a2, b2, a3, b3	local jerseyWPID, jersey_name	local t_g = {show=true, name=, icon=, picture=, caption=, course= , race={}, is_a=, startplace=, endplace=, time=,		length=, length_unit=, speed=, speed_unit=, nr_participants_start="", nr_participants_end=, country={},		series_ordinal_previous="", series_ordinal_next="", map=, sectional_view=,previous="", next=""}	local t_s = {order={'results', 'classement_gen', 'classement_annex'},		results={show=false, header=15, order = {'first','second','third','winner_fighting','winner_fighting2','cima_coppi','cima_pantani'},			-- name rider, stageinfobox_translate number, gender, jersey, team name, time, time gap, points, speed, rank			first={"", 16, "", , "", "", , , , }, second={"", 17, "", , , "", , , , }, third={"", 18, "", , , "", , , , }, winner_fighting={"", 19, "", , , , , , , ''}, winner_fighting2={"", 19, "", , , , , , , ''}, -- two winner_fighting possible cima_coppi={"", 40, "", , , , , , , ''}, cima_pantani={"", 41, "", , , , , , , ''}},

classement_gen={show=false, header=20, order = {"leader", "deuxieme", "troisieme"}, -- name rider, stageinfobox_translate number, gender, jersey, team name, time, time gap, points, speed, rank leader={"", 21, "", , "", "", , , , ''}, deuxieme={"", 22, "", , , "", , , , }, troisieme={"", 23, "", , , "", , , , }},

classement_annex={show=false, header=24, order={"points","montagne","sprints","jeune","super_combatif","combine", "stage_volantes","regularite","azzurri_ditalia","breakaway","equipe","equipe_points"}, -- name rider, stageinfobox_translate number, gender, jersey, team name, time, time gap, points, speed, rank points={"", 25, "", , "", , "", , , ''}, montagne={"", 26, "", , , , "", , , }, sprints={"", 27, "", , , , "", , , }, jeune={"", 28, "", , , , , , , ''}, super_combatif={"", 29, "", , "", "", , , , ''}, combine={"", 30, "", , , "", , , , }, stage_volantes={"",31,,,,,,, , }, regularite={"",32,,,,,,, , }, azzurri_ditalia={"",42,,,,,,, , }, breakaway={"",43,,,,,,, , }, equipe={"", 33, "", , , "", , , , }, equipe_points={"", 34, "", , , , , , , ''}} }

if type( entityId ) ~= 'string' then error( 'parameter must be a string') end if not entityId:match( 'Q%d+' ) then error ( 'parameter must be a valid Wikidata item (ex: Q42)' ) end local entity = mw.wikibase.getEntity( entityId )

if entity:getLabel ~= nil then t_g.name = entity:getLabel else t_g.name = entity:getLabel or entity:getLabel('en') or '' end if wiki == 'fr' and t_g.name ~= '' then t_g.name= mw.ustring.gsub(t_g.name, "^(%d+)([re]+)", "%1%2 ") end t_g.name= mw.ustring.gsub(t_g.name, "^(%a)",function (x) return mw.ustring.upper(x) end)

a1, b1 = pcall(fooA, 'numeric-id', entity, 'P31', 1) -- If stage is a "stage" or a timetrial stage if a1 == true and b1~=18131152 then t_g.is_a = 'Q'.. b1 end

if t_g.is_a=='Q2266066' or t_g.is_a=='Q2348250' or t_g.is_a=='Q485321' then t_g.icon = " " else t_g.icon = " " end

a1, b1 = pcall(fooA, 'value', entity, 'P18', 1) -- picture, legende if a1 == true and t_g.picture == "" then local v		t_g.picture = b1		if pcall(foo3, entity, "P18", 1, "P2096", 1) then for _, v in pairs(entity.claims["P18"]) do				pcall(function					for num=1,#v.qualifiers["P2096"] do	-- find right language						if v.qualifiers["P2096"][num].datavalue.value.language == lang:getCode then							t_g.caption = v.qualifiers["P2096"][num].datavalue.value.text end					end				end) end end end

-- Function that give the starting place of a race a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', 1) if a1 == true and t_g.startplace == "" then i = 1 while a1 == true and c1 == 'deprecated' do			i = i + 1 a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1427', i)		end t_g.startplace = "Q" .. b1	end -- Function that give the finishing place of a race a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', 1) if a1 == true and t_g.endplace == "" then i = 1 while a1 == true and c1 == 'deprecated' do			i = i + 1 a1, b1, c1 = pcall(fooA, 'numeric-id', entity, 'P1444', i)		end t_g.endplace = "Q" .. b1	end

-- This function give a format to dates when P585 (date) is used in a single day race a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', 1) if a1 == true and t_g.time == "" then i = 1 while a1 == true and c1 == 'deprecated' do			i = i + 1 a1, b1, c1 = pcall(fooA, 'time', entity, 'P585', i)		end t_g.time = func_date (b1, 'long') timeofrace = b1	end

-- Function that give the number of cyclists at the beginning and at the finishing of a race a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', 1) if a1 == true and t_g.nr_participants_start == "" and t_g.nr_participants_end == "" then i = 1 while a1 == true and c1 == 'deprecated' do			i = i + 1 a1, b1, c1 = pcall(fooA, 'amount', entity, 'P1132', i)		end local v		for _, v in pairs(entity.claims["P1132"]) do			if pcall(function		  		if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 529711 then				t_g.nr_participants_start = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end				end			) then else t_g.nr_participants_start = "" end if pcall(function				if v.qualifiers["P276"][1].datavalue.value["numeric-id"] == 12769393 then				t_g.nr_participants_end = string.gsub(v.mainsnak.datavalue.value.amount, "+", "") end			end			) then else t_g.nr_participants_end = "" end end end

t_g.length = getDistance(entityId, true) or '' t_g.speed = getSpeed(entityId, true) or ''

a1, b1 = pcall(fooA, 'numeric-id', entity, 'P17', 1) -- This function gives countries where the race take place if a1 == true then for i, v in pairs(entity.claims["P17"]) do t_g.country[i] = "Q" .. v.mainsnak.datavalue.value["numeric-id"] end end

a1, b1 = pcall(fooA, 'value', entity, 'P242', 1) -- locator map image if a1 == true and t_g.map == "" then t_g.map = b1 end a1, b1 = pcall(fooA, 'value', entity, 'P2713', 1) -- sectional view if a1 == true and t_g.sectional_view == "" then t_g.sectional_view = b1 end

a1, b1 = pcall(fooA, 'numeric-id', entity, 'P155', 1) if a1 == true and t_g.previous == "" then t_g.previous = "Q"..b1		a2, b2 = pcall(fooA, 'value', mw.wikibase.getEntity( t_g.previous ), 'P1545', 1) if a2 == true then t_g.series_ordinal_previous = b2 end end a1, b1 = pcall(fooA, 'numeric-id', entity, 'P156', 1) if a1 == true and t_g.next == "" then t_g.next = "Q"..b1		a2, b2 = pcall(fooA, 'value', mw.wikibase.getEntity( t_g.next ), 'P1545', 1) if a2 == true then t_g.series_ordinal_next = b2 end end

local t_P642 = {[20882747]={'results', 'first'}, [20882748]={'results', 'second'}, [20882749]={'results', 'third'}, [21686770]={'results', 'winner_fighting'}, [2250962]={'results', 'cima_coppi'}, [10452933]={'results', 'cima_pantani'}, [20882763]={'classement_gen', 'leader'}, [20882764]={'classement_gen', 'deuxieme'}, [20882765]={'classement_gen', 'troisieme'}, [20883213]={'classement_annex', 'montagne'}, [20883140]={'classement_annex', 'jeune'}, [20883008]={'classement_annex', 'points'}, [20883329]={'classement_annex', 'sprints'}, [20893984]={'classement_annex', 'super_combatif'}, [20965880]={'classement_annex', 'combine'}, [27104688]={'classement_annex', 'stage_volantes'}, [27104684]={'classement_annex', 'regularite'}, [20882922]={'classement_annex', 'equipe'}, [27104271]={'classement_annex', 'equipe_points'}, [20882667]={'classement_gen', 'leader'}, [20882668]={'classement_gen', 'deuxieme'}, [20882669]={'classement_gen', 'troisieme'}, [20883212]={'classement_annex', 'montagne'}, [20883139]={'classement_annex', 'jeune'}, [20883007]={'classement_annex', 'points'}, [20883328]={'classement_annex', 'sprints'}, [20893983]={'classement_annex', 'super_combatif'}, [20893979]={'classement_annex', 'combine'}, [27067359]={'classement_annex', 'stage_volantes'}, [27067170]={'classement_annex', 'regularite'}, [27907747]={'classement_annex', 'azzurri_ditalia'}, [27907748]={'classement_annex', 'azzurri_ditalia'}, [27907714]={'classement_annex', 'breakaway'}, [27907715]={'classement_annex', 'breakaway'}, [20882921]={'classement_annex', 'equipe'}, [27104269]={'classement_annex', 'equipe_points'} }

a1, b1 = pcall(fooA, 'numeric-id', entity, "P1346", 1) if a1 == true then local deprecated, qual, id, id_team, id_time, id_time_gap, id_speed, id_points_a, id_points_b for k, v in pairs(entity.claims["P1346"]) do			id_team, id_speed, id_time, id_time_gap, id_points_a, id_points_b = , , , , ,  a, b = pcall(fooC, 'numeric-id', entity, 'P1346', k, 'P54', 1) if a == true then id_team = 'Q'..b end

if pcall(function				id=v.mainsnak.datavalue.value['numeric-id'] -- id = rider id				deprecated = entity.claims["P1346"][k].rank				end) then else id=nil end if id ~= nil then --timeofrace = "+2016-03-00T00:00:00Z" -- function timeStartEnd finds the team of the rider at the time (timeofrace) of the race if id_team ==  and timeofrace ~= nil and timeofrace ~=  then a, b = timeStartEnd('Q'..id, 'P54', 'numeric-id', timeofrace) if a == true and b ~= nil then id_team = 'Q' .. b end end

-- looks into race item if the winner has a P54 statement for beeng a member of a national team pcall(function					for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P54']) do						id_team = national_team('Q'..id, timeofrace, entity, 'P1346', k) -- timeofrace -> startOfSeason ?????						if id_team == nil then id_team = '' end					end				end)

pcall(function -- for property 'race time'					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P2781']) do			  			id_time = tonumber(v.datavalue.value.amount)					end				end)

pcall(function -- for property 'time gap'					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P2911']) do	  					id_time_gap = tonumber(v.datavalue.value.amount)					end				end)

pcall(function -- for property 'speed'					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P2052']) do			  			id_speed = tonumber(v.datavalue.value.amount)					end				end)

pcall(function -- for property 'points for'					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P1358']) do		  				id_points_a = tonumber(v.datavalue.value.amount)					end				end)

pcall(function -- for property 'number of points/goals/set scored'					for _, v in pairs(entity.claims['P1346'][k].qualifiers['P1351']) do		  				id_points_b = tonumber(v.datavalue.value.amount)					end				end)

-- looks into race item if the winner has a P642 statement for showing the type of winner (points, mountain, ..) pcall(function					for _, vv in pairs(entity.claims["P1346"][k].qualifiers['P642']) do						qual=vv.datavalue.value['numeric-id']

if id~=nil and qual~=nil and v.rank~='deprecated' then if qual==21686770 and t_s['results']['winner_fighting'][1] ~= '' then t_P642[qual][2] = 'winner_fighting2' end pcall(function -- inserts WD data into table t_s								t_s[t_P642[qual][1]][t_P642[qual][2]][1]='Q'..id								t_s[t_P642[qual][1]][t_P642[qual][2]][5]=id_team								t_s[t_P642[qual][1]][t_P642[qual][2]][10]=deprecated								if id_time~= then t_s[t_P642[qual][1]][t_P642[qual][2]][6]=id_time end								if id_time_gap~= then t_s[t_P642[qual][1]][t_P642[qual][2]][7]=id_time_gap end								if id_points_a~= then t_s[t_P642[qual][1]][t_P642[qual][2]][8]=id_points_a end								if id_points_b~= then t_s[t_P642[qual][1]][t_P642[qual][2]][8]=id_points_b end								if id_speed~='' then t_s[t_P642[qual][1]][t_P642[qual][2]][9]=id_speed end							end) if qual==27104271 and t_s.classement_annex.equipe_points[1]=='' then t_s.classement_annex.equipe_points[1]='Q'..id end if qual==20882922 and t_s.classement_annex.equipe[1]=='' then t_s.classement_annex.equipe[1]='Q'..id end

a1, b1 = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject('Q'..id), 'P21', 1) -- detect gender if a1 == true then if b1 == 6581097 then t_s[t_P642[qual][1]][t_P642[qual][2]][3] = 'm' -- men elseif b1 == 6581072 then t_s[t_P642[qual][1]][t_P642[qual][2]][3] = 'f' -- female end else t_s[t_P642[qual][1]][t_P642[qual][2]][3] = 'f' -- female end end end end)			end		end	end	local rank, deprecated	local order = {'first', 'second', 'third'}	local property = 'P2417'	a1, b1 = pcall(fooA, 'numeric-id', entity, property, 1)	if a1 == true then	for k, _ in pairs(entity.claims[property]) do -- look into P2417, stage classification		for _, v in pairs(entity.claims[property][k].qualifiers['P1352']) do -- for property 'rank'			rank = tonumber(v.datavalue.value.amount)			deprecated = entity.claims[property][k].rank		end		if rank == 1 or rank == 2 or rank == 3 then			t_s.results[order[rank]][10] = deprecated			if t_s.results[order[rank]][1] ==  or t_s.results[order[rank]][10] == 'normal' then -- name or rider / team				t_s.results[order[rank]][1] = 'Q' .. entity.claims[property][k].mainsnak.datavalue.value['numeric-id']				if t_s.results[order[rank]][7] ==  and t_s.results[order[rank]][6] == '' then		   			pcall(function for _, v in pairs(entity.claims[property][k].qualifiers['P2911']) do -- for property 'time gap' t_s.results[order[rank]][7] = tonumber(v.datavalue.value.amount) end end)				end				if t_s.results[order[rank]][7] ==  and t_s.results[order[rank]][6] ==  then		  			pcall(function for _, v in pairs(entity.claims[property][k].qualifiers['P2781']) do -- for property 'race time' t_s.results[order[rank]][6] = tonumber(v.datavalue.value.amount) end end)				end				if t_s.results[order[rank]][9] == '' then	  				pcall(function for _, v in pairs(entity.claims[property][k].qualifiers['P2052']) do -- for property 'speed' t_s.results[order[rank]][9] = tonumber(v.datavalue.value.amount) end end)				end				a1, b1 = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(t_s.results[order[rank]][1]), 'P21', 1) -- detect gender				if a1 == true then					if b1 == 6581097 then t_s.results[order[rank]][3] = 'm' -- men					elseif b1 == 6581072 then t_s.results[order[rank]][3] = 'f' -- female					end				else t_s.results[order[rank]][3] = 'f' -- female				end			end		end	end	end	order = {'leader', 'deuxieme', 'troisieme'}	property = 'P2321'	a1, b1 = pcall(fooA, 'numeric-id', entity, property, 1)	if a1 == true then	for k, _ in pairs(entity.claims[property]) do -- look into P2321, stage classification		for _, v in pairs(entity.claims[property][k].qualifiers['P1352']) do -- for property 'rank'			rank = tonumber(v.datavalue.value.amount)			deprecated = entity.claims[property][k].rank		end		if rank == 1 or rank == 2 or rank == 3 then			t_s.classement_gen[order[rank]][10] = deprecated			if t_s.classement_gen[order[rank]][1] == '' or t_s.classement_gen[order[rank]][10] == 'normal'  then -- name or rider / team t_s.classement_gen[order[rank]][1] = 'Q' .. entity.claims[property][k].mainsnak.datavalue.value['numeric-id'] if t_s.classement_gen[order[rank]][7] ==  and t_s.classement_gen[order[rank]][6] ==  then pcall(function						for _, v in pairs(entity.claims[property][k].qualifiers['P2911']) do -- for property 'time gap'		  					t_s.classement_gen[order[rank]][7] = tonumber(v.datavalue.value.amount)						end					end) end if t_s.classement_gen[order[rank]][7] ==  and t_s.classement_gen[order[rank]][6] ==  then pcall(function						for _, v in pairs(entity.claims[property][k].qualifiers['P2781']) do -- for property 'race time'		  					t_s.classement_gen[order[rank]][6] = tonumber(v.datavalue.value.amount)						end					end) end if t_s.classement_gen[order[rank]][9] == '' then pcall(function						for _, v in pairs(entity.claims[property][k].qualifiers['P2052']) do -- for property 'speed'		  					t_s.classement_gen[order[rank]][9] = tonumber(v.datavalue.value.amount)						end					end) end a1, b1 = pcall(fooA, 'numeric-id', mw.wikibase.getEntityObject(t_s.classement_gen[order[rank]][1]), 'P21', 1) -- detect gender if a1 == true then if b1 == 6581097 then t_s.classement_gen[order[rank]][3] = 'm' -- men elseif b1 == 6581072 then t_s.classement_gen[order[rank]][3] = 'f' -- female end else t_s.classement_gen[order[rank]][3] = 'f' -- female end end end end end

local a, b  	local span1, span2 = " &#x25C0; ", " &#x25B6; "

if t_g.series_ordinal_previous ~= '' then a, _ = string.gsub(t_g.series_ordinal_previous, "%a", "") -- 20, not 20a if string.find(t_g.series_ordinal_previous, "%a") then b = string.sub(t_g.series_ordinal_previous, string.find(t_g.series_ordinal_previous, "%a")) else b = "" end local label_previous = stageLink(t_g.series_ordinal_previous, a, b)		if t_g.series_ordinal_previous == "0" then label_previous = func_prologue end if mw.wikibase.sitelink( t_g.previous ) ~= nil then local k = transform(t_g.previous,'Q', timeofrace) local i, _ = string.find(k, "|") local j, _ = string.find(k, "]") if i ~= nil and j ~= nil then t_g.previous = string.sub(k, 1, i) .. span1 .. label_previous .. string.sub(k, j) if wiki == "ar" then t_g.previous = string.sub(k, 1, i) .. span2 .. label_previous .. string.sub(k, j) end else t_g.previous = span1 .. label_previous if wiki == "ar" then t_g.previous = span2 .. label_previous end end else t_g.previous = span1 .. label_previous if wiki == "ar" then t_g.previous = span2 .. label_previous end end else t_g.previous = '' end

if t_g.series_ordinal_next~= '' then a, _ = string.gsub(t_g.series_ordinal_next, "%a", "") -- 20, not 20a if string.find(t_g.series_ordinal_next, "%a") then b = string.sub(t_g.series_ordinal_next, string.find(t_g.series_ordinal_next, "%a")) else b = "" end local label_next = stageLink(t_g.series_ordinal_next, a, b)		if t_g.series_ordinal_next == "0" then label_next = func_prologue end if mw.wikibase.sitelink( t_g.next ) ~= nil then local k = transform(t_g.next,'Q', timeofrace) local i, _ = string.find(k, "|") local j, _ = string.find(k, "]") if i ~= nil and j ~= nil then t_g.next = string.sub(k, 1, i) .. label_next.. span2 .. string.sub(k, j) if wiki == "ar" then t_g.next = string.sub(k, 1, i) .. label_next.. span1 .. string.sub(k, j) end else t_g.next = label_next.. span2 if wiki == "ar" then t_g.next = label_next .. span1 end end else t_g.next = label_next.. span2 if wiki == "ar" then t_g.next = label_next .. span1 end end else t_g.next = '' end

if t_g.course== '' then a1, b1 = pcall(fooA, 'value', entity, 'P1545', 1) if a1 == true then a, _ = string.gsub(b1, "%a", "") -- 20, not 20a if string.find(b1, "%a") then b = string.sub(b1, string.find(b1, "%a")) else b = "" end local label = stageLink(b1, a, b)			if b1 == "0" then label = func_prologue end t_g.course = label a2, b2 = pcall(fooA, 'numeric-id', entity, 'P361', 1) if a2 == true then t_g.course = t_g.course .. ', '.. WPlink('Q'..b2,'pure') if wiki == "ar" then t_g.course = t_g.course .. '، '.. WPlink('Q'..b2,'pure') end --t_g.race = 'Q'..b2

local entity_race = mw.wikibase.getEntity('Q'..b2) a3, b3 = pcall(fooA, 'numeric-id', entity_race, 'P31', 1) if a3 == true then for k, v in pairs(entity_race.claims["P31"]) do						t_g.race[k] = 'Q'..v.mainsnak.datavalue.value["numeric-id"] end end end end end

if t_s.results.first[1]~= or t_s.results.second[1]~= or t_s.results.third[1]~='' or t_s.results.winner_fighting[1] then t_s.results.show = true end if t_s.classement_gen.leader[1]~= or t_s.classement_gen.deuxieme[1]~= or t_s.classement_gen.troisieme[1]~='' then t_s.classement_gen.show = true end if t_s.classement_annex.points[1]~= or t_s.classement_annex.montagne[1]~= or t_s.classement_annex.sprints[1]~= or t_s.classement_annex.jeune[1]~= or		t_s.classement_annex.super_combatif[1]~= or t_s.classement_annex.combine[1]~= or t_s.classement_annex.stage_volantes[1]~= or		t_s.classement_annex.regularite[1]~= or t_s.classement_annex.azzurri_ditalia[1]~= or t_s.classement_annex.breakaway[1]~= or		t_s.classement_annex.equipe[1]~= or t_s.classement_annex.equipe_points[1]~= then t_s.classement_annex.show = true end

function stage_icon(x) if x=='Q20646667' then return " " end if x=='Q20646670' then return " " end if x=='Q20680270' then return " " end if x=='Q20646668' then return " " end if x=='Q20679712' then return " " end if x=='Q2348250' then return " " end if x=='Q2266066' then return " " end if x=='Q485321' then return " " end return '' end

local width= '320px' -- size standard 320px, special 340px if t_s.classement_annex.show == true and (wiki == 'no' or wiki == '..') then width= '340px' end

tab = "" tab = tab .. " " tab = tab .. " "

if t_g.picture ~= "" then tab = tab .. " ".."  " end if t_g.picture ~= "" and t_g.caption ~= "" then tab = tab .. " <td colspan='2' style='text-align:center; font-size:80%'>"..t_g.caption.." " end if t_g.course~="" or t_g.is_a~="" or t_g.time~="" or t_g.length~="" or t_g.startplace~="" or t_g.endplace~="" then tab=tab.." <td colspan='2' style='background-color:#FFE7A0; text-align:center'>"..stageinfobox_translate(1).." " end if t_g.course ~= "" then tab = tab.." "..stageinfobox_translate(2).."  " .. t_g.course .. " " end if t_g.is_a ~= "" then tab = tab.." "..stageinfobox_translate(3).."  " ..stage_icon(t_g.is_a).. WPlink(t_g.is_a,'pure').. " " end if t_g.time~="" then tab = tab.." "..stageinfobox_translate(4).."  " .. t_g.time.." " end if t_g.length ~= "" then tab = tab .. " '''" .. stageinfobox_translate(6) .. "''' " .. t_g.length .. " "	end if t_g.startplace ~= "" then tab = tab.." "..stageinfobox_translate(9).."  " .. WPlink(t_g.startplace,'pure').. " " end if t_g.endplace ~= "" then tab = tab.." "..stageinfobox_translate(10).."  " .. WPlink(t_g.endplace,'pure').. " " end if t_g.country ~= nil then for i=1,#t_g.country do t_g.country[i] = flag(t_g.country[i], timeofrace).." ".. WPlink( t_g.country[i],'pure') end end if t_g.country[1] ~= nil then tab = tab.." <td style= 'vertical-align:top'>'''" if #t_g.country == 1 then tab = tab..stageinfobox_translate(7).." " else tab = tab..stageinfobox_translate(8).."  " end for i=1,#t_g.country-1 do tab = tab .. t_g.country[i].." " end tab = tab .. t_g.country[#t_g.country].." " end if t_g.nr_participants_start ~= "" then tab = tab.." "..stageinfobox_translate(11).."  " .. t_g.nr_participants_start .. " " end if t_g.nr_participants_end ~= "" then tab = tab.." "..stageinfobox_translate(12).."  " .. t_g.nr_participants_end .. " " end if t_g.speed ~= "" then tab = tab .. " '''" .. stageinfobox_translate(13) .. "''' " .. t_g.speed .. " "	end

for _, value_order in ipairs(t_s.order) do		if t_s[value_order].show == true then -- if a section of the stageinfobox should be shown tab=tab.." <td colspan='2'>" tab=tab.." " else if t_s[value_order][value][5]~="" or t_s[value_order][value][9] ~="" then -- team row tab=tab.." <td colspan='2' style='text-align:" .. textalign .. ";padding-left:2px'>" if t_s[value_order][value][5] ~= '' then tab=tab..'('..transform(t_s[value_order][value][5],'t', timeofrace)..')' end tab = tab.. ' '.. t_s[value_order][value][9].."  " end end end tab=tab.. "  "		end end

if t_g.map ~= "" then tab = tab .. " <td colspan='2' style='text-align:center'>".." ".." " end if t_g.sectional_view ~= "" then tab = tab .. " <td colspan='2' style='text-align:center'>".." ".." " end

prevNextLine = " "..t_g.previous.." <td style='text-align:right'>" .. t_g.next .. " "	if wiki == "ar" then prevNextLine = " <td width='50%' style='text-align:right'>"..t_g.previous.." <td width='50%' style='text-align:left'>" .. t_g.next .. " " end tab = tab .. prevNextLine

local s = "d:Wikidata:WikiProject Cycling/Documentation/stageinfobox" tab = tab .. " <td colspan='2' style='text-align:right; border-top:3px solid #FFDF80; font-size:75%'>".. --infobox_bottom(1) "" .. stageinfobox_translate(39).. " " tab = tab .. " "	tab= tab.." " return tab end

--== E) List of teams function p.listofteams(frame)	local raceID = frame.args[1]	local teams = {} -- values will be {teamLink, teamCat, sortkey, index}	local text = ''

local timeOfRace, errorMessage = getTimeOfRace(raceID) if not timeOfRace then return errorMessage end

local teamCats = { -- {c,d,e} c = singular team type, d = plural team type, e = print order of the team types ["Q6154783"] = {4,5,1}, -- WorldTeam ["Q20638319"] = {6,7,2}, -- ProTeam ["Q382927"] = {8,9,3}, -- UCI Professional Continental Team ["Q1756006"] = {10,11,4}, -- UCI Continental Team ["Q23726798"] = {12,13,6}, -- national cycling team ["Q20738667"] = {12,13,6}, -- national cycling team U23 ["Q28492441"] = {12,13,6}, -- équipe cycliste nationale de marque ["Q20639848"] = {14,15,7}, -- club cycling team ["Q20639847"] = {16,17,8}, -- professional cycling team ["Q20652655"] = {18,19,9}, -- amateur cycling team ["Q20653563"] = {20,21,10}, -- Groupe Sportif I		["Q20653564"] = {22,23,11}, -- Groupe Sportif II		["Q20653566"] = {24,25,12}, -- Groupe Sportif III ["Q2466826"] = {28,29,5}, -- UCI Women’s Team ["Q26849121"] = {30,31,13} -- Women's amateur cycling team }

local p1923 = mw.wikibase.getBestStatements(raceID, 'P1923') -- P1923 is participating teams local no = 0 -- Index used for stable sorting for _, v in pairs(p1923) do		if v.mainsnak.snaktype == 'value' then no = no + 1 local teamLink, teamCat, countryID = getTeamLinkCat(v.mainsnak.datavalue.value.id, timeOfRace, true) local flagImage = countryID and flag(countryID, timeOfRace) or '' teams[#teams + 1] = {flagImage .. ' ' .. teamLink, teamCat, teamCats[teamCat] and teamCats[teamCat][3] or 999, no} end end

table.sort(teams, function(a,b)		if a[3] < b[3] then return true end -- First sort key: Order from table teamCats		if a[3] > b[3] then return false end		return a[4] < b[4] -- Second key is the index to ensure stable sorting	end)

local function getHeader(CatID, count) local header if teamCats[CatID] then if count == 1 then header = headoftableIII(teamCats[CatID][1]) -- singular name else header = headoftableIII(teamCats[CatID][2]) -- plural name end end local text if not header then -- Unknown team category. Get the label for the entity to display if possible header = (CatID and getLabelFallback(CatID, {wikilang, 'en', 'fr', 'de'})) or 'Unknown team category' text = ' ' .. header .. ' ' 		else text = ' ' .. header .. ' '		end -- Set parameter to show team count in front of each category local showcounter = 2 if count >= showcounter then text = text .. ' (' .. count ..') ' end return text end local oldOrder = 0 local oldCatID local count = 0 local list = '' for _, team in ipairs(teams) do		local order = team[3] if order ~= oldOrder then if oldOrder > 0 then text = text .. getHeader(oldCatID, count) .. '<ol>' .. list .. '</ol>' end count = 1 oldOrder = order list = '' else count = count + 1 end oldCatID = team[2] list = list .. '<li style="text-indent:0em;width:20em;display:inline-block;vertical-align:text-top">' .. team[1] .. '</li>' end

return '  ' end

--== F) Classifications function p.pointsclassification(frame)	local s = {		header_function = headoftableII, -- translations are in function headoftableII		header_1 = 10, -- translation 10 in function headoftableII is printed in the upper part of the table header		header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header		item = string.gsub(frame.args[1], "%c", ""),		property = 'P3494', -- property to use for this table		team_classification = false, -- it is not a team classification table, its a rider classification table		background = 'color' -- there is a background color for the first row		}	return new_classification(frame, s) end

function p.teamsclassificationbytime(frame) local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 14, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {3, 2, 4}, -- translations 3, 2, 4 in function headoftableII are printed in this order in the lower part of the table header item = frame.args[1], property = 'P3497', -- property to use for this table team_classification = true, -- it is a team classification table, its not a rider classification table background = 'strong' -- there is no background color for the first row, but the first row is formated strong }	return new_classification(frame, s) end

function p.teamsclassificationbypoints(frame) local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 15, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {3, 2, 7}, -- translations 3, 2, 7 in function headoftableII are printed in this order in the lower part of the table header item = frame.args[1], property = 'P3496', -- property to use for this table team_classification = true, -- it is a team classification table, its not a rider classification table background = 'strong' -- there is no background color for the first row, but the first row is formated strong }	return new_classification(frame, s) end

function p.stageclassification(frame) if frame.args[2] then display_reftemp=tonumber(frame.args[2]) else display_reftemp=0 end local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 8, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 4 in function headoftableII are printed in this order in the lower part of the table header item = frame.args[1], property = 'P2417', -- property to use for this table team_classification = false, -- it is not a team classification table, its a rider classification table background = false, -- there is no background color for the first row display_ref=display_reftemp }	return new_classification(frame, s) end

function p.generalclassification(frame) if frame.args[2] then display_reftemp=tonumber(frame.args[2]) else display_reftemp=0 end local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 9, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 4 in function headoftableII are printed in this order in the lower part of the table header item = frame.args[1], property = 'P2321', -- property to use for this table team_classification = false, -- it is not a team classification table, its a rider classification table background = 'color', -- there is a background color for the first row display_ref=display_reftemp }	return new_classification(frame, s) end

function p.generalclassificationforttt(frame) if frame.args[2] then display_reftemp=tonumber(frame.args[2]) else display_reftemp=0 end

local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 9, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {3, 2, 4, 5, 6}, -- translations 3, 2, 4, 5, 6 in function headoftableII are printed in this order in the lower part of the table header item = frame.args[1], property = 'P2321', -- property to use for this table team_classification = true, -- it is a team classification table, its not a rider classification table background = false, -- there is no background color for the first row display_ref=display_reftemp }	return new_classification(frame, s) end

function p.teamtimetrialclassification(frame) if frame.args[2] then display_reftemp=tonumber(frame.args[2]) else display_reftemp=0 end

local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 8, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {3, 2, 4, 5, 6}, -- translations 3, 2, 4, 5, 6 in function headoftableII are printed in this order in the lower part of the table header item = frame.args[1], property = 'P2417', -- property to use for this table team_classification = true, -- it is a team classification table, its not a rider classification table background = false, -- there is no background color for the first row display_ref=display_reftemp }	return new_classification(frame, s) end

function p.mountainsclassification(frame) local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 11, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header item = string.gsub(frame.args[1], "%c", ""), property = 'P4320', -- property to use for this table team_classification = false, -- it is not a team classification table, its a rider classification table background = 'color' -- there is a background color for the first row }	return new_classification(frame, s) end

function p.sprintsclassification(frame) local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 12, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header item = string.gsub(frame.args[1], "%c", ""), property = 'P4322', -- property to use for this table team_classification = false, -- it is not a team classification table, its a rider classification table background = 'color' -- there is a background color for the first row }	return new_classification(frame, s) end

function p.bestyoungclassificationbypoints(frame) local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 13, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header item = string.gsub(frame.args[1], "%c", ""), property = 'P4323', -- property to use for this table team_classification = false, -- it is not a team classification table, its a rider classification table background = 'color' -- there is a background color for the first row }	return new_classification(frame, s) end

function p.bestyoungclassification(frame) local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 13, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header item = string.gsub(frame.args[1], "%c", ""), property = 'P4323', -- property to use for this table team_classification = false, -- it is not a team classification table, its a rider classification table background = 'color' -- there is a background color for the first row }	return new_classification(frame, s) end

function p.u23classification(frame) local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 18, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {1, 2, 3, 4}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header item = string.gsub(frame.args[1], "%c", ""), property = 'P4323', -- property to use for this table (same as best young classification) team_classification = false, -- it is not a team classification table, its a rider classification table background = 'color' -- there is a background color for the first row }	return new_classification(frame, s) end

function p.combinationclassification(frame) local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 16, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header item = string.gsub(frame.args[1], "%c", ""), property = 'P4324', -- property to use for this table team_classification = false, -- it is not a team classification table, its a rider classification table background = 'color' -- there is a background color for the first row }	return new_classification(frame, s) end

function p.combativeclassification(frame) local s = { header_function = headoftableII, -- translations are in function headoftableII header_1 = 17, -- translation 10 in function headoftableII is printed in the upper part of the table header header_2 = {1, 2, 3, 7}, -- translations 1, 2, 3, 7 in function headoftableII are printed in this order in the lower part of the table header item = string.gsub(frame.args[1], "%c", ""), property = 'P4321', -- property to use for this table team_classification = false, -- it is not a team classification table, its a rider classification table background = 'color' -- there is a background color for the first row }	return new_classification(frame, s) end

function new_classification(frame, s)	local country = true

if wiki == 'da' then country = false end -- those wikis do not want to show the country column as standard if wiki == 'es' then country = false end -- those wikis do not want to show the country column as standard local s = s	local available_list = available_list local raceID = s.item

--[=[ It is possible to give the classification tables in the article commands to change the standard behaviour. They could look like this:

One additional parameter is "newline" with the values "true" or "false". "newline" says, if there is a line brake after the table. Standard is no line break after the tables stageclassification and teamtimetrialclassification. The second parameter is "country" with the values "true" or "false". "country" tells the module to print the country column or not. Most wikis have as standard to print the country columns, some wikis prefer as standard not to show the country column. A few lines above, the command "if wiki == 'da' then country = false end" tells that daWiki do not want to see the country colums as standard. You can add your wiki here in, if you do not want to see them as standard. With the new parameter editors are able to tell the module in the article what to do. ]=]

local function jersey(h) local jersey_string = ' ' local jerseys = { ['Q24257871'] = {file = 'Jersey yellow.svg', name_ar = 'قميص أصفر لمتصدر الترتيب العام', name_fr = 'maillot jaune de leader du classement général', name_es = 'maillot amarillo de líder de la clasificación general', name_ru = 'жёлтая майка лидера генеральной классификации' },		['Q24645209'] = {file = 'Jersey green.svg', name_ar = 'قميص أخضر لمتصدر ترتيب النقاط', name_fr = 'maillot vert de leader du classement par points', name_es = 'maillot verde de líder de la clasificación por puntos', name_ca = 'mallot verd del líder de la classificació per punts', name_ru = 'зелёная майка лидера очковой классификации' },		['Q24645383'] = {file = 'Jersey white.svg', name_ar = 'قميص أبيض لمتصدر ترتيب الشباب', name_fr = 'maillot blanc de leader du classement du meilleur jeune', name_es = 'maillot blanco de líder de la clasificación de los jóvenes', name_ru = 'белая майка лидера молодёжной классификации', name_de = 'weißes Trikot des Führenden der Nachwuchswertung' },		}

if type(h) == 'table' and h[1] then for _, v in ipairs(h) do				local jersey_name if jerseys[v] then jersey_string = jersey_string .. ''				else p18 = mw.wikibase.getBestStatements(v, 'P18') if p18[1] and p18[1].mainsnak.snaktype == 'value' then jersey_string = jersey_string .. ''					end end end end return jersey_string end -- function end

local timeOfRace, errorMessage = getTimeOfRace(raceID) if not timeOfRace then return errorMessage end

local v = '' local plus = '' local localFrame if string.match(frame:getParent:getTitle, '%P+') == mw.site.namespaces.Template.name then localFrame = frame:getParent else localFrame = frame end if localFrame.args[1] ~= nil then localFrame.args[1] = string.gsub(localFrame.args[1], "%c", "") end

if localFrame.args.country ~= nil then -- switch country column on or off in the article if localFrame.args.country == 'true' then country = true end if localFrame.args.country == 'false' then country = false end end local tableHeader2_size = table.getn(s.header_2)

local tableStart = ' '

local tableStyle, tableNewline if localFrame.args.newline == 'false' then -- parameter newline in WP article is 'false' tableStyle = "float:" .. floattable .. "; margin-right:0.5em; border:1px solid rgb(200,200,200)" tableNewline = '' end if localFrame.args.newline == 'true' then -- parameter newline in WP article is 'true' tableStyle = "border:1px solid rgb(200,200,200)" tableNewline = '<br style="clear:left;">' end if localFrame.args.newline == nil then -- no second parameter, compatible to the old code if s.property == 'P2417' then --stageclassification tableStyle = "float:"..floattable.."; margin-right:0.5em; border:1px solid rgb(200,200,200)" tableNewline = '' else tableStyle = "border:1px solid rgb(200,200,200)" tableNewline = '<br style="clear:left;">' -- everything else end end

return ' ' .. tableNewline end

--=== G) Infobox === function p.infobox(frame)	localframe = frame	-- If true, winners will have Wikidata logos with link to Wikidata	local WDlink_on = (wiki == "mk" or wiki == "ja")

-- If true, winners will the team of the cyclist local team = true

local details = { { name = infobox_translate(2)}, -- course { name = infobox_translate(3), name_plural = infobox_translate(4)}, -- competition { name = infobox_translate(5)}, -- stages { name = infobox_translate(6), name_plural = infobox_translate(7)}, -- date { name = infobox_translate(8)}, -- distance { name = infobox_translate(9), name_plural = infobox_translate(10)}, -- country { name = infobox_translate(11)}, -- start place { name = infobox_translate(12)}, -- endplace { name = infobox_translate(13)}, -- teams { name = infobox_translate(14)}, -- participants at start { name = infobox_translate(15)}, -- participants at end { name = infobox_translate(16)}, -- speed { name = infobox_translate(17)}, -- cost { name = infobox_translate(32), special = true}, -- special 1 { name = infobox_translate(33), special = true}, -- special 2 }	local others = { { name = infobox_translate(29)}, -- picture { name = infobox_translate(30)}, -- caption { name = infobox_translate(31)}, -- map }	local winners = { { name = infobox_translate(19), QID = 'Q20882667' }, -- first { name = infobox_translate(20), QID = 'Q20882668' }, -- second { name = infobox_translate(21), QID = 'Q20882669' }, -- third { name = infobox_translate(22), QID = 'Q20883007' }, -- points { name = infobox_translate(23), QID = 'Q20883212' }, -- mountains { name = infobox_translate(24), QID = 'Q20883328' }, -- sprints { name = infobox_translate(25), QID = 'Q20883139' }, -- youth { name = infobox_translate(26), QID = 'Q20893983' }, -- combativity { name = infobox_translate(35), QID = 'Q27067359' }, -- volantes { name = infobox_translate(36), QID = 'Q27067170' }, -- regularity { name = infobox_translate(27), QID = 'Q20893979' }, -- combination { name = infobox_translate(38), QID = 'Q27907715' }, -- breakaway { name = infobox_translate(39), QID = 'Q27907747' }, -- azzurri { name = infobox_translate(40), QID = 'Q28092831' }, -- rookie { name = infobox_translate(28), QID = 'Q20882921' }, -- teams { name = infobox_translate(37), QID = 'Q27104269' }, -- teamspoints }

local entityID = mw.text.trim(frame.args[1]) local wiki = wiki local wikilang = wikilang local wikibase = mw.wikibase if type(entityID) ~= 'string' then error('parameter must be a string') end if not entityID:match('Q%d+') then error ('parameter must be a valid Wikidata item (ex: Q42)') end

local localFrame if string.match(frame:getParent:getTitle, '%P+') == mw.site.namespaces.Template.name then localFrame = frame:getParent else localFrame = frame end getLocalContent(details, localFrame.args) getLocalContent(others, localFrame.args) getLocalContent(winners, localFrame.args)

local name, dateOfRace, class local icon = (firstValue(entityID, 'P641', 'numeric-id') == 3609) and -- P641 is 'sport', Q3609 is 'road bicycle racing' ' ' or ''

local name = wikibase.getLabel(entityID) if not name then name = getLabelFallback(entityID, {'en', 'fr', 'de'}) or '' end if not others[1].content then --picture others[1].content, others[2].content = getImage(entityID) -- picture, caption end

if not others[3].content then -- map others[3].content = firstValue(entityID, 'P242') -- P242 is 'locator map image' end

if not details[1].content then -- course -- For FR Wiki and Wikidata, exception that permit to display 1er, 2e... for the edition number ; -- for RU Wiki, -й is written after the value of P393 local nr = firstValue(entityID, 'P393') -- P393 is 'edition number' if nr then if wiki == 'fr' then nr = (nr == 1) and "1re " or (nr .. "e ") elseif wiki == "nl" then nr = nr .. "e " elseif wiki == "ru" then nr = nr .. "-й " elseif wiki == "eo" then nr = nr .. "-a " elseif wiki == "hu" then nr = nr .. "-ik " else nr = nr .. ". "			end end local is_a for _, p31 in statements(entityID, 'P31') do -- P31 is 'instance of' local instanceOf = p31.mainsnak.datavalue.value.id			if instanceOf == 'Q27968055' then -- Q27968055 is 'recurrent event edition' -- do nothing elseif classes[instanceOf] then class = classLink(instanceOf) elseif instanceOf == "Q27020041" then -- Q27020041 is 'sports season' local season = firstValue(entityID, 'P3450', 'id') -- P3450 is 'sports season of league or competition' if season then is_a = raceLink(season) end else is_a = raceLink(instanceOf) end end if nr and is_a then details[1].content = nr .. ' ' .. is_a end end if not details[2].content then -- competition -- Class of a cycling race. Class is: 1.UWT, 2.UWT, 1.HC, ... add new classes, no problem -- Competition of the cycling race : UCI World Tour 2016, UCI Europe Tour 2016... local tours = {} for _, p361 in statements(entityID, 'P361') do -- P361 is 'part of' tours[#tours + 1] = raceLink(p361.mainsnak.datavalue.value.id) end if tours[1] then if #tours > 1 then details[2].name = details[2].name_plural end if class then tours[1] = tours[1] .. ' ' .. class end details[2].content = table.concat(tours, ' ') end end

if not details[3].content then -- stages local stages = #wikibase.getAllStatements(entityID, 'P527') -- P527 is 'has part' if stages > 0 then details[3].content = stages end end

if not details[4].content then -- date local sTime = firstValue(entityID, 'P580', 'time') -- P580 is 'start time' local eTime = firstValue(entityID, 'P582', 'time') -- P582 is 'end time' if sTime and eTime then local startTime, endTime = getStartEndTime(sTime, eTime) details[4].content = startTime .. ' – ' .. endTime details[4].name = details[4].name_plural dateOfRace = eTime else -- This function give a format to dates when P585 (date) is used in a single day race local pTime = firstValue(entityID, 'P585', 'time') -- P585 is 'point in time' if pTime then details[4].content = func_date (pTime, 'long') dateOfRace = pTime end end end if not details[5].content then details[5].content = getDistance(entityID, true) end -- distance

if not details[6].content then -- country -- This function gives countries where the race take place local country = {} for _, p17 in statements(entityID, 'P17') do -- P17 is 'country' countryID = p17.mainsnak.datavalue.value.id country[#country + 1] = flag(countryID, dateOfRace) .. ' ' .. getCountryName(countryID) end if country[1] then if #country > 1 then details[6].name = details[6].name_plural end details[6].content = table.concat(country, ' ') end end

if not details[7].content then -- start place local place = firstValue(entityID, 'P1427', 'id') -- P1427 is 'start point' details[7].content = place and getPlaceLink(place) end

if not details[8].content then -- end place local place = firstValue(entityID, 'P1444', 'id') -- P1444 is 'destination point' details[8].content = place and getPlaceLink(place) end if not details[9].content then -- teams local teams = #wikibase.getBestStatements(entityID, 'P1923') -- P1923 is 'participating teams' if teams > 0 then details[9].content = teams end end

-- Function that give the number of cyclists at the beginning and at the finishing of a race for _, p1132 in statements(entityID, 'P1132') do -- P1132 is 'number of participants' local amount = tonumber(p1132.mainsnak.datavalue.value.amount) -- tonumber to remove starting '+' for _, q in qualifiers(p1132, 'P276') do -- P276 is 'location' local location = q.value['numeric-id'] if location == 529711 then -- Q529711 is 'beginning' if not details[10].content then details[10].content = amount end -- participants at start elseif location == 12769393 then -- Q12769393 is 'end' if not details[11].content then details[11].content = amount end -- participants at end end end end

if not details[12].content then details[12].content = getSpeed(entityID, true) end --speed

if not details[13].content then -- cost local cost = firstValue(entityID, 'P2130') -- P2130 is cost if cost then local unit = cost.unit cost = contentLanguage:formatNum(tonumber(cost.amount)) if wiki == 'fo' then cost = string.gsub(t.cost, "%.", ",") end if unit == "http://www.wikidata.org/entity/Q4916" then cost = cost .. ' €'			elseif unit == "http://www.wikidata.org/entity/Q4917" then cost = cost .. ' $'			end details[13].content = cost end end

local tab if wiki == "eo" then tab = "<table style='width:23em; border:1px solid rgb(200,200,200);" .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px;" .. "text-align:" .. textalign .. "; font-size:85%; line-height:1.6em;' class='infobox' >" else tab = "<table cellpadding='4' cellspacing='0' style='float:" .. floatinfobox .. "; width:300px; border:1px solid rgb(200,200,200);" .. "margin:0 0 0.5em 0.5em; background-color:rgb(255, 255, 255); color:black; padding:5px; clear:left; " .. "text-align:" .. textalign .. "; font-size:85%; line-height:1.6em;'>" end tab = tab .. " <td colspan='2' style='border-bottom:5px solid white; font-size:175%; background:#FFDF80; text-align:center'>" .. " "

if others[1].content then -- picture tab = tab .. " <td colspan='2' style='text-align:center'> " if others[2].content then -- caption tab = tab .. " <td colspan='2' style='text-align:center; font-size:80%'>" .. others[2].content .. " "		end end tab = tab .. " <td colspan='2' style='background-color:#FFDF80; text-align:center'>'''" .. infobox_translate(1) .. "''' "	for _, row in ipairs(details) do		if row.content then tab = tab .. "<tr style= 'vertical-align:top'><td style='width:40%'>'''" .. row.name .. "''' " .. row.content .. " "		end end

local winRows = '' local win = {} for _, v in pairs(winners) do		if not v.content then win[v.QID] = '' end end winner(entityID, win, dateOfRace, true, WDlink_on, team, true) for _, v in pairs(winners) do		if not v.content then local QID = v.QID if win[v.QID] ~= '' then v.content = win[v.QID] end end if v.content then winRows = winRows .. "<tr style= 'vertical-align:top'> '''" .. v.name .. "''' " .. v.content .. " "		end end if winRows ~= '' then tab = tab .. " <td colspan='2' style='border-bottom:5px solid white; background-color:#FFDF80; text-align:center'>'''" .. infobox_translate(18) .. "''' " .. winRows end

if others[3].content then -- map tab = tab .. " <td colspan='2' style='text-align:center'> " end tab = tab .. getPreviousNextLine(entityID) local s = "d:Wikidata:WikiProject Cycling/Documentation/infobox" tab = tab .. " <td colspan='2' style='text-align:right; border-top:3px solid #FFDF80; font-size:75%'>" .. "" .. infobox_translate(34) .. "   " return tab end

--=== H) Team roster function p.teamroster(frame)	if frame.args[1] ~= nil then frame.args[1] =	string.gsub(frame.args[1], "%c", "") end	local squadSeason = mw.wikibase.getEntityObject( frame.args[1] )	local flags, pays = {}, {}	local riderIds, riderNames, riderBirthdays, givenname, familyname, riderTeam, time = {}, {}, {}, {}, {}, {}, {}	local riderStart, riderEnd, riderPosition, riderReason, riderRef = {}, {}, {}, {}, {}	local index, riderNames_transl, riderNames_notransl = {}, {}, {}	local labelMissing = false	local lang = mw.language.getContentLanguage	local WDlink_on	local team, rider, startOfSeason	local v = ''

local function trans(date, month, day) if date ~= '' then local _, _, y, m, d = string.find(date, "(%d+)-(%d+)-(%d+)") if m == '00' then m = month end if d == '00' then d = day end date = '+'..y..'-'..m..'-'..d..'T00:00:00Z' return date else return '' end end local function name(i, wiki, transl, names, givenname, familyname) -- transform name "A B ..." into "B ... A"		local _, count = mw.ustring.gsub(names, " ", " ") local a,b,c,d = , , ,  local done = false if count ~= nil then count = count + 1 else count = 1 end

if count > 1 then if count == 2 then if names~='' then _, _, a, b = mw.ustring.find(names, "(%S+)%s+(%S+)") names=b..' '..a..":"..i end else local name_parts_lv = {'da', 'de', 'di', 'De', 'la', 'Le', 'ten', 'van', 'Van'} local name_parts_mk = {'да', 'ди', 'де', 'Де', 'ла', 'Ле', 'тен', 'ван', 'Ван'} local name_parts_ru = {'да', 'ди', 'де', 'Де', 'ла', 'Ле', 'тен', 'ван', 'Ван'} local name_parts   = {'da', 'de', 'di', 'De', 'la', 'Le', 'ten', 'van', 'Van'} local v				if count == 3 and names~='' then _, _, a, b, c = mw.ustring.find(names, "(%S+)%s+(%S+)%s+(%S+)") if wiki == 'mk' then for _,v in ipairs(name_parts_mk) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end end if wiki == 'lv' then for _,v in ipairs(name_parts_lv) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end end if wiki == 'ru' then for _,v in ipairs(name_parts_ru) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end end if wiki ~= 'lv' and wiki ~= 'mk' and wiki ~= 'ru' then for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end end if transl == 'notransl' then --or (wiki~='lv' and wiki~='mk' and wiki~='ru' and wiki~='ja') then for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..a..":"..i done = true break end end end if not done and familyname==2 then names = b..' '..c..' '..a..":"..i done = true end if not done and familyname==1 then names = c..' '..a..' '..b..":"..i done = true end if not done and familyname==0 then names = c..' '..a..' '..b..":"..i done = true end end if count > 3 and names~='' then _, _, a, b, c, d = mw.ustring.find(names, "(%S+)%s+(%S+)%s+(%S+)%s+(%S+)") if wiki == 'mk' then for _,v in ipairs(name_parts_mk) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end for _,v in ipairs(name_parts_mk) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end end if wiki == 'lv' then for _,v in ipairs(name_parts_lv) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end for _,v in ipairs(name_parts_lv) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end end if wiki == 'ru' then for _,v in ipairs(name_parts_ru) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end for _,v in ipairs(name_parts_ru) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end end if wiki ~= 'lv' and wiki ~= 'mk' and wiki ~= 'ru' then for _,v in ipairs(name_parts) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end end if transl == 'notransl' then --or (wiki~='lv' and wiki~='mk' and wiki~='ru' and wiki~='ja') then for _,v in ipairs(name_parts) do if c == v then names = c..' '..d..' '..a..' '..b..":"..i done = true break end end for _,v in ipairs(name_parts) do if b == v then names = b..' '..c..' '..d..' '..a..":"..i done = true break end end end if not done then names = b..' '..c..' '..d..' '..a..":"..i end end end end return names end

local localFrame local sort --	 The word 'sort' is used to sort the riders after the surname. It could look like this in the Wikipedia article	A rider called 'Laurens De Vreese' is sorted after 'De Vreese Laurens'. If you want to sort after 'Vreese Laurens De'	change that in the code. In lvWiki, mkWiki and ruWiki sorting is standard, there is no need to switch sorting on in the article if string.match(frame:getParent:getTitle, '%P+') == mw.site.namespaces.Template.name then localFrame = frame:getParent else localFrame = frame end if localFrame.args[2] ~= nil then if mw.ustring.find(mw.ustring.lower(localFrame.args[2]), "sort") then sort = true else sort = false end end if wiki == "lv" or wiki == "mk" or wiki == "ru" then sort = true end

pcall(function team = squadSeason.claims["P361"][1].mainsnak.datavalue.value['numeric-id'] end)

-- WDlink_on is used to decide if a Wikidata flag will be shown if wiki == "mk" or wiki == "ja" or wiki == "ru" or wiki == "he" then WDlink_on = true else WDlink_on = false end

if pcall(function startOfSeason = squadSeason.claims["P580"][1].mainsnak.datavalue.value.time end) then else local Sitelink = squadSeason:getSitelink(wiki .. 'wiki') or squadSeason:getSitelink('enwiki') or squadSeason:getSitelink('frwiki') or squadSeason:getSitelink('dewiki') or '' if Sitelink == '' then return '> Wikidata is missing data about the start time (P580) and end time (P582) of the season' else startOfSeason = '+'..string.match(Sitelink, '%d%d%d%d' ) ..'-01-01T00:00:00Z' end end

local i = 1 pcall(function	while squadSeason.claims["P527"][i] do		riderIds[i] = 'Q' .. squadSeason.claims["P527"][i].mainsnak.datavalue.value['numeric-id']		riderNames[i] = WPlink(riderIds[i])

rider = mw.wikibase.getEntityObject(riderIds[i]) if pcall(function riderBirthdays[i] = rider.claims["P569"][1].mainsnak.datavalue.value.time end	  	) then else riderBirthdays[i] = '' end if pcall(function local k	for k, _ in pairs(rider.claims["P735"]) do givenname[i] = k end end	  	) then else givenname[i] = 0 end if pcall(function local k for k, _ in pairs(rider.claims["P734"]) do familyname[i] = k end end	  	) then else familyname[i] = 0 end

pcall(function			local language			language = wiki			local entity=mw.wikibase.getEntity(riderIds[i])			if wiki == 'mk' or wiki == 'ru' then				if entity:getLabel(language) ~= nil and (mw.ustring.byte(entity:getLabel(language), 1, 1) > 127 and mw.ustring.byte(entity:getLabel(language), 3, 3) > 127)				then riderNames_transl[i] = entity.labels[language].value riderNames_notransl[i] = 				else riderNames_notransl[i] = entity.labels['en'].value or entity.labels['fr'].value or entity.labels['de'].value riderNames_transl[i] = 				end			end			if wiki ~= 'mk' and wiki ~= 'ru' then				if entity:getLabel(language) ~= nil then riderNames_transl[i] = entity.labels[language].value riderNames_notransl[i] = 				else riderNames_notransl[i] = entity.labels['en'].value or entity.labels['fr'].value or entity.labels['de'].value riderNames_transl[i] = 				end			end		end)

if sort == true then riderNames_transl[i] = name(i, wiki, 'transl', riderNames_transl[i], givenname[i], familyname[i]) riderNames_notransl[i] = name(i, wiki, 'notransl', riderNames_notransl[i], givenname[i], familyname[i]) else index[i] = i		end

if pcall(function			local date = squadSeason.claims["P527"][i].qualifiers["P580"][1].datavalue.value.time or 			riderStart[i] = func_date(trans(date,'01', '01'), 'small')		end		) then else riderStart[i] =  end

if pcall(function			local date = squadSeason.claims["P527"][i].qualifiers["P582"][1].datavalue.value.time			riderEnd[i] = func_date(trans(date,'12', '31'), 'small')		end		) then else riderEnd[i] = '' end

if pcall(function		riderPosition[i] = 'Q' .. squadSeason.claims["P527"][i].qualifiers["P39"][1].datavalue.value['numeric-id']		local entity = mw.wikibase.getEntity( riderPosition[i] )		local label = string.gsub(entity:getLabel, "%b", "") or entity:getLabel( 'en' )		--if label == null then label = entity:getLabel( 'en' ) end		riderPosition[i] = ', ' .. label end		) then else riderPosition[i] = '' end

riderReason[i] = '' pcall(function riderReason[i] = 'Q'.. squadSeason.claims["P527"][i].qualifiers["P1643"][1].datavalue.value['numeric-id'] end) if riderReason[i] == '' then pcall(function riderReason[i] = 'Q'.. squadSeason.claims["P527"][i].qualifiers["P1642"][1].datavalue.value['numeric-id'] end) end if riderReason[i] == '' then pcall(function riderReason[i] = 'Q'.. squadSeason.claims["P527"][i].qualifiers["P1534"][1].datavalue.value['numeric-id'] end) end if riderReason[i] ~= '' then local entity = mw.wikibase.getEntity( riderReason[i] ) local label = string.gsub(entity:getLabel, "%b", "") or entity:getLabel('en') --if label == null then label = entity:getLabel( 'en' ) end riderRef[i] = references(squadSeason, 'P527', i) riderReason[i] = ', ' .. label end

local a, b		local timeofrace local changedTime = '+0000-00-00' local changedTeam = '' local entity, label local stagiaire time[i]= riderTeam[i] =  if pcall(function timeofrace = squadSeason.claims["P527"][i].qualifiers["P580"][1].datavalue.value.time end) then else timeofrace = startOfSeason end if team ~= nil then a = true b = team -- if team known, don´t search for team else a, b = timeStartEnd(riderIds[i], 'P54', 'numeric-id', timeofrace) team = b		end if a == true and b ~= nil then pcall(function				local v				for _, v in pairs(rider.claims["P54"]) do -- look into all P54 teams					pcall(function -- get trainee data from rider item if v.mainsnak.datavalue.value['numeric-id'] == b then -- print riderStart[i], riderEnd[i], riderPosition[i], riderReason[i] if riderReason[i] == '' then pcall(function riderReason[i] = 'Q'.. v.qualifiers["P1643"][1].datavalue.value['numeric-id'] end) end if riderReason[i] == '' then pcall(function riderReason[i] = 'Q'.. v.qualifiers["P1642"][1].datavalue.value['numeric-id'] end) end if riderReason[i] == '' then pcall(function riderReason[i] = 'Q'.. v.qualifiers["P1534"][1].datavalue.value['numeric-id'] end) end if string.sub(riderReason[i],1,1)=='Q' then -- only for these pcall-functions, not for those at line 970 local entity = mw.wikibase.getEntity( riderReason[i] ) local label = string.gsub(entity:getLabel, "%b", "") or entity:getLabel('en') if pcall(function	riderRef[i] = references(squadSeason, 'P527', i) end) then else riderRef[i]='' end --		riderRef[i] = references(squadSeason, 'P527', i) riderReason[i] = ', ' .. label end

local date1 = v.qualifiers["P580"][1].datavalue.value.time date1 = trans(date1,'01','01') local _, _, y1, m1, d1 = string.find(date1, "(%d+)-(%d+)-(%d+)") local date2 if pcall(function date2 = v.qualifiers["P582"][1].datavalue.value.time end) then else date2='+'..y1..'-12-31T00:00:00Z' end date2 = trans(date2,'12','31') local _, _, y2, m2, d2 = string.find(date2, "(%d+)-(%d+)-(%d+)") local _, _, y3, m3, d3 = string.find(startOfSeason, "(%d+)-(%d+)-(%d+)")

if (y1 == y3 or y2 == y3) and ((y1 == y3 and (m1 ~= '01' or d1 ~= '01')) or (y2 == y3 and (m2 ~= '12' or d2 ~= '31'))) then -- riders who start after 1 January or end earlier then 31 December in the season riderStart[i] = func_date(date1, 'small') if pcall(function									local date = v.qualifiers["P582"][1].datavalue.value.time									riderEnd[i] = func_date(date2, 'small')									end								) then else riderEnd[i] = func_date('+'..y1..'-12-31T00:00:00Z', 'small') end

if riderPosition[i] == '' then -- find the 'position' (P39) of a rider pcall(function riderPosition[i] ='Q' ..v.qualifiers["P39"][1].datavalue.value['numeric-id']										local entity = mw.wikibase.getEntity( riderPosition[i] )										local label = string.gsub(entity:getLabel, "%b", "") or entity:getLabel( 'en' )										riderPosition[i] = ', ' .. label									end) end end end end)

stagiaire = '' pcall(function stagiaire = v.qualifiers["P39"][1].datavalue.value['numeric-id'] end) if v.mainsnak.datavalue.value['numeric-id'] ~= b and stagiaire == '' then -- find previous team and end time for the rider at that team local date1 = v.qualifiers["P580"][1].datavalue.value.time date1 = trans(date1,'01','01') local _, _, y1, m1, d1 = string.find(date1, "(%d+)-(%d+)-(%d+)") local date2 if pcall(function date2 = v.qualifiers["P582"][1].datavalue.value.time end) then else date2='+'..y1..'-12-31T00:00:00Z' end date2 = trans(date2,'12','31') local _, _, y2, m2, d2 = string.find(date2, "(%d+)-(%d+)-(%d+)") local _, _, y3, m3, d3 = string.find(startOfSeason, "(%d+)-(%d+)-(%d+)") if y1 <= y3 then -- start time < season time pcall(function								local timeP582 = v.qualifiers["P582"][1].datavalue.value.time								timeP582 = trans(timeP582,'12', '31')								if timeP582 >= changedTime then -- find maximum end time									-- Case Pierre-Roger Latour: Chambéry CF (2012 - 2014), time season at 2013									-- Task: changedTime should be after start time, but before startOfSeason									local _, _, y4, m4, d4 = string.find(timeP582, "(%d+)-(%d+)-(%d+)")									if y4 > y3 then changedTime = '+'..y3..'-12-31T00:00:00Z' else changedTime = timeP582 end									changedTeam = v.mainsnak.datavalue.value['numeric-id']	 							end -- end if							end) -- end function -- print riderTeam[i], time[i] if changedTime ~= '+0000-00-00' then pcall(function riderTeam[i] = WPlink( 'Q'..changedTeam, 'team', changedTime ) end) local _, _, y1, _, _ = string.find(changedTime, "(%d+)-(%d+)-(%d+)") time[i] = ' ('..y1..')' end end end -- end if				end -- end for end) -- end function		end -- end if

local a, b = timeStartEnd( riderIds[i], 'P27', 'numeric-id', startOfSeason ) if a then flags[i] = flag( 'Q' .. b, startOfSeason ) if available_list == true and type( translations.list ) == 'function' then pays[i] = translations.list('Q'..b)		  		if pays[i] == '' then local country = mw.wikibase.getEntityObject( 'Q'..b ) pays[i] = country:getLabel or country:getLabel('en') .. ' (en)' end end else flags[i] = '' pays[i] = '' end

i = i + 1 end end)

-- sorting names after surname if sort == true then if language~='ja' then table.sort(riderNames_transl, function(a,b) return a<b end) table.sort(riderNames_notransl, function(a,b) return a<b end) end local ii, v1, v2, name1, name2, number i = 1 -- sorting riders with a translation for ii,name1 in ipairs(riderNames_transl) do			if name1 ~= '' then v1, v2 = mw.ustring.find(name1, ":") number = mw.ustring.sub(name1, v2+1) name2, _ = mw.ustring.gsub(name1, ":%d+", "") index[i] = tonumber(number) i = i + 1 end end -- sorting riders without a translation for ii,name1 in ipairs(riderNames_notransl) do			if name1 ~= '' then v1, v2 = mw.ustring.find(name1, ":") number = mw.ustring.sub(name1, v2+1) name2, _ = mw.ustring.gsub(name1, ":%d+", "") index[i] = tonumber(number) i = i + 1 end end end

local tableBody= '' local tableHeader = ' ' local tableEndText = '' local tableSize = table.getn(riderNames) local iii = 1 i = 1 while index[i] do tableBody = tableBody.. '<tr style="line-height:1.8em"><td style="padding:0 1em 0 0;white-space:nowrap">' if available_list==false then tableBody=tableBody.. flags[index[i]]..' '..riderNames[index[i]] else tableBody = tableBody.. riderNames[index[i]] end if WDlink_on == true then tableBody = tableBody.. ' '.. wdLink(riderIds[index[i]]) end if riderStart[index[i]]~= or riderEnd[index[i]]~= then tableBody=tableBody..' ('..riderStart[index[i]]..'–'..riderEnd[index[i]].. riderPosition[index[i]]	  		if riderReason[index[i]] ~=  then				note = ', '..getSquadTableColumn(4)..				if wiki == "ar" then note = '، '..getSquadTableColumn(4)..'' end				tableBody = tableBody .. note			end			tableBody=tableBody .. ') ' elseif riderReason[index[i]]~='' then tableBody=tableBody.. ' ('..getSquadTableColumn(4)..''.. ') ' end tableBody = tableBody.. ' <td style="text-align:right;white-space:nowrap">' if wiki == 'lv' then local _, _, y1, m1, d1 = string.find(startOfSeason,"(%d+)-(%d+)-0*(%d+)") local _, _, y2, m2, d2 = string.find(riderBirthdays[index[i]],"(%d+)-(%d+)-0*(%d+)") tableBody = tableBody.. frame:expandTemplate{ title = 'Template:Birth date and age2', args = { y1, m1, d1, y2, m2, d2 } }.. ' '		else tableBody = tableBody.. func_date (riderBirthdays[index[i]], 'long') if available_list==false then tableBody=tableBody..' ' else tableBody=tableBody..' '.. flags[index[i]].. ' '..pays[i].. ' ' end end if wiki=='he' then local isRtl = (mw.ustring.find(riderTeam[index[i]], '\|.*[א-ת]') or (not mw.ustring.find(riderTeam[index[i]], '\|') and mw.ustring.find(riderTeam[index[i]], '[א-ת]'))) if isRtl then tableBody = tableBody.. '<td style="padding:0 0.5em; text-align:right">' else labelMissing = true -- FIXME: labelMissing is not functional in most languages. once we have infra support for it, move it there tableBody = tableBody.. '<td style="padding:0 0.5em; text-align:left">' end else tableBody = tableBody.. '<td style="padding:0 0.5em; text-align:left">' end if riderTeam[index[i]] ~= nil then tableBody = tableBody.. riderTeam[index[i]].. time[index[i]] end tableBody = tableBody..' '

if riderReason[index[i]] ~= '' then if iii == 1 then tableEndText = tableEndText.. getSquadTableColumn(5)..': '.. riderNames[index[i]].. riderReason[index[i]] else tableEndText = tableEndText.. ' '.. getSquadTableColumn(5)..': '.. riderNames[index[i]].. riderReason[index[i]] end iii = iii + 1 if riderRef[index[i]] ~= '' then tableEndText = tableEndText.. frame:extensionTag{name='ref', content=riderRef[index[i]], args = {name='tr_'..i..frame.args[1]}} end tableEndText = tableEndText.. ' '		end i = i + 1 end

--if tableEndText ~= '' then tableEndText = getSquadTableColumn(5)..': '.. tableEndText .. ' ' end

local borderStyle = 'border:1px solid rgb(200,200,200); padding: 4px' if wiki == 'lv' then borderStyle = 'border:0' end local tableStart = ' '

if labelMissing then tableEnd = tableEnd .. getMissingLabelTrackingCategory end

return tableStart .. tableHeader .. tableBody .. tableFoot .. tableEnd .. tableEndText end

--== I) List of winners == function p.listofwinnersChamp(frame)	local countryflag = false	return listofwinners_main(frame, countryflag) end

function p.listofwinners(frame) local countryflag = true return listofwinners_main(frame, countryflag) end

function listofwinners_main(frame, countryflag) local rows = {} frame.args[1] =	string.gsub(frame.args[1], "%c", "") local raceID = frame.args[1] local WDlink_on = (wiki == "mk") or (wiki == "ja") or (wiki == "ru") -- WDlink_on is used to decide if a Wikidata logo will be shown local WPcontent = {}

local localFrame if string.match(frame:getParent:getTitle, '%P+') == mw.site.namespaces.Template.name then localFrame = frame:getParent else localFrame = frame end if localFrame.args[1] then localFrame.args[1] = string.gsub(localFrame.args[1], "%c", "") end --[=[ It is possible to give the table listofwinners in the article commands. It could look like this:

"above row x" inserts a new row above row x into the table. Content is what is behind the ":". ]=]	if localFrame.args[2] then for num, var in pairs(localFrame.args) do			if num > 1 and mw.ustring.find(mw.ustring.lower(localFrame.args[num]), 'row') then local _, _, key1, val = mw.ustring.find(localFrame.args[num], "([^:]+)%s*:%s*(%C+)") local _, _, key01, key11, key12 = mw.ustring.find(key1, "(%a+)%s*(%a+)%s*(%d+)") key12 = tonumber(key12) key11 = mw.ustring.lower(key01..key11) if key11 == 'aboverow' then WPcontent[key12] = val end end end end

local parts = mw.wikibase.getAllStatements(raceID, 'P527') -- P527 is 'has part' for _, part in ipairs(parts) do		if part.rank ~= 'deprecated' and part.mainsnak.snaktype == 'value' then local partID = part.mainsnak.datavalue.value.id			local timeOfRace local p = mw.wikibase.getBestStatements(partID, 'P585') -- P585 is 'point in time' if p[1] and p[1].mainsnak.snaktype == 'value' then timeOfRace = p[1].mainsnak.datavalue.value.time else p = mw.wikibase.getBestStatements(partID, 'P580') -- P580 is 'start time' if p[1] and p[1].mainsnak.snaktype == 'value' then timeOfRace = p[1].mainsnak.datavalue.value.time end end local year = timeOfRace and string.sub(timeOfRace, 2, 5) or '?' local sitelink = mw.wikibase.getSitelink(partID) if sitelink then sitelink =  .. year ..  else sitelink = year end if WDlink_on then sitelink = sitelink .. ' ' .. wdLink(partID) end local winners = { Q20882667 = '', -- Q20882667 is 'overall winner general classification' Q20882668 = '', -- Q20882668 is 'second overall' Q20882669 = '', -- Q20882669 is 'third overall' }			winner(partID, winners, timeOfRace, countryflag, WDlink_on) rows[#rows+1] = {year, " <td style='text-align:center'>" .. sitelink .. " " .. winners.Q20882667 .. " " .. winners.Q20882668 .. " " .. winners.Q20882669 .. " "}		end end table.sort(rows, function(a, b) return a[1] < b[1] end) -- Sort by year local table_first = "<table cellpadding='4' cellspacing='0' style='border:1px solid rgb(200,200,200); color:black;margin:0 0 0.5em 0; background-color:rgb(255, 255, 255); padding:5px; clear:left; text-align:" .. textalign .. "; vertical-align:top; font-size:85%; line-height:1.6em;'>" local table_proto = "<tr style='background:#FFDF80; text-align:center'> " if WDlink_on == false then table_proto = table_proto .. ' '	end table_proto = table_proto .. headoftableIV(1) .. " ".. headoftableIV(2) .. " " .. 		headoftableIV(3) .. " " .. headoftableIV(4) .. " "	local table_center, table_last = "", " "

for i, row in ipairs(rows) do		if WPcontent[i] then table_center = table_center .. " <td colspan='4' style='text-align:center'>" .. WPcontent[i] .. " "		end table_center = table_center .. row[2] end return table_first .. table_proto .. table_center .. table_last end

--== J) List of stages function p.listofstages(frame)	-- WDlink_on is used to decide if a Wikidata logo will be shown	local WDlink_on = wiki == "mk" or wiki == "ja"	local WPcontent = {}	local raceID = frame.args[1]

local localFrame if string.match(frame:getParent:getTitle, '%P+') == mw.site.namespaces.Template.name then localFrame = frame:getParent else localFrame = frame end if localFrame.args[1] then localFrame.args[1] = string.gsub(localFrame.args[1], "%c", "") end --[=[ It is possible to give the table listofstages in the article commands which overwrites data from Wikidata. It could look like this:

The first paramer is "row x" or "after row x". "after row" adds a new row after row x into the table to print e.g. a rest day. The second parameters are "location [a/b/ab]", "date", "icon", "text", "winner [a/b]" and "distance". "a" and "b" means the first and the second location or winner. "ab" could be used if start location and end location are the same. The file data for the icon looks this way: ]=]	if localFrame.args[2] then local WProw, WPnew_row, WPcourse, WPtext, WPdate, WPwinner, WPicon, WPdistance = 'row', 'afterrow', 'location', 'text', 'date', 'winner', 'icon', 'distance' local _, key, key2, val local key01, key11, key12 local key21, key22 for num, var in pairs(localFrame.args) do			if num > 1 and mw.ustring.find(mw.ustring.lower(var), WProw) then _, _, key1, key2, val = mw.ustring.find(var, "([^:]+)%s*:?%s*([^:]*)%s*:%s*(%C+)") _, _, key01, key11, key12 = mw.ustring.find(key1, "(%a+)%s*(%a+)%s*(%d+)") key12 = tonumber(key12) key11 = mw.ustring.lower(key01 .. key11) key2 = mw.ustring.lower(mw.text.trim(key2)) _, _, key21, key22 = mw.ustring.find(key2, "(%a+)%s*(%a*)")

if not WPcontent[key12] then WPcontent[key12] = {} end if key11 == WProw and key21 == WPcourse then WPcontent[key12][key22] = val end if key11 == WPnew_row and key2 == WPdate then WPcontent[key12]['date'] = val WPcontent[key12]['text'] = WPcontent[key12]['text'] or '' WPcontent[key12]['icon (new row)'] = WPcontent[key12]['icon (new row)'] or '' end if key11 == WPnew_row and key2 == WPtext then WPcontent[key12]['text'] = 	val WPcontent[key12]['date'] = 	WPcontent[key12]['date'] or '' WPcontent[key12]['icon (new row)'] = WPcontent[key12]['icon (new row)'] or '' end if key11 == WPnew_row and key2 == WPicon then val = mw.ustring.gsub(val, "|", "|border|right|20px|", 1) WPcontent[key12]['icon (new row)'] = val WPcontent[key12]['date'] = 	WPcontent[key12]['date'] or '' WPcontent[key12]['text'] = WPcontent[key12]['text'] or '' end if key11 == WProw and key21 == WPwinner and key22 == 'a' then WPcontent[key12]['stage winner'] = val end if key11 == WProw and key21 == WPwinner and key22 == 'b' then WPcontent[key12]['general winner'] = val end if key11 == WProw and key21 == WPicon then val = mw.ustring.gsub(val, "|", "|border|right|20px|", 1) WPcontent[key12]['icon'] = val end if key11 == WProw and key21 == WPdistance then WPcontent[key12]['distance'] = val end end end end local rows = {} local stages = mw.wikibase.getBestStatements(raceID, 'P527') -- P527 is 'has part' for _, v in pairs(stages) do		if v.mainsnak.snaktype == 'value' then local stageID = v.mainsnak.datavalue.value.id			local p = mw.wikibase.getBestStatements(stageID, 'P1545') -- P1545 is 'series ordinal' local sOrdinal = p[1] and p[1].mainsnak.snaktype == 'value' and p[1].mainsnak.datavalue.value or '' local _, _, sNumber, sLetter = string.find(sOrdinal, '(%d+)(.*)') if not sNumber then sNumber = '' end if not sLetter then sLetter = '' end local WDLink = WDlink_on and wdLink(stageID) or '' local sitelink = mw.wikibase.getSitelink(stageID)

p = mw.wikibase.getBestStatements(stageID, 'P585') -- P585 is 'point in time' local timeOfRace = p[1] and p[1].mainsnak.snaktype == 'value' and p[1].mainsnak.datavalue.value.time or '' local _, _, year, month, day = string.find(timeOfRace, "(%d+)-0?(%d+)-0?(%d+)")

p = mw.wikibase.getBestStatements(stageID, 'P1427') -- P1427 is 'start point' local sPointID = p[1] and p[1].mainsnak.snaktype == 'value' and p[1].mainsnak.datavalue.value.id			local sPoint = sPointID and getPlaceLink(sPointID) or '' p = mw.wikibase.getBestStatements(stageID, 'P1444') -- P1444 is 'destination point' local dPointID = p[1] and p[1].mainsnak.snaktype == 'value' and p[1].mainsnak.datavalue.value.id			local dPoint = dPointID and getPlaceLink(dPointID) or '' local sDistance = getDistance(stageID, false) or '' local winners = { Q20882747 = '', -- Q20882747 is 'stage winner' Q20882763 = '', -- Q20882763 is 'overall leader at the end of the stage' }			winner(stageID, winners, timeOfRace, true, WDlink_on)

-- find the type of stage local sType = '' p = mw.wikibase.getBestStatements(stageID, 'P31') -- P31 is 'instance of' for _,t in pairs(p) do				if t.mainsnak.snaktype == 'value' then local iOf = t.mainsnak.datavalue.value['numeric-id'] if iOf == 20646667 then sType = typeofstage('plain stage') break end if iOf == 20646670 then sType = typeofstage('hilly stage') break end if iOf == 20680270 then sType = typeofstage('intermediate stage') break end if iOf == 20646668 then sType = typeofstage('mountain stage') break end if iOf == 485321 then sType = typeofstage('time trial stage', 485321) break end -- prologue if iOf == 2266066 then sType = typeofstage('time trial stage', 2266066) break end -- individual time trial if iOf == 2348250 then sType = typeofstage('time trial stage', 2348250) break end -- team time trial if iOf == 20679712 then sType = typeofstage('uphill time trial stage') break end end end

local label, section_title if sOrdinal == "0" then label, section_title = func_prologue, "#" .. func_prologue else label, section_title = stageLink(sOrdinal, sNumber, sLetter) end -- if there is a Wikipedia article of that stage show it or show the section local sLink = sitelink and ("" .. label .. "") or ("" .. label .. "")

if day == "1" and wiki == "fr" then day = "1er" end if wiki == "lv" then sLink = sOrdinal end local month = func_month(tonumber(month)) local sDate if wiki == "br" then sDate = day .. " a viz ".. month elseif wiki == "ca" or wiki == "es" then sDate = day .. " de ".. month elseif wiki == "eo" then sDate = day .. "-a de " .. month elseif wiki == "eu" then sDate = month .. "k " .. day elseif wiki == "hu" then sDate = month .. " " .. day .. "."			elseif wiki == "ja" then sDate = month .. day .. "日" elseif wiki == "de" or wiki == "da" or wiki == "fi" or wiki == "fo" or wiki == "no" or wiki == "lv" then sDate = day .. ". " .. month elseif wiki == "cs" then sDate = day .. ". xg " .. month elseif wiki == "en" then sDate = month .. " " .. day else sDate = day .. ' ' .. month end

rows[#rows + 1] = { tonumber(sNumber), sLetter, -- Sort keys sLink, sDate, WDLink, sPoint, dPoint, sType, sDistance, winners['Q20882747'], winners['Q20882763'] -- Content }		end end

table.sort(rows, function(a, b)		if a[1] ~= b[1] then return a[1] < b[1] end		return a[2] < b[2]	end)

for num, row in pairs(rows) do		local sLink, sDate, WDLink, sPoint, dPoint, sType, sDistance, sSWin, sGWin = row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11]

local WPc = WPcontent[num] if WPc then if WPc['a'] then sPoint = WPc['a'] end if WPc['b'] then dPoint = WPc['b'] end if WPc['ab'] then sPoint, dPoint = WPc['ab'], '' end if WPc['icon'] then sType = WPc['icon'] end if WPc['distance'] then sDistance = WPc['distance'] end end

local t = " <td style='text-align:center; white-space:nowrap'>" .. sLink .. " ".. WDLink .. " <td style='white-space:nowrap; text-align:right; padding-right:0px'>" .. sDate .. " <td style='padding-right:0px'>" .. sPoint if dPoint ~= '' then t = t .. " – " .. dPoint end t = t .. " <td style='padding-top:10px'>" .. sType .. " <td style='text-align:center'>" .. sDistance .. " "

if WPc and WPc['stage winner'] then t = t .. "<td style='text-align:" .. textalign .. "'>" .. WPc['stage winner'] .. " "		else t = t .. " " .. sSWin .. " "		end if WPc and WPc['general winner'] then t = t .. "<td style='text-align:" .. textalign .. "'>" .. WPc['general winner'] .. " "		else t = t .. " " .. sGWin .. " "		end if WPc and (WPc['date'] or WPc['text'] or WPc['icon (new row)']) then t = t .. "  "			if WPc['icon (new row)'] == '' then t = t .. "<td style='text-align:right; padding:3px 0px 10px 0px;white-space:nowrap'>" .. WPc['date'] .. " <td style='text-align:" .. textalign .. "; padding:3px 4px 10px'>" .. WPc['text'] else t = t .. "<td style='text-align:right; padding-right:0px'>" .. WPc['date'] .. " <td style='text-align:" .. textalign .. "'>" .. WPc['text'] end t = t .. " <td style='padding-top:10px'>" .. WPc['icon (new row)'] .. " <td colspan='3' > " end rows[num] = t	end

return "<table border='0' cellpadding='4' cellspacing='0' style='border:1px solid rgb(200,200,200); color:black; margin:0 0 0.5em 0; background-color:rgb(255, 255, 255); padding:5px; clear:left; text-align:" .. textalign .. "; font-size:85%; line-height:1.6em;'>" .. "<tr style='background:#FFDF80; text-align:center;'><th style='white-space:nowrap'>" .. (not WDlink_on and ("")) .. headoftable(1) .. " " .. headoftable(2) .. " ".. headoftable(3) .. " <th style='color:#FFDF80'>type ".. headoftable(4) .. " ".. headoftable(5) .. " " .. headoftable(6) .. " ", table.concat(rows), " " end

-- Give access to a local variable. Used by other modules. function p.getLocal(name) if name == 'getTeamLinkCat' then return getTeamLinkCat end if name == 'getStatementForTime' then return getStatementForTime end end

return p