Hey guys,

Some patches to improve the factory system and load the formats dynamically.

what do you  think?

--Moacir
Index: phpdotnet/phd/BuildOptionsParser.php
===================================================================
--- phpdotnet/phd/BuildOptionsParser.php        (revision 284053)
+++ phpdotnet/phd/BuildOptionsParser.php        (working copy)
@@ -36,21 +36,8 @@
     {
         $formats = array();
         foreach((array)$v as $i => $val) {
-            switch($val) {
-                case "xhtml":
-                case "bigxhtml":
-                case "howto":
-                case "php":
-                case "manpage":
-                case "kdevelop":
-                case "pdf":
-                case "bigpdf":
-                    if (!in_array($val, $formats)) {
-                        $formats[] = $val;
-                    }
-                    break;
-                default:
-                    trigger_error("Format not supported at this time", 
E_USER_ERROR);
+            if (!in_array($val, $formats)) {
+                $formats[] = $val;
             }
         }
         Config::set_output_format($formats);
@@ -139,7 +126,7 @@
         if (is_null($packageList)) {
             $packageList = array();
             foreach (glob($GLOBALS['ROOT'] . "/phpdotnet/phd/Package/*", 
GLOB_ONLYDIR) as $item) {
-                if (!in_array(basename($item), array('CVS', '.', '..'))) {
+                if (!in_array(basename($item), array('.svn', '.', '..'))) {
                     $packageList[] = basename($item);
                 }
             }
@@ -223,21 +210,16 @@
         if (is_null($packageList)) {
             $packageList = array();
             foreach (glob($GLOBALS['ROOT'] . "/phpdotnet/phd/Package/*", 
GLOB_ONLYDIR) as $item) {
-                if (!in_array(basename($item), array('CVS', '.', '..'))) {
-                    $formats = array();
-                    foreach (glob($item . "/*.php") as $subitem) {
-                        if (strcmp(basename($subitem), "Factory.php") != 0) {
-                            $formats[] = substr(basename($subitem), 0, -4);    
           
-                        }
-                    }
-                    $packageList[basename($item)] = $formats;
+                if (!in_array(basename($item), array('.svn', '.', '..'))) {
+                   $packageList[] = basename($item);
                 }
             }
         }
         
         echo "Supported packages:\n";
-        foreach ($packageList as $package => $formats) {
-            echo "\t" . $package . "\n\t\t" . implode("\n\t\t", $formats) . 
"\n";
+        foreach ($packageList as $package) {
+            $factory = Format_Factory::createFactory($package);
+            echo "\t" . $package . "\n\t\t" . implode("\n\t\t", 
$factory->getOutputFormats()) . "\n";
         }
       
         exit(0);
Index: phpdotnet/phd/Config.php
===================================================================
--- phpdotnet/phd/Config.php    (revision 284053)
+++ phpdotnet/phd/Config.php    (working copy)
@@ -7,16 +7,7 @@
 class Config
 {
     private static $optionArray = array(
-        'output_format' => array(
-            'xhtml',
-            'php',
-            'bigxhtml',
-            'howto',
-            'manpage',
-            'kdevelop',
-            'pdf',
-            'bigpdf',
-        ),
+        'output_format' => array(),
         'chunk_extra' => array(
             "legalnotice" => true,
             "phpdoc:exception" => true,
Index: ../phpdotnet/phd/Package/Default/Factory.php
===================================================================
--- ../phpdotnet/phd/Package/Default/Factory.php        (revision 283894)
+++ ../phpdotnet/phd/Package/Default/Factory.php        (working copy)
@@ -2,18 +2,15 @@
 namespace phpdotnet\phd;
 
 class Package_Default_Factory extends Format_Factory {
-    public function createXhtmlFormat() {
-        return new Package_Default_ChunkedXHTML();
-    }
-    
-    public function createBigXhtmlFormat() {
-        return new Package_Default_BigXHTML();
-    }
-   
-    public function createPHPFormat() {
-        return new Package_Default_PHP();
-    }
+    private $formats = array(
+        'xhtml'         => 'Package_Default_ChunkedXHTML',
+        'bigxhtml'      => 'Package_Default_BigXHTML',
+        'php'           => 'Package_Default_PHP',
+    );
 
+    public function __construct() {
+        parent::registerOutputFormats($this->formats);
+    }
 }
 
 ?>
Index: phpdotnet/phd/Format/Factory.php
===================================================================
--- phpdotnet/phd/Format/Factory.php    (revision 284054)
+++ phpdotnet/phd/Format/Factory.php    (working copy)
@@ -1,36 +1,34 @@
 <?php
 namespace phpdotnet\phd;
 
-abstract class Format_Factory
-{
-    public function createXhtmlFormat() {
-        trigger_error("This format is not supported by this package", 
E_USER_ERROR);
+abstract class Format_Factory {
+    private $formats = array();
+
+    public final function getOutputFormats() {
+        return array_keys($this->formats);
     }
-    public function createBigXhtmlFormat() {
-        trigger_error("This format is not supported by this package", 
E_USER_ERROR);
+
+    public final function registerOutputFormats($formats) {
+        $this->formats = $formats;
     }
-    public function createPHPFormat() {
+
+    public final function createFormat($format) { 
+        if (isset($this->formats[$format]) && $this->formats[$format]) {
+            $classname = __NAMESPACE__ . "\\" . $this->formats[$format];
+
+            $obj = new $classname();
+            if (!($obj instanceof Format)) {
+                throw new \Exception("All Formats must inherit Format");
+             }
+            return $obj;
+        }
         trigger_error("This format is not supported by this package", 
E_USER_ERROR);
     }
-    public function createHowToFormat() {
-        trigger_error("This format is not supported by this package", 
E_USER_ERROR);
-    }
-    public function createManpageFormat() {
-        trigger_error("This format is not supported by this package", 
E_USER_ERROR);
-    }
-    public function createKDevelopFormat() {
-        trigger_error("This format is not supported by this package", 
E_USER_ERROR);
-    }
-    public function createPDFFormat() {
-        trigger_error("This format is not supported by this package", 
E_USER_ERROR);
-    }
-    public function createBigPDFFormat() {
-        trigger_error("This format is not supported by this package", 
E_USER_ERROR);
-    }
 
-    public static final function createFactory()
-    {
-        $package = Config::package();
+    public static final function createFactory($package = null) {
+        if ($package === null) {
+            $package = Config::package();
+        }
         $classname = __NAMESPACE__ . "\\Package_" . $package . "_Factory";
 
         $factory = new $classname();
Index: ../phpdotnet/phd/Package/Pear/Factory.php
===================================================================
--- ../phpdotnet/phd/Package/Pear/Factory.php   (revision 283894)
+++ ../phpdotnet/phd/Package/Pear/Factory.php   (working copy)
@@ -2,22 +2,15 @@
 namespace phpdotnet\phd;
 
 class Package_Pear_Factory extends Format_Factory {
-    public function createBigXhtmlFormat() {
-        return new Package_Pear_BigXHTML();
-    }    
-
-    public function createXhtmlFormat() {
-        return new Package_Pear_ChunkedXHTML();
-    }
-
-    public function createPHPFormat() {
-        return new Package_Pear_Web();
-    }
+    private $formats = array(
+        'xhtml'         => 'Package_Pear_ChunkedXHTML',
+        'bigxhtml'      => 'Package_Pear_BigXHTML',
+        'php'           => 'Package_Pear_Web',
+    );
     
-    public function createChmFormat() {
-        return new Package_Pear_CHM();
+    public function __construct() {
+        parent::registerOutputFormats($this->formats);
     }
-
 }
 
 ?>
Index: phpdotnet/phd/Package/PHP/Factory.php
===================================================================
--- phpdotnet/phd/Package/PHP/Factory.php       (revision 284056)
+++ phpdotnet/phd/Package/PHP/Factory.php       (working copy)
@@ -2,43 +2,20 @@
 namespace phpdotnet\phd;
 
 class Package_PHP_Factory extends Format_Factory {
-
-    public function createBigXhtmlFormat() {
-        return new Package_PHP_BigXHTML();
-    }    
-
-    public function createXhtmlFormat() {
-        return new Package_PHP_ChunkedXHTML();
+    private $formats = array(
+        'xhtml'         => 'Package_PHP_ChunkedXHTML',
+        'bigxhtml'      => 'Package_PHP_BigXHTML',
+        'php'           => 'Package_PHP_Web',
+        'howto'         => 'Package_PHP_HowTo',
+        'manpage'       => 'Package_PHP_Functions',
+        'pdf'           => 'Package_PHP_PDF',
+        'bigpdf'        => 'Package_PHP_BigPDF',
+        'kdevelop'      => 'Package_PHP_KDevelop',
+    );
+    
+    public function __construct() {
+        parent::registerOutputFormats($this->formats);
     }
-
-    public function createPHPFormat() {
-        return new Package_PHP_Web();
-    }    
-
-    public function createHowToFormat() {
-        return new Package_PHP_HowTo();
-    }
-
-    public function createManpageFormat() {
-        return new Package_PHP_Functions();
-    }
-
-    public function createKDevelopFormat() {
-        return new Package_PHP_KDevelop();
-    }
-
-    public function createPDFFormat() {
-        return new Package_PHP_PDF();
-    }
-
-    public function createBigPDFFormat() {
-        return new Package_PHP_BigPDF();
-    }
-/*    
-    public function createChmFormat() {
-        return new Package_PHP_CHM();
-    }
-*/
 }
 
 ?>
Index: render.php
===================================================================
--- render.php  (revision 284053)
+++ render.php  (working copy)
@@ -63,33 +63,12 @@
         v("Skipping indexing", VERBOSE_INDEXING);
     }
 
+    if (count(Config::output_format()) == 0) {
+        Config::set_output_format($factory->getOutputFormats());
+    }
+ 
     foreach (Config::output_format() as $format) {
-        switch($format) {
-            case "xhtml": // Standalone Chunked xHTML Format
-            $render->attach($factory->createXhtmlFormat());
-            break;
-            case "php": // Standalone phpweb Format
-            $render->attach($factory->createPHPFormat());
-            break;
-            case "bigxhtml": // Standalone Big xHTML Format
-            $render->attach($factory->createBigXhtmlFormat());
-            break;            
-            case "howto": // Standalone HowTo Format
-            $render->attach($factory->createHowToFormat());
-            break;            
-            case "manpage": // Standalone Manpage Format
-            $render->attach($factory->createManpageFormat());
-            break;            
-            case "kdevelop": // Standalone KDevelop Format
-            $render->attach($factory->createKDevelopFormat());
-            break;            
-            case "pdf": // Standalone PDF Format
-            $render->attach($factory->createPDFFormat());
-            break;
-            case "bigpdf": // Standalone BigPDF Format
-            $render->attach($factory->createBigPDFFormat());
-            break;
-        }
+        $render->attach($factory->createFormat($format));
     }
 }
 

Reply via email to