Modul:Curlingbox
Vzhled
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;