Dokumentācijas ikona Moduļa dokumentācija[izveidot]
Builder = {}
local datamodule =  require('Module:Wikidata/fr')

function Builder:build( conf, frame, templatename )
    --Object initialisation
    local object = {
        frame = frame,
        infobox = nil
    }
    item = nil -- variable globale
	if frame.args.wikidata ~= 'non' then
		item = mw.wikibase.getEntity() -- devrait devenir l'ID de l'éléménet Wikiata quand ce sera possible
	end
	templatename = conf.templatename
	
    setmetatable(object, {
        __index = Builder,
        __tostring = function( self ) return tostring( self.infobox ) end
    })

    -- Création de l'infobox    
    local infoboxModule = require 'Module:Frwiki infokaste'
    object.infobox = infoboxModule.new( conf ) 

    --Ajout des éléments de l'infobox
    for i, part in pairs( conf.parts ) do
        object:buildElement( part )
    end
    
    -- Footer
    local itemid = nil 
	if item then
		itemid = item.id 
	end --apparemment nécessaire de faire ça sur cette page, peut-être à cause des problèmes de transclusion Wikidata
	object:buildElement({type= 'footer', item = itemid, templatename = templatename })
    return tostring( object.infobox )
end

function Builder:buildElement( conf )
    if not conf.type then
        self.infobox:addText( { text = '<span class="error">Vous devez donnez un "type" à chaque élément de l\'infobox</span>' } )
        return
    end

    if conf.type == 'title' then
        self:buildTitle( conf )
    elseif conf.type == 'table' then
        self:buildTable( conf )
    elseif conf.type == 'images' then
        self:buildImages( conf )
    elseif conf.type == 'text' then
        self:buildText( conf )
    elseif conf.type == 'footer' then
    	self:buildFooter( conf )
    else
        self.infobox:addText( { text = '<span class="error">Le type ' .. conf.type .. ' est inconnu</span>' } )
    end
end

function Builder:buildTitle( conf )
    conf.text = self:getValueForParam(conf.value, conf.default, conf.wikidata, conf.property)
    conf.background = self:getValueForParam(conf.background)
    self.infobox:addTitle( conf )
end

function Builder:buildTable( conf )
	-- if then  -- si la table contient une autre table
	-- 	self:buildTable( conf )
	-- else
        self.infobox:openTable( conf )
        if conf.rows then
            for i, row in pairs( conf.rows ) do
                self:buildRow( row )
            end
        end
    -- end
    self.infobox:closeTable( {} )
end

function Builder:buildImages( conf )
    if not conf.images then
        self.infobox:addText( { text = '<span class="error">Vous devez remplire le paramètre images de la configuration</span>' } )
        return
    end

    local imagesConf = {}
    for i,imconf in pairs( conf.images ) do
	    imconf.name = self:getValueForParam( imconf.value, imconf.default, imconf.wikidata, imconf.property )
        table.insert( imagesConf, imconf )
    end
    conf.images = imagesConf

    conf.legend = self:getValueForParam( conf.legendText, legenddDefault )

    self.infobox:addImages( conf )
end

function Builder:buildRow( conf )
    if not conf.type then
        self.infobox:addText( { text = '<span class="error">Vous devez donnez un "type" à chaque ligne de l\'infobox</span>' } )
        return
    end
    if conf.type == 'mixed' then
        self:buildMixedRow( conf )
    elseif conf.type == 'doubled' then
    	self:buildDoubledRow( conf )
    elseif conf.type == 'text' then
        self:buildText( conf )
    else
        self.infobox:addText( { text = '<span class="error">Le type ' .. conf.type .. ' est inconnu</span>' } )
    end
end

function Builder:buildFooter(conf)
	self.infobox:addFooter(conf)
end 

function Builder:buildMixedRow( conf )
    conf.value = self:getValueForParam(conf.value, conf.default, conf.wikidata, conf.property )
    self.infobox:addMixedRow( conf )
end

function Builder:buildDoubledRow( conf )
    conf.value = self:getValueForParam(conf.value, conf.default, conf.wikidata, conf.propety )
    self.infobox:addDoubledRow( conf )
end

function Builder:buildText( conf )
    if not conf.value then
        self.infobox:addText( { text = '<span class="error">Vous devez renseigner le paramètre "text"</span>' } )
        return
    end
    conf.text = self:getValueForParam( conf.value, conf.default, conf.wikidata, conf.property )
    self.infobox:addText( conf )
end

function Builder:getValueForParam( value, default, wikidata, property )
-- valeur donnée dans le Wikitexte 
    if type(value) == 'function' then
    	local val = value(self.frame)
    	if val and val ~= '' then 
    		return val
    	end
    end
    if type(value) == 'string' then
    	local val = self.frame.args[value]
    	if val and val ~= '' then
    		return val
    	end
	end
-- par défaut, cherche sur Wikidata
	if item and wikidata then
		return wikidata
	end
	if item and property then
		return datamodule._formatStatements({property= property, item = item, separator = ', ', conjunction = ', '})
	end
	if default then
		return default
	end
end

local p = {}
function p.build( frame )
    if not frame.args.nom then
        return '<span class="error">Infobox inconnu</span>'
    end
    local conf = require('Module:InfoboxBuilder/' .. frame.args.nom)
    if not conf then
        return '<span class="error">Erreur lors du chargement de' .. templatename .. ']]</span>'
    end
    newframe = frame:getParent()
   	conf.templatename = newframe:getTitle()
    return Builder:build( conf, newframe )
end
return p