PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 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 / sabberworm / php-css-parser / src / Parsing / ParserState.php
mailpoet / vendor-prefixed / sabberworm / php-css-parser / src / Parsing Last commit date
Anchor.php 2 years ago OutputException.php 4 years ago ParserState.php 2 years ago SourceException.php 4 years ago UnexpectedEOFException.php 4 years ago UnexpectedTokenException.php 4 years ago index.php 3 years ago
ParserState.php
318 lines
1 <?php
2 namespace MailPoetVendor\Sabberworm\CSS\Parsing;
3 if (!defined('ABSPATH')) exit;
4 use MailPoetVendor\Sabberworm\CSS\Comment\Comment;
5 use MailPoetVendor\Sabberworm\CSS\Settings;
6 class ParserState
7 {
8 const EOF = null;
9 private $oParserSettings;
10 private $sText;
11 private $aText;
12 private $iCurrentPosition;
13 private $sCharset;
14 private $iLength;
15 private $iLineNo;
16 public function __construct($sText, Settings $oParserSettings, $iLineNo = 1)
17 {
18 $this->oParserSettings = $oParserSettings;
19 $this->sText = $sText;
20 $this->iCurrentPosition = 0;
21 $this->iLineNo = $iLineNo;
22 $this->setCharset($this->oParserSettings->sDefaultCharset);
23 }
24 public function setCharset($sCharset)
25 {
26 $this->sCharset = $sCharset;
27 $this->aText = $this->strsplit($this->sText);
28 if (\is_array($this->aText)) {
29 $this->iLength = \count($this->aText);
30 }
31 }
32 public function getCharset()
33 {
34 return $this->sCharset;
35 }
36 public function currentLine()
37 {
38 return $this->iLineNo;
39 }
40 public function currentColumn()
41 {
42 return $this->iCurrentPosition;
43 }
44 public function getSettings()
45 {
46 return $this->oParserSettings;
47 }
48 public function anchor()
49 {
50 return new Anchor($this->iCurrentPosition, $this);
51 }
52 public function setPosition($iPosition)
53 {
54 $this->iCurrentPosition = $iPosition;
55 }
56 public function parseIdentifier($bIgnoreCase = \true)
57 {
58 if ($this->isEnd()) {
59 throw new UnexpectedEOFException('', '', 'identifier', $this->iLineNo);
60 }
61 $sResult = $this->parseCharacter(\true);
62 if ($sResult === null) {
63 throw new UnexpectedTokenException($sResult, $this->peek(5), 'identifier', $this->iLineNo);
64 }
65 $sCharacter = null;
66 while (!$this->isEnd() && ($sCharacter = $this->parseCharacter(\true)) !== null) {
67 if (\preg_match('/[a-zA-Z0-9\\x{00A0}-\\x{FFFF}_-]/Sux', $sCharacter)) {
68 $sResult .= $sCharacter;
69 } else {
70 $sResult .= '\\' . $sCharacter;
71 }
72 }
73 if ($bIgnoreCase) {
74 $sResult = $this->strtolower($sResult);
75 }
76 return $sResult;
77 }
78 public function parseCharacter($bIsForIdentifier)
79 {
80 if ($this->peek() === '\\') {
81 if ($bIsForIdentifier && $this->oParserSettings->bLenientParsing && ($this->comes('\\0') || $this->comes('\\9'))) {
82 // Non-strings can contain \0 or \9 which is an IE hack supported in lenient parsing.
83 return null;
84 }
85 $this->consume('\\');
86 if ($this->comes('\\n') || $this->comes('\\r')) {
87 return '';
88 }
89 if (\preg_match('/[0-9a-fA-F]/Su', $this->peek()) === 0) {
90 return $this->consume(1);
91 }
92 $sUnicode = $this->consumeExpression('/^[0-9a-fA-F]{1,6}/u', 6);
93 if ($this->strlen($sUnicode) < 6) {
94 // Consume whitespace after incomplete unicode escape
95 if (\preg_match('/\\s/isSu', $this->peek())) {
96 if ($this->comes('MailPoetVendor\\r\\n')) {
97 $this->consume(2);
98 } else {
99 $this->consume(1);
100 }
101 }
102 }
103 $iUnicode = \intval($sUnicode, 16);
104 $sUtf32 = "";
105 for ($i = 0; $i < 4; ++$i) {
106 $sUtf32 .= \chr($iUnicode & 0xff);
107 $iUnicode = $iUnicode >> 8;
108 }
109 return \iconv('utf-32le', $this->sCharset, $sUtf32);
110 }
111 if ($bIsForIdentifier) {
112 $peek = \ord($this->peek());
113 // Ranges: a-z A-Z 0-9 - _
114 if ($peek >= 97 && $peek <= 122 || $peek >= 65 && $peek <= 90 || $peek >= 48 && $peek <= 57 || $peek === 45 || $peek === 95 || $peek > 0xa1) {
115 return $this->consume(1);
116 }
117 } else {
118 return $this->consume(1);
119 }
120 return null;
121 }
122 public function consumeWhiteSpace()
123 {
124 $aComments = [];
125 do {
126 while (\preg_match('/\\s/isSu', $this->peek()) === 1) {
127 $this->consume(1);
128 }
129 if ($this->oParserSettings->bLenientParsing) {
130 try {
131 $oComment = $this->consumeComment();
132 } catch (UnexpectedEOFException $e) {
133 $this->iCurrentPosition = $this->iLength;
134 return $aComments;
135 }
136 } else {
137 $oComment = $this->consumeComment();
138 }
139 if ($oComment !== \false) {
140 $aComments[] = $oComment;
141 }
142 } while ($oComment !== \false);
143 return $aComments;
144 }
145 public function comes($sString, $bCaseInsensitive = \false)
146 {
147 $sPeek = $this->peek(\strlen($sString));
148 return $sPeek == '' ? \false : $this->streql($sPeek, $sString, $bCaseInsensitive);
149 }
150 public function peek($iLength = 1, $iOffset = 0)
151 {
152 $iOffset += $this->iCurrentPosition;
153 if ($iOffset >= $this->iLength) {
154 return '';
155 }
156 return $this->substr($iOffset, $iLength);
157 }
158 public function consume($mValue = 1)
159 {
160 if (\is_string($mValue)) {
161 $iLineCount = \substr_count($mValue, "\n");
162 $iLength = $this->strlen($mValue);
163 if (!$this->streql($this->substr($this->iCurrentPosition, $iLength), $mValue)) {
164 throw new UnexpectedTokenException($mValue, $this->peek(\max($iLength, 5)), $this->iLineNo);
165 }
166 $this->iLineNo += $iLineCount;
167 $this->iCurrentPosition += $this->strlen($mValue);
168 return $mValue;
169 } else {
170 if ($this->iCurrentPosition + $mValue > $this->iLength) {
171 throw new UnexpectedEOFException($mValue, $this->peek(5), 'count', $this->iLineNo);
172 }
173 $sResult = $this->substr($this->iCurrentPosition, $mValue);
174 $iLineCount = \substr_count($sResult, "\n");
175 $this->iLineNo += $iLineCount;
176 $this->iCurrentPosition += $mValue;
177 return $sResult;
178 }
179 }
180 public function consumeExpression($mExpression, $iMaxLength = null)
181 {
182 $aMatches = null;
183 $sInput = $iMaxLength !== null ? $this->peek($iMaxLength) : $this->inputLeft();
184 if (\preg_match($mExpression, $sInput, $aMatches, \PREG_OFFSET_CAPTURE) === 1) {
185 return $this->consume($aMatches[0][0]);
186 }
187 throw new UnexpectedTokenException($mExpression, $this->peek(5), 'expression', $this->iLineNo);
188 }
189 public function consumeComment()
190 {
191 $mComment = \false;
192 if ($this->comes('/*')) {
193 $iLineNo = $this->iLineNo;
194 $this->consume(1);
195 $mComment = '';
196 while (($char = $this->consume(1)) !== '') {
197 $mComment .= $char;
198 if ($this->comes('*/')) {
199 $this->consume(2);
200 break;
201 }
202 }
203 }
204 if ($mComment !== \false) {
205 // We skip the * which was included in the comment.
206 return new Comment(\substr($mComment, 1), $iLineNo);
207 }
208 return $mComment;
209 }
210 public function isEnd()
211 {
212 return $this->iCurrentPosition >= $this->iLength;
213 }
214 public function consumeUntil($aEnd, $bIncludeEnd = \false, $consumeEnd = \false, array &$comments = [])
215 {
216 $aEnd = \is_array($aEnd) ? $aEnd : [$aEnd];
217 $out = '';
218 $start = $this->iCurrentPosition;
219 while (!$this->isEnd()) {
220 $char = $this->consume(1);
221 if (\in_array($char, $aEnd)) {
222 if ($bIncludeEnd) {
223 $out .= $char;
224 } elseif (!$consumeEnd) {
225 $this->iCurrentPosition -= $this->strlen($char);
226 }
227 return $out;
228 }
229 $out .= $char;
230 if ($comment = $this->consumeComment()) {
231 $comments[] = $comment;
232 }
233 }
234 if (\in_array(self::EOF, $aEnd)) {
235 return $out;
236 }
237 $this->iCurrentPosition = $start;
238 throw new UnexpectedEOFException('One of ("' . \implode('","', $aEnd) . '")', $this->peek(5), 'search', $this->iLineNo);
239 }
240 private function inputLeft()
241 {
242 return $this->substr($this->iCurrentPosition, -1);
243 }
244 public function streql($sString1, $sString2, $bCaseInsensitive = \true)
245 {
246 if ($bCaseInsensitive) {
247 return $this->strtolower($sString1) === $this->strtolower($sString2);
248 } else {
249 return $sString1 === $sString2;
250 }
251 }
252 public function backtrack($iAmount)
253 {
254 $this->iCurrentPosition -= $iAmount;
255 }
256 public function strlen($sString)
257 {
258 if ($this->oParserSettings->bMultibyteSupport) {
259 return \mb_strlen($sString, $this->sCharset);
260 } else {
261 return \strlen($sString);
262 }
263 }
264 private function substr($iStart, $iLength)
265 {
266 if ($iLength < 0) {
267 $iLength = $this->iLength - $iStart + $iLength;
268 }
269 if ($iStart + $iLength > $this->iLength) {
270 $iLength = $this->iLength - $iStart;
271 }
272 $sResult = '';
273 while ($iLength > 0) {
274 $sResult .= $this->aText[$iStart];
275 $iStart++;
276 $iLength--;
277 }
278 return $sResult;
279 }
280 private function strtolower($sString)
281 {
282 if ($this->oParserSettings->bMultibyteSupport) {
283 return \mb_strtolower($sString, $this->sCharset);
284 } else {
285 return \strtolower($sString);
286 }
287 }
288 private function strsplit($sString)
289 {
290 if ($this->oParserSettings->bMultibyteSupport) {
291 if ($this->streql($this->sCharset, 'utf-8')) {
292 return \preg_split('//u', $sString, -1, \PREG_SPLIT_NO_EMPTY);
293 } else {
294 $iLength = \mb_strlen($sString, $this->sCharset);
295 $aResult = [];
296 for ($i = 0; $i < $iLength; ++$i) {
297 $aResult[] = \mb_substr($sString, $i, 1, $this->sCharset);
298 }
299 return $aResult;
300 }
301 } else {
302 if ($sString === '') {
303 return [];
304 } else {
305 return \str_split($sString);
306 }
307 }
308 }
309 private function strpos($sString, $sNeedle, $iOffset)
310 {
311 if ($this->oParserSettings->bMultibyteSupport) {
312 return \mb_strpos($sString, $sNeedle, $iOffset, $this->sCharset);
313 } else {
314 return \strpos($sString, $sNeedle, $iOffset);
315 }
316 }
317 }
318