Passed
Branch ticket-41057 (c4f931)
by Stephen
24:38
created

SimplePie_Misc::change_encoding()   D

Complexity

Conditions 10
Paths 12

Size

Total Lines 40
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 10
eloc 17
nc 12
nop 3
dl 0
loc 40
rs 4.8196
c 0
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * SimplePie
4
 *
5
 * A PHP-Based RSS and Atom Feed Framework.
6
 * Takes the hard work out of managing a complete RSS/Atom solution.
7
 *
8
 * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
9
 * All rights reserved.
10
 *
11
 * Redistribution and use in source and binary forms, with or without modification, are
12
 * permitted provided that the following conditions are met:
13
 *
14
 * 	* Redistributions of source code must retain the above copyright notice, this list of
15
 * 	  conditions and the following disclaimer.
16
 *
17
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
18
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
19
 * 	  provided with the distribution.
20
 *
21
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
22
 * 	  to endorse or promote products derived from this software without specific prior
23
 * 	  written permission.
24
 *
25
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
26
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
27
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
28
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
 * POSSIBILITY OF SUCH DAMAGE.
34
 *
35
 * @package SimplePie
36
 * @version 1.3.1
37
 * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
38
 * @author Ryan Parman
39
 * @author Geoffrey Sneddon
40
 * @author Ryan McCue
41
 * @link http://simplepie.org/ SimplePie
42
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
43
 */
44
45
/**
46
 * Miscellanous utilities
47
 *
48
 * @package SimplePie
49
 */
50
class SimplePie_Misc
51
{
52
	public static function time_hms($seconds)
53
	{
54
		$time = '';
55
56
		$hours = floor($seconds / 3600);
57
		$remainder = $seconds % 3600;
58
		if ($hours > 0)
59
		{
60
			$time .= $hours.':';
61
		}
62
63
		$minutes = floor($remainder / 60);
64
		$seconds = $remainder % 60;
65
		if ($minutes < 10 && $hours > 0)
66
		{
67
			$minutes = '0' . $minutes;
68
		}
69
		if ($seconds < 10)
70
		{
71
			$seconds = '0' . $seconds;
72
		}
73
74
		$time .= $minutes.':';
75
		$time .= $seconds;
76
77
		return $time;
78
	}
79
80
	public static function absolutize_url($relative, $base)
81
	{
82
		$iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative);
83
		if ($iri === false)
84
		{
85
			return false;
86
		}
87
		return $iri->get_uri();
88
	}
89
90
	/**
91
	 * Get a HTML/XML element from a HTML string
92
	 *
93
	 * @deprecated Use DOMDocument instead (parsing HTML with regex is bad!)
94
	 * @param string $realname Element name (including namespace prefix if applicable)
95
	 * @param string $string HTML document
96
	 * @return array
97
	 */
98
	public static function get_element($realname, $string)
99
	{
100
		$return = array();
101
		$name = preg_quote($realname, '/');
102
		if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
103
		{
104
			for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
105
			{
106
				$return[$i]['tag'] = $realname;
107
				$return[$i]['full'] = $matches[$i][0][0];
108
				$return[$i]['offset'] = $matches[$i][0][1];
109
				if (strlen($matches[$i][3][0]) <= 2)
110
				{
111
					$return[$i]['self_closing'] = true;
112
				}
113
				else
114
				{
115
					$return[$i]['self_closing'] = false;
116
					$return[$i]['content'] = $matches[$i][4][0];
117
				}
118
				$return[$i]['attribs'] = array();
119
				if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER))
120
				{
121
					for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
122
					{
123
						if (count($attribs[$j]) === 2)
124
						{
125
							$attribs[$j][2] = $attribs[$j][1];
126
						}
127
						$return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]));
0 ignored issues
show
Security Bug introduced by
It seems like end($attribs[$j]) targeting end() can also be of type false; however, SimplePie_Misc::entities_decode() does only seem to accept string, did you maybe forget to handle an error condition?
Loading history...
Deprecated Code introduced by
The method SimplePie_Misc::entities_decode() has been deprecated with message: Use DOMDocument instead

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
128
					}
129
				}
130
			}
131
		}
132
		return $return;
133
	}
134
135
	public static function element_implode($element)
136
	{
137
		$full = "<$element[tag]";
138
		foreach ($element['attribs'] as $key => $value)
139
		{
140
			$key = strtolower($key);
141
			$full .= " $key=\"" . htmlspecialchars($value['data']) . '"';
142
		}
143
		if ($element['self_closing'])
144
		{
145
			$full .= ' />';
146
		}
147
		else
148
		{
149
			$full .= ">$element[content]</$element[tag]>";
150
		}
151
		return $full;
152
	}
153
154
	public static function error($message, $level, $file, $line)
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
155
	{
156
		if ((ini_get('error_reporting') & $level) > 0)
157
		{
158
			switch ($level)
159
			{
160
				case E_USER_ERROR:
161
					$note = 'PHP Error';
162
					break;
163
				case E_USER_WARNING:
164
					$note = 'PHP Warning';
165
					break;
166
				case E_USER_NOTICE:
167
					$note = 'PHP Notice';
168
					break;
169
				default:
170
					$note = 'Unknown Error';
171
					break;
172
			}
173
174
			$log_error = true;
175
			if (!function_exists('error_log'))
176
			{
177
				$log_error = false;
178
			}
179
180
			$log_file = @ini_get('error_log');
181
			if (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file))
182
			{
183
				$log_error = false;
184
			}
185
186
			if ($log_error)
187
			{
188
				@error_log("$note: $message in $file on line $line", 0);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
189
			}
190
		}
191
192
		return $message;
193
	}
194
195
	public static function fix_protocol($url, $http = 1)
196
	{
197
		$url = SimplePie_Misc::normalize_url($url);
198
		$parsed = SimplePie_Misc::parse_url($url);
199
		if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https')
200
		{
201
			return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
202
		}
203
204
		if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
205
		{
206
			return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
207
		}
208
209
		if ($http === 2 && $parsed['scheme'] !== '')
210
		{
211
			return "feed:$url";
212
		}
213 View Code Duplication
		elseif ($http === 3 && strtolower($parsed['scheme']) === 'http')
214
		{
215
			return substr_replace($url, 'podcast', 0, 4);
216
		}
217 View Code Duplication
		elseif ($http === 4 && strtolower($parsed['scheme']) === 'http')
218
		{
219
			return substr_replace($url, 'itpc', 0, 4);
220
		}
221
		else
222
		{
223
			return $url;
224
		}
225
	}
226
227
	public static function parse_url($url)
228
	{
229
		$iri = new SimplePie_IRI($url);
230
		return array(
231
			'scheme' => (string) $iri->scheme,
0 ignored issues
show
Documentation introduced by
The property $scheme is declared protected in SimplePie_IRI. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
232
			'authority' => (string) $iri->authority,
0 ignored issues
show
Documentation introduced by
The property authority does not exist on object<SimplePie_IRI>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
233
			'path' => (string) $iri->path,
0 ignored issues
show
Documentation introduced by
The property path does not exist on object<SimplePie_IRI>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
234
			'query' => (string) $iri->query,
0 ignored issues
show
Bug introduced by
The property query does not seem to exist. Did you mean iquery?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
235
			'fragment' => (string) $iri->fragment
0 ignored issues
show
Bug introduced by
The property fragment does not seem to exist. Did you mean ifragment?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
236
		);
237
	}
238
239
	public static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
240
	{
241
		$iri = new SimplePie_IRI('');
242
		$iri->scheme = $scheme;
0 ignored issues
show
Documentation introduced by
The property $scheme is declared protected in SimplePie_IRI. Since you implemented __set(), maybe consider adding a @property or @property-write annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
243
		$iri->authority = $authority;
0 ignored issues
show
Documentation introduced by
The property authority does not exist on object<SimplePie_IRI>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
244
		$iri->path = $path;
0 ignored issues
show
Documentation introduced by
The property path does not exist on object<SimplePie_IRI>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
245
		$iri->query = $query;
0 ignored issues
show
Bug introduced by
The property query does not seem to exist. Did you mean iquery?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
246
		$iri->fragment = $fragment;
0 ignored issues
show
Bug introduced by
The property fragment does not seem to exist. Did you mean ifragment?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
247
		return $iri->get_uri();
248
	}
249
250
	public static function normalize_url($url)
251
	{
252
		$iri = new SimplePie_IRI($url);
253
		return $iri->get_uri();
254
	}
255
256
	public static function percent_encoding_normalization($match)
257
	{
258
		$integer = hexdec($match[1]);
259
		if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E)
