Quickface.>
JavaSkriptem
PHP Skriptem
Barva pozadí
Barva písma
Velikost písma

Formátování předložek

Pokud jste někdy slyšeli o typografii, jistě víte, že jednohlásky nepatří na konec řádku. Následující php skript umožňuje automatizovat vkládání prvku, jenž je volitelný, za, ve speciálním souboru definované, řetězce(např.: předložky, spojky).

Předpoklady skriptu

Skript by měl umět zformátovat libovolný textový soubor, který uživatel předá přes webové rozhraní. To poskytuje následující volby:

  • Cesta k souboru umožňuje určit onen libovolný soubor.
  • Znak za předložkou tj. znak který nahradí mezeru za předložkou, tak aby se nemohla vyskytnout na konci řádku(v HTML dokumentu obvykle nedělitelná mezera  ).
  • Znaková sada Aby bylo možno správně nahradit předložky je nutno specifikovat znakovou sadu, v niž byl soubor uložen. Na počítačích s OS Windows se jedná obvykle o windows-1250.
  • Alternativní soubor s předložkami Kdokoliv si může zvolit svůj vlastní soubor s předložkami, přičemž jedna řádka = jedna předložka/slovo.
  • Zahrnout přidané předložky Povolit předložky přidané pomocí webového rozhraní.
  • Ignorovat HTML tagy Tato volba umožní formátování textu pouze mimo HTML značky(tagy).
  • Výstup: Zvýrazněný text nebo Textové pole Umožníme uživateli dva typy výstupu. Zvýrazněný text je obyčejný HTML text, ve kterém jsou zvýrazněné provedené změny. Vybráním druhé volby se zformátovaný dokument pouze vloží do textového pole(textarea).

Skript rozpoznává řetězce k formátování díky regulárním výrazům, proto by měl rozpoznat všechno co je od sebe odděleno netisknutelnými znaky(např.: mezera, nový řádek). Vše můžete otestovat na adrese seznam_predlozek.php.

Zdrojový kód

Část zdrojového kódu, která se stará o formátování:
Chybí zpětná lomítka, proto berte následjící kód jen ilustračně

<?php
function get_rows($file) { //Načtení jednotlivých řádek ze souboru
if(
file_exists($file)) {
  if(
$fp = @fopen($file, "r")) {
   if(
feof($fp) || !filesize($file)) {
    
$rows[] = chop(fgets($fp, filesize($file)));
    if(!
$rows[0])
      return
false; //Prázdný soubor
   
}
   else
     
$rows[] = chop(fgets($fp, filesize($file)));
   while (!
feof($fp)) {
    
$rows[] = chop(fgets($fp, filesize($file)));
   }
   return
$rows;
  }
  else return
false;
}
else return
false;
}

function
get_text($file) { //Načtení celého textu ze souboru
if(
file_exists($file)) {
  if(
$fp = @fopen($file, "r")) {
   if(
$text = fread($fp, filesize($file)))
    return
$text;
   else
    return
false;
  }
  else return
false;
}
else return
false;
}

function
convert_to_utf_czech($str, $encoding) { /*Konvertování českých znaků do znakové sady utf-8(defaultní nastavení souboru)*/
$conv_utf = Array("ě", "š", "&#269;", "ř", "ť", "ž", "ň", "ď", "ý", "á", "í", "é", "ú", "ů", "ó", "Ě", "Š", "Č", "Ř", "Ž", "Ť", "Ň", "Ď", "Ý", "Á", "Í", "É", "Ú", "Ó");
if (
$encoding == "windows-1250") {
  return
str_replace(get_rows("windows-1250.txt"), $conv_utf, $str); //Neznám lepší způsob
}
elseif (
$encoding == "iso-8859-2") {
  
$conv_utf[11] = "&eacute;";
  return
str_replace(get_rows("iso-8859-2.txt"), $conv_utf, $str);
}
else {
  return
$str;
}
}

function
convert_all_to_utf_czech($str_array, $encoding) {
if (
is_array($str_array)) {
  foreach (
$str_array as $str) {
   
$new_array[] = convert_to_utf_czech($str, $encoding);
  }
  return
$new_array;
}
else {
  return
convert_to_utf_czech($str_array, $encoding);
}
}

function
preg_char($str) { /*Přeložení speciálních znaků (Perl)regulárních výrazů*/
  
$search = array("?", "*", "+", ",", "{", "}", "[", "]", "(", ")", "/");
  
$replace = array("?", "*", "+", ",", "{", "}", "[", "]", "(", ")", "/");
  return
str_replace($search, $replace, $str);
}

