For faster navigation, this Iframe is preloading the Wikiwand page for Module:Country data.

Module:Country data

 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 Wikidat, 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 nationality d'un 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

Voir les statistiques d'utilisation du module sur l'outil wstat.

--[[
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 = 'border|' 
	
	if displayformat.border == '-' then
		border = ''
	end
	
	if not alt then
		alt = ''
	end
	return '<span class="flagicon">' ..
			'[[Fichier:' .. flagfile .. '|' .. size ..'px|' .. border  .. alt ..'|class=noviewer]]' ..
			'</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 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('mauvais 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 devrait être m ou f mais est ' .. gender)
	end
	if (number ~= 's' and number ~= 'p') then
		return error('number devrait être s ou p mais est ' .. 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 devrait être m ou f mais est ' .. gender)
	end
	if (number ~= 's' and number ~= 'p') then
		return error('number devrait être s ou p mais est ' .. 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 = '[[' .. 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 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:Wikidata"
	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}
                local deathdate = wikidata.formatStatements{entity = item, property = 'P570', displayformat = 'raw', numval = 1}
		if ((not birthdate) or complexdate.before(mindate, birthdate)) and ((not deathdate) or complexdate.before(mindate, deathdate)) then
			return nil
		end
	end
	return wikidata.formatStatements{
			property = 'P27',
			showdate = true,
			entity = item,
			conjtype = args.conjtype or '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
{{bottomLinkPreText}} {{bottomLinkText}}
Module:Country data
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.