313 lines
10 KiB
PHP
313 lines
10 KiB
PHP
|
<?php
|
||
|
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||
|
/**
|
||
|
* Definition of PHP_Beautifier_Batch
|
||
|
*
|
||
|
* PHP version 5
|
||
|
*
|
||
|
* LICENSE: This source file is subject to version 3.0 of the PHP license
|
||
|
* that is available through the world-wide-web at the following URI:
|
||
|
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
|
||
|
* the PHP License and are unable to obtain it through the web, please
|
||
|
* send a note to license@php.net so we can mail you a copy immediately.
|
||
|
* @category PHP
|
||
|
* @package PHP_Beautifier
|
||
|
* @subpackage Batch
|
||
|
* @author Claudio Bustos <cdx@users.sourceforge.com>
|
||
|
* @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:
|
||
|
* <code>
|
||
|
* 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();
|
||
|
* </code>
|
||
|
*
|
||
|
* @category PHP
|
||
|
* @package PHP_Beautifier
|
||
|
* @subpackage Batch
|
||
|
* @author Claudio Bustos <cdx@users.sourceforge.com>
|
||
|
* @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;
|
||
|
}
|
||
|
}
|
||
|
?>
|