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

Source for file HTMLframesConverter.inc

Documentation is available at HTMLframesConverter.inc

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

Documentation generated on Mon, 11 Mar 2019 15:50:24 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.