Module:Infobox/Fonctions/Bâtiment : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
(P3999 per talk page)
 
(50 révisions intermédiaires par 6 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 
local p = {}
 
local p = {}
local wikidatamod = require 'Module:Wikidata'
+
local localdata = require( 'Module:Infobox/Localdata' )
 +
local wd = require( 'Module:Interface Wikidata' ).fromLua
 
local general = require 'Module:Infobox/Fonctions'
 
local general = require 'Module:Infobox/Fonctions'
local coordfunctions = require 'Module:Infobox/Fonctions/Géolocalisation'
+
local linguistic = require "Module:Linguistique"
  
--Titre
+
local function daterow(args)
 +
local wikidataquery
 +
if args.event then
 +
wikidataquery = function() return wd.keyDate(args.event) end
 +
end
 +
 +
-- blocker définit des événements proches de celui recherché, s'il sont rensignés localement, on désactive la requête Wikidata pour éviter les doublons
 +
-- exemple : "ouverture" désactive la recher d'"inauguration" sur Wikidata
 +
if args.blocker and localdata[args.blocker] then
 +
wikidataquery = nil
 +
elseif args.blocker and type(args.blocker) == 'table' then
 +
for i, j in pairs(blocker) do
 +
if localdata[j] then
 +
wikidataquery = nil
 +
break
 +
end
 +
end
 +
end
 +
 
 +
return {
 +
type = 'row',
 +
label = args.label,
 +
value =  args.param,
 +
wikidata = wikidataquery
 +
}
 +
end
 +
 
 +
function p.creatorQuery(prop)
 +
return {
 +
property = prop,
 +
showqualifiers = {'P518'},
 +
showdate = true,
 +
qualiflink = '-',
 +
statementformat = function(statement)
 +
 +
local str
 +
-- On commence par les qualificatifs (attibué à, atelier etc.)
 +
local possiblequalifiers = {
 +
P1773 = "attribué $to $creator",
 +
P1774 = "atelier $of $creator",
 +
P1775 = "suiveur $of $creator",
 +
P1776 = "cercle $of $creator",
 +
P1777 = "d'après $creator", -- TODO : d'après LE Maître X
 +
P1778 = "faux d'après $creator",
 +
P1779 = "$creator (?)",
 +
P1780 = "école $of",
 +
P1877 = "d'après un œuvre $of",
 +
}
 +
 +
if statement.qualifiers then
 +
for qualif, text in pairs(possiblequalifiers) do
 +
local creator = wd.getFormattedQualifiers(statement, {qualif})
 +
if creator then
 +
str = text
 +
str = mw.ustring.gsub(str, '$to $creator', "à ".. creator)
 +
str = mw.ustring.gsub(str, '$of $creator', linguistic.of(creator))
 +
str = mw.ustring.gsub(str, '$creator', creator)
 +
break
 +
end
 +
end
 +
end
 +
 +
-- Sinon, la voie normale
 +
if not str then
 +
str = wd.formatStatement(statement, {speciallabels = {Q4233718 = "anonyme"}}) -- speciallabels pour éviter le lien par défaut
 +
end
 +
return str
 +
end
 +
}
 +
end
 +
 
 +
--Titrest
 
function p.title()
 
function p.title()
 
-- local class = en-tête par défaut à définir ici ?
 
-- local class = en-tête par défaut à définir ici ?
Ligne 18 : Ligne 90 :
 
end
 
end
  
function p.country(default)
+
function p.country()
return coordfunctions.country(default)
+
return general.country()
 
end
 
end
  
function p.address() return nil end -- pour éviter un bug de tansitions, si vous lisez cela vous pouvez effacer la fonctions
 
  
 
function p.historicalregion()
 
function p.historicalregion()
Ligne 28 : Ligne 99 :
 
type = 'row', -- pour les régions historiques, non adminstratives
 
type = 'row', -- pour les régions historiques, non adminstratives
 
value = 'région',
 
value = 'région',
label = function(localdata, item) return localdata['intitulé région'] or localdata['lien région'] or 'Région' end,
+
label = localdata['intitulé région'] or localdata['lien région'] or 'Région',
 
}
 
}
 
end
 
end
Ligne 34 : Ligne 105 :
 
function p.adminlocation() -- Fonction assez compliquée du fait des différences entre infobox. Simlifiable si on harmonise les infobox
 
function p.adminlocation() -- Fonction assez compliquée du fait des différences entre infobox. Simlifiable si on harmonise les infobox
 
-- infobox à prendre en compte : bâtiment, gratte-ciel, gare, château
 
