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

Source for file ParserDocBlock.inc

Documentation is available at ParserDocBlock.inc

  1. <?php
  2. /**
  3.  * DocBlock Parser Classes
  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 ParserDocBlock
  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: ParserDocBlock.inc,v 1.9 2006/08/17 03:46:58 cellog Exp $
  34.  * @link       http://www.phpdoc.org
  35.  * @link       http://pear.php.net/PhpDocumentor
  36.  * @see        Parser, WordParser
  37.  * @since      1.0rc1
  38.  */
  39. /**
  40.  * represents a short or long description in a DocBlock ({@link parserDocBlock})
  41.  * @package phpDocumentor
  42.  * @subpackage ParserDocBlock
  43.  * @author Greg Beaver <[email protected]>
  44.  * @since 1.0rc1
  45.  * @version $Id: ParserDocBlock.inc,v 1.9 2006/08/17 03:46:58 cellog Exp $
  46.  */
  47. {
  48.     /**
  49.      * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
  50.      * always '_desc'
  51.      * @var string 
  52.      */
  53.     var $type = '_desc';
  54.     
  55.     /**
  56.      * @param mixed like {@link parserStringWithInlineTags::add()}, this can be a string or parserInlineTag, but it can also be a
  57.      *               parserStringWithInlineTags, and the contents will be merged
  58.      */
  59.     function add($stringOrClass)
  60.     {
  61.         if (is_object($stringOrClass))
  62.         {
  63.             if (phpDocumentor_get_class($stringOrClass== 'parserstringwithinlinetags' ||
  64.                 phpDocumentor_get_class($stringOrClass== 'parserdesc')
  65.             {
  66.                 for($i=0;$i<count($stringOrClass->value);$i++)
  67.                 {
  68.                     parserStringWithInlineTags::add($stringOrClass->value[$i]);
  69.                 }
  70.             else
  71.             {
  72.                 parserStringWithInlineTags::add($stringOrClass);
  73.             }
  74.         else return parserStringWithInlineTags::add($stringOrClass);
  75.     }
  76.     
  77.     /**
  78.      * @return boolean whether this desc has an {@}inheritdoc} inline tag
  79.      */
  80.     function hasInheritDoc()
  81.     {
  82.         for($i=0;$i<count($this->value);$i++)
  83.         {
  84.             if (phpDocumentor_get_class($this->value[$i])=='parserinheritdocinlinetag'return true;
  85.         }
  86.     }
  87.     
  88.     /**
  89.      * @return boolean whether this desc has an {@}source} inline tag
  90.      */
  91.     function hasSource()
  92.     {
  93.         for($i=0;$i<count($this->value);$i++)
  94.         {
  95.             if (phpDocumentor_get_class($this->value[$i])=='parsersourceinlinetag'return true;
  96.         }
  97.     }
  98.     
  99.     /**
  100.      * replaces {@}inheritdoc} with the contents of the parent DocBlock
  101.      * @param parserDesc parent parserDesc, used to retrieve the description
  102.      */
  103.     function replaceInheritDoc($desc)
  104.     {
  105.         $value $this->value;
  106.         $this->value = array();
  107.         for($i=0;$i<count($value);$i++)
  108.         {
  109.             if (phpDocumentor_get_class($value[$i])=='parserinheritdocinlinetag')
  110.             {
  111.                 for($j=0;$j<count($desc->value);$j++)
  112.                 {
  113.                     $this->add($desc->value[$j]);
  114.                 }
  115.             else $this->add($value[$i]);
  116.         }
  117.     }
  118. }
  119.  
  120. /**
  121.  * Represents a docblock and its components, {@link $desc}{@link $sdesc}{@link $tags}, and also {@link $params} for functions
  122.  * @package phpDocumentor
  123.  * @subpackage ParserDocBlock
  124.  * @author Greg Beaver <[email protected]>
  125.  * @since 1.0rc1
  126.  * @version $Id: ParserDocBlock.inc,v 1.9 2006/08/17 03:46:58 cellog Exp $
  127.  */
  128. {
  129.     /**
  130.      * @var parserDesc 
  131.      */
  132.     var $desc = false;
  133.     /**
  134.      * @var array array of {@link parserDesc}s
  135.      */
  136.     var $processed_desc = false;
  137.     /**
  138.      * @var array array of {@link parserDesc}s
  139.      */
  140.     var $processed_sdesc = false;
  141.     /**
  142.      * @var parserDesc 
  143.      */
  144.     var $sdesc = false;
  145.     /**
  146.      * Line number in the source on which this docblock begins
  147.      * @since 1.2
  148.      * @var false|integer
  149.      */
  150.     var $linenumber = false;
  151.     /**
  152.      * Line number in the source on which this docblock ends
  153.      * @since 1.2
  154.      * @var false|integer
  155.      */
  156.     var $endlinenumber = false;
  157.     /**
  158.      * array of {@link parserTag}s
  159.      * @var array 
  160.      */
  161.     var $tags = array();
  162.     /**
  163.      * array of unrecognized {@link parserTag}s
  164.      * @var array 
  165.      */
  166.     var $unknown_tags = array();
  167.     /**
  168.      * array of param data.
  169.      * Format:
  170.      * array(index of param in function parameter list -OR- parameter name =>
  171.      *         parserStringWithInlineTags,...)
  172.      * @var array 
  173.      */
  174.     var $params = array();
  175.     /**
  176.      * array of global variable data.
  177.      * Format:
  178.      * array(index of global variable in @global tag list -OR- global variable name =>
  179.      *         array(datatype,parserStringWithInlineTags),...)
  180.      * @var array 
  181.      */
  182.     var $funcglobals = array();
  183.     
  184.     /**
  185.      * array of static variable data.
  186.      * Format:
  187.      * array(index of static variable in @global tag list -OR- static variable name =>
  188.      *         {@link parserStaticvarTag},...)
  189.      * @var array 
  190.      */
  191.     var $statics = array();
  192.     /**
  193.      * This is either a {@link parserReturnTag} or false if no return tag is present
  194.      * @var mixed 
  195.      */
  196.     var $return = false;
  197.     /**
  198.      * This is either a {@link parserVarTag} or false if no var tag is present
  199.      * @var mixed 
  200.      */
  201.     var $var = false;
  202.     /**
  203.      * fix for bug 591396
  204.      * @var boolean 
  205.      */
  206.     var $explicitpackage = false;
  207.     /**
  208.      * fix for bug 708559
  209.      * @var boolean 
  210.      */
  211.     var $explicitcategory = false;
  212.     /** @var string */
  213.     var $category;
  214.     /** @var string */
  215.     var $package = 'default';
  216.     /** @var string */
  217.     var $subpackage = '';
  218.     /**
  219.      * whether this DocBlock has an @access tag
  220.      * @var boolean */
  221.     var $hasaccess = false;
  222.     /**
  223.      * whether this DocBlock has a @name tag
  224.      * @var boolean */
  225.     var $hasname = false;
  226.     /**
  227.      * description of package parsed from @package tag
  228.      * Unused in this version
  229.      * @var string 
  230.      */
  231.     var $packagedescrip = '';
  232.     /**
  233.      * description of subpackage parsed from @package tag
  234.      * Unused in this version
  235.      * @var string 
  236.      */
  237.     var $subpackagedescrip = '';
  238.     /**
  239.      * Determines whether a DocBlock can legally have a {@}source} tag
  240.      * @tutorial tags.inlinesource.pkg
  241.      * @var boolean 
  242.      * @access private
  243.      */
  244.     var $_canSource false;
  245.     
  246.     /**
  247.      * sets package to default
  248.      * @global string default package name
  249.      */
  250.     function parserDocBlock()
  251.     {
  252.         global $phpDocumentor_DefaultPackageName;
  253.         $this->package = $GLOBALS['phpDocumentor_DefaultPackageName'];
  254.         $this->category = $GLOBALS['phpDocumentor_DefaultCategoryName'];
  255.     }
  256.     
  257.     /**
  258.      * Sets the starting line number for the DocBlock
  259.      * @param integer 
  260.      */
  261.     function setLineNumber($number)
  262.     {
  263.         $this->linenumber = $number;
  264.     }
  265.     
  266.     /**
  267.      * Retrieve starting line number
  268.      * @return integer 
  269.      */
  270.     function getLineNumber()
  271.     {
  272.         return $this->linenumber;
  273.     }
  274.     
  275.     /**
  276.      * Sets the ending line number for the DocBlock
  277.      * @param integer 
  278.      */
  279.     function setEndLineNumber($number)
  280.     {
  281.         $this->endlinenumber = $number;
  282.     }
  283.     
  284.     /**
  285.      * Retrieve ending line number
  286.      * @return integer 
  287.      */
  288.     function getEndLineNumber()
  289.     {
  290.         return $this->endlinenumber;
  291.     }
  292.     
  293.     /**
  294.      * Parse out any html tags from doc comments, and make them into
  295.      * abstract structures
  296.      * @uses parserDescParser::parse()
  297.      */
  298.     function postProcess()
  299.     {
  300.         if ($this->sdesc)
  301.         {
  302.             $parser new parserDescParser;
  303.             $parser->subscribe('*',$this);
  304.             if ($this->desc$parser->parse($this->desc->value);
  305.             $parser->parse($this->sdesc->value,true);
  306.         }
  307.     }
  308.     
  309.     /**
  310.      * Tells the DocBlock it can have a @filesource tag
  311.      *
  312.      * Only page-level DocBlocks may have a @filesource tag
  313.      */
  314.     function canSource()
  315.     {
  316.         $this->_canSource true;
  317.     }
  318.     
  319.     /**
  320.      * Tells the DocBlock it can't have a @filesource tag
  321.      *
  322.      * Only page-level DocBlocks may have a @filesource tag
  323.      */
  324.     function cantSource()
  325.     {
  326.         $this->_canSource false;
  327.     }
  328.     
  329.     /**
  330.      * Indirectly called after parsing by {@link postProcess}
  331.      *
  332.      * @param integer either 1 for long desc or 2 for short desc
  333.      * @param array data organized into paragraphs.  Each entry is a {@link parserStringWithInlineTags}
  334.      * @uses $processed_desc sets to the array passed from {@link parserDescParser::parse()}
  335.      * @uses $processed_sdesc sets to the array passed from {@link parserDescParser::parse()}
  336.      * @access private
  337.      */
  338.     function HandleEvent($event,$data)
  339.     {
  340.         if ($event == 1)
  341.         $this->processed_desc = $data;
  342.         else
  343.         $this->processed_sdesc = $data;
  344.     }
  345.     
  346.     /**
  347.      * @param array 
  348.      */
  349.     function updateModifiers($modifiers)
  350.     {
  351.         if (is_array($modifiers&& count($modifiers))
  352.         {
  353.             foreach ($modifiers as $modifier)
  354.             {
  355.                 switch ($modifier)
  356.                 {
  357.                     case 'private' :
  358.                     case 'public' :
  359.                     case 'protected' :
  360.                         unset($this->tags['access']);
  361.                         $x new parserAccessTag($modifier);
  362.                         if ($x->isvalid)
  363.                         {
  364.                             $this->hasaccess = true;
  365.                             $this->tags['access'][$x;
  366.                         }
  367.                     break;
  368.                     case 'static' :
  369.                     case 'abstract' :
  370.                         unset($this->tags[$modifier]);
  371.                         $this->addKeyword($modifier'');
  372.                     break;
  373.                 }
  374.             }
  375.         }
  376.     }
  377.     
  378.     /**
  379.      * Set the short description of the DocBlock
  380.      *
  381.      * Setting the short description is possible by passing in one of three
  382.      * possible parameters:
  383.      * <ul>
  384.      *  <li>another DocBlock's short description</li>
  385.      *  <li>another DocBlock, the short description will be extracted</li>
  386.      *  <li>a Zend Studio-compatible @desc tag</li>
  387.      * </ul>
  388.      * @param parserDesc|parserDocBlock|parserTagsets {@link $sdesc}
  389.      */
  390.     function setShortDesc($desc)
  391.     {
  392.         if (phpDocumentor_get_class($desc== 'parsertag')
  393.         {
  394.             $this->sdesc = new parserDesc;
  395.             $this->processed_sdesc = $desc->value;
  396.             return;
  397.         }
  398.         if (phpDocumentor_get_class($desc== 'parserdesc'{
  399.             $this->sdesc = $desc;
  400.         else
  401.         {
  402.             $this->sdesc = $desc->sdesc;
  403.             $this->processed_sdesc = $desc->processed_sdesc;
  404.         }
  405.         
  406.         if ($this->sdesc && $this->sdesc->hasSource())
  407.         {
  408.             addWarning(PDERROR_SOURCE_TAG_IGNORED,$this->sdesc->getString());
  409.         }
  410.     }
  411.     
  412.     /**
  413.      * Passes to {@link parserStringWithInlineTags::setSource()}
  414.      *
  415.      * After passing, it calls {@link postProcess()} to set up the new
  416.      * source
  417.      * @param string|arraytokenized highlight-ready source code
  418.      * @param false|stringname of class if this is a method source
  419.      */
  420.     function setSource($source$class false)
  421.     {
  422.         if ($this->desc)
  423.         {
  424.             $this->desc->setSource($source$class);
  425.             $this->postProcess();
  426.         }
  427.     }
  428.     
  429.     /**
  430.      * @param parserDesc|parserDocBlocksets {@link $desc}
  431.      */
  432.     function setDesc($desc)
  433.     {
  434.         if (phpDocumentor_get_class($desc== 'parserdesc')
  435.         $this->desc = $desc;
  436.         else
  437.         {
  438.             $this->desc = $desc->desc;
  439.             $this->processed_desc = $desc->processed_desc;
  440.         }
  441.     }
  442.     
  443.     /**
  444.      * Wrapper for {@link parserDesc::hasInheritDoc()}
  445.      * @return boolean 
  446.      */
  447.     function hasInheritDoc()
  448.     {
  449.         if (!$this->descreturn false;
  450.         return $this->desc->hasInheritDoc();
  451.     }
  452.     
  453.     /**
  454.      * Wrapper for {@link parserDesc::replaceInheritDoc()}
  455.      *
  456.      * Also replaces {@}inheritdoc} in the {@link $processed_desc}
  457.      * @param parserDesc 
  458.      */
  459.     function replaceInheritDoc($desc)
  460.     {
  461.         if (!$this->descreturn false;
  462.         $this->desc->replaceInheritDoc($desc->desc);
  463.         $this->postProcess();
  464.     }
  465.     
  466.     /**
  467.      * @param Converter takes {@link $sdesc} and converts it to a string and returns it if present, otherwise returns ''
  468.      * @return string 
  469.      */
  470.     function getSDesc(&$converter)
  471.     {
  472.         if ($this->sdesc && $this->processed_sdesc)
  473.         {
  474.             $result '';
  475.             foreach($this->processed_sdesc as $desc)
  476.             {
  477.                 if (count($desc->value))
  478.                 $result .= $desc->Convert($converter);
  479.             }
  480.             return $result;
  481.         else
  482.         {
  483. //            var_dump($this->desc,$this->processed_desc);
  484.         }
  485.         return '';
  486.     }
  487.     
  488.     /**
  489.      * @param Converter takes {@link $desc} and converts it to a string and returns it if present, otherwise returns ''
  490.      * @return string 
  491.      */
  492.     function getDesc(&$converter)
  493.     {
  494.         if ($this->desc && $this->processed_desc)
  495.         {
  496.             $result '';
  497.             foreach($this->processed_desc as $desc)
  498.             {
  499.                 if (count($desc->value))
  500.                 $result .= $converter->EncloseParagraph($desc->Convert($converter));
  501.             }
  502.             return $result;
  503.         else
  504.         {
  505. //            var_dump($this->desc,$this->processed_desc);
  506.         }
  507.         return '';
  508.     }
  509.     
  510.     /**
  511.      * @param string $paramVar if empty, param is indexed in the order received and set using {@link changeParam()}
  512.      * @param parserStringWithInlineTags $value 
  513.      */
  514.     function addParam($paramVar$paramType$value)
  515.     {
  516.         if (empty($paramVar))
  517.         $this->params[count($this->params)new parserParamTag($paramType,$value);
  518.         else
  519.         $this->params[$paramVarnew parserParamTag($paramType,$value);
  520.     }
  521.  
  522.     function resetParams()
  523.     {
  524.         $this->params = array();
  525.     }
  526.     /**
  527.      * @param integer $index index of parameter in the {@link $params} array
  528.      * @param string $name name of the parameter to set in the $params array
  529.      * @param string|null$type type of the parameter
  530.      */
  531.     function changeParam($index$name$type)
  532.     {
  533.         if ($name === $index{
  534.             return;
  535.         }
  536.         $this->params[$name$this->params[$index];
  537.         unset($this->params[$index]);
  538.     }
  539.     
  540.     /**
  541.      * replaces nameless parameters in the {@link $params} array with their names
  542.      * add @param tags for params in the function with no entry
  543.      * @param array $params Format: array(parameter key =>
  544.      *                       array(0 => parameter name[,1 => default value][,2 => type hint]),...)
  545.      */
  546.     function updateParams($params)
  547.     {
  548.         $countparams array_values($params);
  549.         reset($params);
  550.         for($i=0;$i<count($countparams);$i++next($params))
  551.         {
  552.             if (isset($this->params[$i]))
  553.             {
  554.                 $info current($params);
  555.                 $type = isset($info[2]$info[2null;
  556.                 $this->changeParam($ikey($params)$type);
  557.                 $params[key($params)false;
  558.             }
  559.         }
  560.         $blank new parserStringWithInlineTags;
  561.         foreach ($params as $key => $info{
  562.             if (!$info{
  563.                 continue;
  564.             }
  565.             $type = isset($info[2]$info[2null;
  566.             if (!isset($this->params[$info[0]])) {
  567.                 $this->addParam($info[0]$type$blank);
  568.             }
  569.         }
  570.         reset($params);
  571.         
  572.         if (isset($this->tags))
  573.         unset($this->tags['param']);
  574.     }
  575.     
  576.     /**
  577.      * Used to insert DocBlock Template tags into a docblock
  578.      * @param parserTag tag
  579.      * @global array used to determine whether to add ignored tags, or not
  580.      */
  581.     function addTag($tag)
  582.     {
  583.         global $_phpDocumentor_setting;
  584.         if (phpDocumentor_setup::checkIgnoreTag($tag->keyword)) return;
  585.         $value $tag->value;
  586.         if (is_array($value)) $value $value[0];
  587.         if ($tag->keyword == 'uses')
  588.         {
  589.             $this->addUses($value$tag->_description);
  590.         else
  591.         {
  592.             $this->addKeyword($tag->keyword$value);
  593.         }
  594.     }
  595.  
  596.     /**
  597.      * @param string $keyword tag name
  598.      * @param parserStringWithInlineTags $value the contents of the tag
  599.      * @global array used to determine whether to add the @internal tag or not
  600.      */
  601.     function addKeyword($keyword$value)
  602.     {
  603.         global $_phpDocumentor_setting;
  604.         $keyword trim($keyword);
  605.         if (phpDocumentor_setup::checkIgnoreTag($keyword)) return;
  606.         // don't add the tag at all if it was specified to ignore it with --ignore-tags
  607.         if ($keyword == 'package' || $keyword == 'subpackage' || $keyword == 'category'return $this->addPackage($keyword$value);
  608.         if ($keyword == 'access'return $this->addAccess($value);
  609.         if ($keyword == 'link'return $this->addLink($value);
  610.         if ($keyword == 'see' || $keyword == 'tutorial'return $this->addSee($keyword,$value);
  611.         if ($keyword == 'uses'return $this->addUses($keyword$value);
  612.         if ($keyword == 'name'return $this->addName($value);
  613.         if (!in_array($keyword,$GLOBALS['_phpDocumentor_tags_allowed']))
  614.         $this->addUnknownTag($keyword,$value);
  615.         else
  616.         {
  617.         if ($keyword == 'internal' && (!isset($_phpDocumentor_setting['parseprivate']|| $_phpDocumentor_setting['parseprivate'== 'off')) return;
  618.             if (!isset($this->tags[$keyword])) {
  619.                 $this->tags[$keywordarray();
  620.             }
  621.             $ptag 'parserTag';
  622.             if (class_exists('parser'.$keyword.'tag'))
  623.                 $ptag 'parser'.ucfirst($keyword).'Tag';
  624.             array_unshift($this->tags[$keyword]new $ptag($keyword$value));
  625.         }
  626.     }
  627.     
  628.     /**
  629.      * adds an @example tag
  630.      * @param string contents of the tag
  631.      * @param string path to the file containing this tag
  632.      */
  633.     function addExample($value$path)
  634.     {
  635.         $this->tags['example'][new parserExampleTag($value$path);
  636.     }
  637.     
  638.     /**
  639.      * adds an unknown tag to the {@link $unknown_tags} array for use by custom converters
  640.      * @param string tag name
  641.      * @param string tag value
  642.      */
  643.     function addUnknownTag($keyword$value)
  644.     {
  645.         addWarning(PDERROR_UNKNOWN_TAG,$keyword);
  646.         $this->unknown_tags[$keyword][new parserTag($keyword$value);
  647.     }
  648.     
  649.     /**
  650.      * set the element's package to the passed values.  Used in {@link phpDocumentor_IntermediateParser} to align package of
  651.      * elements inside a class or procedural page to the package of the class/procedural page
  652.      * @param string 
  653.      * @param string 
  654.      * @param string 
  655.      * @param string element name
  656.      * @param string element type (include, define, var, method, global, function, const)
  657.      */
  658.     function overridePackage($category$package,$subpackage,$elname,$type)
  659.     {
  660.         if ($this->package != $GLOBALS['phpDocumentor_DefaultPackageName'])
  661.         {
  662.             addError(PDERROR_OVERRIDDEN_PACKAGE_TAGS,$elname,$type,$this->package);
  663.             $this->explicitpackage = false;
  664.         }
  665.         if (!empty($this->subpackage))
  666.         addError(PDERROR_OVERRIDDEN_SUBPACKAGE_TAGS,$type,$elname,$this->subpackage);
  667.         $this->package = $GLOBALS['phpDocumentor_DefaultPackageName'];
  668.         $this->subpackage = '';
  669.         $this->category = $category;
  670.         $this->addPackage('package',$package);
  671.         $this->addPackage('subpackage',$subpackage);
  672.     }
  673.     
  674.     /**
  675.      * Used if this docblock has a @package tag.
  676.      *
  677.      * phpDocumentor will guess package for DocBlocks that don't have
  678.      * a @package tag
  679.      * @uses $explicitpackage
  680.      */
  681.     function setExplicitPackage()
  682.     {
  683.         $this->explicitpackage = true;
  684.     }
  685.     
  686.     /**
  687.      * If the DocBlock has a @package tag, then this returns true
  688.      * @return boolean 
  689.      */
  690.     function getExplicitPackage()
  691.     {
  692.         return $this->explicitpackage;
  693.     }
  694.     
  695.     /**
  696.      * Used if this docblock has a @category tag.
  697.      *
  698.      * phpDocumentor will guess category for DocBlocks that don't have
  699.      * a @category tag
  700.      * @uses $explicitcategory
  701.      */
  702.     function setExplicitCategory()
  703.     {
  704.         $this->explicitcategory = true;
  705.     }
  706.     
  707.     /**
  708.      * If the DocBlock has a @category tag, then this returns true
  709.      * @return boolean 
  710.      */
  711.     function getExplicitCategory()
  712.     {
  713.         return $this->explicitcategory;
  714.     }
  715.     
  716.     /**
  717.      * @param string $keyword tag name (either package or subpackage)
  718.      * @param mixed $value either a string or a parserStringWithInlineTags.  Strips all inline tags and use the text as the package
  719.      */
  720.     function addPackage($keyword$value)
  721.     {
  722.         if ($keyword == 'package')
  723.         {
  724.             if (!$this->explicitpackage)
  725.             {
  726.                 if (!is_string($value))
  727.                 $value $value->getString();
  728.                 $rest '';
  729.                 $value explode(' ',$value);
  730.                 if (count($value1)
  731.                 {
  732.                     $rest $value;
  733.                     $value trim($value[0]);
  734.                     unset($rest[0]);
  735.                     $rest implode($rest,' ');
  736.                 else
  737.                 {
  738.                     $value explode("\t",$value[0]);
  739.                     if (count($value1)
  740.                     {
  741.                         $rest $value;
  742.                         $value trim($value[0]);
  743.                         unset($rest[0]);
  744.                         $rest implode($rest,"\t");
  745.                     else $value trim($value[0]);
  746.                 }
  747.                 $value preg_replace('/[^\[\]0-9\-a-zA-Z_\x7f-\xff]/''-'$value);
  748.                 $this->packagedescrip = $this->package = trim($value);
  749.                 if (!empty($rest)) $this->packagedescrip = $rest;
  750.             else
  751.             {
  752.                 if (is_string($value))
  753.                 addError(PDERROR_MULTIPLE_PACKAGE_TAGS,$value);
  754.                 else
  755.                 addError(PDERROR_MULTIPLE_PACKAGE_TAGS,$value->getString());
  756.             }
  757.         elseif ($keyword == 'subpackage')
  758.         {
  759.             if (empty($this->subpackage))
  760.             {
  761.                 if (!is_string($value))
  762.                 $value $value->getString();
  763.                 $rest '';
  764.                 $value explode(' ',$value);
  765.                 if (count($value1)
  766.                 {
  767.                     $rest $value;
  768.                     $value $value[0];
  769.                     unset($rest[0]);
  770.                     $rest implode($rest,' ');
  771.                 else
  772.                 {
  773.                     $value explode("\t",$value[0]);
  774.                     if (count($value1)
  775.                     {
  776.                         $rest $value;
  777.                         $value $value[0];
  778.                         unset($rest[0]);
  779.                         $rest implode($rest,"\t");
  780.                     else $value $value[0];
  781.                 }
  782.                 if (!empty($value))
  783.                 {
  784.                     $value preg_replace('/[^\[\]0-9\-a-zA-Z_\x7f-\xff]/''-'$value);
  785.                 }
  786.                 $this->subpackage = trim($value);
  787.                 if (!empty($rest)) $this->subpackagedescrip = $rest;
  788.             else
  789.             {
  790.                 if (is_string($value))
  791.                 addError(PDERROR_MULTIPLE_SUBPACKAGE_TAGS,$value);
  792.                 else
  793.                 addError(PDERROR_MULTIPLE_SUBPACKAGE_TAGS,$value->getString());
  794.             }
  795.         elseif ($keyword == 'category')
  796.         {
  797.             if (!$this->explicitcategory)
  798.             {
  799.                 if (!is_string($value))
  800.                 $value $value->getString();
  801.                 $value preg_replace('/[^\[\]0-9\-a-zA-Z_\x7f-\xff]/''-'$value);
  802.                 $this->category = $value;
  803.             else
  804.             {
  805.                 if (is_string($value))
  806.                 addError(PDERROR_MULTIPLE_CATEGORY_TAGS,$value);
  807.                 else
  808.                 addError(PDERROR_MULTIPLE_CATEGORY_TAGS,$value->getString());
  809.             }
  810.         }
  811.     }
  812.     
  813.     /**
  814.      * Adds a @name tag to the tag list
  815.      * @param string new name of element
  816.      */
  817.     function addName($value)
  818.     {
  819.         if (is_object($value)) $value $value->getString();
  820.         if (!$this->hasname)
  821.         {
  822.             $x new parserNameTag('name',$value);
  823.             $this->hasname = true;
  824.             $this->tags['name'][$x;
  825.         else
  826.         {
  827.             addError(PDERROR_MULTIPLE_NAME_TAGS,$value);
  828.         }
  829.     }
  830.     
  831.     /**
  832.      * @param string if empty, staticvar is indexed in the order received and set using {@link changeStatic()}
  833.      * @param string data type
  834.      * @param parserStringWithInlineTags 
  835.      */
  836.     function addStaticVar($staticvar$type$descrip)
  837.     {
  838.         if (empty($staticvar))
  839.         $this->statics[new parserStaticvarTag($type,$descrip);
  840.         else
  841.         $this->statics[$staticvarnew parserStaticvarTag($type,$descrip);
  842.     }
  843.     
  844.     /**
  845.      * adds a function declaration of @global to the {@link $funcglobals} array
  846.      * @param string global type
  847.      * @param string description of how the global is used in the function
  848.      */
  849.     function addFuncGlobal($type,$value)
  850.     {
  851.         $this->funcglobals[array($type,$value);
  852.     }
  853.     
  854.     /**
  855.      * @param integer $index index of parameter in the {@link $funcglobals} array
  856.      * @param string $name name of the parameter to set in the $funcglobals array
  857.      */
  858.     function changeGlobal($index,$name)
  859.     {
  860.         $this->funcglobals[$name$this->funcglobals[$index];
  861.         unset($this->funcglobals[$index]);
  862.     }
  863.  
  864.     /**
  865.      * @param integer $index index of parameter in the {@link $statics} array
  866.      * @param string $name name of the parameter to set in the $statics array
  867.      */
  868.     function changeStatic($index,$name)
  869.     {
  870.         $this->statics[$name$this->statics[$index];
  871.         unset($this->statics[$index]);
  872.     }
  873.  
  874.     /**
  875.      * replaces nameless global variables in the {@link $funcglobals} array with their names
  876.      * @param array 
  877.      */
  878.     function updateGlobals($funcs)
  879.     {
  880.         for($i=0;$i<count($funcs);$i++)
  881.         {
  882.             if (isset($this->funcglobals[$i]))
  883.             {
  884.                 $this->changeGlobal($i,$funcs[$i]);
  885.             }
  886.         }
  887.     }
  888.  
  889.     /**
  890.      * replaces nameless static variables in the {@link $statics} array with their names
  891.      * @param array 
  892.      */
  893.     function updateStatics($funcs)
  894.     {
  895.         for($i=0;$i<count($funcs);$i++)
  896.         {
  897.             if (isset($this->statics[$i]))
  898.             {
  899.                 $this->changeStatic($i,$funcs[$i]);
  900.             }
  901.         }
  902.     }
  903.  
  904.     /**
  905.      * add an @access tag to the {@link tags} array
  906.      * @param string should be either public or private
  907.      */
  908.     function addAccess($value)
  909.     {
  910.         if (is_object($value)) $value $value->getString();
  911.         $value strtolower($value);
  912.         if (!$this->hasaccess)
  913.         {
  914.             $x new parserAccessTag($value);
  915.             if ($x->isvalid)
  916.             {
  917.                 $this->hasaccess = true;
  918.                 $this->tags['access'][$x;
  919.             }
  920.         else
  921.         {
  922.             if (is_string($value))
  923.             addError(PDERROR_MULTIPLE_ACCESS_TAGS,$value);
  924.             else
  925.             addError(PDERROR_MULTIPLE_ACCESS_TAGS,$value->getString());
  926.         }
  927.     }
  928.     
  929.     /**
  930.      * Adds a new @filesource tag to the DocBlock
  931.      * @tutorial tags.filesource.pkg
  932.      * @param string full path to the file
  933.      * @param array tokenized source code, ordered by line number
  934.      */
  935.     function addFileSource($path$source)
  936.     {
  937.         if (isset($this->tags['filesource'])) return;
  938.         $this->tags['filesource'][new parserFileSourceTag($path$source);
  939.     }
  940.     
  941.     /**
  942.      * creates a {@link parserLinkTag} and adds it to the {@link $tags} array
  943.      * @param string $link 
  944.      */
  945.     function addLink($link)
  946.     {
  947.         if (phpDocumentor_setup::checkIgnoreTag('@link')) return;
  948.         $this->tags['link'][new parserLinkTag($link);
  949.     }
  950.     
  951.     /**
  952.      * creates a {@link parserLinkTag} and adds it to the {@link $tags} array
  953.      * @param string either see or uses
  954.      * @param string $value 
  955.      */
  956.     function addSee($keyword,$value)
  957.     {
  958.         if (phpDocumentor_setup::checkIgnoreTag($keyword)) return;
  959.         $tag 'parser'.ucfirst($keyword).'Tag';
  960.         $this->tags[$keyword][new $tag($value);
  961.     }
  962.     
  963.     /**
  964.      * creates a {@link parserReturnTag} and adds it to the {@link $tags} array
  965.      * @param string $returnType the one-word name of the return type (mixed should be used if more than one type)
  966.      * @param parserStringWithInlineTags $value 
  967.      */
  968.     function addReturn($returnType$value)
  969.     {
  970.         // only take the first one
  971.         if (!$this->return)
  972.         {
  973.             $this->return = new parserReturnTag($returnType$value);
  974.         else
  975.         {
  976.             addError(PDERROR_MULTIPLE_RETURN_TAGS,$returnType,$value->getString());
  977.         }
  978.     }
  979.     
  980.     /**
  981.      * creates a {@link parserVarTag} and adds it to the {@link $tags} array
  982.      * @param string $varType the one-word name of the variable type (mixed should be used if more than one type)
  983.      * @param parserStringWithInlineTags $value 
  984.      */
  985.     function addVar($varType$value)
  986.     {
  987.         // only take the first one
  988.         if (!$this->var)
  989.         {
  990.             $this->var = new parserVarTag($varType$value);
  991.         else
  992.         {
  993.             addError(PDERROR_MULTIPLE_VAR_TAGS,$varType,$value->getString());
  994.         }
  995.     }
  996.     
  997.     /**
  998.      * Adds a virtual @usedby tag to output
  999.      * @param abstractLink link to the element that has a @uses tag
  1000.      * @param parserStringWithInlinetags description of how the elements uses
  1001.      *                                    this one
  1002.      * @access private
  1003.      */
  1004.     function addUsedBy($link$descrip)
  1005.     {
  1006.         $this->tags['usedby'][new parserUsedByTag($link$descrip);
  1007.     }
  1008.     
  1009.     /**
  1010.      * Add a @uses tag to the DocBlock
  1011.      * @param string @see-style text, used for {@link Converter::getLink()}
  1012.      * @param parserStringWithInlineTags description of how the used element is
  1013.      *                                    used
  1014.      * @tutorial tags.uses.pkg
  1015.      */
  1016.     function addUses($seeel$description)
  1017.     {
  1018.         $this->tags['uses'][new parserUsesTag($seeel$description);
  1019.         usort($this->tags['uses']array($this'_sortUses'));
  1020.     }
  1021.  
  1022.     /**
  1023.      * Custom sorting function for sorting @uses tags
  1024.      *
  1025.      * @param parserTag $a 
  1026.      * @param parserTag $b 
  1027.      * @access private
  1028.      * @return int 
  1029.      */
  1030.     function _sortUses($a$b)
  1031.     {
  1032.         return strnatcasecmp($a->getString()$b->getString());
  1033.     }
  1034.  
  1035.     /**
  1036.      * @param string 
  1037.      * @return mixed false if no keyword, unconverted value if one keyword, array of unconverted values if more than one keyword
  1038.      */
  1039.     function getKeyword($keyword)
  1040.     {
  1041.         if ($keyword == 'filesource' && !$this->_canSourcereturn false;
  1042.         if (isset($this->tags[$keyword]))
  1043.         {
  1044.             if (count($this->tags[$keyword]== 1)
  1045.             {
  1046.                 return $this->tags[$keyword][0];
  1047.             else return $this->tags[$keyword];
  1048.         else return false;
  1049.     }
  1050.     
  1051.     /**
  1052.      * @return array Format: array('var' => tag name, 'data' => unconverted tag value)
  1053.      */
  1054.     function listParams()
  1055.     {
  1056.         if (isset($this->params))
  1057.         {
  1058.             $ret array();
  1059.             foreach($this->params as $key => $val)
  1060.             {
  1061.                 $ret[array("var" => ucfirst($key),"data" => $val);
  1062.             }
  1063.             return $ret;
  1064.         else {
  1065.             return array();
  1066.         }
  1067.     }
  1068.     
  1069.     /**
  1070.      * @param Converter 
  1071.      */
  1072.     function listTags()
  1073.     {
  1074.         $tags array();
  1075.         foreach($this->tags as $keyword => $vals)
  1076.         {
  1077.             if ($keyword == 'filesource' && !$this->_canSourcecontinue;
  1078.             foreach($vals as $val)
  1079.             {
  1080.                 $tags[$val;
  1081.             }
  1082.         }
  1083.         usort($tags,'tagsort');
  1084.         return $tags;
  1085.     }
  1086.     
  1087.     /** @return string always 'docblock' */
  1088.     function getType()
  1089.     {
  1090.         return 'docblock';
  1091.     }
  1092. }
  1093.  
  1094. /**
  1095.  * @access private
  1096.  */
  1097. function tagsort($a$b)
  1098. {
  1099.     switch(phpDocumentor_get_class($a))
  1100.     {
  1101.         case 'parsertag' :
  1102.             switch ($a->keyword)
  1103.             {
  1104.                 case 'author' :
  1105.                     $o 3;
  1106.                     break;
  1107.                 case 'version' :
  1108.                     $o 4;
  1109.                     break;
  1110.                 case 'deprecated' :
  1111.                 case 'deprec' :
  1112.                     $o 7;
  1113.                     break;
  1114.                 case 'todo' :
  1115.                 case 'TODO' :
  1116.                     $o 8;
  1117.                     break;
  1118.                 case 'abstract' :
  1119.                     $o 9;
  1120.                     break;
  1121.             }
  1122.         case 'parseraccesstag' :
  1123.             $o 10;
  1124.             break;
  1125.         case 'parsernametag' :
  1126.             $o 11;
  1127.             break;
  1128.         case 'parserseetag' :
  1129.             $o 5;
  1130.             break;
  1131.         case 'parserlinktag' :
  1132.             $o 6;
  1133.             break;
  1134.         case 'parserreturntag' :
  1135.             $o 0;
  1136.             break;
  1137.         case 'parservartag' :
  1138.             $o 1;
  1139.             break;
  1140.         case 'parserstaticvartag' :
  1141.             $o 2;
  1142.             break;
  1143.         default :
  1144.             $o 12;
  1145.             break;
  1146.     }
  1147.     switch(phpDocumentor_get_class($b))
  1148.     {
  1149.         case 'parsertag' :
  1150.             switch ($b->keyword)
  1151.             {
  1152.                 case 'author' :
  1153.                     $p 3;
  1154.                 case 'version' :
  1155.                     $p 4;
  1156.                 case 'deprecated' :
  1157.                 case 'deprec' :
  1158.                     $p 7;
  1159.                 case 'todo' :
  1160.                 case 'TODO' :
  1161.                     $p 8;
  1162.                 case 'abstract' :
  1163.                     $p 9;
  1164.             }
  1165.         case 'parseraccesstag' :
  1166.             $p 10;
  1167.         case 'parsernametag' :
  1168.             $p 11;
  1169.         case 'parserseetag' :
  1170.             $p 5;
  1171.         case 'parserlinktag' :
  1172.             $p 6;
  1173.         case 'parserreturntag' :
  1174.             $p 0;
  1175.         case 'parservartag' :
  1176.             $p 1;
  1177.         case 'parsertutorialtag' :
  1178.             $p 1;
  1179.         case 'parserstaticvartag' :
  1180.             $p 2;
  1181.         default :
  1182.             $p 12;
  1183.     }
  1184.     if ($o == $preturn 0;
  1185.     if ($o $preturn -1;
  1186.     if ($o $preturn 1;
  1187. }
  1188. ?>

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