* @copyright 2002-2006 Gregory Beaver * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @version CVS: $Id: Setup.inc.php 258122 2008-04-22 15:48:55Z ashnazg $ * @link http://www.phpdoc.org * @link http://pear.php.net/PhpDocumentor * @since 1.2 */ error_reporting(E_ALL); /** ensure top-level PhpDocumentor dir is in include path */ set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(__FILE__))); /** common settings */ include_once("phpDocumentor/common.inc.php"); include_once("phpDocumentor/Io.inc"); include_once("phpDocumentor/Publisher.inc"); include_once("phpDocumentor/Classes.inc"); include_once("phpDocumentor/ProceduralPages.inc"); include_once("phpDocumentor/IntermediateParser.inc"); include_once("phpDocumentor/WordParser.inc"); include_once("phpDocumentor/EventStack.inc"); include_once("phpDocumentor/ParserData.inc"); include_once("phpDocumentor/InlineTags.inc"); include_once("phpDocumentor/DocBlockTags.inc"); include_once("phpDocumentor/DescHTML.inc"); include_once("phpDocumentor/ParserDocBlock.inc"); include_once("phpDocumentor/ParserElements.inc"); include_once("phpDocumentor/Parser.inc"); include_once("phpDocumentor/phpDocumentorTWordParser.inc"); include_once("phpDocumentor/phpDocumentorTParser.inc"); include_once("phpDocumentor/HighlightParser.inc"); include_once("phpDocumentor/TutorialHighlightParser.inc"); include_once("phpDocumentor/ParserDescCleanup.inc"); include_once("phpDocumentor/PackagePageElements.inc"); include_once("phpDocumentor/XMLpackagePageParser.inc"); include_once("phpDocumentor/LinkClasses.inc"); include_once("phpDocumentor/Converter.inc"); include_once("phpDocumentor/Errors.inc"); if (isset($_GET)) { /** * $interface is either 'web' or is not set at all * @global array $interface */ if (isset($_GET['interface'])) $interface = $_GET['interface']; /** * $_phpDocumentor_setting is either the value from the web interface, or is set up by {@link Io::parseArgv()} * @global array $_phpDocumentor_setting */ if (isset($_GET['setting'])) $_phpDocumentor_setting = $_GET['setting']; } /** * default package name, set using -dn --defaultpackagename * @global string $GLOBALS['phpDocumentor_DefaultPackageName'] * @name $phpDocumentor_DefaultPackageName */ $GLOBALS['phpDocumentor_DefaultPackageName'] = 'default'; /** * default package name, set using -dn --defaultcategoryname * @global string $GLOBALS['phpDocumentor_DefaultCategoryName'] * @name $phpDocumentor_DefaultCategoryName */ $GLOBALS['phpDocumentor_DefaultCategoryName'] = 'default'; /** * @package phpDocumentor */ class phpDocumentor_setup { /** * The main parser * @var Parser|phpDocumentorTParser */ var $parse; /** * Used to parse command-line options * @var Io */ var $setup; /** * Used to organize output from the Parser before Conversion * @var phpDocumentor_IntermediateParser */ var $render = false; /** * Packages to create documentation for * @var string */ var $packages = false; /** * contents of --filename commandline * @tutorial phpDocumentor.howto.pkg#using.command-line.filename * @var string */ var $files = ''; /** * contents of --directory commandline * @tutorial phpDocumentor.howto.pkg#using.command-line.directory * @var string */ var $dirs = ''; /** * contents of --hidden commandline * @tutorial phpDocumentor.howto.pkg#using.command-line.hidden * @var boolean */ var $hidden = false; /** * time that parsing was started, used for informative timing of output * @access private */ var $parse_start_time; /** * contents of --ignore commandline * @tutorial phpDocumentor.howto.pkg#using.command-line.ignore * @var string */ var $ignore_files = array(); /** * contents of --ignoresymlinks commandline * @var boolean */ var $ignoresymlinks = false; /** * Checks PHP version, makes sure it is 4.2.0+, and chooses the * phpDocumentorTParser if version is 4.3.0+ * @uses parseIni() */ function phpDocumentor_setup() { global $_phpDocumentor_cvsphpfile_exts, $_phpDocumentor_setting; if (!function_exists('is_a')) { print "phpDocumentor requires PHP version 4.2.0 or greater to function"; exit; } $this->setup = new Io; if (!isset($interface) && !isset($_GET['interface']) && !isset($_phpDocumentor_setting)) { // Parse the argv settings $_phpDocumentor_setting = $this->setup->parseArgv(); } if (isset($_phpDocumentor_setting['useconfig']) && !empty($_phpDocumentor_setting['useconfig'])) { $this->readConfigFile($_phpDocumentor_setting['useconfig']); } // set runtime to a large value since this can take quite a while // we can only set_time_limit when not in safe_mode bug #912064 if (!ini_get('safe_mode')) { set_time_limit(0); // unlimited runtime } else { phpDocumentor_out("time_limit cannot be set since your in safe_mode, please edit time_limit in your php.ini to allow enough time for phpDocumentor to run"); } $phpver = phpversion(); $phpdocver = PHPDOCUMENTOR_VER; if (isset($_GET['interface'])) { $phpver = "$phpver"; $phpdocver = "$phpdocver"; } phpDocumentor_out("PHP Version $phpver\n"); phpDocumentor_out("phpDocumentor version $phpdocver\n\n"); $this->parseIni(); $this->setMemoryLimit(); /* * NOTE: * It is possible for the tokenizer extension to be loaded, * but actually be broken in the OS, and therefore not working... * the conditional below will NOT recognize this scenario. * You can separately run the {@link tokenizer_test.php} to * verify that the tokenizer library is working correctly * from the OS perspective. */ if (tokenizer_ext) { phpDocumentor_out("using tokenizer Parser\n"); $this->parse = new phpDocumentorTParser; } else { phpDocumentor_out("No Tokenizer support detected, so using default (slower) Parser..." . PHP_EOL); if (version_compare(phpversion(), '4.3.0', '<')) { phpDocumentor_out(" for faster parsing, recompile PHP with --enable-tokenizer." . PHP_EOL ); } else { phpDocumentor_out(" for faster parsing, recompile PHP without --disable-tokenizer." . PHP_EOL ); } $this->parse = new Parser; } } /** * Get phpDocumentor settings from a user configuration file * @param string user configuration file */ function readConfigFile($file) { global $_phpDocumentor_setting, $_phpDocumentor_options; // security $file = str_replace(array('..','.ini','\\'),array('','','/'),$file); if (is_file($file . '.ini')) { $_phpDocumentor_setting = phpDocumentor_parse_ini_file($file.'.ini'); } else { if ('@DATA-DIR@' != '@'.'DATA-DIR@') { $configdir = str_replace('\\','/', '@DATA-DIR@/PhpDocumentor') . PATH_DELIMITER . 'user' . PATH_DELIMITER; } else { $configdir = str_replace('\\','/',$GLOBALS['_phpDocumentor_install_dir']) . PATH_DELIMITER . 'user' . PATH_DELIMITER; } if (isset($_phpDocumentor_options['userdir'])) $configdir = $_phpDocumentor_options['userdir']; if (substr($configdir,-1) != '/') { $configdir .= '/'; } $_phpDocumentor_setting = phpDocumentor_parse_ini_file( $configdir . $file . '.ini'); if (empty($_phpDocumentor_setting['defaultpackagename'])) { $_phpDocumentor_setting['defaultpackagename'] = 'default'; } } // don't want a loop condition! unset($_phpDocumentor_setting['useconfig']); } /** * Get phpDocumentor settings from command-line or web interface */ function readCommandLineSettings() { global $_phpDocumentor_setting,$interface,$_phpDocumentor_RIC_files; // subscribe $render class to $parse class events if (!isset($_phpDocumentor_setting['junk'])) $_phpDocumentor_setting['junk'] = ''; if (!isset($_phpDocumentor_setting['title'])) $_phpDocumentor_setting['title'] = 'Generated Documentation'; $temp_title = $_phpDocumentor_setting['title']; $this->render = new phpDocumentor_IntermediateParser($temp_title); if (isset($_phpDocumentor_setting['help']) || $_phpDocumentor_setting['junk'] == "-h" || $_phpDocumentor_setting['junk'] == "--help") { echo $this->setup->displayHelpMsg(); die(); } // set to parse hidden files $this->hidden = (isset($_phpDocumentor_setting['hidden'])) ? decideOnOrOff($_phpDocumentor_setting['hidden']) : false; // set to parse through symlinks $this->ignoresymlinks = (isset($_phpDocumentor_setting['ignoresymlinks'])) ? decideOnOrOff($_phpDocumentor_setting['ignoresymlinks']) : false; // set to parse elements marked private with @access private $this->render->setParsePrivate((isset($_phpDocumentor_setting['parseprivate'])) ? decideOnOrOff($_phpDocumentor_setting['parseprivate']) : false); // set to print warnings when undocumented elements are spotted $this->render->setUndocumentedElementWarningsMode((isset($_phpDocumentor_setting['undocumentedelements'])) ? decideOnOrOff($_phpDocumentor_setting['undocumentedelements']) : false); if (isset($_phpDocumentor_setting['ignoretags'])) { $ignoretags = explode(',', $_phpDocumentor_setting['ignoretags']); $ignoretags = array_map('trim', $ignoretags); $tags = array(); foreach($ignoretags as $tag) { if (!in_array($tag,array('@global', '@access', '@package', '@ignore', '@name', '@param', '@return', '@staticvar', '@var'))) $tags[] = $tag; } $_phpDocumentor_setting['ignoretags'] = $tags; } if (isset($_phpDocumentor_setting['readmeinstallchangelog'])) { $_phpDocumentor_setting['readmeinstallchangelog'] = explode(',',str_replace(' ','',$_phpDocumentor_setting['readmeinstallchangelog'])); $rics = array(); foreach($_phpDocumentor_setting['readmeinstallchangelog'] as $ric) { $rics[] = strtoupper(trim($ric)); } $_phpDocumentor_RIC_files = $rics; } if (isset($_phpDocumentor_setting['javadocdesc']) && $_phpDocumentor_setting['javadocdesc'] == 'on') { $this->parse->eventHandlers[PARSER_EVENT_DOCBLOCK] = 'JavaDochandleDocblock'; } if (tokenizer_ext) { if (isset($_phpDocumentor_setting['sourcecode']) && $_phpDocumentor_setting['sourcecode'] == 'on') { $_phpDocumentor_setting['sourcecode'] = true; } else { $_phpDocumentor_setting['sourcecode'] = false; } } else { if (isset($_phpDocumentor_setting['sourcecode']) && $_phpDocumentor_setting['sourcecode'] == 'on') { addWarning(PDERROR_SOURCECODE_IGNORED); } $_phpDocumentor_setting['sourcecode'] = false; } if (isset($_phpDocumentor_setting['converterparams'])) { $_phpDocumentor_setting['converterparams'] = explode($_phpDocumentor_setting['converterparams']); foreach($_phpDocumentor_setting['converterparams'] as $i => $p) { $_phpDocumentor_setting['converterparams'][$i] = trim($p); } } if (isset($_phpDocumentor_setting['customtags']) && !empty($_phpDocumentor_setting['customtags'])) { $c = explode(',',$_phpDocumentor_setting['customtags']); for($i=0;$irender->setQuietMode((isset($_phpDocumentor_setting['quiet'])) ? decideOnOrOff($_phpDocumentor_setting['quiet']) : false); // Setup the different classes if (isset($_phpDocumentor_setting['templatebase'])) { $this->render->setTemplateBase(trim($_phpDocumentor_setting['templatebase'])); } if (isset($_phpDocumentor_setting['target']) && !empty($_phpDocumentor_setting['target'])) { $this->render->setTargetDir(trim($_phpDocumentor_setting['target'])); } else { echo "a target directory must be specified\n try phpdoc -h\n"; die(); } if (!empty($_phpDocumentor_setting['packageoutput'])) { $this->packages = explode(",",trim($_phpDocumentor_setting['packageoutput'])); foreach($this->packages as $p => $v) { $this->packages[$p] = trim($v); } } if (!empty($_phpDocumentor_setting['filename'])) { $this->files = trim($_phpDocumentor_setting['filename']); } if (!empty($_phpDocumentor_setting['directory'])) { $this->dirs = trim($_phpDocumentor_setting['directory']); } } function checkIgnoreTag($tagname, $inline = false) { global $_phpDocumentor_setting; $tagname = '@'.$tagname; if (!isset($_phpDocumentor_setting['ignoretags'])) return false; if ($inline) $tagname = '{'.$tagname.'}'; return in_array($tagname, $_phpDocumentor_setting['ignoretags']); } /** * Allow a memory_limit setting in phpDocumentor.ini to override php.ini or default memory limit * @todo recognize "K" and "G" in memory_limit settings, rather than just "M" */ function setMemoryLimit() { global $_phpDocumentor_options; $DEFAULT_MEMORY_SIZE_MINIMUM = 256; // PhpDoc memory_limit from phpDocumentor.ini overrides all other considerations if (isset($_phpDocumentor_options['memory_limit'])) { $phpdoc_ini_setting = str_replace('M', '', $_phpDocumentor_options['memory_limit']); // allow phpdoc.ini to DISABLE the setting via "= -1" if ($phpdoc_ini_setting == -1) { $memory_setting_to_use = $phpdoc_ini_setting; $max_mem_log_message = "setting disabled by phpDocumentor.ini...\n"; } else { $memory_setting_to_use = $phpdoc_ini_setting . "M"; $max_mem_log_message = "set at " . $memory_setting_to_use . " by phpDocumentor.ini...\n"; } } else { $php_ini_setting = str_replace('M', '', ini_get('memory_limit')); // allow php.ini to DISABLE the setting via "= -1" if ($php_ini_setting == -1) { // allow it to remain disabled $memory_setting_to_use = $php_ini_setting; $max_mem_log_message = "setting disabled by php.ini...\n"; } else { // memory_limit from php.ini must be at least the default minimum $memory_setting_to_use = ($php_ini_setting > $DEFAULT_MEMORY_SIZE_MINIMUM) ? $php_ini_setting . "M" : $DEFAULT_MEMORY_SIZE_MINIMUM . "M"; $max_mem_log_message = "set at " . $memory_setting_to_use . " after considering php.ini...\n"; } } if (ini_set("memory_limit", $memory_setting_to_use)) { // PHP had to have been compiled with "--enable-memory-limit" to allow setting the value explicitly phpDocumentor_out("Maximum memory usage " . $max_mem_log_message); } else { // PHP must not have been compiled with "--enable-memory-limit", so we cannot modify it... // no need to notify user of this unless they tried using memory_limit in their phpDocumentor.ini... if (isset($phpdoc_ini_setting)) { phpDocumentor_out("Unable to alter memory_limit via your phpDocumentor.ini... perhaps PHP wasn't compiled with \"--enable-memory-limit\"?\n"); } } } function setJavadocDesc() { $this->parse->eventHandlers[PARSER_EVENT_DOCBLOCK] = 'JavaDochandleDocblock'; } function setParsePrivate($flag = true) { $this->render->setParsePrivate($flag); } function setQuietMode($flag = true) { $this->render->setQuietMode($flag); } function setUndocumentedElementWarnings($flag = true) { $this->render->setUndocumentedElementWarnings($flag); } function setTargetDir($target) { $this->render->setTargetDir($target); } function setTemplateBase($dir) { $this->render->setTemplateBase($dir); } function setPackageOutput($po) { $this->packages = explode(",",$po); array_map('trim', $this->packages); } function setTitle($ti) { $this->render = new phpDocumentor_IntermediateParser($ti); } function setFilesToParse($files) { $this->files = $files; } function setDirectoriesToParse($dirs) { $this->dirs = $dirs; } function parseHiddenFiles($flag = true) { $this->hidden = $flag; } function setIgnore($ig) { if (strstr($ig,",")) { $this->ignore_files = explode(",",$ig); } else { if (!empty($ig)) $this->ignore_files = array($ig); } $this->ignore_files = array_map('trim', $this->ignore_files); } function createDocs($title = false) { $this->parse_start_time = time(); global $_phpDocumentor_setting; if (!$this->render) { $this->render = new phpDocumentor_IntermediateParser($title); } // setup ignore list $this->ignore_files =array(); if(isset($_phpDocumentor_setting['ignore'])) { $this->setIgnore($_phpDocumentor_setting['ignore']); } $this->parse->subscribe("*",$this->render); // parse the directory if (!empty($this->files)) { $files = explode(",",$this->files); foreach($files as $file) { $file = trim($file); $test = $this->setup->getAllFiles($file); if ($test) { foreach($test as $file) { $file = trim($file); $dir = realpath(dirname($file)); $dir = strtr($dir, "\\", "/"); $dir = str_replace('//','/',$dir); // strip trailing directory seperator if (substr($dir,-1) == "/" || substr($dir,-1) == "\\") { $dir = substr($dir,0,-1); } $file = strtr(realpath($file), "\\", "/"); $file = str_replace('//','/',$file); if (!$this->setup->checkIgnore(basename($file),dirname($file),$this->ignore_files,true,$this->ignoresymlinks)) { $filelist[] = str_replace('\\','/',$file); } else { phpDocumentor_out("File $file Ignored\n"); flush(); } } } else { $dir = dirname(realpath($file)); $dir = strtr($dir, "\\", "/"); $dir = str_replace('//','/',$dir); // strip trailing directory seperator if (substr($dir,-1) == "/" || substr($dir,-1) == "\\") { $dir = substr($dir,0,-1); } $base = count(explode("/",$dir)); $file = strtr(realpath($file), "\\", "/"); $file = str_replace('//','/',$file); flush(); if (!$this->setup->checkIgnore(basename($file),dirname($file),$this->ignore_files,true,$this->ignoresymlinks)) { $filelist[] = str_replace('\\','/',$file); } else { phpDocumentor_out("File $file Ignored\n"); flush(); } } } } if (!empty($this->dirs)) { $dirs = explode(",",$this->dirs); foreach($dirs as $dir) { $olddir = $dir; $dir = realpath($dir); if (!$dir) { phpDocumentor_out('ERROR: "' . $olddir . '" does not exist, skipping'); continue; } $dir = trim($dir); $dir = strtr($dir, "\\", "/"); $dir = str_replace('//','/',$dir); // strip trailing directory seperator if (substr($dir,-1) == "/" || substr($dir,-1) == "\\") { $dir = substr($dir,0,-1); } $files = $this->setup->dirList($dir,$this->hidden,$this->ignoresymlinks); if (is_array($files)) { foreach($files as $file) { $file = strtr($file, '\\', '/'); // file's subpath, relative to $dir $file_subpath = str_replace('\\', '/', realpath(dirname($file))); $file_subpath = preg_replace('[\\/]', DIRECTORY_SEPARATOR, $file_subpath); $file_subpath = preg_replace('~^' . preg_quote($dir, '~') . '~', '', $file_subpath); if (!$this->setup->checkIgnore(basename($file), $file_subpath, $this->ignore_files,true,$this->ignoresymlinks)) { $filelist[] = $file; } else { phpDocumentor_out("File $file Ignored\n"); flush(); } } } } } if (isset($filelist)) { if (PHPDOCUMENTOR_WINDOWS) { // case insensitive array_unique usort($filelist,'strnatcasecmp'); reset($filelist); $newarray = array(); $i = 0; $element = current($filelist); for ($n=0;$nsetup->getBase($filelist))); define("PHPDOCUMENTOR_BASE",$source_base); list($filelist,$ric) = $this->setup->getReadmeInstallChangelog($source_base, $filelist); phpDocumentor_out("\n\nGrabbing README/INSTALL/CHANGELOG\n"); flush(); foreach($ric as $file) { phpDocumentor_out(basename($file).'...'); flush(); $fp = fopen($file,'r'); $contents = fread($fp,filesize($file)); $this->render->HandleEvent(PHPDOCUMENTOR_EVENT_README_INSTALL_CHANGELOG, array(basename($file),$contents)); fclose($fp); } phpDocumentor_out("\ndone\n"); flush(); list($filelist,$tutorials) = $this->setup->getTutorials($filelist); phpDocumentor_out("\n\nTutorial/Extended Documentation Parsing Stage\n\n"); flush(); if (count($tutorials)) { $tuteparser = new XMLPackagePageParser; $tuteparser->subscribe('*',$this->render); foreach($tutorials as $tutorial) { switch($tutorial['tutetype']) { case 'pkg' : case 'cls' : case 'proc' : switch($tutorial['tutetype']) { case 'pkg' : $ptext = 'Package-level Docs '; if (!empty($tutorial['subpackage'])) $ptext = 'Sub-Package Docs '; break; case 'cls' : $ptext = 'Class-level Docs '; break; case 'proc' : $ptext = 'Procedural-level Docs '; break; } $fp = @fopen($tutorial['path'],"r"); if ($fp) { $ret = fread($fp,filesize($tutorial['path'])); // fix 1151650 if (stristr($ret, "utf-8") !== "") { $ret = utf8_decode($ret); } fclose($fp); unset($fp); phpDocumentor_out('Parsing '.$ptext.$tutorial['path'].'...'); flush(); $tuteparser->parse($ret,$tutorial); phpDocumentor_out("done\n"); flush(); } else { phpDocumentor_out('Error '.$ptext.$tutorial['path'].' doesn\'t exist'."\n"); flush(); } default : break; } } } phpDocumentor_out("done\n"); flush(); phpDocumentor_out("\n\nGeneral Parsing Stage\n\n"); flush(); foreach($filelist as $file) { phpDocumentor_out("Reading file $file"); flush(); $this->parse->parse($a = $this->setup->readPhpFile($file, $this->render->quietMode),$file,$base,$this->packages); } $b = (time() - $this->parse_start_time); phpDocumentor_out("done\n"); flush(); // render output phpDocumentor_out("\nConverting From Abstract Parsed Data\n"); flush(); $this->render->output(); $a = (time() - $this->parse_start_time); $c = ($a - $b); phpDocumentor_out("\nParsing time: $b seconds\n"); phpDocumentor_out("\nConversion time: $c seconds\n"); phpDocumentor_out("\nTotal Documentation Time: $a seconds\n"); phpDocumentor_out("done\n"); flush(); } else { print "\nERROR: nothing parsed\n"; exit; } } /** * Parse configuration file phpDocumentor.ini */ function parseIni() { phpDocumentor_out("Parsing configuration file phpDocumentor.ini...\n"); flush(); if ('@DATA-DIR@' != '@'.'DATA-DIR@') { $options = phpDocumentor_parse_ini_file(str_replace('\\','/', '@DATA-DIR@/PhpDocumentor') . PATH_DELIMITER . 'phpDocumentor.ini',true); phpDocumentor_out(" (found in " . '@DATA-DIR@/PhpDocumentor' . PATH_DELIMITER . ")...\n"); } else { $options = phpDocumentor_parse_ini_file(str_replace('\\','/',$GLOBALS['_phpDocumentor_install_dir']) . PATH_DELIMITER . 'phpDocumentor.ini',true); phpDocumentor_out(" (found in " . $GLOBALS['_phpDocumentor_install_dir'] . PATH_DELIMITER . ")...\n"); } if (!$options) { print "ERROR: cannot open phpDocumentor.ini in directory " . $GLOBALS['_phpDocumentor_install_dir']."\n"; print "-Is phpdoc in either the path or include_path in your php.ini file?"; exit; } foreach($options as $var => $values) { if ($var != 'DEBUG') { // phpDocumentor_out("\n$var"); if ($var != '_phpDocumentor_setting' && $var != '_phpDocumentor_options' && $var != '_phpDocumentor_install_dir' ) $values = array_values($values); // fancy_debug("\n$var",$values); $GLOBALS[$var] = $values; } } phpDocumentor_out("\ndone\n"); flush(); /** Debug Constant */ if (!defined('PHPDOCUMENTOR_DEBUG')) define("PHPDOCUMENTOR_DEBUG",$options['DEBUG']['PHPDOCUMENTOR_DEBUG']); if (!defined('PHPDOCUMENTOR_KILL_WHITESPACE')) define("PHPDOCUMENTOR_KILL_WHITESPACE",$options['DEBUG']['PHPDOCUMENTOR_KILL_WHITESPACE']); $GLOBALS['_phpDocumentor_cvsphpfile_exts'] = $GLOBALS['_phpDocumentor_phpfile_exts']; foreach($GLOBALS['_phpDocumentor_cvsphpfile_exts'] as $key => $val) { $GLOBALS['_phpDocumentor_cvsphpfile_exts'][$key] = "$val,v"; } // none of this stuff is used anymore if (isset($GLOBALS['_phpDocumentor_html_allowed'])) { $___htmltemp = array_flip($GLOBALS['_phpDocumentor_html_allowed']); $___html1 = array(); foreach($___htmltemp as $tag => $trans) { $___html1['<'.$tag.'>'] = htmlentities('<'.$tag.'>'); $___html1[''] = htmlentities(''); } $GLOBALS['phpDocumentor___html'] = array_flip($___html1); } } /** * Performs character-based validation of Output Converter Template name pieces * @param string the name piece (just ONE of either Output, Converter, or Template piece) * @param string any extra characters to allow beyond the default character set * @return string|bool the clean name, or FALSE if piece is deemed invalid * @access private */ function cleanConverterNamePiece($name, $extra_characters_to_allow = '') { $name = str_replace("\\", "/", $name); // security: ensure no opportunity exists to use "../.." pathing in this value $name = preg_replace('/[^a-zA-Z0-9' . $extra_characters_to_allow . '_-]/', "", $name); // absolutely positively do NOT allow two consecutive dots ".." if (strpos($name, '..') > -1) $name = false; return $name; } /** * Figures out what output converter to use * @param string Output Converter Template name * @access private * @global array * @uses cleanConverterNamePieces * @uses phpDocumentor_out */ function setupConverters($output = false) { global $_phpDocumentor_setting; if ($output) { $_phpDocumentor_setting['output'] = $output; } if (isset($_phpDocumentor_setting['output']) && !empty($_phpDocumentor_setting['output'])) { $c = explode(',',$_phpDocumentor_setting['output']); for($i=0; $i< count($c); $i++) { $c[$i] = explode(':',$c[$i]); $a = $c[$i][0]; if (isset($c[$i][0])) { $a = $this->cleanConverterNamePiece($c[$i][0]); } else { $a = false; } if (isset($c[$i][1])) { /* * must allow "/" due to options like "DocBook/peardoc2" */ $b = $this->cleanConverterNamePiece($c[$i][1], '\/'); } else { $b = false; } if (isset($c[$i][2])) { /* * must allow "." due to options like "phpdoc.de" * must allow "/" due to options like "DOM/default" */ $d = $this->cleanConverterNamePiece($c[$i][2], '.\/'); if (substr($d,-1) != "/") { $d .= "/"; } else { $d = 'default/'; } } if (strtoupper(trim($a)) == 'HTML' && (trim($b) == 'default')) { phpDocumentor_out("WARNING: HTMLdefaultConverter is deprecated, using HTMLframesConverter.\n"); phpDocumentor_out("WARNING: template output is identical, HTMLframes is more flexible.\n"); phpDocumentor_out("WARNING: please adjust your usage\n"); flush(); $b = 'frames'; // change default to frames. } $this->render->addConverter(strtoupper(trim($a)),trim($b),trim($d)); } } else { $this->render->addConverter('HTML','frames','default/'); } if (empty($this->render->converters)) addErrorDie(PDERROR_NO_CONVERTERS); } } /** * Fuzzy logic to interpret the boolean args' intent * @param string the command-line option to analyze * @return boolean our best guess of the value's boolean intent */ function decideOnOrOff($value_to_guess = 'NO VALUE WAS PASSED') { $these_probably_mean_yes = array( '', // "--hidden" with no value 'on', // "--hidden on" 'y', 'yes', // "--hidden y" 'true', // "--hidden true" '1' // "--hidden 1" ); $best_guess = false; // default to "false", "off", "no", "take a hike" if (in_array(strtolower(trim($value_to_guess)), $these_probably_mean_yes)) { $best_guess = true; } return $best_guess; } /** * Print parse information if quiet setting is off */ function phpDocumentor_out($string) { global $_phpDocumentor_setting; if ((isset($_phpDocumentor_setting['quiet'])) ? !decideOnOrOff($_phpDocumentor_setting['quiet']) : true) { print $string; } } /** * Crash in case of known, dangerous bug condition * * Checks the PHP version that is executing PhpDocumentor, * in case a known PHP/PEAR bug condition could be triggered * by the PhpDocumentor execution. * @param string $php_version the PHP version that contains the bug * @param string $php_bug_number the PHP bug number (if any) * @param string $pear_bug_number the PEAR bug number (if any) */ function checkForBugCondition($php_version, $php_bug_number = 'none', $pear_bug_number = 'none') { if (version_compare(phpversion(), $php_version) == 0) { addErrorDie(PDERROR_DANGEROUS_PHP_BUG_EXISTS, $php_version, $php_bug_number, $pear_bug_number); } } ?>