For faster navigation, this Iframe is preloading the Wikiwand page for Module:Adresse.

Module:Adresse

 Documentation[créer] [purger]

Voir les statistiques d'utilisation du module sur l'outil wstat.

local formats = require "Module:Adresse/Formats"

local p = {}
local wikidata = require "Module:Wikidata"
local linguistic = require "Module:Linguistique"
local countrymodule = require "Module:Country data"

local function getCountry(item) -- get country id for formatting
	local country = wikidata.getIds(item, {property = "P17"})
	if (not country) then
		return nil
	end
	if #country > 1 then
		return nil
	end
	return country[1] 
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 directionFromClaim(claim, area) -- par exemple rue Sherbrooke Ouest
	if not claim.qualifiers or not claim.qualifiers.P560 then
		return nil
	end
	local str = ''
	for i, snak in pairs(claim.qualifiers.P560) do
		local directionlabels = area.directions or formats.default.directions
		str = str .. wikidata.formatSnak(snak,  {speciallabels = directionlabels})
	end
	return str
end

local function streetFromClaims(claim) -- réupère le nom de la rue à partir d'une affirmation P669 Wikidata
	return wikidata.formatStatement(claim)
end

local function formatStreet(streetname, housenumber, direction, displayformat)
	local val = displayformat.streetline or formats.default.streetline
	val = mw.ustring.gsub(val, '$number', housenumber or '')
	val = mw.ustring.gsub(val, '$street', streetname or '')
	val = mw.ustring.gsub(val, '$direction', direction or '')
	return val
end

local function wikidatastreet(claim, area) --formate des données sur la rue à partir d'une affirmation Wikidata
	local streetname = streetFromClaims(claim, area)
	local housenumber =  numberFromClaim(claim, area)
	local direction = directionFromClaim(claim, area)
	return formatStreet(streetname, housenumber, direction, area)
end

function p.streetAddress(item, area) -- formate la ligne concernant la rue et le numéro de rue
	local streets -- châine contenant le ou les rues et numéros d'immeuble
	
	if not area then
		local country = getCountry(item)
		if country and formats[country] then
			area = formats[country]
		else
			area = formats.default
		end
	end
	
	-- essaye de remplir street, en priorité avec P669, type : élément
	local streetclaims = wikidata.getClaims{entity = item, property = 'P669'}
	if streetclaims then
		for i, j in pairs(streetclaims) do
			streetclaims[i] = wikidatastreet(j, area)
		end
		streets = mw.text.listToText(streetclaims)
		streets = wikidata.formatAndCat{value = streets, entity = item, property = 'P669'}
	end
	
	-- sinon : P6375, type : string -- remplace P969
	if not streets then
		streets = wikidata.formatAndCat{linkback = true, property = 'P6375', entity = item, isinlang = 'fr'}
	end
	
	-- sinon : P969, type : string -- propriété obsolète
	if not streets then 
		streets =  wikidata.formatAndCat{linkback = true, property = 'P969', entity = item}
	end
	
	return streets
end