260
		{
261
			return chr($integer);
262
		}
263
		else
264
		{
265
			return strtoupper($match[0]);
266
		}
267
	}
268
269
	/**
270
	 * Converts a Windows-1252 encoded string to a UTF-8 encoded string
271
	 *
272
	 * @static
273
	 * @param string $string Windows-1252 encoded string
274
	 * @return string UTF-8 encoded string
275
	 */
276
	public static function windows_1252_to_utf8($string)
277
	{
278
		static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF");
279
280
		return strtr($string, $convert_table);
281
	}
282
283
	/**
284
	 * Change a string from one encoding to another
285
	 *
286
	 * @param string $data Raw data in $input encoding
287
	 * @param string $input Encoding of $data
288
	 * @param string $output Encoding you want
289
	 * @return string|boolean False if we can't convert it
290
	 */
291
	public static function change_encoding($data, $input, $output)
292
	{
293
		$input = SimplePie_Misc::encoding($input);
294
		$output = SimplePie_Misc::encoding($output);
295
296
		// We fail to fail on non US-ASCII bytes
297
		if ($input === 'US-ASCII')
298
		{
299
			static $non_ascii_octects = '';
300
			if (!$non_ascii_octects)
301
			{
302
				for ($i = 0x80; $i <= 0xFF; $i++)
303
				{
304
					$non_ascii_octects .= chr($i);
305
				}
306
			}
307
			$data = substr($data, 0, strcspn($data, $non_ascii_octects));
308
		}
309
310
		// This is first, as behaviour of this is completely predictable
311
		if ($input === 'windows-1252' && $output === 'UTF-8')
312
		{
313
			return SimplePie_Misc::windows_1252_to_utf8($data);
314
		}
315
		// This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
316
		elseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output)))
317
		{
318
			return $return;
319
 		}
320
		// This is last, as behaviour of this varies with OS userland and PHP version
321
		elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output)))
322
		{
323
			return $return;
324
		}
325
		// If we can't do anything, just fail
326
		else
327
		{
328
			return false;
329
		}
330
	}
331
332
	protected static function change_encoding_mbstring($data, $input, $output)
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
333
	{
334
		if ($input === 'windows-949')
335
		{
336
			$input = 'EUC-KR';
337
		}
338
		if ($output === 'windows-949')
339
		{
340
			$output = 'EUC-KR';
341
		}
342
		if ($input === 'Windows-31J')
343
		{
344
			$input = 'SJIS';
345
		}
346
		if ($output === 'Windows-31J')
347
		{
348
			$output = 'SJIS';
349
		}
350
351
		// Check that the encoding is supported
352
		if (@mb_convert_encoding("\x80", 'UTF-16BE', $input) === "\x00\x80")
353
		{
354
			return false;
355
		}
356
		if (!in_array($input, mb_list_encodings()))
357
		{
358
			return false;
359
		}
360
361
		// Let's do some conversion
362
		if ($return = @mb_convert_encoding($data, $output, $input))
363
		{
364
			return $return;
365
		}
366
367
		return false;
368
	}
369
370
	protected static function change_encoding_iconv($data, $input, $output)
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
371
	{
372
		return @iconv($input, $output, $data);
373
	}
374
375
	/**
376
	 * Normalize an encoding name
377
	 *
378
	 * This is automatically generated by create.php
379
	 *
380
	 * To generate it, run `php create.php` on the command line, and copy the
381
	 * output to replace this function.
382
	 *
383
	 * @param string $charset Character set to standardise
384
	 * @return string Standardised name
385
	 */
386
	public static function encoding($charset)
387
	{
388
		// Normalization from UTS #22
389
		switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset)))
