Passed
Pull Request — master (#38)
by Farhan
04:09
created
includes/libraries/GeoIp2/Model/City.php 1 patch
Spacing   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -130,7 +130,6 @@
 block discarded – undo
130 130
     private function mostSpecificSubdivision()
131 131
     {
132 132
         return empty($this->subdivisions) ?
133
-            new \GeoIp2\Record\Subdivision(array(), $this->locales) :
134
-            end($this->subdivisions);
133
+            new \GeoIp2\Record\Subdivision(array(), $this->locales) : end($this->subdivisions);
135 134
     }
136 135
 }
Please login to merge, or discard this patch.
includes/libraries/GeoIp2/Compat/JsonSerializable.php 1 patch
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -5,12 +5,12 @@
 block discarded – undo
5 5
 // @codingStandardsIgnoreFile
6 6
 
7 7
 /**
8
-  * This interface exists to provide backwards compatibility with PHP 5.3
9
-  *
10
-  * This should _not_ be used by any third-party code.
11
-  *
12
-  * @ignore
13
-  */
8
+ * This interface exists to provide backwards compatibility with PHP 5.3
9
+ *
10
+ * This should _not_ be used by any third-party code.
11
+ *
12
+ * @ignore
13
+ */
14 14
 if (interface_exists('JsonSerializable')) {
15 15
     interface JsonSerializable extends \JsonSerializable
16 16
     {
Please login to merge, or discard this patch.
includes/libraries/class-emogrifier.php 2 patches
Indentation   +776 added lines, -776 removed lines patch added patch discarded remove patch
@@ -9,780 +9,780 @@
 block discarded – undo
9 9
  * @author Roman Ožana <[email protected]>
10 10
  */
11 11
 class Emogrifier {
12
-	/**
13
-	 * @var string
14
-	 */
15
-	const ENCODING = 'UTF-8';
16
-
17
-	/**
18
-	 * @var integer
19
-	 */
20
-	const CACHE_KEY_CSS = 0;
21
-
22
-	/**
23
-	 * @var integer
24
-	 */
25
-	const CACHE_KEY_SELECTOR = 1;
26
-
27
-	/**
28
-	 * @var integer
29
-	 */
30
-	const CACHE_KEY_XPATH = 2;
31
-
32
-	/**
33
-	 * @var integer
34
-	 */
35
-	const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
-
37
-	/**
38
-	 * for calculating nth-of-type and nth-child selectors.
39
-	 *
40
-	 * @var integer
41
-	 */
42
-	const INDEX = 0;
43
-
44
-	/**
45
-	 * for calculating nth-of-type and nth-child selectors.
46
-	 *
47
-	 * @var integer
48
-	 */
49
-	const MULTIPLIER = 1;
50
-
51
-	/**
52
-	 * @var string
53
-	 */
54
-	const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
-
56
-	/**
57
-	 * @var string
58
-	 */
59
-	const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
-
61
-	/**
62
-	 * @var string
63
-	 */
64
-	private $html = '';
65
-
66
-	/**
67
-	 * @var string
68
-	 */
69
-	private $css = '';
70
-
71
-	/**
72
-	 * @var array<string>
73
-	 */
74
-	private $unprocessableHtmlTags = array('wbr');
75
-
76
-	/**
77
-	 * @var array<array>
78
-	 */
79
-	private $caches = array(
80
-		self::CACHE_KEY_CSS => array(),
81
-		self::CACHE_KEY_SELECTOR => array(),
82
-		self::CACHE_KEY_XPATH => array(),
83
-		self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
-	);
85
-
86
-	/**
87
-	 * the visited nodes with the XPath paths as array keys.
88
-	 *
89
-	 * @var array<\DOMNode>
90
-	 */
91
-	private $visitedNodes = array();
92
-
93
-	/**
94
-	 * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
-	 * as key/value pairs for the inner array.
96
-	 *
97
-	 * @var array<array><string>
98
-	 */
99
-	private $styleAttributesForNodes = array();
100
-
101
-	/**
102
-	 * This attribute applies to the case where you want to preserve your original text encoding.
103
-	 *
104
-	 * By default, emogrifier translates your text into HTML entities for two reasons:
105
-	 *
106
-	 * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
-	 *
108
-	 * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
-	 *
110
-	 * If you would like to preserve your original encoding, set this attribute to TRUE.
111
-	 *
112
-	 * @var boolean
113
-	 */
114
-	public $preserveEncoding = false;
115
-
116
-	public static $_media = '';
117
-
118
-	/**
119
-	 * The constructor.
120
-	 *
121
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
123
-	 */
124
-	public function __construct($html = '', $css = '') {
125
-		$this->setHtml($html);
126
-		$this->setCss($css);
127
-	}
128
-
129
-	/**
130
-	 * The destructor.
131
-	 */
132
-	public function __destruct() {
133
-		$this->purgeVisitedNodes();
134
-	}
135
-
136
-	/**
137
-	 * Sets the HTML to emogrify.
138
-	 *
139
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
-	 */
141
-	public function setHtml($html = '') {
142
-		$this->html = $html;
143
-	}
144
-
145
-	/**
146
-	 * Sets the CSS to merge with the HTML.
147
-	 *
148
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
149
-	 */
150
-	public function setCss($css = '') {
151
-		$this->css = $css;
152
-	}
153
-
154
-	/**
155
-	 * Clears all caches.
156
-	 */
157
-	private function clearAllCaches() {
158
-		$this->clearCache(self::CACHE_KEY_CSS);
159
-		$this->clearCache(self::CACHE_KEY_SELECTOR);
160
-		$this->clearCache(self::CACHE_KEY_XPATH);
161
-		$this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
-	}
163
-
164
-	/**
165
-	 * Clears a single cache by key.
166
-	 *
167
-	 * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
-	 *
169
-	 * @throws InvalidArgumentException
170
-	 */
171
-	private function clearCache($key) {
172
-		$allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
-		if (!in_array($key, $allowedCacheKeys, true)) {
174
-			throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
-		}
176
-
177
-		$this->caches[$key] = array();
178
-	}
179
-
180
-	/**
181
-	 * Purges the visited nodes.
182
-	 */
183
-	private function purgeVisitedNodes() {
184
-		$this->visitedNodes = array();
185
-		$this->styleAttributesForNodes = array();
186
-	}
187
-
188
-	/**
189
-	 * Marks a tag for removal.
190
-	 *
191
-	 * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
-	 * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
-	 *
194
-	 * Note: The tags will not be removed if they have any content.
195
-	 *
196
-	 * @param string $tagName the tag name, e.g., "p"
197
-	 */
198
-	public function addUnprocessableHtmlTag($tagName) {
199
-		$this->unprocessableHtmlTags[] = $tagName;
200
-	}
201
-
202
-	/**
203
-	 * Drops a tag from the removal list.
204
-	 *
205
-	 * @param string $tagName the tag name, e.g., "p"
206
-	 */
207
-	public function removeUnprocessableHtmlTag($tagName) {
208
-		$key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
-		if ($key !== false) {
210
-			unset($this->unprocessableHtmlTags[$key]);
211
-		}
212
-	}
213
-
214
-	/**
215
-	 * Applies the CSS you submit to the HTML you submit.
216
-	 *
217
-	 * This method places the CSS inline.
218
-	 *
219
-	 * @return string
220
-	 *
221
-	 * @throws BadMethodCallException
222
-	 */
223
-	public function emogrify() {
224
-		if ($this->html === '') {
225
-			throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
-		}
227
-
228
-		$xmlDocument = $this->createXmlDocument();
229
-		$xpath = new DOMXPath($xmlDocument);
230
-		$this->clearAllCaches();
231
-
232
-		// before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
-		// we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
-		// also store a reference of nodes with existing inline styles so we don't overwrite them
235
-		$this->purgeVisitedNodes();
236
-
237
-		$nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
-		if ($nodesWithStyleAttributes !== false) {
239
-			/** @var $nodeWithStyleAttribute DOMNode */
240
-			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
-
243
-				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
-				$nodePath = $node->getNodePath();
245
-				if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
-					$this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
-					$this->visitedNodes[$nodePath] = $node;
248
-				}
249
-
250
-				$node->setAttribute('style', $normalizedOriginalStyle);
251
-			}
252
-		}
253
-
254
-		// grab any existing style blocks from the html and append them to the existing CSS
255
-		// (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
-		$allCss = $this->css;
257
-
258
-		$allCss .= $this->getCssFromAllStyleNodes($xpath);
259
-
260
-		$cssParts = $this->splitCssAndMediaQuery($allCss);
261
-		self::$_media = ''; // reset
262
-
263
-		$cssKey = md5($cssParts['css']);
264
-		if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
-			// process the CSS file for selectors and definitions
266
-			preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
-
268
-			$allSelectors = array();
269
-			foreach ($matches as $key => $selectorString) {
270
-				// if there is a blank definition, skip
271
-				if (!strlen(trim($selectorString[2]))) {
272
-					continue;
273
-				}
274
-
275
-				// else split by commas and duplicate attributes so we can sort by selector precedence
276
-				$selectors = explode(',', $selectorString[1]);
277
-				foreach ($selectors as $selector) {
278
-					// don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
-					if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
-						continue;
281
-					}
282
-
283
-					$allSelectors[] = array('selector' => trim($selector),
284
-											 'attributes' => trim($selectorString[2]),
285
-											 // keep track of where it appears in the file, since order is important
286
-											 'line' => $key,
287
-					);
288
-				}
289
-			}
290
-
291
-			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
-
294
-			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
-		}
296
-
297
-		foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
-			// query the body for the xpath selector
299
-			$nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
-
301
-			/** @var $node \DOMNode */
302
-			foreach ($nodesMatchingCssSelectors as $node) {
303
-				// if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
-				if ($node->hasAttribute('style')) {
305
-					// break it up into an associative array
306
-					$oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
-				} else {
308
-					$oldStyleDeclarations = array();
309
-				}
310
-				$newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
-				$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
-			}
313
-		}
314
-
315
-		// now iterate through the nodes that contained inline styles in the original HTML
316
-		foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
-			$node = $this->visitedNodes[$nodePath];
318
-			$currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
-			$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
-		}
321
-
322
-		// This removes styles from your email that contain display:none.
323
-		// We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
-		// lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
-		// to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
-		$nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
-		// The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
-		// we don't try to call removeChild on a nonexistent child node
329
-		if ($nodesWithStyleDisplayNone->length > 0) {
330
-			/** @var $node \DOMNode */
331
-			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
-					$node->parentNode->removeChild($node);
334
-				}
335
-			}
336
-		}
337
-
338
-		$this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
-
340
-		if ($this->preserveEncoding) {
341
-			if ( function_exists( 'mb_convert_encoding' ) ) {
342
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
343
-			} else {
344
-				return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
345
-			}
346
-		} else {
347
-			return $xmlDocument->saveHTML();
348
-		}
349
-	}
350
-
351
-	public function strtolower(array $m) {
352
-		return strtolower($m[0]);
353
-	}
354
-
355
-
356
-	/**
357
-	 * This method merges old or existing name/value array with new name/value array.
358
-	 * and then generates a string of the combined style suitable for placing inline.
359
-	 * This becomes the single point for CSS string generation allowing for consistent.
360
-	 * CSS output no matter where the CSS originally came from.
361
-	 * @param array $oldStyles
362
-	 * @param array $newStyles
363
-	 * @return string
364
-	 */
365
-	private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
366
-		$combinedStyles = array_merge($oldStyles, $newStyles);
367
-		$style = '';
368
-		foreach ($combinedStyles as $attributeName => $attributeValue) {
369
-			$style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
370
-		}
371
-		return trim($style);
372
-	}
373
-
374
-
375
-	/**
376
-	 * Copies the media part from CSS array parts to $xmlDocument.
377
-	 *
378
-	 * @param array $cssParts
379
-	 * @param DOMDocument $xmlDocument
380
-	 */
381
-	public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
382
-		if (isset($cssParts['media']) && $cssParts['media'] !== '') {
383
-			$this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
384
-		}
385
-	}
386
-
387
-	/**
388
-	 * Returns CSS content.
389
-	 *
390
-	 * @param DOMXPath $xpath
391
-	 * @return string
392
-	 */
393
-	private function getCssFromAllStyleNodes(DOMXPath $xpath) {
394
-		$styleNodes = $xpath->query('//style');
395
-
396
-		if ($styleNodes === false) {
397
-			return '';
398
-		}
399
-
400
-		$css = '';
401
-		/** @var $styleNode DOMNode */
402
-		foreach ($styleNodes as $styleNode) {
403
-			$css .= "\n\n" . $styleNode->nodeValue;
404
-			$styleNode->parentNode->removeChild($styleNode);
405
-		}
406
-
407
-		return $css;
408
-	}
409
-
410
-	/**
411
-	 * Adds a style element with $css to $document.
412
-	 *
413
-	 * @param DOMDocument $document
414
-	 * @param string $css
415
-	 */
416
-	private function addStyleElementToDocument(DOMDocument $document, $css) {
417
-		$styleElement = $document->createElement('style', $css);
418
-		$styleAttribute = $document->createAttribute('type');
419
-		$styleAttribute->value = 'text/css';
420
-		$styleElement->appendChild($styleAttribute);
421
-
422
-		$head = $this->getOrCreateHeadElement($document);
423
-		$head->appendChild($styleElement);
424
-	}
425
-
426
-	/**
427
-	 * Returns the existing or creates a new head element in $document.
428
-	 *
429
-	 * @param DOMDocument $document
430
-	 * @return DOMNode the head element
431
-	 */
432
-	private function getOrCreateHeadElement(DOMDocument $document) {
433
-		$head = $document->getElementsByTagName('head')->item(0);
434
-
435
-		if ($head === null) {
436
-			$head = $document->createElement('head');
437
-			$html = $document->getElementsByTagName('html')->item(0);
438
-			$html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
439
-		}
440
-
441
-		return $head;
442
-	}
443
-
444
-	/**
445
-	 * Splits input CSS code to an array where:
446
-	 *
447
-	 * - key "css" will be contains clean CSS code.
448
-	 * - key "media" will be contains all valuable media queries.
449
-	 *
450
-	 * Example:
451
-	 *
452
-	 * The CSS code.
453
-	 *
454
-	 *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
455
-	 *
456
-	 * will be parsed into the following array:
457
-	 *
458
-	 *   "css" => "h1 { color:red; }"
459
-	 *   "media" => "@media { h1 {}}"
460
-	 *
461
-	 * @param string $css
462
-	 * @return array
463
-	 */
464
-	private function splitCssAndMediaQuery($css) {
465
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
466
-
467
-		// filter the CSS
468
-		$search = array(
469
-			// get rid of css comment code
470
-			'/\\/\\*.*\\*\\//sU',
471
-			// strip out any import directives
472
-			'/^\\s*@import\\s[^;]+;/misU',
473
-			// strip remains media enclosures
474
-			'/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
475
-		);
476
-
477
-		$replace = array(
478
-			'',
479
-			'',
480
-			'',
481
-		);
482
-
483
-		// clean CSS before output
484
-		$css = preg_replace($search, $replace, $css);
485
-
486
-		return array('css' => $css, 'media' => self::$_media);
487
-	}
488
-
489
-	private function _media_concat( $matches ) {
490
-		self::$_media .= $matches[0];
491
-	}
492
-
493
-	/**
494
-	 * Creates a DOMDocument instance with the current HTML.
495
-	 *
496
-	 * @return DOMDocument
497
-	 */
498
-	private function createXmlDocument() {
499
-		$xmlDocument = new DOMDocument;
500
-		$xmlDocument->encoding = self::ENCODING;
501
-		$xmlDocument->strictErrorChecking = false;
502
-		$xmlDocument->formatOutput = true;
503
-		$libXmlState = libxml_use_internal_errors(true);
504
-		$xmlDocument->loadHTML($this->getUnifiedHtml());
505
-		libxml_clear_errors();
506
-		libxml_use_internal_errors($libXmlState);
507
-		$xmlDocument->normalizeDocument();
508
-
509
-		return $xmlDocument;
510
-	}
511
-
512
-	/**
513
-	 * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
514
-	 *
515
-	 * @return string the unified HTML
516
-	 *
517
-	 * @throws BadMethodCallException
518
-	 */
519
-	private function getUnifiedHtml() {
520
-		if (!empty($this->unprocessableHtmlTags)) {
521
-			$unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
522
-			$bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
523
-		} else {
524
-			$bodyWithoutUnprocessableTags = $this->html;
525
-		}
526
-
527
-		if ( function_exists( 'mb_convert_encoding' ) ) {
528
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
529
-		} else {
530
-			return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
531
-		}
532
-	}
533
-
534
-	/**
535
-	 * @param array $a
536
-	 * @param array $b
537
-	 *
538
-	 * @return integer
539
-	 */
540
-	private function sortBySelectorPrecedence(array $a, array $b) {
541
-		$precedenceA = $this->getCssSelectorPrecedence($a['selector']);
542
-		$precedenceB = $this->getCssSelectorPrecedence($b['selector']);
543
-
544
-		// We want these sorted in ascending order so selectors with lesser precedence get processed first and
545
-		// selectors with greater precedence get sorted last.
546
-		// The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
547
-		// arithmetic operators.
548
-		// @see http://forge.typo3.org/issues/55605
549
-		$precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
550
-		$precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
551
-		return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
552
-	}
553
-
554
-	/**
555
-	 * @param string $selector
556
-	 *
557
-	 * @return integer
558
-	 */
559
-	private function getCssSelectorPrecedence($selector) {
560
-		$selectorKey = md5($selector);
561
-		if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
562
-			$precedence = 0;
563
-			$value = 100;
564
-			// ids: worth 100, classes: worth 10, elements: worth 1
565
-			$search = array('\\#','\\.','');
566
-
567
-			foreach ($search as $s) {
568
-				if (trim($selector == '')) {
569
-					break;
570
-				}
571
-				$number = 0;
572
-				$selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
573
-				$precedence += ($value * $number);
574
-				$value /= 10;
575
-			}
576
-			$this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
577
-		}
578
-
579
-		return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
580
-	}
581
-
582
-	/**
583
-	 * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
584
-	 *
585
-	 * @see http://plasmasturm.org/log/444/
586
-	 *
587
-	 * @param string $paramCssSelector
588
-	 *
589
-	 * @return string
590
-	 */
591
-	private function translateCssToXpath($paramCssSelector) {
592
-		$cssSelector = ' ' . $paramCssSelector . ' ';
593
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
594
-		$cssSelector = trim($cssSelector);
595
-		$xpathKey = md5($cssSelector);
596
-		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
597
-			// returns an Xpath selector
598
-			$search = array(
599
-				// Matches any element that is a child of parent.
600
-				'/\\s+>\\s+/',
601
-				// Matches any element that is an adjacent sibling.
602
-				'/\\s+\\+\\s+/',
603
-				// Matches any element that is a descendant of an parent element element.
604
-				'/\\s+/',
605
-				// first-child pseudo-selector
606
-				'/([^\\/]+):first-child/i',
607
-				// last-child pseudo-selector
608
-				'/([^\\/]+):last-child/i',
609
-				// Matches attribute only selector
610
-				'/^\\[(\\w+)\\]/',
611
-				// Matches element with attribute
612
-				'/(\\w)\\[(\\w+)\\]/',
613
-				// Matches element with EXACT attribute
614
-				'/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
615
-			);
616
-			$replace = array(
617
-				'/',
618
-				'/following-sibling::*[1]/self::',
619
-				'//',
620
-				'*[1]/self::\\1',
621
-				'*[last()]/self::\\1',
622
-				'*[@\\1]',
623
-				'\\1[@\\2]',
624
-				'\\1[@\\2="\\3"]',
625
-			);
626
-
627
-			$cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
628
-
629
-			$cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
630
-			$cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
631
-
632
-			// Advanced selectors are going to require a bit more advanced emogrification.
633
-			// When we required PHP 5.3, we could do this with closures.
634
-			$cssSelector = preg_replace_callback(
635
-				'/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
636
-				array($this, 'translateNthChild'), $cssSelector
637
-			);
638
-			$cssSelector = preg_replace_callback(
639
-				'/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
640
-				array($this, 'translateNthOfType'), $cssSelector
641
-			);
642
-
643
-			$this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
644
-		}
645
-		return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
646
-	}
647
-
648
-	/**
649
-	 * @param array $match
650
-	 *
651
-	 * @return string
652
-	 */
653
-	private function matchIdAttributes(array $match) {
654
-		return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
655
-	}
656
-
657
-	/**
658
-	 * @param array $match
659
-	 *
660
-	 * @return string
661
-	 */
662
-	private function matchClassAttributes(array $match) {
663
-		return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
664
-			implode(
665
-				'"," "))][contains(concat(" ",@class," "),concat(" ","',
666
-				explode('.', substr($match[2], 1))
667
-			) . '"," "))]';
668
-	}
669
-
670
-	/**
671
-	 * @param array $match
672
-	 *
673
-	 * @return string
674
-	 */
675
-	private function translateNthChild(array $match) {
676
-		$result = $this->parseNth($match);
677
-
678
-		if (isset($result[self::MULTIPLIER])) {
679
-			if ($result[self::MULTIPLIER] < 0) {
680
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
681
-				return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
682
-			} else {
683
-				return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
684
-			}
685
-		} else {
686
-			return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
687
-		}
688
-	}
689
-
690
-	/**
691
-	 * @param array $match
692
-	 *
693
-	 * @return string
694
-	 */
695
-	private function translateNthOfType(array $match) {
696
-		$result = $this->parseNth($match);
697
-
698
-		if (isset($result[self::MULTIPLIER])) {
699
-			if ($result[self::MULTIPLIER] < 0) {
700
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
-				return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
702
-			} else {
703
-				return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
704
-			}
705
-		} else {
706
-			return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
707
-		}
708
-	}
709
-
710
-	/**
711
-	 * @param array $match
712
-	 *
713
-	 * @return array
714
-	 */
715
-	private function parseNth(array $match) {
716
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
717
-			$index = strtolower($match[2]) == 'even' ? 0 : 1;
718
-			return array(self::MULTIPLIER => 2, self::INDEX => $index);
719
-		} elseif (stripos($match[2], 'n') === false) {
720
-			// if there is a multiplier
721
-			$index = intval(str_replace(' ', '', $match[2]));
722
-			return array(self::INDEX => $index);
723
-		} else {
724
-			if (isset($match[3])) {
725
-				$multipleTerm = str_replace($match[3], '', $match[2]);
726
-				$index = intval(str_replace(' ', '', $match[3]));
727
-			} else {
728
-				$multipleTerm = $match[2];
729
-				$index = 0;
730
-			}
731
-
732
-			$multiplier = str_ireplace('n', '', $multipleTerm);
733
-
734
-			if (!strlen($multiplier)) {
735
-				$multiplier = 1;
736
-			} elseif ($multiplier == 0) {
737
-				return array(self::INDEX => $index);
738
-			} else {
739
-				$multiplier = intval($multiplier);
740
-			}
741
-
742
-			while ($index < 0) {
743
-				$index += abs($multiplier);
744
-			}
745
-
746
-			return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
747
-		}
748
-	}
749
-
750
-	/**
751
-	 * Parses a CSS declaration block into property name/value pairs.
752
-	 *
753
-	 * Example:
754
-	 *
755
-	 * The declaration block.
756
-	 *
757
-	 *   "color: #000; font-weight: bold;".
758
-	 *
759
-	 * will be parsed into the following array:
760
-	 *
761
-	 *   "color" => "#000"
762
-	 *   "font-weight" => "bold"
763
-	 *
764
-	 * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
765
-	 *
766
-	 * @return array the CSS declarations with the property names as array keys and the property values as array values
767
-	 */
768
-	private function parseCssDeclarationBlock($cssDeclarationBlock) {
769
-		if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
770
-			return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
771
-		}
772
-
773
-		$properties = array();
774
-		$declarations = explode(';', $cssDeclarationBlock);
775
-		foreach ($declarations as $declaration) {
776
-			$matches = array();
777
-			if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
778
-				continue;
779
-			}
780
-			$propertyName = strtolower($matches[1]);
781
-			$propertyValue = $matches[2];
782
-			$properties[$propertyName] = $propertyValue;
783
-		}
784
-		$this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
785
-
786
-		return $properties;
787
-	}
12
+    /**
13
+     * @var string
14
+     */
15
+    const ENCODING = 'UTF-8';
16
+
17
+    /**
18
+     * @var integer
19
+     */
20
+    const CACHE_KEY_CSS = 0;
21
+
22
+    /**
23
+     * @var integer
24
+     */
25
+    const CACHE_KEY_SELECTOR = 1;
26
+
27
+    /**
28
+     * @var integer
29
+     */
30
+    const CACHE_KEY_XPATH = 2;
31
+
32
+    /**
33
+     * @var integer
34
+     */
35
+    const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
+
37
+    /**
38
+     * for calculating nth-of-type and nth-child selectors.
39
+     *
40
+     * @var integer
41
+     */
42
+    const INDEX = 0;
43
+
44
+    /**
45
+     * for calculating nth-of-type and nth-child selectors.
46
+     *
47
+     * @var integer
48
+     */
49
+    const MULTIPLIER = 1;
50
+
51
+    /**
52
+     * @var string
53
+     */
54
+    const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
+
56
+    /**
57
+     * @var string
58
+     */
59
+    const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
+
61
+    /**
62
+     * @var string
63
+     */
64
+    private $html = '';
65
+
66
+    /**
67
+     * @var string
68
+     */
69
+    private $css = '';
70
+
71
+    /**
72
+     * @var array<string>
73
+     */
74
+    private $unprocessableHtmlTags = array('wbr');
75
+
76
+    /**
77
+     * @var array<array>
78
+     */
79
+    private $caches = array(
80
+        self::CACHE_KEY_CSS => array(),
81
+        self::CACHE_KEY_SELECTOR => array(),
82
+        self::CACHE_KEY_XPATH => array(),
83
+        self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
+    );
85
+
86
+    /**
87
+     * the visited nodes with the XPath paths as array keys.
88
+     *
89
+     * @var array<\DOMNode>
90
+     */
91
+    private $visitedNodes = array();
92
+
93
+    /**
94
+     * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
+     * as key/value pairs for the inner array.
96
+     *
97
+     * @var array<array><string>
98
+     */
99
+    private $styleAttributesForNodes = array();
100
+
101
+    /**
102
+     * This attribute applies to the case where you want to preserve your original text encoding.
103
+     *
104
+     * By default, emogrifier translates your text into HTML entities for two reasons:
105
+     *
106
+     * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
+     *
108
+     * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
+     *
110
+     * If you would like to preserve your original encoding, set this attribute to TRUE.
111
+     *
112
+     * @var boolean
113
+     */
114
+    public $preserveEncoding = false;
115
+
116
+    public static $_media = '';
117
+
118
+    /**
119
+     * The constructor.
120
+     *
121
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
+     * @param string $css the CSS to merge, must be UTF-8-encoded
123
+     */
124
+    public function __construct($html = '', $css = '') {
125
+        $this->setHtml($html);
126
+        $this->setCss($css);
127
+    }
128
+
129
+    /**
130
+     * The destructor.
131
+     */
132
+    public function __destruct() {
133
+        $this->purgeVisitedNodes();
134
+    }
135
+
136
+    /**
137
+     * Sets the HTML to emogrify.
138
+     *
139
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
+     */
141
+    public function setHtml($html = '') {
142
+        $this->html = $html;
143
+    }
144
+
145
+    /**
146
+     * Sets the CSS to merge with the HTML.
147
+     *
148
+     * @param string $css the CSS to merge, must be UTF-8-encoded
149
+     */
150
+    public function setCss($css = '') {
151
+        $this->css = $css;
152
+    }
153
+
154
+    /**
155
+     * Clears all caches.
156
+     */
157
+    private function clearAllCaches() {
158
+        $this->clearCache(self::CACHE_KEY_CSS);
159
+        $this->clearCache(self::CACHE_KEY_SELECTOR);
160
+        $this->clearCache(self::CACHE_KEY_XPATH);
161
+        $this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
+    }
163
+
164
+    /**
165
+     * Clears a single cache by key.
166
+     *
167
+     * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
+     *
169
+     * @throws InvalidArgumentException
170
+     */
171
+    private function clearCache($key) {
172
+        $allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
+        if (!in_array($key, $allowedCacheKeys, true)) {
174
+            throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
+        }
176
+
177
+        $this->caches[$key] = array();
178
+    }
179
+
180
+    /**
181
+     * Purges the visited nodes.
182
+     */
183
+    private function purgeVisitedNodes() {
184
+        $this->visitedNodes = array();
185
+        $this->styleAttributesForNodes = array();
186
+    }
187
+
188
+    /**
189
+     * Marks a tag for removal.
190
+     *
191
+     * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
+     * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
+     *
194
+     * Note: The tags will not be removed if they have any content.
195
+     *
196
+     * @param string $tagName the tag name, e.g., "p"
197
+     */
198
+    public function addUnprocessableHtmlTag($tagName) {
199
+        $this->unprocessableHtmlTags[] = $tagName;
200
+    }
201
+
202
+    /**
203
+     * Drops a tag from the removal list.
204
+     *
205
+     * @param string $tagName the tag name, e.g., "p"
206
+     */
207
+    public function removeUnprocessableHtmlTag($tagName) {
208
+        $key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
+        if ($key !== false) {
210
+            unset($this->unprocessableHtmlTags[$key]);
211
+        }
212
+    }
213
+
214
+    /**
215
+     * Applies the CSS you submit to the HTML you submit.
216
+     *
217
+     * This method places the CSS inline.
218
+     *
219
+     * @return string
220
+     *
221
+     * @throws BadMethodCallException
222
+     */
223
+    public function emogrify() {
224
+        if ($this->html === '') {
225
+            throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
+        }
227
+
228
+        $xmlDocument = $this->createXmlDocument();
229
+        $xpath = new DOMXPath($xmlDocument);
230
+        $this->clearAllCaches();
231
+
232
+        // before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
+        // we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
+        // also store a reference of nodes with existing inline styles so we don't overwrite them
235
+        $this->purgeVisitedNodes();
236
+
237
+        $nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
+        if ($nodesWithStyleAttributes !== false) {
239
+            /** @var $nodeWithStyleAttribute DOMNode */
240
+            foreach ($nodesWithStyleAttributes as $node) {
241
+                $normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
+
243
+                // in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
+                $nodePath = $node->getNodePath();
245
+                if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
+                    $this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
+                    $this->visitedNodes[$nodePath] = $node;
248
+                }
249
+
250
+                $node->setAttribute('style', $normalizedOriginalStyle);
251
+            }
252
+        }
253
+
254
+        // grab any existing style blocks from the html and append them to the existing CSS
255
+        // (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
+        $allCss = $this->css;
257
+
258
+        $allCss .= $this->getCssFromAllStyleNodes($xpath);
259
+
260
+        $cssParts = $this->splitCssAndMediaQuery($allCss);
261
+        self::$_media = ''; // reset
262
+
263
+        $cssKey = md5($cssParts['css']);
264
+        if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
+            // process the CSS file for selectors and definitions
266
+            preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
+
268
+            $allSelectors = array();
269
+            foreach ($matches as $key => $selectorString) {
270
+                // if there is a blank definition, skip
271
+                if (!strlen(trim($selectorString[2]))) {
272
+                    continue;
273
+                }
274
+
275
+                // else split by commas and duplicate attributes so we can sort by selector precedence
276
+                $selectors = explode(',', $selectorString[1]);
277
+                foreach ($selectors as $selector) {
278
+                    // don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
+                    if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
+                        continue;
281
+                    }
282
+
283
+                    $allSelectors[] = array('selector' => trim($selector),
284
+                                                'attributes' => trim($selectorString[2]),
285
+                                                // keep track of where it appears in the file, since order is important
286
+                                                'line' => $key,
287
+                    );
288
+                }
289
+            }
290
+
291
+            // now sort the selectors by precedence
292
+            usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
+
294
+            $this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
+        }
296
+
297
+        foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
+            // query the body for the xpath selector
299
+            $nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
+
301
+            /** @var $node \DOMNode */
302
+            foreach ($nodesMatchingCssSelectors as $node) {
303
+                // if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
+                if ($node->hasAttribute('style')) {
305
+                    // break it up into an associative array
306
+                    $oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
+                } else {
308
+                    $oldStyleDeclarations = array();
309
+                }
310
+                $newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
+                $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
+            }
313
+        }
314
+
315
+        // now iterate through the nodes that contained inline styles in the original HTML
316
+        foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
+            $node = $this->visitedNodes[$nodePath];
318
+            $currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
+            $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
+        }
321
+
322
+        // This removes styles from your email that contain display:none.
323
+        // We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
+        // lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
+        // to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
+        $nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
+        // The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
+        // we don't try to call removeChild on a nonexistent child node
329
+        if ($nodesWithStyleDisplayNone->length > 0) {
330
+            /** @var $node \DOMNode */
331
+            foreach ($nodesWithStyleDisplayNone as $node) {
332
+                if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
+                    $node->parentNode->removeChild($node);
334
+                }
335
+            }
336
+        }
337
+
338
+        $this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
+
340
+        if ($this->preserveEncoding) {
341
+            if ( function_exists( 'mb_convert_encoding' ) ) {
342
+                return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
343
+            } else {
344
+                return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
345
+            }
346
+        } else {
347
+            return $xmlDocument->saveHTML();
348
+        }
349
+    }
350
+
351
+    public function strtolower(array $m) {
352
+        return strtolower($m[0]);
353
+    }
354
+
355
+
356
+    /**
357
+     * This method merges old or existing name/value array with new name/value array.
358
+     * and then generates a string of the combined style suitable for placing inline.
359
+     * This becomes the single point for CSS string generation allowing for consistent.
360
+     * CSS output no matter where the CSS originally came from.
361
+     * @param array $oldStyles
362
+     * @param array $newStyles
363
+     * @return string
364
+     */
365
+    private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
366
+        $combinedStyles = array_merge($oldStyles, $newStyles);
367
+        $style = '';
368
+        foreach ($combinedStyles as $attributeName => $attributeValue) {
369
+            $style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
370
+        }
371
+        return trim($style);
372
+    }
373
+
374
+
375
+    /**
376
+     * Copies the media part from CSS array parts to $xmlDocument.
377
+     *
378
+     * @param array $cssParts
379
+     * @param DOMDocument $xmlDocument
380
+     */
381
+    public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
382
+        if (isset($cssParts['media']) && $cssParts['media'] !== '') {
383
+            $this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
384
+        }
385
+    }
386
+
387
+    /**
388
+     * Returns CSS content.
389
+     *
390
+     * @param DOMXPath $xpath
391
+     * @return string
392
+     */
393
+    private function getCssFromAllStyleNodes(DOMXPath $xpath) {
394
+        $styleNodes = $xpath->query('//style');
395
+
396
+        if ($styleNodes === false) {
397
+            return '';
398
+        }
399
+
400
+        $css = '';
401
+        /** @var $styleNode DOMNode */
402
+        foreach ($styleNodes as $styleNode) {
403
+            $css .= "\n\n" . $styleNode->nodeValue;
404
+            $styleNode->parentNode->removeChild($styleNode);
405
+        }
406
+
407
+        return $css;
408
+    }
409
+
410
+    /**
411
+     * Adds a style element with $css to $document.
412
+     *
413
+     * @param DOMDocument $document
414
+     * @param string $css
415
+     */
416
+    private function addStyleElementToDocument(DOMDocument $document, $css) {
417
+        $styleElement = $document->createElement('style', $css);
418
+        $styleAttribute = $document->createAttribute('type');
419
+        $styleAttribute->value = 'text/css';
420
+        $styleElement->appendChild($styleAttribute);
421
+
422
+        $head = $this->getOrCreateHeadElement($document);
423
+        $head->appendChild($styleElement);
424
+    }
425
+
426
+    /**
427
+     * Returns the existing or creates a new head element in $document.
428
+     *
429
+     * @param DOMDocument $document
430
+     * @return DOMNode the head element
431
+     */
432
+    private function getOrCreateHeadElement(DOMDocument $document) {
433
+        $head = $document->getElementsByTagName('head')->item(0);
434
+
435
+        if ($head === null) {
436
+            $head = $document->createElement('head');
437
+            $html = $document->getElementsByTagName('html')->item(0);
438
+            $html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
439
+        }
440
+
441
+        return $head;
442
+    }
443
+
444
+    /**
445
+     * Splits input CSS code to an array where:
446
+     *
447
+     * - key "css" will be contains clean CSS code.
448
+     * - key "media" will be contains all valuable media queries.
449
+     *
450
+     * Example:
451
+     *
452
+     * The CSS code.
453
+     *
454
+     *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
455
+     *
456
+     * will be parsed into the following array:
457
+     *
458
+     *   "css" => "h1 { color:red; }"
459
+     *   "media" => "@media { h1 {}}"
460
+     *
461
+     * @param string $css
462
+     * @return array
463
+     */
464
+    private function splitCssAndMediaQuery($css) {
465
+        $css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
466
+
467
+        // filter the CSS
468
+        $search = array(
469
+            // get rid of css comment code
470
+            '/\\/\\*.*\\*\\//sU',
471
+            // strip out any import directives
472
+            '/^\\s*@import\\s[^;]+;/misU',
473
+            // strip remains media enclosures
474
+            '/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
475
+        );
476
+
477
+        $replace = array(
478
+            '',
479
+            '',
480
+            '',
481
+        );
482
+
483
+        // clean CSS before output
484
+        $css = preg_replace($search, $replace, $css);
485
+
486
+        return array('css' => $css, 'media' => self::$_media);
487
+    }
488
+
489
+    private function _media_concat( $matches ) {
490
+        self::$_media .= $matches[0];
491
+    }
492
+
493
+    /**
494
+     * Creates a DOMDocument instance with the current HTML.
495
+     *
496
+     * @return DOMDocument
497
+     */
498
+    private function createXmlDocument() {
499
+        $xmlDocument = new DOMDocument;
500
+        $xmlDocument->encoding = self::ENCODING;
501
+        $xmlDocument->strictErrorChecking = false;
502
+        $xmlDocument->formatOutput = true;
503
+        $libXmlState = libxml_use_internal_errors(true);
504
+        $xmlDocument->loadHTML($this->getUnifiedHtml());
505
+        libxml_clear_errors();
506
+        libxml_use_internal_errors($libXmlState);
507
+        $xmlDocument->normalizeDocument();
508
+
509
+        return $xmlDocument;
510
+    }
511
+
512
+    /**
513
+     * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
514
+     *
515
+     * @return string the unified HTML
516
+     *
517
+     * @throws BadMethodCallException
518
+     */
519
+    private function getUnifiedHtml() {
520
+        if (!empty($this->unprocessableHtmlTags)) {
521
+            $unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
522
+            $bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
523
+        } else {
524
+            $bodyWithoutUnprocessableTags = $this->html;
525
+        }
526
+
527
+        if ( function_exists( 'mb_convert_encoding' ) ) {
528
+            return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
529
+        } else {
530
+            return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
531
+        }
532
+    }
533
+
534
+    /**
535
+     * @param array $a
536
+     * @param array $b
537
+     *
538
+     * @return integer
539
+     */
540
+    private function sortBySelectorPrecedence(array $a, array $b) {
541
+        $precedenceA = $this->getCssSelectorPrecedence($a['selector']);
542
+        $precedenceB = $this->getCssSelectorPrecedence($b['selector']);
543
+
544
+        // We want these sorted in ascending order so selectors with lesser precedence get processed first and
545
+        // selectors with greater precedence get sorted last.
546
+        // The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
547
+        // arithmetic operators.
548
+        // @see http://forge.typo3.org/issues/55605
549
+        $precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
550
+        $precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
551
+        return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
552
+    }
553
+
554
+    /**
555
+     * @param string $selector
556
+     *
557
+     * @return integer
558
+     */
559
+    private function getCssSelectorPrecedence($selector) {
560
+        $selectorKey = md5($selector);
561
+        if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
562
+            $precedence = 0;
563
+            $value = 100;
564
+            // ids: worth 100, classes: worth 10, elements: worth 1
565
+            $search = array('\\#','\\.','');
566
+
567
+            foreach ($search as $s) {
568
+                if (trim($selector == '')) {
569
+                    break;
570
+                }
571
+                $number = 0;
572
+                $selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
573
+                $precedence += ($value * $number);
574
+                $value /= 10;
575
+            }
576
+            $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
577
+        }
578
+
579
+        return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
580
+    }
581
+
582
+    /**
583
+     * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
584
+     *
585
+     * @see http://plasmasturm.org/log/444/
586
+     *
587
+     * @param string $paramCssSelector
588
+     *
589
+     * @return string
590
+     */
591
+    private function translateCssToXpath($paramCssSelector) {
592
+        $cssSelector = ' ' . $paramCssSelector . ' ';
593
+        $cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
594
+        $cssSelector = trim($cssSelector);
595
+        $xpathKey = md5($cssSelector);
596
+        if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
597
+            // returns an Xpath selector
598
+            $search = array(
599
+                // Matches any element that is a child of parent.
600
+                '/\\s+>\\s+/',
601
+                // Matches any element that is an adjacent sibling.
602
+                '/\\s+\\+\\s+/',
603
+                // Matches any element that is a descendant of an parent element element.
604
+                '/\\s+/',
605
+                // first-child pseudo-selector
606
+                '/([^\\/]+):first-child/i',
607
+                // last-child pseudo-selector
608
+                '/([^\\/]+):last-child/i',
609
+                // Matches attribute only selector
610
+                '/^\\[(\\w+)\\]/',
611
+                // Matches element with attribute
612
+                '/(\\w)\\[(\\w+)\\]/',
613
+                // Matches element with EXACT attribute
614
+                '/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
615
+            );
616
+            $replace = array(
617
+                '/',
618
+                '/following-sibling::*[1]/self::',
619
+                '//',
620
+                '*[1]/self::\\1',
621
+                '*[last()]/self::\\1',
622
+                '*[@\\1]',
623
+                '\\1[@\\2]',
624
+                '\\1[@\\2="\\3"]',
625
+            );
626
+
627
+            $cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
628
+
629
+            $cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
630
+            $cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
631
+
632
+            // Advanced selectors are going to require a bit more advanced emogrification.
633
+            // When we required PHP 5.3, we could do this with closures.
634
+            $cssSelector = preg_replace_callback(
635
+                '/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
636
+                array($this, 'translateNthChild'), $cssSelector
637
+            );
638
+            $cssSelector = preg_replace_callback(
639
+                '/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
640
+                array($this, 'translateNthOfType'), $cssSelector
641
+            );
642
+
643
+            $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
644
+        }
645
+        return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
646
+    }
647
+
648
+    /**
649
+     * @param array $match
650
+     *
651
+     * @return string
652
+     */
653
+    private function matchIdAttributes(array $match) {
654
+        return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
655
+    }
656
+
657
+    /**
658
+     * @param array $match
659
+     *
660
+     * @return string
661
+     */
662
+    private function matchClassAttributes(array $match) {
663
+        return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
664
+            implode(
665
+                '"," "))][contains(concat(" ",@class," "),concat(" ","',
666
+                explode('.', substr($match[2], 1))
667
+            ) . '"," "))]';
668
+    }
669
+
670
+    /**
671
+     * @param array $match
672
+     *
673
+     * @return string
674
+     */
675
+    private function translateNthChild(array $match) {
676
+        $result = $this->parseNth($match);
677
+
678
+        if (isset($result[self::MULTIPLIER])) {
679
+            if ($result[self::MULTIPLIER] < 0) {
680
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
681
+                return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
682
+            } else {
683
+                return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
684
+            }
685
+        } else {
686
+            return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
687
+        }
688
+    }
689
+
690
+    /**
691
+     * @param array $match
692
+     *
693
+     * @return string
694
+     */
695
+    private function translateNthOfType(array $match) {
696
+        $result = $this->parseNth($match);
697
+
698
+        if (isset($result[self::MULTIPLIER])) {
699
+            if ($result[self::MULTIPLIER] < 0) {
700
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
+                return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
702
+            } else {
703
+                return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
704
+            }
705
+        } else {
706
+            return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
707
+        }
708
+    }
709
+
710
+    /**
711
+     * @param array $match
712
+     *
713
+     * @return array
714
+     */
715
+    private function parseNth(array $match) {
716
+        if (in_array(strtolower($match[2]), array('even','odd'))) {
717
+            $index = strtolower($match[2]) == 'even' ? 0 : 1;
718
+            return array(self::MULTIPLIER => 2, self::INDEX => $index);
719
+        } elseif (stripos($match[2], 'n') === false) {
720
+            // if there is a multiplier
721
+            $index = intval(str_replace(' ', '', $match[2]));
722
+            return array(self::INDEX => $index);
723
+        } else {
724
+            if (isset($match[3])) {
725
+                $multipleTerm = str_replace($match[3], '', $match[2]);
726
+                $index = intval(str_replace(' ', '', $match[3]));
727
+            } else {
728
+                $multipleTerm = $match[2];
729
+                $index = 0;
730
+            }
731
+
732
+            $multiplier = str_ireplace('n', '', $multipleTerm);
733
+
734
+            if (!strlen($multiplier)) {
735
+                $multiplier = 1;
736
+            } elseif ($multiplier == 0) {
737
+                return array(self::INDEX => $index);
738
+            } else {
739
+                $multiplier = intval($multiplier);
740
+            }
741
+
742
+            while ($index < 0) {
743
+                $index += abs($multiplier);
744
+            }
745
+
746
+            return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
747
+        }
748
+    }
749
+
750
+    /**
751
+     * Parses a CSS declaration block into property name/value pairs.
752
+     *
753
+     * Example:
754
+     *
755
+     * The declaration block.
756
+     *
757
+     *   "color: #000; font-weight: bold;".
758
+     *
759
+     * will be parsed into the following array:
760
+     *
761
+     *   "color" => "#000"
762
+     *   "font-weight" => "bold"
763
+     *
764
+     * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
765
+     *
766
+     * @return array the CSS declarations with the property names as array keys and the property values as array values
767
+     */
768
+    private function parseCssDeclarationBlock($cssDeclarationBlock) {
769
+        if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
770
+            return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
771
+        }
772
+
773
+        $properties = array();
774
+        $declarations = explode(';', $cssDeclarationBlock);
775
+        foreach ($declarations as $declaration) {
776
+            $matches = array();
777
+            if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
778
+                continue;
779
+            }
780
+            $propertyName = strtolower($matches[1]);
781
+            $propertyValue = $matches[2];
782
+            $properties[$propertyName] = $propertyValue;
783
+        }
784
+        $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
785
+
786
+        return $properties;
787
+    }
788 788
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -238,7 +238,7 @@  discard block
 block discarded – undo
