Aller au contenu

Module:Cartel d'art/dimensions

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 8 juillet 2024 à 19:17 et modifiée en dernier par Al12si (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[créer] [purger]
-- vi: set sw=4 ts=4 ai sm noet:
--
-- Module:Cartel d'art/dimensions
--
-- Ce module vise à faciliter le mis en forme des dimensions d'un œuvre d'art,
-- p. ex. 123 × 234 × 345 cm
--
-- Ce format est expliqué dans le document suivant :
-- https://artexte.ca/app/uploads/2017/02/guidecitation_oeuvres.pdf

require ('strict');
local p = {};

p.insec = mw.ustring.char(0xa0);	-- espace insecable
p.langue = mw.getContentLanguage();

p.symboles = {
	['mm'] = true;
	['cm'] = true;
	['m'] = true;
	['km'] = true;
};

local function formatNum (n)
	local it = mw.ustring.gsub(p.langue:formatNum(n), '% ', p.insec);	-- v. Ramat 11e édition p. 145
	return it;
end

local function cat (a, b)
	local it;
	if not b then
		it = a;
	elseif a then
		it = a .. p.insec .. '×' .. p.insec .. formatNum(b);	-- p. 193
	else
		it = formatNum(b);
	end
	return it;
end

p.main = function (frame)
	local parent = frame:getParent();
	local it;

	local hauteur, largeur, profondeur, unite;
	for _, a in pairs({frame, parent}) do
		if a then
			local exposant_prevu = false;
			for k, v in pairs(a.args) do
				v = v:gsub('^%s+', ''):gsub('%s+$', '');
				if type(k) == 'number' then
					if exposant_prevu then
						error("Exposant non prévu dans les cartels d'art");
					elseif v:match('^[a-zA-ZŰ]+$') then
						unite = v;
						exposant_prevu = true;
					elseif k == 1 then
						hauteur = v;
					elseif k == 2 then
						largeur = v;
					elseif k == 3 then
						profondeur = v;
					elseif k == 4 then
						error('Trop de dimensions, paramètre « ' .. v .. ' » non prévu');
					end
				elseif k == 'hauteur' then
					hauteur = v;
				elseif k == 'largeur' then
					largeur = v;
				elseif k == 'profondeur' then
					profondeur = v;
				elseif k == 'unité' then
					unite = v;
				else
					error('Paramètre « ' .. k .. ' » inconnu');
				end
			end
		end
	end
	if not hauteur and not largeur and not profondeur then
		error('Dimension.s manquante.s');
	elseif not unite then
		error('Unité manquante');
	end
	if hauteur then
		it = cat(it, p.langue:parseFormattedNumber(hauteur));
	end
	if largeur then
		it = cat(it, p.langue:parseFormattedNumber(largeur));
	end
	if profondeur then
		it = cat(it, p.langue:parseFormattedNumber(profondeur));
	end
	if p.symboles[unite] then
		it = it .. p.insec .. unite;	-- v. Ramat p. 193
	else
		it = it .. ' '.. unite;
	end
	return it;
end

p.test = function ()
	local a, b;

	assert(formatNum(123) == '123');
	assert(formatNum(123.4) == '123,4');

	b = formatNum(1234);
	assert(b ~= '1234' and mw.ustring.match(b, '^1.234$'));

	-- figure out what kind of space formatNum is giving us
	local sp = mw.ustring.gsub(formatNum(11111), '1', '');

	-- émuler {{#invoke:Cartel d'art/dimensions|main}} (aucun paramètre)
	-- résultat prévu: erreur (Dimension.s manquante.s)
	a, b = pcall(p.main, {
		['getParent'] = function ()
			return {
				extensionTag = function () return '' end;
				args= {
				};
			};
		end;
		extensionTag = function () return '' end;
		args = {
		};
	});
	assert(not a and b:match('Dimension.s manquante.s'));

	-- émuler {{#invoke:Cartel d'art/dimensions|main|123}}
	-- résultat prévu: erreur (Unité manquante)
	a, b = pcall(p.main, {
		['getParent'] = function ()
			return {
				extensionTag = function () return '' end;
				args= {
				};
			};
		end;
		extensionTag = function () return '' end;
		args = {
			'123'
		};
	});
	assert(not a and b:match('Unité manquante'));

	-- émuler {{#invoke:Cartel d'art/dimensions|main|123|cm}}
	-- résultat prévu: 123 cm
	a, b = pcall(p.main, {
		['getParent'] = function ()
			return {
				extensionTag = function () return '' end;
				args= {
				};
			};
		end;
		extensionTag = function () return '' end;
		args = {
			'123',
			'cm'
		};
	});
	assert(a and b == '123' .. p.insec .. 'cm');

	-- émuler {{#invoke:Cartel d'art/dimensions|main|123|234|cm}}
	-- résultat prévu: 123 × 234 cm
	a, b = pcall(p.main, {
		['getParent'] = function ()
			return {
				extensionTag = function () return '' end;
				args= {
				};
			};
		end;
		extensionTag = function () return '' end;
		args = {
			'123',
			'234',
			'cm'
		};
	});
	assert(a and b == '123' .. p.insec .. '×' .. p.insec .. '234' .. p.insec .. 'cm');

	-- émuler {{#invoke:Cartel d'art/dimensions|main|12|34|56|m}}
	-- résultat prévu: 12 × 34 × 56 m
	a, b = pcall(p.main, {
		['getParent'] = function ()
			return {
				extensionTag = function () return '' end;
				args= {
				};
			};
		end;
		extensionTag = function () return '' end;
		args = {
			'12',
			'34',
			'56',
			'm'
		};
	});
	assert(a and b == '12' .. p.insec .. '×' .. p.insec .. '34' .. p.insec .. '×' .. p.insec .. '56' .. p.insec .. 'm');

	-- émuler {{#invoke:Cartel d'art/dimensions|main|largeur=1234|mm}}
	-- résultat prévu: 1 234 mm
	a, b = pcall(p.main, {
		['getParent'] = function ()
			return {
				extensionTag = function () return '' end;
				args= {
				};
			};
		end;
		extensionTag = function () return '' end;
		args = {
			'1234',
			'mm'
		};
	});
	assert(a and b == '1' .. sp .. '234' .. p.insec .. 'mm');

	-- émuler {{#invoke:Cartel d'art/dimensions|main|hauteur=12|pieds}}
	-- résultat prévu: 12 pieds (espace secable)
	a, b = pcall(p.main, {
		['getParent'] = function ()
			return {
				extensionTag = function () return '' end;
				args= {
				};
			};
		end;
		extensionTag = function () return '' end;
		args = {
			'12',
			'pieds'
		};
	});
	assert(a and b == '12 pieds');
end

p.formatNum = formatNum;
return p