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 31 : Ligne 31 :


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.qualifiers or not claim.qualifiers.P670 then
if not claim or not claim.qualifiers or not claim.qualifiers.P670 then
return nil
return nil
end
end

Version du 7 janvier 2015 à 17:06

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 or 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 or 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