Aller au contenu

Module:Country data

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 22 juin 2016 à 18:29 et modifiée en dernier par Zolo (discuter | contributions) (pour plus de flexibilité, parfois l'article peut ne pas s'accorder, ou s'accorder avec un autre nom). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[voir] [modifier] [historique] [purger]

Utilisation

Modèle permettant d'afficher des informations en rapport avec un pays ou une zone géographique en utilisant les données de ses sous-modules, par exemple Module:Country data/canada, qu'il retrouve avec l'aide de Module:Country data/liste.

Fonctions exportables

  • standarddisplay(zone, format) - affiche un nom de zone formaté selon les instruction données dans paramètre format et des données données dans le sous-module dédié à la zone (voir Module:Country data/canada). Par défaut, le modèle affiche le drapeau actuel et le nom courant du pays, mais cela peut-être changé par les paramètres :
    • argument 1 : nom de la zone, qui peut aussi être un identifiant Wikidata, mais qui doit figurer sur Module:Country data/liste.
    • argument 2 : table des paramètres de mise en forme :
      • date (date au format ISO pour afficher le drapeau ou le nom de pays valable à l'époque demandée)
      • label 'label = "-" désactive le libellé est retourné, seul le drapeau est retourné
      • type type de drapeau à utiliser ("civil", "navy", etc.)
  • nationality(zone, gender, number, topic, period) – affiche la nationalité d'une personne sous forme d'adjectif en fonction de son genre et de l'époque

Modules externes et autres éléments dont ce module a besoin pour fonctionner

--[[
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: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 = 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éliorer
	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 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 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.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 = ''
	

	-- 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 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 = '[[' .. link .. '|' .. 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 .. '&nbsp;' .. flag
	else
		val = flag .. '&nbsp;' .. 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 linguistic.ucfirst(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

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