phpDocumentor Converters
PDFdefault
[ class tree: Converters ] [ index: Converters ] [ all elements ]

Source for file PDFdefaultConverter.inc

Documentation is available at PDFdefaultConverter.inc

  1. <?php
  2. /**
  3.  * Outputs documentation in PDF format
  4.  *
  5.  * phpDocumentor :: automatic documentation generator
  6.  * 
  7.  * PHP versions 4 and 5
  8.  *
  9.  * Copyright (c) 2002-2006 Gregory Beaver
  10.  * 
  11.  * LICENSE:
  12.  * 
  13.  * This library is free software; you can redistribute it
  14.  * and/or modify it under the terms of the GNU Lesser General
  15.  * Public License as published by the Free Software Foundation;
  16.  * either version 2.1 of the License, or (at your option) any
  17.  * later version.
  18.  * 
  19.  * This library is distributed in the hope that it will be useful,
  20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  22.  * Lesser General Public License for more details.
  23.  * 
  24.  * You should have received a copy of the GNU Lesser General Public
  25.  * License along with this library; if not, write to the Free Software
  26.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  27.  *
  28.  * @package    Converters
  29.  * @subpackage PDFdefault
  30.  * @author     Greg Beaver <[email protected]>
  31.  * @copyright  2002-2006 Gregory Beaver
  32.  * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL
  33.  * @version    CVS: $Id: PDFdefaultConverter.inc,v 1.3 2006/04/30 22:18:14 cellog Exp $
  34.  * @filesource
  35.  * @link       http://www.phpdoc.org
  36.  * @link       http://pear.php.net/PhpDocumentor
  37.  * @since      1.2
  38.  */
  39. /**
  40.  * The Cezpdf class library
  41.  */
  42. include_once('phpDocumentor/Converters/PDF/default/class.phpdocpdf.php');
  43. /**
  44.  * PDF output converter.
  45.  * This Converter takes output from the {@link Parser} and converts it to PDF-ready output for use with {@link Cezpdf}.
  46.  * This is now beta code
  47.  *
  48.  * @package Converters
  49.  * @subpackage PDFdefault
  50.  * @author Greg Beaver <[email protected]>
  51.  * @since 1.1
  52.  * @version $Id: PDFdefaultConverter.inc,v 1.3 2006/04/30 22:18:14 cellog Exp $
  53.  * @todo Implement links to conflicts/inheritance
  54.  */
  55. {
  56.     /**
  57.      * default PDF Converter wants elements sorted by type as well as alphabetically
  58.      * @see Converter::$sort_page_contents_by_type
  59.      * @var boolean 
  60.      */
  61.     var $sort_absolutely_everything = true;
  62.     var $leftindex = array('classes' => false'pages' => false'functions' => false'defines' => false'globals' => false);
  63.     var $pagepackage_pagenums = array();
  64.     var $classpackage_pagenums = array();
  65.     /** @var string always PDF */
  66.     var $outputformat = 'PDF';
  67.     /** @var string always default */
  68.     var $name = 'default';
  69.     var $curpagepackage = false;
  70.     var $curclasspackage = false;
  71.     var $smarty_dir;
  72.     /**
  73.      * @var Cezpdf 
  74.      */
  75.     var $pdf = false;
  76.     var $ric_set = array();
  77.     /**
  78.      * Source files for appendix C are stored here
  79.      *
  80.      * Format: array(array(package => packagename, code => array(highlightedsource code 1, ...)))
  81.      * @var array 
  82.      */
  83.     var $_sourcecode;
  84.     /**
  85.      * @see Converter::Converter()
  86.      */
  87.     function PDFdefaultConverter(&$allp&$packp&$classes&$procpages$po$pp$qm$targetDir$templateDir$title)
  88.     {
  89.         Converter::Converter($allp$packp$classes$procpages$po$pp$qm$targetDir$templateDir$title);
  90.         $this->pdf =new phpdocpdf($this$this->getConverterDir(PATH_DELIMITER .'templates/fonts/','letter');
  91.         $this->pdf->selectFont($this->getConverterDir(PATH_DELIMITER .'templates/fonts/Helvetica.afm');
  92. // put a line top and bottom on all the pages
  93.         $this->pdf->ezSetMargins(50,70,50,50);
  94.         $template &$this->newSmarty();
  95.         $this->pdf->ezText($template->fetch('footer.tpl'));
  96.         $template->assign('title',$title);
  97.         if (file_exists($this->templateDir . 'templates' PATH_DELIMITER 'media'PATH_DELIMITER .'logo.jpg'))
  98.         {
  99.             $template->assign('logo',$this->templateDir . 'templates' PATH_DELIMITER 'media'PATH_DELIMITER .'logo.jpg');
  100.         }
  101.         $this->pdf->ezText($template->fetch('title_page.tpl'));
  102.         unset($template);
  103.     }
  104.     
  105.     function writeSource($path$value)
  106.     {
  107.         $templ &$this->newSmarty();
  108.         $pathinfo $this->proceduralpages->getPathInfo($path$this);
  109.         $templ->assign('source',$value);
  110.         $templ->assign('package',$pathinfo['package']);
  111.         $templ->assign('subpackage',$pathinfo['subpackage']);
  112.         $templ->assign('name',$pathinfo['name']);
  113.         $templ->assign('source_loc',$pathinfo['source_loc']);
  114.         $templ->assign('docs',$pathinfo['docs']);
  115.         $templ->assign('dest'$this->getFileSourceName($path));
  116.         $this->setSourcePaths($path);
  117.         $this->_sourcecode[$pathinfo['package']][$templ->fetch('filesource.tpl');
  118.     }
  119.     
  120.     function postProcess($text)
  121.     {
  122.         return htmlspecialchars($text);
  123.     }
  124.     
  125.     function writeExample($title$path$source)
  126.     {
  127.         $templ &$this->newSmarty();
  128.         $templ->assign('source',$source);
  129.         if (empty($title))
  130.         {
  131.             $title 'example';
  132.             addWarning(PDERROR_EMPTY_EXAMPLE_TITLE$path$title);
  133.         }
  134.         $templ->assign('title',$title);
  135.         $templ->assign('file',$path);
  136.         $this->pdf->ezText($templ->fetch('examplesource.tpl'));
  137.     }
  138.     
  139.     function getExampleLink($path$title)
  140.     {
  141.         return '';
  142.         return $this->returnLink('../__examplesource' PATH_DELIMITER 'exsource_'.$path.'.html',$title);
  143.     }
  144.     
  145.     function getSourceLink($path)
  146.     {
  147. //        var_dump(htmlentities('<c:ilink:'.$this->getFileSourceName($path).'>Source Code for this file</c:ilink>'));
  148.         return '<c:ilink:'.$this->getFileSourceName($path).'>Source Code for this file</c:ilink>';
  149.     }
  150.     
  151.     function getFileSourceName($path$anchor '')
  152.     {
  153.         return urlencode($anchor parent::getFileSourceName($path));
  154.     }
  155.     
  156.     /**
  157.      * Retrieve a Converter-specific anchor to a segment of a source code file
  158.      * parsed via a {@tutorial tags.filesource.pkg} tag.
  159.      * @param string full path to source file
  160.      * @param string name of anchor
  161.      * @param string link text, if this is a link
  162.      * @param boolean returns either a link or a destination based on this
  163.      *                 parameter
  164.      * @return string link to an anchor, or the anchor
  165.      */
  166.     function getSourceAnchor($sourcefile,$anchor,$text '',$link false)
  167.     {
  168.         if ($link)
  169.         {
  170.             return '<c:ilink:' $this->getFileSourceName($sourcefile$anchor)'>' $text '</c:ilink>';
  171.         else
  172.         {
  173.             return '</text><pdffunction:addDestination arg="'.$this->getFileSourceName($sourcefile$anchor).'" arg="FitH" arg=$this->y /><text size="8">';
  174.         }
  175.     }
  176.     
  177.     /**
  178.      * Returns a bookmark using Cezpdf 009
  179.      *
  180.      * @param abstractLink a descendant of abstractlink should be passed, and never text
  181.      * @param string text to display in the link
  182.      */
  183.     function returnSee(&$element$eltext false)
  184.     {
  185.         if (!$elementreturn false;
  186.         if (!$eltext)
  187.         {
  188.             $eltext '';
  189.             switch($element->type)
  190.             {
  191.                 case 'tutorial' :
  192.                 $eltext $element->title;
  193.                 break;
  194.                 case 'method' :
  195.                 case 'var' :
  196.                 case 'const' :
  197.                 $eltext .= $element->class.'::';
  198.                 case 'page' :
  199.                 case 'define' :
  200.                 case 'class' :
  201.                 case 'function' :
  202.                 case 'global' :
  203.                 default :
  204.                 $eltext .= $element->name;
  205.                 if ($element->type == 'function' || $element->type == 'method'$eltext .= '()';
  206.                 break;
  207.             }
  208.         }
  209.         switch ($element->type)
  210.         {
  211.             case 'tutorial' :
  212.             return '<c:ilink:'.urlencode($element->type.$element->package.$element->subpackage.$element->name.$element->section).'>'.$eltext.'</c:ilink>';
  213.             case 'page' :
  214.             return '<c:ilink:'.urlencode($element->type.$element->package.$element->path).'>'.$eltext.'</c:ilink>';
  215.             case 'define' :
  216.             case 'global' :
  217.             case 'class' :
  218.             case 'function' :
  219.             return '<c:ilink:'.urlencode($element->type.$element->package.$element->name).'>'.$eltext.'</c:ilink>';
  220.             case 'method' :
  221.             case 'var' :
  222.             case 'const' :
  223.             return '<c:ilink:'.urlencode($element->type.$element->package.$element->class.'::'.$element->name).'>'.$eltext.'</c:ilink>';
  224.         }
  225.         return $element;
  226.     }
  227.     
  228.     /**
  229.      * @param string 
  230.      * @param string 
  231.      * @return string <c:alink:$link>$text</c:alink>
  232.      */
  233.     function returnLink($link,$text)
  234.     {
  235.         return "<c:alink:$link>$text</c:alink>";
  236.     }
  237.     
  238.     /**
  239.      * Convert README/INSTALL/CHANGELOG file contents to output format
  240.      * @param README|INSTALL|CHANGELOG
  241.      * @param string contents of the file
  242.      */
  243.     function Convert_RIC($name$contents)
  244.     {
  245.         $this->ric_set[$name$contents;
  246.     }
  247.  
  248.     function convertDocBlock(&$element)
  249.     {
  250.         if (!$element->docblockreturn;
  251.         $template &$this->newSmarty();
  252.         
  253.         $nopackage true;
  254.         if ($element->type == 'page' || $element->type == 'class'$nopackage false;
  255.         $tagses $element->docblock->listTags();
  256.         $tags array();
  257.         $names array('staticvar' => 'Static Variable','deprec' => 'Deprecated','abstract' => 'Abstract Element','todo' => 'TODO');
  258.         if (!$nopackage)
  259.         {
  260.             $tags[array('keyword' => 'Package','data' => $element->docblock->package);
  261.             if (!empty($element->docblock->subpackage)) $tags[array('keyword' => 'Sub-Package','data' => $element->docblock->subpackage);
  262.         }
  263.         if ($element->docblock->var)
  264.         {
  265.             $a $element->docblock->var->Convert($this);
  266.             if (!empty($a))
  267.             $tags[array('keyword' => 'Var''data' => $a);
  268.         }
  269.         if ($element->docblock->funcglobals)
  270.         foreach($element->docblock->funcglobals as $global => $val)
  271.         {
  272.             if ($a $this->getGlobalLink($global,$element->docblock->package))
  273.             {
  274.                 $global $a;
  275.             }
  276.             $b Converter::getLink($val[0]);
  277.             if (is_object($b&& phpDocumentor_get_class($b== 'classlink')
  278.             {
  279.                 $val[0$this->returnSee($b);
  280.             }
  281.             $tags[array('keyword' => 'Global Variable Used','data' => $val[0].' '.$global.': '.$val[1]->Convert($this));
  282.         }
  283.         if ($element->docblock->statics)
  284.         foreach($element->docblock->statics as $static => $val)
  285.         {
  286.             $a $val->Convert($this);
  287.             $tags[array('keyword' => 'Static Variable Used','data' => $val->converted_returnType.' '.$static.': '.$a);
  288.         }
  289.         foreach($tagses as $tag)
  290.         {
  291.             if (isset($names[$tag->keyword])) $tag->keyword $names[$tag->keyword];
  292.             $tags[array("keyword" => ucfirst($tag->keyword),"data" => $tag->Convert($this));
  293.         }
  294.         $utags array();
  295.         foreach($element->docblock->unknown_tags as $keyword => $t)
  296.         {
  297.             foreach($t as $tag)
  298.             $utags[array('keyword' => $keyword'data' => $tag->Convert($this));
  299.         }
  300.         if ($element->type == 'packagepage'return;
  301.         $sdesc $element->docblock->getSDesc($this);
  302.         $desc $element->docblock->getDesc($this);
  303.         $template->assign('utags',$utags);
  304.         $template->assign('tags',$tags);
  305.         $template->assign('sdesc',$sdesc);
  306.         $template->assign('desc',$desc);
  307.         if (false// $element->type != 'page')
  308.         {
  309.             if ($element->type != 'var' && $element->type != 'method')
  310.             {
  311.                 $this->pdf->addDestination(urlencode($element->type.$element->docblock->package.$element->name),'FitH',$this->pdf->y);
  312.             else
  313.             {
  314.                 $this->pdf->addDestination(urlencode($element->type.$element->docblock->package.$element->class.'::'.$element->name),'FitH',$this->pdf->y);
  315.             }
  316.         elseif (false)
  317.         {
  318.             $this->pdf->addDestination(urlencode('page'.$element->parent->package.$element->parent->getPath()),'FitH',$this->pdf->y);
  319.         }
  320.         $this->convertParams($element);
  321.         $this->pdf->ezText($template->fetch('docblock.tpl'));
  322.     }
  323.     
  324.     function convertParams(&$element)
  325.     {
  326.         if ($element->type != 'function' && $element->type != 'method'return;
  327.         if (count($element->docblock->params))
  328.         {
  329.             $template &$this->newSmarty();
  330.             $params array();
  331.             if (count($element->docblock->params))
  332.             foreach($element->docblock->params as $param => $val)
  333.             {
  334.                 $a $val->Convert($this);
  335.                 $params[array("name" => $param,"type" => $val->converted_returnType,"description" => $a);
  336.             }
  337.             $template->assign('params',$params);
  338.             $this->pdf->ezText($template->fetch('params.tpl'));
  339.         }
  340.     }
  341.     
  342.     function convertGlobal(&$element)
  343.     {
  344.         $sdesc '';
  345.         if ($element->docblock->sdesc)
  346.         {
  347.             $sdesc $element->docblock->sdesc->Convert($this);
  348.         }
  349.         $template &$this->newSmarty();
  350.         $template->assign('linenumber',$element->getLineNumber());
  351.         if ($this->hasSourceCode($element->getPath()))
  352.         $template->assign('slink',$this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true));
  353.         else
  354.         $template->assign('slink'false);
  355.         $template->assign('dest'urlencode($element->type.$element->docblock->package.$element->name));
  356.         $template->assign('type',$element->getDataType($this));
  357.         $template->assign('name',$element->name);
  358.         $template->assign('value',$this->getGlobalValue($element->getValue()));
  359.         $template->assign('sdesc',$sdesc);
  360.         $this->pdf->ezText($template->fetch('global.tpl'));
  361.         $this->convertDocBlock($element);
  362.     }
  363.     
  364.     function getGlobalValue($value)
  365.     {
  366.         return parent::getGlobalValue(htmlspecialchars($value));
  367.     }
  368.     
  369.     function convertMethod(&$element)
  370.     {
  371.         $sdesc '';
  372.         if ($element->docblock->sdesc)
  373.         {
  374.             $sdesc $element->docblock->sdesc->Convert($this);
  375.         }
  376.         $params array();
  377.         if (count($element->docblock->params))
  378.         foreach($element->docblock->params as $param => $val)
  379.         {
  380.             $a $val->Convert($this);
  381.             $params[$paramarray("var" => $param,"datatype" => $val->converted_returnType,"data" => $a);
  382.         }
  383.         if ($element->docblock->return)
  384.         {
  385.             if (!$element->docblock->return->returnType$element->docblock->return->returnType 'void';
  386.         }
  387.         $template &$this->newSmarty();
  388.         $template->assign('class',$this->class);
  389.         $template->assign('constructor',$element->isConstructor);
  390.         $template->assign('dest'urlencode($element->type.$element->docblock->package.$element->class.'::'.$element->name));
  391.         $template->assign('linenumber',$element->getLineNumber());
  392.         if ($this->hasSourceCode($element->getPath()))
  393.         $template->assign('slink',$this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true));
  394.         else
  395.         $template->assign('slink',false);
  396.         $ret 'void';
  397.         if (isset($element->docblock->return))
  398.         {
  399.             $ret $element->docblock->return->returnType;
  400.         }
  401.         $template->assign('return',$ret);
  402.         $template->assign('functioncall',$element->getFunctionCall());
  403.         $template->assign('intricatefunctioncall',$element->getIntricateFunctionCall($this,$params));
  404.         $template->assign('sdesc',$sdesc);
  405.         $this->pdf->ezText($template->fetch('method.tpl'));
  406.         $this->convertDocBlock($element);
  407.     }
  408.     
  409.     function convertVar(&$element)
  410.     {
  411.         $sdesc '';
  412.         if ($element->docblock->sdesc)
  413.         {
  414.             $sdesc $element->docblock->sdesc->Convert($this);
  415.         }
  416.         $template &$this->newSmarty();
  417.         $template->assign('class',$this->class);
  418.         $template->assign('linenumber',$element->getLineNumber());
  419.         if ($this->hasSourceCode($element->getPath()))
  420.         $template->assign('slink',$this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true));
  421.         else
  422.         $template->assign('slink',false);
  423.         $template->assign('type',$element->docblock->var->returnType);
  424.         $template->assign('name',$element->name);
  425.         $template->assign('dest'urlencode($element->type.$element->docblock->package.$element->class.'::'.$element->name));
  426.         $template->assign('value',$element->value);
  427.         $template->assign('sdesc',$sdesc);
  428.         $this->pdf->ezText($template->fetch('var.tpl'));
  429.         $this->convertDocBlock($element);
  430.     }
  431.     
  432.     function convertConst(&$element)
  433.     {
  434.         $sdesc '';
  435.         if ($element->docblock->sdesc)
  436.         {
  437.             $sdesc $element->docblock->sdesc->Convert($this);
  438.         }
  439.         $template &$this->newSmarty();
  440.         $template->assign('class',$this->class);
  441.         $template->assign('linenumber',$element->getLineNumber());
  442.         if ($this->hasSourceCode($element->getPath()))
  443.         $template->assign('slink',$this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true));
  444.         else
  445.         $template->assign('slink',false);
  446.         $template->assign('name',$element->name);
  447.         $template->assign('dest'urlencode($element->type.$element->docblock->package.$element->class.'::'.$element->name));
  448.         $template->assign('value',$element->value);
  449.         $template->assign('sdesc',$sdesc);
  450.         $this->pdf->ezText($template->fetch('const.tpl'));
  451.         $this->convertDocBlock($element);
  452.     }
  453.     
  454.     function convertClass(&$element)
  455.     {
  456.         $template &$this->newSmarty();
  457.         if ($this->curclasspackage != $element->docblock->package)
  458.         {
  459.             $template->assign('includeheader',true);
  460.             if (isset($this->package_pages[$element->docblock->package]))
  461.             {
  462.                 $template->assign('ppage',$this->package_pages[$element->docblock->package]);
  463.                 $template->assign('isclass',true);
  464.                 unset($this->package_pages[$element->docblock->package]);
  465.             }
  466.             $template->assign('classeslink',rawurlencode("Package ".$element->docblock->package." Classes"));
  467.         }
  468.         $sdesc '';
  469.         if ($element->docblock->sdesc)
  470.         {
  471.             $sdesc $element->docblock->sdesc->Convert($this);
  472.         }
  473.         $this->curclasspackage = $element->docblock->package;
  474.         $template->assign('dest'urlencode($element->type.$element->docblock->package.$element->name));
  475.         $template->assign('package',$element->docblock->package);
  476.         $template->assign('linenumber',$element->getLineNumber());
  477.         if ($this->hasSourceCode($element->getPath()))
  478.         $template->assign('slink',$this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true));
  479.         else
  480.         $template->assign('slink',false);
  481.         $template->assign('name',$element->name);
  482.         $template->assign('sdesc',$sdesc);
  483.         $this->pdf->ezText($template->fetch('class.tpl'));
  484.         $this->convertDocBlock($element);
  485.     }
  486.     
  487.     function convertInclude(&$element)
  488.     {
  489.         $template &$this->newSmarty();
  490.         $template->assign('linenumber',$element->getLineNumber());
  491.         if ($this->hasSourceCode($element->getPath()))
  492.         $template->assign('slink',$this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true));
  493.         else
  494.         $template->assign('slink',false);
  495.         $template->assign('name',$element->name);
  496.         $template->assign('value',$this->getIncludeValue($element->getValue()$element->getPath()));
  497.         $this->pdf->ezText($template->fetch('include.tpl'));
  498.         $this->convertDocBlock($element);
  499.     }
  500.     
  501.     function convertFunction(&$element)
  502.     {
  503.         $sdesc '';
  504.         if ($element->docblock->sdesc)
  505.         {
  506.             $sdesc $element->docblock->sdesc->Convert($this);
  507.         }
  508.         $params array();
  509.         if (count($element->docblock->params))
  510.         foreach($element->docblock->params as $param => $val)
  511.         {
  512.             $a $val->Convert($this);
  513.             $params[$paramarray("var" => $param,"datatype" => $val->converted_returnType,"data" => $a);
  514.         }
  515.         if ($element->docblock->return)
  516.         {
  517.             if (!$element->docblock->return->returnType$element->docblock->return->returnType 'void';
  518.         }
  519.         $template &$this->newSmarty();
  520.         $template->assign('dest'urlencode($element->type.$element->docblock->package.$element->name));
  521.         $template->assign('linenumber',$element->getLineNumber());
  522.         if ($this->hasSourceCode($element->getPath()))
  523.         $template->assign('slink',$this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true));
  524.         else
  525.         $template->assign('slink',false);
  526.         $template->assign('return',$element->docblock->return->returnType);
  527.         $template->assign('functioncall',$element->getFunctionCall());
  528.         $template->assign('intricatefunctioncall',$element->getIntricateFunctionCall($this,$params));
  529.         $template->assign('sdesc',$sdesc);
  530.         $this->pdf->ezText($template->fetch('function.tpl'));
  531.         $this->convertDocBlock($element);
  532.     }
  533.     
  534.     function convertDefine(&$element)
  535.     {
  536.         $sdesc '';
  537.         if ($element->docblock->sdesc)
  538.         {
  539.             $sdesc $element->docblock->sdesc->Convert($this);
  540.         }
  541.         $template &$this->newSmarty();
  542.         $template->assign('linenumber',$element->getLineNumber());
  543.         if ($this->hasSourceCode($element->getPath()))
  544.         $template->assign('slink',$this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true));
  545.         else
  546.         $template->assign('slink',false);
  547.         $template->assign('name',$element->name);
  548.         $template->assign('dest'urlencode($element->type.$element->docblock->package.$element->name));
  549.         $template->assign('value',$element->value);
  550.         $template->assign('sdesc',$sdesc);
  551.         $this->pdf->ezText($template->fetch('define.tpl'));
  552.         $this->convertDocBlock($element);
  553.     }
  554.     
  555.     function convertPage(&$element)
  556.     {
  557.         $template &$this->newSmarty();
  558.         $template->assign('includeheader',false);
  559.         $sdesc '';
  560.         if ($element->docblock->sdesc)
  561.         {
  562.             $sdesc $element->docblock->sdesc->Convert($this);
  563.         }
  564.         if (count($element->elements|| ($sdesc|| count($element->docblock->tags))
  565.         {
  566.             if ($this->curpagepackage != $element->parent->package)
  567.             {
  568.                 $template->assign('includeheader',true);
  569.                 if (isset($this->package_pages[$element->parent->package]))
  570.                 {
  571.                     $template->assign('ppage',$this->package_pages[$element->parent->package]);
  572.                     unset($this->package_pages[$element->parent->package]);
  573.                 }
  574.             }
  575.             $this->curpagepackage = $element->parent->package;
  576.             $template->assign('dest'urlencode('page'.$element->parent->package.$element->parent->getPath()));
  577.             $template->assign('sdesc',$sdesc);
  578.             $template->assign('package',$element->parent->package);
  579.             $template->assign('name',$element->parent->file);
  580.             $this->pdf->ezText($template->fetch('page.tpl'));
  581.             $this->convertDocBlock($element);
  582.         }
  583.     }
  584.     
  585.         
  586.     /**
  587.      * Used to translate an XML DocBook tag from a tutorial by reading the
  588.      * options.ini file for the template.
  589.      * @param string tag name
  590.      * @param string any attributes Format: array(name => value)
  591.      * @param string the tag contents, if any
  592.      * @param string the tag contents, if any, unpost-processed
  593.      * @return string 
  594.      */
  595.     function TranslateTag($name,$attr,$cdata,$unconvertedcdata)
  596.     {
  597.         if ($name == 'example' && @$attr['role'== 'html')
  598.         {
  599.             $cdata htmlspecialchars($cdata);
  600.             $unconvertedcdata htmlspecialchars($unconvertedcdata);
  601.         }
  602.         if ($name == 'programlisting' && @$attr['role'== 'php')
  603.         {
  604.             $unconvertedcdata strtr($unconvertedcdataarray_flip(get_html_translation_table(HTML_SPECIALCHARS)));
  605.             $a parent::TranslateTag($name$attr$cdata$unconvertedcdata);
  606. //            var_dump(htmlspecialchars($cdata), htmlspecialchars($unconvertedcdata), htmlspecialchars($a));
  607.             return $a;
  608.         }
  609.         return parent::TranslateTag($name$attr$cdata$unconvertedcdata);
  610.     }
  611.  
  612.     function getPageName(&$element)
  613.     {
  614.         if (phpDocumentor_get_class($element== 'parserpage'return $element->getName();
  615.         return $element->parent->getName();
  616.     }
  617.  
  618.     function getTutorialId($package,$subpackage,$tutorial,$id)
  619.     {
  620.         return 'tutorial'.$package.$subpackage.$tutorial.$id;
  621.     }
  622.     
  623.     function getCData($value)
  624.     {
  625.         return str_replace(array('<c:','<C:'),array("&lt;c:","&lt;C:"),$value);
  626.     }
  627.     
  628.     /**
  629.      * @deprecated html package pages just don't work with PDF, use {@tutorial tutorials.pkg}
  630.      */
  631.     function convertPackagepage(&$element)
  632.     {
  633.         $x $element->Convert($this);
  634.         $x substr($x,strpos($x,'<body'));
  635.         $this->package_pages[$element->packagetrim(substr($x,strpos($x,'>'1,strpos($x,'</body>'6));
  636.     }
  637.     
  638.     function convertTutorial(&$element)
  639.     {
  640.         $x $element->Convert($thistrue);
  641.         $template &$this->newSmarty();
  642.         $template->assign('package',$element->package);
  643.         $template->assign('subpackage',$element->subpackage);
  644.         $template->assign('contents',$x);
  645.         $template->assign('title',$element->getTitle($this));
  646.         $template->assign('child',$element->parent);
  647.         if (isset($element->parent->parent)) $template->assign('hasparent',$element->parent->parent);
  648.         $template->assign('element',$element);
  649.         $this->pdf->ezText($template->fetch('tutorial.tpl'));
  650.     }
  651.     
  652.     /**
  653.      * returns a template-enabled array of class trees
  654.      * 
  655.      * @param    string    $package    package to generate a class tree for
  656.      * @see $roots, getRootTree()
  657.      */
  658.     function generateFormattedClassTrees($package)
  659.     {
  660.         if (!isset($this->roots[$package])) return array();
  661.         $roots $trees array();
  662.         $roots $this->roots[$package];
  663.         for($i=0;$i<count($roots);$i++)
  664.         {
  665.             $trees[array('class' => $roots[$i],'class_tree' => "<ul>\n".$this->getRootTree($this->getSortedClassTreeFromClass($roots[$i],$package,''),$package)."</ul>\n");
  666.         }
  667.         return $trees;
  668.     }
  669.     
  670.     /**
  671.      * return formatted class tree for the Class Trees page
  672.      *
  673.      * @param array $tree output from {@link getSortedClassTreeFromClass()}
  674.      * @see Classes::$definitechild, generateFormattedClassTrees()
  675.      * @return string 
  676.      */
  677.     function getRootTree($tree,$package)
  678.     {
  679.         if (!$treereturn '';
  680.         $my_tree '';
  681.         $cur '#root';
  682.         $lastcur array(false);
  683.         $kids array();
  684.         $dopar false;
  685.         if ($tree[$cur]['parent'])
  686.         {
  687.             $dopar true;
  688.             if (!is_object($tree[$cur]['parent']))
  689.             {
  690. //                debug("parent ".$tree[$cur]['parent']." not found");
  691.                 $my_tree .= '<li>' $tree[$cur]['parent'.'<ul>';
  692.             }
  693.             else
  694.             {
  695. //                        debug("parent ".$this->returnSee($tree[$cur]['parent'], false, false)." in other package");
  696.                 $my_tree .= '<li>' $this->returnSee($tree[$cur]['parent']falsefalse);
  697.                 if ($tree[$cur]['parent']->package != $package$my_tree .= ' <b>(Different package)</b><ul>';
  698.             }
  699.         }
  700.         do
  701.         {
  702. //            fancy_debug($cur,$lastcur,$kids);
  703.             if (count($tree[$cur]['children']))
  704.             {
  705. //                debug("$cur has children");
  706.                 if (!isset($kids[$cur]))
  707.                 {
  708. //                    debug("set $cur kids");
  709.                     $kids[$cur1;
  710.                     $my_tree .= '<li>'.$this->returnSee($tree[$cur]['link']falsefalse);
  711.                     $my_tree .= '<ul>'."\n";
  712.                 }
  713.                 array_push($lastcur,$cur);
  714.                 list(,$cureach($tree[$cur]['children']);
  715. //                var_dump('listed',$cur);
  716.                 if ($cur)
  717.                 {
  718.                     $cur $cur['package''#' $cur['class'];
  719. //                    debug("set cur to child $cur");
  720. //                    $my_tree .= '<li>'.$this->returnSee($tree[$cur]['link'], false, false);
  721.                     continue;
  722.                 else
  723.                 {
  724. //                    debug("end of children for $cur");
  725.                     $cur array_pop($lastcur);
  726.                     $cur array_pop($lastcur);
  727.                     $my_tree .= '</ul></li>'."\n";
  728.                     if ($dopar && ($cur == '#root' || !$cur)) $my_tree .= '</ul></li>';
  729.                 }
  730.             else 
  731.             {
  732. //                debug("$cur has no children");
  733.                 $my_tree .= '<li>'.$this->returnSee($tree[$cur]['link']falsefalse)."</li>";
  734.                 if ($dopar && $cur == '#root'$my_tree .= '</ul></li>';
  735.                 $cur array_pop($lastcur);
  736.             }
  737.         while ($cur);
  738.         return $my_tree;
  739.     }
  740.     
  741.     /**
  742.      * calls {@link Cezpdf::ezOutput()} and writes documentation.pdf to targetDir
  743.      */
  744.     function Output($title 'Generated Documentation')
  745.     {
  746.         phpDocumentor_out("Generating PDF file..");
  747.         flush();
  748.         $template &$this->newSmarty();
  749.         $this->pdf->ezText($template->fetch('appendix_title_page.tpl'));
  750.         $trees array();
  751.         foreach($this->all_packages as $package => $rest)
  752.         {
  753.             if (!isset($this->pkg_elements[$package])) continue;
  754.             $a array();
  755.             phpDocumentor_out('.');
  756.             flush();
  757.             $a['package'$package;
  758.             $a["trees"$this->generateFormattedClassTrees($package);
  759.             $trees[$a;
  760.         }
  761.         $template->assign('trees',$trees);
  762.         $this->pdf->ezText($template->fetch('classtree.tpl'));
  763.         phpDocumentor_out('.');
  764.         if (count($this->ric_set))
  765.         $this->pdf->ezText($template->fetch('ric_title_page.tpl'));
  766.         foreach($this->ric_set as $name => $contents)
  767.         {
  768.             $template->assign('contents',$contents);
  769.             $template->assign('name',$name);
  770.             $this->pdf->ezText($template->fetch('ric.tpl'));
  771.         }
  772.         if (count($this->_sourcecode))
  773.         {
  774.             $this->pdf->ezText($template->fetch('source_title_page.tpl'));
  775.             $template->assign('source',$this->_sourcecode);
  776.             $this->pdf->ezText($template->fetch('source_loop.tpl'));
  777.         }
  778.         flush();
  779.         if (count($this->todoList))
  780.         {
  781.             $todolist array();
  782.             foreach($this->todoList as $package => $alltodos)
  783.             {
  784.                 foreach($alltodos as $todos)
  785.                 {
  786.                     $converted array();
  787.                     $converted['link'$this->returnSee($todos[0]);
  788.                     if (!is_array($todos[1]))
  789.                     {
  790.                         $converted['todos'][$todos[1]->Convert($this);
  791.                     else
  792.                     {
  793.                         foreach($todos[1as $todo)
  794.                         {
  795.                             $converted['todos'][$todo->Convert($this);
  796.                         }
  797.                     }
  798.                     $todolist[$package][$converted;
  799.                 }
  800.             }
  801.             $template->assign('todos',$todolist);
  802.             
  803.             $this->pdf->ezText($template->fetch('todolist.tpl'));
  804.         }
  805.         if (false{
  806.         $fp @fopen("C:/Documents and Settings/Owner/Desktop/pdfsourceorig.txt",'w');
  807.         if ($fp)
  808.         {
  809.             $a $this->pdf->ezOutput(true)// debug
  810.             fwrite($fp$astrlen($a));
  811.             fclose($fp);
  812.         }
  813.         }
  814.         $this->pdf->setupTOC();
  815.         $template->assign('contents',$this->pdf->reportContents);
  816.         $this->pdf->ezText($template->fetch('toc.tpl'));
  817.         $x $this->pdf->ezOutput(false$template);
  818.         phpDocumentor_out("done\n");
  819.         flush();
  820.         $this->writeFile("documentation.pdf"$xtrue);
  821.     }
  822.     
  823.     function mystrnatcasecmp($a,$b)
  824.     {
  825.         return strnatcasecmp($a[0],$b[0]);
  826.     }
  827.     
  828.     
  829.     /**
  830.      * @param string name of class
  831.      * @param string package name
  832.      * @param string full path to look in (used in index generation)
  833.      * @return mixed false if not found, or an html a link to the class's documentation
  834.      * @see parent::getClassLink()
  835.      */
  836.     function getClassLink($expr,$package$file false,$text false)
  837.     {
  838.         $a Converter::getClassLink($expr,$package,$file);
  839.         if (!$areturn false;
  840.         return $this->returnSee($a$text);
  841.     }
  842.  
  843.     /**
  844.      * @param string name of function
  845.      * @param string package name
  846.      * @param string full path to look in (used in index generation)
  847.      * @param boolean deprecated
  848.      * @return mixed false if not found, or an html a link to the function's documentation
  849.      * @see parent::getFunctionLink()
  850.      */
  851.     function getFunctionLink($expr,$package$file false,$text false)
  852.     {
  853.         $a Converter::getFunctionLink($expr,$package,$file);
  854.         if (!$areturn false;
  855.         return $this->returnSee($a$text);
  856.     }
  857.  
  858.     /**
  859.      * @param string name of define
  860.      * @param string package name
  861.      * @param string full path to look in (used in index generation)
  862.      * @param boolean deprecated
  863.      * @return mixed false if not found, or an html a link to the define's documentation
  864.      * @see parent::getDefineLink()
  865.      */
  866.     function getDefineLink($expr,$package$file false,$text false)
  867.     {
  868.         $a Converter::getDefineLink($expr,$package,$file);
  869.         if (!$areturn false;
  870.         return $this->returnSee($a$text);
  871.     }
  872.  
  873.     /**
  874.      * @param string name of global variable
  875.      * @param string package name
  876.      * @param string full path to look in (used in index generation)
  877.      * @param boolean deprecated
  878.      * @return mixed false if not found, or an html a link to the global variable's documentation
  879.      * @see parent::getGlobalLink()
  880.      */
  881.     function getGlobalLink($expr,$package$file false,$text false)
  882.     {
  883.         $a Converter::getGlobalLink($expr,$package,$file);
  884.         if (!$areturn false;
  885.         return $this->returnSee($a$text);
  886.     }
  887.  
  888.     /**
  889.      * @param string name of procedural page
  890.      * @param string package name
  891.      * @param string full path to look in (used in index generation)
  892.      * @param boolean deprecated
  893.      * @return mixed false if not found, or an html a link to the procedural page's documentation
  894.      * @see parent::getPageLink()
  895.      */
  896.     function getPageLink($expr,$package$path false,$text false)
  897.     {
  898.         $a Converter::getPageLink($expr,$package,$path);
  899.         if (!$areturn false;
  900.         return $this->returnSee($a$text);
  901.     }
  902.  
  903.     /**
  904.      * @param string name of method
  905.      * @param string class containing method
  906.      * @param string package name
  907.      * @param string full path to look in (used in index generation)
  908.      * @param boolean deprecated
  909.      * @return mixed false if not found, or an html a link to the method's documentation
  910.      * @see parent::getMethodLink()
  911.      */
  912.     function getMethodLink($expr,$class,$package$file false,$text false)
  913.     {
  914.         $a Converter::getMethodLink($expr,$class,$package,$file);
  915.         if (!$areturn false;
  916.         return $this->returnSee($a$text);
  917.     }
  918.  
  919.     /**
  920.      * @param string name of var
  921.      * @param string class containing var
  922.      * @param string package name
  923.      * @param string full path to look in (used in index generation)
  924.      * @param boolean deprecated
  925.      * @param boolean return just the URL, or enclose it in an html a tag
  926.      * @return mixed false if not found, or an html a link to the var's documentation
  927.      * @see parent::getVarLink()
  928.      */
  929.     function getVarLink($expr,$class,$package$file false,$text false)
  930.     {
  931.         $a Converter::getVarLink($expr,$class,$package,$file);
  932.         if (!$areturn false;
  933.         return $this->returnSee($a$text);
  934.     }
  935.  
  936.     /**
  937.      * @param string name of class constant
  938.      * @param string class containing class constant
  939.      * @param string package name
  940.      * @param string full path to look in (used in index generation)
  941.      * @param boolean deprecated
  942.      * @param boolean return just the URL, or enclose it in an html a tag
  943.      * @return mixed false if not found, or an html a link to the var's documentation
  944.      * @see parent::getConstLink()
  945.      */
  946.     function getConstLink($expr,$class,$package$file false,$text false)
  947.     {
  948.         $a Converter::getConstLink($expr,$class,$package,$file);
  949.         if (!$areturn false;
  950.         return $this->returnSee($a$text);
  951.     }
  952.  
  953.     function setTemplateDir($dir)
  954.     {
  955.         Converter::setTemplateDir($dir);
  956.         $this->smarty_dir = $this->templateDir;
  957.     }
  958.     
  959.     /** @return always the same */
  960.     function getState()
  961.     {
  962.         return 1;
  963.     }
  964.     
  965.     /**
  966.      * @see parent::unmangle()
  967.      */
  968.     function unmangle($notused,$source)
  969.     {
  970. //        $source = str_replace("\n","<mybr>",$source);
  971.         return $source;
  972.     }
  973. }
  974. ?>

Documentation generated on Tue, 24 Oct 2006 09:25:26 -0500 by phpDocumentor 1.3.1