PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 10.2.2
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v10.2.2
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
acymailing / back / Libraries / Sabberworm / CSS / src / OutputFormat.php

OutputFormat.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 10.2.2, at back/Libraries/Sabberworm/CSS/src/OutputFormat.php

335 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Sabberworm\CSS;
4
5 /**
6 * Class OutputFormat
7 *
8 * @method OutputFormat setSemicolonAfterLastRule(bool $bSemicolonAfterLastRule) Set whether semicolons are added after
9 * last rule.
10 */
11 class OutputFormat
12 {
13 /**
14 * Value format: `"` means double-quote, `'` means single-quote
15 *
16 * @var string
17 */
18 public $sStringQuotingType = '"';
19
20 /**
21 * Output RGB colors in hash notation if possible
22 *
23 * @var string
24 */
25 public $bRGBHashNotation = true;
26
27 /**
28 * Declaration format
29 *
30 * Semicolon after the last rule of a declaration block can be omitted. To do that, set this false.
31 *
32 * @var bool
33 */
34 public $bSemicolonAfterLastRule = true;
35
36 /**
37 * Spacing
38 * Note that these strings are not sanity-checked: the value should only consist of whitespace
39 * Any newline character will be indented according to the current level.
40 * The triples (After, Before, Between) can be set using a wildcard (e.g. `$oFormat->set('Space*Rules', "\n");`)
41 */
42 public $sSpaceAfterRuleName = ' ';
43
44 /**
45 * @var string
46 */
47 public $sSpaceBeforeRules = '';
48
49 /**
50 * @var string
51 */
52 public $sSpaceAfterRules = '';
53
54 /**
55 * @var string
56 */
57 public $sSpaceBetweenRules = '';
58
59 /**
60 * @var string
61 */
62 public $sSpaceBeforeBlocks = '';
63
64 /**
65 * @var string
66 */
67 public $sSpaceAfterBlocks = '';
68
69 /**
70 * @var string
71 */
72 public $sSpaceBetweenBlocks = "\n";
73
74 /**
75 * Content injected in and around at-rule blocks.
76 *
77 * @var string
78 */
79 public $sBeforeAtRuleBlock = '';
80
81 /**
82 * @var string
83 */
84 public $sAfterAtRuleBlock = '';
85
86 /**
87 * This is what’s printed before and after the comma if a declaration block contains multiple selectors.
88 *
89 * @var string
90 */
91 public $sSpaceBeforeSelectorSeparator = '';
92
93 /**
94 * @var string
95 */
96 public $sSpaceAfterSelectorSeparator = ' ';
97
98 /**
99 * This is what’s printed after the comma of value lists
100 *
101 * @var string
102 */
103 public $sSpaceBeforeListArgumentSeparator = '';
104
105 /**
106 * @var string
107 */
108 public $sSpaceAfterListArgumentSeparator = '';
109
110 /**
111 * @var string
112 */
113 public $sSpaceBeforeOpeningBrace = ' ';
114
115 /**
116 * Content injected in and around declaration blocks.
117 *
118 * @var string
119 */
120 public $sBeforeDeclarationBlock = '';
121
122 /**
123 * @var string
124 */
125 public $sAfterDeclarationBlockSelectors = '';
126
127 /**
128 * @var string
129 */
130 public $sAfterDeclarationBlock = '';
131
132 /**
133 * Indentation character(s) per level. Only applicable if newlines are used in any of the spacing settings.
134 *
135 * @var string
136 */
137 public $sIndentation = "\t";
138
139 /**
140 * Output exceptions.
141 *
142 * @var bool
143 */
144 public $bIgnoreExceptions = false;
145
146 /**
147 * @var OutputFormatter|null
148 */
149 private $oFormatter = null;
150
151 /**
152 * @var OutputFormat|null
153 */
154 private $oNextLevelFormat = null;
155
156 /**
157 * @var int
158 */
159 private $iIndentationLevel = 0;
160
161 public function __construct()
162 {
163 }
164
165 /**
166 * @param string $sName
167 *
168 * @return string|null
169 */
170 public function get($sName)
171 {
172 $aVarPrefixes = ['a', 's', 'm', 'b', 'f', 'o', 'c', 'i'];
173 foreach ($aVarPrefixes as $sPrefix) {
174 $sFieldName = $sPrefix . ucfirst($sName);
175 if (isset($this->$sFieldName)) {
176 return $this->$sFieldName;
177 }
178 }
179 return null;
180 }
181
182 /**
183 * @param array<array-key, string>|string $aNames
184 * @param mixed $mValue
185 *
186 * @return self|false
187 */
188 public function set($aNames, $mValue)
189 {
190 $aVarPrefixes = ['a', 's', 'm', 'b', 'f', 'o', 'c', 'i'];
191 if (is_string($aNames) && strpos($aNames, '*') !== false) {
192 $aNames =
193 [
194 str_replace('*', 'Before', $aNames),
195 str_replace('*', 'Between', $aNames),
196 str_replace('*', 'After', $aNames),
197 ];
198 } elseif (!is_array($aNames)) {
199 $aNames = [$aNames];
200 }
201 foreach ($aVarPrefixes as $sPrefix) {
202 $bDidReplace = false;
203 foreach ($aNames as $sName) {
204 $sFieldName = $sPrefix . ucfirst($sName);
205 if (isset($this->$sFieldName)) {
206 $this->$sFieldName = $mValue;
207 $bDidReplace = true;
208 }
209 }
210 if ($bDidReplace) {
211 return $this;
212 }
213 }
214 // Break the chain so the user knows this option is invalid
215 return false;
216 }
217
218 /**
219 * @param string $sMethodName
220 * @param array<array-key, mixed> $aArguments
221 *
222 * @return mixed
223 *
224 * @throws \Exception
225 */
226 public function __call($sMethodName, array $aArguments)
227 {
228 if (strpos($sMethodName, 'set') === 0) {
229 return $this->set(substr($sMethodName, 3), $aArguments[0]);
230 } elseif (strpos($sMethodName, 'get') === 0) {
231 return $this->get(substr($sMethodName, 3));
232 } elseif (method_exists(OutputFormatter::class, $sMethodName)) {
233 return call_user_func_array([$this->getFormatter(), $sMethodName], $aArguments);
234 } else {
235 throw new \Exception('Unknown OutputFormat method called: ' . $sMethodName);
236 }
237 }
238
239 /**
240 * @param int $iNumber
241 *
242 * @return self
243 */
244 public function indentWithTabs($iNumber = 1)
245 {
246 return $this->setIndentation(str_repeat("\t", $iNumber));
247 }
248
249 /**
250 * @param int $iNumber
251 *
252 * @return self
253 */
254 public function indentWithSpaces($iNumber = 2)
255 {
256 return $this->setIndentation(str_repeat(" ", $iNumber));
257 }
258
259 /**
260 * @return OutputFormat
261 */
262 public function nextLevel()
263 {
264 if ($this->oNextLevelFormat === null) {
265 $this->oNextLevelFormat = clone $this;
266 $this->oNextLevelFormat->iIndentationLevel++;
267 $this->oNextLevelFormat->oFormatter = null;
268 }
269 return $this->oNextLevelFormat;
270 }
271
272 /**
273 * @return void
274 */
275 public function beLenient()
276 {
277 $this->bIgnoreExceptions = true;
278 }
279
280 /**
281 * @return OutputFormatter
282 */
283 public function getFormatter()
284 {
285 if ($this->oFormatter === null) {
286 $this->oFormatter = new OutputFormatter($this);
287 }
288 return $this->oFormatter;
289 }
290
291 /**
292 * @return int
293 */
294 public function level()
295 {
296 return $this->iIndentationLevel;
297 }
298
299 /**
300 * Creates an instance of this class without any particular formatting settings.
301 *
302 * @return self
303 */
304 public static function create()
305 {
306 return new OutputFormat();
307 }
308
309 /**
310 * Creates an instance of this class with a preset for compact formatting.
311 *
312 * @return self
313 */
314 public static function createCompact()
315 {
316 $format = self::create();
317 $format->set('Space*Rules', "")->set('Space*Blocks', "")->setSpaceAfterRuleName('')
318 ->setSpaceBeforeOpeningBrace('')->setSpaceAfterSelectorSeparator('');
319 return $format;
320 }
321
322 /**
323 * Creates an instance of this class with a preset for pretty formatting.
324 *
325 * @return self
326 */
327 public static function createPretty()
328 {
329 $format = self::create();
330 $format->set('Space*Rules', "\n")->set('Space*Blocks', "\n")
331 ->setSpaceBetweenBlocks("\n\n")->set('SpaceAfterListArgumentSeparator', ['default' => '', ',' => ' ']);
332 return $format;
333 }
334 }
335