Aller au contenu

Module:Adresse/Bac à sable

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 7 octobre 2017 à 12:13 et modifiée en dernier par Zebulon84 (discuter | contributions) (maintenance : addLinkback → addLinkBack). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[voir] [modifier] [historique] [purger]

Ce module permet l'extraction d'une adresse depuis Wikidata et sa mise en forme.

Utilisation

Fonctions exportables

  • streetAddress(item, area) – Met en forme l'adresse partielle avec le numéro de rue et la rue ;
  • adminDivList(item, country) – Retourne la liste des subdivisions territoriales (commune, départements, cantons,… ) du pays en paramètre selon les données entrées dans Module:Adresse/Formats ;
  • cityLine(item, country, divlist, postcode) – Met en forme l'adresse partielle avec le nom de la ville, les noms des subdivisions territoriales et le code postal ;
  • fullAddress(item, country, divs, streetstr, divstr, showcountry, postcode) – Met en forme l'adresse complète contenant numéro de rue, nom de rue, nom de la ville, noms des subdivisions territoriales, code postal et nom du pays et ajoute la catégorie Catégorie:Page utilisant une adresse fournie par Wikidata ;
  • wikidataAddress(item, country) – Reprend l'adresse de rue issue de streetAddress et y ajoute la catégorie Catégorie:Page utilisant une adresse fournie par Wikidata.

Modules externes et autres éléments dont ce module a besoin pour fonctionner

  • mw.ustring.gsub – Remplace toutes les occurrences d'un motif dans une chaîne de caractères par une chaîne de remplacement ;
  • mw.text.listToText – Joint les éléments d'une liste pour former une chaîne de caractères ;
  • mw.text.trim – Enlève les espaces et autres caractères au début et à la fin d'une chaine de caractères ;
  • Module:Wikidata – Module contenant des fonctions de récupération des données depuis Wikidata ;
  • Module:Linguistique – Module contenant des fonctions de mise en forme et d'analyse basique d'une chaîne de caractères ;
  • Module:Country data – Module de mise en forme des noms de lieux et des nationalités.

Module en sous-page

Modules lua utilisant ce module

Modèles appelant directement ce module

Aucun

Exemples

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
	return wikidata.formatStatements{property = 'P17', entity = item, displayformat = 'raw', numvals = 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
	area = area or formats[getCountry(item)]
	
	-- 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.addLinkBack(streets, item, 'P669')
		-- faut-il ajouter Category:Page utilisant des données de Wikidata/P969 ?
	end
	-- sinon : P969, type : string
	if not streets then 
		streets =  wikidata.formatAndCat{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 = {entity = place, property = 'P131'}
	local divs = wikidata.transitiveVals(item, query, 0, 10, country)
	
	
	-- 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 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
					
	displayformat = formats[country] or formats.default
	local maxdepth = 3
	if not divs then
		return nil
	end
	local validDivs = {}
	
	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) -- line with list of admin divisions + optional postcode
	country = country or getCountry(item)
	
	local postcode = wikidata.formatStatements{entity = item, property = 'P281'} or ''
	local divstr = ''
	
	divlist = divlist or p.adminDivList(item, country)
	if not divlist then-- add a maintenance category ?
	end
	for i, j in pairs(divlist) do
		divlist[i] = wikidata.formatEntity(j)
	end
	local divstr = linguistic.conj(divlist, 'comma')

	local str = formats[country].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)

	 -- country id used for formatting
	country = country or getCountry(item)
	local displayformat = formats[country] or formats.default

	-- line 1 street
	local streetline = p.streetAddress(item, country)
	
	-- line 2: administrative divisions, postcodes
	local cityline = p.cityLine(item, country, divs)
	
	-- line 3: country
	local countryline = countrymodule.standarddisplay(country) or wikidata.formatStatements{entity = entity, property = 'P17'}
	return linguistic.conj({streetline, cityline, countryline}, '<br />')
end

function p.wikidataAddress(item, country) -- fonction de transition
	local area = formats[country] or formats.default
	return p.streetAddress(item, area)
end

function p.fullAddressB(frame)
	local args = frame.args
	return p.fullAddress(args[1], args.country, args.divs, args.streetstr, args.divstr)
end

return p