You've already forked joomla_test
first commit
This commit is contained in:
230
libraries/joomla/registry/format/ini.php
Normal file
230
libraries/joomla/registry/format/ini.php
Normal file
@ -0,0 +1,230 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Platform
|
||||
* @subpackage Registry
|
||||
*
|
||||
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
|
||||
* @license GNU General Public License version 2 or later; see LICENSE
|
||||
*/
|
||||
|
||||
defined('JPATH_PLATFORM') or die;
|
||||
|
||||
/**
|
||||
* INI format handler for JRegistry.
|
||||
*
|
||||
* @package Joomla.Platform
|
||||
* @subpackage Registry
|
||||
* @since 11.1
|
||||
*/
|
||||
class JRegistryFormatINI extends JRegistryFormat
|
||||
{
|
||||
protected static $cache = array();
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @param object $object Data source object.
|
||||
* @param array $options Options used by the formatter.
|
||||
*
|
||||
* @return string INI formatted string.
|
||||
*
|
||||
* @since 11.1
|
||||
*/
|
||||
public function objectToString($object, $options = array())
|
||||
{
|
||||
$local = array();
|
||||
$global = array();
|
||||
|
||||
// Iterate over the object to set the properties.
|
||||
foreach (get_object_vars($object) as $key => $value)
|
||||
{
|
||||
// If the value is an object then we need to put it in a local section.
|
||||
if (is_object($value))
|
||||
{
|
||||
// Add the section line.
|
||||
$local[] = '';
|
||||
$local[] = '[' . $key . ']';
|
||||
|
||||
// Add the properties for this section.
|
||||
foreach (get_object_vars($value) as $k => $v)
|
||||
{
|
||||
$local[] = $k . '=' . $this->getValueAsINI($v);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not in a section so add the property to the global array.
|
||||
$global[] = $key . '=' . $this->getValueAsINI($value);
|
||||
}
|
||||
}
|
||||
|
||||
return implode("\n", array_merge($global, $local));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse an INI formatted string and convert it into an object.
|
||||
*
|
||||
* @param string $data INI formatted string to convert.
|
||||
* @param mixed $options An array of options used by the formatter, or a boolean setting to process sections.
|
||||
*
|
||||
* @return object Data object.
|
||||
*
|
||||
* @since 11.1
|
||||
*/
|
||||
public function stringToObject($data, array $options = array())
|
||||
{
|
||||
$sections = (isset($options['processSections'])) ? $options['processSections'] : false;
|
||||
|
||||
// Check the memory cache for already processed strings.
|
||||
$hash = md5($data . ':' . (int) $sections);
|
||||
if (isset(self::$cache[$hash]))
|
||||
{
|
||||
return self::$cache[$hash];
|
||||
}
|
||||
|
||||
// If no lines present just return the object.
|
||||
if (empty($data))
|
||||
{
|
||||
return new stdClass;
|
||||
}
|
||||
|
||||
$obj = new stdClass;
|
||||
$section = false;
|
||||
$lines = explode("\n", $data);
|
||||
|
||||
// Process the lines.
|
||||
foreach ($lines as $line)
|
||||
{
|
||||
// Trim any unnecessary whitespace.
|
||||
$line = trim($line);
|
||||
|
||||
// Ignore empty lines and comments.
|
||||
if (empty($line) || ($line{0} == ';'))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($sections)
|
||||
{
|
||||
$length = strlen($line);
|
||||
|
||||
// If we are processing sections and the line is a section add the object and continue.
|
||||
if (($line[0] == '[') && ($line[$length - 1] == ']'))
|
||||
{
|
||||
$section = substr($line, 1, $length - 2);
|
||||
$obj->$section = new stdClass;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
elseif ($line{0} == '[')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check that an equal sign exists and is not the first character of the line.
|
||||
if (!strpos($line, '='))
|
||||
{
|
||||
// Maybe throw exception?
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the key and value for the line.
|
||||
list ($key, $value) = explode('=', $line, 2);
|
||||
|
||||
// Validate the key.
|
||||
if (preg_match('/[^A-Z0-9_]/i', $key))
|
||||
{
|
||||
// Maybe throw exception?
|
||||
continue;
|
||||
}
|
||||
|
||||
// If the value is quoted then we assume it is a string.
|
||||
$length = strlen($value);
|
||||
if ($length && ($value[0] == '"') && ($value[$length - 1] == '"'))
|
||||
{
|
||||
// Strip the quotes and Convert the new line characters.
|
||||
$value = stripcslashes(substr($value, 1, ($length - 2)));
|
||||
$value = str_replace('\n', "\n", $value);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the value is not quoted, we assume it is not a string.
|
||||
|
||||
// If the value is 'false' assume boolean false.
|
||||
if ($value == 'false')
|
||||
{
|
||||
$value = false;
|
||||
}
|
||||
// If the value is 'true' assume boolean true.
|
||||
elseif ($value == 'true')
|
||||
{
|
||||
$value = true;
|
||||
}
|
||||
// If the value is numeric than it is either a float or int.
|
||||
elseif (is_numeric($value))
|
||||
{
|
||||
// If there is a period then we assume a float.
|
||||
if (strpos($value, '.') !== false)
|
||||
{
|
||||
$value = (float) $value;
|
||||
}
|
||||
else
|
||||
{
|
||||
$value = (int) $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If a section is set add the key/value to the section, otherwise top level.
|
||||
if ($section)
|
||||
{
|
||||
$obj->$section->$key = $value;
|
||||
}
|
||||
else
|
||||
{
|
||||
$obj->$key = $value;
|
||||
}
|
||||
}
|
||||
|
||||
// Cache the string to save cpu cycles -- thus the world :)
|
||||
self::$cache[$hash] = clone ($obj);
|
||||
|
||||
return $obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a value in an INI format.
|
||||
*
|
||||
* @param mixed $value The value to convert to INI format.
|
||||
*
|
||||
* @return string The value in INI format.
|
||||
*
|
||||
* @since 11.1
|
||||
*/
|
||||
protected function getValueAsINI($value)
|
||||
{
|
||||
$string = '';
|
||||
|
||||
switch (gettype($value))
|
||||
{
|
||||
case 'integer':
|
||||
case 'double':
|
||||
$string = $value;
|
||||
break;
|
||||
|
||||
case 'boolean':
|
||||
$string = $value ? 'true' : 'false';
|
||||
break;
|
||||
|
||||
case 'string':
|
||||
// Sanitize any CRLF characters..
|
||||
$string = '"' . str_replace(array("\r\n", "\n"), '\\n', $value) . '"';
|
||||
break;
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user