-- infobox à prendre en compte : bâtiment, gratte-ciel, gare, château
return  
+
return {
{type = 'multi', rows = {
+
type = 'multi',  
 +
rows = {
 
{
 
{
 
type = 'row',  
 
type = 'row',  
value = function(localdata, item) return localdata['subdivision'] or localdata['subdivision1']end,
+
value = {'subdivision', 'subdivision1', 'subdivision nom'},
label = function(localdata, item) return
+
label = localdata['intitulé subdivision'] or localdata['lien subdivision1'] or localdata['lien subdivision'] or localdata['subdivision type'] or 'Division administrative'
localdata['intitulé subdivision'] or localdata['lien subdivision1'] or localdata['lien subdivision'] or 'Subdivision administrative'
 
end
 
 
},
 
},
 
{
 
{
 
type = 'row',  
 
type = 'row',  
 
value = 'subdivision2',
 
value = 'subdivision2',
label = function(localdata, item) return
+
label = localdata['intitulé subdivision2'] or localdata['lien subdivision2'] or 'Subdivision administrative'
localdata['intitulé subdivision2'] or localdata['lien subdivision2'] or 'Subdivision administrative'
 
end
 
 
},
 
},
 
{
 
{
 
type = 'row',  
 
type = 'row',  
 
value = 'subdivision3',
 
value = 'subdivision3',
label = function(localdata, item) return
+
label = localdata['intitulé subdivision3'] or localdata['lien subdivision3'] or 'Subdivision administrative'
localdata['intitulé subdivision3'] or localdata['lien subdivision3'] or 'Subdivision administrative'
 
end
 
 
},
 
},
 
{
 
{
 
type = 'row',  
 
type = 'row',  
value = function(localdata, item) return localdata['commune'] or localdata['ville'] end,
+
value = {'commune', 'ville'},
label = function(localdata, item) return
+
label = localdata['intitulé commune'] or localdata['lien commune'] or 'Commune'
localdata['intitulé commune'] or localdata['lien commune'] or 'Commune'
 
end
 
 
},
 
},
 
{
 
{
 
type = 'row',  
 
type = 'row',  
 
value = 'quartier',
 
value = 'quartier',
label = function(localdata, item) return localdata['intitulé quartier'] or localdata['titre quartier'] or 'Quartier' end
+
label = localdata['intitulé quartier'] or localdata['titre quartier'] or 'Quartier'
 +
},
 +
{
 +
type = 'row',
 +
value = 'adresse',
 +
label = 'Adresse',
 +
wikidata = require('Module:Adresse').wikidataAddress(localdata.item),
 
},
 
},
{
 
type = 'row',
 
value = 'adresse',
 
label = 'Adresse',
 
wikidata = function(item) return require('Module:Adresse').wikidataAddress(item) end,
 
 
}
 
}
} }
+
}
 +
end
 +
 
 +
function p.onshoreof()
 +
return {
 +
type = 'row',
 +
label = 'Baigné par',
 +
value = {'baigné par', 'sur les rives de'},
 +
property = 'P206',
 +
}
 +
end
 +
 
 +
function p.protectedarea()
 +
return {
 +
type = 'row',
 +
label = 'Aire protégée',
 +
plurallabel = 'Aire protégée',
 +
value = {'aire protégée', 'aires protégées'},
 +
property = 'P3018',
 +
}
 
end
 
end
  
function p.coordinates(coordspecs)
+
function p.elevation()
return coordfunctions.coordinates(coordspecs)
+
return {
 +
type = 'row',
 +
label = 'Altitude',
 +
value = 'altitude',
 +
wikidata = {property = 'P2044', targetunit = 'metre', conjtype = ' ou ', rounding = '0', numval = '2'},
 +
}
 +
end
 +
 
 +
function p.coordinates(args)
 +
return general.coordinates(args)
 
end
 
end
  
Ligne 86 : Ligne 179 :
 
end
 
end
  
 +
function p.construction()
 +