390
		{
391
			case 'adobestandardencoding':
392
			case 'csadobestandardencoding':
393
				return 'Adobe-Standard-Encoding';
394
395
			case 'adobesymbolencoding':
396
			case 'cshppsmath':
397
				return 'Adobe-Symbol-Encoding';
398
399
			case 'ami1251':
400
			case 'amiga1251':
401
				return 'Amiga-1251';
402
403
			case 'ansix31101983':
404
			case 'csat5001983':
405
			case 'csiso99naplps':
406
			case 'isoir99':
407
			case 'naplps':
408
				return 'ANSI_X3.110-1983';
409
410
			case 'arabic7':
411
			case 'asmo449':
412
			case 'csiso89asmo449':
413
			case 'iso9036':
414
			case 'isoir89':
415
				return 'ASMO_449';
416
417
			case 'big5':
418
			case 'csbig5':
419
				return 'Big5';
420
421
			case 'big5hkscs':
422
				return 'Big5-HKSCS';
423
424
			case 'bocu1':
425
			case 'csbocu1':
426
				return 'BOCU-1';
427
428
			case 'brf':
429
			case 'csbrf':
430
				return 'BRF';
431
432
			case 'bs4730':
433
			case 'csiso4unitedkingdom':
434
			case 'gb':
435
			case 'iso646gb':
436
			case 'isoir4':
437
			case 'uk':
438
				return 'BS_4730';
439
440
			case 'bsviewdata':
441
			case 'csiso47bsviewdata':
442
			case 'isoir47':
443
				return 'BS_viewdata';
444
445
			case 'cesu8':
446
			case 'cscesu8':
447
				return 'CESU-8';
448
449
			case 'ca':
450
			case 'csa71':
451
			case 'csaz243419851':
452
			case 'csiso121canadian1':
453
			case 'iso646ca':
454
			case 'isoir121':
455
				return 'CSA_Z243.4-1985-1';
456
457
			case 'csa72':
458
			case 'csaz243419852':
459
			case 'csiso122canadian2':
460
			case 'iso646ca2':
461
			case 'isoir122':
462
				return 'CSA_Z243.4-1985-2';
463
464
			case 'csaz24341985gr':
465
			case 'csiso123csaz24341985gr':
466
			case 'isoir123':
467
				return 'CSA_Z243.4-1985-gr';
468
469
			case 'csiso139csn369103':
470
			case 'csn369103':
471
			case 'isoir139':
472
				return 'CSN_369103';
473
474
			case 'csdecmcs':
475
			case 'dec':
476
			case 'decmcs':
477
				return 'DEC-MCS';
478
479
			case 'csiso21german':
480
			case 'de':
481
			case 'din66003':
482
			case 'iso646de':
483
			case 'isoir21':
484
				return 'DIN_66003';
485
486
			case 'csdkus':
487
			case 'dkus':
488
				return 'dk-us';
489
490
			case 'csiso646danish':
491
			case 'dk':
492
			case 'ds2089':
493
			case 'iso646dk':
494
				return 'DS_2089';
495
496
			case 'csibmebcdicatde':
497
			case 'ebcdicatde':
498
				return 'EBCDIC-AT-DE';
499
500
			case 'csebcdicatdea':
501
			case 'ebcdicatdea':
502
				return 'EBCDIC-AT-DE-A';
503
504
			case 'csebcdiccafr':
505
			case 'ebcdiccafr':
506
				return 'EBCDIC-CA-FR';
507
508
			case 'csebcdicdkno':
509
			case 'ebcdicdkno':
510
				return 'EBCDIC-DK-NO';
511
512
			case 'csebcdicdknoa':
513
			case 'ebcdicdknoa':
514
				return 'EBCDIC-DK-NO-A';
515
516
			case 'csebcdices':
517
			case 'ebcdices':
518
				return 'EBCDIC-ES';
519
520
			case 'csebcdicesa':
521
			case 'ebcdicesa':
522
				return 'EBCDIC-ES-A';
523
524
			case 'csebcdicess':
525
			case 'ebcdicess':
526
				return 'EBCDIC-ES-S';
527
528
			case 'csebcdicfise':
529
			case 'ebcdicfise':
530
				return 'EBCDIC-FI-SE';
531
532
			case 'csebcdicfisea':
533
			case 'ebcdicfisea':
534
				return 'EBCDIC-FI-SE-A';
535
536
			case 'csebcdicfr':
537
			case 'ebcdicfr':
538
				return 'EBCDIC-FR';
539
540
			case 'csebcdicit':
541
			case 'ebcdicit':
542
				return 'EBCDIC-IT';
543
544
			case 'csebcdicpt':
545
			case 'ebcdicpt':
546
				return 'EBCDIC-PT';
547
548
			case 'csebcdicuk':
549
			case 'ebcdicuk':
550
				return 'EBCDIC-UK';
551
552
			case 'csebcdicus':
553
			case 'ebcdicus':
554
				return 'EBCDIC-US';
555
556
			case 'csiso111ecmacyrillic':
557
			case 'ecmacyrillic':
558
			case 'isoir111':
559
			case 'koi8e':
560
				return 'ECMA-cyrillic';
561
562
			case 'csiso17spanish':
563
			case 'es':
564
			case 'iso646es':
565
			case 'isoir17':
566
				return 'ES';
567
568
			case 'csiso85spanish2':
569
			case 'es2':
570
			case 'iso646es2':
571
			case 'isoir85':
572
				return 'ES2';
573
574
			case 'cseucpkdfmtjapanese':
575
			case 'eucjp':
576
			case 'extendedunixcodepackedformatforjapanese':
577
				return 'EUC-JP';
578
579
			case 'cseucfixwidjapanese':
580
			case 'extendedunixcodefixedwidthforjapanese':
581
				return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
582
583
			case 'gb18030':
584
				return 'GB18030';
585
586
			case 'chinese':
587
			case 'cp936':
588
			case 'csgb2312':
589
			case 'csiso58gb231280':
590
			case 'gb2312':
591
			case 'gb231280':
592
			case 'gbk':
593
			case 'isoir58':
594
			case 'ms936':
595
			case 'windows936':
596
				return 'GBK';
597
598
			case 'cn':
599
			case 'csiso57gb1988':
600
			case 'gb198880':
601
			case 'iso646cn':
602
			case 'isoir57':
603
				return 'GB_1988-80';
604
605
			case 'csiso153gost1976874':
606
			case 'gost1976874':
607
			case 'isoir153':
608
			case 'stsev35888':
609
				return 'GOST_19768-74';
610
611
			case 'csiso150':
612
			case 'csiso150greekccitt':
613
			case 'greekccitt':
614
			case 'isoir150':
615
				return 'greek-ccitt';
616
617
			case 'csiso88greek7':
618
			case 'greek7':
619
			case 'isoir88':
620
				return 'greek7';
621
622
			case 'csiso18greek7old':
623
			case 'greek7old':
624
			case 'isoir18':
625
				return 'greek7-old';
626
627
			case 'cshpdesktop':
628
			case 'hpdesktop':
629
				return 'HP-DeskTop';
630
631
			case 'cshplegal':
632
			case 'hplegal':
633
				return 'HP-Legal';
634
635
			case 'cshpmath8':
636
			case 'hpmath8':
637
				return 'HP-Math8';
638
639
			case 'cshppifont':
640
			case 'hppifont':
641
				return 'HP-Pi-font';
642
643
			case 'cshproman8':
644
			case 'hproman8':
645
			case 'r8':
646
			case 'roman8':
647
				return 'hp-roman8';
648
649
			case 'hzgb2312':
650
				return 'HZ-GB-2312';
651
652
			case 'csibmsymbols':
653
			case 'ibmsymbols':
654
				return 'IBM-Symbols';
655
656
			case 'csibmthai':
657
			case 'ibmthai':
658
				return 'IBM-Thai';
659
660
			case 'cp37':
661
			case 'csibm37':
662
			case 'ebcdiccpca':
663
			case 'ebcdiccpnl':
664
			case 'ebcdiccpus':
665
			case 'ebcdiccpwt':
666
			case 'ibm37':
667
				return 'IBM037';
668
669
			case 'cp38':
670
			case 'csibm38':
671
			case 'ebcdicint':
672
			case 'ibm38':
673
				return 'IBM038';
674
675
			case 'cp273':
676
			case 'csibm273':
677
			case 'ibm273':
678
				return 'IBM273';
679
680
			case 'cp274':
681
			case 'csibm274':
682
			case 'ebcdicbe':
683
			case 'ibm274':
684
				return 'IBM274';
685
686
			case 'cp275':
687
			case 'csibm275':
688
			case 'ebcdicbr':
689
			case 'ibm275':
690
				return 'IBM275';
691
692
			case 'csibm277':
693
			case 'ebcdiccpdk':
694
			case 'ebcdiccpno':
695
			case 'ibm277':
696
				return 'IBM277';
697
698
			case 'cp278':
699
			case 'csibm278':
700
			case 'ebcdiccpfi':
701
			case 'ebcdiccpse':
702
			case 'ibm278':
703
				return 'IBM278';
704
705
			case 'cp280':
706
			case 'csibm280':
707
			case 'ebcdiccpit':
708
			case 'ibm280':
709
				return 'IBM280';
710
711
			case 'cp281':
712
			case 'csibm281':
713
			case 'ebcdicjpe':
714
			case 'ibm281':
715
				return 'IBM281';
716
717
			case 'cp284':
718
			case 'csibm284':
719
			case 'ebcdiccpes':
720
			case 'ibm284':
721
				return 'IBM284';
722
723
			case 'cp285':
724
			case 'csibm285':
725
			case 'ebcdiccpgb':
726
			case 'ibm285':
727
				return 'IBM285';
728
729
			case 'cp290':
730
			case 'csibm290':
731
			case 'ebcdicjpkana':
732
			case 'ibm290':
733
				return 'IBM290';
734
735
			case 'cp297':
736
			case 'csibm297':
737
			case 'ebcdiccpfr':
738
			case 'ibm297':
739
				return 'IBM297';
740
741
			case 'cp420':
742
			case 'csibm420':
743
			case 'ebcdiccpar1':
744
			case 'ibm420':
745
				return 'IBM420';
746
747
			case 'cp423':
748
			case 'csibm423':
749
			case 'ebcdiccpgr':
750
			case 'ibm423':
751
				return 'IBM423';
752
753
			case 'cp424':
754
			case 'csibm424':
755
			case 'ebcdiccphe':
756
			case 'ibm424':
757
				return 'IBM424';
758
759
			case '437':
760
			case 'cp437':
761
			case 'cspc8codepage437':
762
			case 'ibm437':
763
				return 'IBM437';
764
765
			case 'cp500':
766
			case 'csibm500':
767
			case 'ebcdiccpbe':
768
			case 'ebcdiccpch':
769
			case 'ibm500':
770
				return 'IBM500';
771
772
			case 'cp775':
773
			case 'cspc775baltic':
774
			case 'ibm775':
775
				return 'IBM775';
776
777
			case '850':
778
			case 'cp850':
779
			case 'cspc850multilingual':
780
			case 'ibm850':
781
				return 'IBM850';
782
783
			case '851':
784
			case 'cp851':
785
			case 'csibm851':
786
			case 'ibm851':
787
				return 'IBM851';
788
789
			case '852':
790
			case 'cp852':
791
			case 'cspcp852':
792
			case 'ibm852':
793
				return 'IBM852';
794
795
			case '855':
796
			case 'cp855':
797
			case 'csibm855':
798
			case 'ibm855':
799
				return 'IBM855';
800
801
			case '857':
802
			case 'cp857':
803
			case 'csibm857':
804
			case 'ibm857':
805
				return 'IBM857';
806
807
			case 'ccsid858':
808
			case 'cp858':
809
			case 'ibm858':
810
			case 'pcmultilingual850euro':
811
				return 'IBM00858';
812
813
			case '860':
814
			case 'cp860':
815
			case 'csibm860':
816
			case 'ibm860':
817
				return 'IBM860';
818
819
			case '861':
820
			case 'cp861':
821
			case 'cpis':
822
			case 'csibm861':
823
			case 'ibm861':
824
				return 'IBM861';
825
826
			case '862':
827
			case 'cp862':
828
			case 'cspc862latinhebrew':
829
			case 'ibm862':
830
				return 'IBM862';
831
832
			case '863':
833
			case 'cp863':
834
			case 'csibm863':
835
			case 'ibm863':
836
				return 'IBM863';
837
838
			case 'cp864':
839
			case 'csibm864':
840
			case 'ibm864':
841
				return 'IBM864';
842
843
			case '865':
844
			case 'cp865':
845
			case 'csibm865':
846
			case 'ibm865':
847
				return 'IBM865';
848
849
			case '866':
850
			case 'cp866':
851
			case 'csibm866':
852
			case 'ibm866':
853
				return 'IBM866';
854
855
			case 'cp868':
856
			case 'cpar':
857
			case 'csibm868':
858
			case 'ibm868':
859
				return 'IBM868';
860
861
			case '869':
862
			case 'cp869':
863
			case 'cpgr':
864
			case 'csibm869':
865
			case 'ibm869':
866
				return 'IBM869';
867
868
			case 'cp870':
869
			case 'csibm870':
870
			case 'ebcdiccproece':
871
			case 'ebcdiccpyu':
872
			case 'ibm870':
873
				return 'IBM870';
874
875
			case 'cp871':
876
			case 'csibm871':
877
			case 'ebcdiccpis':
878
			case 'ibm871':
879
				return 'IBM871';
880
881
			case 'cp880':
882
			case 'csibm880':
883
			case 'ebcdiccyrillic':
884
			case 'ibm880':
885
				return 'IBM880';
886
887
			case 'cp891':
888
			case 'csibm891':
889
			case 'ibm891':
890
				return 'IBM891';
891
892
			case 'cp903':
893
			case 'csibm903':
894
			case 'ibm903':
895
				return 'IBM903';
896
897
			case '904':
898
			case 'cp904':
899
			case 'csibbm904':
900
			case 'ibm904':
901
				return 'IBM904';
902
903
			case 'cp905':
904
			case 'csibm905':
905
			case 'ebcdiccptr':
906
			case 'ibm905':
907
				return 'IBM905';
908
909
			case 'cp918':
910
			case 'csibm918':
911
			case 'ebcdiccpar2':
912
			case 'ibm918':
913
				return 'IBM918';
914
915
			case 'ccsid924':
916
			case 'cp924':
917
			case 'ebcdiclatin9euro':
918
			case 'ibm924':
919
				return 'IBM00924';
920
921
			case 'cp1026':
922
			case 'csibm1026':
923
			case 'ibm1026':
924
				return 'IBM1026';
925
926
			case 'ibm1047':
927
				return 'IBM1047';
928
929
			case 'ccsid1140':
930
			case 'cp1140':
931
			case 'ebcdicus37euro':
932
			case 'ibm1140':
933
				return 'IBM01140';
934
935
			case 'ccsid1141':
936
			case 'cp1141':
937
			case 'ebcdicde273euro':
938
			case 'ibm1141':
939
				return 'IBM01141';
940
941
			case 'ccsid1142':
942
			case 'cp1142':
943
			case 'ebcdicdk277euro':
944
			case 'ebcdicno277euro':
945
			case 'ibm1142':
946
				return 'IBM01142';
947
948
			case 'ccsid1143':
949
			case 'cp1143':
950
			case 'ebcdicfi278euro':
951
			case 'ebcdicse278euro':
952
			case 'ibm1143':
953
				return 'IBM01143';
954
955
			case 'ccsid1144':
956
			case 'cp1144':
957
			case 'ebcdicit280euro':
958
			case 'ibm1144':
959
				return 'IBM01144';
960
961
			case 'ccsid1145':
962
			case 'cp1145':
963
			case 'ebcdices284euro':
964
			case 'ibm1145':
965
				return 'IBM01145';
966
967
			case 'ccsid1146':
968
			case 'cp1146':
969
			case 'ebcdicgb285euro':
970
			case 'ibm1146':
971
				return 'IBM01146';
972
973
			case 'ccsid1147':
974
			case 'cp1147':
975
			case 'ebcdicfr297euro':
976
			case 'ibm1147':
977
				return 'IBM01147';
978
979
			case 'ccsid1148':
980
			case 'cp1148':
981
			case 'ebcdicinternational500euro':
982
			case 'ibm1148':
983
				return 'IBM01148';
984
985
			case 'ccsid1149':
986
			case 'cp1149':
987
			case 'ebcdicis871euro':
988
			case 'ibm1149':
989
				return 'IBM01149';
990
991
			case 'csiso143iecp271':
992
			case 'iecp271':
993
			case 'isoir143':
994
				return 'IEC_P27-1';
995
996
			case 'csiso49inis':
997
			case 'inis':
998
			case 'isoir49':
999
				return 'INIS';
1000
1001
			case 'csiso50inis8':
1002
			case 'inis8':
1003
			case 'isoir50':
1004
				return 'INIS-8';
1005
1006
			case 'csiso51iniscyrillic':
1007
			case 'iniscyrillic':
1008
			case 'isoir51':
1009
				return 'INIS-cyrillic';
1010
1011
			case 'csinvariant':
1012
			case 'invariant':
1013
				return 'INVARIANT';
1014
1015
			case 'iso2022cn':
1016
				return 'ISO-2022-CN';
1017
1018
			case 'iso2022cnext':
1019
				return 'ISO-2022-CN-EXT';
1020
1021
			case 'csiso2022jp':
1022
			case 'iso2022jp':
1023
				return 'ISO-2022-JP';
1024
1025
			case 'csiso2022jp2':
1026
			case 'iso2022jp2':
1027
				return 'ISO-2022-JP-2';
1028
1029
			case 'csiso2022kr':
1030
			case 'iso2022kr':
1031
				return 'ISO-2022-KR';
1032
1033
			case 'cswindows30latin1':
1034
			case 'iso88591windows30latin1':
1035
				return 'ISO-8859-1-Windows-3.0-Latin-1';
1036
1037
			case 'cswindows31latin1':
1038
			case 'iso88591windows31latin1':
1039
				return 'ISO-8859-1-Windows-3.1-Latin-1';
1040
1041
			case 'csisolatin2':
1042
			case 'iso88592':
1043
			case 'iso885921987':
1044
			case 'isoir101':
1045
			case 'l2':
1046
			case 'latin2':
1047
				return 'ISO-8859-2';
1048
1049
			case 'cswindows31latin2':
1050
			case 'iso88592windowslatin2':
1051
				return 'ISO-8859-2-Windows-Latin-2';
1052
1053
			case 'csisolatin3':
1054
			case 'iso88593':
1055
			case 'iso885931988':
1056
			case 'isoir109':
1057
			case 'l3':
1058
			case 'latin3':
1059
				return 'ISO-8859-3';
1060
1061
			case 'csisolatin4':
1062
			case 'iso88594':
1063
			case 'iso885941988':
1064
			case 'isoir110':
1065
			case 'l4':
1066
			case 'latin4':
1067
				return 'ISO-8859-4';
1068
1069
			case 'csisolatincyrillic':
1070
			case 'cyrillic':
1071
			case 'iso88595':
1072
			case 'iso885951988':
1073
			case 'isoir144':
1074
				return 'ISO-8859-5';
1075
1076
			case 'arabic':
1077
			case 'asmo708':
1078
			case 'csisolatinarabic':
1079
			case 'ecma114':
1080
			case 'iso88596':
1081
			case 'iso885961987':
1082
			case 'isoir127':
1083
				return 'ISO-8859-6';
1084
1085
			case 'csiso88596e':
1086
			case 'iso88596e':
1087
				return 'ISO-8859-6-E';
1088
1089
			case 'csiso88596i':
1090
			case 'iso88596i':
1091
				return 'ISO-8859-6-I';
1092
1093
			case 'csisolatingreek':
1094
			case 'ecma118':
1095
			case 'elot928':
1096
			case 'greek':
1097
			case 'greek8':
1098
			case 'iso88597':
1099
			case 'iso885971987':
1100
			case 'isoir126':
1101
				return 'ISO-8859-7';
1102
1103
			case 'csisolatinhebrew':
1104
			case 'hebrew':
1105
			case 'iso88598':
1106
			case 'iso885981988':
1107
			case 'isoir138':
1108
				return 'ISO-8859-8';
1109
1110
			case 'csiso88598e':
1111
			case 'iso88598e':
1112
				return 'ISO-8859-8-E';
1113
1114
			case 'csiso88598i':
1115
			case 'iso88598i':
1116
				return 'ISO-8859-8-I';
1117
1118
			case 'cswindows31latin5':
1119
			case 'iso88599windowslatin5':
1120
				return 'ISO-8859-9-Windows-Latin-5';
1121
1122
			case 'csisolatin6':
1123
			case 'iso885910':
1124
			case 'iso8859101992':
1125
			case 'isoir157':
1126
			case 'l6':
1127
			case 'latin6':
1128
				return 'ISO-8859-10';
1129
1130
			case 'iso885913':
1131
				return 'ISO-8859-13';
1132
1133
			case 'iso885914':
1134
			case 'iso8859141998':
1135
			case 'isoceltic':
1136
			case 'isoir199':
1137
			case 'l8':
1138
			case 'latin8':
1139
				return 'ISO-8859-14';
1140
1141
			case 'iso885915':
1142
			case 'latin9':
1143
				return 'ISO-8859-15';
1144
1145
			case 'iso885916':
1146
			case 'iso8859162001':
1147
			case 'isoir226':
1148
			case 'l10':
1149
			case 'latin10':
1150
				return 'ISO-8859-16';
1151
1152
			case 'iso10646j1':
1153
				return 'ISO-10646-J-1';
1154
1155
			case 'csunicode':
1156
			case 'iso10646ucs2':
1157
				return 'ISO-10646-UCS-2';
1158
1159
			case 'csucs4':
1160
			case 'iso10646ucs4':
1161
				return 'ISO-10646-UCS-4';
1162
1163
			case 'csunicodeascii':
1164
			case 'iso10646ucsbasic':
1165
				return 'ISO-10646-UCS-Basic';
1166
1167
			case 'csunicodelatin1':
1168
			case 'iso10646':
1169
			case 'iso10646unicodelatin1':
1170
				return 'ISO-10646-Unicode-Latin1';
1171
1172
			case 'csiso10646utf1':
1173
			case 'iso10646utf1':
1174
				return 'ISO-10646-UTF-1';
1175
1176
			case 'csiso115481':
1177
			case 'iso115481':
1178
			case 'isotr115481':
1179
				return 'ISO-11548-1';
1180
1181
			case 'csiso90':
1182
			case 'isoir90':
1183
				return 'iso-ir-90';
1184
1185
			case 'csunicodeibm1261':
1186
			case 'isounicodeibm1261':
1187
				return 'ISO-Unicode-IBM-1261';
1188
1189
			case 'csunicodeibm1264':
1190
			case 'isounicodeibm1264':
1191
				return 'ISO-Unicode-IBM-1264';
1192
1193
			case 'csunicodeibm1265':
1194
			case 'isounicodeibm1265':
1195
				return 'ISO-Unicode-IBM-1265';
1196
1197
			case 'csunicodeibm1268':
1198
			case 'isounicodeibm1268':
1199
				return 'ISO-Unicode-IBM-1268';
1200
1201
			case 'csunicodeibm1276':
1202
			case 'isounicodeibm1276':
1203
				return 'ISO-Unicode-IBM-1276';
1204
1205
			case 'csiso646basic1983':
1206
			case 'iso646basic1983':
1207
			case 'ref':
1208
				return 'ISO_646.basic:1983';
1209
1210
			case 'csiso2intlrefversion':
1211
			case 'irv':
1212
			case 'iso646irv1983':
1213
			case 'isoir2':
1214
				return 'ISO_646.irv:1983';
1215
1216
			case 'csiso2033':
1217
			case 'e13b':
1218
			case 'iso20331983':
1219
			case 'isoir98':
1220
				return 'ISO_2033-1983';
1221
1222
			case 'csiso5427cyrillic':
1223
			case 'iso5427':
1224
			case 'isoir37':
1225
				return 'ISO_5427';
1226
1227
			case 'iso5427cyrillic1981':
1228
			case 'iso54271981':
1229
			case 'isoir54':
1230
				return 'ISO_5427:1981';
1231
1232
			case 'csiso5428greek':
1233
			case 'iso54281980':
1234
			case 'isoir55':
1235
				return 'ISO_5428:1980';
1236
1237
			case 'csiso6937add':
1238
			case 'iso6937225':
1239
			case 'isoir152':
1240
				return 'ISO_6937-2-25';
1241
1242
			case 'csisotextcomm':
1243
			case 'iso69372add':
1244
			case 'isoir142':
1245
				return 'ISO_6937-2-add';
1246
1247
			case 'csiso8859supp':
1248
			case 'iso8859supp':
1249
			case 'isoir154':
1250
			case 'latin125':
1251
				return 'ISO_8859-supp';
1252
1253
			case 'csiso10367box':
1254
			case 'iso10367box':
1255
			case 'isoir155':
1256
				return 'ISO_10367-box';
1257
1258
			case 'csiso15italian':
1259
			case 'iso646it':
1260
			case 'isoir15':
1261
			case 'it':
1262
				return 'IT';
1263
1264
			case 'csiso13jisc6220jp':
1265
			case 'isoir13':
1266
			case 'jisc62201969':
1267
			case 'jisc62201969jp':
1268
			case 'katakana':
1269
			case 'x2017':
1270
				return 'JIS_C6220-1969-jp';
1271
1272
			case 'csiso14jisc6220ro':
1273
			case 'iso646jp':
1274
			case 'isoir14':
1275
			case 'jisc62201969ro':
1276
			case 'jp':
1277
				return 'JIS_C6220-1969-ro';
1278
1279
			case 'csiso42jisc62261978':
1280
			case 'isoir42':
1281
			case 'jisc62261978':
1282
				return 'JIS_C6226-1978';
1283
1284
			case 'csiso87jisx208':
1285
			case 'isoir87':
1286
			case 'jisc62261983':
1287
			case 'jisx2081983':
1288
			case 'x208':
1289
				return 'JIS_C6226-1983';
1290
1291
			case 'csiso91jisc62291984a':
1292
			case 'isoir91':
1293
			case 'jisc62291984a':
1294
			case 'jpocra':
1295
				return 'JIS_C6229-1984-a';
1296
1297
			case 'csiso92jisc62991984b':
1298
			case 'iso646jpocrb':
1299
			case 'isoir92':
1300
			case 'jisc62291984b':
1301
			case 'jpocrb':
1302
				return 'JIS_C6229-1984-b';
1303
1304
			case 'csiso93jis62291984badd':
1305
			case 'isoir93':
1306
			case 'jisc62291984badd':
1307
			case 'jpocrbadd':
1308
				return 'JIS_C6229-1984-b-add';
1309
1310
			case 'csiso94jis62291984hand':
1311
			case 'isoir94':
1312
			case 'jisc62291984hand':
1313
			case 'jpocrhand':
1314
				return 'JIS_C6229-1984-hand';
1315
1316
			case 'csiso95jis62291984handadd':
1317
			case 'isoir95':
1318
			case 'jisc62291984handadd':
1319
			case 'jpocrhandadd':
1320
				return 'JIS_C6229-1984-hand-add';
1321
1322
			case 'csiso96jisc62291984kana':
1323
			case 'isoir96':
1324
			case 'jisc62291984kana':
1325
				return 'JIS_C6229-1984-kana';
1326
1327
			case 'csjisencoding':
1328
			case 'jisencoding':
1329
				return 'JIS_Encoding';
1330
1331
			case 'cshalfwidthkatakana':
1332
			case 'jisx201':
1333
			case 'x201':
1334
				return 'JIS_X0201';
1335
1336
			case 'csiso159jisx2121990':
1337
			case 'isoir159':
1338
			case 'jisx2121990':
1339
			case 'x212':
1340
				return 'JIS_X0212-1990';
1341
1342
			case 'csiso141jusib1002':
1343
			case 'iso646yu':
1344
			case 'isoir141':
1345
			case 'js':
1346
			case 'jusib1002':
1347
			case 'yu':
1348
				return 'JUS_I.B1.002';
1349
1350
			case 'csiso147macedonian':
1351
			case 'isoir147':
1352
			case 'jusib1003mac':
1353
			case 'macedonian':
1354
				return 'JUS_I.B1.003-mac';
1355
1356
			case 'csiso146serbian':
1357
			case 'isoir146':
1358
			case 'jusib1003serb':
1359
			case 'serbian':
1360
				return 'JUS_I.B1.003-serb';
1361
1362
			case 'koi7switched':
1363
				return 'KOI7-switched';
1364
1365
			case 'cskoi8r':
1366
			case 'koi8r':
1367
				return 'KOI8-R';
1368
1369
			case 'koi8u':
1370
				return 'KOI8-U';
1371
1372
			case 'csksc5636':
1373
			case 'iso646kr':
1374
			case 'ksc5636':
1375
				return 'KSC5636';
1376
1377
			case 'cskz1048':
1378
			case 'kz1048':
1379
			case 'rk1048':
1380
			case 'strk10482002':
1381
				return 'KZ-1048';
1382
1383
			case 'csiso19latingreek':
1384
			case 'isoir19':
1385
			case 'latingreek':
1386
				return 'latin-greek';
1387
1388
			case 'csiso27latingreek1':
1389
			case 'isoir27':
1390
			case 'latingreek1':
1391
				return 'Latin-greek-1';
1392
1393
			case 'csiso158lap':
1394
			case 'isoir158':
1395
			case 'lap':
1396
			case 'latinlap':
1397
				return 'latin-lap';
1398
1399
			case 'csmacintosh':
1400
			case 'mac':
1401
			case 'macintosh':
1402
				return 'macintosh';
1403
1404
			case 'csmicrosoftpublishing':
1405
			case 'microsoftpublishing':
1406
				return 'Microsoft-Publishing';
1407
1408
			case 'csmnem':
1409
			case 'mnem':
1410
				return 'MNEM';
1411
1412
			case 'csmnemonic':
1413
			case 'mnemonic':
1414
				return 'MNEMONIC';
1415
1416
			case 'csiso86hungarian':
1417
			case 'hu':
1418
			case 'iso646hu':
1419
			case 'isoir86':
1420
			case 'msz77953':
1421
				return 'MSZ_7795.3';
1422
1423
			case 'csnatsdano':
1424
			case 'isoir91':
1425
			case 'natsdano':
1426
				return 'NATS-DANO';
1427
1428
			case 'csnatsdanoadd':
1429
			case 'isoir92':
1430
			case 'natsdanoadd':
1431
				return 'NATS-DANO-ADD';
1432
1433
			case 'csnatssefi':
1434
			case 'isoir81':
1435
			case 'natssefi':
1436
				return 'NATS-SEFI';
1437
1438
			case 'csnatssefiadd':
1439
			case 'isoir82':
1440
			case 'natssefiadd':
1441
				return 'NATS-SEFI-ADD';
1442
1443
			case 'csiso151cuba':
1444
			case 'cuba':
1445
			case 'iso646cu':
1446
			case 'isoir151':
1447
			case 'ncnc1081':
1448
				return 'NC_NC00-10:81';
1449
1450
			case 'csiso69french':
1451
			case 'fr':
1452
			case 'iso646fr':
1453
			case 'isoir69':
1454
			case 'nfz62010':
1455
				return 'NF_Z_62-010';
1456
1457
			case 'csiso25french':
1458
			case 'iso646fr1':
1459
			case 'isoir25':
1460
			case 'nfz620101973':
1461
				return 'NF_Z_62-010_(1973)';
1462
1463
			case 'csiso60danishnorwegian':
1464
			case 'csiso60norwegian1':
1465
			case 'iso646no':
1466
			case 'isoir60':
1467
			case 'no':
1468
			case 'ns45511':
1469
				return 'NS_4551-1';
1470
1471
			case 'csiso61norwegian2':
1472
			case 'iso646no2':
1473
			case 'isoir61':
1474
			case 'no2':
1475
			case 'ns45512':
1476
				return 'NS_4551-2';
1477
1478
			case 'osdebcdicdf3irv':
1479
				return 'OSD_EBCDIC_DF03_IRV';
1480
1481
			case 'osdebcdicdf41':
1482
				return 'OSD_EBCDIC_DF04_1';
1483
1484
			case 'osdebcdicdf415':
1485
				return 'OSD_EBCDIC_DF04_15';
1486
1487
			case 'cspc8danishnorwegian':
1488
			case 'pc8danishnorwegian':
1489
				return 'PC8-Danish-Norwegian';
1490
1491
			case 'cspc8turkish':
1492
			case 'pc8turkish':
1493
				return 'PC8-Turkish';
1494
1495
			case 'csiso16portuguese':
1496
			case 'iso646pt':
1497
			case 'isoir16':
1498
			case 'pt':
1499
				return 'PT';
1500
1501
			case 'csiso84portuguese2':
1502
			case 'iso646pt2':
1503
			case 'isoir84':
1504
			case 'pt2':
1505
				return 'PT2';
1506
1507
			case 'cp154':
1508
			case 'csptcp154':
1509
			case 'cyrillicasian':
1510
			case 'pt154':
1511
			case 'ptcp154':
1512
				return 'PTCP154';
1513
1514
			case 'scsu':
1515
				return 'SCSU';
1516
1517
			case 'csiso10swedish':
1518
			case 'fi':
1519
			case 'iso646fi':
1520
			case 'iso646se':
1521
			case 'isoir10':
1522
			case 'se':
1523
			case 'sen850200b':
1524
				return 'SEN_850200_B';
1525
1526
			case 'csiso11swedishfornames':
1527
			case 'iso646se2':
1528
			case 'isoir11':
1529
			case 'se2':
1530
			case 'sen850200c':
1531
				return 'SEN_850200_C';
1532
1533
			case 'csiso102t617bit':
1534
			case 'isoir102':
1535
			case 't617bit':
1536
				return 'T.61-7bit';
1537
1538
			case 'csiso103t618bit':
1539
			case 'isoir103':
1540
			case 't61':
1541
			case 't618bit':
1542
				return 'T.61-8bit';
1543
1544
			case 'csiso128t101g2':
1545
			case 'isoir128':
1546
			case 't101g2':
1547
				return 'T.101-G2';
1548
1549
			case 'cstscii':
1550
			case 'tscii':
1551
				return 'TSCII';
1552
1553
			case 'csunicode11':
1554
			case 'unicode11':
1555
				return 'UNICODE-1-1';
1556
1557
			case 'csunicode11utf7':
1558
			case 'unicode11utf7':
1559
				return 'UNICODE-1-1-UTF-7';
1560
1561
			case 'csunknown8bit':
1562
			case 'unknown8bit':
1563
				return 'UNKNOWN-8BIT';
1564
1565
			case 'ansix341968':
1566
			case 'ansix341986':
1567
			case 'ascii':
1568
			case 'cp367':
1569
			case 'csascii':
1570
			case 'ibm367':
1571
			case 'iso646irv1991':
1572
			case 'iso646us':
1573
			case 'isoir6':
1574
			case 'us':
1575
			case 'usascii':
1576
				return 'US-ASCII';
1577
1578
			case 'csusdk':
1579
			case 'usdk':
1580
				return 'us-dk';
1581
1582
			case 'utf7':
1583
				return 'UTF-7';
1584
1585
			case 'utf8':
1586
				return 'UTF-8';
1587
1588
			case 'utf16':
1589
				return 'UTF-16';
1590
1591
			case 'utf16be':
1592
				return 'UTF-16BE';
1593
1594
			case 'utf16le':
1595
				return 'UTF-16LE';
1596
1597
			case 'utf32':
1598
				return 'UTF-32';
1599
1600
			case 'utf32be':
1601
				return 'UTF-32BE';
1602
1603
			case 'utf32le':
1604
				return 'UTF-32LE';
1605
1606
			case 'csventurainternational':
1607
			case 'venturainternational':
1608
				return 'Ventura-International';
1609
1610
			case 'csventuramath':
1611
			case 'venturamath':
1612
				return 'Ventura-Math';
1613
1614
			case 'csventuraus':
1615
			case 'venturaus':
1616
				return 'Ventura-US';
1617
1618
			case 'csiso70videotexsupp1':
1619
			case 'isoir70':
1620
			case 'videotexsuppl':
1621
				return 'videotex-suppl';
1622
1623
			case 'csviqr':
1624
			case 'viqr':
1625
				return 'VIQR';
1626
1627
			case 'csviscii':
1628
			case 'viscii':
1629
				return 'VISCII';
1630
1631
			case 'csshiftjis':
1632
			case 'cswindows31j':
1633
			case 'mskanji':
1634
			case 'shiftjis':
1635
			case 'windows31j':
1636
				return 'Windows-31J';
1637
1638
			case 'iso885911':
1639
			case 'tis620':
1640
				return 'windows-874';
1641
1642
			case 'cseuckr':
1643
			case 'csksc56011987':
1644
			case 'euckr':
1645
			case 'isoir149':
1646
			case 'korean':
1647
			case 'ksc5601':
1648
			case 'ksc56011987':
1649
			case 'ksc56011989':
1650
			case 'windows949':
1651
				return 'windows-949';
1652
1653
			case 'windows1250':
1654
				return 'windows-1250';
1655
1656
			case 'windows1251':
1657
				return 'windows-1251';
1658
1659
			case 'cp819':
1660
			case 'csisolatin1':
1661
			case 'ibm819':
1662
			case 'iso88591':
1663
			case 'iso885911987':
1664
			case 'isoir100':
1665
			case 'l1':
1666
			case 'latin1':
1667
			case 'windows1252':
1668
				return 'windows-1252';
1669
1670
			case 'windows1253':
1671
				return 'windows-1253';
1672
1673
			case 'csisolatin5':
1674
			case 'iso88599':
1675
			case 'iso885991989':
1676
			case 'isoir148':
1677
			case 'l5':
1678
			case 'latin5':
1679
			case 'windows1254':
1680
				return 'windows-1254';
1681
1682
			case 'windows1255':
1683
				return 'windows-1255';
1684
1685
			case 'windows1256':
1686
				return 'windows-1256';
1687
1688
			case 'windows1257':
1689
				return 'windows-1257';
1690
1691
			case 'windows1258':
1692
				return 'windows-1258';
1693
1694
			default:
1695
				return $charset;
1696
		}
