« Module:Adresse » : différence entre les versions
désactivation d'urgence (provisoire) |
erruer de script réparée, prépare à la personnalisation par zone géographique |
||
| Ligne 3 : | Ligne 3 : | ||
local wikidata =require('Module:Wikidata') | local wikidata =require('Module:Wikidata') | ||
local | local areaformatting = { | ||
-- 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 ? | |||
Q39 = '$street $number', -- Suisse | |||
Q142 = '$number $street',-- France | |||
default = '$number $street', | |||
} | |||
local function formatStreet(streetname, housenumber, area) | local function formatStreet(streetname, housenumber, area) | ||
local val = areaformatting[area] or areaformatting['default'] | |||
val = mw.ustring.gsub(val, '$number', housenumber or '') | |||
val = mw.ustring.gsub(val, '$street', streetname or '') | |||
return val | |||
end | end | ||
| Ligne 31 : | Ligne 40 : | ||
local function numberFromClaim(claim) -- récupère le numéro de l'immeuble à partir d'un qualificatif P670 d'une affirmation Wikidata | local function numberFromClaim(claim) -- récupère le numéro de l'immeuble à partir d'un qualificatif P670 d'une affirmation Wikidata | ||
if | if not claim.qualifiers or not claim.qualifiers.P670 then | ||
return nil | return nil | ||
end | end | ||
| Ligne 42 : | Ligne 51 : | ||
local function streetFromClaims(claim) -- réupère le nom de la rue à partir d'une affirmation P669 Wikidata | local function streetFromClaims(claim) -- réupère le nom de la rue à partir d'une affirmation P669 Wikidata | ||
if | if not claim.mainsnak.snaktype == 'value' then | ||
return nil | return nil | ||
end | end | ||
| Ligne 49 : | Ligne 58 : | ||
local function wikidatastreet(claim , area) --formate des données sur la rue à partir d'une affirmation Wikidata | local function wikidatastreet(claim , area) --formate des données sur la rue à partir d'une affirmation Wikidata | ||
local streetname = streetFromClaims( | local streetname = streetFromClaims(claim) | ||
local housenumber = numberFromClaim( | local housenumber = numberFromClaim(claim) | ||
return formatStreet(streetname, housenumber, area) | return formatStreet(streetname, housenumber, area) | ||
end | end | ||
| Ligne 57 : | Ligne 66 : | ||
-- essaye la propriété P669 (données de type 'élément' | -- essaye la propriété P669 (données de type 'élément' | ||
-- TODO : récupérer la zone géographique pour le formatage | -- TODO : récupérer la zone géographique pour le formatage | ||
local streetclaims = wikidata.getClaims{item=item, property = 'P669', item=item} | local streetclaims = wikidata.getClaims{item=item, property = 'P669', item=item} | ||
local streetstrings = {} | 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( | streetstrings[i] = wikidatastreet(j, area) | ||
end | end | ||
else | else | ||
Version du 7 janvier 2015 à 15:33
local p = {}
local wikidata =require('Module:Wikidata')
local areaformatting = { -- 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 ? Q39 = '$street $number', -- Suisse Q142 = '$number $street',-- France default = '$number $street', }
local function formatStreet(streetname, housenumber, area) local val = areaformatting[area] or areaformatting['default'] val = mw.ustring.gsub(val, '$number', housenumber or ) val = mw.ustring.gsub(val, '$street', streetname or ) return val end
function p.formatAddress(streets, postcode, city, formattingarea) -- streets est une table de {streetname, number, } -- formatting area est le lieu, normalement plus large 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 return nil end
local addresslines = {} -- lignes à mettre dans l'adresse : rue, codepostal + ville etc.
if streets then
table.insert(addresslines, mw.text.listToText(streets))
end
if postcode or formattingarea then
table.insert(addresslines, (postcode or ) .. ' ' .. (formattingarea or ))
end
return table.concat(addresslines, '
')
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 streetFromClaims(claim) -- réupère le nom de la rue à partir d'une affirmation P669 Wikidata if not claim.mainsnak.snaktype == 'value' then return nil end return wikidata.formatSnak(claim.mainsnak) 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) return formatStreet(streetname, housenumber, area) end
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 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 for i, j in pairs(streetclaims) do streetstrings[i] = wikidatastreet(j, area) end else -- sinon,essaye p969: datatype: string streetclaims = wikidata.getClaims{property = 'P969', item=item} if streetclaims then for i, j in pairs(streetclaims) do streetstrings[i] = wikidata.formatStatement(j) end end end -- code postal 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(streetstrings, postcode) if val then return val .. end end return p