function
preg_test_all($pattern, $str) { /*Testování zdali nějaký (Perl)výraz pasuje*/
  if(
is_array($pattern) && !is_array($str)) {
    foreach(
$pattern as $p)
      if(
preg_match($p, $str))
        return
true;
  }
  else
    echo
"<font color="red">Fce preg_test_all() ma chybne parametry!</font>";

  return
false;
}

function
format_text($text, $preps, $glue, $ignoreHTML=0) { /*Samotné formátování textu*/
global
$highlight_1;
global
$highlight_2;
if (
$_POST["output"] == "formated_text") {
  
$highlight_1 = "<span class="nkmex_lime">";
  
$highlight_2 = "</span>";
}

if(
is_array($preps)) {
  foreach(
$preps as $prep) {
   if(!
$prep)
     continue;
   
$pattern[] = "/(s+)".preg_char($prep)."s+/";
   
$pattern[] = "/".preg_char($highlight_1.$glue.$highlight_2.$prep)."s+/";
   
$replace[] = "1".$prep.$highlight_1.$glue.$highlight_2;
   
$replace[] = $highlight_1.$glue.$highlight_2.$prep.$highlight_1.$glue.$highlight_2;
  }
}
else
  return
0;

$text = " ".$text; //Optimalizace

if($ignoreHTML) {
  
$non_text_tags = array("/^script/", "/^style/");

  if(
substr_count($text, "<") != substr_count($text, ">"))
   
$text = "<font color="red">(x)HTML dokument není validní, formátování proto nemusí být správné</font>n".$text;

  
$tok = strtok($text,"<");
  
$text = "";
  while (
$tok) {
   
$ftok = explode(">", $tok);
   if(
preg_test_all($non_text_tags, $ftok[0])) {
     
$text .= "<".$tok;
     
$tok = strtok("<");
     continue;
   }
   if(
$ftok[1]) {
     
$text .= "<".$ftok[0].">";
     
$ftok[1] = preg_replace($pattern, $replace, " ".$ftok[1]);
     
$text .= substr($ftok[1], 1, strlen($ftok[1]));
   }
   elseif(
strpos($tok, ">") === false) {
     
$ftok[1] = preg_replace($pattern, $replace, " ".$tok);
     
$text .= substr($ftok[1], 1, strlen($ftok[1]));
   }
   else
     
$text .= "<".$tok;
     
   
$tok = strtok("<");
  }
}
else
  
$text = preg_replace($pattern, $replace, $text);

return
substr($text, 1, strlen($text));
}

function
load_preps($encoding) { /*Načtení řetězců(předložek, spojek, atd.), za něž se bude nahrazovat*/
if (!
$_FILES["altpreps_filelocation"]["name"]) {
  if (!
$preps = convert_all_to_utf_czech(get_rows("seznam_predlozek.txt"), $_POST["charset"])) {
   echo
"<font color="#FF0000"><b>
        Nepovedlo se přečíst soubor se základními předložkami</b></font><br>"
;
  }
}
else {
  if (!
$preps = convert_all_to_utf_czech(get_rows($_FILES["altpreps_filelocation"]["tmp_name"]), $_POST["charset"])) {
   echo
"<font color="#FF0000"><b>
        Nepovedlo se přečíst soubor s alternativními předložkami</b></font><br>"
;
  }
}

if (
$_POST["added_preps"]) {
  if (!
$add_preps = convert_all_to_utf_czech(get_rows("pridane_predlozky.txt"), $_POST["charset"])) {
   echo
"<font color="#FF0000"><b>
        Nepovedlo se přečíst soubor s přidanými předložkami</b></font><br>"
;
  }
  elseif (
$preps[0]) {
   foreach (
$add_preps as $prep) {
    
$preps[] = $prep;
   }
  }
  else {
   
$preps = $add_preps;
  }
}

if (
$preps[0]) {
  
$i = 0;
  foreach (
$preps as $prep) {
   
$preps[] = ucfirst($preps[$i]);
   
$i++;
  }
  return
$preps;
}
else {
  return
false;
}
}

function
decode_misc($misc) { /*Dekódování defautní (&nbsp;)nedělitelné mezery*/
if (
$misc == "&amp;nbsp;") return "&nbsp;";
else return
$misc;
}

