gwynne Wed Aug 8 23:26:05 2007 UTC Added files: /phd/setup PhD_Interface.class.php PhD_Options.class.php PhD_Output.class.php
Removed files: /phd/setup CLI.class.php Modified files: /phd/setup Configurator.class.php Option_Metadata.inc.php setup.messages.php setup.php Log: - Removed unnecessary functiosn from the Configurator - Updated the header comments of several formats to make more grammatical sense. - Moved the PhD_Options and PhD_Output classes into their own include files for modularity and cleanliness. - Added a compatibility_mode option to allow PhD to skip the slow translation steps for already-converted trees. - Reworded a few status messages. - Changed CLI.class.php to PhD_Interface.class.php for cleanliness and consistency. - Factored all CLI-specific code out of setup.php into PhD_Interface.class.php, facilitating future implementation of other interfaces if needed.
http://cvs.php.net/viewvc.cgi/phd/setup/Configurator.class.php?r1=1.5&r2=1.6&diff_format=u Index: phd/setup/Configurator.class.php diff -u phd/setup/Configurator.class.php:1.5 phd/setup/Configurator.class.php:1.6 --- phd/setup/Configurator.class.php:1.5 Tue Aug 7 08:09:07 2007 +++ phd/setup/Configurator.class.php Wed Aug 8 23:26:05 2007 @@ -1,6 +1,6 @@ <?php -/* $Id: Configurator.class.php,v 1.5 2007/08/07 08:09:07 gwynne Exp $ +/* $Id: Configurator.class.php,v 1.6 2007/08/08 23:26:05 gwynne Exp $ +-------------------------------------------------------------------------+ | Copyright(c) 2007 | | Authors: | @@ -52,11 +52,6 @@ } } - public function isValidOptionValue( $name, $value ) { - $vf = $GLOBALS[ 'OPTIONS_DATA' ][ $name ][ 'validity_check_function' ]; - return is_callable( $vf ) ? $vf( $value ) : FALSE; - } - public function writeConfig() { try { $file = new Template_File( dirname( __FILE__ ) . '/config.in.php', $this->config_php_path, TRUE ); http://cvs.php.net/viewvc.cgi/phd/setup/Option_Metadata.inc.php?r1=1.6&r2=1.7&diff_format=u Index: phd/setup/Option_Metadata.inc.php diff -u phd/setup/Option_Metadata.inc.php:1.6 phd/setup/Option_Metadata.inc.php:1.7 --- phd/setup/Option_Metadata.inc.php:1.6 Tue Aug 7 08:09:07 2007 +++ phd/setup/Option_Metadata.inc.php Wed Aug 8 23:26:05 2007 @@ -1,6 +1,6 @@ <?php -/* $Id: Option_Metadata.inc.php,v 1.6 2007/08/07 08:09:07 gwynne Exp $ +/* $Id: Option_Metadata.inc.php,v 1.7 2007/08/08 23:26:05 gwynne Exp $ +-------------------------------------------------------------------------+ | Copyright(c) 2007 | | Authors: | @@ -10,94 +10,11 @@ | world-wide-web at the following url: | | http://phd.php.net/LICENSE | +-------------------------------------------------------------------------+ - | Provides the common code for managing the config.php file in setup.php. | + | The metadata for PhD configuration options. | +-------------------------------------------------------------------------+ */ -class Phd_Options { - - const TYPE_ARBITRARY = 0; // Any user-entered value - const TYPE_LIST = 1; // One of a list of enumerated values - const TYPE_NUMERIC = 2; // Any integer - const TYPE_FILESIZE = 3; // A positive integer including the [KMGTP[B]] suffix - const TYPE_FLAG = 4; // Boolean flag - - public static function getType( $optName ) { - global $OPTIONS_DATA; - - if ( empty( $OPTIONS_DATA[ $optName ] ) ) { - return NULL; - } - return $OPTIONS_DATA[ $optName ][ 'type' ]; - } - - public static function getValueList( $optName ) { // TYPE_LIST options only - global $OPTIONS_DATA; - - if ( PhD_Options::getType( $optName ) != PhD_Options::TYPE_LIST ) { - return NULL; - } - return call_user_func( $OPTIONS_DATA[ $optName ][ 'value_list_func' ] ); - } - - public static function checkValidity( $optName, $value ) { - global $OPTIONS_DATA; - - if ( ( $type = PhD_Options::getType( $optName ) ) === NULL ) { - return NULL; - } - switch ( $type ) { - case PhD_Options::TYPE_ARBITRARY: - return call_user_func( $OPTIONS_DATA[ $optName ][ 'validity_func' ], $value ); - case PhD_Options::TYPE_LIST: - return in_array( $value, PhD_Options::getValueList( $optName ) ); - case PhD_Options::TYPE_NUMERIC: - if ( ctype_digit( $value ) ) { - return ( $value >= $OPTIONS_DATA[ $optName ][ 'min_value' ] && - $value <= $OPTIONS_DATA[ $optName ][ 'max_value' ] ); - } - return FALSE; - case PhD_Options::TYPE_FILESIZE: - return preg_match( '/^(\d+)(?:([KMGTP])B?)?$/iu', $value ) ? TRUE : FALSE; - case PhD_Options::TYPE_FLAG: - return in_array( substr( strtolower( $value ), 0, 1 ), array( 1, 0, 'y', 'n' ) ) || $value === TRUE || $value === FALSE; - default: - return NULL; - } - } - - public static function getFinalValue( $optName, $value ) { - global $OPTIONS_DATA; - - if ( ( $type = PhD_Options::getType( $optName ) ) === NULL ) { - return NULL; - } - switch ( $type ) { - case PhD_Options::TYPE_ARBITRARY: - return isset( $OPTIONS_DATA[ $optName ][ 'final_value_func' ] ) ? - call_user_func( $OPTIONS_DATA[ $optName ][ 'final_value_func' ], $value ) : $value; - case PhD_Options::TYPE_LIST: - case PhD_Options::TYPE_NUMERIC: - return $value; - case PhD_Options::TYPE_FILESIZE: - preg_match( '/^(\d+)(?:([KMGTP])B?)?$/iu', $value, $matches ); - $multipliers = array( - '' => 1, - 'K' => 1024, - 'M' => 1048576, - 'G' => 1073741824, - 'T' => 1099511627776, - 'P' => 1125899906842620 - ); - return ( intval( $matches[ 1 ] ) * $multipliers[ strval( $matches[ 2 ] ) ] ); - case PhD_Options::TYPE_FLAG: - return is_bool( $value ) ? $value : ( substr( strtolower( $value ), 0, 1 ) == 'y' ? TRUE : FALSE ); - default: - return NULL; - } - } - -} +require_once 'PhD_Options.class.php'; function OPTIONS_META_scan_script_dir( $name ) { static $lists = NULL; @@ -305,11 +222,10 @@ 'type' => PhD_Options::TYPE_FLAG, 'default_value' => FALSE, 'description' => <<<~MESSAGE -PhD is capable of using either traditional <!-- Revision: --> and -<!-- EN-Revision: --> tags or the <phd:revision/> tag to specify version -control information for files and their translated counterparts. If the -revision control flag is set, PhD will enforce revision matching between -translated files and English files. +PhD is capable of using the <phd:revision/> tag to specify version control +information for files and their translated counterparts. If the revision +control flag is set, PhD will enforce revision matching between translated +files and English files. MESSAGE , 'details' => <<<~MESSAGE @@ -324,6 +240,37 @@ 'invalid_message' => 'Please enter "(Y)es" or "(N)o".' ), + 'compatibility_mode' => array( + 'display_name' => 'Compatibility mode', + 'type' => PhD_Options::TYPE_FLAG, + 'default_value' => TRUE, + 'description' => <<<~MESSAGE +Turning on this flag causes PhD to modify its processing in several ways to +make it compatible with documentation that was written for a legacy form of +DocBook publishing, specifically XSL or DSSSL. +MESSAGE + , + 'details' => <<<~MESSAGE +The specific differences are: + - XML files without IDs are not rejected; an ID is autogenerated based on + its path relative to the XML root. + - XML files containing more than one root element are not rejected; the + extra elements are treated as separate sections. + - When revision control is on, <!-- Revision: --> and <!-- EN-Revision: --> + tags are automatically replaced with an equivelant <phd:revision/> tag. + - <!-- [name]: [value] --> tags are automatically replaced with equivelant + <phd:meta/> tags. + - Entity references and entity delcarations are replaced with equivelant + <phd:define/>, <phd:constant/> and <phd:include/> tags. +WARNING: This extra processing entails an extra phase during the build, which +will slow it down considerably. Please consider converting old documents to use +PhD elements using convert.php. +MESSAGE + , + 'prompt' => 'Type "(Y)es" to enable compatibility mode, or "(N)o" to disable it', + 'invalid_message' => 'Please enter "(Y)es" or "(N)o".' + ), + 'build_log_file' => array( 'display_name' => 'Build Log', 'type' => PhD_Options::TYPE_ARBITRARY, http://cvs.php.net/viewvc.cgi/phd/setup/setup.messages.php?r1=1.6&r2=1.7&diff_format=u Index: phd/setup/setup.messages.php diff -u phd/setup/setup.messages.php:1.6 phd/setup/setup.messages.php:1.7 --- phd/setup/setup.messages.php:1.6 Tue Aug 7 08:09:07 2007 +++ phd/setup/setup.messages.php Wed Aug 8 23:26:05 2007 @@ -1,6 +1,6 @@ <?php -/* $Id: setup.messages.php,v 1.6 2007/08/07 08:09:07 gwynne Exp $ +/* $Id: setup.messages.php,v 1.7 2007/08/08 23:26:05 gwynne Exp $ +-------------------------------------------------------------------------+ | Copyright(c) 2007 | | Authors: | @@ -10,27 +10,12 @@ | world-wide-web at the following url: | | http://phd.php.net/LICENSE | +-------------------------------------------------------------------------+ - | Provides the text for error, warning, and status messages in setup.php. | + | The text for error, warning, and status messages in setup.php. | +-------------------------------------------------------------------------+ */ -class PhD_Output { - - protected static $argList = NULL; - protected static function paramStringCallback( $v ) { - $v = next( self::$argList ); - return ( is_bool( $v ) ? ( $v ? "Yes" : "No" ) : $v ); - } - public static function paramString( $whichClass, $constName /*, ... */ ) { - self::$argList = func_get_args(); next( self::$argList ); - $str = constant( "PhD_{$whichClass}s::{$constName}" ); - return count( self::$argList ) > 2 ? - preg_replace_callback( '/%%%/', array( __CLASS__, 'paramStringCallback' ), $str ) : - $str; - } +require_once 'PhD_Output.class.php'; -} - class PhD_Messages { const USAGE = <<<~MESSAGE @@ -63,8 +48,7 @@ const NUMBYTES_VALUES = <<<~MESSAGE This is a value given in number of bytes. For convenience you may use any of -the following suffixes to multiply the number by the shown factor. By the way, -if you actually use the P suffix, I pity you. +the following suffixes to multiply the number by the shown factor. K = 1024, M = K*1024, G = M*1024, T = G*1024, P = T*1024 MESSAGE; @@ -78,8 +62,7 @@ MESSAGE; const CONFIG_SAVED = <<<~MESSAGE -The settings were successfully saved to config.php. You may now start using -PhD. +Your settings were successfully saved to config.php. PhD is now ready for use. MESSAGE; } http://cvs.php.net/viewvc.cgi/phd/setup/setup.php?r1=1.5&r2=1.6&diff_format=u Index: phd/setup/setup.php diff -u phd/setup/setup.php:1.5 phd/setup/setup.php:1.6 --- phd/setup/setup.php:1.5 Tue Aug 7 08:09:07 2007 +++ phd/setup/setup.php Wed Aug 8 23:26:05 2007 @@ -1,6 +1,6 @@ <?php -/* $Id: setup.php,v 1.5 2007/08/07 08:09:07 gwynne Exp $ +/* $Id: setup.php,v 1.6 2007/08/08 23:26:05 gwynne Exp $ +-------------------------------------------------------------------------+ | Copyright(c) 2007 | | Authors: | @@ -10,42 +10,29 @@ | world-wide-web at the following url: | | http://phd.php.net/LICENSE | +-------------------------------------------------------------------------+ - | Provides a simple CLI interface for configuration of the per-site PhD | - | system options. Chosen options are saved in config.php, an | - | automagically generated file. An existing config.php is presumed to | - | offer defaults for setup. No user authentication is done by this | - | script; do not make it accessible to non-administrators. | + | A simple interface to configuration of the per-site PhD system options. | + | Chosen options are saved in config.php, an automatically generated | + | file. An existing config.php is presumed to offer defaults for setup. | + | No user authentication is done by this script; do not make it | + | accessible to non-administrators. | +-------------------------------------------------------------------------+ */ -$SETUP_REVISION = '$Id: setup.php,v 1.5 2007/08/07 08:09:07 gwynne Exp $'; +$SETUP_REVISION = '$Id: setup.php,v 1.6 2007/08/08 23:26:05 gwynne Exp $'; /*---------------------------------------------------------------------------*/ require_once 'setup.messages.php'; require_once 'Option_Metadata.inc.php'; require_once 'Configurator.class.php'; -require_once 'CLI.class.php'; +require_once 'PhD_Interface.class.php'; /*---------------------------------------------------------------------------*/ -function PhD_Error( $message ) { - print "ERROR: " . PhD_Output::paramString( 'Error', $message ) . "\n"; - exit( 1 ); -} - -function PhD_Warning( $message ) { - print "WARNING: " . PhD_Output::paramString( 'Warning', $message ) ."\n"; -} - -/*---------------------------------------------------------------------------*/ -$userInterface = NULL; +$interface = NULL; $configurator = NULL; /*---------------------------------------------------------------------------*/ -if ( php_sapi_name() != 'cli' ) { - PhD_Error( 'ONLY_CLI_SUPPORTED' ); -} $configurator = new PhD_Configurator; -$userInterface = new PhD_CLI_Interface; +$interface = new PhD_Interface; /*---------------------------------------------------------------------------*/ // Fill in defaults. @@ -60,10 +47,10 @@ /*---------------------------------------------------------------------------*/ // Run the interface. TRUE if user chose values, FALSE if user wanted to break out -if ( $userInterface->run() === TRUE ) { +if ( $interface->run() === TRUE ) { // We have a set of values. We trust the interface to have checked the validity. $configurator->writeConfig(); - $userInterface->reportSuccess(); + $interface->reportSuccess(); } else { PhD_Warning( 'UNSAVED_CHANGES' ); } http://cvs.php.net/viewvc.cgi/phd/setup/PhD_Interface.class.php?view=markup&rev=1.1 Index: phd/setup/PhD_Interface.class.php +++ phd/setup/PhD_Interface.class.php <?php /* $Id: PhD_Interface.class.php,v 1.1 2007/08/08 23:26:05 gwynne Exp $ +-------------------------------------------------------------------------+ | Copyright(c) 2007 | | Authors: | | Gwynne Raskind <[EMAIL PROTECTED]> | | This source file is subject to the license that is bundled with this | | package in the file LICENSE, and is available through the | | world-wide-web at the following url: | | http://phd.php.net/LICENSE | +-------------------------------------------------------------------------+ | The interface for setup.php to talk to the user. Another version of | | this code could potentially implement a Web-based configuration. | +-------------------------------------------------------------------------+ */ function PhD_Error( $message ) { print "ERROR: " . PhD_Output::paramString( 'Error', $message ) . "\n"; exit( 1 ); } function PhD_Warning( $message ) { print "WARNING: " . PhD_Output::paramString( 'Warning', $message ) ."\n"; } class PhD_Interface { protected $quietMode = 0; public function __construct() { if ( php_sapi_name() != 'cli' ) { PhD_Error( 'ONLY_CLI_SUPPORTED' ); } // If we someday have a version of PHP with the nice long getopt() on all systems patch... if ( in_array( '-h', $_SERVER[ 'argv' ] ) || in_array( '--help', $_SERVER[ 'argv' ] ) ) { print PhD_Output::paramString( 'Message', 'USAGE', $_SERVER[ 'argv' ][ 0 ] ); exit( 1 ); } if ( in_array( '-q', $_SERVER[ 'argv' ] ) || in_array( '--quiet', $_SERVER[ 'argv' ] ) ) { $this->quietMode = 1; } else if ( in_array( '-s', $_SERVER[ 'argv' ] ) || in_array( '--silent', $_SERVER[ 'argv' ] ) ) { $this->quietMode = 2; } else if ( in_array( '-v', $_SERVER[ 'argv' ] ) || in_array( '--verbose', $_SERVER[ 'argv' ] ) ) { $this->quietMode = 0; } } public function __destruct() { } public function run() { global $configurator, $OPTIONS, $OPTIONS_DATA; $now = date( DATE_RFC2822 ); print PhD_Output::paramString( 'Message', 'CONFIG_BEGIN', $now ) . "\n\n"; do { $this->displaySettings( 'CURRENT_SETTINGS' ); print PhD_Output::paramString( 'Prompt', 'INSTRUCTIONS' ) . "\n\n"; foreach ( $OPTIONS_DATA as $optionName => $optionData ) { printf( "%-40s\n", "{$optionData[ 'display_name' ]}:" ); if ( $this->quietMode < 2 ) { print "{$optionData[ 'description' ]}\n"; } if ( $this->quietMode < 1 ) { print "{$optionData[ 'details' ]}\n"; } switch ( PhD_Options::getType( $optionName ) ) { case PhD_Options::TYPE_ARBITRARY: print PhD_Output::paramString( 'Message', 'NO_VALUES' ); break; case PhD_Options::TYPE_LIST: print PhD_Output::paramString( 'Message', 'AVAILABLE_VALUES', wordwrap( "\t" . implode( ' ', PhD_Options::getValueList( $optionName ) ), 71, "\n\t", FALSE ) ); break; case PhD_Options::TYPE_NUMERIC: print PhD_Output::paramString( 'Message', 'NUMERIC_VALUE', $optionData[ 'min_value' ], $optionData[ 'max_value' ] ); break; case PhD_Options::TYPE_FILESIZE: print PhD_Output::paramString( 'Message', 'NUMBYTES_VALUES' ); break; case PhD_Options::TYPE_FLAG: print PhD_Output::paramString( 'Message', 'BOOLEAN_VALUES' ); break; default: PhD_Error( 'INTERNAL_ERROR' ); } print "\n\n"; do { $response = $this->getLine( PhD_Output::paramString( 'Prompt', 'OPTION_PROMPT', $optionData[ 'prompt' ], $configurator->$optionName ) ); if ( $response === '' ) { $response = $configurator->$optionName; } if ( PhD_Options::checkValidity( $optionName, $response ) === TRUE ) { break; } print "{$optionData[ 'invalid_message' ]}\n"; } while ( TRUE ); $configurator->$optionName = PhD_Options::getFinalValue( $optionName, $response ); print "\n"; } $this->displaySettings( 'CHOSEN_SETTINGS' ); do { $response = $this->getLine( PhD_Output::paramString( 'Prompt', 'CONFIG_COMPLETE' ) ); switch ( strval( $response ) ) { case 'yes': return TRUE; case 'restart': continue 3; case 'quit': return FALSE; default: print PhD_Output::paramString( 'Prompt', 'INVALID_CONFIG_COMPLETE' ); continue 2; } } while ( TRUE ); } while ( TRUE ); } public function reportSuccess() { print "\n" . PhD_Output::paramString( 'Message', 'CONFIG_SAVED' ) . "\n\n"; } protected function getLine( $prompt = NULL ) { if ( !is_null( $prompt ) ) { print $prompt; } if ( ( $result = fgets( STDIN ) ) === FALSE ) { PhD_Error( 'INPUT_EOF' ); } return trim( $result ); } protected function displaySettings( $headerConst ) { global $configurator, $OPTIONS_DATA; print PhD_Output::paramString( 'Message', $headerConst ) . "\n"; foreach ( $OPTIONS_DATA as $name => $data ) { printf( "\t%-25s: %s\n", $name, is_bool( $configurator->$name ) ? ( $configurator->$name ? "On" : "Off" ) : $configurator->$name ); } print "\n"; } } /* * vim600: sw=4 ts=4 fdm=syntax syntax=php et * vim<600: sw=4 ts=4 */ ?> http://cvs.php.net/viewvc.cgi/phd/setup/PhD_Options.class.php?view=markup&rev=1.1 Index: phd/setup/PhD_Options.class.php +++ phd/setup/PhD_Options.class.php <?php /* $Id: PhD_Options.class.php,v 1.1 2007/08/08 23:26:05 gwynne Exp $ +-------------------------------------------------------------------------+ | Copyright(c) 2007 | | Authors: | | Gwynne Raskind <[EMAIL PROTECTED]> | | This source file is subject to the license that is bundled with this | | package in the file LICENSE, and is available through the | | world-wide-web at the following url: | | http://phd.php.net/LICENSE | +-------------------------------------------------------------------------+ | A facility for easily managing option metadata. | +-------------------------------------------------------------------------+ */ class Phd_Options { const TYPE_ARBITRARY = 0; // Any user-entered value const TYPE_LIST = 1; // One of a list of enumerated values const TYPE_NUMERIC = 2; // Any integer const TYPE_FILESIZE = 3; // A positive integer including the [KMGTP[B]] suffix const TYPE_FLAG = 4; // Boolean flag public static function getType( $optName ) { global $OPTIONS_DATA; if ( empty( $OPTIONS_DATA[ $optName ] ) ) { return NULL; } return $OPTIONS_DATA[ $optName ][ 'type' ]; } public static function getValueList( $optName ) { // TYPE_LIST options only global $OPTIONS_DATA; if ( PhD_Options::getType( $optName ) != PhD_Options::TYPE_LIST ) { return NULL; } return call_user_func( $OPTIONS_DATA[ $optName ][ 'value_list_func' ] ); } public static function checkValidity( $optName, $value ) { global $OPTIONS_DATA; if ( ( $type = PhD_Options::getType( $optName ) ) === NULL ) { return NULL; } switch ( $type ) { case PhD_Options::TYPE_ARBITRARY: return call_user_func( $OPTIONS_DATA[ $optName ][ 'validity_func' ], $value ); case PhD_Options::TYPE_LIST: return in_array( $value, PhD_Options::getValueList( $optName ) ); case PhD_Options::TYPE_NUMERIC: if ( ctype_digit( $value ) ) { return ( $value >= $OPTIONS_DATA[ $optName ][ 'min_value' ] && $value <= $OPTIONS_DATA[ $optName ][ 'max_value' ] ); } return FALSE; case PhD_Options::TYPE_FILESIZE: return preg_match( '/^(\d+)(?:([KMGTP])B?)?$/iu', $value ) ? TRUE : FALSE; case PhD_Options::TYPE_FLAG: return in_array( substr( strtolower( $value ), 0, 1 ), array( 1, 0, 'y', 'n' ) ) || $value === TRUE || $value === FALSE; default: return NULL; } } public static function getFinalValue( $optName, $value ) { global $OPTIONS_DATA; if ( ( $type = PhD_Options::getType( $optName ) ) === NULL ) { return NULL; } switch ( $type ) { case PhD_Options::TYPE_ARBITRARY: return isset( $OPTIONS_DATA[ $optName ][ 'final_value_func' ] ) ? call_user_func( $OPTIONS_DATA[ $optName ][ 'final_value_func' ], $value ) : $value; case PhD_Options::TYPE_LIST: case PhD_Options::TYPE_NUMERIC: return $value; case PhD_Options::TYPE_FILESIZE: preg_match( '/^(\d+)(?:([KMGTP])B?)?$/iu', $value, $matches ); $multipliers = array( '' => 1, 'K' => 1024, 'M' => 1048576, 'G' => 1073741824, 'T' => 1099511627776, 'P' => 1125899906842620 ); return ( intval( $matches[ 1 ] ) * $multipliers[ strval( $matches[ 2 ] ) ] ); case PhD_Options::TYPE_FLAG: return is_bool( $value ) ? $value : ( substr( strtolower( $value ), 0, 1 ) == 'y' ? TRUE : FALSE ); default: return NULL; } } } /* * vim600: sw=4 ts=4 fdm=syntax syntax=php et * vim<600: sw=4 ts=4 */ ?> http://cvs.php.net/viewvc.cgi/phd/setup/PhD_Output.class.php?view=markup&rev=1.1 Index: phd/setup/PhD_Output.class.php +++ phd/setup/PhD_Output.class.php <?php /* $Id: PhD_Output.class.php,v 1.1 2007/08/08 23:26:05 gwynne Exp $ +-------------------------------------------------------------------------+ | Copyright(c) 2007 | | Authors: | | Gwynne Raskind <[EMAIL PROTECTED]> | | This source file is subject to the license that is bundled with this | | package in the file LICENSE, and is available through the | | world-wide-web at the following url: | | http://phd.php.net/LICENSE | +-------------------------------------------------------------------------+ | The class for formatting PhD setup messages (use this more globally?). | +-------------------------------------------------------------------------+ */ class PhD_Output { protected static $argList = NULL; protected static function paramStringCallback( $v ) { $v = next( self::$argList ); return ( is_bool( $v ) ? ( $v ? "Yes" : "No" ) : $v ); } public static function paramString( $whichClass, $constName /*, ... */ ) { self::$argList = func_get_args(); next( self::$argList ); $str = constant( "PhD_{$whichClass}s::{$constName}" ); return count( self::$argList ) > 2 ? preg_replace_callback( '/%%%/', array( __CLASS__, 'paramStringCallback' ), $str ) : $str; } } /* * vim600: sw=4 ts=4 fdm=syntax syntax=php et * vim<600: sw=4 ts=4 */ ?>