« Module:Adresse » : différence entre les versions
Apparence
Modèle:Infobox>Zolo Ajout d'option pour obtenir l'adresse complète à partir de Wikidata |
m 59 versions importées |
||
| (44 versions intermédiaires par 7 utilisateurs non affichées) | |||
| Ligne 2 : | Ligne 2 : | ||
local p = {} | local p = {} | ||
local wikidata = require "Module: | local wikidata = require "Module:Wikidata" | ||
local linguistic = require "Module:Linguistique" | local linguistic = require "Module:Linguistique" | ||
local countrymodule = require "Module:Country data" | local countrymodule = require "Module:Country data" | ||
local function getCountry(item) -- get country id for formatting | 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 | end | ||
| Ligne 54 : | Ligne 61 : | ||
function p.streetAddress(item, area) -- formate la ligne concernant la rue et le numéro de rue | 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 | local streets -- châine contenant le ou les rues et numéros d'immeuble | ||
area = | |||
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 | -- essaye de remplir street, en priorité avec P669, type : élément | ||
| Ligne 65 : | Ligne 80 : | ||
streets = wikidata.formatAndCat{value = streets, entity = item, property = 'P669'} | streets = wikidata.formatAndCat{value = streets, entity = item, property = 'P669'} | ||
end | end | ||
-- sinon : P969, type : string | |||
-- 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 | if not streets then | ||
streets = wikidata.formatAndCat{property = 'P969', entity = item} | streets = wikidata.formatAndCat{linkback = true, property = 'P969', entity = item} | ||
end | end | ||
return streets | return streets | ||
end | end | ||
| Ligne 74 : | Ligne 96 : | ||
function p.adminDivList(item, country) -- returns a list of admin divisions matching the criteria defined in Module:Adresse/Formats | function p.adminDivList(item, country) -- returns a list of admin divisions matching the criteria defined in Module:Adresse/Formats | ||
country = country or getCountry(item) | country = country or getCountry(item) | ||
local query = { | local query = {property = 'P131'} | ||
local divs = wikidata.transitiveVals(item, query, 0, 10, country) | local divs = wikidata.transitiveVals(item, query, 0, 10, country) | ||
local validDivs = {} | |||
-- solution 1: looks for divs of a certain type | -- solution 1: looks for divs of a certain type | ||
local function setValue(targetclasses, depth) | local function setValue(targetclasses, depth) | ||
local test = {} | local test = {} | ||
for _, d in pairs(divs) do | for _, d in pairs(divs) do | ||
for j, divtype in pairs(targetclasses) 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 | if wikidata.isInstance(divtype, d, 3) then | ||
-- restrain list to new value, will be expanded only if needed | -- restrain list to new value, will be expanded only if needed | ||
| Ligne 114 : | Ligne 145 : | ||
end | end | ||
displayformat = formats[country] or formats.default | local displayformat = formats[country] or formats.default | ||
local maxdepth = 3 | local maxdepth = 3 | ||
if not divs then | if not divs then | ||
return nil | return nil | ||
end | end | ||
if displayformat.div1 then | if displayformat.div1 then | ||
local val = setValue(displayformat.div1, maxdepth) | local val = setValue(displayformat.div1, maxdepth) | ||
| Ligne 155 : | Ligne 185 : | ||
end | end | ||
function p.cityLine(item, country, divlist) -- line with list of admin divisions + optional postcode | function p.cityLine(item, country, divlist, postcode) -- line with list of admin divisions + optional postcode | ||
country = country or getCountry(item) | country = country or getCountry(item) | ||
local postcode = wikidata.formatStatements{entity = item, property = 'P281'} or '' | 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 = '' | local divstr = '' | ||
divlist = divlist | if (not divlist) or (#divlist == 0) then | ||
if not divlist then-- add a maintenance category ? | divlist = p.adminDivList(item, country) | ||
end | |||
if (not divlist) or (#divlist == 0) then | |||
return -- add a maintenance category ? | |||
end | end | ||
for i, j in pairs(divlist) do | for i, j in pairs(divlist) do | ||
divlist[i] = wikidata.formatEntity(j) | if string.find(j, '^Q[0-9]+$') then | ||
divlist[i] = wikidata.formatEntity(j) | |||
end | |||
end | end | ||
local divstr = linguistic.conj(divlist, 'comma') | local divstr = linguistic.conj(divlist, 'comma') | ||
local | local formatting = formats[country] or formats.default | ||
local str = formatting.cityline or formats.default.cityline | |||
str = str:gsub("$postcode", postcode or '') | str = str:gsub("$postcode", postcode or '') | ||
str = str:gsub("$admindivs", divstr or '') | str = str:gsub("$admindivs", divstr or '') | ||
| Ligne 175 : | Ligne 214 : | ||
end | end | ||
function p.fullAddress(item, country, divs) | function p.fullAddress(item, country, divs, streetstr, divstr, showcountry, postcode) | ||
-- country id used for formatting | -- country id used for formatting | ||
country = country or getCountry(item) | country = country or getCountry(item) | ||
| Ligne 182 : | Ligne 220 : | ||
-- line 1 street | -- line 1 street | ||
local streetline = p.streetAddress(item, country) | local streetline = streetstr or p.streetAddress(item, country) | ||
-- line 2: administrative divisions, postcodes | -- line 2: administrative divisions, postcodes | ||
local cityline = p.cityLine(item, country, divs) | local cityline = divstr | ||
if not cityline then cityline = p.cityLine(item, country, divs, postcode) end | |||
if mw.text.trim(cityline) == '' then | if (not cityline) or mw.text.trim(cityline) == '' then | ||
cityline = nil | cityline = nil | ||
end | end | ||
-- line 3: country | -- line 3: country | ||
local countryline = countrymodule.standarddisplay(country) or wikidata.formatStatements{entity = | 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 | local hasstreetline | ||
if streetline then hasstreetline = true else hasstreetline = false end | |||
return str, hasstreetline | |||
end | end | ||
Dernière version du 22 février 2026 à 00:17
La documentation pour ce module peut être créée à Module:Adresse/doc
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 cityline = p.cityLine(item, country, divs, postcode) 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
local hasstreetline
if streetline then hasstreetline = true else hasstreetline = false end
return str, hasstreetline
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