« Module:Infobox » : différence entre les versions
ajout d'un paramètre "plurallabel" pour adapter les libellés au nombre de valeurs Wikidata, correction du rétrolien lorsque le modèle et le module n'ont pas le même nom, possibilité de passer des fonctions comme block de l'infobox |
+ passage de marker et default_zoom |
||
| (49 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
local p = {} | local p = {} | ||
local lang = 'fr' | |||
local item = nil -- l'élément Wikidata lié | |||
item = nil -- l'élément Wikidata lié | local localdata = {}-- données concernant les paramètres passés au modèle | ||
local page = { -- données concernant la page où est affichée l'infobox | |||
localdata = {}-- données concernant les paramètres passés au modèle | |||
page = { -- données concernant la page où est affichée l'infobox | |||
name = mw.title.getCurrentTitle().prefixedText, | name = mw.title.getCurrentTitle().prefixedText, | ||
namespace = mw.title.getCurrentTitle().namespace | namespace = mw.title.getCurrentTitle().namespace | ||
} | } | ||
local maincolor, secondcolor, thirdcolor = '#E1E1E1', '#E1E1E1', '#000000' | |||
-- l'objet principal à retournerp | -- l'objet principal à retournerp | ||
local infobox = mw.html.create('div') | local infobox = mw.html.create('div') | ||
| Ligne 18 : | Ligne 16 : | ||
local externaltext = '' -- par exemple coordonnées en titre | local externaltext = '' -- par exemple coordonnées en titre | ||
-- modules importés | -- modules importés | ||
local wikidata = require('Module:Wikidata') | local wikidata = require('Module:Interface Wikidata').fromLua | ||
local | local valueexpl = wikidata.translate("activate-query") | ||
local mapmod = require | local linguistic = require "Module:Linguistique" | ||
local wd = require 'Module:Wikidata' | |||
local mapmod = require "Module:Carte" | |||
local i18n = { | local i18n = { | ||
| Ligne 33 : | Ligne 33 : | ||
local function addwikidatacat(prop) | local function addwikidatacat(prop) | ||
maintenance = maintenance .. | maintenance = maintenance .. wikidata.addtrackingcat(prop) | ||
end | end | ||
| Ligne 39 : | Ligne 39 : | ||
local value, number -- valeur à retourner, nombre de valeurs pour accorder le libellé | local value, number -- valeur à retourner, nombre de valeurs pour accorder le libellé | ||
if not query.entity then | if not query.entity then | ||
query.entity = item | query.entity = localdata.item | ||
end | end | ||
if not query.conjtype then | if not query.conjtype then | ||
| Ligne 46 : | Ligne 46 : | ||
local claims = wikidata.getClaims(query) | local claims = wikidata.getClaims(query) | ||
if (not claims) then | if (not claims) then | ||
return | return nil | ||
end | end | ||
return wikidata.formatAndCat(query), #claims -- pour l'accord au pluriel | |||
end | end | ||
local function getWikidataValue(params, wikidataparam) | local function getWikidataValue(params, wikidataparam) | ||
-- Récupère la valeur Wikidata pour la valeur, soit dans le paramètre "wikidata" soit dans le praramètre "property" | -- Récupère la valeur Wikidata pour la valeur, soit dans le paramètre "wikidata" soit dans le praramètre "property" | ||
if not item then | if not localdata.item then | ||
return nil | return nil | ||
end | end | ||
local | local v, valnum -- la valeur à retourner, et le nombre de de valeurs (pour l'accord grammatical) | ||
if not wikidataparam then -- par défaut la valeur wikidata est dans le paramètre "wikidata" mais dans les structures composées comme "title", il y a plusieurs paramètres wikidata | if not wikidataparam then -- par défaut la valeur wikidata est dans le paramètre "wikidata" mais dans les structures composées comme "title", il y a plusieurs paramètres wikidata | ||
| Ligne 69 : | Ligne 64 : | ||
if params[wikidataparam] then | if params[wikidataparam] then | ||
if type(params[wikidataparam]) == 'function' then | if type(params[wikidataparam]) == 'function' then | ||
v, valnum = params[wikidataparam](localdata.item) | |||
elseif type(params[wikidataparam]) == 'table' then | elseif type(params[wikidataparam]) == 'table' then | ||
v, valnum = expandquery(params[wikidataparam]) | |||
else | else | ||
v, valnum = params[wikidataparam] | |||
end | end | ||
end | end | ||
if not v then | |||
return nil | |||
end | |||
v = linguistic.ucfirst(v) | |||
return v, valnum | |||
end | end | ||
| Ligne 82 : | Ligne 82 : | ||
return localdata[val] | return localdata[val] | ||
elseif type(val) == 'function' then | elseif type(val) == 'function' then | ||
return val(localdata, item, params) | return val(localdata, localdata.item, params) | ||
elseif type(val) == 'table' then | elseif type(val) == 'table' then | ||
for i, j in pairs(val) do -- si plusieurs paramètres possibles (legacy de vieux code), prendre le preimeir non bide | for i, j in pairs(val) do -- si plusieurs paramètres possibles (legacy de vieux code), prendre le preimeir non bide | ||
| Ligne 99 : | Ligne 99 : | ||
maintenance = maintenance .. '[[Category:' .. cat .. '|' .. (sortkey or page.name) .. ']]' | maintenance = maintenance .. '[[Category:' .. cat .. '|' .. (sortkey or page.name) .. ']]' | ||
end | end | ||
end | |||
function p.separator(params) | |||
local style = params['separator style'] or {} | |||
style.height = style.height or '2px' | |||
style['background-color'] = style['background-color'] or maincolor | |||
return mw.html.create('hr'):css( style ) | |||
end | end | ||
| Ligne 115 : | Ligne 123 : | ||
-- overwrites with those provided in the module | -- overwrites with those provided in the module | ||
local style = {} | local style = {} | ||
style['background-color'] = maincolor | |||
style['color'] = thirdcolor | |||
if params.style then | if params.style then | ||
for i, j in pairs(params.style) do | for i, j in pairs(params.style) do | ||
| Ligne 133 : | Ligne 140 : | ||
function p.buildnavbox(params) | function p.buildnavbox(params) | ||
-- définition du style | |||
local class = "overflow nav " .. (params.class or '') | local class = "overflow nav " .. (params.class or '') | ||
local style = params.style or { | local style = params.style or {} | ||
if | |||
style['border- | if params.separated then -- options pour ajouter une ligne de séparation au dessus | ||
class = class .. ' bordered' | |||
style['border-top'] = '1px solid' .. maincolor | |||
end | end | ||
if | -- ajustement des paramètres de données | ||
params.previousval = params.previousval or params.previousparameter -- nom de paramètre obsolète | |||
params.nextval = params.nextval or params.nextparameter | |||
if params.previousproperty then | |||
params.previouswikidata = {property = params.previousproperty} | |||
end | end | ||
if params.nextproperty then | |||
params.nextwikidata = {property = params.nextproperty} | |||
end | end | ||
local navbox = | |||
mw.html.create(' | |||
local previousval = getvalue(params.previousval, params) or getWikidataValue(params, 'previouswikidata') | |||
local nextval = getvalue(params.nextval, params) or getWikidataValue(params, 'nextwikidata') | |||
local navbox | |||
if params.inner then -- pour celles qui sont à l'intérieur d'une table | |||
navbox = mw.html.create('tr'):tag('th'):attr('colspan', 2) | |||
style['font-weight'] = style['font-weight'] or 'normal' | |||
else | |||
navbox = mw.html.create('div') | |||
end | |||
navbox | |||
:addClass(class) | :addClass(class) | ||
:css(style) | :css(style) | ||
:tag(' | :tag('div') | ||
:addClass('prev_bloc') | :addClass('prev_bloc') | ||
:wikitext(previousval) | :wikitext(previousval) | ||
:done() | :done() | ||
:tag(' | :tag('div') | ||
:addClass('next_bloc') | :addClass('next_bloc') | ||
:wikitext(nextval) | :wikitext(nextval) | ||
:done() | :done() | ||
: | :allDone() | ||
return navbox | |||
end | end | ||
function p.buildimages(params) | function p.buildimages(params) | ||
local images = {} | local images = {} | ||
local upright, link, caption, alt, size -- size is deprecated | |||
if type(params.imageparameters) == 'string' then | if type(params.imageparameters) == 'string' then | ||
params.imageparameters = {params.imageparameters} | params.imageparameters = {params.imageparameters} | ||
| Ligne 173 : | Ligne 200 : | ||
table.insert(images, localdata[k]) | table.insert(images, localdata[k]) | ||
end | end | ||
if #images == 0 and item then | |||
-- Images de Wikidata | |||
if #images == 0 and localdata.item then | |||
if params.property then | if params.property then | ||
params.wikidata = {entity = localdata.item, property = params.property} | |||
end | end | ||
if params.wikidata then | if params.wikidata then | ||
images = params.wikidata() | local wdq = params.wikidata | ||
if type(wdq) == 'table' then | |||
wdq.entity = wdq.entity or localdata.item | |||
images = wikidata.getClaims(wdq) | |||
end | |||
if type(wdq) == 'function' then | |||
images = params.wikidata() | |||
if type(images) == 'string' then | |||
return images | |||
end --c'est probablement une erreur dans la requête => afficher le message | |||
end | |||
if (not images) then | |||
images = {} | |||
end | |||
if (#images > 0) and (params.wikidata.property) then | |||
addwikidatacat(params.wikidata.property) | |||
end | |||
-- Récupération des légendes de Wikidata (par P2096 seulement, à rendre optionnel et plus flexible) | |||
if type(images[1]) == 'table' then | |||
for i, j in pairs(images) do | |||
if j.mainsnak.snaktype ~= 'value' then | |||
return | |||
end | |||
local wdcaptions, wdcaption | |||
local q = images[i].qualifiers | |||
if q then | |||
wdcaptions = q['P2096'] | |||
end | |||
if wdcaptions then | |||
for k, l in pairs(wdcaptions) do | |||
if l.datavalue.value and l.datavalue.value.language == lang then | |||
wdcaption = wd.formatSnak(l) | |||
end | |||
end | |||
end | |||
if wdcaption and caption then -- si deux légendes, désactivées pour éviter les conflits | |||
caption = nil | |||
elseif wdcaption then | |||
caption = wdcaption | |||
end | |||
if i > (params.numval) then | |||
images[i] = nil | |||
else | |||
images[i] = j.mainsnak.datavalue.value | |||
end | |||
end | |||
end | |||
end | end | ||
end | end | ||
-- Images par défaut | |||
if #images == 0 then | if #images == 0 then | ||
if params.maintenancecat then | if params.maintenancecat then | ||
addmaintenancecat(params.maintenancecat, params.sortkey) | |||
end | end | ||
if params.defaultimages then | if params.defaultimages then | ||
| Ligne 197 : | Ligne 266 : | ||
if type(images) == 'string' then | if type(images) == 'string' then | ||
images = {images} | images = {images} | ||
end | |||
upright = params.defaultimageupright | |||
caption = params.defaultimagecaption | |||
link = params.defaultimagelink | |||
alt = params.defaultimagealt | |||
if not alt and ( images[1] == 'Defaut.svg' or images[1] == 'Defaut 2.svg' ) then | |||
alt = 'une illustration sous licence libre serait bienvenue' | |||
end | end | ||
end | end | ||
| Ligne 203 : | Ligne 279 : | ||
return nil | return nil | ||
end | end | ||
-- | |||
if | upright = upright or getvalue(params.uprightparameter) or params.defaultupright or "1.2" | ||
link = link or getvalue(params.linkparameter) or params.defaultlink | |||
caption = caption or getvalue(params.captionparameter) or params.defaultcaption | |||
alt = alt or getvalue( params.altparameter) or params.defaultalt | |||
-- taille avec "size" (obsolète) | |||
size = size or getvalue(params.sizeparameter) or params.defaultsize -- deprecated | |||
if size then | |||
local numsize = size:gsub('px', '') | |||
numsize = mw.ustring.gsub(numsize, 'x.*', '') | |||
numsize = tonumber(numsize) | |||
if type(numsize) ~= 'number' or numsize > 280 then | |||
addmaintenancecat("taille d'image invalide") | |||
end | |||
if tonumber(size) then | |||
size = size .. 'px' | |||
end | end | ||
size = '|' .. size | |||
else | |||
size = '' | |||
end | end | ||
local style = params.style or {padding ='2px 0',} | local style = params.style or {padding ='2px 0',} | ||
| Ligne 236 : | Ligne 311 : | ||
return | return | ||
end | end | ||
imagesString = imagesString .. '[[Fichier:' .. image .. '|frameless|' .. | imagesString = imagesString .. '[[Fichier:' .. image .. size .. '|frameless' | ||
if | if alt then | ||
imagesString = imagesString .. '| | imagesString = imagesString .. '|alt=' .. alt | ||
end | |||
if link then | |||
imagesString = imagesString .. '|link=' .. link | |||
end | end | ||
if | if upright then | ||
imagesString = imagesString .. '|upright=' . | imagesString = imagesString .. '|upright=' .. upright | ||
elseif #images > 1 then | |||
imagesString = imagesString .. '|upright=' .. ( 1 / #images ) | imagesString = imagesString .. '|upright=' .. ( 1 / #images ) | ||
end | end | ||
| Ligne 254 : | Ligne 332 : | ||
-- Partie légende | -- Partie légende | ||
local caption = mw.html.create('p') | local captionobj | ||
if caption then | |||
captionobj = mw.html.create('p') | |||
:wikitext( | :wikitext(caption) | ||
:css(params.style or {}) | :css(params.style or {}) | ||
:addClass("legend") | :addClass("legend") | ||
| Ligne 266 : | Ligne 344 : | ||
local separator | local separator | ||
if params.separator then | if params.separator then | ||
separator = separator(params) | |||
end | end | ||
return mw.html.create('div'):node(image):node( | return mw.html.create('div') | ||
:node(image) | |||
:node(captionobj) | |||
:node(separator) | |||
:done() | |||
end | end | ||
function p.buildtext(params) | function p.buildtext(params) | ||
local class = params.class or '' | local class = params.class or '' | ||
local style = | local style = { | ||
['text-align'] = 'center', | |||
['font-weight'] = 'bold' | |||
} | |||
if params.style then | if params.style then | ||
for i, j in pairs(params.style) do | for i, j in pairs(params.style) do | ||
| Ligne 303 : | Ligne 384 : | ||
local style = params.style or {} | local style = params.style or {} | ||
local value, number = getvalue(params.value, params) | local value, number = getvalue(params.value, params) | ||
if not value then | if (value == valueexpl) then | ||
value = nil | |||
params.wikidata.expl = false | |||
end | |||
if (not value) then | |||
value, number = getWikidataValue(params, 'wikidata') | value, number = getWikidataValue(params, 'wikidata') | ||
end | end | ||
if (not value) and (params.property) then | if (not value) and (params.property) then | ||
value, number = expandquery | value, number = expandquery{ property = params.property, ucfirst = params.ucfirst } | ||
end | end | ||
if not value then | if not value then | ||
| Ligne 314 : | Ligne 399 : | ||
if value == '-' then | if value == '-' then | ||
return nil | return nil | ||
end | |||
if not number then | |||
number = 0 -- == indéfini | |||
end | end | ||
| Ligne 325 : | Ligne 413 : | ||
local label = params.label | local label = params.label | ||
if number | if number > 1 and (params.plurallabel) then | ||
label = params.plurallabel | label = params.plurallabel | ||
elseif number == | elseif number == 1 and (params.singularlabel) then | ||
label = singularlabel | label = params.singularlabel | ||
end | end | ||
if type(label) == 'function' then | if type(label) == 'function' then | ||
label = label(localdata, item) | label = label(localdata, localdata.item) | ||
end | end | ||
| Ligne 366 : | Ligne 454 : | ||
end | end | ||
function p. | function p.buildsuccession(params) | ||
local | if not params.value then | ||
local | return nil | ||
if params. | end | ||
local | |||
--local style = params.style or {} | |||
--style['text-align'] = style['text-align'] or 'center' | |||
--style['color'] = style['color'] or '#000000' | |||
else | --style['background-color'] = style['background-color'] or '#F9F9F9' | ||
end | local rowI = mw.html.create('tr') | ||
local | |||
local colspan = '2' | |||
cellI = mw.html.create('td') | |||
:attr({colspan = colspan}) | |||
:attr({align = 'center'}) | |||
:attr({ | local styleT = {} | ||
:css( | styleT['background-color'] = 'transparent' | ||
:wikitext( | styleT['width'] = '100%' | ||
tabC = mw.html.create('table') | |||
:attr({cellspacing = '0'}) | |||
:css(styleT) | |||
local row = mw.html.create('tr') | |||
local color = params.color | |||
local style = {} | |||
local arrowLeft | |||
local arrowRight | |||
if color == 'default' then | |||
style['background-color'] = '#E6E6E6' | |||
arrowLeft = '[[Fichier:Fleche-defaut-gauche.png|13px|alt=Précédent|link=]]' | |||
arrowRight = '[[Fichier:Fleche-defaut-droite.png|13px|alt=Précédent|link=]]' | |||
else | |||
style['background-color'] = color | |||
arrowLeft = '[[Fichier:Fleche-defaut-gauche-gris-32.png|13px|alt=Suivant|link=]]' | |||
arrowRight = '[[Fichier:Fleche-defaut-droite-gris-32.png|13px|alt=Suivant|link=]]' | |||
end | |||
local styleTrans = {} | |||
styleTrans['background-color'] = '#F9F9F9' | |||
local values = params.value | |||
local before = values['before'] | |||
local center = values['center'] | |||
local after = values['after'] | |||
local widthCell = '44%' | |||
if center then | |||
widthCenter = '28%' | |||
widthCell = '29%' | |||
end | |||
local formattedbefore | |||
if before then | |||
formattedbefore = mw.html.create('td') | |||
:attr({valign = 'middle'}) | |||
:attr({align = 'left'}) | |||
:attr({width = '5%'}) | |||
:css(style) | |||
:wikitext(arrowLeft) | |||
:done() | |||
row:node(formattedbefore) | |||
formattedbefore = mw.html.create('td') | |||
:attr({width = '1%'}) | |||
:css(style) | |||
:wikitext('') | |||
:done() | |||
row:node(formattedbefore) | |||
formattedbefore = mw.html.create('td') | |||
:attr({align = 'left'}) | |||
:attr({valign = 'middle'}) | |||
:attr({width = widthCell}) | |||
:css(style) | |||
:wikitext(before) | |||
:done() | |||
row:node(formattedbefore) | |||
else | |||
formattedbefore = mw.html.create('td') | |||
:attr({valign = 'middle'}) | |||
:attr({align = 'left'}) | |||
:attr({width = '5%'}) | |||
:css(styleTrans) | |||
:wikitext('') | |||
:done() | |||
row:node(formattedbefore) | |||
formattedbefore = mw.html.create('td') | |||
:attr({width = '1%'}) | |||
:css(styleTrans) | |||
:wikitext('') | |||
:done() | |||
row:node(formattedbefore) | |||
formattedbefore = mw.html.create('td') | |||
:attr({align = 'left'}) | |||
:attr({valign = 'middle'}) | |||
:attr({width = widthCell}) | |||
:css(styleTrans) | |||
:wikitext('') | |||
:done() | |||
row:node(formattedbefore) | |||
end | |||
local formattedcenter | |||
formattedcenter = mw.html.create('td') | |||
:attr({width = '1%'}) | |||
:css(styleTrans) | |||
:wikitext('') | |||
:done() | |||
row:node(formattedcenter) | |||
if center then | |||
formattedcenter = mw.html.create('td') | |||
:attr({align = 'center'}) | |||
:attr({valign = 'middle'}) | |||
:attr({width = widthCenter}) | |||
:css(style) | |||
:wikitext(center) | |||
:done() | |||
row:node(formattedcenter) | |||
formattedcenter = mw.html.create('td') | |||
:attr({width = '1%'}) | |||
:css(styleTrans) | |||
:wikitext('') | |||
:done() | |||
row:node(formattedcenter) | |||
end | |||
local formattedafter | |||
if after then | |||
formattedafter = mw.html.create('td') | |||
:attr({align = 'right'}) | |||
:attr({valign = 'middle'}) | |||
:attr({width = widthCell}) | |||
:css(style) | |||
:wikitext(after) | |||
:done() | |||
row:node(formattedafter) | |||
formattedbefore = mw.html.create('td') | |||
:attr({width = '1%'}) | |||
:css(style) | |||
:wikitext('') | |||
:done() | |||
row:node(formattedbefore) | |||
formattedafter = mw.html.create('td') | |||
:attr({align = 'right'}) | |||
:attr({valign = 'middle'}) | |||
:attr({width = '5%'}) | |||
:css(style) | |||
:wikitext(arrowRight) | |||
:done() | |||
row:node(formattedafter) | |||
else | |||
formattedafter = mw.html.create('td') | |||
:attr({align = 'right'}) | |||
:attr({valign = 'middle'}) | |||
:attr({width = widthCell}) | |||
:css(styleTrans) | |||
:wikitext('') | |||
:done() | |||
row:node(formattedafter) | |||
formattedbefore = mw.html.create('td') | |||
:attr({width = '1%'}) | |||
:css(styleTrans) | |||
:wikitext('') | |||
:done() | |||
row:node(formattedbefore) | |||
formattedafter = mw.html.create('td') | |||
:attr({align = 'right'}) | |||
:attr({valign = 'middle'}) | |||
:attr({width = '5%'}) | |||
:css(styleTrans) | |||
:wikitext('') | |||
:done() | :done() | ||
row:node(formattedafter) | |||
end | |||
row:done() | |||
tabC:node(row) | |||
tabC:done() | |||
cellI:node(tabC) | |||
cellI:done() | |||
rowI:node(cellI) | |||
rowI:allDone() | |||
return rowI | |||
end | |||
function p.buildrow1col(params) | |||
if not params.value then | |||
return nil | |||
end | |||
--local style = params.style or {} | |||
--style['text-align'] = style['text-align'] or 'center' | |||
--style['color'] = style['color'] or '#000000' | |||
--style['background-color'] = style['background-color'] or '#F9F9F9' | |||
local class = params.class | |||
local rowcolor | |||
if params.color == 'secondcolor' then | |||
rowcolor = secondcolor | |||
else | |||
rowcolor = params.color | |||
end | end | ||
for k, l in pairs(params.rows) do | local style = {} | ||
style['padding'] = '4px' | |||
style['text-align'] = 'center' | |||
style['background-color'] = rowcolor or '#F9F9F9' | |||
style['color'] = '#000000' | |||
local text = params.value | |||
local colspan ='2' | |||
local formattedlabel | |||
formattedlabel = mw.html.create('th') | |||
:attr({colspan = colspan}) | |||
:css(style) | |||
:wikitext(text) | |||
:done() | |||
local row = mw.html.create('tr') | |||
:addClass(class) | |||
:css(style) | |||
:node(formattedlabel) | |||
:done() | |||
return row | |||
end | |||
function p.buildtable(params) | |||
local tab = mw.html.create('table'):css(params.style or {}) | |||
-- CREATE ROWS | |||
local rows = {} | |||
for k, l in pairs(params.rows) do | |||
if type(l) == 'table' and l.type == 'multi' then -- when a single function is used for return several rows | if type(l) == 'table' and l.type == 'multi' then -- when a single function is used for return several rows | ||
table.remove(params.rows, k) | table.remove(params.rows, k) | ||
| Ligne 402 : | Ligne 705 : | ||
if type(l) == 'function' then --accepte les fonctions qui retournent des tables | if type(l) == 'function' then --accepte les fonctions qui retournent des tables | ||
l = l(localdata, item) | l = l(localdata, localdata.item) | ||
end | end | ||
if type(l) == 'nil' then | if type(l) == 'nil' then | ||
| Ligne 413 : | Ligne 716 : | ||
end | end | ||
end | end | ||
if #rows | if #rows == 0 then | ||
if title then | return nil | ||
end | |||
-- ADD TITLE | |||
local title | |||
if params.title or params.singulartitle or params.pluraltitle then | |||
local text | |||
if #rows > 1 and params.pluraltitle then | |||
text = params.pluraltitle | |||
elseif #rows == 1 and params.singulartitle then | |||
text = params.singulartitle | |||
else | |||
text = params.title | |||
end | end | ||
for i, j in pairs (rows) do | |||
local style = params.titlestyle or {} | |||
style['text-align'] = style['text-align'] or 'center' | |||
style['color'] = style['color'] or thirdcolor | |||
style['background-color'] = style['background-color'] or maincolor | |||
local colspan ='2' | |||
title = mw.html.create('caption') | |||
:attr({colspan = colspan}) | |||
:css(style) | |||
:wikitext(text) | |||
:done() | |||
end | |||
if title then | |||
tab:node(title) | |||
end | |||
for i, j in pairs (rows) do | |||
tab:node(j) | |||
end | |||
if params.separator then | |||
local separator = p.separator(params) | |||
tab:node(separator) | |||
end | end | ||
tab:allDone() | |||
return tab | |||
end | end | ||
| Ligne 438 : | Ligne 772 : | ||
end | end | ||
function p.buildmap(params) | function p.buildmap(params)-- TODO : gestion de plusieurs points | ||
-- paramètre d'affichage | |||
local maplist = getvalue(params.maps) | local maplist = getvalue(params.maps) | ||
local | local pointtype = params.pointtype | ||
local maptype = params.maptype -- choisit le type de carte le plus approprié (relief, administratif, etc.) | local maptype = params.maptype -- choisit le type de carte le plus approprié (relief, administratif, etc.) | ||
if type(maplist) == 'function' then | if type(maplist) == 'function' then | ||
maplist = maplist(localdata, item) | maplist = maplist(localdata, localdata.item) | ||
end | end | ||
local width = tonumber(params.width) or 280 | local width = tonumber(params.width) or 280 | ||
| Ligne 450 : | Ligne 786 : | ||
return 'image trop grande, la largeur doit être inférieure ou égale à 280px' | return 'image trop grande, la largeur doit être inférieure ou égale à 280px' | ||
end | end | ||
local latitude, longitude | |||
-- récupération des données locales | |||
local latitude, longitude, globe = params.latitude, params.longitude, params.globe | |||
if type(params.latitude) == 'function' then | if type(params.latitude) == 'function' then | ||
latitude, longitude = params.latitude(localdata, item), params.longitude(localdata, item) | latitude, longitude = params.latitude(localdata, localdata.item), params.longitude(localdata, localdata.item) | ||
else | else | ||
latitude, longitude = localdata[params.latitude], localdata[params.longitude] | latitude, longitude = localdata[params.latitude], localdata[params.longitude] | ||
end | end | ||
if (not latitude or not longitude) | |||
if | -- récupération des données wikidata | ||
if (not latitude or not longitude) and params.wikidata then | |||
local query = params.wikidata | |||
if type(query) == 'function' then | |||
query = query() | |||
end | end | ||
if not query then | |||
if not | |||
return nil | return nil | ||
end | end | ||
query.excludespecial = true | |||
query.entity = query.entity or localdata.item | |||
local claims = wikidata.getClaims(query) | |||
if not claims then | |||
if | return nil | ||
end | end | ||
local val = wd.formatSnak( claims[1].mainsnak ) | |||
latitude, longitude, globe = val.latitude, val.longitude, val.globe | |||
end | end | ||
if not latitude or not longitude then | if not latitude or not longitude then | ||
return nil | return nil | ||
end | end | ||
local newparams = {maplist = maplist, | local newparams = {maplist = maplist, pointtype = pointtype, maptype = maptype, width = width, item = localdata.item, latitude = latitude, longitude = longitude, globe = globe, marker=params.marker, default_zoom=params.default_zoom} | ||
if params.params and type(params.params) == 'table' then -- paramètres additionnels | if params.params and type(params.params) == 'table' then -- paramètres additionnels | ||
for i, j in pairs(params.params) do | for i, j in pairs(params.params) do | ||
| Ligne 482 : | Ligne 824 : | ||
end | end | ||
return mapmod.multimap(newparams) | return mapmod.multimap(newparams) | ||
end | |||
function p.buildexternaltext(params) | |||
local value = getvalue(params.value) | |||
if value and (type(value) == 'string') then | |||
externaltext = externaltext .. value | |||
end | |||
end | end | ||
| Ligne 489 : | Ligne 838 : | ||
end | end | ||
local class = 'navbar noprint ' .. (params.class or '') | local class = 'navbar noprint bordered ' .. (params.class or '') | ||
local style = params.style or {} | local style = params.style or {} | ||
style['border-top'] = style['border-top'] or '1px solid ' .. maincolor | style['border-top'] = style['border-top'] or '1px solid ' .. maincolor | ||
local backlinkstr = '[' .. tostring( mw.uri.fullUrl( page.name, ' | local backlinkstr = '[' .. tostring( mw.uri.fullUrl( page.name, 'veaction=edit§ion=0' ) ) .. ' ' .. i18n['edit'] .. ']' | ||
.. ' - [' .. tostring( mw.uri.fullUrl( page.name, ' | .. ' - [' .. tostring( mw.uri.fullUrl( page.name, 'action=edit§ion=0' ) ) .. ' ' .. i18n['edit code'] .. ']' | ||
local itemlinkstr | local itemlinkstr | ||
if item then | if localdata.item then | ||
itemlinkstr = '[[d:' .. item.id .. '|' .. i18n['edit item'] .. ']]' | itemlinkstr = '[[d:' .. localdata.item.id .. '|' .. i18n['edit item'] .. ']]' | ||
end | end | ||
local editstr = backlinkstr | local editstr = backlinkstr | ||
| Ligne 509 : | Ligne 858 : | ||
:wikitext(editstr) | :wikitext(editstr) | ||
:done() | :done() | ||
local doclinkstr = '[[Image: | local doclinkstr = '[[Image:Info Simple.svg|12px|link=' .. localdata.templatename .. '|' .. i18n['see doc'] .. ']]' | ||
-- si ce lien ne marche pas toujours, il faut ajouter un variable pour le nom de l'infobox récupéré par le frame | -- si ce lien ne marche pas toujours, il faut ajouter un variable pour le nom de l'infobox récupéré par le frame | ||
local doclinkspan = mw.html.create('span') | local doclinkspan = mw.html.create('span') | ||
| Ligne 526 : | Ligne 875 : | ||
function p.buildblock(block) | function p.buildblock(block) | ||
if type(block) == 'function' then | if type(block) == 'function' then | ||
block = block() | block = block( localdata ) | ||
end | end | ||
| Ligne 539 : | Ligne 888 : | ||
['table'] = p.buildtable, | ['table'] = p.buildtable, | ||
['row'] = p.buildrow, | ['row'] = p.buildrow, | ||
['row1col'] = p.buildrow1col, | |||
['succession'] = p.buildnavbox, | |||
['text'] = p.buildtext, | ['text'] = p.buildtext, | ||
['title'] = p.buildtitle, | ['title'] = p.buildtitle, | ||
| Ligne 548 : | Ligne 899 : | ||
end | end | ||
function p. | function p.build() | ||
localdata = require( 'Module:Infobox/Localdata' ) | |||
item = localdata.item | |||
-- | -- assign rank to the infobox, "secondary" means special formatting like no displaytitle for coordinates | ||
local infoboxrank = 'main' -- main infobox of the page, with coordinates displayed in title etc. | local infoboxrank = 'main' -- main infobox of the page, with coordinates displayed in title etc. | ||
if page.namespace ~= 0 then | if page.namespace ~= 0 then | ||
infoboxrank = 'secondary' | infoboxrank = 'secondary' | ||
end | |||
-- if infobox is linked to another item: rank = secondary | |||
if localdata.item then | |||
local itemlink = mw.wikibase.sitelink(localdata.item.id) | |||
local pagetitle = mw.title.getCurrentTitle().text | |||
if (itemlink or '') ~= pagetitle then | |||
infoboxrank = 'secondary' | |||
end | |||
end | end | ||
localdata.infoboxrank = infoboxrank | localdata.infoboxrank = infoboxrank | ||
-- load infobox module page | -- load infobox module page | ||
moduledata = require('Module:Infobox/' .. modulename) | local moduledata = require('Module:Infobox/' .. localdata.modulename) | ||
moduledata.name = modulename | moduledata.name = localdata.modulename | ||
-- defines main color | -- defines main color | ||
maincolor = localdata['couleur infobox'] or localdata['couleur boîte'] or moduledata.maincolor or maincolor | maincolor = localdata['couleur infobox'] or localdata['couleur boîte'] or moduledata.maincolor or maincolor | ||
secondcolor = moduledata.secondcolor or secondcolor | |||
thirdcolor = moduledata.thirdcolor or thirdcolor | |||
if maincolor:match( '^%x%x%x%x%x%x$' ) or maincolor:match( '^%x%x%x$' ) then | if maincolor:match( '^%x%x%x%x%x%x$' ) or maincolor:match( '^%x%x%x$' ) then | ||
maincolor = '#' .. maincolor | maincolor = '#' .. maincolor | ||
| Ligne 591 : | Ligne 938 : | ||
-- style | -- style | ||
local style = moduledata.style or {} | local style = moduledata.style or {} | ||
if not style['max- | if not style['max-width'] then | ||
style['max-width'] = '300px' | style['max-width'] = '300px' | ||
end | end | ||
| Ligne 603 : | Ligne 950 : | ||
infobox :node(p.buildfooter(moduledata.footer)) | infobox :node(p.buildfooter(moduledata.footer)) | ||
:done() | :done() | ||
return tostring(infobox) .. externaltext, maintenance | return tostring(infobox) .. externaltext, maintenance | ||
end | end | ||
return p | return p | ||
Dernière version du 20 mai 2017 à 09:18
local p = {} local lang = 'fr'
local item = nil -- l'élément Wikidata lié local localdata = {}-- données concernant les paramètres passés au modèle local page = { -- données concernant la page où est affichée l'infobox name = mw.title.getCurrentTitle().prefixedText, namespace = mw.title.getCurrentTitle().namespace } local maincolor, secondcolor, thirdcolor = '#E1E1E1', '#E1E1E1', '#000000' -- l'objet principal à retournerp local infobox = mw.html.create('div')
-- objes secondaires à retourner local maintenance = -- chaîne retournfoée avec le module : cats de maintenance local externaltext = -- par exemple coordonnées en titre -- modules importés local wikidata = require('Module:Interface Wikidata').fromLua local valueexpl = wikidata.translate("activate-query") local linguistic = require "Module:Linguistique" local wd = require 'Module:Wikidata' local mapmod = require "Module:Carte"
local i18n = { ['see doc'] = 'Documentation du modèle', ['edit'] = 'modifier', ['edit code'] = 'modifier le code', ['edit item'] = 'modifier Wikidata', ['tracking cat'] = "Page utilisant des données de Wikidata", ['invalid block type'] = "Bloc de données invalide dans le module d'infobox", ['default cat'] = "Maintenance des infobox", }
local function addwikidatacat(prop) maintenance = maintenance .. wikidata.addtrackingcat(prop) end
local function expandquery(query) local value, number -- valeur à retourner, nombre de valeurs pour accorder le libellé if not query.entity then query.entity = localdata.item end if not query.conjtype then query.conjtype = 'comma' end local claims = wikidata.getClaims(query) if (not claims) then return nil end return wikidata.formatAndCat(query), #claims -- pour l'accord au pluriel end
local function getWikidataValue(params, wikidataparam) -- Récupère la valeur Wikidata pour la valeur, soit dans le paramètre "wikidata" soit dans le praramètre "property" if not localdata.item then return nil end local v, valnum -- la valeur à retourner, et le nombre de de valeurs (pour l'accord grammatical)
if not wikidataparam then -- par défaut la valeur wikidata est dans le paramètre "wikidata" mais dans les structures composées comme "title", il y a plusieurs paramètres wikidata wikidataparam = 'wikidata' end
if params[wikidataparam] then if type(params[wikidataparam]) == 'function' then v, valnum = params[wikidataparam](localdata.item) elseif type(params[wikidataparam]) == 'table' then v, valnum = expandquery(params[wikidataparam]) else v, valnum = params[wikidataparam] end end if not v then return nil end v = linguistic.ucfirst(v) return v, valnum end
local function getvalue(val, params) if type(val) == 'string' then return localdata[val] elseif type(val) == 'function' then return val(localdata, localdata.item, params) elseif type(val) == 'table' then for i, j in pairs(val) do -- si plusieurs paramètres possibles (legacy de vieux code), prendre le preimeir non bide if localdata[j] then return localdata[j] end end end end
local function addmaintenancecat(cat, sortkey) if page.namespace ~= 0 then return end if cat then maintenance = maintenance .. end end
function p.separator(params) local style = params['separator style'] or {} style.height = style.height or '2px' style['background-color'] = style['background-color'] or maincolor
return mw.html.create('hr'):css( style ) end
function p.buildtitle(params)
local text = getvalue(params.value, params) or params.textdefaultvalue or getWikidataValue(params) or mw.title.getCurrentTitle().text
local subtext = getvalue(params.subtitle) or getWikidataValue(params, 'wikidatasubtitle') or params.subtitledefaultvalue
if subtext and (subtext ~= text) then
text = text .. '
' .. subtext .. ''
end
local icon = params.icon or
if icon ~= and not params.large then
icon = 'icon ' .. icon
end
local class = 'entete ' .. icon
-- overwrites with those provided in the module local style = {} style['background-color'] = maincolor style['color'] = thirdcolor if params.style then for i, j in pairs(params.style) do style[i] = j end end local title = mw.html.create('div') :addClass(class) :css(style) :tag('div') :wikitext(text) :allDone() return title end
function p.buildnavbox(params)
-- définition du style local class = "overflow nav " .. (params.class or ) local style = params.style or {}
if params.separated then -- options pour ajouter une ligne de séparation au dessus class = class .. ' bordered' style['border-top'] = '1px solid' .. maincolor end
-- ajustement des paramètres de données params.previousval = params.previousval or params.previousparameter -- nom de paramètre obsolète params.nextval = params.nextval or params.nextparameter
if params.previousproperty then params.previouswikidata = {property = params.previousproperty} end if params.nextproperty then params.nextwikidata = {property = params.nextproperty} end
local previousval = getvalue(params.previousval, params) or getWikidataValue(params, 'previouswikidata')
local nextval = getvalue(params.nextval, params) or getWikidataValue(params, 'nextwikidata')
local navbox if params.inner then -- pour celles qui sont à l'intérieur d'une table navbox = mw.html.create('tr'):tag('th'):attr('colspan', 2) style['font-weight'] = style['font-weight'] or 'normal' else navbox = mw.html.create('div') end
navbox :addClass(class) :css(style) :tag('div') :addClass('prev_bloc') :wikitext(previousval) :done() :tag('div') :addClass('next_bloc') :wikitext(nextval) :done() :allDone() return navbox end
function p.buildimages(params) local images = {} local upright, link, caption, alt, size -- size is deprecated if type(params.imageparameters) == 'string' then params.imageparameters = {params.imageparameters} end if not params.imageparameters then -- s'il n'y a pa de paramètre image, continuer, peut-être y-a-t-il une image par défaut définie dans le module d'infobox params.imageparameters = {} end for j, k in ipairs(params.imageparameters) do table.insert(images, localdata[k]) end
-- Images de Wikidata if #images == 0 and localdata.item then if params.property then params.wikidata = {entity = localdata.item, property = params.property} end if params.wikidata then local wdq = params.wikidata if type(wdq) == 'table' then wdq.entity = wdq.entity or localdata.item images = wikidata.getClaims(wdq) end if type(wdq) == 'function' then images = params.wikidata() if type(images) == 'string' then return images end --c'est probablement une erreur dans la requête => afficher le message end if (not images) then images = {} end if (#images > 0) and (params.wikidata.property) then addwikidatacat(params.wikidata.property) end -- Récupération des légendes de Wikidata (par P2096 seulement, à rendre optionnel et plus flexible) if type(images[1]) == 'table' then for i, j in pairs(images) do if j.mainsnak.snaktype ~= 'value' then return end local wdcaptions, wdcaption local q = images[i].qualifiers if q then wdcaptions = q['P2096'] end if wdcaptions then for k, l in pairs(wdcaptions) do if l.datavalue.value and l.datavalue.value.language == lang then wdcaption = wd.formatSnak(l) end end end if wdcaption and caption then -- si deux légendes, désactivées pour éviter les conflits caption = nil elseif wdcaption then caption = wdcaption end if i > (params.numval) then images[i] = nil else images[i] = j.mainsnak.datavalue.value end end end end end
-- Images par défaut if #images == 0 then if params.maintenancecat then addmaintenancecat(params.maintenancecat, params.sortkey) end if params.defaultimages then images = params.defaultimages if type(images) == 'string' then images = {images} end upright = params.defaultimageupright caption = params.defaultimagecaption link = params.defaultimagelink alt = params.defaultimagealt if not alt and ( images[1] == 'Defaut.svg' or images[1] == 'Defaut 2.svg' ) then alt = 'une illustration sous licence libre serait bienvenue' end end end if #images == 0 then return nil end
upright = upright or getvalue(params.uprightparameter) or params.defaultupright or "1.2" link = link or getvalue(params.linkparameter) or params.defaultlink caption = caption or getvalue(params.captionparameter) or params.defaultcaption alt = alt or getvalue( params.altparameter) or params.defaultalt
-- taille avec "size" (obsolète) size = size or getvalue(params.sizeparameter) or params.defaultsize -- deprecated if size then local numsize = size:gsub('px', ) numsize = mw.ustring.gsub(numsize, 'x.*', ) numsize = tonumber(numsize) if type(numsize) ~= 'number' or numsize > 280 then addmaintenancecat("taille d'image invalide") end if tonumber(size) then size = size .. 'px' end size = '|' .. size else size = end
local style = params.style or {padding ='2px 0',}
-- Partie image
local imagesString = for i,image in pairs(images) do if image == '-' then return end imagesString = imagesString .. 'upright=' .. ( 1 / #images ) end imagesString = imagesString .. '' end
local image = mw.html.create('div') :addClass("images") :css(style) :wikitext(imagesString)
-- Partie légende local captionobj if caption then captionobj = mw.html.create('p') :wikitext(caption) :css(params.style or {}) :addClass("legend") :done() end
-- séparateur local separator if params.separator then separator = separator(params) end return mw.html.create('div') :node(image) :node(captionobj) :node(separator) :done() end
function p.buildtext(params) local class = params.class or local style = { ['text-align'] = 'center', ['font-weight'] = 'bold' } if params.style then for i, j in pairs(params.style) do style[i] = j end end local text = getvalue(params.value, params) or getWikidataValue(params) or params.defaultvalue if text == '-' then return end if not text then addmaintenancecat(params.maintenancecat, params.sortkey) return nil end local formattedtext = mw.html.create('p') :addClass(class) :css(style) :wikitext(text) :done() return formattedtext end
function p.buildrow(params) local class = params.class or local style = params.style or {} local value, number = getvalue(params.value, params) if (value == valueexpl) then value = nil params.wikidata.expl = false end if (not value) then value, number = getWikidataValue(params, 'wikidata') end if (not value) and (params.property) then value, number = expandquery{ property = params.property, ucfirst = params.ucfirst } end if not value then value = params.defaultvalue end if value == '-' then return nil end if not number then number = 0 -- == indéfini end
if not value then if params.maintenancecat then local maintenancecat = getvalue(params.maintenancecat, params) addmaintenancecat(maintenancecat, params.sortkey) end return nil end
local label = params.label if number > 1 and (params.plurallabel) then label = params.plurallabel elseif number == 1 and (params.singularlabel) then label = params.singularlabel end if type(label) == 'function' then label = label(localdata, localdata.item) end
-- format local formattedvalue = mw.html.create('div') :wikitext('\n' .. value) -- Le '\n' est requis lorsque value est une liste commençant par '*' ou '#'
if (params.hidden == true)then formattedvalue :attr({class="NavContent", style="display: none; text-align: left;"}) formattedvalue = mw.html.create('div') :attr({class="NavFrame", title="[Afficher]/[Masquer]", style="border: none; padding: 0;"}) :node(formattedvalue) end formattedvalue = mw.html.create('td') :node(formattedvalue) :allDone()
local formattedlabel if label then formattedlabel = mw.html.create('th') :attr('scope', 'row') :wikitext(label) :done() end local row = mw.html.create('tr') :addClass(class) :css(style) :node(formattedlabel) :node(formattedvalue) :done()
return row end
function p.buildsuccession(params) if not params.value then return nil end
--local style = params.style or {} --style['text-align'] = style['text-align'] or 'center' --style['color'] = style['color'] or '#000000' --style['background-color'] = style['background-color'] or '#F9F9F9'
local rowI = mw.html.create('tr')
local colspan = '2' cellI = mw.html.create('td') :attr({colspan = colspan}) :attr({align = 'center'})
local styleT = {} styleT['background-color'] = 'transparent' styleT['width'] = '100%' tabC = mw.html.create('table') :attr({cellspacing = '0'}) :css(styleT)
local row = mw.html.create('tr')
local color = params.color
local style = {} local arrowLeft local arrowRight
if color == 'default' then
style['background-color'] = '#E6E6E6'
arrowLeft = '
'
arrowRight = '
'
else
style['background-color'] = color
arrowLeft = '
'
arrowRight = '
'
end
local styleTrans = {} styleTrans['background-color'] = '#F9F9F9'
local values = params.value local before = values['before'] local center = values['center'] local after = values['after']
local widthCell = '44%' if center then widthCenter = '28%' widthCell = '29%' end
local formattedbefore if before then formattedbefore = mw.html.create('td') :attr({valign = 'middle'}) :attr({align = 'left'}) :attr({width = '5%'}) :css(style) :wikitext(arrowLeft) :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(style) :wikitext() :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({align = 'left'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(style) :wikitext(before) :done() row:node(formattedbefore) else formattedbefore = mw.html.create('td') :attr({valign = 'middle'}) :attr({align = 'left'}) :attr({width = '5%'}) :css(styleTrans) :wikitext() :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext() :done() row:node(formattedbefore) formattedbefore = mw.html.create('td') :attr({align = 'left'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(styleTrans) :wikitext() :done() row:node(formattedbefore) end
local formattedcenter formattedcenter = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext() :done() row:node(formattedcenter)
if center then formattedcenter = mw.html.create('td') :attr({align = 'center'}) :attr({valign = 'middle'}) :attr({width = widthCenter}) :css(style) :wikitext(center) :done() row:node(formattedcenter) formattedcenter = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext() :done() row:node(formattedcenter) end
local formattedafter if after then formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(style) :wikitext(after) :done() row:node(formattedafter) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(style) :wikitext() :done() row:node(formattedbefore) formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = '5%'}) :css(style) :wikitext(arrowRight) :done() row:node(formattedafter) else formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = widthCell}) :css(styleTrans) :wikitext() :done() row:node(formattedafter) formattedbefore = mw.html.create('td') :attr({width = '1%'}) :css(styleTrans) :wikitext() :done() row:node(formattedbefore) formattedafter = mw.html.create('td') :attr({align = 'right'}) :attr({valign = 'middle'}) :attr({width = '5%'}) :css(styleTrans) :wikitext() :done() row:node(formattedafter) end
row:done() tabC:node(row) tabC:done() cellI:node(tabC) cellI:done() rowI:node(cellI) rowI:allDone()
return rowI end
function p.buildrow1col(params)
if not params.value then return nil end
--local style = params.style or {} --style['text-align'] = style['text-align'] or 'center' --style['color'] = style['color'] or '#000000' --style['background-color'] = style['background-color'] or '#F9F9F9' local class = params.class local rowcolor if params.color == 'secondcolor' then rowcolor = secondcolor else rowcolor = params.color end
local style = {} style['padding'] = '4px' style['text-align'] = 'center' style['background-color'] = rowcolor or '#F9F9F9' style['color'] = '#000000'
local text = params.value
local colspan ='2'
local formattedlabel formattedlabel = mw.html.create('th') :attr({colspan = colspan}) :css(style) :wikitext(text) :done()
local row = mw.html.create('tr') :addClass(class) :css(style) :node(formattedlabel) :done()
return row end
function p.buildtable(params) local tab = mw.html.create('table'):css(params.style or {})
-- CREATE ROWS local rows = {} for k, l in pairs(params.rows) do if type(l) == 'table' and l.type == 'multi' then -- when a single function is used for return several rows table.remove(params.rows, k) local count = 0 for m, n in pairs(l.rows) do table.insert(params.rows, k + count, n) count = count + 1 end l = params.rows[k] end
if type(l) == 'function' then --accepte les fonctions qui retournent des tables l = l(localdata, localdata.item) end if type(l) == 'nil' then --ne rien faire (quand la valeur est originellemenet une fonctin elle peut retourner nil) elseif type(l) ~= 'table' then return error('les lignes d\'infobox ("rows") doivent être des tables, est ' .. type(l)) else local row = p.buildblock(l) table.insert(rows, row) end end if #rows == 0 then return nil end
-- ADD TITLE local title if params.title or params.singulartitle or params.pluraltitle then local text if #rows > 1 and params.pluraltitle then text = params.pluraltitle elseif #rows == 1 and params.singulartitle then text = params.singulartitle else text = params.title end
local style = params.titlestyle or {} style['text-align'] = style['text-align'] or 'center' style['color'] = style['color'] or thirdcolor style['background-color'] = style['background-color'] or maincolor
local colspan ='2' title = mw.html.create('caption') :attr({colspan = colspan}) :css(style) :wikitext(text) :done() end
if title then tab:node(title) end
for i, j in pairs (rows) do tab:node(j) end
if params.separator then local separator = p.separator(params) tab:node(separator) end tab:allDone() return tab end
function p.buildinvalidblock(args) addmaintenancecat(defaultcat) local text = if type(args) ~= 'table' then text = "Les blocs d'infobox doivent être des tables" else text = i18n["invalid block type"] .. ' : ' .. (args.type or '??') end return text end
function p.buildmap(params)-- TODO : gestion de plusieurs points
-- paramètre d'affichage local maplist = getvalue(params.maps) local pointtype = params.pointtype local maptype = params.maptype -- choisit le type de carte le plus approprié (relief, administratif, etc.) if type(maplist) == 'function' then maplist = maplist(localdata, localdata.item) end local width = tonumber(params.width) or 280 if width > 280 then addmaintenancecat("Erreur d'Infobox/Image trop grande") return 'image trop grande, la largeur doit être inférieure ou égale à 280px' end
-- récupération des données locales local latitude, longitude, globe = params.latitude, params.longitude, params.globe if type(params.latitude) == 'function' then latitude, longitude = params.latitude(localdata, localdata.item), params.longitude(localdata, localdata.item) else latitude, longitude = localdata[params.latitude], localdata[params.longitude] end
-- récupération des données wikidata if (not latitude or not longitude) and params.wikidata then local query = params.wikidata if type(query) == 'function' then query = query() end if not query then return nil end query.excludespecial = true query.entity = query.entity or localdata.item local claims = wikidata.getClaims(query) if not claims then return nil end local val = wd.formatSnak( claims[1].mainsnak ) latitude, longitude, globe = val.latitude, val.longitude, val.globe end
if not latitude or not longitude then return nil end local newparams = {maplist = maplist, pointtype = pointtype, maptype = maptype, width = width, item = localdata.item, latitude = latitude, longitude = longitude, globe = globe, marker=params.marker, default_zoom=params.default_zoom} if params.params and type(params.params) == 'table' then -- paramètres additionnels for i, j in pairs(params.params) do newparams[i] = j end end return mapmod.multimap(newparams) end
function p.buildexternaltext(params) local value = getvalue(params.value) if value and (type(value) == 'string') then externaltext = externaltext .. value end end
function p.buildfooter(params) if not params then params = {} end
local class = 'navbar noprint bordered ' .. (params.class or ) local style = params.style or {} style['border-top'] = style['border-top'] or '1px solid ' .. maincolor
local backlinkstr = '[' .. tostring( mw.uri.fullUrl( page.name, 'veaction=edit§ion=0' ) ) .. ' ' .. i18n['edit'] .. ']' .. ' - [' .. tostring( mw.uri.fullUrl( page.name, 'action=edit§ion=0' ) ) .. ' ' .. i18n['edit code'] .. ']'
local itemlinkstr
if localdata.item then
itemlinkstr = '' .. i18n['edit item'] .. ''
end
local editstr = backlinkstr
if itemlinkstr then
editstr = editstr .. ' - ' .. itemlinkstr
end
local editlinkspan = mw.html.create('span')
:css({['text-align'] = "left"})
:addClass('plainlinks')
:wikitext(editstr)
:done()
local doclinkstr = '
'
-- si ce lien ne marche pas toujours, il faut ajouter un variable pour le nom de l'infobox récupéré par le frame
local doclinkspan = mw.html.create('span')
:css({['text-align'] = "right"})
:wikitext(doclinkstr)
:done()
local footer = mw.html.create('p') :addClass(class) :css(style) :node(editlinkspan) :node(doclinkspan) return footer end
function p.buildblock(block) if type(block) == 'function' then block = block( localdata ) end
local blocktypes = { -- list of functions for block buildings ['invalid'] = p.buildinvalidblock, ['external text'] = p.buildexternaltext, ['footer'] = p.buildfooter, ['images'] = p.buildimages, ['map']= p.buildmap, ['mixed'] = p.buildrow, ['navbox'] = p.buildnavbox, ['table'] = p.buildtable, ['row'] = p.buildrow, ['row1col'] = p.buildrow1col, ['succession'] = p.buildnavbox, ['text'] = p.buildtext, ['title'] = p.buildtitle, } if type(block) ~= 'table' or (not block.type) or (not blocktypes[block.type]) then return blocktypes['invalid'](block) end return blocktypes[block.type](block) end
function p.build()
localdata = require( 'Module:Infobox/Localdata' ) item = localdata.item
-- assign rank to the infobox, "secondary" means special formatting like no displaytitle for coordinates local infoboxrank = 'main' -- main infobox of the page, with coordinates displayed in title etc. if page.namespace ~= 0 then infoboxrank = 'secondary' end -- if infobox is linked to another item: rank = secondary if localdata.item then local itemlink = mw.wikibase.sitelink(localdata.item.id) local pagetitle = mw.title.getCurrentTitle().text if (itemlink or ) ~= pagetitle then infoboxrank = 'secondary' end end localdata.infoboxrank = infoboxrank
-- load infobox module page local moduledata = require('Module:Infobox/' .. localdata.modulename) moduledata.name = localdata.modulename -- defines main color maincolor = localdata['couleur infobox'] or localdata['couleur boîte'] or moduledata.maincolor or maincolor secondcolor = moduledata.secondcolor or secondcolor thirdcolor = moduledata.thirdcolor or thirdcolor if maincolor:match( '^%x%x%x%x%x%x$' ) or maincolor:match( '^%x%x%x$' ) then maincolor = '#' .. maincolor end
-- class local class = 'infobox_v3' if moduledata.class then class = class .. ' ' .. moduledata.class end
-- style local style = moduledata.style or {} if not style['max-width'] then style['max-width'] = '300px' end
-- build infobox infobox :addClass(class) :css(style) for i, j in pairs( moduledata.parts ) do infobox:node( p.buildblock(j) ) end infobox :node(p.buildfooter(moduledata.footer)) :done()
return tostring(infobox) .. externaltext, maintenance end
return p