PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / symfony / string / ByteString.php
mailpoet / vendor-prefixed / symfony / string Last commit date
Exception 2 years ago Inflector 8 months ago Resources 8 months ago Slugger 2 years ago AbstractString.php 2 years ago AbstractUnicodeString.php 8 months ago ByteString.php 2 years ago CodePointString.php 2 years ago LazyString.php 2 years ago UnicodeString.php 2 years ago index.php 2 years ago
ByteString.php
379 lines
1 <?php
2 namespace MailPoetVendor\Symfony\Component\String;
3 if (!defined('ABSPATH')) exit;
4 use MailPoetVendor\Symfony\Component\String\Exception\ExceptionInterface;
5 use MailPoetVendor\Symfony\Component\String\Exception\InvalidArgumentException;
6 use MailPoetVendor\Symfony\Component\String\Exception\RuntimeException;
7 class ByteString extends AbstractString
8 {
9 private const ALPHABET_ALPHANUMERIC = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
10 public function __construct(string $string = '')
11 {
12 $this->string = $string;
13 }
14 public static function fromRandom(int $length = 16, ?string $alphabet = null) : self
15 {
16 if ($length <= 0) {
17 throw new InvalidArgumentException(\sprintf('A strictly positive length is expected, "%d" given.', $length));
18 }
19 $alphabet = $alphabet ?? self::ALPHABET_ALPHANUMERIC;
20 $alphabetSize = \strlen($alphabet);
21 $bits = (int) \ceil(\log($alphabetSize, 2.0));
22 if ($bits <= 0 || $bits > 56) {
23 throw new InvalidArgumentException('The length of the alphabet must in the [2^1, 2^56] range.');
24 }
25 $ret = '';
26 while ($length > 0) {
27 $urandomLength = (int) \ceil(2 * $length * $bits / 8.0);
28 $data = \random_bytes($urandomLength);
29 $unpackedData = 0;
30 $unpackedBits = 0;
31 for ($i = 0; $i < $urandomLength && $length > 0; ++$i) {
32 // Unpack 8 bits
33 $unpackedData = $unpackedData << 8 | \ord($data[$i]);
34 $unpackedBits += 8;
35 // While we have enough bits to select a character from the alphabet, keep
36 // consuming the random data
37 for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) {
38 $index = $unpackedData & (1 << $bits) - 1;
39 $unpackedData >>= $bits;
40 // Unfortunately, the alphabet size is not necessarily a power of two.
41 // Worst case, it is 2^k + 1, which means we need (k+1) bits and we
42 // have around a 50% chance of missing as k gets larger
43 if ($index < $alphabetSize) {
44 $ret .= $alphabet[$index];
45 --$length;
46 }
47 }
48 }
49 }
50 return new static($ret);
51 }
52 public function bytesAt(int $offset) : array
53 {
54 $str = $this->string[$offset] ?? '';
55 return '' === $str ? [] : [\ord($str)];
56 }
57 public function append(string ...$suffix) : parent
58 {
59 $str = clone $this;
60 $str->string .= 1 >= \count($suffix) ? $suffix[0] ?? '' : \implode('', $suffix);
61 return $str;
62 }
63 public function camel() : parent
64 {
65 $str = clone $this;
66 $parts = \explode(' ', \trim(\ucwords(\preg_replace('/[^a-zA-Z0-9\\x7f-\\xff]++/', ' ', $this->string))));
67 $parts[0] = 1 !== \strlen($parts[0]) && \ctype_upper($parts[0]) ? $parts[0] : \lcfirst($parts[0]);
68 $str->string = \implode('', $parts);
69 return $str;
70 }
71 public function chunk(int $length = 1) : array
72 {
73 if (1 > $length) {
74 throw new InvalidArgumentException('The chunk length must be greater than zero.');
75 }
76 if ('' === $this->string) {
77 return [];
78 }
79 $str = clone $this;
80 $chunks = [];
81 foreach (\str_split($this->string, $length) as $chunk) {
82 $str->string = $chunk;
83 $chunks[] = clone $str;
84 }
85 return $chunks;
86 }
87 public function endsWith($suffix) : bool
88 {
89 if ($suffix instanceof parent) {
90 $suffix = $suffix->string;
91 } elseif (\is_array($suffix) || $suffix instanceof \Traversable) {
92 return parent::endsWith($suffix);
93 } else {
94 $suffix = (string) $suffix;
95 }
96 return '' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === \substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase);
97 }
98 public function equalsTo($string) : bool
99 {
100 if ($string instanceof parent) {
101 $string = $string->string;
102 } elseif (\is_array($string) || $string instanceof \Traversable) {
103 return parent::equalsTo($string);
104 } else {
105 $string = (string) $string;
106 }
107 if ('' !== $string && $this->ignoreCase) {
108 return 0 === \strcasecmp($string, $this->string);
109 }
110 return $string === $this->string;
111 }
112 public function folded() : parent
113 {
114 $str = clone $this;
115 $str->string = \strtolower($str->string);
116 return $str;
117 }
118 public function indexOf($needle, int $offset = 0) : ?int
119 {
120 if ($needle instanceof parent) {
121 $needle = $needle->string;
122 } elseif (\is_array($needle) || $needle instanceof \Traversable) {
123 return parent::indexOf($needle, $offset);
124 } else {
125 $needle = (string) $needle;
126 }
127 if ('' === $needle) {
128 return null;
129 }
130 $i = $this->ignoreCase ? \stripos($this->string, $needle, $offset) : \strpos($this->string, $needle, $offset);
131 return \false === $i ? null : $i;
132 }
133 public function indexOfLast($needle, int $offset = 0) : ?int
134 {
135 if ($needle instanceof parent) {
136 $needle = $needle->string;
137 } elseif (\is_array($needle) || $needle instanceof \Traversable) {
138 return parent::indexOfLast($needle, $offset);
139 } else {
140 $needle = (string) $needle;
141 }
142 if ('' === $needle) {
143 return null;
144 }
145 $i = $this->ignoreCase ? \strripos($this->string, $needle, $offset) : \strrpos($this->string, $needle, $offset);
146 return \false === $i ? null : $i;
147 }
148 public function isUtf8() : bool
149 {
150 return '' === $this->string || \preg_match('//u', $this->string);
151 }
152 public function join(array $strings, ?string $lastGlue = null) : parent
153 {
154 $str = clone $this;
155 $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue . \array_pop($strings) : '';
156 $str->string = \implode($this->string, $strings) . $tail;
157 return $str;
158 }
159 public function length() : int
160 {
161 return \strlen($this->string);
162 }
163 public function lower() : parent
164 {
165 $str = clone $this;
166 $str->string = \strtolower($str->string);
167 return $str;
168 }
169 public function match(string $regexp, int $flags = 0, int $offset = 0) : array
170 {
171 $match = (\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags ? 'preg_match_all' : 'preg_match';
172 if ($this->ignoreCase) {
173 $regexp .= 'i';
174 }
175 \set_error_handler(static function ($t, $m) {
176 throw new InvalidArgumentException($m);
177 });
178 try {
179 if (\false === $match($regexp, $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) {
180 $lastError = \preg_last_error();
181 foreach (\get_defined_constants(\true)['pcre'] as $k => $v) {
182 if ($lastError === $v && '_ERROR' === \substr($k, -6)) {
183 throw new RuntimeException('Matching failed with ' . $k . '.');
184 }
185 }
186 throw new RuntimeException('Matching failed with unknown error code.');
187 }
188 } finally {
189 \restore_error_handler();
190 }
191 return $matches;
192 }
193 public function padBoth(int $length, string $padStr = ' ') : parent
194 {
195 $str = clone $this;
196 $str->string = \str_pad($this->string, $length, $padStr, \STR_PAD_BOTH);
197 return $str;
198 }
199 public function padEnd(int $length, string $padStr = ' ') : parent
200 {
201 $str = clone $this;
202 $str->string = \str_pad($this->string, $length, $padStr, \STR_PAD_RIGHT);
203 return $str;
204 }
205 public function padStart(int $length, string $padStr = ' ') : parent
206 {
207 $str = clone $this;
208 $str->string = \str_pad($this->string, $length, $padStr, \STR_PAD_LEFT);
209 return $str;
210 }
211 public function prepend(string ...$prefix) : parent
212 {
213 $str = clone $this;
214 $str->string = (1 >= \count($prefix) ? $prefix[0] ?? '' : \implode('', $prefix)) . $str->string;
215 return $str;
216 }
217 public function replace(string $from, string $to) : parent
218 {
219 $str = clone $this;
220 if ('' !== $from) {
221 $str->string = $this->ignoreCase ? \str_ireplace($from, $to, $this->string) : \str_replace($from, $to, $this->string);
222 }
223 return $str;
224 }
225 public function replaceMatches(string $fromRegexp, $to) : parent
226 {
227 if ($this->ignoreCase) {
228 $fromRegexp .= 'i';
229 }
230 if (\is_array($to)) {
231 if (!\is_callable($to)) {
232 throw new \TypeError(\sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class));
233 }
234 $replace = 'preg_replace_callback';
235 } else {
236 $replace = $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace';
237 }
238 \set_error_handler(static function ($t, $m) {
239 throw new InvalidArgumentException($m);
240 });
241 try {
242 if (null === ($string = $replace($fromRegexp, $to, $this->string))) {
243 $lastError = \preg_last_error();
244 foreach (\get_defined_constants(\true)['pcre'] as $k => $v) {
245 if ($lastError === $v && '_ERROR' === \substr($k, -6)) {
246 throw new RuntimeException('Matching failed with ' . $k . '.');
247 }
248 }
249 throw new RuntimeException('Matching failed with unknown error code.');
250 }
251 } finally {
252 \restore_error_handler();
253 }
254 $str = clone $this;
255 $str->string = $string;
256 return $str;
257 }
258 public function reverse() : parent
259 {
260 $str = clone $this;
261 $str->string = \strrev($str->string);
262 return $str;
263 }
264 public function slice(int $start = 0, ?int $length = null) : parent
265 {
266 $str = clone $this;
267 $str->string = (string) \substr($this->string, $start, $length ?? \PHP_INT_MAX);
268 return $str;
269 }
270 public function snake() : parent
271 {
272 $str = $this->camel();
273 $str->string = \strtolower(\preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\\d])([A-Z])/'], 'MailPoetVendor\\1_\\2', $str->string));
274 return $str;
275 }
276 public function splice(string $replacement, int $start = 0, ?int $length = null) : parent
277 {
278 $str = clone $this;
279 $str->string = \substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX);
280 return $str;
281 }
282 public function split(string $delimiter, ?int $limit = null, ?int $flags = null) : array
283 {
284 if (1 > ($limit = $limit ?? \PHP_INT_MAX)) {
285 throw new InvalidArgumentException('Split limit must be a positive integer.');
286 }
287 if ('' === $delimiter) {
288 throw new InvalidArgumentException('Split delimiter is empty.');
289 }
290 if (null !== $flags) {
291 return parent::split($delimiter, $limit, $flags);
292 }
293 $str = clone $this;
294 $chunks = $this->ignoreCase ? \preg_split('{' . \preg_quote($delimiter) . '}iD', $this->string, $limit) : \explode($delimiter, $this->string, $limit);
295 foreach ($chunks as &$chunk) {
296 $str->string = $chunk;
297 $chunk = clone $str;
298 }
299 return $chunks;
300 }
301 public function startsWith($prefix) : bool
302 {
303 if ($prefix instanceof parent) {
304 $prefix = $prefix->string;
305 } elseif (!\is_string($prefix)) {
306 return parent::startsWith($prefix);
307 }
308 return '' !== $prefix && 0 === ($this->ignoreCase ? \strncasecmp($this->string, $prefix, \strlen($prefix)) : \strncmp($this->string, $prefix, \strlen($prefix)));
309 }
310 public function title(bool $allWords = \false) : parent
311 {
312 $str = clone $this;
313 $str->string = $allWords ? \ucwords($str->string) : \ucfirst($str->string);
314 return $str;
315 }
316 public function toUnicodeString(?string $fromEncoding = null) : UnicodeString
317 {
318 return new UnicodeString($this->toCodePointString($fromEncoding)->string);
319 }
320 public function toCodePointString(?string $fromEncoding = null) : CodePointString
321 {
322 $u = new CodePointString();
323 if (\in_array($fromEncoding, [null, 'utf8', 'utf-8', 'UTF8', 'UTF-8'], \true) && \preg_match('//u', $this->string)) {
324 $u->string = $this->string;
325 return $u;
326 }
327 \set_error_handler(static function ($t, $m) {
328 throw new InvalidArgumentException($m);
329 });
330 try {
331 try {
332 $validEncoding = \false !== \mb_detect_encoding($this->string, $fromEncoding ?? 'Windows-1252', \true);
333 } catch (InvalidArgumentException $e) {
334 if (!\function_exists('iconv')) {
335 throw $e;
336 }
337 $u->string = \iconv($fromEncoding ?? 'Windows-1252', 'UTF-8', $this->string);
338 return $u;
339 }
340 } finally {
341 \restore_error_handler();
342 }
343 if (!$validEncoding) {
344 throw new InvalidArgumentException(\sprintf('Invalid "%s" string.', $fromEncoding ?? 'Windows-1252'));
345 }
346 $u->string = \mb_convert_encoding($this->string, 'UTF-8', $fromEncoding ?? 'Windows-1252');
347 return $u;
348 }
349 public function trim(string $chars = " \t\n\r\x00\v\f") : parent
350 {
351 $str = clone $this;
352 $str->string = \trim($str->string, $chars);
353 return $str;
354 }
355 public function trimEnd(string $chars = " \t\n\r\x00\v\f") : parent
356 {
357 $str = clone $this;
358 $str->string = \rtrim($str->string, $chars);
359 return $str;
360 }
361 public function trimStart(string $chars = " \t\n\r\x00\v\f") : parent
362 {
363 $str = clone $this;
364 $str->string = \ltrim($str->string, $chars);
365 return $str;
366 }
367 public function upper() : parent
368 {
369 $str = clone $this;
370 $str->string = \strtoupper($str->string);
371 return $str;
372 }
373 public function width(bool $ignoreAnsiDecoration = \true) : int
374 {
375 $string = \preg_match('//u', $this->string) ? $this->string : \preg_replace('/[\\x80-\\xFF]/', '?', $this->string);
376 return (new CodePointString($string))->width($ignoreAnsiDecoration);
377 }
378 }
379