Module:Country data : Différence entre versions
(corrections) |
|||
Ligne 60 : | Ligne 60 : | ||
local function bestfordate(data, period) -- data contient une table dont les clés sont des dates au format ['2010'] = ou ['2010-05-04'] = | local function bestfordate(data, period) -- data contient une table dont les clés sont des dates au format ['2010'] = ou ['2010-05-04'] = | ||
− | if type(data) == string then | + | if type(data) == 'string' then |
return data | return data | ||
end | end | ||
+ | |||
+ | -- très artisanal, à amélio | ||
if (not period) or (period == 'default') then | if (not period) or (period == 'default') then | ||
return data.default | return data.default | ||
end | end | ||
− | |||
local year, month, day | local year, month, day | ||
if type(period) == 'table' then | if type(period) == 'table' then | ||
Ligne 72 : | Ligne 73 : | ||
end | end | ||
if type(period) == 'string' then | if type(period) == 'string' then | ||
− | year | + | local pattern = "%d*" |
+ | year = period:match(pattern) | ||
end | end | ||
− | + | local val = data.default | |
− | local val = | ||
local numericyear = tonumber(year)-- ne prend en compte que les années // à améliorer | local numericyear = tonumber(year)-- ne prend en compte que les années // à améliorer | ||
if numericyear then | if numericyear then | ||
local bestdate = -10000 | local bestdate = -10000 | ||
− | for i, j in pairs ( | + | for i, j in pairs (data) do |
local k = tonumber(i) | local k = tonumber(i) | ||
− | if k and (k < | + | if k and (k < numericyear) and (k > bestdate) then |
val = j | val = j | ||
bestdate = k | bestdate = k | ||
Ligne 98 : | Ligne 99 : | ||
return error('bad datatabpe ' .. type(data)) | return error('bad datatabpe ' .. type(data)) | ||
end | end | ||
− | if | + | topic = topic or "default" |
− | return | + | if data[topic] then |
− | + | return bestfordate(data[topic], period) | |
− | return | + | else |
+ | return bestfordate(data, period) | ||
end | end | ||
− | return | + | return error() |
end | end | ||
Ligne 111 : | Ligne 113 : | ||
-- period: data in ISO format | -- period: data in ISO format | ||
-- topic: for instance "navy" for naval ensign | -- topic: for instance "navy" for naval ensign | ||
− | |||
local val = datatable[typedata] | local val = datatable[typedata] | ||
Ligne 121 : | Ligne 122 : | ||
if type(val) ~= 'string' then -- error handling ? | if type(val) ~= 'string' then -- error handling ? | ||
− | return error() | + | return error(val) |
end | end | ||
return val | return val | ||
Ligne 235 : | Ligne 236 : | ||
local align = args["align"] or 'left' | local align = args["align"] or 'left' | ||
local link = args["lien"] | local link = args["lien"] | ||
− | local label = args[" | + | local label = args["period"] |
− | local period = args[ | + | local period = args["date"] or "1800" |
local align = args["align"] or "left" | local align = args["align"] or "left" | ||
local target = args["target"] | local target = args["target"] | ||
Ligne 254 : | Ligne 255 : | ||
end | end | ||
-- image | -- image | ||
− | local flag = flagIcon(data, flagtype) | + | local flag = flagIcon(data, flagtype, period) |
if (label == '-') then | if (label == '-') then | ||
return flag | return flag |
Version du 28 août 2015 à 17:30
La documentation pour ce module peut être créée à Module:Country data/doc
--[[ This module is intended to replace the functionality of {{drapeau2}} and related templates. It provides several methods, including ]] local p = {}; local linguistic = require "Module:Linguistique" local gdomain = mw.loadData ( "Module:Drapeau/Domaine" ) local gdata = mw.loadData ("Module:Country data/liste" ) local function _getCompetition(c,aaaa) local symbs = { ['cm'] = "à la Coupe du monde", ['coupedumonde'] = "à la Coupe du monde", ['ce'] = "au championnat d'Europe", ['euro'] = "au championnat d'Europe", ['chm'] = "au championnat du monde", ['can'] = "à la Coupe des Confédérations", ['coupedesconfederations'] = "à la Coupe des Confédérations", ['en'] = "en", ['jo'] = "aux Jeux olympiques", ['jp'] = "aux Jeux paralympiques", } local str = symbs[string.lower(c or '')] or "" --edition if(aaaa ~= nil and aaaa ~= "") then if(c=="jo" or c=="jp" ) then local o=gdomain.jo["_"..aaaa]; if(o ~= nil) then str = str .." "..o end else str = str .." "..aaaa end end return str end local function printFlag(flagfile, alt, displayformat) displayformat = displayformat or {} local size = displayformat.size or '20x15' local border = displayformat.border or '1px' or 'border|' if (border ~= '-') then border = 'border|' end if not alt then alt = '' end return '<span class="flagicon">' .. '[[Fichier:' .. flagfile .. '|' .. size ..'px|' .. border .. alt ..']]' .. '</span>'; end local function bestfordate(data, period) -- data contient une table dont les clés sont des dates au format ['2010'] = ou ['2010-05-04'] = if type(data) == 'string' then return data end -- très artisanal, à amélio if (not period) or (period == 'default') then return data.default end local year, month, day if type(period) == 'table' then year, month, day = period.year, period.month, period.day end if type(period) == 'string' then local pattern = "%d*" year = period:match(pattern) end local val = data.default local numericyear = tonumber(year)-- ne prend en compte que les années // à améliorer if numericyear then local bestdate = -10000 for i, j in pairs (data) do local k = tonumber(i) if k and (k < numericyear) and (k > bestdate) then val = j bestdate = k end end end return val end local function valueAtDate(data, period, topic) -- topic: type de drapeau, genre de l'adjectif, etc. if type(data) == 'string' or type(data) == 'nil' then return data end if type(data) ~= 'table' then return error('bad datatabpe ' .. type(data)) end topic = topic or "default" if data[topic] then return bestfordate(data[topic], period) else return bestfordate(data, period) end return error() end local function getData(datatable, typedata, topic, period) -- récupère la chaîne de caractère la plus appropriée dans la datatable -- datatable: la table de sous module par exemple [[Module:Country data/grenade]] -- typedata: "flag" / "name" / "adjective" -- period: data in ISO format -- topic: for instance "navy" for naval ensign local val = datatable[typedata] if not val then -- error handling ? return nil end local val = valueAtDate(val, period, topic) if type(val) ~= 'string' then -- error handling ? return error(val) end return val end local function getAdjective(data, gender, number) if not gender then gender = 'm' end if not number then number = 's' end if (gender ~= 'm' and gender ~= 'f') then return error('gender should be m or f is ' .. gender) end if (number ~= 's' and number ~= 'p') then return error('number should be s or p is ' .. number) end return getData(data, 'adjective', (gender .. number)) end local function getLabel(data, topic, period, form) local label if (not form) or form == 'short' then label = getData(data, 'shortname', topic, period) end if not label then label = getData(data, 'name') end if (not label) and data.item then label = mw.wikibase.label(getData(data, 'item')) end return label end local function getLink(data, topic, period) local link = getData(data, 'link', topic, period) if (not link) and data.item then link = mw.wikibase.label(getData(data, 'item')) end return link end local function applyregex(str, areadata) local cio = 'code CIO (en attente)' --require('Module:Wikidata')._formatStatements({entity= areadata.item, property= 'P984'}) or '??' local label = getData(areadata, 'name') local of = linguistic.of(label, areadata.genre) str = mw.ustring.gsub(str, '$de$label', of) str = mw.ustring.gsub(str, '$label', label) str = mw.ustring.gsub(str, '$cio', 'cio') if string.find(str, '$gentile') then local function get(genre) return getData(areadata, 'adjective', genre) end local gentileMS, gentileFS, gentileMP, gentileFP = get('ms'), get('fs'), get('mp'), get('fp') str = mw.ustring.gsub(str, '$gentileMS', gentileMS) str = mw.ustring.gsub(str, '$gentileFS', gentileFS) str = mw.ustring.gsub(str, '$gentileMP', gentileMP) str = mw.ustring.gsub(str, '$gentileFP', gentileFP) end return str end local function getDatatable(zone) zone = mw.ustring.lower(zone) if gdata[zone] then return require('Module:Country data/' .. gdata[zone]) else -- si le module existe mais n'est pas dans la liste return require('Module:Country data/' .. zone) end end function p.List(frame) return p.list(frame) end local function flagIcon(data, flagtype, period, displayformat) local flagimage = getData(data, 'flag', flagtype, period) if flagimage then return printFlag(flagimage, alt, displayformat) end end function p.standarddisplay(zone, args) if not zone then return nil end -- nettoyage des paramètres if not args then args = {} end for i, j in pairs(args) do args[i] = mw.text.trim(j) -- remove whitespaces if args[i] == '' then args[i] = nil end end -- ajout des valeurs par défaut local size = args["size"] or '20x15' local flagtype = args["type"] local domain if args['domain'] and gdomain then domain = args['domain'] domain = mw.ustring.lower(string.gsub(domain, " ", "")) domain = linguistic.toascii(domain) domain = gdomain.domainlist["domain"] end if args["domain"] and not domain then return error("domaine non reconnu:" .. args["domain"]) end local align = args["align"] or 'left' local link = args["lien"] local label = args["period"] local period = args["date"] or "1800" local align = args["align"] or "left" local target = args["target"] local competition = args["compétition"] local extra = '' -- chargement des données if not zone then return nil -- error('paramètre 1 (pays) manquant') end local success, data = pcall(getDatatable, zone) if not success then if args.strict then return error('lieu non reconnu') end return zone, false -- false == échec end -- image local flag = flagIcon(data, flagtype, period) if (label == '-') then return flag end if (not link) then link = getLink(data, flagtype) end if (not label) then label = getLabel(data, flagtype) end if competition then competition = _getCompetition(linguistic.toascii(args["compétition"]),args["édition"]) end if link and competition then link = link .. ' ' .. competition end if link then text = '[[' .. link .. '|' .. label .. ']]' end if target then text = target .. ' (' .. text .. ')' end if string.find(text, '$') then -- si les données sont extraites d'un formulaire standard comme module:Drapeau/domain text = applyregex(text, data) end local val if align == 'right' then val = text .. ' ' .. flag else val = flag .. ' ' .. text end return val, true -- true indique le succès end function p.nationality(zone, gender, number, topic, period) local success, data = pcall(getDatatable, zone) if not success then return zone end local str = getAdjective(data, gender, number) if not str then return zone end local link = getLink(data, topic, period) if link then str = '[[' .. link .. '|' .. str .. ']]' end return str, true-- true indique le succès end function p.drapeau(frame) -- pour appel depuis un modèle : {{#invoke:Country data|drapeau|nom du pays}} local success, val = pcall(p._drapeau, frame.args) if success then return val end -- return p._drapeau(frame.args) return frame.args[1] end return p