* @copyright 2004-2006 Claudio Bustos * @link http://pear.php.net/package/PHP_Beautifier * @link http://beautifyphp.sourceforge.net * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @version CVS: $Id:$ */ /** * Require PHP_Beautifier_Decorator */ require_once 'Decorator.php'; /** * Require PHP_Beautifier_Batch_Output */ require_once 'Batch/Output.php'; // ArrayNested->off(); // ArrayNested->on(); /** * Adds functionality to handle multiple files. * - STDIN : As normal * - STDOUT : Send all the scripts, prepended with the name of the original route * - One in, one out: as normal * - Multiple In, one out: determine the type of out. * - Without '/' at the end, same as STDOUT. * - With '/' at the end, copy the base structure and copy all the scripts * * You must define an input file. By default, the output is "./", so the saving * of files will be done on the directory of your command prompt. * * If the file out end in .tgz, the output will be a tar archive. The same action * will be obtained with {@link setCompress()} to true * Use: * * require "PHP/Beautifier.php"; * require "PHP/Beautifier/Batch.php"; * $oBeaut= new PHP_Beautifier(); * $oBatch= new PHP_Beautifier_Batch($oBeaut); // Decorator * $oBatch->setInputFile(__FILE__); * $oBatch->setOutputFile(dirname(__FILE__)."/beautified/"); * $oBatch->process(); * $oBatch->save(); * * * @category PHP * @package PHP_Beautifier * @subpackage Batch * @author Claudio Bustos * @copyright 2004-2006 Claudio Bustos * @link http://pear.php.net/package/PHP_Beautifier * @link http://beautifyphp.sourceforge.net * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @version Release: 0.1.14 */ class PHP_Beautifier_Batch extends PHP_Beautifier_Decorator { /** * Compression method (for now, false, 'gz' and 'bz2') * @var string */ private $sCompress = false; /** * Array or STDIN of paths to parse * @var array */ private $mPreInputFiles = array(); /** * Path to the output */ private $sPreOutputFile = './'; /** * @var PHP_Beautifier_Batch_Output */ private $oBatchOutput; /** * @var array PHP_Beautifier_Batch_Input */ private $aBatchInputs; public $mInputFiles; /** * Output mode. Could be {@link PHP_Beautifier_Batch::FILES} or * {@link PHP_Beautifier_Batch::DIRECTORY} */ private $sOutputMode; const FILES = 'Files'; const DIRECTORY = 'Directory'; /** * Recursive search on dirs * @var bool */ public $bRecursive = false; // public methods, overloaded from PHP_Beautifier /** * Set recursive search for files in dirs on * @param bool */ public function setRecursive($bRecursive = true) { $this->bRecursive = $bRecursive; } /** * Set compression on/off * @param mixed bool(false, true for gzip) or string ('gz' or 'gz2') */ public function setCompress($mCompress = true) { if ($mCompress === true) { $mCompress = 'gz'; } elseif (!$mCompress) { $mCompress = false; } elseif (!is_string($mCompress)) { throw (new Exception('You have to define a mode for compress')); } $this->sCompress = $mCompress; } /** * Set the input(s) files * Could be STDIN or a name, with special chars (?,*) * @param mixed STDIN or string(path) * @return bool */ public function setInputFile($mFiles) { $bCli = (php_sapi_name() == 'cli'); if ($bCli and $this->mPreInputFiles == STDIN and $mFiles != STDIN) { throw (new Exception("Hey, you already defined STDIN,dude")); } elseif ($bCli and $mFiles == STDIN) { $this->mPreInputFiles = STDIN; } else { // ArrayNested->off() if (is_string($mFiles)) { $mFiles = array($mFiles); } // ArrayNested->on() $this->mPreInputFiles = array_merge($this->mPreInputFiles, $mFiles); } return true; } /** * Set the output file * Could be STDOUT or a path to a file or dir (with '/' at the end) * @param mixed STDOUT or string (path) * @return true */ public function setOutputFile($sFile) { if (!is_string($sFile) and !(php_sapi_name() == 'cli' and $sFile == STDOUT)) { throw (new Exception("Accept only string or STDOUT")); } $this->sPreOutputFile = $sFile; return true; } private function setInputFilePost() { $bCli = php_sapi_name() == 'cli'; // ArrayNested->off() if ($bCli and $this->mPreInputFiles == STDIN) { $mInputFiles = array(STDIN); } else { $mInputFiles = array(); foreach($this->mPreInputFiles as $sPath) { $mInputFiles = array_merge($mInputFiles, PHP_Beautifier_Common::getFilesByGlob($sPath, $this->bRecursive)); } } // now, we create stream references for compressed files.... foreach($mInputFiles as $sFile) { // First, tar files if (!($bCli and $sFile == STDIN) and preg_match("/(.tgz|\.tar\.gz|\.tar\.bz2|\.tar)$/", $sFile, $aMatch)) { if (strpos($aMatch[1], 'gz') !== FALSE) { $sCompress = 'gz'; } elseif (strpos($aMatch[1], 'bz2') !== FALSE) { $sCompress = 'bz2'; } elseif (strpos($aMatch[1], 'tar') !== FALSE) { $sCompress = false; } $oTar = new Archive_Tar($sFile, $sCompress); foreach($oTar->listContent() as $aInput) { if (empty($aInput['typeflag'])) { $this->mInputFiles[] = 'tarz://'.$sFile.'#'.$aInput['filename']; } } } else { $this->mInputFiles[] = $sFile; } } if (!$this->mInputFiles) { throw (new Exception("Can't match any file")); } return true; // ArrayNested->on() } private function setOutputFilePost() { if (php_sapi_name() == 'cli' and $this->sPreOutputFile == STDOUT) { $this->sOutputMode = PHP_Beautifier_Batch::FILES; } else { $sPath = str_replace(DIRECTORY_SEPARATOR, '/', $this->sPreOutputFile); if (!$sPath) { $sPath = "./"; } // determine file or dir if (substr($sPath, -1) != '/' and !is_dir($sPath)) { $this->sOutputMode = PHP_Beautifier_Batch::FILES; // Define compression mode if (preg_match("/\.(gz|bz2|tar)$/", $sPath, $aMatch)) { $this->sCompress = $aMatch[1]; } } else { $this->sOutputMode = PHP_Beautifier_Batch::DIRECTORY; } } return true; } /** * Create the real references to files * @return bool * @throws Exception */ public function process() { if (!$this->mPreInputFiles) { throw (new Exception('Input file not defined')); } else { $this->setInputFilePost(); $this->setOutputFilePost(); } if (!$this->mInputFiles) { throw (new Exception(implode(',', $this->mPreInputFiles) ." doesn't match any files")); } else { return true; } } private function getBatchEngine() { $sCompress = ($this->sCompress) ? ucfirst($this->sCompress) : ''; $sClass = $this->sOutputMode.$sCompress; $sClassEngine = 'PHP_Beautifier_Batch_Output_'.$sClass; $sClassFile = PHP_Beautifier_Common::normalizeDir(dirname(__FILE__)) .'Batch/Output/'.$sClass.'.php'; if (!file_exists($sClassFile)) { throw (new Exception("Doesn't exists file definition for $sClass ($sClassFile)")); } else { include_once ($sClassFile); if (!class_exists($sClassEngine)) { throw (new Exception("$sClassFile exists, but $sClassEngine isn't defined")); } else { return new $sClassEngine($this); } } } /** * Save the beautified sources to file(s) * @return bool * @throws Exception */ public function save($sFile = null) { $oBatchEngine = $this->getBatchEngine(); return $oBatchEngine->save(); } /** * Return a string with the content of the file(s) * @return string */ public function get() { $oBatchEngine = $this->getBatchEngine(); return $oBatchEngine->get(); } public function show() { echo $this->get(); } /** * Allows subclass of {@link PHP_Beautifier_Batch_Engine} call methods of {@link $oBeaut} * @param PHP_Beautifier_Batch_Engine * @param string method to call * @param array array of args * @return mixed */ public function callBeautifier(PHP_Beautifier_Batch_Output $oEngine, $sMethod, $aArgs = array()) { return @call_user_func_array(array( $this->oBeaut, $sMethod ) , $aArgs); } public function getInputFiles() { return $this->mInputFiles; } public function getOutputPath() { return $this->sPreOutputFile; } } ?>