1697
	}
1698
1699
	public static function get_curl_version()
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
1700
	{
1701
		if (is_array($curl = curl_version()))
1702
		{
1703
			$curl = $curl['version'];
1704
		}
1705 View Code Duplication
		elseif (substr($curl, 0, 5) === 'curl/')
1706
		{
1707
			$curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
1708
		}
1709 View Code Duplication
		elseif (substr($curl, 0, 8) === 'libcurl/')
1710
		{
1711
			$curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
1712
		}
1713
		else
1714
		{
1715
			$curl = 0;
1716
		}
1717
		return $curl;
1718
	}
1719
1720
	/**
1721
	 * Strip HTML comments
1722
	 *
1723
	 * @param string $data Data to strip comments from
1724
	 * @return string Comment stripped string
1725
	 */
1726
	public static function strip_comments($data)
1727
	{
1728
		$output = '';
1729
		while (($start = strpos($data, '<!--')) !== false)
1730
		{
1731
			$output .= substr($data, 0, $start);
1732
			if (($end = strpos($data, '-->', $start)) !== false)
1733
			{
1734
				$data = substr_replace($data, '', 0, $end + 3);
1735
			}
1736
			else
1737
			{
1738
				$data = '';
1739
			}
1740
		}
1741
		return $output . $data;
1742
	}
