PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.1
Independent Analytics – WordPress Analytics Plugin v2.15.1
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 / EscapeFormula.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
EscapeFormula.php
131 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 function array_fill_keys;
16 use function array_keys;
17 use function array_map;
18 use function array_merge;
19 use function array_unique;
20 use function is_object;
21 use function is_string;
22 use function method_exists;
23 /**
24 * A Formatter to tackle CSV Formula Injection.
25 *
26 * @see http://georgemauer.net/2017/10/07/csv-injection.html
27 * @internal
28 */
29 class EscapeFormula
30 {
31 /** Spreadsheet formula starting character. */
32 const FORMULA_STARTING_CHARS = ['=', '-', '+', '@', "\t", "\r"];
33 /** Effective Spreadsheet formula starting characters. */
34 protected array $special_chars = [];
35 /** Escape character to escape each CSV formula field. */
36 protected string $escape;
37 /**
38 * @param string $escape escape character to escape each CSV formula field
39 * @param string[] $special_chars additional spreadsheet formula starting characters
40 */
41 public function __construct(string $escape = "'", array $special_chars = [])
42 {
43 $this->escape = $escape;
44 if ([] !== $special_chars) {
45 $special_chars = $this->filterSpecialCharacters(...$special_chars);
46 }
47 $chars = array_unique(array_merge(self::FORMULA_STARTING_CHARS, $special_chars));
48 $this->special_chars = array_fill_keys($chars, 1);
49 }
50 /**
51 * Filter submitted special characters.
52 *
53 * @param string ...$characters
54 *
55 * @throws InvalidArgumentException if the string is not a single character
56 *
57 * @return array<string>
58 */
59 protected function filterSpecialCharacters(string ...$characters) : array
60 {
61 foreach ($characters as $str) {
62 if (1 != \strlen($str)) {
63 throw new InvalidArgumentException('The submitted string ' . $str . ' must be a single character');
64 }
65 }
66 return $characters;
67 }
68 /**
69 * Returns the list of character the instance will escape.
70 *
71 * @return array<string>
72 */
73 public function getSpecialCharacters() : array
74 {
75 return array_keys($this->special_chars);
76 }
77 /**
78 * Returns the escape character.
79 */
80 public function getEscape() : string
81 {
82 return $this->escape;
83 }
84 /**
85 * League CSV formatter hook.
86 *
87 * @see escapeRecord
88 */
89 public function __invoke(array $record) : array
90 {
91 return $this->escapeRecord($record);
92 }
93 /**
94 * Escape a CSV record.
95 */
96 public function escapeRecord(array $record) : array
97 {
98 return array_map([$this, 'escapeField'], $record);
99 }
100 /**
101 * Escape a CSV cell if its content is stringable.
102 *
103 * @param int|float|string|object|resource|array $cell the content of the cell
104 *
105 * @return mixed the escaped content
106 */
107 protected function escapeField($cell)
108 {
109 if (!is_string($cell) && (!is_object($cell) || !method_exists($cell, '__toString'))) {
110 return $cell;
111 }
112 $str_cell = (string) $cell;
113 if (isset($str_cell[0], $this->special_chars[$str_cell[0]])) {
114 return $this->escape . $str_cell;
115 }
116 return $cell;
117 }
118 /**
119 * @deprecated since 9.7.2 will be removed in the next major release
120 * @codeCoverageIgnore
121 *
122 * Tells whether the submitted value is stringable.
123 *
124 * @param mixed $value value to check if it is stringable
125 */
126 protected function isStringable($value) : bool
127 {
128 return is_string($value) || is_object($value) && method_exists($value, '__toString');
129 }
130 }
131