Moduulin Fr:Country data käyttöohje
Tämä sivu on kopio. Tätä ohjetta muokataan muokkaamalla suomenkielisessä Wikipediassa olevaa alkuperäistä versiota jonka muutokset kopioituvat automaattisesti tälle sivulle. Tämä moduuli on osa ranskankielisestä Wikipediasta kopioitua Wikidata ja Interface Wikidata -moduulikokonaisuutta (ks. ohjeet ja esimerkit). Listauksen kaikista tähän liittyvistä moduuleista löydät Ranskankielisen Wikipedian Wikidata-moduulit -sivulta.
|
--[[
This module is intended to replace the functionality of {{drapeau2}} and related
templates. It provides several methods, including
]]
local p = {};
local gdata = mw.loadData ("Module:Fr:Country data/liste" )
local dates = require "Module:Fr:Date complexe"
local linguistic = require "Module:Fr:Linguistique"
local function _getCompetition(c,aaaa)
local gdomain = mw.loadData ( "Module:Fr:Drapeau/Domaine" ) -- chargé seulement sur les articles où ça sert, ça prend un peu de place
local symbs = {
= "à la Coupe du monde",
= "à la Coupe du monde",
= "au championnat d'Europe",
= "au championnat d'Europe",
= "au championnat du monde",
= "à la Coupe des Confédérations",
= "à la Coupe des Confédérations",
= "en",
= "aux Jeux olympiques",
= "aux Jeux paralympiques",
}
local str = symbs or ""
--edition
if(aaaa ~= nil and aaaa ~= "") then
if(c=="jo" or c=="jp" ) then
local o=gdomain.jo;
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 = 'border|'
if displayformat.border == '-' then
border = ''
end
if not alt then
alt = ''
end
return '<span class="flagicon">' ..
']' ..
'</span>';
end
local function bestfordate(data, period) -- data contient une table dont les clés sont des dates au format = ou =
if type(data) == 'string' then
return data
end
-- très artisanal, à améliorer
if (not period) or (period == 'default') then
return data.default
end
local val = data.default
local bestdate = '-1000-01-01'
for i, j in pairs(data) do
if j ~= 'default' and dates.before(period, i) and dates.before(i, bestdate) then -- si la valeur est plus récente que period moins récente que la best trouvée
val = j
bestdate = i
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 then
return bestfordate(data, 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 ]
-- typedata: "flag" / "name" / "adjective"
-- period: data in ISO format
-- topic: for instance "navy" for naval ensign
local val = datatable
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 getDemonym (data, gender, number)
if data.demonym == nil then
return linguistic.ucfirst( getAdjective(data, gender, number) )
end
gender = gender or 'm'
number = number or 's'
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, 'demonym', (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 then
return require('Module:Country data/' .. gdata)
else -- si le module existe mais n'est pas dans la liste
return require('Module:Country data/' .. zone)
end
end
local function flagIcon(data, flagtype, period, displayformat)
local flagimage = getData(data, 'flag', flagtype, period)
if flagimage then
return printFlag(flagimage, '', 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 = mw.text.trim(j) -- remove whitespaces
if args == '' then args = nil end
end
-- ajout des valeurs par défaut
local size = args.flagsize or '20x15'
local flagtype = args.type
local align = args.align or 'left'
local link = args.link
local period = args.date
local competition = args.competition
local edition = args.edition
local extra = ''
local success, data = pcall(getDatatable, zone)
if not success then
if args.strict then
return error('lieu non reconnu')
end
return nil
end
-- image
local flag = flagIcon(data, flagtype, period)
if (args.label == '-') then
return flag, true
end
-- text
local text
local label = getLabel(data, flagtype)
local link = getLink(data, flagtype)
if competition then
competition = _getCompetition(linguistic.toascii(competition),args)
end
if link and competition then
link = link .. ' ' .. competition
end
if link then
text = ']'
end
-- si les données sont extraites d'un formulaire standard comme module:Drapeau/domain, appliquer des regex
if string.match(text, '%$') then
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 = getDemonym(data, gender, number)
if not str then
return zone
end
local link = getLink(data, topic, period)
if link then
str = ']'
end
return str, true-- true indique le succès
end
function p.getNationality(args) -- pour obtenir la nationalité d'une personne sur Wikidata sous forme d'adjectifs
if not args then
return nil
end
local wikidata = require "Module:Interface Wikidata".fromLua
local complexdate = require "Module:Date complexe"
if type(args) == 'string' then -- si un seul argument, c'est l'entité à utiliser
args {item = args}
end
if args.args then -- si vient de frame
args = args.args
end
local item = args.item or args
-- établit la variable gender pour l'élément
local vals = {
= 'f',
= 'm',
default = '?'
}
local gender = args.gender
if not gender then
gender = wikidata.formatStatements{entity = item, property = 'P21', displayformat = 'raw'}
gender = vals or vals.default
end
-- désactivation si date de naissance avant l'Ère contemporaine : trop d'imprécisions et d'anachronismes
local mindate = args.mindate or '1789'
if mindate ~= "-" then
local birthdate = wikidata.formatStatements{entity = item, property = 'P569', displayformat = 'raw', numval = 1}
if (not birthdate) or complexdate.before(mindate, birthdate) then
return nil
end
end
return wikidata.formatStatements{
property = 'P27',
vals = statements,
showdate = true,
entity = item,
conjtype = 'and',
removedupes = true,
linktopic = '-',
displayformat =
function(snak)
local g = gender -- genre de la personne, pour affichage du gentilé
if g == '?' then -- si inconnu, au masculin
g = 'm'
end
local val, success = p.nationality(wikidata.getid(snak), g)
if not success then
val = wikidata.formatSnak(snak)
end
return val
end
}
end
return p