Autor Zpráva
Charlie
Profil
Včera jsem hledal nějaký jednoduchý WYSIWYG v Javascriptu, ale jednoduchého jsem nanašel. Udělal jsem si proto svojí PHP třídu, která vezme nějaký text a pěkně ho naformátuje. Nedělal jsem to moc složité, v podstatě to umí jen tvořit odstavce, odřádkování, a nahrazuje některé složité znaky.

PHP kód:
<?php


class Textization {

protected $text;
protected $output;
protected $schars;
protected $paragraphs;

function __construct() {
$this->schars = array(
"&" => "&amp;",
"->" => "&rarr;",
"<-" => "&larr;",
"<" => "&lt;",
">" => "&gt;",
"--" => "&ndash;",
"..." => "&hellip;",
"(c)" => "&copy;",
"(tm)" => "&trade;",
"(R)" => "&reg;"
);
}

function parse($text) { // Tato funkce se zavolá a vloží se do ní text, například $textization->parse("Bla Bla Bla");
$this->text = str_replace("\r","",trim($text)); // Odstranění \r, které odesílají formůláře, to se nám vůbec nehodí
$this->text = strtr($this->text,$this->schars); // Nahrazení speciálních znaků a zároveň odstranění html značek
$this->text = eregi_replace("( [skvzuoai]) ", "\\1&nbsp;", $this->text); // česká typografie, hodí pevnou mezeru za předložku
$this->text = eregi_replace("&amp;([a-z]{2,6};)","&\\1",$this->text); // nahradí zmařené entity původními entitami
$this->paragraphs = split("(\n){2,}",$this->text); // Rozdělí text na odstavce
foreach ($this->paragraphs as $paragraph) {
$this->output[] = $this->parse_paragraph($paragraph); //Parsuje každý odstavec zvlášť
}
return join("\n",$this->output); // Vrací zformátovaný výstup
}

function parse_paragraph($text) {
return "<p>".str_replace("\n","<br />",$text)."</p>"; // nahradí \n za <br /> a odstavec dá do tagů <p> a </p>
// Tato část by se dala bohatě zozšířit, ale to v plánu nemám
}

}
?>

Jak jsem říkal, je to primitivní. Nejdříve si inicalizujete proměnnou s třídou, třeba

$textization = new Textization

a pak jednoduše:

$html = $textization->parse($nejaky_text)

Když na to tak koukám, tak by to mohlo vracet XHTML 1.1 validní řetězec. Myslíte si to také? Podle všech mých testů tomu tak doposud bylo, ale člověk nikdy neví.
arcadosi
Profil
Velmi pekne sa mi to zda, ale ja sa PHP este len ucim a tak ti nemozem najst chybu 'tym som nechcel povedat, ze ju tam mas, ale taky velky text by mal mat chybicku aspon 1 :)' kde si sa naucil PHPcko ???
Charlie
Profil
Ne, chyba tam není :-)

PHPko jsem se naučil podle několika knížek v tomto pořadí:

PHP 4 - učebnice základů jazyka
PHP a MySQL - vytváříme webové databázové aplikace
Pokročilé programování v PHP 5

Poslední kniha se mi líbila nejvíc a taky jsem se zde naučil základy OOP.

Jinak mě toho dost naučil můj kamarád halogan, neučil mě jen PHP, ale i HTML a CSS.
Fred
Profil
Díky, už si s tím hraju ;-)
Charlie
Profil
Fred, nehodláš do toho náhodou implementovat seznamy? Teď mi došlo, že by se mi tam hodily :D
Charlie
Profil
Kdybyste chtěli něco složitějšího, tak halogan udělal třídu Monami2, ano je to už druhá verze :-) Ale oproti mé jednoduché má základní nevýhodu - neparsuje odstavce, ale jednotlivé řádky.
Fred
Profil
Charlie bohužel sice chápu o co tam běží, ale neumím php :-( Budu s tím asi muset něco udělat
Charlie
Profil
Fred, PHP rulezzz! :-) Je to jednoduchý...
Charlie
Profil
Abych nezapomněl, běží to pouze na PHP 5 a více. Aby to běželo i na PHP 4, stačí metodu __construct přejmenovat na Textization a proměnné protected na var.
Charlie
Profil
Taaaak, nemě jsem na to moc času, ale mám hotovo. Přidal jsem seznamy <ul>, teď je to 100% validní!
<?php


class Textization {

protected $text;
protected $output;
protected $schars;
protected $opened;
protected $paragraphs;
protected $paragraph;
protected $big_tags;

function __construct() {
$this->big_tags = array("p","ul");
foreach ($this->big_tags as $bt) {
$this->opened[$bt] = false;
}
$this->schars = array(
"&" => "&amp;",
"->" => "&rarr;",
"-&gt;" => "&rarr;",
"<-" => "&larr;",
"&lt;-" => "&larr;",
"<" => "&lt;",
">" => "&gt;",
//"--" => "&ndash;",
"..." => "&hellip;",
"(c)" => "&copy;",
"(tm)" => "&trade;",
"(R)" => "&reg;"
);
}

function parse($text) {
$this->text = str_replace("\r","",trim($text));
$this->text = strtr($this->text,$this->schars);
$this->text = eregi_replace("( [skvzuoai]) ", "\\1&nbsp;", $this->text); // czech typography
$this->text = eregi_replace("&amp;([a-z]{2,6};)","&\\1",$this->text);
$this->paragraphs = split("(\n){2,}",$this->text);
foreach ($this->paragraphs as $paragraph) {
$this->output[] = $this->parse_paragraph($paragraph);
}
return join("\n",$this->output);
}

function parse_paragraph($text) {


$rows = split("\n",$text);

$this->paragraph = "";

foreach ($rows as $row) {

$row = trim($row);

if (ereg("^#",$row)) {
if (ereg("<br />$",$this->paragraph)) {
$this->paragraph = substr($this->paragraph,0,-6);
}
if ($this->opened['p'] === true) {
$this->paragraph .= "</p>\n";
$this->opened['p'] = false;
}
if ($this->opened['ul'] === false) {
$this->paragraph .= "<ul>\n";
$this->opened['ul'] = true;
}
$this->paragraph .= " <li>".trim(substr($row,1))."</li>\n";
} else {
if ($this->opened['ul'] === true) {
$this->paragraph .= "</ul>\n";
$this->opened['ul'] = false;
}
if ($this->opened['p'] === false) {
$this->paragraph .= "<p>";
$this->opened['p'] = true;
}
$this->paragraph .= $row."<br />";
}
}

if (ereg("<br />$",$this->paragraph)) {
$this->paragraph = substr($this->paragraph,0,-6);
}

if ($this->opened['ul'] === true) {
$this->paragraph .= "</ul>\n";
$this->opened['ul'] = false;
} elseif ($this->opened['p'] === true) {
$this->paragraph .= "</p>\n";
$this->opened['p'] = false;
}
return $this->paragraph;
}

}

?>
Toto téma je uzamčeno. Odpověď nelze zaslat.

0