Module:Adresse/Bac à sable
Apparence
[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égorieCaté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
Module:Adresse/Formats
– Table contenant les paramètres de mise en forme de l'adresse selon le pays.
Modules lua utilisant ce module
- Module:Infobox/Fonctions/Bâtiment ;
- Module:Infobox/Fonctions/Centrale électrique ;
- Module:Infobox/Abbaye ;
- Module:Infobox/Centre commercial ;
- Module:Infobox/Centre de congrès ;
- Module:Infobox/Gratte-ciel ;
- Module:Infobox/Stade ;
- Module:Infobox/Temple bouddhiste.
Modèles appelant directement ce module
Aucun
Exemples
La documentation de ce module est générée par le modèle {{Documentation module}}.
Elle est incluse depuis sa sous-page de documentation. Veuillez placer les catégories sur cette page-là.
Les éditeurs peuvent travailler dans le bac à sable (modifier).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
local formats = require "Module:Adresse/Formats"
local p = {}
local wikidata = require "Module:Interface Wikidata".fromLua
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.streetLine(item, area) -- fprùate l'intégralité d'une adresse à partir des données contenues dans une élément Wikidata
local streets -- châine contenant le ou les rues et numéros d'immeuble
area = area or 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.streetLine(item, country)
-- line 2: administrative divisions, postcodes
local cityline = p.cityLine(item, country)
if mw.text.trim(cityline) == '' then
cityline = nil
end
-- 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
return p