1743
1744
	public static function parse_date($dt)
1745
	{
1746
		$parser = SimplePie_Parse_Date::get();
1747
		return $parser->parse($dt);
1748
	}
1749
1750
	/**
1751
	 * Decode HTML entities
1752
	 *
1753
	 * @deprecated Use DOMDocument instead
1754
	 * @param string $data Input data
1755
	 * @return string Output data
1756
	 */
1757
	public static function entities_decode($data)
1758
	{
1759
		$decoder = new SimplePie_Decode_HTML_Entities($data);
0 ignored issues
show
Deprecated Code introduced by
The class SimplePie_Decode_HTML_Entities has been deprecated with message: Use DOMDocument instead!

This class, trait or interface has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the type will be removed from the class and what other constant to use instead.

Loading history...
1760
		return $decoder->parse();
1761
	}
1762
1763
	/**
1764
	 * Remove RFC822 comments
1765
	 *
1766
	 * @param string $data Data to strip comments from
0 ignored issues
show
Bug introduced by
There is no parameter named $data. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
1767
	 * @return string Comment stripped string
1768
	 */
1769 View Code Duplication
	public static function uncomment_rfc822($string)
1770
	{
1771
		$string = (string) $string;
1772
		$position = 0;
1773
		$length = strlen($string);
1774
		$depth = 0;
1775
1776
		$output = '';
1777
1778
		while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
1779
		{
1780
			$output .= substr($string, $position, $pos - $position);
1781
			$position = $pos + 1;
1782
			if ($string[$pos - 1] !== '\\')
1783
			{
1784
				$depth++;
1785
				while ($depth && $position < $length)
1786
				{
1787
					$position += strcspn($string, '()', $position);
1788
					if ($string[$position - 1] === '\\')
1789
					{
1790
						$position++;
1791
						continue;
1792
					}
1793
					elseif (isset($string[$position]))
1794
					{
1795
						switch ($string[$position])
1796
						{
1797
							case '(':
1798
								$depth++;
1799
								break;
1800
1801
							case ')':
1802
								$depth--;
1803
								break;
1804
						}
1805
						$position++;
1806
					}
1807
					else
1808
					{
1809
						break;
1810
					}
1811
				}
1812
			}
1813
			else
1814
			{
1815
				$output .= '(';
1816
			}
1817
		}
1818
		$output .= substr($string, $position);
1819
1820
		return $output;
1821
	}
