Update SimplePie to version 1.2.1.
This commit is contained in:
parent
b4a3e2ffcd
commit
5b085627bd
|
@ -5,7 +5,7 @@
|
||||||
* A PHP-Based RSS and Atom Feed Framework.
|
* A PHP-Based RSS and Atom Feed Framework.
|
||||||
* Takes the hard work out of managing a complete RSS/Atom solution.
|
* Takes the hard work out of managing a complete RSS/Atom solution.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2004-2009, Ryan Parman and Geoffrey Sneddon
|
* Copyright (c) 2004-2011, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification, are
|
* Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
@ -33,10 +33,11 @@
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* @package SimplePie
|
* @package SimplePie
|
||||||
* @version 1.2
|
* @version 1.2.1
|
||||||
* @copyright 2004-2009 Ryan Parman, Geoffrey Sneddon
|
* @copyright 2004-2011 Ryan Parman, Geoffrey Sneddon, Ryan McCue
|
||||||
* @author Ryan Parman
|
* @author Ryan Parman
|
||||||
* @author Geoffrey Sneddon
|
* @author Geoffrey Sneddon
|
||||||
|
* @author Ryan McCue
|
||||||
* @link http://simplepie.org/ SimplePie
|
* @link http://simplepie.org/ SimplePie
|
||||||
* @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums
|
* @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums
|
||||||
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
|
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
|
||||||
|
@ -51,12 +52,12 @@ define('SIMPLEPIE_NAME', 'SimplePie');
|
||||||
/**
|
/**
|
||||||
* SimplePie Version
|
* SimplePie Version
|
||||||
*/
|
*/
|
||||||
define('SIMPLEPIE_VERSION', '1.2');
|
define('SIMPLEPIE_VERSION', '1.2.1-dev');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SimplePie Build
|
* SimplePie Build
|
||||||
*/
|
*/
|
||||||
define('SIMPLEPIE_BUILD', '20090627192103');
|
define('SIMPLEPIE_BUILD', '20111015034325');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SimplePie Website URL
|
* SimplePie Website URL
|
||||||
|
@ -1671,7 +1672,7 @@ class SimplePie
|
||||||
$this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
|
$this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
|
||||||
if (!$cache->save($this))
|
if (!$cache->save($this))
|
||||||
{
|
{
|
||||||
trigger_error("$this->cache_location is not writeable", E_USER_WARNING);
|
trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
|
||||||
}
|
}
|
||||||
$cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc');
|
$cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc');
|
||||||
}
|
}
|
||||||
|
@ -1679,7 +1680,7 @@ class SimplePie
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->error = "A feed could not be found at $this->feed_url";
|
$this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed.";
|
||||||
SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
|
SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1776,27 +1777,27 @@ class SimplePie
|
||||||
// Cache the file if caching is enabled
|
// Cache the file if caching is enabled
|
||||||
if ($cache && !$cache->save($this))
|
if ($cache && !$cache->save($this))
|
||||||
{
|
{
|
||||||
trigger_error("$cache->name is not writeable", E_USER_WARNING);
|
trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->error = "A feed could not be found at $this->feed_url";
|
$this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed.";
|
||||||
SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
|
SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(isset($parser))
|
if (isset($parser))
|
||||||
{
|
{
|
||||||
// We have an error, just set SimplePie_Misc::error to it and quit
|
// We have an error, just set SimplePie_Misc::error to it and quit
|
||||||
$this->error = sprintf('XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
|
$this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->error = 'The data could not be converted to UTF-8';
|
$this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.';
|
||||||
}
|
}
|
||||||
SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
|
SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
|
||||||
return false;
|
return false;
|
||||||
|
@ -1983,7 +1984,7 @@ class SimplePie
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
trigger_error("$cache->name is not writeable", E_USER_WARNING);
|
trigger_error("$cache->name is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
|
||||||
return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
|
return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2773,11 +2774,12 @@ class SimplePie
|
||||||
|
|
||||||
function get_latitude()
|
function get_latitude()
|
||||||
{
|
{
|
||||||
|
|
||||||
if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
|
if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
|
||||||
{
|
{
|
||||||
return (float) $return[0]['data'];
|
return (float) $return[0]['data'];
|
||||||
}
|
}
|
||||||
elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
|
elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
|
||||||
{
|
{
|
||||||
return (float) $match[1];
|
return (float) $match[1];
|
||||||
}
|
}
|
||||||
|
@ -2797,7 +2799,7 @@ class SimplePie
|
||||||
{
|
{
|
||||||
return (float) $return[0]['data'];
|
return (float) $return[0]['data'];
|
||||||
}
|
}
|
||||||
elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
|
elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
|
||||||
{
|
{
|
||||||
return (float) $match[2];
|
return (float) $match[2];
|
||||||
}
|
}
|
||||||
|
@ -3277,6 +3279,11 @@ class SimplePie_Item
|
||||||
{
|
{
|
||||||
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
|
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
|
||||||
}
|
}
|
||||||
|
elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
|
||||||
|
{
|
||||||
|
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
|
||||||
|
}
|
||||||
|
|
||||||
elseif (!$description_only)
|
elseif (!$description_only)
|
||||||
{
|
{
|
||||||
return $this->get_content(true);
|
return $this->get_content(true);
|
||||||
|
@ -3641,7 +3648,7 @@ class SimplePie_Item
|
||||||
{
|
{
|
||||||
return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
|
return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
|
||||||
}
|
}
|
||||||
elseif (($date = $this->get_date('U')) !== null)
|
elseif (($date = $this->get_date('U')) !== null && $date !== false)
|
||||||
{
|
{
|
||||||
return strftime($date_format, $date);
|
return strftime($date_format, $date);
|
||||||
}
|
}
|
||||||
|
@ -4066,16 +4073,16 @@ class SimplePie_Item
|
||||||
$temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
|
$temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
|
||||||
if (sizeof($temp) > 0)
|
if (sizeof($temp) > 0)
|
||||||
{
|
{
|
||||||
(int) $seconds = array_pop($temp);
|
$seconds = (int) array_pop($temp);
|
||||||
}
|
}
|
||||||
if (sizeof($temp) > 0)
|
if (sizeof($temp) > 0)
|
||||||
{
|
{
|
||||||
(int) $minutes = array_pop($temp);
|
$minutes = (int) array_pop($temp);
|
||||||
$seconds += $minutes * 60;
|
$seconds += $minutes * 60;
|
||||||
}
|
}
|
||||||
if (sizeof($temp) > 0)
|
if (sizeof($temp) > 0)
|
||||||
{
|
{
|
||||||
(int) $hours = array_pop($temp);
|
$hours = (int) array_pop($temp);
|
||||||
$seconds += $hours * 3600;
|
$seconds += $hours * 3600;
|
||||||
}
|
}
|
||||||
unset($temp);
|
unset($temp);
|
||||||
|
@ -4426,6 +4433,8 @@ class SimplePie_Item
|
||||||
|
|
||||||
// If we have media:group tags, loop through them.
|
// If we have media:group tags, loop through them.
|
||||||
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
|
foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
|
||||||
|
{
|
||||||
|
if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
|
||||||
{
|
{
|
||||||
// If we have media:content tags, loop through them.
|
// If we have media:content tags, loop through them.
|
||||||
foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
|
foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
|
||||||
|
@ -5045,13 +5054,14 @@ class SimplePie_Item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If we have standalone media:content tags, loop through them.
|
// If we have standalone media:content tags, loop through them.
|
||||||
if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
|
if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
|
||||||
{
|
{
|
||||||
foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
|
foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
|
||||||
{
|
{
|
||||||
if (isset($content['attribs']['']['url']))
|
if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
|
||||||
{
|
{
|
||||||
// Attributes
|
// Attributes
|
||||||
$bitrate = null;
|
$bitrate = null;
|
||||||
|
@ -5136,8 +5146,10 @@ class SimplePie_Item
|
||||||
{
|
{
|
||||||
$width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
|
$width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
|
||||||
}
|
}
|
||||||
|
if (isset($content['attribs']['']['url']))
|
||||||
|
{
|
||||||
$url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
|
$url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
|
||||||
|
}
|
||||||
// Checking the other optional media: elements. Priority: media:content, media:group, item, channel
|
// Checking the other optional media: elements. Priority: media:content, media:group, item, channel
|
||||||
|
|
||||||
// CAPTIONS
|
// CAPTIONS
|
||||||
|
@ -5579,7 +5591,7 @@ class SimplePie_Item
|
||||||
{
|
{
|
||||||
return (float) $return[0]['data'];
|
return (float) $return[0]['data'];
|
||||||
}
|
}
|
||||||
elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
|
elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
|
||||||
{
|
{
|
||||||
return (float) $match[1];
|
return (float) $match[1];
|
||||||
}
|
}
|
||||||
|
@ -5599,7 +5611,7 @@ class SimplePie_Item
|
||||||
{
|
{
|
||||||
return (float) $return[0]['data'];
|
return (float) $return[0]['data'];
|
||||||
}
|
}
|
||||||
elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
|
elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
|
||||||
{
|
{
|
||||||
return (float) $match[2];
|
return (float) $match[2];
|
||||||
}
|
}
|
||||||
|
@ -6222,7 +6234,7 @@ class SimplePie_Source
|
||||||
{
|
{
|
||||||
return (float) $return[0]['data'];
|
return (float) $return[0]['data'];
|
||||||
}
|
}
|
||||||
elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
|
elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
|
||||||
{
|
{
|
||||||
return (float) $match[1];
|
return (float) $match[1];
|
||||||
}
|
}
|
||||||
|
@ -6242,7 +6254,7 @@ class SimplePie_Source
|
||||||
{
|
{
|
||||||
return (float) $return[0]['data'];
|
return (float) $return[0]['data'];
|
||||||
}
|
}
|
||||||
elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
|
elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
|
||||||
{
|
{
|
||||||
return (float) $match[2];
|
return (float) $match[2];
|
||||||
}
|
}
|
||||||
|
@ -7730,16 +7742,17 @@ class SimplePie_File
|
||||||
{
|
{
|
||||||
$this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
|
$this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
|
||||||
$url_parts = parse_url($url);
|
$url_parts = parse_url($url);
|
||||||
|
$socket_host = $url_parts['host'];
|
||||||
if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')
|
if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')
|
||||||
{
|
{
|
||||||
$url_parts['host'] = "ssl://$url_parts[host]";
|
$socket_host = "ssl://$url_parts[host]";
|
||||||
$url_parts['port'] = 443;
|
$url_parts['port'] = 443;
|
||||||
}
|
}
|
||||||
if (!isset($url_parts['port']))
|
if (!isset($url_parts['port']))
|
||||||
{
|
{
|
||||||
$url_parts['port'] = 80;
|
$url_parts['port'] = 80;
|
||||||
}
|
}
|
||||||
$fp = @fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout);
|
$fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout);
|
||||||
if (!$fp)
|
if (!$fp)
|
||||||
{
|
{
|
||||||
$this->error = 'fsockopen error: ' . $errstr;
|
$this->error = 'fsockopen error: ' . $errstr;
|
||||||
|
@ -8485,7 +8498,7 @@ class SimplePie_gzdecode
|
||||||
|
|
||||||
// Get the length of the extra field
|
// Get the length of the extra field
|
||||||
$len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
|
$len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
|
||||||
$position += 2;
|
$this->position += 2;
|
||||||
|
|
||||||
// Check the length of the string is still valid
|
// Check the length of the string is still valid
|
||||||
$this->min_compressed_size += $len + 4;
|
$this->min_compressed_size += $len + 4;
|
||||||
|
@ -9237,8 +9250,25 @@ class SimplePie_Misc
|
||||||
$note = 'Unknown Error';
|
$note = 'Unknown Error';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
error_log("$note: $message in $file on line $line", 0);
|
|
||||||
|
$log_error = true;
|
||||||
|
if (!function_exists('error_log'))
|
||||||
|
{
|
||||||
|
$log_error = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$log_file = @ini_get('error_log');
|
||||||
|
if (!empty($log_file) && ('syslog' != $log_file) && !@is_writable($log_file))
|
||||||
|
{
|
||||||
|
$log_error = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($log_error)
|
||||||
|
{
|
||||||
|
@error_log("$note: $message in $file on line $line", 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $message;
|
return $message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9430,12 +9460,12 @@ class SimplePie_Misc
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is first, as behaviour of this is completely predictable
|
// This is first, as behaviour of this is completely predictable
|
||||||
if ($input === 'Windows-1252' && $output === 'UTF-8')
|
if ($input === 'windows-1252' && $output === 'UTF-8')
|
||||||
{
|
{
|
||||||
return SimplePie_Misc::windows_1252_to_utf8($data);
|
return SimplePie_Misc::windows_1252_to_utf8($data);
|
||||||
}
|
}
|
||||||
// This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
|
// This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
|
||||||
elseif (function_exists('mb_convert_encoding') && @mb_convert_encoding("\x80", 'UTF-16BE', $input) !== "\x00\x80" && ($return = @mb_convert_encoding($data, $output, $input)))
|
elseif (function_exists('mb_convert_encoding') && @mb_convert_encoding("\x80", 'UTF-16BE', $input) !== "\x00\x80" && in_array($input, mb_list_encodings()) && ($return = @mb_convert_encoding($data, $output, $input)))
|
||||||
{
|
{
|
||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
@ -9451,6 +9481,17 @@ class SimplePie_Misc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize an encoding name
|
||||||
|
*
|
||||||
|
* This is automatically generated by create.php
|
||||||
|
*
|
||||||
|
* To generate it, run `php create.php` on the command line, and copy the
|
||||||
|
* output to replace this function.
|
||||||
|
*
|
||||||
|
* @param string $charset Character set to standardise
|
||||||
|
* @return string Standardised name
|
||||||
|
*/
|
||||||
function encoding($charset)
|
function encoding($charset)
|
||||||
{
|
{
|
||||||
// Normalization from UTS #22
|
// Normalization from UTS #22
|
||||||
|
@ -9484,7 +9525,6 @@ class SimplePie_Misc
|
||||||
|
|
||||||
case 'big5':
|
case 'big5':
|
||||||
case 'csbig5':
|
case 'csbig5':
|
||||||
case 'xxbig5':
|
|
||||||
return 'Big5';
|
return 'Big5';
|
||||||
|
|
||||||
case 'big5hkscs':
|
case 'big5hkscs':
|
||||||
|
@ -9640,14 +9680,14 @@ class SimplePie_Misc
|
||||||
case 'isoir85':
|
case 'isoir85':
|
||||||
return 'ES2';
|
return 'ES2';
|
||||||
|
|
||||||
case 'cseucfixwidjapanese':
|
|
||||||
case 'extendedunixcodefixedwidthforjapanese':
|
|
||||||
return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
|
|
||||||
|
|
||||||
case 'cseucpkdfmtjapanese':
|
case 'cseucpkdfmtjapanese':
|
||||||
case 'eucjp':
|
case 'eucjp':
|
||||||
case 'extendedunixcodepackedformatforjapanese':
|
case 'extendedunixcodepackedformatforjapanese':
|
||||||
return 'Extended_UNIX_Code_Packed_Format_for_Japanese';
|
return 'EUC-JP';
|
||||||
|
|
||||||
|
case 'cseucfixwidjapanese':
|
||||||
|
case 'extendedunixcodefixedwidthforjapanese':
|
||||||
|
return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
|
||||||
|
|
||||||
case 'gb18030':
|
case 'gb18030':
|
||||||
return 'GB18030';
|
return 'GB18030';
|
||||||
|
@ -9726,80 +9766,6 @@ class SimplePie_Misc
|
||||||
case 'ibmthai':
|
case 'ibmthai':
|
||||||
return 'IBM-Thai';
|
return 'IBM-Thai';
|
||||||
|
|
||||||
case 'ccsid858':
|
|
||||||
case 'cp858':
|
|
||||||
case 'ibm858':
|
|
||||||
case 'pcmultilingual850euro':
|
|
||||||
return 'IBM00858';
|
|
||||||
|
|
||||||
case 'ccsid924':
|
|
||||||
case 'cp924':
|
|
||||||
case 'ebcdiclatin9euro':
|
|
||||||
case 'ibm924':
|
|
||||||
return 'IBM00924';
|
|
||||||
|
|
||||||
case 'ccsid1140':
|
|
||||||
case 'cp1140':
|
|
||||||
case 'ebcdicus37euro':
|
|
||||||
case 'ibm1140':
|
|
||||||
return 'IBM01140';
|
|
||||||
|
|
||||||
case 'ccsid1141':
|
|
||||||
case 'cp1141':
|
|
||||||
case 'ebcdicde273euro':
|
|
||||||
case 'ibm1141':
|
|
||||||
return 'IBM01141';
|
|
||||||
|
|
||||||
case 'ccsid1142':
|
|
||||||
case 'cp1142':
|
|
||||||
case 'ebcdicdk277euro':
|
|
||||||
case 'ebcdicno277euro':
|
|
||||||
case 'ibm1142':
|
|
||||||
return 'IBM01142';
|
|
||||||
|
|
||||||
case 'ccsid1143':
|
|
||||||
case 'cp1143':
|
|
||||||
case 'ebcdicfi278euro':
|
|
||||||
case 'ebcdicse278euro':
|
|
||||||
case 'ibm1143':
|
|
||||||
return 'IBM01143';
|
|
||||||
|
|
||||||
case 'ccsid1144':
|
|
||||||
case 'cp1144':
|
|
||||||
case 'ebcdicit280euro':
|
|
||||||
case 'ibm1144':
|
|
||||||
return 'IBM01144';
|
|
||||||
|
|
||||||
case 'ccsid1145':
|
|
||||||
case 'cp1145':
|
|
||||||
case 'ebcdices284euro':
|
|
||||||
case 'ibm1145':
|
|
||||||
return 'IBM01145';
|
|
||||||
|
|
||||||
case 'ccsid1146':
|
|
||||||
case 'cp1146':
|
|
||||||
case 'ebcdicgb285euro':
|
|
||||||
case 'ibm1146':
|
|
||||||
return 'IBM01146';
|
|
||||||
|
|
||||||
case 'ccsid1147':
|
|
||||||
case 'cp1147':
|
|
||||||
case 'ebcdicfr297euro':
|
|
||||||
case 'ibm1147':
|
|
||||||
return 'IBM01147';
|
|
||||||
|
|
||||||
case 'ccsid1148':
|
|
||||||
case 'cp1148':
|
|
||||||
case 'ebcdicinternational500euro':
|
|
||||||
case 'ibm1148':
|
|
||||||
return 'IBM01148';
|
|
||||||
|
|
||||||
case 'ccsid1149':
|
|
||||||
case 'cp1149':
|
|
||||||
case 'ebcdicis871euro':
|
|
||||||
case 'ibm1149':
|
|
||||||
return 'IBM01149';
|
|
||||||
|
|
||||||
case 'cp37':
|
case 'cp37':
|
||||||
case 'csibm37':
|
case 'csibm37':
|
||||||
case 'ebcdiccpca':
|
case 'ebcdiccpca':
|
||||||
|
@ -9947,6 +9913,12 @@ class SimplePie_Misc
|
||||||
case 'ibm857':
|
case 'ibm857':
|
||||||
return 'IBM857';
|
return 'IBM857';
|
||||||
|
|
||||||
|
case 'ccsid858':
|
||||||
|
case 'cp858':
|
||||||
|
case 'ibm858':
|
||||||
|
case 'pcmultilingual850euro':
|
||||||
|
return 'IBM00858';
|
||||||
|
|
||||||
case '860':
|
case '860':
|
||||||
case 'cp860':
|
case 'cp860':
|
||||||
case 'csibm860':
|
case 'csibm860':
|
||||||
|
@ -10049,6 +10021,12 @@ class SimplePie_Misc
|
||||||
case 'ibm918':
|
case 'ibm918':
|
||||||
return 'IBM918';
|
return 'IBM918';
|
||||||
|
|
||||||
|
case 'ccsid924':
|
||||||
|
case 'cp924':
|
||||||
|
case 'ebcdiclatin9euro':
|
||||||
|
case 'ibm924':
|
||||||
|
return 'IBM00924';
|
||||||
|
|
||||||
case 'cp1026':
|
case 'cp1026':
|
||||||
case 'csibm1026':
|
case 'csibm1026':
|
||||||
case 'ibm1026':
|
case 'ibm1026':
|
||||||
|
@ -10057,6 +10035,68 @@ class SimplePie_Misc
|
||||||
case 'ibm1047':
|
case 'ibm1047':
|
||||||
return 'IBM1047';
|
return 'IBM1047';
|
||||||
|
|
||||||
|
case 'ccsid1140':
|
||||||
|
case 'cp1140':
|
||||||
|
case 'ebcdicus37euro':
|
||||||
|
case 'ibm1140':
|
||||||
|
return 'IBM01140';
|
||||||
|
|
||||||
|
case 'ccsid1141':
|
||||||
|
case 'cp1141':
|
||||||
|
case 'ebcdicde273euro':
|
||||||
|
case 'ibm1141':
|
||||||
|
return 'IBM01141';
|
||||||
|
|
||||||
|
case 'ccsid1142':
|
||||||
|
case 'cp1142':
|
||||||
|
case 'ebcdicdk277euro':
|
||||||
|
case 'ebcdicno277euro':
|
||||||
|
case 'ibm1142':
|
||||||
|
return 'IBM01142';
|
||||||
|
|
||||||
|
case 'ccsid1143':
|
||||||
|
case 'cp1143':
|
||||||
|
case 'ebcdicfi278euro':
|
||||||
|
case 'ebcdicse278euro':
|
||||||
|
case 'ibm1143':
|
||||||
|
return 'IBM01143';
|
||||||
|
|
||||||
|
case 'ccsid1144':
|
||||||
|
case 'cp1144':
|
||||||
|
case 'ebcdicit280euro':
|
||||||
|
case 'ibm1144':
|
||||||
|
return 'IBM01144';
|
||||||
|
|
||||||
|
case 'ccsid1145':
|
||||||
|
case 'cp1145':
|
||||||
|
case 'ebcdices284euro':
|
||||||
|
case 'ibm1145':
|
||||||
|
return 'IBM01145';
|
||||||
|
|
||||||
|
case 'ccsid1146':
|
||||||
|
case 'cp1146':
|
||||||
|
case 'ebcdicgb285euro':
|
||||||
|
case 'ibm1146':
|
||||||
|
return 'IBM01146';
|
||||||
|
|
||||||
|
case 'ccsid1147':
|
||||||
|
case 'cp1147':
|
||||||
|
case 'ebcdicfr297euro':
|
||||||
|
case 'ibm1147':
|
||||||
|
return 'IBM01147';
|
||||||
|
|
||||||
|
case 'ccsid1148':
|
||||||
|
case 'cp1148':
|
||||||
|
case 'ebcdicinternational500euro':
|
||||||
|
case 'ibm1148':
|
||||||
|
return 'IBM01148';
|
||||||
|
|
||||||
|
case 'ccsid1149':
|
||||||
|
case 'cp1149':
|
||||||
|
case 'ebcdicis871euro':
|
||||||
|
case 'ibm1149':
|
||||||
|
return 'IBM01149';
|
||||||
|
|
||||||
case 'csiso143iecp271':
|
case 'csiso143iecp271':
|
||||||
case 'iecp271':
|
case 'iecp271':
|
||||||
case 'isoir143':
|
case 'isoir143':
|
||||||
|
@ -10599,11 +10639,6 @@ class SimplePie_Misc
|
||||||
case 'sen850200c':
|
case 'sen850200c':
|
||||||
return 'SEN_850200_C';
|
return 'SEN_850200_C';
|
||||||
|
|
||||||
case 'csshiftjis':
|
|
||||||
case 'mskanji':
|
|
||||||
case 'shiftjis':
|
|
||||||
return 'Shift_JIS';
|
|
||||||
|
|
||||||
case 'csiso102t617bit':
|
case 'csiso102t617bit':
|
||||||
case 'isoir102':
|
case 'isoir102':
|
||||||
case 't617bit':
|
case 't617bit':
|
||||||
|
@ -10702,7 +10737,10 @@ class SimplePie_Misc
|
||||||
case 'viscii':
|
case 'viscii':
|
||||||
return 'VISCII';
|
return 'VISCII';
|
||||||
|
|
||||||
|
case 'csshiftjis':
|
||||||
case 'cswindows31j':
|
case 'cswindows31j':
|
||||||
|
case 'mskanji':
|
||||||
|
case 'shiftjis':
|
||||||
case 'windows31j':
|
case 'windows31j':
|
||||||
return 'Windows-31J';
|
return 'Windows-31J';
|
||||||
|
|
||||||
|
@ -11363,6 +11401,58 @@ function embed_wmedia(width, height, link) {
|
||||||
}
|
}
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format debugging information
|
||||||
|
*/
|
||||||
|
function debug($sp)
|
||||||
|
{
|
||||||
|
$info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n";
|
||||||
|
$info .= 'PHP ' . PHP_VERSION . "\n";
|
||||||
|
if ($sp->error() !== null)
|
||||||
|
{
|
||||||
|
$info .= 'Error occurred: ' . $sp->error() . "\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$info .= "No error found.\n";
|
||||||
|
}
|
||||||
|
$info .= "Extensions:\n";
|
||||||
|
$extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml');
|
||||||
|
foreach ($extensions as $ext)
|
||||||
|
{
|
||||||
|
if (extension_loaded($ext))
|
||||||
|
{
|
||||||
|
$info .= " $ext loaded\n";
|
||||||
|
switch ($ext)
|
||||||
|
{
|
||||||
|
case 'pcre':
|
||||||
|
$info .= ' Version ' . PCRE_VERSION . "\n";
|
||||||
|
break;
|
||||||
|
case 'curl':
|
||||||
|
$version = curl_version();
|
||||||
|
$info .= ' Version ' . $version['version'] . "\n";
|
||||||
|
break;
|
||||||
|
case 'mbstring':
|
||||||
|
$info .= ' Overloading: ' . mb_get_info('func_overload') . "\n";
|
||||||
|
break;
|
||||||
|
case 'iconv':
|
||||||
|
$info .= ' Version ' . ICONV_VERSION . "\n";
|
||||||
|
break;
|
||||||
|
case 'xml':
|
||||||
|
$info .= ' Version ' . LIBXML_DOTTED_VERSION . "\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$info .= " $ext not loaded\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $info;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11834,14 +11924,135 @@ class SimplePie_IRI
|
||||||
/**
|
/**
|
||||||
* Replace invalid character with percent encoding
|
* Replace invalid character with percent encoding
|
||||||
*
|
*
|
||||||
* @access private
|
|
||||||
* @param string $string Input string
|
* @param string $string Input string
|
||||||
* @param string $valid_chars Valid characters
|
* @param string $valid_chars Valid characters
|
||||||
* @param int $case Normalise case
|
* @param int $case Normalise case
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function replace_invalid_with_pct_encoding($string, $valid_chars, $case = SIMPLEPIE_SAME_CASE)
|
function replace_invalid_with_pct_encoding($string, $valid_chars, $case = SIMPLEPIE_SAME_CASE, $iprivate = false)
|
||||||
{
|
{
|
||||||
|
// Normalize as many pct-encoded sections as possible
|
||||||
|
$string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array(&$this, 'remove_iunreserved_percent_encoded'), $string);
|
||||||
|
|
||||||
|
// Replace invalid percent characters
|
||||||
|
$string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string);
|
||||||
|
|
||||||
|
// Add unreserved and % to $valid_chars (the latter is safe because all
|
||||||
|
// pct-encoded sections are now valid).
|
||||||
|
$valid_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';
|
||||||
|
|
||||||
|
// Now replace any bytes that aren't allowed with their pct-encoded versions
|
||||||
|
$position = 0;
|
||||||
|
$strlen = strlen($string);
|
||||||
|
while (($position += strspn($string, $valid_chars, $position)) < $strlen)
|
||||||
|
{
|
||||||
|
$value = ord($string[$position]);
|
||||||
|
|
||||||
|
// Start position
|
||||||
|
$start = $position;
|
||||||
|
|
||||||
|
// By default we are valid
|
||||||
|
$valid = true;
|
||||||
|
|
||||||
|
// No one byte sequences are valid due to the while.
|
||||||
|
// Two byte sequence:
|
||||||
|
if (($value & 0xE0) === 0xC0)
|
||||||
|
{
|
||||||
|
$character = ($value & 0x1F) << 6;
|
||||||
|
$length = 2;
|
||||||
|
$remaining = 1;
|
||||||
|
}
|
||||||
|
// Three byte sequence:
|
||||||
|
elseif (($value & 0xF0) === 0xE0)
|
||||||
|
{
|
||||||
|
$character = ($value & 0x0F) << 12;
|
||||||
|
$length = 3;
|
||||||
|
$remaining = 2;
|
||||||
|
}
|
||||||
|
// Four byte sequence:
|
||||||
|
elseif (($value & 0xF8) === 0xF0)
|
||||||
|
{
|
||||||
|
$character = ($value & 0x07) << 18;
|
||||||
|
$length = 4;
|
||||||
|
$remaining = 3;
|
||||||
|
}
|
||||||
|
// Invalid byte:
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$valid = false;
|
||||||
|
$length = 1;
|
||||||
|
$remaining = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($remaining)
|
||||||
|
{
|
||||||
|
if ($position + $length <= $strlen)
|
||||||
|
{
|
||||||
|
for ($position++; $remaining; $position++)
|
||||||
|
{
|
||||||
|
$value = ord($string[$position]);
|
||||||
|
|
||||||
|
// Check that the byte is valid, then add it to the character:
|
||||||
|
if (($value & 0xC0) === 0x80)
|
||||||
|
{
|
||||||
|
$character |= ($value & 0x3F) << (--$remaining * 6);
|
||||||
|
}
|
||||||
|
// If it is invalid, count the sequence as invalid and reprocess the current byte:
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$valid = false;
|
||||||
|
$position--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$position = $strlen - 1;
|
||||||
|
$valid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Percent encode anything invalid or not in ucschar
|
||||||
|
if (
|
||||||
|
// Invalid sequences
|
||||||
|
!$valid
|
||||||
|
// Non-shortest form sequences are invalid
|
||||||
|
|| $length > 1 && $character <= 0x7F
|
||||||
|
|| $length > 2 && $character <= 0x7FF
|
||||||
|
|| $length > 3 && $character <= 0xFFFF
|
||||||
|
// Outside of range of ucschar codepoints
|
||||||
|
// Noncharacters
|
||||||
|
|| ($character & 0xFFFE) === 0xFFFE
|
||||||
|
|| $character >= 0xFDD0 && $character <= 0xFDEF
|
||||||
|
|| (
|
||||||
|
// Everything else not in ucschar
|
||||||
|
$character > 0xD7FF && $character < 0xF900
|
||||||
|
|| $character < 0xA0
|
||||||
|
|| $character > 0xEFFFD
|
||||||
|
)
|
||||||
|
&& (
|
||||||
|
// Everything not in iprivate, if it applies
|
||||||
|
!$iprivate
|
||||||
|
|| $character < 0xE000
|
||||||
|
|| $character > 0x10FFFD
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// If we were a character, pretend we weren't, but rather an error.
|
||||||
|
if ($valid)
|
||||||
|
$position--;
|
||||||
|
|
||||||
|
for ($j = $start; $j <= $position; $j++)
|
||||||
|
{
|
||||||
|
$string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1);
|
||||||
|
$j += 2;
|
||||||
|
$position += 2;
|
||||||
|
$strlen += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Normalise case
|
// Normalise case
|
||||||
if ($case & SIMPLEPIE_LOWERCASE)
|
if ($case & SIMPLEPIE_LOWERCASE)
|
||||||
{
|
{
|
||||||
|
@ -11852,61 +12063,148 @@ class SimplePie_IRI
|
||||||
$string = strtoupper($string);
|
$string = strtoupper($string);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store position and string length (to avoid constantly recalculating this)
|
return $string;
|
||||||
$position = 0;
|
|
||||||
$strlen = strlen($string);
|
|
||||||
|
|
||||||
// Loop as long as we have invalid characters, advancing the position to the next invalid character
|
|
||||||
while (($position += strspn($string, $valid_chars, $position)) < $strlen)
|
|
||||||
{
|
|
||||||
// If we have a % character
|
|
||||||
if ($string[$position] === '%')
|
|
||||||
{
|
|
||||||
// If we have a pct-encoded section
|
|
||||||
if ($position + 2 < $strlen && strspn($string, '0123456789ABCDEFabcdef', $position + 1, 2) === 2)
|
|
||||||
{
|
|
||||||
// Get the the represented character
|
|
||||||
$chr = chr(hexdec(substr($string, $position + 1, 2)));
|
|
||||||
|
|
||||||
// If the character is valid, replace the pct-encoded with the actual character while normalising case
|
|
||||||
if (strpos($valid_chars, $chr) !== false)
|
|
||||||
{
|
|
||||||
if ($case & SIMPLEPIE_LOWERCASE)
|
|
||||||
{
|
|
||||||
$chr = strtolower($chr);
|
|
||||||
}
|
|
||||||
elseif ($case & SIMPLEPIE_UPPERCASE)
|
|
||||||
{
|
|
||||||
$chr = strtoupper($chr);
|
|
||||||
}
|
|
||||||
$string = substr_replace($string, $chr, $position, 3);
|
|
||||||
$strlen -= 2;
|
|
||||||
$position++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise just normalise the pct-encoded to uppercase
|
/**
|
||||||
|
* Callback function for preg_replace_callback.
|
||||||
|
*
|
||||||
|
* Removes sequences of percent encoded bytes that represent UTF-8
|
||||||
|
* encoded characters in iunreserved
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array $match PCRE match
|
||||||
|
* @return string Replacement
|
||||||
|
*/
|
||||||
|
function remove_iunreserved_percent_encoded($match)
|
||||||
|
{
|
||||||
|
// As we just have valid percent encoded sequences we can just explode
|
||||||
|
// and ignore the first member of the returned array (an empty string).
|
||||||
|
$bytes = explode('%', $match[0]);
|
||||||
|
|
||||||
|
// Initialize the new string (this is what will be returned) and that
|
||||||
|
// there are no bytes remaining in the current sequence (unsurprising
|
||||||
|
// at the first byte!).
|
||||||
|
$string = '';
|
||||||
|
$remaining = 0;
|
||||||
|
|
||||||
|
// Loop over each and every byte, and set $value to its value
|
||||||
|
for ($i = 1, $len = count($bytes); $i < $len; $i++)
|
||||||
|
{
|
||||||
|
$value = hexdec($bytes[$i]);
|
||||||
|
|
||||||
|
// If we're the first byte of sequence:
|
||||||
|
if (!$remaining)
|
||||||
|
{
|
||||||
|
// Start position
|
||||||
|
$start = $i;
|
||||||
|
|
||||||
|
// By default we are valid
|
||||||
|
$valid = true;
|
||||||
|
|
||||||
|
// One byte sequence:
|
||||||
|
if ($value <= 0x7F)
|
||||||
|
{
|
||||||
|
$character = $value;
|
||||||
|
$length = 1;
|
||||||
|
}
|
||||||
|
// Two byte sequence:
|
||||||
|
elseif (($value & 0xE0) === 0xC0)
|
||||||
|
{
|
||||||
|
$character = ($value & 0x1F) << 6;
|
||||||
|
$length = 2;
|
||||||
|
$remaining = 1;
|
||||||
|
}
|
||||||
|
// Three byte sequence:
|
||||||
|
elseif (($value & 0xF0) === 0xE0)
|
||||||
|
{
|
||||||
|
$character = ($value & 0x0F) << 12;
|
||||||
|
$length = 3;
|
||||||
|
$remaining = 2;
|
||||||
|
}
|
||||||
|
// Four byte sequence:
|
||||||
|
elseif (($value & 0xF8) === 0xF0)
|
||||||
|
{
|
||||||
|
$character = ($value & 0x07) << 18;
|
||||||
|
$length = 4;
|
||||||
|
$remaining = 3;
|
||||||
|
}
|
||||||
|
// Invalid byte:
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$string = substr_replace($string, strtoupper(substr($string, $position + 1, 2)), $position + 1, 2);
|
$valid = false;
|
||||||
$position += 3;
|
$remaining = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If we don't have a pct-encoded section, just replace the % with its own esccaped form
|
// Continuation byte:
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$string = substr_replace($string, '%25', $position, 1);
|
// Check that the byte is valid, then add it to the character:
|
||||||
$strlen += 2;
|
if (($value & 0xC0) === 0x80)
|
||||||
$position += 3;
|
{
|
||||||
|
$remaining--;
|
||||||
|
$character |= ($value & 0x3F) << ($remaining * 6);
|
||||||
}
|
}
|
||||||
}
|
// If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:
|
||||||
// If we have an invalid character, change into its pct-encoded form
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$replacement = sprintf("%%%02X", ord($string[$position]));
|
$valid = false;
|
||||||
$string = str_replace($string[$position], $replacement, $string);
|
$remaining = 0;
|
||||||
$strlen = strlen($string);
|
$i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we've reached the end of the current byte sequence, append it to Unicode::$data
|
||||||
|
if (!$remaining)
|
||||||
|
{
|
||||||
|
// Percent encode anything invalid or not in iunreserved
|
||||||
|
if (
|
||||||
|
// Invalid sequences
|
||||||
|
!$valid
|
||||||
|
// Non-shortest form sequences are invalid
|
||||||
|
|| $length > 1 && $character <= 0x7F
|
||||||
|
|| $length > 2 && $character <= 0x7FF
|
||||||
|
|| $length > 3 && $character <= 0xFFFF
|
||||||
|
// Outside of range of iunreserved codepoints
|
||||||
|
|| $character < 0x2D
|
||||||
|
|| $character > 0xEFFFD
|
||||||
|
// Noncharacters
|
||||||
|
|| ($character & 0xFFFE) === 0xFFFE
|
||||||
|
|| $character >= 0xFDD0 && $character <= 0xFDEF
|
||||||
|
// Everything else not in iunreserved (this is all BMP)
|
||||||
|
|| $character === 0x2F
|
||||||
|
|| $character > 0x39 && $character < 0x41
|
||||||
|
|| $character > 0x5A && $character < 0x61
|
||||||
|
|| $character > 0x7A && $character < 0x7E
|
||||||
|
|| $character > 0x7E && $character < 0xA0
|
||||||
|
|| $character > 0xD7FF && $character < 0xF900
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for ($j = $start; $j <= $i; $j++)
|
||||||
|
{
|
||||||
|
$string .= '%' . strtoupper($bytes[$j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for ($j = $start; $j <= $i; $j++)
|
||||||
|
{
|
||||||
|
$string .= chr(hexdec($bytes[$j]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have any bytes left over they are invalid (i.e., we are
|
||||||
|
// mid-way through a multi-byte sequence)
|
||||||
|
if ($remaining)
|
||||||
|
{
|
||||||
|
for ($j = $start; $j < $len; $j++)
|
||||||
|
{
|
||||||
|
$string .= '%' . strtoupper($bytes[$j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12133,7 +12431,7 @@ class SimplePie_IRI
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->query = $this->replace_invalid_with_pct_encoding($query, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:@/?');
|
$this->query = $this->replace_invalid_with_pct_encoding($query, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$\'()*+,;:@/?&=');
|
||||||
}
|
}
|
||||||
$this->valid[__FUNCTION__] = true;
|
$this->valid[__FUNCTION__] = true;
|
||||||
return true;
|
return true;
|
||||||
|
@ -13936,7 +14234,7 @@ class SimplePie_XML_Declaration_Parser
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->state = 'standalone_name';
|
$this->state = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13950,7 +14248,7 @@ class SimplePie_XML_Declaration_Parser
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->state = false;
|
$this->state = 'standalone_name';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14428,7 +14726,7 @@ class SimplePie_Parser
|
||||||
case constant('XMLReader::END_ELEMENT'):
|
case constant('XMLReader::END_ELEMENT'):
|
||||||
if ($xml->namespaceURI !== '')
|
if ($xml->namespaceURI !== '')
|
||||||
{
|
{
|
||||||
$tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}";
|
$tagName = $xml->namespaceURI . $this->separator . $xml->localName;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -14440,7 +14738,7 @@ class SimplePie_Parser
|
||||||
$empty = $xml->isEmptyElement;
|
$empty = $xml->isEmptyElement;
|
||||||
if ($xml->namespaceURI !== '')
|
if ($xml->namespaceURI !== '')
|
||||||
{
|
{
|
||||||
$tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}";
|
$tagName = $xml->namespaceURI . $this->separator . $xml->localName;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -14451,7 +14749,7 @@ class SimplePie_Parser
|
||||||
{
|
{
|
||||||
if ($xml->namespaceURI !== '')
|
if ($xml->namespaceURI !== '')
|
||||||
{
|
{
|
||||||
$attrName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}";
|
$attrName = $xml->namespaceURI . $this->separator . $xml->localName;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -14916,7 +15214,7 @@ class SimplePie_Sanitize
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
trigger_error("$this->cache_location is not writeable", E_USER_WARNING);
|
trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue