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 'unknown 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 'unknown 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 'unknown 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, '­', '') -- filter soft hyphen out

local name_plural = content.name_plural

local name_pluralNoShy = name_plural and mw.ustring.gsub(name_plural, '­', '') -- 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 = '◀ ' .. year .. ''

else

previousText = ' ' .. year

end

end

if nextID then

local year = getYear(nextID)

local link = wikibase.getSitelink(nextID)

if link then

nextText = '' .. year .. ' ▶'

else

nextText = year .. ' '

end

end

local direction = contentLanguage:getDir()

return "

"'>" .. previousText .. "

"'>" .. nextText .. ""

end

--=== D) Link functions (obsolete) ===

function wdLink (id)

return "File:Wikidata-logo S.svg"

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 = " [[File:Wikidata-logo S.svg|12px|link=d:"

if not string.find(q_number, "^Q%d+") then return q_number end -- test if q_number is an item

if command == "Q" then return WPlink( q_number ) end -- find variables with an item as value

if command == 'q' then -- with 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 )..wd..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 )..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 = ' File:Exclam icon.svg'

end

local tableHeader2_size = table.getn(s.header_2)

local tableStart = '

'

local tableHeader2 = '

'

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

for i,k in ipairs(s.header_2) do

if i == s.country_column then

if available_list==true and country == true then

tableHeader2 = tableHeader2.. '

' end

end

if i ~= s.country_column then

if s.data_sort_type[i] == 'unsortable' then tableHeader2 = tableHeader2.. '

'

else tableHeader2 = tableHeader2.. '

'

end

end

end

tableHeader2 = tableHeader2 .. '

'

local tableEnd = '

' style="padding:2px 2px; text-align:center; background-color:#FFDF80; line-height: 1.8em;">'

local tableHeader1 = 'File:Wikidata-logo S.svg'.. error_message .. '' ..

s.header_function (wiki, s.header_1, s.title) .. '

'.. s.header_function (wiki, k) .. ' ' .. s.header_function (wiki, k) .. ' ' .. s.header_function (wiki, k) .. '
'

return '

' .. tableStart .. tableHeader1 .. tableHeader2 .. tableBody .. tableEnd .. '
'

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 = 'Category:Missing flag in Module:Cycling race'

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 'File:' .. file .. ''

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 'File:' .. p41[1].mainsnak.datavalue.value .. '' .. trackingCategory

end

else

-- Search flag for specific date

local p41 = getStatementForTime(countryID, "P41", date) -- P41 is flag image

if p41 then

return 'File:' .. p41.mainsnak.datavalue.value .. '' .. 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"] = 'Kategorie:Údržba:Doplnit štítek na Wikidatech',

["//lv.wikipedia.org"] = 'Category:Vikidatos trūkst nosaukuma latviešu valodā',

["//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­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­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­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­sieger", "Gesamt­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­vinnari", "Gula troyggjan"},

["hu"] = {"Szakasz", "Időpont", "Végpontok", "Hossz (km)", "Szakasz­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­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­leider"},

