/libraries/joomla/registry/format/ini.php
PHP | 281 lines | 203 code | 25 blank | 53 comment | 68 complexity | e60ca38f236e67597c017c5b5b37e682 MD5 | raw file
- <?php
- /**
- * @version $Id: ini.php 14401 2010-01-26 14:10:00Z louis $
- * @package Joomla.Framework
- * @subpackage Registry
- * @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
- * @license GNU/GPL, see LICENSE.php
- * Joomla! is free software. This version may have been modified pursuant
- * to the GNU General Public License, and as distributed it includes or
- * is derivative of works licensed under the GNU General Public License or
- * other free or open source software licenses.
- * See COPYRIGHT.php for copyright notices and details.
- */
-
- // Check to ensure this file is within the rest of the framework
- defined('JPATH_BASE') or die();
-
- /**
- * INI format handler for JRegistry
- *
- * @package Joomla.Framework
- * @subpackage Registry
- * @since 1.5
- */
- class JRegistryFormatINI extends JRegistryFormat
- {
- /**
- * Converts an object into an INI formatted string
- * - Unfortunately, there is no way to have ini values nested further than two
- * levels deep. Therefore we will only go through the first two levels of
- * the object.
- *
- * @access public
- * @param object $object Data Source Object
- * @param array $param Parameters used by the formatter
- * @return string INI Formatted String
- */
- function objectToString( &$object, $params )
- {
-
- // Initialize variables
- $retval = '';
- $prepend = '';
-
- // First handle groups (or first level key/value pairs)
- foreach (get_object_vars( $object ) as $key => $level1)
- {
- if (is_object($level1))
- {
- // This field is an object, so we treat it as a section
- $retval .= "[".$key."]\n";
- foreach (get_object_vars($level1) as $key => $level2)
- {
- if (!is_object($level2) && !is_array($level2))
- {
- // Join lines
- $level2 = str_replace('|', '\|', $level2);
- $level2 = str_replace(array("\r\n", "\n"), '\\n', $level2);
- $retval .= $key."=".$level2."\n";
- }
- }
- $retval .= "\n";
- }
- elseif (is_array($level1))
- {
- foreach ($level1 as $k1 => $v1)
- {
- // Escape any pipe characters before storing
- $level1[$k1] = str_replace('|', '\|', $v1);
- $level1[$k1] = str_replace(array("\r\n", "\n"), '\\n', $v1);
- }
-
- // Implode the array to store
- $prepend .= $key."=".implode('|', $level1)."\n";
- }
- else
- {
- // Join lines
- $level1 = str_replace('|', '\|', $level1);
- $level1 = str_replace(array("\r\n", "\n"), '\\n', $level1);
- $prepend .= $key."=".$level1."\n";
- }
- }
-
- return $prepend."\n".$retval;
- }
-
- /**
- * Parse an .ini string, based on phpDocumentor phpDocumentor_parse_ini_file function
- *
- * @access public
- * @param mixed The INI string or array of lines
- * @param boolean add an associative index for each section [in brackets]
- * @return object Data Object
- */
- function &stringToObject( $data, $process_sections = false )
- {
- static $inistocache;
-
- if (!isset( $inistocache )) {
- $inistocache = array();
- }
-
- if (is_string($data))
- {
- $lines = explode("\n", $data);
- $hash = md5($data);
- }
- else
- {
- if (is_array($data)) {
- $lines = $data;
- } else {
- $lines = array ();
- }
- $hash = md5(implode("\n",$lines));
- }
-
- if(array_key_exists($hash, $inistocache)) {
- return $inistocache[$hash];
- }
-
- $obj = new stdClass();
-
- $sec_name = '';
- $unparsed = 0;
- if (!$lines) {
- return $obj;
- }
-
- foreach ($lines as $line)
- {
- // ignore comments
- if ($line && $line{0} == ';') {
- continue;
- }
-
- $line = trim($line);
-
- if ($line == '') {
- continue;
- }
-
- $lineLen = strlen($line);
- if ($line && $line{0} == '[' && $line{$lineLen-1} == ']')
- {
- $sec_name = substr($line, 1, $lineLen - 2);
- if ($process_sections) {
- $obj-> $sec_name = new stdClass();
- }
- }
- else
- {
- if ($pos = strpos($line, '='))
- {
- $property = trim(substr($line, 0, $pos));
-
- // property is assumed to be ascii
- if ($property && $property{0} == '"')
- {
- $propLen = strlen( $property );
- if ($property{$propLen-1} == '"') {
- $property = stripcslashes(substr($property, 1, $propLen - 2));
- }
- }
- // AJE: 2006-11-06 Fixes problem where you want leading spaces
- // for some parameters, eg, class suffix
- // $value = trim(substr($line, $pos +1));
- $value = substr($line, $pos +1);
-
- if (strpos($value, '|') !== false && preg_match('#(?<!\\\)\|#', $value))
- {
- $newlines = explode('\n', $value);
- $values = array();
- foreach($newlines as $newlinekey=>$newline) {
-
- // Explode the value if it is serialized as an arry of value1|value2|value3
- $parts = preg_split('/(?<!\\\)\|/', $newline);
- $array = (strcmp($parts[0], $newline) === 0) ? false : true;
- $parts = str_replace('\|', '|', $parts);
-
- foreach ($parts as $key => $value)
- {
- if ($value == 'false') {
- $value = false;
- }
- else if ($value == 'true') {
- $value = true;
- }
- else if ($value && $value{0} == '"')
- {
- $valueLen = strlen( $value );
- if ($value{$valueLen-1} == '"') {
- $value = stripcslashes(substr($value, 1, $valueLen - 2));
- }
- }
- if(!isset($values[$newlinekey])) $values[$newlinekey] = array();
- $values[$newlinekey][] = str_replace('\n', "\n", $value);
- }
-
- if (!$array) {
- $values[$newlinekey] = $values[$newlinekey][0];
- }
- }
-
- if ($process_sections)
- {
- if ($sec_name != '') {
- $obj->$sec_name->$property = $values[$newlinekey];
- } else {
- $obj->$property = $values[$newlinekey];
- }
- }
- else
- {
- $obj->$property = $values[$newlinekey];
- }
- }
- else
- {
- //unescape the \|
- $value = str_replace('\|', '|', $value);
-
- if ($value == 'false') {
- $value = false;
- }
- else if ($value == 'true') {
- $value = true;
- }
- else if ($value && $value{0} == '"')
- {
- $valueLen = strlen( $value );
- if ($value{$valueLen-1} == '"') {
- $value = stripcslashes(substr($value, 1, $valueLen - 2));
- }
- }
-
- if ($process_sections)
- {
- $value = str_replace('\n', "\n", $value);
- if ($sec_name != '') {
- $obj->$sec_name->$property = $value;
- } else {
- $obj->$property = $value;
- }
- }
- else
- {
- $obj->$property = str_replace('\n', "\n", $value);
- }
- }
- }
- else
- {
- if ($line && $line{0} == ';') {
- continue;
- }
- if ($process_sections)
- {
- $property = '__invalid'.$unparsed ++.'__';
- if ($process_sections)
- {
- if ($sec_name != '') {
- $obj->$sec_name->$property = trim($line);
- } else {
- $obj->$property = trim($line);
- }
- }
- else
- {
- $obj->$property = trim($line);
- }
- }
- }
- }
- }
-
- $inistocache[$hash] = clone($obj);
- return $obj;
- }
- }