PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
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 / RuleSet / RuleSet.php
mailpoet / vendor-prefixed / sabberworm / php-css-parser / src / RuleSet Last commit date
AtRuleSet.php 2 years ago DeclarationBlock.php 2 years ago RuleSet.php 8 months ago index.php 3 years ago
RuleSet.php
191 lines
1 <?php
2 namespace MailPoetVendor\Sabberworm\CSS\RuleSet;
3 if (!defined('ABSPATH')) exit;
4 use MailPoetVendor\Sabberworm\CSS\Comment\Comment;
5 use MailPoetVendor\Sabberworm\CSS\Comment\Commentable;
6 use MailPoetVendor\Sabberworm\CSS\OutputFormat;
7 use MailPoetVendor\Sabberworm\CSS\Parsing\ParserState;
8 use MailPoetVendor\Sabberworm\CSS\Parsing\UnexpectedEOFException;
9 use MailPoetVendor\Sabberworm\CSS\Parsing\UnexpectedTokenException;
10 use MailPoetVendor\Sabberworm\CSS\Renderable;
11 use MailPoetVendor\Sabberworm\CSS\Rule\Rule;
12 abstract class RuleSet implements Renderable, Commentable
13 {
14 private $aRules;
15 protected $iLineNo;
16 protected $aComments;
17 public function __construct($iLineNo = 0)
18 {
19 $this->aRules = [];
20 $this->iLineNo = $iLineNo;
21 $this->aComments = [];
22 }
23 public static function parseRuleSet(ParserState $oParserState, RuleSet $oRuleSet)
24 {
25 while ($oParserState->comes(';')) {
26 $oParserState->consume(';');
27 }
28 while (!$oParserState->comes('}')) {
29 $oRule = null;
30 if ($oParserState->getSettings()->bLenientParsing) {
31 try {
32 $oRule = Rule::parse($oParserState);
33 } catch (UnexpectedTokenException $e) {
34 try {
35 $sConsume = $oParserState->consumeUntil(["\n", ";", '}'], \true);
36 // We need to “unfind” the matches to the end of the ruleSet as this will be matched later
37 if ($oParserState->streql(\substr($sConsume, -1), '}')) {
38 $oParserState->backtrack(1);
39 } else {
40 while ($oParserState->comes(';')) {
41 $oParserState->consume(';');
42 }
43 }
44 } catch (UnexpectedTokenException $e) {
45 // We’ve reached the end of the document. Just close the RuleSet.
46 return;
47 }
48 }
49 } else {
50 $oRule = Rule::parse($oParserState);
51 }
52 if ($oRule) {
53 $oRuleSet->addRule($oRule);
54 }
55 }
56 $oParserState->consume('}');
57 }
58 public function getLineNo()
59 {
60 return $this->iLineNo;
61 }
62 public function addRule(Rule $oRule,?Rule $oSibling = null)
63 {
64 $sRule = $oRule->getRule();
65 if (!isset($this->aRules[$sRule])) {
66 $this->aRules[$sRule] = [];
67 }
68 $iPosition = \count($this->aRules[$sRule]);
69 if ($oSibling !== null) {
70 $iSiblingPos = \array_search($oSibling, $this->aRules[$sRule], \true);
71 if ($iSiblingPos !== \false) {
72 $iPosition = $iSiblingPos;
73 $oRule->setPosition($oSibling->getLineNo(), $oSibling->getColNo() - 1);
74 }
75 }
76 if ($oRule->getLineNo() === 0 && $oRule->getColNo() === 0) {
77 //this node is added manually, give it the next best line
78 $rules = $this->getRules();
79 $pos = \count($rules);
80 if ($pos > 0) {
81 $last = $rules[$pos - 1];
82 $oRule->setPosition($last->getLineNo() + 1, 0);
83 }
84 }
85 \array_splice($this->aRules[$sRule], $iPosition, 0, [$oRule]);
86 }
87 public function getRules($mRule = null)
88 {
89 if ($mRule instanceof Rule) {
90 $mRule = $mRule->getRule();
91 }
92 $aResult = [];
93 foreach ($this->aRules as $sName => $aRules) {
94 // Either no search rule is given or the search rule matches the found rule exactly
95 // or the search rule ends in “-” and the found rule starts with the search rule.
96 if (!$mRule || $sName === $mRule || \strrpos($mRule, '-') === \strlen($mRule) - \strlen('-') && (\strpos($sName, $mRule) === 0 || $sName === \substr($mRule, 0, -1))) {
97 $aResult = \array_merge($aResult, $aRules);
98 }
99 }
100 \usort($aResult, function (Rule $first, Rule $second) {
101 if ($first->getLineNo() === $second->getLineNo()) {
102 return $first->getColNo() - $second->getColNo();
103 }
104 return $first->getLineNo() - $second->getLineNo();
105 });
106 return $aResult;
107 }
108 public function setRules(array $aRules)
109 {
110 $this->aRules = [];
111 foreach ($aRules as $rule) {
112 $this->addRule($rule);
113 }
114 }
115 public function getRulesAssoc($mRule = null)
116 {
117 $aResult = [];
118 foreach ($this->getRules($mRule) as $oRule) {
119 $aResult[$oRule->getRule()] = $oRule;
120 }
121 return $aResult;
122 }
123 public function removeRule($mRule)
124 {
125 if ($mRule instanceof Rule) {
126 $sRule = $mRule->getRule();
127 if (!isset($this->aRules[$sRule])) {
128 return;
129 }
130 foreach ($this->aRules[$sRule] as $iKey => $oRule) {
131 if ($oRule === $mRule) {
132 unset($this->aRules[$sRule][$iKey]);
133 }
134 }
135 } else {
136 foreach ($this->aRules as $sName => $aRules) {
137 // Either no search rule is given or the search rule matches the found rule exactly
138 // or the search rule ends in “-” and the found rule starts with the search rule or equals it
139 // (without the trailing dash).
140 if (!$mRule || $sName === $mRule || \strrpos($mRule, '-') === \strlen($mRule) - \strlen('-') && (\strpos($sName, $mRule) === 0 || $sName === \substr($mRule, 0, -1))) {
141 unset($this->aRules[$sName]);
142 }
143 }
144 }
145 }
146 public function __toString()
147 {
148 return $this->render(new OutputFormat());
149 }
150 protected function renderRules(OutputFormat $oOutputFormat)
151 {
152 $sResult = '';
153 $bIsFirst = \true;
154 $oNextLevel = $oOutputFormat->nextLevel();
155 foreach ($this->aRules as $aRules) {
156 foreach ($aRules as $oRule) {
157 $sRendered = $oNextLevel->safely(function () use($oRule, $oNextLevel) {
158 return $oRule->render($oNextLevel);
159 });
160 if ($sRendered === null) {
161 continue;
162 }
163 if ($bIsFirst) {
164 $bIsFirst = \false;
165 $sResult .= $oNextLevel->spaceBeforeRules();
166 } else {
167 $sResult .= $oNextLevel->spaceBetweenRules();
168 }
169 $sResult .= $sRendered;
170 }
171 }
172 if (!$bIsFirst) {
173 // Had some output
174 $sResult .= $oOutputFormat->spaceAfterRules();
175 }
176 return $oOutputFormat->removeLastSemicolon($sResult);
177 }
178 public function addComments(array $aComments)
179 {
180 $this->aComments = \array_merge($this->aComments, $aComments);
181 }
182 public function getComments()
183 {
184 return $this->aComments;
185 }
186 public function setComments(array $aComments)
187 {
188 $this->aComments = $aComments;
189 }
190 }
191