Module:Infobox/Fonctions

Documentation for this module may be created at Module:Infobox/Fonctions/doc

--[[ 
Avant de mettre en production une nouvelle version avez-vous :
- testé avec la version bac à sable ?
- modifié la documentation ?
]]

-- Fonctions communes à diverses infobox
local localdata = require 'Module:Infobox/Localdata'
local wikidata = require 'Module:Wikidata'
local linguistic = require "Module:Linguistique"
local item = localdata.item
local p = {}

function p.title(icon, style, subtitleparam, subtitlequery, italic)
	local function hide(param, value)
		if localdata[param] ~= '-' then
			return value
		end
	end
	
	return {
		type = 'title',
		value = function() 
			return localdata['nom'] or localdata['association_nom'] or localdata['nom_think'] or localdata['acronymelaboratoire'] or localdata['titre']
				or wikidata.getLabel(localdata.item) and mw.language.getContentLanguage():ucfirst( wikidata.getLabel(localdata.item) )
				or mw.title.getCurrentTitle().text
		end,
		subtitle = function() if localdata[subtitleparam] ~= '-' then return localdata[subtitleparam] end end,
		wikidatasubtitle = hide(subtitleparam, subtitlequery),
		icon = icon,
		style = style,
		italic = italic,
		setdisplaytitle = italic,
	}
end

function p.standardImage(imageType, imageparameters, property, upright)
	return {
		type = 'images',
		imageparameters =  imageparameters or {imageType},
		captionparameter = 'légende ' .. imageType,
		property = property,
		defaultupright = upright,
		uprightparameter = 'upright ' .. imageType,
		sizeparameter = 'taille ' .. imageType,
		altparameter = 'alternative ' .. imageType,
		numval = 1,
	}
end

function p.mainimage(args, defaultimage)
	if type( args ) ~= 'table' then
		args = { cat = args, defaultimage = defaultimage }
	end
	local tableReturned = p.standardImage('image', {'image', 'photo', 'Photo'}, {'P18', 'P5252'}, upright or '1')
	tableReturned.defaultimages = args.defaultimage or defaultimage
	tableReturned.defaultimagelink = 'Aide:Insérer une image'
	tableReturned.uprightparameter = 'upright'
	tableReturned.defaultupright = args.upright
	tableReturned.defaultsize = 	args.size
	tableReturned.maintenancecat = args.cat or 'Article à illustrer'
	tableReturned.captionparameter = {'légende', 'légende image', 'Légende'}
	tableReturned.altparameter = args.altparameter or 'alternative image'
	tableReturned.defaultimagealt = args.defaultimagealt
    tableReturned.property = nil
	tableReturned.wikidata = args.wikidata or {property = {'P18', 'P5252'}}
	return tableReturned
end

function p.interior(upright)
    return p.standardImage('intérieur', {'intérieur', 'interior'}, 'P5775', upright or '1')
end

function p.logo(upright)
    return p.standardImage('logo', {'logo', 'association_logo'}, 'P154', upright or '0.6')
end

function p.blason(upright)
	local tableReturned = p.standardImage('blason', {'blason', 'sceau'}, {'P94', 'P158'}, upright or '0.8')
	tableReturned.captionparameter = {'légende blason', 'légende sceau'}
	tableReturned.uprightparameter = {'upright blason', 'upright sceau'}
	tableReturned.sizeparameter = {'taille blason', 'taille sceau'}
	return tableReturned
end
-- Il n'y a aucune preuve que le paramètre id ai une utilité: aucun appel avec ce paramètre et pas de documentation (2022-08-20).

function p.flag(upright, id)
	local tableReturned = p.standardImage('drapeau', {'drapeau'}, 'P41', upright or '1')
	local drapeau = wikidata.formatStatements{entity = id, property = 'P163', defaultlink = '-'}
	tableReturned.captionparameter = drapeau or 'légende drapeau'
	return tableReturned
end

function p.sign(upright)
	return p.standardImage('signalisation', {'signalisation'}, 'P14', upright or '0.4')
end

function p.icon(upright)
	return p.standardImage('icône', {'icône'}, 'P2910', upright or '0.4')
end

function p.bathymetricmap(upright)
	return p.standardImage('carte bathymétrique', {'carte bathymétrique'}, 'P207', upright or '1')
end

function p.routemap(upright)
	return {
		type = 'images',
		imageparameters =  {'tracé'},
	--	defaultimage = {},
	--	maintenancecat =
		captionparameter = 'légende tracé',
		property = 'P15',
		defaultupright = upright or '1',
		uprightparameter = 'upright tracé',
		sizeparameter = 'taille tracé',
		numval = 1,
	}
end

