« Module:Country data » : différence entre les versions

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
Aucun résumé des modifications
0x010D (discussion | contributions)
getDemonym : c'est l'adjectif qui doit être mis en majuscule, le gentilé devrait déjà y être
 
(27 versions intermédiaires par le même utilisateur non affichées)
Ligne 6 : Ligne 6 :
local p = {};
local p = {};


-- Chargement de la banque de données des langues avec gestion d'erreur.
local gdata = mw.loadData ("Module:Country data/liste" )
local gdata
local dates = require "Module:date complexe"
local linguistic = require "Module:Linguistique"
local linguistic = require "Module:Linguistique"
local success, resultat = pcall (mw.loadData, "Module:Country data/liste" )


-- chargement des données
local function _getCompetition(c,aaaa)
if success then
local gdomain = mw.loadData ( "Module:Drapeau/Domaine" ) -- chargé seulement sur les articles où ça sert, ça prend un peu de place
    gdata = resultat
else
local symbs = {
    -- Banque de données à minima en cas de bogue dans le Module:Langue/Data
['cm'] = "à la Coupe du monde",
    gdata={
['coupedumonde'] = "à la Coupe du monde",
['france']={item="Q142", flag= "Flag_of_France.svg", name ="France"}
['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
end


local gdomain
local function printFlag(flagfile, alt, displayformat)
local success, resultat = pcall (mw.loadData, "Module:Drapeau/Domaine" )
if success then
displayformat = displayformat or {}
gdomain = resultat
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">' ..
'[[Fichier:' .. flagfile .. '|' .. size ..'px|' .. border  .. alt ..']]' ..
'</span>';
end
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


local function _getCompetition(c,aaaa)
-- très artisanal, à améliorer
local rep="";
if (not period) or (period == 'default') then
if(c=="CM" or c=="coupedumonde") then
return data.default
rep="à la Coupe du monde"
end
elseif(c=="CE" or c=="euro") then
rep="au championnat d'Europe"
local val = data.default
elseif(c=="ChM") then
local bestdate = '-1000-01-01'
rep="au championnat du monde"
for i, j in pairs(data) do
elseif(c=="CAN" or c=="coupedesconfederations") then
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
        rep="à la Coupe des Confédérations"
val = j
    elseif(c=="en" ) then
bestdate = i
        rep="en"
end
    elseif(c=="jo" ) then
end
        rep="aux Jeux olympiques"
return val
    elseif(c=="jp" ) then
end
        rep="aux Jeux paralympiques"
    end
   
    --edition
    if(aaaa ~= nil and aaaa ~= "") then
        if(c=="jo"  or c=="jp" ) then
            local o=gdomain.jo["_"..aaaa];
            if(o ~= nil) then
                rep=rep.." "..o
            end          
        else
            rep=rep.." "..aaaa
        end
    end


    return rep
end


function printIcon(filescr, alt, size, border)
local function valueAtDate(data, period, topic) -- topic: type de drapeau, genre de l'adjectif, etc.
if (border ~= "no") or (border == false) then
if type(data) == 'string' or type(data) == 'nil' then
border='border|'
return data
end
if type(data) ~= 'table' then
return error('bad datatabpe ' .. type(data))
end
end
if not alt then
topic = topic or "default"
alt = ''
if data[topic] then
return bestfordate(data[topic], period)
else
return bestfordate(data, period)
end
end
    return '<span class="flagicon">' ..
return error()
                '[[Fichier:' .. filescr .. '|' .. size ..'px|' .. border  .. alt ..']]' ..
            '</span>';
end
end


local function getData(datatable, typedata, topic, year)
local function getData(datatable, typedata, topic, period) -- récupère la chaîne de caractère la plus appropriée dans la datatable
-- récupères les données stockées sur datatable
-- datatable: la table de sous module par exemple [[Module:Country data/grenade]]
-- typedata = flag ou nom
-- typedata: "flag" / "name" / "adjective"
-- datedata = year
-- period: data in ISO format
-- domain = arméée etc.)
-- topic: for instance "navy" for naval ensign
local val = datatable[typedata] --(typedata = nom, drapeau, etc.)
local val = datatable[typedata]
if not topic then  --(topic = army, air force, etc.)
topic = 'default'
end


if not val then
if not val then -- error handling ?
return nil
return nil
end
end
-- si val est une chaîne, la retourner, sinon, ça doit être une table
 
if type(val) == 'string' then
local val = valueAtDate(val, period, topic)
return val
 
if type(val) ~= 'string' then -- error handling ?
return error(val)
end
end
if type(val) ~= 'table' then  
return val
return error('demande invalide')
end
 
local function getAdjective(data, gender, number)
if not gender then
gender = 'm'
end
end
 
if not number then
-- s'il existe une valeur spéciale pour ce topic (comme une valeur spéciale de flag pour topic = army : soit une chaîne, soit une table avec des valeurs chronologiques
number = 's'
if type(val[topic]) == 'table' then
end
val = val[topic]
if (gender ~= 'm' and gender ~= 'f') then
return error('gender should be m or f is ' .. gender)
end
end
if type(val[topic]) == 'string' then
if (number ~= 's' and number ~= 'p') then
return val[topic]
return error('number should be s or p is ' .. number)
end
end
return getData(data, 'adjective', (gender .. number))
end


alt = datatable[typedata].alt
local function getDemonym (data, gender, number)
if data.demonym == nil then
local numericdate
return linguistic.ucfirst( getAdjective(data, gender, number) )
if year then
numericdate = tonumber(year)
end
end
if numericdate then
gender = gender or 'm'
local bestdate = -10000
number = number or 's'
for i, j in pairs (datatable[typedata]) do
if (gender ~= 'm' and gender ~= 'f') then
local k = tonumber(i)
return error('gender should be m or f is ' .. gender)
if k and (k < numericdate) and (k > bestdate) then
val = j
bestdate = k
end
end
end
end
if not type(val) == 'string' then
if (number ~= 's' and number ~= 'p') then
return nil
return error('number should be s or p is ' .. number)
end
end
return val, alt
return getData(data, 'demonym', (gender .. number))
end
end


local function getLabel(data, topic, year, form)
local function getLabel(data, topic, period, form)
local label
local label
if (not form) or form == 'short' then
if (not form) or form == 'short' then
label = getData(data, 'shortname', topic, year)
label = getData(data, 'shortname', topic, period)
end
end
if not label then
if not label then
Ligne 133 : Ligne 158 :
end
end
if (not label) and data.item then
if (not label) and data.item then
label = mw.wikibase.label(getData(data, item))
label = mw.wikibase.label(getData(data, 'item'))
end
end
return label
return label
end
end


local function getLink(data, topic, year)
local function getLink(data, topic, period)
local link = getData(data, 'link', topic, year)
local link = getData(data, 'link', topic, period)
if (not link) and data.item then
if (not link) and data.item then
link =  mw.wikibase.label(getData(data, item))
link =  mw.wikibase.label(getData(data, 'item'))
end
end
return link
return link
Ligne 176 : Ligne 201 :
end
end


function p.List(frame)
 
    return p.list(frame)
local function flagIcon(data, flagtype, period, displayformat)
local flagimage = getData(data, 'flag', flagtype, period)
if flagimage then
return printFlag(flagimage, '', displayformat)
end
end
end


Ligne 194 : Ligne 223 :


   -- ajout des valeurs par défaut
   -- ajout des valeurs par défaut
local size = args["size"] or '20x15'
local size = args.flagsize or '20x15'
local flagtype = args["type"]
local flagtype = args.type


local domain
local align = args.align or 'left'
if args['domain'] and gdomain then
local link = args.link
domain = args['domain']
local period = args.date
domain = mw.ustring.lower(string.gsub(domain, " ", ""))
local competition = args.competition
domain = linguistic.toascii(domain)
local edition = args.edition
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["label"]
local year = args[2] or args["année"] or ''
local align = args["align"] or "left"
local target = args["target"]
local competition = args["compétition"]
local extra = ''
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)
local success, data = pcall(getDatatable, zone)
if not success then
if not success then
Ligne 225 : Ligne 238 :
return error('lieu non reconnu')
return error('lieu non reconnu')
end
end
return zone, false -- false == échec
return nil
end
end
-- image
-- image
local flagimage, alt = getData(data, 'flag', domain, year)
local flag = flagIcon(data, flagtype, period)
local icon -- le fichier mis en forme
if (args.label == '-') then
if flagimage then
return flag, true
icon = printIcon(flagimage, alt, size, border)
end
if (label == '-') then
return icon
end
end


if (not link) then
-- text
link = getLink(data, flagtype)
local text
end
local label = getLabel(data, flagtype)
if (not label) then
local link = getLink(data, flagtype)
label = getLabel(data, flagtype)
 
end
if competition then  
if competition then  
competition = _getCompetition(linguistic.toascii(args["compétition"]),args["édition"])
competition = _getCompetition(linguistic.toascii(competition),args["édition"])
end
end
if link and competition then
if link and competition then
link = link .. ' ' .. competition
link = link .. ' ' .. competition
Ligne 255 : Ligne 262 :
text = '[[' .. link .. '|' .. label .. ']]'
text = '[[' .. link .. '|' .. label .. ']]'
end
end
if target then
 
text = target .. ' (' .. text .. ')'
-- si les données sont extraites d'un formulaire standard comme module:Drapeau/domain, appliquer des regex
end
if string.match(text, '%$') then
if string.find(text, '$') then -- si les données sont extraites d'un formulaire standard comme module:Drapeau/domain
text = applyregex(text, data)
text = applyregex(text, data)
end
end
Ligne 265 : Ligne 270 :
local val
local val
if align == 'right' then
if align == 'right' then
val = text .. '&nbsp;' ..icon
val = text .. '&nbsp;' .. flag
else
else
val = icon .. '&nbsp;' .. text
val = flag .. '&nbsp;' .. text
end
end
return val, true -- true indique le succès
return val, true -- true indique le succès
end
end


function p.drapeau(frame) -- pour appel depuis un modèle : {{#invoke:Country data|drapeau|nom du pays}}
function p.nationality(zone, gender, number, topic, period)
local success, val = pcall(p._drapeau, frame.args)
local success, data = pcall(getDatatable, zone)
    if success then  
if not success then return
    return val
zone
    end
end
--   return p._drapeau(frame.args)
return frame.args[1]
local str = getDemonym(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.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[1]
-- établit la variable gender pour l'élément
local vals = {
['Q6581072'] = 'f',
['Q6581097'] = 'm',
default   = '?'
}
local gender = args.gender
if not gender then
gender = wikidata.formatStatements{entity = item, property = 'P21', displayformat = 'raw'}
gender = vals[gender] 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
end


return p
return p

Dernière version du 30 novembre 2016 à 10:32

--[[ This module is intended to replace the functionality of Drapeau [[Modèle:Drapeau2/Libellé]] and related templates. It provides several methods, including ]]

local p = {};

local gdata = mw.loadData ("Module:Country data/liste" ) local dates = require "Module:date complexe" local linguistic = require "Module:Linguistique"

local function _getCompetition(c,aaaa) local gdomain = mw.loadData ( "Module:Drapeau/Domaine" ) -- chargé seulement sur les articles où ça sert, ça prend un peu de place

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

if displayformat.border == '-' then border = end

if not alt then alt = end return '' .. '' .. border .. alt ..'' .. ''; 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é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[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 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[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


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[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.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["édition"]) end if link and competition then link = link .. ' ' .. competition end

if link then text = '' .. label .. '' 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 = '' .. 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[1]

-- établit la variable gender pour l'élément local vals = { ['Q6581072'] = 'f', ['Q6581097'] = 'm', default = '?' } local gender = args.gender if not gender then gender = wikidata.formatStatements{entity = item, property = 'P21', displayformat = 'raw'} gender = vals[gender] 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