Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 2006 Kasper Skaarhoj (kasperYYYY@typo3.com) 00006 * All rights reserved 00007 * 00008 * This script is part of the TYPO3 project. The TYPO3 project is 00009 * free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * The GNU General Public License can be found at 00015 * http://www.gnu.org/copyleft/gpl.html. 00016 * A copy is found in the textfile GPL.txt and important notices to the license 00017 * from the author is found in LICENSE.txt distributed with these scripts. 00018 * 00019 * 00020 * This script is distributed in the hope that it will be useful, 00021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00023 * GNU General Public License for more details. 00024 * 00025 * This copyright notice MUST APPEAR in all copies of the script! 00026 ***************************************************************/ 00060 class t3lib_cli { 00061 00062 var $cli_args = array(); // Command line arguments, exploded into key => value-array pairs 00063 var $cli_options = array( 00064 array('-s','Silent operation, will only output errors and important messages.'), 00065 array('--silent','Same as -s'), 00066 array('-ss','Super silent, will not even output errors or important messages.'), 00067 ); 00068 var $cli_help = array( 00069 'name' => 'CLI base class (overwrite this...)', 00070 'synopsis' => '###OPTIONS###', 00071 'description' => 'Class with basic functionality for CLI scripts (overwrite this...)', 00072 'examples' => 'Give examples...', 00073 'options' => '', 00074 'license' => 'GNU GPL - free software!', 00075 'author' => '[Author name]', 00076 ); 00077 var $stdin = NULL; 00078 00079 00086 function t3lib_cli() { 00087 // Loads the cli_args array with command line arguments 00088 $this->cli_args = $this->cli_getArgIndex(); 00089 } 00090 00099 function cli_getArgArray($option,$argv) { 00100 while (count($argv) && strcmp($argv[0],$option)) { 00101 array_shift($argv); 00102 } 00103 00104 if (!strcmp($argv[0],$option)) { 00105 array_shift($argv); 00106 return count($argv) ? $argv : array(''); 00107 } 00108 } 00109 00116 function cli_isArg($option) { 00117 return isset($this->cli_args[$option]); 00118 } 00119 00127 function cli_argValue($option,$idx=0) { 00128 return is_array($this->cli_args[$option]) ? $this->cli_args[$option][$idx] : ''; 00129 } 00130 00138 function cli_getArgIndex() { 00139 $cli_options = array(); 00140 $index = '_DEFAULT'; 00141 foreach($_SERVER['argv'] as $token) { 00142 if ($token{0}==='-') { 00143 list($index,$opt) = explode('=',$token,2); 00144 if (isset($cli_options[$index])) { 00145 echo 'ERROR: Option '.$index.' was used twice!'.chr(10); 00146 exit; 00147 } 00148 $cli_options[$index] = array(); 00149 if (isset($opt)) { 00150 $cli_options[$index][] = $opt; 00151 } 00152 } else { 00153 $cli_options[$index][] = $token; 00154 } 00155 } 00156 return $cli_options; 00157 } 00158 00162 function cli_validateArgs() { 00163 $cli_args_copy = $this->cli_args; 00164 unset($cli_args_copy['_DEFAULT']); 00165 $allOptions = array(); 00166 00167 foreach($this->cli_options as $cfg) { 00168 $allOptions[] = $cfg[0]; 00169 $argSplit = t3lib_div::trimExplode(' ',$cfg[0],1); 00170 if (isset($cli_args_copy[$argSplit[0]])) { 00171 00172 foreach($argSplit as $i => $v) { 00173 $ii=$i; 00174 if ($i>0) { 00175 if (!isset($cli_args_copy[$argSplit[0]][$i-1])) { 00176 echo 'ERROR: Option "'.$argSplit[0].'" requires a value ("'.$v.'") on position '.$i.chr(10); 00177 exit; 00178 } 00179 } 00180 } 00181 00182 $ii++; 00183 if (isset($cli_args_copy[$argSplit[0]][$ii-1])) { 00184 echo 'ERROR: Option "'.$argSplit[0].'" does not support a value on position '.$ii.chr(10); 00185 exit; 00186 } 00187 00188 unset($cli_args_copy[$argSplit[0]]); 00189 } 00190 } 00191 00192 if (count($cli_args_copy)) { 00193 echo wordwrap('ERROR: Option '.implode(',',array_keys($cli_args_copy)).' was unknown to this script!'.chr(10).'(Options are: '.implode(', ',$allOptions).')'.chr(10)); 00194 exit; 00195 } 00196 } 00197 00203 function cli_keyboardInput() { 00204 00205 // Have to open the stdin stream only ONCE! otherwise I cannot read multiple lines from it... : 00206 if (!$this->stdin) { 00207 $this->stdin = fopen('php://stdin', 'r'); 00208 } 00209 00210 while (FALSE == ($line = fgets($this->stdin,1000))) {} 00211 00212 return trim($line); 00213 } 00214 00221 function cli_keyboardInput_yes($msg='') { 00222 echo $msg.' (Yes/No + return): '; // ONLY makes sense to echo it out since we are awaiting keyboard input - that cannot be silenced... 00223 return t3lib_div::inList('y,yes',strtolower($this->cli_keyboardInput())); 00224 } 00225 00233 function cli_echo($string='',$force=FALSE) { 00234 if (isset($this->cli_args['-ss'])) { 00235 // Nothing to do... 00236 } elseif (isset($this->cli_args['-s']) || isset($this->cli_args['--silent'])) { 00237 if ($force) { echo $string; return TRUE; } 00238 } else { echo $string; return TRUE; } 00239 00240 return FALSE; 00241 } 00242 00248 function cli_help() { 00249 foreach($this->cli_help as $key => $value) { 00250 $this->cli_echo(strtoupper($key).":\n"); 00251 switch($key) { 00252 case 'synopsis': 00253 $optStr = ''; 00254 foreach ($this->cli_options as $v) { 00255 $optStr.=' ['.$v[0].']'; 00256 } 00257 $this->cli_echo($this->cli_indent(str_replace('###OPTIONS###',trim($optStr),$value),4)."\n\n"); 00258 break; 00259 case 'options': 00260 $this->cli_echo($this->cli_indent($value,4)."\n"); 00261 00262 $maxLen = 0; 00263 foreach ($this->cli_options as $v) { 00264 if (strlen($v[0])>$maxLen) $maxLen=strlen($v[0]); 00265 } 00266 00267 foreach ($this->cli_options as $v) { 00268 $this->cli_echo($v[0].substr($this->cli_indent(rtrim($v[1].chr(10).$v[2]),$maxLen+4),strlen($v[0]))."\n"); 00269 } 00270 $this->cli_echo("\n"); 00271 break; 00272 default: 00273 $this->cli_echo($this->cli_indent($value,4)."\n\n"); 00274 break; 00275 } 00276 } 00277 } 00278 00286 function cli_indent($str,$indent) { 00287 $lines = explode(chr(10),wordwrap($str,75-$indent)); 00288 $indentStr = str_pad('',$indent,' '); 00289 foreach($lines as $k => $v) { 00290 $lines[$k] = $indentStr.$lines[$k]; 00291 } 00292 return implode(chr(10),$lines); 00293 } 00294 } 00295 00296 ?>