return {
 +
type = 'multi',
 +
rows = {
 +
-- début construction, fin construction (legacy infobox Stade, Infobox Château),
 +
daterow{param = 'début construction', label = 'Début de construction'},
 +
daterow{param = 'fin construction', label = 'Fin de construction'},
  
function p.construction() return
+
-- construction (nom de paramètre "date de construction" à déprécier)
{type = 'multi', rows = {
+
daterow{
-- début construction, fin construction (legacy infobox Stade, Infobox Château)
+
param = {'construction', 'Construction', 'date de construction'},  
{ type = 'row',
+
label = 'Construction',  
label = 'Début de construction',
+
event = {'Q385378', 'P571'}
value = 'début construction',
 
 
},
 
},
{ type = 'row',
+
}
label = 'Fin de construction',
+
}
value = 'fin construction',
+
 
 +
end
 +
 
 +
function p.opening()  --ouverture / consécration / date de mise en service (!= date de construction)
 +
return {
 +
type = 'multi',
 +
rows = {
 +
daterow{
 +
param =  {"ouverture", "date d'ouverture", "mise en service"},  
 +
label = 'Ouverture',  
 +
event = {'P1619', 'Q15051339'} -- P1619 = ouverture officielle, pas ouverture de facto
 
},
 
},
-- construction
+
daterow{param = 'inauguration', label = 'Inauguration', event = 'Q1417098', blocker = 'ouverture'}, -- désactivé si "ouverture" est renseigné : risques de doublon
{ type = 'row',
+
daterow{param = 'consécration', label = 'Consécration', event = 'Q125375', blocker = 'inauguration'},
label = 'Date de construction',
+
daterow{param =  'première lumière', label = '[[Première lumière]]', event = 'Q1306940'},  
value =  'date de construction' or 'construction',
+
}
wikidata = function(item) return
+
}
wikidatamod.getTheDate{entity = item, property = 'P793', targetvalue = 'Q385378', addcat = true}
+
end
or
+
 
wikidatamod.formatAndCat{entity = item, property = 'P571', showqualifiers = {'P518'}}
+
 
end
+
function p.renovation()
},
+
return {
--  ouverture
+
type = 'multi',
{ type = 'row',  
+
rows = {
label = 'Ouverture',
+
daterow{param = 'restauration', label = 'Restauration', event = 'Q217102', blocker = 'rénovation'},
value = 'ouverture',
+
daterow{param = 'rénovation', label = 'Rénovation', event = 'Q2144402', blocker = 'restauration'},
--wikidata  valeur de P793 ?
+
daterow{param = {'extension', 'agrandissement'}, label = 'Extension', event = 'Q18621193'},
},
+
daterow{param = 'autres travaux', label = 'Autres campagnes de travaux'},
-- inauguration
+
}
{ type = 'row',
+
}
label = 'Inauguration',
+
end
function(localdata, item) -- déactivé si le paramètre "ouverture" este renseigné : risques de doublon
+
 
if localdata['ouverture'] then
+
function p.demolition()
return nil
+
return {
end
+
type = 'multi',
if localdata['inauguration'] then
+
rows = {
return localdata['inauguration']
+
daterow{param = {'démolition', 'date de démolition'}, label = 'Démolition', event = 'Q331483'},
end
+
daterow{param = 'destruction', label = 'Destruction', event = 'Q17781833'},
if item then
+
}
return wikidatamod.getTheDate{entity = item, property = 'P793', targetvalue = 'Q1417098', addcat = true, item=item}
+
}
end
+
end
end
+
 
}
+
function p.closure()
} }
+
return daterow{
 +
param = {'fermeture', 'date de fermeture'},
 +
label = 'Fermeture',
 +
event = {'Q14954904', 'P3999', 'P576'} -- P576: date de dissolution, plutôt réservé aux organisations
 +
}
 
end
 
end
  
function p.closure() return
+
function p.usage()
{type = 'row', label = 'Fermeture', value = function(localdata, item)
+
return {
return wikidatamod.getTheDate{property = 'P793', targetvalue = 'Q14954904', addcat = true, item=item}
+
type = 'row',
end
+
label = 'Usage',
 +
value = 'usage',  
 +
wikidata = {
 +
property = 'P366',
 +
link = '-',
 +
speciallabels = {Q182060 = 'bureaux'}, -- bureaux semble toujours pouvoir se mettre au pluriel quand c'est en P366 d'un bâtiment
 +
}
 
}
 
}
 
end
 
end
  
 
function p.operator()
 
function p.operator()
return  
+
return {
{type = 'row', label = 'Gestionnaire', property = 'P137',
+
type = 'row',
value = function(localdata, item) return localdata['administration'] or localdata['gestionnaire'] end}
+
label = 'Gestionnaire',
 +
wikidata = {property = 'P137', showdate= true},
 +
value = {'administration', 'gestionnaire'}
 +
}
 
end
 
end
  
 
function p.transport()
 
function p.transport()
 
