Module:Adresse

De Lagny-sur-Marne Wiki
Révision datée du 1 octobre 2014 à 19:09 par Zolo (discussion) (création rudimentaire)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

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

local p = {}

local wikidata =require('Module:Wikidata')

local function formatStreet(streetname, housenumber, area) -- à faire
	local numberafter = 'DEU AUT' --pays dans lesquels le numéro de rue est avant le num
	if area and string.find(numberafter, 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
	local streetstring = ''
	for i, j in pairs(streets) do
		if j.number then 
			j = formatStreet(j.name, j.number)
		else
			j = j.name
		end
		streetstring = streetstring .. j .. '<br />'
	end
	if (not postcode) and (not area) then
		return streetstring
	end
	return streetstring .. (postcode or '') .. ' ' .. (area or '')
end

local function numberFromClaim(claim)
	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)
	if not claim.mainsnak.snaktype == 'value' then
		return nil
	end
	return wikidata.formatSnak(claim.mainsnak)
end

function p.wikidataAddress(item)
	 -- en priorité la propriété P669, datatype: item
	local streetclaims = wikidata.getClaims{item=item, property = 'P669'}
	-- sinon, p969: datatype: string
	if not streetclaims then
		streetclaims =  wikidata.getClaims{item=item, property = 'P669'} 
	end
	local streets = {}
	if streetclaims then
		for i, j in pairs(streetclaims) do
			local streetname = streetFromClaims(j)
			if streetname then
				local number =  numberFromClaim(j)
				table.insert(streets, {name = streetname, number = number })
			end
		end
	end
	local postcode = wikidata.getClaims{item=item, property= 'P281'}
	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.formatSnak(postcode[1].mainsnak)
	end
	-- faaut-il essayer d'ajouter la ville par P131 ? Souvent on en veut pas (par exemple en infobox)
	return p.formatAddress(streets, postcode)
end
return p