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("ě", "š", "č", "ř", "ť", "ž", "ň", "ď", "ý", "á", "í", "é", "ú", "ů", "ó", "Ě", "Š", "Č", "Ř", "Ž", "Ť", "Ň", "Ď", "Ý", "Á", "Í", "É", "Ú", "Ó");
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] = "é";
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í ( )nedělitelné mezery*/
if ($misc == "&nbsp;") return " ";
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 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("&", "&", $_POST["glue"]); else echo "&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 <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("<", "<", str_replace(">", ">", str_replace("&", "&", $string)));
}
if ($formated_file) {
if ($_POST["output"] == "formated_text") {
$search[] = "&#269;";
$search[] = "&eacute;";
$search[] = " ";
$search[] = "t";
$search[] = "rn";
$search[] = "n";
$search[] = "r";
$search[] = "<br>";
$search[] = str_replace(" ", " ", html_ent($highlight_1.decode_misc($_POST["glue"]).$highlight_2));
$replace[] = "č";
$replace[] = "é";
$replace[] = " ";
$replace[] = " ";
$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
- Formátovací skript
- Základní předložky a 3 soubory, které zajišťují konvertování na správnou znakovou sadu.
28.6.2006