PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.2
Independent Analytics – WordPress Analytics Plugin v2.15.2
2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / vendor / league / csv / src / CharsetConverter.php
independent-analytics / vendor / league / csv / src Last commit date
AbstractCsv.php 2 weeks ago ByteSequence.php 2 weeks ago CannotInsertRecord.php 2 weeks ago CharsetConverter.php 2 weeks ago ColumnConsistency.php 2 weeks ago EncloseField.php 2 weeks ago EscapeFormula.php 2 weeks ago Exception.php 9 months ago HTMLConverter.php 2 weeks ago Info.php 2 weeks ago InvalidArgument.php 9 months ago MapIterator.php 2 weeks ago RFC4180Field.php 2 weeks ago Reader.php 2 weeks ago ResultSet.php 2 weeks ago Statement.php 2 weeks ago Stream.php 2 weeks ago SyntaxError.php 2 weeks ago TabularDataReader.php 2 weeks ago UnableToProcessCsv.php 9 months ago UnavailableFeature.php 9 months ago UnavailableStream.php 9 months ago Writer.php 2 weeks ago XMLConverter.php 2 weeks ago functions.php 9 months ago functions_include.php 9 months ago
CharsetConverter.php
186 lines
1 <?php
2
3 /**
4 * League.Csv (https://csv.thephpleague.com)
5 *
6 * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11 declare (strict_types=1);
12 namespace IAWPSCOPED\League\Csv;
13
14 use OutOfRangeException;
15 use php_user_filter;
16 use Traversable;
17 use function array_combine;
18 use function array_map;
19 use function in_array;
20 use function is_numeric;
21 use function mb_convert_encoding;
22 use function mb_list_encodings;
23 use function preg_match;
24 use function sprintf;
25 use function stream_bucket_append;
26 use function stream_bucket_make_writeable;
27 use function stream_filter_register;
28 use function stream_get_filters;
29 use function strpos;
30 use function strtolower;
31 use function substr;
32 /**
33 * Converts resource stream or tabular data content charset.
34 * @internal
35 */
36 class CharsetConverter extends php_user_filter
37 {
38 const FILTERNAME = 'convert.league.csv';
39 protected string $input_encoding = 'UTF-8';
40 protected string $output_encoding = 'UTF-8';
41 /**
42 * Static method to add the stream filter to a {@link AbstractCsv} object.
43 */
44 public static function addTo(AbstractCsv $csv, string $input_encoding, string $output_encoding) : AbstractCsv
45 {
46 self::register();
47 return $csv->addStreamFilter(self::getFiltername($input_encoding, $output_encoding));
48 }
49 /**
50 * Static method to register the class as a stream filter.
51 */
52 public static function register() : void
53 {
54 $filter_name = self::FILTERNAME . '.*';
55 if (!in_array($filter_name, stream_get_filters(), \true)) {
56 stream_filter_register($filter_name, self::class);
57 }
58 }
59 /**
60 * Static method to return the stream filter filtername.
61 */
62 public static function getFiltername(string $input_encoding, string $output_encoding) : string
63 {
64 return sprintf('%s.%s/%s', self::FILTERNAME, self::filterEncoding($input_encoding), self::filterEncoding($output_encoding));
65 }
66 /**
67 * Filter encoding charset.
68 *
69 * @throws OutOfRangeException if the charset is malformed or unsupported
70 */
71 protected static function filterEncoding(string $encoding) : string
72 {
73 static $encoding_list;
74 if (null === $encoding_list) {
75 $list = mb_list_encodings();
76 $encoding_list = array_combine(array_map('strtolower', $list), $list);
77 }
78 $key = strtolower($encoding);
79 if (isset($encoding_list[$key])) {
80 return $encoding_list[$key];
81 }
82 throw new OutOfRangeException('The submitted charset ' . $encoding . ' is not supported by the mbstring extension.');
83 }
84 public function onCreate() : bool
85 {
86 $prefix = self::FILTERNAME . '.';
87 if (0 !== strpos($this->filtername, $prefix)) {
88 return \false;
89 }
90 $encodings = substr($this->filtername, \strlen($prefix));
91 if (1 !== preg_match(',^(?<input>[-\\w]+)\\/(?<output>[-\\w]+)$,', $encodings, $matches)) {
92 return \false;
93 }
94 try {
95 $this->input_encoding = self::filterEncoding($matches['input']);
96 $this->output_encoding = self::filterEncoding($matches['output']);
97 } catch (OutOfRangeException $e) {
98 return \false;
99 }
100 return \true;
101 }
102 /**
103 * @param resource $in
104 * @param resource $out
105 * @param int $consumed
106 * @param bool $closing
107 */
108 public function filter($in, $out, &$consumed, $closing) : int
109 {
110 while (null !== ($bucket = stream_bucket_make_writeable($in))) {
111 $bucket->data = @mb_convert_encoding($bucket->data, $this->output_encoding, $this->input_encoding);
112 $consumed += $bucket->datalen;
113 stream_bucket_append($out, $bucket);
114 }
115 return \PSFS_PASS_ON;
116 }
117 /**
118 * Convert Csv records collection into UTF-8.
119 */
120 public function convert(iterable $records) : iterable
121 {
122 if ($this->output_encoding === $this->input_encoding) {
123 return $records;
124 }
125 if (\is_array($records)) {
126 return array_map($this, $records);
127 }
128 /* @var Traversable $records */
129 return new MapIterator($records, $this);
130 }
131 /**
132 * Enable using the class as a formatter for the {@link Writer}.
133 */
134 public function __invoke(array $record) : array
135 {
136 $outputRecord = [];
137 foreach ($record as $offset => $value) {
138 [$newOffset, $newValue] = $this->encodeField($value, $offset);
139 $outputRecord[$newOffset] = $newValue;
140 }
141 return $outputRecord;
142 }
143 /**
144 * Walker method to convert the offset and the value of a CSV record field.
145 *
146 * @param int|float|string|null $value can be a scalar type or null
147 * @param int|string $offset can be a string or an int
148 */
149 protected function encodeField($value, $offset) : array
150 {
151 if (null !== $value && !is_numeric($value)) {
152 $value = mb_convert_encoding($value, $this->output_encoding, $this->input_encoding);
153 }
154 if (!is_numeric($offset)) {
155 $offset = mb_convert_encoding($offset, $this->output_encoding, $this->input_encoding);
156 }
157 return [$offset, $value];
158 }
159 /**
160 * Sets the records input encoding charset.
161 */
162 public function inputEncoding(string $encoding) : self
163 {
164 $encoding = self::filterEncoding($encoding);
165 if ($encoding === $this->input_encoding) {
166 return $this;
167 }
168 $clone = clone $this;
169 $clone->input_encoding = $encoding;
170 return $clone;
171 }
172 /**
173 * Sets the records output encoding charset.
174 */
175 public function outputEncoding(string $encoding) : self
176 {
177 $encoding = self::filterEncoding($encoding);
178 if ($encoding === $this->output_encoding) {
179 return $this;
180 }
181 $clone = clone $this;
182 $clone->output_encoding = $encoding;
183 return $clone;
184 }
185 }
186