* @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[''.$tag.'>'] = htmlentities(''.$tag.'>');
}
$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);
}
}
?>