function p.adminDivList(item, country) -- returns a list of admin divisions matching the criteria defined in Module:Adresse/Formats
	country = country or getCountry(item)
	local query = {property = 'P131'}
	local divs = wikidata.transitiveVals(item, query, 0, 10, country)
	local validDivs = {}	
	
	-- solution 1: looks for divs of a certain type
	local function setValue(targetclasses, depth)
		local test = {}
		for _, d in pairs(divs) do
			for j, divtype in pairs(targetclasses) do
				if (divtype == '-') then
					if #validDivs > 0 then
						divs = wikidata.addVals(divs, query, 0, 1, country)
					end
					if divs[#divs] == country then
						return nil
					end
					return divs[#divs]
				end
				if wikidata.isInstance(divtype, d, 3) then
					 -- restrain list to new value, will be expanded only if needed
					divs = {d}
					return d
				end
			end
		end
		if depth >= 0 then
			local num = #divs
			divs = wikidata.addVals(divs, query, 0, 10, country)
			if #divs > num then return setValue(targetclasses, depth) end
		end
	end

	-- solution2: looks for divs that are part of a closed list (way more efficient for big items)
	local function findInList(list, depth) 
		for i, j in pairs(divs) do
			for k, l in pairs(list) do
				if j == l then
					divs = {l}
					return l
				end
			end
		end
		if depth >= 0 then
			local num = #divs
			divs = wikidata.addVals(divs, query, 0, 10, country)
			if #divs > num then return findInList(list, depth) end
		end
	end
					
	local displayformat = formats[country] or formats.default
	local maxdepth = 3
	if not divs then
		return nil
	end

	if displayformat.div1 then
		local val = setValue(displayformat.div1, maxdepth)
		if val and val ~= validDivs[#validDivs] then
			table.insert(validDivs, val)
		end
	end

	if displayformat.div2 then
		local val = setValue(displayformat.div2, maxdepth)
		if val and val ~= validDivs[#validDivs] then
			table.insert(validDivs, val)
		end
	elseif displayformat.div2vals then
		local val =  findInList(displayformat.div2vals, 1)
		if val and val ~= validDivs[#validDivs] then
			table.insert(validDivs, val)
		end
	end
	
	if displayformat.div3 then
		local val = setValue(displayformat.div3, maxdepth)
		if val and val ~= validDivs[#validDivs] then
			table.insert(validDivs, val)
		end
	elseif displayformat.div3vals then
		local val =  findInList(displayformat.div3vals, 0)
		if val and val ~= validDivs[#validDivs] then
			table.insert(validDivs, val)
		end
	end
	
	return validDivs
end

function p.cityLine(item, country, divlist, postcode) -- line with list of admin divisions + optional postcode
	country = country or getCountry(item)
	
	local postcode = postcode or wikidata.formatStatements{entity = item, property = 'P281'} or ''
	if postcode == '-' then -- can be disabled when it is not useful
		postcode = ''
	end
	local divstr = ''
	
	if (not divlist) or (#divlist == 0) then
		divlist = p.adminDivList(item, country)
	end
	if (not divlist) or (#divlist == 0) then
		return -- add a maintenance category ?
	end
	for i, j in pairs(divlist) do
		if string.find(j, '^Q[0-9]+$') then
			divlist[i] = wikidata.formatEntity(j)
		end
	end
	local divstr = linguistic.conj(divlist, 'comma')

	local formatting = formats[country] or formats.default
	local str = formatting.cityline or formats.default.cityline
	str = str:gsub("$postcode", postcode or '')
	str = str:gsub("$admindivs", divstr or '')
	return str
end

function p.fullAddress(item, country, divs, streetstr, divstr, showcountry, postcode)
	 -- country id used for formatting
	country = country or getCountry(item)
	local displayformat = formats[country] or formats.default

	-- line 1 street
	local streetline = streetstr or p.streetAddress(item, country)
	
	-- line 2: administrative divisions, postcodes
	local cityline = divstr
	if not cityline then
		local partiallylocated = wikidata.formatAndCat{entity = item, property = {'P3179', 'P1382')) -- pour les grandes entités 
		cityline = p.cityLine(item, country, divs, postcode)
		cityline = linguistic.conj({ partiallylocated, cityline}, 'new line')
	end
	if (not cityline) or mw.text.trim(cityline) == '' then
		cityline = nil
	end

	-- line 3: country
	local countryline, success
	if (showcountry ~= '-') then
		countryline, success = countrymodule.standarddisplay(country)
		if not success then
			if (type(country) == 'string') and string.find(country, "^Q[0-9]+$") then
				countryline = wikidata.formatEntity(country)
			else
				countryline = country or wikidata.formatStatements{entity = item, property = 'P17'}
			end
		end
	end
	local str = linguistic.conj({streetline, cityline, countryline}, '<br />')
	if str and (not streetstr) and (not divstr) then -- à peu près
		str = str .. '[[Category:Page utilisant une adresse fournie par Wikidata]]'
	end
	return str
end

function p.wikidataAddress(item, country) -- fonction de transition
	local area = formats[country] or formats.default
	local val = p.streetAddress(item, area)
	if val then
		return val .. '[[Category:Page utilisant une adresse fournie par Wikidata]]'
	end
end
return p
{{bottomLinkPreText}} {{bottomLinkText}}
Module:Adresse
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.