Module:Infobox/Fonctions/Géolocalisation : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
(enlève les fonctions test. Ajout d'un rétrolien vers Wikidata mais sur les très petits écrans, ça ajoute une ligne. Je réduirais volontiers la taille de l'affichage des coordonnées, mais ça risque de ne pas plaire :[es)
(option "defaultmaps")
 
(40 révisions intermédiaires par 5 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
local coord = require('Module:Coordinates')
+
local localdata = require( 'Module:Infobox/Localdata' )
local wikidatamod = require('Module:Wikidata')
+
local item = localdata.item
 +
local wd = require "Module:Interface Wikidata".fromLua
 +
-- Modules chargés si necessaire :
 +
-- local countrymodule = require "Module:Country data"
 +
-- local coord = require "Module:Coordinates"
 
local p = {}
 
local p = {}
  
 +
function p.country()
 +
local function formatCountry(country)
 +
if not country then
 +
return nil
 +
end
 +
local countrymodule = require "Module:Country data"
 +
local val, success = countrymodule.standarddisplay(country) -- val = nil si country n'est pas reconnu
 +
if success then
 +
return val
 +
end
 +
end
  
local p = {}
 
function p.country(country, label, flagdate, size) -- à faire : gestion des dates, mapping Wikidata/modèles, peut-être mettre une partie de la fonction dans un module séparé
 
return function(localdata, item)
 
if localdata['pays'] then -- priorité aux données locales
 
country =  localdata['pays']
 
end
 
local countrymodule = require('Module:Country data')
 
country = countrymodule.standarddisplay(country)
 
local wikidatacountry = wikidatamod.formatAndCat{
 
item = item,
 
property = 'P17',
 
displayformat = function(snak)
 
local id = 'Q' .. snak.datavalue.value['numeric-id']
 
local formattedval, success
 
if snak.snaktype == 'value' then
 
formattedval, success = countrymodule.standarddisplay(id)
 
end
 
if success then return
 
formattedval
 
else
 
return wikidatamod.formatSnak(snak)
 
end
 
end
 
}
 
 
return  {
 
return  {
 
type = 'mixed',
 
type = 'mixed',
 
label = 'Pays',
 
label = 'Pays',
value = function() return country end,
+
value = function() return formatCountry(localdata['pays']) or localdata['pays'] end,
wikidata = function() return wikidatacountry end
+
wikidata = {
 +
property = 'P17',
 +
conjtype = 'new line',
 +
displayformat = function(snak)
 +
local id = wd.getid(snak)  
 +
return formatCountry(id) or wd.formatSnak(snak)
 +
end
 +
}
 
}
 
}
end
 
 
end
 
end
  
local function coordcore(moduleparams)
+
function p.coordvalue(moduleparams) -- valeurs des coordonnées, sans mise en infoboîte
local globe = moduleparams.globe
+
local coord = require "Module:Coordinates"
local displayinline = moduleparams.displayinline
+
if not moduleparams then
local displaytitle = moduleparams.displaytitle
+
moduleparams = {}
local displayformat = moduleparams.displayformat
+
end
if (not displaytitle and not distantitem) then displaytitle = 'title' end -- displayinline et displaytitle sont des chaînes à utiliser dans le paramètre "display" de coord
 
--distantitem veut dire que le sujet de l'infobox ne correspond pas au sujet de l'article
 
if not displayinline then displayinline = 'inline' end
 
  
return function(localdata, item)
+
local function toboolean(val) -- transforme un "-" en false au moment voulu
+
if val == '-' or val == 'non' then
-- vérifie qu'il faut afficher les coordonnées
+
return false
if localdata["géolocalisation"] == 'pas pertinent' or localdata['géolocalisation'] == 'non' and not (localdata['coordonnées'] == 'oui') then
+
end
return nil
+
return true
 
end
 
end
+
 
-- si paramètres donnés dans l'article, écrasent les autres
+
-- paramètres Wikidata
if localdata['format coordonnées'] then
+
local wikidata = tostring(toboolean(localdata['wikidata'] or true)) -- doit être string dans Module:Coordinates
displayformat = localdata['format coordonnées']
+
local maxdistance = moduleparams.maxdistance
 +
local wikidataquery = moduleparams.wikidataquery or {property = 'P625'}
 +
if not wikidataquery.entity then
 +
wikidataquery.entity = item
 
end
 
end
 +
 +
-- paramètres d'affichage
 +
local displayformat = localdata['format coordonnées'], moduleparams.displayformat
 
 
displaytitle = 'title'
+
local displayplace = ''
if localdata['infoboxrank'] == 'secondary' then
+
local displayinline = toboolean(localdata['coords en ligne'] or moduleparams.displayinline or true)
displaytitle = ''
+
-- par défaut : on met dans les coordonnées de l'infobox principale en titre
 +
local displaytitle = localdata['coords en titre']
 +
or moduleparams.displaytitle
 +
or (localdata['infoboxrank'] == 'main')
 +
if displayinline and (displayinline ~= '-') then
 +
displayplace = displayplace .. 'inline'
 
end
 
end
if localdata['coords en titre'] == 'oui' then
+
if displaytitle and (displaytitle ~= '-'then
displaytitle = 'title'
+
displayplace = displayplace .. 'title,'
 
end
 
end
if localdata['coords en titre'] == 'non' or  localdata['coords en titre'] == '-' then
+
displaytitle = ''
+
-- données sur géograhiques
end
+
local globe = localdata['globe'] or localdata['planète'] or moduleparams['globe'] or 'earth'
if localdata['coords en en ligne'] == 'oui' then
 
displayinline = 'inline'
 
end
 
if localdata['coords en en ligne'] == 'non' or localdata['coords en en ligne'] == '-' then
 
displayinline = ''
 
end
 
local displayplace = displaytitle .. ',' .. displayinline
 
 
local latitude = localdata['latitude']
 
local latitude = localdata['latitude']
 
local longitude = localdata['longitude']
 
local longitude = localdata['longitude']
if localdata['globe'] then
+
 
globe = localdata['globe']
+
local parameterlist = {
 +
latitude = latitude,
 +
longitude = longitude,
 +
displayformat = displayformat,
 +
display= displayplace,
 +
globe = globe,
 +
wikidata = wikidata,
 +
wikidataquery = wikidataquery,
 +
maxdistance = maxdistance,
 +
}
 +
 +
local val = coord._coord(parameterlist)
 +
if (not val) and moduleparams.fallbackquery then -- si pas de valeur, essayer la query de sustitution
 +
parameterlist.wikidataquery = moduleparams.fallbackquery
 +
parameterlist.wikidataquery.entity = item
 +
val = coord._coord(parameterlist)
 
end
 
end
local wikidata = localdata['wikidata'] or 'true'
 
local val = coord._coord({latitude = latitude, longitude = longitude, displayformat = displayformat, display= displayplace, globe = globe, wikidata =wikidata})
 
 
if val and latitude and longitude and localdata['référence géolocalisation'] then
 
if val and latitude and longitude and localdata['référence géolocalisation'] then
 
val = val .. ' ' .. localdata['référence géolocalisation']
 
val = val .. ' ' .. localdata['référence géolocalisation']
 
end
 
end
 
if val and not localdata['latitude'] then
 
if val and not localdata['latitude'] then
val = wikidatamod.addLinkback(val, item, 'P625')
+
val = wd.addLinkback(val, item, wikidataquery.property)
 
end
 
end
if displayinline == '' then
+
if displayinline == false then
 
return -- type: external text pour ne pas avoir de ligne vide en infobox
 
return -- type: external text pour ne pas avoir de ligne vide en infobox
 
{
 
{
 
type = 'external text',
 
type = 'external text',
maintenancecat = 'Page géolocalisable sans coordonnées paramétrées',
 
 
sortkey = sortkey,
 
sortkey = sortkey,
 
  value = val
 
  value = val
Ligne 98 : Ligne 108 :
 
  else  
 
  else  
 
  return val
 
  return val
end
 
 
  end
 
  end
 
end
 
end
 +
 
function p.coordinates(moduleparams)
 
function p.coordinates(moduleparams)
 +
if not moduleparams then
 +
moduleparams = {}
 +
end
 +
-- paramètre coordonnées a la priorité sur "géolocalisation" (=carte)
 +
local relevant = localdata['coordonnées'] or localdata['géolocalisation']
 +
if relevant == '-' or relevant == 'non' then
 +
return nil
 +
end
 
-- initialise les paramètres avec les valeurs du module d'infobox (moduleparams)
 
-- initialise les paramètres avec les valeurs du module d'infobox (moduleparams)
if not moduleparams then moduleparams = {} end
 
 
return {
 
return {
 
type = 'mixed',
 
type = 'mixed',
 
label = 'Coordonnées',
 
label = 'Coordonnées',
maintenancecat = 'Page géolocalisable sans coordonnées paramétrées',
+
maintenancecat = moduleparams.maintenancecat or 'Page géolocalisable sans coordonnées paramétrées',
sortkey = sortkey,
+
sortkey = moduleparams.sortkey,
  value = coordcore(moduleparams)
+
  value = function (localdata) return p.coordvalue(moduleparams) end
}
+
}
 
end
 
end
  
function p.geoloc(maplist)
+
function p.geoloc(params)
 +
 
 +
if not params then
 +
params = {}
 +
end
 +
if (localdata['géolocalisation'] == '-') or (localdata['géolocalisation'] == 'pas pertinent') then
 +
return nil
 +
end
 +
 
return  {
 
return  {
 
type = 'map',
 
type = 'map',
 
latitude = 'latitude',
 
latitude = 'latitude',
class =  "infobox_v3",
 
 
longitude = 'longitude',
 
longitude = 'longitude',
wikidata = function(localdata, item) return wikidatamod.getClaims{item = item, property = 'P625'} end,
+
wikidata = {property = 'P625'},
maps = 'géolocalisation'
+
entity = item,
    }
+
maps = function() return localdata['géolocalisation'] or params.defaultmaps end, -- paramètre pour la liste des cartes à utiliser
+
staticmaps = 'carte', -- carte en mode image simple
 +
staticmapsWD = {property = "P242", numval = 1}, -- p
 +
pointtype = params.pointtype,
 +
maptype = params.maptype,
 +
globe = localdata.globe or localdata['planète'] or params.globe,
 +
marker = params.marker,
 +
default_zoom = params.default_zoom,
 +
params = {guessmaps = params.guessmaps} -- = quelles cartes utiliser en l'absence de données fournies dans |gélocalisation
 +
}
 
end
 
end
 +
 +
function p.locationmap(size)
 +
return {
 +
type = 'images',
 +
imageparameters =  {'carte'},
 +
sizeparameter = 'taille carte',
 +
defaultsize = size,
 +
property = 'P242',
 +
numval = 1,
 +
}
 +
end
 +
 
return p
 
return p

Version actuelle datée du 25 mai 2017 à 18:46

La documentation pour ce module peut être créée à Module:Infobox/Fonctions/Géolocalisation/doc

local localdata = require( 'Module:Infobox/Localdata' )
local item = localdata.item
local wd = require "Module:Interface Wikidata".fromLua
-- Modules chargés si necessaire :
-- local countrymodule = require "Module:Country data"
-- local coord = require "Module:Coordinates"
local p = {}

function p.country()
	local function formatCountry(country)
		if not country then
			return nil
		end
		local countrymodule = require "Module:Country data"
		local val, success = countrymodule.standarddisplay(country) -- val = nil si country n'est pas reconnu
		if success then
			return val
		end
	end

	return  {
		type = 'mixed',
		label = 'Pays',
		value = function() return formatCountry(localdata['pays']) or localdata['pays'] end,
		wikidata = {
			property = 'P17', 
			conjtype = 'new line', 
			displayformat = function(snak) 
				local id = wd.getid(snak) 
				return formatCountry(id) or wd.formatSnak(snak)
			end
		}
	}
end

function p.coordvalue(moduleparams) -- valeurs des coordonnées, sans mise en infoboîte
	local coord = require "Module:Coordinates"
	if not moduleparams then
		moduleparams = {}
	end

	local function toboolean(val) -- transforme un "-" en false au moment voulu
		if val == '-' or val == 'non' then
			return false
		end
		return true
	end

	-- paramètres Wikidata
	local wikidata = tostring(toboolean(localdata['wikidata'] or true)) -- doit être string dans Module:Coordinates
	local maxdistance = moduleparams.maxdistance
	local wikidataquery = moduleparams.wikidataquery or {property = 'P625'}
	if not wikidataquery.entity then
		wikidataquery.entity = item
	end

	-- paramètres d'affichage
	local displayformat = localdata['format coordonnées'], moduleparams.displayformat
	
	local displayplace = ''
	local displayinline = toboolean(localdata['coords en ligne'] or moduleparams.displayinline or true)
	-- par défaut : on met dans les coordonnées de l'infobox principale en titre
	local displaytitle = localdata['coords en titre']
		or moduleparams.displaytitle
		or (localdata['infoboxrank'] == 'main')
	if displayinline and (displayinline ~= '-') then
		displayplace = displayplace .. 'inline'
	end
	if displaytitle and (displaytitle ~= '-')  then
		displayplace = displayplace .. 'title,'
	end
	
	-- données sur géograhiques
	local globe = localdata['globe'] or localdata['planète'] or moduleparams['globe'] or 'earth'
	local latitude = localdata['latitude']
	local longitude = localdata['longitude']

	local parameterlist = {
		latitude = latitude,
		longitude = longitude,
		displayformat = displayformat,
		display= displayplace,
		globe = globe,
		wikidata = wikidata,
		wikidataquery = wikidataquery,
		maxdistance = maxdistance,
	}
	
	local val = coord._coord(parameterlist)
	if (not val) and moduleparams.fallbackquery then -- si pas de valeur, essayer la query de sustitution
		parameterlist.wikidataquery = moduleparams.fallbackquery
		parameterlist.wikidataquery.entity = item
		val = coord._coord(parameterlist)
	end
	if val and latitude and longitude and localdata['référence géolocalisation'] then
		val = val .. ' ' .. localdata['référence géolocalisation']
	end
	if val and not localdata['latitude'] then
		val = wd.addLinkback(val, item, wikidataquery.property)
	end
	if displayinline == false then
		return -- type: external text pour ne pas avoir de ligne vide en infobox
		{
		type = 'external text',
		sortkey = sortkey,
 		value = val
 		}
 	else 
 		return val
 	end
end

function p.coordinates(moduleparams)
	if not moduleparams then
		moduleparams = {}
	end
	-- paramètre coordonnées a la priorité sur "géolocalisation" (=carte)
	local relevant = localdata['coordonnées'] or localdata['géolocalisation'] 
	if relevant == '-' or relevant == 'non' then
		return nil
	end
	-- initialise les paramètres avec les valeurs du module d'infobox (moduleparams)
	return {
		type = 'mixed',
		label = 'Coordonnées',
		maintenancecat = moduleparams.maintenancecat or 'Page géolocalisable sans coordonnées paramétrées',
		sortkey = moduleparams.sortkey,
 		value = function (localdata) return p.coordvalue(moduleparams) end
 	}	
end

function p.geoloc(params)

	if not params then
		params = {}
	end
	if (localdata['géolocalisation'] == '-') or (localdata['géolocalisation'] == 'pas pertinent') then
		return nil
	end
	
	return   {
		type = 'map',
		latitude = 'latitude',
		longitude = 'longitude',
		wikidata = {property = 'P625'},
		entity = item,
		maps = function() return localdata['géolocalisation'] or params.defaultmaps end, -- paramètre pour la liste des cartes à utiliser
		staticmaps = 'carte', -- carte en mode image simple
		staticmapsWD = {property = "P242", numval = 1}, -- p
		pointtype = params.pointtype,
		maptype = params.maptype,
		globe = localdata.globe or localdata['planète'] or params.globe,
		marker = params.marker,
		default_zoom = params.default_zoom,
		params = {guessmaps = params.guessmaps} -- = quelles cartes utiliser en l'absence de données fournies dans |gélocalisation
	}
end

function p.locationmap(size)
	return {
		type = 'images',
		imageparameters =  {'carte'},
		sizeparameter = 'taille carte',
		defaultsize = 	size,
		property = 'P242',
		numval = 1,
	}
end

return p