Module:Adresse
Apparence
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 = '$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