Module:Fiche de créature

De Les Archives de Vault-Tec
Documentation du module

Ce module est un générateur de fiche de créature dont la structure est définie dans sous-module. Structurellement, il s'agit d'une réadaptation du module Infobox.

Usage[modifier le wikicode]

build(frame) est la seule fonction exportable. Elle ne prend en entrée que le paramètre nom, le nom du sous-module dans lequel est défini la structure de la fiche de créature.

Par exemple le modèle {{Fiche de créature de Fallout}}} contient {{#invoke:Fiche de créature|build|nom=Fallout}}, indiquant qu'il faut charger Module:Fiche de créature/Fallout. Les paramètres passés au modèle sont disponibles dans Module:Fiche de créature/Localdata qui lui-même peut être appelé dans les sous-modules pour générer des structures plus complexes.

Structure du sous-module[modifier le wikicode]

La structure de la fiche de créature est définie par une table contenue dans un sous-module dont le format est le suivant.

{
    parts = {} -- contient les différentes parties de la fiche de créature
}

La table parts contient elle-même d'autres tables qui définissent le type de structure à générer. Il est possible de définir deux types de structure, des tableaux ou des listes.

Table
{ type = "table", title = "", rows = {} }
Paramètre Type Obligatoire Description
title string Non Un en-tête pour le tableau
rows table Oui Table contenant des tables de type row et qui définissent les lignes du tableau à générer
{ type = "row", label = "", icon = "", value = "" }
Paramètre Type Obligatoire Description
label function
string
Oui Le libellé de la ligne
icon string Oui Nom d'une icône définie dans le modèle {{Icône}}.
value function
string
Oui Paramètre que l'utilisateur renseignera.
Liste
{ type = "list", title = "", prefix = "", max = 0 }
Paramètre Type Obligatoire Description
title string Oui Un en-tête pour la liste
prefix string Oui Préfixe du paramètre pour les éléments de la liste
max number Oui Nombre maximal d'éléments dans la liste
Documentation transclues de Module:Fiche de créature/doc.
local p = {}

-- données concernant les paramètres passés au modèle
local localdata = {}

-- Icônes utilisées pour illustrer chaque donnée
local icons = require( 'Module:Icône' )

local function getValue(value, part)
	if type(value) == 'string' then
		return localdata[value]
	elseif type(value) == 'function' then
		return value(localdata, part)
	elseif type(value) == 'table' then
        -- si plusieurs paramètres possibles (legacy de vieux code), prendre le premier non vide
        -- à retirer une fois les fiches au propre
		for i, j in pairs(value) do
			if localdata[j] then
				return localdata[j]
			end
		end
	end
end

function p.builditem(part)
	local value, number = getValue(part.value, part)
	
	if not value then
		value = part.defaultvalue
		if not value then
			return nil
		end
	end
	
	local item = mw.html.create('dd')
		:wikitext(value)
		:done()
	
	return item
end

function p.buildlist(part)
	local title = part.title
	local prefix = part.prefix
	local maxitems = part.max
	
	if not title or not prefix or not maxitems then
		return nil
	end

	-- create items
	local items = {}
	for i = 1, maxitems do
		local v = p.builditem({ value = prefix..i })
		if not v then
			break
		end
		table.insert(items, v)
	end
	if #items == 0 then
		return nil
	end

	-- create list
	local list = mw.html.create('dl')
		:addClass('creature-card-list')
		:tag('dt')
			:wikitext(title)
			:done()
	
	for i, j in pairs(items) do
		list:node(j)
	end
	
	list:allDone()
	return list
end

function p.buildrow(part)
	local icon = part.icon
	local label = part.label
	local value, number = getValue(part.value, part)
	
	if type(label) == 'function' then
		label = label(localdata, localdata.item)
	end
	if not value then
		value = part.defaultvalue
	end
	
	if value == nil or label == nil or icon == nil then
		return nil
	end
	
	icon = icons._build({ icon })
	
	local row = mw.html.create('tr')
		:tag('th')
			:attr('scope', 'row')
			:wikitext(icon .. ' ' ..label)
			:done()
		:tag('td')
			:tag('div')
				:wikitext('\n' .. value)
				:done()
			:allDone()
		:done()
	
	return row
end

function p.buildtable(part)
	local tab = mw.html.create('table')
		:addClass('creature-card-table')

	local rows = part.rows
	
	if not rows then
		return nil
	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 part.title then
		title = mw.html.create('caption')
			:attr({ colspan = '2' })
			:wikitext(part.title)
			:done()
	end
	
	if title then
		tab:node(title)
	end
	
	for i, j in pairs(rows) do
		tab:node(j)
	end
	
	tab:allDone()
	return tab
end

function p.buildblock(block)
	if type(block) == 'function' then
		block = block(localdata)
	end

	-- Liste des types de block acceptés
	local blocktypes = {
		['table'] = p.buildtable,
		['row'] = p.buildrow,
		['list'] = p.buildlist,
	}
	
	return blocktypes[block.type](block) 
end

function p.build(args)
	localdata = require('Module:Fiche de créature/Localdata')
	
	-- chargement du module de paramétrage
	local moduledata = require('Module:Fiche de créature/' .. localdata.modulename)
	moduledata.name = localdata.modulename
	
	local card = mw.html.create('div')
		
	for i, j in pairs(moduledata.parts) do
		card:node(p.buildblock(j))
	end
	
	return tostring(card)
end

return p