diff -r 5a6b6e770365 -r 68c69c656a2c web/lib/Zend/Locale/Format.php --- a/web/lib/Zend/Locale/Format.php Thu May 07 15:10:09 2015 +0200 +++ b/web/lib/Zend/Locale/Format.php Thu May 07 15:16:02 2015 +0200 @@ -15,8 +15,8 @@ * @category Zend * @package Zend_Locale * @subpackage Format - * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Format.php 24807 2012-05-15 12:10:42Z adamlundrigan $ + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @version $Id$ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -29,7 +29,7 @@ * @category Zend * @package Zend_Locale * @subpackage Format - * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Locale_Format @@ -42,7 +42,7 @@ 'fix_date' => false, 'locale' => null, 'cache' => null, - 'disableCache' => false, + 'disableCache' => null, 'precision' => null); /** @@ -59,7 +59,7 @@ * @param array $options Array of options, keyed by option name: format_type = 'iso' | 'php', fix_date = true | false, * locale = Zend_Locale | locale string, precision = whole number between -1 and 30 * @throws Zend_Locale_Exception - * @return Options array if no option was given + * @return array if no option was given */ public static function setOptions(array $options = array()) { @@ -74,7 +74,7 @@ * @param array $options Array of options, keyed by option name: format_type = 'iso' | 'php', fix_date = true | false, * locale = Zend_Locale | locale string, precision = whole number between -1 and 30 * @throws Zend_Locale_Exception - * @return Options array if no option was given + * @return array if no option was given */ private static function _checkOptions(array $options = array()) { @@ -152,7 +152,9 @@ break; case 'disablecache' : - Zend_Locale_Data::disableCache($value); + if (null !== $value) { + Zend_Locale_Data::disableCache($value); + } break; case 'precision' : @@ -256,10 +258,8 @@ // Get correct signs for this locale $symbols = Zend_Locale_Data::getList($options['locale'],'symbols'); // Change locale input to be default number - if ((strpos($input, $symbols['minus']) !== false) || - (strpos($input, '-') !== false)) { - $input = strtr($input, array($symbols['minus'] => '', '-' => '')); - $input = '-' . $input; + if (($input[0] == $symbols['minus']) && ('-' != $input[0])) { + $input = '-' . substr($input, 1); } $input = str_replace($symbols['group'],'', $input); @@ -292,7 +292,7 @@ * ##0.00 -> 12345.12345 -> 12345.12 * ##,##0.00 -> 12345.12345 -> 12,345.12 * - * @param string $input Localized number string + * @param string $value Localized number string * @param array $options Options: number_format, locale, precision. See {@link setOptions()} for details. * @return string locale formatted number * @throws Zend_Locale_Exception @@ -309,9 +309,9 @@ // Get correct signs for this locale $symbols = Zend_Locale_Data::getList($options['locale'], 'symbols'); - $oenc = iconv_get_encoding('internal_encoding'); - iconv_set_encoding('internal_encoding', 'UTF-8'); - + $oenc = self::_getEncoding(); + self::_setEncoding('UTF-8'); + // Get format $format = $options['number_format']; if ($format === null) { @@ -345,7 +345,7 @@ } if (iconv_strpos($format, '0') === false) { - iconv_set_encoding('internal_encoding', $oenc); + self::_setEncoding($oenc); require_once 'Zend/Locale/Exception.php'; throw new Zend_Locale_Exception('Wrong format... missing 0'); } @@ -471,10 +471,16 @@ } } - iconv_set_encoding('internal_encoding', $oenc); + self::_setEncoding($oenc); return (string) $format; } + /** + * @param string $format + * @param string $value + * @param int $precision + * @return string + */ private static function _seperateFormat($format, $value, $precision) { if (iconv_strpos($format, ';') !== false) { @@ -531,7 +537,9 @@ * Internal method to convert cldr number syntax into regex * * @param string $type + * @param array $options Options: locale. See {@link setOptions()} for details. * @return string + * @throws Zend_Locale_Exception */ private static function _getRegexForType($type, $options) { @@ -631,7 +639,7 @@ /** * Alias for getNumber * - * @param string $value Number to localize + * @param string $input Number to localize * @param array $options Options: locale, precision. See {@link setOptions()} for details. * @return float */ @@ -658,9 +666,9 @@ * Returns if a float was found * Alias for isNumber() * - * @param string $input Localized number string - * @param array $options Options: locale. See {@link setOptions()} for details. - * @return boolean Returns true if a number was found + * @param string $value Localized number string + * @param array $options Options: locale. See {@link setOptions()} for details. + * @return boolean Returns true if a number was found */ public static function isFloat($value, array $options = array()) { @@ -706,9 +714,9 @@ /** * Returns if a integer was found * - * @param string $input Localized number string - * @param array $options Options: locale. See {@link setOptions()} for details. - * @return boolean Returns true if a integer was found + * @param string $value Localized number string + * @param array $options Options: locale. See {@link setOptions()} for details. + * @return boolean Returns true if a integer was found */ public static function isInteger($value, array $options = array()) { @@ -741,29 +749,63 @@ return null; } - $convert = array('d' => 'dd' , 'D' => 'EE' , 'j' => 'd' , 'l' => 'EEEE', 'N' => 'eee' , 'S' => 'SS' , - 'w' => 'e' , 'z' => 'D' , 'W' => 'ww' , 'F' => 'MMMM', 'm' => 'MM' , 'M' => 'MMM' , - 'n' => 'M' , 't' => 'ddd' , 'L' => 'l' , 'o' => 'YYYY', 'Y' => 'yyyy', 'y' => 'yy' , - 'a' => 'a' , 'A' => 'a' , 'B' => 'B' , 'g' => 'h' , 'G' => 'H' , 'h' => 'hh' , - 'H' => 'HH' , 'i' => 'mm' , 's' => 'ss' , 'e' => 'zzzz', 'I' => 'I' , 'O' => 'Z' , - 'P' => 'ZZZZ', 'T' => 'z' , 'Z' => 'X' , 'c' => 'yyyy-MM-ddTHH:mm:ssZZZZ', - 'r' => 'r' , 'U' => 'U'); - $values = str_split($format); - foreach ($values as $key => $value) { - if (isset($convert[$value]) === true) { - $values[$key] = $convert[$value]; + $convert = array( + 'd' => 'dd' , 'D' => 'EE' , 'j' => 'd' , 'l' => 'EEEE', + 'N' => 'eee' , 'S' => 'SS' , 'w' => 'e' , 'z' => 'D' , + 'W' => 'ww' , 'F' => 'MMMM', 'm' => 'MM' , 'M' => 'MMM' , + 'n' => 'M' , 't' => 'ddd' , 'L' => 'l' , 'o' => 'YYYY', + 'Y' => 'yyyy', 'y' => 'yy' , 'a' => 'a' , 'A' => 'a' , + 'B' => 'B' , 'g' => 'h' , 'G' => 'H' , 'h' => 'hh' , + 'H' => 'HH' , 'i' => 'mm' , 's' => 'ss' , 'e' => 'zzzz', + 'I' => 'I' , 'O' => 'Z' , 'P' => 'ZZZZ', 'T' => 'z' , + 'Z' => 'X' , 'c' => 'yyyy-MM-ddTHH:mm:ssZZZZ', 'r' => 'r', + 'U' => 'U', + ); + $escaped = false; + $inEscapedString = false; + $converted = array(); + foreach (str_split($format) as $char) { + if (!$escaped && $char == '\\') { + // Next char will be escaped: let's remember it + $escaped = true; + } elseif ($escaped) { + if (!$inEscapedString) { + // First escaped string: start the quoted chunk + $converted[] = "'"; + $inEscapedString = true; + } + // Since the previous char was a \ and we are in the quoted + // chunk, let's simply add $char as it is + $converted[] = $char; + $escaped = false; + } elseif ($char == "'") { + // Single quotes need to be escaped like this + $converted[] = "''"; + } else { + if ($inEscapedString) { + // Close the single-quoted chunk + $converted[] = "'"; + $inEscapedString = false; + } + // Convert the unescaped char if needed + if (isset($convert[$char])) { + $converted[] = $convert[$char]; + } else { + $converted[] = $char; + } } } - return join($values); + return implode($converted); } /** * Parse date and split in named array fields * - * @param string $date Date string to parse - * @param array $options Options: format_type, fix_date, locale, date_format. See {@link setOptions()} for details. - * @return array Possible array members: day, month, year, hour, minute, second, fixed, format + * @param string $date Date string to parse + * @param array $options Options: format_type, fix_date, locale, date_format. See {@link setOptions()} for details. + * @return array Possible array members: day, month, year, hour, minute, second, fixed, format + * @throws Zend_Locale_Exception */ private static function _parseDate($date, $options) { @@ -780,8 +822,8 @@ $result['date_format'] = $format; // save the format used to normalize $number (convenience) $result['locale'] = $options['locale']; // save the locale used to normalize $number (convenience) - $oenc = iconv_get_encoding('internal_encoding'); - iconv_set_encoding('internal_encoding', 'UTF-8'); + $oenc = self::_getEncoding(); + self::_setEncoding('UTF-8'); $day = iconv_strpos($format, 'd'); $month = iconv_strpos($format, 'M'); $year = iconv_strpos($format, 'y'); @@ -846,7 +888,7 @@ } if (empty($parse)) { - iconv_set_encoding('internal_encoding', $oenc); + self::_setEncoding($oenc); require_once 'Zend/Locale/Exception.php'; throw new Zend_Locale_Exception("Unknown date format, neither date nor time in '" . $format . "' found"); } @@ -866,7 +908,7 @@ preg_match_all('/\d+/u', $number, $splitted); if (count($splitted[0]) == 0) { - iconv_set_encoding('internal_encoding', $oenc); + self::_setEncoding($oenc); require_once 'Zend/Locale/Exception.php'; throw new Zend_Locale_Exception("No date part in '$date' found."); } @@ -972,7 +1014,7 @@ if (($position !== false) and ((iconv_strpos($date, $result['day']) === false) or (isset($result['year']) and (iconv_strpos($date, $result['year']) === false)))) { if ($options['fix_date'] !== true) { - iconv_set_encoding('internal_encoding', $oenc); + self::_setEncoding($oenc); require_once 'Zend/Locale/Exception.php'; throw new Zend_Locale_Exception("Unable to parse date '$date' using '" . $format . "' (false month, $position, $month)"); @@ -988,7 +1030,7 @@ if (isset($result['day']) and isset($result['year'])) { if ($result['day'] > 31) { if ($options['fix_date'] !== true) { - iconv_set_encoding('internal_encoding', $oenc); + self::_setEncoding($oenc); require_once 'Zend/Locale/Exception.php'; throw new Zend_Locale_Exception("Unable to parse date '$date' using '" . $format . "' (d <> y)"); @@ -1004,7 +1046,7 @@ if (isset($result['month']) and isset($result['year'])) { if ($result['month'] > 31) { if ($options['fix_date'] !== true) { - iconv_set_encoding('internal_encoding', $oenc); + self::_setEncoding($oenc); require_once 'Zend/Locale/Exception.php'; throw new Zend_Locale_Exception("Unable to parse date '$date' using '" . $format . "' (M <> y)"); @@ -1020,7 +1062,7 @@ if (isset($result['month']) and isset($result['day'])) { if ($result['month'] > 12) { if ($options['fix_date'] !== true || $result['month'] > 31) { - iconv_set_encoding('internal_encoding', $oenc); + self::_setEncoding($oenc); require_once 'Zend/Locale/Exception.php'; throw new Zend_Locale_Exception("Unable to parse date '$date' using '" . $format . "' (M <> d)"); @@ -1047,7 +1089,7 @@ } } - iconv_set_encoding('internal_encoding', $oenc); + self::_setEncoding($oenc); return $result; } @@ -1181,8 +1223,9 @@ /** * Returns the default time format for $locale. * - * @param string|Zend_Locale $locale OPTIONAL Locale of $number, possibly in string form (e.g. 'de_AT') + * @param string|Zend_Locale $locale OPTIONAL Locale of $number, possibly in string form (e.g. 'de_AT') * @return string format + * @throws Zend_Locale_Exception */ public static function getTimeFormat($locale = null) { @@ -1196,7 +1239,7 @@ /** * Returns an array with 'hour', 'minute', and 'second' elements extracted from $time - * according to the order described in $format. For a format of 'H:m:s', and + * according to the order described in $format. For a format of 'H:i:s', and * an input of 11:20:55, getTime() would return: * array ('hour' => 11, 'minute' => 20, 'second' => 55) * The optional $locale parameter may be used to help extract times from strings @@ -1219,8 +1262,9 @@ /** * Returns the default datetime format for $locale. * - * @param string|Zend_Locale $locale OPTIONAL Locale of $number, possibly in string form (e.g. 'de_AT') + * @param string|Zend_Locale $locale OPTIONAL Locale of $number, possibly in string form (e.g. 'de_AT') * @return string format + * @throws Zend_Locale_Exception */ public static function getDateTimeFormat($locale = null) { @@ -1234,7 +1278,7 @@ /** * Returns an array with 'year', 'month', 'day', 'hour', 'minute', and 'second' elements - * extracted from $datetime according to the order described in $format. For a format of 'd.M.y H:m:s', + * extracted from $datetime according to the order described in $format. For a format of 'd.M.y H:i:s', * and an input of 10.05.1985 11:20:55, getDateTime() would return: * array ('year' => 1985, 'month' => 5, 'day' => 10, 'hour' => 11, 'minute' => 20, 'second' => 55) * The optional $locale parameter may be used to help extract times from strings @@ -1264,4 +1308,35 @@ { return (@preg_match('/\pL/u', 'a')) ? true : false; } + + /** + * Internal method to retrieve the current encoding via the ini setting + * default_charset for PHP >= 5.6 or iconv_get_encoding otherwise. + * + * @return string + */ + protected static function _getEncoding() + { + $oenc = PHP_VERSION_ID < 50600 + ? iconv_get_encoding('internal_encoding') + : ini_get('default_charset'); + + return $oenc; + } + + /** + * Internal method to set the encoding via the ini setting + * default_charset for PHP >= 5.6 or iconv_set_encoding otherwise. + * + * @param string $encoding + * @return void + */ + protected static function _setEncoding($encoding) + { + if (PHP_VERSION_ID < 50600) { + iconv_set_encoding('internal_encoding', $encoding); + } else { + ini_set('default_charset', $encoding); + } + } }