1822
1823
	public static function parse_mime($mime)
1824
	{
1825
		if (($pos = strpos($mime, ';')) === false)
1826
		{
1827
			return trim($mime);
1828
		}
1829
		else
1830
		{
1831
			return trim(substr($mime, 0, $pos));
1832
		}
1833
	}
1834
1835
	public static function atom_03_construct_type($attribs)
1836
	{
1837
		if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64'))
1838
		{
1839
			$mode = SIMPLEPIE_CONSTRUCT_BASE64;
1840
		}
1841
		else
1842
		{
1843
			$mode = SIMPLEPIE_CONSTRUCT_NONE;
1844
		}
1845
		if (isset($attribs['']['type']))
1846
		{
1847
			switch (strtolower(trim($attribs['']['type'])))
1848
			{
1849
				case 'text':
1850
				case 'text/plain':
1851
					return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
1852
1853
				case 'html':
1854
				case 'text/html':
1855
					return SIMPLEPIE_CONSTRUCT_HTML | $mode;
1856
1857
				case 'xhtml':
1858
				case 'application/xhtml+xml':
1859
					return SIMPLEPIE_CONSTRUCT_XHTML | $mode;
1860
1861
				default:
1862
					return SIMPLEPIE_CONSTRUCT_NONE | $mode;
1863
			}
1864
		}
1865
		else
1866
		{
1867
			return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
1868
		}
1869
	}
