Aller au contenu

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

De Wreck
Modèle:Infobox>Zolo
désactivation d'urgence (provisoire)
Modèle:Infobox>Zolo
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 à 17: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