Module:Infobox : Différence entre versions
(correction) |
(copie de la version test) |
||
Ligne 1 : | Ligne 1 : | ||
− | local | + | local p = {} |
+ | local infobox = mw.html.create('div') | ||
+ | local wikidata = require('Module:Wikidata') | ||
+ | local maintenance = '' | ||
+ | local infoboxname, infoboxmodule | ||
+ | local localdata = {} | ||
+ | local pagename = mw.title.getCurrentTitle().prefixedText | ||
+ | |||
+ | |||
local i18n = { | local i18n = { | ||
− | + | ['see doc'] = 'Documentation du modèle', | |
− | + | ['edit infobox'] = 'modifier l\'infobox', | |
+ | ['edit item'] = 'modifier Wikidata' | ||
} | } | ||
− | function | + | local function getWikidataValue(params) -- helper function |
− | + | if not item then | |
− | + | return nil | |
− | + | end | |
− | + | params.item = item | |
− | + | if params.wikidata then | |
− | + | if type(params.wikidata) == 'function' then | |
− | + | return params.wikidata() | |
− | + | else | |
− | + | return params.wikidata | |
+ | end | ||
+ | elseif params.property then | ||
+ | return wikidata.formatStatements({property = params.property}) | ||
+ | else | ||
+ | return nil | ||
+ | end | ||
+ | end | ||
− | + | local function buildtitle(params) | |
− | + | local class = params.class or "entete" | |
− | + | local style = params.style or {} | |
+ | local text = localdata[params.textparameter] or params.textdefaultvalue or mw.title.getCurrentTitle().text | ||
+ | local title = mw.html.create('p') | ||
+ | :addClass(class) | ||
+ | :css(style) | ||
+ | :wikitext(text) | ||
+ | :done() | ||
+ | return title | ||
+ | end | ||
− | + | local function buildimages(params) | |
− | + | local images = {} | |
− | + | for j, k in ipairs(params.imageparameters) do | |
− | + | table.insert(images, localdata[k]) | |
− | + | end | |
− | + | if #images == 0 then | |
− | + | images = getWikidataValue(params) | |
− | + | end | |
− | + | if #images == 0 then | |
− | + | images = params.defaultimage | |
− | + | end | |
+ | if not images then | ||
+ | return nil | ||
+ | end | ||
+ | local captiontext = localdata[params.captionparameter] or params.defaultcaption | ||
+ | if type(captiontext) == 'function' then | ||
+ | captiontext = captiontext(localdata) | ||
+ | end | ||
+ | local div = mw.html.create('div') | ||
+ | local style = params.style or '' | ||
+ | local class = '' | ||
+ | if #images == 2 then | ||
+ | class = image2 | ||
+ | end | ||
+ | -- Partie image | ||
− | + | local imagesString = '' | |
− | + | for i,image in pairs(images) do | |
− | + | imagesString = imagesString .. '[[Fichier:' .. image .. '|thumb' | |
+ | if #images == 1 then | ||
+ | imagesString = imagesString .. '|center' | ||
+ | end | ||
+ | if image.upright then | ||
+ | imagesString = imagesString .. '|upright=' .. image.upright | ||
+ | else | ||
+ | imagesString = imagesString .. '|upright=' .. ( 1 / #images ) | ||
+ | end | ||
+ | imagesString = imagesString .. ']]' | ||
end | end | ||
− | + | div:wikitext(imagesString) | |
− | |||
− | |||
− | |||
− | + | -- Partie légende | |
− | + | local caption = mw.html.create('p') | |
− | + | if captiontext then | |
− | + | caption | |
− | + | :wikitext(captiontext) | |
− | + | :css(params.style or {}) | |
− | + | :addClass("legend") | |
+ | :done() | ||
+ | div:node(caption) | ||
+ | end | ||
− | + | return div | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | function | + | local function buildtext(params) |
− | + | local class = params.class or '' | |
− | + | local style = params.style or {} | |
− | + | local text = localdata[params.value] or getWikidataValue(params) or params.defaulttext | |
− | + | ||
− | + | if not text then | |
− | + | return nil -- à ajouter : option cat de maintenance | |
− | + | end | |
− | + | local formattedtext = mw.html.create('p') | |
− | + | :addClass(class) | |
− | + | :css(style) | |
− | + | :wikitext(text) | |
− | + | :done() | |
− | + | return formattedtext | |
− | |||
− | |||
end | end | ||
− | function | + | local function buildmixedrow(params) |
− | + | local class = params.class or '' | |
− | + | local style = params.style or {} | |
− | + | local value | |
− | + | ||
+ | -- retrieve value | ||
+ | if type(params.value) == 'function' then | ||
+ | local raw = params.value | ||
+ | value = raw(localdata) | ||
+ | elseif type(params.value) == 'string' then | ||
+ | value = localdata[params.value] | ||
+ | end | ||
+ | |||
+ | if not value then | ||
+ | value = getWikidataValue(params) or params.defaultvalue | ||
+ | end | ||
+ | |||
+ | local label = params.label | ||
+ | if not value then | ||
+ | return nil -- todo: maintenance | ||
+ | end | ||
− | + | -- formatting | |
− | + | local formattedvalue = mw.html.create('div') | |
− | + | :wikitext(value) | |
− | + | ||
− | + | 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 = mw.html.create('th') | ||
+ | :attr('scope', 'row') | ||
+ | :wikitext(label) | ||
+ | :done() | ||
− | + | local row = mw.html.create('tr') | |
+ | :addClass(class) | ||
+ | :css(style) | ||
+ | :node(formattedlabel) | ||
+ | :node(formattedvalue) | ||
+ | :done() | ||
+ | |||
+ | return row | ||
end | end | ||
− | function | + | local function buildtable(params) |
− | + | local tab = mw.html.create('table') | |
+ | local title | ||
+ | if params.title then | ||
+ | local text = params.title.value or error('no value provided for this title') | ||
+ | local style = params.title.style or {['text-align'] = 'center', ['background-color'] = "E1E1E1", color = '000000'} | ||
+ | local colspan = params.title.colspan or '2' | ||
+ | title = mw.html.create('th') | ||
+ | :attr({colspan = 2}) | ||
+ | :css(style) | ||
+ | :wikitext(text) | ||
+ | :done() | ||
+ | end | ||
+ | local rows = {} -- does not add the rows directly to tab: check if some rows are non empty beoforehand so that we do not add a title if there are no data to show | ||
+ | for k, l in pairs(params.rows) do | ||
+ | if type(l) == 'table' and l.type == 'mixed' then | ||
+ | local row = buildmixedrow(l) | ||
+ | if row then | ||
+ | table.insert(rows, row) | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | if title and (#rows > 0) then | ||
+ | tab:node(title) | ||
+ | end | ||
+ | if #rows > 0 then | ||
+ | for i, j in pairs (rows) do | ||
+ | tab:node(j) | ||
+ | end | ||
+ | end | ||
+ | tab:allDone() | ||
+ | return tab | ||
end | end | ||
− | function | + | local function buildmap(params) -- A faire |
− | + | local image = 'France_location_map-Regions_and_departements.svg' | |
− | + | local image2 = 'France_location_map-Regions_and_departements.svg' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | local map1 = mw.html.create('div') | |
− | + | :addClass("geobox") | |
− | + | :tag('table') | |
− | + | :addClass('DebutCarte') | |
− | + | :attr({border="0", cellspacing="0", cellpadding="0"}) | |
− | + | :css({margin = '0', border = 'none', padding = '0', ['text-align'] = 'center'}) | |
− | + | :tag('tr') | |
− | + | :tag('td') | |
− | + | :tag('div') | |
+ | :css({position= 'relative', margin = "auto"}) | ||
+ | :wikitext('[[Fichier:' .. image .. '|alt=(Voir situation sur carte : [[{{Géolocalisation/{{{1}}}|name|{{{type|}}}}}]])|{{{alt}}}]]') | ||
+ | :done() | ||
+ | :done() | ||
+ | :done() | ||
+ | :done() | ||
+ | local map1 = mw.html.create('div') | ||
+ | :addClass("geobox") | ||
+ | :tag('table') | ||
+ | :addClass('DebutCarte') | ||
+ | :attr({border="0", cellspacing="0", cellpadding="0"}) | ||
+ | :css({margin = '0', border = 'none', padding = '0', ['text-align'] = 'center'}) | ||
+ | :tag('tr') | ||
+ | :tag('td') | ||
+ | :tag('div') | ||
+ | :css({position= 'relative', margin = "auto"}) | ||
+ | :wikitext('[[Fichier:' .. image2 .. '|250px|(Voir situation sur carte : [[{{Géolocalisation/{{{1}}}|name|{{{type|}}}}}]])|{{{alt}}}]]') | ||
+ | :done() | ||
+ | :done() | ||
+ | :done() | ||
+ | :done() | ||
+ | local div = mw.html.create('div') | ||
+ | :addClass("img_toogle") | ||
+ | :node(map1):done() | ||
+ | :node(map2):done() | ||
+ | :allDone() | ||
+ | return div | ||
end | end | ||
− | function | + | local function buildfooter(params) |
− | + | if not params then params = {} end | |
− | + | ||
− | + | local class = params.class or 'navbar noprint' | |
− | + | local style = params.style or {border = "1px"} | |
− | + | ||
− | + | local backlinktext = '[' .. tostring( mw.uri.fullUrl( pagename, '&action=edit§ion=0' ) ) .. ' ' .. i18n['edit infobox'] .. ']' | |
− | + | local backlink = mw.html.create('td') | |
− | + | :wikitext(backlinktext) | |
− | + | :addClass('plainlinks') | |
− | + | :done() | |
− | + | ||
− | + | local itemlinktext = '' | |
− | + | if item then | |
− | + | itemlinktext = '[[d:' .. item.id .. '|' .. i18n['edit item'] .. ']]' | |
− | + | end | |
− | + | local itemlink = mw.html.create('td') | |
− | + | :wikitext(itemlinktext) | |
− | + | :done() | |
− | + | ||
− | + | local doclinktext = '[[Image:Gtk-dialog-info.svg|12px|link=' .. infoboxname .. '|' .. i18n['see doc'] .. ']]' | |
− | + | local doclink = mw.html.create('td') | |
− | + | :css({['text-align'] = "right"}) | |
+ | :wikitext(doclinktext) | ||
+ | :done() | ||
+ | |||
+ | local footer = mw.html.create('table') | ||
+ | :tag('tr') | ||
+ | :css({['font-size'] = '80%'}) | ||
+ | :node(backlink) | ||
+ | :node(itemlink) | ||
+ | :node(doclink) | ||
+ | :done() | ||
+ | :done() | ||
+ | return footer | ||
end | end | ||
− | function | + | function p._build(localinfoboxmodule) |
− | + | -- analyse le module d'infobox | |
− | + | local style = localinfoboxmodule.style or {} | |
− | + | local class = localinfoboxmodule.class or "infobox_v3" | |
− | + | local parts = localinfoboxmodule.parts | |
− | + | local footerparams = localinfoboxmodule.footer or {} | |
− | + | infobox:css(style) | |
− | + | infobox:addClass(class) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | for i, j in pairs(parts) do | |
− | + | if type(j) ~= 'table' then | |
− | + | return 'error' | |
− | + | elseif j.type == 'title' then | |
− | + | infobox:node(buildtitle(j)) | |
+ | elseif j.type == 'images' then | ||
+ | infobox:node(buildimages(j)) | ||
+ | elseif j.type == 'text' then | ||
+ | infobox:node(buildtext(j)) | ||
+ | elseif j.type == 'map' then | ||
+ | infobox:node(buildmap(j)) | ||
+ | elseif j.type == 'table' then | ||
+ | infobox:node(buildtable(j)) | ||
+ | end | ||
+ | end | ||
+ | local div = mw.html.create('div') | ||
+ | infobox:node(div):node(tab) | ||
+ | infobox | ||
+ | :node(buildfooter(footerparams)) | ||
+ | :done() | ||
+ | return tostring(infobox) .. maintenance | ||
end | end | ||
− | function | + | function p.build(frame) |
− | + | -- set variables | |
− | + | infoboxname = 'Module:InfoboxBuilder/' .. frame.args.nom | |
− | + | localinfoboxmodule = require(infoboxname) | |
− | + | ||
− | + | -- get the localinfoboxmodule parameter values and clen them up | |
− | + | for i, j in pairs(frame:getParent().args) do | |
− | + | if j and mw.text.trim(j) ~= '' then | |
− | + | localdata[i] = j | |
− | + | end | |
− | + | end | |
− | + | -- fetch wikidata item and assign it to the item global variable | |
− | + | if localdata.wikidata == 'non' then | |
− | + | item = nil | |
− | + | elseif (not localdata.wikidata) or (localdata.wikidata == '') then | |
− | + | item = mw.wikibase.getEntityObject() | |
− | + | else | |
− | + | item = mw.wikibase.getEntityObject() -- todo: fetch arbitrary item and check for errors | |
− | + | end | |
− | + | -- build infobox | |
− | + | return p._build(localinfoboxmodule) | |
− | |||
− | |||
− | |||
end | end | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
return p | return p |
Version du 9 mai 2014 à 12:12
La documentation pour ce module peut être créée à Module:Infobox/doc
local p = {} local infobox = mw.html.create('div') local wikidata = require('Module:Wikidata') local maintenance = '' local infoboxname, infoboxmodule local localdata = {} local pagename = mw.title.getCurrentTitle().prefixedText local i18n = { ['see doc'] = 'Documentation du modèle', ['edit infobox'] = 'modifier l\'infobox', ['edit item'] = 'modifier Wikidata' } local function getWikidataValue(params) -- helper function if not item then return nil end params.item = item if params.wikidata then if type(params.wikidata) == 'function' then return params.wikidata() else return params.wikidata end elseif params.property then return wikidata.formatStatements({property = params.property}) else return nil end end local function buildtitle(params) local class = params.class or "entete" local style = params.style or {} local text = localdata[params.textparameter] or params.textdefaultvalue or mw.title.getCurrentTitle().text local title = mw.html.create('p') :addClass(class) :css(style) :wikitext(text) :done() return title end local function buildimages(params) local images = {} for j, k in ipairs(params.imageparameters) do table.insert(images, localdata[k]) end if #images == 0 then images = getWikidataValue(params) end if #images == 0 then images = params.defaultimage end if not images then return nil end local captiontext = localdata[params.captionparameter] or params.defaultcaption if type(captiontext) == 'function' then captiontext = captiontext(localdata) end local div = mw.html.create('div') local style = params.style or '' local class = '' if #images == 2 then class = image2 end -- Partie image local imagesString = '' for i,image in pairs(images) do imagesString = imagesString .. '[[Fichier:' .. image .. '|thumb' if #images == 1 then imagesString = imagesString .. '|center' end if image.upright then imagesString = imagesString .. '|upright=' .. image.upright else imagesString = imagesString .. '|upright=' .. ( 1 / #images ) end imagesString = imagesString .. ']]' end div:wikitext(imagesString) -- Partie légende local caption = mw.html.create('p') if captiontext then caption :wikitext(captiontext) :css(params.style or {}) :addClass("legend") :done() div:node(caption) end return div end local function buildtext(params) local class = params.class or '' local style = params.style or {} local text = localdata[params.value] or getWikidataValue(params) or params.defaulttext if not text then return nil -- à ajouter : option cat de maintenance end local formattedtext = mw.html.create('p') :addClass(class) :css(style) :wikitext(text) :done() return formattedtext end local function buildmixedrow(params) local class = params.class or '' local style = params.style or {} local value -- retrieve value if type(params.value) == 'function' then local raw = params.value value = raw(localdata) elseif type(params.value) == 'string' then value = localdata[params.value] end if not value then value = getWikidataValue(params) or params.defaultvalue end local label = params.label if not value then return nil -- todo: maintenance end -- formatting local formattedvalue = mw.html.create('div') :wikitext(value) 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 = mw.html.create('th') :attr('scope', 'row') :wikitext(label) :done() local row = mw.html.create('tr') :addClass(class) :css(style) :node(formattedlabel) :node(formattedvalue) :done() return row end local function buildtable(params) local tab = mw.html.create('table') local title if params.title then local text = params.title.value or error('no value provided for this title') local style = params.title.style or {['text-align'] = 'center', ['background-color'] = "E1E1E1", color = '000000'} local colspan = params.title.colspan or '2' title = mw.html.create('th') :attr({colspan = 2}) :css(style) :wikitext(text) :done() end local rows = {} -- does not add the rows directly to tab: check if some rows are non empty beoforehand so that we do not add a title if there are no data to show for k, l in pairs(params.rows) do if type(l) == 'table' and l.type == 'mixed' then local row = buildmixedrow(l) if row then table.insert(rows, row) end end end if title and (#rows > 0) then tab:node(title) end if #rows > 0 then for i, j in pairs (rows) do tab:node(j) end end tab:allDone() return tab end local function buildmap(params) -- A faire local image = 'France_location_map-Regions_and_departements.svg' local image2 = 'France_location_map-Regions_and_departements.svg' local map1 = mw.html.create('div') :addClass("geobox") :tag('table') :addClass('DebutCarte') :attr({border="0", cellspacing="0", cellpadding="0"}) :css({margin = '0', border = 'none', padding = '0', ['text-align'] = 'center'}) :tag('tr') :tag('td') :tag('div') :css({position= 'relative', margin = "auto"}) :wikitext('[[Fichier:' .. image .. '|alt=(Voir situation sur carte : [[{{Géolocalisation/{{{1}}}|name|{{{type|}}}}}]])|{{{alt}}}]]') :done() :done() :done() :done() local map1 = mw.html.create('div') :addClass("geobox") :tag('table') :addClass('DebutCarte') :attr({border="0", cellspacing="0", cellpadding="0"}) :css({margin = '0', border = 'none', padding = '0', ['text-align'] = 'center'}) :tag('tr') :tag('td') :tag('div') :css({position= 'relative', margin = "auto"}) :wikitext('[[Fichier:' .. image2 .. '|250px|(Voir situation sur carte : [[{{Géolocalisation/{{{1}}}|name|{{{type|}}}}}]])|{{{alt}}}]]') :done() :done() :done() :done() local div = mw.html.create('div') :addClass("img_toogle") :node(map1):done() :node(map2):done() :allDone() return div end local function buildfooter(params) if not params then params = {} end local class = params.class or 'navbar noprint' local style = params.style or {border = "1px"} local backlinktext = '[' .. tostring( mw.uri.fullUrl( pagename, '&action=edit§ion=0' ) ) .. ' ' .. i18n['edit infobox'] .. ']' local backlink = mw.html.create('td') :wikitext(backlinktext) :addClass('plainlinks') :done() local itemlinktext = '' if item then itemlinktext = '[[d:' .. item.id .. '|' .. i18n['edit item'] .. ']]' end local itemlink = mw.html.create('td') :wikitext(itemlinktext) :done() local doclinktext = '[[Image:Gtk-dialog-info.svg|12px|link=' .. infoboxname .. '|' .. i18n['see doc'] .. ']]' local doclink = mw.html.create('td') :css({['text-align'] = "right"}) :wikitext(doclinktext) :done() local footer = mw.html.create('table') :tag('tr') :css({['font-size'] = '80%'}) :node(backlink) :node(itemlink) :node(doclink) :done() :done() return footer end function p._build(localinfoboxmodule) -- analyse le module d'infobox local style = localinfoboxmodule.style or {} local class = localinfoboxmodule.class or "infobox_v3" local parts = localinfoboxmodule.parts local footerparams = localinfoboxmodule.footer or {} infobox:css(style) infobox:addClass(class) for i, j in pairs(parts) do if type(j) ~= 'table' then return 'error' elseif j.type == 'title' then infobox:node(buildtitle(j)) elseif j.type == 'images' then infobox:node(buildimages(j)) elseif j.type == 'text' then infobox:node(buildtext(j)) elseif j.type == 'map' then infobox:node(buildmap(j)) elseif j.type == 'table' then infobox:node(buildtable(j)) end end local div = mw.html.create('div') infobox:node(div):node(tab) infobox :node(buildfooter(footerparams)) :done() return tostring(infobox) .. maintenance end function p.build(frame) -- set variables infoboxname = 'Module:InfoboxBuilder/' .. frame.args.nom localinfoboxmodule = require(infoboxname) -- get the localinfoboxmodule parameter values and clen them up for i, j in pairs(frame:getParent().args) do if j and mw.text.trim(j) ~= '' then localdata[i] = j end end -- fetch wikidata item and assign it to the item global variable if localdata.wikidata == 'non' then item = nil elseif (not localdata.wikidata) or (localdata.wikidata == '') then item = mw.wikibase.getEntityObject() else item = mw.wikibase.getEntityObject() -- todo: fetch arbitrary item and check for errors end -- build infobox return p._build(localinfoboxmodule) end return p