Module:Infobox : Différence entre versions
Sauter à la navigation
Sauter à la recherche
fr>FDo64 (Maintenance) |
|||
| Ligne 1 : | Ligne 1 : | ||
| − | -- | + | 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 à retourner | ||
| + | local infobox = mw.html.create('div') | ||
| + | |||
| + | -- objets secondaires à retourner | ||
| + | local maintenance = '' -- chaîne retournée avec le module : cats de maintenance | ||
| + | local externaltext = '' -- par exemple coordonnées en titre | ||
| + | -- modules importés | ||
| + | local linguistic = require "Module:Linguistique" | ||
| + | local wd = require 'Module:Wikidata' | ||
| + | local valueexpl = wd.translate("activate-query") | ||
| + | |||
| + | 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 | + | local function addWikidataCat(prop) |
| + | maintenance = maintenance .. wd.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 = wd.getClaims(query) | ||
| + | if (not claims) then | ||
| + | return nil | ||
| + | end | ||
| + | return wd.formatAndCat(query), #claims -- pour l'accord au pluriel | ||
| + | end | ||
| − | local | + | local function getWikidataValue(params, wikidataparam) |
| + | -- Récupère la valeur Wikidata pour la valeur, soit dans le paramètre "wikidata" soit dans le paramètre "property" | ||
| + | if not localdata.item then | ||
| + | return nil | ||
| + | end | ||
| − | local | + | if params.blockers then -- blockers are local parameters that disable the wikidata query |
| − | + | local blockers = params.blockers | |
| − | + | if (type(blockers) == 'string') then | |
| + | blockers = {blockers} | ||
| + | end | ||
| + | for i, blocker in ipairs(blockers) do | ||
| + | if localdata[blocker] then | ||
| + | return nil | ||
| + | end | ||
| + | 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 | ||
| + | wikidataparam = 'wikidata' | ||
| + | end | ||
| − | + | if params[wikidataparam] then | |
| − | if | + | 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 | ||
| − | + | 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 premier non vide | |
| − | + | if localdata[j] then | |
| − | + | return localdata[j] | |
end | end | ||
end | end | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
end | end | ||
end | end | ||
| − | local function | + | local function addMaintenanceCat(cat, sortkey) |
| − | + | if page.namespace ~= 0 then | |
| − | + | return '' | |
| − | + | end | |
| − | + | if cat then | |
| − | + | 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 | ||
| − | + | 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 .. '<br /><small>' .. subtext .. '</small>' | |
| − | + | end | |
| − | + | local icon = params.icon or '' | |
| − | + | if icon ~= '' and icon ~= 'defaut' then | |
| − | + | text = text .. mw.getCurrentFrame():extensionTag('templatestyles', '', {src = 'Infobox/Pictogramme/' .. mw.text.trim(icon) .. '.css'}) | |
| − | + | if not params.large then | |
| − | + | icon = 'icon ' .. icon | |
| − | + | end | |
| − | + | 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 | end | ||
| + | p.buildTitle = p.buildtitle | ||
| + | |||
| + | 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 | end | ||
| + | p.buildNavbox = p.buildnavbox | ||
| + | |||
| + | 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 pas 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 | ||
| + | wdq.excludespecial = true | ||
| + | if type(wdq) == 'table' then | ||
| + | wdq.entity = wdq.entity or localdata.item | ||
| + | wdq.numval = wdq.numval or params.numval or 1 | ||
| + | images = wd.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 | ||
| + | |||
| + | if type(images[1]) == 'table' then | ||
| + | for i, image in pairs(images) do | ||
| + | if image.mainsnak.snaktype ~= 'value' then | ||
| + | return | ||
| + | end | ||
| + | if #images == 1 then -- si une seule image, on utilise la légende (si deux plusieurs images, comment mettre en forme ?) | ||
| + | caption = wd.getFormattedQualifiers(images[i], {'P2096'}, {isinlang = 'fr'}) or wd.getFormattedQualifiers(images[i], {'P805'}) | ||
| + | end | ||
| + | images[i] = image.mainsnak.datavalue.value | ||
| + | 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 | ||
| + | |||
| + | if tonumber(upright) then | ||
| + | upright = tostring(tonumber(upright) ) / #images | ||
| + | end | ||
| + | if tonumber(size) then | ||
| + | size = tostring(tonumber(size) ) / #images | ||
| + | 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 .. '[[Fichier:' .. image .. size .. '|frameless' | ||
| + | if alt then | ||
| + | imagesString = imagesString .. '|alt=' .. alt | ||
| + | end | ||
| + | if link then | ||
| + | imagesString = imagesString .. '|link=' .. link | ||
| + | end | ||
| + | if upright then | ||
| + | imagesString = imagesString .. '|upright=' .. upright | ||
| + | elseif #images > 1 then | ||
| + | imagesString = imagesString .. '|upright=' .. ( 1 / #images ) | ||
| + | end | ||
| + | imagesString = imagesString .. ']]' | ||
| + | end | ||
| + | |||
| + | local image = mw.html.create('div') | ||
| + | :addClass("images") | ||
| + | :css(style) | ||
| + | :wikitext(imagesString) | ||
| − | local | + | -- Partie légende |
| − | + | local captionobj | |
| − | + | if caption then | |
| − | + | captionobj = mw.html.create('div') | |
| − | + | :wikitext(caption) | |
| − | + | :css(params.legendstyle 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 | end | ||
| + | p.buildImages = p.buildimages | ||
| − | + | 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 | end | ||
| + | p.buildText = p.buildtext | ||
| − | local | + | 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 | end | ||
| + | p.buildRow = p.buildrow | ||
| + | |||
| + | 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'}) | ||
| + | :addClass('navigation-not-searchable') | ||
| + | :css(styleT) | ||
| + | |||
| + | local row = mw.html.create('tr') | ||
| − | local | + | 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() | ||
| + | row:node(formattedafter) | ||
| + | end | ||
| + | |||
| + | row:done() | ||
| + | tabC:node(row) | ||
| + | tabC:done() | ||
| + | cellI:node(tabC) | ||
| + | cellI:done() | ||
| + | rowI:node(cellI) | ||
| + | rowI:allDone() | ||
| + | |||
| + | return rowI | ||
end | end | ||
| + | p.buildSuccession = p.buildsuccession | ||
| + | |||
| + | 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 | + | 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 | end | ||
| + | p.buildRow1Col = p.buildrow1col | ||
| + | |||
| + | function p.buildtable(params) | ||
| + | local tab = mw.html.create('table'):css(params.style or {}) | ||
| + | |||
| + | local rows = params.rows | ||
| + | |||
| + | -- expand parameters so that we have a list of tables | ||
| + | local i = 1 | ||
| + | |||
| + | while (i <= #rows) do | ||
| + | local l = rows[i] | ||
| + | if type(l) == 'function' then | ||
| + | l = l(localdata, localdata.item) | ||
| + | end | ||
| + | if (type(l) == 'table') and (l.type == 'multi') then | ||
| + | table.remove(rows, i) | ||
| + | for j, row in ipairs(l.rows) do | ||
| + | table.insert(rows, i + j - 1, row) | ||
| + | end | ||
| + | elseif type(l) == 'nil' then | ||
| + | table.remove(rows, i) | ||
| + | elseif type(l) ~= 'table' then | ||
| + | return error('les lignes d\'infobox ("rows") doivent être des tables, est ' .. type(l)) | ||
| + | else | ||
| + | i = i + 1 | ||
| + | end | ||
| + | end | ||
| + | |||
| + | -- CREATE ROW | ||
| + | local expandedrows = {} | ||
| + | for k, row in ipairs(rows) do | ||
| + | local v = p.buildblock(row) | ||
| + | if v then | ||
| + | table.insert(expandedrows, v) | ||
| + | end | ||
| + | end | ||
| + | if (#expandedrows == 0) then | ||
| + | return nil | ||
| + | end | ||
| + | rows = expandedrows | ||
| − | local | + | -- 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 | end | ||
| + | p.buildTable = p.buildtable | ||
| − | + | 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 | end | ||
| + | p.buildInvalidBlock = p.buildinvalidblock | ||
| + | |||
| + | function p.buildmap(params) | ||
| − | local | + | -- 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 pointtable = {} | ||
| + | local globe = params.globe | ||
| + | if params.latitude then | ||
| + | local lat, long | ||
| + | if type(params.latitude) == 'function' then | ||
| + | lat, long = params.latitude(localdata, localdata.item), params.longitude(localdata, localdata.item) | ||
| + | else | ||
| + | lat, long = localdata[params.latitude], localdata[params.longitude] | ||
| + | end | ||
| + | if lat then | ||
| + | table.insert(pointtable, {latitude = lat, longitude = long}) | ||
| + | end | ||
| + | end | ||
| + | |||
| + | -- récupération des données wikidata | ||
| + | local function processWDval(claim, displayformat) | ||
| + | if not claim then | ||
| + | return nil | ||
| + | end | ||
| + | local val = wd.formatSnak( claim.mainsnak ) | ||
| + | return {latitude = val.latitude, longitude = val.longitude, globe = val.globe, marker = displayformat.marker} | ||
| + | end | ||
| + | |||
| + | local function getWDvals(query) | ||
| + | query.excludespecial = true | ||
| + | query.numval = query.numval or 1 | ||
| + | query.entity = query.entity or localdata.item | ||
| + | local claims = wd.getClaims(query) | ||
| + | if (not claims) then | ||
| + | return | ||
| + | end | ||
| + | for i, claim in ipairs(claims) do | ||
| + | claim = processWDval(claim, query) | ||
| + | table.insert(pointtable, claim) | ||
| + | end | ||
| + | end | ||
| + | |||
| + | if (#pointtable == 0) and localdata.item and params.wikidata and (params.wikidata ~= '-') then | ||
| + | for i, query in ipairs(params.wikidata) do | ||
| + | if type(query) == 'function' then | ||
| + | query = query() | ||
| + | end | ||
| + | if query then | ||
| + | getWDvals(query) | ||
| + | end | ||
| + | end | ||
| + | end | ||
| + | |||
| + | if (not pointtable) or (#pointtable == 0) then | ||
| + | return nil | ||
| + | end | ||
| + | |||
| + | local newparams = {maplist = maplist, pointtype = pointtype, maptype = maptype, width = width, item = localdata.item, pointtable = pointtable, globe = globe, marker=params.marker, default_zoom=params.default_zoom, ids = params.ids, markercolor = params.markercolor, shapecolor = params.shapecolor } | ||
| + | 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 require('Module:Carte').multimap(newparams) | ||
end | end | ||
| + | p.buildMap = p.buildmap | ||
| − | + | function p.buildexternaltext(params) | |
| − | + | local value = getValue(params.value) | |
| − | + | if value and (type(value) == 'string') then | |
| − | + | externaltext = externaltext .. value | |
| − | + | end | |
| − | + | end | |
| − | + | p.buildExternalText = p.buildexternaltext | |
| − | + | ||
| − | + | 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 = '[[d:' .. localdata.item.id .. '|' .. 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 = '[[Fichier: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 | ||
| + | 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 | end | ||
| + | p.buildFooter = p.buildfooter | ||
| − | + | 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 | end | ||
| + | p.buildBlock = p.buildblock | ||
| − | + | 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 = localdata['texte noir'] or localdata['couleur texte'] or moduledata.thirdcolor or thirdcolor | |
| − | + | if maincolor:match( '^%x%x%x%x%x%x$' ) or maincolor:match( '^%x%x%x$' ) then | |
| − | + | maincolor = '#' .. maincolor | |
| − | + | end | |
| + | if thirdcolor:match ('oui') or thirdcolor:match( 'true' ) then | ||
| + | thirdcolor = '#000' | ||
| + | end | ||
| + | if thirdcolor:match ('non') or thirdcolor:match( 'false' ) then | ||
| + | thirdcolor = '#fff' | ||
| + | end | ||
| + | |||
| + | -- class | ||
| + | local class = 'infobox_v3 large' | ||
| + | if moduledata.class then | ||
| + | class = class .. ' ' .. moduledata.class | ||
| + | end | ||
| + | |||
| + | -- style | ||
| + | local style = moduledata.style or {} | ||
| + | |||
| + | -- 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 | end | ||
| − | + | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
return p | return p | ||
Version du 8 septembre 2019 à 21:45
La documentation pour ce module peut être créée à Module:Infobox/doc
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 à retourner
local infobox = mw.html.create('div')
-- objets secondaires à retourner
local maintenance = '' -- chaîne retournée avec le module : cats de maintenance
local externaltext = '' -- par exemple coordonnées en titre
-- modules importés
local linguistic = require "Module:Linguistique"
local wd = require 'Module:Wikidata'
local valueexpl = wd.translate("activate-query")
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 .. wd.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 = wd.getClaims(query)
if (not claims) then
return nil
end
return wd.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 paramètre "property"
if not localdata.item then
return nil
end
if params.blockers then -- blockers are local parameters that disable the wikidata query
local blockers = params.blockers
if (type(blockers) == 'string') then
blockers = {blockers}
end
for i, blocker in ipairs(blockers) do
if localdata[blocker] then
return nil
end
end
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 premier non vide
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 .. '[[Category:' .. cat .. '|' .. (sortkey or page.name) .. ']]'
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 .. '<br /><small>' .. subtext .. '</small>'
end
local icon = params.icon or ''
if icon ~= '' and icon ~= 'defaut' then
text = text .. mw.getCurrentFrame():extensionTag('templatestyles', '', {src = 'Infobox/Pictogramme/' .. mw.text.trim(icon) .. '.css'})
if not params.large then
icon = 'icon ' .. icon
end
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
p.buildTitle = p.buildtitle
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
p.buildNavbox = p.buildnavbox
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 pas 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
wdq.excludespecial = true
if type(wdq) == 'table' then
wdq.entity = wdq.entity or localdata.item
wdq.numval = wdq.numval or params.numval or 1
images = wd.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
if type(images[1]) == 'table' then
for i, image in pairs(images) do
if image.mainsnak.snaktype ~= 'value' then
return
end
if #images == 1 then -- si une seule image, on utilise la légende (si deux plusieurs images, comment mettre en forme ?)
caption = wd.getFormattedQualifiers(images[i], {'P2096'}, {isinlang = 'fr'}) or wd.getFormattedQualifiers(images[i], {'P805'})
end
images[i] = image.mainsnak.datavalue.value
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
if tonumber(upright) then
upright = tostring(tonumber(upright) ) / #images
end
if tonumber(size) then
size = tostring(tonumber(size) ) / #images
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 .. '[[Fichier:' .. image .. size .. '|frameless'
if alt then
imagesString = imagesString .. '|alt=' .. alt
end
if link then
imagesString = imagesString .. '|link=' .. link
end
if upright then
imagesString = imagesString .. '|upright=' .. upright
elseif #images > 1 then
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('div')
:wikitext(caption)
:css(params.legendstyle 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
p.buildImages = p.buildimages
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
p.buildText = p.buildtext
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
p.buildRow = p.buildrow
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'})
:addClass('navigation-not-searchable')
: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()
row:node(formattedafter)
end
row:done()
tabC:node(row)
tabC:done()
cellI:node(tabC)
cellI:done()
rowI:node(cellI)
rowI:allDone()
return rowI
end
p.buildSuccession = p.buildsuccession
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
p.buildRow1Col = p.buildrow1col
function p.buildtable(params)
local tab = mw.html.create('table'):css(params.style or {})
local rows = params.rows
-- expand parameters so that we have a list of tables
local i = 1
while (i <= #rows) do
local l = rows[i]
if type(l) == 'function' then
l = l(localdata, localdata.item)
end
if (type(l) == 'table') and (l.type == 'multi') then
table.remove(rows, i)
for j, row in ipairs(l.rows) do
table.insert(rows, i + j - 1, row)
end
elseif type(l) == 'nil' then
table.remove(rows, i)
elseif type(l) ~= 'table' then
return error('les lignes d\'infobox ("rows") doivent être des tables, est ' .. type(l))
else
i = i + 1
end
end
-- CREATE ROW
local expandedrows = {}
for k, row in ipairs(rows) do
local v = p.buildblock(row)
if v then
table.insert(expandedrows, v)
end
end
if (#expandedrows == 0) then
return nil
end
rows = expandedrows
-- 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
p.buildTable = p.buildtable
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
p.buildInvalidBlock = p.buildinvalidblock
function p.buildmap(params)
-- 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 pointtable = {}
local globe = params.globe
if params.latitude then
local lat, long
if type(params.latitude) == 'function' then
lat, long = params.latitude(localdata, localdata.item), params.longitude(localdata, localdata.item)
else
lat, long = localdata[params.latitude], localdata[params.longitude]
end
if lat then
table.insert(pointtable, {latitude = lat, longitude = long})
end
end
-- récupération des données wikidata
local function processWDval(claim, displayformat)
if not claim then
return nil
end
local val = wd.formatSnak( claim.mainsnak )
return {latitude = val.latitude, longitude = val.longitude, globe = val.globe, marker = displayformat.marker}
end
local function getWDvals(query)
query.excludespecial = true
query.numval = query.numval or 1
query.entity = query.entity or localdata.item
local claims = wd.getClaims(query)
if (not claims) then
return
end
for i, claim in ipairs(claims) do
claim = processWDval(claim, query)
table.insert(pointtable, claim)
end
end
if (#pointtable == 0) and localdata.item and params.wikidata and (params.wikidata ~= '-') then
for i, query in ipairs(params.wikidata) do
if type(query) == 'function' then
query = query()
end
if query then
getWDvals(query)
end
end
end
if (not pointtable) or (#pointtable == 0) then
return nil
end
local newparams = {maplist = maplist, pointtype = pointtype, maptype = maptype, width = width, item = localdata.item, pointtable = pointtable, globe = globe, marker=params.marker, default_zoom=params.default_zoom, ids = params.ids, markercolor = params.markercolor, shapecolor = params.shapecolor }
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 require('Module:Carte').multimap(newparams)
end
p.buildMap = p.buildmap
function p.buildexternaltext(params)
local value = getValue(params.value)
if value and (type(value) == 'string') then
externaltext = externaltext .. value
end
end
p.buildExternalText = p.buildexternaltext
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 = '[[d:' .. localdata.item.id .. '|' .. 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 = '[[Fichier: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
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
p.buildFooter = p.buildfooter
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
p.buildBlock = p.buildblock
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 = localdata['texte noir'] or localdata['couleur texte'] or moduledata.thirdcolor or thirdcolor
if maincolor:match( '^%x%x%x%x%x%x$' ) or maincolor:match( '^%x%x%x$' ) then
maincolor = '#' .. maincolor
end
if thirdcolor:match ('oui') or thirdcolor:match( 'true' ) then
thirdcolor = '#000'
end
if thirdcolor:match ('non') or thirdcolor:match( 'false' ) then
thirdcolor = '#fff'
end
-- class
local class = 'infobox_v3 large'
if moduledata.class then
class = class .. ' ' .. moduledata.class
end
-- style
local style = moduledata.style or {}
-- 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