["no"] = {"Etappe", "Dato", "Start – Målgang", "Distanse (km)", "Etappe­vinner", "Sammenlagt­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 "File:Plainstage.svg" end

if x=='hilly stage' then return "File:Hillystage.svg" end

if x=='intermediate stage' then return "File:Mediummountainstage.svg" end

if x=='mountain stage' then return "File:Mountainstage.svg" end

if x=='uphill time trial stage' then return "File:Mountain Time Trial Stage.svg" end

if x=='rest day' then return "File:Stage rest day.svg" end

if x=='time trial stage' then

if typ==2348250 then return "File:Team Time Trial Stage.svg" end

if typ==2266066 then return "File:Time Trial.svg" end

if typ==485321 then return "File:Time Trial.svg" 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: {{1re}} étape, {{2e}} é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 = {{1re}} étape, {{2ae}} é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 = {{1re}} étape, {{2ae}} é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 = " 35px"

else t_g.icon = " 35px" 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 = "", ""

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 "20px " end

if x=='Q20646670' then return "20px " end

if x=='Q20680270' then return "20px " end

if x=='Q20646668' then return "20px " end

if x=='Q20679712' then return "20px " end

if x=='Q2348250' then return "20px " end

if x=='Q2266066' then return "20px " end

if x=='Q485321' then return "20px " 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 .. "

"

if t_g.picture ~= "" then tab = tab .. "

" end

if t_g.picture ~= "" and t_g.caption ~= "" then tab = tab .. "

" 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.."

" end

if t_g.course ~= "" then tab = tab.."

" end

if t_g.is_a ~= "" then tab = tab.."

" end

if t_g.time~="" then tab = tab.."

" end

if t_g.length ~= "" then

tab = tab .. "

"

end

if t_g.startplace ~= "" then tab = tab.."

" end

if t_g.endplace ~= "" then tab = tab.."

" 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.."

" end

if t_g.nr_participants_start ~= "" then tab = tab.."

" end

if t_g.nr_participants_end ~= "" then tab = tab.."

" end

if t_g.speed ~= "" then

tab = tab .. "

"

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.."

"

end

end

if t_g.map ~= "" then tab = tab .. "

" end

if t_g.sectional_view ~= "" then tab = tab .. "

" end

prevNextLine = "

"

if wiki == "ar" then prevNextLine = "

" end

tab = tab .. prevNextLine

local s = "d:Wikidata:WikiProject Cycling/Documentation/stageinfobox"

tab = tab .. "

"

tab= tab.."

"

tab = tab .. "

" .. t_g.name .."" .. t_g.icon .. "
".." File:".. t_g.picture .."
"..t_g.caption.."
"..stageinfobox_translate(1).."
"..stageinfobox_translate(2).."" .. t_g.course .. "
"..stageinfobox_translate(3).."" ..stage_icon(t_g.is_a).. WPlink(t_g.is_a,'pure').. "
"..stageinfobox_translate(4).."" .. t_g.time.."
" .. stageinfobox_translate(6) .. "" .. t_g.length .. "
"..stageinfobox_translate(9).."" .. WPlink(t_g.startplace,'pure').. "
"..stageinfobox_translate(10).."" .. WPlink(t_g.endplace,'pure').. "
'''"

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].."

"..stageinfobox_translate(11).."" .. t_g.nr_participants_start .. "
"..stageinfobox_translate(12).."" .. t_g.nr_participants_end .. "
" .. stageinfobox_translate(13) .. "" .. t_g.speed .. "
"

tab=tab.."

"

tab=tab.."

"

for key, value in ipairs(t_s[value_order].order) do

if t_s[value_order][value][1]~="" then

a1, jersey_name, jerseyWPID = jersey(wiki, value, t_g.race, timeofrace)

if a1~='' then t_s[value_order][value][4] = a1 end

if t_s[value_order][value][9] ~= '' then

t_s[value_order][value][9] = '('.. lang:formatNum(t_s[value_order][value][9])..unit(5)..')'

if wiki == 'fo' then t_s[value_order][value][9] = string.gsub(t_s[value_order][value][9], "%.", ",") end

end

if t_s[value_order][value][8] ~= '' then

if t_s[value_order][value][8] > 1 then t_s[value_order][value][8] = t_s[value_order][value][8]..unit(7)

else t_s[value_order][value][8] = t_s[value_order][value][8]..unit(6) end end

local title, k =mw.ustring.gsub(stageinfobox_translate(t_s[value_order][value][2]), " ", " ")

if k > 0 then title=mw.ustring.gsub(title, " ", "
", 1) end --

if t_s[value_order][value][5]=="" and t_s[value_order][value][9] =="" then

tab=tab.."

"

end

if t_s[value_order][value][5]~="" and t_s[value_order][value][9] ~="" then -- team row

tab=tab.."

"

else

if t_s[value_order][value][5]~="" or t_s[value_order][value][9] ~="" then -- team row

tab=tab.."

"

end

end

end

tab=tab.. "

'''"..

stageinfobox_translate(t_s[value_order].header).."'''

'''"

else tab=tab.."

'''"

end

if value_order~='classement_annex' and t_s[value_order][value][2]~=40 and t_s[value_order][value][2]~=41 then -- Cima Coppi, Cima Pantani with a line break

if t_s[value_order][value][4] == "" then

if (value_order=='results') and (value=='winner_fighting' or value=='winner_fighting2' or value=='cima_coppi' or value=='cima_pantanii') then

tab=tab..stageinfobox_translate(t_s[value_order][value][2])

else tab=tab..number(t_s[value_order][value][3], key, wiki) end

else

if jerseyWPID=='' then tab=tab.."File:"..t_s[value_order][value][4]..""

else tab=tab.."File:"..t_s[value_order][value][4].."" end

end

else

if t_s[value_order][value][4] == "" then tab=tab..title

else

if jerseyWPID=='' then

if jersey_name ~= '' then tab=tab.."File:"..t_s[value_order][value][4].."" .. title

else tab=tab.."20px" .. title end

else tab=tab.."File:"..t_s[value_order][value][4].."" .. title end end

end

if t_s[value_order][value][10] == 'deprecated' then

tab=tab.. "'''

".. '' .. transform(t_s[value_order][value][1],'f', timeofrace) .. ''

else tab=tab.. "'''

".. transform(t_s[value_order][value][1],'f', timeofrace) end

tab=tab.."

"

if t_s[value_order][value][6]~='' then tab=tab.. calculate_time(t_s[value_order][value][6]) end

if t_s[value_order][value][7]~='' then tab=tab..'+ '.. calculate_time(t_s[value_order][value][7]) end

tab= tab.. t_s[value_order][value][8].. "

"

tab = tab.. "

"

tab = tab.. "

("..transform(t_s[value_order][value][5],'t', timeofrace)..

")

"..t_s[value_order][value][9] .. "
"

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].."

".." File:".. t_g.map .."".."
".." File:".. t_g.sectional_view .."".."
"..t_g.previous.."" .. t_g.next .. "
"..t_g.previous.."" .. t_g.next .. "
".. --infobox_bottom(1)

"" .. stageinfobox_translate(39).. " File:Wikidata-logo S.svg"

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 .. ''

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) .. '

    ' .. list .. '
