PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.5
Independent Analytics – WordPress Analytics Plugin v2.15.5
2.15.5 2.15.4 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 / RFC4180Field.php
independent-analytics / vendor / league / csv / src Last commit date
AbstractCsv.php 1 month ago ByteSequence.php 1 month ago CannotInsertRecord.php 1 month ago CharsetConverter.php 1 month ago ColumnConsistency.php 1 month ago EncloseField.php 1 month ago EscapeFormula.php 1 month ago Exception.php 10 months ago HTMLConverter.php 1 month ago Info.php 1 month ago InvalidArgument.php 10 months ago MapIterator.php 1 month ago RFC4180Field.php 1 month ago Reader.php 1 month ago ResultSet.php 1 month ago Statement.php 1 month ago Stream.php 1 month ago SyntaxError.php 1 month ago TabularDataReader.php 1 month ago UnableToProcessCsv.php 10 months ago UnavailableFeature.php 10 months ago UnavailableStream.php 10 months ago Writer.php 1 month ago XMLConverter.php 1 month ago functions.php 10 months ago functions_include.php 10 months ago
RFC4180Field.php
151 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 InvalidArgumentException;
15 use php_user_filter;
16 use function array_map;
17 use function in_array;
18 use function is_string;
19 use function str_replace;
20 use function strcspn;
21 use function stream_bucket_append;
22 use function stream_bucket_make_writeable;
23 use function stream_filter_register;
24 use function stream_get_filters;
25 use function strlen;
26 use const STREAM_FILTER_READ;
27 use const STREAM_FILTER_WRITE;
28 /**
29 * A stream filter to conform the CSV field to RFC4180.
30 *
31 * DEPRECATION WARNING! This class will be removed in the next major point release
32 *
33 * @deprecated since version 9.2.0
34 * @see AbstractCsv::setEscape
35 *
36 * @see https://tools.ietf.org/html/rfc4180#section-2
37 * @internal
38 */
39 class RFC4180Field extends php_user_filter
40 {
41 public const FILTERNAME = 'convert.league.csv.rfc4180';
42 /**
43 * The value being search for.
44 *
45 * @var string[]
46 */
47 protected array $search;
48 /**
49 * The replacement value that replace found $search values.
50 *
51 * @var string[]
52 */
53 protected array $replace;
54 /**
55 * Characters that triggers enclosure with PHP fputcsv.
56 *
57 */
58 protected static string $force_enclosure = "\n\r\t ";
59 /**
60 * Static method to add the stream filter to a {@link AbstractCsv} object.
61 */
62 public static function addTo(AbstractCsv $csv, string $whitespace_replace = '') : AbstractCsv
63 {
64 self::register();
65 $params = ['enclosure' => $csv->getEnclosure(), 'escape' => $csv->getEscape(), 'mode' => $csv->getStreamFilterMode()];
66 if ($csv instanceof Writer && '' != $whitespace_replace) {
67 self::addFormatterTo($csv, $whitespace_replace);
68 $params['whitespace_replace'] = $whitespace_replace;
69 }
70 return $csv->addStreamFilter(self::FILTERNAME, $params);
71 }
72 /**
73 * Add a formatter to the {@link Writer} object to format the record
74 * field to avoid enclosure around a field with an empty space.
75 */
76 public static function addFormatterTo(Writer $csv, string $whitespace_replace) : Writer
77 {
78 if ('' == $whitespace_replace || strlen($whitespace_replace) != strcspn($whitespace_replace, self::$force_enclosure)) {
79 throw new InvalidArgumentException('The sequence contains a character that enforces enclosure or is a CSV control character or is the empty string.');
80 }
81 $mapper = fn($value) => is_string($value) ? str_replace(' ', $whitespace_replace, $value) : $value;
82 return $csv->addFormatter(fn(array $record): array => array_map($mapper, $record));
83 }
84 /**
85 * Static method to register the class as a stream filter.
86 */
87 public static function register() : void
88 {
89 if (!in_array(self::FILTERNAME, stream_get_filters(), \true)) {
90 stream_filter_register(self::FILTERNAME, self::class);
91 }
92 }
93 /**
94 * Static method to return the stream filter filtername.
95 */
96 public static function getFiltername() : string
97 {
98 return self::FILTERNAME;
99 }
100 /**
101 * @param resource $in
102 * @param resource $out
103 * @param int $consumed
104 * @param bool $closing
105 */
106 public function filter($in, $out, &$consumed, $closing) : int
107 {
108 while (null !== ($bucket = stream_bucket_make_writeable($in))) {
109 $bucket->data = str_replace($this->search, $this->replace, $bucket->data);
110 $consumed += $bucket->datalen;
111 stream_bucket_append($out, $bucket);
112 }
113 return \PSFS_PASS_ON;
114 }
115 public function onCreate() : bool
116 {
117 if (!$this->isValidParams($this->params)) {
118 return \false;
119 }
120 $this->search = [$this->params['escape'] . $this->params['enclosure']];
121 $this->replace = [$this->params['enclosure'] . $this->params['enclosure']];
122 if (STREAM_FILTER_WRITE != $this->params['mode']) {
123 return \true;
124 }
125 $this->search = [$this->params['escape'] . $this->params['enclosure']];
126 $this->replace = [$this->params['escape'] . $this->params['enclosure'] . $this->params['enclosure']];
127 if ($this->isValidSequence($this->params)) {
128 $this->search[] = $this->params['whitespace_replace'];
129 $this->replace[] = ' ';
130 }
131 return \true;
132 }
133 /**
134 * Validate params property.
135 */
136 protected function isValidParams(array $params) : bool
137 {
138 static $mode_list = [STREAM_FILTER_READ => 1, STREAM_FILTER_WRITE => 1];
139 return isset($params['enclosure'], $params['escape'], $params['mode'], $mode_list[$params['mode']]) && 1 == strlen($params['enclosure']) && 1 == strlen($params['escape']);
140 }
141 /**
142 * Is Valid White space replaced sequence.
143 *
144 * @return bool
145 */
146 protected function isValidSequence(array $params)
147 {
148 return isset($params['whitespace_replace']) && strlen($params['whitespace_replace']) == strcspn($params['whitespace_replace'], self::$force_enclosure);
149 }
150 }
151