238 238
 		if ($nodesWithStyleAttributes !== false) {
239 239
 			/** @var $nodeWithStyleAttribute DOMNode */
240 240
 			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
241
+				$normalizedOriginalStyle = preg_replace_callback('/[A-z\\-]+(?=\\:)/S', array($this, 'strtolower'), $node->getAttribute('style'));
242 242
 
243 243
 				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244 244
 				$nodePath = $node->getNodePath();
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
 			}
290 290
 
291 291
 			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
292
+			usort($allSelectors, array($this, 'sortBySelectorPrecedence'));
293 293
 
294 294
 			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295 295
 		}
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
 		if ($nodesWithStyleDisplayNone->length > 0) {
330 330
 			/** @var $node \DOMNode */
331 331
 			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
332
+				if ($node->parentNode && is_callable(array($node->parentNode, 'removeChild'))) {
333 333
 					$node->parentNode->removeChild($node);
334 334
 				}
335 335
 			}
@@ -338,10 +338,10 @@  discard block
 block discarded – undo
338 338
 		$this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339 339
 
340 340
 		if ($this->preserveEncoding) {
341
-			if ( function_exists( 'mb_convert_encoding' ) ) {
342
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
341
+			if (function_exists('mb_convert_encoding')) {
342
+				return mb_convert_encoding($xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES');
343 343
 			} else {
344
-				return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
344
+				return htmlspecialchars_decode(utf8_encode(html_entity_decode($xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING)));
345 345
 			}
346 346
 		} else {
347 347
 			return $xmlDocument->saveHTML();
@@ -462,7 +462,7 @@  discard block
 block discarded – undo
462 462
 	 * @return array
463 463
 	 */
464 464
 	private function splitCssAndMediaQuery($css) {
465
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
465
+		$css = preg_replace_callback('#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array($this, '_media_concat'), $css);
466 466
 
467 467
 		// filter the CSS
468 468
 		$search = array(
@@ -486,7 +486,7 @@  discard block
 block discarded – undo
486 486
 		return array('css' => $css, 'media' => self::$_media);
487 487
 	}
488 488
 
489
-	private function _media_concat( $matches ) {
489
+	private function _media_concat($matches) {
490 490
 		self::$_media .= $matches[0];
491 491
 	}
492 492
 
@@ -524,10 +524,10 @@  discard block
 block discarded – undo
524 524
 			$bodyWithoutUnprocessableTags = $this->html;
525 525
 		}
526 526
 
527
-		if ( function_exists( 'mb_convert_encoding' ) ) {
528
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
527
+		if (function_exists('mb_convert_encoding')) {
528
+			return mb_convert_encoding($bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING);
529 529
 		} else {
530
-			return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
530
+			return htmlspecialchars_decode(utf8_decode(htmlentities($bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false)));
531 531
 		}
532 532
 	}
533 533
 
@@ -562,7 +562,7 @@  discard block
 block discarded – undo
562 562
 			$precedence = 0;
563 563
 			$value = 100;
564 564
 			// ids: worth 100, classes: worth 10, elements: worth 1
565
-			$search = array('\\#','\\.','');
565
+			$search = array('\\#', '\\.', '');
566 566
 
567 567
 			foreach ($search as $s) {
568 568
 				if (trim($selector == '')) {
@@ -590,7 +590,7 @@  discard block
 block discarded – undo
590 590
 	 */
591 591
 	private function translateCssToXpath($paramCssSelector) {
592 592
 		$cssSelector = ' ' . $paramCssSelector . ' ';
593
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
593
+		$cssSelector = preg_replace_callback('/\s+\w+\s+/', array($this, 'strtolower'), $cssSelector);
594 594
 		$cssSelector = trim($cssSelector);
595 595
 		$xpathKey = md5($cssSelector);
596 596
 		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
@@ -713,7 +713,7 @@  discard block
 block discarded – undo
713 713
 	 * @return array
714 714
 	 */
715 715
 	private function parseNth(array $match) {
716
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
716
+		if (in_array(strtolower($match[2]), array('even', 'odd'))) {
717 717
 			$index = strtolower($match[2]) == 'even' ? 0 : 1;
718 718
 			return array(self::MULTIPLIER => 2, self::INDEX => $index);
719 719
 		} elseif (stripos($match[2], 'n') === false) {
Please login to merge, or discard this patch.
includes/libraries/wp-session/wp-cli.php 2 patches
Indentation   +145 added lines, -145 removed lines patch added patch discarded remove patch
@@ -8,151 +8,151 @@
 block discarded – undo
8 8
  */
9 9
 class WP_Session_Command extends \WP_CLI_Command {
10 10
 
11
-	/**
12
-	 * Count the total number of sessions stored in the database.
13
-	 *
14
-	 *
15
-	 * ## EXAMPLES
16
-	 *
17
-	 *      wp session count
18
-	 *
19
-	 * @global wpdb $wpdb
20
-	 *
21
-	 * @param array $args
22
-	 * @param array $assoc_args
23
-	 */
24
-	public function count( $args, $assoc_args ) {
25
-		$sessions = WP_Session_Utils::count_sessions();
26
-
27
-		\WP_CLI::line( sprintf( '%d sessions currently exist.', absint( $sessions ) ) );
28
-	}
29
-
30
-	/**
31
-	 * Delete sessions from the database.
32
-	 *
33
-	 * ## OPTIONS
34
-	 *
35
-	 * [--all]
36
-	 * : Flag whether or not to purge all sessions from the database.
37
-	 *
38
-	 * [--batch=<batch>]
39
-	 * : Set the batch size for deleting old sessions
40
-	 *
41
-	 * [--limit=<limit>]
42
-	 * : Delete just this number of old sessions
43
-	 *
44
-	 * ## EXAMPLES
45
-	 *
46
-	 *      wp session delete
47
-	 *      wp session delete [--batch=<batch>]
48
-	 *      wp session delete [--limit=<limit>]
49
-	 *      wp session delete [--all]
50
-	 *
51
-	 * @synopsis [--all] [--batch=<batch>] [--limit=<limit>]
52
-	 *
53
-	 * @param array $args
54
-	 * @param array $assoc_args
55
-	 */
56
-	public function delete( $args, $assoc_args ) {
57
-		if ( isset( $assoc_args['limit'] ) ) {
58
-			$limit = absint( $assoc_args['limit'] );
59
-
60
-			$count = WP_Session_Utils::delete_old_sessions( $limit );
61
-
62
-			if ( $count > 0 ) {
63
-				\WP_CLI::line( sprintf( 'Deleted %d sessions.', $count ) );
64
-			}
65
-
66
-			// Clear memory
67
-			self::free_up_memory();
68
-			return;
69
-		}
70
-
71
-		// Determine if we're deleting all sessions or just a subset.
72
-		$all = isset( $assoc_args['all'] );
73
-
74
-		/**
75
-		 * Determine the size of each batch for deletion.
76
-		 *
77
-		 * @param int
78
-		 */
79
-		$batch = isset( $assoc_args['batch'] ) ? absint( $assoc_args['batch'] ) : apply_filters( 'wp_session_delete_batch_size', 1000 );
80
-
81
-		switch ( $all ) {
82
-			case true:
83
-				$count = WP_Session_Utils::delete_all_sessions();
84
-
85
-				\WP_CLI::line( sprintf( 'Deleted all %d sessions.', $count ) );
86
-				break;
87
-			case false:
88
-				do {
89
-					$count = WP_Session_Utils::delete_old_sessions( $batch );
90
-
91
-					if ( $count > 0 ) {
92
-						\WP_CLI::line( sprintf( 'Deleted %d sessions.', $count ) );
93
-					}
94
-
95
-					// Clear memory
96
-					self::free_up_memory();
97
-				} while ( $count > 0 );
98
-				break;
99
-		}
100
-	}
101
-
102
-	/**
103
-	 * Generate a number of dummy sessions for testing purposes.
104
-	 *
105
-	 * ## OPTIONS
106
-	 *
107
-	 * <count>
108
-	 * : Number of sessions to create.
109
-	 *
110
-	 * [--expires=<date>]
111
-	 * : Optional expiration time tagged for each session. Will use WordPress' local time.
112
-	 *
113
-	 * ## EXAMPLES
114
-	 *
115
-	 *      wp session generate 5000
116
-	 *      wp session generate 5000 --expires="2014-11-09T08:00"
117
-	 *
118
-	 * @synopsis <count> [--expires=<date>]
119
-	 *
120
-	 * @param array $args
121
-	 * @param array $assoc_args
122
-	 */
123
-	public function generate( $args, $assoc_args ) {
124
-		$count = absint( $args[0] );
125
-		$date  = isset( $assoc_args['expires'] ) ? $assoc_args['expires'] : null;
126
-
127
-		$notify = \WP_CLI\Utils\make_progress_bar( 'Generating sessions', $count );
128
-
129
-		for ( $i = 0; $i < $count; $i ++ ) {
130
-			WP_Session_Utils::create_dummy_session( $date );
131
-			$notify->tick();
132
-		}
133
-
134
-		$notify->finish();
135
-	}
136
-
137
-	/**
138
-	 * Free up memory
139
-	 *
140
-	 * @global WP_Object_Cache $wp_object_cache
141
-	 * @global wpdb            $wpdb
142
-	 */
143
-	private function free_up_memory() {
144
-		global $wp_object_cache, $wpdb;
145
-		$wpdb->queries = array();
146
-
147
-		if ( ! is_object( $wp_object_cache ) ) {
148
-			return;
149
-		}
150
-
151
-		$wp_object_cache->group_ops      = array();
152
-		$wp_object_cache->stats          = array();
153
-		$wp_object_cache->memcache_debug = array();
154
-		$wp_object_cache->cache          = array();
155
-	}
11
+    /**
12
+     * Count the total number of sessions stored in the database.
13
+     *
14
+     *
15
+     * ## EXAMPLES
16
+     *
17
+     *      wp session count
18
+     *
19
+     * @global wpdb $wpdb
20
+     *
21
+     * @param array $args
22
+     * @param array $assoc_args
23
+     */
24
+    public function count( $args, $assoc_args ) {
25
+        $sessions = WP_Session_Utils::count_sessions();
26
+
27
+        \WP_CLI::line( sprintf( '%d sessions currently exist.', absint( $sessions ) ) );
28
+    }
29
+
30
+    /**
31
+     * Delete sessions from the database.
32
+     *
33
+     * ## OPTIONS
34
+     *
35
+     * [--all]
36
+     * : Flag whether or not to purge all sessions from the database.
37
+     *
38
+     * [--batch=<batch>]
39
+     * : Set the batch size for deleting old sessions
40
+     *
41
+     * [--limit=<limit>]
42
+     * : Delete just this number of old sessions
43
+     *
44
+     * ## EXAMPLES
45
+     *
46
+     *      wp session delete
47
+     *      wp session delete [--batch=<batch>]
48
+     *      wp session delete [--limit=<limit>]
49
+     *      wp session delete [--all]
50
+     *
51
+     * @synopsis [--all] [--batch=<batch>] [--limit=<limit>]
52
+     *
53
+     * @param array $args
54
+     * @param array $assoc_args
55
+     */
56
+    public function delete( $args, $assoc_args ) {
57
+        if ( isset( $assoc_args['limit'] ) ) {
58
+            $limit = absint( $assoc_args['limit'] );
59
+
60
+            $count = WP_Session_Utils::delete_old_sessions( $limit );
61
+
62
+            if ( $count > 0 ) {
63
+                \WP_CLI::line( sprintf( 'Deleted %d sessions.', $count ) );
64
+            }
65
+
66
+            // Clear memory
67
+            self::free_up_memory();
68
+            return;
69
+        }
70
+
71
+        // Determine if we're deleting all sessions or just a subset.
72
+        $all = isset( $assoc_args['all'] );
73
+
74
+        /**
75
+         * Determine the size of each batch for deletion.
76
+         *
77
+         * @param int
78
+         */
79
+        $batch = isset( $assoc_args['batch'] ) ? absint( $assoc_args['batch'] ) : apply_filters( 'wp_session_delete_batch_size', 1000 );
80
+
81
+        switch ( $all ) {
82
+            case true:
83
+                $count = WP_Session_Utils::delete_all_sessions();
84
+
85
+                \WP_CLI::line( sprintf( 'Deleted all %d sessions.', $count ) );
86
+                break;
87
+            case false:
88
+                do {
89
+                    $count = WP_Session_Utils::delete_old_sessions( $batch );
90
+
91
+                    if ( $count > 0 ) {
92
+                        \WP_CLI::line( sprintf( 'Deleted %d sessions.', $count ) );
93
+                    }
94
+
95
+                    // Clear memory
96
+                    self::free_up_memory();
97
+                } while ( $count > 0 );
98
+                break;
99
+        }
100
+    }
101
+
102
+    /**
103
+     * Generate a number of dummy sessions for testing purposes.
104
+     *
105
+     * ## OPTIONS
106
+     *
107
+     * <count>
108
+     * : Number of sessions to create.
109
+     *
110
+     * [--expires=<date>]
111
+     * : Optional expiration time tagged for each session. Will use WordPress' local time.
112
+     *
113
+     * ## EXAMPLES
114
+     *
115
+     *      wp session generate 5000
116
+     *      wp session generate 5000 --expires="2014-11-09T08:00"
117
+     *
118
+     * @synopsis <count> [--expires=<date>]
119
+     *
120
+     * @param array $args
121
+     * @param array $assoc_args
122
+     */
123
+    public function generate( $args, $assoc_args ) {
124
+        $count = absint( $args[0] );
125
+        $date  = isset( $assoc_args['expires'] ) ? $assoc_args['expires'] : null;
126
+
127
+        $notify = \WP_CLI\Utils\make_progress_bar( 'Generating sessions', $count );
128
+
129
+        for ( $i = 0; $i < $count; $i ++ ) {
130
+            WP_Session_Utils::create_dummy_session( $date );
131
+            $notify->tick();
132
+        }
133
+
134
+        $notify->finish();
135
+    }
136
+
137
+    /**
138
+     * Free up memory
139
+     *
140
+     * @global WP_Object_Cache $wp_object_cache
141
+     * @global wpdb            $wpdb
142
+     */
143
+    private function free_up_memory() {
144
+        global $wp_object_cache, $wpdb;
145
+        $wpdb->queries = array();
146
+
147
+        if ( ! is_object( $wp_object_cache ) ) {
148
+            return;
149
+        }
150
+
151
+        $wp_object_cache->group_ops      = array();
152
+        $wp_object_cache->stats          = array();
153
+        $wp_object_cache->memcache_debug = array();
154
+        $wp_object_cache->cache          = array();
155
+    }
156 156
 }
157 157
 
158 158
 \WP_CLI::add_command( 'session', 'WP_Session_Command' );
159 159
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -21,10 +21,10 @@  discard block
 block discarded – undo
21 21
 	 * @param array $args
22 22
 	 * @param array $assoc_args
23 23
 	 */
24
-	public function count( $args, $assoc_args ) {
24
+	public function count($args, $assoc_args) {
25 25
 		$sessions = WP_Session_Utils::count_sessions();
26 26
 
27
-		\WP_CLI::line( sprintf( '%d sessions currently exist.', absint( $sessions ) ) );
27
+		\WP_CLI::line(sprintf('%d sessions currently exist.', absint($sessions)));
28 28
 	}
29 29
 
30 30
 	/**
@@ -53,14 +53,14 @@  discard block
 block discarded – undo
53 53
 	 * @param array $args
54 54
 	 * @param array $assoc_args
55 55
 	 */
56
-	public function delete( $args, $assoc_args ) {
57
-		if ( isset( $assoc_args['limit'] ) ) {
58
-			$limit = absint( $assoc_args['limit'] );
56
+	public function delete($args, $assoc_args) {
57
+		if (isset($assoc_args['limit'])) {
58
+			$limit = absint($assoc_args['limit']);
59 59
 
60
-			$count = WP_Session_Utils::delete_old_sessions( $limit );
60
+			$count = WP_Session_Utils::delete_old_sessions($limit);
61 61
 
62
-			if ( $count > 0 ) {
63
-				\WP_CLI::line( sprintf( 'Deleted %d sessions.', $count ) );
62
+			if ($count > 0) {
63
+				\WP_CLI::line(sprintf('Deleted %d sessions.', $count));
64 64
 			}
65 65
 
66 66
 			// Clear memory
@@ -69,32 +69,32 @@  discard block
 block discarded – undo
69 69
 		}
70 70
 
71 71
 		// Determine if we're deleting all sessions or just a subset.
72
-		$all = isset( $assoc_args['all'] );
72
+		$all = isset($assoc_args['all']);
73 73
 
74 74
 		/**
75 75
 		 * Determine the size of each batch for deletion.
76 76
 		 *
77 77
 		 * @param int
78 78
 		 */
79
-		$batch = isset( $assoc_args['batch'] ) ? absint( $assoc_args['batch'] ) : apply_filters( 'wp_session_delete_batch_size', 1000 );
79
+		$batch = isset($assoc_args['batch']) ? absint($assoc_args['batch']) : apply_filters('wp_session_delete_batch_size', 1000);
80 80
 
81
-		switch ( $all ) {
81
+		switch ($all) {
82 82
 			case true:
83 83
 				$count = WP_Session_Utils::delete_all_sessions();
84 84
 
85
-				\WP_CLI::line( sprintf( 'Deleted all %d sessions.', $count ) );
85
+				\WP_CLI::line(sprintf('Deleted all %d sessions.', $count));
86 86
 				break;
87 87
 			case false:
88 88
 				do {
89
-					$count = WP_Session_Utils::delete_old_sessions( $batch );
89
+					$count = WP_Session_Utils::delete_old_sessions($batch);
90 90
 
91
-					if ( $count > 0 ) {
92
-						\WP_CLI::line( sprintf( 'Deleted %d sessions.', $count ) );
91
+					if ($count > 0) {
92
+						\WP_CLI::line(sprintf('Deleted %d sessions.', $count));
93 93
 					}
94 94
 
95 95
 					// Clear memory
96 96
 					self::free_up_memory();
97
-				} while ( $count > 0 );
97
+				} while ($count > 0);
98 98
 				break;
99 99
 		}
100 100
 	}
@@ -120,14 +120,14 @@  discard block
 block discarded – undo
120 120
 	 * @param array $args
121 121
 	 * @param array $assoc_args
122 122
 	 */
123
-	public function generate( $args, $assoc_args ) {
124
-		$count = absint( $args[0] );
125
-		$date  = isset( $assoc_args['expires'] ) ? $assoc_args['expires'] : null;
123
+	public function generate($args, $assoc_args) {
124
+		$count = absint($args[0]);
125
+		$date  = isset($assoc_args['expires']) ? $assoc_args['expires'] : null;
126 126
 
127
-		$notify = \WP_CLI\Utils\make_progress_bar( 'Generating sessions', $count );
127
+		$notify = \WP_CLI\Utils\make_progress_bar('Generating sessions', $count);
128 128
 
129
-		for ( $i = 0; $i < $count; $i ++ ) {
130
-			WP_Session_Utils::create_dummy_session( $date );
129
+		for ($i = 0; $i < $count; $i++) {
130
+			WP_Session_Utils::create_dummy_session($date);
131 131
 			$notify->tick();
132 132
 		}
133 133
 
@@ -144,7 +144,7 @@  discard block
 block discarded – undo
144 144
 		global $wp_object_cache, $wpdb;
145 145
 		$wpdb->queries = array();
146 146
 
147
-		if ( ! is_object( $wp_object_cache ) ) {
147
+		if (!is_object($wp_object_cache)) {
148 148
 			return;
149 149
 		}
150 150
 
@@ -155,4 +155,4 @@  discard block
 block discarded – undo
155 155
 	}
156 156
 }
157 157
 
158
-\WP_CLI::add_command( 'session', 'WP_Session_Command' );
159 158
\ No newline at end of file
159
+\WP_CLI::add_command('session', 'WP_Session_Command');
160 160
\ No newline at end of file
Please login to merge, or discard this patch.
includes/libraries/wp-session/wp-session.php 2 patches
Indentation   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -16,16 +16,16 @@  discard block
 block discarded – undo
16 16
  * @return int
17 17
  */
18 18
 function wp_session_cache_expire() {
19
-	$wp_session = WP_Session::get_instance();
19
+    $wp_session = WP_Session::get_instance();
20 20
 
21
-	return $wp_session->cache_expiration();
21
+    return $wp_session->cache_expiration();
22 22
 }
23 23
 
24 24
 /**
25 25
  * Alias of wp_session_write_close()
26 26
  */
27 27
 function wp_session_commit() {
28
-	wp_session_write_close();
28
+    wp_session_write_close();
29 29
 }
30 30
 
31 31
 /**
@@ -34,9 +34,9 @@  discard block
 block discarded – undo
34 34
  * @param string $data
35 35
  */
36 36
 function wp_session_decode( $data ) {
37
-	$wp_session = WP_Session::get_instance();
37
+    $wp_session = WP_Session::get_instance();
38 38
 
39
-	return $wp_session->json_in( $data );
39
+    return $wp_session->json_in( $data );
40 40
 }
41 41
 
42 42
 /**
@@ -45,9 +45,9 @@  discard block
 block discarded – undo
45 45
  * @return string
46 46
  */
47 47
 function wp_session_encode() {
48
-	$wp_session = WP_Session::get_instance();
48
+    $wp_session = WP_Session::get_instance();
49 49
 
50
-	return $wp_session->json_out();
50
+    return $wp_session->json_out();
51 51
 }
52 52
 
53 53
 /**
@@ -58,11 +58,11 @@  discard block
 block discarded – undo
58 58
  * @return bool
59 59
  */
60 60
 function wp_session_regenerate_id( $delete_old_session = false ) {
61
-	$wp_session = WP_Session::get_instance();
61
+    $wp_session = WP_Session::get_instance();
62 62
 
63
-	$wp_session->regenerate_id( $delete_old_session );
63
+    $wp_session->regenerate_id( $delete_old_session );
64 64
 
65
-	return true;
65
+    return true;
66 66
 }
67 67
 
68 68
 /**
@@ -73,13 +73,13 @@  discard block
 block discarded – undo
73 73
  * @return bool
74 74
  */
75 75
 function wp_session_start() {
76
-	$wp_session = WP_Session::get_instance();
77
-	do_action( 'wp_session_start' );
76
+    $wp_session = WP_Session::get_instance();
77
+    do_action( 'wp_session_start' );
78 78
 
79
-	return $wp_session->session_started();
79
+    return $wp_session->session_started();
80 80
 }
81 81
 if ( ! defined( 'WP_CLI' ) || false === WP_CLI ) {
82
-	add_action( 'plugins_loaded', 'wp_session_start' );
82
+    add_action( 'plugins_loaded', 'wp_session_start' );
83 83
 }
84 84
 
85 85
 /**
@@ -88,35 +88,35 @@  discard block
 block discarded – undo
88 88
  * @return int
89 89
  */
90 90
 function wp_session_status() {
91
-	$wp_session = WP_Session::get_instance();
91
+    $wp_session = WP_Session::get_instance();
92 92
 
93
-	if ( $wp_session->session_started() ) {
94
-		return PHP_SESSION_ACTIVE;
95
-	}
93
+    if ( $wp_session->session_started() ) {
94
+        return PHP_SESSION_ACTIVE;
95
+    }
96 96
 
97
-	return PHP_SESSION_NONE;
97
+    return PHP_SESSION_NONE;
98 98
 }
99 99
 
100 100
 /**
101 101
  * Unset all session variables.
102 102
  */
103 103
 function wp_session_unset() {
104
-	$wp_session = WP_Session::get_instance();
104
+    $wp_session = WP_Session::get_instance();
105 105
 
106
-	$wp_session->reset();
106
+    $wp_session->reset();
107 107
 }
108 108
 
109 109
 /**
110 110
  * Write session data and end session
111 111
  */
112 112
 function wp_session_write_close() {
113
-	$wp_session = WP_Session::get_instance();
113
+    $wp_session = WP_Session::get_instance();
114 114
 
115
-	$wp_session->write_data();
116
-	do_action( 'wp_session_commit' );
115
+    $wp_session->write_data();
116
+    do_action( 'wp_session_commit' );
117 117
 }
118 118
 if ( ! defined( 'WP_CLI' ) || false === WP_CLI ) {
119
-	add_action( 'shutdown', 'wp_session_write_close' );
119
+    add_action( 'shutdown', 'wp_session_write_close' );
120 120
 }
121 121
 
122 122
 /**
@@ -127,24 +127,24 @@  discard block
 block discarded – undo
127 127
  * of a scheduled task or cron job.
128 128
  */
129 129
 function wp_session_cleanup() {
130
-	if ( defined( 'WP_SETUP_CONFIG' ) ) {
131
-		return;
132
-	}
133
-
134
-	if ( ! defined( 'WP_INSTALLING' ) ) {
135
-		/**
136
-		 * Determine the size of each batch for deletion.
137
-		 *
138
-		 * @param int
139
-		 */
140
-		$batch_size = apply_filters( 'wp_session_delete_batch_size', 1000 );
141
-
142
-		// Delete a batch of old sessions
143
-		WP_Session_Utils::delete_old_sessions( $batch_size );
144
-	}
145
-
146
-	// Allow other plugins to hook in to the garbage collection process.
147
-	do_action( 'wp_session_cleanup' );
130
+    if ( defined( 'WP_SETUP_CONFIG' ) ) {
131
+        return;
132
+    }
133
+
134
+    if ( ! defined( 'WP_INSTALLING' ) ) {
135
+        /**
136
+         * Determine the size of each batch for deletion.
137
+         *
138
+         * @param int
139
+         */
140
+        $batch_size = apply_filters( 'wp_session_delete_batch_size', 1000 );
141
+
142
+        // Delete a batch of old sessions
143
+        WP_Session_Utils::delete_old_sessions( $batch_size );
144
+    }
145
+
146
+    // Allow other plugins to hook in to the garbage collection process.
147
+    do_action( 'wp_session_cleanup' );
148 148
 }
149 149
 add_action( 'wp_session_garbage_collection', 'wp_session_cleanup' );
150 150
 
@@ -152,8 +152,8 @@  discard block
 block discarded – undo
152 152
  * Register the garbage collector as a twice daily event.
153 153
  */
154 154
 function wp_session_register_garbage_collection() {
155
-	if ( ! wp_next_scheduled( 'wp_session_garbage_collection' ) ) {
156
-		wp_schedule_event( time(), 'hourly', 'wp_session_garbage_collection' );
157
-	}
155
+    if ( ! wp_next_scheduled( 'wp_session_garbage_collection' ) ) {
156
+        wp_schedule_event( time(), 'hourly', 'wp_session_garbage_collection' );
157
+    }
158 158
 }
159 159
 add_action( 'wp', 'wp_session_register_garbage_collection' );
Please login to merge, or discard this patch.
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -33,10 +33,10 @@  discard block
 block discarded – undo
33 33
  *
34 34
  * @param string $data
35 35
  */
36
-function wp_session_decode( $data ) {
36
+function wp_session_decode($data) {
37 37
 	$wp_session = WP_Session::get_instance();
38 38
 
39
-	return $wp_session->json_in( $data );
39
+	return $wp_session->json_in($data);
40 40
 }
41 41
 
42 42
 /**
@@ -57,10 +57,10 @@  discard block
 block discarded – undo
57 57
  *
58 58
  * @return bool
59 59
  */
60
-function wp_session_regenerate_id( $delete_old_session = false ) {
60
+function wp_session_regenerate_id($delete_old_session = false) {
61 61
 	$wp_session = WP_Session::get_instance();
62 62
 
63
-	$wp_session->regenerate_id( $delete_old_session );
63
+	$wp_session->regenerate_id($delete_old_session);
64 64
 
65 65
 	return true;
66 66
 }
@@ -74,12 +74,12 @@  discard block
 block discarded – undo
74 74
  */
75 75
 function wp_session_start() {
76 76
 	$wp_session = WP_Session::get_instance();
77
-	do_action( 'wp_session_start' );
77
+	do_action('wp_session_start');
78 78
 
79 79
 	return $wp_session->session_started();
80 80
 }
81
-if ( ! defined( 'WP_CLI' ) || false === WP_CLI ) {
82
-	add_action( 'plugins_loaded', 'wp_session_start' );
81
+if (!defined('WP_CLI') || false === WP_CLI) {
82
+	add_action('plugins_loaded', 'wp_session_start');
83 83
 }
84 84
 
85 85
 /**
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 function wp_session_status() {
91 91
 	$wp_session = WP_Session::get_instance();
92 92
 
93
-	if ( $wp_session->session_started() ) {
93
+	if ($wp_session->session_started()) {
94 94
 		return PHP_SESSION_ACTIVE;
95 95
 	}
96 96
 
@@ -113,10 +113,10 @@  discard block
 block discarded – undo
113 113
 	$wp_session = WP_Session::get_instance();
114 114
 
115 115
 	$wp_session->write_data();
116
-	do_action( 'wp_session_commit' );
116
+	do_action('wp_session_commit');
117 117
 }
118
-if ( ! defined( 'WP_CLI' ) || false === WP_CLI ) {
119
-	add_action( 'shutdown', 'wp_session_write_close' );
118
+if (!defined('WP_CLI') || false === WP_CLI) {
119
+	add_action('shutdown', 'wp_session_write_close');
120 120
 }
121 121
 
122 122
 /**
@@ -127,33 +127,33 @@  discard block
 block discarded – undo
127 127
  * of a scheduled task or cron job.
128 128
  */
129 129
 function wp_session_cleanup() {
130
-	if ( defined( 'WP_SETUP_CONFIG' ) ) {
130
+	if (defined('WP_SETUP_CONFIG')) {
131 131
 		return;
132 132
 	}
133 133
 
134
-	if ( ! defined( 'WP_INSTALLING' ) ) {
134
+	if (!defined('WP_INSTALLING')) {
135 135
 		/**
136 136
 		 * Determine the size of each batch for deletion.
137 137
 		 *
138 138
 		 * @param int
139 139
 		 */
140
-		$batch_size = apply_filters( 'wp_session_delete_batch_size', 1000 );
140
+		$batch_size = apply_filters('wp_session_delete_batch_size', 1000);
141 141
 
142 142
 		// Delete a batch of old sessions
143
-		WP_Session_Utils::delete_old_sessions( $batch_size );
143
+		WP_Session_Utils::delete_old_sessions($batch_size);
144 144
 	}
145 145
 
146 146
 	// Allow other plugins to hook in to the garbage collection process.
147
-	do_action( 'wp_session_cleanup' );
147
+	do_action('wp_session_cleanup');
148 148
 }
149
-add_action( 'wp_session_garbage_collection', 'wp_session_cleanup' );
149
+add_action('wp_session_garbage_collection', 'wp_session_cleanup');
150 150
 
151 151
 /**
152 152
  * Register the garbage collector as a twice daily event.
153 153
  */
154 154
 function wp_session_register_garbage_collection() {
155
-	if ( ! wp_next_scheduled( 'wp_session_garbage_collection' ) ) {
156
-		wp_schedule_event( time(), 'hourly', 'wp_session_garbage_collection' );
155
+	if (!wp_next_scheduled('wp_session_garbage_collection')) {
156
+		wp_schedule_event(time(), 'hourly', 'wp_session_garbage_collection');
157 157
 	}
158 158
 }
159
-add_action( 'wp', 'wp_session_register_garbage_collection' );
159
+add_action('wp', 'wp_session_register_garbage_collection');
Please login to merge, or discard this patch.
includes/libraries/wp-session/class-wp-session-utils.php 2 patches
Indentation   +130 added lines, -130 removed lines patch added patch discarded remove patch
@@ -6,134 +6,134 @@
 block discarded – undo
6 6
  * THIS CLASS SHOULD NEVER BE INSTANTIATED
7 7
  */
8 8
 class WP_Session_Utils {
9
-	/**
10
-	 * Count the total sessions in the database.
11
-	 *
12
-	 * @global wpdb $wpdb
13
-	 *
14
-	 * @return int
15
-	 */
16
-	public static function count_sessions() {
17
-		global $wpdb;
18
-
19
-		$query = "SELECT COUNT(*) FROM $wpdb->options WHERE option_name LIKE '_wp_session_expires_%'";
20
-
21
-		/**
22
-		 * Filter the query in case tables are non-standard.
23
-		 *
24
-		 * @param string $query Database count query
25
-		 */
26
-		$query = apply_filters( 'wp_session_count_query', $query );
27
-
28
-		$sessions = $wpdb->get_var( $query );
29
-
30
-		return absint( $sessions );
31
-	}
32
-
33
-	/**
34
-	 * Create a new, random session in the database.
35
-	 *
36
-	 * @param null|string $date
37
-	 */
38
-	public static function create_dummy_session( $date = null ) {
39
-		// Generate our date
40
-		if ( null !== $date ) {
41
-			$time = strtotime( $date );
42
-
43
-			if ( false === $time ) {
44
-				$date = null;
45
-			} else {
46
-				$expires = date( 'U', strtotime( $date ) );
47
-			}
48
-		}
49
-
50
-		// If null was passed, or if the string parsing failed, fall back on a default
51
-		if ( null === $date ) {
52
-			/**
53
-			 * Filter the expiration of the session in the database
54
-			 *
55
-			 * @param int
56
-			 */
57
-			$expires = time() + (int) apply_filters( 'wp_session_expiration', 30 * 60 );
58
-		}
59
-
60
-		$session_id = self::generate_id();
61
-
62
-		// Store the session
63
-		add_option( "_wp_session_{$session_id}", array(), '', 'no' );
64
-		add_option( "_wp_session_expires_{$session_id}", $expires, '', 'no' );
65
-	}
66
-
67
-	/**
68
-	 * Delete old sessions from the database.
69
-	 *
70
-	 * @param int $limit Maximum number of sessions to delete.
71
-	 *
72
-	 * @global wpdb $wpdb
73
-	 *
74
-	 * @return int Sessions deleted.
75
-	 */
76
-	public static function delete_old_sessions( $limit = 1000 ) {
77
-		global $wpdb;
78
-
79
-		$limit = absint( $limit );
80
-		$keys = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE '_wp_session_expires_%' ORDER BY option_value ASC LIMIT 0, {$limit}" );
81
-
82
-		$now = time();
83
-		$expired = array();
84
-		$count = 0;
85
-
86
-		foreach( $keys as $expiration ) {
87
-			$key = $expiration->option_name;
88
-			$expires = $expiration->option_value;
89
-
90
-			if ( $now > $expires ) {
91
-				$session_id = preg_replace("/[^A-Za-z0-9_]/", '', substr( $key, 20 ) );
92
-
93
-				$expired[] = $key;
94
-				$expired[] = "_wp_session_{$session_id}";
95
-
96
-				$count += 1;
97
-			}
98
-		}
99
-
100
-		// Delete expired sessions
101
-		if ( ! empty( $expired ) ) {
102
-		    $placeholders = array_fill( 0, count( $expired ), '%s' );
103
-		    $format = implode( ', ', $placeholders );
104
-		    $query = "DELETE FROM $wpdb->options WHERE option_name IN ($format)";
105
-
106
-		    $prepared = $wpdb->prepare( $query, $expired );
107
-			$wpdb->query( $prepared );
108
-		}
109
-
110
-		return $count;
111
-	}
112
-
113
-	/**
114
-	 * Remove all sessions from the database, regardless of expiration.
115
-	 *
116
-	 * @global wpdb $wpdb
117
-	 *
118
-	 * @return int Sessions deleted
119
-	 */
120
-	public static function delete_all_sessions() {
121
-		global $wpdb;
122
-
123
-		$count = $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_wp_session_%'" );
124
-
125
-		return (int) ( $count / 2 );
126
-	}
127
-
128
-	/**
129
-	 * Generate a new, random session ID.
130
-	 *
131
-	 * @return string
132
-	 */
133
-	public static function generate_id() {
134
-		require_once( ABSPATH . 'wp-includes/class-phpass.php' );
135
-		$hash = new PasswordHash( 8, false );
136
-
137
-		return md5( $hash->get_random_bytes( 32 ) );
138
-	}
9
+    /**
10
+     * Count the total sessions in the database.
11
+     *
12
+     * @global wpdb $wpdb
13
+     *
14
+     * @return int
15
+     */
16
+    public static function count_sessions() {
17
+        global $wpdb;
18
+
19
+        $query = "SELECT COUNT(*) FROM $wpdb->options WHERE option_name LIKE '_wp_session_expires_%'";
20
+
21
+        /**
22
+         * Filter the query in case tables are non-standard.
23
+         *
24
+         * @param string $query Database count query
25
+         */
26
+        $query = apply_filters( 'wp_session_count_query', $query );
27
+
28
+        $sessions = $wpdb->get_var( $query );
29
+
30
+        return absint( $sessions );
31
+    }
32
+
33
+    /**
34
+     * Create a new, random session in the database.
35
+     *
36
+     * @param null|string $date
37
+     */
38
+    public static function create_dummy_session( $date = null ) {
39
+        // Generate our date
40
+        if ( null !== $date ) {
41
+            $time = strtotime( $date );
42
+
43
+            if ( false === $time ) {
44
+                $date = null;
45
+            } else {
46
+                $expires = date( 'U', strtotime( $date ) );
47
+            }
48
+        }
49
+
50
+        // If null was passed, or if the string parsing failed, fall back on a default
51
+        if ( null === $date ) {
52
+            /**
53
+             * Filter the expiration of the session in the database
54
+             *
55
+             * @param int
56
+             */
57
+            $expires = time() + (int) apply_filters( 'wp_session_expiration', 30 * 60 );
58
+        }
59
+
60
+        $session_id = self::generate_id();
61
+
62
+        // Store the session
63
+        add_option( "_wp_session_{$session_id}", array(), '', 'no' );
64
+        add_option( "_wp_session_expires_{$session_id}", $expires, '', 'no' );
65
+    }
66
+
67
+    /**
68
+     * Delete old sessions from the database.
69
+     *
70
+     * @param int $limit Maximum number of sessions to delete.
71
+     *
72
+     * @global wpdb $wpdb
73
+     *
74
+     * @return int Sessions deleted.
75
+     */
76
+    public static function delete_old_sessions( $limit = 1000 ) {
77
+        global $wpdb;
78
+
79
+        $limit = absint( $limit );
80
+        $keys = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE '_wp_session_expires_%' ORDER BY option_value ASC LIMIT 0, {$limit}" );
81
+
82
+        $now = time();
83
+        $expired = array();
84
+        $count = 0;
85
+
86
+        foreach( $keys as $expiration ) {
87
+            $key = $expiration->option_name;
88
+            $expires = $expiration->option_value;
89
+
90
+            if ( $now > $expires ) {
91
+                $session_id = preg_replace("/[^A-Za-z0-9_]/", '', substr( $key, 20 ) );
92
+
93
+                $expired[] = $key;
94
+                $expired[] = "_wp_session_{$session_id}";
95
+
96
+                $count += 1;
97
+            }
98
+        }
99
+
100
+        // Delete expired sessions
101
+        if ( ! empty( $expired ) ) {
102
+            $placeholders = array_fill( 0, count( $expired ), '%s' );
103
+            $format = implode( ', ', $placeholders );
104
+            $query = "DELETE FROM $wpdb->options WHERE option_name IN ($format)";
105
+
106
+            $prepared = $wpdb->prepare( $query, $expired );
107
+            $wpdb->query( $prepared );
108
+        }
109
+
110
+        return $count;
111
+    }
112
+
113
+    /**
114
+     * Remove all sessions from the database, regardless of expiration.
115
+     *
116
+     * @global wpdb $wpdb
117
+     *
118
+     * @return int Sessions deleted
119
+     */
120
+    public static function delete_all_sessions() {
121
+        global $wpdb;
122
+
123
+        $count = $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_wp_session_%'" );
124
+
125
+        return (int) ( $count / 2 );
126
+    }
127
+
128
+    /**
129
+     * Generate a new, random session ID.
130
+     *
131
+     * @return string
132
+     */
133
+    public static function generate_id() {
134
+        require_once( ABSPATH . 'wp-includes/class-phpass.php' );
135
+        $hash = new PasswordHash( 8, false );
136
+
137
+        return md5( $hash->get_random_bytes( 32 ) );
138
+    }
139 139
 } 
140 140
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +28 added lines, -28 removed lines patch added patch discarded remove patch
@@ -23,11 +23,11 @@  discard block
 block discarded – undo
23 23
 		 *
24 24
 		 * @param string $query Database count query
25 25
 		 */
26
-		$query = apply_filters( 'wp_session_count_query', $query );
26
+		$query = apply_filters('wp_session_count_query', $query);
27 27
 
28
-		$sessions = $wpdb->get_var( $query );
28
+		$sessions = $wpdb->get_var($query);
29 29
 
30
-		return absint( $sessions );
30
+		return absint($sessions);
31 31
 	}
32 32
 
33 33
 	/**
@@ -35,33 +35,33 @@  discard block
 block discarded – undo
35 35
 	 *
36 36
 	 * @param null|string $date
37 37
 	 */
38
-	public static function create_dummy_session( $date = null ) {
38
+	public static function create_dummy_session($date = null) {
39 39
 		// Generate our date
40
-		if ( null !== $date ) {
41
-			$time = strtotime( $date );
40
+		if (null !== $date) {
41
+			$time = strtotime($date);
42 42
 
43
-			if ( false === $time ) {
43
+			if (false === $time) {
44 44
 				$date = null;
45 45
 			} else {
46
-				$expires = date( 'U', strtotime( $date ) );
46
+				$expires = date('U', strtotime($date));
47 47
 			}
48 48
 		}
49 49
 
50 50
 		// If null was passed, or if the string parsing failed, fall back on a default
51
-		if ( null === $date ) {
51
+		if (null === $date) {
52 52
 			/**
53 53
 			 * Filter the expiration of the session in the database
54 54
 			 *
55 55
 			 * @param int
56 56
 			 */
57
-			$expires = time() + (int) apply_filters( 'wp_session_expiration', 30 * 60 );
57
+			$expires = time() + (int)apply_filters('wp_session_expiration', 30 * 60);
58 58
 		}
59 59
 
60 60
 		$session_id = self::generate_id();
61 61
 
62 62
 		// Store the session
63
-		add_option( "_wp_session_{$session_id}", array(), '', 'no' );
64
-		add_option( "_wp_session_expires_{$session_id}", $expires, '', 'no' );
63
+		add_option("_wp_session_{$session_id}", array(), '', 'no');
64
+		add_option("_wp_session_expires_{$session_id}", $expires, '', 'no');
65 65
 	}
66 66
 
67 67
 	/**
@@ -73,22 +73,22 @@  discard block
 block discarded – undo
73 73
 	 *
74 74
 	 * @return int Sessions deleted.
75 75
 	 */
76
-	public static function delete_old_sessions( $limit = 1000 ) {
76
+	public static function delete_old_sessions($limit = 1000) {
77 77
 		global $wpdb;
78 78
 
79
-		$limit = absint( $limit );
80
-		$keys = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE '_wp_session_expires_%' ORDER BY option_value ASC LIMIT 0, {$limit}" );
79
+		$limit = absint($limit);
80
+		$keys = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE '_wp_session_expires_%' ORDER BY option_value ASC LIMIT 0, {$limit}");
81 81
 
82 82
 		$now = time();
83 83
 		$expired = array();
84 84
 		$count = 0;
85 85
 
86
-		foreach( $keys as $expiration ) {
86
+		foreach ($keys as $expiration) {
87 87
 			$key = $expiration->option_name;
88 88
 			$expires = $expiration->option_value;
89 89
 
90
-			if ( $now > $expires ) {
91
-				$session_id = preg_replace("/[^A-Za-z0-9_]/", '', substr( $key, 20 ) );
90
+			if ($now > $expires) {
91
+				$session_id = preg_replace("/[^A-Za-z0-9_]/", '', substr($key, 20));
92 92
 
93 93
 				$expired[] = $key;
94 94
 				$expired[] = "_wp_session_{$session_id}";
@@ -98,13 +98,13 @@  discard block
 block discarded – undo
98 98
 		}
99 99
 
100 100
 		// Delete expired sessions
101
-		if ( ! empty( $expired ) ) {
102
-		    $placeholders = array_fill( 0, count( $expired ), '%s' );
103
-		    $format = implode( ', ', $placeholders );
101
+		if (!empty($expired)) {
102
+		    $placeholders = array_fill(0, count($expired), '%s');
103
+		    $format = implode(', ', $placeholders);
104 104
 		    $query = "DELETE FROM $wpdb->options WHERE option_name IN ($format)";
105 105
 
106
-		    $prepared = $wpdb->prepare( $query, $expired );
107
-			$wpdb->query( $prepared );
106
+		    $prepared = $wpdb->prepare($query, $expired);
107
+			$wpdb->query($prepared);
108 108
 		}
109 109
 
110 110
 		return $count;
@@ -120,9 +120,9 @@  discard block
 block discarded – undo
120 120
 	public static function delete_all_sessions() {
121 121
 		global $wpdb;
122 122
 
123
-		$count = $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_wp_session_%'" );
123
+		$count = $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '_wp_session_%'");
124 124
 
125
-		return (int) ( $count / 2 );
125
+		return (int)($count / 2);
126 126
 	}
127 127
 
128 128
 	/**
@@ -131,9 +131,9 @@  discard block
 block discarded – undo
131 131
 	 * @return string
132 132
 	 */
133 133
 	public static function generate_id() {
134
-		require_once( ABSPATH . 'wp-includes/class-phpass.php' );
135
-		$hash = new PasswordHash( 8, false );
134
+		require_once(ABSPATH . 'wp-includes/class-phpass.php');
135
+		$hash = new PasswordHash(8, false);
136 136
 
137
-		return md5( $hash->get_random_bytes( 32 ) );
137
+		return md5($hash->get_random_bytes(32));
138 138
 	}
139 139
 } 
140 140
\ No newline at end of file
Please login to merge, or discard this patch.
includes/class-wpinv-item.php 2 patches
Spacing   +111 added lines, -111 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 // Exit if accessed directly
3
-if ( ! defined( 'ABSPATH' ) ) exit;
3
+if (!defined('ABSPATH')) exit;
4 4
 
5 5
 class WPInv_Item {
6 6
     public $ID = 0;
@@ -34,26 +34,26 @@  discard block
 block discarded – undo
34 34
     public $filter;
35 35
 
36 36
 
37
-    public function __construct( $_id = false, $_args = array() ) {
38
-        $item = WP_Post::get_instance( $_id );
39
-        return $this->setup_item( $item );
37
+    public function __construct($_id = false, $_args = array()) {
38
+        $item = WP_Post::get_instance($_id);
39
+        return $this->setup_item($item);
40 40
     }
41 41
 
42
-    private function setup_item( $item ) {
43
-        if( ! is_object( $item ) ) {
42
+    private function setup_item($item) {
43
+        if (!is_object($item)) {
44 44
             return false;
45 45
         }
46 46
 
47
-        if( ! is_a( $item, 'WP_Post' ) ) {
47
+        if (!is_a($item, 'WP_Post')) {
48 48
             return false;
49 49
         }
50 50
 
51
-        if( 'wpi_item' !== $item->post_type ) {
51
+        if ('wpi_item' !== $item->post_type) {
52 52
             return false;
53 53
         }
54 54
 
55
-        foreach ( $item as $key => $value ) {
56
-            switch ( $key ) {
55
+        foreach ($item as $key => $value) {
56
+            switch ($key) {
57 57
                 default:
58 58
                     $this->$key = $value;
59 59
                     break;
@@ -63,76 +63,76 @@  discard block
 block discarded – undo
63 63
         return true;
64 64
     }
65 65
 
66
-    public function __get( $key ) {
67
-        if ( method_exists( $this, 'get_' . $key ) ) {
68
-            return call_user_func( array( $this, 'get_' . $key ) );
66
+    public function __get($key) {
67
+        if (method_exists($this, 'get_' . $key)) {
68
+            return call_user_func(array($this, 'get_' . $key));
69 69
         } else {
70
-            return new WP_Error( 'wpinv-item-invalid-property', sprintf( __( 'Can\'t get property %s', 'invoicing' ), $key ) );
70
+            return new WP_Error('wpinv-item-invalid-property', sprintf(__('Can\'t get property %s', 'invoicing'), $key));
71 71
         }
72 72
     }
73 73
 
74
-    public function create( $data = array(), $wp_error = false ) {
75
-        if ( $this->ID != 0 ) {
74
+    public function create($data = array(), $wp_error = false) {
75
+        if ($this->ID != 0) {
76 76
             return false;
77 77
         }
78 78
 
79 79
         $defaults = array(
80 80
             'post_type'   => 'wpi_item',
81 81
             'post_status' => 'draft',
82
-            'post_title'  => __( 'New Invoice Item', 'invoicing' )
82
+            'post_title'  => __('New Invoice Item', 'invoicing')
83 83
         );
84 84
 
85
-        $args = wp_parse_args( $data, $defaults );
85
+        $args = wp_parse_args($data, $defaults);
86 86
 
87
-        do_action( 'wpinv_item_pre_create', $args );
87
+        do_action('wpinv_item_pre_create', $args);
88 88
 
89
-        $id = wp_insert_post( $args, $wp_error );
89
+        $id = wp_insert_post($args, $wp_error);
90 90
         if ($wp_error && is_wp_error($id)) {
91 91
             return $id;
92 92
         }
93
-        if ( !$id ) {
93
+        if (!$id) {
94 94
             return false;
95 95
         }
96 96
         
97
-        $item = WP_Post::get_instance( $id );
97
+        $item = WP_Post::get_instance($id);
98 98
         
99 99
         if (!empty($item) && !empty($data['meta'])) {
100 100
             $this->ID = $item->ID;
101 101
             $this->save_metas($data['meta']);
102 102
         }
103 103
 
104
-        do_action( 'wpinv_item_create', $id, $args );
104
+        do_action('wpinv_item_create', $id, $args);
105 105
 
106
-        return $this->setup_item( $item );
106
+        return $this->setup_item($item);
107 107
     }
108 108
     
109
-    public function update( $data = array(), $wp_error = false ) {
110
-        if ( !$this->ID > 0 ) {
109
+    public function update($data = array(), $wp_error = false) {
110
+        if (!$this->ID > 0) {
111 111
             return false;
112 112
         }
113 113
         
114 114
         $data['ID'] = $this->ID;
115 115
 
116
-        do_action( 'wpinv_item_pre_update', $data );
116
+        do_action('wpinv_item_pre_update', $data);
117 117
         
118
-        $id = wp_update_post( $data, $wp_error );
118
+        $id = wp_update_post($data, $wp_error);
119 119
         if ($wp_error && is_wp_error($id)) {
120 120
             return $id;
121 121
         }
122 122
         
123
-        if ( !$id ) {
123
+        if (!$id) {
124 124
             return false;
125 125
         }
126 126
 
127
-        $item = WP_Post::get_instance( $id );
127
+        $item = WP_Post::get_instance($id);
128 128
         if (!empty($item) && !empty($data['meta'])) {
129 129
             $this->ID = $item->ID;
130 130
             $this->save_metas($data['meta']);
131 131
         }
132 132
 
133
-        do_action( 'wpinv_item_update', $id, $data );
133
+        do_action('wpinv_item_update', $id, $data);
134 134
 
135
-        return $this->setup_item( $item );
135
+        return $this->setup_item($item);
136 136
     }
137 137
 
138 138
     public function get_ID() {
@@ -140,95 +140,95 @@  discard block
 block discarded – undo
140 140
     }
141 141
 
142 142
     public function get_name() {
143
-        return get_the_title( $this->ID );
143
+        return get_the_title($this->ID);
144 144
     }
145 145
     
146 146
     public function get_summary() {
147
-        return get_the_excerpt( $this->ID );
147
+        return get_the_excerpt($this->ID);
148 148
     }
149 149
 
150 150
     public function get_price() {
151
-        if ( ! isset( $this->price ) ) {
152
-            $this->price = get_post_meta( $this->ID, '_wpinv_price', true );
151
+        if (!isset($this->price)) {
152
+            $this->price = get_post_meta($this->ID, '_wpinv_price', true);
153 153
             
154
-            if ( $this->price ) {
155
-                $this->price = wpinv_sanitize_amount( $this->price );
154
+            if ($this->price) {
155
+                $this->price = wpinv_sanitize_amount($this->price);
156 156
             } else {
157 157
                 $this->price = 0;
158 158
             }
159 159
         }
160 160
         
161
-        return apply_filters( 'wpinv_get_item_price', $this->price, $this->ID );
161
+        return apply_filters('wpinv_get_item_price', $this->price, $this->ID);
162 162
     }
163 163
     
164 164
     public function get_the_price() {
165
-        $item_price = wpinv_price( wpinv_format_amount( $this->price ) );
165
+        $item_price = wpinv_price(wpinv_format_amount($this->price));
166 166
         
167
-        return apply_filters( 'wpinv_get_the_item_price', $item_price, $this->ID );
167
+        return apply_filters('wpinv_get_the_item_price', $item_price, $this->ID);
168 168
     }
169 169
     
170 170
     public function get_vat_rule() {
171 171
         global $wpinv_euvat;
172 172
         
173
-        if( !isset( $this->vat_rule ) ) {
174
-            $this->vat_rule = get_post_meta( $this->ID, '_wpinv_vat_rule', true );
173
+        if (!isset($this->vat_rule)) {
174
+            $this->vat_rule = get_post_meta($this->ID, '_wpinv_vat_rule', true);
175 175
 
176
-            if ( empty( $this->vat_rule ) ) {        
176
+            if (empty($this->vat_rule)) {        
177 177
                 $this->vat_rule = $wpinv_euvat->allow_vat_rules() ? 'digital' : 'physical';
178 178
             }
179 179
         }
180 180
         
181
-        return apply_filters( 'wpinv_get_item_vat_rule', $this->vat_rule, $this->ID );
181
+        return apply_filters('wpinv_get_item_vat_rule', $this->vat_rule, $this->ID);
182 182
     }
183 183
     
184 184
     public function get_vat_class() {
185
-        if( !isset( $this->vat_class ) ) {
186
-            $this->vat_class = get_post_meta( $this->ID, '_wpinv_vat_class', true );
185
+        if (!isset($this->vat_class)) {
186
+            $this->vat_class = get_post_meta($this->ID, '_wpinv_vat_class', true);
187 187
 
188
-            if ( empty( $this->vat_class ) ) {        
188
+            if (empty($this->vat_class)) {        
189 189
                 $this->vat_class = '_standard';
190 190
             }
191 191
         }
192 192
         
193
-        return apply_filters( 'wpinv_get_item_vat_class', $this->vat_class, $this->ID );
193
+        return apply_filters('wpinv_get_item_vat_class', $this->vat_class, $this->ID);
194 194
     }
195 195
     
196 196
     public function get_cpt_singular_name() {
197
-        if( ! isset( $this->cpt_singular_name ) ) {
198
-            $this->cpt_singular_name = get_post_meta( $this->ID, '_wpinv_cpt_singular_name', true );
197
+        if (!isset($this->cpt_singular_name)) {
198
+            $this->cpt_singular_name = get_post_meta($this->ID, '_wpinv_cpt_singular_name', true);
199 199
         }
200 200
 
201
-        return apply_filters( 'wpinv_item_get_cpt_singular_name', $this->cpt_singular_name, $this->ID );
201
+        return apply_filters('wpinv_item_get_cpt_singular_name', $this->cpt_singular_name, $this->ID);
202 202
     }
203 203
 
204 204
     public function get_type() {
205
-        if( ! isset( $this->type ) ) {
206
-            $this->type = get_post_meta( $this->ID, '_wpinv_type', true );
205
+        if (!isset($this->type)) {
206
+            $this->type = get_post_meta($this->ID, '_wpinv_type', true);
207 207
 
208
-            if ( empty( $this->type ) ) {
208
+            if (empty($this->type)) {
209 209
                 $this->type = 'custom';
210 210
             }
211 211
         }
212 212
 
213
-        return apply_filters( 'wpinv_get_item_type', $this->type, $this->ID );
213
+        return apply_filters('wpinv_get_item_type', $this->type, $this->ID);
214 214
     }
215 215
     
216 216
     public function is_recurring() {
217
-        $is_recurring = get_post_meta( $this->ID, '_wpinv_is_recurring', true );
217
+        $is_recurring = get_post_meta($this->ID, '_wpinv_is_recurring', true);
218 218
 
219
-        return (bool)apply_filters( 'wpinv_is_recurring_item', $is_recurring, $this->ID );
219
+        return (bool)apply_filters('wpinv_is_recurring_item', $is_recurring, $this->ID);
220 220
 
221 221
     }
222 222
     
223
-    public function get_recurring_period( $full = false ) {
224
-        $period = get_post_meta( $this->ID, '_wpinv_recurring_period', true );
223
+    public function get_recurring_period($full = false) {
224
+        $period = get_post_meta($this->ID, '_wpinv_recurring_period', true);
225 225
         
226
-        if ( !in_array( $period, array( 'D', 'W', 'M', 'Y' ) ) ) {
226
+        if (!in_array($period, array('D', 'W', 'M', 'Y'))) {
227 227
             $period = 'D';
228 228
         }
229 229
         
230
-        if ( $full ) {
231
-            switch( $period ) {
230
+        if ($full) {
231
+            switch ($period) {
232 232
                 case 'D':
233 233
                     $period = 'day';
234 234
                 break;
@@ -244,45 +244,45 @@  discard block
 block discarded – undo
244 244
             }
245 245
         }
246 246
 
247
-        return apply_filters( 'wpinv_item_recurring_period', $period, $full, $this->ID );
247
+        return apply_filters('wpinv_item_recurring_period', $period, $full, $this->ID);
248 248
 
249 249
     }
250 250
     
251 251
     public function get_recurring_interval() {
252
-        $interval = (int)get_post_meta( $this->ID, '_wpinv_recurring_interval', true );
252
+        $interval = (int)get_post_meta($this->ID, '_wpinv_recurring_interval', true);
253 253
         
254
-        if ( !$interval > 0 ) {
254
+        if (!$interval > 0) {
255 255
             $interval = 1;
256 256
         }
257 257
 
258
-        return apply_filters( 'wpinv_item_recurring_interval', $interval, $this->ID );
258
+        return apply_filters('wpinv_item_recurring_interval', $interval, $this->ID);
259 259
 
260 260
     }
261 261
     
262 262
     public function get_recurring_limit() {
263
-        $limit = get_post_meta( $this->ID, '_wpinv_recurring_limit', true );
263
+        $limit = get_post_meta($this->ID, '_wpinv_recurring_limit', true);
264 264
 
265
-        return (int)apply_filters( 'wpinv_item_recurring_limit', $limit, $this->ID );
265
+        return (int)apply_filters('wpinv_item_recurring_limit', $limit, $this->ID);
266 266
 
267 267
     }
268 268
     
269 269
     public function has_free_trial() {
270
-        $free_trial = get_post_meta( $this->ID, '_wpinv_free_trial', true );
271
-        $free_trial = $this->is_recurring() && !empty( $free_trial ) ? true : false;
270
+        $free_trial = get_post_meta($this->ID, '_wpinv_free_trial', true);
271
+        $free_trial = $this->is_recurring() && !empty($free_trial) ? true : false;
272 272
 
273
-        return (bool)apply_filters( 'wpinv_item_has_free_trial', $free_trial, $this->ID );
273
+        return (bool)apply_filters('wpinv_item_has_free_trial', $free_trial, $this->ID);
274 274
 
275 275
     }
276 276
     
277
-    public function get_trial_period( $full = false ) {
278
-        $period = get_post_meta( $this->ID, '_wpinv_trial_period', true );
277
+    public function get_trial_period($full = false) {
278
+        $period = get_post_meta($this->ID, '_wpinv_trial_period', true);
279 279
         
280
-        if ( !in_array( $period, array( 'D', 'W', 'M', 'Y' ) ) ) {
280
+        if (!in_array($period, array('D', 'W', 'M', 'Y'))) {
281 281
             $period = 'D';
282 282
         }
283 283
         
284
-        if ( $full ) {
285
-            switch( $period ) {
284
+        if ($full) {
285
+            switch ($period) {
286 286
                 case 'D':
287 287
                     $period = 'day';
288 288
                 break;
@@ -298,47 +298,47 @@  discard block
 block discarded – undo
298 298
             }
299 299
         }
300 300
 
301
-        return apply_filters( 'wpinv_item_trial_period', $period, $full, $this->ID );
301
+        return apply_filters('wpinv_item_trial_period', $period, $full, $this->ID);
302 302
 
303 303
     }
304 304
     
305 305
     public function get_trial_interval() {
306
-        $interval = absint( get_post_meta( $this->ID, '_wpinv_trial_interval', true ) );
306
+        $interval = absint(get_post_meta($this->ID, '_wpinv_trial_interval', true));
307 307
         
308
-        if ( !$interval > 0 ) {
308
+        if (!$interval > 0) {
309 309
             $interval = 1;
310 310
         }
311 311
 
312
-        return apply_filters( 'wpinv_item_trial_interval', $interval, $this->ID );
312
+        return apply_filters('wpinv_item_trial_interval', $interval, $this->ID);
313 313
 
314 314
     }
315 315
 
316 316
     public function is_free() {
317 317
         $is_free = false;
318 318
         
319
-        $price = get_post_meta( $this->ID, '_wpinv_price', true );
319
+        $price = get_post_meta($this->ID, '_wpinv_price', true);
320 320
 
321
-        if ( (float)$price == 0 ) {
321
+        if ((float)$price == 0) {
322 322
             $is_free = true;
323 323
         }
324 324
 
325
-        return (bool) apply_filters( 'wpinv_is_free_item', $is_free, $this->ID );
325
+        return (bool)apply_filters('wpinv_is_free_item', $is_free, $this->ID);
326 326
 
327 327
     }
328 328
     
329 329
     public function is_package() {
330 330
         $is_package = $this->get_type() == 'package' ? true : false;
331 331
 
332
-        return (bool) apply_filters( 'wpinv_is_package_item', $is_package, $this->ID );
332
+        return (bool)apply_filters('wpinv_is_package_item', $is_package, $this->ID);
333 333
 
334 334
     }
335 335
     
336
-    public function save_metas( $metas = array() ) {
337
-        if ( empty( $metas ) ) {
336
+    public function save_metas($metas = array()) {
337
+        if (empty($metas)) {
338 338
             return false;
339 339
         }
340 340
         
341
-        foreach ( $metas as $meta_key => $meta_value ) {
341
+        foreach ($metas as $meta_key => $meta_value) {
342 342
             $meta_key = strpos($meta_key, '_wpinv_') !== 0 ? '_wpinv_' . $meta_key : $meta_key;
343 343
             
344 344
             $this->update_meta($meta_key, $meta_value);
@@ -347,66 +347,66 @@  discard block
 block discarded – undo
347 347
         return true;
348 348
     }
349 349
 
350
-    public function update_meta( $meta_key = '', $meta_value = '', $prev_value = '' ) {
351
-        if ( empty( $meta_key ) ) {
350
+    public function update_meta($meta_key = '', $meta_value = '', $prev_value = '') {
351
+        if (empty($meta_key)) {
352 352
             return false;
353 353
         }
354 354
         
355
-        $meta_value = apply_filters( 'wpinv_update_item_meta_' . $meta_key, $meta_value, $this->ID );
355
+        $meta_value = apply_filters('wpinv_update_item_meta_' . $meta_key, $meta_value, $this->ID);
356 356
 
357
-        return update_post_meta( $this->ID, $meta_key, $meta_value, $prev_value );
357
+        return update_post_meta($this->ID, $meta_key, $meta_value, $prev_value);
358 358
     }
359 359
     
360
-    public function get_fees( $type = 'fee', $item_id = 0 ) {
360
+    public function get_fees($type = 'fee', $item_id = 0) {
361 361
         global $wpi_session;
362 362
         
363
-        $fees = $wpi_session->get( 'wpi_cart_fees' );
363
+        $fees = $wpi_session->get('wpi_cart_fees');
364 364
 
365
-        if ( ! wpinv_get_cart_contents() ) {
365
+        if (!wpinv_get_cart_contents()) {
366 366
             // We can only get item type fees when the cart is empty
367 367
             $type = 'custom';
368 368
         }
369 369
 
370
-        if ( ! empty( $fees ) && ! empty( $type ) && 'all' !== $type ) {
371
-            foreach( $fees as $key => $fee ) {
372
-                if( ! empty( $fee['type'] ) && $type != $fee['type'] ) {
373
-                    unset( $fees[ $key ] );
370
+        if (!empty($fees) && !empty($type) && 'all' !== $type) {
371
+            foreach ($fees as $key => $fee) {
372
+                if (!empty($fee['type']) && $type != $fee['type']) {
373
+                    unset($fees[$key]);
374 374
                 }
375 375
             }
376 376
         }
377 377
 
378
-        if ( ! empty( $fees ) && ! empty( $item_id ) ) {
378
+        if (!empty($fees) && !empty($item_id)) {
379 379
             // Remove fees that don't belong to the specified Item
380
-            foreach ( $fees as $key => $fee ) {
381
-                if ( (int) $item_id !== (int)$fee['item_id'] ) {
382
-                    unset( $fees[ $key ] );
380
+            foreach ($fees as $key => $fee) {
381
+                if ((int)$item_id !== (int)$fee['item_id']) {
382
+                    unset($fees[$key]);
383 383
                 }
384 384
             }
385 385
         }
386 386
 
387
-        if ( ! empty( $fees ) ) {
387
+        if (!empty($fees)) {
388 388
             // Remove fees that belong to a specific item but are not in the cart
389
-            foreach( $fees as $key => $fee ) {
390
-                if( empty( $fee['item_id'] ) ) {
389
+            foreach ($fees as $key => $fee) {
390
+                if (empty($fee['item_id'])) {
391 391
                     continue;
392 392
                 }
393 393
 
394
-                if ( !wpinv_item_in_cart( $fee['item_id'] ) ) {
395
-                    unset( $fees[ $key ] );
394
+                if (!wpinv_item_in_cart($fee['item_id'])) {
395
+                    unset($fees[$key]);
396 396
                 }
397 397
             }
398 398
         }
399 399
 
400
-        return ! empty( $fees ) ? $fees : array();
400
+        return !empty($fees) ? $fees : array();
401 401
     }
402 402
     
403 403
     public function can_purchase() {
404 404
         $can_purchase = true;
405 405
 
406
-        if ( !current_user_can( 'edit_post', $this->ID ) && $this->post_status != 'publish' ) {
406
+        if (!current_user_can('edit_post', $this->ID) && $this->post_status != 'publish') {
407 407
             $can_purchase = false;
408 408
         }
409 409
 
410
-        return (bool)apply_filters( 'wpinv_can_purchase_item', $can_purchase, $this );
410
+        return (bool)apply_filters('wpinv_can_purchase_item', $can_purchase, $this);
411 411
     }
412 412
 }
Please login to merge, or discard this patch.
Braces   +3 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,8 @@
 block discarded – undo
1 1
 <?php
2 2
 // Exit if accessed directly
3
-if ( ! defined( 'ABSPATH' ) ) exit;
3
+if ( ! defined( 'ABSPATH' ) ) {
4
+    exit;
5
+}
4 6
 
5 7
 class WPInv_Item {
6 8
     public $ID = 0;
Please login to merge, or discard this patch.
includes/gateways/worldpay.php 2 patches
Spacing   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -1,12 +1,12 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 // Exit if accessed directly
3
-if ( ! defined( 'ABSPATH' ) ) exit;
3
+if (!defined('ABSPATH')) exit;
4 4
 
5
-add_action( 'wpinv_worldpay_cc_form', '__return_false' );
5
+add_action('wpinv_worldpay_cc_form', '__return_false');
6 6
 
7
-function wpinv_process_worldpay_payment( $purchase_data ) {
8
-    if( ! wp_verify_nonce( $purchase_data['gateway_nonce'], 'wpi-gateway' ) ) {
9
-        wp_die( __( 'Nonce verification has failed', 'invoicing' ), __( 'Error', 'invoicing' ), array( 'response' => 403 ) );
7
+function wpinv_process_worldpay_payment($purchase_data) {
8
+    if (!wp_verify_nonce($purchase_data['gateway_nonce'], 'wpi-gateway')) {
9
+        wp_die(__('Nonce verification has failed', 'invoicing'), __('Error', 'invoicing'), array('response' => 403));
10 10
     }
11 11
     
12 12
     // Collect payment data
@@ -24,120 +24,120 @@  discard block
 block discarded – undo
24 24
     );
25 25
 
26 26
     // Record the pending payment
27
-    $invoice = wpinv_get_invoice( $purchase_data['invoice_id'] );
27
+    $invoice = wpinv_get_invoice($purchase_data['invoice_id']);
28 28
     
29
-    if ( !empty( $invoice ) ) {
29
+    if (!empty($invoice)) {
30 30
         $quantities_enabled = wpinv_item_quantities_enabled();
31 31
         
32
-        $instId     = wpinv_get_option( 'worldpay_instId', false );
32
+        $instId     = wpinv_get_option('worldpay_instId', false);
33 33
         $cartId     = $invoice->get_number();
34
-        $testMode   = wpinv_is_test_mode( 'worldpay' ) ? 100 : 0;
34
+        $testMode   = wpinv_is_test_mode('worldpay') ? 100 : 0;
35 35
         $name       = $invoice->get_user_full_name();
36
-        $address    = wp_strip_all_tags( $invoice->get_address(), true );
36
+        $address    = wp_strip_all_tags($invoice->get_address(), true);
37 37
         $postcode   = $invoice->zip;
38 38
         $tel        = $invoice->phone;
39 39
         $email      = $invoice->get_email();
40 40
         $country    = $invoice->country;
41
-        $amount     = wpinv_sanitize_amount( $invoice->get_total() );
41
+        $amount     = wpinv_sanitize_amount($invoice->get_total());
42 42
         $currency   = wpinv_get_currency();
43 43
         
44 44
         $items      = array();
45
-        foreach ( $invoice->get_cart_details() as $item ) {
45
+        foreach ($invoice->get_cart_details() as $item) {
46 46
             $item_desc  = $item['name'];
47
-            $quantity   = !empty( $item['quantity'] ) && $item['quantity'] > 0 ? $item['quantity'] : 1;
48
-            $item_desc .= ' (' . ( $quantities_enabled ? $quantity . 'x ' : '' ) . wpinv_price( wpinv_format_amount( $item['item_price'] ) ) . ')';
47
+            $quantity   = !empty($item['quantity']) && $item['quantity'] > 0 ? $item['quantity'] : 1;
48
+            $item_desc .= ' (' . ($quantities_enabled ? $quantity . 'x ' : '') . wpinv_price(wpinv_format_amount($item['item_price'])) . ')';
49 49
             
50 50
             $items[] = $item_desc;
51 51
         }
52 52
         
53
-        $desc = implode( ', ', $items );
54
-        if ( wpinv_use_taxes() && $invoice->get_tax() > 0 ) {
55
-            $desc .= ', ' . wp_sprintf( __( 'Tax: %s', 'invoicing' ), $invoice->get_tax( true ) );
53
+        $desc = implode(', ', $items);
54
+        if (wpinv_use_taxes() && $invoice->get_tax() > 0) {
55
+            $desc .= ', ' . wp_sprintf(__('Tax: %s', 'invoicing'), $invoice->get_tax(true));
56 56
         }
57 57
         
58 58
         $extra_params                   = array();
59 59
         $extra_params['MC_description'] = $desc;
60
-        $extra_params['MC_callback']    = wpinv_get_ipn_url( 'worldpay' );
60
+        $extra_params['MC_callback']    = wpinv_get_ipn_url('worldpay');
61 61
         $extra_params['MC_key']         = $invoice->get_key();
62 62
         $extra_params['MC_invoice_id']  = $invoice->ID;
63 63
         $extra_params['address1']       = $address;
64 64
         $extra_params['town']           = $invoice->city;
65 65
         $extra_params['region']         = $invoice->state;
66
-        $extra_params['amountString']   = $invoice->get_total( true );
67
-        $extra_params['countryString']  = wpinv_country_name( $invoice->country );
66
+        $extra_params['amountString']   = $invoice->get_total(true);
67
+        $extra_params['countryString']  = wpinv_country_name($invoice->country);
68 68
         $extra_params['compName']       = $invoice->company;
69 69
         
70
-        $extra_params   = apply_filters( 'wpinv_worldpay_form_extra_parameters', $extra_params, $invoice );
70
+        $extra_params   = apply_filters('wpinv_worldpay_form_extra_parameters', $extra_params, $invoice);
71 71
         
72
-        $redirect_text  = __( 'Redirecting to Worldpay site, click on button if not redirected.', 'invoicing' );
73
-        $redirect_text  = apply_filters( 'wpinv_worldpay_redirect_text', $redirect_text, $invoice );
72
+        $redirect_text  = __('Redirecting to Worldpay site, click on button if not redirected.', 'invoicing');
73
+        $redirect_text  = apply_filters('wpinv_worldpay_redirect_text', $redirect_text, $invoice);
74 74
         
75 75
         // Empty the shopping cart
76 76
         wpinv_empty_cart();
77 77
         ?>
78 78
 <div class="wpi-worldpay-form" style="padding:20px;font-family:arial,sans-serif;text-align:center;color:#555">
79
-<?php do_action( 'wpinv_worldpay_form_before', $invoice ); ?>
80
-<h3><?php echo $redirect_text ;?></h3>
79
+<?php do_action('wpinv_worldpay_form_before', $invoice); ?>
80
+<h3><?php echo $redirect_text; ?></h3>
81 81
 <form action="<?php echo wpinv_get_worldpay_redirect(); ?>" name="wpi_worldpay_form" method="POST">
82
-    <input type="hidden" value="<?php echo $amount;?>" name="amount">
83
-    <input type="hidden" value="<?php echo esc_attr( $cartId );?>" name="cartId">
84
-    <input type="hidden" value="<?php echo $currency;?>" name="currency">
85
-    <input type="hidden" value="<?php echo $instId;?>" name="instId">
86
-    <input type="hidden" value="<?php echo $testMode;?>" name="testMode">
87
-    <input type="hidden" value="<?php echo esc_attr( $name );?>" name="name">
88
-    <input type="hidden" value="<?php echo esc_attr( $address );?>" name="address">
89
-    <input type="hidden" value="<?php echo esc_attr( $postcode );?>" name="postcode">
90
-    <input type="hidden" value="<?php echo esc_attr( $tel );?>" name="tel">
91
-    <input type="hidden" value="<?php echo esc_attr( $email );?>" name="email">
92
-    <input type="hidden" value="<?php echo esc_attr( $country );?>" name="country">
93
-    <input type="hidden" value="<?php echo esc_attr( $desc );?>" name="desc">
94
-    <?php foreach ( $extra_params as $param => $value ) { ?>
95
-        <?php if ( !empty( $value !== false ) ) { ?>
96
-    <input type="hidden" value="<?php echo esc_attr( $value );?>" name="<?php echo esc_attr( $param );?>">
82
+    <input type="hidden" value="<?php echo $amount; ?>" name="amount">
83
+    <input type="hidden" value="<?php echo esc_attr($cartId); ?>" name="cartId">
84
+    <input type="hidden" value="<?php echo $currency; ?>" name="currency">
85
+    <input type="hidden" value="<?php echo $instId; ?>" name="instId">
86
+    <input type="hidden" value="<?php echo $testMode; ?>" name="testMode">
87
+    <input type="hidden" value="<?php echo esc_attr($name); ?>" name="name">
88
+    <input type="hidden" value="<?php echo esc_attr($address); ?>" name="address">
89
+    <input type="hidden" value="<?php echo esc_attr($postcode); ?>" name="postcode">
90
+    <input type="hidden" value="<?php echo esc_attr($tel); ?>" name="tel">
91
+    <input type="hidden" value="<?php echo esc_attr($email); ?>" name="email">
92
+    <input type="hidden" value="<?php echo esc_attr($country); ?>" name="country">
93
+    <input type="hidden" value="<?php echo esc_attr($desc); ?>" name="desc">
94
+    <?php foreach ($extra_params as $param => $value) { ?>
95
+        <?php if (!empty($value !== false)) { ?>
96
+    <input type="hidden" value="<?php echo esc_attr($value); ?>" name="<?php echo esc_attr($param); ?>">
97 97
         <?php } ?>
98 98
     <?php } ?>
99
-    <?php do_action( 'wpinv_worldpay_form_parameters', $invoice ); ?>
100
-    <input type="submit" name="wpi_worldpay_submit" value="<?php esc_attr_e( 'Pay by Debit/Credit Card (WorldPay)', 'invoicing' ) ;?>">
99
+    <?php do_action('wpinv_worldpay_form_parameters', $invoice); ?>
100
+    <input type="submit" name="wpi_worldpay_submit" value="<?php esc_attr_e('Pay by Debit/Credit Card (WorldPay)', 'invoicing'); ?>">
101 101
 </form>
102 102
 <script type="text/javascript">document.wpi_worldpay_form.submit();</script>
103
-<?php do_action( 'wpinv_worldpay_form_after', $invoice ); ?>
103
+<?php do_action('wpinv_worldpay_form_after', $invoice); ?>
104 104
 </div>
105 105
         <?php
106 106
     } else {
107
-        wpinv_record_gateway_error( __( 'Payment Error', 'invoicing' ), sprintf( __( 'Payment creation failed while processing a worldpay payment. Payment data: %s', 'invoicing' ), json_encode( $payment_data ) ), $invoice );
107
+        wpinv_record_gateway_error(__('Payment Error', 'invoicing'), sprintf(__('Payment creation failed while processing a worldpay payment. Payment data: %s', 'invoicing'), json_encode($payment_data)), $invoice);
108 108
         // If errors are present, send the user back to the purchase page so they can be corrected
109
-        wpinv_send_back_to_checkout( '?payment-mode=' . $purchase_data['post_data']['wpi-gateway'] );
109
+        wpinv_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['wpi-gateway']);
110 110
     }
111 111
 }
112
-add_action( 'wpinv_gateway_worldpay', 'wpinv_process_worldpay_payment' );
112
+add_action('wpinv_gateway_worldpay', 'wpinv_process_worldpay_payment');
113 113
 
114 114
 function wpinv_get_worldpay_redirect() {
115
-    $redirect = wpinv_is_test_mode( 'worldpay' ) ? 'https://secure-test.worldpay.com/wcc/purchase' : 'https://secure.worldpay.com/wcc/purchase';
115
+    $redirect = wpinv_is_test_mode('worldpay') ? 'https://secure-test.worldpay.com/wcc/purchase' : 'https://secure.worldpay.com/wcc/purchase';
116 116
     
117
-    return apply_filters( 'wpinv_worldpay_redirect', $redirect );
117
+    return apply_filters('wpinv_worldpay_redirect', $redirect);
118 118
 }
119 119
 
120 120
 function wpinv_process_worldpay_ipn() {
121
-    $request = wpinv_get_post_data( 'post' );
121
+    $request = wpinv_get_post_data('post');
122 122
     
123
-    if ( !empty( $request['cartId'] ) && !empty( $request['transStatus'] ) && !empty( $request['installation'] ) && isset( $request['testMode'] ) && isset( $request['MC_invoice_id'] ) && isset( $request['MC_key'] ) ) {
123
+    if (!empty($request['cartId']) && !empty($request['transStatus']) && !empty($request['installation']) && isset($request['testMode']) && isset($request['MC_invoice_id']) && isset($request['MC_key'])) {
124 124
         $invoice_id = $request['MC_invoice_id'];
125 125
         
126
-        if ( $invoice_id == wpinv_get_invoice_id_by_key( $request['MC_key'] ) && $invoice = wpinv_get_invoice( $invoice_id ) ) {
127
-            if ( $request['transStatus'] == 'Y' ) {                
128
-                wpinv_update_payment_status( $invoice_id, 'publish' );
129
-                wpinv_set_payment_transaction_id( $invoice_id, $request['transId'] );
130
-                wpinv_insert_payment_note( $invoice_id, sprintf( __( 'Worldpay Transaction ID: %s', 'invoicing' ), $request['transId'] ) );
126
+        if ($invoice_id == wpinv_get_invoice_id_by_key($request['MC_key']) && $invoice = wpinv_get_invoice($invoice_id)) {
127
+            if ($request['transStatus'] == 'Y') {                
128
+                wpinv_update_payment_status($invoice_id, 'publish');
129
+                wpinv_set_payment_transaction_id($invoice_id, $request['transId']);
130
+                wpinv_insert_payment_note($invoice_id, sprintf(__('Worldpay Transaction ID: %s', 'invoicing'), $request['transId']));
131 131
                 return;
132
-            } else if ( $request['transStatus'] == 'C' ) {
133
-                wpinv_update_payment_status( $invoice_id, 'failed' );
134
-                wpinv_insert_payment_note( $invoice_id, __( 'Payment transaction failed while processing Worldpay payment, kindly check IPN log.', 'invoicing' ) );
132
+            } else if ($request['transStatus'] == 'C') {
133
+                wpinv_update_payment_status($invoice_id, 'failed');
134
+                wpinv_insert_payment_note($invoice_id, __('Payment transaction failed while processing Worldpay payment, kindly check IPN log.', 'invoicing'));
135 135
                 
136
-                wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Payment transaction failed while processing Worldpay payment. IPN data: %s', 'invoicing' ), json_encode( $request ) ), $invoice_id );
136
+                wpinv_record_gateway_error(__('IPN Error', 'invoicing'), sprintf(__('Payment transaction failed while processing Worldpay payment. IPN data: %s', 'invoicing'), json_encode($request)), $invoice_id);
137 137
                 return;
138 138
             }
139 139
         }
140 140
     }
141 141
     return;
142 142
 }
143
-add_action( 'wpinv_verify_worldpay_ipn', 'wpinv_process_worldpay_ipn' );
144 143
\ No newline at end of file
144
+add_action('wpinv_verify_worldpay_ipn', 'wpinv_process_worldpay_ipn');
145 145
\ No newline at end of file
Please login to merge, or discard this patch.
Braces   +3 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,8 @@
 block discarded – undo
1 1
 <?php
2 2
 // Exit if accessed directly
3
-if ( ! defined( 'ABSPATH' ) ) exit;
3
+if ( ! defined( 'ABSPATH' ) ) {
4
+    exit;
5
+}
4 6
 
5 7
 add_action( 'wpinv_worldpay_cc_form', '__return_false' );
6 8
 
Please login to merge, or discard this patch.
includes/gateways/authorizenet/anet_php_sdk/lib/AuthorizeNetSIM.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -182,7 +182,7 @@
 block discarded – undo
182 182
         $string = "";
183 183
         foreach ($array as $key => $value) {
184 184
             if ($value) {
185
-                $string .= '<input type="hidden" name="'.$key.'" value="'.$value.'">';
185
+                $string .= '<input type="hidden" name="' . $key . '" value="' . $value . '">';
186 186
             }
187 187
         }
188 188
         return $string;
Please login to merge, or discard this patch.