1870
1871
	public static function atom_10_construct_type($attribs)
1872
	{
1873
		if (isset($attribs['']['type']))
1874
		{
1875
			switch (strtolower(trim($attribs['']['type'])))
1876
			{
1877
				case 'text':
1878
					return SIMPLEPIE_CONSTRUCT_TEXT;
1879
1880
				case 'html':
1881
					return SIMPLEPIE_CONSTRUCT_HTML;
1882
1883
				case 'xhtml':
1884
					return SIMPLEPIE_CONSTRUCT_XHTML;
1885
1886
				default:
1887
					return SIMPLEPIE_CONSTRUCT_NONE;
1888
			}
1889
		}
1890
		return SIMPLEPIE_CONSTRUCT_TEXT;
1891
	}
1892
1893
	public static function atom_10_content_construct_type($attribs)
1894
	{
1895
		if (isset($attribs['']['type']))
1896
		{
1897
			$type = strtolower(trim($attribs['']['type']));
1898
			switch ($type)
1899
			{
1900
				case 'text':
1901
					return SIMPLEPIE_CONSTRUCT_TEXT;
1902
1903
				case 'html':
1904
					return SIMPLEPIE_CONSTRUCT_HTML;
1905
1906
				case 'xhtml':
1907
					return SIMPLEPIE_CONSTRUCT_XHTML;
1908
			}
1909
			if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/')
1910
			{
1911
				return SIMPLEPIE_CONSTRUCT_NONE;
1912
			}
1913
			else
1914
			{
1915
				return SIMPLEPIE_CONSTRUCT_BASE64;
1916
			}
1917
		}
1918
		else
1919
		{
1920
			return SIMPLEPIE_CONSTRUCT_TEXT;
1921
		}
1922
	}
1923
1924
	public static function is_isegment_nz_nc($string)
1925
	{
1926
		return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);
1927
	}
1928
1929
	public static function space_seperated_tokens($string)
1930
	{
1931
		$space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
1932
		$string_length = strlen($string);
1933
1934
		$position = strspn($string, $space_characters);
1935
		$tokens = array();
1936
1937
		while ($position < $string_length)
1938
		{
1939
			$len = strcspn($string, $space_characters, $position);
1940
			$tokens[] = substr($string, $position, $len);
1941
			$position += $len;
1942
			$position += strspn($string, $space_characters, $position);
1943
		}
1944
1945
		return $tokens;
1946
	}
1947
1948
	/**
1949
	 * Converts a unicode codepoint to a UTF-8 character
1950
	 *
1951
	 * @static
1952
	 * @param int $codepoint Unicode codepoint
1953
	 * @return string UTF-8 character
0 ignored issues
show
Documentation introduced by
Should the return type not be false|string?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
1954
	 */
1955
	public static function codepoint_to_utf8($codepoint)
1956
	{
1957
		$codepoint = (int) $codepoint;
1958
		if ($codepoint < 0)
1959
		{
1960
			return false;
1961
		}
1962
		else if ($codepoint <= 0x7f)
1963
		{
1964
			return chr($codepoint);
1965
		}
1966
		else if ($codepoint <= 0x7ff)
1967
		{
1968
			return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
1969
		}
1970
		else if ($codepoint <= 0xffff)
1971
		{
1972
			return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
1973
		}
1974
		else if ($codepoint <= 0x10ffff)
1975
		{
1976
			return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
1977
		}
1978
		else
1979
		{
1980
			// U+FFFD REPLACEMENT CHARACTER
1981
			return "\xEF\xBF\xBD";
1982
		}
1983
	}
1984
1985
	/**
1986
	 * Similar to parse_str()
1987
	 *
1988
	 * Returns an associative array of name/value pairs, where the value is an
1989
	 * array of values that have used the same name
1990
	 *
1991
	 * @static
1992
	 * @param string $str The input string.
1993
	 * @return array
1994
	 */
