Module:Country data

De Lagny-sur-Marne Wiki
Révision datée du 10 mars 2015 à 07:54 par Zolo (discussion)
Aller à : navigation, rechercher

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 = {};

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

-- chargement des données
if success then
    gdata = resultat
else
    -- Banque de données à minima en cas de bogue dans le Module:Langue/Data
    gdata={
		['france']={item="Q142", flag= "Flag_of_France.svg", name ="France"}
	}
end

local gdomain
local success, resultat = pcall (mw.loadData, "Module:Drapeau/Domaine" )
if success then
	gdomain = resultat
end


local function _getCompetition(c,aaaa)
	local rep="";
	if(c=="CM" or c=="coupedumonde") then
		rep="à la Coupe du monde"
	elseif(c=="CE" or c=="euro") then
		rep="au championnat d'Europe"
	elseif(c=="ChM") then
		rep="au championnat du monde"
	elseif(c=="CAN" or c=="coupedesconfederations") then
        rep="à la Coupe des Confédérations"
    elseif(c=="en" ) then
        rep="en"
    elseif(c=="jo" ) then
        rep="aux Jeux olympiques"
    elseif(c=="jp" ) then
        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)
	if (border ~= "no") or (border == false) then
		border='border|'
	end
	if not alt then
		alt = ''
	end
    return '<span class="flagicon">' ..
                '[[Fichier:' .. filescr .. '|' .. size ..'px|' .. border  .. alt ..']]' ..
            '</span>';
end

local function getData(datatable, typedata, topic, year)
	-- récupères les données stockées sur datatable
	-- typedata = flag ou nom
	-- datedata = year
	-- domain = arméée etc.) 
	local val = datatable[typedata] --(typedata = nom, drapeau, etc.)
	if not topic then  --(topic = army, air force, etc.)
		topic = 'default'
	end
	local alt
	
	-- si val est une chaîne, la retourner, sinon, ça doit être une table
	if type(val) == 'string' then
		return val
	end
	if type(val) ~= 'table' then 
		return error('demande invalide')
	end

	-- 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
	if type(val[topic]) == 'table' then
		val = val[topic]
	end
	if type(val[topic]) == 'string' then
		return val[topic]
	end

	alt = datatable[typedata].alt
	
	local numericdate
	if year then
		numericdate = tonumber(year)
	end
	if numericdate then
		local bestdate = -10000
		for i, j in pairs (datatable[typedata]) do
			local k = tonumber(i)
			if k and (k < numericdate) and (k > bestdate) then
				val = j
				bestdate = k
			end
		end
	end
	if not type(val) == 'string' then
		return nil
	end
	return val, alt
end

local function printLabel(data, topic)
	local label
	if not name then
		return getData(data, 'name')
	end
end

local function printLink(areadata, topic)
	if areadata.link then
		return areadata.link[topic] or areadata.link['default']
	end
	return mw.wikibase.sitelink(data.item)
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 standardText(areadata, topicdata)
	-- format standards stockées dans Module:Drapeau/domain
	local link = topicdata.link
	local label = topicdata.label
	return link, label
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

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["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 = ''

	-- 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 flagimage, alt = getData(data, 'flag', domain, year)
	local icon -- le fichier mis en forme
	if flagimage then
		icon = printIcon(flagimage, alt, size, border)
	end
	if (label == '-') then
		return icon
	end
	
	if domain then
		link, label = standardText(data, domain)
	end

	if (not link) then
		link = printLink(data, flagtype)
	end
	if (not label) then
		label = printLabel(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 .. '&nbsp;' ..icon
	else
		val = icon .. '&nbsp;' .. text
	end
	return val, 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