-- Liens externes
function p.website(localparam) -- texte libre [http://example.org example.org] ou url seule localparam est désigne le paramètre utilisé historiquement dans le modèle pour le site web (legacy)
	return { 
		type = 'mixed',
		label = 'Site web', 
		plurallabel = 'Sites web',
		wikidata = function()
				local values, num = wikidata.formatAndCat {
					entity = localdata.item,
					displayformat = 'weblink',
					conjtype = '<br />',
					property = 'P856',
					isinlang = 'fr',
					excludespecial = true, -- excludespecial car il peut y avoir marqué "aucune valeur" pour le français, mais y avoir un site en anglais
					returnnumberofvalues = true,
				}
				if not values then
					values, num = wikidata.formatAndCat {
						entity = localdata.item,
						displayformat = 'weblink',
						conjtype = '<br />',
						property = 'P856',
						showlang = true,
						excludespecial = true,
						returnnumberofvalues = true,
					}
				end
				return values, num
			end,
		value = 
			function()
				local siteurl = localdata[localparam] or localdata['site web'] or localdata['site_web'] or localdata['site officiel'] or localdata['site internet'] or localdata['web']
				local sitename = localdata['nom site']
				if siteurl then
					if siteurl == '-' then
						return '-'
					else
						return require("Module:Weblink").makelink(siteurl, sitename)
					end
				end
			end,
	}
end

-- Son, prononciation
function p.selectSound(prop)
	-- priorité au français
	if wikidata.getClaims{entity = localdata.item, property = prop, qualifier = {'P407'}, qualifiervalue  = {'Q150'} } then
		return {property = prop, qualifier = {'P407'}, qualifiervalue  = {'Q150'} }
	end
	return {property = prop}
end

function p.prononciation()
	return {
		type		     = 'images',
		style            = {['padding-top'] = '25px'},
		defaultcaption   = 'Prononciation',
		captionparameter = 'légende prononciation',
		imageparameters  = 'prononciation',
		defaultsize      = '280',
		wikidata         = p.selectSound('P443'),
		numval           = 1,
	}
end

-- Fonctions de géolocalisation
function p.country(default)
	local coordfunctions = require 'Module:Infobox/Fonctions/Géolocalisation'
	return coordfunctions.country(default)	
end

--- localisation administrative par Wikidata
function p.wikidataDivRows(countryid)  -- liste de lignes de divisions administrative basée sur des données de Wikidata
	if not localdata.item then
		return nil
	end
	-- récupération des valeurs
	local list = wikidata.transitiveVals(localdata.item, {property = "P131", atdate = "today", excludespecial = true}, 3, 5, countryid)
	if not list then
		return nil
	end

	-- création des colonnes
	local rows = {}
	for i, div in pairs(list) do
		if (div == countryid) then
			break
		end
		local rowlabel, rowlabelid, rowlabeltext, rowlabellink, rowvalue
		rowlabelid = wikidata.formatStatements{entity= div, property = 'P31', numval = 1, displayformat = 'raw', excludespecial = true}
		
		rowlabeltext = wikidata.getLabel(rowlabelid)
		if rowlabeltext then
			rowlabeltext = linguistic.ucfirst(linguistic.removecomplement(rowlabeltext))  -- imposé par les libellés pas très logiques sur Wikidata du genre "canton de Suisse" plutôt que "canton"		else
		else
			rowlabeltext = ''
		end
		
		if (not rowlabeltext) then
			rowlabeltext = 'Division'
		end
		
		if rowlabelid then
			rowlabellink = wikidata.siteLink(rowlabelid, {defaultlink = '-', defaultlinkquery= {property = "P2354"}} ) -- si pas de lien, lier vers la page de liste e.g liste des Etats de Californie
		end
		if rowlabellink then
			rowlabel = "[[" .. rowlabellink .. "|" .. rowlabeltext .. "]]"
		else
			rowlabel = rowlabeltext
		end
		rowvalue = wikidata.formatEntity(div, {labelformat = function(id) 
			local str = wikidata.getLabel(id) or ""
			if mw.ustring.match(rowlabel, str) then
				str = linguistic.keepcomplement(str)-- si le nom de la division administrative affiché est présent, ne pas le répéter
			end
			return str
			end})
		
		table.insert(rows, 1, {type = "row", label = rowlabel, value = function() return rowvalue end})
	end
	return rows
end

function p.geoloc(params)
	local coordfunctions = require 'Module:Infobox/Fonctions/Géolocalisation'
	return coordfunctions.geoloc(params)	
end

function p.coordinates(params)
	local coordfunctions = require 'Module:Infobox/Fonctions/Géolocalisation'
	return coordfunctions.coordinates(params)
end

function p.locationmap(params)
	local coordfunctions = require 'Module:Infobox/Fonctions/Géolocalisation'
	return coordfunctions.locationmap(params)	
end

function p.detailedmap(params)
	local coordfunctions = require 'Module:Infobox/Fonctions/Géolocalisation'
	return coordfunctions.detailedmap(params)	
end

return p