Prvni commit.

This commit is contained in:
vojta@alfred
2026-02-01 00:00:07 +01:00
commit 4e5c55e846
213 changed files with 17991 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - funkce pro použití XMLHttpRequest (AJAX)
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Hlavní objekt
ajax = new Object();
// Typ používané metody pro AJAX
ajax.typ_metody = new Object();
ajax.typ_metody.NIC = 0;
ajax.typ_metody.JAVASCRIPT = 1;
ajax.typ_metody.ACTIVEX = 2;
// Nalezená metoda pro AJAX
ajax.metoda = ajax.typ_metody.NIC;
// ===========================================================================
// =~ Základní práce se soubory ~=============================================
// Zjištění podporované metody
ajax.zjisti_metodu = function ()
{
ajax.metoda = ajax.typ_metody.NIC;
try {
if ( window.XMLHttpRequest ) {
var nahravac = new XMLHttpRequest();
if ( nahravac ) {
ladici_vypis(LADENI, "ajax",
"nalezen javascriptový XMLHttpRequest");
ajax.metoda = ajax.typ_metody.JAVASCRIPT;
}
} else if ( window.ActiveXObject ) {
var nahravac = new ActiveXObject("Microsoft.XMLHTTP");
if ( nahravac ) {
ladici_vypis(LADENI, "ajax", "nalezen ActiveX objekt XMLHTTP");
ajax.metoda = ajax.typ_metody.ACTIVEX;
}
}
} catch (e) {}
if ( ajax.metoda == ajax.typ_metody.NIC ) {
ladici_vypis(CHYBA, "ajax", "nenalezena vhodná metoda");
}
return ajax.metoda;
}
// Vrátí true, pokud je možné použít metodu XMLHttpRequest
ajax.je_funkcni = function ()
{
return (ajax.metoda != ajax.typ_metody.NIC);
}
// Vytvoření nahrávače
ajax.vrat_nahravac = function ()
{
try {
if ( ajax.metoda == ajax.typ_metody.JAVASCRIPT ) {
return new XMLHttpRequest();
} else if ( ajax.metoda == ajax.typ_metody.ACTIVEX ) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
} catch (vse) {}
return undefined;
}
// Nahrání souboru
ajax.nahraj_soubor = function (nahravac, url, notifikace, asynchronne)
{
if ( nahravac ) {
try {
if ( notifikace ) {
nahravac.onreadystatechange = notifikace;
}
nahravac.open("GET", url, asynchronne);
nahravac.send(null);
return nahravac;
} catch (vse) {
return undefined;
}
} else {
return undefined;
}
}
// Nahrání souboru asynchronně
ajax.nahraj_soubor_pozdeji = function (nahravac, url, notifikace)
{
return this.nahraj_soubor(nahravac, url, notifikace, true);
}
// Zkontrolování podporované metody
ajax.kontrola_metody = function ()
{
if ( ajax.zjisti_metodu() == ajax.typ_metody.NIC ) {
alert(
"Nepodařilo se nalézt vhodnou metodu pro nahrávání souborů.\n\n" +
"Funkce spojování slovníku nebude dostupná."
);
}
}
+45
View File
@@ -0,0 +1,45 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - kódování odkazů do dokumentu
var kodovany_mail = [ "oldium", "pro", "seznam", "cz" ];
if ( typeof(je_oldium_dot_home) == "undefined" ) {
je_oldium_dot_home = false;
if ( /^https?:\/\/[^\/]+\.oldium\.home\//.exec(document.URL) ) {
je_oldium_dot_home = true;
}
}
function dekoduj_mail() {
return kodovany_mail[0] + "." + kodovany_mail[1] + "@" +
kodovany_mail[2] + "." + kodovany_mail[3];
}
function obnov_odkazy() {
var odkazy = document.getElementsByTagName("a");
var muj_mail = dekoduj_mail();
for ( var i = 0; i < odkazy.length; i++ ) {
if ( odkazy[i].href == "mailto:" ) {
odkazy[i].href = "mailto:" + muj_mail;
} else {
if ( je_oldium_dot_home ) {
var novy_odkaz = odkazy[i].href.replace(
/^(https?:\/\/[^\/]+\.oldium)\.net\//, "$1.home/" );
odkazy[i].href = novy_odkaz;
}
if ( typeof(verze_karla) != "undefined" ) {
var odkaz_verze = odkazy[i].href.replace(
/karel-VERZE/, "karel-" + verze_karla );
odkazy[i].href = odkaz_verze;
}
}
}
}
+226
View File
@@ -0,0 +1,226 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - funkce konzole pro ladění
// ===========================================================================
// =~ Globální nastavení ~====================================================
// Maximální počet řádek ve výpisu
// TODO: Nastavení v uživatelském rozhraní
nastaveni.pocet_radek_vypisu = 120;
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Informace o vypisu
vypisy = new Object();
// Aktuální počet řádek výpisu
vypisy.pocet_radek = 0;
// Sledování myši
vypisy.stisknute = false;
// Výpis v obráceném pořadí (novější první)
vypisy.obracene = true;
// Úrovně ladicích výpisů
CHYBA = 1; // Činnost nelze provést a uživatel nebyl informován
VAROVANI = 2; // Činnost nelze provést, ale uživatel byl informován
INFORMACE = 3; // Informace o provedené (!) činnosti
DETAIL = 4; // Detailní informace o činnosti
LADENI = 5; // Ladicí infomace pro vývojáře
vypisy.nazvy_urovni = new Array(
"chyba",
"varování",
"informace",
"detail",
"ladění"
);
// Nastavená úrovně výpisů
var uroven = unescape(hodnota_cookie("uroven_ladeni"));
for ( var i = 0; i < vypisy.nazvy_urovni.length; i++ ) {
if ( uroven == vypisy.nazvy_urovni[i] ) {
vypisy.uroven = i+1;
break;
}
}
if ( vypisy.uroven == undefined ) {
if ( je_oldium_dot_home ) {
vypisy.uroven = DETAIL;
} else {
vypisy.uroven = INFORMACE;
}
}
// Nápověda k nastavení hloubky výpisů
vypisy.uroven_tooltip = new Array(
[ "Úroveň chyb", "Zapisuj pouze chyby" ],
[ "Uroveň varování", "Zapisuj chyby a varování" ],
[ "Úroveň informací", "Zapisuj chyby, varování a informativní zprávy" ],
[ "Úroveň detailů",
"Zapisuj chyby, varování, informativní a detailní zprávy" ],
[ "Úroveň pro vývojáře", "Zapisuj všechny informace pro vývojáře" ]
);
vypisy.zobrazeni_tooltip = new Array(
[ "Ladicí konzola", "Zobraz ladicí konzolu" ],
[ "Ladicí konzola", "Skryj ladicí konzolu" ]
);
// Objekt pro práci s myší
vypisy.mys = new Mys(new Tooltip());
vypisy.mys.tooltip.muzu_zobrazit = function (info, detail) { return true; }
// ===========================================================================
// =~ Funkce pro operace s konzolí ~==========================================
function ladici_vypis(uroven, funkce, info, text)
{
if ( uroven > vypisy.uroven ) return;
var konzola = document.getElementById("konzola");
if ( !konzola ) return;
if ( vypisy.pocet_radek == nastaveni.pocet_radek_vypisu ) {
if ( ! vypisy.obracene ) {
// Smaž první řádku ve výpisu
konzola.removeChild(konzola.firstChild); // Text
konzola.removeChild(konzola.firstChild); // <BR />
vypisy.pocet_radek--;
} else {
// Smaž poslední řádku ve výpisu
konzola.removeChild(konzola.lastChild); // <BR />
konzola.removeChild(konzola.lastChild); // Text
vypisy.pocet_radek--;
}
}
if ( text == undefined ) {
text = info;
info = undefined;
}
var cas = formatuj_text(new Date());
if ( info != undefined ) {
info = formatuj_text(info);
}
var element_radka = document.createElement("SPAN");
var element_cas = element_radka.cloneNode(false);
var element_uroven = element_radka.cloneNode(false);
var element_funkce = element_radka.cloneNode(false);
if ( info != undefined ) var element_info = element_radka.cloneNode(false);
var element_text = element_radka.cloneNode(false);
var element_mezera = document.createTextNode("\u00A0"); // &nbsp;
var element_br = document.createElement("BR");
// Text
element_cas.appendChild(document.createTextNode(cas));
element_funkce.appendChild(document.createTextNode(funkce));
element_uroven.appendChild(document.createTextNode(
"["+vypisy.nazvy_urovni[uroven-1]+"]"));
if ( info != undefined )
element_info.appendChild(document.createTextNode("("+info+")"));
element_text.appendChild(document.createTextNode(text));;
// Styly
element_radka.className = "radka";
element_cas.className = "cas";
element_uroven.className = "uroven";
element_funkce.className = "funkce";
if ( info != undefined ) element_info.className = "info";
element_text.className = "text";
// Tvar
element_radka.appendChild(element_cas);
element_radka.appendChild(element_mezera.cloneNode(false));
element_radka.appendChild(element_uroven);
element_radka.appendChild(element_mezera.cloneNode(false));
element_radka.appendChild(element_funkce);
if ( info != undefined ) {
element_radka.appendChild(element_mezera.cloneNode(false));
element_radka.appendChild(element_info);
}
element_radka.appendChild(element_mezera);
element_radka.appendChild(element_text);
// Zařazení do HTML
if ( ! vypisy.obracene ) {
konzola.appendChild(element_radka);
konzola.appendChild(element_br);
} else {
konzola.insertBefore(element_br, konzola.firstChild);
konzola.insertBefore(element_radka, konzola.firstChild);
}
vypisy.pocet_radek++;
}
vypisy.mys.proved_vyber = function(objekt)
{
if ( objekt == "vypis" ) {
return false;
} else {
vypisy.uroven = objekt.slice(-1);
nastav_cookie("uroven_ladeni",
escape(vypisy.nazvy_urovni[vypisy.uroven-1]), 365);
return true;
}
}
vypisy.mys.prekresli_stav = function(objekt, detail, zvyraznen, stisknut,
vybran)
{
if ( objekt != "vypis" ) {
var element=document.getElementById("uroven");
ladici_vypis(LADENI,"vypisy.mys.prekresli_stav",objekt,
"nastavuji odpovídající pozadí");
element.className = objekt;
}
}
vypisy.mys.proved_stisk = function(objekt)
{
if ( objekt == "vypis" ) {
var element = document.getElementById("konzola");
var konzola = element.parentNode;
var ikona = document.getElementById("vypis-ikona");
if ( konzola.style.display != "block" ) {
konzola.style.display = "block";
ikona.className = "ikona-sbalit";
} else {
konzola.style.display = "none";
ikona.className = "ikona-rozbalit";
}
}
}
vypisy.mys.tooltip.obnov = function (tooltip, info, detail)
{
if ( info == 'vypis' ) {
var element = document.getElementById("konzola");
var konzola = element.parentNode;
var id = ( konzola.style.display != "block" ) ? 0 : 1;
tvoric.obnov_tooltip( tooltip, "",
vypisy.zobrazeni_tooltip[id][0], vypisy.zobrazeni_tooltip[id][1] );
} else {
tvoric.obnov_tooltip( tooltip, "", detail.nadpis, detail.popis );
}
}
function uroven_ladeni(uroven)
{
vypisy.mys.vyber("uroven-"+uroven);
}
+56
View File
@@ -0,0 +1,56 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní tvar ladicí konzole
// ===========================================================================
// =~ Vygenerování konzole ~==================================================
document.write('<div class="ovladani-ladeni">');
document.write('<div class="prvky"><div class="obsah">');
document.write('<div id="uroven" class="uroven-1"></div>');
document.write('<div class="maska">');
for ( var i = 1; i <= vypisy.uroven_tooltip.length; i++ ) {
var mys_info = "'uroven-"+i+"'";
var mys_detail =
"{nadpis:'"+vypisy.uroven_tooltip[i-1][0]+"',"+
"popis:'"+vypisy.uroven_tooltip[i-1][1]+"'}";
document.write('<div id="uroven-'+i+'" '+
'onmouseover="return vypisy.mys.pres(event,'+mys_info+','+mys_detail+');" '+
'onmouseout="return vypisy.mys.pryc(event,'+mys_info+','+mys_detail+');" '+
'onmousedown="return vypisy.mys.stisk(event,'+mys_info+','+mys_detail+');"'+
'onmouseup="return vypisy.mys.pust(event,'+mys_info+','+mys_detail+');" '+
'></div>');
}
document.write('</div>');
document.write('<div id="vypis-ikona" class="ikona-rozbalit"></div>');
document.write('<div class="vypis-ikona" '+
'onmouseover="return vypisy.mys.pres(event,\'vypis\');" ' +
'onmouseout="return vypisy.mys.pryc(event,\'vypis\');" '+
'onmousedown="return vypisy.mys.stisk(event,\'vypis\');" '+
'onmouseup="return vypisy.mys.pust(event,\'vypis\');" '+
'></div>');
document.write('</div></div>');
document.write('<p class="popis">Ladicí konzola</p>');
document.write('</div>');
document.write('<div class="konzola"><p id="konzola"></p></div>');
// ===========================================================================
// =~ Základní nastavení ~====================================================
uroven_ladeni(vypisy.uroven);
+401
View File
@@ -0,0 +1,401 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní funkce pro město
// ===========================================================================
// =~ Globální nastavení ~====================================================
// Čas pro dvojklik v milisekundách
// TODO: Nastavení v uživatelském rozhraní
nastaveni.dvojklik = 500;
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Pozice Karla
karel = new Object();
// Směr: 0-východ, 1-sever, 2-západ, 3-jih
karel.VYCHOD = 0;
karel.SEVER = 1;
karel.ZAPAD = 2;
karel.JIH = 3;
karel.smer = karel.VYCHOD;
karel.pozice = {x:0, y:0};
karel.nazev_smeru = new Array("vychod", "sever", "zapad", "jih");
karel.nazev_smeru_plny = new Array("východ", "sever", "západ", "jih");
// Pozice domova
domov = new Object();
domov.pozice = {x:0, y:0};
// Konstanty pohybu (východ, sever, západ, jih)
plus = new Object();
plus.x = new Array(1, 0, -1, 0);
plus.y = new Array(0, 1, 0, -1);
// Struktura města
mesto = new Object();
// Velikost
mesto.velikost = {x: 10, y: 10};
// Pole
mesto.pole = new Array();
mesto.pole[0] = new Array();
for ( var x = 0; x < mesto.velikost.x; x++ ) {
mesto.pole[0].push(0);
}
for ( var y = 1; y < mesto.velikost.y; y++ ) {
mesto.pole[y] = mesto.pole[0].concat();
}
// Názvy obrázků
mesto.obrazky = new Array();
mesto.obrazky[-1] = "zed";
mesto.obrazky[0] = null;
for ( var i = 1; i < 9; i++ ) { // A potom značky
mesto.obrazky[i] = "znacka-"+i;
}
// Objekt pro práci s myší
mesto.mys = new Mys();
// Čas posledního kliku (provedení akce) - pro dvojklik
mesto.posledni_klik = null;
// ===========================================================================
// =~ Základní funkce pro aktualizaci města ~=================================
// Nastav správné parametry políčka podle města
mesto.prekresli_pole = function (pozice)
{
var element = document.getElementById('pozice_'+pozice.x+'_'+pozice.y);
var pole = mesto.pole[pozice.x][pozice.y];
var obrazek = mesto.obrazky[pole];
if ( element.className != obrazek ) {
element.className = obrazek;
}
}
// Nastav pozici Karla
mesto.pozice_karla = function (pozice)
{
if ( pozice.x >= 0 && pozice.x < mesto.velikost.x &&
pozice.y >= 0 && pozice.y < mesto.velikost.y &&
mesto.pole[pozice.x][pozice.y] >= 0 )
{
var element = document.getElementById('pozice_karel');
element.style.left = (pozice.x*32)+"px";
element.style.top = ((mesto.velikost.y - pozice.y - 1)*32)+"px";
karel.pozice = pozice;
ladici_vypis(DETAIL, "mesto.pozice_karla", pozice, "Karel umístěn");
return true;
} else {
ladici_vypis(CHYBA, "mesto.pozice_karla", pozice, "Karla nelze umístit kvůli zdi");
return false;
}
}
// Nastav orientaci Karla
mesto.orientace_karla = function (smer)
{
smer %= karel.nazev_smeru.length;
if ( smer < 0 ) smer += karel.nazev_smeru.length;
var element = document.getElementById('pozice_karel');
element.className = "karel-"+karel.nazev_smeru[smer];
karel.smer = smer;
ladici_vypis(DETAIL, "mesto.orientace_karla",
"Karel nasměrován na "+karel.nazev_smeru_plny[smer]);
}
// Nastav pozici Domova
mesto.pozice_domova = function (pozice)
{
if ( mesto.pole[pozice.x][pozice.y] >= 0 ) {
var element = document.getElementById('pozice_domov');
element.style.left = (pozice.x*32)+"px";
element.style.top = ((mesto.velikost.y - pozice.y - 1)*32)+"px";
domov.pozice = pozice;
ladici_vypis(DETAIL, "mesto.pozice_domova", pozice, "domov umístěn");
} else {
ladici_vypis(CHYBA, "mesto.pozice_domova", pozice, "domov nelze umístit kvůli zdi");
}
}
// Nahrání celého města
mesto.nahraj_mesto = function (karel_pozice, smer, domov_pozice, mesto_pole)
{
var uzivatel_chce = window.confirm("Opravdu si přejete nahrát město?");
if ( uzivatel_chce ) {
mesto.velikost.x = mesto_pole.length;
mesto.velikost.y = mesto_pole[0].length;
this.pozice_karla(karel_pozice);
this.orientace_karla(smer);
this.pozice_domova(domov_pozice);
for ( var x = 0; x < mesto.pole.length; x++ ) {
for ( var y = 0; y < mesto.pole[0].length; y++ ) {
if ( mesto.pole[x][y] != mesto_pole[x][y] ) {
mesto.pole[x][y] = mesto_pole[x][y];
this.prekresli_pole( {x: x, y: y} );
}
}
}
}
}
// ===========================================================================
// =~ Podmínky pro Karla ~====================================================
mesto.JE_ZED = function ()
{
var pozice = {
x: karel.pozice.x+plus.x[karel.smer],
y: karel.pozice.y+plus.y[karel.smer]
};
return !( pozice.x >= 0 && pozice.x < mesto.velikost.x &&
pozice.y >= 0 && pozice.y < mesto.velikost.y &&
mesto.pole[pozice.x][pozice.y] >= 0 );
}
mesto.JE_ZNACKA = function ()
{
return mesto.pole[karel.pozice.x][karel.pozice.y] > 0;
}
mesto.JE_DOMOV = function ()
{
return ( karel.pozice.x == domov.pozice.x
&& karel.pozice.y == domov.pozice.y );
}
mesto.JE_VYCHOD = function ()
{
return karel.smer == karel.VYCHOD;
}
mesto.JE_SEVER = function ()
{
return karel.smer == karel.SEVER;
}
mesto.JE_ZAPAD = function ()
{
return karel.smer == karel.ZAPAD;
}
mesto.JE_JIH = function ()
{
return karel.smer == karel.JIH;
}
// ===========================================================================
// =~ Práce s myší ~==========================================================
mesto.mys.prekresli_stav = function (pozice, detail, zvyraznen, stisknut,
vybran)
{
var element = document.getElementById('pozice_vyber');
if ( zvyraznen ) {
element.style.visibility = "visible";
element.style.left = (pozice.x*32)+"px";
element.style.top = ((mesto.velikost.y - pozice.y - 1)*32)+"px";
nastroje.zobraz_pozici(pozice);
} else if ( !this.je_zvyraznen() ) {
element.style.visibility = "hidden";
nastroje.zobraz_pozici(null);
}
}
mesto.mys.proved_zvyrazneni = function(pozice, detail)
{
return true;
}
mesto.mys.proved_vyber = function(pozice, detail)
{
var cas = new Date();
var rychly = (
mesto.posledni_klik != null &&
(cas-mesto.posledni_klik) < nastaveni.dvojklik
);
mesto.posledni_klik = cas;
switch ( nastroje.vybrany() ) {
case "karel":
if ( ! rychly || ! jsou_shodne(pozice, karel.pozice) ) {
mesto.pozice_karla(pozice);
} else {
mesto.proved_vlevo_vbok();
}
break;
case "domov":
mesto.pozice_domova(pozice);
break;
case "zed":
mesto.umisti_zed(pozice);
break;
case "znacka-plus":
mesto.poloz(pozice);
break;
case "znacka-minus":
mesto.zvedni(pozice);
break;
default:
}
return false;
}
// ===========================================================================
// =~ Příkazy a funkce pro editaci města ~====================================
mesto.proved_poloz = function (pozice)
{
var chyba = new Chyba();
if ( pozice == null ) {
pozice = {x:karel.pozice.x, y:karel.pozice.y};
}
if ( mesto.pole[pozice.x][pozice.y] >= 0 ) {
if ( mesto.pole[pozice.x][pozice.y] < 8 ) {
mesto.pole[pozice.x][pozice.y]++;
ladici_vypis(DETAIL, "mesto.proved_poloz", pozice,
"položena značka, aktuální počet: "+mesto.pole[pozice.x][pozice.y]);
mesto.prekresli_pole(pozice);
} else {
ladici_vypis(VAROVANI, "mesto.proved_poloz", pozice,
"příliš mnoho značek");
chyba.nastav( true, "Nemohu položit více jak 8 značek." );
}
} else {
ladici_vypis(CHYBA, "mesto.proved_poloz", pozice,
"nelze položit značku kvůli zdi");
}
return new Vysledek( chyba, Vysledek.PROVEDL_AKCI );
}
mesto.proved_zvedni = function (pozice)
{
var chyba = new Chyba();
if ( pozice == null ) {
pozice = {x:karel.pozice.x, y:karel.pozice.y};
}
if ( mesto.pole[pozice.x][pozice.y] >= 0 ) {
if ( mesto.pole[pozice.x][pozice.y] > 0 ) {
mesto.pole[pozice.x][pozice.y]--;
ladici_vypis(DETAIL, "mesto.proved_zvedni", pozice,
"zvednuta značka, aktuální počet: "+mesto.pole[pozice.x][pozice.y]);
mesto.prekresli_pole(pozice);
} else {
ladici_vypis(VAROVANI, "mesto.proved_zvedni", pozice,
"žádná značka, nelze zvednout");
chyba.nastav( true, "Nemohu zvednout značku. Žádná tam není." );
}
} else {
ladici_vypis(CHYBA, "mesto.proved_zvedni", pozice,
"pouze zeď, nelze zvednout");
}
return new Vysledek( chyba, Vysledek.PROVEDL_AKCI );
}
mesto.proved_vlevo_vbok = function (pozice)
{
mesto.orientace_karla(karel.smer+1);
return new Vysledek( new Chyba(), Vysledek.PROVEDL_AKCI );
}
mesto.proved_krok = function (pozice)
{
if ( pozice == null ) {
pozice = {x:karel.pozice.x, y:karel.pozice.y};
}
var nova_pozice =
{ x:pozice.x+plus.x[karel.smer], y:pozice.y+plus.y[karel.smer] };
var chyba = new Chyba();
if ( ! mesto.pozice_karla( nova_pozice ) ) {
chyba.nastav( true, "Nemůžu učinit KROK, přede mnou je zeď." );
}
return new Vysledek( chyba, Vysledek.PROVEDL_AKCI );
}
mesto.poloz = function (pozice)
{
var navrat = mesto.proved_poloz(pozice);
navrat.chyba.zobraz();
}
mesto.zvedni = function (pozice)
{
var navrat = mesto.proved_zvedni(pozice);
navrat.chyba.zobraz();
}
mesto.umisti_zed = function (pozice)
{
var je_karel = jsou_shodne(pozice, karel.pozice);
var je_domov = jsou_shodne(pozice, domov.pozice);
if ( !je_karel && !je_domov ) {
if ( mesto.pole[pozice.x][pozice.y] >= 0 ) {
mesto.pole[pozice.x][pozice.y] = -1;
ladici_vypis(DETAIL, "mesto.umisti_zed", pozice, "zeď umístěna");
} else {
mesto.pole[pozice.x][pozice.y] = 0;
ladici_vypis(DETAIL, "mesto.umisti_zed", pozice, "zeď zrušena");
}
mesto.prekresli_pole(pozice);
} else {
var hlaska = "";
if ( je_karel ) {
hlaska = "Karlovi a ";
}
if ( je_domov ) {
hlaska += "domovu ";
}
ladici_vypis(CHYBA, "mesto.umisti_zed", pozice,
"nelze umístit zeď kvůli "+hlaska.slice(0,-3));
}
}
mesto.vymaz_znacky = function ()
{
for ( var x=0; x<mesto.pole.length; x++ ) {
for ( var y=0; y<mesto.pole[x].length; y++ ) {
if ( mesto.pole[x][y] > 0 ) {
mesto.pole[x][y] = 0;
mesto.prekresli_pole({x:x, y:y});
}
}
}
ladici_vypis(INFORMACE, "mesto.vymaz_znacky", "značky vymazány");
}
mesto.vymaz_mesto = function ()
{
var uzivatel_chce = window.confirm("Opravdu chcete vyčistit celé město?");
if ( uzivatel_chce ) {
ladici_vypis(INFORMACE, "mesto.vymaz_mesto", "mažu značky");
for ( var x=0; x<mesto.pole.length; x++ ) {
for ( var y=0; y<mesto.pole[x].length; y++ ) {
if ( mesto.pole[x][y] != 0 ) {
mesto.pole[x][y] = 0;
mesto.prekresli_pole({x:x, y:y});
}
}
}
mesto.pozice_karla({x:0, y:0});
mesto.orientace_karla(0);
mesto.pozice_domova({x:0, y:0});
} else {
ladici_vypis(DETAIL, "mesto.vymaz_mesto", "zrušené mazání města");
}
}
+78
View File
@@ -0,0 +1,78 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní tvar města
// Pomocné funkce
function zapis_strukturu(obsah)
{
for ( var y = mesto.velikost.y-1; y >= 0; y-- ) {
for ( var x = 0; x < mesto.velikost.x; x++ ) {
formatovany_obsah = obsah(x, y);
document.write('<div>' + formatovany_obsah + '</div>');
}
}
}
// ===========================================================================
// =~ Vygenerování města ~====================================================
// Začátek
document.write('<div class="mesto">');
// Nadpis
document.write('<div class="nadpis">Město</div>');
// Obsah
document.write('<div class="obsah">');
// Pozadí
document.write('<div class="linka"></div>');
document.write('<div class="pozadi">');
zapis_strukturu(function(x, y){ return '<div class="policko"></div>'; });
document.write('</div>');
// Struktura města
document.write('<div class="struktura">');
zapis_strukturu(function(x, y){ return '<div id="pozice_'+x+'_'+y+'"></div>'; });
document.write('</div>');
// Domov
document.write('<div class="policko-domov">' +
'<div class="domov" id="pozice_domov"></div></div>');
// Karel
document.write('<div class="policko-karel">' +
'<div class="karel-vychod" id="pozice_karel"></div></div>');
// Výběr
document.write('<div class="policko-vyber">' +
'<div class="vyber" id="pozice_vyber"></div></div>');
// Maska města - rychlejší řešení, než :hover
document.write('<div class="maska">');
zapis_strukturu(function(x, y){ return '<div '+
'onmouseover="return mesto.mys.pres(event,{x:'+x+',y:'+y+'});" ' +
'onmouseout="return mesto.mys.pryc(event,{x:'+x+',y:'+y+'});" '+
'onmousedown="return mesto.mys.stisk(event,{x:'+x+',y:'+y+'});" '+
'onmouseup="return mesto.mys.pust(event,{x:'+x+',y:'+y+'});" '+
'></div>' });
document.write('</div>');
// Konec
document.write('</div>');
document.write('</div>');
// ===========================================================================
// =~ Základní nastavení ~====================================================
mesto.pozice_karla( karel.pozice );
mesto.orientace_karla( karel.smer );
mesto.pozice_domova( domov.pozice );
+390
View File
@@ -0,0 +1,390 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - objekt pro práci s myší
// Konstruktor
function Mys(tooltip)
{
// Atribut info je použit pro jednoznačné odlišení objektů
// Atribut detail je použit pro uchovávání informací k objektu, jako je např.
// obsah tooltipu, obrázky apod.
// Uživatel na tomto objektu provedl stisk
this.stisknut = { info: null, detail: null };
// Zvýrazněný objekt, uživatel přejel myší nad objekt
this.zvyraznen = { info: null, detail: null };
// Vybraný objekt, běžně bývá zobrazen se sníženými okraji
this.vybran = { info: null, detail: null };
// Kde byl naposledy proveden stisk. Některé prohlížeče neposílají správně
// stisky, tak se kontroluje puštění a předchozí stisk
this.posledni_stisk = { info: null, detail: null };
// Objekt třídy tooltipu. Pokud není nastaven, žádný tooltip se nezobrazí
if ( !tooltip ) tooltip = null;
this.tooltip = tooltip;
}
// ===========================================================================
// =~ Pomocné funkce ~========================================================
Mys.prototype.je_zvyraznen = function(zvyrazneni)
{
if ( zvyrazneni == undefined ) {
return ( this.zvyraznen.info != null );
} else {
return ( jsou_shodne(zvyrazneni, this.zvyraznen.info) );
}
}
Mys.prototype.je_vybran = function(vyber)
{
if ( vyber == undefined ) {
return ( this.vybran.info != null );
} else {
return ( jsou_shodne(vyber, this.vybran.info) );
}
}
Mys.prototype.je_stisknut = function(stisknuti)
{
if ( stisknuti == undefined ) {
return ( this.stisknut.info != null );
} else {
return ( jsou_shodne(stisknuti, this.stisknut.info) );
}
}
// ===========================================================================
// =~ Obsluha událostí myši ~=================================================
Mys.prototype.pres = function(e, info, detail)
{
if ( !e && typeof(event) != "undefined" ) e = event; // IE
ladici_vypis(LADENI, "mys.pres", info, "myš nad objektem");
if ( !jsou_shodne(info,this.posledni_stisk.info) ) {
this.posledni_stisk.info = this.posledni_stisk.detail = null;
}
if ( !jsou_shodne(info,this.zvyraznen.info ) ) {
if ( this.proved_zvyrazneni(info) ) {
var stary_zvyraznen = this.zvyraznen;
this.zvyraznen = { info:info, detail:detail };
if ( stary_zvyraznen.info != null )
this.stav( stary_zvyraznen.info, stary_zvyraznen.detail);
this.stav(info, detail);
}
}
var element;
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
this.tooltip.pres(element, info, detail);
}
return true;
}
Mys.prototype.pryc = function(e, info, detail)
{
if ( !e && typeof(event) != "undefined" ) e = event; // IE
var zmena = false;
ladici_vypis(LADENI, "mys.pryc", info, "myš pryč z objektu");
if ( jsou_shodne(info,this.posledni_stisk.info) ) {
this.posledni_stisk.info = this.posledni_stisk.detail = null;
}
if ( jsou_shodne(info,this.zvyraznen.info) ) {
this.zvyraznen.info = this.zvyraznen.detail = null;
zmena = true;
}
if ( jsou_shodne(info,this.stisknut.info) ) {
this.stisknut.info = this.stisknut.detail = null;
zmena = true;
}
this.zrus_zvyrazneni(info, detail);
if ( zmena ) {
this.stav(info, detail);
}
var element;
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
this.tooltip.pryc(element, info, detail);
}
}
Mys.prototype.stisk = function(e, info, detail)
{
if ( !e && typeof(event) != "undefined" ) e = event; // IE
ladici_vypis(LADENI, "mys.stisk", info, "myš stiskla tlačítko");
var stary_zvyraznen = { info: null };
var stary_stisknut = { info: null };
if ( !jsou_shodne(info,this.zvyraznen.info ) ) {
if ( this.proved_zvyrazneni(info, detail) ) {
stary_zvyraznen = this.zvyraznen;
this.zvyraznen = {info: info, detail: detail};
}
}
if ( !jsou_shodne(info,this.stisknut.info) ) {
this.stary_stisknut=this.stisknut;
}
this.posledni_stisk = { info: info, detail: detail };
this.stisknut = { info: info, detail: detail };
if ( stary_stisknut.info != null || stary_zvyraznen.info != null ) {
if ( jsou_shodne(stary_stisknut.info,stary_zvyraznen.info) ) {
this.stav(stary_stisknut.info, stary_stisknut.detail);
} else {
if ( stary_stisknut.info != null )
this.stav(stary_stisknut.info, stary_stisknut.detail);
if ( stary_zvyraznen.info != null )
this.stav(stary_zvyraznen.info, stary_zvyraznen.detail);
}
}
this.proved_stisk(info, detail);
this.stav(info, detail);
var element;
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
this.tooltip.zrus(element, info, detail);
}
}
Mys.prototype.pust = function(e, info, detail)
{
if ( !e && typeof(event) != "undefined" ) e = event; // IE
var stary_stisknut = this.stisknut;
if ( jsou_shodne(info,this.posledni_stisk.info) ) {
if ( stary_stisknut.info == null ) {
ladici_vypis(LADENI, "mys.pust", info, "pozice nezměněna; chybí stisk myši, simuluji...");
this.proved_stisk(info, detail);
}
ladici_vypis(LADENI, "mys.pust", info, "myš pustila tlačítko, provedla stisk");
this.vyber(info, detail, false);
} else {
ladici_vypis(LADENI, "mys.pust", info, "myš pustila tlačítko, žádný stisk");
// Kvůli zrušení stisku
info = stary_stisknut.info;
detail = stary_stisknut.detail;
}
this.stisknut.info = this.stisknut.detail = null;
if ( info != null ) {
this.zrus_stisk(info, detail);
this.stav(info, detail);
}
var element;
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
this.tooltip.zrus(element, info, detail);
}
}
Mys.prototype.stav = function(info, detail)
{
var je_zvyraznen = this.je_zvyraznen(info);
var je_vybran = this.je_vybran(info);
var je_stisknut = this.je_stisknut(info);
ladici_vypis(LADENI, "mys.stav", info, "překresluji"+
" (z:"+ formatuj_text(je_zvyraznen)+
" s:"+ formatuj_text(je_stisknut)+
" v:"+ formatuj_text(je_vybran)+ ")");
this.prekresli_stav(info, detail, je_zvyraznen, je_stisknut, je_vybran);
}
Mys.prototype.proved_prejmenovani = function(nazev, objekt, info_z, info_na,
detail_na)
{
if ( jsou_shodne( objekt.info, info_z ) ) {
ladici_vypis( LADENI, "mys.proved_prejmenovani", "měním " + nazev + " z (" +
formatuj_text(objekt.info) + ") na (" + formatuj_text(info_na) + ")" );
objekt.info = info_na;
objekt.detail = detail_na;
return true;
} else {
ladici_vypis( LADENI, "mys.proved_prejmenovani", "žádná změna v " + nazev +
", zůstává (" + formatuj_text(objekt.info) + ")" );
return false;
}
}
Mys.prototype.proved_smazani = function(nazev, objekt, info, detail)
{
if ( jsou_shodne( objekt.info, info ) ) {
ladici_vypis( LADENI, "mys.proved_smazani", info, "ruším " + nazev );
objekt.info = objekt.detail = null;
return true;
} else {
ladici_vypis( LADENI, "mys.proved_smazani", info, "žádná změna v " + nazev );
return false;
}
}
// ===========================================================================
// =~ Veřejně přístupné funkce ~==============================================
// Ruční provedení výběru
Mys.prototype.vyber = function(info, detail, prekresli)
{
var stary_vybran = this.vybran;
if ( !jsou_shodne(info,stary_vybran.info) ) {
if ( this.proved_vyber(info, detail) ) {
if ( stary_vybran.info != null ) {
if ( this.zmen_vyber(stary_vybran.info, stary_vybran.detail, info, detail) ) {
ladici_vypis(LADENI, "mys.vyber", info, "vybráno (předchozí:"+
formatuj_text(stary_vybran.info)+")");
this.vybran = { info: info, detail: detail };
this.stav(stary_vybran.info, stary_vybran.detail );
} else {
ladici_vypis(LADENI, "mys.vyber", info, "změna nepovolena (předchozí:"+
formatuj_text(stary_vybran.info)+")");
prekresli = false;
}
} else {
ladici_vypis(LADENI, "mys.vyber", info, "vybráno (předchozí nevybrán)");
this.vybran = { info: info, detail: detail };
}
if ( prekresli == undefined || prekresli ) {
this.stav(info, detail);
}
} else {
ladici_vypis(LADENI, "mys.vyber", info, "změna výběru nebyla provedena");
}
} else {
if ( this.zrus_vyber(info) ) {
ladici_vypis(LADENI, "mys.vyber", info, "zrušení výběru");
this.vybran.info = this.vybran.detail = null;
if ( prekresli == undefined || prekresli ) {
this.stav(info);
}
} else {
ladici_vypis(LADENI, "mys.vyber", info, "žádná změna výběru");
}
}
}
// Změna informací. Změní výběr a ostatní informace myši, pokud se změnily
// informace, nebo detaily
Mys.prototype.prejmenuj = function(info_z, info_na, detail_na)
{
ladici_vypis(LADENI, "mys.prejmenuj", info_z, "přejmenování na (" +
formatuj_text(info_na) + ")");
var prekresli = false;
if ( this.proved_prejmenovani( "mys.stisknut",
this.stisknut, info_z, info_na, detail_na ) ) {
ladici_vypis(LADENI, "mys.prejmenuj", info_na, "stisk po přejmenování");
this.proved_stisk( info_na, detail_na );
prekresli = true;
}
if ( this.proved_prejmenovani( "mys.zvyraznen",
this.zvyraznen, info_z, info_na, detail_na ) ) {
ladici_vypis(LADENI, "mys.prejmenuj", info_na, "zvýraznění po přejmenování");
this.proved_zvyrazneni( info_na, detail_na );
prekresli = true;
}
if ( this.proved_prejmenovani( "mys.vybran",
this.vybran, info_z, info_na, detail_na ) ) {
ladici_vypis(LADENI, "mys.prejmenuj", info_na, "výběr po přejmenování");
this.proved_vyber( info_na, detail_na );
prekresli = true;
}
this.proved_prejmenovani( "mys.posledni_stisk",
this.posledni_stisk, info_z, info_na, detail_na );
if ( prekresli ) {
this.stav( info_na, detail_na );
}
}
// Smazání informací. Zruší výběr a zvýraznění prvku
Mys.prototype.smaz = function(info, detail)
{
ladici_vypis(LADENI, "mys.smaz", info, "smazání prvku");
var prekresli = false;
if ( this.proved_smazani( "mys.stisknut", this.stisknut, info, detail ) ) {
ladici_vypis(LADENI, "mys.smaz", info, "zrušení stisku");
this.zrus_stisk( info, detail );
prekresli = true;
}
if ( this.proved_smazani( "mys.zvyraznen", this.zvyraznen, info, detail ) ) {
ladici_vypis(LADENI, "mys.smaz", info, "zrušení zvýraznění");
this.zrus_zvyrazneni( info, detail );
prekresli = true;
}
if ( this.proved_smazani( "mys.vybran", this.vybran, info, detail ) ) {
ladici_vypis(LADENI, "mys.smaz", info, "zrušení výběru");
this.smaz_vyber( info, detail );
prekresli = true;
}
this.proved_smazani( "mys.posledni_stisk",
this.posledni_stisk, info, detail );
if ( prekresli ) {
this.stav( info, detail );
}
}
// ===========================================================================
// =~ Veřejně editovatelné funkce ~===========================================
// Překeslení stavu prvku
Mys.prototype.prekresli_stav = function(info, detail, zvyraznen, stisknut,
vybran)
{
}
// Myš stiskla tlačítko
Mys.prototype.proved_stisk = function(info, detail)
{
}
// Myš pustila tlačítko
Mys.prototype.zrus_stisk = function(info, detail)
{
}
// Myš klikla na objekt. Vrací true, pokud se vybralo
Mys.prototype.proved_vyber = function(info, detail)
{
return false;
}
// Zrušen výběr objektu kliknutím na jiný objekt. Vrací true, pokud se má vybrat
Mys.prototype.zmen_vyber = function(info_z, detail_z, info_na, detail_na)
{
return true;
}
// Zrušen výběr objektu kliknutím na stejný objekt. Vrací true, pokud se má
// zrušit výběr
Mys.prototype.zrus_vyber = function(info, detail)
{
return false;
}
// Vybraný objekt byl smazán
Mys.prototype.smaz_vyber = function(info, detail)
{
}
// Myš je nad objektem. Vrací true, pokud se zvýraznilo
Mys.prototype.proved_zvyrazneni = function(info, detail)
{
return false;
}
// Myš není nad objektem
Mys.prototype.zrus_zvyrazneni = function(info, detail)
{
}
+917
View File
@@ -0,0 +1,917 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - načítání, ukládání a export dat
// Příkazy a jejich indexy podle verze:
//
// Verze/Index Příkaz
// 1.0 1.1 1.2 2.0
// - - - 0 <prázdná řádka> (součást hlavičky)
// - - - 1 <komentář> (součást hlavičky)
// - - - 2 <název příkazu> (součást hlavičky)
// - - - 3 <prázdná řádka> (tělo příkazu)
// - - - 4 <komentář> (tělo příkazu)
// 0 0 0 5 KONEC, JINAK
// 1 1 1 6 KONEC
// 2 2 2 7 KDYŽ
// 3 3 3 8 DOKUD
// 4 4 4 9 OPAKUJ
// - 5 5 10 AŽ
// - - 6 11 RYCHLE
// - - 7 12 POMALU
// 5 6 8 13 STOP
// 6 7 9 14 KROK
// 7 8 10 15 VLEVO-VBOK
// 8 9 11 16 POLOŽ
// 9 10 12 17 ZVEDNI
//
// Poznámky k formátům níže:
//
// \t označuje znak <tabulátor>
// \n je pro znak <nová řádka>
//
// Formát ukládání (příkazy)
// =========================
//
// Karel<verze>\n
// P\n
// <index posledního příkazu>
// <jméno příkazu>\t<příkaz 1>,<příkaz 2>,...\n
// <jméno příkazu>\t<příkaz 1>,<příkaz 2>,...\n
// ...
// KONEC
//
// Takový řetězec se předá jako parametr funkci escape() a výsledná hodnota
// je poté nabídnuta k uložení.
//
// Formát příkazů:
//
// 1. Příkaz bez parametrů (<prázdná řádka>, <název příkazu>, KONEC, RYCHLE,
// POMALU, STOP, KROK, VLEVO-VBOK, POLOŽ, ZVEDNI a uživatelské příkazy
//
// <index příkazu>
//
// 2. Příkaz má parametr (KDYŽ, DOKUD, AŽ, OPAKUJ)
//
// (a) <index příkazu><mezera><podmínka KDYŽ, DOKUD, AŽ>
// (b) <index příkazu OPAKUJ><mezera><počet opakování OPAKUJ>
// (c) <index příkazu OPAKUJ>
//
// <podmínka> je následující:
//
// 1 ZEĎ -1 NENÍ ZEĎ
// 2 ZNAČKA -2 NENÍ ZNAČKA
// 3 DOMOV -3 NENÍ DOMOV
// 4 VÝCHOD -4 NENÍ VÝCHOD
// 5 SEVER -5 NENÍ SEVER
// 6 ZÁPAD -6 NENÍ ZÁPAD
// 7 JIH -7 NENÍ JIH
//
// <počet opakování OPAKUJ> je kladné číslo včetně nuly
//
// 3. Komentář
//
// <index příkazu><mezera><text upravený funkcí escape()>
//
// !! VAROVÁNÍ!!
//
// Od verze 1.1 se rozšířil repertoár o příkaz AŽ, proto při čtení verze
// 1.0 je nutno posunout <index příkazu> o 1, pokud je větší než 4.
//
// Od verze 1.2 přibyly příkazy RYCHLE a POMALU, proto je nutné při čtení
// verze 1.1 posunout <index příkazu> o 2, pokud je větší než 5.
//
// Od verze 2.0 se rozšířil slovník o komentáře a hlavičku, proto je nutné
// při čtení verze 1.2 posunout <index příkazu> vždy o 5.
//
// Verze 2.0 zavedla nový prvek 2.c), který byl v předchozích verzích
// ukládán s <počet opakování OPAKUJ> rovno -1 (minus jedné).
//
// Formát ukládání (město)
// =======================
//
// Karel<verze>\n
// M\n
// <pozice Karla X><mezera><pozice Karla Y>\n
// <směr natočení>\n
// <pozice domova X><mezera><pozice domova Y>\n
// <[0,9]><[0,8]>...<[0,0]>\n
// <[1,9]><[1,8]>...<[1,0]>\n
// ...
// <[9,9]><[9,8]>...<[9,0]>\n
// KONEC
//
// Takový řetězec se předá jako parametr funkci escape() a výsledná hodnota
// je poté nabídnuta k uložení.
//
// Formát políčka města <[x,y]>: číslo od 0 do 8 podle položených značek,
// nebo znak X, pokud je na daném políčku zeď.
//
// Město nemělo žádnou změnu od začátku vývoje, proto je <verze> rovna
// hodnotě "1.0" (bez uvozovek).
//
// Poznámka k souřadnicím:
//
// Pozice je vyjádřená jako dvojice [x,y], kde x a y je od 0 do 9. Symbol
// x označuje sloupec a symbol y řádku. Formát ukládání je tedy po sloupcích
// (první zapsaná textová řádka je rovna prvnímu sloupci města) shora dolů.
// Sloupcové ukládání vzniklo nejspíš omylem, ale už nebylo dále upravováno.
//
// Program Visual Karel 99 ukládá město po řádkách, takže zapsaná textová
// řádka odpovídá skutečné řádce města - to je velký rozdíl!
//
// Karel má na počátku pozici [0,0] (levý dolní roh), ale uživatelské
// rozhraní v tu dobu ukazuje souřadnici "1 × 1" (o jednu vyšší). Pravý dolní
// roh má pozici [9,0], v uživatelském rozhraní to je "10 × 1".
//
// Program Visual Karel 99 počítá pozici od jedné, ne od nuly, navíc počátek
// je vlevo nahoře. Levý horní roh je (1,1) (odpovídá pozici [0,9]), levý
// dolní roh má (1,10) (odpovídá umístění [0,0]), pravý dolní roh je (10,10)
// (odpovídá pozici [9,0]).
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Objekt pracující s daty
data = new Object();
// Načítací funkcionalita
data.nacitani = new Object();
// Ukládací funkcionalita
data.ukladani = new Object();
// Konstanty formatu
data.FORMAT_10 = 0;
data.FORMAT_11 = 1;
data.FORMAT_12 = 2;
data.FORMAT_20 = 3;
data.verze = [
{ retezec: "1.0", verze: prikazy.VERZE_10 },
{ retezec: "1.1", verze: prikazy.VERZE_11 },
{ retezec: "1.2", verze: prikazy.VERZE_12 },
{ retezec: "2.0", verze: prikazy.VERZE_20 }
];
// Typy zobrazovaného okna
data.typ = new Object();
data.typ.ULOZIT = "ulozit.html";
data.typ.EXPORT_MESTA = "export-mesto.html";
data.typ.EXPORT_SLOVNIKU = "export-slovnik.html";
// Značky
data.znacky = [ ".", "1", "2", "3", "4", "5", "6", "7", "8" ];
data.znacky[-1] = "X";
// ===========================================================================
// =~ Základní funkce pro ukládání a export města ~===========================
// Uložení do vnitřního formátu
data.ukladani.uloz_mesto = function ()
{
var uloz = "Karel1.0\nM\n";
uloz += karel.pozice.x + " " + (mesto.velikost.y - karel.pozice.y - 1) + "\n";
uloz += karel.smer + "\n";
uloz += domov.pozice.x + " " + (mesto.velikost.y - domov.pozice.y - 1) + "\n";
for ( var x = 0; x < mesto.velikost.x; x++ ) {
for ( var y = mesto.velikost.y-1; y >= 0; y-- ) {
uloz += data.znacky[mesto.pole[x][y]];
}
uloz += "\n";
}
uloz += "KONEC";
uloz = escape(uloz);
this.zobraz_v_okne(this.typ.NORMALNI, "uložení města", "<p>"+
"Následující text si pečlivě uschovejte. Neprovádějte na něm <i>ŽÁDNÉ</i> "+
"úpravy. Každá změna může způsobit jeho zpětnou nepoužitelnost. Nejlépe text "+
"označte, zkopírujte do schránky Windows (případně do schránky jiného "+
"systému) a vložte do prázdného souboru, např. v aplikaci Poznámkový blok "+
"(Notepad). Raději nepoužívejte programy, které provádí další formátování "+
"textu, tím by se mohl text znehodnotit."+
"</p>", uloz, 24);
}
// Export do formátu Visual Karel 99
data.ukladani.export_mesto_k99 = function ()
{
var uloz =
"Velikost města: " + mesto.velikost.x + ", " + mesto.velikost.y + "\n";
uloz += "Pozice Karla: " +
(karel.pozice.x+1) + ", " + (mesto.velikost.y-karel.pozice.y) + "\n";
uloz += "Otočení Karla: " + karel.nazev_smeru_plny[karel.smer] +"\n";
uloz += "Umístění domova: " +
(domov.pozice.x+1) + ", " + (mesto.velikost.y-domov.pozice.y) + "\n\n";
uloz += "Definice města:\n";
for ( var y = mesto.velikost.y-1; y >= 0; y-- ) {
for ( var x = 0; x < mesto.velikost.x; x++ ) {
uloz += data.znacky[mesto.pole[x][y]];
}
uloz += "\n";
}
uloz = uloz.slice( 0, -1 ); // Odstranit poslední ukončení řádky
this.zobraz_v_okne(this.typ.NORMALNI, "export města", "<p>"+
"Následující text je určen pro program Visual Karel 99. Nevím, jak jsou na "+
"tom konkurenční programy s formátem, proto nelze zaručit větší "+
"přenositelnost města."+
"</p><p>"+
"Symbol X označuje zeď, číslo nahrazuje počet položených značek a tečka značí "+
"prázdné pole. Na jednom poli nemůže být zároveď zeď a Karel, nebo Karlův "+
"domov. Na jednom poli také nemůže být víc jak 8 značek."+
"</p>", uloz, 23);
}
// ===========================================================================
// =~ Základní funkce pro ukládání a export slovníku ~========================
// Kontrola prázdného slovníku
data.ukladani.zkontroluj_slovnik = function ()
{
if ( prikazy.seznam[prikazy.seznam.length-1].systemovy ) {
alert( "Není co uložit. Slovník je prázdný." );
return false;
} else {
return true;
}
}
// Příprava slovníku na uložení
data.ukladani.priprav_slovnik = function (format)
{
var verze = data.verze[format].verze;
var index = 0;
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
var prikaz = prikazy.seznam[i];
if ( prikaz.kompatibilita & prikaz.verze_ulozeni & verze ) {
prikaz.index = index;
index++;
} else {
delete prikaz.index;
}
}
}
// Formátování seznamu příkazů
data.ukladani.formatuj_text = function (objekt)
{
var text = "";
if ( objekt.ostatni.length ) {
text += objekt.ostatni.join( ", " );
}
if ( objekt.prikazy.length ) {
if ( text.length > 0 ) {
text += " a ";
}
if ( objekt.prikazy.length == 1 ) {
text += "příkaz ";
} else {
text += "příkazy ";
}
text += objekt.prikazy.join( ", " );
}
return text;
}
// Přidá jeden příkaz do seznamu špatných příkazů, nebo varování
data.ukladani.pridej_prikaz = function (objekt, prikaz)
{
if ( ! objekt.seznam[prikaz.jmeno] ) {
if ( prikaz.prikaz ) {
objekt.prikazy.push(prikaz.jmeno);
} else {
objekt.ostatni.push(prikaz.jmeno);
}
objekt.seznam[prikaz.jmeno] = true;
}
}
// Vrací true, pokud není seznam prázdný
data.ukladani.nastalo = function (objekt)
{
return (objekt.prikazy.length || objekt.ostatni.length);
}
// Kontrola verze slovníku
data.ukladani.zkontroluj_verze = function (format)
{
var verze = data.verze[format].verze;
var spatne = { seznam: {}, prikazy: [], ostatni: [] };
var varovani = { seznam: {}, prikazy: [], ostatni: [] };
var i = prikazy.seznam.length-1;
while ( i >= 0 && !prikazy.seznam[i].systemovy ) {
var prikaz = prikazy.seznam[i];
for ( var j = 0; j < prikaz.telo.length; j++ ) {
var radka = prikaz.telo[j];
if ( radka[0].verze_ulozeni & (~radka[0].kompatibilita) & verze ) {
// Příkaz nelze uložit
this.pridej_prikaz( spatne, radka[0] );
} else if ( !(radka[0].kompatibilita & verze) ) {
// Příkaz se neukládá
this.pridej_prikaz( varovani, radka[0] );
}
}
i--;
}
if ( this.nastalo(spatne) ) {
return { chyba: true, text: this.formatuj_text(spatne) };
} else if ( this.nastalo(varovani) ) {
return { varovani: true, text: this.formatuj_text(varovani) };
} else {
return {};
}
}
// Kontrola minimální verze slovníku
data.ukladani.zkontroluj_minimalni_format = function (format)
{
var novy_format = format-1;
while ( novy_format >= data.FORMAT_10 ) {
var test = this.zkontroluj_verze(novy_format);
if ( !test.chyba && !test.varovani ) {
format = novy_format;
} else {
break;
}
novy_format--;
}
return format;
}
// Provede uložení slovníku v daném formátu
data.ukladani.proved_ulozeni_prikazu = function (format, prikaz)
{
var verze = data.verze[format].verze;
var uloz = "";
if ( !prikaz.systemovy ) {
var radka_uloz = new Array();
for ( var i = 0; i < prikaz.telo.length; i++ ) {
var radka = prikaz.telo[i];
var prikaz_uloz;
// Pokud se má uložit (příkaz získal index z přípravy slovníku), ulož
if ( radka[0].index != undefined ) {
if ( radka[0].ukladac ) {
prikaz_uloz = radka[0].ukladac(verze, radka);
} else {
prikaz_uloz = this.obecny(verze, radka);
}
if ( prikaz_uloz ) {
radka_uloz.push(prikaz_uloz);
}
}
}
uloz = prikaz.jmeno + "\t" + radka_uloz.join(",") + "\n";
}
return uloz;
}
// Provede uložení slovníku
data.ukladani.proved_ulozeni_slovniku = function (format)
{
this.priprav_slovnik(format);
var uloz =
"Karel" + data.verze[format].retezec + "\n" +
"P\n" +
prikazy.seznam[prikazy.seznam.length-1].index + "\n";
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
uloz += this.proved_ulozeni_prikazu(format, prikazy.seznam[i]);
}
uloz += "KONEC";
return escape(uloz);
}
// Ulož slovník v novém formátu
data.ukladani.uloz_slovnik = function (format)
{
if ( this.zkontroluj_slovnik() ) {
var navrat = this.zkontroluj_verze(format);
if ( navrat.chyba ) {
alert( "Chyba!\n\nSlovník nelze uložit ve formátu " +
data.verze[format].retezec +
", protože obsahuje " + navrat.text + "." );
} else {
if ( navrat.varovani ) {
if ( ! window.confirm(
"Varování!\n\nSlovník při ukládání do formátu " +
data.verze[format].retezec +
" nebude obsahovat " + navrat.text + ".\n\nPřesto uložit?" ) ) {
return;
}
} else {
// Najdi minimální verzi, ve které jde uložit příkaz
format = this.zkontroluj_minimalni_format(format);
}
var uloz = this.proved_ulozeni_slovniku(format);
this.zobraz_v_okne(this.typ.NORMALNI, "uložení slovníku", "<p>"+
"Následující text si pečlivě uschovejte. Neprovádějte na něm <i>ŽÁDNÉ</i> "+
"úpravy. Každá změna může způsobit jeho zpětnou nepoužitelnost. Nejlépe text "+
"označte, zkopírujte do schránky Windows (případně do schránky jiného "+
"systému) a vložte do prázdného souboru, např. v aplikaci Poznámkový blok "+
"(Notepad). Raději nepoužívejte programy, které provádí další formátování "+
"textu, tím by se mohl text znehodnotit."+
"</p>", uloz, 24);
}
}
}
data.ukladani.export_slovnik_k99 = function ()
{
if ( this.zkontroluj_slovnik() ) {
var format = new Array();
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
var prikaz = prikazy.seznam[i];
if ( !prikaz.systemovy ) {
var obsah = new Obsah();
var vysledek = prikazy.formatovac.zformatuj_prikaz(prikaz, obsah);
format.push(obsah.obsah());
}
}
uloz = format.join("%0A%0A");
this.zobraz_v_okne(this.typ.KOMENTARE, "export slovníku", "<p>"+
"Následující text je určen pro program Visual Karel 99. Bez větších úprav ho "+
"jistě bude možno použít i v jiných (konkurenčních) programech zabývající se "+
"problematikou robota Karla."+
"</p>"+
"<p><b>Varování!</b> Pokud jste použili podmínku nebo opakování s příkazem "+
"AŽ, pak nebude v programu Visual Karel 99 fungovat, protože v něm tato "+
"vlastnost není naprogramována."+
"</p>", unescape(uloz), 21);
}
}
// ===========================================================================
// =~ Funkce pro ukládání a export jednotlivých příkazů ~=====================
// Obecné ukládání
data.ukladani.obecny = function (format, radka)
{
if ( radka[0].index != undefined ) {
if ( radka.length > 1 ) {
return radka[0].index + " " + radka.slice(1).join(" ");
} else {
return "" + radka[0].index;
}
} else {
return undefined;
}
}
// Cyklus
data.ukladani.uloz_OPAKUJ = function (format, radka)
{
var pocet = "";
if ( radka.length == 1 && format < data.FORMAT_20 ) {
pocet = " -1";
} else if ( radka.length == 2 ) {
pocet = " " + radka[1];
}
return radka[0].index + pocet;
}
// Komentář
data.ukladani.uloz_komentar = function (format, radka)
{
if ( format >= data.FORMAT_20 ) {
return radka[0].index + " " + escape(radka[1]);
} else {
return undefined;
}
}
// Název
data.ukladani.uloz_nazev = function (format, radka)
{
if ( format >= data.FORMAT_20 ) {
return radka[0].index;
} else {
return undefined;
}
}
// ===========================================================================
// =~ Základní funkce pro načítání ~==========================================
// Nahraj příkazy/město
data.nacitani.nacti = function ()
{
var hodnota = window.prompt(
"Vložte prosím text města nebo příkazů, který byl předtím vytvořen tímto " +
"Karlem. Jediná dlouhá řádka začíná slovem Karel a končí slovem KONEC.");
if ( hodnota && hodnota.length ) {
hodnota = hodnota.replace( /\s+/g, "" );
}
var vysledek = data.nacitani.proved_nacteni(hodnota);
vysledek.zobraz_chybu();
}
// Proveď nahrání příkazů/města
data.nacitani.proved_nacteni = function (hodnota)
{
var vysledek = new Vysledek();
// Základní kontroly
if ( hodnota && hodnota.length ) {
var radky = hodnota.split("%0A");
vysledek.chyba.formatuj - function (text) {
return text + "\n\nNemohu nehrát.";
}
vysledek.nastav( data.nacitani.kontrola_formatu(radky[0]) );
if ( vysledek.byla_chyba() ) return vysledek;
var format = vysledek.hodnota;
if ( radky[radky.length-1] != "KONEC" ) {
vysledek.nastav( new Chyba( true,
"Textová řádka není celá, nebo je poškozená." ) );
} else if ( radky.length < 4
|| radky.length > 2 && radky[1] != 'M' && radky[1] != 'P' ) {
vysledek.nastav( new Chyba( true,
"Nelze rozpoznat, zda se jedná o město nebo příkazy." ) );
} else if ( radky[1] == 'M' ) {
vysledek.chyba.formatuj = function (text) {
return text + "\n\nNemohu načíst město.";
}
vysledek.nastav( this.nacti_mesto(format, radky) );
if ( vysledek.je_hodnota() ) {
var hodnota = vysledek.hodnota;
mesto.nahraj_mesto( hodnota.karel, hodnota.smer, hodnota.domov,
hodnota.mesto );
}
} else {
vysledek.chyba.formatuj = function (text) {
return text + "\n\nNemohu načíst slovník.";
}
vysledek.nastav( this.nacti_slovnik(format, radky) );
if ( vysledek.je_hodnota() ) {
var hodnota = vysledek.hodnota;
prikazy.nahraj_slovnik( hodnota );
}
}
}
return vysledek;
}
// Kontrola verze
data.nacitani.kontrola_formatu = function (format)
{
format = unescape(format);
for ( var i = 0; i < data.verze.length; i++ ) {
if ( format == "Karel" + data.verze[i].retezec ) {
return new Vysledek( false, Vysledek.NIC, i );
}
}
ladici_vypis( CHYBA, "nacitani.kontrola_formatu", format,
"nerozpoznán formát" );
return new Vysledek( new Chyba( true,
"Neznámá verze " + format + "." ) );
}
// ===========================================================================
// =~ Základní funkce pro načítání města ~====================================
// Přečti pozici
data.nacitani.precti_pozici = function (radka, jmeno)
{
radka = radka.split( "%20" );
var x = parseInt(radka[0]);
var y = parseInt(radka[1]);
if ( radka.length == 2 && !isNaN(x) && !isNaN(y) ) {
if ( x >= 0 && x < mesto.velikost.x && y >= 0 && y < mesto.velikost.y ) {
return new Vysledek( false, Vysledek.NIC,
{ x: x, y: (mesto.velikost.y - y - 1) } );
} else {
return new Vysledek( new Chyba( true,
"Chybná pozice " + jmeno + "." ) );
}
} else {
return new Vysledek( new Chyba( true,
"Nerozpoznána pozice " + jmeno + "." ) );
}
}
// Přečti směr
data.nacitani.precti_smer = function (radka, jmeno)
{
var smer = parseInt(radka);
if ( !isNaN(smer) ) {
if ( smer >= 0 & smer < 4 ) {
return new Vysledek( false, Vysledek.NIC, smer );
} else {
return new Vysledek( new Chyba( true,
"Chybný směr natočení Karla." ) );
}
} else {
return new Vysledek( new Chyba( true,
"Nerozpoznán směr natočení Karla." ) );
}
}
// Přečti řádku města
data.nacitani.precti_radku_mesta = function (radka, pocet_radku)
{
if ( radka.length != pocet_radku ) {
return new Vysledek( new Chyba( true,
"Nebyly nalezeny všechny řádky města." ) );
}
var mesto_radka = new Array();
for ( var y = 0; y < pocet_radku; y++ ) {
var znak = radka.charAt(y);
for ( var i = -1; i < data.znacky.length; i++ ) {
if ( znak == data.znacky[i] ) {
mesto_radka[y] = i;
break;
}
}
if ( i == data.znacky.length ) {
return new Vysledek( new Chyba( true,
"Nerozpoznáno pole města." ) );
}
}
return new Vysledek( false, Vysledek.NIC, mesto_radka.reverse() );
}
// Načti město
data.nacitani.nacti_mesto = function (format, radky)
{
var vysledek = new Vysledek();
if ( format != data.FORMAT_10 ) {
vysledek.nastav( new Chyba( true,
"Bohužel neznám verzi " + data.verze[format].retezec + "." ) );
} else {
var velikost_mesta = { x: 10, y: 10 };
if ( radky.length != (velikost_mesta.y + 6) ) {
vysledek.nastav( new Chyba(true,
"Nebyly nalezeny všechny sloupce města." ) );
} else {
vysledek.nastav( this.precti_pozici(radky[2], "Karla") );
var karel_pozice = vysledek.hodnota;
vysledek.nastav( this.precti_smer(radky[3]) );
var smer = vysledek.hodnota;
vysledek.nastav( this.precti_pozici(radky[4], "domova") );
var domov_pozice = vysledek.hodnota;
var mesto_pole = new Array();
if ( !vysledek.byla_chyba() ) {
for ( var x = 0; x < velikost_mesta.x && !vysledek.byla_chyba(); x++ ) {
var nacteno = data.nacitani.precti_radku_mesta( radky[x+5],
velikost_mesta.y );
vysledek.nastav( nacteno );
mesto_pole[x] = vysledek.hodnota;
}
}
if ( !vysledek.byla_chyba() ) {
vysledek.nastav( false, Vysledek.NIC,
{ karel: karel_pozice,
smer: smer,
domov: domov_pozice,
mesto: mesto_pole } );
}
}
}
return vysledek;
}
// ===========================================================================
// =~ Základní funkce pro načítání slovníku ~=================================
// Načti slovník
data.nacitani.nacti_slovnik = function (format, radky)
{
var vysledek = new Vysledek();
var novy_slovnik = this.priprav_slovnik(format);
// Základní kontrola
if ( radky.length < 4
|| radky.length > 3 && (radky.length-4 != radky[2]-novy_slovnik.length+1)) {
vysledek.nastav( new Chyba( true,
"Slovník nejspíš není celý." ) );
} else {
var radky_slovniku = radky.slice(3, -1);
vysledek.nastav(
this.dekoduj_slovnik(format, radky_slovniku, novy_slovnik) );
}
return vysledek;
}
// Příprava slovníku na načtení
data.nacitani.priprav_slovnik = function (format)
{
var novy_slovnik = new Array();
var verze = data.verze[format].verze;
var slovnik = prikazy.seznam;
for ( var i = 0; i < slovnik.length && slovnik[i].systemovy; i++ ) {
var prikaz = slovnik[i];
if ( prikaz.kompatibilita & prikaz.verze_ulozeni & verze ) {
novy_slovnik.push( prikaz );
}
}
return novy_slovnik;
}
// Dekóduj slovník
data.nacitani.dekoduj_slovnik = function (format, radky_slovniku, novy_slovnik)
{
// Připrav prázdné příkazy
var vysledek = new Vysledek();
var start_index = novy_slovnik.length;
// Oddělit jednotlivé příkazy
vysledek.nastav( this.oddel_prikazy( radky_slovniku, novy_slovnik ) );
// Změna jmen
if ( !vysledek.byla_chyba() ) {
vysledek.nastav( this.oprav_nazvy( novy_slovnik ) );
}
// Načti příkazy
if ( !vysledek.byla_chyba() ) {
var i = start_index;
while ( i < novy_slovnik.length && !vysledek.byla_chyba() ) {
var novy_prikaz = novy_slovnik[i];
var radky_prikazu = novy_prikaz.kodovane_telo;
delete novy_prikaz.kodovane_telo;
vysledek.nastav(
this.dekoduj_prikaz(format, radky_prikazu, novy_prikaz, novy_slovnik) );
i++;
}
if ( !vysledek.byla_chyba() ) {
novy_slovnik = novy_slovnik.slice(start_index);
vysledek.nastav( false, Vysledek.NIC, novy_slovnik );
}
}
return vysledek;
}
// Odděl příkazy
data.nacitani.oddel_prikazy = function (radky_slovniku, slovnik)
{
for ( var i = 0; i < radky_slovniku.length; i++ ) {
var zaklad_prikazu = radky_slovniku[i].split("%09");
if ( zaklad_prikazu.length != 2 ) {
return new Vysledek( new Chyba( true,
"Nerozpoznán příkaz." ) );
}
var radky_prikazu = zaklad_prikazu[1].split("%2C");
var novy_prikaz = {
jmeno: unescape(zaklad_prikazu[0]),
telo: new Array(),
kodovane_telo: radky_prikazu
};
if ( !novy_prikaz.jmeno.length ) {
return new Vysledek( new Chyba( true,
"Nerozpoznán název příkazu." ) );
}
slovnik.push(novy_prikaz);
}
return new Vysledek();
}
// Oprav názvy
data.nacitani.oprav_nazvy = function (novy_slovnik)
{
for ( var i = 0; i < novy_slovnik.length; i++ ) {
var prikaz = novy_slovnik[i];
if ( !prikaz.systemovy ) {
var vysledek = new Vysledek();
vysledek.nastav(
prikazy.rozpoznavac.kontrola_jmena(prikaz.jmeno) );
if ( vysledek.byla_chyba() ) {
var nove_jmeno = this.najdi_nove_jmeno(prikaz.jmeno, novy_slovnik);
prikaz.jmeno = nove_jmeno;
vysledek.chyba.formatuj = function (text) {
return "Chyba při načítání slovníku: " + text +
"\n\nPříkaz byl přejmenován na " + nove_jmeno + ".";
}
vysledek.zobraz_chybu();
}
}
}
return new Vysledek();
}
// Najdi nové nekonfliktní jméno
data.nacitani.najdi_nove_jmeno = function (jmeno, slovnik)
{
var nove_jmeno;
var i = 1;
var spravne = false;
while ( !spravne ) {
spravne = true;
if ( i == 1 ) {
nove_jmeno = "!" + jmeno;
} else {
nove_jmeno = "!" + jmeno + " " + i;
}
for ( var j = slovnik.length-1; j >= 0 && !slovnik[j].systemovy; j-- ) {
if ( nove_jmeno == slovnik[j].jmeno ) {
spravne = false;
break;
}
}
i++;
}
return nove_jmeno;
}
// ===========================================================================
// =~ Funkce pro načítání jednotlivých příkazů ~==============================
// TODO: Podrobnější popis chyby v příkazu?
// Načtení příkazu
data.nacitani.dekoduj_prikaz = function (format, radky_prikazu, novy_prikaz,
novy_slovnik)
{
var vysledek = new Vysledek();
if ( format < data.FORMAT_20 ) {
novy_prikaz.telo.push( [ prikazy.NAZEV, novy_prikaz ] );
}
var i = 0;
while ( i < radky_prikazu.length && !vysledek.byla_chyba() ) {
var radka = radky_prikazu[i].split("%20");
var cislo = parseInt(radka[0]);
if ( isNaN(cislo) || cislo < 0 || cislo >= novy_slovnik.length ) {
vysledek.nastav( new Chyba( true,
"Při zpracování těla příkazu " + novy_prikaz.jmeno +
" nebyl rozpoznán příkaz." ) );
} else {
var novy_jeden_prikaz;
var prikaz = novy_slovnik[cislo];
radka[0] = prikaz;
for ( var j = 1; j < radka.length; j++ ) {
radka[j] = unescape(radka[j]);
}
if ( !prikaz.nacitac ) {
novy_jeden_prikaz = this.obecny(format, radka, novy_prikaz);
} else {
novy_jeden_prikaz = prikaz.nacitac(format, radka, novy_prikaz);
}
if ( novy_jeden_prikaz ) {
novy_prikaz.telo.push(novy_jeden_prikaz);
} else {
vysledek.nastav( new Chyba( true,
"Chybné parametry na řádce " + (i+1) + " v těle příkazu " +
novy_prikaz.jmeno + "." ) );
}
}
i++;
}
return vysledek;
}
// Obecné ukládání
data.nacitani.obecny = function (format, radka, novy_prikaz)
{
if ( radka.length != 1 ) {
return undefined;
} else {
return radka;
}
}
// Cyklus
data.nacitani.nacti_OPAKUJ = function (format, radka, novy_prikaz)
{
if ( radka.length > 2 ) return undefined;
else if ( radka.length == 2 ) {
var pocet = parseInt(radka[1]);
if ( isNaN(pocet) || pocet < -1 ) return undefined;
if ( pocet == -1 ) {
radka = [ radka[0] ];
}
}
return radka;
}
// Podmínka
data.nacitani.nacti_podminku = function (format, radka, novy_prikaz)
{
if ( radka.length != 2 ) return undefined;
var podminka = parseInt(radka[1]);
if ( isNaN(podminka) || podminka == 0
|| !isNaN(podminka) && Math.abs(podminka) > prikazy.podminky.length ) {
return undefined;
}
return radka;
}
// Komentář
data.nacitani.nacti_komentar = function (format, radka, novy_prikaz)
{
if ( radka.length != 2 ) return undefined;
radka[1] = unescape(radka[1]);
return radka;
}
// Název
data.nacitani.nacti_nazev = function (format, radka, novy_prikaz)
{
if ( radka.length != 1 ) return undefined;
radka[1] = novy_prikaz;
return radka;
}
+108
View File
@@ -0,0 +1,108 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní funkce nastavení
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Objekt globálního nastavení
nastaveni = new Object();
// Základní nastavení prodlevy
nastaveni.zakladni_prodleva = 500;
// Nápověda k nastavení rychlosti provádění příkazů
nastaveni.prodleva_tooltip = new Array(
[ 2000, "Prodleva 2,00s", "" ],
[ 1750, "Prodleva 1,75s", "" ],
[ 1500, "Prodleva 1,50s", "" ],
[ 1250, "Prodleva 1,25s", "" ],
[ 1000, "Prodleva 1,00s", "" ],
[ 750, "Prodleva 0,75s", "" ],
[ 500, "Prodleva 0,50s", "" ],
[ 250, "Prodleva 0,25s", "" ],
[ 200, "Prodleva 0,20s", "" ],
[ 150, "Prodleva 0,15s", "" ],
[ 100, "Prodleva 0,10s", "" ],
[ 50, "Prodleva 0,05s", "" ],
[ 0, "Minimální prodleva", "Prováděj příkazy tak rychle, jak to jen jde" ]
);
// Myš
nastaveni.mys = new Mys(new Tooltip());
nastaveni.mys.tooltip.muzu_zobrazit = function (info, detail) { return true; }
// ===========================================================================
// =~ Funkce pro práci s myší ~===============================================
// Proveď nastavení podle výběru
nastaveni.mys.proved_vyber = function(info, detail)
{
nastaveni.prodleva = detail.prodleva;
nastav_cookie("prodleva", detail.prodleva, 365);
prikazy.jadro.prenastav_casovac(detail.prodleva);
return true;
}
nastaveni.mys.proved_zvyrazneni = function(info, detail)
{
return true;
}
nastaveni.mys.prekresli_stav = function(info, detail, zvyraznen, stisknut,
vybran)
{
var element=document.getElementById(info);
var trida;
if ( stisknut || vybran ) {
trida = "vybrany";
} else if ( zvyraznen ) {
trida = "zvyrazneny";
} else {
trida = "nic";
}
ladici_vypis(LADENI, "nastaveni.mys.prekresli_stav", info,
"nastavuji třídu na "+trida);
element.className = trida;
}
nastaveni.mys.tooltip.obnov = function (tooltip, info, detail)
{
tvoric.obnov_tooltip( tooltip, "", detail.nadpis, detail.popis );
}
nastaveni.nastav_prodlevu = function (prodleva)
{
var hodnota = parseInt(prodleva);
if ( prodleva == undefined || isNaN(hodnota) ) {
prodleva = nastaveni.zakladni_prodleva;
}
var nejblizsi = { rozdil: Infinity };
for ( var i = 0; i < nastaveni.prodleva_tooltip.length; i++ ) {
var rozdil = Math.abs(nastaveni.prodleva_tooltip[i][0]-prodleva);
if ( rozdil < nejblizsi.rozdil ) {
nejblizsi.index = i;
nejblizsi.prodleva = nastaveni.prodleva_tooltip[i][0];
nejblizsi.rozdil = rozdil;
nejblizsi.nadpis = nastaveni.prodleva_tooltip[i][1];
nejblizsi.popis = nastaveni.prodleva_tooltip[i][1];
}
}
var mys_info = "prodleva-"+(nejblizsi.index+1);
var mys_detail = {
index: nejblizsi.index,
prodleva: nejblizsi.prodleva,
nadpis: nejblizsi.nadpis,
popis: nejblizsi.popis
};
nastaveni.mys.vyber(mys_info, mys_detail);
}
+64
View File
@@ -0,0 +1,64 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní tvar nastavení
document.write('<div class="nastaveni-prodleva">');
document.write('<div class="prodleva">Rychlost vykonávání příkazů');
document.write('<div class="obsah">');
document.write('<div class="stupnice">');
document.write('<div class="duha"></div>');
for ( var i = 0; i < 2; i++ ) {
if ( i == 0 ) {
document.write('<div class="ukazatel">');
} else {
document.write('<div class="maska">');
}
for ( var j = 0; j < nastaveni.prodleva_tooltip.length; j++ ) {
var id = "prodleva-"+(j+1);
if ( i == 0 ) {
document.write('<div id="'+id+'" class="nic"></div>');
} else {
var mys_info = "'" + id + "'";
var mys_detail =
"{index:"+i+","+
"prodleva:"+nastaveni.prodleva_tooltip[j][0]+","+
"nadpis:'"+nastaveni.prodleva_tooltip[j][1]+"',"+
"popis:'"+nastaveni.prodleva_tooltip[j][2]+"'}";
document.write('<div '+
'onmouseover="return nastaveni.mys.pres(event,'+mys_info+','+
mys_detail+');"'+
'onmouseout="return nastaveni.mys.pryc(event,'+mys_info+','+
mys_detail+');" '+
'onmousedown="return nastaveni.mys.stisk(event,'+mys_info+','+
mys_detail+');"'+
'onmouseup="return nastaveni.mys.pust(event,'+mys_info+','+
mys_detail+');" '+
'></div>');
}
}
document.write('</div>');
}
document.write('</div>');
document.write('<div class="pomalu">Pomalu</div>');
document.write('<div class="rychle">Rychle</div>');
document.write('<div class="stredne">Středně rychle</div>');
document.write('</div>');
document.write('</div></div>');
// Nastavení prodlevy
nastaveni.nastav_prodlevu(hodnota_cookie("prodleva"));
+118
View File
@@ -0,0 +1,118 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní funkce pro panel nástrojů
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Informace o nástrojích
nastroje = new Object();
// Panel nástrojů
nastroje.nastroje = new Array(
[ "karel", "tip-karel", "Robot Karel",
"Přemísti Karla (jeden klik), otoč Karla vlevo (dvojklik)" ],
[ "domov", "tip-domov", "Domov", "Přemísti Karlův domov" ],
[ "zed", "tip-zed", "Zeď", "Postav, nebo zbourej zeď" ],
[ "znacka-plus", "tip-znacka-plus", "Polož značku",
"Polož jednu značku, nejvíce však 8 značek na jedno políčko" ],
[ "znacka-minus", "tip-znacka-minus", "Zvedni značku",
"Zvedni jednu značku, pokud je alespoň jedna na políčku" ],
null,
[ "smaz-vse", "tip-smaz-vse", "Vyčisti město",
"Vyčisti celé město, umísti Karla a domov do levého dolního rohu" ],
[ "smaz", "tip-smaz", "Posbírej značky",
"Posbírej všechny značky ze všech políček města" ],
null,
[ "nacist", "tip-nacist", "Načti město", "Načti uložené město (i slovník)" ],
[ "ulozit", "tip-ulozit", "Ulož město", "Ulož město pro budoucí použití" ],
[ "exportovat-k99", "tip-exportovat-k99", "Exportuj město",
"Ulož město do formátu Visual Karel 99" ]
);
nastroje.nastroje.id_prefix = "nastroje-";
nastroje.nastroje.mys = "nastroje.mys";
// Objekt pro práci s myší
nastroje.mys = new Mys(new Tooltip());
// ===========================================================================
// =~ Základní funkce pro práci s nástroji ~==================================
nastroje.zobraz_pozici = function (vyber)
{
if ( vyber ) {
document.getElementById("pozice-x").firstChild.firstChild.data = vyber.x+1;
document.getElementById("pozice-y").firstChild.firstChild.data = vyber.y+1;
} else {
document.getElementById("pozice-x").firstChild.firstChild.data = "\u2022";
document.getElementById("pozice-y").firstChild.firstChild.data = "\u2022";
}
}
nastroje.mys.prekresli_stav = function(nastroj, detail, zvyraznen, stisknut,
vybran)
{
tvoric.zvyraznovac(
nastroje.nastroje.id_prefix+nastroj, zvyraznen, stisknut, vybran);
}
nastroje.mys.proved_zvyrazneni = function(nastroj, detail)
{
return true;
}
nastroje.mys.proved_vyber = function(nastroj, detail)
{
switch ( nastroj )
{
case "smaz-vse": {
ladici_vypis(LADENI, "nastroje.mys.proved_vyber", "výmaz města");
mesto.vymaz_mesto();
return false;
}
case "smaz": {
ladici_vypis(LADENI, "nastroje.mys.proved_vyber", "výmaz značek");
mesto.vymaz_znacky();
return false;
}
case "nacist": {
data.nacitani.nacti();
return false;
}
case "ulozit": {
data.ukladani.uloz_mesto();
return false;
}
case "exportovat-k99": {
data.ukladani.export_mesto_k99();
return false;
}
default: {
ladici_vypis(LADENI, "nastroje.mys.proved_vyber", "změna nástroje na '"+nastroj+"'");
return true;
}
}
}
nastroje.vybrany = function ()
{
return nastroje.mys.vybran.info;
}
nastroje.vyber = function (nastroj)
{
nastroje.mys.vyber(nastroj);
}
nastroje.mys.tooltip.obnov = function (tooltip, info, detail)
{
tvoric.obnov_tooltip( tooltip, detail.ikona, detail.nadpis, detail.popis );
}
+38
View File
@@ -0,0 +1,38 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní tvar panelu nástrojů
// ===========================================================================
// =~ Vygenerování nástrojů ~=================================================
document.write('<div class="mesto-nastroje">');
document.write('<div id="pozice-x"><span>&bull;</span></div>');
document.write('<div class="times"><span>&times;</span></div>');
document.write('<div id="pozice-y"><span>&bull;</span></div>');
document.write('<div class="nastroje">');
for ( var i = 0; i < nastroje.nastroje.length; i++ ) {
var nastroj = nastroje.nastroje[i];
if ( nastroj != null ) {
tvoric.zapis_tlacitko(false, nastroje.nastroje.id_prefix+nastroj[0],
nastroje.nastroje.mys,
'\''+nastroj[0]+'\'',
'{ikona:\''+nastroj[1]+'\',nadpis:\''+nastroj[2]+'\',popis:\''+nastroj[3]+'\'}');
} else {
tvoric.zapis_tlacitko(true);
}
}
document.write('</div>');
document.write('</div>');
// ===========================================================================
// =~ Základní nastavení ~====================================================
nastroje.vyber( nastroje.nastroje[0][0] );
+495
View File
@@ -0,0 +1,495 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - různé funkce
// ===========================================================================
// =~ Globální proměnné ~=====================================================
je_oldium_dot_home = false;
if ( /^https?:\/\/[^\/]+\.oldium\.home\//.exec(document.URL) ) {
je_oldium_dot_home = true;
}
// ===========================================================================
// =~ Chyba při provádění příkazů ~===========================================
Chyba = function (chyba, text)
{
if ( chyba != undefined ) {
if ( chyba instanceof Chyba ) {
this.chyba = chyba.chyba;
this.text = chyba.formatuj( chyba.text );
this.zobrazen = chyba.zobrazen;
} else {
this.chyba = chyba;
this.text = text;
this.zobrazen = false;
}
} else {
this.chyba = false;
this.zobrazen = false;
}
}
Chyba.prototype.nastav = function (chyba, text)
{
if ( !this.chyba ) {
if ( chyba instanceof Chyba ) {
this.chyba = chyba.chyba;
this.text = chyba.formatuj(chyba.text);
this.zobrazen = this.zobrazen || chyba.zobrazen;
} else {
this.chyba = chyba;
this.text = text;
}
}
}
Chyba.prototype.formatuj = function (text)
{
return text;
}
Chyba.prototype.zobraz = function ()
{
if ( !this.zobrazen && this.chyba && this.text ) {
alert( this.formatuj(this.text) );
this.zobrazen = true;
}
}
Chyba.prototype.byla_chyba = function ()
{
return this.chyba;
}
// ===========================================================================
// =~ Výsledek provedení příkazu ~============================================
Vysledek = function (chyba, stav, hodnota)
{
if ( !chyba ) chyba = new Chyba();
this.chyba = chyba; // Chyba
this.stav = stav;
this.hodnota = hodnota; // Hodnota výsledku
}
Vysledek.NIC = 0; // Žádná zvláštní akce
Vysledek.PROVEDL_AKCI = 1; // Pokud byl proveden KROK, VLEVO-VBOK atp.
Vysledek.PRESKOC_KONEC = 2; // Pokud se má přeskočit blok příkazů
Vysledek.KONEC = 4; // Okamžitý konec
Vysledek.BYL_UPRAVEN = 8; // Příkaz byl upraven
Vysledek.MASKA = Vysledek.KONEC|Vysledek.BYL_UPRAVEN; // Maska neměnnosti
Vysledek.prototype.nastav = function (chyba, stav, hodnota)
{
if ( chyba != null ) {
if ( chyba instanceof Vysledek ) {
var vysledek = chyba;
if ( ! this.chyba.byla_chyba() ) {
this.chyba.nastav( vysledek.chyba );
this.stav =
(this.stav & Vysledek.MASKA) | (vysledek.stav & (~Vysledek.MASKA));
this.hodnota = vysledek.hodnota;
}
this.stav |= vysledek.stav&Vysledek.MASKA;
} else {
this.chyba.nastav( chyba );
this.stav =
((this.stav | stav) & Vysledek.MASKA) | (stav & (~Vysledek.MASKA));
this.hodnota = hodnota;
}
}
}
Vysledek.prototype.byla_chyba = function ()
{
return this.chyba.byla_chyba();
}
Vysledek.prototype.byla_akce = function ()
{
return this.stav & Vysledek.PROVEDL_AKCI;
}
Vysledek.prototype.byl_upraven = function ()
{
return this.stav & Vysledek.BYL_UPRAVEN;
}
Vysledek.prototype.je_konec = function ()
{
return this.chyba.byla_chyba() || (this.stav & Vysledek.KONEC);
}
Vysledek.prototype.je_hodnota = function ()
{
return ( !this.chyba.byla_chyba()
&& this.hodnota != undefined && this.hodnota != null );
}
Vysledek.prototype.ma_preskocit = function ()
{
return this.stav & Vysledek.PRESKOC_KONEC;
}
Vysledek.prototype.zobraz_chybu = function ()
{
this.chyba.zobraz();
}
// ===========================================================================
// =~ Příkazy po nahrání dokumentu ~==========================================
seznam_po_spusteni = new Array();
function po_spusteni (funkce) {
seznam_po_spusteni.push(funkce);
}
function spust_po_spusteni () {
for ( var i = 0; i < seznam_po_spusteni.length; i++ ) {
var funkce = seznam_po_spusteni[i];
funkce();
}
}
// ===========================================================================
// =~ Nahrání nápovědy a příkladů ~===========================================
okno_napoveda = null;
okno_priklady = null;
function otevri_okno( url, jmeno, okno )
{
try {
if ( okno && okno.closed() ) {
okno = null;
}
} catch (e) {
okno = null;
}
if ( !okno ) {
okno = window.open( url, jmeno );
}
if ( okno ) {
okno.focus();
}
return okno;
}
function napoveda() {
okno_napoveda = otevri_okno(
"napoveda.html", "karel_napoveda", okno_napoveda
);
}
function priklady() {
okno_priklady = otevri_okno(
"priklady.html", "karel_okno", okno_priklady
);
}
// ===========================================================================
// =~ Různé funkce ~==========================================================
// Test shodnosti dvou objektů
function jsou_shodne(a, b)
{
if ( a == null || b == null ) return false;
var type_a = typeof(a);
var type_b = typeof(b);
if ( type_a != type_b ) return false;
if ( type_a == "object" ) {
var pocet=0;
for ( var x in a ) {
if ( a[x] != b[x] ) {
return false;
}
pocet++;
}
for ( var x in b ) {
pocet--;
}
return (pocet == 0);
} else {
return (a == b);
}
}
// Vrať textovou reprezentaci
function formatuj_text(text)
{
if ( text == undefined ) {
return "nedefinován";
} else if ( text == null ) {
return "prázdný";
} else {
switch ( typeof(text) ) {
case "boolean":
if ( text ) {
return "ano";
} else {
return "ne";
}
case "object":
if ( text instanceof Date ) {
var format = text.getUTCFullYear() + "-" +
new String("0"+(text.getMonth()+1)).slice(-2) + "-" +
new String("0"+(text.getDate())).slice(-2) + " " +
new String("0"+(text.getHours())).slice(-2) + ":" +
new String("0"+(text.getMinutes())).slice(-2) + ":" +
new String("0"+(text.getSeconds())).slice(-2) + "." +
new String("00"+(text.getMilliseconds())).slice(-3);
return format;
} else if ( "innerText" in text || "innerHTML" in text
|| typeof(Element) == "object" && text instanceof Element ) {
var navrat = "";
for ( var hodnota in text ) {
var neni_text = ! /^((inner|outer)(HTML|Text)|text(Content)?)$/.exec(hodnota);
var neni_funkce = (typeof(text[hodnota]) != "function");
if ( neni_text && neni_funkce ) {
navrat += hodnota+":"+text[hodnota]+" ";
}
}
return navrat.slice(0,-1);
} else {
var hodnoty = new Array();
var navrat = "";
for ( var hodnota in text ) {
var neni_funkce = (typeof(text[hodnota]) != "function");
if ( neni_funkce ) {
hodnoty.push(hodnota);
navrat += hodnota+":"+text[hodnota]+" ";
}
}
if ( hodnoty.length == 2 &&
hodnoty[0] == 'x' || hodnoty[0] == 'y' &&
hodnoty[1] == 'x' || hodnoty[1] == 'y'
) {
return "x:"+(text.x+1)+" y:"+(text.y+1);
} else {
return navrat.slice(0,-1);
}
}
default:
return ""+text;
}
}
}
// Nastav hodnotu cookie. Lze zadat buď čas, nebo počet dnů do vypršení
function nastav_cookie(nazev, hodnota, vyprsi)
{
var text_vyprsi = "";
if ( vyprsi != undefined ) {
var datum;
if ( typeof(vyprsi) == "object" ) {
datum = text_vyprsi;
} else {
datum = new Date();
datum.setTime(datum.getTime()+(vyprsi*24*60*60*1000));
}
text_vyprsi = "; expires="+datum.toUTCString();
}
var uloz = escape(hodnota);
ladici_vypis(LADENI, "pridej_cookie", "nastavuji cookie "+nazev+"="+hodnota);
document.cookie = nazev+"="+uloz+text_vyprsi+"; path=/";
}
// Zjisti hodnotu cookie
function hodnota_cookie(nazev)
{
var vyhledej = nazev + "=";
var cookie = document.cookie.split(";");
for ( var i = 0; i < cookie.length; i++ ) {
var hodnota = cookie[i];
while ( hodnota.charAt(0) == " " ) {
hodnota = hodnota.slice(1);
}
if ( hodnota.indexOf(vyhledej) == 0 ) {
var vrat = unescape(hodnota.slice(vyhledej.length));
ladici_vypis(LADENI, "hodnota_cookie", "hodnota cookie "+nazev+"="+vrat);
return vrat;
}
}
ladici_vypis(LADENI, "hodnota_cookie", "hodnota cookie "+nazev+" nenalezena");
return null;
}
// Zruš cookie
function zrus_cookie(nazev)
{
pridej_cookie(nazev, "", -1);
}
// Nastav text objektu
function nastav_text(element, text)
{
if ( (element.firstChild &&
(( typeof(Text) != "undefined" && element.firstChild instanceof Text ) ||
element.firstChild.splitText
))
) {
if ( text == "" ) {
element.removeChild(element.firstChild);
} else {
element.firstChild.nodeValue = text;
}
} else {
if ( text != "" ) {
element.insertBefore(document.createTextNode(text), element.firstChild);
}
}
}
// Zjisti zdrojový element události (např. kde bylo kliknuto)
function zdrojovy_element(udalost)
{
if ( ! udalost ) {
return undefined;
} else if ( udalost.currentTarget ) {
return udalost.currentTarget;
} else if ( udalost.srcElement ) {
return udalost.srcElement;
} else {
return undefined;
}
}
// Zjisti pozici objektu
function zjisti_pozici(objekt)
{
if ( objekt != null ) {
var otec = zjisti_pozici(objekt.offsetParent);
return {
x: objekt.offsetLeft+otec.x,
y: objekt.offsetTop+otec.y
};
} else {
return { x: 0, y: 0 };
}
}
// Zjisti velikost objektu
function zjisti_velikost(objekt)
{
return { x: objekt.clientWidth, y: objekt.clientHeight };
}
// Zjisti velikost okna prohlížeče - pouze viditelnou část bez posuvníků
function zjisti_velikost_okna()
{
var velikost1 = zjisti_pozici( document.getElementById('okno1') );
var velikost2 = zjisti_velikost( document.getElementById('okno2') );
if ( velikost1.x != 0 || velikost1.y != 0 || velikost2.x == 0 ) {
return velikost1;
} else {
return velikost2;
}
}
// Zjisti pozici posuvníků
function zjisti_scroll()
{
var element = document.documentElement;
var body = document.body;
return {
x: Math.max(body.scrollLeft, element.scrollLeft),
y: Math.max(body.scrollTop, element.scrollTop)
};
}
// Spočítej rozměry (okraje) podle pozice a velikost
function spocitej_rozmery(pozice, velikost)
{
return {
levy: pozice.x,
pravy: pozice.x + velikost.x,
horni: pozice.y,
dolni: pozice.y + velikost.y
};
}
// Zmenši okraj o dané rozměry
function pridej_okraj(rozmery, okraj)
{
return {
levy: rozmery.levy + okraj,
horni: rozmery.horni + okraj,
pravy: rozmery.pravy - okraj,
dolni: rozmery.dolni - okraj
}
}
// Posun horizontálně
function posun_x(rozmery, posun)
{
return {
levy: rozmery.levy + posun,
horni: rozmery.horni,
pravy: rozmery.pravy + posun,
dolni: rozmery.dolni
};
}
// Posun vertikálně
function posun_y(rozmery, posun)
{
return {
levy: rozmery.levy,
horni: rozmery.horni + posun,
pravy: rozmery.pravy,
dolni: rozmery.dolni + posun
};
}
// Zjisti rozměry objektu. Pokud není určen objekt, vrať velikost okna
// prohlížeče a stránky
function zjisti_rozmery(objekt)
{
if ( objekt != undefined ) {
return spocitej_rozmery(zjisti_pozici(objekt), zjisti_velikost(objekt));
} else {
var okraj = document.getElementById('okraj').offsetTop/2;
var stranka = document.getElementById('stranka');
var velikost_okna = zjisti_velikost_okna();
var scroll = zjisti_scroll();
var okno_rozmery = {
levy: scroll.x,
horni: scroll.y,
pravy: scroll.x + velikost_okna.x,
dolni: scroll.y + velikost_okna.y
};
// Rozměry stránky nemůžou být menší, než je okno prohlížeče
var stranka_rozmery = {
levy: 0,
horni: 0,
pravy: Math.max( stranka.offsetWidth, okno_rozmery.pravy ),
dolni: Math.max( stranka.offsetHeight, okno_rozmery.dolni )
};
ladici_vypis(LADENI, "zjisti_rozmery", okno_rozmery, "rozměry okna");
ladici_vypis(LADENI, "zjisti_rozmery", stranka_rozmery, "rozměry stránky");
return {
okno: pridej_okraj( okno_rozmery, okraj ),
stranka: pridej_okraj( stranka_rozmery, okraj )
};
}
}
+267
View File
@@ -0,0 +1,267 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - inicializace a ovládání okna pro uložení a export
// ===========================================================================
// =~ Základní funkce pro ovládání vstupu a výstupu ~=========================
// Typ okna
data.ukladani.typ = new Object();
data.ukladani.typ.NORMALNI = 0;
data.ukladani.typ.KOMENTARE = 2;
// Zobrazení okna podle typu dat. Vstupní data se očekávají ve formátu
// unescape(), tedy tak, jak mají být zobrazena
data.ukladani.zobraz_v_okne = function (typ, hlavicka, popis, data, pocet_radek)
{
// Nové okno
var w = window.open( "", "", "directories=no,hotkeys=no,"+
"location=no,menubar=no,personalbar=no,resizable=yes,scrollbars=yes,"+
"status=no,toolbar=no,width=550,height=480" );
// Zapiš hlavičku
w.document.write(
'<?xml version="1.0" encoding="utf-8"?>' +
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" ' +
'"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">' +
'<html xmlns="http://www.w3.org/1999/xhtml">' +
'<head><title>Robot Karel: ' + hlavicka + '</title>' +
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' +
'<meta http-equiv="Content-Language" content="cs" />' +
'<meta name="Description" content="Robot Karel: ' + hlavicka + '" />' +
'<meta name="Author" content="Oldřich Jedlička" />' +
'<link href="favicon.ico" rel="icon" />' +
'<link href="favicon.ico" rel="shortcut icon" />' +
'<style type="text/css">' +
'body {' +
' font-family: Arial, Helvetica, sans-serif;' +
' font-weight: normal;' +
' font-size: small;' +
' cursor: default;' +
' height: auto;' +
' margin: 0;' +
' padding: 0;' +
'}' +
'' +
'.stranka {' +
' z-index: -1;' +
' margin: 0;' +
' padding: 8px;' +
'}' +
'' +
'.obsah {' +
' padding: 10px;' +
' border: 1px solid;' +
' border-top-color: rgb(90%, 90%, 90%);' +
' border-left-color: rgb(90%, 90%, 90%);' +
' border-right-color: rgb(40%, 40%, 40%);' +
' border-bottom-color: rgb(40%, 40%, 40%);' +
' background-color: rgb(75%, 75%, 75%);' +
'}' +
'' +
'p {' +
' margin-top: 0;' +
' margin-bottom: 8px;' +
'}' +
'' +
'form {' +
' margin: 0;' +
' padding: 0;' +
'}' +
'' +
'#vnitrni-ramec {' +
' display: block;' +
' width: 100%;' +
' height: 100%;' +
' margin: 0;' +
' padding: 0;' +
' border: 0;' +
' background-color: rgb(50%, 90%, 50%);' +
'}' +
'' +
'#ramecek {' +
' width: 100%;' +
' font-size: 12px;' +
' height: ' + (pocet_radek * 2) + 'ex;' +
' border: 1px solid;' +
' border-top-color: rgb(40%, 40%, 40%);' +
' border-left-color: rgb(40%, 40%, 40%);' +
' border-bottom-color: rgb(90%, 90%, 90%);' +
' border-right-color: rgb(90%, 90%, 90%);' +
' padding: 0;' +
' margin: 0;' +
'}' +
'</style>' );
this.zapis_zmen_komentare( w.document, data );
w.document.write(
'</head>' +
'<body>'+
'<div class="stranka">' + // Stránka
'<div class="obsah">' +
popis +
'<form action="#">' );
if ( typ == this.typ.KOMENTARE ) {
w.document.write(
'<p>\n' +
'<input type="radio" name="komentare" id="zobraz-vse" ' +
'alt="Zobrazit vše" checked="checked" ' +
'onclick="zmen_komentare();" onkeyup="zmen_komentare();" />\n' +
'<label for="zobraz-vse">Zobrazit vše</label>\n' +
'<input type="radio" name="komentare" id="skryj-komentare" ' +
'alt="Skrýt komentáře" '+
'onclick="zmen_komentare();" onkeyup="zmen_komentare();" />\n' +
'<label for="skryj-komentare">Skrýt komentáře</label>\n' +
'<input type="radio" name="komentare" id="skryj-vse" ' +
'alt="Skrýt komentáře i prázdné řádky" ' +
'onclick="zmen_komentare();" onkeyup="zmen_komentare();" />\n' +
'<label for="skryj-vse">Skrýt komentáře i prázdné řádky</label>\n' +
'</p>' );
}
w.document.write(
'<div id="ramecek"></div>' +
'</form>' +
'</div>' +
'</div>' +
'</body>' +
'</html>'
);
w.document.close();
var obsah = w.document.createElement('iframe');
obsah.setAttribute("id", "vnitrni-ramec");
w.document.getElementById("ramecek").appendChild(obsah);
obsah.contentWindow.document.open('text/html', 'replace');
obsah.contentWindow.document.write(
'<?xml version="1.0" encoding="utf-8"?>' +
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" ' +
'"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">' +
'<html xmlns="http://www.w3.org/1999/xhtml">' +
'<head><title>Robot Karel: ' + hlavicka + '</title>' +
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' +
'<meta http-equiv="Content-Language" content="cs" />' +
'<meta name="Description" content="Robot Karel: ' + hlavicka + '" />' +
'<meta name="Author" content="Oldřich Jedlička" />' +
'<link href="favicon.ico" rel="icon" />' +
'<link href="favicon.ico" rel="shortcut icon" />' +
'<style type="text/css">' +
'html {' +
' height: 100%;' +
'}' +
'' +
'body {' +
' font-family: Arial, Helvetica, sans-serif;' +
' font-weight: normal;' +
' font-size: small;' +
' height: 100%;' +
' cursor: default;' +
' margin: 0;' +
' padding: 0;' +
'}' +
'' +
'#zobrazene {' +
' border: 0px;' +
' margin: 0;' +
' padding: 0;' +
' width: 100%;' +
' height: 100%;' +
' font-size: 12px;' +
' white-space: pre-wrap;' +
' white-space: -moz-pre-wrap !important;' +
' white-space: -pre-wrap;' +
' white-space: -o-pre-wrap;' +
' word-wrap: break-word;' +
' background-color: rgb(50%, 90%, 50%);' +
'}' +
'</style>' +
'</head>' +
'<body>' +
'<pre id="zobrazene">' +
'</pre>' +
'</body>' +
'</html>'
);
obsah.contentWindow.document.close();
w.zmen_komentare();
w.focus();
}
// Zobrazení s komentáři, nebo bez nich
data.ukladani.zapis_zmen_komentare = function (d, text) {
var puvodni_obsah = escape(text);
var bez_komentaru = puvodni_obsah.replace(
/%3B([^%]|%(?!0A))*/g, "" );
bez_komentaru = bez_komentaru.replace(
/^(%09|%0A|%0D|%20)+/g, "" );
bez_komentaru = bez_komentaru.replace(
/%0A((%09|%0A|%0D|%20)*%0A)+((%09|%0A|%0D|%20)*%0A)/g, "%0A$3" );
bez_komentaru = bez_komentaru.replace(
/%0A+$/g, "" );
var beze_vseho = bez_komentaru.replace(
/%0A(%20)+%0A/g, "%0A" );
d.write(
'<script type="text/javascript" charset="utf-8">' );
d.write('puvodni_obsah="' + puvodni_obsah + '";' );
d.write('bez_komentaru="' + bez_komentaru + '";' );
d.write('beze_vseho="' + beze_vseho + '";' );
d.write(
'function nastav_text(element, text) {' +
' if ( (element.firstChild &&' +
' (( typeof(Text) != "undefined" && element.firstChild instanceof Text ) ||' +
' element.firstChild.splitText' +
' ))' +
' ) {' +
' if ( text == "" ) {' +
' element.removeChild(element.firstChild);' +
' } else {' +
' element.firstChild.nodeValue = text;' +
' }' +
' } else {' +
' if ( text != "" ) {' +
' element.insertBefore(document.createTextNode(text), element.firstChild);' +
' }' +
' }' +
'}' );
d.write(
'function zmen_komentare() {' +
' var zobraz_vse = document.getElementById("zobraz-vse");' +
' var skryj_komentare = document.getElementById("skryj-komentare");' +
' var skryj_vse = document.getElementById("skryj-vse");' +
' var zobrazene = document.getElementById("vnitrni-ramec").contentWindow.document.getElementById("zobrazene");' +
' if ( zobrazene && zobraz_vse && skryj_komentare && skryj_vse ) {' +
' if ( zobraz_vse.checked ' +
' || ( !skryj_komentare.checked && !skryj_vse.checked ) ) {'+
' nastav_text(zobrazene, unescape(puvodni_obsah));' +
' } else if ( skryj_komentare.checked ) {' +
' nastav_text(zobrazene, unescape(bez_komentaru));' +
' } else if ( skryj_vse.checked ) {' +
' nastav_text(zobrazene, unescape(beze_vseho));' +
' }' +
' } else {' +
' nastav_text(zobrazene, unescape(puvodni_obsah));' +
' }' +
'}' );
d.write(
'</script>' );
}
+420
View File
@@ -0,0 +1,420 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - ovládání editoru
// POZNÁMKA: Řetězec načtený z příkazového pole je vnitřně udržován ve formě
// escape(), protože Konqueror (KDE JavaScript) neumí pracovat s Unicode.
// ===========================================================================
// =~ Globální nastavení ~====================================================
// Ukládat, nebo neukládat syntakticky chybné příkazy?
nastaveni.ukladat_syntakticky_chybne = true;
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Editor
editor = new Object();
// Panel nástrojů
editor.nastroje = new Array(
[ "novy", "tip-novy", "Nový příkaz", "Vytvoř nový příkaz" ],
null,
[ "ulozit", "tip-ulozit-prikaz", "Ulož příkaz", "Ulož příkaz do slovníku" ],
[ "ulozit-jako", "tip-ulozit-jako", "Ulož příkaz nově", "Ulož příkaz pod novým jménem" ]
);
editor.nastroje.id_prefix = "editor-";
editor.nastroje.mys = "editor.mys_nastroje";
// Myš nad nástroji
editor.mys_nastroje = new Mys(new Tooltip());
// Zobrazený příkaz včetně textového obsahu (pro účely zjištění změny)
editor.zobrazeny = { prikaz: null, obsah: null, zmeneny: false };
// ===========================================================================
// =~ Základní funkce pro práci se slovníkem ~================================
editor.mys_nastroje.proved_zvyrazneni = function(info, detail)
{
return true;
}
editor.mys_nastroje.prekresli_stav = function(nastroj, detail, zvyraznen,
stisknut, vybran)
{
tvoric.zvyraznovac( editor.nastroje.id_prefix+nastroj, zvyraznen, stisknut,
vybran);
}
editor.mys_nastroje.vyber = function(nastroj, detail)
{
switch ( nastroj ) {
case "novy":
editor.prikaz_novy();
break;
case "ulozit":
case "ulozit-jako":
editor.prikaz_uloz( (nastroj == "ulozit-jako") );
break;
default:
ladici_vypis(CHYBA, "editor.mys_nastroje.vyber", nastroj,
"vybrán neznámý příkaz");
}
return false;
}
editor.mys_nastroje.tooltip.obnov = function (tooltip, info, detail)
{
tvoric.obnov_tooltip( tooltip, detail.ikona, detail.nadpis, detail.popis );
}
// Zruš ukazatel změny příkazu
editor.zrus_zmenu = function()
{
nastav_text(document.getElementById('zmeneny-prikaz'), '');
this.zobrazeny.zmeneny = false;
}
// Editovaný text s upravenými konci řádku
editor.editovany_text = function (text)
{
var element = document.getElementById('editace');
if ( text ) {
element.value = unescape(text);
} else {
// Konqueror neumí správně nahrazovat, proto řetězec zpracováváme v escape
// módu
var obsah = escape(element.value);
return obsah.replace(/%0D(%0A)?/g, "%0A");
}
}
// Nastaví jméno zobrazeného příkazu
editor.zobrazene_jmeno = function (text)
{
nastav_text(document.getElementById('zobrazeny-prikaz'),
text);
}
// Nastav (obnov) ukazatel změny příkazu
editor.nastav_zmenu = function ()
{
if ( this.zobrazeny.obsah != this.editovany_text() ) {
nastav_text(document.getElementById('zmeneny-prikaz'), '+');
this.zobrazeny.zmeneny = true;
} else {
this.zrus_zmenu();
}
return this.zobrazeny.zmeneny;
}
// Kontrola změny příkazu a uložení změn. Vrací true, pokud se může pokračovat
editor.kontrola_zmeny = function ()
{
if ( this.nastav_zmenu() ) {
var jmeno = "Nový příkaz";
if ( this.zobrazeny.prikaz ) {
jmeno = "Zobrazený příkaz " + this.zobrazeny.prikaz.jmeno;
}
var uzivatel_chce = window.confirm( jmeno + " byl změněn.\n\nPřejete si ho uložit?\n" +
"(OK=Ano, Storno=Ne)" );
if ( uzivatel_chce ) {
return editor.prikaz_uloz();
} else {
var uzivatel_chce = window.confirm( jmeno +
" nebyl uložen. Přesto pokračovat?" );
if ( !uzivatel_chce ) {
return false;
}
}
}
return true;
}
// ===========================================================================
// =~ Formátování chyb ~======================================================
// Zobrazení chyby při ukládání příkazu
editor.formatuj_chybu_ukladani = function (text, uloz_nove, nove_jmeno,
cislo_radky, telo, ulozit)
{
var text_radky = "";
var prikaz_radky = "";
var varovani = "";
if ( cislo_radky != undefined && cislo_radky != null && cislo_radky >= 0 ) {
text_radky = " na řádce " + (cislo_radky+1);
if ( telo && cislo_radky < telo.length ) {
prikaz_radky = ": " +
prikazy.formatovac.zformatuj_jednu_radku(telo[cislo_radky]);
}
}
if ( !ulozit ) {
varovani = "\n\nZměny příkazu nebyly uloženy.";
}
if ( nove_jmeno ) {
return "Ukládaný příkaz " + nove_jmeno +
" má chybu" + text_radky + prikaz_radky + ".\n" + text + varovani;
} else if ( uloz_nove && this.zobrazeny.prikaz ) {
return "Zobrazený příkaz " + this.zobrazeny.prikaz.jmeno +
" má chybu" + text_radky + prikaz_radky + ".\n" + text + varovani;
} else {
return "Ukládaný příkaz má" + text_radky + " chybu" + prikaz_radky +
".\n" + text + varovani;
}
}
// Zobrazení chyby při zobrazení příkazu
editor.formatuj_chybu_zobrazeni = function (text, jmeno, cislo_radky, telo)
{
var text_radky = "";
var prikaz_radky = "";
if ( cislo_radky != undefined && cislo_radky != null ) {
text_radky = " na řádce " + (cislo_radky+1);
if ( telo && cislo_radky < telo.length ) {
prikaz_radky = ": " +
prikazy.formatovac.zformatuj_jednu_radku(telo[cislo_radky]);
}
}
return "Zobrazovaný příkaz " + jmeno +
" má chybu" + text_radky + prikaz_radky + ".\n" + text;
}
// ===========================================================================
// =~ Příkazy editace ~=======================================================
// Nový příkaz
editor.prikaz_novy = function (bez_kontroly)
{
if ( !bez_kontroly && !this.kontrola_zmeny() ) return;
var jmeno;
var i = 1;
do {
jmeno = "NOVÝ PŘÍKAZ";
if ( i > 1 ) jmeno += " "+i;
for ( var j = prikazy.seznam.length-1;
j >= 0 && !prikazy.seznam[j].systemovy; j-- ) {
if ( jmeno == prikazy.seznam[j].jmeno ) break;
}
if ( j < 0 || j >= 0 && prikazy.seznam[j].systemovy ) break;
i++;
} while ( true );
// Struktura nového příkazu pro zformátování. Zformátování je nutné, protože
// se obsah uchovává ve formě escape()
var prikaz = { jmeno: jmeno };
prikaz.telo = [ [ prikazy.NAZEV, prikaz ], [ prikazy.KONEC ] ];
var obsah = new Obsah();
var vysledek = prikazy.formatovac.zformatuj_prikaz(prikaz, obsah);
this.zobrazene_jmeno(prikazy.zadny_prikaz);
this.zobrazeny.prikaz = null;
this.zobrazeny.obsah = obsah.obsah();
this.editovany_text( this.zobrazeny.obsah );
this.zrus_zmenu();
}
// Zkontroluj, jestli se nepřepisuje nějaký příkaz. Vrací false, pokud se nemá
// přepisovat; true, pokud se normálně pokračuje; nebo příkaz pro smazání, pokud
// se přepisuje
editor.kontrola_prepsani = function (uloz_nove, novy_prikaz)
{
var smaz_prikaz;
for ( var i = prikazy.seznam.length-1; i >= 0; i-- ) {
var prikaz = prikazy.seznam[i];
if ( prikaz.zobrazit ) {
if ( prikaz.jmeno == novy_prikaz.jmeno
&& this.zobrazeny.prikaz != prikaz ) {
if ( !window.confirm("Opravdu má být přepsán příkaz " +
prikaz.jmeno + "?") ) {
return false;
} else {
if ( !uloz_nove && this.zobrazeny.prikaz ) {
// Po změně musíme smazat původní příkaz
smaz_prikaz = this.zobrazeny.prikaz;
this.zobrazeny.prikaz = prikaz;
return smaz_prikaz;
} else {
this.zobrazeny.prikaz = prikaz;
return true;
}
}
}
}
}
return true;
}
// Proveď uložení příkazu
editor.proved_ulozeni = function (uloz_nove, novy_prikaz, obsah)
{
if ( uloz_nove || !this.zobrazeny.prikaz ) {
prikazy.pridej_novy(novy_prikaz);
} else {
prikazy.zmen_prikaz(this.zobrazeny.prikaz, novy_prikaz);
}
this.zobrazeny.obsah = obsah;
this.zobrazeny.prikaz = novy_prikaz;
this.zobrazene_jmeno(novy_prikaz.jmeno);
}
// Ulož příkaz. Vrací true, pokud se může pokračovat
editor.prikaz_uloz = function (uloz_nove)
{
if ( !prikazy.test_spusteni() ) return false;
var text = this.editovany_text();
var vysledek = new Vysledek();
var uloz_nove_prikaz = (!uloz_nove ? this.zobrazeny.prikaz : undefined);
vysledek.nastav( prikazy.rozpoznavac.rozpoznej( text, uloz_nove_prikaz ) );
var novy_prikaz = vysledek.hodnota.prikaz;
var obsah = vysledek.hodnota.obsah;
var cislo_radky = vysledek.hodnota.cislo_radky;
var ulozit = false;
if ( !vysledek.byla_chyba() ) {
var novy_obsah = new Obsah();
vysledek.nastav(
prikazy.formatovac.zformatuj_prikaz(novy_prikaz, novy_obsah) );
obsah = novy_obsah.obsah();
cislo_radky = vysledek.hodnota.cislo_radky;
// Uložit příkaz, stejně jako ve verzi 1.2, nebo neuložit?
if ( nastaveni.ukladat_syntakticky_chybne ) {
ulozit = true;
} else {
ulozit = !vysledek.byla_chyba();
}
}
vysledek.chyba.formatuj = function (text) {
return editor.formatuj_chybu_ukladani(text, uloz_nove, novy_prikaz.jmeno,
cislo_radky, novy_prikaz.telo,
ulozit);
}
// Obnov obsah editovacího pole
if ( obsah != this.editovany_text() ) {
this.editovany_text( obsah );
}
// Kontrola přepsání zobrazeného příkazu
if ( novy_prikaz.jmeno ) {
if ( uloz_nove && this.zobrazeny.prikaz
&& this.zobrazeny.prikaz.jmeno == novy_prikaz.jmeno ) {
uloz_nove = false;
}
}
vysledek.zobraz_chybu();
if ( ulozit ) {
var smaz_prikaz;
var vyber_prikaz;
// Kontrola přepsání
smaz_prikaz = this.kontrola_prepsani(uloz_nove, novy_prikaz);
if ( !smaz_prikaz ) {
ulozit = false;
}
// Zjisti, jestli se má udržet nějaký výběr
if ( ulozit && !uloz_nove && smaz_prikaz instanceof Object
&& prikazy.vybrany_prikaz() == smaz_prikaz.jmeno ) {
vyber_prikaz = novy_prikaz.jmeno;
}
// Smaž příkaz, pokud je co smazat
if ( smaz_prikaz instanceof Object ) {
prikazy.nahrad_telo( smaz_prikaz, novy_prikaz );
prikazy.proved_smazani( smaz_prikaz );
}
// Ulož nový příkaz
if ( ulozit ) {
this.proved_ulozeni( uloz_nove, novy_prikaz, obsah );
}
// Obnov výběr příkazu
if ( vyber_prikaz && vyber_prikaz != prikazy.vybrany_prikaz() ) {
prikazy.vyber_prikaz(vyber_prikaz);
}
} // end if ( !chyba.byla_chyba() )
// Indikuj změnu obsahu a vrať výsledek - true, pokud bylo uloženo
return !this.nastav_zmenu();
}
// Příkaz byl doplněn, obnov zobrazení
editor.prikaz_upraven = function (prikaz)
{
if ( this.zobrazeny.prikaz == prikaz ) {
var obsah = new Obsah();
prikazy.formatovac.zformatuj_prikaz( this.zobrazeny.prikaz, obsah );
this.zobrazeny.obsah = obsah.obsah();
if ( this.nastav_zmenu() ) {
// Pokud nebyl příkaz změněný, zobraz nový obsah
this.editovany_text( obsah.obsah() );
this.nastav_zmenu();
}
}
}
// Zobrazit vybraný příkaz
editor.zobraz_vybrany_prikaz = function ()
{
if ( !this.kontrola_zmeny() ) return;
// Kontrola vybraného příkazu je nutná i zde, protože se výběr mohl
// uložením změnit
var jmeno = prikazy.vybrany_prikaz();
if ( !(jmeno && prikazy.prikaz[jmeno]) ) {
alert( "Není vybrán žádný příkaz.\n\n" +
"Příkaz vyberte klepnutím myši." );
return;
}
var prikaz = prikazy.prikaz[jmeno];
var vysledek = new Vysledek();
var obsah = new Obsah();
var chyba = new Chyba();
vysledek.nastav( prikazy.formatovac.zformatuj_prikaz(prikaz, obsah) );
vysledek.chyba.formatuj = function (text) {
return editor.formatuj_chybu_zobrazeni(text, prikaz.jmeno,
vysledek.hodnota.cislo_radky,
prikaz.telo);
}
this.zobrazeny.prikaz = prikaz;
this.zobrazene_jmeno(prikaz.jmeno);
this.zobrazeny.obsah = obsah.obsah();
this.editovany_text( obsah.obsah() );
this.nastav_zmenu();
vysledek.zobraz_chybu();
}
// Příkaz byl smazán
editor.smaz_prikaz = function (prikaz)
{
if ( this.zobrazeny.prikaz == prikaz ) {
this.zobrazeny.prikaz = null;
this.zobrazeny.obsah = null;
this.zobrazene_jmeno(prikazy.zadny_prikaz);
this.nastav_zmenu();
}
}
+643
View File
@@ -0,0 +1,643 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - příkazy a ovládání slovníku
// ===========================================================================
// =~ Globální nastavení ~====================================================
// Při smazání slovníku: zachovat zobrazený příkaz, nebo nezachovat?
nastaveni.zachovej_zobrazeny_prikaz = false;
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Počet systémových příkazů
prikazy.pocet_systemovych = prikazy.seznam.length;
// Tooltip
prikazy.tooltip = {
spustit: "Proveď příkaz",
zastavit: "Zastav provádění příkazu"
};
// Prefix pro ID příkazů
prikazy.id_prefix = "příkaz ";
// Prefix pro název příkazů
prikazy.nazev_prefix = "název ";
// Prefix pro celý příkaz
prikazy.prikaz_prefix = "celý příkaz ";
// Zobrazený název, když není nic vybraného
prikazy.zadny_prikaz = "(žádný)";
// Panel nástrojů
prikazy.nastroje = new Array(
[ "zobraz", "tip-zobraz", "Ukaž příkaz", "Ukaž vybraný příkaz" ],
[ "smaz", "tip-smaz-prikaz", "Smaž příkaz", "Vymaž vybraný příkaz z paměti" ],
null,
[ "smaz-vse", "tip-smaz-vse", "Reset paměti", "Vymaž všechny naučené příkazy z paměti" ],
null,
[ "nacist", "tip-nacist", "Načti slovník", "Načti uložený slovník (i město)" ],
[ "ulozit", "tip-ulozit", "Ulož slovník", "Ulož slovník pro budoucí použití. " +
"Při ukládání se automaticky použije nejstarší formát vhodný pro uložení" ],
null,
[ "exportovat-12", "tip-exportovat-12", "Ulož slovník",
"Ulož slovník ve starším formátu rozpoznaném starším Karlem 1.2. "+
"Komentáře a prázdné řádky nebudou zachovány. Při ukládání se " +
"automaticky použije nejstarší formát vhodný pro uložení" ],
[ "exportovat-k99", "tip-exportovat-k99", "Exportuj slovník",
"Ulož slovník do formátu Visual Karel 99" ]
);
prikazy.nastroje.id_prefix = "slovnik-";
prikazy.nastroje.mys = "prikazy.mys_nastroje";
// Myš nad tlačítkem
prikazy.mys_tlacitko = new Mys(new Tooltip());
// Myš nad příkazem
prikazy.mys_prikaz = new Mys();
// Myš nad nástroji
prikazy.mys_nastroje = new Mys(new Tooltip());
// ===========================================================================
// =~ Základní funkce pro práci se slovníkem ~================================
// Kontrola prázdného slovníku
prikazy.je_slovnik_prazdny = function ()
{
return ( prikazy.seznam[prikazy.seznam.length-1].systemovy );
}
// Zobraz nový příkaz v seznamu příkazů
prikazy.pridej = function (prikaz)
{
var id = prikazy.id_prefix+prikaz.jmeno;
var nazev = prikazy.nazev_prefix+prikaz.jmeno;
var prikaz_id = prikazy.prikaz_prefix+prikaz.jmeno;
// Elementy
var element = document.getElementById('zobrazene');
var element_prikaz = document.createElement('DIV');
var element_nazev = element_prikaz.cloneNode(false);
var element_nazev_text = document.createElement('DIV');
// Text
element_nazev_text.appendChild( document.createTextNode(prikaz.jmeno) );
// Události
tvoric.nastav_udalosti_mysi( element_nazev, "prikazy.mys_prikaz",
'\''+nazev+'\'', '\''+prikaz.jmeno+'\'' );
// Styly
element_prikaz.className = "prikaz";
element_nazev.className = "nazev";
element_nazev.id = nazev;
element_nazev_text.className = "nazev-text";
element_prikaz.id = prikaz_id;
// Tlačítko
var element_tlacitko = tvoric.vytvor_tlacitko( false, id,
"prikazy.mys_tlacitko", '\''+id+'\'', '\''+prikaz.jmeno+'\'' );
// Tvar
element_nazev.appendChild( element_nazev_text );
element_prikaz.appendChild( element_tlacitko );
element_prikaz.appendChild( element_nazev );
// Zařazení do HTML
element.appendChild( element_prikaz );
}
// Smaž příkaz ze zobrazeného seznamu příkazů
prikazy.zrus = function (prikaz)
{
var prikaz_id = prikazy.prikaz_prefix+prikaz.jmeno;
var element_prikaz = document.getElementById( prikaz_id );
element_prikaz.parentNode.removeChild(element_prikaz);
}
// Inicializace nového příkazu
prikazy.nastav_novy = function (prikaz)
{
prikaz.zobrazit = true;
prikaz.spust = prikazy.jadro.UZIVATELSKY;
prikaz.kompatibilita = prikazy.min_VERZE_10;
prikaz.verze_ulozeni = prikazy.min_VERZE_10;
}
// Přidej nový příkaz a obnov zobrazený seznam
prikazy.pridej_novy = function (prikaz)
{
if ( ! (prikaz instanceof Object) ) {
ladici_vypis( DETAIL, "prikazy.pridej_novy", "přidávám nový příkaz " +
prikaz );
prikaz = { jmeno: prikaz, telo: [ [ prikazy.KONEC ]] };
prikaz.telo.unshift( [ prikazy.NAZEV, prikaz ] );
} else {
ladici_vypis( DETAIL, "prikazy.pridej_novy", "přidávám nový příkaz " +
prikaz.jmeno );
}
prikazy.nastav_novy(prikaz);
prikazy.seznam.push(prikaz);
prikazy.prikaz[prikaz.jmeno] = prikaz;
prikazy.pridej( prikaz );
return prikaz;
}
// Změň příkaz v tělech ostatních příkazů. Pokud je novy_prikaz prazdny, smaže
// ho z příkazu
prikazy.nahrad_telo = function (stary_prikaz, novy_prikaz)
{
if ( novy_prikaz ) {
ladici_vypis( DETAIL, "prikazy.nahrad_telo", "měním výskyt příkazu " +
stary_prikaz.jmeno + " na " + novy_prikaz.jmeno );
} else {
ladici_vypis( DETAIL, "prikazy.nahrad_telo", "mažu výskyt příkazu " +
stary_prikaz.jmeno + " ze všech příkazů" );
}
var i = prikazy.seznam.length-1;
while ( i >= 0 && !prikazy.seznam[i].systemovy ) {
var prikaz = prikazy.seznam[i];
for ( var j = prikaz.telo.length-1; j >= 0; j-- ) {
if ( prikaz.telo[j][0] == stary_prikaz ) {
if ( novy_prikaz ) {
ladici_vypis( LADENI, "prikazy.nahrad_telo", "změna v příkazu " +
prikaz.jmeno + " na řádce " + (j+1) );
prikaz.telo[j][0] = novy_prikaz;
} else {
ladici_vypis( LADENI, "prikazy.nahrad_telo", "smazán z příkazu " +
prikaz.jmeno + " z řádky " + (j+1) );
var pred_prikazem = prikaz.telo.slice(0, j);
var po_prikazu = prikaz.telo.slice(j+1);
prikaz.telo = pred_prikazem.concat(po_prikazu);
}
}
}
i--;
}
}
// Připrav příkaz na smazání
prikazy.dokonci_smazani = function (prikaz)
{
delete prikaz.telo;
}
// Obnov informaci v seznamu známých příkazů. Pokud není uveden novy_prikaz,
// je příkaz smazán
prikazy.zmen_seznam = function (stary_prikaz, novy_prikaz)
{
if ( novy_prikaz ) {
ladici_vypis( LADENI, "prikazy.zmen_seznam",
"měním v seznamu příkaz " + stary_prikaz.jmeno + " na " +
novy_prikaz.jmeno );
} else {
ladici_vypis( LADENI, "prikazy.zmen_seznam",
"mažu ze seznamu příkaz " + stary_prikaz.jmeno );
}
var i;
for ( i = prikazy.seznam.length - 1; i >= 0; i-- ) {
if ( prikazy.seznam[i] == stary_prikaz ) {
if ( novy_prikaz ) {
prikazy.seznam[i] = novy_prikaz;
} else {
prikazy.dokonci_smazani( prikazy.seznam[i] );
var pred_prikazem = prikazy.seznam.slice(0, i);
var po_prikazu = prikazy.seznam.slice(i+1);
prikazy.seznam = pred_prikazem.concat(po_prikazu);
}
break;
}
}
if ( i < 0 ) {
ladici_vypis( CHYBA, "prikazy.zmen_seznam", "příkaz " +
stary_prikaz.jmeno + " nebyl nalezen v seznamu příkazů" );
return false;
} else {
return true;
}
}
// Změň příkaz a obnov zobrazenou informaci
prikazy.zmen_prikaz = function (stary_prikaz, novy_prikaz)
{
if ( stary_prikaz.jmeno == novy_prikaz.jmeno ) {
ladici_vypis( DETAIL, "prikazy.zmen_prikaz", "aktualizuji příkaz " +
novy_prikaz.jmeno );
} else {
ladici_vypis( DETAIL, "prikazy.zmen_prikaz", "měním příkaz " +
stary_prikaz.jmeno + " na " + novy_prikaz.jmeno );
}
// Obnov seznam známých příkazů
if ( !this.zmen_seznam(stary_prikaz, novy_prikaz) ) {
ladici_vypis( CHYBA, "prikazy.zmen_prikaz", "starý příkaz " +
stary_prikaz.jmeno + " nenalezen v seznamu, raději přidám nový" );
prikazy.pridej_novy( novy_prikaz );
return;
}
// Atributy nového příkazu
prikazy.nastav_novy(novy_prikaz);
delete prikazy.prikaz[stary_prikaz.jmeno];
prikazy.prikaz[novy_prikaz.jmeno] = novy_prikaz;
var stary_id = prikazy.id_prefix+stary_prikaz.jmeno;
var stary_nazev = prikazy.nazev_prefix+stary_prikaz.jmeno;
var novy_id = prikazy.id_prefix+novy_prikaz.jmeno;
var novy_nazev = prikazy.nazev_prefix+novy_prikaz.jmeno;
var novy_prikaz_id = prikazy.prikaz_prefix+novy_prikaz.jmeno;
// Zjisti, jestli je co upravovat u tlačítek a zobrazení
if ( novy_nazev != stary_nazev || novy_id != stary_id
|| stary_prikaz.jmeno != novy_prikaz.jmeno ) {
var element_nazev = document.getElementById(stary_nazev);
var element_ikona = document.getElementById(stary_id);
var element_maska = tvoric.maska_tlacitka_z_ikony(element_ikona);
var element_prikaz = element_nazev.parentNode;
// Uprav Id
element_nazev.id = novy_nazev;
element_ikona.id = novy_id;
element_prikaz.id = novy_prikaz_id;
// Uprav název
element_nazev.firstChild.firstChild.nodeValue = novy_prikaz.jmeno;
// Obnov informaci myši
tvoric.nastav_udalosti_mysi( element_nazev, "prikazy.mys_prikaz",
'\''+novy_nazev+'\'', '\''+novy_prikaz.jmeno+'\'' );
tvoric.nastav_udalosti_mysi( element_maska, "prikazy.mys_tlacitko",
'\''+novy_id+'\'', '\''+novy_prikaz.jmeno+'\'' );
// Informace objektu myši, že proběhlo přejmenování
ladici_vypis( LADENI, "prikazy.zmen_prikaz",
"měním detaily u názvu příkazu" );
prikazy.mys_prikaz.prejmenuj(stary_nazev, novy_nazev, novy_prikaz.jmeno);
ladici_vypis( LADENI, "prikazy.zmen_prikaz",
"měním detaily u tlačítka příkazu" );
prikazy.mys_tlacitko.prejmenuj(stary_id, novy_id, novy_prikaz.jmeno);
}
this.nahrad_telo( stary_prikaz, novy_prikaz );
prikazy.dokonci_smazani( stary_prikaz );
}
// Smaž příkaz (i z těl příkazů) a obnov zobrazenou informaci
prikazy.proved_smazani = function (prikaz)
{
ladici_vypis( DETAIL, "prikazy.proved_smazani", "mažu příkaz " +
prikaz.jmeno );
var nazev = prikazy.nazev_prefix+prikaz.jmeno;
// Informace objektu myši, že proběhlo přejmenování
ladici_vypis( LADENI, "prikazy.proved_smazani",
"mažu detaily u názvu příkazu" );
prikazy.mys_prikaz.smaz(nazev, prikaz.jmeno);
ladici_vypis( LADENI, "prikazy.proved_smazani",
"mažu detaily u tlačítka příkazu" );
prikazy.mys_tlacitko.smaz(nazev, prikaz.jmeno);
// Vymaž příkaz z těl ostatních příkazů
this.nahrad_telo( prikaz );
// Vymaž příkaz ze známých příkazů
this.zmen_seznam( prikaz );
// Smaž příkaz ze zobrazeného seznamu příkazů
this.zrus( prikaz );
}
prikazy.obsahuje_prikaz = function (ktery_prikaz)
{
var seznam = new Array();
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
var prikaz = prikazy.seznam[i];
if ( !prikaz.systemovy && prikaz != ktery_prikaz ) {
for ( var j = 0; j < prikaz.telo.length; j++ ) {
if ( prikaz.telo[j][0] == ktery_prikaz ) {
seznam.push(prikaz.jmeno);
break;
}
}
}
}
return seznam;
}
prikazy.smaz_prikaz = function (prikaz)
{
if ( !prikazy.test_spusteni() ) return;
var obsahuje = prikazy.obsahuje_prikaz(prikaz);
var detail = "";
if ( obsahuje.length ) {
var detail_prikaz;
if ( obsahuje.length == 1 ) {
detail_prikaz = "příkazu ";
} else {
detail_prikaz = "příkazech ";
}
detail = "\n\nPříkaz je obsažen v " + detail_prikaz + obsahuje.join(", ") +
".";
}
var uzivatel_chce = window.confirm( "Opravdu si přejete smazat příkaz " +
prikaz.jmeno + "?" + detail );
if ( uzivatel_chce ) {
prikazy.proved_smazani(prikaz);
editor.smaz_prikaz(prikaz);
}
}
// Smaž celý slovník
prikazy.smaz_vse = function (bez_kontroly, bez_noveho_prikazu)
{
if ( !prikazy.test_spusteni() ) return;
if ( prikazy.je_slovnik_prazdny() ) {
if ( !bez_noveho_prikazu ) {
if ( editor.nastav_zmenu() && !nastaveni.zachovej_zobrazeny_prikaz ) {
if ( bez_kontroly
|| !bez_kontroly && window.confirm( "Slovník je prázdný. " +
"Přejete si začít novým příkazem?" ) ) {
editor.prikaz_novy(true);
}
} else {
if ( !bez_kontroly ) alert( "Slovník je prázdný." );
editor.prikaz_novy(true);
}
}
} else {
if ( bez_kontroly || !bez_kontroly
&& window.confirm( "Opravdu si přejete smazat všechny příkazy?" ) ) {
var i = prikazy.seznam.length-1;
while ( i >= 0 && !prikazy.seznam[i].systemovy ) {
var prikaz = prikazy.seznam[i];
prikazy.proved_smazani(prikaz);
if ( nastaveni.zachovej_zobrazeny_prikaz ) editor.smaz_prikaz(prikaz);
i--;
}
if ( !bez_noveho_prikazu ) {
if ( !editor.nastav_zmenu() || !nastaveni.zachovej_zobrazeny_prikaz ) {
editor.prikaz_novy(true);
}
}
}
}
}
// Obnov ikonu přehrání a tooltip
prikazy.obnov_stav = function (probiha)
{
var element = document.getElementById('zobrazene');
if ( probiha ) {
element.className = "zastavit";
} else {
element.className = "spustit";
}
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
var prikaz = prikazy.seznam[i];
if ( prikaz.zobrazit ) {
var element_ikona = document.getElementById(prikazy.id_prefix+prikaz.jmeno);
var element_maska = element_ikona.parentNode.nextSibling;
}
}
prikazy.mys_tlacitko.tooltip.prekresli();
}
// Nahrání nového slovníku
prikazy.nahraj_slovnik = function (novy_slovnik)
{
if ( !novy_slovnik.length ) return;
if ( !window.confirm(
"Opravdu si přejete nahrát příkazy?\n\n" +
"Všechny současné příkazy budou ztraceny. Mám pokračovat?" ) ) return;
if ( !prikazy.test_spusteni() ) return;
prikazy.smaz_vse(true, true);
for ( var i = 0; i < novy_slovnik.length; i++ ) {
var prikaz = novy_slovnik[i];
prikazy.pridej_novy( prikaz );
}
if ( editor.nastav_zmenu() ) {
if ( !nastaveni.zachovej_zobrazeny_prikaz ) {
editor.prikaz_novy(true);
}
} else {
editor.prikaz_novy(true);
}
}
// ===========================================================================
// =~ Práce myši ~============================================================
prikazy.mys_tlacitko.proved_zvyrazneni = function(info, detail)
{
return true;
}
prikazy.mys_tlacitko.prekresli_stav = function(info, detail, zvyraznen,
stisknut, vybran)
{
tvoric.zvyraznovac(info, zvyraznen, stisknut, vybran);
}
prikazy.mys_tlacitko.proved_vyber = function(info, detail)
{
var vysledek = prikazy.jadro.proved_nebo_zastav(detail);
vysledek.zobraz_chybu();
return false;
}
prikazy.mys_prikaz.proved_zvyrazneni = function(info, detail)
{
return true;
}
prikazy.mys_prikaz.proved_vyber = function(info, detail)
{
var element = document.getElementById('vybrany-prikaz');
element.lastChild.nodeValue = detail;
return true;
}
prikazy.mys_prikaz.zrus_vyber = function(info, detail)
{
var element = document.getElementById('vybrany-prikaz');
element.lastChild.nodeValue = prikazy.zadny_prikaz;
return true;
}
prikazy.mys_prikaz.smaz_vyber = function(info, detail)
{
this.zrus_vyber(info, detail);
}
prikazy.mys_prikaz.prekresli_stav = function(info, detail, zvyraznen, stisknut,
vybran)
{
var element = document.getElementById(info);
var vybrany = (vybran?"-vybrany":"");
var zvyrazneny = (zvyraznen?"-zvyrazneny":"");
if ( stisknut ) {
element.className = "nazev"+vybrany+"-stisknuty";
} else {
element.className = "nazev"+vybrany+zvyrazneny;
}
}
prikazy.mys_nastroje.proved_zvyrazneni = function(info, detail)
{
return true;
}
prikazy.mys_nastroje.prekresli_stav = function(nastroj, detail, zvyraznen,
stisknut, vybran)
{
tvoric.zvyraznovac(prikazy.nastroje.id_prefix+nastroj, zvyraznen, stisknut,
vybran);
}
prikazy.mys_nastroje.proved_vyber = function(nastroj, detail)
{
switch (nastroj) {
case "zobraz":
case "smaz": {
// Kontrola vybraného příkazu
var jmeno = prikazy.vybrany_prikaz();
if ( jmeno && prikazy.prikaz[jmeno] ) {
prikazy.zobraz_nebo_smaz( nastroj, jmeno );
} else {
alert( "Není vybrán žádný příkaz.\n\n" +
"Příkaz vyberte klepnutím myši." );
}
break;
}
case "smaz-vse": {
prikazy.smaz_vse();
break;
}
case "ulozit":
case "exportovat-12":
case "exportovat-k99": {
if ( editor.kontrola_zmeny() ) {
if ( nastroj != "exportovat-k99" ) {
data.ukladani.uloz_slovnik(
(nastroj == "ulozit"?data.FORMAT_20:data.FORMAT_12) );
} else {
data.ukladani.export_slovnik_k99();
}
}
break;
}
case "nacist": {
data.nacitani.nacti();
}
}
return false;
}
// Zobraz nebo smaž vybraný příkaz
prikazy.zobraz_nebo_smaz = function(akce, jmeno)
{
var prikaz = prikazy.prikaz[jmeno];
if ( !prikaz.systemovy ) {
if ( akce == "zobraz" ) {
editor.zobraz_vybrany_prikaz();
} else {
prikazy.smaz_prikaz(prikaz);
}
} else {
if ( akce == "zobraz" ) {
alert( "Nelze prohližet systémový příkaz." );
// TODO: Nápověda k systémovým příkazům?
} else {
alert( "Nelze smazat systémový příkaz." );
}
}
}
// Který příkaz je vybraný
prikazy.vybrany_prikaz = function()
{
return this.mys_prikaz.vybran.detail;
}
// Vyber konkrétní příkaz
prikazy.vyber_prikaz = function(nazev)
{
var prikaz = prikazy.prikaz[nazev];
if ( prikaz && prikaz.zobrazit ) {
this.mys_prikaz.vyber(prikazy.nazev_prefix+nazev, prikaz.jmeno);
} else {
ladici_vypis(CHYBA, "prikazy.vyber_prikaz", nazev,
"výběr neexistujícího příkazu");
}
}
// ===========================================================================
// =~ Tooltipy ~==============================================================
prikazy.text_tooltipu = function (jmeno)
{
var tooltip = new Object();
if ( prikazy.jadro.probiha() ) {
tooltip.nadpis = prikazy.tooltip["zastavit"];
} else {
tooltip.nadpis = prikazy.tooltip["spustit"]+" "+jmeno;
if ( prikazy.prikaz[jmeno] instanceof Object ) {
var prikaz = prikazy.prikaz[jmeno];
if ( prikaz.tooltip ) {
tooltip.popis = prikaz.tooltip;
} else if ( prikaz.telo ) {
var radka = prikaz.telo[0];
if ( radka && radka[0] == prikazy.HLAVICKA_KOMENTAR ) {
tooltip.popis = radka[1];
}
}
}
}
return tooltip;
}
prikazy.mys_tlacitko.tooltip.muzu_zobrazit = function (info, detail)
{
return ( prikazy.prikaz[detail] ? true : false );
}
prikazy.mys_tlacitko.tooltip.obnov = function (tooltip, info, detail)
{
var obsah = prikazy.text_tooltipu(detail);
tvoric.obnov_tooltip(tooltip, "", obsah.nadpis, obsah.popis);
}
prikazy.mys_tlacitko.tooltip.zjisti_rozmery = function (objekt)
{
var rozmery = zjisti_rozmery(objekt);
var element = document.getElementById('zobrazene');
if ( element.scrollTop ) {
rozmery = posun_y(rozmery, -element.scrollTop);
}
return rozmery;
}
prikazy.mys_nastroje.tooltip.obnov = function (tooltip, info, detail)
{
tvoric.obnov_tooltip(tooltip, detail.ikona, detail.nadpis, detail.popis);
}
+813
View File
@@ -0,0 +1,813 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - vykonávání příkazů
// ===========================================================================
// =~ Globální nastavení ~====================================================
// Největší počet příkazů provedených v jedné smyčce
nastaveni.maximum_prikazu_smycky = 10;
// Maximální délka smyčky v milisekundách
nastaveni.maximalni_delka_smycky = 25;
// Prodleva mezi vykonáváním příkazů
// nastaveni.prodleva = 500; // Nyní definováno v souboru nastaveni-funkce.js
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Informace a data o příkazech
prikazy = new Object();
// Jádro vykonávající příkazy
//
// Každá funkce pro jednotlivé příkazy je navržena tak, aby byla schopna jak
// vykonat příkaz, tak rozpoznat případné chyby syntaxe. Režim práce je předán
// v parametru syntaxe, který při hodnotě true rozhodne pouze o syntaxi a při
// hodnotě false vykoná příkaz.
prikazy.jadro = new Object();
// Verzování
prikazy.VERZE_10 = 1;
prikazy.VERZE_11 = 2;
prikazy.VERZE_12 = 4;
prikazy.VERZE_20 = 8;
prikazy.min_VERZE_20 = prikazy.VERZE_20;
prikazy.min_VERZE_12 = prikazy.min_VERZE_20 | prikazy.VERZE_12;
prikazy.min_VERZE_11 = prikazy.min_VERZE_12 | prikazy.VERZE_11;
prikazy.min_VERZE_10 = prikazy.min_VERZE_11 | prikazy.VERZE_10;
// ===========================================================================
// =~ Formátování chyby provádění ~===========================================
prikazy.formatuj_chybu_provadeni = function (jmeno, cislo_radky, telo, text)
{
if ( jmeno ) {
var prikaz_radky = "";
if ( cislo_radky < telo.length ) {
prikaz_radky = ": " +
prikazy.formatovac.zformatuj_jednu_radku(telo[cislo_radky]);
}
return "Chyba při provádění příkazu " + jmeno + " na řádce " +
(cislo_radky+1) + prikaz_radky + ".\n\n" + text;
} else {
return "Chyba při provádění příkazu.\n\n" + text;
}
}
// ===========================================================================
// =~ Testy ~=================================================================
// Test spuštění. Vrací true, jestli se může pokračovat
prikazy.test_spusteni = function ()
{
var prikaz = prikazy.jadro.probiha();
if ( prikaz ) {
var uzivatel_chce = window.confirm( "Právě je prováděn příkaz " + prikaz.jmeno + ".\n\n" +
"Pro pokračování je nutné provádění ukončit.\n" +
"Mám příkaz ukončit?" );
if ( uzivatel_chce ) {
prikazy.jadro.zastav();
return true;
}
return false;
}
return true;
}
// ===========================================================================
// =~ Stav provádění příkazů ~================================================
prikazy.Stav = function (prikaz)
{
this.probiha = false;
this.casovac = { id: null };
this.doplnit_konec = true;
this.rychle = 0;
this.byla_rychla_akce = false;
this.historie = new Array();
this.pozice = new Object();
if ( prikaz ) {
this.prikaz = prikaz;
} else {
this.syntaxe = true;
}
}
// Funkce najde odpovídající přikaz KONEC, případně KONEC, JINAK, nebo AŽ. Vrací
// objekt Vysledek s nastavenou chybou, pokud k nějaké došlo. Kontroluje
// syntaxi a jako jediná funkce není omezená na počet kroků. Po návratu je
// příkaz připraven na další krok.
prikazy.Stav.prototype.najdi_konec = function ()
{
var stara_syntaxe = this.syntaxe;
this.syntaxe = true;
var vysledek = new Vysledek();
if ( ! this.historie.length || this.historie.length < 1 ) {
ladici_vypis(CHYBA, "stav.najdi_konec",
"nebyl spuštěn žádný příkaz, nebo už skončil");
this.syntaxe = stara_syntaxe;
return vysledek;
}
var historie_pozice = this.historie.length - 1;
var konec_jinak =
( this.historie[historie_pozice][0] != prikazy.KONEC_JINAK );
if ( konec_jinak ) {
ladici_vypis(DETAIL, "stav.najdi_konec",
"přeskakuji na další KONEC nebo KONEC, JINAK")
} else {
ladici_vypis(DETAIL, "stav.najdi_konec",
"přeskakuji na další KONEC")
}
while ( !vysledek.byla_chyba() && historie_pozice < this.historie.length
&& ( !konec_jinak
|| konec_jinak && this.historie[historie_pozice][0] != prikazy.KONEC_JINAK) ) {
vysledek.nastav( this.krok() );
}
this.syntaxe = stara_syntaxe;
return vysledek;
}
prikazy.Stav.prototype.dotaz_na_doplneni = function (dotaz, doplneni, text)
{
if ( this.doplnit_konec && window.confirm(dotaz) ) {
if ( doplneni instanceof Array ) {
for ( var i = 0; i < doplneni.length; i++ ) {
ladici_vypis( DETAIL, "stav.dotaz_na_doplneni",
this.pozice.prikaz.jmeno, "doplňuji na konec příkaz " +
doplneni[i].jmeno );
this.pozice.prikaz.telo.push( [doplneni[i]] );
}
} else {
ladici_vypis( DETAIL, "stav.dotaz_na_doplneni",
this.pozice.prikaz.jmeno, "doplňuji na konec příkaz " +
doplneni.jmeno );
this.pozice.prikaz.telo.push( [doplneni] );
}
return new Vysledek( false, Vysledek.BYL_UPRAVEN );
} else {
return new Vysledek( new Chyba(true, text) );
}
}
// Doplnění příkazů KONEC a KONEC, JINAK pro všechny cykly a podmínky. Vrací
// objekt Vysledek, pokud došlo k chybě. Vrací null, pokud nemohlo být doplnění
// provedeno
prikazy.Stav.prototype.dopln_konec = function (posledni)
{
var obecna_chyba = new Vysledek( new Chyba( true,
"Na konci chybí příkaz KONEC.\n" +
"Zkontrolujte příkazy podmínek, opakování a rychlých bloků." ) );
// Nejdříve kontrola, jestli historie vůbec něco obsahuje a jestli náhodou
// neobsahuje další volání - v tom případě se vrátíme bez jakékoliv úpravy
if ( !this.historie || this.historie && !this.historie.length )
return obecna_chyba;
if ( !this.pozice || this.pozice && !this.pozice.prikaz )
return obecna_chyba;
if ( this.doplnit_konec ) {
var prikaz_doplneni = false; // Jestli je poslední příkaz pro doplnění
for ( var i = 0; i < this.historie.length; i++ ) {
if ( ! this.historie[i][0].systemovy ) {
prikaz_doplneni = ( this.historie[i][0] == this.pozice.prikaz );
}
}
if ( !prikaz_doplneni ) return obecna_chyba;
}
var stara_historie = new Array();
if ( !posledni ) {
posledni = this.historie.pop();
stara_historie.unshift(posledni);
}
var vysledek = new Vysledek();
do {
if ( !posledni[0].systemovy ) {
vysledek.nastav( this.dotaz_na_doplneni(
"Příkaz " + this.pozice.prikaz.jmeno +
" není ukončen příkazem KONEC.\n\nDoplnit?",
prikazy.KONEC,
"Příkaz není ukončen příkazem KONEC.\n" +
"Prosím ukončete svůj příkaz slovem KONEC.") );
} else if ( posledni[0] == prikazy.KDYZ ) {
vysledek.nastav( this.dotaz_na_doplneni(
"Podmínka KDYŽ není ukončena sérií příkazů KONEC, JINAK a KONEC.\n\n" +
"Doplnit?",
[ prikazy.KONEC_JINAK, prikazy.KONEC ],
"Podmínka KDYŽ není ukončena alespoň příkazem KONEC.\n\n" +
"Prosím ukončete podmínku KDYŽ slovem KONEC.") );
} else if ( posledni[0] == prikazy.KONEC_JINAK ) {
vysledek.nastav( this.dotaz_na_doplneni(
"Podmínka KDYŽ není ukončena příkazem KONEC.\n\n" +
"Doplnit?",
prikazy.KONEC,
"Podmínka KDYŽ je ukončena pouze slovem KONEC, JINAK.\n\n" +
"Prosím ukončete podmínku KDYŽ slovem KONEC.") );
} else if ( posledni[0] == prikazy.DOKUD ) {
vysledek.nastav( this.dotaz_na_doplneni(
"Cyklus DOKUD není ukončen příkazem KONEC, nebo AŽ.\n\n" +
"Doplnit příkaz KONEC?",
prikazy.KONEC,
"Ukončení cyklu DOKUD není ukončeno alespoň příkazem KONEC.\n\n" +
"Prosím ukončete cyklus DOKUD slovem KONEC.") );
} else if ( posledni[0] == prikazy.OPAKUJ ) {
vysledek.nastav( this.dotaz_na_doplneni(
"Cyklus OPAKUJ není ukončen příkazem KONEC, nebo AŽ.\n\n" +
"Doplnit příkaz KONEC?",
prikazy.KONEC,
"Cyklus OPAKUJ není ukončen alespoň příkazem KONEC.\n\n" +
"Prosím ukončete cyklus OPAKUJ slovem KONEC.") );
} else if ( posledni[0] == prikazy.RYCHLE ) {
vysledek.nastav( this.dotaz_na_doplneni(
"Blok RYCHLE není ukončen příkazem POMALU.\n\n" +
"Doplnit?",
prikazy.POMALU,
"Rychlý blok RYCHLE není ukončen slovem POMALU, nebo KONEC.\n\n" +
"Prosím ukončete bloku rychlého provádění slovem POMALU.") );
} else {
vysledek = obecna_chyba;
break;
}
if ( this.doplnit_konec ) {
posledni = this.historie.pop();
if ( posledni ) stara_historie.unshift(posledni);
}
} while ( this.doplnit_konec && !vysledek.byla_chyba() && posledni );
if ( this.historie.length > 0 ) {
this.historie = this.historie.concat(stara_historie);
} else {
this.historie = stara_historie;
}
return vysledek;
}
// Proveď kontrolu syntaxe a vrať výsledek
prikazy.Stav.prototype.kontrola_syntaxe = function (prikaz, doplnit_konec)
{
this.syntaxe = true;
this.doplnit_konec = doplnit_konec;
this.historie = new Array();
this.prikaz = prikaz;
delete this.pozice;
this.rychle = 0;
var vysledek = this.proved_volani( prikaz );
this.pozice = vysledek.hodnota;
while ( !vysledek.byla_chyba() && this.historie.length > 0 ) {
vysledek.nastav( this.krok() );
}
return vysledek;
}
// Proveď (první) příkaz
prikazy.Stav.prototype.proved_volani = function (prikaz)
{
var cislo_radky = 0;
while ( cislo_radky < prikaz.telo.length
&& prikaz.telo[cislo_radky][0].ignoruj ) {
cislo_radky++;
}
if ( this.pozice instanceof Object && this.pozice.prikaz ) {
// Kam se vrátit
this.historie.push( [ this.pozice.prikaz, this.pozice.cislo_radky + 1 ] );
} else {
// První nastavení - nikam se nevracíme
this.historie.push( [ this.prikaz ] );
}
return new Vysledek( false, Vysledek.NIC,
{ prikaz: prikaz, cislo_radky: cislo_radky } );
}
// Rychlé vykonávání příkazů
prikazy.Stav.prototype.proved_rychle = function (prikaz)
{
this.rychle++;
ladici_vypis( DETAIL, "stav.proved_rychle",
"rychlé provádění, počet volání: " + this.rychle );
}
// Rychlé vykonávání příkazů
prikazy.Stav.prototype.proved_pomalu = function (prikaz)
{
var provedl_akci = false;
if ( this.rychle ) this.rychle--;
if ( this.rychle ) {
ladici_vypis( DETAIL, "stav.proved_pomalu",
"zůstává rychlé provádění, počet volání: " + this.rychle );
} else {
provedl_akci = this.byla_rychla_akce;
ladici_vypis( DETAIL, "stav.proved_pomalu",
"nastaveno pomalé (normální) provádění, akce " +
(provedl_akci?"byla":"nebyla") + " provedena" );
this.byla_rychla_akce = false;
}
if ( provedl_akci ) {
return new Vysledek( false, Vysledek.PROVEDL_AKCI );
} else {
return new Vysledek();
}
}
// Spusť vykonávání příkazu
prikazy.Stav.prototype.spust = function ()
{
var vysledek = new Vysledek();
if ( this.prikaz.systemovy ) {
vysledek.nastav( this.prikaz.spust() );
this.probiha = false;
} else {
prikazy.obnov_stav( true );
this.probiha = true;
vysledek.nastav( this.proved_volani(this.prikaz) );
if ( !vysledek.je_konec() ) {
var pozice = this.pozice = vysledek.hodnota;
vysledek.chyba.formatuj = function (text) {
return prikazy.formatuj_chybu_provadeni(pozice.jmeno,
pozice.cislo_radky, prikazy.prikaz[pozice.jmeno].telo, text);
}
vysledek.nastav( this.dalsi_krok(0) );
}
}
return vysledek;
}
// Vynulování časovače
prikazy.Stav.prototype.nuluj_casovac = function ()
{
if ( this.casovac && this.casovac.id ) {
clearTimeout(this.casovac.id);
this.casovac.id = null;
delete this.casovac.cas;
delete this.casovac.prodleva;
delete this.casovac.funkce;
}
}
// Nastav časovač
prikazy.Stav.prototype.nastav_casovac = function (funkce, prodleva)
{
this.nuluj_casovac();
this.casovac.cas = new Date();
this.casovac.prodleva = prodleva;
this.casovac.funkce = funkce;
this.casovac.id = setTimeout( funkce, prodleva );
}
// Přenastav časovač
prikazy.Stav.prototype.prenastav_casovac = function (prodleva)
{
if ( this.casovac && this.casovac.id ) {
clearTimeout(this.casovac.id);
var cas = new Date();
var rozdil = cas-this.casovac.cas;
if ( rozdil >= prodleva ) {
prodleva = 0;
} else {
prodleva -= rozdil;
}
this.casovac.cas = cas;
this.casovac.prodleva = prodleva;
this.casovac.id = setTimeout( this.casovac.funkce, prodleva );
}
}
// Zastav vykonávání příkazů
prikazy.Stav.prototype.zastav = function ()
{
if ( this.probiha ) {
this.probiha = false;
prikazy.obnov_stav( this.probiha );
this.nuluj_casovac();
}
return new Vysledek(new Chyba(), Vysledek.KONEC);
}
// ===========================================================================
// =~ Opakované provádění příkazů ~===========================================
prikazy.Stav.prototype.dalsi_krok = function (pocet_prikazu)
{
var vysledek = new Vysledek();
if ( pocet_prikazu == undefined ) {
pocet_prikazu = nastaveni.maximum_prikazu_smycky;
}
this.nuluj_casovac();
var start = new Date();
var i = 0;
while ( i < pocet_prikazu
&& ((new Date())-start) <= nastaveni.maximalni_delka_smycky ) {
vysledek.nastav( this.krok() );
if ( vysledek.byl_upraven() && this.pozice.prikaz ) {
editor.prikaz_upraven( this.pozice.prikaz );
}
if ( vysledek.je_konec() || !this.rychle && vysledek.byla_akce() ) {
break;
}
if ( this.rychle && vysledek.byla_akce() ) {
this.byla_rychla_akce = true;
}
i++;
}
if ( vysledek.je_konec() ) {
this.zastav();
var pozice = this.pozice;
vysledek.chyba.formatuj = function (text) {
return prikazy.formatuj_chybu_provadeni(pozice.prikaz.jmeno,
pozice.cislo_radky, pozice.prikaz.telo, text);
}
vysledek.zobraz_chybu();
} else {
var interval = nastaveni.prodleva;
if ( i == pocet_prikazu || this.rychle || pocet_prikazu == 0 ) {
interval = 0;
}
this.nastav_casovac( prikazy.dalsi_krok, interval );
}
return vysledek;
}
// Proveď jeden krok příkazu. Vrací objekt Vysledek
prikazy.Stav.prototype.krok = function ()
{
var vysledek = new Vysledek();
var cislo_radky = this.pozice.cislo_radky;
if ( cislo_radky >= this.pozice.prikaz.telo.length ) {
ladici_vypis( DETAIL, "stav.krok", this.pozice.prikaz.jmeno,
"příkaz není správně ukončen" );
vysledek.nastav( this.dopln_konec() );
if ( vysledek.je_konec() ) {
// Aktualizace čísla řádku
this.pozice.cislo_radky = this.pozice.prikaz.telo.length;
}
// Aktualizuj pozici chyby
vysledek.nastav( false, vysledek.stav, this.pozice );
} else {
var radka = this.pozice.prikaz.telo[cislo_radky];
if ( !this.syntaxe || this.syntaxe && radka[0].syntaxe ) {
if ( !radka[0].ignoruj ) {
vysledek.nastav( radka[0].spust(radka, this) );
}
}
}
if ( vysledek.hodnota ) {
this.pozice = vysledek.hodnota;
} else if ( !vysledek.je_konec() ) {
this.pozice.cislo_radky++;
} else if( vysledek.byla_chyba() ) {
// Byla chyba, ale nebyla nastavena řádka chyby - aktualizuj
vysledek.nastav( false, vysledek.stav, this.pozice );
}
if ( vysledek.ma_preskocit() ) {
vysledek.nastav( this.najdi_konec() );
}
return vysledek;
}
// ===========================================================================
// =~ Základní systémové funkce ~=============================================
prikazy.jadro.KROK = function (radka, stav)
{
ladici_vypis(INFORMACE, "prikazy.jadro", "KROK");
return mesto.proved_krok();
}
prikazy.jadro.VLEVO_VBOK = function (radka, stav)
{
ladici_vypis(INFORMACE, "prikazy.jadro", "VLEVO-VBOK");
return mesto.proved_vlevo_vbok();
}
prikazy.jadro.POLOZ = function (radka, stav)
{
ladici_vypis(INFORMACE, "prikazy.jadro", "POLOŽ");
return mesto.proved_poloz();
}
prikazy.jadro.ZVEDNI = function (radka, stav)
{
ladici_vypis(INFORMACE, "prikazy.jadro", "ZVEDNI");
return mesto.proved_zvedni();
}
prikazy.jadro.STOP = function (radka, stav)
{
ladici_vypis(INFORMACE, "prikazy.jadro", "STOP");
if ( !stav.syntaxe ) {
var vysledek = new Vysledek( new Chyba(true, "Bohužel musím končit.\n\n" +
"Narazil jsem na příkaz STOP.") );
vysledek.zobraz_chybu();
return vysledek;
} else {
return new Vysledek();
}
}
prikazy.jadro.RYCHLE = function (radka, stav)
{
stav.historie.push( radka );
ladici_vypis(INFORMACE, "prikazy.jadro", "RYCHLE");
if ( !stav.syntaxe ) stav.proved_rychle();
return new Vysledek();
}
prikazy.jadro.POMALU = function (radka, stav)
{
var posledni = stav.historie.pop();
if ( !posledni || posledni && posledni[0] != prikazy.RYCHLE ) {
return new Vysledek( new Chyba( true,
"Nalezen příkaz POMALU bez odpovídajícího RYCHLE." ) );
}
ladici_vypis(INFORMACE, "prikazy.jadro", "POMALU");
if ( !stav.syntaxe ) {
return stav.proved_pomalu();
}
return new Vysledek();
}
// ===========================================================================
// =~ Konce ~=================================================================
prikazy.jadro.KONEC_JINAK = function (radka, stav)
{
var posledni = stav.historie.pop();
if ( !stav.syntaxe ) ladici_vypis(INFORMACE, "prikazy.jadro", "KONEC, JINAK");
if ( !posledni || posledni && posledni[0] != prikazy.KDYZ ) {
return new Vysledek( new Chyba( true,
"Nalezen příkaz KONEC, JINAK bez odpovídající podmínky KDYŽ.\n" +
"Na příkaz KDYŽ a KONEC, JINAK se prosím koukněte do nápovědy." ) );
}
stav.historie.push( radka );
if ( !stav.syntaxe ) {
// Přeskoč až na další konec
return new Vysledek(false, Vysledek.PRESKOC_KONEC);
} else {
return new Vysledek();
}
}
// Vyhodnotí konec opakování příkazu OPAKUJ
prikazy.jadro.konec_OPAKUJ = function (radka, stav, posledni)
{
// Opakování příkazu
if ( posledni.length == 2 || (posledni.length == 3 && posledni[1] > 0) ) {
if ( posledni.length == 3 ) {
ladici_vypis(DETAIL, "prikazy.jadro", "nový test cyklu OPAKUJ, " +
"počet opakování:" + posledni[1]);
posledni[1]--;
} else {
ladici_vypis(DETAIL, "prikazy.jadro", "zpět na cyklus OPAKUJ, " +
"nekonečný počet opakování");
}
stav.historie.push( posledni );
return new Vysledek(false, Vysledek.NIC,
{ prikaz: stav.pozice.prikaz, cislo_radky: posledni[posledni.length-1] });
} else {
ladici_vypis(DETAIL, "prikazy.jadro", "nový test cyklu OPAKUJ, " +
"konec opakování");
return new Vysledek();
}
}
// Vyhodnotí konec opakování příkazu DOKUD
prikazy.jadro.konec_DOKUD = function (radka, stav, posledni)
{
// Cyklus DOKUD
ladici_vypis(DETAIL, "prikazy.jadro", "nový test příkazu DOKUD");
if ( prikazy.jadro.podminka(posledni) ) {
// Podmínka je splněna, posuň se zpět za příkaz DOKUD
stav.historie.push(posledni);
return new Vysledek( false, Vysledek.NIC,
{ prikaz: stav.pozice.prikaz, cislo_radky: posledni[2] } );
} else {
return new Vysledek();
}
}
prikazy.jadro.KONEC = function (radka, stav)
{
var posledni = stav.historie.pop();
if ( !stav.syntaxe ) ladici_vypis(INFORMACE, "prikazy.jadro", "KONEC");
if ( !posledni || posledni
&& posledni[0].systemovy && posledni[0] != prikazy.KDYZ
&& posledni[0] != prikazy.KONEC_JINAK && posledni[0] != prikazy.DOKUD
&& posledni[0] != prikazy.OPAKUJ && posledni[0] != prikazy.RYCHLE ) {
return new Vysledek( new Chyba( true,
"Nalezen příkaz KONEC, který neukončuje ani uživatelský příkaz, "+
"ani podmínku, ani opakování.\n" +
"Na ukončování příkazů se prosím koukněte do nápovědy.") );
}
if ( !posledni[0].systemovy ) {
// Konec příkazu
var prikaz = stav.pozice.prikaz;
var prazdny = true;
var dalsi_cislo_radky = stav.pozice.cislo_radky+1;
if ( dalsi_cislo_radky < prikaz.telo.length ) {
var dalsi_prikaz = prikaz.telo[dalsi_cislo_radky][0];
stav.historie.push(posledni);
if ( !dalsi_prikaz.ignoruj ) {
return new Vysledek( new Chyba( true,
"Nalezen příkaz za posledním příkazem KONEC. " +
"Pravděpodobně nějaká podmínka nebo cyklus byl špatně " +
"ukončen." ),
Vysledek.NIC,
{ prikaz: prikaz, cislo_radky: dalsi_cislo_radky } );
} else {
return new Vysledek( new Chyba( true,
"Nalezen " + dalsi_prikaz.jmeno +
" za posledním příkazem KONEC, který ukončuje popis " +
"celého příkazu." ),
Vysledek.NIC,
{ prikaz: prikaz, cislo_radky: dalsi_cislo_radky } );
}
}
if ( stav.historie.length == 0 ) {
return new Vysledek(false, Vysledek.KONEC);
} else {
return new Vysledek(false, Vysledek.NIC,
{ prikaz:posledni[0], cislo_radky: posledni[1] } );
}
} else if ( posledni[0] == prikazy.OPAKUJ && !stav.syntaxe ) {
// Cyklus OPAKUJ
return prikazy.jadro.konec_OPAKUJ(radka, stav, posledni);
} else if ( posledni[0] == prikazy.DOKUD && !stav.syntaxe ) {
// Cyklys DOKUD
return prikazy.jadro.konec_DOKUD(radka, stav, posledni);
} else if ( posledni[0] == prikazy.RYCHLE ) {
// Konec rychlého bloku
return stav.proved_pomalu();
} // Všechno ostatní prostě skončí (KDYŽ-KONEC, KDYŽ-KONEC_JINAK-KONEC)
return new Vysledek();
}
// ===========================================================================
// =~ Podmínky a cykly ~======================================================
prikazy.jadro.podminka = function (radka)
{
var vysledek = prikazy.podminky[Math.abs(radka[1])-1].test();
if ( radka[1] < 0 ) vysledek = !vysledek;
ladici_vypis(INFORMACE, "prikazy.jadro", "podmínka " +
prikazy.formatuj_podminku(radka) + " " +
(vysledek?"je":"není") + " pravdivá" );
return vysledek;
}
prikazy.jadro.KDYZ = function (radka, stav)
{
stav.historie.push( radka );
if ( !stav.syntaxe && !prikazy.jadro.podminka(radka) ) {
return new Vysledek( false, Vysledek.PRESKOC_KONEC );
} else {
return new Vysledek();
}
}
prikazy.jadro.DOKUD = function (radka, stav)
{
stav.historie.push( radka.concat(stav.pozice.cislo_radky+1) );
if ( !stav.syntaxe && !prikazy.jadro.podminka(radka) ) {
return new Vysledek( false, Vysledek.PRESKOC_KONEC );
} else {
return new Vysledek();
}
}
prikazy.jadro.OPAKUJ = function (radka, stav)
{
var historie = radka.concat(stav.pozice.cislo_radky+1);
if ( !stav.syntaxe && radka.length == 2 && radka[1] == 0 ) {
ladici_vypis(INFORMACE, "prikazy.jadro",
"cyklus OPAKUJ s nulovým počtem opakování" );
stav.historie.push( historie );
return new Vysledek(false, Vysledek.PRESKOC_KONEC);
} else {
if ( historie.length == 3 ) {
ladici_vypis(INFORMACE, "prikazy.jadro",
"cyklus OPAKUJ, počet opakování:" + historie[1]);
historie[1]--;
} else {
ladici_vypis(INFORMACE, "prikazy.jadro",
"cyklus OPAKUJ, nekonečný počet opakování");
}
stav.historie.push( historie );
return new Vysledek();
}
}
prikazy.jadro.AZ = function (radka, stav)
{
var posledni = stav.historie.pop();
if ( !posledni || posledni
&& posledni[0] != prikazy.OPAKUJ && posledni[0] != prikazy.DOKUD ) {
return new Vysledek( new Chyba( true,
"Nalezen příkaz AŽ, který neukončuje opakování OPAKUJ nebo DOKUD.\n" +
"Na příkaz AŽ se prosím koukněte do nápovědy." ) );
}
if ( !stav.syntaxe && !prikazy.jadro.podminka(radka) ) {
if ( posledni[0] == prikazy.OPAKUJ ) {
return prikazy.jadro.konec_OPAKUJ(radka, stav, posledni);
} else {
return prikazy.jadro.konec_DOKUD(radka, stav, posledni);
}
} else {
return new Vysledek();
}
}
// ===========================================================================
// =~ Uživatelské příkazy ~===================================================
prikazy.jadro.UZIVATELSKY = function (radka, stav)
{
ladici_vypis(INFORMACE, "prikazy.jadro", "Uživatelský příkaz " +
radka[0].jmeno );
if ( !stav.syntaxe ) {
// TODO: Optimalizace rekurze, pokud za voláním následuje KONEC (případně
// nějaký ignorovaný příkaz) - neukládat volání jako nové volání. Ale pouze
// v případě, pokud je poslední příkaz v historii ten samý - nastavit první
// parametr na počet vnoření
return stav.proved_volani( radka[0] );
} else {
return new Vysledek();
}
}
// ===========================================================================
// =~ Provádení příkazů ~=====================================================
prikazy.dalsi_krok = function ()
{
if ( prikazy.stav ) {
prikazy.stav.dalsi_krok();
}
}
prikazy.jadro.proved = function (jmeno)
{
prikazy.stav = new prikazy.Stav( prikazy.prikaz[jmeno] );
return prikazy.stav.spust();
}
prikazy.jadro.zastav = function ()
{
if ( prikazy.stav ) {
var vysledek = prikazy.stav.zastav();
delete prikazy.stav;
return vysledek;
} else {
return new Vysledek(false, Vysledek.KONEC);
}
}
// Zjisti, jestli nějaký příkaz zrovna probíhá
prikazy.jadro.probiha = function ()
{
var spusteno = ( prikazy.stav && prikazy.stav.probiha );
if ( spusteno ) {
return prikazy.stav.prikaz;
} else {
return false;
}
}
prikazy.jadro.proved_nebo_zastav = function(jmeno)
{
if ( prikazy.stav && prikazy.stav.probiha ) {
return prikazy.jadro.zastav();
} else {
return prikazy.jadro.proved(jmeno);
}
}
prikazy.jadro.prenastav_casovac = function(prodleva)
{
if ( prikazy.stav && prikazy.stav.probiha ) {
prikazy.stav.prenastav_casovac(prodleva);
}
}
+792
View File
@@ -0,0 +1,792 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - formátování a rozpoznávání příkazů
// POZNÁMKA: Řetězec načtený z příkazového pole je vnitřně udržován ve formě
// escape(), protože Konqueror (KDE JavaScript) neumí pracovat s Unicode.
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Rozpoznávání příkazů
//
// Všechny rozpoznávače předpokládají odstarnění přebytečných mezer na začátku
// i na konci textového řetězce!
//
// Jednotlivé rozpoznávače pracují ve dvou režimech:
// * Hlavička příkazu. Zkontroluje se název, pokud nekoliduje s některým z
// (systémových) příkazů. Vrací nový objekt s nastaveným atributem chyba a
// pokud chyba opravdu nastala, popis je uložen v atributu text. Pokud
// byl rozpoznán příkaz z hlavičky (ještě před názvem), je vrácen tento
// příkaz - všechny takové příkazy patří před název do hlavičky a musí mít
// nastaveny atribut hlavicka na true. Pokud je to název a s ničím nekoliduje,
// je vrácen null.
// * Tělo příkazu. Vrací nový objekt s novým příkazem v atributu prikaz.
// Případné parametry jsou v atributu parametry. Pokud nastala chyba, je
// signalizována v atributu chyba a popis je v atributu text. Pokud nebyl
// příkaz rozpoznán, vrátí se pouze atribut chyba s hodnotou false.
prikazy.rozpoznavac = new Object();
// Formátování příkazů
prikazy.formatovac = new Object();
// ===========================================================================
// =~ Objekt vracející jednotlivé řádky ~=====================================
Radkovac = function (obsah)
{
this.obsah = obsah.split( "%0A" );
this.obsah_index = 0;
this.obsah_chyba = undefined;
this.radky = new Array();
this.radky_index = 0;
this.radka = 0;
this.radka_chyby = undefined;
}
// Vrátí číslo posledně zpracovávané řádky v původním obsahu. Buď vrátní
// undefined, nebo číslo řádky (počítáno od 0)
Radkovac.prototype.puvodni_cislo_radky = function ()
{
if ( this.obsah_chyba != undefined ) {
if ( this.obsah_chyba > 0 ) {
return this.obsah_chyba-1;
} else {
return undefined;
}
} else {
if ( this.obsah_index ) {
return this.obsah_index-1;
} else {
return undefined;
}
}
}
// Vrátí číslo posledně zpracovávané řádky v novém obsahu. Buď vrátní
// undefined, nebo číslo řádky (počítáno od 0)
Radkovac.prototype.nove_cislo_radky = function ()
{
if ( this.radka_chyby != undefined ) {
if ( this.radka_chyby > 0 ) {
return this.radka_chyby-1;
} else {
return undefined;
}
} else {
if ( this.radka ) {
return this.radka-1;
} else {
return undefined;
}
}
}
// Označí řádku, na které nastala chyba
Radkovac.prototype.nastala_chyba = function ()
{
if ( this.radka_chyby == undefined ) {
this.radka_chyby = this.radka;
this.obsah_chyba = this.obsah_index;
}
}
// Převede řádku do velkých písmen. Důležité, protože Konqueror to nezvládá.
// Vstup a výstup je ve formě unescape().
Radkovac.prototype.velka_pismena = function (text)
{
var pismena = text.split("");
for ( var i = 0; i < pismena.length; i++ ) {
// Při zběžném pohledu do Unicode tabulky existují tři typy metod získání
// velkého písmena:
// * posun kódu o 32 méně;
// * posun kódu o 1 méně;
// * posun kódu úplně někam jinam.
var kod = text.charCodeAt(i);
if (
kod >= 0x0061 && kod <= 0x007A ||
kod >= 0x00E0 && kod <= 0x00F6 ||
kod >= 0x00F8 && kod <= 0x00FE
) {
// Posun kódu o 32 méně
pismena[i] = String.fromCharCode( kod - 0x0020 );
} else if (
kod >= 0x0100 && kod <= 0x012F ||
kod >= 0x0132 && kod <= 0x0137 ||
kod >= 0x014A && kod <= 0x0177
) {
// Posun kódu o 1 méně
pismena[i] = String.fromCharCode( kod & 0xFFFE );
} else if (
kod >= 0x0139 && kod <= 0x0148 ||
kod >= 0x0179 && kod <= 0x017E
) {
// Posun kódu o 1 méně
pismena[i] = String.fromCharCode( ((kod-1)&0xFFFE)+1 );
} else if (
kod == 0x00DF
) {
// Německé ß má velkou variantu SS
pismena[i] = "SS";
} else if (
kod == 0x00FF
) {
// Malé ÿ
pismena[i] = "\u0178";
}
}
return pismena.join("");
}
// Úprava řádky pro rozpoznávání. Vstup je textová řádka ve formě escape(),
// návratová hodnota je pole nových řádek ve formě unescape()
Radkovac.prototype.uprav_radku = function (text)
{
text = text.replace( /^(%09|%0A|%0D|%20)+/, "" );
text = text.replace( /(%09|%0A|%0D|%20)+$/, "" );
// Rozpoznání komentáře na řádce. Přesune komentář na samostatnou řádku
var strednik = text.search( "%3B" ); // %3B je znak ';'
if ( strednik > 0 ) {
var text1 = text.slice(0, strednik).replace(/(%09|%0A|%0D|%20)+$/, "");
var text2 = text.slice(strednik);
text1 = unescape( text1.replace( /(%09|%0A|%0D|%20)+/g, "%20" ) );
text2 = unescape( text2 );
if ( text2.length > 1 ) {
return [ this.velka_pismena(text1), text2 ];
} else {
return [ this.velka_pismena(text1) ];
}
} else {
if ( strednik < 0 ) {
text = unescape( text.replace( /(%09|%0A|%0D|%20)+/g, "%20" ) );
return [ this.velka_pismena(text) ];
} else {
// Na řádce je pouze komentář (strednik == 0)
text = unescape( text );
return [ text ];
}
}
}
// Vrátí true, pokud je nějaká řádka k dispozici
Radkovac.prototype.je_dalsi_radka = function ()
{
return ( this.obsah_index < this.obsah.length
|| this.radky_index < this.radky.length );
}
//.Vrací další řádku, výsledek je řádka po unescape()
Radkovac.prototype.dalsi_radka = function ()
{
if ( this.radky_index < this.radky.length ) {
var text = this.radky[this.radky_index];
this.radky_index++;
this.radka++;
return text;
} else if ( this.obsah_index < this.obsah.length ) {
this.radky = this.uprav_radku( this.obsah[this.obsah_index] );
this.obsah_index++;
this.radky_index = 1;
this.radka++;
return this.radky[0];
} else {
ladici_vypis( LADENI, "Radkovac.dalsi_radka", "není žádná další řádka" );
return null;
}
}
// ===========================================================================
// =~ Zformátovaný obsah příkazu ~============================================
Obsah = function (prikaz)
{
this.text = "";
this.chyba = false;
this.prikaz = prikaz;
this.odsazeni = "";
}
// Vrátí momentální úroveň odsazení s přihlédnutím k chybě
Obsah.prototype.pridej = function (radka)
{
if ( this.chyba ) {
this.text += radka + "\n";
} else {
this.text += this.odsazeni + radka + "\n";
}
}
// Přidá jednu úroveň odsazení
Obsah.prototype.odsad = function ()
{
this.odsazeni += " ";
}
// Zruší jednu úroveň odsazení
Obsah.prototype.predsad = function ()
{
this.odsazeni = this.odsazeni.slice(0, -2);
}
// Zapnutí režimu chyby
Obsah.prototype.nastala_chyba = function ()
{
this.chyba = true;
}
// Pravý obsah. Výstup je ve formátu escape()
Obsah.prototype.obsah = function ()
{
var obsah = escape(this.text);
return obsah.replace( /%0A$/, "" );
}
// ===========================================================================
// =~ Formátování chyb ~======================================================
prikazy.formatuj_chybu_rozpoznani = function (text, rezim_hlavicka)
{
var ukonceno = "";
if ( !rezim_hlavicka ) {
ukonceno = "(V místě chyby je ukončeno formátování.)\n";
}
return ukonceno + "\n" + text;
}
prikazy.formatuj_chybu_syntaxe = function (text, pocet_radek, radka_chyby)
{
var ukonceno;
if ( radka_chyby < pocet_radek ) {
ukonceno = "(V místě chyby je ukončeno formátování.)\n";
} else {
ukonceno = "(Chyba je na konci příkazu.)\n";
}
return ukonceno + "\n" + text;
}
prikazy.vrat_chybu_jmena = function (text, detail) {
return new Vysledek( new Chyba( true,
"Jméno příkazu nemůže být " + text + ".\n" + detail ) );
}
prikazy.vrat_chybu_radky = function (text, detail) {
return new Vysledek( new Chyba( true,
"Na řádce se vyskytl chybný příkaz " + text + ".\n" + detail ) );
}
// ===========================================================================
// =~ Funkce rozpoznávání příkazů ~===========================================
// Rozpoznání příkazu podle vstupní řádky. Návrat je nový příkaz, který navíc
// obsahuje upravený obsah v atributu obsah a informaci o chybě v atributu
// chyba a číslo poslední zpracovávané řádky. Pokud se v rozpoznávaném příkazu
// najde stary_prikaz, bude považován za chybu v případě, že se název starého
// a načítaného příkazu liší.
prikazy.rozpoznavac.rozpoznej = function (text, stary_prikaz)
{
// Odstraň (dlouhé) pomlčky a nahraď je znakem minus, zruš mezery před
// příkazem a nech pouze jednu volnou řádku, pokud jich je víc za sebou
text = text.replace( /(%u2013|%u2014|%u2015)/g, "-" );
text = text.replace( /^(%09|%0A|%0D|%20)+/g, "" );
text = text.replace( /%0A((%09|%0A|%0D|%20)*%0A){2,}/g, "%0A%0A" );
text = text.replace( /(%0A)+$/g, "" );
var novy_prikaz = new Object();
var nove_telo;
var radkovac = new Radkovac(text);
var rozpoznano = new Vysledek();
var obsah = new Obsah();
// Nejprve najdi název
rozpoznano.nastav( this.zpracuj_hlavicku(radkovac, obsah) );
if ( rozpoznano.byla_chyba() ) {
rozpoznano.chyba.formatuj = function (text) {
return prikazy.formatuj_chybu_rozpoznani(text, true);
}
rozpoznano.nastav( false, Vysledek.NIC,
{ obsah: text,
cislo_radky: radkovac.puvodni_cislo_radky(),
prikaz: novy_prikaz
} );
return rozpoznano;
}
novy_prikaz.jmeno = rozpoznano.hodnota.jmeno;
nove_telo = rozpoznano.hodnota.telo;
// Přidej speciální příkaz názvu
nove_telo.push( [ prikazy.NAZEV, novy_prikaz ] );
// Najdi tělo
rozpoznano.nastav( this.zpracuj_telo(radkovac, obsah,
novy_prikaz, stary_prikaz) );
if ( rozpoznano.byla_chyba() ) {
rozpoznano.chyba.formatuj = function (text) {
return prikazy.formatuj_chybu_rozpoznani(text, false);
}
rozpoznano.nastav( false, Vysledek.NIC,
{ obsah: obsah.obsah(),
cislo_radky: radkovac.nove_cislo_radky(),
prikaz: novy_prikaz
} );
return rozpoznano;
}
// Přidej nalezené tělo k hlavičce
novy_prikaz.telo = nove_telo.concat( rozpoznano.hodnota.telo );
rozpoznano.nastav( false, Vysledek.NIC,
{ obsah: obsah.obsah(), prikaz: novy_prikaz } );
return rozpoznano;
}
// Kontrola jména
prikazy.rozpoznavac.kontrola_jmena = function (jmeno)
{
return this.najdi_prikaz( true, jmeno );
}
// Najdi příkaz
prikazy.rozpoznavac.najdi_prikaz = function (rezim_hlavicka, text)
{
var rozpoznano = new Vysledek();
// Rozdělení na jednotlivá slova
var rozdel_text = escape(text);
var slova = rozdel_text.split( /(?:%09|%0A|%0D|%20)+/ );
for ( var j = 0; j < slova.length; j++ ) {
slova[j] = unescape(slova[j]);
}
for ( var i = 0; i < prikazy.seznam.length ; i++ ) {
var prikaz = prikazy.seznam[i];
if ( (rezim_hlavicka && prikaz.systemovy)
|| !rezim_hlavicka ) {
// Rozpoznání
if ( prikaz.rozpoznavac ) {
rozpoznano.nastav(
prikaz.rozpoznavac(rezim_hlavicka, prikaz, text, slova) );
} else {
rozpoznano.nastav(
prikazy.rozpoznavac.obecny(rezim_hlavicka, prikaz, text, slova) );
}
if ( rozpoznano.je_hodnota() || rozpoznano.byla_chyba() ) break;
}
}
return rozpoznano;
}
// Zpracování hlavičky
prikazy.rozpoznavac.zpracuj_hlavicku = function (radkovac, obsah)
{
var rozpoznano = new Vysledek();
var telo = new Array();
while ( radkovac.je_dalsi_radka() ) {
var text = radkovac.dalsi_radka();
rozpoznano.nastav( this.najdi_prikaz(true, text) );
if ( rozpoznano.je_konec() ) {
radkovac.nastala_chyba();
return rozpoznano;
}
if ( rozpoznano.je_hodnota() ) {
// Nalezen příkaz hlavičky
ladici_vypis( LADENI, "prikazy.rozpoznavac.zpracuj_hlavicku",
"nalezen příkaz před hlavičkou: " + rozpoznano.hodnota[0] );
telo.push( rozpoznano.hodnota );
prikazy.formatovac.zformatuj_radku( rozpoznano.hodnota, obsah );
} else if ( text.length > 0 ) {
// Nalezen název příkazu
rozpoznano.nastav(false, Vysledek.NIC, { jmeno: text, telo: telo });
obsah.pridej( text );
obsah.odsad();
return rozpoznano;
}
}
ladici_vypis( CHYBA, "prikazy.rozpoznavac.zpracuj_hlavicku",
"nenalezen název příkazu" );
rozpoznano.nastav(new Chyba(true,
"Nebyl nalezen žádný příkaz, který bych mohl uložit."));
rozpoznano.zobraz_chybu();
return rozpoznano;
}
// Zpracování těla
prikazy.rozpoznavac.zpracuj_telo = function (radkovac, obsah,
tento_prikaz, stary_prikaz)
{
var rozpoznano = new Vysledek();
var telo = new Array();
while ( radkovac.je_dalsi_radka() ) {
var text = radkovac.dalsi_radka();
if ( !rozpoznano.je_konec() ) {
if ( text == tento_prikaz.jmeno ) {
// Upřednostnění rekurze
telo.push( [ tento_prikaz ] );
obsah.pridej( text );
} else {
rozpoznano.nastav( this.zpracuj_radku_tela(text, tento_prikaz, stary_prikaz) );
if ( rozpoznano.je_konec() ) {
obsah.nastala_chyba();
radkovac.nastala_chyba();
obsah.pridej( text );
continue;
} else if ( rozpoznano.je_hodnota() ) {
// Nalezený příkaz
telo.push( rozpoznano.hodnota );
prikazy.formatovac.zformatuj_radku( rozpoznano.hodnota, obsah );
} else {
// Vnitřní chyba.
// Příkaz má buď hodnotu, nebo je konec (kvůli chybě), ale nic mezi tím
ladici_vypis( CHYBA, "formatovac.zpracuj_telo", rozpoznano,
"vnitřní chyba při zpracování řádky příkazu" );
alert( "Vnitřní chyba.\n\n" +
"Nemá být konec rozpoznávání, ale příkaz se nepodařilo rozpoznat.\n" +
"Informujte prosím autora o této chybě, nejlépe i o postupu " +
"vzniku této chyby." );
}
} // end if ( text == tento_prikaz.jmeno)
} else { // else if ( rozpoznano.byla_chyba() )
obsah.pridej(text);
} // end if ( !rozpoznano.byla_chyba() )
}
rozpoznano.nastav(false, Vysledek.NIC, { telo: telo });
return rozpoznano;
}
// Zpracování jedné řádky těla příkazu
prikazy.rozpoznavac.zpracuj_radku_tela = function (text, tento_prikaz, stary_prikaz)
{
var rozpoznano = new Vysledek();
rozpoznano.nastav( this.najdi_prikaz(false, text) );
if ( !rozpoznano.je_konec() ) {
if ( rozpoznano.je_hodnota() ) {
// Nalezený příkaz
if ( rozpoznano.hodnota[0] == stary_prikaz ) {
// Nový příkaz má jiný název, než původní, a rekurze
// používá starý název
ladici_vypis( LADENI, "prikazy.rozpoznavac.rozpoznej",
"rekurze s původním názvem: " + text );
rozpoznano.nastav( new Chyba(true,
"Příkaz volá sám sebe původním názvem " + text + ".") );
}
} else {
// Neznámý příkaz
ladici_vypis( LADENI, "prikazy.rozpoznavac.rozpoznej",
"nalezen neznámý příkaz: " + text );
var uzivatel_chce = window.confirm(
"Při čtení příkazu " + tento_prikaz.jmeno +
" byl nalezen neznámý příkaz " + text + ".\n\n" +
"Přejete si ho vytvořit?");
if ( uzivatel_chce ) {
var novy_prikaz = prikazy.pridej_novy(text);
rozpoznano.nastav( false, Vysledek.NIC, [ novy_prikaz ] );
} else {
rozpoznano.nastav(
new Chyba(true, "Nalezen neznámý příkaz " + text + ".") );
}
}
}
return rozpoznano;
}
// ===========================================================================
// =~ Jednotlivé rozpoznávače příkazů ~=======================================
// Obecný rozpoznávač
prikazy.rozpoznavac.obecny = function (rezim_hlavicka, prikaz, text, slova)
{
if ( text == prikaz.jmeno ) {
if ( rezim_hlavicka ) {
if ( prikaz.systemovy ) {
if ( ! prikaz.ignoruj ) {
var detail;
if ( prikaz == prikazy.KONEC || prikaz == prikazy.KONEC_JINAK ) {
detail = "KONEC a KONEC, JINAK se používají "+
"v podmínkách a cyklech.";
} else {
detail = "Jedná se o systémový příkaz.";
}
return prikazy.vrat_chybu_jmena( text, detail );
} else if ( prikaz.hlavicka ) {
return new Vysledek( false, Vysledek.NIC, [ prikaz ] );
}
}
} else {
return new Vysledek( false, Vysledek.NIC, [ prikaz ] );
}
}
return null;
}
// Rozpoznávač prázdné řádky
prikazy.rozpoznavac.prazdna_radka = function (rezim_hlavicka, prikaz, text,
slova)
{
if ( text == "" ) {
return new Vysledek( false, Vysledek.NIC, [ prikaz ] );
} else {
return null;
}
}
// Rozpoznávač komentáře
prikazy.rozpoznavac.komentar = function (rezim_hlavicka, prikaz, text, slova)
{
if ( text.charAt(0) == ';' ) {
if (
rezim_hlavicka && prikaz.hlavicka ||
!rezim_hlavicka && !prikaz.hlavicka
) {
return new Vysledek( false, Vysledek.NIC,
[ prikaz, text.slice(1) ] );
}
}
return null;
}
// Rozpoznání názvu
prikazy.rozpoznavac.nazev = function (rezim_hlavicka, prikaz, text, slova)
{
return null;
}
// Rozpoznání podmínky v příkazech KDYŽ, DOKUD a AŽ
prikazy.rozpoznavac.podminka = function (rezim_hlavicka, prikaz, text, slova)
{
if ( slova[0] != prikaz.jmeno ) return null;
var detail;
if ( prikaz == prikazy.DOKUD ) {
detail = [ "cyklus", "Cyklus", "správný", " cyklu" ];
} else {
detail = [ "podmínka", "Podmínka", "správná", "" ];
}
// Kontrola v názvu příkazu a základní kontrola syntaxe
if ( rezim_hlavicka ) {
return prikazy.vrat_chybu_jmena( text,
"Příkaz " + prikaz.jmeno + " se používá jako " + detail[0] + "." );
} else if ( slova.length < 2 || slova.length > 3 ) {
return prikazy.vrat_chybu_radky(text,
detail[1] + " není " + detail[2] + ". " +
"Na příkaz " + prikaz.jmeno + " se prosím koukněte do nápovědy." );
} else if ( slova.length == 3 && slova[1] != prikazy.JE
&& slova[1] != prikazy.NENI ) {
return prikazy.vrat_chybu_radky(text,
"Druhé slovo v podmínce " + detail[3] + " (pokud je přítomno) musí být " +
prikazy.JE + " nebo " + prikazy.NENI + ", nikoliv " + slova[1] + "." );
}
// Převedení podmínky na číslo
var podminka = slova.pop();
for ( var i = 0; i < prikazy.podminky.length; i++ ) {
if ( prikazy.podminky[i].jmeno == podminka ) {
break;
}
}
if ( i == prikazy.podminky.length ) {
return prikazy.vrat_chybu_radky(text, "Příkaz obsahuje neznámou podmínku.");
}
// Podmínka je nenulová. Negace podmínky je vyjádřená záporným číslem
i++;
if ( slova.length == 2 && slova[1] == prikazy.NENI ) i *= -1;
return new Vysledek(false, Vysledek.NIC, [prikaz, i] );
}
// Rozpoznání podmínky
prikazy.rozpoznavac.cyklus = function (rezim_hlavicka, prikaz, text, slova)
{
if ( slova[0] != prikaz.jmeno ) return null;
if ( rezim_hlavicka ) {
return prikazy.vrat_chybu_jmena( text,
"Příkaz " + prikaz.jmeno + " se používá jako cyklus." );
}
var vyraz = new RegExp(
"^" + escape(prikaz.jmeno) +
"((%09|%0A|%0D|%20)(-?\\d+)(%09|%0A|%0D|%20)?-?(%09|%0A|%0D|%20)?(" +
prikazy.KRAT_text + ")?)?$" );
var rozpoznano = vyraz.exec(escape(text));
if ( ! rozpoznano ) {
return prikazy.vrat_chybu_radky(text, "Za příkazem " + prikaz.jmeno +
" by měl následovat počet opakování jako počet-KRÁT " +
"(-KRÁT může být vynecháno).\n" +
"Bez uvedení počtu opakování se opakují příkazy po odpovídající " +
"AŽ nebo KONEC.");
} else if ( rozpoznano[3] < 0 ) {
return prikazy.vrat_chybu_radky(text, "Počet opakování musí být kladný." );
}
if ( rozpoznano[3] == undefined || rozpoznano[3].length == 0 ) {
return new Vysledek(false, Vysledek.NIC, [prikaz]);
} else {
return new Vysledek(false, Vysledek.NIC, [prikaz, rozpoznano[3]]);
}
}
// ===========================================================================
// =~ Řízení kontroly syntaxe ~===============================================
// Kontrola syntaxe. Vrací objekt Vysledek s nastavenou hodnotou - řádkou chyby
prikazy.formatovac.kontrola_syntaxe = function (prikaz)
{
var stav = new prikazy.Stav;
var vysledek = new Vysledek();
vysledek.nastav( stav.kontrola_syntaxe( prikaz, true ) );
if ( !vysledek.byla_chyba() ) {
vysledek.nastav( false, Vysledek.NIC, stav.pozice );
}
return vysledek;
}
// ===========================================================================
// =~ Funkce formátování příkazů ~============================================
// Formátovač příkazu pro ostatní moduly. Vrací syntaktickou chybu
prikazy.formatovac.zformatuj_prikaz = function (prikaz, obsah)
{
var vysledek = new Vysledek();
var radka_chyby = undefined;
vysledek.nastav( this.kontrola_syntaxe( prikaz ) );
if ( vysledek.byla_chyba() ) {
if ( vysledek.hodnota && vysledek.hodnota.prikaz == prikaz ) {
radka_chyby = vysledek.hodnota.cislo_radky;
ladici_vypis( CHYBA, "formatovac.zformatuj_prikaz", prikaz.jmeno,
"syntaktická chyba na řádce " + (radka_chyby+1) );
vysledek.chyba.formatuj = function (text) {
return prikazy.formatuj_chybu_syntaxe( text, prikaz.telo.length,
radka_chyby );
}
} else {
ladici_vypis( CHYBA, "formatovac.zformatuj_prikaz", vysledek.hodnota,
"vnitřní chyba po syntaktické kontrole" );
alert( "Vnitřní chyba.\n\n" +
"Nalezena syntaktická chyba, ale nejsou o ní informace.\n" +
"Informujte prosím autora o této chybě, nejlépe i o postupu " +
"vzniku této chyby." );
}
}
vysledek.nastav( this.zformatuj_telo( prikaz, obsah, radka_chyby ) );
return vysledek;
}
// Hlavní formátovač těla příkazu
prikazy.formatovac.zformatuj_telo = function (prikaz, obsah, radka_chyby)
{
for ( var i = 0; i < prikaz.telo.length; i++ ) {
if ( radka_chyby == i ) obsah.nastala_chyba();
this.zformatuj_radku( prikaz.telo[i], obsah );
}
return new Vysledek(false, Vysledek.NIC, { cislo_radky: (radka_chyby+1) });
}
// Formátování jedné řádky
prikazy.formatovac.zformatuj_radku = function (radka, obsah)
{
if ( radka[0].formatovac ) {
radka[0].formatovac( obsah, radka );
} else {
prikazy.formatovac.obecny( obsah, radka );
}
}
// Speciální formátování jednoho příkazu. Výstup je ve formátu unescape()
prikazy.formatovac.zformatuj_jednu_radku = function (radka)
{
var obsah = new Obsah();
this.zformatuj_radku(radka, obsah);
return unescape(obsah.obsah());
}
// Obecný formátovač (běžné příkazy a prázdná řádka)
prikazy.formatovac.obecny = function (obsah, radka)
{
obsah.pridej(radka[0].jmeno);
}
// Formátovač prázdné řádky
prikazy.formatovac.prazdna_radka = function (obsah, radka)
{
obsah.pridej("");
}
// Formátovač komentáře
prikazy.formatovac.komentar = function (obsah, radka)
{
obsah.pridej(";" + radka[1]);
}
// Formátovač s odsazením
prikazy.formatovac.odsazeni = function (obsah, radka)
{
obsah.pridej(radka[0].jmeno);
obsah.odsad();
}
// Formátovač s předsazením
prikazy.formatovac.predsazeni = function (obsah, radka)
{
obsah.predsad();
obsah.pridej(radka[0].jmeno);
}
// Jádro formátovače podmínky
prikazy.formatuj_podminku = function (radka)
{
var je_neni = (radka[1] > 0?prikazy.JE:prikazy.NENI);
return radka[0].jmeno + " " + je_neni + " " +
prikazy.podminky[Math.abs(radka[1])-1].jmeno;
}
// Formátovač podmínky
prikazy.formatovac.podminka = function (obsah, radka)
{
if ( radka[0] == prikazy.AZ ) obsah.predsad();
obsah.pridej( prikazy.formatuj_podminku(radka) );
if ( radka[0] != prikazy.AZ ) obsah.odsad();
}
// Jádro formátovače podmínky
prikazy.formatuj_cyklus = function (radka)
{
var pocet = (radka.length == 2? " "+radka[1]+prikazy._KRAT :"");
return radka[0].jmeno + pocet;
}
// Formátovač cyklu
prikazy.formatovac.cyklus = function (obsah, radka)
{
obsah.pridej( prikazy.formatuj_cyklus(radka) );
obsah.odsad();
}
// Formátovač konců
prikazy.formatovac.konec = function (obsah, radka)
{
obsah.predsad();
obsah.pridej( radka[0].jmeno );
if ( radka[0] == prikazy.KONEC_JINAK ) obsah.odsad();
}
// Formátovač názvu
prikazy.formatovac.nazev = function (obsah, radka)
{
obsah.pridej( radka[1].jmeno );
obsah.odsad();
}
+51
View File
@@ -0,0 +1,51 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní tvar editoru příkazů
// ===========================================================================
// =~ Vygenerování editoru příkazů ~==========================================
document.write('<div class="editor">');
document.write('<div class="nadpis">Příkazové pole</div>');
document.write('<div class="nastroje">');
for ( var i = 0; i < editor.nastroje.length; i++ ) {
var nastroj = editor.nastroje[i];
if ( nastroj != null ) {
tvoric.zapis_tlacitko(false, editor.nastroje.id_prefix+nastroj[0],
editor.nastroje.mys, '\''+nastroj[0]+'\'',
'{ikona:\''+nastroj[1]+'\',nadpis:\''+nastroj[2]+'\',popis:\''+nastroj[3]+'\'}');
} else {
tvoric.zapis_tlacitko(true);
}
}
document.write('</div>');
document.write('<span class="zobrazeny">Zobrazený příkaz:</span>');
document.write('<span id="zobrazeny-prikaz">');
document.write('<span id="zmeneny-prikaz"></span></span>');
document.write('<div class="ramecek">');
document.write('<div class="textarea">');
document.write('<textarea rows="16" cols="50" id="editace" wrap="off" ');
document.write('onchange=\'editor.nastav_zmenu();\'></textarea>');
document.write('</div>');
document.write('</div>');
document.write('</div>');
// ===========================================================================
// =~ Základní nastavení editoru ~============================================
editor.prikaz_novy(true);
// Kvůli Konqueroru, který obnovuje obsahy textových polí po svém...
po_spusteni( function() { editor.prikaz_novy(true); } );
+48
View File
@@ -0,0 +1,48 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní tvar slovníku
// ===========================================================================
// =~ Vygenerování slovníku ~=================================================
document.write('<div class="slovnik">');
document.write('<div class="nadpis">Slovník (Karel verze ' +
verze_karla + ')</div>');
document.write('<div class="ramecek">' +
'<div id="zobrazene" class="spustit"></div></div>');
document.write('<div class="nastroje">');
for ( var i = 0; i < prikazy.nastroje.length; i++ ) {
var nastroj = prikazy.nastroje[i];
if ( nastroj != null ) {
tvoric.zapis_tlacitko(false, prikazy.nastroje.id_prefix+nastroj[0],
prikazy.nastroje.mys, '\''+nastroj[0]+'\'',
'{ikona:\''+nastroj[1]+'\',nadpis:\''+nastroj[2]+'\',popis:\''+nastroj[3]+'\'}');
} else {
tvoric.zapis_tlacitko(true);
}
}
document.write('</div>');
document.write('<span class="vybrany">Vybraný příkaz:</span>');
document.write('<span id="vybrany-prikaz">'+prikazy.zadny_prikaz+'</span>');
document.write('</div>');
// ===========================================================================
// =~ Základní nastavení slovníku ~===========================================
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
var prikaz = prikazy.seznam[i];
if ( prikaz.zobrazit ) {
prikazy.pridej( prikaz );
}
}
+246
View File
@@ -0,0 +1,246 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - slovník
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Příkazy
//
// Každý příkaz má následující vlastnosti:
//
// jmeno jméno příkazu
// systemovy true, pokud se jedná o systémový příkaz
// zobrazit true, pokud má být příkaz zobrazen
// ignoruj true, pokud příkaz neprovádí žádnou činnost
// hlavicka true, pokud se příkaz může vyskytovat v hlavičce (před
// názvem příkazu)
// telo pole jednotlivých řádek. Jedna řádka příkazu je pole dvou
// hodnot - příkazu a parametrů
// syntaxe true, pokud příkaz vyžaduje kontrolu syntaxe (všechny
// příkazy, které neprovádí žádnou činnost)
// tooltip text nápovědy (není povinné)
// spust vykonání příkazu, provádí i kontrolu syntaxe (když je
// atribut syntaxe nastaven na true)
// formatovac formátování příkazu. Pokud chybí, použije se obecný
// formátovač
// rozpoznavac rozpoznání příkazu. Pokud chybí, použije se obecný
// rozpoznávač
// ukladac ukládání příkazu. Pokud chybí, použije se obecní funkce
// ukládání
// kompatibilita verze, které příkaz znají
// verze_ulozeni verze, ve kterých se příkaz ukládá. Pokud se v dané verzi
// neukládá, je zobrazeno varování. Pokud se má uložit, ale
// příkaz není s verzí kompatibilní, je zobrazena chyba. Pokud
// se má uložit a je s verzí kompatibilní, pak se ukládá
// prikaz true, pokud se jedná o příkaz. Pouze pro systémové příkazy
// a to jen pro zobrazení v chybové hlášce
//
// Navíc existuje pro každý příkaz prikazy.prikaz["PŘÍKAZ"]
//
prikazy.seznam = new Array(
{ jmeno: "prázdná řádka", systemovy: true, zobrazit: false, ignoruj: true,
hlavicka: true,
rozpoznavac: prikazy.rozpoznavac.prazdna_radka,
formatovac: prikazy.formatovac.prazdna_radka,
kompatibilita: prikazy.min_VERZE_20,
verze_ulozeni: prikazy.min_VERZE_20
},
{ jmeno: "komentář", systemovy: true, zobrazit: false, ignoruj: true,
hlavicka: true,
rozpoznavac: prikazy.rozpoznavac.komentar,
formatovac: prikazy.formatovac.komentar,
ukladac: data.ukladani.uloz_komentar,
nacitac: data.nacitani.nacti_komentar,
kompatibilita: prikazy.min_VERZE_20,
verze_ulozeni: prikazy.min_VERZE_20
},
{ jmeno: "název příkazu", systemovy: true, zobrazit: false, ignoruj: true,
hlavicka: true,
rozpoznavac: prikazy.rozpoznavac.nazev,
formatovac: prikazy.formatovac.nazev,
ukladac: data.ukladani.uloz_nazev,
nacitac: data.nacitani.nacti_nazev,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_20
},
{ jmeno: "prázdná řádka", systemovy: true, zobrazit: false, ignoruj: true,
rozpoznavac: prikazy.rozpoznavac.prazdna_radka,
formatovac: prikazy.formatovac.prazdna_radka,
kompatibilita: prikazy.min_VERZE_20,
verze_ulozeni: prikazy.min_VERZE_20
},
{ jmeno: "komentář", systemovy: true, zobrazit: false, ignoruj: true,
rozpoznavac: prikazy.rozpoznavac.komentar,
formatovac: prikazy.formatovac.komentar,
ukladac: data.ukladani.uloz_komentar,
nacitac: data.nacitani.nacti_komentar,
kompatibilita: prikazy.min_VERZE_20,
verze_ulozeni: prikazy.min_VERZE_20
},
{ jmeno: "KONEC, JINAK", systemovy: true, zobrazit: false,
spust: prikazy.jadro.KONEC_JINAK,
syntaxe: true,
formatovac: prikazy.formatovac.konec,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true
},
{ jmeno: "KONEC", systemovy: true, zobrazit: false,
spust: prikazy.jadro.KONEC,
syntaxe: true,
formatovac: prikazy.formatovac.konec,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true
},
{ jmeno: "KDYŽ", systemovy: true, zobrazit: false,
spust: prikazy.jadro.KDYZ,
syntaxe: true,
rozpoznavac: prikazy.rozpoznavac.podminka,
formatovac: prikazy.formatovac.podminka,
nacitac: data.nacitani.nacti_podminku,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true
},
{ jmeno: "DOKUD", systemovy: true, zobrazit: false,
spust: prikazy.jadro.DOKUD,
syntaxe: true,
rozpoznavac: prikazy.rozpoznavac.podminka,
formatovac: prikazy.formatovac.podminka,
nacitac: data.nacitani.nacti_podminku,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true
},
{ jmeno: "OPAKUJ", systemovy: true, zobrazit: false,
spust: prikazy.jadro.OPAKUJ,
syntaxe: true,
rozpoznavac: prikazy.rozpoznavac.cyklus,
formatovac: prikazy.formatovac.cyklus,
ukladac: data.ukladani.uloz_OPAKUJ,
nacitac: data.nacitani.nacti_OPAKUJ,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true
},
{ jmeno: "AŽ", systemovy: true, zobrazit: false,
spust: prikazy.jadro.AZ,
syntaxe: true,
rozpoznavac: prikazy.rozpoznavac.podminka,
formatovac: prikazy.formatovac.podminka,
nacitac: data.nacitani.nacti_podminku,
kompatibilita: prikazy.min_VERZE_11,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true
},
{ jmeno: "RYCHLE", systemovy: true, zobrazit: false,
spust: prikazy.jadro.RYCHLE,
syntaxe: true,
formatovac: prikazy.formatovac.odsazeni,
kompatibilita: prikazy.min_VERZE_12,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true
},
{ jmeno: "POMALU", systemovy: true, zobrazit: false,
spust: prikazy.jadro.POMALU,
syntaxe: true,
formatovac: prikazy.formatovac.predsazeni,
kompatibilita: prikazy.min_VERZE_12,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true
},
{ jmeno: "STOP", systemovy: true, zobrazit: false,
spust: prikazy.jadro.STOP,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true
},
{ jmeno: "KROK", systemovy: true, zobrazit: true,
spust: prikazy.jadro.KROK,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true,
tooltip: "Posune Karla o jedno políčko dopředu"
},
{ jmeno: "VLEVO-VBOK", systemovy: true, zobrazit: true,
spust: prikazy.jadro.VLEVO_VBOK,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true,
tooltip: "Otočí Karla jednou vlevo"
},
{ jmeno: "POLOŽ", systemovy: true, zobrazit: true,
spust: prikazy.jadro.POLOZ,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true,
tooltip: "Karel položí jednu značku, pokud je na políčku místo"
},
{ jmeno: "ZVEDNI", systemovy: true, zobrazit: true,
spust: prikazy.jadro.ZVEDNI,
kompatibilita: prikazy.min_VERZE_10,
verze_ulozeni: prikazy.min_VERZE_10,
prikaz: true,
tooltip: "Karel zvedne jednu značku, pokud na políčku nějaká je"
}
);
// Příkazy přístupné podle jména
prikazy.prikaz = new Object();
// Textové řetězce spojené s příkazy
prikazy.JE = "JE";
prikazy.NENI = "NENÍ";
prikazy.KRAT = "KRÁT";
prikazy.KRAT_text = escape(prikazy.KRAT);
prikazy._KRAT = "-" + prikazy.KRAT;
prikazy.podminky = [
{ jmeno: "ZEĎ", test: mesto.JE_ZED },
{ jmeno: "ZNAČKA", test: mesto.JE_ZNACKA },
{ jmeno: "DOMOV", test: mesto.JE_DOMOV },
{ jmeno: "VÝCHOD", test: mesto.JE_VYCHOD },
{ jmeno: "SEVER", test: mesto.JE_SEVER },
{ jmeno: "ZÁPAD", test: mesto.JE_ZAPAD },
{ jmeno: "JIH", test: mesto.JE_JIH }
];
// ===========================================================================
// =~ Základní nastavení ~====================================================
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
var prikaz = prikazy.seznam[i];
if (! (prikaz.jmeno in prikazy.prikaz)) {
prikazy.prikaz[prikaz.jmeno] = prikaz;
}
}
// ===========================================================================
// =~ Příkazové konstanty ~===================================================
prikazy.HLAVICKA_KOMENTAR = prikazy.prikaz["komentář"];
prikazy.HLAVICKA_PRAZDNA_RADKA = prikazy.prikaz["prázdná řádka"];
prikazy.NAZEV = prikazy.prikaz["název příkazu"];
prikazy.KONEC_JINAK = prikazy.prikaz["KONEC, JINAK"];
prikazy.KONEC = prikazy.prikaz["KONEC"];
prikazy.KDYZ = prikazy.prikaz["KDYŽ"];
prikazy.DOKUD = prikazy.prikaz["DOKUD"];
prikazy.OPAKUJ = prikazy.prikaz["OPAKUJ"];
prikazy.AZ = prikazy.prikaz["AŽ"];
prikazy.RYCHLE = prikazy.prikaz["RYCHLE"];
prikazy.POMALU = prikazy.prikaz["POMALU"];
prikazy.STOP = prikazy.prikaz["STOP"];
prikazy.KROK = prikazy.prikaz["KROK"];
prikazy.VLEVO_VBOK = prikazy.prikaz["VLEVO_VBOK"];
prikazy.POLOZ = prikazy.prikaz["POLOŽ"];
prikazy.ZVEDNI = prikazy.prikaz["ZVEDNI"];
+404
View File
@@ -0,0 +1,404 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - funkce pro práci se styly
// ===========================================================================
// =~ Tovární nastavení ~=====================================================
// Styl nastavený uživatelem
nastaveni.styl = hodnota_cookie("styl");
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Názvy alternativních stylů
styly = new Array();
// Všechny pojmenované styly
styly.pojmenovane_styly = new Array();
// Všechny obrázky ve všech stylech
styly.obrazky = new Array();
styly.posledni_obrazek = undefined;
styly.pridane_obrazky = " ";
// Stav nahrávání
styly.NAHRANO = 0;
styly.CHYBA = 1;
styly.ZRUSENO = 2;
// Všechny soubory se styly, pokud se nepodařilo zjistit obrázky
styly.soubory = new Array();
styly.posledni_soubor = undefined;
styly.pridane_soubory = " ";
// ===========================================================================
// =~ Základní nastavení ~====================================================
// Zjisti všechny styly v dokumentu
var linky = document.getElementsByTagName("link");
var link_styly = new Array();
var nacteno = " ";
for ( var i = 0; i < linky.length; i++ ) {
if ( linky[i].getAttribute("rel").indexOf("stylesheet") != -1 ) {
link_styly.push( linky[i] );
var jmeno;
if ( (jmeno=linky[i].getAttribute("title")) ) {
styly.pojmenovane_styly.push( linky[i] );
var jmeno_esc = escape(jmeno);
if ( nacteno.indexOf(" "+jmeno_esc+" ") == -1 ) {
var id=linky[i].getAttribute("id");
if ( nastaveni.styl == null ) {
nastaveni.styl = jmeno;
}
styly.push( {jmeno:jmeno, trida:id} );
nacteno += jmeno_esc+" ";
}
}
}
}
// ===========================================================================
// =~ Načti všechny obrázky ~=================================================
// Přidá obrázek do fronty, pokud ještě nebyl přidán
styly.pridej_obrazek = function (obrazek)
{
var escape_url = escape(obrazek.url);
if ( styly.pridane_obrazky.indexOf(" "+escape_url+" ") == -1 ) {
styly.obrazky.push(obrazek);
styly.pridane_obrazky += escape_url + " ";
return true;
} else {
return false;
}
}
// Připraví obrázek na automatické stažení na pozadí
styly.priprav_obrazek = function (url)
{
var obrazek = new Image();
obrazek.onload = function () {
window.setTimeout(function () { styly.dalsi_obrazek(styly.NAHRANO); }, 0);
}
obrazek.onerror = function () {
window.setTimeout(function () { styly.dalsi_obrazek(styly.CHYBA); }, 0);
}
obrazek.onabort = function () {
window.setTimeout(function () { styly.dalsi_obrazek(styly.ZRUSENO); }, 0);
}
return { url: url, obrazek: obrazek };
}
// Spouští stahování obrázku (dalšího) na pozadí
styly.dalsi_obrazek = function (posledni_stav)
{
if ( this.posledni_obrazek == undefined ) {
if ( !this.obrazky.length ) {
return;
}
this.posledni_obrazek = 0;
} else {
if ( posledni_stav == styly.NAHRANO ) {
ladici_vypis(DETAIL, "styly.dalsi_obrazek",
this.obrazky[this.posledni_obrazek].url, "nahráno");
this.posledni_obrazek++;
} else {
if ( posledni_stav == styly.CHYBA ) {
ladici_vypis(CHYBA, "styly.dalsi_obrazek",
this.obrazky[this.posledni_obrazek].url,
"nepodařilo se nahrát obrázek");
} else {
ladici_vypis(CHYBA, "styly.dalsi_obrazek",
this.obrazky[this.posledni_obrazek].url, "zrušeno");
}
return;
}
}
if ( this.posledni_obrazek >= this.obrazky.length ) {
if ( this.obrazky.length ) {
ladici_vypis(INFORMACE, "styly.dalsi_obrazek", "nahráno " +
this.obrazky.length + " obrázků do vyrovnávací paměti");
}
return;
}
var obrazek = this.obrazky[this.posledni_obrazek];
if ( ! obrazek ) return;
obrazek.obrazek.src = obrazek.url;
}
styly.notifikace_nahravace = function ()
{
if ( styly.posledni_soubor >= styly.soubory.length ) return;
var soubor = styly.soubory[styly.posledni_soubor];
if ( soubor.notifikovano ) return;
var nahravac = styly.soubory[styly.posledni_soubor].nahravac;
if ( nahravac.readyState == 4 ) {
soubor.notifikovano = true;
if ( nahravac.status == 200 || nahravac.status == 304
|| ( nahravac.status == 0 && nahravac.responseText ) ) {
setTimeout( function() { styly.dalsi_soubor(styly.NAHRANO); }, 0 );
} else {
setTimeout( function() { styly.dalsi_soubor(styly.CHYBA); }, 0 );
}
}
}
// ===========================================================================
// =~ Vlastní zpracování CSS ~================================================
// Přidá soubor do fronty, pokud ještě nebyl přidán
styly.pridej_soubor = function (url)
{
var escape_url = escape(url);
if ( styly.pridane_soubory.indexOf(" "+escape_url+" ") == -1 ) {
styly.soubory.push( { url: url } );
styly.pridane_soubory += escape_url + " ";
return true;
} else {
return false;
}
}
// Započítej soubor do souborů ve frontě
styly.zapocitej_soubor = function (url)
{
var escape_url = escape(url);
if ( styly.pridane_soubory.indexOf(" "+escape_url+" ") == -1 ) {
styly.pridane_soubory += escape_url + " ";
return true;
} else {
return false;
}
}
// Spouští stahování obrázku (dalšího) na pozadí
styly.dalsi_soubor = function (posledni_stav)
{
if ( this.posledni_soubor == undefined ) {
this.posledni_soubor = 0;
} else {
var soubor = this.soubory[this.posledni_soubor];
var url = soubor.url.slice(soubor.url.indexOf("style/"));
var nahravac = soubor.nahravac;
if ( posledni_stav == styly.NAHRANO ) {
ladici_vypis(DETAIL, "styly.dalsi_soubor", url, "nahráno");
this.zpracuj_soubor( url, nahravac.responseText );
this.posledni_soubor++;
delete soubor.nahravac;
} else {
ladici_vypis(CHYBA, "styly.dalsi_soubor",
soubor.url, "nepodařilo se nahrát");
return;
}
}
if ( this.posledni_soubor >= this.soubory.length ) {
if ( this.obrazky.length == 0 ) {
ladici_vypis(CHYBA, "styly-funkce",
"vyrovnávací paměť obrázků je prázdná, očekávejte různá zpoždění");
if ( /^https?:[\/][\/]/.exec(document.URL) ) {
alert(
"Nelze dopředu načíst všechny obrázky, " +
"nenalezena vhodná metoda.\n\nOčekávejte různá zpoždění." );
}
} else {
this.dalsi_obrazek();
}
return;
}
var soubor = this.soubory[this.posledni_soubor];
if ( soubor && soubor.url ) {
soubor.nahravac = ajax.vrat_nahravac();
ajax.nahraj_soubor_pozdeji(soubor.nahravac, soubor.url,
styly.notifikace_nahravace);
}
}
// Zpracování obsahu souboru se styly
styly.zpracuj_soubor = function (soubor, obsah)
{
var pridano = 0;
var url_obrazku;
var regex = /(-image|filter:progid):[^"']*['"]\.\.\/([^'"]+)['"]/g; // "
while ( url_obrazku = regex.exec(obsah) ) {
var obrazek = styly.priprav_obrazek( url_obrazku[2] );
if ( styly.pridej_obrazek(obrazek) ) {
pridano++;
}
}
ladici_vypis(LADENI, "styly.zpracuj_soubor", soubor, "přidáno " + pridano + " obrázků");
}
// ===========================================================================
// =~ Zjisti všechny obrázky ~================================================
styly.nahraj_obrazky = function ()
{
// Které linky byly analyzovány
var pocet_analyzovano = 0;
// Projdi všechny styly a najdi background-image
if ( document.styleSheets ) {
ladici_vypis(LADENI, "styly.nahraj_obrazky", "zkouším metodu document.styleSheets");
for ( var i = 0; i < document.styleSheets.length; i++ ) {
var styleSheet = document.styleSheets[i];
var rules = new Array();
if ( styleSheet.rules ) rules = styleSheet.rules;
if ( !rules && styleSheet.cssRules ) rules = styleSheet.cssRules;
if ( !rules ) continue;
var nacteno = 0;
for ( var j = 0; j < rules.length; j++ ) {
var cssRule = rules[j];
var style = cssRule.style;
if ( typeof(style) != "object" ) continue;
var url = undefined;
if ( style.backgroundImage && style.backgroundImage != "none" ) {
url = style.backgroundImage;
} else if ( style.filter ) {
url = style.filter;
}
if ( url && url.length > 4 ) {
url = url.slice(url.indexOf('images/'));
url = url.slice(0, url.indexOf('"'));
var obrazek = styly.priprav_obrazek( url );
if ( styly.pridej_obrazek(obrazek) ) {
nacteno++;
}
}
}
var styl = styleSheet.href.slice(styleSheet.href.indexOf('style/'));
ladici_vypis(LADENI, "styly.nahraj_obrazky", styl, "nalezeno " + nacteno + " obrázků");
if ( nacteno && styly.zapocitej_soubor(styleSheet.href) ) {
pocet_analyzovano++;
}
}
ladici_vypis(LADENI, "styly.nahraj_obrazky",
"nalezeno " + pocet_analyzovano + " stylových souborů prohlížeče");
} else {
ladici_vypis(LADENI, "styly.nahraj_obrazky", "metoda document.styleSheets není dostupná");
}
// Alternativní metoda - XMLHttpRequest
if ( styly.obrazky.length == 0 || pocet_analyzovano < link_styly.length ) {
// Načti všechny styly ručně a najdi v nich background-image
if ( ajax.je_funkcni() ) {
if ( styly.obrazky.length > 0 ) {
ladici_vypis(LADENI, "styly.nahraj_obrazky", "zkouším dočíst styly metodou XMLHttpRequest");
} else {
ladici_vypis(LADENI, "styly.nahraj_obrazky", "zkouším metodu XMLHttpRequest");
}
for ( var i = 0; i < link_styly.length; i++ ) {
var url = link_styly[i].href;
if ( styly.pridej_soubor(url) ) {
var styl = url.slice(url.indexOf('style/'));
ladici_vypis(LADENI, "styly.nahraj_obrazky", styl, "bude načten");
pocet_analyzovano++;
}
}
ladici_vypis(INFORMACE, "styly.nahraj_obrazky",
"nalezeno celkem " + pocet_analyzovano + " stylových souborů");
} else {
if ( pocet_analyzovano == 0 ) {
ladici_vypis(CHYBA, "styly.nahraj_obrazky",
"nenalezena metoda pro načtení všech obrázků");
} else {
ladici_vypis(CHYBA, "styly.nahraj_obrazky",
"nenalezena metoda pro dočtení zbylých stylových souborů");
}
}
} else {
ladici_vypis(INFORMACE, "styly.nahraj_obrazky",
"nalezeno celkem " + pocet_analyzovano + " stylových souborů");
}
setTimeout( function() { styly.dalsi_soubor(); }, 0 );
}
po_spusteni( function() { styly.nahraj_obrazky(); } );
// ===========================================================================
// =~ Aktivuj správný styl ~==================================================
for ( var i = 0; i < styly.pojmenovane_styly.length; i++ ) {
var link = styly.pojmenovane_styly[i];
var jmeno = link.getAttribute("title");
if ( jmeno != nastaveni.styl ) {
link.disabled = true;
} else {
link.disabled = false;
}
}
// ===========================================================================
// =~ Základní funkce pro práci se styly ~====================================
styly.zmen_styl = function(styl, povolit)
{
for ( var i = 0; i < styly.pojmenovane_styly.length; i++ ) {
var link = styly.pojmenovane_styly[i];
if ( (povolit && link.title == styl) ||
(!povolit && link.title != styl) ) {
link.disabled = !povolit;
ladici_vypis(LADENI, "styly.zmen_styl", link.href.match(/style.*/)[0],
"vybraný:"+formatuj_text(!link.disabled));
}
}
}
// Vyber styl po puštění klávesy
styly.vyber_klavesou = function()
{
var styl;
ladici_vypis(LADENI, "styly.vyber_klavesou", "hledám vybraný styl");
for ( var i = 0; i < styly.length; i++ ) {
var element = document.getElementById('styl-'+i);
if ( element && element.checked ) {
styl = styly[i].jmeno;
ladici_vypis(LADENI, "styly.vyber_klavesou", "nalezen styl "+styl);
}
}
if ( !styl ) {
ladici_vypis(CHYBA, "styly.vyber_klavesou", "nenalezen vybraný styl");
return false;
} else {
this.vyber(styl);
}
}
// Vyber styl
styly.vyber = function(styl)
{
if ( styl == nastaveni.styl ) {
ladici_vypis(LADENI, "styly.vyber", "žádná změna stylu, zůstává "+styl);
return true;
} else {
ladici_vypis(LADENI, "styly.vyber", "změna stylu na "+styl);
}
// Nejdříve povolíme
this.zmen_styl( styl, true );
// Potom zakážeme
this.zmen_styl( styl, false );
nastav_cookie("styl", styl, 365);
if ( hodnota_cookie("styl") != styl ) {
ladici_vypis(CHYBA, "styly.vyber", "nepodařilo se nastavit cookie");
}
nastaveni.styl = styl;
return true;
}
+43
View File
@@ -0,0 +1,43 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - základní tvar panelu stylů
// ===========================================================================
// =~ Vygenerování seznamu stylů ~============================================
document.write('<form action="#">');
document.write('<div class="styly">Styl zobrazení');
for ( var i = 0; i < styly.length; i++ ) {
document.write(
'<div><input name="styl" value="styl-'+i+'" id="styl-'+i+'" ' +
'type="radio" alt="Nastavení stylu '+styly[i].jmeno+'" ' +
'onclick="return styly.vyber(\''+styly[i].jmeno+'\');" ' +
'onkeyup="return styly.vyber_klavesou();" ' +
(styly[i].jmeno == nastaveni.styl?'checked="checked"':'') +
'/>');
if (ie_hack) {
document.write(
'<label for="styl-'+i+'">' +
'<span class="ikona"><span></span><div class="' + styly[i].trida + '"></div>' +
'</span>');
} else {
document.write(
'<label for="styl-'+i+'" class="' + styly[i].trida + '">');
}
document.write(
styly[i].jmeno+
'</label></div>');
}
document.write('</div>');
document.write('</form>');
+324
View File
@@ -0,0 +1,324 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - objekt pro zobrazování nástrojových tipů a nápovědy
// ===========================================================================
// =~ Třída nástrojových tipů ~===============================================
// Konstruktor
function Tooltip()
{
// Prodleva od posledního zobrazení, kdy se tooltip ukáže okamžitě
this.prejeti_mysi = 100;
// Čas před plným zobrazením tooltipu
this.plne_zobrazeni = 500;
// Objekt, nad kterým je myš
this.objekt = null;
// Informace použitá pro jednoznačné rozpoznání objektu (např. #id)
this.info = null;
// Detaily k objektu, jako je např. obsah tooltipu
this.detail = null;
// Tooltip je momentálně zobrazen
this.zobrazen = false;
// Čas ukrytí tooltipu
this.cas_skryti = null;
// Časovač spuštěný před prvním zobrazením
this.casovac_zobrazeni = null;
// Objekt tooltipu, jehož obsah se obnovuje při každém zobrazení tooltipu
this.tooltip = null;
}
// Myš je nad objektem - zobraz tooltip, pokud to je nutné
Tooltip.prototype.pres = function (objekt, info, detail)
{
// - Pokud nezobrazuji tooltip, zavolej this.pryc
// - Jinak:
// * Když nebyl tooltip nikdy zobrazen, spusť časovač. Časovač spusť, i když
// je doba od posledního skrytí větší, než nastavení. Restartuj časovač,
// pokud objekt není ten samý a časovač už byl spuštěn.
// * Když je tooltip skryt a čas od posledního skrytí je menší, než
// nastavení, zobraz tooltip.
if ( ! this.muzu_zobrazit(info, detail) ) {
ladici_vypis(LADENI, "tooltip.pres", info, "nezobrazuji");
this.pryc(objekt, info, detail);
} else {
var cas = new Date();
var rozdil_casu;
if ( this.cas_skryti ) {
rozdil_casu = cas-this.cas_skryti;
} else {
rozdil_casu = 0;
}
if ( this.cas_skryti == null ||
this.cas_skryti && rozdil_casu >= this.prejeti_mysi ||
!jsou_shodne(info, this.info) && this.casovac_zobrazeni
) {
this.objekt = objekt;
this.info = info;
this.detail = detail;
this.zastav_zobrazovani(info, detail);
var tento_objekt = this;
this.casovac_zobrazeni = setInterval(
function() { tento_objekt.zobraz(objekt, info, detail); },
this.plne_zobrazeni
);
ladici_vypis(LADENI, "tooltip.pres", info, "nastavení časovače na "+
this.plne_zobrazeni+"ms");
} else if ( this.cas_skryti && rozdil_casu < this.prejeti_mysi ) {
this.zobraz(objekt, info, detail);
} else {
ladici_vypis(LADENI, "tooltip.pres", info, "žádná změna");
}
}
}
// Myš opustila objekt - skryj tooltip, pokud to je potřeba
Tooltip.prototype.pryc = function (objekt, info, detail)
{
// Pokud byl nastaven časovač, ale tooltip ještě nebyl zobrazen, zastav
// zobrazování. Pokud už byl zobrazen stejný objekt, skryj ho.
var shodne = jsou_shodne(info, this.info);
if ( this.casovac_zobrazeni || shodne ) {
if ( shodne ) {
ladici_vypis(LADENI, "tooltip.pryc", info, "myš úplně opustila tooltip");
this.objekt = null;
this.info = null;
this.detail = null;
this.skryj(objekt, info, detail);
}
this.zastav_zobrazovani(info, detail);
} else {
ladici_vypis(LADENI, "tooltip.pryc", info, "žádná změna");
}
}
Tooltip.prototype.zrus = function (objekt, info, detail)
{
// Skryj tooltip
ladici_vypis(LADENI, "tooltip.zrus", info, "zrušení tooltipu");
this.skryj(objekt, info, detail);
this.cas_skryti = null;
}
// Zastav zobrazování
Tooltip.prototype.zastav_zobrazovani = function (info, detail)
{
if ( this.casovac_zobrazeni ) {
ladici_vypis(LADENI, "tooltip.zastav_zobrazovani", info, "zrušení časovače");
clearInterval( this.casovac_zobrazeni );
this.casovac_zobrazeni = null;
}
}
// Skryj tooltip
Tooltip.prototype.skryj = function (objekt, info, detail)
{
this.zastav_zobrazovani(info, detail);
ladici_vypis(LADENI, "tooltip.skryj", info, "skrytí tooltipu");
if ( this.zobrazen ) {
if ( this.tooltip ) {
this.tooltip.style.display = "none";
this.tooltip.style.visibility = "hidden";
}
this.cas_skryti = new Date();
}
this.zobrazen = false;
}
// Zobraz tooltip
Tooltip.prototype.zobraz = function (objekt, info, detail)
{
this.objekt = objekt;
this.info = info;
this.detail = detail;
this.zastav_zobrazovani(info, detail);
this.zobrazen = true;
if ( ! this.tooltip ) this.tooltip = this.vytvor(info, detail);
if ( this.tooltip ) {
this.tooltip.style.zIndex = -1;
this.tooltip.style.left = this.tooltip.style.top = "0";
this.tooltip.style.visibility = "hidden";
this.tooltip.style.display = "block";
this.obnov(this.tooltip, info, detail);
this.pozicuj(this.tooltip, objekt, info, detail);
this.tooltip.style.display = "block";
this.tooltip.style.zIndex = 1;
this.tooltip.style.visibility = "visible";
}
ladici_vypis(LADENI, "tooltip.zobraz", info, "zobrazení tooltipu");
}
// Změň pozici tooltipu
Tooltip.prototype.pozicuj = function (tooltip, objekt, info, detail)
{
this.uprav_rozmery(tooltip);
var rozmery = this.vypocti_pozici(tooltip, objekt, true);
if ( ! rozmery.uspech ) {
var nove_rozmery =
this.vypocti_pozici(tooltip, objekt, false);
if ( nove_rozmery.uspech ) {
rozmery = nove_rozmery;
}
}
tooltip.style.left = rozmery.levy+"px";
tooltip.style.top = rozmery.horni+"px";
}
// Vypočti pozici tooltipu
Tooltip.prototype.vypocti_pozici = function (tooltip, objekt, dole)
{
var rozmery_objektu = this.zjisti_rozmery(objekt);
ladici_vypis(LADENI, "tooltip.vypocti_pozici", rozmery_objektu, "objekt");
var rozmery = zjisti_rozmery();
var tooltip_velikost = zjisti_velikost(tooltip.element_tooltip);
var tooltip_rozmery = {
levy: rozmery_objektu.levy,
pravy: rozmery_objektu.levy + tooltip_velikost.x
};
if ( dole ) {
tooltip_rozmery.horni = rozmery_objektu.dolni;
tooltip_rozmery.dolni = rozmery_objektu.dolni + tooltip_velikost.y;
} else {
tooltip_rozmery.horni = rozmery_objektu.horni - tooltip_velikost.y;
tooltip_rozmery.dolni = rozmery_objektu.horni;
}
/* Pozice X:
* Levá pozice se shoduje s objektem
-> Když pravý okraj přesahuje okno, posuň nadoraz
-> Když levý okraj přesahuje okno, posuň nadoraz
-> Když pravý okraj přesahuje stránku, posuň nadoraz
-> Když levý okraj přesahuje stránku, posuň na nulu
*/
if ( tooltip_rozmery.pravy > rozmery.okno.pravy ) {
tooltip_rozmery = posun_x( tooltip_rozmery,
rozmery.okno.pravy-tooltip_rozmery.pravy);
}
if ( tooltip_rozmery.levy < rozmery.okno.levy ) {
tooltip_rozmery = posun_x( tooltip_rozmery,
rozmery.okno.levy-tooltip_rozmery.levy);
}
if ( tooltip_rozmery.pravy > rozmery.stranka.pravy ) {
tooltip_rozmery = posun_x( tooltip_rozmery,
rozmery.stranka.pravy-tooltip_rozmery.pravy);
}
if ( tooltip_rozmery.levy < rozmery.stranka.levy ) {
tooltip_rozmery = posun_x( tooltip_rozmery,
rozmery.stranka.levy-tooltip_rozmery.levy);
}
tooltip_rozmery.uspech = (
tooltip_rozmery.levy >= rozmery.okno.levy &&
tooltip_rozmery.pravy <= rozmery.okno.pravy &&
tooltip_rozmery.horni >= rozmery.okno.horni &&
tooltip_rozmery.dolni <= rozmery.okno.dolni
);
ladici_vypis(LADENI, "tooltip.vypocti_pozici", tooltip_rozmery,
"rozměry tooltipu");
return tooltip_rozmery;
}
// Uprav rozměry tooltipu
Tooltip.prototype.uprav_rozmery = function (tooltip)
{
// Zjisti aktuální velikosti
var rozmery = zjisti_rozmery();
// Šířka maximálně 30% velikosti okna, ale při zmenšení ne méně než 250px,
// ale rozhorně ne více, než jsou rozměry stránky (ať už to znamená cokoliv
// pro IE)
var max;
max = Math.max( 250, Math.floor(0.3*(rozmery.okno.pravy-rozmery.okno.levy)));
max = Math.min( max, rozmery.stranka.pravy-rozmery.stranka.levy );
// Největší velikost tooltipu
tooltip.style.width = max+"px";
var tooltip_velikost = zjisti_velikost(tooltip.element_tooltip);
tooltip.style.width = tooltip_velikost.x+"px";
}
// ===========================================================================
// =~ Veřejně dostupné funkce ~===============================================
Tooltip.prototype.prekresli = function ()
{
if ( this.zobrazen ) {
if ( this.tooltip ) {
if ( this.muzu_zobrazit( info, detail ) ) {
ladici_vypis(LADENI, "tooltip.prekresli", info, "překreslení tooltipu");
this.zobraz( this.objekt, this.info, this.detail );
} else {
ladici_vypis(LADENI, "tooltip.prekresli", info,
"nemůže být zobrazen, skrývám");
this.skryj( this.objekt, this.info, this.detail );
}
}
}
}
// ===========================================================================
// =~ Veřejně editovatelné funkce ~===========================================
// Jestli zobrazit tooltip
Tooltip.prototype.muzu_zobrazit = function (info, detail)
{
var muzu = ( detail != undefined && detail != null );
if ( ! muzu ) {
ladici_vypis(LADENI, "tooltip.muzu_zobrazit", info,
"nemůžu zobrazit, detail:"+formatuj_text(detail));
}
return muzu;
}
// Zjisti rozměry objektu pro zobrazení tooltipu
Tooltip.prototype.zjisti_rozmery = function (objekt)
{
return zjisti_rozmery(objekt);
}
// Obnov obsah tooltipu
Tooltip.prototype.obnov = function (tooltip, info, detail)
{
}
// Vytvoř objekt tooltipu
Tooltip.prototype.vytvor = function (info, detail)
{
var tooltip = tvoric.tooltip();
var element = document.getElementById('stranka');
element.insertBefore(tooltip, element.firstChild);
return tooltip;
}
+276
View File
@@ -0,0 +1,276 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - tvořicí funkce pro HTML
// ===========================================================================
// =~ Globální proměnné ~=====================================================
tvoric = new Object();
// ===========================================================================
// =~ Vygenerování nástrojů ~=================================================
// Vytvoř nové tlačítko zápisem do dokumentu. Všechny parametry jsou řetězce
tvoric.zapis_tlacitko = function (vytvor_mezeru, id, mys, mys_info, mys_detail)
{
if ( ! vytvor_mezeru ) {
var detail = '';
if ( mys_detail ) {
detail = ','+mys_detail;
}
document.write('<div class="tlacitko">'+
'<div class="tlacitko-nastroj"><div class="ikona" id="'+id+'">'+
'</div></div>'+
'<div class="tlacitko-maska" '+
'onmouseover="return '+mys+'.pres(event,'+mys_info+detail+');" ' +
'onmouseout="return '+mys+'.pryc(event,'+mys_info+detail+');" '+
'onmousedown="return '+mys+'.stisk(event,'+mys_info+detail+');" '+
'onmouseup="return '+mys+'.pust(event,'+mys_info+detail+');"');
document.write('></div></div>');
} else {
document.write('<div class="tlacitko-mezera">'+
'<div class="nastroje-mezera"></div></div>');
}
}
tvoric.nastav_udalosti_mysi = function (element, mys, mys_info, mys_detail)
{
var detail = '';
if ( mys_detail ) {
detail = ','+mys_detail;
}
// Události
element.onmouseover = new Function( "e",
'return '+mys+'.pres(e,'+mys_info+detail+');' );
element.onmouseout = new Function( "e",
'return '+mys+'.pryc(e,'+mys_info+detail+');' );
element.onmousedown = new Function( "e",
'return '+mys+'.stisk(e,'+mys_info+detail+');' );
element.onmouseup = new Function( "e",
'return '+mys+'.pust(e,'+mys_info+detail+');' );
}
tvoric.vytvor_tlacitko = function (vytvor_mezeru, id, mys, mys_info, mys_detail)
{
if ( ! vytvor_mezeru ) {
// Vytvoř tlačítko
// Elementy
var element_tlacitko = document.createElement('DIV');
var element_tlacitko_nastroj = element_tlacitko.cloneNode(false);
var element_tlacitko_ikona = element_tlacitko.cloneNode(false);
var element_tlacitko_maska = element_tlacitko.cloneNode(false);
// Události
tvoric.nastav_udalosti_mysi(element_tlacitko_maska, mys,
mys_info, mys_detail);
// Styly
element_tlacitko.className = "tlacitko";
element_tlacitko_nastroj.className = "tlacitko-nastroj";
element_tlacitko_ikona.className = "ikona";
element_tlacitko_ikona.id = id;
element_tlacitko_maska.className = "tlacitko-maska";
// Tvar
element_tlacitko_nastroj.appendChild( element_tlacitko_ikona );
element_tlacitko.appendChild( element_tlacitko_nastroj );
element_tlacitko.appendChild( element_tlacitko_maska );
return element_tlacitko;
} else {
// Vytvoř mezeru
// Elementy
var element_tlacitko_mezera = document.createElement('DIV');
var element_nastroje_mezera = element_tlacitko_mezera.cloneNode(false);
// Styly
element_tlacitko_mezera.className = "tlacitko-mezera";
element_nastroje_mezera.className = "nastroje-mezera";
// Tvar
element_tlacitko_mezera.appendChild(element_nastroje_mezera);
return element_tlacitko_mezera;
}
}
tvoric.maska_tlacitka_z_ikony = function (element_ikona)
{
return element_ikona.parentNode.nextSibling;
}
// Zvýrazňování tlačítek
tvoric.zvyraznovac = function(id, zvyraznen, stisknut, vybran)
{
var element = document.getElementById(id);
var parent = element.parentNode;
if ( vybran || stisknut )
{
parent.className = "tlacitko-dole";
} else if ( zvyraznen ) {
parent.className = "tlacitko-nahore";
} else {
parent.className = "tlacitko-nastroj";
}
}
// Tvar nástrojových tipů
tvoric.tooltip = function()
{
/* Struktura tooltipu
<div class=tooltip-hranice>
<div class=tooltip>
<div class=horni>
<div class=margin-5><div class=pixel></div></div>
<div class=margin-3><div class=margin-2><div class=pixel></div></div></div>
<div class=margin-2><div class=margin-1><div class=pixel></div></div></div>
<div class=margin-1><div class=margin-1><div class=pixel></div></div></div>
<div class=margin-1><div class=margin-1><div class=pixel></div></div></div>
</div>
<div class=stred>
<div class=vypln><div></div></div>
<div class=ikona><div></div></div>
<div class=nadpis></div>
<div class=popis></div>
<div class=vypln><div></div></div>
</div>
<div class=spodni>
<div class=margin-1><div class=margin-1><div class=pixel></div></div></div>
<div class=margin-1><div class=margin-1><div class=pixel></div></div></div>
<div class=margin-2><div class=margin-1><div class=pixel></div></div></div>
<div class=margin-3><div class=margin-2><div class=pixel></div></div></div>
<div class=margin-5><div class=pixel></div></div>
</div>
</div>
</div>
*/
// Elementy
var tooltip_hranice = document.createElement('DIV')
var tooltip = tooltip_hranice.cloneNode(false);
var horni = tooltip.cloneNode(false);
var pixel = tooltip.cloneNode(false);
var margin_5 = tooltip.cloneNode(false);
var margin_3 = tooltip.cloneNode(false);
var margin_2 = tooltip.cloneNode(false);
var margin_1 = tooltip.cloneNode(false);
var stred = tooltip.cloneNode(false);
var ikona = tooltip.cloneNode(false);
var nadpis = tooltip.cloneNode(false);
var popis = tooltip.cloneNode(false);
var vypln = tooltip.cloneNode(false);
var prazdny = tooltip.cloneNode(false);
var spodni = tooltip.cloneNode(false);
// Styly
tooltip_hranice.className = 'tooltip-hranice';
tooltip.className = 'tooltip';
horni.className = 'horni';
pixel.className = 'pixel';
margin_5.className = 'margin-5';
margin_3.className = 'margin-3';
margin_2.className = 'margin-2';
margin_1.className = 'margin-1';
stred.className = 'stred';
ikona.className = 'ikona';
nadpis.className = 'nadpis';
popis.className = 'popis';
vypln.className = 'vypln';
spodni.className = 'spodni';
// Tvar
tooltip_hranice.appendChild(tooltip);
tooltip.appendChild(horni);
horni.appendChild(margin_5.cloneNode(false));
horni.lastChild.appendChild(pixel.cloneNode(false));
horni.appendChild(margin_3.cloneNode(false));
horni.lastChild.appendChild(margin_2.cloneNode(false));
horni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
horni.appendChild(margin_2.cloneNode(false));
horni.lastChild.appendChild(margin_1.cloneNode(false));
horni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
horni.appendChild(margin_1.cloneNode(false));
horni.lastChild.appendChild(margin_1.cloneNode(false));
horni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
horni.appendChild(margin_1.cloneNode(false));
horni.lastChild.appendChild(margin_1.cloneNode(false));
horni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
tooltip.appendChild(stred);
stred.appendChild(vypln.cloneNode(false));
stred.lastChild.appendChild(prazdny.cloneNode(false));
stred.appendChild(ikona);
ikona.appendChild(prazdny.cloneNode(false));
stred.appendChild(nadpis);
nadpis.appendChild(document.createTextNode(""));
stred.appendChild(popis);
popis.appendChild(document.createTextNode(""));
stred.appendChild(vypln);
stred.lastChild.appendChild(prazdny);
tooltip.appendChild(spodni);
spodni.appendChild(margin_1.cloneNode(false));
spodni.lastChild.appendChild(margin_1.cloneNode(false));
spodni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
spodni.appendChild(margin_1.cloneNode(false));
spodni.lastChild.appendChild(margin_1.cloneNode(false));
spodni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
spodni.appendChild(margin_2.cloneNode(false));
spodni.lastChild.appendChild(margin_1);
spodni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
spodni.appendChild(margin_3);
spodni.lastChild.appendChild(margin_2);
spodni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
spodni.appendChild(margin_5);
spodni.lastChild.appendChild(pixel);
// Některé zvláštní vlastnosti
tooltip_hranice.element_ikona = ikona.firstChild;
tooltip_hranice.element_nadpis = nadpis.firstChild;
tooltip_hranice.element_popis = popis.firstChild;
tooltip_hranice.element_tooltip = tooltip_hranice.firstChild;
return tooltip_hranice;
}
// Nastav vlastnosti tooltipu
tvoric.obnov_tooltip = function (tooltip, ikona, nadpis, popis)
{
if ( ! tooltip ) {
return;
}
if ( !ikona ) { ikona = ""; }
tooltip.element_ikona.className = ikona;
if ( !nadpis ) { nadpis = ""; }
tooltip.element_nadpis.nodeValue = nadpis;
if ( !popis ) { popis = ""; }
tooltip.element_popis.nodeValue = popis;
// Nastav mezeru mezi nadpisem a popisem
if ( nadpis.length > 0 && popis.length > 0 ) {
tooltip.element_nadpis.parentNode.style.marginBottom = "1em";
} else {
tooltip.element_nadpis.parentNode.style.marginBottom = "0";
}
var margin = "0px";
if ( ikona.length > 0 ) {
var velikost = zjisti_velikost(tooltip.element_ikona);
margin = (velikost.x+8)+"px";
}
tooltip.element_nadpis.parentNode.style.marginLeft = margin;
tooltip.element_popis.parentNode.style.marginLeft = margin;
}
+87
View File
@@ -0,0 +1,87 @@
/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - funkce pro práci s různými velikostmi Karla
// ===========================================================================
// =~ Tovární nastavení ~=====================================================
// Styl nastavený uživatelem
nastaveni.velikost = hodnota_cookie("velikost");
// ===========================================================================
// =~ Globální proměnné ~=====================================================
// Názvy různých velikostí
velikosti = [
{jmeno: "Normální", trida: "velikost-normalni"},
{jmeno: "Malý", trida: "velikost-maly"}
];
// ===========================================================================
// =~ Základní nastavení ~====================================================
if ( nastaveni.velikost == null ) {
nastaveni.velikost = velikosti[0].jmeno;
}
// ===========================================================================
// =~ Základní funkce pro práci se styly ~====================================
velikosti.zmen_velikost = function(velikost)
{
}
// Vyber styl po puštění klávesy
velikosti.vyber_klavesou = function()
{
var velikost;
ladici_vypis(LADENI, "velikosti.vyber_klavesou", "hledám vybranou velikost");
for ( var i = 0; i < velikosti.length; i++ ) {
var element = document.getElementById('velikost-'+i);
if ( element && element.checked ) {
velikost = velikosti[i].jmeno;
ladici_vypis(LADENI, "velikosti.vyber_klavesou", "nalezena velikost "+velikost);
}
}
if ( !velikost ) {
ladici_vypis(CHYBA, "velikost.vyber_klavesou", "nenalezena vybraná velikost");
return false;
} else {
this.vyber(velikost);
}
}
// Vyber styl
velikosti.vyber = function(velikost)
{
if ( velikost == nastaveni.velikost ) {
ladici_vypis(LADENI, "velikost.vyber", "žádná změna velikosti, zůstává "+velikost);
return true;
} else {
ladici_vypis(LADENI, "velikost.vyber", "změna velikosti na "+velikost);
}
// Nejdříve povolíme
this.zmen_velikost( velikost );
nastav_cookie("velikost", velikost, 365);
if ( hodnota_cookie("velikost") != velikost ) {
ladici_vypis(CHYBA, "velikosti.vyber", "nepodařilo se nastavit cookie");
}
nastaveni.velikost = velikost;
return true;
}
// ===========================================================================
// =~ Aktivuj správnou velikost ~=============================================
velikosti.zmen_velikost(nastaveni.velikost);