penguin/utils

my env utils

commit ecf187ffb68de15a5a22a0663154799db5e79de1

author斟酌 鵬兄 <tgckpg@gmail.com>
date2014-02-04T01:58:45Z
subjectAdded 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();
+
 ?>