Hey guys,

The first design of the PhD Processing Instructions Handler.
The idea is choose the correct PIHandler class for each target you want.

ex:
    In the Package_Default_XHTML class we have:
    $pihandlers = array(
        "dbhtml"        => "PI_DBHTMLHandler",
    );

    In your own package:
    $pihandlers = array(
        "dbhtml"        => "MyOwnDBHTMLHandler",
    );

    Also we can write a class to handler all targets:
    $pihandlers = array(
        "dbhtml"        => "PIHandler",
        "dbman"         => "PIHandler",
        "tdg-purp"      => "PIHandler",
    );


The Render class will only know the parsePI method:
    case \XMLReader::PI:
    $target = $r->name;
    $data = $r->value;
    foreach ($this as $format) {
        $format->parsePI($target, $data);
    }
    break;

The parsePI method will act like a factory to instanciate the PIHandler
class:
    public final function parsePI($target, $data) {
        if (isset($this->pihandlers[$target])) {
            //I'm thinking in a way to not have to create a new instance
here
            //every time. Maybe a singleton?
            $classname = __NAMESPACE__ . "\\" . $this->pihandlers[$target];
            $pihandler = new $classname($this);
            return $pihandler->parse($data);
        }
    }

The PIHandler classes will have to parse and process the data in the PI.


Sugestions?

--Moacir
<?php
namespace phpdotnet\phd;

class PI_DBHTMLHandler extends PIHandler {
    private $map = array(
        "background-color"              => "format_background_color",
        "bgcolor"                       => "format_bgcolor",
        "cellpadding"                   => "format_cellpadding",
        "cellspacing"                   => "format_cellspacing",
        "class"                         => "format_class",
        "dir"                           => "format_dir",
        "filename"                      => "format_filename",
        "funcsynopsis-style"            => "format_funcsynopsis_style",
        "img.src.path"                  => "format_img_src_path",
        "label-width"                   => "format_label_width",
        "linenumbering.everyNth"        => "format_linenumbering_everyNth",
        "linenumbering.separator"       => "format_linenumbering_separator",
        "linenumbering.width"           => "format_linenumbering_width",
        "list-presentation"             => "format_list_presentation",
        "list-width"                    => "format_list_width",
        "row-height"                    => "format_row_height",
        "start"                         => "format_start", //obsolete
        "stop-chunking"                 => "format_stop_chunking",
        "table-summary"                 => "format_table_summary",
        "table-width"                   => "format_table_width",
        "term-presentation"             => "format_term_presentation",
        "term-separator"                => "format_term_separator",
        "term-width"                    => "format_term_width",
        "toc"                           => "format_toc",
    );

    public function __construct($format) {
        parent::__construct($format);
    }

    /**
     * Function to parse the data and redirect it to the 
     * correct format_ function.
     */
    public function parse($data) {}
    
    public function format_background_color($data) {}
    public function format_bgcolor($data) {}
    public function format_cellpadding($data) {}
    public function format_cellspacing($data) {}
    public function format_class($data) {}
    public function format_dir($data) {}
    public function format_filename($data) {}
    public function format_funcsynopsis_style($data) {}
    public function format_img_src_path($data) {}
    public function format_label_width($data) {}
    public function format_linenumbering_everyNth($data) {}
    public function format_linenumbering_separator($data) {}
    public function format_linenumbering_width($data) {}
    public function format_list_presentation($data) {}
    public function format_list_width($data) {}
    public function format_row_height($data) {}
    public function format_start($data) {}
    public function format_stop_chunking($data) {}
    public function format_table_summary($data) {}
    public function format_table_width($data) {}
    public function format_term_presentation($data) {}
    public function format_term_separator($data) {}
    public function format_term_width($data) {}
    public function format_toc($data) {}

}

?>
Index: phpdotnet/phd/Package/Default/XHTML.php
===================================================================
--- phpdotnet/phd/Package/Default/XHTML.php     (revision 284295)
+++ phpdotnet/phd/Package/Default/XHTML.php     (working copy)
@@ -413,6 +413,10 @@
         ),
     );
 
+    protected $pihandlers = array(
+        "dbhtml"        => "PI_DBHTMLHandler",
+    );
+
     public function __construct() {
         parent::__construct();
         $this->setExt("html");
Index: phpdotnet/phd/Format.php
===================================================================
--- phpdotnet/phd/Format.php    (revision 284293)
+++ phpdotnet/phd/Format.php    (working copy)
@@ -16,10 +16,12 @@
     protected $outputdir;
     protected $chunked;
 
+    /*Processing Instructions Handlers*/
+    protected $pihandlers = array();
+
     /* Indexing maps */
     protected $indexes = array();
     protected $childrens = array();
-
     protected $refs = array();
     protected $vars = array();
     protected $classes = array();
@@ -44,6 +46,14 @@
     abstract public function appendData($data);
     abstract public function update($event, $value = null);
 
+    public final function parsePI($target, $data) {
+        if (isset($this->pihandlers[$target])) {
+            //I'm thinking in a way to not have to create a new instance here
+            //every time. Maybe a singleton?
+            $classname = __NAMESPACE__ . "\\" . $this->pihandlers[$target];
+            $pihandler = new $classname($this);
+            return $pihandler->parse($data);
+        }
+    }
+
     public function sortIDs() {
         $this->sqlite->createAggregate("indexes", array($this, "SQLiteIndex"), 
array($this, "SQLiteFinal"), 8);
         $this->sqlite->createAggregate("childrens", array($this, 
"SQLiteChildrens"), array($this, "SQLiteFinal"), 2);
<?php
namespace phpdotnet\phd;

abstract class PIHandler {
    protected $format;

    public function __construct($format) {
        $this->format = $format;
    }

    abstract function parse($data);
}

?>
Index: phpdotnet/phd/Render.php
===================================================================
--- phpdotnet/phd/Render.php    (revision 284228)
+++ phpdotnet/phd/Render.php    (working copy)
@@ -214,6 +214,13 @@
                 break;
                     /* }}} */
 
+                case \XMLReader::PI:
+                $target = $r->name;
+                $data = $r->value;
+                foreach ($this as $format) {
+                    $format->parsePI($target, $data);
+                }
+                break;
             }
         }
 

Reply via email to