« Module:Adresse » : différence entre les versions

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
Aucun résumé des modifications
0x010D (discussion | contributions)
fullAddress : suppression variable globale entity
 
(21 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
local formats = require "Module:Adresse/Formats"
local p = {}
local p = {}
local wikidata = require "Module:Interface Wikidata".fromLua
local linguistic = require "Module:Linguistique"
local countrymodule = require "Module:Country data"


local wikidata =require('Module:Wikidata')
local function getCountry(item) -- get country id for formatting
 
return wikidata.formatStatements{property = 'P17', entity = item, displayformat = 'raw', numvals = 1}
local afterstreetname = {} -- à remplir : les zones dans lesquelles le numéro de l'immeuble est affiché après le nom de la rue
 
local function formatStreet(streetname, housenumber, area) -- à faire
if afterstreetname[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
if (not streets or #streets == 0) and (not postcode) and (not city) then
return nil
end
 
local addresslines = {} -- lignes à mettre dans l'adresse : rue, codepostal + ville etc.
if streets then
table.insert(addresslines, mw.text.listToText(streets))
end
if postcode or formattingarea then
table.insert(addresslines, (postcode or '') .. ' ' .. (formattingarea or ''))
end
return table.concat(addresslines, '<br />')
end
end


Ligne 38 : Ligne 18 :
table.insert(vals, wikidata.formatSnak(j))
table.insert(vals, wikidata.formatSnak(j))
end
end
return table.concat(vals)
return table.concat(vals, '-')
end
end


local function streetFromClaims(claim) -- réupère le nom de la rue à partir d'une affirmation P669 Wikidata
local function directionFromClaim(claim, area) -- par exemple rue Sherbrooke Ouest
if not claim or not claim.mainsnak.snaktype == 'value' then
if not claim.qualifiers or not claim.qualifiers.P560 then
return nil
return nil
end
end
return wikidata.formatSnak(claim.mainsnak)
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
end


local function wikidatastreet(claim , area) --formate des données sur la rue à partir d'une affirmation Wikidata
local function streetFromClaims(claim) -- réupère le nom de la rue à partir d'une affirmation P669 Wikidata
local streetname = streetFromClaims(j)
return wikidata.formatStatement(claim)
local housenumber =  numberFromClaim(j)
return formatStreet(streetname, housenumber, area)
end
end


function p.wikidataAddress(item) -- fprùate l'intégralité d'une adresse à partir des données contenues dans une élément Wikidata
local function formatStreet(streetname, housenumber, direction, displayformat)
-- essaye la propriété P669 (données de type 'élément'
local val = displayformat.streetline or formats.default.streetline
-- TODO : récupérer la zone géographique pour le formatage
val = mw.ustring.gsub(val, '$number', housenumber or '')
local streetclaims = wikidata.getClaims{item=item, property = 'P669', item=item}
val = mw.ustring.gsub(val, '$street', streetname or '')
local streetstrings = {}
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
if streetclaims then
for i, j in pairs(streetclaims) do
for i, j in pairs(streetclaims) do
streetstrings[i] = wikidatastreet(i)
streetclaims[i] = wikidatastreet(j, area)
end
streets = mw.text.listToText(streetclaims)
streets = wikidata.formatAndCat{value = streets, entity = item, property = 'P669'}
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)
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
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
else
-- sinon,essaye p969: datatype: string
streetclaims =  wikidata.getClaims{property = 'P969', item=item}
if streetclaims then for i, j in pairs(streetclaims) do streetstrings[i] = wikidata.formatStatement(j) end end
end
end
-- code postal
local postcode = wikidata.getClaims{property= 'P281', item=item}
if displayformat.div3 then
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
local val = setValue(displayformat.div3, maxdepth)
postcode = nil
if val and val ~= validDivs[#validDivs] then
elseif postcode then
table.insert(validDivs, val)
postcode = wikidata.formatStatement(postcode[1])
end
elseif displayformat.div3vals then
local val = findInList(displayformat.div3vals, 0)
if val and val ~= validDivs[#validDivs] then
table.insert(validDivs, val)
end
end
end
-- faaut-il essayer d'ajouter la ville par P131 ? Souvent on en veut pas (par exemple en infobox)
local val = p.formatAddress(streetstrings, postcode)
return validDivs
if val then return
end
val .. '[[Category:Page utilisant une adresse fournie par Wikidata]]'
 
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
return -- 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 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)
 
-- 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 or p.cityLine(item, country, divs)
 
if (not cityline) or mw.text.trim(cityline) == '' then
cityline = nil
end
-- line 3: country
local countryline, success = countrymodule.standarddisplay(country)
if not success then
countryline = country or wikidata.formatStatements{entity = item, property = ''}
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
end
end
return p
return p

Dernière version du 16 septembre 2016 à 08:22

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.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.formatAndCat{value = streets, entity = item, property = 'P669'} 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) 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

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) -- 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 return -- 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 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)

-- 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 or p.cityLine(item, country, divs)

if (not cityline) or mw.text.trim(cityline) == then cityline = nil end

-- line 3: country local countryline, success = countrymodule.standarddisplay(country) if not success then countryline = country or wikidata.formatStatements{entity = item, property = } end

local str = linguistic.conj({streetline, cityline, countryline}, '
') if str and (not streetstr) and (not divstr) then -- à peu près str = str .. 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 .. end end return p