return {
 
return {
{type = 'table', title = 'Accès et transport', rows = {
+
type = 'multi',  
{type = 'row', label = 'Stationnement', value = 'stationnement'},
+
rows = {
{type = 'row', label = 'Gare', value = 'gare'},
+
{type = 'row', label = 'Stationnement', value = 'stationnement'},
{type = 'row', label = 'Métro', value = 'métro'},
+
{type = 'row', label = 'Gare', value = 'gare'},
{type = 'row', label = 'Tramway', value = 'bus'},
+
{type = 'row', label = 'Métro', value = 'métro'},
{type = 'row', label = 'Autobus', value = 'gare'},
+
{type = 'row', label = 'Tramway', value = {'tram', 'tramway'}},
},
+
{type = 'row', label = 'Autobus', value = 'bus'},
 +
},
 +
}
 +
end
 +
 
 +
function p.complex() -- le complexe immobilier auquel appartient un bâtiment
 +
return {
 +
type = 'row',
 +
label = 'Complexe',
 +
value = 'complexe',
 +
wikidata = {
 +
property = 'P361',
 +
condition = function(claim)
 +
local v = wd.getmainid(claim)
 +
return wd.isInstance("Q1497364", v, 1)
 +
end,
 
}
 
}
 
}
 
}
Ligne 162 : Ligne 299 :
 
type = 'row',
 
type = 'row',
 
label = 'Style',
 
label = 'Style',
value = function(localdata, item) return localdata['style architectural'] or localdata['style'] end,
+
value = {'style architectural', 'style'},
wikidata = function (item)
+
wikidata = function ()
local val = wikidatamod.formatAndCat{entity = item, property = 'P149'} or wikidatamod.formatAndCat{entity = item, property = 'P135'}
+
local val = wd.formatAndCat{entity = localdata.item, property = 'P149'}
 +
or wd.formatAndCat{entity = localdata.item, property = 'P135'}
 
if not val then
 
if not val then
 
return nil
 
return nil
 
end
 
end
val = mw.ustring.gsub(val, "\|architecture ", "\|")
 
 
val = mw.ustring.gsub(val, "\|style ", "\|")
 
val = mw.ustring.gsub(val, "\|style ", "\|")
 
return val
 
return val
end
+
end
 
}
 
}
 
end
 
end
  
 
function p.creator() -- toute sorte de créateurs, pourraient peut-être être partagé avec infobox oeuvre d'art
 
