« Module:Adresse » : différence entre les versions

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
désactivation d'urgence (provisoire)
0x010D (discussion | contributions)
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 afterstreetname = {} -- à remplir : les zones dans lesquelles le numéro de l'immeuble est affiché après le nom de la rue
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) -- à faire
local function formatStreet(streetname, housenumber, area)
if afterstreetname[area] then
local val = areaformatting[area] or areaformatting['default']
return streetname .. ' ' .. housenumber
val = mw.ustring.gsub(val, '$number', housenumber or '')
else
val = mw.ustring.gsub(val, '$street', streetname or '')
return housenumber .. ' ' .. streetname
return val
end
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 not claim or not claim.qualifiers or not claim.qualifiers.P670 then
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 not claim or not claim.mainsnak.snaktype == 'value' then
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(j)
local streetname = streetFromClaims(claim)
local housenumber =  numberFromClaim(j)
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
if true then return nil end
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(i)
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