phpDocumentor phpDocumentor
ParserElements
[ class tree: phpDocumentor ] [ index: phpDocumentor ] [ all elements ]

Source for file ParserElements.inc

Documentation is available at ParserElements.inc

  1. <?php
  2. /**
  3.  * Parser Elements, all classes representing documentable elements
  4.  * 
  5.  * phpDocumentor :: automatic documentation generator
  6.  * 
  7.  * PHP versions 4 and 5
  8.  *
  9.  * Copyright (c) 2002-2006 Gregory Beaver
  10.  * 
  11.  * LICENSE:
  12.  * 
  13.  * This library is free software; you can redistribute it
  14.  * and/or modify it under the terms of the GNU Lesser General
  15.  * Public License as published by the Free Software Foundation;
  16.  * either version 2.1 of the License, or (at your option) any
  17.  * later version.
  18.  * 
  19.  * This library is distributed in the hope that it will be useful,
  20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  22.  * Lesser General Public License for more details.
  23.  * 
  24.  * You should have received a copy of the GNU Lesser General Public
  25.  * License along with this library; if not, write to the Free Software
  26.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  27.  *
  28.  * @package    phpDocumentor
  29.  * @subpackage ParserElements
  30.  * @author     Gregory Beaver <[email protected]>
  31.  * @copyright  2002-2006 Gregory Beaver
  32.  * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL
  33.  * @version    CVS: $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  34.  * @link       http://www.phpdoc.org
  35.  * @link       http://pear.php.net/PhpDocumentor
  36.  * @see        Parser, WordParser
  37.  * @since      1.1
  38.  */
  39.  
  40. /**
  41.  * all elements except {@link parserPackagePage} descend from this abstract class
  42.  * @abstract
  43.  * @package phpDocumentor
  44.  * @subpackage ParserElements
  45.  * @author Greg Beaver <[email protected]>
  46.  * @since 1.0rc1
  47.  * @version $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  48.  */
  49. class parserElement extends parserBase
  50. {
  51.     /**
  52.      * @var mixed either false or a {@link parserDocBlock}
  53.      */
  54.     var $docblock = false;
  55.     /**
  56.      * name of this element, or include type if element is a {@link parserInclude}
  57.      */
  58.     var $name;
  59.     
  60.     /**
  61.      * @var mixed either false or an array of paths to files with conflicts
  62.      */
  63.     var $conflicts = false;
  64.     
  65.     /**
  66.      * location of this element (filename)
  67.      * @var string 
  68.      */
  69.     var $file = '';
  70.     
  71.     /**
  72.      * full path location of this element (filename)
  73.      * @var string 
  74.      */
  75.     var $path = '';
  76.     
  77.     /**
  78.      * line number on file where this element stops
  79.      * @since 1.2
  80.      * @var false|integer
  81.      */
  82.     var $endlinenumber = 0;
  83.     
  84.     /**
  85.      * Line number in the source on which this element appears
  86.      * @since 1.2
  87.      * @var false|integer
  88.      */
  89.     var $linenumber = false;
  90.     
  91.     /**
  92.      * @param parserDocBlock 
  93.      */
  94.     function setDocBlock($docblock)
  95.     {
  96.         $this->docblock = $docblock;
  97.     }
  98.     
  99.     /**
  100.      * @param string 
  101.      */
  102.     function setName($name)
  103.     {
  104.         $this->name = trim($name);
  105.     }
  106.     
  107.     /**
  108.      * Set starting line number
  109.      * @param integer 
  110.      */
  111.     function setLineNumber($number)
  112.     {
  113.         $this->linenumber = $number;
  114.     }
  115.     
  116.     /**
  117.      * Sets the ending line number of elements
  118.      * @param integer 
  119.      */
  120.     function setEndLineNumber($l)
  121.     {
  122.         $this->endlinenumber = $l;
  123.     }
  124.     
  125.     /**
  126.      * @return integer 
  127.      */
  128.     function getLineNumber()
  129.     {
  130.         return $this->linenumber;
  131.     }
  132.     
  133.     /**
  134.      * @return integer 
  135.      */
  136.     function getEndLineNumber()
  137.     {
  138.         return $this->endlinenumber;
  139.     }
  140.     
  141.     /** @return string package containing this element */
  142.     function getPackage()
  143.     {
  144.         if ($this->docblock)
  145.         {
  146.             return $this->docblock->package;
  147.         else return $GLOBALS['phpDocumentor_DefaultPackageName'];
  148.     }
  149.     
  150.     /** @param string */
  151.     function setFile($file)
  152.     {
  153.         $this->file = $file;
  154.     }
  155.     
  156.     /** @param string */
  157.     function setPath($file)
  158.     {
  159.         // look for special windows case
  160.         if(SMART_PATH_DELIMITER === '\\')
  161.             $this->path = strtr($file,'/','\\');
  162.         else
  163.             $this->path = $file;
  164.         $this->path = $file;
  165.     }
  166.     
  167.     /**
  168.      * @return string 
  169.      */
  170.     function getName()
  171.     {
  172.         if (!isset($this->name)) return false;
  173.         return $this->name;
  174.     }
  175.     
  176.     /**
  177.      * @return string 
  178.      */
  179.     function getFile()
  180.     {
  181.         if (!isset($this->file)) return false;
  182.         return $this->file;
  183.     }
  184.     
  185.     /**
  186.      * @return string 
  187.      */
  188.     function getPath()
  189.     {
  190.         if (!isset($this->path)) return false;
  191.         return $this->path;
  192.     }
  193. }
  194.  
  195. /**
  196.  * @package phpDocumentor
  197.  * @subpackage ParserElements
  198.  * @author Greg Beaver <[email protected]>
  199.  * @since 1.0rc1
  200.  * @version $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  201.  */
  202. class parserInclude extends parserElement
  203. {
  204.     /**
  205.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  206.      * @var string always 'include'
  207.      */
  208.     var $type = 'include';
  209. }
  210.  
  211. /**
  212.  * @package phpDocumentor
  213.  * @subpackage ParserElements
  214.  * @author Greg Beaver <[email protected]>
  215.  * @since 1.1
  216.  * @version $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  217.  */
  218. class parserGlobal extends parserElement
  219. {
  220.     /**
  221.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  222.      * @var string always 'global'
  223.      */
  224.     var $type = 'global';
  225.     
  226.     /**
  227.      * Name of the global's data type
  228.      * @var string 
  229.      */
  230.     var $datatype = 'mixed';
  231.  
  232.     /**
  233.      * quick way to link to this element
  234.      * @return mixed converter-specific link to this global variable
  235.      * @param Converter 
  236.      * @param string text to display for the link or false for default text
  237.      */
  238.     function getLink(&$c$text false$returnobj false)
  239.     {
  240.         if ($returnobj)
  241.         {
  242.             return $c->getLink('global ' $this->name$this->docblock->package);
  243.         }
  244.         return $c->getGlobalLink($this->name$this->docblock->package$this->path$text);
  245.     }
  246.  
  247.     /**
  248.      * Returns all global variables in other packages that have the same name as this global variable
  249.      * @return mixed false or an array Format: (package => {@link parserGlobal} of conflicting global variable)
  250.      * @param Converter 
  251.      */
  252.     function getConflicts(&$c)
  253.     {
  254.         $a $c->proceduralpages->getGlobalConflicts($this->name);
  255.         unset($a[$this->docblock->package]);
  256.         return $a;
  257.     }
  258.     
  259.     /**
  260.      * Sets the name of the global variable's type
  261.      * @param string 
  262.      */
  263.     function setDataType($type)
  264.     {
  265.         $this->datatype = $type;
  266.     }
  267.     
  268.     /**
  269.      * Retrieve converter-specific representation of the data type
  270.      *
  271.      * If the data type is a documented class name, then this function will
  272.      * return a Converter-specific link to that class's documentation, so users
  273.      * can click/browse to the documentation directly from the global variable
  274.      * declaration
  275.      * @return string 
  276.      * @param Converter 
  277.      */
  278.     function getDataType(&$converter)
  279.     {
  280.         $converted_datatype $this->datatype;
  281.         if (strpos($this->datatype,'|'))
  282.         {
  283.             $my_types '';
  284.             $types explode('|',$this->datatype);
  285.             foreach($types as $returntype)
  286.             {
  287.                 $a $converter->getLink($returntype);
  288.                 if (is_object($a&& phpDocumentor_get_class($a== 'classlink')
  289.                 {
  290.                     if (!empty($my_types)) $my_types .= '|';
  291.                     $my_types .= $converter->returnSee($a,$converter->type_adjust($returntype));
  292.                 else
  293.                 {
  294.                     if (!empty($my_types)) $my_types .= '|';
  295.                     $my_types .= $converter->type_adjust($returntype);
  296.                 }
  297.             }
  298.             $converted_datatype $my_types;
  299.         else
  300.         {
  301.             $a $converter->getLink($this->datatype);
  302.             if (is_object($a&& phpDocumentor_get_class($a== 'classlink')
  303.             {
  304.                 $converted_datatype $converter->returnSee($a,$converter->type_adjust($this->datatype));
  305.             else
  306.             {
  307.                 $converted_dataype $converter->type_adjust($this->datatype);
  308.             }
  309.         }
  310.         return $converted_datatype;
  311.     }
  312.  
  313. }
  314.  
  315. /**
  316.  * @package phpDocumentor
  317.  * @subpackage ParserElements
  318.  * @author Greg Beaver <[email protected]>
  319.  * @since 1.0rc1
  320.  * @version $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  321.  */
  322. class parserFunction extends parserElement
  323. {
  324.     /**
  325.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  326.      * @var string always 'function'
  327.      */
  328.     var $type = 'function';
  329.     /**
  330.      * parameters parsed from function definition.
  331.      *
  332.      * param name may be null, in which case, updateParams() must be called from the Converter
  333.      * @var array Format: array(param name => default value parsed from function definition)
  334.      * @see updateParams()
  335.      */
  336.     var $params = false;
  337.     /**
  338.      * Function returns a reference to an element, instead of a value
  339.      *
  340.      * set to true if function is declared as:
  341.      * <code>
  342.      * function &func(...
  343.      * </code>
  344.      * @var boolean 
  345.      */
  346.     var $returnsreference = false;
  347.     /**
  348.      * global declarations parsed from function definition
  349.      *
  350.      * @var array Format: array(globalname1, globalname2,....)
  351.      */
  352.     var $globals = false;
  353.     /**
  354.      * static variable declarations parsed from function definition
  355.      * @var array Format: array(array('name' => staticvar1,'val' => '' or default val of staticvar1),...)
  356.      */
  357.     var $statics = false;
  358.     
  359.     var $source = '';
  360.     
  361.     /**
  362.      * @param string 
  363.      * @param string default value parsed from function definition
  364.      * @param boolean indicates whether this parameter has a default value
  365.      * @param null|stringclass type hint
  366.      */
  367.     function addParam($name$value$has_default true$typehint null)
  368.     {
  369.         $this->params[$namearray($value$has_default);
  370.         if (isset($typehint))
  371.         {
  372.             $this->params[$name][2$typehint;
  373.         }
  374.     }
  375.     
  376.     /**
  377.      * Set the source code.  Always array in PHP 4.3.0+
  378.      * @param string|array
  379.      */
  380.     function addSource($source)
  381.     {
  382.         $this->source = $source;
  383.     }
  384.     
  385.     /**
  386.      * Determine whether the source code has been requested via {@}source}
  387.      * @return boolean 
  388.      */
  389.     function hasSource()
  390.     {
  391.         if (is_array($this->source)) return true;
  392.         return strlen($this->source);
  393.     }
  394.     
  395.     /**
  396.      * @return string|arraysource code ready for highlighting
  397.      */
  398.     function getSource()
  399.     {
  400.         return $this->source;
  401.     }
  402.     
  403.     /**
  404.      * quick way to link to this element
  405.      * @return mixed converter-specific link to this function
  406.      * @param Converter 
  407.      * @param string text to display for the link or false for default text
  408.      */
  409.     function getLink($c$text false$returnobj false)
  410.     {
  411.         if ($returnobj)
  412.         {
  413.             return $c->getLink('function ' $this->name$this->docblock->package);
  414.         }
  415.         return $c->getFunctionLink($this->name$this->docblock->package$this->path$text);
  416.     }
  417.  
  418.     /**
  419.      * Returns all functions in other packages that have the same name as this function
  420.      * @return mixed false or an array Format: (package => {@link parserFunction} of conflicting functions)
  421.      * @param Converter 
  422.      */
  423.     function getConflicts(&$c)
  424.     {
  425.         $a $c->proceduralpages->getFuncConflicts($this->name);
  426.         unset($a[$this->docblock->package]);
  427.         return $a;
  428.     }
  429.     
  430.     /**
  431.      * Add all "global $var, $var2" declarations to this function
  432.      * @param array $globals Format: array(globalname1, globalname2,....)
  433.      */
  434.     function addGlobals($globals)
  435.     {
  436.         $this->globals = $globals;
  437.     }
  438.  
  439.     /**
  440.      * Add all "static $var, $var2 = 6" declarations to this function
  441.      * @param array Format: array(varname1, varname2,...)
  442.      * @param array Format: array(default val of var 1, default val of var 2,...) if var 1 has no default, array(default val of var 2,...)
  443.      */
  444.     function addStatics($static,$vals)
  445.     {
  446.         if (count($static))
  447.         {
  448.             $this->statics = array();
  449.             for($i=0;$i<count($static);$i++)
  450.             {
  451.                 if (isset($static[$i]))
  452.                 {
  453.                     $a '';
  454.                     if (isset($vals[$i])) $a $vals[$i];
  455.                     $this->statics[array('name' => $static[$i],'val' => $a);
  456.                 }
  457.             }
  458.         }
  459.     }
  460.  
  461.     /**
  462.      * @return string default value of param $name
  463.      * @param string 
  464.      */
  465.     function getParam ($name)
  466.     {
  467.         if (!isset($this->params[$name])) return false;
  468.         $test $this->params[$name];
  469.         if ($test[1])
  470.         {
  471.             return $this->params[$name];
  472.         else
  473.         {
  474.             return false;
  475.         }
  476.     }
  477.  
  478.     /**
  479.      * @return array format: array(array(paramname, default value),...)
  480.      */
  481.     function listParams ()
  482.     {
  483.         if (isset($this->params))
  484.         {
  485.             $ret array();
  486.             if ($this->params)
  487.             foreach($this->params as $key => $val)
  488.             {
  489.                 if ($val[1])
  490.                 {
  491.                     $arr array($key,$val[0]);
  492.                     if (isset($val[2]))
  493.                     {
  494.                         $arr[2$val[2];
  495.                     }
  496.                     $ret[$key$arr;
  497.                 else
  498.                 {
  499.                     $arr array($key,false);
  500.                     if (isset($val[2]))
  501.                     {
  502.                         $arr[2$val[2];
  503.                     }
  504.                     $ret[$key$arr;
  505.                 }
  506.             }
  507.             return $ret;
  508.         else {
  509.             return array();
  510.         }
  511.     }
  512.     
  513.     /**
  514.      * @return array format: array(array(index, globalname),...)
  515.      */
  516.     function listGlobals ()
  517.     {
  518.         if (isset($this->globals))
  519.         {
  520.             $ret array();
  521.             if ($this->globals)
  522.             foreach($this->globals as $key => $val)
  523.             {
  524.                 $ret[array($key,$val);
  525.             }
  526.             return $ret;
  527.         else {
  528.             return array();
  529.         }
  530.     }
  531.     
  532.     /**
  533.      * @return array format: array(array(static var name, static var default value),...)
  534.      */
  535.     function listStatics ()
  536.     {
  537.         if (isset($this->statics))
  538.         {
  539.             $ret array();
  540.             if ($this->statics)
  541.             foreach($this->statics as $key => $val)
  542.             {
  543.                 $ret[array($val['name'],$val['val']);
  544.             }
  545.             return $ret;
  546.         else {
  547.             return array();
  548.         }
  549.     }
  550.     
  551.     /**
  552.      * sets {@link $returnsreference} to true
  553.      */
  554.     function setReturnsReference()
  555.     {
  556.         $this->returnsreference = true;
  557.     }
  558.     
  559.     /**
  560.      * @return boolean returns value of {@link $returnsreference}
  561.      */
  562.     function getReturnsReference()
  563.     {
  564.         return $this->returnsreference;
  565.     }
  566.     
  567.     /**
  568.      * Get a human-friendly description of the function call
  569.      *
  570.      * takes declaration like:
  571.      * <code>
  572.      * /** @returns string ... {rest of docblock}
  573.      * function &func($param1, $param2 = 6,
  574.      *                $param3 = array('20',9 => "heroo"))
  575.      * {...}
  576.      * </code>
  577.      * and returns:
  578.      * string &func( $param1, [$param2 = 6], [$param3 = array('20',9 => "heroo")] )
  579.      * @return string stylized function declaration
  580.      */
  581.     function getFunctionCall()
  582.     {
  583.         $a '';
  584.         if ($this->getReturnsReference()) $a '&';
  585.         $function_call $a.$this->getName(" ( ";
  586.         $tmp 0;
  587.         foreach($this->listParams(as $param)
  588.         {
  589.             if ($tmp == 0)
  590.             {
  591.                 $tmp 1;
  592.             else {
  593.                 $function_call .= ", ";
  594.             }
  595.             if ($param[1!== false)
  596.             {
  597.                 $function_call .= "[$param[0] = $param[1]]";
  598.             else {
  599.                 $function_call .= $param[0];
  600.             }
  601.             $update_params[$param[0];
  602.         }
  603.         $function_call .= " )";
  604.         return $function_call;
  605.     }
  606.     
  607.     /**
  608.      * Like getFunctionCall(), but has no English or pre-determined formatting.
  609.      *
  610.      * Much more flexible.
  611.      * @return array Format:
  612.      *  <code>
  613.      *  array('name' => function name,
  614.      *        'returnsref' => boolean if declared as "function &name()"
  615.      *        'params' => array('type' => data type of parameter,
  616.      *                          'description' => from @param tag,
  617.      *                          'name' => variable name,
  618.      *                          'default' => default value if any))
  619.      *  </code>
  620.      * @see getFunctionCall()
  621.      */
  622.     function getIntricateFunctionCall($converter,$paramtags)
  623.     {
  624.         $a array();
  625.         if ($this->getReturnsReference()) $a['returnsref'true;
  626.         $a['name'$converter->type_adjust($this->getName());
  627.         $c $this->listParams();
  628.         foreach($c as $param)
  629.         {
  630.             $b array();
  631.             $b['type''mixed';
  632.             if (isset($paramtags[$param[0]]))
  633.             {
  634.                 $b['type'$paramtags[$param[0]]['datatype'];
  635.                 $b['description'$paramtags[$param[0]]['data'];
  636.                 unset($paramtags[$param[0]]);
  637.             elseif(isset($paramtags[substr($param[0],1)]))
  638.             {
  639.                 $b['type'$paramtags[substr($param[0],1)]['datatype'];
  640.                 $b['description'$paramtags[substr($param[0],1)]['data'];
  641.                 unset($paramtags[substr($param[0],1)]);
  642.             }
  643.             if (isset($param[2]))
  644.             {
  645.                 $link $converter->getLink('object ' $param[2]);
  646.                 if ($link{
  647.                     $link $converter->returnSee($link$param[2]true);
  648.                     $b['type'$link;
  649.                 else {
  650.                     $b['type'$param[2];
  651.                 }
  652.             }
  653.             $b['name'$param[0];
  654.             $b['default'$converter->postProcess($param[1]);
  655.             $b['hasdefault'($param[1!== false);
  656.             $a['params'][$b;
  657.         }
  658.         // @param tags that don't correspond to actual parameters (like extra function values)
  659.         if (count($paramtags))
  660.         {
  661.             foreach($paramtags as $param)
  662.             {
  663.                 $b array();
  664.                 $b['type'$param['datatype'];
  665.                 $b['description'$param['data'];
  666.                 $b['name'$param['var'];
  667.                 $b['default''';
  668.                 $b['hasdefault'false;
  669.                 $a['params'][$b;
  670.             }
  671.         }
  672.         return $a;
  673.     }
  674. }
  675.  
  676. /**
  677.  * @package phpDocumentor
  678.  * @subpackage ParserElements
  679.  * @author Greg Beaver <[email protected]>
  680.  * @since 1.0rc1
  681.  * @version $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  682.  */
  683. class parserClass extends parserElement
  684. {
  685.     /**
  686.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  687.      * @var string always 'class'
  688.      */
  689.     var $type = 'class';
  690.     /** @var string 
  691.      * @see parserPage::$sourceLocation */
  692.     var $sourceLocation = '';
  693.     /**
  694.      * @var mixed false or contents of extends clause in class declaration
  695.      */
  696.     var $extends = false;
  697.     /**
  698.      * @var array a list of interfaces this class implements
  699.      */
  700.     var $_implements = array();
  701.     /**
  702.      * @var array a list of interfaces this class implements
  703.      * @access private
  704.      */
  705.     var $_modifiers false;
  706.     /**
  707.      * @var boolean determines whether a class is considered to be an interface
  708.      * @access private
  709.      */
  710.     var $_isInterface false;
  711.     /**
  712.      * Format: array(file, parent) where parent class is found or false if no parent
  713.      * @var mixed 
  714.      */
  715.     var $parent = false;
  716.     /**
  717.      * Used to determine whether a class should be ignored or not.  Helps maintain integrity of parsing
  718.      * @var boolean 
  719.      * @see Classes::getParentClass()
  720.      */
  721.     var $ignore = false;
  722.  
  723.     /**
  724.      * @var string same as {@link parserElement::$path}
  725.      */
  726.     var $curfile = false;
  727.     /**
  728.      * @var tutorialLink|falseeither a link to the tutorial associated with this class, or false
  729.      */
  730.     var $tutorial = false;
  731.     
  732.     /**
  733.      * Get the PHP5+ modifiers for this class
  734.      * (abstract/final/static/private/protected/public)
  735.      * @return array|false
  736.      */
  737.     function getModifiers()
  738.     {
  739.         return $this->_modifiers;
  740.     }
  741.  
  742.     /**
  743.      * Set the PHP5+ modifiers for this class
  744.      * (abstract/final/static/private/protected/public)
  745.      * @param string $m 
  746.      */
  747.     function setModifiers($m)
  748.     {
  749.         $this->_modifiers $m;
  750.     }
  751.     
  752.     /**
  753.      * @param parserTutorial 
  754.      * @param Converter 
  755.      */
  756.     function addTutorial($t,&$c)
  757.     {
  758.         $this->tutorial = new tutorialLink;
  759.         $this->tutorial->addLink('',$t->path,$t->name,$t->package,$t->subpackage,$t->getTitle($c));
  760.     }
  761.     
  762.     /**
  763.      * Get the associated tutorial for this class, if any
  764.      * @tutorial tutorials.pkg
  765.      * @return parserTutorial 
  766.      */
  767.     function getTutorial()
  768.     {
  769.         return $this->tutorial;
  770.     }
  771.     
  772.     /**
  773.      * Returns all classes in other packages that have the same name as this class
  774.      * @return mixed false or an array Format: (package => {@link parserClass} of conflicting classes)
  775.      * @param Converter 
  776.      */
  777.     function getConflicts(&$c)
  778.     {
  779.         $a $c->classes->getConflicts($this->name);
  780.         unset($a[$this->docblock->package]);
  781.         return $a;
  782.     }
  783.     
  784.     /**
  785.      * quick way to link to this element
  786.      * @return mixed converter-specific link to this class
  787.      * @param Converter 
  788.      * @param string text to display for the link or false for default text
  789.      */
  790.     function getLink($c$text false$returnobj false)
  791.     {
  792.         if ($returnobj)
  793.         {
  794.             return $c->getLink('object ' $this->name$this->docblock->package);
  795.         }
  796.         return $c->getClassLink($this->name$this->docblock->package$this->curfile$text);
  797.     }
  798.  
  799.     /**
  800.      * @param string parent class name
  801.      * @param string parent class file
  802.      * @param Classes {@link Classes} object currently calling setParent
  803.      * @see Classes::setClassParent()
  804.      */
  805.     
  806.     function setParent($p,$f&$c)
  807.     {
  808.         $this->parent = array($f$p);
  809.         $p $c->getClass($p$f);
  810.         // inherit package if no @package tag is in the docblock, fixes 591396
  811.         if (!$this->docblock->getExplicitPackage())
  812.         {
  813.             $this->docblock->package $p->docblock->package;
  814.         }
  815.         if ($this->docblock->package == $p->docblock->package)
  816.         {
  817.             if ($this->docblock->subpackage == '')
  818.             $this->docblock->subpackage $p->docblock->subpackage;
  819.         }
  820.         $author $p->docblock->getKeyword('author');
  821.         $version $p->docblock->getKeyword('version');
  822.         $copyright $p->docblock->getKeyword('copyright');
  823.         // inherit tags
  824.         if (!$this->docblock->getKeyword('author'))
  825.         {
  826.             if ($author && !is_array($author)) $author array($author);
  827.             if ($author$this->docblock->tags['author'$author;
  828.         }
  829.         if (!$this->docblock->getKeyword('version'))
  830.         {
  831.             if ($version && !is_array($version)) $version array($version);
  832.             if ($version$this->docblock->tags['version'$version;
  833.         }
  834.         if (!$this->docblock->getKeyword('copyright'))
  835.         {
  836.             if ($copyright && !is_array($copyright)) $copyright array($copyright);
  837.             if ($copyright$this->docblock->tags['copyright'$copyright;
  838.         }
  839.         if (!$this->docblock->sdesc)
  840.         {
  841.             $this->docblock->setShortDesc($p->docblock);
  842.             $this->docblock->setDesc($p->docblock);
  843.         else
  844.         {
  845.             if ($this->docblock->hasInheritDoc())
  846.             {
  847.                 $this->docblock->replaceInheritDoc($p->docblock);
  848.             }
  849.         }
  850.     }
  851.     
  852.     /**
  853.      * @param string $par parent class name (used by {@link Classes::setClassParent()} if parent class not found
  854.      */
  855.     function setParentNoClass($par)
  856.     {
  857.         $this->parent = $par;
  858.     }
  859.     
  860.     /**
  861.      * Use this method to set the type of class to be an interface
  862.      */
  863.     function setInterface()
  864.     {
  865.         $this->_isInterface true;
  866.     }
  867.     
  868.     /**
  869.      * @return boolean true if this is an interface class
  870.      */
  871.     function isInterface()
  872.     {
  873.         return $this->_isInterface;
  874.     }
  875.     
  876.     /**
  877.      * Use this method to set access modifiers for a class
  878.      * @param array 
  879.      */
  880.     function setAccessModifiers($modifiers)
  881.     {
  882.         $this->_modifiers $modifiers;
  883.     }
  884.     
  885.     /**
  886.      * retrieve object that represents the parent class
  887.      * @param Converter this function will not work before the Conversion stage of parsing
  888.      * @return mixed returns the {@link parserClass} representation of the parent class, or false if no parent class
  889.      */
  890.     function &getParent(&$c)
  891.     {
  892.         $a false;
  893.         if (!$this->parentreturn $a;
  894.         if (is_array($this->parent))
  895.         {
  896.             return $c->classes->getClass($this->parent[1],$this->parent[0]);
  897.         else return $this->parent;
  898.     }
  899.     
  900.     /**
  901.      * @param Converter this function will not work before the Conversion stage of parsing
  902.      * @return array returns a simple array of method objects
  903.      */
  904.     function getMethods(&$c)
  905.     {
  906.         return $c->classes->getMethods($this->name,$this->curfile);
  907.     }
  908.     
  909.     /**
  910.      * @return mixed {@link parserMethod} or false if not found
  911.      * @param Converter this function will not work before the Conversion stage of parsing
  912.      * @param string method name in this class
  913.      * @param boolean determines whether to search inherited methods as well
  914.      */
  915.     function getMethod(&$c$name$inherited false)
  916.     {
  917.         $ret $c->classes->getMethod($this->name$this->curfile$name);
  918.         if ($retreturn $ret;
  919.         if ($inherited{
  920.             $x $this;
  921.             while ($x->parent && is_array($x->parent)) {
  922.                 $par $x->getParent($c);
  923.                 $x $par;
  924.                 if ($meth $x->getMethod($c$name)) return $meth;
  925.             }
  926.         }
  927.         return false;
  928.     }
  929.     
  930.     /**
  931.      * @return mixed {@link parserVar} or false if not found
  932.      * @param Converter this function will not work before the Conversion stage of parsing
  933.      * @param string var name in this class
  934.      */
  935.     function getVar(&$c$name)
  936.     {
  937.         return $c->classes->getVar($this->name,$this->curfile,$name);
  938.     }
  939.     
  940.     /**
  941.      * @param Converter this function will not work before the Conversion stage of parsing
  942.      * @return array returns a simple array of method name strings
  943.      */
  944.     function getMethodNames(&$c)
  945.     {
  946.         if (!$c->classes->hasMethods($this->curfile$this->name)) return array();
  947.         $arr array();
  948.         $arr1 $this->getMethods($c);
  949.         for($i=0$i count($arr1)$i++)
  950.         {
  951.             $arr[$arr1[$i]->name;
  952.         }
  953.         return $arr;
  954.     }
  955.     
  956.     /**
  957.      * @param Converter this function will not work before the Conversion stage of parsing
  958.      * @param string method name
  959.      * @param boolean determines whether to search inherited methods as well
  960.      * @return boolean whether this class has a method of name $name
  961.      */
  962.     function hasMethod(&$c$name$inherited false)
  963.     {
  964.         $ret $c->classes->hasMethod($this->name$this->curfile$name);
  965.         if ($retreturn $ret;
  966.         if ($inherited{
  967.             $x $this;
  968.             while ($x->parent && is_array($x->parent)) {
  969.                 $par $x->getParent($c);
  970.                 $x $par;
  971.                 if ($x->hasMethod($c$name)) return true;
  972.             }
  973.         }
  974.         return false;
  975.     }
  976.     
  977.     /**
  978.      * @param Converter this function will not work before the Conversion stage of parsing
  979.      * @param string var name
  980.      * @return boolean whether this class has a var of name $name
  981.      */
  982.     function hasVar(&$c,$name)
  983.     {
  984.         return $c->classes->hasVar($this->name$this->curfile$name);
  985.     }
  986.     
  987.     /**
  988.      * @param Converter this function will not work before the Conversion stage of parsing
  989.      * @param string class constant name
  990.      * @return boolean whether this class has a constant of name $name
  991.      */
  992.     function hasConst(&$c,$name)
  993.     {
  994.         return $c->classes->hasConst($this->name$this->curfile$name);
  995.     }
  996.     
  997.     /**
  998.      * @param Converter this function will not work before the Conversion stage of parsing
  999.      * @return array returns a simple array of var objects
  1000.      */
  1001.     function getVars(&$c)
  1002.     {
  1003.         return $c->classes->getVars($this->name,$this->curfile);
  1004.     }
  1005.     
  1006.     /**
  1007.      * @param Converter this function will not work before the Conversion stage of parsing
  1008.      * @return array returns a simple array of const objects
  1009.      */
  1010.     function getConsts(&$c)
  1011.     {
  1012.         return $c->classes->getConsts($this->name,$this->curfile);
  1013.     }
  1014.     
  1015.     /**
  1016.      * @param Converter this function will not work before the Conversion stage of parsing
  1017.      * @return array returns a simple array of var name strings
  1018.      */
  1019.     function getVarNames(&$c)
  1020.     {
  1021.         if (!$c->classes->hasVars($this->curfile$this->name)) return array();
  1022.         $arr array();
  1023.         $arr1 $this->getVars($c);
  1024.         for($i=0$i count($arr1)$i++)
  1025.         {
  1026.             $arr[$arr1[$i]->name;
  1027.         }
  1028.         return $arr;
  1029.     }
  1030.     
  1031.     /**
  1032.      * @param Converter this function will not work before the Conversion stage of parsing
  1033.      * @return array returns a simple array of const name strings
  1034.      */
  1035.     function getConstNames(&$c)
  1036.     {
  1037.         if (!$c->classes->hasConsts($this->curfile$this->name)) return array();
  1038.         $arr array();
  1039.         $arr1 $this->getConsts($c);
  1040.         for($i=0$i count($arr1)$i++)
  1041.         {
  1042.             $arr[$arr1[$i]->name;
  1043.         }
  1044.         return $arr;
  1045.     }
  1046.     
  1047.     /**
  1048.      * @param Converter this function will not work before the Conversion stage of parsing
  1049.      * @param boolean determines whether overriden methods should be included in the list of inherited methods
  1050.      * @return array returns an array of methods by parent classname array(name => array(method1,method2..),name2 => array(method1....))
  1051.      */
  1052.     function getInheritedMethods(&$c,$override false)
  1053.     {
  1054.         $x $oldx $this;
  1055.         $methods array();
  1056.         $arr array();
  1057.         while ($x->parent && is_array($x->parent))
  1058.         {
  1059.             $methods array_merge($methods,$x->getMethodNames($c));
  1060.             $par $x->getParent($c);
  1061.             $parmethodnames $par->getMethodNames($c);
  1062.             $parmethods $par->getMethods($c);
  1063.             for($i=0$i<count($parmethodnames)$i++)
  1064.             {
  1065.                 if ($override)
  1066.                 {
  1067.                     if (!in_array($parmethodnames[$i],$methods))
  1068.                     {
  1069.                         // fix for bug 587733
  1070.                         if ($parmethods[$i]->docblock && $parmethods[$i]->docblock->hasaccess && !$c->parseprivate && $parmethods[$i]->docblock->tags['access'][0]->value == 'private')
  1071.                         {
  1072.                             continue;
  1073.                         }
  1074.                         $methods[$parmethodnames[$i];
  1075.                         $arr[$par->getName()]['methods'][$parmethods[$i];
  1076.                         $arr[$par->getName()]['file'$par->curfile;
  1077.                     }
  1078.                 else
  1079.                 {
  1080.                     // fix for bug 587733
  1081.                     if ($parmethods[$i]->docblock && $parmethods[$i]->docblock->hasaccess && !$c->parseprivate && $parmethods[$i]->docblock->tags['access'][0]->value == 'private')
  1082.                     {
  1083.                         continue;
  1084.                     }
  1085.                     $arr[$par->getName()]['methods'][$parmethods[$i];
  1086.                     $arr[$par->getName()]['file'$par->curfile;
  1087.                 }
  1088.             }
  1089.             $oldx $x;
  1090.             $x &$par;
  1091.         }
  1092.         if (is_a($oldx'parserClass'&& is_a($oldx->getExtends(true)'ReflectionClass')) {
  1093.             $extends $oldx->getExtends(true);
  1094.             foreach ($extends->getMethods(as $method{
  1095.                 $var new parserMethod($oldx->getExtends());
  1096.                 if ($method->returnsReference()) {
  1097.                     $var->setReturnsReference();
  1098.                 }
  1099.                 $doc new parserDocBlock;
  1100.                 foreach ($method->getParameters(as $param{
  1101.                     $value $param->isDefaultValueAvailable(var_export($param->getDefaultValue()truenull;
  1102.                     if ($param->isPassedByReference()) {
  1103.                         $var->addParam('&$' $param->getName()$value$param->isOptional(),
  1104.                             $param->getClass());
  1105.                     else {
  1106.                         $var->addParam('$' $param->getName()$value$param->isOptional(),
  1107.                             $param->getClass());
  1108.                     }
  1109.                 }
  1110.                 $var->setName($method->getName());
  1111.                 $doc->addPackage('package'$oldx->getPackage());
  1112.                 $var->setDocBlock($doc);
  1113.                 $par $method->getDeclaringClass();
  1114.                 $var->setLineNumber($par->getStartLine());
  1115.                 $modifiers array();
  1116.                 if ($method->isPrivate()) {
  1117.                     $modifiers['private';
  1118.                 }
  1119.                 if ($method->isAbstract()) {
  1120.                     $modifiers['abstract';
  1121.                 }
  1122.                 if ($method->isFinal()) {
  1123.                     $modifiers['final';
  1124.                 }
  1125.                 if ($method->isProtected()) {
  1126.                     $modifiers['protected';
  1127.                 }
  1128.                 if ($method->isPublic()) {
  1129.                     $modifiers['public';
  1130.                 }
  1131.                 if ($method->isStatic()) {
  1132.                     $modifiers['static';
  1133.                 }
  1134.                 if ($method->isConstructor()) {
  1135.                     $var->setConstructor();
  1136.                 }
  1137.                 $var->setModifiers($modifiers);
  1138.                 $arr[$oldx->getExtends()]['methods'][$var;
  1139.                 $arr[$oldx->getExtends()]['file''(internal)';
  1140.             }
  1141.         }
  1142.         return $arr;
  1143.     }
  1144.     
  1145.     /**
  1146.      * @param Converter this function will not work before the Conversion stage of parsing
  1147.      * @param boolean determines whether overriden vars should be included in the list of inherited vars
  1148.      * @return array returns an array of vars by parent classname array(name => array(var1,var1..),name2 => array(var1....))
  1149.      */
  1150.     function getInheritedVars(&$c,$override true$vars false)
  1151.     {
  1152.         $x $oldx $this;
  1153.         $vars array();
  1154.         $arr array();
  1155.         while ($x->parent && is_array($x->parent))
  1156.         {
  1157.             $vars array_merge($vars,$x->getVarNames($c));
  1158.             $par $x->getParent($c);
  1159.             $parvarnames $par->getVarNames($c);
  1160.             $parvars $par->getVars($c);
  1161.             for($i=0$i<count($parvarnames)$i++)
  1162.             {
  1163.                 if ($override)
  1164.                 {
  1165.                     if (!in_array($parvarnames[$i],$vars))
  1166.                     {
  1167.                         // fix for bug 587733
  1168.                         if ($parvars[$i]->docblock && $parvars[$i]->docblock->hasaccess && !$c->parseprivate && $parvars[$i]->docblock->tags['access'][0]->value == 'private')
  1169.                         {
  1170.                             continue;
  1171.                         }
  1172.                         $vars[$parvarnames[$i];
  1173.                         $arr[$par->getName()]['vars'][$parvars[$i];
  1174.                         $arr[$par->getName()]['file'$par->curfile;
  1175.                     }
  1176.                 else
  1177.                 {
  1178.                     // fix for bug 587733
  1179.                     if ($parvars[$i]->docblock && $parvars[$i]->docblock->hasaccess && !$c->parseprivate && $parvars[$i]->docblock->tags['access'][0]->value == 'private')
  1180.                     {
  1181.                         continue;
  1182.                     }
  1183.                     $arr[$par->getName()]['vars'][$parvars[$i];
  1184.                     $arr[$par->getName()]['file'$par->curfile;
  1185.                 }
  1186.             }
  1187.             $oldx $x;
  1188.             $x &$par;
  1189.         }
  1190.         if (is_a($oldx'parserClass'&& is_a($oldx->getExtends(true)'ReflectionClass')) {
  1191.             $extends $oldx->getExtends(true);
  1192.             foreach ($extends->getProperties(as $property{
  1193.                 $var new parserVar($oldx->getExtends());
  1194.                 $doc new parserDocBlock;
  1195.                 $var->setName('$' $property->getName());
  1196.                 $doc->addPackage('package'$oldx->getPackage());
  1197.                 $par $property->getDeclaringClass();
  1198.                 $var->setLineNumber($par->getStartLine());
  1199.                 $modifiers array();
  1200.                 if ($property->isPrivate()) {
  1201.                     $modifiers['private';
  1202.                     $doc->addAccess('private');
  1203.                 }
  1204.                 if ($property->isProtected()) {
  1205.                     $modifiers['protected';
  1206.                     $doc->addAccess('protected');
  1207.                 }
  1208.                 if ($property->isPublic()) {
  1209.                     $modifiers['public';
  1210.                     $doc->addAccess('public');
  1211.                 }
  1212.                 $var->setDocBlock($doc);
  1213.                 $var->setModifiers($modifiers);
  1214.                 $arr[$oldx->getExtends()]['vars'][$var;
  1215.                 $arr[$oldx->getExtends()]['file''(internal)';
  1216.             }
  1217.         }
  1218.         return $arr;
  1219.     }
  1220.     
  1221.     /**
  1222.      * @param Converter this function will not work before the Conversion stage of parsing
  1223.      * @param boolean determines whether overriden vars should be included in the list of inherited vars
  1224.      * @return array returns an array of consts by parent classname array(name => array(const1,const2..),name2 => array(const1....))
  1225.      */
  1226.     function getInheritedConsts(&$c,$override false$consts false)
  1227.     {
  1228.         $x $oldx $this;
  1229.         $consts array();
  1230.         $arr array();
  1231.         while ($x->parent && is_array($x->parent))
  1232.         {
  1233.             $consts array_merge($consts,$x->getConstNames($c));
  1234.             $par $x->getParent($c);
  1235.             $parvarnames $par->getConstNames($c);
  1236.             $parvars $par->getConsts($c);
  1237.             for($i=0$i<count($parvarnames)$i++)
  1238.             {
  1239.                 if ($override)
  1240.                 {
  1241.                     if (!in_array($parvarnames[$i],$consts))
  1242.                     {
  1243.                         // fix for bug 587733
  1244.                         if ($parvars[$i]->docblock && $parvars[$i]->docblock->hasaccess && !$c->parseprivate && $parvars[$i]->docblock->tags['access'][0]->value == 'private')
  1245.                         {
  1246.                             continue;
  1247.                         }
  1248.                         $consts[$parvarnames[$i];
  1249.                         $arr[$par->getName()]['consts'][$parvars[$i];
  1250.                         $arr[$par->getName()]['file'$par->curfile;
  1251.                     }
  1252.                 else
  1253.                 {
  1254.                     // fix for bug 587733
  1255.                     if ($parvars[$i]->docblock && $parvars[$i]->docblock->hasaccess && !$c->parseprivate && $parvars[$i]->docblock->tags['access'][0]->value == 'private')
  1256.                     {
  1257.                         continue;
  1258.                     }
  1259.                     $arr[$par->getName()]['consts'][$parvars[$i];
  1260.                     $arr[$par->getName()]['file'$par->curfile;
  1261.                 }
  1262.             }
  1263.             $oldx $x;
  1264.             $x &$par;
  1265.         }
  1266.         if (is_a($oldx'parserClass'&& is_a($oldx->getExtends(true)'ReflectionClass')) {
  1267.             $extends $oldx->getExtends(true);
  1268.             if (!$extends->getConstants()) {
  1269.                 return $arr;
  1270.             }
  1271.             foreach ($extends->getConstants(as $property => $value{
  1272.                 $var new parserConst($oldx->getExtends());
  1273.                 $doc new parserDocBlock;
  1274.                 $var->setName($property);
  1275.                 $var->setValue(var_export($valuetrue));
  1276.                 $doc->addPackage('package'$oldx->getPackage());
  1277.                 $var->setLineNumber($extends->getStartLine());
  1278.                 $var->setDocBlock($doc);
  1279.                 $arr[$oldx->getExtends()]['consts'][$var;
  1280.                 $arr[$oldx->getExtends()]['file''(internal)';
  1281.             }
  1282.         }
  1283.         return $arr;
  1284.     }
  1285.     
  1286.     /**
  1287.      * @param Converter this function will not work before the Conversion stage of parsing
  1288.      * @return array Format: array(parentclassname => parserClass/false if no parent, parentclassname2 => ...)
  1289.      */
  1290.     function getParentClassTree(&$c)
  1291.     {
  1292.         $result array();
  1293.         $result[$this->name$arr $this->getParent($c);
  1294.         if (is_string($arr)) $result[$arrfalse;
  1295.         while ($arr && is_object($arr))
  1296.         {
  1297.             $result[$arr->name$arr->getParent($c);
  1298.             $arr $arr->getParent($c);
  1299.             if (is_string($arr)) $result[$arrfalse;
  1300.         }
  1301.         return $result;
  1302.     }
  1303.     
  1304.     /**
  1305.      * returns a list of all child classes of this class
  1306.      * @param Converter this function will not work before the Conversion stage of parsing
  1307.      * @return array Format: array(parserClass child1,parserClass child2,...)
  1308.      */
  1309.     function getChildClassList(&$c)
  1310.     {
  1311.         $list array();
  1312.         $kids $c->classes->getDefiniteChildren($this->name,$this->curfile);
  1313.         if ($kids)
  1314.         {
  1315.             foreach($kids as $chile => $file)
  1316.             {
  1317.                 $list[$c->classes->getClass($chile,$file);
  1318.             }
  1319.         }
  1320.         return $list;
  1321.     }
  1322.     
  1323.     /**
  1324.      * @param string 
  1325.      * @see $sourceLocation
  1326.      */
  1327.     function setSourceLocation($sl)
  1328.     {
  1329.         $this->sourceLocation = $sl;
  1330.     }
  1331.     
  1332.     /**
  1333.      * @param Converter 
  1334.      * @param boolean 
  1335.      * @return string 
  1336.      * @see $sourceLocation
  1337.      */
  1338.     function getSourceLocation($c,$pearize false)
  1339.     {
  1340.         global $_phpDocumentor_options;
  1341.         if (!isset($this->sourceLocation)) return false;
  1342.         if ($pearize)
  1343.         {
  1344.             $sl $this->sourceLocation;
  1345.             if (strpos($sl,'pear/'))
  1346.             {
  1347.                 $sl substr($sl,strpos($sl,'pear/'5);
  1348.                 return $sl;
  1349.             else
  1350.             {
  1351.                 return $sl;
  1352.             }
  1353.             return $sl;
  1354.         }
  1355.         return $this->sourceLocation;
  1356.     }
  1357.     
  1358.     /**
  1359.      * @param string 
  1360.      * @see $extends
  1361.      */
  1362.     function setExtends($extends)
  1363.     {
  1364.         $this->extends = $extends;
  1365.         if (!class_exists('ReflectionClass'|| !class_exists($extends)) {
  1366.             return;
  1367.         }
  1368.         // this may throw an exception.  Hopefully it won't if the class exists
  1369.         $parent new ReflectionClass($extends);
  1370.         if (!$parent->isInternal()) {
  1371.             return;
  1372.         }
  1373.         $this->extends = $parent;
  1374.     }
  1375.     
  1376.     /**
  1377.      * @param string 
  1378.      */
  1379.     function addImplements($implements)
  1380.     {
  1381.         $this->_implements[$implements;
  1382.     }
  1383.     
  1384.     /**
  1385.      * @return array 
  1386.      */
  1387.     function getImplements()
  1388.     {
  1389.         return $this->_implements;
  1390.     }
  1391.     
  1392.     /**
  1393.      * @return boolean 
  1394.      * @see $extends
  1395.      */
  1396.     function getExtends($raw false)
  1397.     {
  1398.         if (!isset($this->extends)) return false;
  1399.         if (!$raw{
  1400.             if (is_a($this->extends'ReflectionClass')) {
  1401.                 return $this->extends->getName();
  1402.             }
  1403.         }
  1404.         return $this->extends;
  1405.     }
  1406. }
  1407.  
  1408. /**
  1409.  * @package phpDocumentor
  1410.  * @subpackage ParserElements
  1411.  * @author Greg Beaver <[email protected]>
  1412.  * @since 1.0rc1
  1413.  * @version $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  1414.  */
  1415. class parserVar extends parserElement
  1416. {
  1417.     /**
  1418.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  1419.      * @var string always 'var'
  1420.      */
  1421.     var $type = 'var';
  1422.     /** @var string class that contains this var */
  1423.     var $class = '';
  1424.     /** @var array */
  1425.     var $_modifiers;
  1426.     
  1427.     /**
  1428.      * @param string 
  1429.      */
  1430.     function parserVar($class)
  1431.     {
  1432.         $this->class = $class;
  1433.     }
  1434.     
  1435.     /**
  1436.      * Retrieve the class name
  1437.      * @return string Class name that this var belongs to
  1438.      */
  1439.     function getClass()
  1440.     {
  1441.         return $this->class;
  1442.     }
  1443.     
  1444.     /**
  1445.      * Return a list of access modifiers (static/private/etc.)
  1446.      * @return array 
  1447.      */
  1448.     function getModifiers()
  1449.     {
  1450.         return $this->_modifiers;
  1451.     }
  1452.     
  1453.     /**
  1454.      * Return name of the class that contains this method
  1455.      * @return string 
  1456.      */
  1457.     function setModifiers($m)
  1458.     {
  1459.         $this->_modifiers = $m;
  1460.     }
  1461.  
  1462.     /**
  1463.      * quick way to link to this element
  1464.      * @return mixed converter-specific link to this var
  1465.      * @param Converter $c 
  1466.      * @param string $text text to display for the link or false for default text
  1467.      */
  1468.     function getLink($c$text false$returnobj false)
  1469.     {
  1470.         if ($returnobj)
  1471.         {
  1472.             return $c->getLink($this->class . '::' $this->name$this->docblock->package);
  1473.         }
  1474.         return $c->getVarLink($this->name$this->class$this->docblock->packagefalse$text);
  1475.     }
  1476.  
  1477.     /**
  1478.      * @param Converter 
  1479.      * @return mixed {@link parserVar} representing var this var overrides from the parent class, or false if none
  1480.      */
  1481.     function getOverrides(&$c)
  1482.     {
  1483.         $class $c->classes->getClass($this->class,$this->path);
  1484.         $par $class->getParent($c);
  1485.         
  1486.         if (!is_object($par)) {
  1487.             if (is_a($class->getExtends(true)'ReflectionClass')) {
  1488.                 $pare $class->getExtends(true);
  1489.                 if (method_exists($pare'hasProperty'&&
  1490.                       $pare->hasProperty(substr($this->name1))) {
  1491.                     $par $pare;
  1492.                     $property $par->getProperty(substr($this->name1));
  1493.                     $ret new parserVar($par->getName());
  1494.                     $doc new parserDocBlock;
  1495.                     $ret->setName('$' $property->getName());
  1496.                     $doc->addPackage('package'$class->getPackage());
  1497.                     $ret->setLineNumber($par->getStartLine());
  1498.                     $modifiers array();
  1499.                     if ($property->isPrivate()) {
  1500.                         if ($c->parseprivate{
  1501.                             return false;
  1502.                         }
  1503.                         $modifiers['private';
  1504.                         $doc->addAccess('private');
  1505.                     }
  1506.                     if ($property->isProtected()) {
  1507.                         $modifiers['protected';
  1508.                         $doc->addAccess('protected');
  1509.                     }
  1510.                     if ($property->isPublic()) {
  1511.                         $modifiers['public';
  1512.                         $doc->addAccess('public');
  1513.                     }
  1514.                     $ret->setDocBlock($doc);
  1515.                     $ret->setModifiers($modifiers);
  1516.                     return $ret;
  1517.                 }
  1518.             }
  1519.         }
  1520.         while (is_object($par))
  1521.         {
  1522.             if ($par->hasVar($c,$this->name))
  1523.             {
  1524.                 $var $par->getVar($c,$this->name);
  1525.                 if (!($var->docblock && $var->docblock->hasaccess &&
  1526.                       !$c->parseprivate && $var->docblock->tags['access'][0]->value == 'private')) {
  1527.                     return $var;
  1528.                 }
  1529.             }
  1530.             $par $par->getParent($c);
  1531.         }
  1532.         
  1533.         return false;
  1534.     }
  1535.  
  1536.     /**
  1537.      * @param Converter 
  1538.      * @return array an array of parserVars from ALL child classes that override this var
  1539.      */
  1540.     function getOverridingVars(&$c)
  1541.     {
  1542.         $class $c->classes->getClass($this->class,$this->path);
  1543.  
  1544.                 return $this->getOverridingVarsForClass($c$class);
  1545.     }
  1546.  
  1547.     /**
  1548.      * @param Converter 
  1549.          * @param parserClass 
  1550.      * @return array an array of parserVars from ALL child classes that override this var in the given class
  1551.      */
  1552.         function getOverridingVarsForClass(&$c&$class)
  1553.         {
  1554.             $vars array();
  1555.             if (!$classreturn $meths;
  1556.             $kids $class->getChildClassList($c);
  1557.             for($i=0$i<count($kids)$i++)
  1558.             {
  1559.                     if ($kids[$i]->hasVar($c$this->name))
  1560.                     {
  1561.                         $var $kids[$i]->getVar($c,$this->name);
  1562.                         if (!($var->docblock && $var->docblock->hasaccess && !$c->parseprivate && $var->docblock->tags['access'][0]->value == 'private'))
  1563.                             $vars[$var;
  1564.                     }
  1565.  
  1566.                     $vars array_merge($vars$this->getOverridingVarsForClass($c$kids[$i]));
  1567.             }
  1568.             return $vars;
  1569.         }
  1570. }
  1571.  
  1572. /**
  1573.  * @package phpDocumentor
  1574.  * @subpackage ParserElements
  1575.  * @author Greg Beaver <[email protected]>
  1576.  * @since 1.2.4
  1577.  */
  1578. class parserConst extends parserElement
  1579. {
  1580.     /**
  1581.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  1582.      * @var string always 'const'
  1583.      */
  1584.     var $type = 'const';
  1585.     /** @var string class that contains this var */
  1586.     var $class = '';
  1587.     
  1588.     /**
  1589.      * @param string 
  1590.      */
  1591.     function parserConst($class)
  1592.     {
  1593.         $this->class = $class;
  1594.     }
  1595.     
  1596.     /**
  1597.      * Retrieve the class name
  1598.      * @return string Class name that this var belongs to
  1599.      */
  1600.     function getClass()
  1601.     {
  1602.         return $this->class;
  1603.     }
  1604.  
  1605.     /**
  1606.      * quick way to link to this element
  1607.      * @return mixed converter-specific link to this var
  1608.      * @param Converter $c 
  1609.      * @param string $text text to display for the link or false for default text
  1610.      */
  1611.     function getLink($c$text false$returnobj false)
  1612.     {
  1613.         if ($returnobj)
  1614.         {
  1615.             return $c->getLink($this->class . '::'$this->name$this->docblock->package);
  1616.         }
  1617.         return $c->getConstLink($this->name$this->class$this->docblock->packagefalse$text);
  1618.     }
  1619. }
  1620.  
  1621. /**
  1622.  * @package phpDocumentor
  1623.  * @subpackage ParserElements
  1624.  * @author Greg Beaver <[email protected]>
  1625.  * @since 1.0rc1
  1626.  * @version $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  1627.  */
  1628. class parserMethod extends parserFunction
  1629. {
  1630.     /**
  1631.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  1632.      * @var string always 'method'
  1633.      */
  1634.     var $type = 'method';
  1635.     /** @var boolean whether this method is a constructor */
  1636.     var $isConstructor = false;
  1637.     /** @var boolean whether this method is a destructor by PEAR standards */
  1638.     var $isDestructor = false;
  1639.     /** @var string class that contains this method */
  1640.     var $class = '';
  1641.     var $_modifiers = array();
  1642.     
  1643.     /**
  1644.      * @param string 
  1645.      */
  1646.     function parserMethod($class)
  1647.     {
  1648.         $this->class = $class;
  1649.     }
  1650.     
  1651.     /**
  1652.      * @param string 
  1653.      * @param string default value parsed from function definition
  1654.      * @param boolean indicates whether this parameter has a default value
  1655.      * @param null|stringclass type hint
  1656.      */
  1657.     function addParam($name$value$has_default true$typehint null)
  1658.     {
  1659.         $this->params[$namearray($value$has_default);
  1660.         if (isset($typehint))
  1661.         {
  1662.             $this->params[$name][2$typehint;
  1663.         }
  1664.     }
  1665.     
  1666.     /**
  1667.      * adds "constructor " to start of function call if {@link $isConstructor} is true
  1668.      * @return string 
  1669.      * @see parent::getFunctionCall()
  1670.      */
  1671.     function getFunctionCall()
  1672.     {
  1673.         $a parserFunction::getFunctionCall();
  1674.         if ($this->isConstructor$a "constructor $a";
  1675.         return $a;
  1676.     }
  1677.     
  1678.     function getIntricateFunctionCall($converter,$paramtags)
  1679.     {
  1680.         $a parserFunction::getIntricateFunctionCall($converter,$paramtags);
  1681.         if ($this->isConstructor$a['constructor'true;
  1682.         if ($this->isDestructor$a['destructor'true;
  1683.         return $a;
  1684.     }
  1685.     
  1686.     /**
  1687.      * Return name of the class that contains this method
  1688.      * @return string 
  1689.      */
  1690.     function getClass()
  1691.     {
  1692.         return $this->class;
  1693.     }
  1694.     
  1695.     /**
  1696.      * Return name of the class that contains this method
  1697.      * @return string 
  1698.      */
  1699.     function getModifiers()
  1700.     {
  1701.         return $this->_modifiers;
  1702.     }
  1703.     
  1704.     /**
  1705.      * Return name of the class that contains this method
  1706.      * @return string 
  1707.      */
  1708.     function setModifiers($m)
  1709.     {
  1710.         $this->_modifiers = $m;
  1711.     }
  1712.     
  1713.     /**
  1714.      * @param Converter 
  1715.      * @return mixed {@link parserMethod} representing method this method
  1716.      *  overrides from the parent class, or false if none
  1717.      */
  1718.     function getOverrides(&$c)
  1719.     {
  1720.         $class $c->classes->getClass($this->class,$this->path);
  1721.         
  1722.         $par $class->getParent($c);
  1723.         if (!is_object($par)) {
  1724.             if (is_a($class->getExtends(true)'ReflectionClass')) {
  1725.                 $pare $class->getExtends(true);
  1726.                 if (method_exists($pare'hasMethod'&& $pare->hasMethod($this->name)) {
  1727.                     $par $pare;
  1728.                     $method $par->getMethod($this->name);
  1729.                     $var new parserMethod($par->getName());
  1730.                     if ($method->returnsReference()) {
  1731.                         $var->setReturnsReference();
  1732.                     }
  1733.                     $doc new parserDocBlock;
  1734.                     foreach ($method->getParameters(as $param{
  1735.                         $value $param->isOptional(var_export($param->getDefaultValue()truenull;
  1736.                         if ($param->isPassedByReference()) {
  1737.                             $var->addParam('&$' $param->getName()$value$param->isOptional(),
  1738.                                 $param->getClass());
  1739.                         else {
  1740.                             $var->addParam('$' $param->getName()$value$param->isOptional(),
  1741.                                 $param->getClass());
  1742.                         }
  1743.                     }
  1744.                     $var->setName($method->getName());
  1745.                     $doc->addPackage('package'$this->getPackage());
  1746.                     $par $method->getDeclaringClass();
  1747.                     $var->setLineNumber($par->getStartLine());
  1748.                     $modifiers array();
  1749.                     if ($method->isPrivate()) {
  1750.                         $modifiers['private';
  1751.                         $doc->addAccess('private');
  1752.                     }
  1753.                     $blank new parserStringWithInlineTags;
  1754.                     if ($method->isAbstract()) {
  1755.                         $modifiers['abstract';
  1756.                         $doc->addKeyword('abstract'$blank);
  1757.                     }
  1758.                     if ($method->isFinal()) {
  1759.                         $modifiers['final';
  1760.                         $doc->addKeyword('final'$blank);
  1761.                     }
  1762.                     if ($method->isProtected()) {
  1763.                         $modifiers['protected';
  1764.                         $doc->addAccess('protected');
  1765.                     }
  1766.                     if ($method->isPublic()) {
  1767.                         $modifiers['public';
  1768.                         $doc->addAccess('public');
  1769.                     }
  1770.                     if ($method->isStatic()) {
  1771.                         $modifiers['static';
  1772.                         $doc->addKeyword('static'$blank);
  1773.                     }
  1774.                     if ($method->isConstructor()) {
  1775.                         $var->setConstructor();
  1776.                     }
  1777.                     $var->setDocBlock($doc);
  1778.                     $var->setModifiers($modifiers);
  1779.                     return $var;
  1780.                 }
  1781.             }
  1782.         }
  1783.  
  1784.         while (is_object($par))
  1785.         {
  1786.             if ($par->hasMethod($c,$this->name))
  1787.             {
  1788.                 $meth $par->getMethod($c,$this->name);
  1789.                 if (!($meth->docblock && $meth->docblock->hasaccess &&
  1790.                       !$c->parseprivate && $meth->docblock->tags['access'][0]->value == 'private')) {
  1791.                     return $meth;
  1792.                 }
  1793.             }
  1794.             
  1795.             $par $par->getParent($c);
  1796.         }
  1797.         
  1798.         return false;
  1799.     }
  1800.     /**
  1801.      * @param Converter 
  1802.      * @return mixed {@link parserMethod} representing method this method implements
  1803.      *  from an interface, or false if none
  1804.      */
  1805.     function getImplements(&$c)
  1806.     {
  1807.         $class $c->classes->getClass($this->class,$this->path);
  1808.         
  1809.         $implements $class->getImplements();
  1810.         if (!count($implements)) {
  1811.             return false;
  1812.         }
  1813.         $ret array();
  1814.         $haveAlready array();
  1815.         foreach ($implements as $interface{
  1816.             $interface_link $c->getLink('object ' $interface);
  1817.             if (is_a($interface_link'classlink')) {
  1818.                 $par $c->classes->getClass($interface_link->name,
  1819.                     $interface_link->path);
  1820.                 if (is_object($par)) {
  1821.                     if ($par->hasMethod($c$this->nametrue))
  1822.                     {
  1823.                         $meth $par->getMethod($c$this->name);
  1824.                         if (!$meth{
  1825.                             $meth $par->getMethod($c$this->nametrue);
  1826.                         }
  1827.                         if (!($meth->docblock && $meth->docblock->hasaccess &&
  1828.                               !$c->parseprivate && $meth->docblock->tags['access'][0]->value == 'private')) {
  1829.                             if (isset($haveAlready[$meth->getClass()])) {
  1830.                                 // this ensures extended interfaces don't cause
  1831.                                 // 2 links to the same method
  1832.                                 if ($haveAlready[$meth->getClass()== $this->name{
  1833.                                     continue;
  1834.                                 }
  1835.                             }
  1836.                             $ret[$meth;
  1837.                             $haveAlready array($meth->getClass(=> $this->name);
  1838.                         }
  1839.                     }
  1840.                 }
  1841.                 continue;
  1842.             }
  1843.             if (class_exists('ReflectionClass')) {
  1844.                 if (interface_exists($interface)) {
  1845.                     $info new ReflectionClass($interface);
  1846.                     if (method_exists($info'hasMethod'&& $info->hasMethod($this->name)) {
  1847.                         $par $info;
  1848.                         $method $par->getMethod($this->name);
  1849.                         $var new parserMethod($par->getName());
  1850.                         if ($method->returnsReference()) {
  1851.                             $var->setReturnsReference();
  1852.                         }
  1853.                         $doc new parserDocBlock;
  1854.                         foreach ($method->getParameters(as $param{
  1855.                             $value $param->isOptional(var_export($param->getDefaultValue()truenull;
  1856.                             if ($param->isPassedByReference()) {
  1857.                                 $var->addParam('&$' $param->getName()$value$param->isOptional(),
  1858.                                     $param->getClass());
  1859.                             else {
  1860.                                 $var->addParam('$' $param->getName()$value$param->isOptional(),
  1861.                                     $param->getClass());
  1862.                             }
  1863.                         }
  1864.                         $var->setName($method->getName());
  1865.                         $doc->addPackage('package'$this->getPackage());
  1866.                         $par $method->getDeclaringClass();
  1867.                         $var->setLineNumber($par->getStartLine());
  1868.                         $modifiers array();
  1869.                         if ($method->isPrivate()) {
  1870.                             $modifiers['private';
  1871.                             $doc->addAccess('private');
  1872.                         }
  1873.                         $blank new parserStringWithInlineTags;
  1874.                         if ($method->isAbstract()) {
  1875.                             $modifiers['abstract';
  1876.                             $doc->addKeyword('abstract'$blank);
  1877.                         }
  1878.                         if ($method->isFinal()) {
  1879.                             $modifiers['final';
  1880.                             $doc->addKeyword('final'$blank);
  1881.                         }
  1882.                         if ($method->isProtected()) {
  1883.                             $modifiers['protected';
  1884.                             $doc->addAccess('protected');
  1885.                         }
  1886.                         if ($method->isPublic()) {
  1887.                             $modifiers['public';
  1888.                             $doc->addAccess('public');
  1889.                         }
  1890.                         if ($method->isStatic()) {
  1891.                             $modifiers['static';
  1892.                             $doc->addKeyword('static'$blank);
  1893.                         }
  1894.                         if ($method->isConstructor()) {
  1895.                             $var->setConstructor();
  1896.                         }
  1897.                         $var->setDocBlock($doc);
  1898.                         $var->setModifiers($modifiers);
  1899.                         $ret[$var;
  1900.                         continue;
  1901.                     }
  1902.                 }
  1903.             }
  1904.         }
  1905.         
  1906.         return $ret;
  1907.     }
  1908.     
  1909.     /**
  1910.      * quick way to link to this element
  1911.      * @return mixed converter-specific link to this method
  1912.      * @param Converter $c 
  1913.      * @param string $text text to display for the link or false for default text
  1914.      */
  1915.     function getLink($c$text false$returnobj false)
  1916.     {
  1917.         if ($returnobj)
  1918.         {
  1919.             return $c->getLink($this->class . '::' $this->name . '()'$this->docblock->package);
  1920.         }
  1921.         return $c->getMethodLink($this->name$this->class$this->docblock->packagefalse$text);
  1922.     }
  1923.  
  1924.     /**
  1925.      * Use this method to tell the parser that this method is the class constructor
  1926.      */
  1927.     function setConstructor()
  1928.     {
  1929.         $this->isConstructor = true;
  1930.     }
  1931.     
  1932.     /**
  1933.      * Use this method to tell the parser that this method is the class constructor
  1934.      */
  1935.     function setDestructor()
  1936.     {
  1937.         $this->isDestructor = true;
  1938.     }
  1939.     
  1940.     /**
  1941.      * @param Converter 
  1942.      * @return array an array of parserMethods from child classes that override this method
  1943.      */
  1944.     function getOverridingMethods(&$c)
  1945.     {
  1946.         $class $c->classes->getClass($this->class,$this->path);
  1947.  
  1948.                 return $this->getOverridingMethodsForClass($c$class);
  1949.     }
  1950.  
  1951.     /**
  1952.      * @param Converter 
  1953.          * @param parserClass 
  1954.      * @return array an array of parserMethods from ALL child classes that override this method in the given class
  1955.      */
  1956.         function getOverridingMethodsForClass(&$c&$class)
  1957.         {
  1958.             $meths array();
  1959.             if (!$classreturn $meths;
  1960.             $kids $class->getChildClassList($c);
  1961.             for($i=0$i<count($kids)$i++)
  1962.             {
  1963.                     if ($kids[$i]->hasMethod($c$this->name))
  1964.                     {
  1965.                         $meth $kids[$i]->getMethod($c,$this->name);
  1966.                         if (!($meth->docblock && $meth->docblock->hasaccess && !$c->parseprivate && $meth->docblock->tags['access'][0]->value == 'private'))
  1967.                             $meths[$meth;
  1968.                     }
  1969.  
  1970.                     $meths array_merge($meths$this->getOverridingMethodsForClass($c$kids[$i]));
  1971.             }
  1972.             return $meths;
  1973.         }
  1974. }
  1975.  
  1976. /**
  1977.  * @package phpDocumentor
  1978.  * @subpackage ParserElements
  1979.  * @author Greg Beaver <[email protected]>
  1980.  * @since 1.0rc1
  1981.  * @version $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  1982.  */
  1983. class parserDefine extends parserElement
  1984. {
  1985.     /**
  1986.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  1987.      * @var string always 'define'
  1988.      */
  1989.     var $type = 'define';
  1990.  
  1991.     /**
  1992.      * quick way to link to this element
  1993.      * @return mixed converter-specific link to this define
  1994.      * @param Converter $c 
  1995.      * @param string $text text to display for the link or false for default text
  1996.      */
  1997.     function getLink($c$text false$returnobj false)
  1998.     {
  1999.         if ($returnobj)
  2000.         {
  2001.             return $c->getLink('constant ' $this->name$this->docblock->package);
  2002.         }
  2003.         return $c->getDefineLink($this->name$this->docblock->packagefalse$text);
  2004.     }
  2005.  
  2006.     /**
  2007.      * Returns all defines in other packages that have the same name as this define
  2008.      * @return mixed false or an array Format: (package => {@link parserDefine} of conflicting defines)
  2009.      * @param Converter 
  2010.      */
  2011.     function getConflicts(&$c)
  2012.     {
  2013.         $a $c->proceduralpages->getDefineConflicts($this->name);
  2014.         unset($a[$this->docblock->package]);
  2015.         return $a;
  2016.     }
  2017.     
  2018. }
  2019.  
  2020. /**
  2021.  * @package phpDocumentor
  2022.  * @subpackage ParserElements
  2023.  * @author Greg Beaver <[email protected]>
  2024.  * @since 1.0rc1
  2025.  * @version $Id: ParserElements.inc,v 1.15 2006/08/17 02:36:50 cellog Exp $
  2026.  */
  2027. {
  2028.     /**
  2029.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  2030.      * @var string always 'packagepage'
  2031.      */
  2032.     var $type = 'packagepage';
  2033.     /** @var string */
  2034.     var $package = 'default';
  2035.     
  2036.     /**
  2037.      * @param string 
  2038.      */
  2039.     function parserPackagePage($package)
  2040.     {
  2041.         $this->package = $package;
  2042.     }
  2043.     
  2044.     /**
  2045.      * @param Converter 
  2046.      */
  2047.     function Convert(&$c)
  2048.     {
  2049.         return parent::Convert($c,false);
  2050.     }
  2051. }
  2052.  
  2053. /**
  2054.  * @package phpDocumentor
  2055.  * @subpackage ParserElements
  2056.  * @since 1.2
  2057.  */
  2058. {
  2059.     /**
  2060.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  2061.      * @var string always 'tutorial'
  2062.      */
  2063.     var $type = 'tutorial';
  2064.     /** @var string */
  2065.     var $package = 'default';
  2066.     /**
  2067.      * Either cls, pkg, or proc
  2068.      * @var string 
  2069.      */
  2070.     var $tutorial_type;
  2071.     /**
  2072.      * The documentable element this tutorial is linked to
  2073.      *
  2074.      * Can be a parserData, parserClass, or nothing for package/subpackage docs
  2075.      */
  2076.     var $linked_element;
  2077.     /**
  2078.      * path to the tutorial page
  2079.      * @var string 
  2080.      */
  2081.     var $path;
  2082.     /**
  2083.      * filename minus extension of this tutorial (used for @tutorial tag)
  2084.      * @var string 
  2085.      */
  2086.     var $name;
  2087.     /** @var boolean */
  2088.     var $_xml = true;
  2089.     /**
  2090.      * output from tutorialname.ext.ini
  2091.      *
  2092.      * an array generated by {@link phpDocumentor_parse_ini_file()} containing
  2093.      * an index 'Linked Tutorials' with an array of tutorial names in the order
  2094.      * they should appear.  This is used to generate a linked list of tutorials like
  2095.      * {@tutorial phpDocumentor/tags.pkg}
  2096.      * @var array 
  2097.      */
  2098.     var $ini = false;
  2099.     /**
  2100.      * link to the next tutorial in a document series, or false if none
  2101.      * @var tutorialLink 
  2102.      */
  2103.     var $next = false;
  2104.     /**
  2105.      * link to the previous tutorial in a document series, or false if none
  2106.      * @var tutorialLink 
  2107.      */
  2108.     var $prev = false;
  2109.     /**
  2110.      * link to the parent tutorial in a document series, or false if none
  2111.      *
  2112.      * This is used to generate an "Up" or "Home" link like the php manual.
  2113.      * The parent is defined as a tutorial that has a parenttutorialname.ext.ini
  2114.      * file and is not contained by any other tutorial's tutorialname.ext.ini
  2115.      * @var tutorialLink 
  2116.      */
  2117.     var $parent = false;
  2118.     /**
  2119.      * links to the child tutorials, or false if none
  2120.      * @var array 
  2121.      */
  2122.     var $children = false;
  2123.     
  2124.     /**
  2125.      * @param parserXMLDocBookTag top-level tag (<refentry> for 1.2.0)
  2126.      * @param information about the tutorial file.  Format:
  2127.      *
  2128.      *  <pre>
  2129.      *  array('tutename' => tutorial name,
  2130.      *        'path' => relative path of tutorial to tutorials/ directory
  2131.      *        'ini' => contents of the tutorial .ini file, if any)
  2132.      *  </pre>
  2133.      */
  2134.     function parserTutorial($data$info)
  2135.     {
  2136.         $this->value = $data;
  2137.         $this->package = $info['package'];
  2138.         $this->subpackage $info['subpackage'];
  2139.         $this->tutorial_type = $info['tutetype'];
  2140.         $this->name = $info['tutename'];
  2141.         $this->path = $info['path'];
  2142.         $this->ini = $info['ini'];
  2143.     }
  2144.     
  2145.     /**
  2146.      * Retrieve the title of the tutorial, or of any subsection
  2147.      * @param Converter 
  2148.      * @param string which subsection to retrieve the title from, if any
  2149.      * @uses parserXMLDocBookTag::getSubSection() retrieve the subsection to
  2150.      *        to get a title from
  2151.      */
  2152.     function getTitle(&$c,$subsection '')
  2153.     {
  2154.         if (!empty($subsection))
  2155.         {
  2156.             $z $this->value->getSubSection($c,$subsection);
  2157.             if (!$z)
  2158.             {
  2159.                 addWarning(PDERROR_TUTORIAL_SUBSECTION_NOT_FOUND,$this->name,$subsection);
  2160.                 return $subsection;
  2161.             }
  2162.             return $z->getTitle($c);
  2163.         }
  2164.         return $this->value->getTitle($c);
  2165.     }
  2166.     
  2167.     /**
  2168.      * @param Converter 
  2169.      * @param boolean determines whether character data is postprocessed to be
  2170.      *                 Converter-friendly or not.
  2171.      */
  2172.     function Convert(&$c$postprocess true)
  2173.     {
  2174.         return $this->value->Convert($c$postprocess);
  2175.     }
  2176.     
  2177.     /**
  2178.      * @uses $parent creates a link to the documentation for the parent tutorial
  2179.      * @param parserTutorial 
  2180.      * @param Converter 
  2181.      */
  2182.     function setParent($parent,&$c)
  2183.     {
  2184.         $this->parent = new tutorialLink;
  2185.         $this->parent->addLink(''$parent->path$parent->name$parent->package$parent->subpackage$parent->getTitle($c));
  2186.     }
  2187.     
  2188.     /**
  2189.      * @param array array of parserTutorials that have child tutorials
  2190.      */
  2191.     function isChildOf($parents)
  2192.     {
  2193.         foreach($parents as $i => $parent)
  2194.         {
  2195.             if ($parent->path == $this->pathcontinue;
  2196.             if ($parent->ini && ($parent->package == $this->package&& ($parent->subpackage == $this->subpackage&& ($parent->tutorial_type == $this->tutorial_type))
  2197.             {
  2198.                 foreach($parent->ini['Linked Tutorials'as $child)
  2199.                 {
  2200.                     if ($child '.' $this->tutorial_type == $this->namereturn true;
  2201.                 }
  2202.             }
  2203.         }
  2204.     }
  2205.     
  2206.     /**
  2207.      * Retrieve converter-specific link to the parent tutorial's documentation
  2208.      * @param Converter 
  2209.      */
  2210.     function getParent(&$c)
  2211.     {
  2212.         if (!$this->parentreturn false;
  2213.         return $c->returnSee($this->parent);
  2214.     }
  2215.     
  2216.     /**
  2217.      * @uses $next creates a link to the documentation for the next tutorial
  2218.      * @param parserTutorial 
  2219.      * @param Converter 
  2220.      */
  2221.     function setNext($next,&$c)
  2222.     {
  2223.         if (phpDocumentor_get_class($next== 'tutoriallink'return $this->next = $next;
  2224.         $this->next = new tutorialLink;
  2225.         $this->next->addLink(''$next->path$next->name$next->package$next->subpackage$next->getTitle($c));
  2226.     }
  2227.     
  2228.     /**
  2229.      * Retrieve converter-specific link to the next tutorial's documentation
  2230.      * @param Converter 
  2231.      */
  2232.     function getNext(&$c)
  2233.     {
  2234.         if (!$this->nextreturn false;
  2235.         return $c->returnSee($this->next);
  2236.     }
  2237.     
  2238.     /**
  2239.      * @uses $prev creates a link to the documentation for the previous tutorial
  2240.      * @param parserTutorial 
  2241.      * @param Converter 
  2242.      */
  2243.     function setPrev($prev,&$c)
  2244.     {
  2245.         if (phpDocumentor_get_class($prev== 'tutoriallink'return $this->prev = $prev;
  2246.         $this->prev = new tutorialLink;
  2247.         $this->prev->addLink(''$prev->path$prev->name$prev->package$prev->subpackage$prev->getTitle($c));
  2248.     }
  2249.     
  2250.     /**
  2251.      * Retrieve converter-specific link to the previous tutorial's documentation
  2252.      * @param Converter 
  2253.      */
  2254.     function getPrev(&$c)
  2255.     {
  2256.         if (!$this->prevreturn false;
  2257.         return $c->returnSee($this->prev);
  2258.     }
  2259.     
  2260.     /**
  2261.      * Get a link to this tutorial, or to any subsection of this tutorial
  2262.      * @param Converter 
  2263.      * @param boolean if true, returns a {@link tutorialLink} instead of a string
  2264.      * @param string section name to link to
  2265.      * @return string|tutorialLink
  2266.      */
  2267.     function getLink(&$c,$pure false,$section '')
  2268.     {
  2269.         $link new tutorialLink;
  2270.         $link->addLink($section$this->path$this->name$this->package$this->subpackage$this->getTitle($c)$this->category);
  2271.         if ($purereturn $link;
  2272.         return $c->returnSee($link);
  2273.     }
  2274. }
  2275.  
  2276. ?>

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