Aller au contenu

Module:Test

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 28 août 2015 à 13:58 et modifiée en dernier par Zolo (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

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

Voir : {{Test-module}}

local formats = {
Q16 = { -- Canada
	streetline = '$number $street $direction',
	directions = {Q659 = 'Nord', Q679 = 'Ouest', Q684 = 'Est', Q667 = 'Sud'},
},
Q30 = {--USA
	streetline = '$number $street $direction',
	cityline = '$admindivs $postcode',
	div1 = {},
	div2 = {}, -- county or county equivalent
	div2 = {'Q35657'}, --state
},
Q142 = { --France
	streetline = '$number $street',
	cityline = '$postcode $admindivs',
	div1 = {'Q702842', 'Q484170'}, -- arrondissement municipal ou commune
	div2 = {'Q6465'}, -- département
},
default = {
	streetline = '$number $street $direction',
	cityline = '$postcode $admindivs',
}
}

local p = {}
local wikidata = require "Module:Interface Wikidata".fromLua
local analysis = require "Module:Wikidata/Analyse transitive" -- à mettre dans interface wikidata
local linguistic = require "Module:Linguistique"
local countrymodule = require "Module:Country data"

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, formattingarea) -- 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)
	local housenumber =  numberFromClaim(claim)
	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

	-- 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.fullAddress(id, candidatesdivs, country)
	local divisions = analysis.transitiveVals(id, {property = 'P131'}, 3)
	local country = wikidata.formatStatements{property = 'P17', entity = id, displayformat = 'raw', numval = 1} -- quand il y a plusieurs pays, on prend le formatage du premier
	
	if not divisions then
		return "no id"
	end
	
	local function setValue(targetclasses, divisions)
		for i, division in pairs(divisions) do
			for j, divtype in pairs(targetclasses) do
				if analysis.isInstance(divtype, division, 3) then
					return wikidata.formatEntity(division)
				end
			end
		end
	end

	local displayformat = formats[country] or formats[default]
	local postcode = wikidata.formatStatements{entity = id, property = 'P281'}
	
	local div1, div2, div3
	if displayformat.div1 then
		div1 = setValue(displayformat.div1, divisions)
	end
	if displayformat.div2 then
		div2 = setValue(displayformat.div2, divisions)
	end	
	if displayformat.div3 then
		div3 = setValue(displayformat.div3, divisions)
	end
	
	-- first line: street
	local streetline = p.streetLine(id, displayformat)
	
	-- line2: administrative divisions, postcodes
	local cityline = displayformat.cityline or formats.default.cityline
	local divs = linguistic.conj({div1, div2, div3}, 'comma')
	cityline = cityline:gsub("$postcode", postcode or '')
	cityline = cityline:gsub("$admindivs", divs or '')
	if mw.text.trim(cityline) == '' then
		cityline = nil
	end
	-- last line: country
	local countryline = countrymodule.standarddisplay(country) or wikidata.formatStatements{entity = entity, property = 'P17'}
	return linguistic.conj({streetline, cityline, countryline}, '<br />')
end


local tableMaker = require "Module:Fabricant de tables"
local linguistic = require "Module:Linguistique"
local wikidata = require "Module:Interface Wikidata".fromLua
function p.test(frame)

	local ids = {
--		'Q4055', -- château de Blois (cas normal français)
--		'Q1503331', -- obélisque de la Concorde (Paris)
--		'Q9202', -- statue de la liberté
--		'Q35525', -- Maison blanche
--		'Q44440', -- Golden Gate Bridge
		'Q134883', -- Tour CN, Toronto
		'Q1151208', -- Hôtel de ville de Montréal
	}
	local results = tableMaker:new()
	results:addHeaders{'élément', 'résultat'}
	for i, id in pairs(ids) do
		local idstr = wikidata.formatEntity(id) .. linguistic.inparentheses('<small>[[:d:' .. id .. '|' .. id .. ']]</small>')
		local work, result = pcall(p.fullAddress, id)
		results:addRow{idstr, result}
	end
	return results:show()
end

return p