Přeskočit na obsah

Modul:Curlingbox

Z Wikipedie, otevřené encyklopedie

Dokumentaci tohoto modulu lze vytvořit na stránce Modul:Curlingbox/Dokumentace

local function CreateErrorText(code,info)
	-- 1 = Chyba v parametru "endy"; 2 = Chyba v parametru "body 1" ; 3 = Chyba v parametru "body 2" 
	local text = ''
	if code == 1 then
		text = '<strong class="Error">Chyba! Neplatná hodnota pro paramertr "endy"! ("'.. info .. '")</strong>'
		text = text .. '<span style="display:none;">[[Šablona:Curlingbox/Chyba/endy]]</span>';
	elseif code == 2 then
		text = '<strong class="Error">Chyba! Neplatná hodnota pro paramertr "body 1"! ("'.. info .. '")</strong>'
		text = text .. '<span style="display:none;">[[Šablona:Curlingbox/Chyba/body]]</span>';
	elseif code == 3 then
		text = '<strong class="Error">Chyba! Neplatná hodnota pro paramertr "body 2" ("'.. info .. '")</strong>'
		text = text .. '<span style="display:none;">[[Šablona:Curlingbox/Chyba/body]]</span>';
	end
	return text;
end

local p = {}

	function p.Execute(frame)
		local args = (require 'Modul:Arguments').getArgs(frame, {
			frameOnly = true,
			removeBlanks = true,
		})
		local Text     = "";
		local temptext = "";
		local Sheet    = args['skupina'] or 'Tým';
		local Ends     = tonumber(mw.text.trim(args['endy'] or '10'));
		local Hammer   = tonumber(mw.text.trim(args['LS'] or '3'));
		local Team1    = args['tým 1'] or 'tým 1';
		local Team2    = args['tým 2'] or 'tým 2';
		local Points1  = args['body 1'] or '0000000000';
		local Points2  = args['body 2'] or '0000000000';
		local Winner   = 0;
		local Total1   = 0;
		local Total2   = 0;
		local Value    = 0;
		local Calc     = "";
		local Lossbytime = 0; -- pokud je překročen čas 1 nebo 2
		if Ends < 4 or Ends > 20 then
			Text = CreateErrorText(1, tostring(Ends));
			return Text;
		end
		-- Points1 a Points2 mohou obsahovat pouze znaky ASCII. Takže normální funkce řetězců jsou dostačující
		Points1 = string.upper(Points1);
		Points2 = string.upper(Points2);
		--[=[
		Test platnosti Points1 a Points2:
		Při kopírování řetězce (temptext) jsou odstraněny všechny povolené znaky.
		Pokud je řetězec prázdný, je původní řetězec v pořádku.
		]=]
		-- tbl obsahuje pouze povolené znaky
		local tbl = {'0','1','2','3','4','5','6','7','8','X','T'}; 
		temptext = Points1;
		for idx = 1, #Points1 do
			Calc = mw.ustring.sub(Points1,idx,idx) or '?';
			for i, z in ipairs(tbl) do
				if Calc == z then
					temptext = mw.ustring.gsub(temptext, z,'');
				end
			end
		end
		if temptext ~='' then
			Text = CreateErrorText(2,temptext);
			return Text;
		end
		temptext = Points2;
		for idx = 1, #Points2 do
			Calc = mw.ustring.sub(Points2,idx,idx) or '?';
			for i, c in ipairs(tbl) do
				if Calc == c then
					temptext = mw.ustring.gsub(temptext, c,'');
				end
			end
		end
		if temptext ~='' then
			Text = CreateErrorText(3,temptext);
			return Text;
		end
		-- Přidány 'X' pro případ, že by nebylo vyplněno dostatečné množství hodnot
		Points1 = Points1 .. 'XXXXXXXXXX';
		Points2 = Points2 .. 'XXXXXXXXXX';
		--[=[ Struktura výstupního textu, třířádková tabulka HTML.
		Protože vítěz je určen až po vyhodnocení Points1 a Points2
		a teprve poté se určí, která buňka je zobrazena tučně, přichází
		konec řádku na začátku řetězce
		]=]
		-- Řádky jsou sestaveny po jednotlivých sloupcích
		local Row0 = '<tr><th style="background:#ffffcc;width:21em;">' .. tostring(Sheet) .. '</th>';
		local Row1 = '';
		local Row2 = '';
		if Hammer == 1 then
			Row1 = Row1 .. ' <small>[[Soubor:Hammer icon.svg|20px|Kladivo (Poslední kámen prvního endu)|link=]]</small></td>';
			Row1 = Row1 .. '</td>';
		elseif Hammer == 2 then
			Row1 = Row1 .. '</td>';
			Row2 = Row2 .. ' <small>[[Soubor:Hammer icon.svg|20px|Kladivo (Poslední kámen prvního endu)|link=]]</small></td>';
		else
			Row1 = Row1 .. '</td>';
			Row2 = Row2 .. '</td>';
		end
		for idx= 1 , Ends do
		if idx < 10 then 
			Row0 = Row0 .. '<th style="background:#ffffcc;width:0.3em;">' .. tostring(idx) .. '</th>';
		else
			Row0 = Row0 .. '<th style="background:#ffffcc;width:0.6em;">' .. tostring(idx) .. '</th>';
		end
		Calc = string.sub(Points1,idx,idx) or '?';
		if Winner == 0 and Calc == 'T' then 
			-- Týmu 1 vypršel časový limit
			Winner = 2;
			Lossbytime = 1;
		end
		Row1 = Row1 .. '<td>' .. Calc .. '</td>';
		Value = tonumber(Calc) or 0;   -- 'X' nebo 'T' má hodnotu nula.
		Total1 = Total1 + Value;
		Calc = string.sub(Points2,idx,idx) or '?';
		if Winner == 0 and Calc == 'T' then
			-- Týmu 2 vypršel časový limit
			Winner = 1;
			Lossbytime = 2;
		end
		Row2 = Row2 .. '<td>' .. Calc .. '</td>';
		Value = tonumber(Calc) or 0;   -- 'X' nebo 'T' má hodnotu nula.
		Total2 = Total2 + Value;
		end
		if Lossbytime == 0 and  Total1 > Total2 then
			Winner = 1;
		elseif Lossbytime == 0 and  Total1 < Total2 then
			Winner = 2;
		end
		if Lossbytime == 1 then
			Total1 = '<span style="color:#FF0000;">T</span>';
			Total2 = '-';
		elseif Lossbytime == 2 then
			Total1 = '-';
			Total2 = '<span style="color:#FF0000;">T</span>';
		end
		Row0 = Row0 .. '<th style="background:#ffffcc;white-space:nowrap;width:3em;">Celkem</th></tr>'; 
		Row1 = Row1 .. '<td><b>' .. tostring(Total1) .. '</b></td></tr>';
		Row2 = Row2 .. '<td><b>' .. tostring(Total2) .. '</b></td></tr>';
		if Winner == 1 then
			Row1 = '<tr><td style="text-align:left; white-space:nowrap;"><b>' .. Team1 .. '</b>' .. Row1;
		else
			Row1 = '<tr><td style="text-align:left; white-space:nowrap;">' .. Team1 .. Row1;
		end
		if Winner == 2 then
			Row2 = '<tr><td style="text-align:left; white-space:nowrap;"><b>' .. Team2 .. '</b>' .. Row2;
		else
			Row2 = '<tr><td style="text-align:left; white-space:nowrap;">' .. Team2 .. Row2;
		end
		-- Dá dohramady jednotlivé řádky
			Text = '<table class="wikitable" style="text-align: center;">' .. Row0 .. Row1 .. Row2 .. '</table>';
		return Text;
	end;

	-- Funkce pro případ, že je znám pouze výsledek.
	-- Volejte pomocí „Šablona:Curlingbox/Výsledek“
	function p.Result(frame)
		local args = (require 'Modul:Arguments').getArgs(frame, {
			frameOnly = true,
			removeBlanks = true,
		})
		local Text    = "";
		local Sheet   = args['skupina'] or 'Tým';
		local Team1   = args['tým 1'] or 'tým 1';
		local Team2   = args['tým 2'] or 'tým 2';
		local Points1 = args['body 1'] or 0;
		local Points2 = args['body 2'] or 0;
		local Total1  = '';
		local Total2  = '';
		-- Points1 a Points2 mohou obsahovat pouze znaky ASCII. Takže normální funkce řetězců jsou dostačující
		Points1 = string.upper(Points1);
		Points2 = string.upper(Points2);
		-- Zvláštní případ timeoutu
		if string.sub(Points1,1,1) == 'T' then
			Total1 = '<span style="color:#FF0000;">T</span>';
			Total2 = '-';
			Team2 = '<b>' .. Team2 .. '</b>';
		elseif string.sub(Points2,1,1) == 'T' then
			Total1 = '-';
			Total2 = '<span style="color:#FF0000;">T</span>';
			Team1 = '<b>' .. Team1 .. '</b>';
		else
			-- Platnost je testována numerickým hodnocením. V případě chyby -1
			Total1 = tonumber(Points1) or -1;
			if Total1 < 0 then
				Text = CreateErrorText(2,tostring(Points1));
				return Text;
			end
			Total2 = tonumber(Points2) or -1;
			if Total2 < 0 then
				Text = CreateErrorText(3,tostring(Points2));
				return Text;
			end
			if Total1 < Total2 then
				Total1 =  tostring(Total1)
				Total2 = '<b>'.. tostring(Total2) .. '</b>'
				Team2 = '<b>'.. Team2 .. '</b>'
			elseif  Total1 > Total2 then
				Total1 = '<b>'.. tostring(Total1) .. '</b>'
				Team1 = '<b>'.. Team1 .. '</b>'
				Total2 = tostring(Total2);
			else
				Total1 = tostring(Total1);
				Total2 = tostring(Total2);
			end;
		end;
		-- Dá dohramady tabulku
		Text = '<table class="wikitable" style="text-align: center;"><tr><th style="background:#ffffcc;width:21em;">' .. Sheet .. '</th><th style="background:#ffffcc;width:3em;">Celkem</th></tr><tr><td style="text-align:left; white-space:nowrap;">' .. Team1 .. '</td><td>' .. Total1 .. '</td></tr><tr><td style="text-align:left; white-space:nowrap;">' .. Team2 .. '</td><td>' .. Total2 .. '</td></tr></table>';
		return Text;
	end;

return p;