if (
$_POST["format"] == "Formatuj") {
if ((
$text = convert_all_to_utf_czech(get_text($_FILES["format_filelocation"]["tmp_name"]), $_POST["charset"])) && ($preps = load_preps($_POST["charset"]))) {
  if (
$_POST["ignore_html"]) {
   
$text = format_text($text, $preps, decode_misc($_POST["glue"]), 1);
   
$formated_file = $text."n";
  }
  else {
   
$text = format_text($text, $preps, decode_misc($_POST["glue"]), 0);
   
$formated_file = $text."n";
  }
}
else {
  echo
"<font color="#FF0000"><b>
        Nepovedlo se přečíst soubor nebo nahrát předložky</b></font><br>"
;
}
}
?>
    <form name="stick_preps" action="<?php echo $_SERVER["REQUEST_URI"]; ?>" method="post" onSubmit="return validate_stick_preps();" enctype="multipart/form-data"> <!-- Formulář, který je výše popsaný(Předpoklady) -->
      <table class="bold">
        <tr>
          <td align="right">Cesta k&nbsp;souboru: </td>
          <td> <input type="file" name="format_filelocation"></td>
        </tr>
        <tr>
          <td align="right">Znak za předložkou: </td>
          <td> <input type="text" size="25" name="glue" value="<?php if ($_POST["glue"]) echo str_replace("&", "&amp;", $_POST["glue"]); else echo "&amp;nbsp;"; ?>"></td>
        </tr>
        <tr>
          <td align="right">Znaková sada: </td>
          <td>
            <select name="charset" size="1">
              <option value="iso-8859-2">iso-8859-2</option>
              <option value="windows-1250" <?php if ($_POST["charset"] == "windows-1250") echo "selected"; ?>>windows-1250</option>
              <option value="utf-8" <?php if ($_POST["charset"] == "utf-8") echo "selected"; ?>>utf-8</option>
            </select>
          </td>
        </tr>
        <tr>
          <td align="right">Alternativní soubor s předložkami: </td>
          <td style="white-space: nowrap"> <input type="file" name="altpreps_filelocation"> (1 řádka = 1 předložka)</td>
        </tr>
        <tr>
          <td align="right">Zahrnout přidané předložky: </td>
          <td> <input type="checkbox" name="added_preps" value="add" <?php if ($_POST["added_preps"]) echo "checked"; ?>></td>
        </tr>
        <tr>
          <td align="right">Ignorovat HTML tagy: </td>
          <td> <input type="checkbox" name="ignore_html" value="ignore" <?php if ($_POST["ignore_html"]) echo "checked"; ?>> (Tagy se nesmí zalamovat)</td>
        </tr>
        <tr>
          <td align="right">Výstup: </td>
          <td><input type="radio" name="output" value="formated_text" <?php if (!($_POST["output"] == "textarea") ) echo "checked"; ?>>Zvýrazněný text &nbsp;<input type="radio" name="output" value="textarea" <?php if ($_POST["output"] == "textarea") echo "checked"; ?>>Textové pole</td>
        </tr>
        <tr>
          <td></td>
          <td> <input type="submit" name="format" value="Formatuj"> Zformátovámy text se zobrazí pod formulářem</td>
        </tr>
      </table>
    </form>
<?php /*Konečné formátování výstupu, rodělené na výstup do textového pole nebo jako text se zvýrazněnými změnami.*/
function html_ent($string) {
return
str_replace("<", "&lt;", str_replace(">", "&gt;", str_replace("&", "&amp;", $string)));
}

if (
$formated_file) {
if (
$_POST["output"] == "formated_text") {
  
$search[] = "&amp;#269;";
  
$search[] = "&amp;eacute;";
  
$search[] = " ";
  
$search[] = "t";
  
$search[] = "rn";
  
$search[] = "n";
  
$search[] = "r";
  
$search[] = "<br>";
  
$search[] = str_replace(" ", "&nbsp;", html_ent($highlight_1.decode_misc($_POST["glue"]).$highlight_2));
  
$replace[] = "&#269;";
  
$replace[] = "&eacute;";
  
$replace[] = "&nbsp;";
  
$replace[] = "&nbsp;&nbsp;&nbsp;&nbsp;";
  
$replace[] = "<br>";;
  
$replace[] = "<br>";
  
$replace[] = "<br>";
  
$replace[] = "<br>n";
  
$replace[] = $highlight_1.html_ent(decode_misc($_POST["glue"])).$highlight_2;
  
$formated_file = str_replace($search, $replace, html_ent($formated_file));
  echo
"<p class="maintext">n".$formated_file."n</p>";
}
else {
  echo
"<textarea style="width: 99.5%; height: 200px; font-size: 90%; font-weight: bold;">n".html_ent($formated_file)."n</textarea>n";
}
}
?>

Download

Poslední úprava:
28.6.2006

Jakékoliv přípomínky, dotazy nebo chyby související s webem Nezznest pište do Questbooku nebo mě můžete kontaktovat e-mailem

Aktualizace: 29.6.2006