commit ecf187ffb68de15a5a22a0663154799db5e79de1
| author | 斟酌 鵬兄 <tgckpg@gmail.com> |
| date | 2014-02-04T01:58:45Z |
| subject | Added missing exclusion flags Put them into class |
commit ecf187ffb68de15a5a22a0663154799db5e79de1
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date: 2014-02-04T01:58:45Z
Added missing exclusion flags
Put them into class
---
php/regRename.php | 385 +++++++++++++++++++++++++++++-------------------------
1 file changed, 209 insertions(+), 176 deletions(-)
diff --git a/php/regRename.php b/php/regRename.php
index 5712a78..644fb86 100644
--- a/php/regRename.php
+++ b/php/regRename.php
@@ -12,215 +12,248 @@ if ( !$argv[1] )
-s <str ...> Strings that will replace the matches
Optional:
- *-e <patterns> Exclude defined pattern
- *-l <File> Output log file
+ -e <patterns> Exclude defined pattern
+ -l <File> Output log file
-t Test without modifying anything
-*Not available yet.
-
" ) ;
//------- End Usage -----------
+class ArgvParser
+{
+ //parseOptions utilitiese by tgckpg
+ static function PARSE ( $argStream, $handler ) {
+ //Chop first useless argument -- argv[0]
+ array_shift ( $argStream ) ;
+ //Initiate ArrayObject for iterator
+ $arrayobject = new ArrayObject ( $argStream ) ;
+ //Initiate iterator for iteration
+ $iterator = $arrayobject->getIterator();
+ //If options is set first
+ if( $iterator->valid() && preg_match ( '/^-\w$/', $iterator->current() ) ) {
+ //iterate through whole argument stream
+ for ( ; $iterator->valid(); $iterator->next() ) {
+ //Check if reached next option
+ if( preg_match ( '/^-\w$/', $opts = $iterator->current() ) ) {
+ //Get current options
+ $currOpt = $opts;
+ //echo "$currOpt\n";
+ //Test if next stream is an option
+ for ( $iterator->next(); $iterator->valid(); $iterator->next() ) {
+ if ( preg_match ( '/^-\w$/', $opts = $iterator->current() ) ) {
+ //echo "$currOpt $opts\n";
+ $handler($currOpt);
+ $currOpt = $opts;
+ } else break;
+ //var_dump($iterator->valid());
+ }
+ }//End if
+ //echo "$currOpt $opts\n";
+ $handler($currOpt, $opts);
+ //A temporary fix for infinite loop
+ if(!$iterator->valid())
+ break;
+ }// End for
+ //If option is not set first.
+ } else {
+ //Try other approach.
+ }// End if
+ }
+}
-//Define globals
-$test = false;
-$recursive = false;
-$searchDirs = array();
-$patterns = array();
-$replaceStrs = array();
-//------- Main Functions --------
-function getDirName ( $dir ) {
- return is_dir ( $dir ) ? $dir : dirname ( $dir ) ;
-}
+class RegRename
+{
-function getFileList ( $dir ) {
- $fileList = array();
- $iterator = new DirectoryIterator ( getDirName ( $dir ) ) ;
- foreach ( $iterator as $fileinfo ) {
- if ( $fileinfo->isFile() ) {
- $fileList[] = $dir."/".$fileinfo->getFilename();
- }
- }
- return $fileList;
-}
+ //Define globals
+ private $test = false;
+ private $recursive = false;
+ private $searchDirs = array();
+ private $patterns = array();
+ private $replaceStrs = array();
+ private $excludes = array();
-function getDirList ( $dir ) {
- $dirList = array();
- $iterator = new DirectoryIterator ( getDirName ( $dir ) ) ;
- foreach ( $iterator as $fileinfo ) {
- if ( $fileinfo->isDir() && !$fileinfo->isDot()) {
- $dirList[] = $fileinfo->getFilename();
+ private $logfile = NULL;
+
+ public function begin()
+ {
+ $this->validateOptions();
+
+ //------- Begin Operations -------
+ foreach ( $this->searchDirs as $dir ) {
+ $this->elog("Directory: $dir\nBuilding file list ...");
+ if ( $this->recursive ) {
+ $fileList = $this->getWholeFileList($dir);
+ } else {
+ $fileList = $this->getFileList($dir);
}
- }
+ $this->elog("Searching ...");
+ foreach ( $fileList as $file ) {
+ //
+ // Get the file name
+ // RegExplained:
+ // Example: /foo/bar/foobar.bar
+ // $matches[0][0] is the whole string "/foo/bar/foobar.bar"
+ //
+ // ^(.+?)
+ // This gets the file path "/foo/bar/" for $matches[1][0]
+ //
+ // ([^\/\\\\]+)$
+ // This gets the file name "foobar.bar" for $matches[2][0]
+ //
+ preg_match_all('/^(.+?)([^\/\\\\]+)$/', $file, $matches );
+ $newName = $matches[2][0];
+ foreach ( $this->patterns as $key => $pattern ) {
+ //Rename over the patterns
+ $newName = preg_replace( $pattern, $this->replaceStrs[$key], $newName );
+ }
- return $dirList;
-}
+ if( $matches[2][0] != $newName ) {
-function getWholeDirList ( $dir ) {
- $wholeDirList = array();
- //getWholeDirList will stop untill getDirList return an empty array.
- foreach ( getDirList ( $dir ) as $file ) {
- //Store found path
- $wholeDirList[] = "$dir/$file";
- //Method getWholeDirList will self-iterate if sub-directories exist.
- $wholeDirList = array_merge ( $wholeDirList, getWholeDirList ( "$dir/$file" ) ) ;
- }
- return $wholeDirList;
-}
+ // Excluede any matches
+ foreach ( $this->excludes as $key => $pattern ) {
+ if(preg_match_all($pattern, $file)) {
+ $this->elog("S File \"{$matches[2][0]}\" excluded on $pattern");
+ continue 2;
+ }
+ }
-function getWholeFileList ( $dir ) {
- //Get the first level list.
- $wholeFileList = getFileList( $dir );
- //getWholeDirList and search its files.
- foreach ( getWholeDirList ( $dir ) as $dir ) {
- $wholeFileList = array_merge ( $wholeFileList, getFileList ( $dir ) ) ;
+ if( $this->test ) {
+ $this->elog("R File \"{$matches[2][0]}\" will be renamed to \"$newName\"");
+ } else {
+ rename ( $file, "{$matches[1][0]}$newName" );
+ }
+ if ( $this->logfile ) {
+ file_put_contents($this->logfile, $this->log);
+ }
+ }/* else {
+ echo "File \"{$matches[0][0]}\" will not be renamed\n";
+ }
+ //*/
+ }
+ $this->elog();
+ }
+ if ( $this->test ) $this->elog("*** Test enabled ***\n");
+ //------- End Operations -------*/
}
- return $wholeFileList;
-}
-function validateOptions ( ) {
- global $searchDirs, $patterns, $replaceStrs;
-
- try {
- if(count($searchDirs) == 0)
- throw new Exception("Search directory is missing");
- else if(count($patterns) == 0)
- throw new Exception("Search pattern is missing");
- else if(count($replaceStrs) == 0)
- throw new Exception("Replacement string is missing");
- else if(count($replaceStrs) != count($patterns))
- throw new Exception("Replacement string and pattern count not match");
- } catch(Exception $e) {
- var_dump( $GLOBALS );
- die("Error: $e.\n");
+ public function setOption( $item, $value = NULL ) {
+ switch($item) {
+ case "-d":
+ if($value)
+ $this->searchDirs[] = $value;
+ break;
+ case "-p":
+ if($value)
+ $this->patterns[] = $value;
+ break;
+ case "-r":
+ $this->recursive = true;
+ break;
+ case "-s":
+ if($value)
+ $this->replaceStrs[] = $value;
+ break;
+ case "-t":
+ $this->test = true;
+ break;
+ case "-e":
+ $this->excludes[] = $value;
+ break;
+ case "-l":
+ $this->logfile = $value;
+ break;
+ default:
+ //Do nothing
+ }
}
-}
-function setOptions( $item, $value = NULL ) {
- global $test, $recursive, $searchDirs, $patterns, $replaceStrs;
- switch($item) {
- case "-d":
- if($value)
- $searchDirs[] = $value;
- break;
- case "-p":
- if($value)
- $patterns[] = $value;
- break;
- case "-r":
- $recursive = true;
- break;
- case "-s":
- if($value)
- $replaceStrs[] = $value;
- break;
- case "-t":
- $test = true;
- break;
- default:
- //Do nothing
- }
-}
+ //------- Main Functions --------
-//parseOptions utilitiese by tgckpg
-function parseOptions ( $argStream, $handler ) {
- //Chop first useless argument -- argv[0]
- array_shift ( $argStream ) ;
- //Initiate ArrayObject for iterator
- $arrayobject = new ArrayObject ( $argStream ) ;
- //Initiate iterator for iteration
- $iterator = $arrayobject->getIterator();
-
- //If options is set first
- if( $iterator->valid() && preg_match ( '/^-\w$/', $iterator->current() ) ) {
- //iterate through whole argument stream
- for ( ; $iterator->valid(); $iterator->next() ) {
- //Check if reached next option
- if( preg_match ( '/^-\w$/', $opts = $iterator->current() ) ) {
- //Get current options
- $currOpt = $opts;
- //echo "$currOpt\n";
- //Test if next stream is an option
- for ( $iterator->next(); $iterator->valid(); $iterator->next() ) {
- if ( preg_match ( '/^-\w$/', $opts = $iterator->current() ) ) {
- //echo "$currOpt $opts\n";
- $handler($currOpt);
- $currOpt = $opts;
- } else break;
- //var_dump($iterator->valid());
- }
- }//End if
- //echo "$currOpt $opts\n";
- $handler($currOpt, $opts);
- //A temporary fix for infinite loop
- if(!$iterator->valid())
- break;
- }// End for
- //If option is not set first.
- } else {
- //Try other approach.
- }// End if
-}
+ function elog( $line = "" ) {
+ $this->log .= $line;
+ $this->log .= "\n";
+ echo "$line\n";
+ }
-//------- End Main Functions --------
+ private function getDirName ( $dir ) {
+ return is_dir ( $dir ) ? $dir : dirname ( $dir ) ;
+ }
+ private function getFileList ( $dir ) {
+ $fileList = array();
+ $iterator = new DirectoryIterator ( $this->getDirName ( $dir ) ) ;
+ foreach ( $iterator as $fileinfo ) {
+ if ( $fileinfo->isFile() ) {
+ $fileList[] = $dir."/".$fileinfo->getFilename();
+ }
+ }
+ return $fileList;
+ }
-parseOptions ( $argv, 'setOptions' ) ;
-validateOptions();
+ private function getDirList ( $dir ) {
+ $dirList = array();
+ $iterator = new DirectoryIterator ( $this->getDirName ( $dir ) ) ;
+ foreach ( $iterator as $fileinfo ) {
+ if ( $fileinfo->isDir() && !$fileinfo->isDot()) {
+ $dirList[] = $fileinfo->getFilename();
+ }
+ }
+ return $dirList;
+ }
-//------- Begin Operations -------
-foreach ( $searchDirs as $dir ) {
- echo "Directory: $dir\nBuilding file list ...\n";
- if ( $recursive ) {
- $fileList = getWholeFileList($dir);
- } else {
- $fileList = getFileList($dir);
+ private function getWholeDirList ( $dir ) {
+ $wholeDirList = array();
+ //getWholeDirList will stop untill getDirList return an empty array.
+ foreach ( $this->getDirList ( $dir ) as $file ) {
+ //Store found path
+ $wholeDirList[] = "$dir/$file";
+ //Method getWholeDirList will self-iterate if sub-directories exist.
+ $wholeDirList = array_merge ( $wholeDirList, $this->getWholeDirList ( "$dir/$file" ) ) ;
+ }
+ return $wholeDirList;
}
- echo "Searching ...\n";
- foreach ( $fileList as $file ) {
- //
- // Get the file name
- // RegExplained:
- // Example: /foo/bar/foobar.bar
- // $matches[0][0] is the whole string "/foo/bar/foobar.bar"
- //
- // ^(.+?)
- // This gets the file path "/foo/bar/" for $matches[1][0]
- //
- // ([^\/\\\\]+)$
- // This gets the file name "foobar.bar" for $matches[2][0]
- //
- preg_match_all('/^(.+?)([^\/\\\\]+)$/', $file, $matches );
- $newName = $matches[2][0];
- foreach ( $patterns as $key => $pattern ) {
- //Rename over the patterns
- $newName = preg_replace( $pattern, $replaceStrs[$key], $newName );
+
+ private function getWholeFileList ( $dir ) {
+ //Get the first level list.
+ $wholeFileList = $this->getFileList( $dir );
+ //getWholeDirList and search its files.
+ foreach ( $this->getWholeDirList ( $dir ) as $dir ) {
+ $wholeFileList = array_merge ( $wholeFileList, $this->getFileList ( $dir ) ) ;
}
- if( $matches[2][0] != $newName ) {
- if( $test ) {
- echo "File \"{$matches[2][0]}\" will be renamed to \"$newName\"\n";
- } else {
- rename ( $file, "{$matches[1][0]}$newName" );
- }
- if ( $logfile ) {
-
- }
- }/* else {
- echo "File \"{$matches[0][0]}\" will not be renamed\n";
+ return $wholeFileList;
+ }
+
+ private function validateOptions ( ) {
+ try {
+ if(count($this->searchDirs) == 0)
+ throw new Exception("Search directory is missing");
+ else if(count($this->patterns) == 0)
+ throw new Exception("Search pattern is missing");
+ else if(count($this->replaceStrs) == 0)
+ throw new Exception("Replacement string is missing");
+ else if(count($this->replaceStrs) != count($this->patterns))
+ throw new Exception("Replacement string and pattern count not match");
+ } catch(Exception $e) {
+ var_dump( $GLOBALS );
+ die("Error: $e.\n");
}
- //*/
}
- echo "\n";
+
+ //------- End Main Functions --------
}
-if ( $test ) echo "*** Test enabled ***\n\n";
-//------- End Operations -------*/
+
+
+$rrgr = new RegRename();
+ArgvParser::PARSE ( $argv, array($rrgr, 'setOption') ) ;
+$rrgr->begin();
+
?>