4 * Creates a TOC (table of contents) from a given HTML file.
\r
5 * <h1> is ignored; all other headings are used.
\r
7 * @author Christian Weiske <cweiske@cweiske.de>
\r
9 * Alternative if you have an XSLT 2 processor: http://xmlplease.com/tocxhtml
\r
12 echo "Please pass a file\n";
\r
16 if (!file_exists($file)) {
\r
17 echo "File does not exist: $file\n";
\r
20 if (substr($file, -4) != '.htm') {
\r
21 echo "build-toc.php works only on htm files\n";
\r
25 $sx = simplexml_load_file($file);
\r
26 if ($sx === false) {
\r
27 echo "Failed to load XML\n";
\r
32 $body->registerXPathNamespace('h', 'http://www.w3.org/1999/xhtml');
\r
33 $elems = $body->xpath(
\r
36 . 'self::h:h2 or self::h:h3 or self::h:h4 or self::h:h5 or self::h:h6'
\r
38 . ' or self::h2 or self::h3 or self::h4 or self::h5 or self::h6'
\r
44 foreach ($elems as $elem) {
\r
45 $name = $elem->getName();
\r
46 $level = (int) $name{1};
\r
47 $data[] = (object) array(
\r
48 'title' => (string) $elem,
\r
49 'id' => (string) $elem['id'],
\r
54 $data[$n - 1]->nextLevel = $level;
\r
58 $html = "<ul class=\"toc\">\n";
\r
59 foreach ($data as $h) {
\r
60 $i = str_repeat(' ', ($h->level -1) * 2 - 1);
\r
62 . '<li><a href="#' . $h->id . '">'
\r
63 . htmlspecialchars($h->title)
\r
65 if ($h->nextLevel > $h->level) {
\r
67 . $i . ' <ul>' . "\n";
\r
69 $html .= '</li>' . "\n";
\r
71 if ($h->nextLevel < $h->level) {
\r
72 $html .= substr($i, 0, -1) . "</ul>\n"
\r
73 . substr($i, 0, -2) . "</li>\n";
\r