/* TYPO.JS - http://kukla.webpark.cz/tools/typo.htm
script pro drobne typograficke korekce urceny pro 
on-line i off-line pouziti
on-line - viz http://kukla.webpark.cz/tools/typo.htm
off-line - pomoci Windows Scripting Host - spousti se z prikazove radky s parametrem souboru

PRIKLAD PRO LOKALNI SPUSTENI:
C:\WINDOWS\WSCRIPT.EXE C:\typo.js c:\web\index.html
*/

/* TYP VYSTUPU - typvyst
0 - html - vystup je vracen vstupnimu poli na strance 
1 - html - vystup je transformovan do HTML a zobrazen v novem okne
2 - file - zpracovani souboru - okamzite zobrazeni chyb
3 - file - zpracovani souboru - ulozeni zpracovani do typo.log
4 - file - zpracovani souboru - ulozeni zpracovani do typo.log + okamzite zobrazeni chyb*/
var typvyst = 0;
////*--- start lokal ---*/
//var typvyst = 3;
////*--- end lokal ---*/


/* PREDLOZKY A SPOJKY - predl
jednoznakove predlozky a spojky, za ktere bude vlozena nezlomitelna mezera (&nbsp;)*/
var predl = "aAiIkKoOsSuUvVzZ";

/* POCATECNI A KONCOVA ZNACKA - stag/endtrag
stag - po nalezeni pocatecni znacky script hleda odpovidajici koncovou znacku (etag)
a vse mezi temito znackami neupravuje; musi zacinat znakem "<"
etag - viz popis u stag
totez plati pro znaky < a > - vse mezi nimi script neupravuje*/
var stag = new Array("<!--","<script","<style","<head","<![CDATA[","<pre","<xmp","<code");
var etag = new Array("-->","<\/script>","<\/style>","<\/head>","]]>","<\/pre>","<\/xmp>","<\/code>");


/* KONEC RADKU - konecradku
sekvence pro pocitani cisla radku pro ucely zobrazeni chybovych hlaseni*/
var konecradku = "\n";            // znak konce radku

//// nize uz neni potreba nic menit!!! - vyjimkou je pripadne odkomentovani casti pro lokalni pouziti

var errtext, vstup, re;           // text chyby, obsah vstupu, regulární výraz
var err = 0;                      // status chyby; 0 = OK   

////*--- start lokal ---*/
if(typvyst>=2)
{
  var parametry = WScript.Arguments;
  var f0;
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var soubor;                                                // cesta k vstupnimu souboru

  var sfn = new String(WScript.ScriptFullName);
  var fn  = new String(WScript.ScriptName);
  var errlog = sfn.substring(0,(sfn.length-fn.length))+"typo.log";// cesta k errorlogu

  var datum=new Date();
  var minuta = datum.getMinutes();  if(minuta<10)  { minuta="0"+minuta;}
  var sekunda = datum.getSeconds(); if(sekunda<10) { sekunda="0"+sekunda;}
  errtext = "Chyba       : "+datum.getDate()+"."+(datum.getMonth()+1)+"."+datum.getFullYear()+" "+datum.getHours()+":"+minuta+":"+sekunda+" "; 

  if(parametry.length != 1)
  { err = 1; errtext += "- nesprávný počet parametrů - zpracování bylo přerueno!\r\n";  }
  else
  {
    soubor = new String(parametry(0));
    errtext += "- "+soubor+" - ";
    if (!fso.FileExists(soubor))					
    { err = 1; errtext += "soubor neexistuje - zpracování bylo přerueno!\r\n"; } 
    else
    { 
      f0 = fso.OpenTextFile(soubor, 1);   vstup = f0.ReadAll();   f0.Close();  // nactení obsahu souboru   
      korek();
    } 
  }
}
////*--- end lokal ---*/

