Aller au contenu

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

De Wreck
Modèle:Infobox>Zolo
Aucun résumé des modifications
Modèle:Infobox>Zolo
Aucun résumé des modifications
Ligne 2 : Ligne 2 :


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 function formatStreet(streetname, housenumber, area) -- à faire
local function formatStreet(streetname, housenumber, area) -- à faire
local numberafter = 'DEU AUT' --pays dans lesquels le numéro de rue est avant le num
if afterstreetname[area] then
if area and string.find(numberafter, area .. ' ') then
return streetname .. ' ' .. housenumber
return streetname .. ' ' .. housenumber
else
else
Ligne 18 : Ligne 19 :
return nil
return nil
end
end
local streetstring = ''
 
for i, j in pairs(streets) do
local addresslines = {} -- lignes à mettre dans l'adresse : rue, codepostal + ville etc.
if j.number then
if streets then
j = formatStreet(j.name, j.number)
table.insert(addresslines, mw.text.listToText(streets))
else
j = j.name
end
streetstring = streetstring .. j .. '<br />'
end
end
if (not postcode) and (not area) then
if postcode or formattingarea then
return streetstring
table.insert(addresslines, (postcode or '') .. ' ' .. (formattingarea or ''))
end
end
return streetstring .. (postcode or '') .. ' ' .. (area or '')
return table.concat(addresslines, '<br />')
end
end


local function numberFromClaim(claim)
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
if not claim.qualifiers or not claim.qualifiers.P670 then
return nil
return nil
Ligne 44 : Ligne 41 :
end
end


local function streetFromClaims(claim)
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
if not claim.mainsnak.snaktype == 'value' then
return nil
return nil
Ligne 51 : Ligne 48 :
end
end


function p.wikidataAddress(item)
local function wikidatastreet(claim , area) --formate des données sur la rue à partir d'une affirmation Wikidata
-- en priorité la propriété P669, datatype: item
local streetname = streetFromClaims(j)
local streetclaims = wikidata.getClaims{item=item, property = 'P669'}
local housenumber =  numberFromClaim(j)
-- sinon, p969: datatype: string
return  formatStreet(streetname, housenumber, area)
if not streetclaims then
end
streetclaims = wikidata.getClaims{item=item, property = 'P669'}  
 
end
function p.wikidataAddress(item) -- fprùate l'intégralité d'une adresse à partir des données contenues dans une élément Wikidata
local streets = {}
-- 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 = {}
if streetclaims then
if streetclaims then
for i, j in pairs(streetclaims) do
for i, j in pairs(streetclaims) do
local streetname = streetFromClaims(j)
streetstrings[i] = wikidatastreet(i)
if streetname then
local number =  numberFromClaim(j)
table.insert(streets, {name = streetname, number = number })
end
end
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
end
local postcode = wikidata.getClaims{item=item, property= 'P281'}
-- 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
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  
elseif postcode then
elseif postcode then
postcode = wikidata.formatSnak(postcode[1].mainsnak)
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)
return p.formatAddress(streets, postcode)
local val = p.formatAddress(streetstrings, postcode)
if val then return
val .. '[[Category:Page utilisant une adresse fournie par Wikidata]]'
end
end
end
return p
return p

Version du 27 décembre 2014 à 11:18

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

local p = {}

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 function formatStreet(streetname, housenumber, area) -- à faire
	if afterstreetname[area] then
		return streetname .. ' ' .. housenumber
	else
		return housenumber .. ' ' .. streetname
	end
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(j)
	local housenumber =  numberFromClaim(j)
	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 = {}
	if streetclaims then
		for i, j in pairs(streetclaims) do
			streetstrings[i] = wikidatastreet(i)
		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