Module:Adresse : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
(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 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

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

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, '<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 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 .. '[[Category:Page utilisant une adresse fournie par Wikidata]]'
	end
end
return p