[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-doc-cvs
Subject:    [DOC-CVS] cvs: phd(PHD_ENTERPRISE) / README build.php render.php  /formats bigxhtml.php php.php xhtm
From:       "Hannes Magnusson" <bjori () php ! net>
Date:       2008-07-28 22:40:57
Message-ID: cvsbjori1217284857 () cvsserver
[Download RAW message or body]

bjori		Mon Jul 28 22:40:57 2008 UTC

  Added files:                 (Branch: PHD_ENTERPRISE)
    /phd/formats	bigxhtml.php 
    /phd/include	PhDConfig.class.php PhDIndex.class.php 
                	PhDObjectStorage.class.php PhDRender.class.php 

  Removed files:               
    /phd	build.php 

  Modified files:              
    /phd	render.php README 
    /phd/formats	php.php xhtml.php 
    /phd/include	PhDFormat.class.php PhDReader.class.php 
    /phd/themes/php	phpdotnet.php 
  Log:
  Initial commit of Enterprise PhD 2.0 XP, build#1337
  
  
["bjori-20080728224057.txt" (text/plain)]

http://cvs.php.net/viewvc.cgi/phd/render.php?r1=1.1&r2=1.2&diff_format=u
Index: phd/render.php
diff -u /dev/null phd/render.php:1.2
--- /dev/null	Mon Jul 28 22:40:57 2008
+++ phd/render.php	Mon Jul 28 22:40:56 2008
@@ -0,0 +1,73 @@
+<?php
+
+require "include/PhDObjectStorage.class.php";
+require "include/PhDConfig.class.php";
+
+require "include/PhDReader.class.php";
+require "include/PhDRender.class.php";
+require "include/PhDFormat.class.php";
+require "include/PhDIndex.class.php";
+
+require "formats/xhtml.php";
+require "formats/bigxhtml.php";
+require "formats/php.php";
+
+$INDEX    = "/home/bjori/php/doc/.manual.xml";
+$FILENAME = "/home/bjori/php/doc/.manual.xml";
+//$INDEX = $FILENAME = "/home/bjori/php/cleandocs/json.xml";
+define("NO_SQLITE", false);
+
+PhDConfig::init(array(
+	"verbose"                 => \
VERBOSE_ALL^(VERBOSE_PARTIAL_CHILD_READING|VERBOSE_CHUNK_WRITING), +	"lang_dir"       \
=> __DIR__ . DIRECTORY_SEPARATOR . "include" . DIRECTORY_SEPARATOR . "langs" . \
DIRECTORY_SEPARATOR, +	"output_dir"              => __DIR__ . DIRECTORY_SEPARATOR . \
"output" . DIRECTORY_SEPARATOR, +
+	"phpweb_version_filename" => dirname($FILENAME) . DIRECTORY_SEPARATOR . 'phpbook' . \
DIRECTORY_SEPARATOR . 'phpbook-xsl/' . 'version.xml', +	"phpweb_acronym_filename" => \
dirname($FILENAME) . DIRECTORY_SEPARATOR . 'entities' . DIRECTORY_SEPARATOR . \
'acronyms.xml', +));
+
+$render = new PhDRender();
+
+$reader = new PhDReader();
+
+foreach(range(0, 0) as $i) {
+	var_dump(date(DATE_RSS));
+
+	if (1) {
+	// Create indexer
+	$format = new PhDIndex();
+	$render->attach($format);
+
+	$reader->open($INDEX);
+	$render->render($reader);
+
+	$format->commit();
+	$render->detach($format);
+
+	var_dump(date(DATE_RSS));
+	}
+
+	// Standalone phpweb Format
+	$xhtml = new PhDPHPFormat();
+	$render->attach($xhtml);
+
+	/*
+	// Standalone Chunked xHTML Format
+	$xhtml = new PhDXHTMLFormat();
+	$render->attach($xhtml);
+
+	// Use the markup from the Chunked xHTML Format to produce Big xHTML
+	$bightml = new PhDBigXHTMLFormat();
+	$xhtml->attach($bightml);
+
+	// Standalone Big xHTML Format
+	$bightml = new PhDBigXHTMLFormat();
+	$render->attach($bightml);
+	*/
+}
+
+foreach(range(0, 0) as $i) {
+	$reader->open($FILENAME);
+	$render->render($reader);
+}
+
http://cvs.php.net/viewvc.cgi/phd/README?r1=1.9&r2=1.9.6.1&diff_format=u
Index: phd/README
diff -u phd/README:1.9 phd/README:1.9.6.1
--- phd/README:1.9	Sat May  3 15:14:21 2008
+++ phd/README	Mon Jul 28 22:40:56 2008
@@ -1,13 +1,13 @@
 PhD - PHP DocBook
 Copyright(c) 2007-2008 The PHP Documentation Team
 All Rights Reserved.
-$Id: README,v 1.9 2008/05/03 15:14:21 bjori Exp $
+$Id: README,v 1.9.6.1 2008/07/28 22:40:56 bjori Exp $
 
 At the moment, the code depends upon the following:
     - PHP 5.2.3 or later. PHP 5.3 is recommended. PHP 6 is unsupported, but
        might work.
     - An available CLI binary.
-    - DOM, libXML2, and xmlreader.
+    - DOM, libXML2 (20620 or greater), and xmlreader.
 
 
 Installing the PhD renderer:
http://cvs.php.net/viewvc.cgi/phd/formats/php.php?r1=1.2&r2=1.3&diff_format=u
Index: phd/formats/php.php
diff -u /dev/null phd/formats/php.php:1.3
--- /dev/null	Mon Jul 28 22:40:57 2008
+++ phd/formats/php.php	Mon Jul 28 22:40:57 2008
@@ -0,0 +1,356 @@
+<?php
+class PhDPHPFormat extends PhDXHTMLFormat {
+    private $myelementmap = array(
+        'acronym'               => 'format_suppressed_tags',
+        'function'              => 'format_suppressed_tags',
+        'link'                  => 'format_link',
+        'refpurpose'            => 'format_refpurpose',
+        'varname'               => array(
+            /* DEFAULT */          'var',
+            'fieldsynopsis'     => 'format_fieldsynopsis_varname',
+        ),
+        'xref'                  => 'format_xref',
+
+
+        '.title'                 => array(
+            /* DEFAULT */          false,
+            'info'              => array(
+                /* DEFAULT */      false,
+                'article'       => 'format_container_chunk_top_title',
+                'appendix'      => 'format_container_chunk_top_title',
+                'book'          => 'format_container_chunk_top_title',
+                'chapter'       => 'format_container_chunk_top_title',
+                'part'          => 'format_container_chunk_top_title',
+                'set'           => 'format_container_chunk_top_title',
+            ),
+            'article'           => 'format_container_chunk_top_title',
+            'appendix'          => 'format_container_chunk_top_title',
+            'book'              => 'format_container_chunk_top_title',
+            'chapter'           => 'format_container_chunk_top_title',
+            'part'              => 'format_container_chunk_top_title',
+            'set'               => 'format_container_chunk_top_title',
+        ),
+        '.reference'             => 'format_container_chunk_below',
+        '.question'              => array(
+            /* DEFAULT */          false,
+            'questions'         => 'format_phd_question', // From the PhD namespace
+        ),
+    );
+    private $mytextmap = array(
+        'acronym'               => 'format_acronym_text',
+        'function'              => 'format_function_text',
+        'methodname'            => array(
+            /* DEFAULT */         'format_function_text',
+            'constructorsynopsis' => array(
+                /* DEFAULT */     'format_function_text',
+                'classsynopsis' => \
'format_classsynopsis_methodsynopsis_methodname_text', +            ),
+            'methodsynopsis'    => array(
+                /* DEFAULT */     'format_function_text',
+                'classsynopsis' => \
'format_classsynopsis_methodsynopsis_methodname_text', +            ),
+            'destructorsynopsis' => array(
+                /* DEFAULT */     'format_function_text',
+                'classsynopsis' => \
'format_classsynopsis_methodsynopsis_methodname_text', +            ),
+        ),
+
+        'refname'               => 'format_refname_text',
+        'type'                  => array(
+            /* DEFAULT */          'format_type_text',
+            'classsynopsisinfo' => false,
+            'fieldsynopsis'     => 'format_type_if_object_or_pseudo_text',
+            'methodparam'       => 'format_type_if_object_or_pseudo_text',
+            'methodsynopsis'    => array(
+                /* DEFAULT */      'format_type_if_object_or_pseudo_text',
+                'classsynopsis' => false,
+            ),
+        ),
+
+    );
+    protected $flags;
+    protected $ext = "php";
+    private   $acronyms = array();
+    private   $versions = array();
+    private   $refname  = "";
+
+    public function __construct() {
+        parent::__construct();
+        $this->versions = \
self::generateVersionInfo(PhDConfig::get("phpweb_version_filename")); +        \
$this->acronyms = self::generateAcronymInfo(PhDConfig::get("phpweb_acronym_filename"));
 +
+    }
+
+    public function header($id) {
+        /* Yes. This is scary. I know. */
+        return '<?php
+include_once $_SERVER[\'DOCUMENT_ROOT\'] . \'/include/shared-manual.inc\';
+$setup = array(
+    "home"    => array("index.php", "PHP Manual"),
+    "head"    => array("UTF-8", "en"),
+    "this"    => array(null, null),
+    "up"      => array(null, null),
+    "prev"    => array(null, null),
+    "next"    => array(null, null),
+    "toc"     => array(),
+    "parents" => array(),
+);
+manual_setup($setup);
+
+manual_header();
+?>
+';
+    }
+    public function footer($id) {
+        return "<?php manual_footer(); ?>";
+    }
+
+
+    public function getDefaultElementMap() {
+        return $this->myelementmap;
+    }
+    public function getDefaultTextMap() {
+        return $this->mytextmap;
+    }
+
+
+    public function format_suppressed_tags($open, $name, $attrs, $props) {
+        return "";
+    }
+    public function update($event, $val = null) {
+        switch($event) {
+        case PhDRender::CHUNK:
+            $this->flags = $val;
+            break;
+
+        case PhDRender::STANDALONE:
+            if ($val) {
+                $this->registerElementMap(array_merge(parent::getDefaultElementMap(), \
static::getDefaultElementMap())); +                \
$this->registerTextMap(array_merge(parent::getDefaultTextMap(), \
static::getDefaultTextMap())); +            } else {
+                $this->registerElementMap(static::getDefaultElementMap());
+                $this->registerTextMap(static::getDefaultTextMap());
+            }
+            break;
+        }
+    }
+    public function format_suppressed_text($value, $tag) {
+        return "";
+    }
+
+    protected function lookupRefname($for) {
+        return $this->refs[$for];
+        return NO_SQLITE;
+        $rsl = sqlite_array_query($this->sqlite, "SELECT filename, ldesc, sdesc FROM \
ids WHERE sdesc='$for' AND element='refentry'", SQLITE_ASSOC); +        if \
(isset($rsl[0])) { +            return $rsl[0]["filename"];
+        }
+        return false;
+    }
+    public static function generateVersionInfo($filename) {
+        static $info;
+        if ($info) {
+            return $info;
+        }
+        $r = new XMLReader;
+        if (!$r->open($filename)) {
+            throw new Exception;
+        }
+        $versions = array();
+        while($r->read()) {
+            if (
+                $r->moveToAttribute("name")
+                && ($funcname = str_replace(
+                    array("::", "->", "__", "_", '$'),
+                    array("-",  "-",  "-",  "-", ""),
+                    $r->value))
+                && $r->moveToAttribute("from")
+                && ($from = $r->value)
+            ) {
+                $versions[strtolower($funcname)] = $from;
+                $r->moveToElement();
+            }
+        }
+        $r->close();
+        $info = $versions;
+        return $versions;
+    }
+    public static function generateAcronymInfo($filename) {
+        static $info;
+        if ($info) {
+            return $info;
+        }
+        $r = new XMLReader;
+        if (!$r->open($filename)) {
+            throw new Exception("Could not open $filename");
+        }
+        $acronyms = array();
+        while ($r->read()) {
+            if ($r->nodeType != XMLReader::ELEMENT) {
+                continue;
+            }
+            if ($r->name == "term") {
+                $r->read();
+                $k = $r->value;
+                $acronyms[$k] = "";
+            } else if ($r->name == "simpara") {
+                $r->read();
+                $acronyms[$k] = $r->value;
+            }
+        }
+        $info = $acronyms;
+        return $acronyms;
+    }
+    public function versionInfo($funcname) {
+        $funcname = str_replace(
+                array("::", "->", "__", "_", '$', '()'),
+                array("-",  "-",  "-",  "-", "",  ''),
+                strtolower($funcname));
+        return isset($this->versions[$funcname]) ? $this->versions[$funcname] : "No \
version information available, might be only in CVS"; +    }
+    public function acronymInfo($acronym) {
+        return isset($this->acronyms[$acronym]) ? $this->acronyms[$acronym] : false;
+    }
+
+
+    public function format_acronym_text($value, $tag) {
+        $resolved = $this->acronymInfo($value);
+        if ($resolved) {
+            return '<acronym title="' .$resolved. '">' .$value. '</acronym>';
+        }
+        return '<acronym>'.$value.'</acronym>';
+    }
+    public function format_refpurpose($open, $tag, $attrs, $props) {
+        if ($open) {
+            return '<p class="verinfo">(' \
.(htmlspecialchars($this->versionInfo($this->refname), ENT_QUOTES, "UTF-8")). \
')</p><p class="refpurpose dc-title">'. $this->refname. ' — '; +        }
+        return "</p>\n";
+    }
+    public function format_fieldsynopsis_varname($open, $name, $attrs) {
+        if ($open) {
+            $href = "";
+            if (isset($attrs[PhDReader::XMLNS_DOCBOOK]["linkend"])) {
+                $href = \
$this->createLink($attrs[PhDReader::XMLNS_DOCBOOK]["linkend"]); +
+                $href = '<a href="' .$href. '">';
+            }
+            if ($this->cchunk["fieldsynopsis"]["modifier"] == "const") {
+                return '<var class="fieldsynopsis_varname">'.$href;
+            }
+            return '<var class="'.$name.'">'.$href.'$';
+        }
+        if (isset($attrs[PhDReader::XMLNS_DOCBOOK]["linkend"])) {
+            return '</a></var>';
+        }
+        return '</var>';
+    }
+
+
+    public function format_refname_text($value, $tag) {
+        $this->refname = $value;
+        return false;
+    }
+    public function format_function_text($value, $tag, $display_value = null) {
+        if ($display_value === null) {
+            $display_value = $value;
+        }
+
+        $ref = strtolower(str_replace(array("_", "::", "->"), array("-", "-", "-"), \
$value)); +
+        $filename = $this->lookupRefname($ref);
+
+        if (($filename !== false) && $this->CURRENT_CHUNK !== $filename) {
+            $desc = "";
+            $href = $this->createLink($filename, $desc);
+            return '<a href="' . $href . '" class="function" title="' . $desc . '">' \
. $display_value . ($tag == "function" ? "()" : ""). '</a>'; +        }
+        return '<strong>' . $display_value . ($tag === "function" ? "()" : ""). \
'</strong>'; +    }
+    public function format_classsynopsis_methodsynopsis_methodname_text($value, \
$tag) { +        $value = $this->TEXT($value);
+        if ($this->cchunk["classsynopsis"]["classname"] === false) {
+            return $this->format_function_text($value, $tag);
+        }
+        if (strpos($value, '::')) {
+            $explode = '::';
+        } elseif (strpos($value, '->')) {
+            $explode = '->';
+        } else {
+            return $this->format_function_text($value, $tag);
+        }
+
+        list($class, $method) = explode($explode, $value);
+        if ($class !== $this->cchunk["classsynopsis"]["classname"]) {
+            return $this->format_function_text($value, $tag);
+        }
+        return $this->format_function_text($value, $tag, $method);
+    }
+    public function format_type_if_object_or_pseudo_text($value, $tag) {
+        if (in_array(strtolower($value), array("bool", "int", "double", "boolean", \
"integer", "float", "string", "array", "object", "resource", "null"))) { +            \
return false; +        }
+        return self::format_type_text($value, $tag);
+    }
+    public function format_type_text($value, $tag) {
+        $t = strtolower($value);
+
+        switch($t) {
+        case "bool":
+            $id = "language.types.boolean";
+            break;
+
+        case "int":
+        case "long":
+            $id = "language.types.integer";
+            break;
+
+        case "double":
+            $id = "language.types.float";
+            break;
+
+        /* FIXME: These aren't documented yet */
+        case "binary":
+        case "unicode":
+            $id = "language.types.string";
+            break;
+
+        case "void":
+        case "boolean":
+        case "integer":
+        case "float":
+        case "string":
+        case "array":
+        case "object":
+        case "resource":
+        case "null":
+            $id = "language.types.$t";
+            break;
+
+        case "mixed":
+        case "number":
+        case "callback":
+            $id = "language.types.$t";
+            break;
+
+        default:
+            /* Check if its a classname. */
+            $t = strtolower(str_replace(array("_", "::", "->"), array("-", "-", \
"-"), $t)); +            $id = "class.$t";
+        }
+
+        $desc = "";
+        $href = $this->createLink($id, $desc);
+
+        if ($href) {
+            return '<a href="' .$href. '" class="' .$tag. ' ' .$value. '" title="' . \
$desc . '">' .$value. '</a>'; +        }
+        return '<span class="' .$tag. ' ' .$value. '">' .$value. '</span>';
+    }
+
+}
+
+/*
+ * vim600: sw=4 ts=4 fdm=syntax syntax=php et
+ * vim<600: sw=4 ts=4
+ */
+
http://cvs.php.net/viewvc.cgi/phd/formats/xhtml.php?r1=1.68&r2=1.68.2.1&diff_format=u
Index: phd/formats/xhtml.php
diff -u phd/formats/xhtml.php:1.68 phd/formats/xhtml.php:1.68.2.1
--- phd/formats/xhtml.php:1.68	Wed Jul  9 22:57:06 2008
+++ phd/formats/xhtml.php	Mon Jul 28 22:40:57 2008
@@ -1,20 +1,19 @@
 <?php
-/*  $Id: xhtml.php,v 1.68 2008/07/09 22:57:06 loudi Exp $ */
-
-class XHTMLPhDFormat extends PhDFormat {
-    protected $elementmap = array( /* {{{ */
+/*  $Id: xhtml.php,v 1.68.2.1 2008/07/28 22:40:57 bjori Exp $ */
+class PhDXHTMLFormat extends PhDFormat {
+    private $myelementmap = array( /* {{{ */
         'abstract'              => 'div', /* Docbook-xsl prints "abstract"... */
         'abbrev'                => 'abbr',
         'acronym'               => 'acronym',
         'affiliation'           => 'format_suppressed_tags',
         'alt'                   => 'format_suppressed_tags',
-        'article'               => 'format_container_chunk',
+        'article'               => 'format_container_chunk_top',
         'author'                => array(
             /* DEFAULT */          'format_author',
             'authorgroup'       => 'format_authorgroup_author',
         ),
         'authorgroup'           => 'div',
-        'appendix'              => 'format_container_chunk',
+        'appendix'              => 'format_container_chunk_top',
         'application'           => 'span',
         'blockquote'            => 'blockquote',
         'bibliography'          => array(
@@ -23,14 +22,15 @@
             'book'              => 'format_chunk',
             'part'              => 'format_chunk',
         ),
-        'book'                  => 'format_container_chunk',
-        'chapter'               => 'format_container_chunk',
+        'book'                  => 'format_container_chunk_top',
+        'chapter'               => 'format_container_chunk_top',
         'citetitle'             => 'i',
         'co'                    => 'format_co',
         'colophon'              => 'format_chunk',
         'copyright'             => 'format_copyright',
         'date'                  => 'p',
         'editor'                => 'format_editor',
+        'function'              => 'b',
         'email'                 => 'format_suppressed_tags',
         'firstname'             => 'format_name',
         'footnote'              => 'format_footnote',
@@ -127,7 +127,7 @@
         'indexentry'            => 'dd',
         'initializer'           => 'format_initializer',
         'itemizedlist'          => 'ul',
-        'legalnotice'           => 'format_legalnotice_chunk',
+        'legalnotice'           => 'format_chunk',
         'listitem'              => array(
             /* DEFAULT */          'li',
             'varlistentry'      => 'format_varlistentry_listitem',
@@ -135,6 +135,8 @@
         'link'                  => 'a',
         'literal'               => 'format_literal',
         'literallayout'         => 'pre',
+        'link'                  => 'format_link',
+        'xref'                  => 'format_xref',
         'manvolnum'             => 'format_manvolnum',
         'mediaobject'           => 'format_mediaobject',
         'methodparam'           => 'format_methodparam',
@@ -162,13 +164,14 @@
             'note'              => 'format_note_content',
             'footnote'          => 'format_footnote_para',
             'refsect1'          => 'format_refsect1_para',
+            'question'          => 'format_suppressed_tags',
         ),
         'paramdef'              => 'format_suppressed_tags',
         'parameter'             => array(
             /* DEFAULT */          'format_parameter',
             'methodparam'       => 'format_methodparam_parameter',
         ),
-        'part'                  => 'format_container_chunk',
+        'part'                  => 'format_container_chunk_top',
         'partintro'             => 'div',
         'personname'            => 'format_personname',
         'personblurb'           => 'div',
@@ -188,7 +191,8 @@
         'pubdate'               => 'div', /* Docbook-XSL prints "published" */
         'refentry'              => 'format_chunk',
         'refentrytitle'         => 'span',
-        'reference'             => 'format_container_chunk',
+        'refpurpose'            => 'p',
+        'reference'             => 'format_container_chunk_below',
         'refsect1'              => 'format_refsect',
         'refsect2'              => 'format_refsect',
         'refsect3'              => 'format_refsect',
@@ -199,17 +203,35 @@
         'replaceable'           => 'span',
         'row'                   => 'format_row',
         'screen'                => 'format_screen',
-        'sect1'                 => 'format_chunk',
-        'sect2'                 => 'format_chunk',
-        'sect3'                 => 'format_chunk',
-        'sect4'                 => 'format_chunk',
-        'sect5'                 => 'format_chunk',
-        'section'               => 'format_chunk',
+        'sect1'                 => 'format_section_chunk',
+        'sect2'                 => 'div',
+        'sect3'                 => 'div',
+        'sect4'                 => 'div',
+        'sect5'                 => 'div',
+        'section'               => array(
+            /* DEFAULT */          'div',
+            'sect1'                => 'format_section_chunk',
+            'preface'              => 'format_section_chunk',
+            'chapter'              => 'format_section_chunk',
+            'appendix'             => 'format_section_chunk',
+            'article'              => 'format_section_chunk',
+            'part'                 => 'format_section_chunk',
+            'reference'            => 'format_section_chunk',
+            'refentry'             => 'format_section_chunk',
+            'index'                => 'format_section_chunk',
+            'bibliography'         => 'format_section_chunk',
+            'glossary'             => 'format_section_chunk',
+            'colopone'             => 'format_section_chunk',
+            'book'                 => 'format_section_chunk',
+            'set'                  => 'format_section_chunk',
+            'setindex'             => 'format_section_chunk',
+            'legalnotice'          => 'format_section_chunk',
+        ),
         'seg'                   => 'format_seg',
         'segmentedlist'         => 'format_segmentedlist',
         'seglistitem'           => 'format_seglistitem',
         'segtitle'              => 'format_suppressed_tags',
-        'set'                   => 'format_chunk',
+        'set'                   => 'format_container_chunk_top',
         'setindex'              => 'format_chunk',
         'shortaffil'            => 'format_suppressed_tags',
         'simplelist'            => 'ul', /* FIXME: simplelists has few attributes \
that need to be implemented */ @@ -237,14 +259,22 @@
         'tip'                   => 'format_admonition',
         'title'                 => array(
             /* DEFAULT */          'h1',
-            'example'           => 'format_bold_paragraph',
+            'example'           => 'format_example_title',
             'formalpara'        => 'h5',
             'info'              => array(
                 /* DEFAULT */      'h1',
-                'example'       => 'format_bold_paragraph',
+                'example'       => 'format_example_title',
                 'note'          => 'format_note_title',
                 'table'         => 'format_table_title',
                 'informaltable' => 'format_table_title',
+
+                'article'       => 'format_container_chunk_top_title',
+                'appendix'      => 'format_container_chunk_top_title',
+                'book'          => 'format_container_chunk_top_title',
+                'chapter'       => 'format_container_chunk_top_title',
+                'part'          => 'format_container_chunk_top_title',
+                'set'           => 'format_container_chunk_top_title',
+
             ),
             'indexdiv'          => 'dt',
             'legalnotice'       => 'h4',
@@ -261,7 +291,13 @@
             'segmentedlist'     => 'strong',
             'table'             => 'format_table_title',
             'variablelist'      => 'strong',
-        ), 
+            'article'           => 'format_container_chunk_top_title',
+            'appendix'          => 'format_container_chunk_top_title',
+            'book'              => 'format_container_chunk_top_title',
+            'chapter'           => 'format_container_chunk_top_title',
+            'part'              => 'format_container_chunk_top_title',
+            'set'               => 'format_container_chunk_top_title',
+        ),
         'titleabbrev'           => 'format_suppressed_tags',
         'type'                  => 'span',
         'userinput'             => 'format_userinput',
@@ -276,13 +312,16 @@
         'xref'                  => 'a',
         'year'                  => 'span',
         'quote'                 => 'format_quote',
-        'qandadiv'              => 'div',
-        'qandaset'              => 'div',
+        'qandaset'              => 'format_qandaset',
         'qandaentry'            => 'dl',
-        'question'              => 'dt',
+        'question'              => array(
+            /* DEFAULT */          'format_question',
+            'questions'         => 'format_phd_question', // From the PhD namespace
+        ),
+        'questions'             => 'ol', // From the PhD namespace
         'answer'                => 'dd',
     ); /* }}} */
-    protected $textmap = array(
+    private $mytextmap = array(
         'segtitle'             => 'format_segtitle_text',
         'affiliation'          => 'format_suppressed_text',
         'contrib'              => 'format_suppressed_text',
@@ -301,21 +340,6 @@
                 'classsynopsis' => 'format_classsynopsis_ooclass_classname_text',
             ),
         ),
-        'methodname'           => array(
-            /* DEFAULT */         false,
-            'constructorsynopsis' => array(
-                /* DEFAULT */     false,
-                'classsynopsis' => \
                'format_classsynopsis_methodsynopsis_methodname_text',
-            ),
-            'methodsynopsis'    => array(
-                /* DEFAULT */     false,
-                'classsynopsis' => \
                'format_classsynopsis_methodsynopsis_methodname_text',
-            ),
-            'destructorsynopsis' => array(
-                /* DEFAULT */     false,
-                'classsynopsis' => \
                'format_classsynopsis_methodsynopsis_methodname_text',
-            ),
-        ),
         'para'                  => array(
             /* DEFAULT */          false,
             'footnote'             => 'format_footnote_para_text',
@@ -347,6 +371,7 @@
             "implements"                    => false,
             "ooclass"                       => false,
         ),
+        "examples"                 => 0,
         "fieldsynopsis"            => array(
             "modifier"                      => "public",
         ),
@@ -367,16 +392,13 @@
         "tablefootnotes"           => array(
         ),
     );
-    
-    public function __construct(array $IDs) {
-        parent::__construct($IDs);
-    }
-    public function __call($func, $args) {
-        if ($args[0]) {
-            trigger_error("No mapper found for '{$func}'", E_USER_WARNING);
-            return "<font color='red' size='+3'>{$args[1]}</font>";
-        }
-        return "<font color='red' size='+3'>/{$args[1]}</font>";
+
+    protected $flags;
+    protected $ext = "html";
+    protected $fp = array();
+
+    public function __construct() {
+        parent::__construct();
     }
     public function transformFromMap($open, $tag, $name, $attrs, $props) {
         if ($open) {
@@ -389,6 +411,168 @@
         }
         return '</' .$tag. '>';
     }
+
+    public function appendData($data) {
+        if ($this->flags & PhDRender::CLOSE) {
+            $fp = array_pop($this->fp);
+            fwrite($fp, $data);
+            $this->writeChunk($this->CURRENT_CHUNK, $fp);
+            fclose($fp);
+
+            $this->flags ^= PhDRender::CLOSE;
+        } elseif ($this->flags & PhDRender::OPEN) {
+            $this->fp[] = $fp = fopen("php://temp/maxmemory", "r+");
+            fwrite($fp, $data);
+
+            $this->flags ^= PhDRender::OPEN;
+        } else {
+            $fp = end($this->fp);
+            fwrite($fp, $data);
+        }
+    }
+    public function header($id) {
+        $title = $this->getLongDescription($id);
+        $lang = $this->CURRENT_LANG;
+
+        $prev = $next = $parent = array("href" => null, "desc" => null);
+        /* {{{ FIXME: This is a complete fuckup */
+        $ok = false;
+        $count = count($this->CHILDRENS)-1;
+        foreach($this->CHILDRENS as $row => $data) {
+            if ($data["filename"] === $id) {
+                if ($row != 0) {
+                    $prev = array("href" => $this->CHILDRENS[$row-1]["filename"]. \
'.' .$this->ext, "desc" => $this->CHILDRENS[$row-1]["ldesc"] ?: \
$this->CHILDRENS[$row-1]["sdesc"]); +                }
+                if ($row != $count) {
+                    $next = array("href" => $this->CHILDRENS[$row+1]["filename"]. \
'.' .$this->ext, "desc" => $this->CHILDRENS[$row+1]["ldesc"] ?: \
$this->CHILDRENS[$row+1]["sdesc"]); +                }
+                $ok = true;
+                break;
+            }
+        }
+        if (!$ok) {
+            //var_dump($id, $this->CHILDRENS);
+            //echo "\n\n";
+        }
+        $row = $this->getParentInfo($id);
+        if (isset($row[0])) {
+            $parent = array("href" => $row[0]["filename"]. '.' .$this->ext, "desc" \
=> $row[0]["ldesc"] ?: $row[0]["sdesc"]); +        }
+        /* }}} */
+
+        return
+'<!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="' .$lang. '"" lang="' .$lang. \
'"> +<head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <title>PHP: '.$title.'</title>
+</head>
+<body>
+<div style="text-align: center;">
+    <div class="prev" style="float: left;"><a href="' .$prev["href"]. '">' \
.$prev["desc"]. '</a></div> +    <div class="next" style="float: right;"><a href="' \
.$next["href"]. '">' .$next["desc"] .'</a></div> +    <div class="up"><a href="' \
.$parent["href"]. '">' .$parent["desc"]. '</a></div> +    <div class="home"><a \
href="index.html">PHP Manual</a></div> +</div>
+';
+    }
+    public function footer($id) {
+        return "\n</body>\n</html>\n";
+    }
+    public function writeChunk($id, $fp) {
+        $filename = PhDConfig::get("output_dir") . $id . '.' .$this->ext;
+
+        rewind($fp);
+        file_put_contents($filename, $this->header($id));
+        file_put_contents($filename, $fp, FILE_APPEND);
+        file_put_contents($filename, $this->footer($id), FILE_APPEND);
+    }
+    public function close() {
+        foreach ($this->fp as $fp) {
+            fclose($fp);
+        }
+    }
+    public function createLink($for, &$desc = null, $type = PhDFormat::SDESC) {
+        $retval = null;
+        if (isset($this->idx[$for])) {
+            $rsl = $this->idx[$for];
+            $retval = $rsl["filename"] . '.' . $this->ext . '#' . \
$rsl["docbook_id"]; +            $desc = $rsl["sdesc"] ?: $rsl["ldesc"];
+        }
+        return $retval;
+
+        return NO_SQLITE;
+        if ($desc === null) {
+            $rsl = sqlite_array_query($this->sqlite, "SELECT docbook_id, filename \
FROM ids WHERE docbook_id='$for'", SQLITE_ASSOC); +
+            if (!isset($rsl[0])) {
+                return false;
+            }
+
+            $retval = $rsl[0]["filename"] . '.' . $this->ext . '#' . \
$rsl[0]["docbook_id"]; +        } else {
+            $rsl = sqlite_array_query($this->sqlite, $q = "SELECT docbook_id, \
filename, sdesc, ldesc FROM ids WHERE docbook_id='$for'", SQLITE_ASSOC); +
+            if (!isset($rsl[0])) {
+                var_dump($q);
+                return false;
+            }
+
+            $retval = $rsl[0]["filename"] . '.' . $this->ext . '#' . \
$rsl[0]["docbook_id"]; +
+            if ($type === self::SDESC) {
+                $desc = $rsl[0]["sdesc"] ?: $rsl[0]["ldesc"];
+            } else {
+                $desc = $rsl[0]["ldesc"] ?: $rsl[0]["sdesc"];
+            }
+        }
+
+        return $retval;
+    }
+    public function getLongDescription($for) {
+        return NO_SQLITE;
+        $rsl = sqlite_array_query($this->sqlite, $q = "SELECT sdesc, ldesc FROM ids \
WHERE docbook_id='$for'", SQLITE_ASSOC); +        if (!isset($rsl[0])) {
+            var_dump($q);
+            return false;
+        }
+        return $rsl[0]["ldesc"] ?: $rsl[0]["sdesc"];
+    }
+    public function getShortDescription($for) {
+        return NO_SQLITE;
+        $rsl = sqlite_array_query($this->sqlite, "SELECT sdesc, ldesc FROM ids WHERE \
docbook_id='$for'", SQLITE_ASSOC); +        return $rsl[0]["sdesc"] ?: \
$rsl[0]["ldesc"]; +    }
+    public function getParentInfo($for) {
+        return NO_SQLITE;
+        $rsl = sqlite_array_query($this->sqlite, "SELECT parent_id FROM ids WHERE \
docbook_id='$for'", SQLITE_ASSOC); +        return sqlite_array_query($this->sqlite, \
"SELECT filename, sdesc, ldesc FROM ids WHERE docbook_id='{$rsl[0]["parent_id"]}'", \
SQLITE_ASSOC); +    }
+    protected function createTOC($rsl) {
+        $toc = '<ol>';
+        $desc = $title = "";
+        foreach($rsl as $row) {
+            $link = $this->createLink($row["docbook_id"], $desc);
+            $list = "";
+            if ($this->cchunk["name"] === "book" || $this->cchunk["name"] === "set") \
{ +                $childrens = sqlite_array_query($this->sqlite, "SELECT docbook_id, \
filename, sdesc, ldesc FROM ids WHERE parent_id='{$row["docbook_id"]}' AND \
filename=docbook_id", SQLITE_ASSOC); +                if (NO_SQLITE && $childrens) {
+                    $list = "<ol>";
+                    foreach($childrens as $child) {
+                        $href = $this->createLink($child["docbook_id"], $title);
+                        $list .= '<li><a href="' .$href. '">' .$title. \
"</a></li>\n"; +                    }
+                    $list .="</ol>";
+                }
+            }
+            $toc .= '<li><a href="' .$link. '">' .$desc. '</a>' .$list. "</li>\n";
+        }
+        $toc .= "</ol>\n";
+
+        return $toc;
+    }
+
     public function CDATA($str) {
         switch($this->role) {
         case "php":
@@ -401,10 +585,41 @@
     public function TEXT($str) {
         return htmlspecialchars($str, ENT_QUOTES, "UTF-8");
     }
+    public function UNDEF($open, $name, $attrs, $props) {
+        if ($open) {
+            trigger_error("No mapper found for '{$name}'", E_USER_WARNING);
+        }
+    }
+
+    public function admonition_title($title, $lang) {
+        return '<b class="' .(strtolower($title)). '">' .($this->autogen($title, \
$lang)). '</b>'; +    }
+    public function getDefaultElementMap() {
+        return $this->myelementmap;
+    }
+    public function getDefaultTextMap() {
+        return $this->mytextmap;
+    }
+    public function update($event, $val = null) {
+        switch($event) {
+        case PhDRender::CHUNK:
+            $this->flags = $val;
+            break;
+
+        case PhDRender::STANDALONE:
+            if ($val) {
+                $this->registerElementMap(static::getDefaultElementMap());
+                $this->registerTextMap(static::getDefaultTextMap());
+            }
+            break;
+        }
+    }
+
     public function getChunkInfo() {
         return $this->cchunk;
     }
-    public function format_suppressed_tags($open, $name, $attrs) {
+
+    public function format_suppressed_tags($open, $name, $attrs, $props) {
         /* Ignore it */
         return "";
     }
@@ -412,7 +627,42 @@
         /* Suppress any content */
         return "";
     }
-    
+
+    public function format_link($open, $name, $attrs, $props) {
+        $link = null;
+        if ($open) {
+            $link = $class = $content = "";
+
+            if (isset($attrs[PhDReader::XMLNS_DOCBOOK]["linkend"])) {
+                $link = \
$this->createLink($attrs[PhDReader::XMLNS_DOCBOOK]["linkend"]); +            }
+            elseif (isset($attrs[PhDReader::XMLNS_XLINK]["href"])) {
+                $link = $attrs[PhDReader::XMLNS_XLINK]["href"];
+                $class = " external";
+                $content = "&raquo; ";
+            }
+            if ($props["empty"]) {
+                $content .= $link ."</a>\n";
+            }
+
+            return '<a href="' . $link . '" class="' . $name . $class . '">' . \
$content; +        }
+        return "</a>";
+    }
+    public function format_xref($open, $name, $attrs, $props) {
+        if ($open) {
+            $desc = "";
+            $link = $this->createLink($attrs[PhDReader::XMLNS_DOCBOOK]["linkend"], \
$desc); +
+            $ret = '<a href="' .$link. '" class="' .$name. '">' .$desc;
+
+            if ($props["empty"]) {
+                return $ret. "</a>";
+            }
+            return $ret;
+        }
+        return "</a>";
+    }
     public function format_literal($open, $name, $attrs) {
         if ($open) {
             if (isset($attrs[PhDReader::XMLNS_DOCBOOK]["role"])) {
@@ -439,7 +689,7 @@
                 return $this->TEXT($value);
         }
     }
-    
+
     public function format_copyright($open, $name, $attrs) {
         if ($open) {
             return '<div class="'.$name.'">&copy; ';
@@ -487,31 +737,118 @@
         return '</span> ';
     }
 
-    public function format_container_chunk($open, $name, $attrs) {
+    public function format_container_chunk_top($open, $name, $attrs, $props) {
+        $this->cchunk = $this->dchunk;
+        $this->cchunk["name"] = $name;
+        if(isset($attrs[PhDReader::XMLNS_XML]["id"])) {
+            $id = $attrs[PhDReader::XMLNS_XML]["id"];
+        } else {
+            $id = uniqid("phd");
+        }
+
+        if ($open) {
+            $this->CURRENT_CHUNK = $id;
+            $this->notify(PhDRender::CHUNK, PhDRender::OPEN);
+
+            return '<div id="' .$id. '" class="' .$name. '">';
+        }
+
+        $this->CURRENT_CHUNK = $id;
+        $this->notify(PhDRender::CHUNK, PhDRender::CLOSE);
+
+        $toc = "";
+        if (NO_SQLITE && !in_array($id, $this->TOC_WRITTEN)) {
+            $rsl = sqlite_array_query($this->sqlite, "SELECT docbook_id, filename, \
sdesc, ldesc FROM ids WHERE parent_id='$id' AND filename=docbook_id", SQLITE_ASSOC); \
+            $toc = $this->createTOC($rsl); +        }
+        return $toc."</div>";
+    }
+    public function format_container_chunk_top_title($open, $name, $attrs, $props) {
+        if ($open) {
+            return '<h1>';
+        }
+
+        $id = $this->CURRENT_CHUNK;
+        if (NO_SQLITE) {
+            $this->CHILDRENS = $rsl = sqlite_array_query($this->sqlite, "SELECT \
docbook_id, filename, sdesc, ldesc FROM ids WHERE parent_id='$id' AND \
filename=docbook_id", SQLITE_ASSOC); +            $toc = $this->createToc($rsl);
+        } else {
+            $this->CHILDRENS = array();
+            $toc = "";
+        }
+        $this->TOC_WRITTEN[] = $id;
+
+        return '</h1>'.$toc;
+    }
+    public function format_container_chunk_below($open, $name, $attrs, $props) {
         $this->cchunk = $this->dchunk;
+        if(isset($attrs[PhDReader::XMLNS_XML]["id"])) {
+            $id = $attrs[PhDReader::XMLNS_XML]["id"];
+        } else {
+            $id = uniqid("phd");
+        }
+
         if ($open) {
+            if (NO_SQLITE) {
+                $this->CHILDRENS = sqlite_array_query($this->sqlite, "SELECT \
docbook_id, filename, sdesc, ldesc FROM ids WHERE parent_id='$id' AND \
filename=docbook_id", SQLITE_ASSOC); +            }
+            $this->CURRENT_CHUNK = $id;
+            $this->notify(PhDRender::CHUNK, PhDRender::OPEN);
+
             return '<div id="' .$attrs[PhDReader::XMLNS_XML]["id"]. '" class="' \
.$name. '">';  }
-        return "</div>";
+
+        $toc = '<ol>';
+        $desc = "";
+        $rsl = $this->CHILDRENS;
+        foreach($rsl as $row) {
+            $link = $this->createLink($row["docbook_id"], $desc);
+            $toc .= '<li><a href="' .$link. '">' .$desc. "</a></li>\n";
+        }
+        $toc .= "</ol>\n";
+
+        $this->CURRENT_CHUNK = $id;
+        $this->notify(PhDRender::CHUNK, PhDRender::CLOSE);
+        return $toc . '</div>';
     }
-    public function format_legalnotice_chunk($open, $name, $attrs) {
+    public function format_section_chunk($open, $name, $attrs, $props) {
+        static $a = array();
         if ($open) {
-            return '<div id="legalnotice">';
+            $a[] = $props["sibling"];
+            if ($props["sibling"] === $name) {
+                return $this->format_chunk($open, $name, $attrs, $props);
+            }
+            return $this->transformFromMap($open, "div", $name, $attrs, $props);
         }
-        return "</div>\n";
+        $x = array_pop($a);
+        if ($x == $name) {
+                return $this->format_chunk($open, $name, $attrs, $props);
+        }
+        $a[] = $x;
+        return $this->transformFromMap($open, "div", $name, $attrs, $props);
     }
-    public function format_chunk($open, $name, $attrs) {
+    public function format_chunk($open, $name, $attrs, $props) {
         if ($open) {
             $this->cchunk = $this->dchunk;
             if(isset($attrs[PhDReader::XMLNS_XML]["id"])) {
-                $class = $name;
-                if ($name === "refentry") {
-                    //$class .= " -rel-posting";
-                }
-                return '<div id="' .$attrs[PhDReader::XMLNS_XML]["id"]. '" class="' \
.$class. '">'; +                $id = $attrs[PhDReader::XMLNS_XML]["id"];
+            } else {
+                $id = uniqid("phd");
+            }
+
+            $class = $name;
+            if ($name === "refentry") {
+                //$class .= " -rel-posting";
             }
-            return '<div class="' .$name. '">';
+
+            $this->CURRENT_CHUNK = $id;
+            $this->CURRENT_LANG  = $props["lang"];
+
+            $this->notify(PhDRender::CHUNK, PhDRender::OPEN);
+            return '<div id="' .$id. '" class="' .$class. '">';
         }
+        $this->notify(PhDRender::CHUNK, PhDRender::CLOSE);
+
         $str = "";
         foreach ($this->cchunk["footnote"] as $k => $note) {
             $str .= '<div class="footnote">';
@@ -605,26 +942,7 @@
         return $this->TEXT($value);
     }
     
-    public function format_classsynopsis_methodsynopsis_methodname_text($value, \
                $tag) {
-        $value = $this->TEXT($value);
-        if ($this->cchunk["classsynopsis"]["classname"] === false) {
-            return $value;
-        }
-        if (strpos($value, '::')) {
-            $explode = '::';
-        } elseif (strpos($value, '->')) {
-            $explode = '->';
-        } else {
-            return $value;
-        }
-
-        list($class, $method) = explode($explode, $value);
-        if ($class !== $this->cchunk["classsynopsis"]["classname"]) {
-            return $value;
-        }
-        return $method;
-    }
-    
+   
     public function format_fieldsynopsis($open, $name, $attrs) {
         $this->cchunk["fieldsynopsis"] = $this->dchunk["fieldsynopsis"];
         if ($open) {
@@ -976,12 +1294,12 @@
         }
         return "<br />";
     }
-    public function format_bold_paragraph($open, $name, $attrs, $props) {
+    public function format_example_title($open, $name, $attrs, $props) {
         if ($props["empty"]) {
             return "";
         }
         if ($open) {
-            return "<p><b>";
+            return "<p><b>" . ($this->autogen('example', $props['lang']) . \
++$this->cchunk["examples"]) . " ";  }
         return "</b></p>";
     }
@@ -1131,9 +1449,51 @@
         }
         return "</td>";
     }
+    public function format_qandaset($open, $name, $attrs, $props) {
+        if ($open) {
+            $node = $this->getReader()->expand();
+            $doc = new DOMDocument;
+            $doc->appendChild($node);
 
-    public function admonition_title($title, $lang) {
-        return '<b class="' .(strtolower($title)). '">' .($this->autogen($title, \
$lang)). '</b>'; +            $xp = new DOMXPath($doc);
+            $xp->registerNamespace("db", PhDReader::XMLNS_DOCBOOK);
+
+            $questions = $xp->query("//db:qandaentry/db:question");
+
+            $xml = '<questions xmlns="' .PhDReader::XMLNS_PHD. '">';
+            foreach($questions as $node) {
+                $id = $xp->evaluate("ancestor::db:qandaentry", \
$node)->item(0)->getAttributeNs(PhDReader::XMLNS_XML, "id"); +
+                /* FIXME: No ID? How can we create an anchor for it then? */
+                if (!$id) {
+                    $id = uniqid("phd");
+                }
+
+                $node->setAttribute("xml:id", $id);
+                $xml .= $doc->saveXML($node);
+            }
+            $xml .= "</questions>";
+
+            $r = new PhDReader();
+            $r->XML($xml);
+
+            $render = new PhDRender;
+            $render->attach($this);
+            $render->render($r);
+        }
+    }
+    public function format_question($open, $name, $attrs, $props) {
+        if ($open) {
+            return '<dt><strong>';
+        }
+        return '</strong></dt>';
+    }
+    public function format_phd_question($open, $name, $attrs, $props) {
+        if ($open) {
+            $href = $this->createLink($attrs[PhDReader::XMLNS_XML]["id"]);
+            return '<li><a href="' .$href. '">';
+        }
+        return '</a></li>';
     }
     
     public function format_citation($open, $name, $attrs, $props) {
http://cvs.php.net/viewvc.cgi/phd/include/PhDFormat.class.php?r1=1.10&r2=1.10.6.1&diff_format=u
                
Index: phd/include/PhDFormat.class.php
diff -u phd/include/PhDFormat.class.php:1.10 phd/include/PhDFormat.class.php:1.10.6.1
--- phd/include/PhDFormat.class.php:1.10	Mon Feb  4 21:17:25 2008
+++ phd/include/PhDFormat.class.php	Mon Jul 28 22:40:57 2008
@@ -1,16 +1,117 @@
 <?php
-/*  $Id: PhDFormat.class.php,v 1.10 2008/02/04 21:17:25 bjori Exp $ */
 
-abstract class PhDFormat extends PhDHelper {
-    private $TABLE          = array();
-    
-    /* abstract functions */
-    abstract public function transformFromMap($open, $tag, $name, $attrs, $props);
-    abstract public function CDATA($data);
-    abstract public function TEXT($data);
-    abstract public function __call($func, $args);
+abstract class PhDFormat extends PhDObjectStorage {
+    const SDESC = 1;
+    const LDESC = 2;
+
+	private $elementmap = array();
+	private $textmapmap = array();
+	protected $sqlite;
+
+	private static $autogen = array();
+
+	public function __construct() {
+		$this->sqlite = sqlite_open("index.sqlite");
+        $this->sortIDs();
+	}
+
+	abstract public function transformFromMap($open, $tag, $name, $attrs, $props);
+	abstract public function UNDEF($open, $name, $attrs, $props);
+	abstract public function TEXT($value);
+	abstract public function CDATA($value);
+	abstract public function createLink($for, &$desc = null, $desc = PhDFormat::SDESC);
+	abstract public function appendData($data);
+	abstract public function update($event, $value = null);
+
+    public function sortIDs() {
+        sqlite_create_aggregate($this->sqlite, "idx", array($this, "SQLiteIndex"), \
array($this, "SQLiteFinal"), 6); +        sqlite_unbuffered_query($this->sqlite, \
"SELECT idx(docbook_id, filename, parent_id, sdesc, ldesc, element) FROM ids", \
SQLITE_ASSOC); +        print_r($this->idx);
+    }
+    public function SQLiteIndex(&$context, $id, $filename, $parent, $sdesc, $ldesc, \
$element) { +        $this->idx[$id] = array(
+            "docbook_id" => $id,
+            "filename"   => $filename,
+            "parent_id"  => $parent,
+            "sdesc"      => $sdesc,
+            "ldesc"      => $ldesc,
+            "element"    => $element
+        );
+        if ($element == "refentry") {
+            $this->refs[$sdesc] = $id;
+        }
+
+    }
+    public static function SQLiteFinal(&$context) {
+        return $context;
+    }
+
+
+	final public function notify($event, $val = null) {
+		$this->update($event, $val);
+		foreach($this as $format) {
+			$format->update($event, $val);
+		}
+	}
+	final public function registerElementMap(array $map) {
+		$this->elementmap = $map;
+	}
+	final public function registerTextMap(array $map) {
+		$this->textmap = $map;
+	}
+	final public function attach($obj, $inf = array()) {
+		if (!($obj instanceof $this) && get_class($obj) != get_class($this)) {
+			throw new InvalidArgumentException(get_class($this) . " themes *MUST* _inherit_ " \
.get_class($this). ", got " . get_class($obj)); +		}
+		$obj->notify(PhDRender::STANDALONE, false);
+		return parent::attach($obj, $inf);
+	}
+	final public function getElementMap() {
+		return $this->elementmap;
+	}
+	final public function getTextMap() {
+		return $this->textmap;
+	}
+    final public static function autogen($text, $lang) {
+        if (isset(self::$autogen[$lang])) {
+			if (isset(self::$autogen[$lang][$text])) {
+				return self::$autogen[$lang][$text];
+			}
+            if ($lang == PhDConfig::get("fallback_language")) {
+				throw new InvalidArgumentException("Cannot autogenerate text for '$text'");
+			}
+            return self::autogen($text, PhDConfig::get("fallback_language"));
+        }
+
+        $filename = PhDConfig::get("lang_dir") . $lang . ".xml";
+
+        $r = new XMLReader;
+        if (!file_exists($filename) || !$r->open($filename)) {
+            if ($lang == PhDConfig::get("fallback_language")) {
+                throw new Exception("Cannot open $filename");
+            }
+            return self::autogen($text, PhDConfig::get("fallback_language"));
+        }
+        $autogen = array();
+        while ($r->read()) {
+            if ($r->nodeType != XMLReader::ELEMENT) {
+                continue;
+            }
+            if ($r->name == "term") {
+                $r->read();
+                $k = $r->value;
+                $autogen[$k] = "";
+            } else if ($r->name == "simpara") {
+                $r->read();
+                $autogen[$k] = $r->value;
+            }
+        }
+        self::$autogen[$lang] = $autogen;
+		return self::autogen($text, $lang);
+    }
+
 
-    /* Table helper functions */
+    /* {{{ Table helper functions */
     public function tgroup($attrs) {
         if (isset($attrs["cols"])) {
             $this->TABLE["cols"] = $attrs["cols"];
@@ -36,7 +137,6 @@
     public function getColCount() {
         return $this->TABLE["cols"];
     }
-
     public function valign($attrs) {
         return isset($attrs["valign"]) ? $attrs["valign"] : "middle";
     }
@@ -79,7 +179,7 @@
         }
         return 1;
     }
-
+	/* }}} */
 }
 
 /*
http://cvs.php.net/viewvc.cgi/phd/include/PhDReader.class.php?r1=1.17&r2=1.17.4.1&diff_format=u
                
Index: phd/include/PhDReader.class.php
diff -u phd/include/PhDReader.class.php:1.17 phd/include/PhDReader.class.php:1.17.4.1
--- phd/include/PhDReader.class.php:1.17	Sat May 24 15:04:50 2008
+++ phd/include/PhDReader.class.php	Mon Jul 28 22:40:57 2008
@@ -1,248 +1,115 @@
 <?php
-/*  $Id: PhDReader.class.php,v 1.17 2008/05/24 15:04:50 gwynne Exp $ */
+/*  $Id: PhDReader.class.php,v 1.17.4.1 2008/07/28 22:40:57 bjori Exp $ */
 //6271
 
 class PhDReader extends XMLReader {
-
-    /* {{{ Class constants */
-    const XMLNS_XML   = "http://www.w3.org/XML/1998/namespace";
-    const XMLNS_XLINK = "http://www.w3.org/1999/xlink";
-    const XMLNS_PHD   = "http://www.php.net/ns/phd";
+    const XMLNS_XML     = "http://www.w3.org/XML/1998/namespace";
+    const XMLNS_XLINK   = "http://www.w3.org/1999/xlink";
+    const XMLNS_PHD     = "http://www.php.net/ns/phd";
     const XMLNS_DOCBOOK = "http://docbook.org/ns/docbook";
-    const OPEN_CHUNK  = 0x01;
-    const CLOSE_CHUNK = 0x02;
-    /* }}} */
-
-    /* {{{ Private props */
-    private $STACK    = array();
-    private $LAST_DEPTH = -1;
-    private $lastChunkDepth = -1;
-    private $PREVIOUS_SIBLING = "";
-    /* }}} */
-
-    protected $CHUNK_ME = array( /* {{{ */
-        'article'               => true,
-        'appendix'              => true,
-        'bibliography'          => array(
-            /* DEFAULT */          false,
-            'article'           => true,
-            'book'              => true,
-            'part'              => true,
-       ),
-        'book'                  => true,
-        'chapter'               => true,
-        'colophon'              => true,
-        'glossary'              => array(
-            /* DEFAULT */          false,
-            'article'           => true,
-            'book'              => true,
-            'part'              => true,
-       ),
-        'index'                 => array(
-            /* DEFAULT */          false,
-            'article'           => true,
-            'book'              => true,
-            'part'              => true,
-       ),
-        'legalnotice'           => false,
-        'part'                  => true,
-        'preface'               => true,
-        'refentry'              => true,
-        'reference'             => true,
-        'sect1'                 => 'isSectionChunk',
-        /*
-        'sect2'                 => 'format_section_chunk',
-        'sect3'                 => 'format_section_chunk',
-        'sect4'                 => 'format_section_chunk',
-        'sect5'                 => 'format_section_chunk',
-        */
-        'section'               => 'isSectionChunk',
-        'set'                   => true,
-        'setindex'              => true,
-   ); /* }}} */
-
-    public $isChunk = false;
-
-    public function __construct($encoding = "UTF-8", $xml_opts = NULL) { /* {{{ */
-        if (!XMLReader::open(PhDConfig::xml_file(), $encoding, $xml_opts)) {
-            throw new Exception("Cannot open " . PhDConfig::xml_file());
-        }
-        $ce = PhDConfig::chunk_extra();
-        if (is_array($ce)) {
-            foreach($ce as $el => $v) {
-                $this->CHUNK_ME[$el] = $v;
-            }
-        }
-    } /* }}} */
-
-    public function notXPath($tag, $depth = 0) { /* {{{ */
-        if(!$depth) {
-            $depth = $this->depth;
-        }
-        do {
-            if (isset($tag[$this->STACK[--$depth]])) {
-                $tag = $tag[$this->STACK[$depth]];
-            } else {
-                $tag = $tag[0];
-            }
-        } while (is_array($tag));
-        return $tag;
-    } /* }}} */
-
-    /* Seek to an ID within the file. */
-    public function seek($id) { /* {{{ */
-        while(XMLReader::read()) {
-            if ($this->nodeType === XMLREADER::ELEMENT && $this->hasAttributes && \
                XMLReader::moveToAttributeNs("id", self::XMLNS_XML) && $this->value \
                === $id) {
-                return XMLReader::moveToElement();
-            }
-        }
-        return false;
-    } /* }}} */
-
-    /* Get the ID of current node */
-    public function getID() { /* {{{ */
-        if ($this->hasAttributes && XMLReader::moveToAttributeNs("id", \
                self::XMLNS_XML)) {
-            $id = $this->value;
-            XMLReader::moveToElement();
-            return $id;
-        }
-        return "";
-    } /* }}} */
-
-    public function getParentTagName() { /* {{{ */
-        return $this->STACK[$this->depth-1];
-    } /* }}} */
-    public function getPreviousSiblingTagName() { /* {{{ */
-        return $this->PREVIOUS_SIBLING;
-    } /* }}} */
-
-    public function read() { /* {{{ */
-        $this->isChunk = false;
-        if(XMLReader::read()) {
-            $type = $this->nodeType;
-            switch($type) {
-            case XMLReader::ELEMENT:
-                $name = $this->name;
-                $depth = $this->depth;
-                if ($this->LAST_DEPTH >= $depth) {
-                    $this->PREVIOUS_SIBLING = $this->STACK[$depth];
-                }
-                $this->STACK[$depth] = $name;
-                $isChunk = $this->isChunk($name);
-                if ($isChunk) {
-                    $this->isChunk = PhDReader::OPEN_CHUNK;
-                    $this->chunkDepths[] = $this->lastChunkDepth = $depth;
-                }
-                break;
-
-            case XMLReader::END_ELEMENT:
-                $depth = $this->depth;
-                if ($this->lastChunkDepth == $depth) {
-                    array_pop($this->chunkDepths);
-                    $this->lastChunkDepth = end($this->chunkDepths);
-                    $this->isChunk = PhDReader::CLOSE_CHUNK;
-                }
-                $this->LAST_DEPTH = $depth;
-                break;
-            }
-            return true;
-        }
-        return false;
-    } /* }}} */
-   
-    /* Get the attribute value by name, if exists. */
-    public function readAttribute($attr) { /* {{{ */
-        $retval = XMLReader::moveToAttribute($attr) ? $this->value : "";
-        XMLReader::moveToElement();
-        return $retval;
-    } /* }}} */
-    public function readAttributeNs($attr, $ns) { /* {{{ */
-        $retval = XMLReader::moveToAttributeNs($attr, $ns) ? $this->value : "";
-        XMLReader::moveToElement();
-        return $retval;
-    } /* }}} */
-    /* Get all attributes of current node */
-    public function getAttributes() { /* {{{ */
-        $attrs = array(PhDReader::XMLNS_DOCBOOK => array(), PhDReader::XMLNS_XML => \
                array());
-        if ($this->hasAttributes) {
-            XMLReader::moveToFirstAttribute();
-            do {
-                $k = $this->namespaceURI;
-                $attrs[!empty($k) ? $k : PhDReader::XMLNS_DOCBOOK][$this->localName] \
                = $this->value;
-                $attrs[$this->name] = $this->value;
-            } while (XMLReader::moveToNextAttribute());
-            XMLReader::moveToElement();
-        }
-        return $attrs;
-    } /* }}} */
-
-
-    /* Get the content of a named node, or the current node. */
-    public function readContent($node = null) { /* {{{ */
-        $retval = "";
-
-        if($this->isEmptyElement) {
-            return $retval;
-        }
-        if (!$node) {
-            $node = $this->name;
-        }
-        $retval = "";
-        while (PhDReader::readNode($node)) {
-            $retval .= $this->value;
-        }
-        return $retval;
-    } /* }}} */
-    /* Read $nodeName until END_ELEMENT */
-    public function readNode($nodeName) { /* {{{ */
-        return XMLReader::read() && !($this->nodeType === XMLReader::END_ELEMENT && \
                $this->name == $nodeName);
-    } /* }}} */
-
-  
-    public function isChunk($tag) { /* {{{ */
-        if (isset($this->CHUNK_ME[$tag])) {
-            $isChunk = $this->CHUNK_ME[$tag];
-            if (is_array($isChunk)) {
-                $isChunk = $this->notXPath($isChunk);
-            }
-            if (!is_bool($isChunk)) {
-                return call_user_func(array($this, $isChunk), $tag);
-            }
-            return $isChunk;
-        }
-        return false;
-    } /* }}} */
-    public function isSectionChunk($tag) { /* {{{ */
-        if ($this->PREVIOUS_SIBLING == $tag && $this->checkSectionDepth()) {
-            return true;
-        }
-        return false;
-    } /* }}} */
-    protected function checkSectionDepth() { /* {{{ */
-        static $allowedParents = array("section", "sect2", "sect3", "sect4", \
                "sect5");
-        static $chunkers       = array(
-            "sect1", "preface", "chapter", "appendix", "article", "part", \
                "reference", "refentry",
-            "index", "bibliography", "glossary", "colopone", "book", "set", \
                "setindex", "legalnotice",
-       );
-        
-        $nodeDepth = $this->depth;
-        $i = 1;
-        do {
-            if (in_array($this->STACK[$nodeDepth-$i], $allowedParents)) {
-                ++$i;
-                continue;
-            }
-            break;
-        } while(true);
-        if ($i <= 1 && in_array($this->STACK[$nodeDepth-$i], $chunkers)) {
-            return true;
-        }
-        return false;
-    } /* }}} */
-}
+ 
+	public function __construct() {
+	}
+
+	public function close() {
+		return XMLReader::close();
+	}
+
+	public function getAttribute($name) {
+		return XMLReader::getAttribute($name);
+	}
+
+	public function getAttributeNo($index) {
+		return XMLReader::getAttributeNo($index);
+	}
+
+	public function getAttributeNs($name, $namespaceURI) {
+		return XMLReader::getAttributeNs($name, $namespaceURI);
+	}
+
+	public function getParserProperty($property) {
+		return XMLReader::getParserProperty($property);
+	}
+
+	public function isValid() {
+		return XMLReader::isValid();
+	}
+
+	public function lookupNamespace($prefix) {
+		return XMLReader::lookupNamespace($prefix);
+	}
+
+	public function moveToAttributeNo($index) {
+		return XMLReader::moveToAttributeNo($index);
+	}
+
+	public function moveToAttribute($name) {
+		return XMLReader::moveToAttribute($name);
+	}
+
+	public function moveToAttributeNs($name, $namespaceURI) {
+		return XMLReader::moveToAttributeNs($name, $namespaceURI);
+	}
+
+	public function moveToElement() {
+		return XMLReader::moveToElement();
+	}
+
+	public function moveToFirstAttribute() {
+		return XMLReader::moveToFirstAttribute();
+	}
+
+	public function moveToNextAttribute() {
+		return XMLReader::moveToNextAttribute();
+	}
+
+	public function open($URI, $encoding = null, $options = null) {
+		return XMLReader::open($URI, $encoding, $options);
+	}
+
+	public function read() {
+		return XMLReader::read();
+	}
+
+	public function next($localname = null) {
+		return XMLReader::next($localname);
+	}
+
+	public function readInnerXml() {
+		return XMLReader::readInnerXml();
+	}
+
+	public function readOuterXml() {
+		return XMLReader::readOuterXml();
+	}
+
+	public function readString() {
+		return XMLReader::readString();
+	}
+
+	public function setSchema($filename) {
+		return XMLReader::setSchema($filename);
+	}
+
+	public function setParserProperty($property, $value) {
+		return XMLReader::setParserProperty($property, $value);
+	}
+
+	public function setRelaxNGSchema($filename) {
+		return XMLReader::setRelaxNGSchema($filename);
+	}
+
+	public function setRelaxNGSchemaSource($source) {
+		return XMLReader::setRelaxNGSchemaSource($source);
+	}
+
+	public function XML($source, $encoding = null, $options = null) {
+		return XMLReader::XML($source, $encoding, $options);
+	}
+
+	public function expand() {
+		return XMLReader::expand();
+	}
 
-/*
-* vim600: sw=4 ts=4 syntax=php fdm=marker et
-* vim<600: sw=4 ts=4
-*/
+}
 
http://cvs.php.net/viewvc.cgi/phd/themes/php/phpdotnet.php?r1=1.54&r2=1.54.2.1&diff_format=u
                
Index: phd/themes/php/phpdotnet.php
diff -u phd/themes/php/phpdotnet.php:1.54 phd/themes/php/phpdotnet.php:1.54.2.1
--- phd/themes/php/phpdotnet.php:1.54	Wed Jul 23 19:21:31 2008
+++ phd/themes/php/phpdotnet.php	Mon Jul 28 22:40:57 2008
@@ -1,25 +1,20 @@
 <?php
-/*  $Id: phpdotnet.php,v 1.54 2008/07/23 19:21:31 bjori Exp $ */
+/*  $Id: phpdotnet.php,v 1.54.2.1 2008/07/28 22:40:57 bjori Exp $ */
 
-abstract class phpdotnet extends PhDTheme {
-    protected $elementmap = array(
-        'acronym'               => 'format_suppressed_tags',
+class PhDPHPFormat extends PhDXHTMLFormat {
+    protected $myelementmap = array(
         'function'              => 'format_suppressed_tags',
-        'link'                  => 'format_link',
-        'refpurpose'            => 'format_refpurpose',
-        'title'                 => array(
+        'BOGUStitle'                 => array(
             /* DEFAULT */          false,
             'article'           => 'format_container_chunk_title',
             'appendix'          => 'format_container_chunk_title',
             'chapter'           => 'format_container_chunk_title',
-            'example'           => 'format_example_title',
             'part'              => 'format_container_chunk_title',
             'info'              => array(
                 /* DEFAULT */      false,
                 'article'       => 'format_container_chunk_title',
                 'appendix'      => 'format_container_chunk_title',
                 'chapter'       => 'format_container_chunk_title',
-                'example'       => 'format_example_title',
                 'part'          => 'format_container_chunk_title',
             ),
         ),
@@ -32,91 +27,50 @@
             'methodparam'       => false,
             'methodsynopsis'    => false,
         ),
-        'varname'               => array(
-            /* DEFAULT */          false,
-            'fieldsynopsis'     => 'format_fieldsynopsis_varname',
-        ),
-        'xref'                  => 'format_link',
-
 
 
-        'article'               => 'format_container_chunk',
-        'appendix'              => 'format_container_chunk',
-        'bibliography'          => array(
+        'BOGUSarticle'               => 'format_container_chunk',
+        'BOGUSappendix'              => 'format_container_chunk',
+        'BOGUSbibliography'          => array(
             /* DEFAULT */          false,
             'article'           => 'format_chunk',
             'book'              => 'format_chunk',
             'part'              => 'format_chunk',
         ),
-        'book'                  => 'format_root_chunk',
-        'chapter'               => 'format_container_chunk',
-        'colophon'              => 'format_chunk',
-        'glossary'              => array(
+        'BOGUSbook'                  => 'format_root_chunk',
+        'BOGUSchapter'               => 'format_container_chunk',
+        'BOGUScolophon'              => 'format_chunk',
+        'BOGUSglossary'              => array(
             /* DEFAULT */          false,
             'article'           => 'format_chunk',
             'book'              => 'format_chunk',
             'part'              => 'format_chunk',
         ),
-        'index'                 => array(
+        'BOGUSindex'                 => array(
             /* DEFAULT */          false,
             'article'           => 'format_chunk',
             'book'              => 'format_chunk',
             'part'              => 'format_chunk',
         ),
-        'legalnotice'           => 'format_chunk',
-        'part'                  => 'format_container_chunk',
-        'preface'               => 'format_chunk',
-        'refentry'              => 'format_chunk',
-        'reference'             => 'format_container_chunk',
-        'phpdoc:exception'      => 'format_exception_chunk',
-        'sect1'                 => 'format_chunk',
-        'sect2'                 => 'format_chunk',
-        'sect3'                 => 'format_chunk',
-        'sect4'                 => 'format_chunk',
-        'sect5'                 => 'format_chunk',
-        'section'               => 'format_chunk',
-        'set'                   => 'format_root_chunk',
-        'setindex'              => 'format_chunk',
-        'qandaset'              => 'format_qandaset',
-        'qandaentry'            => 'format_qandaentry',
-        'question'              => 'format_question',
-        'answer'                => 'format_answer',
+        'BOGUSlegalnotice'           => 'format_chunk',
+        'BOGUSpart'                  => 'format_container_chunk',
+        'BOGUSpreface'               => 'format_chunk',
+        'BOGUSrefentry'              => 'format_chunk',
+        'BOGUSreference'             => 'format_container_chunk',
+        'BOGUSsect1'                 => 'format_chunk',
+        'BOGUSsect2'                 => 'format_chunk',
+        'BOGUSsect3'                 => 'format_chunk',
+        'BOGUSsect4'                 => 'format_chunk',
+        'BOGUSsect5'                 => 'format_chunk',
+        'BOGUSsection'               => 'format_chunk',
+        'BOGUSset'                   => 'format_root_chunk',
+        'BOGUSsetindex'              => 'format_chunk',
+        'BOGUSphpdoc:exception'      => 'format_exception_chunk',
     );
-    protected $textmap =        array(
-        'acronym'               => 'format_acronym_text',
-        'function'              => 'format_function_text',
-        'methodname'            => array(
-            /* DEFAULT */          'format_function_text',
-            'constructorsynopsis' => array(
-                /* DEFAULT */      'format_function_text',
-                'classsynopsis' => \
                'format_classsynopsis_methodsynopsis_methodname_text',
-            ),
-            'methodsynopsis'    => array(
-                /* DEFAULT */      'format_function_text',
-                'classsynopsis' => \
                'format_classsynopsis_methodsynopsis_methodname_text',
-            ),
-            'destructorsynopsis' => array(
-                /* DEFAULT */      'format_function_text',
-                'classsynopsis' => \
                'format_classsynopsis_methodsynopsis_methodname_text',
-            ),
-        ),
-        'type'                  => array(
-            /* DEFAULT */          'format_type_text',
-            'classsynopsisinfo' => false,
-            'fieldsynopsis'     => 'format_type_if_object_or_pseudo_text',
-            'methodparam'       => 'format_type_if_object_or_pseudo_text',
-            'methodsynopsis'    => array(
-                /* DEFAULT */      'format_type_if_object_or_pseudo_text',
-                'classsynopsis' => false,
-            ),
-        ),
-        'refname'               => 'format_refname_text',
+    protected $mytextmap =        array(
 
         'titleabbrev'           => 'format_suppressed_tags',
     );
-    private   $versions = array();
-    private   $acronyms = array();
-    protected $chunked = true;
     protected $lang = "en";
 
     protected $CURRENT_ID = "";
@@ -129,471 +83,8 @@
             "modifier"                          => "public",
         ),
         "container_chunk"              => null,
-        "qandaentry"                   => array(
-        ),
-        "examples"                     => 0,
-        "verinfo"                      => false,
-        "refname"                      => array(),
     );
 
-    public function __construct(array $IDs, array $filenames, $ext = "php", $chunked \
                = true) {
-        parent::__construct($IDs, $ext);
-        $this->ext = $ext;
-        if (isset($filenames["version"], $filenames["acronym"])) {
-            $this->versions = self::generateVersionInfo($filenames["version"]);
-            $this->acronyms = self::generateAcronymInfo($filenames["acronym"]);
-        }
-        $this->chunked = $chunked;
-    }
-    public static function generateVersionInfo($filename) {
-        static $info;
-        if ($info) {
-            return $info;
-        }
-        $r = new XMLReader;
-        if (!$r->open($filename)) {
-            throw new Exception;
-        }
-        $versions = array();
-        while($r->read()) {
-            if (
-                $r->moveToAttribute("name")
-                && ($funcname = str_replace(
-                    array("::", "->", "__", "_", '$'),
-                    array("-",  "-",  "-",  "-", ""),
-                    $r->value))
-                && $r->moveToAttribute("from")
-                && ($from = $r->value)
-            ) {
-                $versions[strtolower($funcname)] = $from;
-                $r->moveToElement();
-            }
-        }
-        $r->close();
-        $info = $versions;
-        return $versions;
-    }
-    public static function generateAcronymInfo($filename) {
-        static $info;
-        if ($info) {
-            return $info;
-        }
-        $r = new XMLReader;
-        if (!$r->open($filename)) {
-            throw new Exception("Could not open $filename");
-        }
-        $acronyms = array();
-        while ($r->read()) {
-            if ($r->nodeType != XMLReader::ELEMENT) {
-                continue;
-            }
-            if ($r->name == "term") {
-                $r->read();
-                $k = $r->value;
-                $acronyms[$k] = "";
-            } else if ($r->name == "simpara") {
-                $r->read();
-                $acronyms[$k] = $r->value;
-            }
-        }
-        $info = $acronyms;
-        return $acronyms;
-    }
-    public function format_link($open, $name, $attrs, $props) {
-        if ($open) {
-            $content = $fragment = "";
-            $class = $name;
-
-            if(isset($attrs[PhDReader::XMLNS_DOCBOOK]["linkend"])) {
-                $linkto = $attrs[PhDReader::XMLNS_DOCBOOK]["linkend"];
-                $id = $href = PhDHelper::getFilename($linkto);
-
-                if ($id != $linkto) {
-                    $fragment = "#$linkto";
-                }
-                if ($this->chunked) {
-                    $href .= ".".$this->ext;
-                }
-            } elseif(isset($attrs[PhDReader::XMLNS_XLINK]["href"])) {
-                $href = $attrs[PhDReader::XMLNS_XLINK]["href"];
-                $content = "&raquo; ";
-                $class .= " external";
-            }
-            if ($name == "xref") {
-                if ($this->chunked) {
-                    $link = $href;
-                } else {
-                    $link = "#";
-                    if (isset($linkto)) {
-                        $link .= $linkto;
-                    } else {
-                        $link .= $href;
-                    }
-                }
-                return '<a href="' .$link. '" class="' .$class. '">' \
                .($content.PhDHelper::getDescription($id, false)). '</a>';
-            } elseif ($props["empty"]) {
-                if ($this->chunked) {
-                    $link = "";
-                } else {
-                    $link = "#";
-                }
-                return '<a href="' .$link.$href.$fragment. '" class="' .$class. '">' \
                .$content.$href.$fragment. '</a>';
-            } else {
-                if ($this->chunked) {
-                    $link = $href.$fragment;
-                } elseif(isset($linkto)) {
-                    if ($fragment) {
-                        $link = $fragment;
-                    } else {
-                        $link = "#$href";
-                    }
-                } else {
-                    $link = $href;
-                }
-                return '<a href="' .$link. '" class="' .$class. '">' .$content;
-            }
-        }
-        return "</a>";
-    }
-    public function format_fieldsynopsis_varname($open, $name, $attrs) {
-        if ($open) {
-            $href = "";
-            if (isset($attrs[PhDReader::XMLNS_DOCBOOK]["linkend"])) {
-                $linkto = $attrs[PhDReader::XMLNS_DOCBOOK]["linkend"];
-                $href = PhDHelper::getFilename($linkto);
-
-                if ($this->chunked) {
-                    if ($href != $linkto) {
-                        $href .= ".{$this->ext}#{$linkto}";
-                    } else {
-                        $href .= '.' .$this->ext;
-                    }
-                } else {
-                    $href = '#' .$linkto;
-                }
-                $href = '<a href="' .$href. '">';
-            }
-            
-            if (
-                $this->cchunk["fieldsynopsis"]["modifier"] == "const" ||
-                (
-                    $nfo = $this->format->getChunkInfo() AND \
                $nfo["fieldsynopsis"]["modifier"] == "const"
-                )
-            ) {
-                return ' <var class="fieldsynopsis_varname">'.$href;
-            }
-            return ' <var class="'.$name.'">'.$href.'$';
-        }
-        if (isset($attrs[PhDReader::XMLNS_DOCBOOK]["linkend"])) {
-            return '</a></var>';
-        }
-        return '</var>';
-    }
-
-
-
-
-    public function versionInfo($funcname) {
-        $funcname = str_replace(
-                array("::", "->", "__", "_", '$', '()'),
-                array("-",  "-",  "-",  "-", "",  ''),
-                strtolower($funcname));
-        if(isset($this->versions[$funcname])) {
-           return $this->versions[$funcname];
-        }
-        v("No version info for $funcname", VERBOSE_NOVERSION);
-        return false;
-    }
-    public function acronymInfo($acronym) {
-        return isset($this->acronyms[$acronym]) ? $this->acronyms[$acronym] : false;
-    }
-
-    public function format_acronym_text($value, $tag) {
-        $resolved = $this->acronymInfo($value);
-        if ($resolved) {
-            return '<acronym title="' .$resolved. '">' .$value. '</acronym>';
-        }
-        return '<acronym>'.$value.'</acronym>';
-    }
-    public function format_refpurpose($open, $tag, $attrs) {
-        if ($open) {
-            $retval = "";
-            if ($this->cchunk["verinfo"]) {
-                $verinfo = "";
-                foreach($this->cchunk["refname"] as $refname) {
-                    $verinfo = $this->versionInfo($refname);
-
-                    if ($verinfo) {
-                        break;
-                    }
-                }
-                if (!$verinfo) {
-                    $verinfo = "No version information available, might be only in \
                CVS";
-                }
-
-                $retval = '<p class="verinfo">(' .(htmlspecialchars($verinfo, \
                ENT_QUOTES, "UTF-8")). ')</p>';
-            }
-            $refnames = implode('</span> -- <span class="refname">', \
                $this->cchunk["refname"]);
-
-            $retval .= '<p class="refpurpose"><span class="refname">'. $refnames. \
                '</span> &mdash; <span class="dc-title">';
-            return $retval;
-        }
-        return "</span></p>\n";
-    }
-    public function format_refname_text($value, $tag) {
-        $this->cchunk["refname"][] = $this->format->TEXT($value);
-        return false;
-    }
-    public function format_chunk($open, $name, $attrs, $props) {
-        if (isset($attrs[PhDReader::XMLNS_XML]["id"])) {
-            $this->CURRENT_ID = $id = $attrs[PhDReader::XMLNS_XML]["id"];
-        }
-        if ($props["isChunk"]) {
-            $this->cchunk = $this->dchunk;
-        }
-        if (isset($props["lang"])) {
-            $this->lang = $props["lang"];
-        }
-        if ($name == "refentry") {
-            if (isset($attrs[PhDReader::XMLNS_DOCBOOK]["role"])) {
-                $this->cchunk["verinfo"] = \
                !($attrs[PhDReader::XMLNS_DOCBOOK]["role"] == "noversion");
-            } else {
-                $this->cchunk["verinfo"] = true;
-            }
-        }
-        return false;
-    }
-    public function format_container_chunk($open, $name, $attrs, $props) {
-        $this->CURRENT_ID = $id = $attrs[PhDReader::XMLNS_XML]["id"];
-        if ($open) {
-            if ($props["isChunk"]) {
-                $this->cchunk = $this->dchunk;
-            }
-            if ($name != "reference") {
-                $chunks = PhDHelper::getChildren($id);
-                if (!count($chunks)) {
-                    return "<div>";
-                }
-                $content = '<h2>'.$this->autogen("toc", $props["lang"]). '</h2><ul \
                class="chunklist chunklist_'.$name.'">';
-                foreach($chunks as $chunkid => $junk) {
-                    if ($this->chunked) {
-                        $content .= '<li><a href="'.$chunkid. '.' .$this->ext. '">' \
                .(PhDHelper::getDescription($chunkid, true)). '</a></li>';
-                    } else {
-                        $content .= '<li><a href="#'.$chunkid. '">' \
                .(PhDHelper::getDescription($chunkid, true)). '</a></li>';
-                    }
-                }
-                $content .= "</ul>\n";
-                $this->cchunk["container_chunk"] = $content;
-            }
-            return "<div>";
-        }
-
-        $content = "";
-        if ($name == "reference") {
-            $chunks = PhDHelper::getChildren($id);
-            if (count($chunks)) {
-                $content = '<h2>'.$this->autogen("toc", $props["lang"]). '</h2><ul \
                class="chunklist chunklist_reference">';
-                foreach($chunks as $chunkid => $junk) {
-                    if ($this->chunked) {
-                        $content .= '<li><a href="'.$chunkid. '.' .$this->ext. '">' \
.(PhDHelper::getDescription($chunkid, false)). '</a> — ' \
                .(PhDHelper::getDescription($chunkid, true)). '</li>';
-                    } else {
-                        $content .= '<li><a href="#'.$chunkid.'">' \
.(PhDHelper::getDescription($chunkid, false)). '</a> — ' \
                .(PhDHelper::getDescription($chunkid, true)). '</li>';
-                    }
-                }
-                $content .= "</ul>\n";
-            }
-        }
-        $content .= "</div>\n";
-        
-        return $content;
-    }
-    public function format_exception_chunk($open, $name, $attrs, $props) {
-        return $this->format_container_chunk($open, "reference", $attrs, $props);
-    }
-
-    public function format_container_chunk_title($open, $name, $attrs) {
-        if ($open) {
-            return "<h1>";
-        }
-        $ret = "";
-        if ($this->cchunk["container_chunk"]) {
-            $ret = $this->cchunk["container_chunk"];
-            $this->cchunk["container_chunk"] = null;
-        }
-        return "</h1>\n" .$ret;
-    }
-    public function format_root_chunk($open, $name, $attrs) {
-        $this->CURRENT_ID = $id = $attrs[PhDReader::XMLNS_XML]["id"];
-        if ($open) {
-            return "<div>";
-        }
-
-        $chunks = PhDHelper::getChildren($id);
-        $content = '<ul class="chunklist chunklist_'.$name.'">';
-        foreach($chunks as $chunkid => $junk) {
-            $href = $this->chunked ? $chunkid .'.'. $this->ext : "#$chunkid";
-            $long = PhDHelper::getDescription($chunkid, true);
-            $short = PhDHelper::getDescription($chunkid, false);
-            if ($long && $short && $long != $short) {
-                $content .= '<li><a href="' .$href. '">' .$short. '</a> — ' \
                .$long;
-            } else {
-                $content .= '<li><a href="' .$href. '">' .($long ? $long : $short). \
                '</a>';
-            }
-            $children = PhDHelper::getChildren($chunkid);
-            if (count($children)) {
-                $content .= '<ul class="chunklist chunklist_'.$name.' \
                chunklist_children">';
-                foreach(PhDHelper::getChildren($chunkid) as $childid => $junk) {
-                    $href = $this->chunked ? $childid .'.'. $this->ext : \
                "#$childid";
-                    $long = PhDHelper::getDescription($childid, true);
-                    $short = PhDHelper::getDescription($childid, false);
-                    if ($long && $short && $long != $short) {
-                        $content .= '<li><a href="' .$href. '">' .$short. '</a> — \
                ' .$long. '</li>';
-                    } else {
-                        $content .= '<li><a href="' .$href. '">' .($long ? $long : \
                $short). '</a></li>';
-                    }
-                }
-                $content .="</ul>";
-            }
-            $content .= "</li>";
-        }
-        $content .= "</ul>";
-
-        return $content;
-    }
-
-    public function format_suppressed_tags($open, $name) {
-        /* ignore it */
-        return "";
-    }
-    
-    public function format_classsynopsis_methodsynopsis_methodname_text($value, \
                $tag) {
-        $display_value = \
                $this->format->format_classsynopsis_methodsynopsis_methodname_text($value, \
                $tag);
-        return $this->format_function_text($value, $tag, $display_value);
-    }
-    
-    public function format_function_text($value, $tag, $display_value = null) {
-        if ($display_value === null) {
-            $display_value = $value;
-        }
-        $rel = "";
-        if ($this->format->role == "seealso") {
-            $rel = ' rel="rdfs-seeAlso"';
-        }
-        
-        $ref = strtolower(str_replace(array("_", "::", "->"), array("-", "-", "-"), \
                $value));
-        if (($filename = $this->getRefnameLink($ref)) !== null && $this->CURRENT_ID \
                !== $filename) {
-            if ($this->chunked) {
-                return '<a href="'.$filename. '.' .$this->ext. '" \
                class="function"'.$rel.'>' .$display_value.($tag == "function" ? "()" \
                : ""). '</a>';
-            }
-            return '<a href="#'.$filename. '" class="function"'.$rel.'>' \
                .$display_value.($tag == "function" ? "()" : ""). '</a>';
-        }
-        return '<b>' .$display_value.($tag == "function" ? "()" : ""). '</b>';
-    }
-    public function format_type_if_object_or_pseudo_text($type, $tagname) {
-        if (in_array(strtolower($type), array("bool", "int", "double", "boolean", \
                "integer", "float", "string", "array", "object", "resource", \
                "null"))) {
-            return false;
-        }
-        return self::format_type_text($type, $tagname);
-    }
-    public function format_type_text($type, $tagname) {
-        $t = strtolower($type);
-        $href = $fragment = "";
-
-        switch($t) {
-        case "bool":
-            $href = "language.types.boolean";
-            break;
-        case "int":
-            $href = "language.types.integer";
-            break;
-        case "double":
-            $href = "language.types.float";
-            break;
-        case "boolean":
-        case "integer":
-        case "float":
-        case "string":
-        case "array":
-        case "object":
-        case "resource":
-        case "null":
-            $href = "language.types.$t";
-            break;
-        case "mixed":
-        case "number":
-        case "callback":
-            $href = "language.pseudo-types";
-            $fragment = "language.types.$t";
-            break;
-        default:
-            /* Check if its a classname. */
-            $href = PhDTheme::getFilename("class.$t");
-        }
-
-        if ($href && $this->chunked) {
-            return '<a href="' .$href. '.' .$this->ext.($fragment ? "#$fragment" : \
                ""). '" class="' .$tagname. ' ' .$type. '">' .$type. '</a>';
-        }
-        if ($href) {
-            return '<a href="#' .($fragment ? $fragment : $href). '" class="' \
                .$tagname. ' ' .$type. '">' .$type. '</a>';
-        }
-        return '<span class="' .$tagname. ' ' .$type. '">' .$type. '</span>';
-    }
-
-    public function format_example_title($open, $name, $attrs, $props) {
-        if ($props["empty"]) {
-            return "";
-        }
-        if ($open) {
-            return "<p><b>" . ($this->autogen('example', $props['lang']) . \
                ++$this->cchunk["examples"]) . " ";
-        }
-        return "</b></p>";
-    }
- 
-    /* FIXME: This function is a crazy performance killer */
-    public function qandaset($stream) {
-        $xml = stream_get_contents($stream);
-
-        $old = libxml_use_internal_errors(true);
-        $doc = new DOMDocument("1.0", "UTF-8");
-        $doc->preserveWhitespace = false;
-        $doc->loadXML(html_entity_decode(str_replace("&", "&amp;amp;", \
                "<div>$xml</div>"), ENT_QUOTES, "UTF-8"));
-        if ($err = libxml_get_errors()) {
-            print_r($err);
-            libxml_clear_errors();
-        }
-        fclose($stream);
-        libxml_use_internal_errors($old);
-
-        $xpath = new DOMXPath($doc);
-        $nlist = $xpath->query("//div/dl/dt");
-        $ret = '<div class="qandaset"><ol class="qandaset_questions">';
-        $i = 0;
-        foreach($nlist as $node) {
-            $ret .= '<li><a href="#' .($this->cchunk["qandaentry"][$i++]). '">' \
                .($node->textContent). '</a></li>';
-        }
-
-        return $ret.'</ol>'.$xml.'</div>';
-    }
-    public function format_qandaentry($open, $name, $attrs) {
-        if ($open) {
-            $this->cchunk["qandaentry"][] = $attrs[PhDReader::XMLNS_XML]["id"];
-            return '<dl>';
-        }
-        return '</dl>';
-    }
-    public function format_answer($open, $name, $attrs) {
-        if ($open) {
-            return '<dd><a name="' .end($this->cchunk["qandaentry"]).'"></a>';
-        }
-        return "</dd>";
-    }
-    public function format_question($open, $name, $attrs) {
-        if ($open) {
-            return '<dt><strong>';
-        }
-        return '</strong></dt>';
-    }
-
 }
 
 /*

http://cvs.php.net/viewvc.cgi/phd/formats/bigxhtml.php?view=markup&rev=1.1
Index: phd/formats/bigxhtml.php
+++ phd/formats/bigxhtml.php
<?php
class PhDBigXHTMLFormat extends PhDXHTMLFormat {
    private $myelementmap = array(
        'link'                  => 'format_link',
        'xref'                  => 'format_xref',
        'title'                 => array(
            /* DEFAULT */          false,
            'info'              => array(
                /* DEFAULT */      false,
                'article'       => 'format_container_chunk_top_title',
                'appendix'      => 'format_container_chunk_top_title',
                'book'          => 'format_container_chunk_top_title',
                'chapter'       => 'format_container_chunk_top_title',
                'part'          => 'format_container_chunk_top_title',
                'set'           => 'format_container_chunk_top_title',
            ),
            'article'           => 'format_container_chunk_top_title',
            'appendix'          => 'format_container_chunk_top_title',
            'book'              => 'format_container_chunk_top_title',
            'chapter'           => 'format_container_chunk_top_title',
            'part'              => 'format_container_chunk_top_title',
            'set'               => 'format_container_chunk_top_title',
        ),
        'reference'             => 'format_container_chunk_below',
        'question'              => array(
            /* DEFAULT */          false,
            'questions'         => 'format_phd_question', // From the PhD namespace
        ),

 
    );
    private $mytextmap = array(
    );
    private $bigfp;
    protected $flags;


    public function __construct() {
        parent::__construct();
    }
    public function appendData($data) {
        $id = "BIGHTML ID";
        if ($this->flags & PhDRender::CLOSE) {
            fwrite($this->bigfp, $data);

            /* Append footer */
            fwrite($this->bigfp, $this->footer($id));
            $this->flags ^= PhDRender::CLOSE;
        } elseif ($this->flags & PhDRender::OPEN) {
            /* Prepend header */
            fwrite($this->bigfp, $this->header($id));

            fwrite($this->bigfp, $data);
            $this->flags ^= PhDRender::OPEN;
        } else {
            fwrite($this->bigfp, $data);
        }

    }
    public function header($id) {
        return "\n";
    }
    public function footer($id) {
        return "\n<hr />\n";
    }
    public function open() {
        static $i = 0;
        $i++;
        $this->bigfp = fopen(PhDConfig::get("output_dir") . "bightml$i.html", "w+");
        // FIXME: Use correct lang attribute and insert <title> of the DB file
        fwrite($this->bigfp, 
'<!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="en" lang="en">
<head>
</head>
<body>
');

    }
    public function close() {
        fwrite($this->bigfp, "</body>\n</html>");
        fclose($this->bigfp);
    }
    public function getDefaultElementMap() {
        return $this->myelementmap;
    }
    public function getDefaultTextMap() {
        return $this->mytextmap;
    }
    public function update($event, $val = null) {
        switch($event) {
        case PhDRender::CHUNK:
            $this->flags = $val;
            break;

        case PhDRender::STANDALONE:
            if ($val) {
                $this->registerElementMap(parent::getDefaultElementMap());
                $this->registerTextMap(parent::getDefaultTextMap());
            } else {
                $this->registerElementMap(static::getDefaultElementMap());
                $this->registerTextMap(static::getDefaultTextMap());
            }
            break;

        case PhDRender::INIT:
            if ($val) {
                if (!is_resource($this->bigfp)) {
                    $this->open();
                }
            } else {
                $this->close();
            }
            break;
        }
    }
    public function createLink($for, &$desc = null, $type = self::SDESC) {
        $retval = '#' . $for;
        if ($desc !== null) {
            $rsl = sqlite_array_query($this->sqlite, "SELECT sdesc, ldesc FROM ids \
WHERE docbook_id='$for'", SQLITE_ASSOC);  $retval = '#' . $for;

            if ($type === self::SDESC) {
                $desc = $rsl[0]["sdesc"] ?: $rsl[0]["ldesc"];
            } else {
                $desc = $rsl[0]["ldesc"] ?: $rsl[0]["sdesc"];
            }
        }

        return $retval;
    }

}

/*
 * vim600: sw=4 ts=4 fdm=syntax syntax=php et
 * vim<600: sw=4 ts=4
 */


http://cvs.php.net/viewvc.cgi/phd/include/PhDConfig.class.php?view=markup&rev=1.1
Index: phd/include/PhDConfig.class.php
+++ phd/include/PhDConfig.class.php
<?php
define('VERBOSE_INDEXING',               0x01);
define('VERBOSE_FORMAT_RENDERING',       0x02);
define('VERBOSE_THEME_RENDERING',        0x04);
define('VERBOSE_RENDER_STYLE',           0x08);
define('VERBOSE_PARTIAL_READING',        0x10);
define('VERBOSE_PARTIAL_CHILD_READING',  0x20);
define('VERBOSE_TOC_WRITING',            0x40);
define('VERBOSE_CHUNK_WRITING',          0x80);

define('VERBOSE_ALL',                    0xFF);


class PhDConfig {
	private static $opts = array(
		"output_format"       => array(
		),
		"output_theme"        => array(
		),
		"chunk_extra"         => array(
		),
		"index"               => true,
		"xml_root"            => __DIR__,
		"xml_file"            => false,
		"language"            => "en",
		"fallback_language"   => "en",
		"build_log_file"      => false,
		"verbose"             => VERBOSE_ALL,
		"date_format"         => "H:i:s",
		"render_ids"          => array(
		),
		"skip_ids"            => array(
		),
		"output_dir"          => __DIR__,
		"lang_dir"            => __DIR__,
	);

	public static function init(array $a) {
		self::$opts = array_merge(self::$opts, (array)$a);
	}
	public static function get($opt) {
		if (!is_string($opt)) {
			throw new UnexpectedValueException("Excpecting a string");
		}
		if (!isset(self::$opts[$opt])) {
			throw new UnexpectedValueException("Unknown option: $opt");
		}
		return self::$opts[$opt];
	}
}



http://cvs.php.net/viewvc.cgi/phd/include/PhDIndex.class.php?view=markup&rev=1.1
Index: phd/include/PhDIndex.class.php
+++ phd/include/PhDIndex.class.php
<?php
class PhDIndex extends PhDFormat {
	private $myelementmap = array(
        'article'               => 'format_container_chunk',
        'appendix'              => 'format_container_chunk',
        'bibliography'          => array(
            /* DEFAULT */          false,
            'article'           => 'format_chunk',
            'book'              => 'format_chunk',
            'part'              => 'format_chunk',
        ),
        'book'                  => 'format_container_chunk',
        'chapter'               => 'format_container_chunk',
        'colophon'              => 'format_chunk',
        'glossary'              => array(
            /* DEFAULT */          false,
            'article'           => 'format_chunk',
            'book'              => 'format_chunk',
            'part'              => 'format_chunk',
        ),
        'index'                 => array(
            /* DEFAULT */          false,
            'article'           => 'format_chunk',
            'book'              => 'format_chunk',
            'part'              => 'format_chunk',
        ),

        'legalnotice'           => 'format_legalnotice_chunk',
        'part'                  => 'format_container_chunk',
        'preface'               => 'format_chunk',
        'refentry'              => 'format_chunk',
        'reference'             => 'format_container_chunk',
        'sect1'                 => 'format_section_chunk',
        'section'               => array(
            /* DEFAULT */          false,
            'sect1'                => 'format_section_chunk',
            'preface'              => 'format_section_chunk',
            'chapter'              => 'format_section_chunk',
            'appendix'             => 'format_section_chunk',
            'article'              => 'format_section_chunk',
            'part'                 => 'format_section_chunk',
            'reference'            => 'format_section_chunk',
            'refentry'             => 'format_section_chunk',
            'index'                => 'format_section_chunk',
            'bibliography'         => 'format_section_chunk',
            'glossary'             => 'format_section_chunk',
            'colopone'             => 'format_section_chunk',
            'book'                 => 'format_section_chunk',
            'set'                  => 'format_section_chunk',
            'setindex'             => 'format_section_chunk',
            'legalnotice'          => 'format_section_chunk',
        ),
        'set'                   => 'format_container_chunk',
        'setindex'              => 'format_chunk',



		'title'                 => 'format_ldesc',
		'refpurpose'            => 'format_ldesc',
		'refname'               => 'format_refname',
		'titleabbrev'           => 'format_sdesc',
	);
	private $mytextmap = array(
	);
	private $chunks    = array();

	public function transformFromMap($open, $tag, $name, $attrs, $props) {
	}
	public function TEXT($value) {
	}
	public function CDATA($value) {
	}
	public function createLink($for, &$desc = null, $desc = PhDFormat::SDESC) {
	}
	public function appendData($data) {
	}
    public function update($event, $value = null) {
        switch($event) {
        case PhDRender::CHUNK:
            $this->flags = $value;
            break;

        case PhDRender::STANDALONE:
            if ($value) {
                $this->registerElementMap(static::getDefaultElementMap());
                $this->registerTextMap(static::getDefaultTextMap());
            }
            break;
		case PhDRender::INIT:
			if ($value) {
				if (file_exists("index.sqlite")) {
					unlink("index.sqlite");
				}
				$db = sqlite_open("index.sqlite");

				sqlite_exec($db, 'PRAGMA default_synchronous=OFF');
				sqlite_exec($db, 'PRAGMA count_changes=OFF');
				sqlite_exec($db, 'PRAGMA cache_size=100000');

				$create = <<<SQL
CREATE TABLE ids (
	docbook_id TEXT PRIMARY KEY,
	filename TEXT,
	parent_id TEXT,
	sdesc TEXT,
	ldesc TEXT,
	element TEXT
);
SQL;
				sqlite_exec($db, 'PRAGMA default_synchronous=OFF');
				sqlite_exec($db, 'PRAGMA count_changes=OFF');
				sqlite_exec($db, 'PRAGMA cache_size=100000');
				sqlite_exec($db, $create);

				$this->db = $db;

				$this->chunks = array();
			} else {
				//print_r($this->chunks);
			}
        }
    }
    public function getDefaultElementMap() {
        return $this->myelementmap;
    }
    public function getDefaultTextMap() {
        return $this->mytextmap;
    }
	public function UNDEF($open, $name, $attrs, $props) {
		if ($open) {
            if(!isset($attrs[PhDReader::XMLNS_XML]["id"])) {
				return false;
			}
			$id = $attrs[PhDReader::XMLNS_XML]["id"];
			$this->storeInfo($name, $id, $this->currentchunk);

			return false;
		}

		if(!isset($attrs[PhDReader::XMLNS_XML]["id"])) {
			return false;
		}

		$this->appendID();
		return false;
	}
	protected function storeInfo($elm, $id, $filename) {
		$this->nfo[$id] = array(
			"parent"   => "",
			"filename" => $filename,
			"sdesc"    => "",
			"ldesc"    => "",
			"element"  => $elm,
			"children" => array(),
		);
		$this->ids[] = $id;
		$this->currentid = $id;
	}
	public function appendID() {
		static $rand = 0;

		$lastchunkid = array_pop($this->ids);
		$parentid = end($this->ids);

		$this->currentid = $parentid;
		$a = $this->nfo[$lastchunkid];
		if (is_array($a["sdesc"])) {
			$array = true;
			$sdesc = array_shift($a["sdesc"]);
		} else {
			$array = false;
			$sdesc = $a["sdesc"];
		}
		$this->commit .= sprintf(
			"INSERT INTO ids (docbook_id, filename, parent_id, sdesc, ldesc, element) \
VALUES('%s', '%s', '%s', '%s', '%s', '%s');\n",  sqlite_escape_string($lastchunkid),
			sqlite_escape_string($a["filename"]),
			sqlite_escape_string($this->currentchunk),
			sqlite_escape_string($sdesc),
			sqlite_escape_string($a["ldesc"]),
			sqlite_escape_string($a["element"])
		);
		if ($array === true && !empty($a["sdesc"])) {
			foreach($a["sdesc"] as $sdesc) {
				++$rand;
				$this->commit .= sprintf(
					"INSERT INTO ids (docbook_id, filename, parent_id, sdesc, ldesc, element) \
VALUES('%s', '%s', '', '%s', '%s', '%s');\n",  "phdgen-" . $rand,
					sqlite_escape_string($a["filename"]),
					sqlite_escape_string($sdesc),
					sqlite_escape_string($a["ldesc"]),
					sqlite_escape_string($a["element"])
				);
			}
		}
	}
    public function format_section_chunk($open, $name, $attrs, $props) {
        static $a = array();
        if ($open) {
            $a[] = $props["sibling"];
            if ($props["sibling"] === $name) {
                return $this->format_chunk($open, $name, $attrs, $props);
            }
            return $this->UNDEF($open, $name, $attrs, $props);
        }
        $x = array_pop($a);
        if ($x == $name) {
                return $this->format_chunk($open, $name, $attrs, $props);
        }
        $a[] = $x;
        return $this->UNDEF($open, $name, $attrs, $props);
    }
    public function format_container_chunk($open, $name, $attrs, $props) {
		return $this->format_chunk($open, $name, $attrs, $props);
    }
    public function format_chunk($open, $name, $attrs, $props) {
        if ($open) {
            if(isset($attrs[PhDReader::XMLNS_XML]["id"])) {
                $id = $attrs[PhDReader::XMLNS_XML]["id"];
            } else {
                $id = uniqid("phd");
            }
			$this->chunks[] = $id;
			$this->currentchunk = $id;
			$this->storeInfo($name, $id, $id);

            $this->notify(PhDRender::CHUNK, PhDRender::OPEN);

			return false;
        }
		array_pop($this->chunks);
		$this->currentchunk = end($this->chunks);

        $this->notify(PhDRender::CHUNK, PhDRender::CLOSE);

		$this->appendID();

		return false;
    }
	public function format_legalnotice_chunk($open, $name, $attrs, $props) {
		return $this->format_chunk($open, $name, $attrs, $props);
	}
	public function format_ldesc($open, $name, $attrs, $props) {
		if ($open) {
			if (empty($this->nfo[$this->currentid]["ldesc"])) {
				/* FIXME: How can I mark that node with "reparse" flag? */
				$s = $this->getReader()->readInnerXml();
				$this->nfo[$this->currentid]["ldesc"] = $s;
			}
		}
	}
	public function format_sdesc($open, $name, $attrs, $props) {
		if ($open) {
			if (empty($this->nfo[$this->currentid]["sdesc"])) {
				/* FIXME: How can I mark that node with "reparse" flag? */
				$s = $this->getReader()->readInnerXml();
				$this->nfo[$this->currentid]["sdesc"] = $s;
			}

		}
	}
	public function format_refname($open, $name, $attrs, $props) {
		if ($open) {
			$s = $this->getReader()->readInnerXml();
			$s = str_replace(array("_", "::", "->"), array("-", "-", "-"), $s);
			$this->nfo[$this->currentid]["sdesc"][] = strtolower($s);
		}
	}
	public function commit() {
		var_dump(sqlite_exec($this->db, 'BEGIN TRANSACTION; '.$this->commit.' COMMIT'));
		$this->commit = null;
	}
}


http://cvs.php.net/viewvc.cgi/phd/include/PhDObjectStorage.class.php?view=markup&rev=1.1
                
Index: phd/include/PhDObjectStorage.class.php
+++ phd/include/PhDObjectStorage.class.php
<?php
class PhDObjectStorage extends SplObjectStorage {
	protected static $r = array();

	public function attach($obj, $inf = array()) {
		if (!($obj instanceof PhDFormat)) {
			throw new InvalidArgumentException("Only classess inheriting PhDFormat \
supported");  }
		if (empty($inf)) {
			$inf = array(
				XMLReader::ELEMENT => $obj->getElementMap(),
				XMLReader::TEXT    => $obj->getTextMap(),
			);
		}
		parent::attach($obj, $inf);
	}
	final protected static function setReader(PhDReader $r) {
		self::$r[] = $r;
	}
	final protected function getReader() {
		return end(self::$r);
	}
	final protected function popReader() {
		return array_pop(self::$r);
	}
}


http://cvs.php.net/viewvc.cgi/phd/include/PhDRender.class.php?view=markup&rev=1.1
Index: phd/include/PhDRender.class.php
+++ phd/include/PhDRender.class.php
<?php
class PhDRender extends PhDObjectStorage {
	const CHUNK        = 0x001;
	const OPEN         = 0x002;
	const CLOSE        = 0x004;
	const STANDALONE   = 0x008;
	const INIT         = 0x010;

	private   $STACK      = array();

	public function __construct() { /* {{{ */
	} /* }}} */

	public function notXPath($tag, $depth) { /* {{{ */
		do {
			if (isset($tag[$this->STACK[--$depth]])) {
				$tag = $tag[$this->STACK[$depth]];
			} else {
				$tag = $tag[0];
			}
		} while (is_array($tag));
		return $tag;
	} /* }}} */

	public function attach($obj, $inf = array()) { /* {{{ */
		if (!($obj instanceof PhDFormat)) {
			throw new InvalidArgumentException("All formats *MUST* inherit PhDFormat");
		}
		$obj->notify(PhDRender::STANDALONE, true);

		return parent::attach($obj, $inf);
	} /* }}} */

	public function render(PhDReader $r) { /* {{{ */
		PhDObjectStorage::setReader($r);

		foreach($this as $format) {
			$format->notify(PhDRender::INIT, true);
		}

		$lastdepth = -1;
		while($r->read()) {
			$type = $r->nodeType;
			$data = $retval = $name = $open = false;

			switch($type) {
			case XMLReader::ELEMENT: /* {{{ */
				$open  = true;
				/* break intentionally omitted */
			case XMLReader::END_ELEMENT:
				$name  = $r->name;
				$depth = $r->depth;
				$attrs = array(
					PhDReader::XMLNS_DOCBOOK => array(),
					PhDReader::XMLNS_XML     => array(),
				);

				if ($r->hasAttributes) {
					$r->moveToFirstAttribute();
					do {
						$k = $r->namespaceURI;
						$attrs[!empty($k) ? $k : PhDReader::XMLNS_DOCBOOK][$r->localName] = $r->value;
					} while ($r->moveToNextAttribute());
					$r->moveToElement();
				}

				$props    = array(
					"empty"    => $r->isEmptyElement,
					"isChunk"  => false,
					"lang"     => $r->xmlLang,
					"ns"       => $r->namespaceURI,
					"sibling"  => $lastdepth >= $depth ? $this->STACK[$depth] : "",
					"depth"    => $depth,
				);

				$this->STACK[$depth] = $name;

				foreach($this as $format) {
					$map = $this[$format][XMLReader::ELEMENT];

					if (isset($map[$name]) === false) {
						$data = $format->UNDEF($open, $name, $attrs, $props);
						$format->appendData($data);
						continue;
					}

					$tag = $map[$name];
					if (is_array($tag)) {
						$tag = $this->notXPath($tag, $depth);
					}

					if ($tag === false) {
						$data = $format->UNDEF($open, $name, $attrs, $props);
						$format->appendData($data);
						continue;
					}

					if (strncmp($tag, "format_", 7) !== 0) {
						$data = $retval = $format->transformFromMap($open, $tag, $name, $attrs, \
$props);  } else {
						$data = $retval = $format->{$tag}($open, $name, $attrs, $props);
					}
					$format->appendData($data);

					foreach($format as $theme) {
						$map = $format[$theme][XMLReader::ELEMENT];
						if (isset($map[$name])) {
							$tag = $map[$name];

							if (is_array($tag)) {
								$tag = $this->notXPath($tag, $depth);
							}

							if ($tag !== false) {
								$retval = $theme->{$tag}($open, $name, $attrs, $props);

								if ($retval !== false) {
									$data = $retval;
								}
							}
						}
						$theme->appendData($data);
					}
				}

				$lastdepth = $depth;
				break;
			/* }}} */

			case XMLReader::TEXT: /* {{{ */
				$value = $r->value;
				$eldepth = $r->depth - 1;
				$name  = $this->STACK[$eldepth];

				foreach($this as $format) {
					$map = $this[$format][XMLReader::TEXT];
					if (isset($map[$name])) {
						$tag = $map[$name];

						if (is_array($tag)) {
							$tag = $this->notXPath($tag, $eldepth);
						}

						if ($tag !== false) {
							$data = $retval = $format->{$tag}($value, $name);
						} else {
							$data = $retval = $format->TEXT($value);
						}
					} else {
						$data = $retval = $format->TEXT($value);
					}

					if ($data === false) {
						$format->appendData($value);
					} else {
						$format->appendData($data);
					}

					foreach($format as $theme) {
						$map = $format[$theme][XMLReader::TEXT];
						if (isset($map[$name])) {
							$tag = $map[$name];

							if (is_array($tag)) {
								$tag = $this->notXPath($tag, $eldepth);
							}

							if ($tag !== false) {
								$retval = $format->{$tag}($value, $name);
								if ($retval !== false) {
									$data = $retval;
								}
							}
						}
						$theme->appendData($data);
					}
				}
				break;
			/* }}} */

			case XMLReader::CDATA: /* {{{ */
				/* Different formats may want to escape the CDATA sections differently */
				$value  = $r->value;
				foreach($this as $format) {
					$retval = $format->CDATA($value);
					$format->appendData($retval);
					foreach($format as $theme) {
						$theme->appendData($retval);
					}
				}
				break;
			/* }}} */

			case XMLReader::WHITESPACE: /* {{{ */
			case XMLReader::SIGNIFICANT_WHITESPACE:
				/* WS is always WS */
				$retval  = $r->value;
				foreach($this as $format) {
					$format->appendData($retval);
					foreach($format as $theme) {
						$theme->appendData($retval);
					}
				}
				break;
			/* }}} */

			}
		}

		/* Closing time */
		foreach($this as $format) {
			//$format->notify(PhDRender::INIT, false);
		}
		$r->close();

		PhDObjectStorage::popReader();

	} /* }}} */

}



-- 
PHP Documentation Commits Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic