Module:Adresse : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
m (Typo. (- espace avant virgule), remplacement: m , a → m, a)
(désactive code postal, ne parait en fait pas très pertinent tant qu'on a pas une adresse intégrale, ajoute rétroliens vers Wikidata, adapte "direction" au pays, nettoyage et petits ajouts)
Ligne 3 : Ligne 3 :
 
local wikidata =require('Module:Wikidata')
 
local wikidata =require('Module:Wikidata')
  
local areaformatting = {
+
local street = {
 
-- identifant wikipédia = regex pour le format de l'adresse  
 
-- identifant wikipédia = regex pour le format de l'adresse  
 
-- $number : le numéro de l'immeuble
 
-- $number : le numéro de l'immeuble
Ligne 10 : Ligne 10 :
 
-- utiliser des noms plutôt que des ID wikidata ?
 
-- utiliser des noms plutôt que des ID wikidata ?
 
-- si problème de performance, utiliser des fonctions plutôt que des regex ?
 
-- si problème de performance, utiliser des fonctions plutôt que des regex ?
Q16 = '$number $street',-- Canada
+
Q16 = '$number $street $direction',-- Canada
 +
Q30 = '$number $street $direction',-- Etats-Unis
 
Q31 = '$number $street',-- Belgique
 
Q31 = '$number $street',-- Belgique
 
Q40 = '$street $number', -- Autriche
 
Q40 = '$street $number', -- Autriche
 +
Q148 = '$direction $street number', -- à décider : nom anglais ou nom français ?
 
Q183 = '$street $number', -- Allemagne
 
Q183 = '$street $number', -- Allemagne
 
Q39 = '$street $number', -- Suisse
 
Q39 = '$street $number', -- Suisse
 
Q142 = '$number $street',-- France
 
Q142 = '$number $street',-- France
default = '$number $street',
+
Q145 = '$number $street',-- UK
 +
Q218 = '$street $number', --  Roumanie
 +
default = '$number $street $direction',
 
}
 
}
  
local function formatStreet(streetname, housenumber, area)
+
local direction = { -- directions affichées dans les noms des rues
local val = areaformatting[area] or areaformatting['default']
+
Q16 = {Q659 = 'Nord', Q679 = 'Ouest', Q684 = 'Est', Q667 = 'Sud'}, -- au Canada, on peut avoir des noms de rue en français
val = mw.ustring.gsub(val, '$number', housenumber or '')
+
Q30 = {Q659 = 'North', Q679 = 'West', Q684 = 'East', Q667 = 'South'}, -- Etats-Unis seulement la première lettre ?
val = mw.ustring.gsub(val, '$street', streetname or '')
+
}
return val
 
end
 
  
 
function p.formatAddress(streets, postcode, city, formattingarea)
 
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
 
-- 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 or #streets == 0) and (not postcode) and (not city) then  
+
if (not streets) and (not postcode) and (not city) then  
 
return nil
 
return nil
 
end
 
end
Ligne 34 : Ligne 36 :
 
local addresslines = {} -- lignes à mettre dans l'adresse : rue, codepostal + ville etc.
 
local addresslines = {} -- lignes à mettre dans l'adresse : rue, codepostal + ville etc.
 
if streets then
 
if streets then
table.insert(addresslines, mw.text.listToText(streets))
+
table.insert(addresslines, streets)
 
end
 
end
 +
 
if postcode or formattingarea then
 
if postcode or formattingarea then
 
table.insert(addresslines, (postcode or '') .. ' ' .. (formattingarea or ''))
 
table.insert(addresslines, (postcode or '') .. ' ' .. (formattingarea or ''))
 
end
 
end
 +
 
return table.concat(addresslines, '<br />')
 
return table.concat(addresslines, '<br />')
 
end
 
end
Ligne 53 : Ligne 57 :
 
end
 
end
  
local function streetFromClaims(claim) -- réupère le nom de la rue à partir d'une affirmation P669 Wikidata
+
local function directionFromClaim(claim, area) -- par exemple rue Sherbrooke Ouest
if not claim.mainsnak.snaktype == 'value' then
+
if not claim.qualifiers or not claim.qualifiers.P560 then
 
return nil
 
return nil
 
end
 
end
local streetname = wikidata.formatSnak(claim.mainsnak)
+
local str = ''
local direction = wikidata.getFormattedQualifiers(claim, {'P560'}, {link='-'}) -- par exemple "rue Sherbrooke OUest"
+
for i, snak in pairs(claim.qualifiers.P560) do
if direction then
+
str = str .. wikidata.formatSnak(snak, {speciallabels = direction[area]})
return streetname .. ' ' .. direction
 
else
 
return streetname
 
 
end
 
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
 
end
  
Ligne 69 : Ligne 83 :
 
local streetname = streetFromClaims(claim)
 
local streetname = streetFromClaims(claim)
 
local housenumber =  numberFromClaim(claim)
 
local housenumber =  numberFromClaim(claim)
return formatStreet(streetname, housenumber, area)
+
local direction = directionFromClaim(claim, area)
 +
return formatStreet(streetname, housenumber, direction, area)
 
end
 
end
  
 
function p.wikidataAddress(item) -- fprùate l'intégralité d'une adresse à partir des données contenues dans une élément Wikidata
 
function p.wikidataAddress(item) -- fprùate l'intégralité d'une adresse à partir des données contenues dans une élément Wikidata
-- essaye la propriété P669 (données de type 'élément'
+
 
-- TODO : récupérer la zone géographique pour le formatage
+
-- 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}
 
local streetclaims = wikidata.getClaims{item=item, property = 'P669', item=item}
local streetstrings = {}
 
local area = wikidata.getClaims({item = item, property = 'P17'}) -- utilise le pays comme approximation pour le format d'adresse à utiliser
 
if area and #area > 0 then
 
area = wikidata.getmainid(area[1])
 
end
 
 
if streetclaims then
 
if streetclaims then
 
for i, j in pairs(streetclaims) do
 
for i, j in pairs(streetclaims) do
streetstrings[i] = wikidatastreet(j, area)
+
streetclaims[i] = wikidatastreet(j, area)  
 
end
 
end
else
+
streets = mw.text.listToText(streetclaims)
-- sinon,essaye p969: datatype: string
+
streets = wikidata.addLinkback(streets, item, 'P969')
streetclaims =  wikidata.getClaims{property = 'P969', item=item}
+
-- faut-il ajouter Category:Page utilisant des données de Wikidata/P969 ?
if streetclaims then for i, j in pairs(streetclaims) do
+
end
local street = wikidata.formatStatement(j)
+
-- sinon : P969, type : string
streetstrings[i] = street
+
if not streets then
end end
+
streets =  wikidata.formatAndCat{property = 'P969', item=item}
 
end
 
end
-- code postal
+
 
local postcode = wikidata.getClaims{property= 'P281', item=item}
+
--[[ 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
 
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  
 
postcode = nil  
Ligne 100 : Ligne 116 :
 
postcode = wikidata.formatStatement(postcode[1])
 
postcode = wikidata.formatStatement(postcode[1])
 
end
 
end
 +
]]--
 
-- faaut-il essayer d'ajouter la ville par P131 ? Souvent on en veut pas (par exemple en infobox)
 
-- faaut-il essayer d'ajouter la ville par P131 ? Souvent on en veut pas (par exemple en infobox)
local val = p.formatAddress(streetstrings, postcode)
+
local val = p.formatAddress(streets, postcode)
 
if val then return
 
if val then return
 
val .. '[[Category:Page utilisant une adresse fournie par Wikidata]]'
 
val .. '[[Category:Page utilisant une adresse fournie par Wikidata]]'

Version du 10 mars 2015 à 13:26

La documentation pour ce module peut être créée à Module:Adresse/doc

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 = '$direction $street number', -- à décider : nom anglais ou nom 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, 'P969')
		-- 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