bjori           Thu Aug 16 18:36:28 2007 UTC

  Modified files:              
    /phd/themes/php     phpweb.php 
  Log:
   - Generate the TOC only ones for each chapter
   - Add next/previous links
  
  
http://cvs.php.net/viewvc.cgi/phd/themes/php/phpweb.php?r1=1.5&r2=1.6&diff_format=u
Index: phd/themes/php/phpweb.php
diff -u phd/themes/php/phpweb.php:1.5 phd/themes/php/phpweb.php:1.6
--- phd/themes/php/phpweb.php:1.5       Tue Aug 14 12:04:12 2007
+++ phd/themes/php/phpweb.php   Thu Aug 16 18:36:28 2007
@@ -1,5 +1,5 @@
 <?php
-/*  $Id: phpweb.php,v 1.5 2007/08/14 12:04:12 bjori Exp $ */
+/*  $Id: phpweb.php,v 1.6 2007/08/16 18:36:28 bjori Exp $ */
 
 class phpweb extends phpdotnet implements PhDTheme {
     protected $streams = array();
@@ -8,7 +8,8 @@
 
     public function __construct($IDs, $filename, $ext = "php", $chunked = 
true) {
         parent::__construct($IDs, $filename, $ext, $chunked);
-        if(!file_exists("php") || is_file("php")) mkdir("php") or die("Can't 
create the cache directory");
+        if (!file_exists("php") || is_file("php")) mkdir("php") or die("Can't 
create the cache directory");
+        if (!file_exists("php/toc") || is_file("php/toc")) mkdir("php/toc") or 
die("Can't create the toc directory");
     }
     public function writeChunk($id, $stream) {
         rewind($stream);
@@ -37,26 +38,118 @@
         }
     }
     public function header($id) {
-        $toc = "";
+        $ext = '.' .$this->ext;
         $parent = PhDHelper::getParent($id);
-        foreach(PhDHelper::getChildren($parent) as $k => $v) {
-            $toc .= sprintf("array('%s.php', '%s'),\n", $k, 
addslashes(PhDHelper::getDescription($k, false)));
+        $filename = $this->ext . DIRECTORY_SEPARATOR . "toc" . 
DIRECTORY_SEPARATOR . $parent . ".inc";
+        $up = array();
+        $incl = '';
+
+        $next = $prev = array(null, null);
+        if ($parent && $parent != "ROOT") {
+            $siblings = PhDHelper::getChildren($parent);
+            /* TODO:
+             *   Maybe this isn't worth it.. but this, in theory, allows you 
+             * to easily add new pages without needing to rebuild the entire 
+             * section.
+             */
+            if (!file_exists($filename)) {
+                echo "Creating $filename...\n";
+
+                foreach($siblings as $sid => $array) {
+                    $toc[] = array($sid.$ext, empty($array["sdesc"]) ? 
$array["ldesc"] : $array["sdesc"]);
+                }
+
+                $parents = array();
+                $p = $parent;
+                while (($p = PhDHelper::getParent($p)) && $p != "ROOT") {
+                    $parents[] = array($p, PhDHelper::getDescription($p, 
true));
+                }
+
+                $content = '<?php
+$TOC = ' . var_export($toc, true) . ';
+$PARENTS = ' . var_export($parents, true) . ';';
+
+                file_put_contents($filename, $content);
+            }
+
+            $incl = 'include_once "./toc/' .$parent. '.inc";';
+            $up = array($this->getFilename($parent).$ext, 
PhDHelper::getDescription($parent, true));
+
+            // {{{ Create the "next" link
+            if (!empty($siblings[$id]["children"])) {
+                $tmp = reset($siblings[$id]["children"]);
+                $next = array($tmp["filename"].$ext, (empty($tmp["ldesc"]) ? 
$tmp["sdesc"] : $tmp["ldesc"]));
+            } else {
+                // don't overwrite these variables
+                $tid = $id;
+                $tsiblings = $siblings;
+                $tparent = $parent;
+                do {
+                    if (!isset($tsiblings[$tid])) {
+                        break;
+                    }
+
+                    // Seek to $tid
+                    in_array($tsiblings[$tid], $tsiblings, false, true) or 
die(var_export(debug_backtrace(), true) ."\n$tid\n$tparent"); // This should 
*never* happen
+                    $tmp = next($tsiblings);
+                    prev($tsiblings); // Reset the internal pointer to 
previous pos
+                    if ($tmp) {
+                        $next = array($tmp["filename"].$ext, 
(empty($tmp["sdesc"]) ? $tmp["ldesc"] : $tmp["sdesc"]));
+                        break;
+                    }
+
+                    // We are the end element in this chapter
+                    $tgrandpa = PhDHelper::getParent($tparent);
+                    if (!$tgrandpa || $tgrandpa == "ROOT") {
+                        // There is no next relative
+                        break;
+                    }
+
+                    $tsiblings  = PhDHelper::getChildren($tgrandpa);
+                    $tid = $tparent;
+                    $tparent = $tgrandpa;
+                } while(true);
+            } // }}}
+
+            // {{{ Create the "previous" link
+            do {
+                if (!isset($siblings[$id])) {
+                    break;
+                }
+
+                // Seek to $id
+                in_array($siblings[$id], $siblings, false, true);
+                $tmp = prev($siblings);
+                if ($tmp) {
+                    while (!empty($tmp["children"])) {
+                        $tmp = end($tmp["children"]);
+                    }
+                    $prev = array($tmp["filename"].$ext, (empty($tmp["sdesc"]) 
? $tmp["ldesc"] : $tmp["sdesc"]));
+                    break;
+                }
+
+                $prev = array(PhDHelper::getFilename($parent).$ext, 
PhDHelper::getDescription($parent, false));
+            } while(false); // }}}
         }
 
+        $setup = array(
+            "home" => array('index'.$ext, "PHP Manual"),
+            "head" => array("UTF-8", "en"), // FIXME: We should probably check 
the xml:lang on the current chunk and fallback on the roots element lang
+            "this" => array($id.$ext, PhDHelper::getDescription($id)),
+            "up"   => $up,
+            "prev" => $prev,
+            "next" => $next,
+        );
+        $var = var_export($setup, true);
+
         /* Yes. This is scary. I know. */
         return '<?php
 include_once $_SERVER[\'DOCUMENT_ROOT\'] . \'/include/shared-manual.inc\';
-manual_setup(
-    array(
-        "home" => array("index.php", "PHP Manual"),
-        "head" => array("UTF-8", "en"),
-        "this" => array("'.$id.'.php", 
"'.addslashes(PhDHelper::getDescription($id)).'"),
-        "prev" => array("function.previous.php", "prevous"),
-        "next" => array("function.next.php", "next"),
-        "up"   => array("'.$this->getFilename($parent).'.'.$this->ext.'", 
"'.addslashes(PhDHelper::getDescription($parent, true)). '"),
-        "toc"  => array('.$toc.'),
-    )
-);
+$TOC = array();
+'.$incl.'
+$setup = '.$var.';
+$setup["toc"] = $TOC;
+manual_setup($setup);
 
 manual_header();
 ?>

Reply via email to