1995
	public static function parse_str($str)
1996
	{
1997
		$return = array();
1998
		$str = explode('&', $str);
1999
2000
		foreach ($str as $section)
2001
		{
2002
			if (strpos($section, '=') !== false)
2003
			{
2004
				list($name, $value) = explode('=', $section, 2);
2005
				$return[urldecode($name)][] = urldecode($value);
2006
			}
2007
			else
2008
			{
2009
				$return[urldecode($section)][] = null;
2010
			}
2011
		}
2012
2013
		return $return;
2014
	}
2015
2016
	/**
2017
	 * Detect XML encoding, as per XML 1.0 Appendix F.1
2018
	 *
2019
	 * @todo Add support for EBCDIC
2020
	 * @param string $data XML data
2021
	 * @param SimplePie_Registry $registry Class registry
2022
	 * @return array Possible encodings
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use string[].

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
2023
	 */
2024
	public static function xml_encoding($data, $registry)
2025
	{
2026
		// UTF-32 Big Endian BOM
2027
		if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
2028
		{
2029
			$encoding[] = 'UTF-32BE';
0 ignored issues
show
Coding Style Comprehensibility introduced by
$encoding was never initialized. Although not strictly required by PHP, it is generally a good practice to add $encoding = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
2030
		}
2031
		// UTF-32 Little Endian BOM
2032
		elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
2033
		{
2034
			$encoding[] = 'UTF-32LE';
0 ignored issues
show
Coding Style Comprehensibility introduced by
$encoding was never initialized. Although not strictly required by PHP, it is generally a good practice to add $encoding = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
2035
		}
2036
		// UTF-16 Big Endian BOM
2037
		elseif (substr($data, 0, 2) === "\xFE\xFF")
2038
		{
2039
			$encoding[] = 'UTF-16BE';
0 ignored issues
show
Coding Style Comprehensibility introduced by
$encoding was never initialized. Although not strictly required by PHP, it is generally a good practice to add $encoding = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
2040
		}
2041
		// UTF-16 Little Endian BOM
2042
		elseif (substr($data, 0, 2) === "\xFF\xFE")
2043
		{
2044
			$encoding[] = 'UTF-16LE';
0 ignored issues
show
Coding Style Comprehensibility introduced by
$encoding was never initialized. Although not strictly required by PHP, it is generally a good practice to add $encoding = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
2045
		}
2046
		// UTF-8 BOM
2047
		elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
2048
		{
2049
			$encoding[] = 'UTF-8';
0 ignored issues
show
Coding Style Comprehensibility introduced by
$encoding was never initialized. Although not strictly required by PHP, it is generally a good practice to add $encoding = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
2050
		}
2051
		// UTF-32 Big Endian Without BOM
2052 View Code Duplication
		elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C")
2053
		{
2054
			if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
2055
			{
2056
				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')));
2057
				if ($parser->parse())
2058
				{
2059
					$encoding[] = $parser->encoding;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$encoding was never initialized. Although not strictly required by PHP, it is generally a good practice to add $encoding = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
2060
				}
2061
			}
2062
			$encoding[] = 'UTF-32BE';
0 ignored issues
show
Bug introduced by
The variable $encoding does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
2063
		}
2064
		// UTF-32 Little Endian Without BOM
2065 View Code Duplication
		elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00")
2066
		{
2067
			if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
2068
			{
2069
				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')));
2070
				if ($parser->parse())
2071
				{
2072
					$encoding[] = $parser->encoding;
2073
				}
2074
			}
2075
			$encoding[] = 'UTF-32LE';
2076
		}
2077
		// UTF-16 Big Endian Without BOM
2078 View Code Duplication
		elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
2079
		{
2080
			if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
2081
			{
2082
				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')));
2083
				if ($parser->parse())
2084
				{
2085
					$encoding[] = $parser->encoding;
2086
				}
2087
			}
2088
			$encoding[] = 'UTF-16BE';
2089
		}
2090
		// UTF-16 Little Endian Without BOM
2091 View Code Duplication
		elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
2092
		{
2093
			if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
2094
			{
2095
				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')));
2096
				if ($parser->parse())
2097
				{
2098
					$encoding[] = $parser->encoding;
2099
				}
2100
			}
2101
			$encoding[] = 'UTF-16LE';
2102
		}
2103
		// US-ASCII (or superset)
2104 View Code Duplication
		elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
2105
		{
2106
			if ($pos = strpos($data, "\x3F\x3E"))
2107
			{
2108
				$parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
2109
				if ($parser->parse())
2110
				{
2111
					$encoding[] = $parser->encoding;
2112
				}
2113
			}
2114
			$encoding[] = 'UTF-8';
2115
		}
2116
		// Fallback to UTF-8
2117
		else
2118
		{
2119
			$encoding[] = 'UTF-8';
2120
		}
2121
		return $encoding;
2122
	}
2123
2124
	public static function output_javascript()
2125
	{
2126
		if (function_exists('ob_gzhandler'))
2127
		{
2128
			ob_start('ob_gzhandler');
2129
		}
2130
		header('Content-type: text/javascript; charset: UTF-8');
2131
		header('Cache-Control: must-revalidate');
2132
		header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
2133
		?>
2134
function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
2135
	if (placeholder != '') {
2136
		document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
2137
	}
2138
	else {
2139
		document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
2140
	}
2141
}
2142
2143
function embed_flash(bgcolor, width, height, link, loop, type) {
2144
	document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>');
2145
}
2146
2147
function embed_flv(width, height, link, placeholder, loop, player) {
2148
	document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>');
2149
}
2150
2151
function embed_wmedia(width, height, link) {
2152
	document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>');
2153
}
2154
		<?php
2155
	}
2156
2157
	/**
2158
	 * Get the SimplePie build timestamp
2159
	 *
2160
	 * Uses the git index if it exists, otherwise uses the modification time
2161
	 * of the newest file.
2162
	 */
2163
	public static function get_build()
2164
	{
2165
		$root = dirname(dirname(__FILE__));
2166
		if (file_exists($root . '/.git/index'))
2167
		{
2168
			return filemtime($root . '/.git/index');
2169
		}
2170
		elseif (file_exists($root . '/SimplePie'))
2171
		{
2172
			$time = 0;
2173
			foreach (glob($root . '/SimplePie/*.php') as $file)
2174
			{
2175
				if (($mtime = filemtime($file)) > $time)
2176
				{
2177
					$time = $mtime;
2178
				}
2179
			}
2180
			return $time;
2181
		}
2182
		elseif (file_exists(dirname(__FILE__) . '/Core.php'))
2183
		{
2184
			return filemtime(dirname(__FILE__) . '/Core.php');
2185
		}
2186
		else
2187
		{
2188
			return filemtime(__FILE__);
2189
		}
2190
	}
2191
2192
	/**
2193
	 * Format debugging information
2194
	 */
2195
	public static function debug(&$sp)
2196
	{
2197
		$info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n";
2198
		$info .= 'PHP ' . PHP_VERSION . "\n";
2199
		if ($sp->error() !== null)
2200
		{
2201
			$info .= 'Error occurred: ' . $sp->error() . "\n";
2202
		}
2203
		else
2204
		{
2205
			$info .= "No error found.\n";
2206
		}
2207
		$info .= "Extensions:\n";
2208
		$extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml');
2209
		foreach ($extensions as $ext)
2210
		{
2211
			if (extension_loaded($ext))
2212
			{
2213
				$info .= "    $ext loaded\n";
2214
				switch ($ext)
2215
				{
2216
					case 'pcre':
2217
						$info .= '      Version ' . PCRE_VERSION . "\n";
2218
						break;
2219
					case 'curl':
2220
						$version = curl_version();
2221
						$info .= '      Version ' . $version['version'] . "\n";
2222
						break;
2223
					case 'mbstring':
2224
						$info .= '      Overloading: ' . mb_get_info('func_overload') . "\n";
2225
						break;
2226
					case 'iconv':
2227
						$info .= '      Version ' . ICONV_VERSION . "\n";
2228
						break;
2229
					case 'xml':
2230
						$info .= '      Version ' . LIBXML_DOTTED_VERSION . "\n";
2231
						break;
2232
				}
2233
			}
2234
			else
2235
			{
2236
				$info .= "    $ext not loaded\n";
2237
			}
2238
		}
2239
		return $info;
2240
	}
2241
2242
	public static function silence_errors($num, $str)
0 ignored issues
show
Unused Code introduced by
The parameter $num is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $str is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
2243
	{
2244
		// No-op
2245
	}
2246
}
2247
2248