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

Source for file HTMLSmartyConverter.inc

Documentation is available at HTMLSmartyConverter.inc

  1. <?php
  2. /**
  3.  * HTML output converter for Smarty Template.
  4.  * This Converter takes output from the {@link Parser} and converts it to HTML-ready output for use with {@link Smarty}.
  5.  *
  6.  * phpDocumentor :: automatic documentation generator
  7.  * 
  8.  * PHP versions 4 and 5
  9.  *
  10.  * Copyright (c) 2000-2006 Joshua Eichorn, Gregory Beaver
  11.  * 
  12.  * LICENSE:
  13.  * 
  14.  * This library is free software; you can redistribute it
  15.  * and/or modify it under the terms of the GNU Lesser General
  16.  * Public License as published by the Free Software Foundation;
  17.  * either version 2.1 of the License, or (at your option) any
  18.  * later version.
  19.  * 
  20.  * This library is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  23.  * Lesser General Public License for more details.
  24.  * 
  25.  * You should have received a copy of the GNU Lesser General Public
  26.  * License along with this library; if not, write to the Free Software
  27.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  28.  *
  29.  * @package    Converters
  30.  * @subpackage HTMLframes
  31.  * @author     Joshua Eichorn <jeichorn@phpdoc.org>
  32.  * @author     Greg Beaver <cellog@php.net>
  33.  * @copyright  2000-2006 Joshua Eichorn, Gregory Beaver
  34.  * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL
  35.  * @version    CVS: $Id: HTMLSmartyConverter.inc 234145 2007-04-19 20:20:57Z ashnazg $
  36.  * @filesource
  37.  * @link       http://www.phpdoc.org
  38.  * @link       http://pear.php.net/PhpDocumentor
  39.  * @see        parserDocBlock, parserInclude, parserPage, parserClass
  40.  * @see        parserDefine, parserFunction, parserMethod, parserVar
  41.  * @since      1.0rc1
  42.  */
  43. /**
  44.  * HTML output converter.
  45.  * This Converter takes output from the {@link Parser} and converts it to HTML-ready output for use with {@link Smarty}.
  46.  *
  47.  * @package Converters
  48.  * @subpackage HTMLSmarty
  49.  * @see parserDocBlock, parserInclude, parserPage, parserClass, parserDefine, parserFunction, parserMethod, parserVar
  50.  * @author Greg Beaver <cellog@php.net>
  51.  * @since 1.0rc1
  52.  * @version $Revision: 234145 $
  53.  */
  54. class HTMLSmartyConverter extends Converter
  55. {
  56.     /**
  57.      * This converter knows about the new root tree processing
  58.      * In order to fix PEAR Bug #6389
  59.      * @var boolean 
  60.      */
  61.     var $processSpecialRoots = true;
  62.     /**
  63.      * Smarty Converter wants elements sorted by type as well as alphabetically
  64.      * @see Converter::$sort_page_contents_by_type
  65.      * @var boolean 
  66.      */
  67.     var $sort_page_contents_by_type = true;
  68.     /** @var string */
  69.     var $outputformat = 'HTML';
  70.     /** @var string */
  71.     var $name = 'Smarty';
  72.     /**
  73.      * indexes of elements by package that need to be generated
  74.      * @var array 
  75.      */
  76.     var $leftindex = array('classes' => true'pages' => true'functions' => true'defines' => false'globals' => false);
  77.    
  78.     /**
  79.      * output directory for the current procedural page being processed
  80.      * @var string 
  81.      */
  82.     var $page_dir;
  83.    
  84.     /**
  85.      * target directory passed on the command-line.
  86.      * {@link $targetDir} is malleable, always adding package/ and package/subpackage/ subdirectories onto it.
  87.      * @var string 
  88.      */
  89.     var $base_dir;
  90.    
  91.     /**
  92.      * output directory for the current class being processed
  93.      * @var string 
  94.      */
  95.     var $class_dir;
  96.    
  97.     /**
  98.      * array of converted package page names.
  99.      * Used to link to the package page in the left index
  100.      * @var array Format: array(package => 1)
  101.      */
  102.     var $package_pages = array();
  103.    
  104.     /**
  105.      * controls formatting of parser informative output
  106.      * 
  107.      * Converter prints:
  108.      * "Converting /path/to/file.php... Procedural Page Elements... Classes..."
  109.      * Since HTMLdefaultConverter outputs files while converting, it needs to send a \n to start a new line.  However, if there
  110.      * is more than one class, output is messy, with multiple \n's just between class file output.  This variable prevents that
  111.      * and is purely cosmetic
  112.      * @var boolean 
  113.      */
  114.     var $juststarted = false;
  115.    
  116.     /**
  117.      * contains all of the template procedural page element loop data needed for the current template
  118.      * @var array 
  119.      */
  120.     var $current;
  121.    
  122.     /**
  123.      * contains all of the template class element loop data needed for the current template
  124.      * @var array 
  125.      */
  126.     var $currentclass;
  127.     var $wrote = false;
  128.     var $ric_set = array();
  129.    
  130.     /**
  131.      * sets {@link $base_dir} to $targetDir
  132.      * @see Converter()
  133.      */
  134.    
  135.     /**#@+
  136.      * @access private
  137.      */
  138.     var $_classleft_cache false;
  139.     var $_classcontents_cache false;
  140.     var $_pagecontents_cache false;
  141.     var $_pageleft_cache false;
  142.     var $_done_package_index false;
  143.     var $_ric_done false;
  144.     var $_wrote_tdir false;
  145.     var $ric_contents array();
  146.     /**#@-*/
  147.    
  148.     function HTMLSmartyConverter(&$allp&$packp&$classes&$procpages$po$pp$qm$targetDir$templateDir$title)
  149.     {
  150.         Converter::Converter($allp$packp$classes$procpages,$po$pp$qm$targetDir$templateDir$title);
  151.         $this->base_dir = $targetDir;
  152.     }
  153.    
  154.     function writeSource($path$value)
  155.     {
  156.         $templ &$this->newSmarty();
  157.         $pathinfo $this->proceduralpages->getPathInfo($path$this);
  158.         $templ->assign('source',$value);
  159.         $templ->assign('package',$pathinfo['package']);
  160.         $templ->assign('subpackage',$pathinfo['subpackage']);
  161.         $templ->assign('name',$pathinfo['name']);
  162.         $templ->assign('source_loc',$pathinfo['source_loc']);
  163.         $templ->assign('docs',$pathinfo['docs']);
  164.         $templ->assign("subdir",'../');
  165.         $templ->register_outputfilter('HTMLSmarty_outputfilter');
  166.         $this->setTargetDir($this->getFileSourcePath($this->base_dir));
  167.         phpDocumentor_out("\n");
  168.         $this->setSourcePaths($path);
  169.         $this->writefile($this->getFileSourceName($path).'.html',$templ->fetch('filesource.tpl'));
  170.     }
  171.    
  172.     function writeExample($title$path$source)
  173.     {
  174.         $templ &$this->newSmarty();
  175.         $templ->assign('source',$source);
  176.         if (empty($title))
  177.         {
  178.             $title 'example';
  179.             addWarning(PDERROR_EMPTY_EXAMPLE_TITLE$path$title);
  180.         }
  181.         $templ->assign('title',$title);
  182.         $templ->assign('file',$path);
  183.         $templ->assign("subdir",'../');
  184.         $templ->register_outputfilter('HTMLSmarty_outputfilter');
  185.         $this->setTargetDir($this->base_dir . PATH_DELIMITER '__examplesource');
  186.         phpDocumentor_out("\n");
  187.         $this->writefile('exsource_'.$path.'.html',$templ->fetch('examplesource.tpl'));
  188.     }
  189.  
  190.     function getExampleLink($path$title)
  191.     {
  192.         return $this->returnLink('../__examplesource' PATH_DELIMITER 'exsource_'.$path.'.html',$title);
  193.     }
  194.    
  195.     function getSourceLink($path)
  196.     {
  197.         return $this->returnLink('../__filesource/' .
  198.         $this->getFileSourceName($path).'.html','Source Code for this file');
  199.     }
  200.  
  201.     /**
  202.      * Retrieve a Converter-specific anchor to a segment of a source code file
  203.      * parsed via a {@tutorial tags.filesource.pkg} tag.
  204.      * @param string full path to source file
  205.      * @param string name of anchor
  206.      * @param string link text, if this is a link
  207.      * @param boolean returns either a link or a destination based on this
  208.      *                 parameter
  209.      * @return string link to an anchor, or the anchor
  210.      */
  211.     function getSourceAnchor($sourcefile,$anchor,$text '',$link false)
  212.     {
  213.         if ($link{
  214.             return $this->returnLink('../__filesource/' .
  215.                 $this->getFileSourceName($sourcefile'.html#a' $anchor$text);
  216.         else {
  217.             return '<a name="a'.$anchor.'"></a>';
  218.         }
  219.     }
  220.  
  221.     /**
  222.      * Return a line of highlighted source code with formatted line number
  223.      *
  224.      * If the $path is a full path, then an anchor to the line number will be
  225.      * added as well
  226.      * @param integer line number
  227.      * @param string highlighted source code line
  228.      * @param false|stringfull path to @filesource file this line is a part of,
  229.      *         if this is a single line from a complete file.
  230.      * @return string formatted source code line with line number
  231.      */
  232.     function sourceLine($linenumber$line$path false)
  233.     {
  234.         $extra '';
  235.         if (strlen(str_replace("\n"''$line)) == 0{
  236.             $extra '&nbsp;';
  237.         }
  238.         if ($path)
  239.         {
  240.             return '<li><div class="src-line">' $this->getSourceAnchor($path$linenumber.
  241.                    str_replace("\n",'',$line$extra .
  242.                    "</div></li>\n";
  243.         else
  244.         {
  245.             return '<li><div class="src-line">' str_replace("\n",'',$line"$extra</div></li>\n";
  246.         }
  247.     }
  248.    
  249.     /**
  250.      * Used to convert the <<code>> tag in a docblock
  251.      * @param string 
  252.      * @param boolean 
  253.      * @return string 
  254.      */
  255.     function ProgramExample($example$tutorial false$inlinesourceparse null/*false*/,
  256.                             $class null/*false*/$linenum null/*false*/$filesourcepath null/*false*/)
  257.     {
  258.         $trans $this->template_options['desctranslate'];
  259.         $this->template_options['desctranslate'array();
  260.         $example '<ol>' parent::ProgramExample($example$tutorial$inlinesourceparse$class$linenum$filesourcepath)
  261.                .'</ol>';
  262.         $this->template_options['desctranslate'$trans;
  263.         if (!isset($this->template_options['desctranslate'])) return $example;
  264.         if (!isset($this->template_options['desctranslate']['code'])) return $example;
  265.         $example $this->template_options['desctranslate']['code'$example;
  266.         if (!isset($this->template_options['desctranslate']['/code'])) return $example;
  267.         return $example $this->template_options['desctranslate']['/code'];
  268.     }
  269.    
  270.     /**
  271.      * @param string 
  272.      */
  273.     function TutorialExample($example)
  274.     {
  275.         $trans $this->template_options['desctranslate'];
  276.         $this->template_options['desctranslate'array();
  277.         $example '<ol>' parent::TutorialExample($example)
  278.                .'</ol>';
  279.         $this->template_options['desctranslate'$trans;
  280.         if (!isset($this->template_options['desctranslate'])) return $example;
  281.         if (!isset($this->template_options['desctranslate']['code'])) return $example;
  282.         $example $this->template_options['desctranslate']['code'$example;
  283.         if (!isset($this->template_options['desctranslate']['/code'])) return $example;
  284.         return $example $this->template_options['desctranslate']['/code'];
  285.     }
  286.    
  287.     function getCurrentPageLink()
  288.     {
  289.         return $this->curname '.html';
  290.     }
  291.  
  292.     function unmangle($sourcecode)
  293.     {
  294.         $sourcecode str_replace('&nbsp;',' ',$sourcecode);
  295.         $sourcecode str_replace('&amp;','&',$sourcecode);
  296.         $sourcecode str_replace('<br />',"<br>",$sourcecode);
  297.         $sourcecode str_replace('<code>','<pre>',$sourcecode);
  298.         $sourcecode str_replace('</code>','</pre>',$sourcecode);
  299.         $sourcecode str_replace('&lt;','<',$sourcecode);
  300.         $sourcecode str_replace('&gt;','>',$sourcecode);
  301.         return $sourcecode;
  302.     }
  303.    
  304.     /**
  305.      * Uses htmlspecialchars() on the input
  306.      */
  307.     function postProcess($text)
  308.     {
  309.         if ($this->highlightingSource{
  310.             return str_replace(array(' ',"\t")array('&nbsp;''&nbsp;&nbsp;&nbsp;'),
  311.                 htmlspecialchars($text));
  312.         }
  313.         return htmlspecialchars($text);
  314.     }
  315.    
  316.     /**
  317.      * Use the template tutorial_toc.tpl to generate a table of contents for HTML
  318.      * @return string table of contents formatted for use in the current output format
  319.      * @param array format: array(array('tagname' => section, 'link' => returnsee link, 'id' => anchor name, 'title' => from title tag),...)
  320.      */
  321.     function formatTutorialTOC($toc)
  322.     {
  323.         $template &$this->newSmarty();
  324.         $template->assign('toc',$toc);
  325.         return $template->fetch('tutorial_toc.tpl');
  326.     }
  327.    
  328.     function &SmartyInit(&$templ)
  329.     {
  330.         $this->makeLeft();
  331.         $templ->assign("ric",$this->ric_set);
  332.         $templ->assign("packageindex",$this->package_index);
  333.         $templ->assign('hastodos',count($this->todoList));
  334.         $templ->assign('todolink','todolist.html');
  335.         $templ->assign("subdir",'');
  336.         return $templ;
  337.     }
  338.    
  339.     /**
  340.      * Writes out the template file of {@link $class_data} and unsets the template to save memory
  341.      * @see registerCurrentClass()
  342.      * @see parent::endClass()
  343.      */
  344.     function endClass()
  345.     {
  346.         $a '../';
  347.         if (!empty($this->subpackage)) $a .= '../';
  348.         if ($this->juststarted)
  349.         {
  350.             $this->juststarted = false;
  351.             phpDocumentor_out("\n");
  352.             flush();
  353.         }
  354.         $this->setTargetDir($this->base_dir . PATH_DELIMITER $this->class_dir);
  355.         $classleft $this->getClassLeft();
  356.         $this->class_data->assign("compiledfileindex",$this->getPageLeft());
  357.         $this->class_data->assign("compiledclassindex",$classleft['class']);
  358.         $this->class_data->assign("compiledinterfaceindex",$classleft['interface']);
  359.         $this->class_data->assign("tutorials",$this->getTutorialList());
  360.         $this->class_data->assign("contents",$this->getClassContents());
  361.         $this->class_data->assign("packageindex",$this->package_index);
  362.         $this->class_data->assign("package",$this->package);
  363.         $this->class_data->assign("subdir",$a);
  364.         $this->class_data->register_outputfilter('HTMLSmarty_outputfilter');
  365.         $this->writefile($this->class . '.html',$this->class_data->fetch('class.tpl'));
  366.         unset($this->class_data);
  367.     }
  368.    
  369.     function getTutorialList()
  370.     {
  371.         static $cache false;
  372.         if ($cache)
  373.         {
  374.             if (isset($cache[$this->package])) return $cache[$this->package];
  375.         }
  376.         $package $this->package;
  377.         if (!isset($this->tutorials[$package])) return false;
  378.         foreach($this->tutorials[$packageas $subpackage => $blah)
  379.         {
  380.             $subpackages[$subpackage;
  381.         }
  382.         $tutes array();
  383.         foreach($subpackages as $subpackage)
  384.         {
  385.             if (isset($this->tutorial_tree&& is_array($this->tutorial_tree))
  386.             foreach($this->tutorial_tree as $root => $tr)
  387.             {
  388.                 if ($tr['tutorial']->package == $package && $tr['tutorial']->subpackage == $subpackage)
  389.                 $tutes[$tr['tutorial']->tutorial_type][$this->getTutorialTree($tr['tutorial']);
  390.             }
  391.         }
  392.         $cache[$this->package$tutes;
  393.         return $tutes;
  394.     }
  395.    
  396.     function getTutorialTree($tutorial,$k false)
  397.     {
  398.         $ret '';
  399.         if (is_object($tutorial)) $tree parent::getTutorialTree($tutorial)else $tree $tutorial;
  400.         if (!$tree)
  401.         {
  402.             $template &$this->newSmarty();
  403.             $template->assign('subtree',false);
  404.             $template->assign('name',str_replace('.','',$tutorial->name));
  405.             $template->assign('parent',false);
  406.             $template->assign('haskids',false);
  407.             $template->assign('kids','');
  408.             $link new tutorialLink;
  409.             $t $tutorial;
  410.             $link->addLink('',$t->path,$t->name,$t->package,$t->subpackage,$t->getTitle($this));
  411.             $main array('link' => $this->getId($link)'title' => $link->title);
  412.             $template->assign('main',$main);
  413.             return $template->fetch('tutorial_tree.tpl');
  414.         }
  415.         if (isset($tree['kids']))
  416.         {
  417.             foreach($tree['kids'as $subtree)
  418.             {
  419.                 $ret .= $this->getTutorialTree($subtreetrue);
  420.             }
  421.         }
  422.         $template &$this->newSmarty();
  423.         $template->assign('subtree',$k);
  424.         $template->assign('name',str_replace('.','',$tree['tutorial']->name));
  425.         $template->assign('parent',($k str_replace('.','',$tree['tutorial']->parent->namefalse));
  426.         $template->assign('haskids',strlen($ret));
  427.         $template->assign('kids',$ret);
  428.         $link new tutorialLink;
  429.         $t $tree['tutorial'];
  430.         $link->addLink('',$t->path,$t->name,$t->package,$t->subpackage,$t->getTitle($this));
  431.         $main array('link' => $this->getId($link)'title' => $link->title);
  432.         $template->assign('main',$main);
  433.         return $template->fetch('tutorial_tree.tpl');
  434.     }
  435.    
  436.     function getClassLeft()
  437.     {
  438.         if ($this->_classleft_cache)
  439.         {
  440.             if (isset($this->_classleft_cache[$this->package][$this->subpackage])) return $this->_classleft_cache[$this->package][$this->subpackage];
  441.         }
  442.         $arr $classarr $interfacearr array();
  443.         if (isset($this->left['#class'][$this->package]))
  444.         foreach($this->left['#class'][$this->packageas $subpackage => $pages)
  445.         {
  446.             for ($i 0$i count($pages)$i++{
  447.                 if ($pages[$i]['is_interface']{
  448.                     $interfacearr[$subpackage][$pages[$i];
  449.                 else {
  450.                     $classarr[$subpackage][$pages[$i];
  451.                 }
  452.             }
  453.         }
  454.         $templ &$this->newSmarty();
  455.         $templ->assign('classleftindex',$classarr);
  456.         $classarr $templ->fetch('classleft.tpl');
  457.         $this->_classleft_cache[$this->package][$this->subpackage]['class'$classarr;
  458.         $templ &$this->newSmarty();
  459.         $templ->assign('classleftindex',$interfacearr);
  460.         $interfacearr $templ->fetch('classleft.tpl');
  461.         $this->_classleft_cache[$this->package][$this->subpackage]['interface'=
  462.             $interfacearr;
  463.         return $this->_classleft_cache[$this->package][$this->subpackage];
  464.     }
  465.    
  466.     function getClassContents()
  467.     {
  468.         if ($this->_classcontents_cache)
  469.         {
  470.             if (isset($this->_classcontents_cache[$this->package][$this->subpackage][$this->class])) return $this->_classcontents_cache[$this->package][$this->subpackage][$this->class];
  471.         }
  472.         $arr array();
  473.         foreach($this->class_contents[$this->package][$this->subpackage][$this->classas $i => $link)
  474.         {
  475.             if (is_object($link))
  476.             $arr[$link->type][$this->returnSee($link,$link->name);
  477.         }
  478.         $this->_classcontents_cache[$this->package][$this->subpackage][$this->class$arr;
  479.         return $arr;
  480.     }
  481.    
  482.     function getPageContents()
  483.     {
  484.         if (!isset($this->path)) $this->path '#####';
  485.         if ($this->_pagecontents_cache)
  486.         {
  487.             if (isset($this->_pagecontents_cache[$this->package][$this->subpackage][$this->path])) return $this->_pagecontents_cache[$this->package][$this->subpackage][$this->path];
  488.         }
  489.         $arr array();
  490.         foreach($this->page_contents[$this->curpage->package][$this->curpage->subpackageas $i => $link)
  491.         {
  492.             if (is_object($link))
  493.             $arr[$link->type][$i$this->returnSee($link);
  494.         }
  495.         $this->_pagecontents_cache[$this->package][$this->subpackage][$this->path$arr;
  496.         return $arr;
  497.     }
  498.    
  499.     function getPageLeft()
  500.     {
  501.         if ($this->_pageleft_cache)
  502.         {
  503.             if (isset($this->_pageleft_cache[$this->package][$this->subpackage])) return $this->_pageleft_cache[$this->package][$this->subpackage];
  504.         }
  505.         $arr array();
  506.         if (isset($this->left[$this->package]))
  507.         foreach($this->left[$this->packageas $subpackage => $pages)
  508.         {
  509.             $arr[$subpackage$pages;
  510.         }
  511.         $templ &$this->newSmarty();
  512.         $templ->assign('fileleftindex',$arr);
  513.         $arr $templ->fetch('fileleft.tpl');
  514.         $this->_pageleft_cache[$this->package][$this->subpackage$arr;
  515.         return $arr;
  516.     }
  517.    
  518.     /**
  519.      * Writes out the template file of {@link $page_data} and unsets the template to save memory
  520.      * @see registerCurrent()
  521.      * @see parent::endPage()
  522.      */
  523.     function endPage()
  524.     {
  525.         $this->package $this->curpage->package;
  526.         $this->subpackage $this->curpage->subpackage;
  527.         $a '../';
  528.         if (!empty($this->subpackage)) $a .= '../';
  529.         $classleft $this->getClassLeft();
  530.         $this->setTargetDir($this->base_dir PATH_DELIMITER $this->page_dir);
  531.         $this->page_data->assign("contents",$this->getPageContents());
  532.         $this->page_data->assign("compiledfileindex",$this->getPageLeft());
  533.         $this->page_data->assign("compiledclassindex",$classleft['class']);
  534.         $this->page_data->assign("compiledinterfaceindex",$classleft['interface']);
  535.         $this->page_data->assign("tutorials",$this->getTutorialList());
  536.         $this->page_data->assign("packageindex",$this->package_index);
  537.         $this->page_data->assign("package",$this->package);
  538.         $this->page_data->assign("subdir",$a);
  539.         $this->page_data->register_outputfilter('HTMLSmarty_outputfilter');
  540.         $this->writefile($this->page '.html',$this->page_data->fetch('page.tpl'));
  541.         unset($this->page_data);
  542.     }
  543.    
  544.     /**
  545.      * @param string 
  546.      * @param string 
  547.      * @return string &lt;a href="'.$link.'">'.$text.'</a&gt;
  548.      */
  549.     function returnLink($link,$text)
  550.     {
  551.         return '<a href="'.$link.'">'.$text.'</a>';
  552.     }
  553.    
  554.     function makeLeft()
  555.     {
  556.         if ($this->_done_package_indexreturn;
  557.         $this->_done_package_index true;
  558.         if (!isset($this->package_index))
  559.         foreach($this->all_packages as $key => $val)
  560.         {
  561.             if (isset($this->pkg_elements[$key]))
  562.             {
  563.                 if (!isset($start)) $start $key;
  564.                 $this->package_index[array('link' => "li_$key.html"'title' => $key);
  565.             }
  566.         }
  567.         foreach($this->page_elements as $package => $o1)
  568.         {
  569.             foreach($o1 as $subpackage => $links)
  570.             {
  571.                 for($i=0;$i<count($links);$i++)
  572.                 {
  573.                     $this->left[$package][$subpackage][=
  574.                         array("link" => $this->getId($links[$i])"title" => $links[$i]->name);
  575.                 }
  576.             }
  577.         }
  578.         foreach($this->class_elements as $package => $o1)
  579.         {
  580.             foreach($o1 as $subpackage => $links)
  581.             {
  582.                 for($i=0;$i<count($links);$i++)
  583.                 {
  584.                     $isinterface false;
  585.                     if ($links[$i]->type == 'class'{
  586.                         $class $this->classes->getClass($links[$i]->name,
  587.                             $links[$i]->path);
  588.                         if ($class{
  589.                             $isinterface $class->isInterface();
  590.                         }
  591.                     }
  592.                     $this->left['#class'][$package][$subpackage][=
  593.                         array("link" => $this->getId($links[$i])"title" => $links[$i]->name'is_interface' => $isinterface);
  594.                 }
  595.             }
  596.         }
  597.     }
  598.    
  599.     /**
  600.      * HTMLdefaultConverter chooses to format both package indexes and the complete index here
  601.      *
  602.      * This function formats output for the elementindex.html and pkgelementindex.html template files.  It then
  603.      * writes them to the target directory
  604.      * @see generateElementIndex(), generatePkgElementIndex()
  605.      */
  606.     function formatPkgIndex()
  607.     {
  608.         list($package_indexes,$packages,$mletters$this->generatePkgElementIndexes();
  609.         for($i=0;$i<count($package_indexes);$i++)
  610.         {
  611.             $template &$this->newSmarty();
  612.             $this->package $package_indexes[$i]['package'];
  613.             $this->subpackage '';
  614.             $classleft $this->getClassLeft();
  615.             $template->assign("compiledfileindex",$this->getPageLeft());
  616.             $template->assign("compiledclassindex",$classleft['class']);
  617.             $template->assign("compiledinterfaceindex",$classleft['interface']);
  618.             $template->assign("tutorials",$this->getTutorialList());
  619.             $template->assign("index",$package_indexes[$i]['pindex']);
  620.             $template->assign("package",$package_indexes[$i]['package']);
  621.             $template->assign("letters",$mletters[$package_indexes[$i]['package']]);
  622.             $template->assign("title","Package ".$package_indexes[$i]['package']." Element Index");
  623.             $template->assign("date",date("r",time()));
  624.             $template->register_outputfilter('HTMLSmarty_outputfilter');
  625.             $this->setTargetDir($this->base_dir);
  626.             $this->writefile('elementindex_'.$package_indexes[$i]['package'].'.html',$template->fetch('pkgelementindex.tpl'));
  627.         }
  628.         phpDocumentor_out("\n");
  629.         flush();
  630.         }
  631.    
  632.     /**
  633.      * HTMLdefaultConverter uses this function to format template index.html and packages.html
  634.      *
  635.      * This function generates the package list from {@link $all_packages}, eliminating any
  636.      * packages that don't have any entries in their package index (no files at all, due to @ignore
  637.      * or other factors).  Then it uses the default package name as the first package index to display.
  638.      * It sets the right pane to be either a blank file with instructions on making package-level docs,
  639.      * or the package-level docs for the default package.
  640.      * @global string Used to set the starting package to display
  641.      */
  642.     function formatIndex()
  643.     {
  644.         global $phpDocumentor_DefaultPackageName;
  645.         if (!isset($this->package_index))
  646.         {
  647.             debug("\nERROR: Nothing parsed, check the command-line");
  648.             die();
  649.         }
  650.         list($elindex,$mletters$this->generateElementIndex();
  651.         $template &$this->newSmarty();
  652.         $template->assign("index",$elindex);
  653.         $template->assign("letters",$mletters);
  654.         $template->assign("title","Element Index");
  655.         $template->assign("package"false);
  656.         $template->assign("date",date("r",time()));
  657.         phpDocumentor_out("\n");
  658.         flush();
  659.         $this->setTargetDir($this->base_dir);
  660.         $template->register_outputfilter('HTMLSmarty_outputfilter');
  661.         $this->writefile('elementindex.html',$template->fetch('elementindex.tpl'));
  662.         usort($this->package_index,"HTMLSmarty_pindexcmp");
  663.         $index &$this->newSmarty();
  664.         foreach($this->all_packages as $key => $val)
  665.         {
  666.             if (isset($this->pkg_elements[$key]))
  667.             {
  668.                 if (!isset($start)) $start $key;
  669.                 if (!isset($this->package_pages[$key])) $this->writeNewPPage($key);
  670.             }
  671.         }
  672.         // Created index.html
  673.         $start $phpDocumentor_DefaultPackageName;
  674.         if (!isset($this->pkg_elements[$key]))
  675.         {
  676.             // if there are no elements, use a random package as the default
  677.             $a array_keys($this->pkg_elements);
  678.             $start array_shift($a);
  679.         }
  680.         $this->package $start;
  681.         $this->subpackage '';
  682.         $classleft $this->getClassLeft();
  683.         $index->assign("compiledfileindex",$this->getPageLeft());
  684.         $index->assign("compiledclassindex",$classleft['class']);
  685.         $index->assign("compiledinterfaceindex",$classleft['interface']);
  686.         $index->assign('hastodos',count($this->todoList));
  687.         $index->assign('todolink','todolist.html');
  688.         $index->assign("tutorials",$this->getTutorialList());
  689.         $index->assign("date",date("r",time()));
  690.         $index->assign("package",$this->package);
  691.         $index->assign("title",$this->title);
  692.         $index->assign("start","li_$start.html");
  693.         if (isset($this->package_pages[$start]))
  694.         {
  695.             $index->assign("contents",$this->package_pages[$start]);
  696.         }
  697.         $index->register_outputfilter('HTMLSmarty_outputfilter');
  698.         phpDocumentor_out("\n");
  699.         flush();
  700.         $this->setTargetDir($this->base_dir);
  701.         $this->writefile("index.html",$index->fetch('index.tpl'));
  702.         unset($index);
  703.  
  704.     }
  705.    
  706.     function writeNewPPage($key)
  707.     {
  708.         $template &$this->newSmarty();
  709.         $this->package $key;
  710.         $this->subpackage '';
  711.         $classleft $this->getClassLeft();
  712.         $template->assign("compiledfileindex",$this->getPageLeft());
  713.         $template->assign("compiledclassindex",$classleft['class']);
  714.         $template->assign("compiledinterfaceindex",$classleft['interface']);
  715.         $template->assign("tutorials",$this->getTutorialList());
  716.         $template->assign("date",date("r",time()));
  717.         $template->assign("title",$this->title);
  718.         $template->assign("package",$key);
  719.         $template->register_outputfilter('HTMLSmarty_outputfilter');
  720.         phpDocumentor_out("\n");
  721.         flush();
  722.         $this->setTargetDir($this->base_dir);
  723.         $this->writefile("li_$key.html",$template->fetch('index.tpl'));
  724.         unset($template);
  725.     }
  726.    
  727.     /**
  728.      * Generate indexes for li_package.html and classtree output files
  729.      *
  730.      * This function generates the li_package.html files from the template file left.html.  It does this by
  731.      * iterating through each of the $page_elements, $class_elements and  $function_elements arrays to retrieve
  732.      * the pre-sorted {@link abstractLink} descendants needed for index generation.  Conversion of these links to
  733.      * text is done by {@link returnSee()}.
  734.      * 
  735.      * Then it uses {@link generateFormattedClassTrees()} to create class trees from the template file classtrees.html.  Output
  736.      * filename is classtrees_packagename.html.  This function also unsets {@link $elements} and {@link $pkg_elements} to free
  737.      * up the considerable memory these two class vars use
  738.      * @see $page_elements, $class_elements, $function_elements
  739.      */
  740.     function formatLeftIndex()
  741.     {
  742.         phpDocumentor_out("\n");
  743.         flush();
  744.         $this->setTargetDir($this->base_dir);
  745.         if (!isset($this->left))
  746.         {
  747.             debug("Nothing parsed, check the command-line");
  748.             die();
  749.         }
  750.         foreach($this->all_packages as $package => $rest)
  751.         {
  752.             if (!isset($this->pkg_elements[$package])) continue;
  753.             // Create class tree page
  754.             $template &$this->newSmarty();
  755.             $classleft $this->getClassLeft();
  756.             $template->assign("compiledfileindex",$this->getPageLeft());
  757.             $template->assign("compiledclassindex",$classleft['class']);
  758.             $template->assign("compiledinterfaceindex",$classleft['interface']);
  759.             $template->assign("classtrees",$this->generateFormattedClassTrees($package));
  760.             $template->assign("interfaces",$this->generateFormattedInterfaceTrees($package));
  761.             $template->assign("package",$package);
  762.             $template->assign("date",date("r",time()));
  763.             $template->assign("title","Class Trees for Package $package");
  764.             $template->register_outputfilter('HTMLSmarty_outputfilter');
  765.             $this->writefile("classtrees_$package.html",$template->fetch('classtrees.tpl'));
  766.             phpDocumentor_out("\n");
  767.             flush();
  768.         }
  769.         $this->writeRIC();
  770.         // free up considerable memory
  771.         unset($this->elements);
  772.         unset($this->pkg_elements);
  773.     }
  774.    
  775.    
  776.     /**
  777.      * This function takes an {@link abstractLink} descendant and returns an html link
  778.      *
  779.      * @param abstractLink a descendant of abstractlink should be passed, and never text
  780.      * @param string text to display in the link
  781.      * @param boolean this parameter is not used, and is deprecated
  782.      * @param boolean determines whether the returned text is enclosed in an &lt;a> tag
  783.      */
  784.     function returnSee(&$element$eltext false$with_a true)
  785.     {
  786.         if (!is_object($element|| !$elementreturn false;
  787.         if (!$with_areturn $this->getId($elementfalse);
  788.         if (!$eltext)
  789.         {
  790.             $eltext '';
  791.             switch($element->type)
  792.             {
  793.                 case 'tutorial' :
  794.                 $eltext strip_tags($element->title);
  795.                 break;
  796.                 case 'method' :
  797.                 case 'var' :
  798.                 case 'const' :
  799.                 $eltext .= $element->class.'::';
  800.                 case 'page' :
  801.                 case 'define' :
  802.                 case 'class' :
  803.                 case 'function' :
  804.                 case 'global' :
  805.                 default :
  806.                 $eltext .= $element->name;
  807.                 if ($element->type == 'function' || $element->type == 'method'$eltext .= '()';
  808.                 break;
  809.             }
  810.         }
  811.         return '<a href="'.$this->getId($element).'">'.$eltext.'</a>';
  812.     }
  813.    
  814.     function getId($element$fullpath true)
  815.     {
  816.         if (phpDocumentor_get_class($element== 'parserdata')
  817.         {
  818.             $element $this->addLink($element->parent);
  819.             $elp $element->parent;
  820.         elseif (is_a($element'parserbase'))
  821.         {
  822.             $elp $element;
  823.             $element $this->addLink($element);
  824.         }
  825.         $c '';
  826.         if (!empty($element->subpackage))
  827.         {
  828.             $c '/'.$element->subpackage;
  829.         }
  830.         $b '../';
  831.         switch ($element->type)
  832.         {
  833.             case 'page' :
  834.             if ($fullpath)
  835.             return $b.$element->package.$c.'/'.$element->fileAlias.'.html';
  836.             return 'top';
  837.             break;
  838.             case 'define' :
  839.             case 'global' :
  840.             case 'function' :
  841.             if ($fullpath)
  842.             return $b.$element->package.$c.'/'.$element->fileAlias.'.html#'.$element->type.$element->name;
  843.             return $element->type.$element->name;
  844.             break;
  845.             case 'class' :
  846.             if ($fullpath)
  847.             return $b.$element->package.$c.'/'.$element->name.'.html';
  848.             return 'top';
  849.             break;
  850.             case 'method' :
  851.             case 'var' :
  852.             case 'const' :
  853.             if ($fullpath)
  854.             return $b.$element->package.$c.'/'.$element->class.'.html#'.$element->type.$element->name;
  855.             return $element->type.$element->name;
  856.             break;
  857.             case 'tutorial' :
  858.             $d '';
  859.             if ($element->section)
  860.             {
  861.                 $d '#'.$element->section;
  862.             }
  863.             return $b.$element->package.$c.'/tutorial_'.$element->name.'.html'.$d;
  864.         }
  865.     }
  866.    
  867.     /**
  868.      * Convert README/INSTALL/CHANGELOG file contents to output format
  869.      * @param README|INSTALL|CHANGELOG
  870.      * @param string contents of the file
  871.      */
  872.     function Convert_RIC($name$contents)
  873.     {
  874.         $this->ric_contents[$name$contents;
  875.         $this->ric_set[array('file' => 'ric_'.$name '.html','name' => $name);
  876.     }
  877.    
  878.     function writeRIC()
  879.     {
  880.         if ($this->_ric_donereturn;
  881.         $this->_ric_done true;
  882.         foreach($this->ric_contents as $name => $contents)
  883.         {
  884.             $template &$this->newSmarty();
  885.             $template->assign('contents',$contents);
  886.             $template->assign('name',$name);
  887.             $template->assign('title',$name);
  888.             $this->setTargetDir($this->base_dir);
  889.             $this->writefile('ric_'.$name '.html',$template->fetch('ric.tpl'));
  890.         }
  891.     }
  892.    
  893.     function ConvertTodoList()
  894.     {
  895.         $todolist array();
  896.         foreach($this->todoList as $package => $alltodos)
  897.         {
  898.             foreach($alltodos as $todos)
  899.             {
  900.                 $converted array();
  901.                 $converted['link'$this->returnSee($todos[0]);
  902.                 if (!is_array($todos[1]))
  903.                 {
  904.                     $converted['todos'][$todos[1]->Convert($this);
  905.                 else
  906.                 {
  907.                     foreach($todos[1as $todo)
  908.                     {
  909.                         $converted['todos'][$todo->Convert($this);
  910.                     }
  911.                 }
  912.                 $todolist[$package][$converted;
  913.             }
  914.         }
  915.         $templ &$this->newSmarty();
  916.         $templ->assign('todos',$todolist);
  917.         $templ->register_outputfilter('HTMLSmarty_outputfilter');
  918.         $this->setTargetDir($this->base_dir);
  919.         $this->writefile('todolist.html',$templ->fetch('todolist.tpl'));
  920.     }
  921.    
  922.     /**
  923.      * Create errors.html template file output
  924.      *
  925.      * This method takes all parsing errors and warnings and spits them out ordered by file and line number.
  926.      * @global ErrorTracker We'll be using it's output facility
  927.      */
  928.     function ConvertErrorLog()
  929.     {
  930.         global $phpDocumentor_errors;
  931.         $allfiles array();
  932.         $files array();
  933.         $warnings $phpDocumentor_errors->returnWarnings();
  934.         $errors $phpDocumentor_errors->returnErrors();
  935.         $template &$this->newSmarty();
  936.         foreach($warnings as $warning)
  937.         {
  938.             $file '##none';
  939.             $linenum 'Warning';
  940.             if ($warning->file)
  941.             {
  942.                 $file $warning->file;
  943.                 $allfiles[$file1;
  944.                 $linenum .= ' on line '.$warning->linenum;
  945.             }
  946.             $files[$file]['warnings'][array('name' => $linenum'listing' => $warning->data);
  947.         }
  948.         foreach($errors as $error)
  949.         {
  950.             $file '##none';
  951.             $linenum 'Error';
  952.             if ($error->file)
  953.             {
  954.                 $file $error->file;
  955.                 $allfiles[$file1;
  956.                 $linenum .= ' on line '.$error->linenum;
  957.             }
  958.             $files[$file]['errors'][array('name' => $linenum'listing' => $error->data);
  959.         }
  960.         $i=1;
  961.         $af array();
  962.         foreach($allfiles as $file => $num)
  963.         {
  964.             $af[$i++$file;
  965.         }
  966.         $allfiles $af;
  967.         usort($allfiles,'strnatcasecmp');
  968.         $allfiles[0"Post-parsing";
  969.         foreach($allfiles as $i => $a)
  970.         {
  971.             $allfiles[$iarray('file' => $a);
  972.         }
  973.         $out array();
  974.         foreach($files as $file => $data)
  975.         {
  976.             if ($file == '##none'$file 'Post-parsing';
  977.             $out[$file$data;
  978.         }
  979.         $template->assign("files",$allfiles);
  980.         $template->assign("all",$out);
  981.         $template->assign("title","phpDocumentor Parser Errors and Warnings");
  982.         $template->register_outputfilter('HTMLSmarty_outputfilter');
  983.         $this->setTargetDir($this->base_dir);
  984.         $this->writefile("errors.html",$template->fetch('errors.tpl'));
  985.         unset($template);
  986.         phpDocumentor_out("\n\nTo view errors and warnings, look at ".$this->base_dirPATH_DELIMITER "errors.html\n");
  987.         flush();
  988.     }
  989.    
  990.     function getCData($value)
  991.     {
  992.         return '<pre>'.htmlentities($value).'</pre>';
  993.     }
  994.    
  995.     function getTutorialId($package,$subpackage,$tutorial,$id)
  996.     {
  997.         return $id;
  998.     }
  999.  
  1000.     /**
  1001.      * Converts package page and sets its package as used in {@link $package_pages}
  1002.      * @param parserPackagePage 
  1003.      */
  1004.     function convertPackagepage(&$element)
  1005.     {
  1006.         phpDocumentor_out("\n");
  1007.         flush();
  1008.         $template &$this->newSmarty();
  1009.         $this->package $element->package;
  1010.         $this->subpackage '';
  1011.         $classleft $this->getClassLeft();
  1012.         $template->assign("compiledfileindex",$this->getPageLeft());
  1013.         $template->assign("compiledclassindex",$classleft['class']);
  1014.         $template->assign("compiledinterfaceindex",$classleft['interface']);
  1015.         $template->assign("tutorials",$this->getTutorialList());
  1016.         $template->assign("date",date("r",time()));
  1017.         $template->assign("title",$this->title);
  1018.         $template->assign("package",$element->package);
  1019.         $x $element->Convert($this);
  1020.         $x substr($x,strpos($x,'<body'));
  1021.         $template->assign("contents",trim(substr($x,strpos($x,'>'1)));
  1022.         $this->package_pages[$element->packagetrim(substr($x,strpos($x,'>'1));
  1023.         $template->register_outputfilter('HTMLSmarty_outputfilter');
  1024.         phpDocumentor_out("\n");
  1025.         flush();
  1026.         $this->setTargetDir($this->base_dir);
  1027.         $this->writefile("li_".$element->package.".html",$template->fetch('index.tpl'));
  1028.         unset($template);
  1029.     }
  1030.    
  1031.     /**
  1032.      * @param parserTutorial 
  1033.      */
  1034.     function convertTutorial(&$element)
  1035.     {
  1036.         phpDocumentor_out("\n");
  1037.         flush();
  1038.         $template &parent::convertTutorial($element);
  1039.         $this->package $element->package;
  1040.         $this->subpackage $element->subpackage;
  1041.         $classleft $this->getClassLeft();
  1042.         $template->assign("compiledfileindex",$this->getPageLeft());
  1043.         $template->assign("compiledclassindex",$classleft['class']);
  1044.         $template->assign("compiledinterfaceindex",$classleft['interface']);
  1045.         $template->assign("tutorials",$this->getTutorialList());
  1046.         $template->assign("title",strip_tags($element->getTitle($this)));
  1047.         $contents $element->Convert($this);
  1048.         if ($element->name == $this->package '.pkg')
  1049.         {
  1050.             $this->package_pages[$element->package$contents;
  1051.         }
  1052.         $a '../';
  1053.         if (!empty($element->subpackage)) $a .= $a;
  1054.         $template->assign("subdir",$a);
  1055.         $a '';
  1056.         if ($element->subpackage$a PATH_DELIMITER $element->subpackage;
  1057.         $template->register_outputfilter('HTMLSmarty_outputfilter');
  1058.         $this->setTargetDir($this->base_dir PATH_DELIMITER $element->package $a);
  1059.         $this->writeFile('tutorial_'.$element->name.'.html',$template->fetch('tutorial.tpl'));
  1060.         if ($element->name == $element->package '.pkg')
  1061.         {
  1062.             phpDocumentor_out("\n");
  1063.             flush();
  1064.             // package-level docs
  1065.             $this->setTargetDir($this->base_dir);
  1066.             $template->assign("subdir",'');
  1067.             $this->writeFile('li_'.$element->package.'.html',$template->fetch('tutorial.tpl'));
  1068.         }
  1069.         unset($template);
  1070.     }
  1071.  
  1072.     /**
  1073.      * Converts class for template output
  1074.      * @see prepareDocBlock(), generateChildClassList(), generateFormattedClassTree(), getFormattedConflicts()
  1075.      * @see getFormattedInheritedMethods(), getFormattedInheritedVars()
  1076.      * @param parserClass 
  1077.      */
  1078.     function convertClass(&$element)
  1079.     {
  1080.         parent::convertClass($element);
  1081.         $this->class_dir $element->docblock->package;
  1082.         if (!empty($element->docblock->subpackage)) $this->class_dir .= PATH_DELIMITER $element->docblock->subpackage;
  1083.         $a '../classtrees_';
  1084.         if ($element->docblock->subpackage != ''$a "../$a";
  1085.        
  1086.         $this->class_data->assign('subdir',$a);
  1087.         $this->class_data->assign("title","Docs For Class " $element->getName());
  1088.         $this->class_data->assign("page",$element->getName('.html');
  1089.     }
  1090.  
  1091.     /**
  1092.      * Converts class variables for template output
  1093.      * @see prepareDocBlock(), getFormattedConflicts()
  1094.      * @param parserDefine 
  1095.      */
  1096.     function convertVar(&$element)
  1097.     {
  1098.         parent::convertVar($elementarray('var_dest' => $this->getId($element,false)));
  1099.     }
  1100.  
  1101.     /**
  1102.      * Converts class variables for template output
  1103.      * @see prepareDocBlock(), getFormattedConflicts()
  1104.      * @param parserDefine 
  1105.      */
  1106.     function convertConst(&$element)
  1107.     {
  1108.         parent::convertConst($elementarray('const_dest' => $this->getId($element,false)));
  1109.     }
  1110.  
  1111.     /**
  1112.      * Converts class methods for template output
  1113.      * @see prepareDocBlock(), getFormattedConflicts()
  1114.      * @param parserDefine 
  1115.      */
  1116.     function convertMethod(&$element)
  1117.     {
  1118.         parent::convertMethod($elementarray('method_dest' => $this->getId($element,false)));
  1119.     }
  1120.    
  1121.     /**
  1122.      * Converts function for template output
  1123.      * @see prepareDocBlock(), parserFunction::getFunctionCall(), getFormattedConflicts()
  1124.      * @param parserFunction 
  1125.      */
  1126.     function convertFunction(&$element)
  1127.     {
  1128.         $funcloc $this->getId($this->addLink($element));
  1129.         parent::convertFunction($element,array('function_dest' => $this->getId($element,false)));
  1130.     }
  1131.    
  1132.     /**
  1133.      * Converts include elements for template output
  1134.      * @see prepareDocBlock()
  1135.      * @param parserInclude 
  1136.      */
  1137.     function convertInclude(&$element)
  1138.     {
  1139.         parent::convertInclude($elementarray('include_file'    => '_'.strtr($element->getValue(),array('"' => ''"'" => '','.' => '_'))));
  1140.     }
  1141.    
  1142.     /**
  1143.      * Converts defines for template output
  1144.      * @see prepareDocBlock(), getFormattedConflicts()
  1145.      * @param parserDefine 
  1146.      */
  1147.     function convertDefine(&$element)
  1148.     {
  1149.         parent::convertDefine($elementarray('define_link' => $this->getId($element,false)));
  1150.     }
  1151.    
  1152.     /**
  1153.      * Converts global variables for template output
  1154.      * @param parserGlobal 
  1155.      * @see prepareDocBlock(), getFormattedConflicts()
  1156.      */
  1157.     function convertGlobal(&$element)
  1158.     {
  1159.         parent::convertGlobal($elementarray('global_link' => $this->getId($element,false)));
  1160.     }
  1161.    
  1162.     /**
  1163.      * converts procedural pages for template output
  1164.      * @see prepareDocBlock(), getClassesOnPage()
  1165.      * @param parserData 
  1166.      */
  1167.     function convertPage(&$element)
  1168.     {
  1169.         parent::convertPage($element);
  1170.         $this->juststarted true;
  1171.         $this->page_dir $element->parent->package;
  1172.         if (!empty($element->parent->subpackage)) $this->page_dir .= PATH_DELIMITER $element->parent->subpackage;
  1173.         // registering stuff on the template
  1174.         $a '../';
  1175.         if (!empty($element->docblock->subpackage)) $a $a $a;
  1176.         $this->page_data->assign('subdir',$a);
  1177.         $this->page_data->assign("page",$this->getPageName($element'.html');
  1178.         $this->page_data->assign("title","Docs for page ".$element->parent->getFile());
  1179.     }
  1180.    
  1181.     function getPageName(&$element)
  1182.     {
  1183.         if (phpDocumentor_get_class($element== 'parserpage'return '_'.$element->getName();
  1184.         return '_'.$element->parent->getName();
  1185.     }
  1186.  
  1187.     /**
  1188.      * returns an array containing the class inheritance tree from the root object to the class
  1189.      *
  1190.      * @param parserClass    class variable
  1191.      * @return array Format: array(root,child,child,child,...,$class)
  1192.      * @uses parserClass::getParentClassTree()
  1193.      */
  1194.    
  1195.     function generateFormattedClassTree($class)
  1196.     {
  1197.         $tree $class->getParentClassTree($this);
  1198.         $out '';
  1199.         if (count($tree1)
  1200.         {
  1201.             $result array($class->getName());
  1202.             $parent $tree[$class->getName()];
  1203.             $distance['';
  1204.             while ($parent)
  1205.             {
  1206.                 $x $parent;
  1207.                 if (is_object($parent))
  1208.                 {
  1209.                     $subpackage $parent->docblock->subpackage;
  1210.                     $package $parent->docblock->package;
  1211.                     $x $parent;
  1212.                     $x $parent->getLink($this);
  1213.                     if (!$x$x $parent->getName();
  1214.                 }
  1215.                 $result[
  1216.                     $x;
  1217.                 $distance[=
  1218.                     "\n%s|\n" .
  1219.                     "%s--";
  1220.                 if (is_object($parent))
  1221.                 $parent $tree[$parent->getName()];
  1222.                 elseif (isset($tree[$parent]))
  1223.                 $parent $tree[$parent];
  1224.             }
  1225.             $nbsp '   ';
  1226.             for($i=count($result1;$i>=0;$i--)
  1227.             {
  1228.                 $my_nbsp '';
  1229.                 for($j=0;$j<count($result$i;$j++$my_nbsp .= $nbsp;
  1230.                 $distance[$isprintf($distance[$i],$my_nbsp,$my_nbsp);
  1231.             }
  1232.             return array('classes'=>array_reverse($result),'distance'=>array_reverse($distance));
  1233.         else
  1234.         {
  1235.             return array('classes'=>$class->getName(),'distance'=>array(''));
  1236.         }
  1237.     }
  1238.    
  1239.     /** @access private */
  1240.     function sortVar($a$b)
  1241.     {
  1242.         return strnatcasecmp($a->getName(),$b->getName());
  1243.     }
  1244.    
  1245.     /** @access private */
  1246.     function sortMethod($a$b)
  1247.     {
  1248.         if ($a->isConstructorreturn -1;
  1249.         if ($b->isConstructorreturn 1;
  1250.         return strnatcasecmp($a->getName(),$b->getName());
  1251.     }
  1252.  
  1253.     /**
  1254.      * returns a template-enabled array of class trees
  1255.      * 
  1256.      * @param    string    $package    package to generate a class tree for
  1257.      * @see $roots, HTMLConverter::getRootTree()
  1258.      */
  1259.     function generateFormattedClassTrees($package)
  1260.     {
  1261.         if (!isset($this->roots['normal'][$package]&&
  1262.               !isset($this->roots['special'][$package])) {
  1263.             return array();
  1264.         }
  1265.         $trees array();
  1266.         if (isset($this->roots['normal'][$package])) {
  1267.             $roots $this->roots['normal'][$package];
  1268.             for($i=0;$i<count($roots);$i++)
  1269.             {
  1270.                 $root $this->classes->getClassByPackage($roots[$i]$package);
  1271.                 if ($root && $root->isInterface()) {
  1272.                     continue;
  1273.                 }
  1274.                 $trees[array('class' => $roots[$i],'class_tree' => "<ul>\n".$this->getRootTree($this->getSortedClassTreeFromClass($roots[$i],$package,''),$package)."</ul>\n");
  1275.             }
  1276.         }
  1277.         if (isset($this->roots['special'][$package])) {
  1278.             $roots $this->roots['special'][$package];
  1279.             foreach ($roots as $parent => $classes{
  1280.                 $thistree '';
  1281.                 foreach ($classes as $classinfo{
  1282.                     $root $this->classes->getClassByPackage($classinfo$package);
  1283.                     if ($root && $root->isInterface()) {
  1284.                         continue;
  1285.                     }
  1286.                     $thistree .=
  1287.                         $this->getRootTree(
  1288.                             $this->getSortedClassTreeFromClass(
  1289.                                 $classinfo,
  1290.                                 $package,
  1291.                                 ''),
  1292.                             $package,
  1293.                             true);
  1294.                 }
  1295.                 if (!$thistree{
  1296.                     continue;
  1297.                 }
  1298.                 $trees[array(
  1299.                     'class' => $parent,
  1300.                     'class_tree' => "<ul>\n" $thistree "</ul>\n"
  1301.                 );
  1302.             }
  1303.         }
  1304.         return $trees;
  1305.     }
  1306.  
  1307.     /**
  1308.      * returns a template-enabled array of interface inheritance trees
  1309.      * 
  1310.      * @param    string    $package    package to generate a class tree for
  1311.      * @see $roots, HTMLConverter::getRootTree()
  1312.      */
  1313.     function generateFormattedInterfaceTrees($package)
  1314.     {
  1315.         if (!isset($this->roots['normal'][$package]&&
  1316.               !isset($this->roots['special'][$package])) {
  1317.             return array();
  1318.         }
  1319.         $trees array();
  1320.         if (isset($this->roots['normal'][$package])) {
  1321.             $roots $this->roots['normal'][$package];
  1322.             for($i=0;$i<count($roots);$i++)
  1323.             {
  1324.                 $root $this->classes->getClassByPackage($roots[$i]$package);
  1325.                 if ($root && !$root->isInterface()) {
  1326.                     continue;
  1327.                 }
  1328.                 $trees[array('class' => $roots[$i],'class_tree' => "<ul>\n".$this->getRootTree($this->getSortedClassTreeFromClass($roots[$i],$package,''),$package)."</ul>\n");
  1329.             }
  1330.         }
  1331.         if (isset($this->roots['special'][$package])) {
  1332.             $roots $this->roots['special'][$package];
  1333.             foreach ($roots as $parent => $classes{
  1334.                 $thistree '';
  1335.                 foreach ($classes as $classinfo{
  1336.                     $root $this->classes->getClassByPackage($classinfo$package);
  1337.                     if ($root && !$root->isInterface()) {
  1338.                         continue;
  1339.                     }
  1340.                     $thistree .=
  1341.                         $this->getRootTree(
  1342.                             $this->getSortedClassTreeFromClass(
  1343.                                 $classinfo,
  1344.                                 $package,
  1345.                                 ''),
  1346.                             $package,
  1347.                             true);
  1348.                 }
  1349.                 if (!$thistree{
  1350.                     continue;
  1351.                 }
  1352.                 $trees[array(
  1353.                     'class' => $parent,
  1354.                     'class_tree' => "<ul>\n" $thistree "</ul>\n"
  1355.                 );
  1356.             }
  1357.         }
  1358.         return $trees;
  1359.     }
  1360.    
  1361.     /**
  1362.      * return formatted class tree for the Class Trees page
  1363.      *
  1364.      * @param array $tree output from {@link getSortedClassTreeFromClass()}
  1365.      * @param string $package  package
  1366.      * @param boolean $nounknownparent if true, an object's parent will not be checked
  1367.      * @see Classes::$definitechild, generateFormattedClassTrees()
  1368.      * @return string 
  1369.      */
  1370.     function getRootTree($tree$package$noparent false)
  1371.     {
  1372.         if (!$treereturn '';
  1373.         $my_tree '';
  1374.         $cur '#root';
  1375.         $lastcur array(false);
  1376.         $kids array();
  1377.         $dopar false;
  1378.         if (!$noparent && $tree[$cur]['parent'])
  1379.         {
  1380.             $dopar true;
  1381.             if (!is_object($tree[$cur]['parent']))
  1382.             {
  1383. //                debug("parent ".$tree[$cur]['parent']." not found");
  1384.                 $my_tree .= '<li>' $tree[$cur]['parent'.'<ul>';
  1385.             }
  1386.             else
  1387.             {
  1388. //                        debug("parent ".$this->returnSee($tree[$cur]['parent'])." in other package");
  1389.                 $root $this->classes->getClassByPackage($tree[$cur]['parent']->name,
  1390.                     $package);
  1391.                 $my_tree .= '<li>' $this->returnSee($tree[$cur]['parent']);
  1392.                 if ($tree[$cur]['parent']->package != $package$my_tree .= ' <b>(Different package)</b><ul>';
  1393.             }
  1394.         }
  1395.         do
  1396.         {
  1397. //            fancy_debug($cur,$lastcur,$kids);
  1398.             if (count($tree[$cur]['children']))
  1399.             {
  1400. //                debug("$cur has children");
  1401.                 if (!isset($kids[$cur]))
  1402.                 {
  1403. //                    debug("set $cur kids");
  1404.                     $kids[$cur1;
  1405.                     $root $this->classes->getClassByPackage(
  1406.                         $tree[$cur]['link']->name,
  1407.                         $tree[$cur]['link']->package);
  1408.                     if ($implements $root->getImplements()) {
  1409.                         $my_tree .= '<li>'.$this->returnSee($tree[$cur]['link'].
  1410.                             ' (implements ';
  1411.                         foreach ($implements as $i => $interface{
  1412.                             if ($i && $i != count($implements1$my_tree .= ', ';
  1413.                             if ($link $this->getLink('object ' $interface)) {
  1414.                                 $my_tree .= $this->returnSee($link);
  1415.                             else {
  1416.                                 $my_tree .= $interface;
  1417.                             }
  1418.                         }
  1419.                         $my_tree .= ')';
  1420.                     else {
  1421.                         $my_tree .= '<li>'.$this->returnSee($tree[$cur]['link']);
  1422.                     }
  1423.                     $my_tree .= '<ul>'."\n";
  1424.                 }
  1425.                 array_push($lastcur,$cur);
  1426.                 list(,$cureach($tree[$cur]['children']);
  1427. //                var_dump('listed',$cur);
  1428.                 if ($cur)
  1429.                 {
  1430.                     $cur $cur['package''#' $cur['class'];
  1431. //                    debug("set cur to child $cur");
  1432. //                    $my_tree .= '<li>'.$this->returnSee($tree[$cur]['link']);
  1433.                     continue;
  1434.                 else
  1435.                 {
  1436. //                    debug("end of children for $cur");
  1437.                     $cur array_pop($lastcur);
  1438.                     $cur array_pop($lastcur);
  1439.                     $my_tree .= '</ul></li>'."\n";
  1440.                     if ($dopar && ($cur == '#root' || !$cur)) $my_tree .= '</ul></li>';
  1441.                 }
  1442.             else 
  1443.             {
  1444. //                debug("$cur has no children");
  1445.                 $my_tree .= '<li>'.$this->returnSee($tree[$cur]['link'])."</li>";
  1446.                 if ($dopar && $cur == '#root'$my_tree .= '</ul></li>';
  1447.                 $cur array_pop($lastcur);
  1448.             }
  1449.         while ($cur);
  1450.         return $my_tree;
  1451.     }
  1452.  
  1453.     /**
  1454.      * Generate indexing information for given element
  1455.      * 
  1456.      * @param parserElement descendant of parserElement
  1457.      * @see generateElementIndex()
  1458.      * @return array 
  1459.      */
  1460.     function getIndexInformation($elt)
  1461.     {
  1462.         $Result['type'$elt->type;
  1463.         $Result['file_name'$elt->file;
  1464.         $Result['path'$elt->getPath();
  1465.        
  1466.         if (isset($elt->docblock))
  1467.                     {
  1468.                         $Result['description'$elt->docblock->getSDesc($this);
  1469.                        
  1470.                         if ($elt->docblock->hasaccess)
  1471.                             $Result['access'$elt->docblock->tags['access'][0]->value;
  1472.                         else
  1473.                             $Result['access''public';
  1474.  
  1475.                         $Result['abstract'= isset ($elt->docblock->tags['abstract'][0]);
  1476.                     }
  1477.         else
  1478.             $Result['description''';
  1479.        
  1480.         $aa $Result['description'];
  1481.         if (!empty($aa)) $aa "<br>&nbsp;&nbsp;&nbsp;&nbsp;$aa";
  1482.  
  1483.         switch($elt->type)
  1484.         {
  1485.                 case 'class':
  1486.                         $Result['name'$elt->getName();
  1487.                         $Result['title''Class';
  1488.                         $Result['link'$this->getClassLink($elt->getName(),
  1489.                                                               $elt->docblock->package,
  1490.                                                               $elt->getPath(),
  1491.                                                               $elt->getName());
  1492.                         $Result['listing''in file '.$elt->file.', class '.$Result['link']."$aa";
  1493.                 break;
  1494.                 case 'define':
  1495.                         $Result['name'$elt->getName();
  1496.                         $Result['title''Constant';
  1497.                         $Result['link'$this->getDefineLink($elt->getName(),
  1498.                                                                $elt->docblock->package,
  1499.                                                                $elt->getPath(),
  1500.                                                                $elt->getName());
  1501.                         $Result['listing''in file '.$elt->file.', constant '.$Result['link']."$aa";
  1502.                 break;
  1503.                 case 'global':
  1504.                         $Result['name'$elt->getName();
  1505.                         $Result['title''Global';
  1506.                         $Result['link'$this->getGlobalLink($elt->getName(),
  1507.                                                                $elt->docblock->package,
  1508.                                                                $elt->getPath(),
  1509.                                                                $elt->getName());
  1510.                         $Result['listing''in file '.$elt->file.', global variable '.$Result['link']."$aa";
  1511.                 break;
  1512.                 case 'function':
  1513.                         $Result['name'$elt->getName();
  1514.                         $Result['title''Function';
  1515.                         $Result['link'$this->getFunctionLink($elt->getName(),
  1516.                                                                  $elt->docblock->package,
  1517.                                                                  $elt->getPath(),
  1518.                                                                  $elt->getName().'()');
  1519.                         $Result['listing''in file '.$elt->file.', function '.$Result['link']."$aa";
  1520.                 break;
  1521.                 case 'method':
  1522.                         $Result['name'$elt->getName();
  1523.                         $Result['title''Method';
  1524.                         $Result['link'$this->getMethodLink($elt->getName(),
  1525.                                                                $elt->class,
  1526.                                                                $elt->docblock->package,
  1527.                                                                $elt->getPath(),
  1528.                                                                $elt->class.'::'.$elt->getName().'()'
  1529.                                                                          );
  1530.                                                     if ($elt->isConstructor$Result['constructor'1;
  1531.                         $Result['listing''in file '.$elt->file.', method '.$Result['link']."$aa";
  1532.                 break;
  1533.                 case 'var':
  1534.                         $Result['name'$elt->getName();
  1535.                         $Result['title''Variable';
  1536.                         $Result['link'$this->getVarLink($elt->getName(),
  1537.                                                             $elt->class,
  1538.                                                             $elt->docblock->package,
  1539.                                                             $elt->getPath(),
  1540.                                                             $elt->class.'::'.$elt->getName());
  1541.                         $Result['listing''in file '.$elt->file.', variable '.$Result['link']."$aa";
  1542.                 break;
  1543.                 case 'const':
  1544.                         $Result['name'$elt->getName();
  1545.                         $Result['title''Variable';
  1546.                         $Result['link'$this->getConstLink($elt->getName(),
  1547.                                                             $elt->class,
  1548.                                                             $elt->docblock->package,
  1549.                                                             $elt->getPath(),
  1550.                                                             $elt->class.'::'.$elt->getName());
  1551.                         $Result['listing''in file '.$elt->file.', class constant '.$Result['link']."$aa";
  1552.                 break;
  1553.                 case 'page':
  1554.                         $Result['name'$elt->getFile();
  1555.                         $Result['title''Page';
  1556.                         $Result['link'$this->getPageLink($elt->getFile(),
  1557.                                                              $elt->package,
  1558.                                                              $elt->getPath(),
  1559.                                                              $elt->getFile());
  1560.                         $Result['listing''procedural page '.$Result['link'];
  1561.                 break;
  1562.                 case 'include':
  1563.                         $Result['name'$elt->getName();
  1564.                         $Result['title''Include';
  1565.                         $Result['link'$elt->getValue();
  1566.                         $Result['listing''include '.$Result['name'];
  1567.                 break;
  1568.         }
  1569.  
  1570.         return $Result;
  1571.     }
  1572.  
  1573.     /**
  1574.      * Generate alphabetical index of all elements
  1575.      *
  1576.      * @see $elements, walk()
  1577.      */
  1578.     function generateElementIndex()
  1579.     {
  1580.         $elementindex array();
  1581.         $letters array();
  1582.         $used array();
  1583.         foreach($this->elements as $letter => $nutoh)
  1584.         {
  1585.             foreach($this->elements[$letteras $i => $yuh)
  1586.             {
  1587.                 if ($this->elements[$letter][$i]->type != 'include')
  1588.                 {
  1589.                     if (!isset($used[$letter]))
  1590.                     {
  1591.                         $letters[]['letter'$letter;
  1592.                         $elindex['letter'$letter;
  1593.                         $used[$letter1;
  1594.                     }
  1595.  
  1596.                     $elindex['index'][$this->getIndexInformation($this->elements[$letter][$i]);
  1597.                 }
  1598.             }
  1599.             if (isset($elindex['index']))
  1600.             {
  1601.                 $elementindex[$elindex;
  1602.             else
  1603.             {
  1604.                 unset($letters[count($letters1]);
  1605.             }
  1606.             $elindex array();
  1607.         }
  1608.         return array($elementindex,$letters);
  1609.     }
  1610.    
  1611.     function copyMediaRecursively($media,$targetdir,$subdir '')
  1612.     {
  1613.         $versionControlDirectories array ('CVS''media/CVS''media\\CVS''.svn''media/.svn''media\\.svn');
  1614.         if (!is_array($media)) {
  1615.             return;
  1616.         }
  1617.         foreach($media as $dir => $files)
  1618.         {
  1619.             if ($dir === '/'
  1620.             {
  1621.                 $this->copyMediaRecursively($files,$targetdir);
  1622.             else
  1623.             {
  1624.                 if (!is_numeric($dir))
  1625.                 {
  1626.                     if (in_array($dir$versionControlDirectories))
  1627.                     {
  1628.                         // skip it entirely
  1629.                     }
  1630.                     else
  1631.                     {
  1632.                         // create the subdir
  1633.                         phpDocumentor_out("creating $targetdirPATH_DELIMITER "$dir\n");
  1634.                         Converter::setTargetDir($targetdir PATH_DELIMITER $dir);
  1635.                         if (!empty($subdir)) 
  1636.                         {
  1637.                             $subdir .= PATH_DELIMITER;
  1638.                         }
  1639.                         $this->copyMediaRecursively($files,"$targetdir/$dir",$subdir $dir);
  1640.                     }
  1641.                
  1642.                 else
  1643.                 {
  1644.                     // copy the file
  1645.                     phpDocumentor_out("copying $targetdirPATH_DELIMITER $files['file']."\n");
  1646.                     $this->copyFile($files['file'],$subdir);
  1647.                 }
  1648.             }
  1649.         }
  1650.     }
  1651.    
  1652.     /**
  1653.      * calls the converter setTargetDir, and then copies any template images and the stylesheet if they haven't been copied
  1654.      * @see Converter::setTargetDir()
  1655.      */
  1656.     function setTargetDir($dir)
  1657.     {
  1658.         Converter::setTargetDir($dir);
  1659.         if ($this->_wrote_tdirreturn;
  1660.         $this->_wrote_tdir true;
  1661.         $template_images array();
  1662.         $stylesheets array();
  1663.         $tdir $dir;
  1664.         $dir $this->templateDir;
  1665.         $this->templateDir $this->templateDir.'templates/';
  1666.         $info new Io;
  1667.         $this->copyMediaRecursively($info->getDirTree($this->templateDir.'media',$this->templateDir),$tdir);
  1668.     }
  1669.    
  1670.     /**
  1671.      * Generate alphabetical index of all elements by package and subpackage
  1672.      *
  1673.      * @param string $package name of a package
  1674.      * @see $pkg_elements, walk(), generatePkgElementIndexes()
  1675.      */
  1676.     function generatePkgElementIndex($package)
  1677.     {
  1678.         $elementindex array();
  1679.         $letters array();
  1680.         $letterind array();
  1681.         $used array();
  1682.         $subp '';
  1683.         foreach($this->pkg_elements[$packageas $subpackage => $els)
  1684.         {
  1685.             if (empty($els)) continue;
  1686.             if (!empty($subpackage)) $subp " (<b>subpackage:</b> $subpackage)"else $subp '';
  1687.             foreach($els as $letter => $yuh)
  1688.             {
  1689.                 foreach($els[$letteras $i => $yuh)
  1690.                 {
  1691.                     if ($els[$letter][$i]->type != 'include')
  1692.                     {
  1693.                         if (!isset($used[$letter]))
  1694.                         {
  1695.                             $letters[]['letter'$letter;
  1696.                             $letterind[$lettercount($letters1;
  1697.                             $used[$letter1;
  1698.                         }
  1699.                         $elindex[$letter]['letter'$letter;
  1700.  
  1701.                         $elindex[$letter]['index'][$this->getIndexInformation($els[$letter][$i]);
  1702.                     }
  1703.                 }
  1704.             }
  1705.         }
  1706.         ksort($elindex);
  1707.         usort($letters,'HTMLSmarty_lettersort');
  1708.         if (isset($elindex))
  1709.         {
  1710.             while(list($letter,$tempeleach($elindex))
  1711.             {
  1712.                 if (!isset($tempel))
  1713.                 {
  1714.                     unset($letters[$letterind[$tempel['letter']]]);
  1715.                 else
  1716.                 $elementindex[$tempel;
  1717.             }
  1718.         else $letters array();
  1719.         return array($elementindex,$letters);
  1720.     }
  1721.    
  1722.     /**
  1723.      *
  1724.      * @see generatePkgElementIndex()
  1725.      */
  1726.     function generatePkgElementIndexes()
  1727.     {
  1728.         $packages array();
  1729.         $package_names array();
  1730.         $pkg array();
  1731.         $letters array();
  1732.         foreach($this->pkg_elements as $package => $trash)
  1733.         {
  1734.             $pkgs['package'$package;
  1735.             $pkg['package'$package;
  1736.             list($pkg['pindex'],$letters[$package]$this->generatePkgElementIndex($package);
  1737.             if (count($pkg['pindex']))
  1738.             {
  1739.                 $packages[$pkg;
  1740.                 $package_names[$pkgs;
  1741.             }
  1742.             unset($pkgs);
  1743.             unset($pkg);
  1744.         }
  1745.         foreach($packages as $i => $package)
  1746.         {
  1747.             $pnames array();
  1748.             for($j=0;$j<count($package_names);$j++)
  1749.             {
  1750.                 if ($package_names[$j]['package'!= $package['package']$pnames[$package_names[$j];
  1751.             }
  1752.             $packages[$i]['packageindexes'$pnames;
  1753.         }
  1754.         return array($packages,$package_names,$letters);
  1755.     }
  1756.    
  1757.     /**
  1758.      * @param string name of class
  1759.      * @param string package name
  1760.      * @param string full path to look in (used in index generation)
  1761.      * @param boolean deprecated
  1762.      * @param boolean return just the URL, or enclose it in an html a tag
  1763.      * @return mixed false if not found, or an html a link to the class's documentation
  1764.      * @see parent::getClassLink()
  1765.      */
  1766.     function getClassLink($expr,$package$file false,$text false$with_a true)
  1767.     {
  1768.         $a Converter::getClassLink($expr,$package,$file);
  1769.         if (!$areturn false;
  1770.         return $this->returnSee($a$text$with_a);
  1771.     }
  1772.  
  1773.     /**
  1774.      * @param string name of function
  1775.      * @param string package name
  1776.      * @param string full path to look in (used in index generation)
  1777.      * @param boolean deprecated
  1778.      * @param boolean return just the URL, or enclose it in an html a tag
  1779.      * @return mixed false if not found, or an html a link to the function's documentation
  1780.      * @see parent::getFunctionLink()
  1781.      */
  1782.     function getFunctionLink($expr,$package$file false,$text false)
  1783.     {
  1784.         $a Converter::getFunctionLink($expr,$package,$file);
  1785.         if (!$areturn false;
  1786.         return $this->returnSee($a$text);
  1787.     }
  1788.  
  1789.     /**
  1790.      * @param string name of define
  1791.      * @param string package name
  1792.      * @param string full path to look in (used in index generation)
  1793.      * @param boolean deprecated
  1794.      * @param boolean return just the URL, or enclose it in an html a tag
  1795.      * @return mixed false if not found, or an html a link to the define's documentation
  1796.      * @see parent::getDefineLink()
  1797.      */
  1798.     function getDefineLink($expr,$package$file false,$text false)
  1799.     {
  1800.         $a Converter::getDefineLink($expr,$package,$file);
  1801.         if (!$areturn false;
  1802.         return $this->returnSee($a$text);
  1803.     }
  1804.  
  1805.     /**
  1806.      * @param string name of global variable
  1807.      * @param string package name
  1808.      * @param string full path to look in (used in index generation)
  1809.      * @param boolean deprecated
  1810.      * @param boolean return just the URL, or enclose it in an html a tag
  1811.      * @return mixed false if not found, or an html a link to the global variable's documentation
  1812.      * @see parent::getGlobalLink()
  1813.      */
  1814.     function getGlobalLink($expr,$package$file false,$text false)
  1815.     {
  1816.         $a Converter::getGlobalLink($expr,$package,$file);
  1817.         if (!$areturn false;
  1818.         return $this->returnSee($a$text);
  1819.     }
  1820.  
  1821.     /**
  1822.      * @param string name of procedural page
  1823.      * @param string package name
  1824.      * @param string full path to look in (used in index generation)
  1825.      * @param boolean deprecated
  1826.      * @param boolean return just the URL, or enclose it in an html a tag
  1827.      * @return mixed false if not found, or an html a link to the procedural page's documentation
  1828.      * @see parent::getPageLink()
  1829.      */
  1830.     function getPageLink($expr,$package$path false,$text false)
  1831.     {
  1832.         $a Converter::getPageLink($expr,$package,$path);
  1833.         if (!$areturn false;
  1834.         return $this->returnSee($a$text);
  1835.     }
  1836.  
  1837.     /**
  1838.      * @param string name of method
  1839.      * @param string class containing method
  1840.      * @param string package name
  1841.      * @param string full path to look in (used in index generation)
  1842.      * @param boolean deprecated
  1843.      * @param boolean return just the URL, or enclose it in an html a tag
  1844.      * @return mixed false if not found, or an html a link to the method's documentation
  1845.      * @see parent::getMethodLink()
  1846.      */
  1847.     function getMethodLink($expr,$class,$package$file false,$text false)
  1848.     {
  1849.         $a Converter::getMethodLink($expr,$class,$package,$file);
  1850.         if (!$areturn false;
  1851.         return $this->returnSee($a$text);
  1852.     }
  1853.  
  1854.     /**
  1855.      * @param string name of var
  1856.      * @param string class containing var
  1857.      * @param string package name
  1858.      * @param string full path to look in (used in index generation)
  1859.      * @param boolean deprecated
  1860.      * @param boolean return just the URL, or enclose it in an html a tag
  1861.      * @return mixed false if not found, or an html a link to the var's documentation
  1862.      * @see parent::getVarLink()
  1863.      */
  1864.     function getVarLink($expr,$class,$package$file false,$text false)
  1865.     {
  1866.         $a Converter::getVarLink($expr,$class,$package,$file);
  1867.         if (!$areturn false;
  1868.         return $this->returnSee($a$text);
  1869.     }
  1870.  
  1871.     /**
  1872.      * @param string name of class constant
  1873.      * @param string class containing class constant
  1874.      * @param string package name
  1875.      * @param string full path to look in (used in index generation)
  1876.      * @param boolean deprecated
  1877.      * @param boolean return just the URL, or enclose it in an html a tag
  1878.      * @return mixed false if not found, or an html a link to the var's documentation
  1879.      * @see parent::getVarLink()
  1880.      */
  1881.     function getConstLink($expr,$class,$package$file false,$text false)
  1882.     {
  1883.         $a Converter::getConstLink($expr,$class,$package,$file);
  1884.         if (!$areturn false;
  1885.         return $this->returnSee($a$text);
  1886.     }
  1887.    
  1888.     /**
  1889.      * does a nat case sort on the specified second level value of the array
  1890.      *
  1891.      * @param    mixed    $a 
  1892.      * @param    mixed    $b 
  1893.      * @return    int 
  1894.      */
  1895.     function rcNatCmp ($a$b)
  1896.     {
  1897.         $aa strtoupper($a[$this->rcnatcmpkey]);
  1898.         $bb strtoupper($b[$this->rcnatcmpkey]);
  1899.        
  1900.         return strnatcasecmp($aa$bb);
  1901.     }
  1902.    
  1903.     /**
  1904.      * does a nat case sort on the specified second level value of the array.
  1905.      * this one puts constructors first
  1906.      *
  1907.      * @param    mixed    $a 
  1908.      * @param    mixed    $b 
  1909.      * @return    int 
  1910.      */
  1911.     function rcNatCmp1 ($a$b)
  1912.     {
  1913.         $aa strtoupper($a[$this->rcnatcmpkey]);
  1914.         $bb strtoupper($b[$this->rcnatcmpkey]);
  1915.        
  1916.         if (strpos($aa,'CONSTRUCTOR'=== 0)
  1917.         {
  1918.             return -1;
  1919.         }
  1920.         if (strpos($bb,'CONSTRUCTOR'=== 0)
  1921.         {
  1922.             return 1;
  1923.         }
  1924.         if (strpos($aa,strtoupper($this->class)) === 0)
  1925.         {
  1926.             return -1;
  1927.         }
  1928.         if (strpos($bb,strtoupper($this->class)) === 0)
  1929.         {
  1930.             return -1;
  1931.         }
  1932.         return strnatcasecmp($aa$bb);
  1933.     }
  1934.    
  1935.     /**
  1936.      * This function is not used by HTMLdefaultConverter, but is required by Converter
  1937.      */
  1938.     function Output()
  1939.     {
  1940.     }
  1941. }
  1942.  
  1943. /**
  1944.  * @access private
  1945.  * @global string name of the package to set as the first package
  1946.  */
  1947. function HTMLSmarty_pindexcmp($a$b)
  1948. {
  1949.     global $phpDocumentor_DefaultPackageName;
  1950.     if ($a['title'== $phpDocumentor_DefaultPackageNamereturn -1;
  1951.     if ($b['title'== $phpDocumentor_DefaultPackageNamereturn 1;
  1952.     return strnatcasecmp($a['title'],$b['title']);
  1953. }
  1954.  
  1955. /** @access private */
  1956. function HTMLSmarty_lettersort($a$b)
  1957. {
  1958.     return strnatcasecmp($a['letter'],$b['letter']);
  1959. }
  1960.  
  1961. /** @access private */
  1962. function HTMLSmarty_outputfilter($src&$smarty)
  1963. {
  1964.     return str_replace('../',$smarty->_tpl_vars['subdir'],$src);
  1965. }
  1966. ?>
    Поддержать сайт на родительском проекте КГБ