IndentHTML rückt beliebig formatierten (X)HTML-Quelltext „ordentlich“ ein. Es wird eine gut lesbare Ausgabe erzeugt, womit die Klasse das genaue Gegenteil von TrimHTML ist. Da der Klasse kein SGML-Parser unterliegt, sollte der Quelltext wohlgeformt nach den Regeln von XML sein, um einwandfrei eingerückt zu werden.
Dem Konstruktor kann ein String übergeben werden, mit dem eingerückt wird. Sinnvolle Werte dafür sind Leerzeichen und "\t" (Tabulator), der Standardwert sind zwei Leerzeichen.
Benötigt: Preprocess
<?php
/**
* class IndentHTML
* Copyright (C) 2006 Dao Gottwald <dao at design-noir.de>
*
* Licensed under the terms of the GNU Lesser General Public License:
* http://www.opensource.org/licenses/lgpl-license.php
*
* @version 0.3.4
* @url http://design-noir.de/webdev/PHP/IndentHTML/
*/
require_once 'Preprocess.php';
class IndentHTML extends Preprocess {
private
$char;
public function __construct ($char = ' ') {
$this->char = $char;
}
public function run ($text) {
$this->text =& $text;
$t1 = $this->_escape_init_plain();
$this->_escape_comments_cdata();
$t2 = $this->_escape_init();
$this->_escape_content ('pre');
$t3 = $this->_escape_init_plain();
$this->_escape_content ('textarea');
$this->_escape_inline_tags();
$text = preg_replace ('~\s+~', ' ', $text);
$text = str_replace (' <', '<', $text);
$text = str_replace ('> ', '>', $text);
$this->_escape_init();
$this->_escape_content ('option','td','th');
$text2 = '';
$lvl = 0;
$len = strlen ($text);
$closing_tag = $is_tag = false;
$has_content = true;
for ($i = 0; $i < $len; $i++) {
if ($text[$i] == '<') {
$was_closing_tag = $closing_tag;
$closing_tag = $i+1 < $len && ($text[$i+1] == '/' || $text[$i+1] == '!');
if ($closing_tag) {
$lvl -= $lvl>0;
}
if (($has_content || !$closing_tag || $was_closing_tag) && $i) {
$text2 .= "\n" . str_repeat ($this->char, $lvl);
}
$is_tag = true;
} elseif ($text[$i] == '>') {
if (!$closing_tag) {
$closing_tag = $i && $text[$i-1] == '/';
}
if (!$closing_tag) {
$lvl++;
}
$has_content = $is_tag = false;
} elseif (!$has_content && !$is_tag) {
$has_content = true;
$text2 .= "\n" . str_repeat ($this->char, $lvl);
}
$text2 .= $text[$i];
}
$text = $text2;
$this->_escape_fin();
$this->_escape_init($t3);
$this->_escape_fin();
$this->_escape_init($t2);
$this->_escape_fin();
$this->_escape_init($t1);
$this->_escape_fin();
return $text;
}
}
?>
Ausführen und Quelltext öffnen.
<?php
ob_start (array (new IndentHTML(' '), 'run'));
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head><title>Lorem Ipsum</title>
</head><body>
<h1>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit
</h1>
<p>
Etiam faucibus ligula ut arcu. Maecenas sed ipsum. Fusce sit amet leo at felis placerat convallis. <br/>
Aenean vulputate nibh ut justo. <a href="#">Pellentesque</a>.
</p><p>
Quisque viverra dui a enim molestie blandit.
<strong>Suspendisse</strong> orci metus, volutpat sit amet, lobortis id, cursus in, mi.
Cras faucibus nisl sit amet diam. Maecenas imperdiet aliquet lacus. Suspendisse neque.
</p> <pre>
. . .
. . -)------+====+ .
-)----==== ,' ,' . .
. `. `.,;___,' .
`, |____l_\
_,....------c==]""______ |,,,,,,.....____ _
. . "-:_____________ |____l_|]''''''''''' . .
,'"",'. `.
. -)-----==== `. `. LS
. -)-------+====+ . .
. .
Incom's T-65B X-wing Space
Superiority Starfighter (1)</pre>
<table><caption>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit
</caption>
<thead>
<tr>
<th>
foo
</th><th>
bar
</th>
</tr>
</thead>
<tbody>
<tr><td>
Cras posuere aliquam diam.
Donec venenatis, diam ac vestibulum gravida.
</td>
<td>
Vivamus aliquet.
Pellentesque habitant morbi tristique senectus et netus et.
</td>
</tr> </tbody>
</table>Ipsum.</body></html>