function korek() 
{
  var vystuppre = "";                                   // priprava vystupu
  var vystup = "";                                      // vystupni retezec
  var re;                                               // regularni vyraz    

  var end ="";                                          // pozice zacatku uzavreni vyjimky
  var starttxt = "";                                    // text startu vyjimky - pouze pro vypis ERR 
  var endtxt = "";                                      // text uzavreni vyjimky
  var cisloradku = 1;                                   // pocitalo radku pro vypis chyby

  if(typvyst<2) 
  {
    if (document.forms[0].nahl.checked) 	{  typvyst = 1;  } else {  typvyst = 0; }
    predl = "";
    if (document.forms[0].a.checked) 	{  predl += "a";  }
    if (document.forms[0].aa.checked) {  predl += "A";  }
    if (document.forms[0].i.checked) 	{  predl += "i";  }
    if (document.forms[0].ii.checked) {  predl += "I";  }
    if (document.forms[0].k.checked) 	{  predl += "k";  }
    if (document.forms[0].kk.checked) {  predl += "K";  }
    if (document.forms[0].o.checked) 	{  predl += "o";  }
    if (document.forms[0].oo.checked) {  predl += "O";  }
    if (document.forms[0].s.checked) 	{  predl += "s";  }
    if (document.forms[0].ss.checked) {  predl += "S";  }
    if (document.forms[0].u.checked) 	{  predl += "u";  }
    if (document.forms[0].uu.checked) {  predl += "U";  }
    if (document.forms[0].v.checked) 	{  predl += "v";  }
    if (document.forms[0].vv.checked) {  predl += "V";  }
    if (document.forms[0].z.checked) 	{  predl += "z";  }
    if (document.forms[0].zz.checked) {  predl += "Z";  }

    vstup = new String(document.forms[0].mtext.value);
    errtext = "Chyba: ";
  }

  if(err==0)
  {  
    for(var i = 0; i < vstup.length; i++) 				        // cti vstup znak po znaku
    {                        
/******************************************************************************/
      if(vstup.charAt(i) == "<")                          // pokud najdes < ...
      { 
        starttxt = "<";                                   
        endtxt = ">";
        end = 0;
        for(var y = 0; y < stag.length; y++)              // ... over, zda nejde o vyjimku
        {
          if(vstup.substr(i,stag[y].length)==stag[y]) 
          { starttxt = stag[y];    endtxt = etag[y]; }    // pokud ano, nastav odpovidajici konec vyjimky
        }
/*-- kontrola konce vyjimky - start --*/
        re = new RegExp(endtxt,"g")                       // over, zda v textu existuje konec vyjimky
        if(re.test(vstup.substring(i,vstup.length)))  
        {
          end = vstup.indexOf(endtxt,i)+endtxt.length;    // pokud ano zjisti jeho pozici 
        }
        else
        {
          err = 1;                                        // jinak zapis chybu a prerus zpracovani
          errtext += "na řádku "+cisloradku+" je počáteční značka \""+starttxt+"\", ke které v dokumentu chybí koncová značka \""+endtxt+"\"!\r\n";            // jinak vyhod chybu a prerus zpracovani
          break;
        }
/*-- kontrola konce vyjimky - end --*/
        vystuppre = vstup.substring(i,end);               // predej celou vyjimku vystupu 
        cisloradku = pocitaniradku(vystuppre,cisloradku);

        if(typvyst==1) { vystuppre = formatpronahled(vystuppre,"kod"); }

        vystup += vystuppre;                              // predej celou vyjimku vystupu 
        vystuppre = "";
        i = end-1;                                        // preskoc za vyjimku
      }
/******************************************************************************/
      else
      {
        end = 0;
        endtxt = "<";
/*-- kontrola konce textu - start --*/
        re = new RegExp(endtxt,"g")                       // over, zda existuje konec textu (resp znak <)
        if(re.test(vstup.substring(i,vstup.length)))  
        {
          end = vstup.indexOf(endtxt,i);                  // pokud ano zjisti jeho pozici 
        }
        else
        { end = vstup.length; }                           // pokud ne nastav pozici konce na konec vstupu
/*-- kontrola konce textu - end --*/
        vystuppre = vstup.substring(i,end);                 
        cisloradku = pocitaniradku(vystuppre,cisloradku);
        if(typvyst==1) { vystuppre = formatpronahled(vystuppre,"text"); }

/*-- predlozky - start --*/
        for(var p = 0; p < predl.length; p++) 	   // zpracovani predlozek
        {
          var xx = predl.charAt(p);

          re = new RegExp(" "+xx+" ","g") 
          if(typvyst==1) { vystuppre = vystuppre.replace(re," "+xx+"<span class=\"mez\">&amp;nbsp;<\/span>");	}
          else          { vystuppre = vystuppre.replace(re," "+xx+"&nbsp;");	}
          
          re = new RegExp("&nbsp;"+xx+" ","g")                  // pro pripad "a v teto situaci"
          if(typvyst==1) { vystuppre = vystuppre.replace(re,"&nbsp;"+xx+"<span class=\"mez\">&amp;nbsp;<\/span>");	}
          else          { vystuppre = vystuppre.replace(re,"&nbsp;"+xx+"&nbsp;");	 }

          re = new RegExp(" \\r\\n"+xx+" ","g") 
          if(typvyst==1) { vystuppre = vystuppre.replace(re," \r\n"+xx+"<span class=\"mez\">&amp;nbsp;<\/span>");	}
          else          { vystuppre = vystuppre.replace(re," \r\n"+xx+"&nbsp;");	}

          re = new RegExp(" "+xx+"\\r\\n ","g") 
          if(typvyst==1) { vystuppre = vystuppre.replace(re," "+xx+"<span class=\"mez\">&amp;nbsp;<\/span>\r\n"); }
          else          { vystuppre = vystuppre.replace(re," "+xx+"&nbsp;\r\n"); }
        }
/*-- predlozky - end --*/  
        vystup += vystuppre;
        vystuppre = "";
        i = end-1; 
      }
    }
/******************************************************************************/
  }

  if(typvyst==0)                                        // form                     
  { 
    if(err>0)     { alert(errtext); }
    else          { document.forms[0].mtext.value = vystup;   }  
  }

  if(typvyst==1)                                        // nahled
  { 
    if(err>0)     { alert(errtext); }
    else
    {
      var o=window.open('','okno',''); //top=50,left=100,width=450,height=200,toolbar=no,location=no,status=yes,menubar=no,scrollbars=yes, resizeable=yes,copyhistory=no
      if(o)
      {
        o.document.write('<html><head>');
        o.document.write('<title>Náhled<\/title>');
        o.document.write('<style type=\"text\/css\">');
        o.document.write('<!--');
        o.document.write('span.kod  { color:blue; }');
        o.document.write('span.text { color:red; }');
        o.document.write('span.mez  { border:1px solid #fcc; background-color:#fcc; }');    
        o.document.write('\/\/-->');
        o.document.write('<\/style><\/head><body>');
        o.document.write('<span class=\'kod\'>modře<\/span> - jsou označeny části textu, které skript nemění<br \/>');
        o.document.write('<span class=\'text\'>červeně<\/span> - jsou označeny skriptem modifikované části textu<hr \/>'); 
        o.document.write(vystup);
        o.document.write('<hr \/>konec náhledu<\/body></html>');
      }
      else
      { 
        alert('Náhled nebude zobrazen, protože se nezdařilo otevření nového okna prohlížeče!\n\nMožná máte nastaveno blokování otevítání nových oken. Povolte otevírání nových oken a zkuste to znovu.\n\nBlokování oken má vliv pouze na zobrazení náhledu, nikoli na samotné zpracování textu.'); 
      }
    }
  } 
  
  if(typvyst>=2)                                        // soubor
  {
    if((err>0)&&((typvyst==2)||(typvyst==4)))     { WScript.Echo(errtext); }
    if((err>0)&&((typvyst==3)||(typvyst==4)))
    { f0 = fso.OpenTextFile(errlog, 8, true);   f0.Write(errtext);    f0.Close(); }
    if(err==0)
    { 
      f0 = fso.OpenTextFile(soubor, 2, true);   f0.Write(vystup);    f0.Close(); 
      if(vstup==vystup)
      { errtext = "OK bez zmeny" }
      else
      { errtext = "OK zmeneno  " }

      f0 = fso.OpenTextFile(errlog, 8, true);   f0.Write(errtext+": "+datum.getDate()+"."+(datum.getMonth()+1)+"."+datum.getFullYear()+" "+datum.getHours()+":"+minuta+":"+sekunda+" - "+soubor+"\r\n");  f0.Close();
    }
  }
}
/**** korek - end *************************************************************/
function formatpronahled(vyst,p)
{  
  re = new RegExp("&","g") 
  vyst = vyst.replace(re,"&amp;");	

  re = new RegExp("<","g") 
  vyst = vyst.replace(re,"&lt;");	

  re = new RegExp(">","g") 
  vyst = vyst.replace(re,"&gt;");	
  
  re = new RegExp("\\r\\n","g") 
  vyst = vyst.replace(re,"<br \/>");	
  
  return "<span class=\""+p+"\">"+vyst+"<\/span>";
}
/**** formatpronahled - end ***************************************************/
function pocitaniradku(vyst,cislor)
{
  for(var z = 0; z < vyst.length; z++) 
  {
    if(vyst.indexOf(konecradku,z)>-1)  { z = vyst.indexOf(konecradku,z);  cislor += 1; }
  }  
  return cislor;
}
/**** pocitaniradku - end *****************************************************/

