Aller au contenu

Module:Adresse

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 11 mars 2015 à 13:22 et modifiée en dernier par Zolo (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

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

Ce module permet l'extraction d'une adresse depuis Wikidata et sa mise en forme.

Utilisation

Fonctions exportables

  • streetAddress(item, area) – Met en forme l'adresse partielle avec le numéro de rue et la rue ;
  • adminDivList(item, country) – Retourne la liste des subdivisions territoriales (commune, départements, cantons,… ) du pays en paramètre selon les données entrées dans Module:Adresse/Formats ;
  • cityLine(item, country, divlist, postcode) – Met en forme l'adresse partielle avec le nom de la ville, les noms des subdivisions territoriales et le code postal ;
  • fullAddress(item, country, divs, streetstr, divstr, showcountry, postcode) – Met en forme l'adresse complète contenant numéro de rue, nom de rue, nom de la ville, noms des subdivisions territoriales, code postal et nom du pays et ajoute la catégorie Catégorie:Page utilisant une adresse fournie par Wikidata ;
  • wikidataAddress(item, country) – Reprend l'adresse de rue issue de streetAddress et y ajoute la catégorie Catégorie:Page utilisant une adresse fournie par Wikidata.

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

  • mw.ustring.gsub – Remplace toutes les occurrences d'un motif dans une chaîne de caractères par une chaîne de remplacement ;
  • mw.text.listToText – Joint les éléments d'une liste pour former une chaîne de caractères ;
  • mw.text.trim – Enlève les espaces et autres caractères au début et à la fin d'une chaine de caractères ;
  • Module:Wikidata – Module contenant des fonctions de récupération des données depuis Wikidata ;
  • Module:Linguistique – Module contenant des fonctions de mise en forme et d'analyse basique d'une chaîne de caractères ;
  • Module:Country data – Module de mise en forme des noms de lieux et des nationalités.

Module en sous-page

Modules lua utilisant ce module

Modèles appelant directement ce module

Aucun

Exemples

local p = {}

local wikidata =require('Module:Wikidata')

local street = {
	-- identifant wikipédia = regex pour le format de l'adresse 
		-- $number : le numéro de l'immeuble
		-- $ street : le nom de la rue
	-- questions :
		-- utiliser des noms plutôt que des ID wikidata ?
		-- si problème de performance, utiliser des fonctions plutôt que des regex ?
	Q16 = '$number $street $direction',-- Canada
	Q30 = '$number $street $direction',-- Etats-Unis
	Q31 = '$number $street',-- Belgique
	Q40 = '$street $number', -- Autriche
	Q148 = '$number $street $direction', -- si l'on met les noms de rue en français
	Q183 = '$street $number', -- Allemagne
	Q39 = '$street $number', -- Suisse
	Q142 = '$number $street',-- France
	Q145 = '$number $street',-- UK
	Q218 = '$street $number', --  Roumanie
	default = '$number $street $direction',
	}

local direction = { -- directions affichées dans les noms des rues
	Q16 = {Q659 = 'Nord', Q679 = 'Ouest', Q684 = 'Est', Q667 = 'Sud'}, -- au Canada, on peut avoir des noms de rue en français
	Q30 = {Q659 = 'North', Q679 = 'West', Q684 = 'East', Q667 = 'South'}, -- Etats-Unis seulement la première lettre ?
}

function p.formatAddress(streets, postcode, city, formattingarea)
	-- streets est une table de {streetname, number, }quarge que "city" qui détermine le formatage de la rue et du code postal
	if (not streets) and (not postcode) and (not city) then 
		return nil
	end

	local addresslines = {} -- lignes à mettre dans l'adresse : rue, codepostal + ville etc.
	if streets then
		table.insert(addresslines, streets)
	end
	
	if postcode or formattingarea then
		table.insert(addresslines, (postcode or '') .. ' ' .. (formattingarea or ''))
	end

	return table.concat(addresslines, '<br />')
end

local function numberFromClaim(claim) -- récupère le numéro de l'immeuble à partir d'un qualificatif P670 d'une affirmation Wikidata
	if not claim.qualifiers or not claim.qualifiers.P670 then
		return nil
	end
	local vals = {}
	for i, j in pairs(claim.qualifiers.P670) do
		table.insert(vals, wikidata.formatSnak(j))
	end
	return table.concat(vals, '-')
end

local function directionFromClaim(claim, area) -- par exemple rue Sherbrooke Ouest
	if not claim.qualifiers or not claim.qualifiers.P560 then
		return nil
	end
	local str = ''
	for i, snak in pairs(claim.qualifiers.P560) do
		str = str .. wikidata.formatSnak(snak,  {speciallabels = direction[area]})
	end
	return str
end

local function streetFromClaims(claim, formattingarea) -- réupère le nom de la rue à partir d'une affirmation P669 Wikidata
	return wikidata.formatStatement(claim)
end

local function formatStreet(streetname, housenumber, direction, area)
	local val = street[area] or street[default]
	val = mw.ustring.gsub(val, '$number', housenumber or '')
	val = mw.ustring.gsub(val, '$street', streetname or '')
	val = mw.ustring.gsub(val, '$direction', direction or '')
	return val
end

local function wikidatastreet(claim, area) --formate des données sur la rue à partir d'une affirmation Wikidata
	local streetname = streetFromClaims(claim)
	local housenumber =  numberFromClaim(claim)
	local direction = directionFromClaim(claim, area)
	return formatStreet(streetname, housenumber, direction, area)
end

function p.wikidataAddress(item) -- fprùate l'intégralité d'une adresse à partir des données contenues dans une élément Wikidata

 	-- définit la zone dans laquelle on se trouve pour choisir le format à utilier
	local area = wikidata.formatStatements({item = item, property = 'P17', numval = 1, displayformat = 'raw'}) -- = pays
	
	local streets -- châine contenant le ou les rues et numéros d'immeuble

	-- essaye de remplir street, en priorité avec P669, type : élément
	local streetclaims = wikidata.getClaims{item=item, property = 'P669', item=item}
	if streetclaims then
		for i, j in pairs(streetclaims) do
			streetclaims[i] = wikidatastreet(j, area) 
		end
		streets = mw.text.listToText(streetclaims)
		streets = wikidata.addLinkback(streets, item, 'P669')
		-- faut-il ajouter Category:Page utilisant des données de Wikidata/P969 ?
	end
	-- sinon : P969, type : string
	if not streets then 
		streets =  wikidata.formatAndCat{property = 'P969', item=item}
	end

	--[[ code postal, peu utile pour l'instant
	local postcode = wikidata.getClaims{property= 'P281', item=item} 
	if postcode and #postcode > 1 then -- s'il y a plusieurs codes postaux, il y a sans doute plusieurs adresses différentes, c'est difficile de savoir lequel correspond à laquelle
		postcode = nil 
	elseif postcode then
		postcode = wikidata.formatStatement(postcode[1])
	end
	]]--
	-- faaut-il essayer d'ajouter la ville par P131 ? Souvent on en veut pas (par exemple en infobox)
	local val = p.formatAddress(streets, postcode)
	if val then return
		val .. '[[Category:Page utilisant une adresse fournie par Wikidata]]'
	end
end
return p