| // +----------------------------------------------------------------------+ // // $Id$ /** * Config parser for PHP constant files * * @author Phillip Oertel * @package Config * @version 0.1 (not submitted) */ require_once 'Config/Container.php'; class Config_Container_PHPConstants extends Config_Container { /** * This class options * Not used at the moment * * @var array */ var $options = array(); /** * Constructor * * @access public * @param string $options (optional)Options to be used by renderer */ function Config_Container_PHPConstants($options = array()) { $this->options = $options; } // end constructor /** * Parses the data of the given configuration file * * @access public * @param string $datasrc path to the configuration file * @param object $obj reference to a config object * @return mixed returns a PEAR_ERROR, if error occurs or true if ok */ function &parseDatasrc($datasrc, &$obj) { $return = true; if (!file_exists($datasrc)) { return PEAR::raiseError("Datasource file does not exist.", null, PEAR_ERROR_RETURN); } $fileContent = file_get_contents($datasrc, true); if (!$fileContent) { return PEAR::raiseError("File '$datasrc' could not be read.", null, PEAR_ERROR_RETURN); } $rows = explode("\n", $fileContent); for ($i=0, $max=count($rows); $i<$max; $i++) { $line = $rows[$i]; //blanks? // sections if (preg_match("/^\/\/\s*$/", $line)) { preg_match("/^\/\/\s*(.+)$/", $rows[$i+1], $matches); $obj->container->createSection(trim($matches[1])); $i += 2; continue; } // comments if (preg_match("/^\/\/\s*(.+)$/", $line, $matches) || preg_match("/^#\s*(.+)$/", $line, $matches)) { $obj->container->createComment(trim($matches[1])); continue; } // directives $regex = "/^\s*define\s*\('([A-Z1-9_]+)',\s*'*(.[^\']*)'*\)/"; preg_match($regex, $line, $matches); if (!empty($matches)) { $obj->container->createDirective(trim($matches[1]), trim($matches[2])); } } return $return; } // end func parseDatasrc /** * Returns a formatted string of the object * @param object $obj Container object to be output as string * @access public * @return string */ function toString(&$obj) { $string = ''; switch ($obj->type) { case 'blank': $string = "\n"; break; case 'comment': $string = '// '.$obj->content."\n"; break; case 'directive': $content = $obj->content; // don't quote numeric values, true/false and constants if (!is_numeric($content) && !in_array($content, array('false', 'true')) && !preg_match('/^[A-Z_]+$/', $content)) { $content = "'".$content."'"; } $string = 'define(\''.$obj->name.'\', '.$content.');'.chr(10); break; case 'section': if (!$obj->isRoot()) { $string = chr(10); $string .= '//'.chr(10); $string .= '// '.$obj->name.chr(10); $string .= '//'.chr(10); } if (count($obj->children) > 0) { for ($i = 0, $max = count($obj->children); $i < $max; $i++) { $string .= $this->toString($obj->getChild($i)); } } break; default: $string = ''; } return $string; } // end func toString /** * Writes the configuration to a file * * @param mixed datasrc info on datasource such as path to the file * @param string configType (optional)type of configuration * @access public * @return string */ function writeDatasrc($datasrc, &$obj) { $fp = @fopen($datasrc, 'w'); if ($fp) { $string = "toString($obj); $string .= "\n?>"; //