Module:Adresse : Différence entre versions
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 | + | 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 | + | 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) | 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 | + | 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, | + | 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 | + | local function directionFromClaim(claim, area) -- par exemple rue Sherbrooke Ouest |
− | if not claim. | + | if not claim.qualifiers or not claim.qualifiers.P560 then |
return nil | return nil | ||
end | end | ||
− | local | + | local str = '' |
− | + | for i, snak in pairs(claim.qualifiers.P560) do | |
− | + | str = str .. wikidata.formatSnak(snak, {speciallabels = direction[area]}) | |
− | |||
− | |||
− | |||
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 | + | 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 | ||
− | + | ||
− | -- | + | -- 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} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
if streetclaims then | if streetclaims then | ||
for i, j in pairs(streetclaims) do | for i, j in pairs(streetclaims) do | ||
− | + | streetclaims[i] = wikidatastreet(j, area) | |
end | end | ||
− | + | streets = mw.text.listToText(streetclaims) | |
− | -- sinon, | + | 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 | 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( | + | 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