function p.creator() -- toute sorte de créateurs, pourraient peut-être être partagé avec infobox oeuvre d'art
return {type = 'multi', rows = {
+
return {
-- architect
+
type = 'multi',  
{ type = 'row',
+
rows = {
label = function(localdata, item) return localdata['titre architecte'] or 'Architecte' end,
+
-- architect
value = 'architecte',
+
{
wikidata = wikidatamod.formatAndCat{entity = item, property = 'P84', showqualifiers = {'P518'}, showdate = true}
+
type = "row",
 +
label = localdata["titre architecte"] or "Architecte",
 +
value = "architecte",
 +
wikidata = p.creatorQuery("P84"),
 +
},
 +
-- ingénieur
 +
{
 +
type = "row",
 +
label = "Ingénieur",
 +
value = "ingénieur",
 +
wikidata =  p.creatorQuery("P631"),
 +
},
 +
-- créateur (quand les autres noms ne conviennent pas)
 +
{ type = "row",
 +
label = "Créateur",
 +
value = "créateur",
 +
-- ne pas utiliser Wikidata si le paramètre "architecte" est renseigné (risques de doublon)
 +
wikidata = function()
 +
if (not localdata["architecte"]) then
 +
return wd.formatAndCat( p.creatorQuery("P170"))
 +
end
 +
end,
 +
},
 +
}
 +
}
 +
end
 +
 
 +
 
 +
function p.owner()
 +
return {
 +
type = 'multi',
 +
rows = {
 +
{
 +
type = 'row',
 +
label = 'Propriétaire initial',
 +
plurallabel = 'Propriétaires initiaux',
 +
value = 'propriétaire initial',
 +
},
 +
{
 +
type = 'row',
 +
label = 'Propriétaire actuel',
 +
plurallabel = 'Propriétaires actuels',
 +
value = 'propriétaire actuel',
 +
},
 +
{
 +
type = 'row',
 +
label = 'Propriétaire',
 +
plurallabel = 'Propriétaires',
 +
value = 'propriétaire',
 +
wikidata = require('Module:Propriétaire').formatFromItem(localdata.item)
 +
}
 +
}
 +
}
 +
end
 +
 
 +
function p.shape()
 +
return {
 +
type = 'row',
 +
label = 'Forme',
 +
value = {'forme', 'aspect'},
 +
property = 'P1419',
 +
}
 +
end
 +
 
 +
function p.dimensions()
 +
return {
 +
type = 'multi',
 +
rows = {
 +
{
 +
type = 'row',
 +
label = 'Longueur',
 +
value = 'longueur',
 +
wikidata = {property = 'P2043', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Largeur',
 +
value = 'largeur',
 +
wikidata = {property = 'P2049', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Diamètre',
 +
value = 'diamètre',
 +
wikidata = {property = 'P2386', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
 +
},
 +
{
 +
type = 'row',
 +
label = 'Périmètre',
 +
value = {'périmètre', 'contour', 'circonférence'},
 +
wikidata = {property = 'P2547', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
 
},
 
},
-- ingénieur
 
 
{
 
{
 
type = 'row',
 
type = 'row',
label = 'Ingénieur',
+
label = 'Hauteur',
value = 'ingénieur',
+
value = 'hauteur',
property = 'P631',
+
wikidata = {property = 'P2048', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
 
},
 
},
-- créateur (quand les autres noms ne conviennent pas)
+
{
{ type = 'row',
+
type = 'row',
label = 'Créateur',
+
label = 'Profondeur',
value = function(localdata, item)
+
value = 'profondeur',
if localdata['architecte'] then
+
wikidata = {property = 'P2610', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
return nil
+
},
end
+
{
if localdata['créateur'] then
+
type = 'row',
return localdata['créateur']
+
label = 'Superficie',
end
+
value = {'superficie', 'surface'},
if item then
+
wikidata = {property = 'P2046', targetunit = 'square metre', conjtype = ' ou ', rounding = '1', numval = '2'},
return wikidatamod.formatAndCat{entity = item, property = 'P170', showqualifiers = {'P518'}}
 
end
 
end
 
 
},
 
},
} }
+
{
 +
type = 'row',
 +
label = 'Volume',
 +
value = 'volume',
 +
wikidata = {property = 'P2234', targetunit = 'cubic metre', conjtype = ' ou ', rounding = '1', numval = '2'},
 +
}
 +
}
 +
}
 
end
 
end
  
 +
function p.floors()
 +
return {
 +
type = 'multi',
 +
rows = {
 +
{
 +
type = 'row',
 +
label = 'Étages',
 +
value = {'niveaux au-dessus du sol', 'étages'},
 +
property = 'P1101',
 +
},
 +
{
 +
type = 'row',
 +
label = 'Sous-sols',
 +
value = 'sous-sols',
 +
property = 'P1139',
 +
}
 +
}
 +
}
 +
end
  
function p.owner()
+
function p.destroyedby()
return {type = 'multi', rows = {
+
return {
{
+
type = 'row',
type = 'row',
+
label = 'Détruit par',
label = 'Propriétaire initial',
+
value = {'détruit par', 'cause de la destruction'},  
value = 'propriétaire initial',
+
property = 'P770',
},
+
}
{
 
type = 'row',
 
label = 'Propriétaire actuel',
 
value = 'propriétaire actuel',
 
},
 
{
 
type = 'row',
 
label = 'Propriétaire',
 
value = 'propriétaire',
 
wikidata = function(item) return require('Module:Propriétaire').formatFromItem(item) end
 
}
 
} }
 
 
end
 
end
  
Ligne 234 : Ligne 471 :
 
type = 'row',
 
type = 'row',
 
label = 'Matériau',
 
label = 'Matériau',
 +
plurallabel = 'Matériaux',
 
value = 'matériau',  
 
value = 'matériau',  
wikidata = function(item) return require('Module:Matériau').formatFromItem(item) end,
+
wikidata = require('Module:Matériau').formatFromItem(localdata.item),
 +
}
 +
end
 +
 
 +
function p.colour()
 +
return {
 +
type = 'row',
 +
label = 'Couleur',
 +
plurallabel = 'Couleurs',
 +
value = {'couleur', 'couleurs'},
 +
property = 'P462',
 
}
 
}
 
end
 
end
  
 +
function p.inscription()
 +
return {
 +
type = 'row',
 +
label = 'Inscription',
 +
value = {'inscription', 'enseigne'},
 +
wikidata = {property = 'P1684', numval = '1'},
 +
}
 +
end
 +
 +
function p.equipment()
 +
return {
 +
type = 'row',
 +
label = 'Équipement',
 +
plurallabel = 'Équipements',
 +
value = {'équipement', 'équipements'},
 +
property = 'P912',
 +
}
 +
end
  
 +
function p.replaces()
 +
return {
 +
type = 'row',
 +
label = 'Remplace',
 +
value = 'remplace',
 +
property = 'P1398',
 +
}
 +
end
  
 +
function p.replacedby()
 +
return {
 +
type = 'row',
 +
label = 'Remplacé par',
 +
value = 'remplacé par',
 +
property = 'P167',
 +
}
 +
end
  
function p.protection(localdata, item)
+
function p.protection()
 
return {
 
return {
 
type = 'row',
 
type = 'row',
 
label = 'Statut patrimonial',
 
label = 'Statut patrimonial',
value = 'classement',
+
value = {'classement', 'protection'},
wikidata = function(item) return require('Module:Classement').formattedList(item) end
+
wikidata = require('Module:Classement').formattedList(localdata.item)
 
}
 
}
 
end
 
end
  
 
function p.geoloc(params)
 
function p.geoloc(params)
return coordfunctions.geoloc(params)
+
return general.geoloc(params)
 
end
 
end
  
 
return p
 
return p

Version actuelle datée du 3 juin 2017 à 10:51

La documentation pour ce module peut être créée à Module:Infobox/Fonctions/Bâtiment/doc

local p = {}
local localdata = require( 'Module:Infobox/Localdata' )
local wd = require( 'Module:Interface Wikidata' ).fromLua
local general = require 'Module:Infobox/Fonctions'
local linguistic = require "Module:Linguistique"

local function daterow(args)
	local wikidataquery
	if args.event then
		wikidataquery = function() return wd.keyDate(args.event) end
	end
	
	-- blocker définit des événements proches de celui recherché, s'il sont rensignés localement, on désactive la requête Wikidata pour éviter les doublons 
	-- exemple : "ouverture" désactive la recher d'"inauguration" sur Wikidata
	if args.blocker and localdata[args.blocker] then
		wikidataquery = nil
	elseif args.blocker and type(args.blocker) == 'table' then
		for i, j in pairs(blocker) do 
			if localdata[j] then
				wikidataquery = nil
				break
			end
		end
	end

	return {
		type = 'row',
		label = args.label,
		value =  args.param,
		wikidata = wikidataquery
	}
end

function p.creatorQuery(prop) 
	return {
		property = prop,
		showqualifiers = {'P518'},
		showdate = true,
		qualiflink = '-',
		statementformat = function(statement)
			
			local str
			-- On commence par les qualificatifs (attibué à, atelier etc.)
			local possiblequalifiers = {
				P1773 = "attribué $to $creator", 
				P1774 = "atelier $of $creator",
				P1775 = "suiveur $of $creator",
				P1776 = "cercle $of $creator",
				P1777 = "d'après $creator", -- TODO : d'après LE Maître X
				P1778 = "faux d'après $creator",
				P1779 = "$creator (?)",
				P1780 = "école $of",
				P1877 = "d'après un œuvre $of",
			}
	
			if statement.qualifiers then
				for qualif, text in pairs(possiblequalifiers) do
					local creator = wd.getFormattedQualifiers(statement, {qualif})
					if creator then
						str = text
						str = mw.ustring.gsub(str, '$to $creator', "à ".. creator)
						str = mw.ustring.gsub(str, '$of $creator', linguistic.of(creator))
						str = mw.ustring.gsub(str, '$creator', creator)
						break
					end
				end
			end
						
			-- Sinon, la voie normale
			if not str then
				str = wd.formatStatement(statement, {speciallabels = {Q4233718 = "anonyme"}}) -- speciallabels pour éviter le lien par défaut
			end
			return str
		end
	}
end

--Titrest
function p.title()
	--	local class = en-tête par défaut à définir ici ?
	return general.title()
end

--Image
function p.mainimage(cat, defaultimage)
	if not cat then 
		cat = 'Article à illustrer Bâtiment divers'
	end
	return general.mainimage(cat, defaultimage)
end

function p.country()
	return	general.country()	
end


function p.historicalregion()
	return {
		type = 'row', -- pour les régions historiques, non adminstratives
		value = 'région',
		label = localdata['intitulé région'] or localdata['lien région'] or 'Région',
	}
end

function p.adminlocation() -- Fonction assez compliquée du fait des différences entre infobox. Simlifiable si on harmonise les infobox
	-- infobox à prendre en compte : bâtiment, gratte-ciel, gare, château
	return {
		type = 'multi', 
		rows = {
			{
				type = 'row', 
				value = {'subdivision', 'subdivision1', 'subdivision nom'},
				label = localdata['intitulé subdivision'] or localdata['lien subdivision1'] or localdata['lien subdivision'] or localdata['subdivision type'] or 'Division administrative'
			},
			{
				type = 'row', 
				value = 'subdivision2',
				label = localdata['intitulé subdivision2'] or localdata['lien subdivision2'] or 'Subdivision administrative'
			},
			{
				type = 'row', 
				value = 'subdivision3',
				label = localdata['intitulé subdivision3'] or localdata['lien subdivision3'] or 'Subdivision administrative'
			},
			{
				type = 'row', 
				value = {'commune', 'ville'},
				label = localdata['intitulé commune'] or localdata['lien commune'] or 'Commune'
			},
			{
				type = 'row', 
				value = 'quartier',
				label = localdata['intitulé quartier'] or localdata['titre quartier'] or 'Quartier'
			},
			{
				type = 'row',
				value = 'adresse',
				label = 'Adresse',
				wikidata = require('Module:Adresse').wikidataAddress(localdata.item),
			},
		}
	}
end

function p.onshoreof()
	return {
		type = 'row',
		label = 'Baigné par',
		value = {'baigné par', 'sur les rives de'},
		property = 'P206',
	}
end

function p.protectedarea()
	return {
		type = 'row',
		label = 'Aire protégée',
		plurallabel = 'Aire protégée',
		value = {'aire protégée', 'aires protégées'},
		property = 'P3018',
	}
end

function p.elevation()
	return {
		type = 'row',
		label = 'Altitude',
		value = 'altitude',
		wikidata = {property = 'P2044', targetunit = 'metre', conjtype = ' ou ', rounding = '0', numval = '2'},
	}
end

function p.coordinates(args)
	return general.coordinates(args)
end

function p.website() 
	return general.website()
end

function p.construction()
	return {
		type = 'multi', 
		rows = {
			-- début construction, fin construction (legacy infobox Stade, Infobox Château),
			daterow{param = 'début construction', label = 'Début de construction'},
			daterow{param = 'fin construction', label = 'Fin de construction'},

			-- construction (nom de paramètre "date de construction" à déprécier)
			daterow{
				param = {'construction', 'Construction', 'date de construction'}, 
				label = 'Construction', 
				event = {'Q385378', 'P571'}
			},
		}
	}

end

function p.opening()  --ouverture / consécration / date de mise en service (!= date de construction)
	return {
		type = 'multi', 
		rows = {
			daterow{
				param =  {"ouverture", "date d'ouverture", "mise en service"}, 
				label = 'Ouverture', 
				event = {'P1619', 'Q15051339'} -- P1619 = ouverture officielle, pas ouverture de facto
			},
			daterow{param = 'inauguration', label = 'Inauguration', event = 'Q1417098', blocker = 'ouverture'}, -- désactivé si "ouverture" est renseigné : risques de doublon 
			daterow{param = 'consécration', label = 'Consécration', event = 'Q125375', blocker = 'inauguration'},
			daterow{param =  'première lumière', label = '[[Première lumière]]', event = 'Q1306940'}, 
		}
	}
end


function p.renovation()
	return {
		type = 'multi', 
		rows = {
			daterow{param = 'restauration', label = 'Restauration', event = 'Q217102', blocker = 'rénovation'},
			daterow{param = 'rénovation', label = 'Rénovation', event = 'Q2144402', blocker = 'restauration'},
			daterow{param = {'extension', 'agrandissement'}, label = 'Extension', event = 'Q18621193'},
			daterow{param = 'autres travaux', label = 'Autres campagnes de travaux'},
		}
	}
end

function p.demolition()
	return {
		type = 'multi', 
		rows = {
			daterow{param = {'démolition', 'date de démolition'}, label = 'Démolition', event = 'Q331483'},
			daterow{param = 'destruction', label = 'Destruction', event = 'Q17781833'},
		}
	}
end

function p.closure()
	return daterow{
		param = {'fermeture', 'date de fermeture'},
		label = 'Fermeture',
		event = {'Q14954904', 'P3999', 'P576'} -- P576: date de dissolution, plutôt réservé aux organisations
	}
end

function p.usage()
	return {
		type = 'row',
		label = 'Usage',
		value = 'usage', 
		wikidata = {
			property = 'P366',
			link = '-',
			speciallabels = {Q182060 = 'bureaux'}, -- bureaux semble toujours pouvoir se mettre au pluriel quand c'est en P366 d'un bâtiment
		}	
	}
end

function p.operator()
	return {
		type = 'row',
		label = 'Gestionnaire',
		wikidata = {property = 'P137', showdate= true},
		value = {'administration', 'gestionnaire'}
	}
end

function p.transport()
	return {
		type = 'multi', 
		rows = {
			{type = 'row', label = 'Stationnement', value = 'stationnement'},
			{type = 'row', label = 'Gare', value = 'gare'},
			{type = 'row', label = 'Métro', value = 'métro'},
			{type = 'row', label = 'Tramway', value = {'tram', 'tramway'}},
			{type = 'row', label = 'Autobus', value = 'bus'},
		},
	}
end

function p.complex() -- le complexe immobilier auquel appartient un bâtiment
	return {
		type = 'row',
		label = 'Complexe',
		value = 'complexe',
		wikidata = {
			property = 'P361',
			condition = function(claim)
				local v = wd.getmainid(claim)
				return wd.isInstance("Q1497364", v, 1)
			end,
		}
	}
end

function p.archistyle()
	return {
		type = 'row',
		label = 'Style',
		value = {'style architectural', 'style'},
		wikidata = function ()
			local val = wd.formatAndCat{entity = localdata.item, property = 'P149'}
				or wd.formatAndCat{entity = localdata.item, property = 'P135'}
			if not val then
				return nil
			end
			val = mw.ustring.gsub(val, "\|style ", "\|")
			return val
		end
	}
end

function p.creator() -- toute sorte de créateurs, pourraient peut-être être partagé avec infobox oeuvre d'art
	return {
		type = 'multi', 
		rows = {
			-- architect
			{
				type = "row",
				label = localdata["titre architecte"] or "Architecte",
				value = "architecte",
				wikidata = p.creatorQuery("P84"),
			},
			-- ingénieur
			{
				type = "row",
				label = "Ingénieur",
				value = "ingénieur",
				wikidata =  p.creatorQuery("P631"),
			},
			-- créateur (quand les autres noms ne conviennent pas)
			{	type = "row",
				label = "Créateur",
				value = "créateur",
				-- ne pas utiliser Wikidata si le paramètre "architecte" est renseigné (risques de doublon)
				wikidata = function()
					if (not localdata["architecte"]) then
						return wd.formatAndCat( p.creatorQuery("P170"))
					end
				end,
			},
		}
	}
end


function p.owner()
	return {
		type = 'multi', 
		rows = {
			{
				type = 'row',
				label = 'Propriétaire initial',
				plurallabel = 'Propriétaires initiaux',
				value = 'propriétaire initial',
			},
			{
				type = 'row',
				label = 'Propriétaire actuel',
				plurallabel = 'Propriétaires actuels',
				value = 'propriétaire actuel',
			},
			{
				type = 'row',
				label = 'Propriétaire',
				plurallabel = 'Propriétaires',
				value = 'propriétaire',
				wikidata = require('Module:Propriétaire').formatFromItem(localdata.item)
			}
		}
	}
end

function p.shape()
	return {
		type = 'row',
		label = 'Forme',
		value = {'forme', 'aspect'},
		property = 'P1419',
	}
end

function p.dimensions()
	return {
	type = 'multi', 
		rows = {
	{
		type = 'row',
		label = 'Longueur',
		value = 'longueur',
		wikidata = {property = 'P2043', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Largeur',
		value = 'largeur',
		wikidata = {property = 'P2049', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Diamètre',
		value = 'diamètre',
		wikidata = {property = 'P2386', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Périmètre',
		value = {'périmètre', 'contour', 'circonférence'},
		wikidata = {property = 'P2547', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Hauteur',
		value = 'hauteur',
		wikidata = {property = 'P2048', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Profondeur',
		value = 'profondeur',
		wikidata = {property = 'P2610', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Superficie',
		value = {'superficie', 'surface'},
		wikidata = {property = 'P2046', targetunit = 'square metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Volume',
		value = 'volume',
		wikidata = {property = 'P2234', targetunit = 'cubic metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	}
	}
}
end

function p.floors()
	return {
	type = 'multi', 
		rows = {
	{
		type = 'row',
		label = 'Étages',
		value = {'niveaux au-dessus du sol', 'étages'},
		property = 'P1101',
	},
	{
		type = 'row',
		label = 'Sous-sols',
		value = 'sous-sols',
		property = 'P1139',
	}
	}
}
end

function p.destroyedby()
	return {
		type = 'row',
		label = 'Détruit par',
		value = {'détruit par', 'cause de la destruction'}, 
		property = 'P770',
	}
end

function p.material()
	return {
		type = 'row',
		label = 'Matériau',
		plurallabel = 'Matériaux',
		value = 'matériau', 
		wikidata = require('Module:Matériau').formatFromItem(localdata.item),
	}
end

function p.colour()
	return {
		type = 'row',
		label = 'Couleur',
		plurallabel = 'Couleurs',
		value = {'couleur', 'couleurs'},
		property = 'P462',
	}
end

function p.inscription()
	return {
		type = 'row',
		label = 'Inscription',
		value = {'inscription', 'enseigne'},
		wikidata = {property = 'P1684', numval = '1'},
	}
end

function p.equipment()
	return {
		type = 'row',
		label = 'Équipement',
		plurallabel = 'Équipements',
		value = {'équipement', 'équipements'},
		property = 'P912',
	}
end

function p.replaces()
	return {
		type = 'row',
		label = 'Remplace',
		value = 'remplace',
		property = 'P1398',
	}
end

function p.replacedby()
	return {
		type = 'row',
		label = 'Remplacé par',
		value = 'remplacé par',
		property = 'P167',
	}
end

function p.protection()
	return {
		type = 'row',
		label = 'Statut patrimonial',
		value = {'classement', 'protection'},
		wikidata = require('Module:Classement').formattedList(localdata.item)
	}
end

function p.geoloc(params)
	return general.geoloc(params)
end

return p