'

end

count = 1

oldOrder = order

list = ''

else

count = count + 1

end

oldCatID = team[2]

list = list .. '

  • ' .. team[1] .. '
  • '

    end

    return '

    ' ..

    text .. getHeader(oldCatID, count) .. '

      ' .. list ..

      '

    [[File:Wikidata-logo S.svg|12px|link=d:' ..

    raceID .. '#P1923]]

    '

    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:

    {{Cycling race/teamsclassificationbytime|Q18574623|newline=false|country=true}}

    {{Cycling race/teamsclassificationbytime|Q18574623|country= false|newline=false}}

    {{Cycling race/teamsclassificationbypoints|Q18574623|newline =true|country=true}}

    {{Cycling race/teamsclassificationbypoints|Q18574623|newline= true}}

    {{Cycling race/teamsclassificationbypoints|Q18574623|newline = false|country=false}}

    {{Cycling race/teamsclassificationbytime|Q18574623|newline=true|country=true}}

    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 .. '[[File:' .. jerseys[v].file .. '|20px'

    jersey_name = jerseys[v]['name_' .. wiki] or mw.wikibase.getLabel(v) or jerseys[v]['name_fr']

    if jersey_name then

    jersey_string = jersey_string .. '|' .. jersey_name

    end

    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 .. '[[File:' .. p18[1].mainsnak.datavalue.value .. '|20px'

    jersey_name = getLabelFallback(v, {wikilang, 'en', 'fr'})

    if jersey_name then

    jersey_string = jersey_string .. '|' .. jersey_name

    end

    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 tableHeader2 = '

    '

    for i, k in ipairs(s.header_2) do

    if i==1 then

    tableHeader2 = tableHeader2.. '

    '

    elseif i==2 and available_list and country or i>=3 then

    tableHeader2 = tableHeader2.. '

    '

    end

    end

    tableHeader2 = tableHeader2.. '

    '

    local tableBody = ''

    local t_Body = {}

    local bg_color

    local nr_jersey

    local claims = mw.wikibase.getAllStatements(raceID, s.property)

    for l, m in pairs(claims) do -- look into all statements

    if m.mainsnak.snaktype == 'value' then

    local riderID = m.mainsnak.datavalue.value.id

    local q = m.qualifiers or {}

    local rank, riderLink, gender, countryID, countryName, teamLink

    local flagLink, countryName = ,

    local h = {

    jersey = {}, -- lots of jerseyID

    value = {, , , } -- points, time, time_gap, speed

    }

    if q.P1352 and q.P1352[1].snaktype == 'value' then -- P1352 is ranking

    rank = tonumber(q.P1352[1].datavalue.value.amount)

    else

    rank = ''

    end

    if wiki == 'es' or wiki == 'fr' or wiki == 'ast' then

    -- These wikis need the gender to display the rank correct. Other wikis can skip this.

    local p21 = mw.wikibase.getBestStatements(riderID, 'P21') -- P21 is gender

    if p21[1] and p21[1].mainsnak.snaktype == 'value' then

    local g = p21[1].mainsnak.datavalue.value.id

    if g == 'Q6581097' then gender = 'm' -- Male

    elseif g == 'Q6581072' then gender = 'f' -- Female

    end

    else

    gender = 'n' -- For teams

    end

    end

    if q.P1358 and q.P1358[1].snaktype == 'value' then -- P1358 is points

    h.value[1] = tonumber(q.P1358[1].datavalue.value.amount)

    end

    if q.P2781 and q.P2781[1].snaktype == 'value' then -- P2781 is race time

    h.value[2] = tonumber(q.P2781[1].datavalue.value.amount)

    end

    if q.P2911 and q.P2911[1].snaktype == 'value' then -- P2911 is time gap

    h.value[3] = tonumber(q.P2911[1].datavalue.value.amount)

    plus = '+ '

    end

    if q.P2052 and q.P2052[1].snaktype == 'value' then -- P2052 is speed

    h.value[4] = tonumber(q.P2052[1].datavalue.value.amount)

    end

    if q.P2912 then -- P2912 is distinctive jersey

    for _, v in pairs(q.P2912) do

    if v.snaktype == 'value' then

    table.insert(h.jersey, v.datavalue.value.id)

    end

    end

    end

    if s.team_classification then

    teamLink, _, countryID = getTeamLinkCat(riderID, timeOfRace, true)

    else

    riderLink = getRiderLink(riderID)

    teamLink = getTeam(riderID, timeOfRace, q)

    local p27 = getStatementForTime(riderID, 'P27', timeOfRace) --P27 is country of citizenship

    if p27 then

    countryID = p27.mainsnak.datavalue.value.id

    end

    end

    if countryID then

    flagLink = flag(countryID, timeOfRace)

    if available_list and country then

    if type(translations.list) == "function" then

    countryName = translations.list(countryID)

    end

    if countryName == '' then

    local label, lang = mw.wikibase.getLabelWithLang(countryID)

    -- Uses standard language fallback. Should not be nil, as all countries have English labels.

    if lang == wikilang then

    countryName = label

    else

    countryName = label .. ' (' .. lang .. ')'

    end

    end

    end

    end

    local tBody = '

    -- find the right background color if a rider has more then one jersey

    -- see Wikidata:WikiProject Cycling/Kit to translate/Jerseys

    if h.jersey[1] then

    local bg_color_table = {

    ["Q24257871"] ="#FFFF99" , -- Jersey yellow.svg (General)

    ["Q24257763"] ="#FFC0CB" , -- Jersey pink.svg (General)

    ["Q24257872"] ="#FF8666" , -- Jersey red.svg (General)

    ["Q24687408"] ="#99CBFF" , -- Jersey blue.svg (General)

    ["Q24258056"] ="#FFD030" , -- Jersey orange.svg (General)

    ["Q26696171"] ="#FFFFFF" , -- Jersey white.svg (General)

    ["Q24258125"] ="#BFFF80" , -- Jersey green 2.svg (General)

    ["Q24257991"] ="#FFD030" , -- Jersey gold.svg (General)

    ["Q24645208"] ="#90EE90" , -- Jersey green.svg (General)

    ["Q26945271"] ="#90EE90" , -- MaillotVolta.png (General)

    ["Q26945272"] ="#BF80FF" , -- Jersey violet.svg (General)

    ["Q29982321"] ="#FFFF99" , -- Jersey combined.svg (General)

    ["Q29594434"] ="#87CEEB" , -- Jersey green lines volta.svg (General)

    ["Q30132459"] ="#FFFF99" , -- Jersey yellow-bluebar.svg (General)

    ["Q24645209"] ="#90EE90" , -- Jersey green.svg (Points)

    ["Q25831179"] ="#FFFFFF" , -- Jersey white.svg (Points)

    ["Q26919974"] ="#FF8666" , -- Jersey red.svg (Points)

    ["Q24687409"] ="#99CBFF" , -- Jersey blue.svg (Points)

    ["Q25265938"] ="#BF80FF" , -- Jersey violet.svg (Points)

    ["Q27114205"] ="#C0C0C0" , -- Jersey black.svg (Points)

    ["Q28546656"] ="#FFFF99" , -- Jersey yellow.svg (Points)

    ["Q28820618"] ="#87CEEB" , -- MaillotCyan.PNG (Points)

    ["Q29982764"] ="#FFD030" , -- Jersey orange.svg (Points)

    ["Q43276992"] ="#FFC0CB" , -- Jersey pink.svg (Points)

    ["Q47945989"] ="#6495ED" , -- Jersey dark blue.svg (Points)

    ["Q56449834"] ="#E0FFFF" , -- Jersey blue dotted.png (Points)

    ["Q25265958"] ="#FFC0CB" , -- Jersey polkadot.svg (Mountain)

    ["Q25265959"] ="#E0FFFF" , -- Jersey blue dotted.png (Mountain)

    ["Q25265960"] ="#FFC0CB" , -- Jersey climbing Dauphine.png (Mountain)

    ["Q27670178"] ="#FF8666" , -- Jersey red.svg (Mountain)

    ["Q27670182"] ="#90EE90" , -- Jersey green.svg (Mountain)

    ["Q27670174"] ="#FFD030" , -- Jersey orange.svg (Mountain)

    ["Q24790519"] ="#C0C0C0" , -- Jersey grey.svg (Mountain)

    ["Q27670105"] ="#C0C0C0" , -- Jersey blackdots.png (Mountain)

    ["Q28604413"] ="#99CBFF" , -- Jersey blue.svg (Mountain)

    ["Q25266023"] ="#F5DEB3" , -- Jersey brown.svg (Mountain)

    ["Q27670126"] ="#FF8666" , -- Jersey granate.svg (Mountain)

    ["Q25831602"] ="#FF69B4" , -- Jersey rosa.svg (Mountain)

    ["Q29168665"] ="#FFC0CB" , -- Jersey pink.svg (Mountain)

    ["Q29823248"] ="#FFFFFF" , -- Jersey white.svg (Mountain)

    ["Q28820591"] ="#F5DEB3" , -- Jersey red green.svg (Mountain)

    ["Q36859499"] ="#CCFFCC" , -- Jersey greendots.svg (Mountain)

    ["Q33060977"] ="#C0C0C0" , -- Jersey black.svg (Mountain)

    ["Q47537141"] ="#87CEEB" , -- MaillotCyan.PNG (Mountain)

    ["Q50822370"] ="#FFC0CB" , -- Jersey red lines volta.svg (Mountain)

    ["Q56246573"] ="#C0C0C0" , -- Jersey black white dotted.svg (Mountain)

    ["Q26858731"] ="#FFFFFF" , -- Jersey white.svg (Combinated)

    ["Q28823004"] ="#FFFF99" , -- Jersey combined.svg (Combinated)

    ["Q28604421"] ="#FFD030" , -- Jersey orange.svg (Combinated)

    ["Q43098388"] ="#99CBFF" , -- Jersey blue.svg (Combinated)

    ["Q24790627"] ="#FF8666" , -- Jersey red.svg (Sprints)

    ["Q25831754"] ="#99CBFF" , -- Jersey blue.svg (Sprints)

    ["Q26806427"] ="#90EE90" , -- Jersey green.svg (Sprints)

    ["Q27478100"] ="#C0C0C0" , -- Jersey black.svg (Sprints)

    ["Q28060932"] ="#BF80FF" , -- Jersey violet.svg (Sprints)

    ["Q28483869"] ="#FFFF99" , -- Jersey yellow.svg (Sprints)

    ["Q33134180"] ="#FF69B4" , -- Jersey rosa.svg (Sprints)

    ["Q42532690"] ="#E0FFFF" , -- Jersey light blue.svg (Sprints)

    ["Q43278032"] ="#FFC0CB" , -- Jersey polkadot.svg (Sprints)

    ["Q47513277"] ="#FFFFFF" , -- Jersey white.svg (Sprints)

    ["Q50822390"] ="#FFD030" , -- Jersey orange lines volta.svg (Sprints)

    ["Q24645383"] ="#FFFFFF" , -- Jersey white.svg (Best young)

    ["Q26919967"] ="#90EE90" , -- Jersey green.svg (Best young)

    ["Q26209148"] ="#99CBFF" , -- Jersey blue.svg (Best young)

    ["Q26696523"] ="#FFD030" , -- Jersey orange.svg (Best young)

    ["Q29229790"] ="#BF80FF" , -- Jersey violet.svg (Best young)

    ["Q29982765"] ="#FFC0CB" , -- Jersey pink.svg (Best young)

    ["Q33134078"] ="#FF8666" , -- Jersey red.svg (Best young)

    ["Q38929482"] ="#FFFF99" , -- Jersey yellow.svg (Best young)

    ["Q33026698"] ="#FF8666" , -- Jersey red.svg (Best young)

    ["Q56002706"] ="#87CEEB" , -- MaillotCyan.PNG (Best young)

    ["Q50822410"] ="#99CBFF" , -- Jersey blue lines volta.svg (Best young)

    ["Q26953919"] ="#8FBC8F" , -- Jersey dark green.svg (Combativity)

    ["Q29957114"] ="#87CEEB" , -- MaillotCyan.PNG (Combativity)

    ["Q25265995"] ="#F5DEB3" , -- Jersey red green.svg (Combativity)

    ["Q29594765"] ="#C0C0C0" , -- Jersey black.svg (Combativity)

    ["Q30035039"] ="#FFD030" , -- Jersey orange.svg (Combativity)

    ["Q30035038"] ="#90EE90" , -- Jersey green.svg (Combativity)

    ["Q48691401"] ="#F2BC38" , -- Jersey Goldenrod.svg (Combativity)

    }

    if wiki == "ca" then bg_color_table["Q24257763"] = "lightpink" end

    for _, jersey in pairs(h.jersey) do

    if bg_color_table[jersey] then

    bg_color = bg_color_table[jersey]

    break

    end

    end

    end

    if rank == 1 then

    if s.background then -- values are 'strong' or 'color'

    tBody = tBody ..' style="font-weight:bold;' -- winner is formated bold

    if s.background == 'color' then

    if h.jersey[1] and bg_color then -- background color of winner depending on jersey

    tBody = tBody .. 'background-color:' ..bg_color

    end

    end

    tBody = tBody .. '"'

    end

    end

    tBody = tBody .. '>

    '

    if s.header_2[4] == 4 then -- for table stageclassification, generalclassification, adds time and time gap

    if l == 1 then

    tBody = tBody.. '

    '

    else

    tBody = tBody.. '

    '

    end

    end

    if s.header_2[4] == 7 then -- for table pointsclassification, adds points

    tBody = tBody.. '

    '

    end

    if s.header_2[3] == 4 then

    if s.property == 'P2417' or s.property == 'P2321' then

    -- for tables teamtimetrialclassification or generaltttclassification, adds time

    tBody = tBody.. '

    '

    end

    end

    if s.property == 'P3497' then -- for table teambytimeclassification, adds time and time gap

    if l == 1 then tBody = tBody.. '

    '

    else

    tBody = tBody.. '

    '

    end

    end

    if s.property == 'P3496' then -- for table teambypointsclassification, adds points

    tBody = tBody.. '

    '

    end

    if s.header_2[4] == 5 then -- for table teamtimetrialclassification, adds time gap

    tBody = tBody.. '

    '

    end

    if s.header_2[5] == 6 then -- for table teamtimetrialclassification, adds speed

    tBody = tBody.. '

    '

    end

    tBody = tBody.. '

    '

    t_Body[#t_Body + 1] = {(type(rank) == 'number') and rank or 999, tBody}

    end

    end

    table.sort(t_Body, function(a, b) return a[1] < b[1] end)

    for _, m in ipairs(t_Body) do tableBody = tableBody .. m[2] end

    local tableFooter = ''

    if s.display_ref == 1 then

    tableFooter = '

    '

    else

    tableBody = tableBody.. func_date (riderBirthdays[index[i]], 'long')

    if available_list==false then tableBody=tableBody..'' else tableBody=tableBody..'

    ' 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.. '

    '

    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 = '

    '

    local tableHeader1 = '[[File:Wikidata-logo S.svg|12px|link=d:' ..

    raceID .. '#' .. s.property..']]'.. s.header_function(s.header_1) .. '

    '.. s.header_function(k) .. ' '.. s.header_function(k) .. '
    '..

    number(gender, rank, wiki).. '

    '

    if not s.team_classification then

    if not teamLink then teamLink = '' end

    if not available_list then

    tBody = tBody .. flagLink .. ' '.. riderLink .. jersey(h.jersey) .. '

    '.. teamLink

    else

    if country == true then

    tBody = tBody .. riderLink .. jersey(h.jersey) ..'

    ' .. flagLink ..

    ' '.. countryName .. '

    '.. teamLink

    else

    tBody = tBody .. flagLink .. ' ' .. riderLink .. jersey(h.jersey) ..

    '

    '.. teamLink

    end

    end

    else

    if not available_list then

    tBody = tBody .. flagLink .. ' ' .. teamLink .. jersey(h.jersey)

    else

    if country then

    tBody = tBody .. teamLink .. jersey(h.jersey) .. '

    '.. flagLink .. ' ' .. countryName

    else

    tBody = tBody .. flagLink .. ' ' .. teamLink .. jersey(h.jersey)

    end

    end

    end

    tBody = tBody.. '

    '..

    calculate_time(h.value[2]) .. '

    '..

    plus .. calculate_time(h.value[3]) .. '

    '.. h.value[1]

    .. ''

    if type(h.value[1]) == "number" then

    if h.value[1] > 1 then

    tBody = tBody..unit(7)

    else

    tBody = tBody..unit(6)

    end

    end

    tBody = tBody.. '' .. '

    '..

    calculate_time(h.value[2]) .. '

    '..

    calculate_time(h.value[2]) .. '

    '..

    plus.. calculate_time(h.value[3]) .. '

    '.. h.value[1]..

    ''

    if type(h.value[1]) == "number" then

    if h.value[1] > 1 then

    tBody = tBody..unit(7)

    else

    tBody = tBody..unit(6)

    end

    end

    tBody = tBody.. '' .. '

    '

    if l > 1 then tBody = tBody.. plus end

    tBody = tBody.. calculate_time(h.value[3]) .. '

    '

    if type(h.value[4]) == "number" then tBody = tBody.. mw.ustring.format('%.3f', h.value[4])..

    ''.. unit(5).. ''

    end

    tBody = tBody.. '

    tableNewline = ''

    end

    if localFrame.args.newline == 'true' then -- parameter newline in WP article is 'true'

    tableStyle = "border:1px solid rgb(200,200,200)"

    tableNewline = '
    '

    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 = '
    ' -- everything else

    end

    end

    return '

    ' .. tableStart .. tableHeader1 ..

    tableHeader2 .. tableBody .. tableFooter..tableEnd .. '

    ' .. 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'

    ' 35px' 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 = "

    "

    else

    tab = "

    "

    end

    tab = tab ..

    "

    "

    if others[1].content then -- picture

    tab = tab .. "

    "

    if others[2].content then -- caption

    tab = tab .. "

    "

    end

    end

    tab = tab .. "

    "

    for _, row in ipairs(details) do

    if row.content then

    tab = tab .. "

    "

    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 .. "

    "

    end

    end

    if winRows ~= '' then

    tab = tab .. "

    " .. winRows

    end

    if others[3].content then -- map

    tab = tab .. "

    "

    end

    tab = tab .. getPreviousNextLine(entityID)

    local s = "d:Wikidata:WikiProject Cycling/Documentation/infobox"

    tab = tab .. "

    " ..

    "

    " .. name .."" .. icon .. "
    [[File:" .. others[1].content ..

    "|center|300px]]

    " ..

    others[2].content .. "

    '''" ..

    infobox_translate(1) .. "'''

    '''" .. row.name ..

    "'''

    " .. row.content .. "
    '''" .. v.name ..

    "'''

    " .. v.content .. "
    '''"

    .. infobox_translate(18) .. "'''

    File:".. others[3].content .. "
    " ..

    "" .. infobox_translate(34) .. " [[File:Wikidata-logo S.svg|12px|link=d:".. entityID ..

    "]]

    "

    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

    {{Cycling race/teamroster|Q21769847

    | sort

    }}

    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

    table.sort(riderNames_notransl, function(a,b) return a

    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 = '

    '

    ..'

    '

    tableHeader = tableHeader..'

    '

    local tableFoot = '

    '

    if WDlink_on == false then tableHeader = tableHeader..'File:Wikidata-logo S.svg' end

    tableHeader = tableHeader..getSquadTableColumn(7) .. '

    '..getSquadTableColumn(1) ..

    '

    '..getSquadTableColumn(2)

    if available_list==true then tableHeader = tableHeader.. '

    '..getSquadTableColumn(6) end

    tableHeader = tableHeader.. '

    '..getSquadTableColumn(3) .. '
    '

    local tableEndText = ''

    local tableSize = table.getn(riderNames)

    local iii = 1

    i = 1

    while index[i] do

    tableBody = tableBody.. '

    '

    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.. '

    '

    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 } }.. '

    '.. flags[index[i]].. ' '..pays[i].. ' '

    else

    labelMissing = true -- FIXME: labelMissing is not functional in most languages. once we have infra support for it, move it there

    tableBody = tableBody.. '

    '

    end

    else

    tableBody = tableBody.. '

    '

    end

    if riderTeam[index[i]] ~= nil then tableBody = tableBody.. riderTeam[index[i]].. time[index[i]] end

    tableBody = tableBody..'

    '

    local tableEnd = '

    '

    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:

    {{Cycling race/listofwinners|Q18574623

    | above row 1: aaa bbb ccc xxx

    }}

    "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, "" .. 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 = "

    "

    local table_proto = "

    "

    local table_center, table_last = "", "

    "

    if WDlink_on == false then

    table_proto = table_proto .. '[[File:Wikidata-logo S.svg|12px|link=d:' ..

    raceID .. '#P527]]'

    end

    table_proto = table_proto .. headoftableIV(1) .. "

    ".. headoftableIV(2) .. "" ..

    headoftableIV(3) .. "

    " .. headoftableIV(4) .. "
    "

    for i, row in ipairs(rows) do

    if WPcontent[i] then

    table_center = table_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:

    {{Cycling race/listofstages|Q18574623

    | RoW 1: locaTION Ab : 1a1b

    | after row 1 : date : 99 août

    | after row 1 : icon : vbght frthzt fdgtr

    | after row 1: text : rest day at aaa bbb ccc

    | row 4: location A : 4a4aabc

    | row 3 : winner a : tzhgt

    | row 4 : winner b : kjuzhgt
    bbjje

    | row 4 : icon : xcvbbgf fgtr

    | row 4 : distance : 141.8 122test

    }}

    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: any text

    ]=]

    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 = "" .. sLink ..

    " ".. WDLink ..

    "" .. sDate ..

    "" .. sPoint

    if dPoint ~= '' then t = t .. " – " .. dPoint end

    t = t .. "" .. sType ..

    "" .. sDistance .. ""

    if WPc and WPc['stage winner'] then

    t = t .. "" .. WPc['stage winner'] .. ""

    else

    t = t .. "" .. sSWin .. ""

    end

    if WPc and WPc['general winner'] then

    t = t .. "" .. 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 .. "" .. WPc['date'] ..

    "" .. WPc['text']

    else

    t = t .. "" .. WPc['date'] ..

    "" .. WPc['text']

    end

    t = t .. "" .. WPc['icon (new row)'] .. ""

    end

    rows[num] = t

    end

    return "

    " ..

    "

    ", table.concat(rows), "
    " ..

    (not WDlink_on and ("File:Wikidata-logo S.svg")) ..

    headoftable(1) .. "

    " .. headoftable(2) .. "".. headoftable(3) ..

    "

    type".. headoftable(4) .. "".. headoftable(5) ..

    "

    " .. headoftable(6) .. "
    "

    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