Completed
Push — release-2.1 ( 08aa48...ab4516 )
by Mathias
06:51
created
Sources/Security.php 2 patches
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -52,7 +52,7 @@  discard block
 block discarded – undo
52 52
 	require_once($sourcedir . '/Subs-Auth.php');
53 53
 
54 54
 	// Posting the password... check it.
55
-	if (isset($_POST[$type. '_pass']))
55
+	if (isset($_POST[$type . '_pass']))
56 56
 	{
57 57
 		// Check to ensure we're forcing SSL for authentication
58 58
 		if (!empty($modSettings['force_ssl']) && empty($maintenance) && (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on'))
@@ -179,7 +179,7 @@  discard block
 block discarded – undo
179 179
 		{
180 180
 			if ($ip_number == 'ip2' && $user_info['ip2'] == $user_info['ip'])
181 181
 				continue;
182
-			$ban_query[] = ' {inet:'.$ip_number.'} BETWEEN bi.ip_low and bi.ip_high';
182
+			$ban_query[] = ' {inet:' . $ip_number . '} BETWEEN bi.ip_low and bi.ip_high';
183 183
 			$ban_query_vars[$ip_number] = $user_info[$ip_number];
184 184
 			// IP was valid, maybe there's also a hostname...
185 185
 			if (empty($modSettings['disableHostnameLookup']) && $user_info[$ip_number] != 'unknown')
@@ -187,8 +187,8 @@  discard block
 block discarded – undo
187 187
 				$hostname = host_from_ip($user_info[$ip_number]);
188 188
 				if (strlen($hostname) > 0)
189 189
 				{
190
-					$ban_query[] = '({string:hostname'.$ip_number.'} LIKE bi.hostname)';
191
-					$ban_query_vars['hostname'.$ip_number] = $hostname;
190
+					$ban_query[] = '({string:hostname' . $ip_number . '} LIKE bi.hostname)';
191
+					$ban_query_vars['hostname' . $ip_number] = $hostname;
192 192
 				}
193 193
 			}
194 194
 		}
@@ -912,7 +912,7 @@  discard block
 block discarded – undo
912 912
 		return true;
913 913
 
914 914
 	// Let's ensure this is an array.
915
-	$permission = (array)$permission;
915
+	$permission = (array) $permission;
916 916
 
917 917
 	// Are we checking the _current_ board, or some other boards?
918 918
 	if ($boards === null)
Please login to merge, or discard this patch.
Braces   +263 added lines, -203 removed lines patch added patch discarded remove patch
@@ -14,8 +14,9 @@  discard block
 block discarded – undo
14 14
  * @version 2.1 Beta 3
15 15
  */
16 16
 
17
-if (!defined('SMF'))
17
+if (!defined('SMF')) {
18 18
 	die('No direct access...');
19
+}
19 20
 
20 21
 /**
21 22
  * Check if the user is who he/she says he is
@@ -42,12 +43,14 @@  discard block
 block discarded – undo
42 43
 	$refreshTime = isset($_GET['xml']) ? 4200 : 3600;
43 44
 
44 45
 	// Is the security option off?
45
-	if (!empty($modSettings['securityDisable' . ($type != 'admin' ? '_' . $type : '')]))
46
-		return;
46
+	if (!empty($modSettings['securityDisable' . ($type != 'admin' ? '_' . $type : '')])) {
47
+			return;
48
+	}
47 49
 
48 50
 	// Or are they already logged in?, Moderator or admin session is need for this area
49
-	if ((!empty($_SESSION[$type . '_time']) && $_SESSION[$type . '_time'] + $refreshTime >= time()) || (!empty($_SESSION['admin_time']) && $_SESSION['admin_time'] + $refreshTime >= time()))
50
-		return;
51
+	if ((!empty($_SESSION[$type . '_time']) && $_SESSION[$type . '_time'] + $refreshTime >= time()) || (!empty($_SESSION['admin_time']) && $_SESSION['admin_time'] + $refreshTime >= time())) {
52
+			return;
53
+	}
51 54
 
52 55
 	require_once($sourcedir . '/Subs-Auth.php');
53 56
 
@@ -55,8 +58,9 @@  discard block
 block discarded – undo
55 58
 	if (isset($_POST[$type. '_pass']))
56 59
 	{
57 60
 		// Check to ensure we're forcing SSL for authentication
58
-		if (!empty($modSettings['force_ssl']) && empty($maintenance) && (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on'))
59
-			fatal_lang_error('login_ssl_required');
61
+		if (!empty($modSettings['force_ssl']) && empty($maintenance) && (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on')) {
62
+					fatal_lang_error('login_ssl_required');
63
+		}
60 64
 
61 65
 		checkSession();
62 66
 
@@ -72,17 +76,19 @@  discard block
 block discarded – undo
72 76
 	}
73 77
 
74 78
 	// Better be sure to remember the real referer
75
-	if (empty($_SESSION['request_referer']))
76
-		$_SESSION['request_referer'] = isset($_SERVER['HTTP_REFERER']) ? @parse_url($_SERVER['HTTP_REFERER']) : array();
77
-	elseif (empty($_POST))
78
-		unset($_SESSION['request_referer']);
79
+	if (empty($_SESSION['request_referer'])) {
80
+			$_SESSION['request_referer'] = isset($_SERVER['HTTP_REFERER']) ? @parse_url($_SERVER['HTTP_REFERER']) : array();
81
+	} elseif (empty($_POST)) {
82
+			unset($_SESSION['request_referer']);
83
+	}
79 84
 
80 85
 	// Need to type in a password for that, man.
81
-	if (!isset($_GET['xml']))
82
-		adminLogin($type);
83
-	else
84
-		return 'session_verify_fail';
85
-}
86
+	if (!isset($_GET['xml'])) {
87
+			adminLogin($type);
88
+	} else {
89
+			return 'session_verify_fail';
90
+	}
91
+	}
86 92
 
87 93
 /**
88 94
  * Require a user who is logged in. (not a guest.)
@@ -96,25 +102,30 @@  discard block
 block discarded – undo
96 102
 	global $user_info, $txt, $context, $scripturl, $modSettings;
97 103
 
98 104
 	// Luckily, this person isn't a guest.
99
-	if (!$user_info['is_guest'])
100
-		return;
105
+	if (!$user_info['is_guest']) {
106
+			return;
107
+	}
101 108
 
102 109
 	// Log what they were trying to do didn't work)
103
-	if (!empty($modSettings['who_enabled']))
104
-		$_GET['error'] = 'guest_login';
110
+	if (!empty($modSettings['who_enabled'])) {
111
+			$_GET['error'] = 'guest_login';
112
+	}
105 113
 	writeLog(true);
106 114
 
107 115
 	// Just die.
108
-	if (isset($_REQUEST['xml']))
109
-		obExit(false);
116
+	if (isset($_REQUEST['xml'])) {
117
+			obExit(false);
118
+	}
110 119
 
111 120
 	// Attempt to detect if they came from dlattach.
112
-	if (SMF != 'SSI' && empty($context['theme_loaded']))
113
-		loadTheme();
121
+	if (SMF != 'SSI' && empty($context['theme_loaded'])) {
122
+			loadTheme();
123
+	}
114 124
 
115 125
 	// Never redirect to an attachment
116
-	if (strpos($_SERVER['REQUEST_URL'], 'dlattach') === false)
117
-		$_SESSION['login_url'] = $_SERVER['REQUEST_URL'];
126
+	if (strpos($_SERVER['REQUEST_URL'], 'dlattach') === false) {
127
+			$_SESSION['login_url'] = $_SERVER['REQUEST_URL'];
128
+	}
118 129
 
119 130
 	// Load the Login template and language file.
120 131
 	loadLanguage('Login');
@@ -124,8 +135,7 @@  discard block
 block discarded – undo
124 135
 	{
125 136
 		$_SESSION['login_url'] = $scripturl . '?' . $_SERVER['QUERY_STRING'];
126 137
 		redirectexit('action=login');
127
-	}
128
-	else
138
+	} else
129 139
 	{
130 140
 		loadTemplate('Login');
131 141
 		$context['sub_template'] = 'kick_guest';
@@ -155,8 +165,9 @@  discard block
 block discarded – undo
155 165
 	global $sourcedir, $cookiename, $user_settings, $smcFunc;
156 166
 
157 167
 	// You cannot be banned if you are an admin - doesn't help if you log out.
158
-	if ($user_info['is_admin'])
159
-		return;
168
+	if ($user_info['is_admin']) {
169
+			return;
170
+	}
160 171
 
161 172
 	// Only check the ban every so often. (to reduce load.)
162 173
 	if ($forceCheck || !isset($_SESSION['ban']) || empty($modSettings['banLastUpdated']) || ($_SESSION['ban']['last_checked'] < $modSettings['banLastUpdated']) || $_SESSION['ban']['id_member'] != $user_info['id'] || $_SESSION['ban']['ip'] != $user_info['ip'] || $_SESSION['ban']['ip2'] != $user_info['ip2'] || (isset($user_info['email'], $_SESSION['ban']['email']) && $_SESSION['ban']['email'] != $user_info['email']))
@@ -177,8 +188,9 @@  discard block
 block discarded – undo
177 188
 		// Check both IP addresses.
178 189
 		foreach (array('ip', 'ip2') as $ip_number)
179 190
 		{
180
-			if ($ip_number == 'ip2' && $user_info['ip2'] == $user_info['ip'])
181
-				continue;
191
+			if ($ip_number == 'ip2' && $user_info['ip2'] == $user_info['ip']) {
192
+							continue;
193
+			}
182 194
 			$ban_query[] = ' {inet:'.$ip_number.'} BETWEEN bi.ip_low and bi.ip_high';
183 195
 			$ban_query_vars[$ip_number] = $user_info[$ip_number];
184 196
 			// IP was valid, maybe there's also a hostname...
@@ -228,24 +240,28 @@  discard block
 block discarded – undo
228 240
 			// Store every type of ban that applies to you in your session.
229 241
 			while ($row = $smcFunc['db_fetch_assoc']($request))
230 242
 			{
231
-				foreach ($restrictions as $restriction)
232
-					if (!empty($row[$restriction]))
243
+				foreach ($restrictions as $restriction) {
244
+									if (!empty($row[$restriction]))
233 245
 					{
234 246
 						$_SESSION['ban'][$restriction]['reason'] = $row['reason'];
247
+				}
235 248
 						$_SESSION['ban'][$restriction]['ids'][] = $row['id_ban'];
236
-						if (!isset($_SESSION['ban']['expire_time']) || ($_SESSION['ban']['expire_time'] != 0 && ($row['expire_time'] == 0 || $row['expire_time'] > $_SESSION['ban']['expire_time'])))
237
-							$_SESSION['ban']['expire_time'] = $row['expire_time'];
249
+						if (!isset($_SESSION['ban']['expire_time']) || ($_SESSION['ban']['expire_time'] != 0 && ($row['expire_time'] == 0 || $row['expire_time'] > $_SESSION['ban']['expire_time']))) {
250
+													$_SESSION['ban']['expire_time'] = $row['expire_time'];
251
+						}
238 252
 
239
-						if (!$user_info['is_guest'] && $restriction == 'cannot_access' && ($row['id_member'] == $user_info['id'] || $row['email_address'] == $user_info['email']))
240
-							$flag_is_activated = true;
253
+						if (!$user_info['is_guest'] && $restriction == 'cannot_access' && ($row['id_member'] == $user_info['id'] || $row['email_address'] == $user_info['email'])) {
254
+													$flag_is_activated = true;
255
+						}
241 256
 					}
242 257
 			}
243 258
 			$smcFunc['db_free_result']($request);
244 259
 		}
245 260
 
246 261
 		// Mark the cannot_access and cannot_post bans as being 'hit'.
247
-		if (isset($_SESSION['ban']['cannot_access']) || isset($_SESSION['ban']['cannot_post']) || isset($_SESSION['ban']['cannot_login']))
248
-			log_ban(array_merge(isset($_SESSION['ban']['cannot_access']) ? $_SESSION['ban']['cannot_access']['ids'] : array(), isset($_SESSION['ban']['cannot_post']) ? $_SESSION['ban']['cannot_post']['ids'] : array(), isset($_SESSION['ban']['cannot_login']) ? $_SESSION['ban']['cannot_login']['ids'] : array()));
262
+		if (isset($_SESSION['ban']['cannot_access']) || isset($_SESSION['ban']['cannot_post']) || isset($_SESSION['ban']['cannot_login'])) {
263
+					log_ban(array_merge(isset($_SESSION['ban']['cannot_access']) ? $_SESSION['ban']['cannot_access']['ids'] : array(), isset($_SESSION['ban']['cannot_post']) ? $_SESSION['ban']['cannot_post']['ids'] : array(), isset($_SESSION['ban']['cannot_login']) ? $_SESSION['ban']['cannot_login']['ids'] : array()));
264
+		}
249 265
 
250 266
 		// If for whatever reason the is_activated flag seems wrong, do a little work to clear it up.
251 267
 		if ($user_info['id'] && (($user_settings['is_activated'] >= 10 && !$flag_is_activated)
@@ -260,8 +276,9 @@  discard block
 block discarded – undo
260 276
 	if (!isset($_SESSION['ban']['cannot_access']) && !empty($_COOKIE[$cookiename . '_']))
261 277
 	{
262 278
 		$bans = explode(',', $_COOKIE[$cookiename . '_']);
263
-		foreach ($bans as $key => $value)
264
-			$bans[$key] = (int) $value;
279
+		foreach ($bans as $key => $value) {
280
+					$bans[$key] = (int) $value;
281
+		}
265 282
 		$request = $smcFunc['db_query']('', '
266 283
 			SELECT bi.id_ban, bg.reason
267 284
 			FROM {db_prefix}ban_items AS bi
@@ -297,14 +314,15 @@  discard block
 block discarded – undo
297 314
 	if (isset($_SESSION['ban']['cannot_access']))
298 315
 	{
299 316
 		// We don't wanna see you!
300
-		if (!$user_info['is_guest'])
301
-			$smcFunc['db_query']('', '
317
+		if (!$user_info['is_guest']) {
318
+					$smcFunc['db_query']('', '
302 319
 				DELETE FROM {db_prefix}log_online
303 320
 				WHERE id_member = {int:current_member}',
304 321
 				array(
305 322
 					'current_member' => $user_info['id'],
306 323
 				)
307 324
 			);
325
+		}
308 326
 
309 327
 		// 'Log' the user out.  Can't have any funny business... (save the name!)
310 328
 		$old_name = isset($user_info['name']) && $user_info['name'] != '' ? $user_info['name'] : $txt['guest_title'];
@@ -390,9 +408,10 @@  discard block
 block discarded – undo
390 408
 	}
391 409
 
392 410
 	// Fix up the banning permissions.
393
-	if (isset($user_info['permissions']))
394
-		banPermissions();
395
-}
411
+	if (isset($user_info['permissions'])) {
412
+			banPermissions();
413
+	}
414
+	}
396 415
 
397 416
 /**
398 417
  * Fix permissions according to ban status.
@@ -403,8 +422,9 @@  discard block
 block discarded – undo
403 422
 	global $user_info, $sourcedir, $modSettings, $context;
404 423
 
405 424
 	// Somehow they got here, at least take away all permissions...
406
-	if (isset($_SESSION['ban']['cannot_access']))
407
-		$user_info['permissions'] = array();
425
+	if (isset($_SESSION['ban']['cannot_access'])) {
426
+			$user_info['permissions'] = array();
427
+	}
408 428
 	// Okay, well, you can watch, but don't touch a thing.
409 429
 	elseif (isset($_SESSION['ban']['cannot_post']) || (!empty($modSettings['warning_mute']) && $modSettings['warning_mute'] <= $user_info['warning']))
410 430
 	{
@@ -446,44 +466,45 @@  discard block
 block discarded – undo
446 466
 		call_integration_hook('integrate_warn_permissions', array(&$permission_change));
447 467
 		foreach ($permission_change as $old => $new)
448 468
 		{
449
-			if (!in_array($old, $user_info['permissions']))
450
-				unset($permission_change[$old]);
451
-			else
452
-				$user_info['permissions'][] = $new;
469
+			if (!in_array($old, $user_info['permissions'])) {
470
+							unset($permission_change[$old]);
471
+			} else {
472
+							$user_info['permissions'][] = $new;
473
+			}
453 474
 		}
454 475
 		$user_info['permissions'] = array_diff($user_info['permissions'], array_keys($permission_change));
455 476
 	}
456 477
 
457 478
 	// @todo Find a better place to call this? Needs to be after permissions loaded!
458 479
 	// Finally, some bits we cache in the session because it saves queries.
459
-	if (isset($_SESSION['mc']) && $_SESSION['mc']['time'] > $modSettings['settings_updated'] && $_SESSION['mc']['id'] == $user_info['id'])
460
-		$user_info['mod_cache'] = $_SESSION['mc'];
461
-	else
480
+	if (isset($_SESSION['mc']) && $_SESSION['mc']['time'] > $modSettings['settings_updated'] && $_SESSION['mc']['id'] == $user_info['id']) {
481
+			$user_info['mod_cache'] = $_SESSION['mc'];
482
+	} else
462 483
 	{
463 484
 		require_once($sourcedir . '/Subs-Auth.php');
464 485
 		rebuildModCache();
465 486
 	}
466 487
 
467 488
 	// Now that we have the mod cache taken care of lets setup a cache for the number of mod reports still open
468
-	if (!empty($_SESSION['rc']) && $_SESSION['rc']['time'] > $modSettings['last_mod_report_action'] && $_SESSION['rc']['id'] == $user_info['id'])
469
-		$context['open_mod_reports'] = $_SESSION['rc']['reports'];
470
-	elseif ($_SESSION['mc']['bq'] != '0=1')
489
+	if (!empty($_SESSION['rc']) && $_SESSION['rc']['time'] > $modSettings['last_mod_report_action'] && $_SESSION['rc']['id'] == $user_info['id']) {
490
+			$context['open_mod_reports'] = $_SESSION['rc']['reports'];
491
+	} elseif ($_SESSION['mc']['bq'] != '0=1')
471 492
 	{
472 493
 		require_once($sourcedir . '/Subs-ReportedContent.php');
473 494
 		recountOpenReports('posts');
495
+	} else {
496
+			$context['open_mod_reports'] = 0;
474 497
 	}
475
-	else
476
-		$context['open_mod_reports'] = 0;
477 498
 
478
-	if (!empty($_SESSION['rc']) && $_SESSION['rc']['time'] > $modSettings['last_mod_report_action'] && $_SESSION['rc']['id'] == $user_info['id'])
479
-		$context['open_member_reports'] = !empty($_SESSION['rc']['member_reports']) ? $_SESSION['rc']['member_reports'] : 0;
480
-	elseif (allowedTo('moderate_forum'))
499
+	if (!empty($_SESSION['rc']) && $_SESSION['rc']['time'] > $modSettings['last_mod_report_action'] && $_SESSION['rc']['id'] == $user_info['id']) {
500
+			$context['open_member_reports'] = !empty($_SESSION['rc']['member_reports']) ? $_SESSION['rc']['member_reports'] : 0;
501
+	} elseif (allowedTo('moderate_forum'))
481 502
 	{
482 503
 		require_once($sourcedir . '/Subs-ReportedContent.php');
483 504
 		recountOpenReports('members');
505
+	} else {
506
+			$context['open_member_reports'] = 0;
484 507
 	}
485
-	else
486
-		$context['open_member_reports'] = 0;
487 508
 
488 509
 }
489 510
 
@@ -500,8 +521,9 @@  discard block
 block discarded – undo
500 521
 	global $user_info, $smcFunc;
501 522
 
502 523
 	// Don't log web accelerators, it's very confusing...
503
-	if (isset($_SERVER['HTTP_X_MOZ']) && $_SERVER['HTTP_X_MOZ'] == 'prefetch')
504
-		return;
524
+	if (isset($_SERVER['HTTP_X_MOZ']) && $_SERVER['HTTP_X_MOZ'] == 'prefetch') {
525
+			return;
526
+	}
505 527
 
506 528
 	$smcFunc['db_insert']('',
507 529
 		'{db_prefix}log_banned',
@@ -511,8 +533,8 @@  discard block
 block discarded – undo
511 533
 	);
512 534
 
513 535
 	// One extra point for these bans.
514
-	if (!empty($ban_ids))
515
-		$smcFunc['db_query']('', '
536
+	if (!empty($ban_ids)) {
537
+			$smcFunc['db_query']('', '
516 538
 			UPDATE {db_prefix}ban_items
517 539
 			SET hits = hits + 1
518 540
 			WHERE id_ban IN ({array_int:ban_ids})',
@@ -520,7 +542,8 @@  discard block
 block discarded – undo
520 542
 				'ban_ids' => $ban_ids,
521 543
 			)
522 544
 		);
523
-}
545
+	}
546
+	}
524 547
 
525 548
 /**
526 549
  * Checks if a given email address might be banned.
@@ -536,8 +559,9 @@  discard block
 block discarded – undo
536 559
 	global $txt, $smcFunc;
537 560
 
538 561
 	// Can't ban an empty email
539
-	if (empty($email) || trim($email) == '')
540
-		return;
562
+	if (empty($email) || trim($email) == '') {
563
+			return;
564
+	}
541 565
 
542 566
 	// Let's start with the bans based on your IP/hostname/memberID...
543 567
 	$ban_ids = isset($_SESSION['ban'][$restriction]) ? $_SESSION['ban'][$restriction]['ids'] : array();
@@ -610,16 +634,18 @@  discard block
 block discarded – undo
610 634
 	if ($type == 'post')
611 635
 	{
612 636
 		$check = isset($_POST[$_SESSION['session_var']]) ? $_POST[$_SESSION['session_var']] : (empty($modSettings['strictSessionCheck']) && isset($_POST['sc']) ? $_POST['sc'] : null);
613
-		if ($check !== $sc)
614
-			$error = 'session_timeout';
637
+		if ($check !== $sc) {
638
+					$error = 'session_timeout';
639
+		}
615 640
 	}
616 641
 
617 642
 	// How about $_GET['sesc']?
618 643
 	elseif ($type == 'get')
619 644
 	{
620 645
 		$check = isset($_GET[$_SESSION['session_var']]) ? $_GET[$_SESSION['session_var']] : (empty($modSettings['strictSessionCheck']) && isset($_GET['sesc']) ? $_GET['sesc'] : null);
621
-		if ($check !== $sc)
622
-			$error = 'session_verify_fail';
646
+		if ($check !== $sc) {
647
+					$error = 'session_verify_fail';
648
+		}
623 649
 	}
624 650
 
625 651
 	// Or can it be in either?
@@ -627,13 +653,15 @@  discard block
 block discarded – undo
627 653
 	{
628 654
 		$check = isset($_GET[$_SESSION['session_var']]) ? $_GET[$_SESSION['session_var']] : (empty($modSettings['strictSessionCheck']) && isset($_GET['sesc']) ? $_GET['sesc'] : (isset($_POST[$_SESSION['session_var']]) ? $_POST[$_SESSION['session_var']] : (empty($modSettings['strictSessionCheck']) && isset($_POST['sc']) ? $_POST['sc'] : null)));
629 655
 
630
-		if ($check !== $sc)
631
-			$error = 'session_verify_fail';
656
+		if ($check !== $sc) {
657
+					$error = 'session_verify_fail';
658
+		}
632 659
 	}
633 660
 
634 661
 	// Verify that they aren't changing user agents on us - that could be bad.
635
-	if ((!isset($_SESSION['USER_AGENT']) || $_SESSION['USER_AGENT'] != $_SERVER['HTTP_USER_AGENT']) && empty($modSettings['disableCheckUA']))
636
-		$error = 'session_verify_fail';
662
+	if ((!isset($_SESSION['USER_AGENT']) || $_SESSION['USER_AGENT'] != $_SERVER['HTTP_USER_AGENT']) && empty($modSettings['disableCheckUA'])) {
663
+			$error = 'session_verify_fail';
664
+	}
637 665
 
638 666
 	// Make sure a page with session check requirement is not being prefetched.
639 667
 	if (isset($_SERVER['HTTP_X_MOZ']) && $_SERVER['HTTP_X_MOZ'] == 'prefetch')
@@ -644,30 +672,35 @@  discard block
 block discarded – undo
644 672
 	}
645 673
 
646 674
 	// Check the referring site - it should be the same server at least!
647
-	if (isset($_SESSION['request_referer']))
648
-		$referrer = $_SESSION['request_referer'];
649
-	else
650
-		$referrer = isset($_SERVER['HTTP_REFERER']) ? @parse_url($_SERVER['HTTP_REFERER']) : array();
675
+	if (isset($_SESSION['request_referer'])) {
676
+			$referrer = $_SESSION['request_referer'];
677
+	} else {
678
+			$referrer = isset($_SERVER['HTTP_REFERER']) ? @parse_url($_SERVER['HTTP_REFERER']) : array();
679
+	}
651 680
 	if (!empty($referrer['host']))
652 681
 	{
653
-		if (strpos($_SERVER['HTTP_HOST'], ':') !== false)
654
-			$real_host = substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], ':'));
655
-		else
656
-			$real_host = $_SERVER['HTTP_HOST'];
682
+		if (strpos($_SERVER['HTTP_HOST'], ':') !== false) {
683
+					$real_host = substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], ':'));
684
+		} else {
685
+					$real_host = $_SERVER['HTTP_HOST'];
686
+		}
657 687
 
658 688
 		$parsed_url = parse_url($boardurl);
659 689
 
660 690
 		// Are global cookies on?  If so, let's check them ;).
661 691
 		if (!empty($modSettings['globalCookies']))
662 692
 		{
663
-			if (preg_match('~(?:[^\.]+\.)?([^\.]{3,}\..+)\z~i', $parsed_url['host'], $parts) == 1)
664
-				$parsed_url['host'] = $parts[1];
693
+			if (preg_match('~(?:[^\.]+\.)?([^\.]{3,}\..+)\z~i', $parsed_url['host'], $parts) == 1) {
694
+							$parsed_url['host'] = $parts[1];
695
+			}
665 696
 
666
-			if (preg_match('~(?:[^\.]+\.)?([^\.]{3,}\..+)\z~i', $referrer['host'], $parts) == 1)
667
-				$referrer['host'] = $parts[1];
697
+			if (preg_match('~(?:[^\.]+\.)?([^\.]{3,}\..+)\z~i', $referrer['host'], $parts) == 1) {
698
+							$referrer['host'] = $parts[1];
699
+			}
668 700
 
669
-			if (preg_match('~(?:[^\.]+\.)?([^\.]{3,}\..+)\z~i', $real_host, $parts) == 1)
670
-				$real_host = $parts[1];
701
+			if (preg_match('~(?:[^\.]+\.)?([^\.]{3,}\..+)\z~i', $real_host, $parts) == 1) {
702
+							$real_host = $parts[1];
703
+			}
671 704
 		}
672 705
 
673 706
 		// Okay: referrer must either match parsed_url or real_host.
@@ -685,12 +718,14 @@  discard block
 block discarded – undo
685 718
 		$log_error = true;
686 719
 	}
687 720
 
688
-	if (strtolower($_SERVER['HTTP_USER_AGENT']) == 'hacker')
689
-		fatal_error('Sound the alarm!  It\'s a hacker!  Close the castle gates!!', false);
721
+	if (strtolower($_SERVER['HTTP_USER_AGENT']) == 'hacker') {
722
+			fatal_error('Sound the alarm!  It\'s a hacker!  Close the castle gates!!', false);
723
+	}
690 724
 
691 725
 	// Everything is ok, return an empty string.
692
-	if (!isset($error))
693
-		return '';
726
+	if (!isset($error)) {
727
+			return '';
728
+	}
694 729
 	// A session error occurred, show the error.
695 730
 	elseif ($is_fatal)
696 731
 	{
@@ -699,13 +734,14 @@  discard block
 block discarded – undo
699 734
 			ob_end_clean();
700 735
 			header('HTTP/1.1 403 Forbidden - Session timeout');
701 736
 			die;
737
+		} else {
738
+					fatal_lang_error($error, isset($log_error) ? 'user' : false);
702 739
 		}
703
-		else
704
-			fatal_lang_error($error, isset($log_error) ? 'user' : false);
705 740
 	}
706 741
 	// A session error occurred, return the error to the calling function.
707
-	else
708
-		return $error;
742
+	else {
743
+			return $error;
744
+	}
709 745
 
710 746
 	// We really should never fall through here, for very important reasons.  Let's make sure.
711 747
 	trigger_error('Hacking attempt...', E_USER_ERROR);
@@ -721,10 +757,9 @@  discard block
 block discarded – undo
721 757
 {
722 758
 	global $modSettings;
723 759
 
724
-	if (isset($_GET['confirm']) && isset($_SESSION['confirm_' . $action]) && md5($_GET['confirm'] . $_SERVER['HTTP_USER_AGENT']) == $_SESSION['confirm_' . $action])
725
-		return true;
726
-
727
-	else
760
+	if (isset($_GET['confirm']) && isset($_SESSION['confirm_' . $action]) && md5($_GET['confirm'] . $_SERVER['HTTP_USER_AGENT']) == $_SESSION['confirm_' . $action]) {
761
+			return true;
762
+	} else
728 763
 	{
729 764
 		$token = md5(mt_rand() . session_id() . (string) microtime() . $modSettings['rand_seed']);
730 765
 		$_SESSION['confirm_' . $action] = md5($token . $_SERVER['HTTP_USER_AGENT']);
@@ -775,9 +810,9 @@  discard block
 block discarded – undo
775 810
 			$return = $_SESSION['token'][$type . '-' . $action][3];
776 811
 			unset($_SESSION['token'][$type . '-' . $action]);
777 812
 			return $return;
813
+		} else {
814
+					return '';
778 815
 		}
779
-		else
780
-			return '';
781 816
 	}
782 817
 
783 818
 	// This nasty piece of code validates a token.
@@ -808,12 +843,14 @@  discard block
 block discarded – undo
808 843
 		fatal_lang_error('token_verify_fail', false);
809 844
 	}
810 845
 	// Remove this token as its useless
811
-	else
812
-		unset($_SESSION['token'][$type . '-' . $action]);
846
+	else {
847
+			unset($_SESSION['token'][$type . '-' . $action]);
848
+	}
813 849
 
814 850
 	// Randomly check if we should remove some older tokens.
815
-	if (mt_rand(0, 138) == 23)
816
-		cleanTokens();
851
+	if (mt_rand(0, 138) == 23) {
852
+			cleanTokens();
853
+	}
817 854
 
818 855
 	return false;
819 856
 }
@@ -828,14 +865,16 @@  discard block
 block discarded – undo
828 865
 function cleanTokens($complete = false)
829 866
 {
830 867
 	// We appreciate cleaning up after yourselves.
831
-	if (!isset($_SESSION['token']))
832
-		return;
868
+	if (!isset($_SESSION['token'])) {
869
+			return;
870
+	}
833 871
 
834 872
 	// Clean up tokens, trying to give enough time still.
835
-	foreach ($_SESSION['token'] as $key => $data)
836
-		if ($data[2] + 10800 < time() || $complete)
873
+	foreach ($_SESSION['token'] as $key => $data) {
874
+			if ($data[2] + 10800 < time() || $complete)
837 875
 			unset($_SESSION['token'][$key]);
838
-}
876
+	}
877
+	}
839 878
 
840 879
 /**
841 880
  * Check whether a form has been submitted twice.
@@ -853,37 +892,40 @@  discard block
 block discarded – undo
853 892
 {
854 893
 	global $context;
855 894
 
856
-	if (!isset($_SESSION['forms']))
857
-		$_SESSION['forms'] = array();
895
+	if (!isset($_SESSION['forms'])) {
896
+			$_SESSION['forms'] = array();
897
+	}
858 898
 
859 899
 	// Register a form number and store it in the session stack. (use this on the page that has the form.)
860 900
 	if ($action == 'register')
861 901
 	{
862 902
 		$context['form_sequence_number'] = 0;
863
-		while (empty($context['form_sequence_number']) || in_array($context['form_sequence_number'], $_SESSION['forms']))
864
-			$context['form_sequence_number'] = mt_rand(1, 16000000);
903
+		while (empty($context['form_sequence_number']) || in_array($context['form_sequence_number'], $_SESSION['forms'])) {
904
+					$context['form_sequence_number'] = mt_rand(1, 16000000);
905
+		}
865 906
 	}
866 907
 	// Check whether the submitted number can be found in the session.
867 908
 	elseif ($action == 'check')
868 909
 	{
869
-		if (!isset($_REQUEST['seqnum']))
870
-			return true;
871
-		elseif (!in_array($_REQUEST['seqnum'], $_SESSION['forms']))
910
+		if (!isset($_REQUEST['seqnum'])) {
911
+					return true;
912
+		} elseif (!in_array($_REQUEST['seqnum'], $_SESSION['forms']))
872 913
 		{
873 914
 			$_SESSION['forms'][] = (int) $_REQUEST['seqnum'];
874 915
 			return true;
916
+		} elseif ($is_fatal) {
917
+					fatal_lang_error('error_form_already_submitted', false);
918
+		} else {
919
+					return false;
875 920
 		}
876
-		elseif ($is_fatal)
877
-			fatal_lang_error('error_form_already_submitted', false);
878
-		else
879
-			return false;
880 921
 	}
881 922
 	// Don't check, just free the stack number.
882
-	elseif ($action == 'free' && isset($_REQUEST['seqnum']) && in_array($_REQUEST['seqnum'], $_SESSION['forms']))
883
-		$_SESSION['forms'] = array_diff($_SESSION['forms'], array($_REQUEST['seqnum']));
884
-	elseif ($action != 'free')
885
-		trigger_error('checkSubmitOnce(): Invalid action \'' . $action . '\'', E_USER_WARNING);
886
-}
923
+	elseif ($action == 'free' && isset($_REQUEST['seqnum']) && in_array($_REQUEST['seqnum'], $_SESSION['forms'])) {
924
+			$_SESSION['forms'] = array_diff($_SESSION['forms'], array($_REQUEST['seqnum']));
925
+	} elseif ($action != 'free') {
926
+			trigger_error('checkSubmitOnce(): Invalid action \'' . $action . '\'', E_USER_WARNING);
927
+	}
928
+	}
887 929
 
888 930
 /**
889 931
  * Check the user's permissions.
@@ -900,16 +942,19 @@  discard block
 block discarded – undo
900 942
 	global $user_info, $smcFunc;
901 943
 
902 944
 	// You're always allowed to do nothing. (unless you're a working man, MR. LAZY :P!)
903
-	if (empty($permission))
904
-		return true;
945
+	if (empty($permission)) {
946
+			return true;
947
+	}
905 948
 
906 949
 	// You're never allowed to do something if your data hasn't been loaded yet!
907
-	if (empty($user_info))
908
-		return false;
950
+	if (empty($user_info)) {
951
+			return false;
952
+	}
909 953
 
910 954
 	// Administrators are supermen :P.
911
-	if ($user_info['is_admin'])
912
-		return true;
955
+	if ($user_info['is_admin']) {
956
+			return true;
957
+	}
913 958
 
914 959
 	// Let's ensure this is an array.
915 960
 	$permission = (array)$permission;
@@ -917,14 +962,16 @@  discard block
 block discarded – undo
917 962
 	// Are we checking the _current_ board, or some other boards?
918 963
 	if ($boards === null)
919 964
 	{
920
-		if (count(array_intersect($permission, $user_info['permissions'])) != 0)
921
-			return true;
965
+		if (count(array_intersect($permission, $user_info['permissions'])) != 0) {
966
+					return true;
967
+		}
922 968
 		// You aren't allowed, by default.
923
-		else
924
-			return false;
969
+		else {
970
+					return false;
971
+		}
972
+	} elseif (!is_array($boards)) {
973
+			$boards = array($boards);
925 974
 	}
926
-	elseif (!is_array($boards))
927
-		$boards = array($boards);
928 975
 
929 976
 	$request = $smcFunc['db_query']('', '
930 977
 		SELECT MIN(bp.add_deny) AS add_deny
@@ -947,12 +994,14 @@  discard block
 block discarded – undo
947 994
 	);
948 995
 
949 996
 	// Make sure they can do it on all of the boards.
950
-	if ($smcFunc['db_num_rows']($request) != count($boards))
951
-		return false;
997
+	if ($smcFunc['db_num_rows']($request) != count($boards)) {
998
+			return false;
999
+	}
952 1000
 
953 1001
 	$result = true;
954
-	while ($row = $smcFunc['db_fetch_assoc']($request))
955
-		$result &= !empty($row['add_deny']);
1002
+	while ($row = $smcFunc['db_fetch_assoc']($request)) {
1003
+			$result &= !empty($row['add_deny']);
1004
+	}
956 1005
 	$smcFunc['db_free_result']($request);
957 1006
 
958 1007
 	// If the query returned 1, they can do it... otherwise, they can't.
@@ -1017,9 +1066,10 @@  discard block
 block discarded – undo
1017 1066
 
1018 1067
 	// If you're doing something on behalf of some "heavy" permissions, validate your session.
1019 1068
 	// (take out the heavy permissions, and if you can't do anything but those, you need a validated session.)
1020
-	if (!allowedTo(array_diff($permission, $heavy_permissions), $boards))
1021
-		validateSession();
1022
-}
1069
+	if (!allowedTo(array_diff($permission, $heavy_permissions), $boards)) {
1070
+			validateSession();
1071
+	}
1072
+	}
1023 1073
 
1024 1074
 /**
1025 1075
  * Return the boards a user has a certain (board) permission on. (array(0) if all.)
@@ -1038,8 +1088,9 @@  discard block
 block discarded – undo
1038 1088
 	global $user_info, $smcFunc;
1039 1089
 
1040 1090
 	// Arrays are nice, most of the time.
1041
-	if (!is_array($permissions))
1042
-		$permissions = array($permissions);
1091
+	if (!is_array($permissions)) {
1092
+			$permissions = array($permissions);
1093
+	}
1043 1094
 
1044 1095
 	/*
1045 1096
 	 * Set $simple to true to use this function as it were in SMF 2.0.x.
@@ -1051,13 +1102,14 @@  discard block
 block discarded – undo
1051 1102
 	// Administrators are all powerful, sorry.
1052 1103
 	if ($user_info['is_admin'])
1053 1104
 	{
1054
-		if ($simple)
1055
-			return array(0);
1056
-		else
1105
+		if ($simple) {
1106
+					return array(0);
1107
+		} else
1057 1108
 		{
1058 1109
 			$boards = array();
1059
-			foreach ($permissions as $permission)
1060
-				$boards[$permission] = array(0);
1110
+			foreach ($permissions as $permission) {
1111
+							$boards[$permission] = array(0);
1112
+			}
1061 1113
 
1062 1114
 			return $boards;
1063 1115
 		}
@@ -1089,31 +1141,32 @@  discard block
 block discarded – undo
1089 1141
 	{
1090 1142
 		if ($simple)
1091 1143
 		{
1092
-			if (empty($row['add_deny']))
1093
-				$deny_boards[] = $row['id_board'];
1094
-			else
1095
-				$boards[] = $row['id_board'];
1096
-		}
1097
-		else
1144
+			if (empty($row['add_deny'])) {
1145
+							$deny_boards[] = $row['id_board'];
1146
+			} else {
1147
+							$boards[] = $row['id_board'];
1148
+			}
1149
+		} else
1098 1150
 		{
1099
-			if (empty($row['add_deny']))
1100
-				$deny_boards[$row['permission']][] = $row['id_board'];
1101
-			else
1102
-				$boards[$row['permission']][] = $row['id_board'];
1151
+			if (empty($row['add_deny'])) {
1152
+							$deny_boards[$row['permission']][] = $row['id_board'];
1153
+			} else {
1154
+							$boards[$row['permission']][] = $row['id_board'];
1155
+			}
1103 1156
 		}
1104 1157
 	}
1105 1158
 	$smcFunc['db_free_result']($request);
1106 1159
 
1107
-	if ($simple)
1108
-		$boards = array_unique(array_values(array_diff($boards, $deny_boards)));
1109
-	else
1160
+	if ($simple) {
1161
+			$boards = array_unique(array_values(array_diff($boards, $deny_boards)));
1162
+	} else
1110 1163
 	{
1111 1164
 		foreach ($permissions as $permission)
1112 1165
 		{
1113 1166
 			// never had it to start with
1114
-			if (empty($boards[$permission]))
1115
-				$boards[$permission] = array();
1116
-			else
1167
+			if (empty($boards[$permission])) {
1168
+							$boards[$permission] = array();
1169
+			} else
1117 1170
 			{
1118 1171
 				// Or it may have been removed
1119 1172
 				$deny_boards[$permission] = isset($deny_boards[$permission]) ? $deny_boards[$permission] : array();
@@ -1149,10 +1202,11 @@  discard block
 block discarded – undo
1149 1202
 
1150 1203
 
1151 1204
 	// Moderators are free...
1152
-	if (!allowedTo('moderate_board'))
1153
-		$timeLimit = isset($timeOverrides[$error_type]) ? $timeOverrides[$error_type] : $modSettings['spamWaitTime'];
1154
-	else
1155
-		$timeLimit = 2;
1205
+	if (!allowedTo('moderate_board')) {
1206
+			$timeLimit = isset($timeOverrides[$error_type]) ? $timeOverrides[$error_type] : $modSettings['spamWaitTime'];
1207
+	} else {
1208
+			$timeLimit = 2;
1209
+	}
1156 1210
 
1157 1211
 	call_integration_hook('integrate_spam_protection', array(&$timeOverrides, &$timeLimit));
1158 1212
 
@@ -1179,8 +1233,9 @@  discard block
 block discarded – undo
1179 1233
 	if ($smcFunc['db_affected_rows']() != 1)
1180 1234
 	{
1181 1235
 		// Spammer!  You only have to wait a *few* seconds!
1182
-		if (!$only_return_result)
1183
-			fatal_lang_error($error_type . '_WaitTime_broken', false, array($timeLimit));
1236
+		if (!$only_return_result) {
1237
+					fatal_lang_error($error_type . '_WaitTime_broken', false, array($timeLimit));
1238
+		}
1184 1239
 
1185 1240
 		return true;
1186 1241
 	}
@@ -1198,11 +1253,13 @@  discard block
 block discarded – undo
1198 1253
  */
1199 1254
 function secureDirectory($path, $attachments = false)
1200 1255
 {
1201
-	if (empty($path))
1202
-		return 'empty_path';
1256
+	if (empty($path)) {
1257
+			return 'empty_path';
1258
+	}
1203 1259
 
1204
-	if (!is_writable($path))
1205
-		return 'path_not_writable';
1260
+	if (!is_writable($path)) {
1261
+			return 'path_not_writable';
1262
+	}
1206 1263
 
1207 1264
 	$directoryname = basename($path);
1208 1265
 
@@ -1214,9 +1271,9 @@  discard block
 block discarded – undo
1214 1271
 
1215 1272
 RemoveHandler .php .php3 .phtml .cgi .fcgi .pl .fpl .shtml';
1216 1273
 
1217
-	if (file_exists($path . '/.htaccess'))
1218
-		$errors[] = 'htaccess_exists';
1219
-	else
1274
+	if (file_exists($path . '/.htaccess')) {
1275
+			$errors[] = 'htaccess_exists';
1276
+	} else
1220 1277
 	{
1221 1278
 		$fh = @fopen($path . '/.htaccess', 'w');
1222 1279
 		if ($fh) {
@@ -1228,9 +1285,9 @@  discard block
 block discarded – undo
1228 1285
 		$errors[] = 'htaccess_cannot_create_file';
1229 1286
 	}
1230 1287
 
1231
-	if (file_exists($path . '/index.php'))
1232
-		$errors[] = 'index-php_exists';
1233
-	else
1288
+	if (file_exists($path . '/index.php')) {
1289
+			$errors[] = 'index-php_exists';
1290
+	} else
1234 1291
 	{
1235 1292
 		$fh = @fopen($path . '/index.php', 'w');
1236 1293
 		if ($fh) {
@@ -1257,11 +1314,12 @@  discard block
 block discarded – undo
1257 1314
 		$errors[] = 'index-php_cannot_create_file';
1258 1315
 	}
1259 1316
 
1260
-	if (!empty($errors))
1261
-		return $errors;
1262
-	else
1263
-		return true;
1264
-}
1317
+	if (!empty($errors)) {
1318
+			return $errors;
1319
+	} else {
1320
+			return true;
1321
+	}
1322
+	}
1265 1323
 
1266 1324
 /**
1267 1325
 * This sets the X-Frame-Options header.
@@ -1274,14 +1332,16 @@  discard block
 block discarded – undo
1274 1332
 	global $modSettings;
1275 1333
 
1276 1334
 	$option = 'SAMEORIGIN';
1277
-	if (is_null($override) && !empty($modSettings['frame_security']))
1278
-		$option = $modSettings['frame_security'];
1279
-	elseif (in_array($override, array('SAMEORIGIN', 'DENY')))
1280
-		$option = $override;
1335
+	if (is_null($override) && !empty($modSettings['frame_security'])) {
1336
+			$option = $modSettings['frame_security'];
1337
+	} elseif (in_array($override, array('SAMEORIGIN', 'DENY'))) {
1338
+			$option = $override;
1339
+	}
1281 1340
 
1282 1341
 	// Don't bother setting the header if we have disabled it.
1283
-	if ($option == 'DISABLE')
1284
-		return;
1342
+	if ($option == 'DISABLE') {
1343
+			return;
1344
+	}
1285 1345
 
1286 1346
 	// Finally set it.
1287 1347
 	header('X-Frame-Options: ' . $option);
Please login to merge, or discard this patch.
Sources/PostModeration.php 2 patches
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -176,11 +176,11 @@  discard block
 block discarded – undo
176 176
 		{
177 177
 			if ($curAction == 'approve')
178 178
 			{
179
-				approveMessages ($toAction, $details, $context['current_view']);
179
+				approveMessages($toAction, $details, $context['current_view']);
180 180
 			}
181 181
 			else
182 182
 			{
183
-				removeMessages ($toAction, $details, $context['current_view']);
183
+				removeMessages($toAction, $details, $context['current_view']);
184 184
 			}
185 185
 		}
186 186
 	}
@@ -437,7 +437,7 @@  discard block
 block discarded – undo
437 437
 					'value' => $txt['mc_unapproved_attach_poster'],
438 438
 				),
439 439
 				'data' => array(
440
-					'function' => function ($data)
440
+					'function' => function($data)
441 441
 					{
442 442
 						return $data['poster']['link'];
443 443
 					},
@@ -467,7 +467,7 @@  discard block
 block discarded – undo
467 467
 					'value' => $txt['post'],
468 468
 				),
469 469
 				'data' => array(
470
-					'function' => function ($data)
470
+					'function' => function($data)
471 471
 					{
472 472
 						return '<a href="' . $data['message']['href'] . '">' . shorten_subject($data['message']['subject'], 20) . '</a>';
473 473
 					},
@@ -693,7 +693,7 @@  discard block
 block discarded – undo
693 693
 			logAction(($approved ? 'un' : '') . 'approve', array('topic' => $topic, 'subject' => $subject, 'member' => $poster, 'board' => $board));
694 694
 	}
695 695
 
696
-	redirectexit('topic=' . $topic . '.msg' . $_REQUEST['msg']. '#msg' . $_REQUEST['msg']);
696
+	redirectexit('topic=' . $topic . '.msg' . $_REQUEST['msg'] . '#msg' . $_REQUEST['msg']);
697 697
 }
698 698
 
699 699
 /**
Please login to merge, or discard this patch.
Braces   +100 added lines, -79 removed lines patch added patch discarded remove patch
@@ -13,8 +13,9 @@  discard block
 block discarded – undo
13 13
  * @version 2.1 Beta 3
14 14
  */
15 15
 
16
-if (!defined('SMF'))
16
+if (!defined('SMF')) {
17 17
 	die('No direct access...');
18
+}
18 19
 
19 20
 /**
20 21
  * This is a handling function for all things post moderation.
@@ -39,8 +40,9 @@  discard block
 block discarded – undo
39 40
 	);
40 41
 
41 42
 	// Pick something valid...
42
-	if (!isset($_REQUEST['sa']) || !isset($subActions[$_REQUEST['sa']]))
43
-		$_REQUEST['sa'] = 'replies';
43
+	if (!isset($_REQUEST['sa']) || !isset($subActions[$_REQUEST['sa']])) {
44
+			$_REQUEST['sa'] = 'replies';
45
+	}
44 46
 
45 47
 	call_integration_hook('integrate_post_moderation', array(&$subActions));
46 48
 
@@ -68,13 +70,15 @@  discard block
 block discarded – undo
68 70
 		$approve_boards = $approve_boards == array(0) ? $filter_board : array_intersect($approve_boards, $filter_board);
69 71
 	}
70 72
 
71
-	if ($approve_boards == array(0))
72
-		$approve_query = '';
73
-	elseif (!empty($approve_boards))
74
-		$approve_query = ' AND m.id_board IN (' . implode(',', $approve_boards) . ')';
73
+	if ($approve_boards == array(0)) {
74
+			$approve_query = '';
75
+	} elseif (!empty($approve_boards)) {
76
+			$approve_query = ' AND m.id_board IN (' . implode(',', $approve_boards) . ')';
77
+	}
75 78
 	// Nada, zip, etc...
76
-	else
77
-		$approve_query = ' AND 1=0';
79
+	else {
80
+			$approve_query = ' AND 1=0';
81
+	}
78 82
 
79 83
 	// We also need to know where we can delete topics and/or replies to.
80 84
 	if ($context['current_view'] == 'topics')
@@ -82,8 +86,7 @@  discard block
 block discarded – undo
82 86
 		$delete_own_boards = boardsAllowedTo('remove_own');
83 87
 		$delete_any_boards = boardsAllowedTo('remove_any');
84 88
 		$delete_own_replies = array();
85
-	}
86
-	else
89
+	} else
87 90
 	{
88 91
 		$delete_own_boards = boardsAllowedTo('delete_own');
89 92
 		$delete_any_boards = boardsAllowedTo('delete_any');
@@ -92,21 +95,25 @@  discard block
 block discarded – undo
92 95
 
93 96
 	$toAction = array();
94 97
 	// Check if we have something to do?
95
-	if (isset($_GET['approve']))
96
-		$toAction[] = (int) $_GET['approve'];
98
+	if (isset($_GET['approve'])) {
99
+			$toAction[] = (int) $_GET['approve'];
100
+	}
97 101
 	// Just a deletion?
98
-	elseif (isset($_GET['delete']))
99
-		$toAction[] = (int) $_GET['delete'];
102
+	elseif (isset($_GET['delete'])) {
103
+			$toAction[] = (int) $_GET['delete'];
104
+	}
100 105
 	// Lots of approvals?
101
-	elseif (isset($_POST['item']))
102
-		foreach ($_POST['item'] as $item)
106
+	elseif (isset($_POST['item'])) {
107
+			foreach ($_POST['item'] as $item)
103 108
 			$toAction[] = (int) $item;
109
+	}
104 110
 
105 111
 	// What are we actually doing.
106
-	if (isset($_GET['approve']) || (isset($_POST['do']) && $_POST['do'] == 'approve'))
107
-		$curAction = 'approve';
108
-	elseif (isset($_GET['delete']) || (isset($_POST['do']) && $_POST['do'] == 'delete'))
109
-		$curAction = 'delete';
112
+	if (isset($_GET['approve']) || (isset($_POST['do']) && $_POST['do'] == 'approve')) {
113
+			$curAction = 'approve';
114
+	} elseif (isset($_GET['delete']) || (isset($_POST['do']) && $_POST['do'] == 'delete')) {
115
+			$curAction = 'delete';
116
+	}
110 117
 
111 118
 	// Right, so we have something to do?
112 119
 	if (!empty($toAction) && isset($curAction))
@@ -135,8 +142,9 @@  discard block
 block discarded – undo
135 142
 		while ($row = $smcFunc['db_fetch_assoc']($request))
136 143
 		{
137 144
 			// If it's not within what our view is ignore it...
138
-			if (($row['id_msg'] == $row['id_first_msg'] && $context['current_view'] != 'topics') || ($row['id_msg'] != $row['id_first_msg'] && $context['current_view'] != 'replies'))
139
-				continue;
145
+			if (($row['id_msg'] == $row['id_first_msg'] && $context['current_view'] != 'topics') || ($row['id_msg'] != $row['id_first_msg'] && $context['current_view'] != 'replies')) {
146
+							continue;
147
+			}
140 148
 
141 149
 			$can_add = false;
142 150
 			// If we're approving this is simple.
@@ -148,18 +156,22 @@  discard block
 block discarded – undo
148 156
 			elseif ($curAction == 'delete')
149 157
 			{
150 158
 				// Own post is easy!
151
-				if ($row['id_member'] == $user_info['id'] && ($delete_own_boards == array(0) || in_array($row['id_board'], $delete_own_boards)))
152
-					$can_add = true;
159
+				if ($row['id_member'] == $user_info['id'] && ($delete_own_boards == array(0) || in_array($row['id_board'], $delete_own_boards))) {
160
+									$can_add = true;
161
+				}
153 162
 				// Is it a reply to their own topic?
154
-				elseif ($row['id_member'] == $row['id_member_started'] && $row['id_msg'] != $row['id_first_msg'] && ($delete_own_replies == array(0) || in_array($row['id_board'], $delete_own_replies)))
155
-					$can_add = true;
163
+				elseif ($row['id_member'] == $row['id_member_started'] && $row['id_msg'] != $row['id_first_msg'] && ($delete_own_replies == array(0) || in_array($row['id_board'], $delete_own_replies))) {
164
+									$can_add = true;
165
+				}
156 166
 				// Someone elses?
157
-				elseif ($row['id_member'] != $user_info['id'] && ($delete_any_boards == array(0) || in_array($row['id_board'], $delete_any_boards)))
158
-					$can_add = true;
167
+				elseif ($row['id_member'] != $user_info['id'] && ($delete_any_boards == array(0) || in_array($row['id_board'], $delete_any_boards))) {
168
+									$can_add = true;
169
+				}
159 170
 			}
160 171
 
161
-			if ($can_add)
162
-				$anItem = $context['current_view'] == 'topics' ? $row['id_topic'] : $row['id_msg'];
172
+			if ($can_add) {
173
+							$anItem = $context['current_view'] == 'topics' ? $row['id_topic'] : $row['id_msg'];
174
+			}
163 175
 			$toAction[] = $anItem;
164 176
 
165 177
 			// All clear. What have we got now, what, what?
@@ -177,8 +189,7 @@  discard block
 block discarded – undo
177 189
 			if ($curAction == 'approve')
178 190
 			{
179 191
 				approveMessages ($toAction, $details, $context['current_view']);
180
-			}
181
-			else
192
+			} else
182 193
 			{
183 194
 				removeMessages ($toAction, $details, $context['current_view']);
184 195
 			}
@@ -265,16 +276,19 @@  discard block
 block discarded – undo
265 276
 	for ($i = 1; $row = $smcFunc['db_fetch_assoc']($request); $i++)
266 277
 	{
267 278
 		// Can delete is complicated, let's solve it first... is it their own post?
268
-		if ($row['id_member'] == $user_info['id'] && ($delete_own_boards == array(0) || in_array($row['id_board'], $delete_own_boards)))
269
-			$can_delete = true;
279
+		if ($row['id_member'] == $user_info['id'] && ($delete_own_boards == array(0) || in_array($row['id_board'], $delete_own_boards))) {
280
+					$can_delete = true;
281
+		}
270 282
 		// Is it a reply to their own topic?
271
-		elseif ($row['id_member'] == $row['id_member_started'] && $row['id_msg'] != $row['id_first_msg'] && ($delete_own_replies == array(0) || in_array($row['id_board'], $delete_own_replies)))
272
-			$can_delete = true;
283
+		elseif ($row['id_member'] == $row['id_member_started'] && $row['id_msg'] != $row['id_first_msg'] && ($delete_own_replies == array(0) || in_array($row['id_board'], $delete_own_replies))) {
284
+					$can_delete = true;
285
+		}
273 286
 		// Someone elses?
274
-		elseif ($row['id_member'] != $user_info['id'] && ($delete_any_boards == array(0) || in_array($row['id_board'], $delete_any_boards)))
275
-			$can_delete = true;
276
-		else
277
-			$can_delete = false;
287
+		elseif ($row['id_member'] != $user_info['id'] && ($delete_any_boards == array(0) || in_array($row['id_board'], $delete_any_boards))) {
288
+					$can_delete = true;
289
+		} else {
290
+					$can_delete = false;
291
+		}
278 292
 
279 293
 		$context['unapproved_items'][] = array(
280 294
 			'id' => $row['id_msg'],
@@ -323,28 +337,31 @@  discard block
 block discarded – undo
323 337
 	// Once again, permissions are king!
324 338
 	$approve_boards = boardsAllowedTo('approve_posts');
325 339
 
326
-	if ($approve_boards == array(0))
327
-		$approve_query = '';
328
-	elseif (!empty($approve_boards))
329
-		$approve_query = ' AND m.id_board IN (' . implode(',', $approve_boards) . ')';
330
-	else
331
-		$approve_query = ' AND 1=0';
340
+	if ($approve_boards == array(0)) {
341
+			$approve_query = '';
342
+	} elseif (!empty($approve_boards)) {
343
+			$approve_query = ' AND m.id_board IN (' . implode(',', $approve_boards) . ')';
344
+	} else {
345
+			$approve_query = ' AND 1=0';
346
+	}
332 347
 
333 348
 	// Get together the array of things to act on, if any.
334 349
 	$attachments = array();
335
-	if (isset($_GET['approve']))
336
-		$attachments[] = (int) $_GET['approve'];
337
-	elseif (isset($_GET['delete']))
338
-		$attachments[] = (int) $_GET['delete'];
339
-	elseif (isset($_POST['item']))
340
-		foreach ($_POST['item'] as $item)
350
+	if (isset($_GET['approve'])) {
351
+			$attachments[] = (int) $_GET['approve'];
352
+	} elseif (isset($_GET['delete'])) {
353
+			$attachments[] = (int) $_GET['delete'];
354
+	} elseif (isset($_POST['item'])) {
355
+			foreach ($_POST['item'] as $item)
341 356
 			$attachments[] = (int) $item;
357
+	}
342 358
 
343 359
 	// Are we approving or deleting?
344
-	if (isset($_GET['approve']) || (isset($_POST['do']) && $_POST['do'] == 'approve'))
345
-		$curAction = 'approve';
346
-	elseif (isset($_GET['delete']) || (isset($_POST['do']) && $_POST['do'] == 'delete'))
347
-		$curAction = 'delete';
360
+	if (isset($_GET['approve']) || (isset($_POST['do']) && $_POST['do'] == 'approve')) {
361
+			$curAction = 'approve';
362
+	} elseif (isset($_GET['delete']) || (isset($_POST['do']) && $_POST['do'] == 'delete')) {
363
+			$curAction = 'delete';
364
+	}
348 365
 
349 366
 	// Something to do, let's do it!
350 367
 	if (!empty($attachments) && isset($curAction))
@@ -372,17 +389,19 @@  discard block
 block discarded – undo
372 389
 			)
373 390
 		);
374 391
 		$attachments = array();
375
-		while ($row = $smcFunc['db_fetch_assoc']($request))
376
-			$attachments[] = $row['id_attach'];
392
+		while ($row = $smcFunc['db_fetch_assoc']($request)) {
393
+					$attachments[] = $row['id_attach'];
394
+		}
377 395
 		$smcFunc['db_free_result']($request);
378 396
 
379 397
 		// Assuming it wasn't all like, proper illegal, we can do the approving.
380 398
 		if (!empty($attachments))
381 399
 		{
382
-			if ($curAction == 'approve')
383
-				ApproveAttachments($attachments);
384
-			else
385
-				removeAttachments(array('id_attach' => $attachments, 'do_logging' => true));
400
+			if ($curAction == 'approve') {
401
+							ApproveAttachments($attachments);
402
+			} else {
403
+							removeAttachments(array('id_attach' => $attachments, 'do_logging' => true));
404
+			}
386 405
 		}
387 406
 	}
388 407
 
@@ -682,15 +701,16 @@  discard block
 block discarded – undo
682 701
 	{
683 702
 		approveTopics($topic, !$approved);
684 703
 
685
-		if ($starter != $user_info['id'])
686
-			logAction(($approved ? 'un' : '') . 'approve_topic', array('topic' => $topic, 'subject' => $subject, 'member' => $starter, 'board' => $board));
687
-	}
688
-	else
704
+		if ($starter != $user_info['id']) {
705
+					logAction(($approved ? 'un' : '') . 'approve_topic', array('topic' => $topic, 'subject' => $subject, 'member' => $starter, 'board' => $board));
706
+		}
707
+	} else
689 708
 	{
690 709
 		approvePosts($_REQUEST['msg'], !$approved);
691 710
 
692
-		if ($poster != $user_info['id'])
693
-			logAction(($approved ? 'un' : '') . 'approve', array('topic' => $topic, 'subject' => $subject, 'member' => $poster, 'board' => $board));
711
+		if ($poster != $user_info['id']) {
712
+					logAction(($approved ? 'un' : '') . 'approve', array('topic' => $topic, 'subject' => $subject, 'member' => $poster, 'board' => $board));
713
+		}
694 714
 	}
695 715
 
696 716
 	redirectexit('topic=' . $topic . '.msg' . $_REQUEST['msg']. '#msg' . $_REQUEST['msg']);
@@ -716,8 +736,7 @@  discard block
 block discarded – undo
716 736
 		{
717 737
 			logAction('approve_topic', array('topic' => $topic, 'subject' => $messageDetails[$topic]['subject'], 'member' => $messageDetails[$topic]['member'], 'board' => $messageDetails[$topic]['board']));
718 738
 		}
719
-	}
720
-	else
739
+	} else
721 740
 	{
722 741
 		approvePosts($messages);
723 742
 		// and tell the world about it again
@@ -745,8 +764,9 @@  discard block
 block discarded – undo
745 764
 		)
746 765
 	);
747 766
 	$msgs = array();
748
-	while ($row = $smcFunc['db_fetch_row']($request))
749
-		$msgs[] = $row[0];
767
+	while ($row = $smcFunc['db_fetch_row']($request)) {
768
+			$msgs[] = $row[0];
769
+	}
750 770
 	$smcFunc['db_free_result']($request);
751 771
 
752 772
 	if (!empty($msgs))
@@ -765,8 +785,9 @@  discard block
 block discarded – undo
765 785
 		)
766 786
 	);
767 787
 	$attaches = array();
768
-	while ($row = $smcFunc['db_fetch_row']($request))
769
-		$attaches[] = $row[0];
788
+	while ($row = $smcFunc['db_fetch_row']($request)) {
789
+			$attaches[] = $row[0];
790
+	}
770 791
 	$smcFunc['db_free_result']($request);
771 792
 
772 793
 	if (!empty($attaches))
@@ -794,12 +815,12 @@  discard block
 block discarded – undo
794 815
 	{
795 816
 		removeTopics($messages);
796 817
 		// and tell the world about it
797
-		foreach ($messages as $topic)
798
-			// Note, only log topic ID in native form if it's not gone forever.
818
+		foreach ($messages as $topic) {
819
+					// Note, only log topic ID in native form if it's not gone forever.
799 820
 			logAction('remove', array(
800 821
 				(empty($modSettings['recycle_enable']) || $modSettings['recycle_board'] != $messageDetails[$topic]['board'] ? 'topic' : 'old_topic_id') => $topic, 'subject' => $messageDetails[$topic]['subject'], 'member' => $messageDetails[$topic]['member'], 'board' => $messageDetails[$topic]['board']));
801
-	}
802
-	else
822
+		}
823
+	} else
803 824
 	{
804 825
 		foreach ($messages as $post)
805 826
 		{
Please login to merge, or discard this patch.
Sources/PackageGet.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -181,14 +181,14 @@
 block discarded – undo
181 181
 		{
182 182
 			collapsedDiv.show(\'slow\');
183 183
 			icon.removeClass(\'toggle_down\').addClass(\'toggle_up\');
184
-			icon.prop(\'title\', '. JavaScriptEscape($txt['hide']) .');
184
+			icon.prop(\'title\', '. JavaScriptEscape($txt['hide']) . ');
185 185
 		}
186 186
 
187 187
 		else
188 188
 		{
189 189
 			collapsedDiv.hide(\'slow\');
190 190
 			icon.removeClass(\'toggle_up\').addClass(\'toggle_down\');
191
-			icon.prop(\'title\', '. JavaScriptEscape($txt['show']) .');
191
+			icon.prop(\'title\', '. JavaScriptEscape($txt['show']) . ');
192 192
 		}
193 193
 
194 194
 	});', true);
Please login to merge, or discard this patch.
Braces   +200 added lines, -156 removed lines patch added patch discarded remove patch
@@ -13,8 +13,9 @@  discard block
 block discarded – undo
13 13
  * @version 2.1 Beta 3
14 14
  */
15 15
 
16
-if (!defined('SMF'))
16
+if (!defined('SMF')) {
17 17
 	die('No direct access...');
18
+}
18 19
 
19 20
 /**
20 21
  * Browse the list of package servers, add servers...
@@ -43,13 +44,15 @@  discard block
 block discarded – undo
43 44
 	);
44 45
 
45 46
 	// Now let's decide where we are taking this...
46
-	if (isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]))
47
-		$context['sub_action'] = $_REQUEST['sa'];
47
+	if (isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']])) {
48
+			$context['sub_action'] = $_REQUEST['sa'];
49
+	}
48 50
 	// We need to support possible old javascript links...
49
-	elseif (isset($_GET['pgdownload']))
50
-		$context['sub_action'] = 'download';
51
-	else
52
-		$context['sub_action'] = 'servers';
51
+	elseif (isset($_GET['pgdownload'])) {
52
+			$context['sub_action'] = 'download';
53
+	} else {
54
+			$context['sub_action'] = 'servers';
55
+	}
53 56
 
54 57
 	// We need to force the "Download" tab as selected.
55 58
 	$context['menu_data_' . $context['admin_menu_id']]['current_subsection'] = 'packageget';
@@ -141,17 +144,19 @@  discard block
 block discarded – undo
141 144
 			{
142 145
 				require_once($sourcedir . '/Class-Package.php');
143 146
 				$ftp = new ftp_connection(null);
147
+			} elseif ($ftp->error !== false && !isset($ftp_error)) {
148
+							$ftp_error = $ftp->last_message === null ? '' : $ftp->last_message;
144 149
 			}
145
-			elseif ($ftp->error !== false && !isset($ftp_error))
146
-				$ftp_error = $ftp->last_message === null ? '' : $ftp->last_message;
147 150
 
148 151
 			list ($username, $detect_path, $found_path) = $ftp->detect_path($packagesdir);
149 152
 
150
-			if ($found_path || !isset($_POST['ftp_path']))
151
-				$_POST['ftp_path'] = $detect_path;
153
+			if ($found_path || !isset($_POST['ftp_path'])) {
154
+							$_POST['ftp_path'] = $detect_path;
155
+			}
152 156
 
153
-			if (!isset($_POST['ftp_username']))
154
-				$_POST['ftp_username'] = $username;
157
+			if (!isset($_POST['ftp_username'])) {
158
+							$_POST['ftp_username'] = $username;
159
+			}
155 160
 
156 161
 			$context['package_ftp'] = array(
157 162
 				'server' => isset($_POST['ftp_server']) ? $_POST['ftp_server'] : (isset($modSettings['package_server']) ? $modSettings['package_server'] : 'localhost'),
@@ -160,8 +165,7 @@  discard block
 block discarded – undo
160 165
 				'path' => $_POST['ftp_path'],
161 166
 				'error' => empty($ftp_error) ? null : $ftp_error,
162 167
 			);
163
-		}
164
-		else
168
+		} else
165 169
 		{
166 170
 			$context['package_download_broken'] = false;
167 171
 
@@ -203,8 +207,9 @@  discard block
 block discarded – undo
203 207
 
204 208
 	if (isset($_GET['server']))
205 209
 	{
206
-		if ($_GET['server'] == '')
207
-			redirectexit('action=admin;area=packages;get');
210
+		if ($_GET['server'] == '') {
211
+					redirectexit('action=admin;area=packages;get');
212
+		}
208 213
 
209 214
 		$server = (int) $_GET['server'];
210 215
 
@@ -222,17 +227,18 @@  discard block
 block discarded – undo
222 227
 		$smcFunc['db_free_result']($request);
223 228
 
224 229
 		// If the server does not exist, dump out.
225
-		if (empty($url))
226
-			fatal_lang_error('couldnt_connect', false);
230
+		if (empty($url)) {
231
+					fatal_lang_error('couldnt_connect', false);
232
+		}
227 233
 
228 234
 		// If there is a relative link, append to the stored server url.
229
-		if (isset($_GET['relative']))
230
-			$url = $url . (substr($url, -1) == '/' ? '' : '/') . $_GET['relative'];
235
+		if (isset($_GET['relative'])) {
236
+					$url = $url . (substr($url, -1) == '/' ? '' : '/') . $_GET['relative'];
237
+		}
231 238
 
232 239
 		// Clear any "absolute" URL.  Since "server" is present, "absolute" is garbage.
233 240
 		unset($_GET['absolute']);
234
-	}
235
-	elseif (isset($_GET['absolute']) && $_GET['absolute'] != '')
241
+	} elseif (isset($_GET['absolute']) && $_GET['absolute'] != '')
236 242
 	{
237 243
 		// Initialize the requried variables.
238 244
 		$server = '';
@@ -256,16 +262,19 @@  discard block
 block discarded – undo
256 262
 		}
257 263
 	}
258 264
 	// Minimum required parameter did not exist so dump out.
259
-	else
260
-		fatal_lang_error('couldnt_connect', false);
265
+	else {
266
+			fatal_lang_error('couldnt_connect', false);
267
+	}
261 268
 
262 269
 	// Attempt to connect.  If unsuccessful... try the URL.
263
-	if (!isset($_GET['package']) || file_exists($_GET['package']))
264
-		$_GET['package'] = $url . '/packages.xml?language=' . $context['user']['language'];
270
+	if (!isset($_GET['package']) || file_exists($_GET['package'])) {
271
+			$_GET['package'] = $url . '/packages.xml?language=' . $context['user']['language'];
272
+	}
265 273
 
266 274
 	// Check to be sure the packages.xml file actually exists where it is should be... or dump out.
267
-	if ((isset($_GET['absolute']) || isset($_GET['relative'])) && !url_exists($_GET['package']))
268
-		fatal_lang_error('packageget_unable', false, array($url . '/index.php'));
275
+	if ((isset($_GET['absolute']) || isset($_GET['relative'])) && !url_exists($_GET['package'])) {
276
+			fatal_lang_error('packageget_unable', false, array($url . '/index.php'));
277
+	}
269 278
 
270 279
 	// Might take some time.
271 280
 	@set_time_limit(600);
@@ -275,8 +284,9 @@  discard block
 block discarded – undo
275 284
 	$listing = new xmlArray(fetch_web_data($_GET['package']), true);
276 285
 
277 286
 	// Errm.... empty file?  Try the URL....
278
-	if (!$listing->exists('package-list'))
279
-		fatal_lang_error('packageget_unable', false, array($url . '/index.php'));
287
+	if (!$listing->exists('package-list')) {
288
+			fatal_lang_error('packageget_unable', false, array($url . '/index.php'));
289
+	}
280 290
 
281 291
 	// List out the packages...
282 292
 	$context['package_list'] = array();
@@ -284,8 +294,9 @@  discard block
 block discarded – undo
284 294
 	$listing = $listing->path('package-list[0]');
285 295
 
286 296
 	// Use the package list's name if it exists.
287
-	if ($listing->exists('list-title'))
288
-		$name = $smcFunc['htmlspecialchars']($listing->fetch('list-title'));
297
+	if ($listing->exists('list-title')) {
298
+			$name = $smcFunc['htmlspecialchars']($listing->fetch('list-title'));
299
+	}
289 300
 
290 301
 	// Pick the correct template.
291 302
 	$context['sub_template'] = 'package_list';
@@ -300,28 +311,32 @@  discard block
 block discarded – undo
300 311
 
301 312
 	$installed_mods = array();
302 313
 	// Look through the list of installed mods...
303
-	foreach ($instmods as $installed_mod)
304
-		$installed_mods[$installed_mod['package_id']] = $installed_mod['version'];
314
+	foreach ($instmods as $installed_mod) {
315
+			$installed_mods[$installed_mod['package_id']] = $installed_mod['version'];
316
+	}
305 317
 
306 318
 	// Get default author and email if they exist.
307 319
 	if ($listing->exists('default-author'))
308 320
 	{
309 321
 		$default_author = $smcFunc['htmlspecialchars']($listing->fetch('default-author'));
310
-		if ($listing->exists('default-author/@email') && filter_var($listing->fetch('default-author/@email'), FILTER_VALIDATE_EMAIL))
311
-			$default_email = $smcFunc['htmlspecialchars']($listing->fetch('default-author/@email'));
322
+		if ($listing->exists('default-author/@email') && filter_var($listing->fetch('default-author/@email'), FILTER_VALIDATE_EMAIL)) {
323
+					$default_email = $smcFunc['htmlspecialchars']($listing->fetch('default-author/@email'));
324
+		}
312 325
 	}
313 326
 
314 327
 	// Get default web site if it exists.
315 328
 	if ($listing->exists('default-website'))
316 329
 	{
317 330
 		$default_website = $smcFunc['htmlspecialchars']($listing->fetch('default-website'));
318
-		if ($listing->exists('default-website/@title'))
319
-			$default_title = $smcFunc['htmlspecialchars']($listing->fetch('default-website/@title'));
331
+		if ($listing->exists('default-website/@title')) {
332
+					$default_title = $smcFunc['htmlspecialchars']($listing->fetch('default-website/@title'));
333
+		}
320 334
 	}
321 335
 
322 336
 	$the_version = strtr($forum_version, array('SMF ' => ''));
323
-	if (!empty($_SESSION['version_emulate']))
324
-		$the_version = $_SESSION['version_emulate'];
337
+	if (!empty($_SESSION['version_emulate'])) {
338
+			$the_version = $_SESSION['version_emulate'];
339
+	}
325 340
 
326 341
 	$packageNum = 0;
327 342
 	$packageSection = 0;
@@ -342,11 +357,13 @@  discard block
 block discarded – undo
342 357
 				'type' => $thisPackage->name(),
343 358
 			);
344 359
 
345
-			if (in_array($package['type'], array('title', 'text')))
346
-				$context['package_list'][$packageSection][$package['type']] = $smcFunc['htmlspecialchars']($thisPackage->fetch('.'));
360
+			if (in_array($package['type'], array('title', 'text'))) {
361
+							$context['package_list'][$packageSection][$package['type']] = $smcFunc['htmlspecialchars']($thisPackage->fetch('.'));
362
+			}
347 363
 			// It's a Title, Heading, Rule or Text.
348
-			elseif (in_array($package['type'], array('heading', 'rule')))
349
-				$package['name'] = $smcFunc['htmlspecialchars']($thisPackage->fetch('.'));
364
+			elseif (in_array($package['type'], array('heading', 'rule'))) {
365
+							$package['name'] = $smcFunc['htmlspecialchars']($thisPackage->fetch('.'));
366
+			}
350 367
 			// It's a Remote link.
351 368
 			elseif ($package['type'] == 'remote')
352 369
 			{
@@ -354,20 +371,21 @@  discard block
 block discarded – undo
354 371
 
355 372
 				if ($remote_type == 'relative' && substr($thisPackage->fetch('@href'), 0, 7) != 'http://' && substr($thisPackage->fetch('@href'), 0, 8) != 'https://')
356 373
 				{
357
-					if (isset($_GET['absolute']))
358
-						$current_url = $_GET['absolute'] . '/';
359
-					elseif (isset($_GET['relative']))
360
-						$current_url = $_GET['relative'] . '/';
361
-					else
362
-						$current_url = '';
374
+					if (isset($_GET['absolute'])) {
375
+											$current_url = $_GET['absolute'] . '/';
376
+					} elseif (isset($_GET['relative'])) {
377
+											$current_url = $_GET['relative'] . '/';
378
+					} else {
379
+											$current_url = '';
380
+					}
363 381
 
364 382
 					$current_url .= $thisPackage->fetch('@href');
365
-					if (isset($_GET['absolute']))
366
-						$package['href'] = $scripturl . '?action=admin;area=packages;get;sa=browse;absolute=' . $current_url;
367
-					else
368
-						$package['href'] = $scripturl . '?action=admin;area=packages;get;sa=browse;server=' . $context['package_server'] . ';relative=' . $current_url;
369
-				}
370
-				else
383
+					if (isset($_GET['absolute'])) {
384
+											$package['href'] = $scripturl . '?action=admin;area=packages;get;sa=browse;absolute=' . $current_url;
385
+					} else {
386
+											$package['href'] = $scripturl . '?action=admin;area=packages;get;sa=browse;server=' . $context['package_server'] . ';relative=' . $current_url;
387
+					}
388
+				} else
371 389
 				{
372 390
 					$current_url = $thisPackage->fetch('@href');
373 391
 					$package['href'] = $scripturl . '?action=admin;area=packages;get;sa=browse;absolute=' . $current_url;
@@ -379,25 +397,28 @@  discard block
 block discarded – undo
379 397
 			// It's a package...
380 398
 			else
381 399
 			{
382
-				if (isset($_GET['absolute']))
383
-					$current_url = $_GET['absolute'] . '/';
384
-				elseif (isset($_GET['relative']))
385
-					$current_url = $_GET['relative'] . '/';
386
-				else
387
-					$current_url = '';
400
+				if (isset($_GET['absolute'])) {
401
+									$current_url = $_GET['absolute'] . '/';
402
+				} elseif (isset($_GET['relative'])) {
403
+									$current_url = $_GET['relative'] . '/';
404
+				} else {
405
+									$current_url = '';
406
+				}
388 407
 
389 408
 				$server_att = $server != '' ? ';server=' . $server : '';
390 409
 
391 410
 				$package += $thisPackage->to_array();
392 411
 
393
-				if (isset($package['website']))
394
-					unset($package['website']);
412
+				if (isset($package['website'])) {
413
+									unset($package['website']);
414
+				}
395 415
 				$package['author'] = array();
396 416
 
397
-				if ($package['description'] == '')
398
-					$package['description'] = $txt['package_no_description'];
399
-				else
400
-					$package['description'] = parse_bbc(preg_replace('~\[[/]?html\]~i', '', $smcFunc['htmlspecialchars']($package['description'])));
417
+				if ($package['description'] == '') {
418
+									$package['description'] = $txt['package_no_description'];
419
+				} else {
420
+									$package['description'] = parse_bbc(preg_replace('~\[[/]?html\]~i', '', $smcFunc['htmlspecialchars']($package['description'])));
421
+				}
401 422
 
402 423
 				$package['is_installed'] = isset($installed_mods[$package['id']]);
403 424
 				$package['is_current'] = $package['is_installed'] && ($installed_mods[$package['id']] == $package['version']);
@@ -406,12 +427,14 @@  discard block
 block discarded – undo
406 427
 				// This package is either not installed, or installed but old.  Is it supported on this version of SMF?
407 428
 				if (!$package['is_installed'] || (!$package['is_current'] && !$package['is_newer']))
408 429
 				{
409
-					if ($thisPackage->exists('version/@for'))
410
-						$package['can_install'] = matchPackageVersion($the_version, $thisPackage->fetch('version/@for'));
430
+					if ($thisPackage->exists('version/@for')) {
431
+											$package['can_install'] = matchPackageVersion($the_version, $thisPackage->fetch('version/@for'));
432
+					}
411 433
 				}
412 434
 				// Okay, it's already installed AND up to date.
413
-				else
414
-					$package['can_install'] = false;
435
+				else {
436
+									$package['can_install'] = false;
437
+				}
415 438
 
416 439
 				$already_exists = getPackageInfo(basename($package['filename']));
417 440
 				$package['download_conflict'] = is_array($already_exists) && $already_exists['id'] == $package['id'] && $already_exists['version'] != $package['version'];
@@ -423,40 +446,44 @@  discard block
 block discarded – undo
423 446
 
424 447
 				if ($thisPackage->exists('author') || isset($default_author))
425 448
 				{
426
-					if ($thisPackage->exists('author/@email') && filter_var($thisPackage->fetch('author/@email'), FILTER_VALIDATE_EMAIL))
427
-						$package['author']['email'] = $thisPackage->fetch('author/@email');
428
-					elseif (isset($default_email))
429
-						$package['author']['email'] = $default_email;
430
-
431
-					if ($thisPackage->exists('author') && $thisPackage->fetch('author') != '')
432
-						$package['author']['name'] = $smcFunc['htmlspecialchars']($thisPackage->fetch('author'));
433
-					else
434
-						$package['author']['name'] = $default_author;
435
-
436
-					if (!empty($package['author']['email']))
437
-						$package['author']['link'] = '<a href="mailto:' . $package['author']['email'] . '">' . $package['author']['name'] . '</a>';
449
+					if ($thisPackage->exists('author/@email') && filter_var($thisPackage->fetch('author/@email'), FILTER_VALIDATE_EMAIL)) {
450
+											$package['author']['email'] = $thisPackage->fetch('author/@email');
451
+					} elseif (isset($default_email)) {
452
+											$package['author']['email'] = $default_email;
453
+					}
454
+
455
+					if ($thisPackage->exists('author') && $thisPackage->fetch('author') != '') {
456
+											$package['author']['name'] = $smcFunc['htmlspecialchars']($thisPackage->fetch('author'));
457
+					} else {
458
+											$package['author']['name'] = $default_author;
459
+					}
460
+
461
+					if (!empty($package['author']['email'])) {
462
+											$package['author']['link'] = '<a href="mailto:' . $package['author']['email'] . '">' . $package['author']['name'] . '</a>';
463
+					}
438 464
 				}
439 465
 
440 466
 				if ($thisPackage->exists('website') || isset($default_website))
441 467
 				{
442
-					if ($thisPackage->exists('website') && $thisPackage->exists('website/@title'))
443
-						$package['author']['website']['name'] = $smcFunc['htmlspecialchars']($thisPackage->fetch('website/@title'));
444
-					elseif (isset($default_title))
445
-						$package['author']['website']['name'] = $default_title;
446
-					elseif ($thisPackage->exists('website'))
447
-						$package['author']['website']['name'] = $smcFunc['htmlspecialchars']($thisPackage->fetch('website'));
448
-					else
449
-						$package['author']['website']['name'] = $default_website;
450
-
451
-					if ($thisPackage->exists('website') && $thisPackage->fetch('website') != '')
452
-						$authorhompage = $smcFunc['htmlspecialchars']($thisPackage->fetch('website'));
453
-					else
454
-						$authorhompage = $default_website;
468
+					if ($thisPackage->exists('website') && $thisPackage->exists('website/@title')) {
469
+											$package['author']['website']['name'] = $smcFunc['htmlspecialchars']($thisPackage->fetch('website/@title'));
470
+					} elseif (isset($default_title)) {
471
+											$package['author']['website']['name'] = $default_title;
472
+					} elseif ($thisPackage->exists('website')) {
473
+											$package['author']['website']['name'] = $smcFunc['htmlspecialchars']($thisPackage->fetch('website'));
474
+					} else {
475
+											$package['author']['website']['name'] = $default_website;
476
+					}
477
+
478
+					if ($thisPackage->exists('website') && $thisPackage->fetch('website') != '') {
479
+											$authorhompage = $smcFunc['htmlspecialchars']($thisPackage->fetch('website'));
480
+					} else {
481
+											$authorhompage = $default_website;
482
+					}
455 483
 
456 484
 					$package['author']['website']['href'] = $authorhompage;
457 485
 					$package['author']['website']['link'] = '<a href="' . $authorhompage . '">' . $package['author']['website']['name'] . '</a>';
458
-				}
459
-				else
486
+				} else
460 487
 				{
461 488
 					$package['author']['website']['href'] = '';
462 489
 					$package['author']['website']['link'] = '';
@@ -472,11 +499,13 @@  discard block
 block discarded – undo
472 499
 			$packageNum = in_array($package['type'], array('title', 'heading', 'text', 'remote', 'rule')) ? 0 : $packageNum + 1;
473 500
 			$package['count'] = $packageNum;
474 501
 
475
-			if (!in_array($package['type'], array('title', 'text')))
476
-				$context['package_list'][$packageSection]['items'][] = $package;
502
+			if (!in_array($package['type'], array('title', 'text'))) {
503
+							$context['package_list'][$packageSection]['items'][] = $package;
504
+			}
477 505
 
478
-			if ($package['count'] > 1)
479
-				$context['list_type'] = 'ol';
506
+			if ($package['count'] > 1) {
507
+							$context['list_type'] = 'ol';
508
+			}
480 509
 		}
481 510
 
482 511
 		$packageSection++;
@@ -489,8 +518,9 @@  discard block
 block discarded – undo
489 518
 	{
490 519
 		foreach ($packageSection['items'] as $i => $package)
491 520
 		{
492
-			if ($package['count'] == 0 || isset($package['can_install']))
493
-				continue;
521
+			if ($package['count'] == 0 || isset($package['can_install'])) {
522
+							continue;
523
+			}
494 524
 
495 525
 			$context['package_list'][$ps_id]['items'][$i]['can_install'] = false;
496 526
 
@@ -539,8 +569,9 @@  discard block
 block discarded – undo
539 569
 	checkSession('get');
540 570
 
541 571
 	// To download something, we need a valid server or url.
542
-	if (empty($_GET['server']) && (!empty($_GET['get']) && !empty($_REQUEST['package'])))
543
-		fatal_lang_error('package_get_error_is_zero', false);
572
+	if (empty($_GET['server']) && (!empty($_GET['get']) && !empty($_REQUEST['package']))) {
573
+			fatal_lang_error('package_get_error_is_zero', false);
574
+	}
544 575
 
545 576
 	if (isset($_GET['server']))
546 577
 	{
@@ -560,22 +591,23 @@  discard block
 block discarded – undo
560 591
 		$smcFunc['db_free_result']($request);
561 592
 
562 593
 		// If server does not exist then dump out.
563
-		if (empty($url))
564
-			fatal_lang_error('couldnt_connect', false);
594
+		if (empty($url)) {
595
+					fatal_lang_error('couldnt_connect', false);
596
+		}
565 597
 
566 598
 		$url = $url . '/';
567
-	}
568
-	else
599
+	} else
569 600
 	{
570 601
 		// Initialize the requried variables.
571 602
 		$server = '';
572 603
 		$url = '';
573 604
 	}
574 605
 
575
-	if (isset($_REQUEST['byurl']) && !empty($_POST['filename']))
576
-		$package_name = basename($_REQUEST['filename']);
577
-	else
578
-		$package_name = basename($_REQUEST['package']);
606
+	if (isset($_REQUEST['byurl']) && !empty($_POST['filename'])) {
607
+			$package_name = basename($_REQUEST['filename']);
608
+	} else {
609
+			$package_name = basename($_REQUEST['package']);
610
+	}
579 611
 
580 612
 	if (isset($_REQUEST['conflict']) || (isset($_REQUEST['auto']) && file_exists($packagesdir . '/' . $package_name)))
581 613
 	{
@@ -584,14 +616,15 @@  discard block
 block discarded – undo
584 616
 		{
585 617
 			$ext = substr($package_name, strrpos(substr($package_name, 0, -3), '.'));
586 618
 			$package_name = substr($package_name, 0, strrpos(substr($package_name, 0, -3), '.')) . '_';
619
+		} else {
620
+					$ext = '';
587 621
 		}
588
-		else
589
-			$ext = '';
590 622
 
591 623
 		// Find the first available.
592 624
 		$i = 1;
593
-		while (file_exists($packagesdir . '/' . $package_name . $i . $ext))
594
-			$i++;
625
+		while (file_exists($packagesdir . '/' . $package_name . $i . $ext)) {
626
+					$i++;
627
+		}
595 628
 
596 629
 		$package_name = $package_name . $i . $ext;
597 630
 	}
@@ -601,25 +634,28 @@  discard block
 block discarded – undo
601 634
 	package_put_contents($packagesdir . '/' . $package_name, fetch_web_data($url . $_REQUEST['package']));
602 635
 
603 636
 	// Done!  Did we get this package automatically?
604
-	if (preg_match('~^http://[\w_\-]+\.simplemachines\.org/~', $_REQUEST['package']) == 1 && strpos($_REQUEST['package'], 'dlattach') === false && isset($_REQUEST['auto']))
605
-		redirectexit('action=admin;area=packages;sa=install;package=' . $package_name);
637
+	if (preg_match('~^http://[\w_\-]+\.simplemachines\.org/~', $_REQUEST['package']) == 1 && strpos($_REQUEST['package'], 'dlattach') === false && isset($_REQUEST['auto'])) {
638
+			redirectexit('action=admin;area=packages;sa=install;package=' . $package_name);
639
+	}
606 640
 
607 641
 	// You just downloaded a mod from SERVER_NAME_GOES_HERE.
608 642
 	$context['package_server'] = $server;
609 643
 
610 644
 	$context['package'] = getPackageInfo($package_name);
611 645
 
612
-	if (!is_array($context['package']))
613
-		fatal_lang_error('package_cant_download', false);
646
+	if (!is_array($context['package'])) {
647
+			fatal_lang_error('package_cant_download', false);
648
+	}
614 649
 
615
-	if ($context['package']['type'] == 'modification')
616
-		$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['install_mod'] . ' ]</a>';
617
-	elseif ($context['package']['type'] == 'avatar')
618
-		$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['use_avatars'] . ' ]</a>';
619
-	elseif ($context['package']['type'] == 'language')
620
-		$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['add_languages'] . ' ]</a>';
621
-	else
622
-		$context['package']['install']['link'] = '';
650
+	if ($context['package']['type'] == 'modification') {
651
+			$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['install_mod'] . ' ]</a>';
652
+	} elseif ($context['package']['type'] == 'avatar') {
653
+			$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['use_avatars'] . ' ]</a>';
654
+	} elseif ($context['package']['type'] == 'language') {
655
+			$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['add_languages'] . ' ]</a>';
656
+	} else {
657
+			$context['package']['install']['link'] = '';
658
+	}
623 659
 
624 660
 	// Does a 3rd party hook want to do some additional changes?
625 661
 	call_integration_hook('integrate_package_download');
@@ -645,16 +681,18 @@  discard block
 block discarded – undo
645 681
 	// @todo Use FTP if the Packages directory is not writable.
646 682
 
647 683
 	// Check the file was even sent!
648
-	if (!isset($_FILES['package']['name']) || $_FILES['package']['name'] == '')
649
-		fatal_lang_error('package_upload_error_nofile');
650
-	elseif (!is_uploaded_file($_FILES['package']['tmp_name']) || (ini_get('open_basedir') == '' && !file_exists($_FILES['package']['tmp_name'])))
651
-		fatal_lang_error('package_upload_error_failed');
684
+	if (!isset($_FILES['package']['name']) || $_FILES['package']['name'] == '') {
685
+			fatal_lang_error('package_upload_error_nofile');
686
+	} elseif (!is_uploaded_file($_FILES['package']['tmp_name']) || (ini_get('open_basedir') == '' && !file_exists($_FILES['package']['tmp_name']))) {
687
+			fatal_lang_error('package_upload_error_failed');
688
+	}
652 689
 
653 690
 	// Make sure it has a sane filename.
654 691
 	$_FILES['package']['name'] = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $_FILES['package']['name']);
655 692
 
656
-	if (strtolower(substr($_FILES['package']['name'], -4)) != '.zip' && strtolower(substr($_FILES['package']['name'], -4)) != '.tgz' && strtolower(substr($_FILES['package']['name'], -7)) != '.tar.gz')
657
-		fatal_lang_error('package_upload_error_supports', false, array('zip, tgz, tar.gz'));
693
+	if (strtolower(substr($_FILES['package']['name'], -4)) != '.zip' && strtolower(substr($_FILES['package']['name'], -4)) != '.tgz' && strtolower(substr($_FILES['package']['name'], -7)) != '.tar.gz') {
694
+			fatal_lang_error('package_upload_error_supports', false, array('zip, tgz, tar.gz'));
695
+	}
658 696
 
659 697
 	// We only need the filename...
660 698
 	$packageName = basename($_FILES['package']['name']);
@@ -662,8 +700,9 @@  discard block
 block discarded – undo
662 700
 	// Setup the destination and throw an error if the file is already there!
663 701
 	$destination = $packagesdir . '/' . $packageName;
664 702
 	// @todo Maybe just roll it like we do for downloads?
665
-	if (file_exists($destination))
666
-		fatal_lang_error('package_upload_error_exists');
703
+	if (file_exists($destination)) {
704
+			fatal_lang_error('package_upload_error_exists');
705
+	}
667 706
 
668 707
 	// Now move the file.
669 708
 	move_uploaded_file($_FILES['package']['tmp_name'], $destination);
@@ -686,12 +725,14 @@  discard block
 block discarded – undo
686 725
 	{
687 726
 		while ($package = readdir($dir))
688 727
 		{
689
-			if ($package == '.' || $package == '..' || $package == 'temp' || $package == $packageName || (!(is_dir($packagesdir . '/' . $package) && file_exists($packagesdir . '/' . $package . '/package-info.xml')) && substr(strtolower($package), -7) != '.tar.gz' && substr(strtolower($package), -4) != '.tgz' && substr(strtolower($package), -4) != '.zip'))
690
-				continue;
728
+			if ($package == '.' || $package == '..' || $package == 'temp' || $package == $packageName || (!(is_dir($packagesdir . '/' . $package) && file_exists($packagesdir . '/' . $package . '/package-info.xml')) && substr(strtolower($package), -7) != '.tar.gz' && substr(strtolower($package), -4) != '.tgz' && substr(strtolower($package), -4) != '.zip')) {
729
+							continue;
730
+			}
691 731
 
692 732
 			$packageInfo = getPackageInfo($package);
693
-			if (!is_array($packageInfo))
694
-				continue;
733
+			if (!is_array($packageInfo)) {
734
+							continue;
735
+			}
695 736
 
696 737
 			if ($packageInfo['id'] == $context['package']['id'] && $packageInfo['version'] == $context['package']['version'])
697 738
 			{
@@ -703,14 +744,15 @@  discard block
 block discarded – undo
703 744
 		closedir($dir);
704 745
 	}
705 746
 
706
-	if ($context['package']['type'] == 'modification')
707
-		$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['install_mod'] . ' ]</a>';
708
-	elseif ($context['package']['type'] == 'avatar')
709
-		$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['use_avatars'] . ' ]</a>';
710
-	elseif ($context['package']['type'] == 'language')
711
-		$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['add_languages'] . ' ]</a>';
712
-	else
713
-		$context['package']['install']['link'] = '';
747
+	if ($context['package']['type'] == 'modification') {
748
+			$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['install_mod'] . ' ]</a>';
749
+	} elseif ($context['package']['type'] == 'avatar') {
750
+			$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['use_avatars'] . ' ]</a>';
751
+	} elseif ($context['package']['type'] == 'language') {
752
+			$context['package']['install']['link'] = '<a href="' . $scripturl . '?action=admin;area=packages;sa=install;package=' . $context['package']['filename'] . '">[ ' . $txt['add_languages'] . ' ]</a>';
753
+	} else {
754
+			$context['package']['install']['link'] = '';
755
+	}
714 756
 
715 757
 	// Does a 3rd party hook want to do some additional changes?
716 758
 	call_integration_hook('integrate_package_upload');
@@ -733,16 +775,18 @@  discard block
 block discarded – undo
733 775
 	checkSession();
734 776
 
735 777
 	// If they put a slash on the end, get rid of it.
736
-	if (substr($_POST['serverurl'], -1) == '/')
737
-		$_POST['serverurl'] = substr($_POST['serverurl'], 0, -1);
778
+	if (substr($_POST['serverurl'], -1) == '/') {
779
+			$_POST['serverurl'] = substr($_POST['serverurl'], 0, -1);
780
+	}
738 781
 
739 782
 	// Are they both nice and clean?
740 783
 	$servername = trim($smcFunc['htmlspecialchars']($_POST['servername']));
741 784
 	$serverurl = trim($smcFunc['htmlspecialchars']($_POST['serverurl']));
742 785
 
743 786
 	// Make sure the URL has the correct prefix.
744
-	if (strpos($serverurl, 'http://') !== 0 && strpos($serverurl, 'https://') !== 0)
745
-		$serverurl = 'http://' . $serverurl;
787
+	if (strpos($serverurl, 'http://') !== 0 && strpos($serverurl, 'https://') !== 0) {
788
+			$serverurl = 'http://' . $serverurl;
789
+	}
746 790
 
747 791
 	$smcFunc['db_insert']('',
748 792
 		'{db_prefix}package_servers',
Please login to merge, or discard this patch.
Sources/minify/src/JS.php 2 patches
Indentation   +397 added lines, -397 removed lines patch added patch discarded remove patch
@@ -14,122 +14,122 @@  discard block
 block discarded – undo
14 14
  */
15 15
 class JS extends Minify
16 16
 {
17
-    /**
18
-     * Var-matching regex based on http://stackoverflow.com/a/9337047/802993.
19
-     *
20
-     * Note that regular expressions using that bit must have the PCRE_UTF8
21
-     * pattern modifier (/u) set.
22
-     *
23
-     * @var string
24
-     */
25
-    const REGEX_VARIABLE = '\b[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\x{02c1}\x{02c6}-\x{02d1}\x{02e0}-\x{02e4}\x{02ec}\x{02ee}\x{0370}-\x{0374}\x{0376}\x{0377}\x{037a}-\x{037d}\x{0386}\x{0388}-\x{038a}\x{038c}\x{038e}-\x{03a1}\x{03a3}-\x{03f5}\x{03f7}-\x{0481}\x{048a}-\x{0527}\x{0531}-\x{0556}\x{0559}\x{0561}-\x{0587}\x{05d0}-\x{05ea}\x{05f0}-\x{05f2}\x{0620}-\x{064a}\x{066e}\x{066f}\x{0671}-\x{06d3}\x{06d5}\x{06e5}\x{06e6}\x{06ee}\x{06ef}\x{06fa}-\x{06fc}\x{06ff}\x{0710}\x{0712}-\x{072f}\x{074d}-\x{07a5}\x{07b1}\x{07ca}-\x{07ea}\x{07f4}\x{07f5}\x{07fa}\x{0800}-\x{0815}\x{081a}\x{0824}\x{0828}\x{0840}-\x{0858}\x{08a0}\x{08a2}-\x{08ac}\x{0904}-\x{0939}\x{093d}\x{0950}\x{0958}-\x{0961}\x{0971}-\x{0977}\x{0979}-\x{097f}\x{0985}-\x{098c}\x{098f}\x{0990}\x{0993}-\x{09a8}\x{09aa}-\x{09b0}\x{09b2}\x{09b6}-\x{09b9}\x{09bd}\x{09ce}\x{09dc}\x{09dd}\x{09df}-\x{09e1}\x{09f0}\x{09f1}\x{0a05}-\x{0a0a}\x{0a0f}\x{0a10}\x{0a13}-\x{0a28}\x{0a2a}-\x{0a30}\x{0a32}\x{0a33}\x{0a35}\x{0a36}\x{0a38}\x{0a39}\x{0a59}-\x{0a5c}\x{0a5e}\x{0a72}-\x{0a74}\x{0a85}-\x{0a8d}\x{0a8f}-\x{0a91}\x{0a93}-\x{0aa8}\x{0aaa}-\x{0ab0}\x{0ab2}\x{0ab3}\x{0ab5}-\x{0ab9}\x{0abd}\x{0ad0}\x{0ae0}\x{0ae1}\x{0b05}-\x{0b0c}\x{0b0f}\x{0b10}\x{0b13}-\x{0b28}\x{0b2a}-\x{0b30}\x{0b32}\x{0b33}\x{0b35}-\x{0b39}\x{0b3d}\x{0b5c}\x{0b5d}\x{0b5f}-\x{0b61}\x{0b71}\x{0b83}\x{0b85}-\x{0b8a}\x{0b8e}-\x{0b90}\x{0b92}-\x{0b95}\x{0b99}\x{0b9a}\x{0b9c}\x{0b9e}\x{0b9f}\x{0ba3}\x{0ba4}\x{0ba8}-\x{0baa}\x{0bae}-\x{0bb9}\x{0bd0}\x{0c05}-\x{0c0c}\x{0c0e}-\x{0c10}\x{0c12}-\x{0c28}\x{0c2a}-\x{0c33}\x{0c35}-\x{0c39}\x{0c3d}\x{0c58}\x{0c59}\x{0c60}\x{0c61}\x{0c85}-\x{0c8c}\x{0c8e}-\x{0c90}\x{0c92}-\x{0ca8}\x{0caa}-\x{0cb3}\x{0cb5}-\x{0cb9}\x{0cbd}\x{0cde}\x{0ce0}\x{0ce1}\x{0cf1}\x{0cf2}\x{0d05}-\x{0d0c}\x{0d0e}-\x{0d10}\x{0d12}-\x{0d3a}\x{0d3d}\x{0d4e}\x{0d60}\x{0d61}\x{0d7a}-\x{0d7f}\x{0d85}-\x{0d96}\x{0d9a}-\x{0db1}\x{0db3}-\x{0dbb}\x{0dbd}\x{0dc0}-\x{0dc6}\x{0e01}-\x{0e30}\x{0e32}\x{0e33}\x{0e40}-\x{0e46}\x{0e81}\x{0e82}\x{0e84}\x{0e87}\x{0e88}\x{0e8a}\x{0e8d}\x{0e94}-\x{0e97}\x{0e99}-\x{0e9f}\x{0ea1}-\x{0ea3}\x{0ea5}\x{0ea7}\x{0eaa}\x{0eab}\x{0ead}-\x{0eb0}\x{0eb2}\x{0eb3}\x{0ebd}\x{0ec0}-\x{0ec4}\x{0ec6}\x{0edc}-\x{0edf}\x{0f00}\x{0f40}-\x{0f47}\x{0f49}-\x{0f6c}\x{0f88}-\x{0f8c}\x{1000}-\x{102a}\x{103f}\x{1050}-\x{1055}\x{105a}-\x{105d}\x{1061}\x{1065}\x{1066}\x{106e}-\x{1070}\x{1075}-\x{1081}\x{108e}\x{10a0}-\x{10c5}\x{10c7}\x{10cd}\x{10d0}-\x{10fa}\x{10fc}-\x{1248}\x{124a}-\x{124d}\x{1250}-\x{1256}\x{1258}\x{125a}-\x{125d}\x{1260}-\x{1288}\x{128a}-\x{128d}\x{1290}-\x{12b0}\x{12b2}-\x{12b5}\x{12b8}-\x{12be}\x{12c0}\x{12c2}-\x{12c5}\x{12c8}-\x{12d6}\x{12d8}-\x{1310}\x{1312}-\x{1315}\x{1318}-\x{135a}\x{1380}-\x{138f}\x{13a0}-\x{13f4}\x{1401}-\x{166c}\x{166f}-\x{167f}\x{1681}-\x{169a}\x{16a0}-\x{16ea}\x{16ee}-\x{16f0}\x{1700}-\x{170c}\x{170e}-\x{1711}\x{1720}-\x{1731}\x{1740}-\x{1751}\x{1760}-\x{176c}\x{176e}-\x{1770}\x{1780}-\x{17b3}\x{17d7}\x{17dc}\x{1820}-\x{1877}\x{1880}-\x{18a8}\x{18aa}\x{18b0}-\x{18f5}\x{1900}-\x{191c}\x{1950}-\x{196d}\x{1970}-\x{1974}\x{1980}-\x{19ab}\x{19c1}-\x{19c7}\x{1a00}-\x{1a16}\x{1a20}-\x{1a54}\x{1aa7}\x{1b05}-\x{1b33}\x{1b45}-\x{1b4b}\x{1b83}-\x{1ba0}\x{1bae}\x{1baf}\x{1bba}-\x{1be5}\x{1c00}-\x{1c23}\x{1c4d}-\x{1c4f}\x{1c5a}-\x{1c7d}\x{1ce9}-\x{1cec}\x{1cee}-\x{1cf1}\x{1cf5}\x{1cf6}\x{1d00}-\x{1dbf}\x{1e00}-\x{1f15}\x{1f18}-\x{1f1d}\x{1f20}-\x{1f45}\x{1f48}-\x{1f4d}\x{1f50}-\x{1f57}\x{1f59}\x{1f5b}\x{1f5d}\x{1f5f}-\x{1f7d}\x{1f80}-\x{1fb4}\x{1fb6}-\x{1fbc}\x{1fbe}\x{1fc2}-\x{1fc4}\x{1fc6}-\x{1fcc}\x{1fd0}-\x{1fd3}\x{1fd6}-\x{1fdb}\x{1fe0}-\x{1fec}\x{1ff2}-\x{1ff4}\x{1ff6}-\x{1ffc}\x{2071}\x{207f}\x{2090}-\x{209c}\x{2102}\x{2107}\x{210a}-\x{2113}\x{2115}\x{2119}-\x{211d}\x{2124}\x{2126}\x{2128}\x{212a}-\x{212d}\x{212f}-\x{2139}\x{213c}-\x{213f}\x{2145}-\x{2149}\x{214e}\x{2160}-\x{2188}\x{2c00}-\x{2c2e}\x{2c30}-\x{2c5e}\x{2c60}-\x{2ce4}\x{2ceb}-\x{2cee}\x{2cf2}\x{2cf3}\x{2d00}-\x{2d25}\x{2d27}\x{2d2d}\x{2d30}-\x{2d67}\x{2d6f}\x{2d80}-\x{2d96}\x{2da0}-\x{2da6}\x{2da8}-\x{2dae}\x{2db0}-\x{2db6}\x{2db8}-\x{2dbe}\x{2dc0}-\x{2dc6}\x{2dc8}-\x{2dce}\x{2dd0}-\x{2dd6}\x{2dd8}-\x{2dde}\x{2e2f}\x{3005}-\x{3007}\x{3021}-\x{3029}\x{3031}-\x{3035}\x{3038}-\x{303c}\x{3041}-\x{3096}\x{309d}-\x{309f}\x{30a1}-\x{30fa}\x{30fc}-\x{30ff}\x{3105}-\x{312d}\x{3131}-\x{318e}\x{31a0}-\x{31ba}\x{31f0}-\x{31ff}\x{3400}-\x{4db5}\x{4e00}-\x{9fcc}\x{a000}-\x{a48c}\x{a4d0}-\x{a4fd}\x{a500}-\x{a60c}\x{a610}-\x{a61f}\x{a62a}\x{a62b}\x{a640}-\x{a66e}\x{a67f}-\x{a697}\x{a6a0}-\x{a6ef}\x{a717}-\x{a71f}\x{a722}-\x{a788}\x{a78b}-\x{a78e}\x{a790}-\x{a793}\x{a7a0}-\x{a7aa}\x{a7f8}-\x{a801}\x{a803}-\x{a805}\x{a807}-\x{a80a}\x{a80c}-\x{a822}\x{a840}-\x{a873}\x{a882}-\x{a8b3}\x{a8f2}-\x{a8f7}\x{a8fb}\x{a90a}-\x{a925}\x{a930}-\x{a946}\x{a960}-\x{a97c}\x{a984}-\x{a9b2}\x{a9cf}\x{aa00}-\x{aa28}\x{aa40}-\x{aa42}\x{aa44}-\x{aa4b}\x{aa60}-\x{aa76}\x{aa7a}\x{aa80}-\x{aaaf}\x{aab1}\x{aab5}\x{aab6}\x{aab9}-\x{aabd}\x{aac0}\x{aac2}\x{aadb}-\x{aadd}\x{aae0}-\x{aaea}\x{aaf2}-\x{aaf4}\x{ab01}-\x{ab06}\x{ab09}-\x{ab0e}\x{ab11}-\x{ab16}\x{ab20}-\x{ab26}\x{ab28}-\x{ab2e}\x{abc0}-\x{abe2}\x{ac00}-\x{d7a3}\x{d7b0}-\x{d7c6}\x{d7cb}-\x{d7fb}\x{f900}-\x{fa6d}\x{fa70}-\x{fad9}\x{fb00}-\x{fb06}\x{fb13}-\x{fb17}\x{fb1d}\x{fb1f}-\x{fb28}\x{fb2a}-\x{fb36}\x{fb38}-\x{fb3c}\x{fb3e}\x{fb40}\x{fb41}\x{fb43}\x{fb44}\x{fb46}-\x{fbb1}\x{fbd3}-\x{fd3d}\x{fd50}-\x{fd8f}\x{fd92}-\x{fdc7}\x{fdf0}-\x{fdfb}\x{fe70}-\x{fe74}\x{fe76}-\x{fefc}\x{ff21}-\x{ff3a}\x{ff41}-\x{ff5a}\x{ff66}-\x{ffbe}\x{ffc2}-\x{ffc7}\x{ffca}-\x{ffcf}\x{ffd2}-\x{ffd7}\x{ffda}-\x{ffdc}][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\x{02c1}\x{02c6}-\x{02d1}\x{02e0}-\x{02e4}\x{02ec}\x{02ee}\x{0370}-\x{0374}\x{0376}\x{0377}\x{037a}-\x{037d}\x{0386}\x{0388}-\x{038a}\x{038c}\x{038e}-\x{03a1}\x{03a3}-\x{03f5}\x{03f7}-\x{0481}\x{048a}-\x{0527}\x{0531}-\x{0556}\x{0559}\x{0561}-\x{0587}\x{05d0}-\x{05ea}\x{05f0}-\x{05f2}\x{0620}-\x{064a}\x{066e}\x{066f}\x{0671}-\x{06d3}\x{06d5}\x{06e5}\x{06e6}\x{06ee}\x{06ef}\x{06fa}-\x{06fc}\x{06ff}\x{0710}\x{0712}-\x{072f}\x{074d}-\x{07a5}\x{07b1}\x{07ca}-\x{07ea}\x{07f4}\x{07f5}\x{07fa}\x{0800}-\x{0815}\x{081a}\x{0824}\x{0828}\x{0840}-\x{0858}\x{08a0}\x{08a2}-\x{08ac}\x{0904}-\x{0939}\x{093d}\x{0950}\x{0958}-\x{0961}\x{0971}-\x{0977}\x{0979}-\x{097f}\x{0985}-\x{098c}\x{098f}\x{0990}\x{0993}-\x{09a8}\x{09aa}-\x{09b0}\x{09b2}\x{09b6}-\x{09b9}\x{09bd}\x{09ce}\x{09dc}\x{09dd}\x{09df}-\x{09e1}\x{09f0}\x{09f1}\x{0a05}-\x{0a0a}\x{0a0f}\x{0a10}\x{0a13}-\x{0a28}\x{0a2a}-\x{0a30}\x{0a32}\x{0a33}\x{0a35}\x{0a36}\x{0a38}\x{0a39}\x{0a59}-\x{0a5c}\x{0a5e}\x{0a72}-\x{0a74}\x{0a85}-\x{0a8d}\x{0a8f}-\x{0a91}\x{0a93}-\x{0aa8}\x{0aaa}-\x{0ab0}\x{0ab2}\x{0ab3}\x{0ab5}-\x{0ab9}\x{0abd}\x{0ad0}\x{0ae0}\x{0ae1}\x{0b05}-\x{0b0c}\x{0b0f}\x{0b10}\x{0b13}-\x{0b28}\x{0b2a}-\x{0b30}\x{0b32}\x{0b33}\x{0b35}-\x{0b39}\x{0b3d}\x{0b5c}\x{0b5d}\x{0b5f}-\x{0b61}\x{0b71}\x{0b83}\x{0b85}-\x{0b8a}\x{0b8e}-\x{0b90}\x{0b92}-\x{0b95}\x{0b99}\x{0b9a}\x{0b9c}\x{0b9e}\x{0b9f}\x{0ba3}\x{0ba4}\x{0ba8}-\x{0baa}\x{0bae}-\x{0bb9}\x{0bd0}\x{0c05}-\x{0c0c}\x{0c0e}-\x{0c10}\x{0c12}-\x{0c28}\x{0c2a}-\x{0c33}\x{0c35}-\x{0c39}\x{0c3d}\x{0c58}\x{0c59}\x{0c60}\x{0c61}\x{0c85}-\x{0c8c}\x{0c8e}-\x{0c90}\x{0c92}-\x{0ca8}\x{0caa}-\x{0cb3}\x{0cb5}-\x{0cb9}\x{0cbd}\x{0cde}\x{0ce0}\x{0ce1}\x{0cf1}\x{0cf2}\x{0d05}-\x{0d0c}\x{0d0e}-\x{0d10}\x{0d12}-\x{0d3a}\x{0d3d}\x{0d4e}\x{0d60}\x{0d61}\x{0d7a}-\x{0d7f}\x{0d85}-\x{0d96}\x{0d9a}-\x{0db1}\x{0db3}-\x{0dbb}\x{0dbd}\x{0dc0}-\x{0dc6}\x{0e01}-\x{0e30}\x{0e32}\x{0e33}\x{0e40}-\x{0e46}\x{0e81}\x{0e82}\x{0e84}\x{0e87}\x{0e88}\x{0e8a}\x{0e8d}\x{0e94}-\x{0e97}\x{0e99}-\x{0e9f}\x{0ea1}-\x{0ea3}\x{0ea5}\x{0ea7}\x{0eaa}\x{0eab}\x{0ead}-\x{0eb0}\x{0eb2}\x{0eb3}\x{0ebd}\x{0ec0}-\x{0ec4}\x{0ec6}\x{0edc}-\x{0edf}\x{0f00}\x{0f40}-\x{0f47}\x{0f49}-\x{0f6c}\x{0f88}-\x{0f8c}\x{1000}-\x{102a}\x{103f}\x{1050}-\x{1055}\x{105a}-\x{105d}\x{1061}\x{1065}\x{1066}\x{106e}-\x{1070}\x{1075}-\x{1081}\x{108e}\x{10a0}-\x{10c5}\x{10c7}\x{10cd}\x{10d0}-\x{10fa}\x{10fc}-\x{1248}\x{124a}-\x{124d}\x{1250}-\x{1256}\x{1258}\x{125a}-\x{125d}\x{1260}-\x{1288}\x{128a}-\x{128d}\x{1290}-\x{12b0}\x{12b2}-\x{12b5}\x{12b8}-\x{12be}\x{12c0}\x{12c2}-\x{12c5}\x{12c8}-\x{12d6}\x{12d8}-\x{1310}\x{1312}-\x{1315}\x{1318}-\x{135a}\x{1380}-\x{138f}\x{13a0}-\x{13f4}\x{1401}-\x{166c}\x{166f}-\x{167f}\x{1681}-\x{169a}\x{16a0}-\x{16ea}\x{16ee}-\x{16f0}\x{1700}-\x{170c}\x{170e}-\x{1711}\x{1720}-\x{1731}\x{1740}-\x{1751}\x{1760}-\x{176c}\x{176e}-\x{1770}\x{1780}-\x{17b3}\x{17d7}\x{17dc}\x{1820}-\x{1877}\x{1880}-\x{18a8}\x{18aa}\x{18b0}-\x{18f5}\x{1900}-\x{191c}\x{1950}-\x{196d}\x{1970}-\x{1974}\x{1980}-\x{19ab}\x{19c1}-\x{19c7}\x{1a00}-\x{1a16}\x{1a20}-\x{1a54}\x{1aa7}\x{1b05}-\x{1b33}\x{1b45}-\x{1b4b}\x{1b83}-\x{1ba0}\x{1bae}\x{1baf}\x{1bba}-\x{1be5}\x{1c00}-\x{1c23}\x{1c4d}-\x{1c4f}\x{1c5a}-\x{1c7d}\x{1ce9}-\x{1cec}\x{1cee}-\x{1cf1}\x{1cf5}\x{1cf6}\x{1d00}-\x{1dbf}\x{1e00}-\x{1f15}\x{1f18}-\x{1f1d}\x{1f20}-\x{1f45}\x{1f48}-\x{1f4d}\x{1f50}-\x{1f57}\x{1f59}\x{1f5b}\x{1f5d}\x{1f5f}-\x{1f7d}\x{1f80}-\x{1fb4}\x{1fb6}-\x{1fbc}\x{1fbe}\x{1fc2}-\x{1fc4}\x{1fc6}-\x{1fcc}\x{1fd0}-\x{1fd3}\x{1fd6}-\x{1fdb}\x{1fe0}-\x{1fec}\x{1ff2}-\x{1ff4}\x{1ff6}-\x{1ffc}\x{2071}\x{207f}\x{2090}-\x{209c}\x{2102}\x{2107}\x{210a}-\x{2113}\x{2115}\x{2119}-\x{211d}\x{2124}\x{2126}\x{2128}\x{212a}-\x{212d}\x{212f}-\x{2139}\x{213c}-\x{213f}\x{2145}-\x{2149}\x{214e}\x{2160}-\x{2188}\x{2c00}-\x{2c2e}\x{2c30}-\x{2c5e}\x{2c60}-\x{2ce4}\x{2ceb}-\x{2cee}\x{2cf2}\x{2cf3}\x{2d00}-\x{2d25}\x{2d27}\x{2d2d}\x{2d30}-\x{2d67}\x{2d6f}\x{2d80}-\x{2d96}\x{2da0}-\x{2da6}\x{2da8}-\x{2dae}\x{2db0}-\x{2db6}\x{2db8}-\x{2dbe}\x{2dc0}-\x{2dc6}\x{2dc8}-\x{2dce}\x{2dd0}-\x{2dd6}\x{2dd8}-\x{2dde}\x{2e2f}\x{3005}-\x{3007}\x{3021}-\x{3029}\x{3031}-\x{3035}\x{3038}-\x{303c}\x{3041}-\x{3096}\x{309d}-\x{309f}\x{30a1}-\x{30fa}\x{30fc}-\x{30ff}\x{3105}-\x{312d}\x{3131}-\x{318e}\x{31a0}-\x{31ba}\x{31f0}-\x{31ff}\x{3400}-\x{4db5}\x{4e00}-\x{9fcc}\x{a000}-\x{a48c}\x{a4d0}-\x{a4fd}\x{a500}-\x{a60c}\x{a610}-\x{a61f}\x{a62a}\x{a62b}\x{a640}-\x{a66e}\x{a67f}-\x{a697}\x{a6a0}-\x{a6ef}\x{a717}-\x{a71f}\x{a722}-\x{a788}\x{a78b}-\x{a78e}\x{a790}-\x{a793}\x{a7a0}-\x{a7aa}\x{a7f8}-\x{a801}\x{a803}-\x{a805}\x{a807}-\x{a80a}\x{a80c}-\x{a822}\x{a840}-\x{a873}\x{a882}-\x{a8b3}\x{a8f2}-\x{a8f7}\x{a8fb}\x{a90a}-\x{a925}\x{a930}-\x{a946}\x{a960}-\x{a97c}\x{a984}-\x{a9b2}\x{a9cf}\x{aa00}-\x{aa28}\x{aa40}-\x{aa42}\x{aa44}-\x{aa4b}\x{aa60}-\x{aa76}\x{aa7a}\x{aa80}-\x{aaaf}\x{aab1}\x{aab5}\x{aab6}\x{aab9}-\x{aabd}\x{aac0}\x{aac2}\x{aadb}-\x{aadd}\x{aae0}-\x{aaea}\x{aaf2}-\x{aaf4}\x{ab01}-\x{ab06}\x{ab09}-\x{ab0e}\x{ab11}-\x{ab16}\x{ab20}-\x{ab26}\x{ab28}-\x{ab2e}\x{abc0}-\x{abe2}\x{ac00}-\x{d7a3}\x{d7b0}-\x{d7c6}\x{d7cb}-\x{d7fb}\x{f900}-\x{fa6d}\x{fa70}-\x{fad9}\x{fb00}-\x{fb06}\x{fb13}-\x{fb17}\x{fb1d}\x{fb1f}-\x{fb28}\x{fb2a}-\x{fb36}\x{fb38}-\x{fb3c}\x{fb3e}\x{fb40}\x{fb41}\x{fb43}\x{fb44}\x{fb46}-\x{fbb1}\x{fbd3}-\x{fd3d}\x{fd50}-\x{fd8f}\x{fd92}-\x{fdc7}\x{fdf0}-\x{fdfb}\x{fe70}-\x{fe74}\x{fe76}-\x{fefc}\x{ff21}-\x{ff3a}\x{ff41}-\x{ff5a}\x{ff66}-\x{ffbe}\x{ffc2}-\x{ffc7}\x{ffca}-\x{ffcf}\x{ffd2}-\x{ffd7}\x{ffda}-\x{ffdc}0-9\x{0300}-\x{036f}\x{0483}-\x{0487}\x{0591}-\x{05bd}\x{05bf}\x{05c1}\x{05c2}\x{05c4}\x{05c5}\x{05c7}\x{0610}-\x{061a}\x{064b}-\x{0669}\x{0670}\x{06d6}-\x{06dc}\x{06df}-\x{06e4}\x{06e7}\x{06e8}\x{06ea}-\x{06ed}\x{06f0}-\x{06f9}\x{0711}\x{0730}-\x{074a}\x{07a6}-\x{07b0}\x{07c0}-\x{07c9}\x{07eb}-\x{07f3}\x{0816}-\x{0819}\x{081b}-\x{0823}\x{0825}-\x{0827}\x{0829}-\x{082d}\x{0859}-\x{085b}\x{08e4}-\x{08fe}\x{0900}-\x{0903}\x{093a}-\x{093c}\x{093e}-\x{094f}\x{0951}-\x{0957}\x{0962}\x{0963}\x{0966}-\x{096f}\x{0981}-\x{0983}\x{09bc}\x{09be}-\x{09c4}\x{09c7}\x{09c8}\x{09cb}-\x{09cd}\x{09d7}\x{09e2}\x{09e3}\x{09e6}-\x{09ef}\x{0a01}-\x{0a03}\x{0a3c}\x{0a3e}-\x{0a42}\x{0a47}\x{0a48}\x{0a4b}-\x{0a4d}\x{0a51}\x{0a66}-\x{0a71}\x{0a75}\x{0a81}-\x{0a83}\x{0abc}\x{0abe}-\x{0ac5}\x{0ac7}-\x{0ac9}\x{0acb}-\x{0acd}\x{0ae2}\x{0ae3}\x{0ae6}-\x{0aef}\x{0b01}-\x{0b03}\x{0b3c}\x{0b3e}-\x{0b44}\x{0b47}\x{0b48}\x{0b4b}-\x{0b4d}\x{0b56}\x{0b57}\x{0b62}\x{0b63}\x{0b66}-\x{0b6f}\x{0b82}\x{0bbe}-\x{0bc2}\x{0bc6}-\x{0bc8}\x{0bca}-\x{0bcd}\x{0bd7}\x{0be6}-\x{0bef}\x{0c01}-\x{0c03}\x{0c3e}-\x{0c44}\x{0c46}-\x{0c48}\x{0c4a}-\x{0c4d}\x{0c55}\x{0c56}\x{0c62}\x{0c63}\x{0c66}-\x{0c6f}\x{0c82}\x{0c83}\x{0cbc}\x{0cbe}-\x{0cc4}\x{0cc6}-\x{0cc8}\x{0cca}-\x{0ccd}\x{0cd5}\x{0cd6}\x{0ce2}\x{0ce3}\x{0ce6}-\x{0cef}\x{0d02}\x{0d03}\x{0d3e}-\x{0d44}\x{0d46}-\x{0d48}\x{0d4a}-\x{0d4d}\x{0d57}\x{0d62}\x{0d63}\x{0d66}-\x{0d6f}\x{0d82}\x{0d83}\x{0dca}\x{0dcf}-\x{0dd4}\x{0dd6}\x{0dd8}-\x{0ddf}\x{0df2}\x{0df3}\x{0e31}\x{0e34}-\x{0e3a}\x{0e47}-\x{0e4e}\x{0e50}-\x{0e59}\x{0eb1}\x{0eb4}-\x{0eb9}\x{0ebb}\x{0ebc}\x{0ec8}-\x{0ecd}\x{0ed0}-\x{0ed9}\x{0f18}\x{0f19}\x{0f20}-\x{0f29}\x{0f35}\x{0f37}\x{0f39}\x{0f3e}\x{0f3f}\x{0f71}-\x{0f84}\x{0f86}\x{0f87}\x{0f8d}-\x{0f97}\x{0f99}-\x{0fbc}\x{0fc6}\x{102b}-\x{103e}\x{1040}-\x{1049}\x{1056}-\x{1059}\x{105e}-\x{1060}\x{1062}-\x{1064}\x{1067}-\x{106d}\x{1071}-\x{1074}\x{1082}-\x{108d}\x{108f}-\x{109d}\x{135d}-\x{135f}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}\x{1753}\x{1772}\x{1773}\x{17b4}-\x{17d3}\x{17dd}\x{17e0}-\x{17e9}\x{180b}-\x{180d}\x{1810}-\x{1819}\x{18a9}\x{1920}-\x{192b}\x{1930}-\x{193b}\x{1946}-\x{194f}\x{19b0}-\x{19c0}\x{19c8}\x{19c9}\x{19d0}-\x{19d9}\x{1a17}-\x{1a1b}\x{1a55}-\x{1a5e}\x{1a60}-\x{1a7c}\x{1a7f}-\x{1a89}\x{1a90}-\x{1a99}\x{1b00}-\x{1b04}\x{1b34}-\x{1b44}\x{1b50}-\x{1b59}\x{1b6b}-\x{1b73}\x{1b80}-\x{1b82}\x{1ba1}-\x{1bad}\x{1bb0}-\x{1bb9}\x{1be6}-\x{1bf3}\x{1c24}-\x{1c37}\x{1c40}-\x{1c49}\x{1c50}-\x{1c59}\x{1cd0}-\x{1cd2}\x{1cd4}-\x{1ce8}\x{1ced}\x{1cf2}-\x{1cf4}\x{1dc0}-\x{1de6}\x{1dfc}-\x{1dff}\x{200c}\x{200d}\x{203f}\x{2040}\x{2054}\x{20d0}-\x{20dc}\x{20e1}\x{20e5}-\x{20f0}\x{2cef}-\x{2cf1}\x{2d7f}\x{2de0}-\x{2dff}\x{302a}-\x{302f}\x{3099}\x{309a}\x{a620}-\x{a629}\x{a66f}\x{a674}-\x{a67d}\x{a69f}\x{a6f0}\x{a6f1}\x{a802}\x{a806}\x{a80b}\x{a823}-\x{a827}\x{a880}\x{a881}\x{a8b4}-\x{a8c4}\x{a8d0}-\x{a8d9}\x{a8e0}-\x{a8f1}\x{a900}-\x{a909}\x{a926}-\x{a92d}\x{a947}-\x{a953}\x{a980}-\x{a983}\x{a9b3}-\x{a9c0}\x{a9d0}-\x{a9d9}\x{aa29}-\x{aa36}\x{aa43}\x{aa4c}\x{aa4d}\x{aa50}-\x{aa59}\x{aa7b}\x{aab0}\x{aab2}-\x{aab4}\x{aab7}\x{aab8}\x{aabe}\x{aabf}\x{aac1}\x{aaeb}-\x{aaef}\x{aaf5}\x{aaf6}\x{abe3}-\x{abea}\x{abec}\x{abed}\x{abf0}-\x{abf9}\x{fb1e}\x{fe00}-\x{fe0f}\x{fe20}-\x{fe26}\x{fe33}\x{fe34}\x{fe4d}-\x{fe4f}\x{ff10}-\x{ff19}\x{ff3f}]*\b';
26
-
27
-    /**
28
-     * Full list of JavaScript reserved words.
29
-     * Will be loaded from /data/js/keywords_reserved.txt.
30
-     *
31
-     * @see https://mathiasbynens.be/notes/reserved-keywords
32
-     *
33
-     * @var string[]
34
-     */
35
-    protected $keywordsReserved = array();
36
-
37
-    /**
38
-     * List of JavaScript reserved words that accept a <variable, value, ...>
39
-     * after them. Some end of lines are not the end of a statement, like with
40
-     * these keywords.
41
-     *
42
-     * E.g.: we shouldn't insert a ; after this else
43
-     * else
44
-     *     console.log('this is quite fine')
45
-     *
46
-     * Will be loaded from /data/js/keywords_before.txt
47
-     *
48
-     * @var string[]
49
-     */
50
-    protected $keywordsBefore = array();
51
-
52
-    /**
53
-     * List of JavaScript reserved words that accept a <variable, value, ...>
54
-     * before them. Some end of lines are not the end of a statement, like when
55
-     * continued by one of these keywords on the newline.
56
-     *
57
-     * E.g.: we shouldn't insert a ; before this instanceof
58
-     * variable
59
-     *     instanceof String
60
-     *
61
-     * Will be loaded from /data/js/keywords_after.txt
62
-     *
63
-     * @var string[]
64
-     */
65
-    protected $keywordsAfter = array();
66
-
67
-    /**
68
-     * List of JavaScript operators that accept a <variable, value, ...> after
69
-     * them. Some end of lines are not the end of a statement, like with these
70
-     * operators.
71
-     *
72
-     * Note: Most operators are fine, we've only removed !, ++ and --.
73
-     * There can't be a newline separating ! and whatever it is negating.
74
-     * ++ & -- have to be joined with the value they're in-/decrementing.
75
-     *
76
-     * Will be loaded from /data/js/operators_before.txt
77
-     *
78
-     * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators
79
-     *
80
-     * @var string[]
81
-     */
82
-    protected $operatorsBefore = array();
83
-
84
-    /**
85
-     * List of JavaScript operators that accept a <variable, value, ...> before
86
-     * them. Some end of lines are not the end of a statement, like when
87
-     * continued by one of these operators on the newline.
88
-     *
89
-     * Note: Most operators are fine, we've only removed ), ], ++ and --.
90
-     * ++ & -- have to be joined with the value they're in-/decrementing.
91
-     * ) & ] are "special" in that they have lots or usecases. () for example
92
-     * is used for function calls, for grouping, in if () and for (), ...
93
-     *
94
-     * Will be loaded from /data/js/operators_after.txt
95
-     *
96
-     * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators
97
-     *
98
-     * @var string[]
99
-     */
100
-    protected $operatorsAfter = array();
101
-
102
-    /**
103
-     * {@inheritdoc}
104
-     */
105
-    public function __construct()
106
-    {
107
-        call_user_func_array(array('parent', '__construct'), func_get_args());
108
-
109
-        $dataDir = __DIR__.'/../data/js/';
110
-        $options = FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES;
111
-        $this->keywordsReserved = file($dataDir.'keywords_reserved.txt', $options);
112
-        $this->keywordsBefore = file($dataDir.'keywords_before.txt', $options);
113
-        $this->keywordsAfter = file($dataDir.'keywords_after.txt', $options);
114
-        $this->operatorsBefore = file($dataDir.'operators_before.txt', $options);
115
-        $this->operatorsAfter = file($dataDir.'operators_after.txt', $options);
116
-    }
117
-
118
-    /**
119
-     * Minify the data.
120
-     * Perform JS optimizations.
121
-     *
122
-     * @param string[optional] $path Path to write the data to.
123
-     *
124
-     * @return string The minified data.
125
-     */
126
-    public function execute($path = null)
127
-    {
128
-        $content = '';
129
-
130
-        // loop files
131
-        foreach ($this->data as $source => $js) {
132
-            /*
17
+	/**
18
+	 * Var-matching regex based on http://stackoverflow.com/a/9337047/802993.
19
+	 *
20
+	 * Note that regular expressions using that bit must have the PCRE_UTF8
21
+	 * pattern modifier (/u) set.
22
+	 *
23
+	 * @var string
24
+	 */
25
+	const REGEX_VARIABLE = '\b[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\x{02c1}\x{02c6}-\x{02d1}\x{02e0}-\x{02e4}\x{02ec}\x{02ee}\x{0370}-\x{0374}\x{0376}\x{0377}\x{037a}-\x{037d}\x{0386}\x{0388}-\x{038a}\x{038c}\x{038e}-\x{03a1}\x{03a3}-\x{03f5}\x{03f7}-\x{0481}\x{048a}-\x{0527}\x{0531}-\x{0556}\x{0559}\x{0561}-\x{0587}\x{05d0}-\x{05ea}\x{05f0}-\x{05f2}\x{0620}-\x{064a}\x{066e}\x{066f}\x{0671}-\x{06d3}\x{06d5}\x{06e5}\x{06e6}\x{06ee}\x{06ef}\x{06fa}-\x{06fc}\x{06ff}\x{0710}\x{0712}-\x{072f}\x{074d}-\x{07a5}\x{07b1}\x{07ca}-\x{07ea}\x{07f4}\x{07f5}\x{07fa}\x{0800}-\x{0815}\x{081a}\x{0824}\x{0828}\x{0840}-\x{0858}\x{08a0}\x{08a2}-\x{08ac}\x{0904}-\x{0939}\x{093d}\x{0950}\x{0958}-\x{0961}\x{0971}-\x{0977}\x{0979}-\x{097f}\x{0985}-\x{098c}\x{098f}\x{0990}\x{0993}-\x{09a8}\x{09aa}-\x{09b0}\x{09b2}\x{09b6}-\x{09b9}\x{09bd}\x{09ce}\x{09dc}\x{09dd}\x{09df}-\x{09e1}\x{09f0}\x{09f1}\x{0a05}-\x{0a0a}\x{0a0f}\x{0a10}\x{0a13}-\x{0a28}\x{0a2a}-\x{0a30}\x{0a32}\x{0a33}\x{0a35}\x{0a36}\x{0a38}\x{0a39}\x{0a59}-\x{0a5c}\x{0a5e}\x{0a72}-\x{0a74}\x{0a85}-\x{0a8d}\x{0a8f}-\x{0a91}\x{0a93}-\x{0aa8}\x{0aaa}-\x{0ab0}\x{0ab2}\x{0ab3}\x{0ab5}-\x{0ab9}\x{0abd}\x{0ad0}\x{0ae0}\x{0ae1}\x{0b05}-\x{0b0c}\x{0b0f}\x{0b10}\x{0b13}-\x{0b28}\x{0b2a}-\x{0b30}\x{0b32}\x{0b33}\x{0b35}-\x{0b39}\x{0b3d}\x{0b5c}\x{0b5d}\x{0b5f}-\x{0b61}\x{0b71}\x{0b83}\x{0b85}-\x{0b8a}\x{0b8e}-\x{0b90}\x{0b92}-\x{0b95}\x{0b99}\x{0b9a}\x{0b9c}\x{0b9e}\x{0b9f}\x{0ba3}\x{0ba4}\x{0ba8}-\x{0baa}\x{0bae}-\x{0bb9}\x{0bd0}\x{0c05}-\x{0c0c}\x{0c0e}-\x{0c10}\x{0c12}-\x{0c28}\x{0c2a}-\x{0c33}\x{0c35}-\x{0c39}\x{0c3d}\x{0c58}\x{0c59}\x{0c60}\x{0c61}\x{0c85}-\x{0c8c}\x{0c8e}-\x{0c90}\x{0c92}-\x{0ca8}\x{0caa}-\x{0cb3}\x{0cb5}-\x{0cb9}\x{0cbd}\x{0cde}\x{0ce0}\x{0ce1}\x{0cf1}\x{0cf2}\x{0d05}-\x{0d0c}\x{0d0e}-\x{0d10}\x{0d12}-\x{0d3a}\x{0d3d}\x{0d4e}\x{0d60}\x{0d61}\x{0d7a}-\x{0d7f}\x{0d85}-\x{0d96}\x{0d9a}-\x{0db1}\x{0db3}-\x{0dbb}\x{0dbd}\x{0dc0}-\x{0dc6}\x{0e01}-\x{0e30}\x{0e32}\x{0e33}\x{0e40}-\x{0e46}\x{0e81}\x{0e82}\x{0e84}\x{0e87}\x{0e88}\x{0e8a}\x{0e8d}\x{0e94}-\x{0e97}\x{0e99}-\x{0e9f}\x{0ea1}-\x{0ea3}\x{0ea5}\x{0ea7}\x{0eaa}\x{0eab}\x{0ead}-\x{0eb0}\x{0eb2}\x{0eb3}\x{0ebd}\x{0ec0}-\x{0ec4}\x{0ec6}\x{0edc}-\x{0edf}\x{0f00}\x{0f40}-\x{0f47}\x{0f49}-\x{0f6c}\x{0f88}-\x{0f8c}\x{1000}-\x{102a}\x{103f}\x{1050}-\x{1055}\x{105a}-\x{105d}\x{1061}\x{1065}\x{1066}\x{106e}-\x{1070}\x{1075}-\x{1081}\x{108e}\x{10a0}-\x{10c5}\x{10c7}\x{10cd}\x{10d0}-\x{10fa}\x{10fc}-\x{1248}\x{124a}-\x{124d}\x{1250}-\x{1256}\x{1258}\x{125a}-\x{125d}\x{1260}-\x{1288}\x{128a}-\x{128d}\x{1290}-\x{12b0}\x{12b2}-\x{12b5}\x{12b8}-\x{12be}\x{12c0}\x{12c2}-\x{12c5}\x{12c8}-\x{12d6}\x{12d8}-\x{1310}\x{1312}-\x{1315}\x{1318}-\x{135a}\x{1380}-\x{138f}\x{13a0}-\x{13f4}\x{1401}-\x{166c}\x{166f}-\x{167f}\x{1681}-\x{169a}\x{16a0}-\x{16ea}\x{16ee}-\x{16f0}\x{1700}-\x{170c}\x{170e}-\x{1711}\x{1720}-\x{1731}\x{1740}-\x{1751}\x{1760}-\x{176c}\x{176e}-\x{1770}\x{1780}-\x{17b3}\x{17d7}\x{17dc}\x{1820}-\x{1877}\x{1880}-\x{18a8}\x{18aa}\x{18b0}-\x{18f5}\x{1900}-\x{191c}\x{1950}-\x{196d}\x{1970}-\x{1974}\x{1980}-\x{19ab}\x{19c1}-\x{19c7}\x{1a00}-\x{1a16}\x{1a20}-\x{1a54}\x{1aa7}\x{1b05}-\x{1b33}\x{1b45}-\x{1b4b}\x{1b83}-\x{1ba0}\x{1bae}\x{1baf}\x{1bba}-\x{1be5}\x{1c00}-\x{1c23}\x{1c4d}-\x{1c4f}\x{1c5a}-\x{1c7d}\x{1ce9}-\x{1cec}\x{1cee}-\x{1cf1}\x{1cf5}\x{1cf6}\x{1d00}-\x{1dbf}\x{1e00}-\x{1f15}\x{1f18}-\x{1f1d}\x{1f20}-\x{1f45}\x{1f48}-\x{1f4d}\x{1f50}-\x{1f57}\x{1f59}\x{1f5b}\x{1f5d}\x{1f5f}-\x{1f7d}\x{1f80}-\x{1fb4}\x{1fb6}-\x{1fbc}\x{1fbe}\x{1fc2}-\x{1fc4}\x{1fc6}-\x{1fcc}\x{1fd0}-\x{1fd3}\x{1fd6}-\x{1fdb}\x{1fe0}-\x{1fec}\x{1ff2}-\x{1ff4}\x{1ff6}-\x{1ffc}\x{2071}\x{207f}\x{2090}-\x{209c}\x{2102}\x{2107}\x{210a}-\x{2113}\x{2115}\x{2119}-\x{211d}\x{2124}\x{2126}\x{2128}\x{212a}-\x{212d}\x{212f}-\x{2139}\x{213c}-\x{213f}\x{2145}-\x{2149}\x{214e}\x{2160}-\x{2188}\x{2c00}-\x{2c2e}\x{2c30}-\x{2c5e}\x{2c60}-\x{2ce4}\x{2ceb}-\x{2cee}\x{2cf2}\x{2cf3}\x{2d00}-\x{2d25}\x{2d27}\x{2d2d}\x{2d30}-\x{2d67}\x{2d6f}\x{2d80}-\x{2d96}\x{2da0}-\x{2da6}\x{2da8}-\x{2dae}\x{2db0}-\x{2db6}\x{2db8}-\x{2dbe}\x{2dc0}-\x{2dc6}\x{2dc8}-\x{2dce}\x{2dd0}-\x{2dd6}\x{2dd8}-\x{2dde}\x{2e2f}\x{3005}-\x{3007}\x{3021}-\x{3029}\x{3031}-\x{3035}\x{3038}-\x{303c}\x{3041}-\x{3096}\x{309d}-\x{309f}\x{30a1}-\x{30fa}\x{30fc}-\x{30ff}\x{3105}-\x{312d}\x{3131}-\x{318e}\x{31a0}-\x{31ba}\x{31f0}-\x{31ff}\x{3400}-\x{4db5}\x{4e00}-\x{9fcc}\x{a000}-\x{a48c}\x{a4d0}-\x{a4fd}\x{a500}-\x{a60c}\x{a610}-\x{a61f}\x{a62a}\x{a62b}\x{a640}-\x{a66e}\x{a67f}-\x{a697}\x{a6a0}-\x{a6ef}\x{a717}-\x{a71f}\x{a722}-\x{a788}\x{a78b}-\x{a78e}\x{a790}-\x{a793}\x{a7a0}-\x{a7aa}\x{a7f8}-\x{a801}\x{a803}-\x{a805}\x{a807}-\x{a80a}\x{a80c}-\x{a822}\x{a840}-\x{a873}\x{a882}-\x{a8b3}\x{a8f2}-\x{a8f7}\x{a8fb}\x{a90a}-\x{a925}\x{a930}-\x{a946}\x{a960}-\x{a97c}\x{a984}-\x{a9b2}\x{a9cf}\x{aa00}-\x{aa28}\x{aa40}-\x{aa42}\x{aa44}-\x{aa4b}\x{aa60}-\x{aa76}\x{aa7a}\x{aa80}-\x{aaaf}\x{aab1}\x{aab5}\x{aab6}\x{aab9}-\x{aabd}\x{aac0}\x{aac2}\x{aadb}-\x{aadd}\x{aae0}-\x{aaea}\x{aaf2}-\x{aaf4}\x{ab01}-\x{ab06}\x{ab09}-\x{ab0e}\x{ab11}-\x{ab16}\x{ab20}-\x{ab26}\x{ab28}-\x{ab2e}\x{abc0}-\x{abe2}\x{ac00}-\x{d7a3}\x{d7b0}-\x{d7c6}\x{d7cb}-\x{d7fb}\x{f900}-\x{fa6d}\x{fa70}-\x{fad9}\x{fb00}-\x{fb06}\x{fb13}-\x{fb17}\x{fb1d}\x{fb1f}-\x{fb28}\x{fb2a}-\x{fb36}\x{fb38}-\x{fb3c}\x{fb3e}\x{fb40}\x{fb41}\x{fb43}\x{fb44}\x{fb46}-\x{fbb1}\x{fbd3}-\x{fd3d}\x{fd50}-\x{fd8f}\x{fd92}-\x{fdc7}\x{fdf0}-\x{fdfb}\x{fe70}-\x{fe74}\x{fe76}-\x{fefc}\x{ff21}-\x{ff3a}\x{ff41}-\x{ff5a}\x{ff66}-\x{ffbe}\x{ffc2}-\x{ffc7}\x{ffca}-\x{ffcf}\x{ffd2}-\x{ffd7}\x{ffda}-\x{ffdc}][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\x{02c1}\x{02c6}-\x{02d1}\x{02e0}-\x{02e4}\x{02ec}\x{02ee}\x{0370}-\x{0374}\x{0376}\x{0377}\x{037a}-\x{037d}\x{0386}\x{0388}-\x{038a}\x{038c}\x{038e}-\x{03a1}\x{03a3}-\x{03f5}\x{03f7}-\x{0481}\x{048a}-\x{0527}\x{0531}-\x{0556}\x{0559}\x{0561}-\x{0587}\x{05d0}-\x{05ea}\x{05f0}-\x{05f2}\x{0620}-\x{064a}\x{066e}\x{066f}\x{0671}-\x{06d3}\x{06d5}\x{06e5}\x{06e6}\x{06ee}\x{06ef}\x{06fa}-\x{06fc}\x{06ff}\x{0710}\x{0712}-\x{072f}\x{074d}-\x{07a5}\x{07b1}\x{07ca}-\x{07ea}\x{07f4}\x{07f5}\x{07fa}\x{0800}-\x{0815}\x{081a}\x{0824}\x{0828}\x{0840}-\x{0858}\x{08a0}\x{08a2}-\x{08ac}\x{0904}-\x{0939}\x{093d}\x{0950}\x{0958}-\x{0961}\x{0971}-\x{0977}\x{0979}-\x{097f}\x{0985}-\x{098c}\x{098f}\x{0990}\x{0993}-\x{09a8}\x{09aa}-\x{09b0}\x{09b2}\x{09b6}-\x{09b9}\x{09bd}\x{09ce}\x{09dc}\x{09dd}\x{09df}-\x{09e1}\x{09f0}\x{09f1}\x{0a05}-\x{0a0a}\x{0a0f}\x{0a10}\x{0a13}-\x{0a28}\x{0a2a}-\x{0a30}\x{0a32}\x{0a33}\x{0a35}\x{0a36}\x{0a38}\x{0a39}\x{0a59}-\x{0a5c}\x{0a5e}\x{0a72}-\x{0a74}\x{0a85}-\x{0a8d}\x{0a8f}-\x{0a91}\x{0a93}-\x{0aa8}\x{0aaa}-\x{0ab0}\x{0ab2}\x{0ab3}\x{0ab5}-\x{0ab9}\x{0abd}\x{0ad0}\x{0ae0}\x{0ae1}\x{0b05}-\x{0b0c}\x{0b0f}\x{0b10}\x{0b13}-\x{0b28}\x{0b2a}-\x{0b30}\x{0b32}\x{0b33}\x{0b35}-\x{0b39}\x{0b3d}\x{0b5c}\x{0b5d}\x{0b5f}-\x{0b61}\x{0b71}\x{0b83}\x{0b85}-\x{0b8a}\x{0b8e}-\x{0b90}\x{0b92}-\x{0b95}\x{0b99}\x{0b9a}\x{0b9c}\x{0b9e}\x{0b9f}\x{0ba3}\x{0ba4}\x{0ba8}-\x{0baa}\x{0bae}-\x{0bb9}\x{0bd0}\x{0c05}-\x{0c0c}\x{0c0e}-\x{0c10}\x{0c12}-\x{0c28}\x{0c2a}-\x{0c33}\x{0c35}-\x{0c39}\x{0c3d}\x{0c58}\x{0c59}\x{0c60}\x{0c61}\x{0c85}-\x{0c8c}\x{0c8e}-\x{0c90}\x{0c92}-\x{0ca8}\x{0caa}-\x{0cb3}\x{0cb5}-\x{0cb9}\x{0cbd}\x{0cde}\x{0ce0}\x{0ce1}\x{0cf1}\x{0cf2}\x{0d05}-\x{0d0c}\x{0d0e}-\x{0d10}\x{0d12}-\x{0d3a}\x{0d3d}\x{0d4e}\x{0d60}\x{0d61}\x{0d7a}-\x{0d7f}\x{0d85}-\x{0d96}\x{0d9a}-\x{0db1}\x{0db3}-\x{0dbb}\x{0dbd}\x{0dc0}-\x{0dc6}\x{0e01}-\x{0e30}\x{0e32}\x{0e33}\x{0e40}-\x{0e46}\x{0e81}\x{0e82}\x{0e84}\x{0e87}\x{0e88}\x{0e8a}\x{0e8d}\x{0e94}-\x{0e97}\x{0e99}-\x{0e9f}\x{0ea1}-\x{0ea3}\x{0ea5}\x{0ea7}\x{0eaa}\x{0eab}\x{0ead}-\x{0eb0}\x{0eb2}\x{0eb3}\x{0ebd}\x{0ec0}-\x{0ec4}\x{0ec6}\x{0edc}-\x{0edf}\x{0f00}\x{0f40}-\x{0f47}\x{0f49}-\x{0f6c}\x{0f88}-\x{0f8c}\x{1000}-\x{102a}\x{103f}\x{1050}-\x{1055}\x{105a}-\x{105d}\x{1061}\x{1065}\x{1066}\x{106e}-\x{1070}\x{1075}-\x{1081}\x{108e}\x{10a0}-\x{10c5}\x{10c7}\x{10cd}\x{10d0}-\x{10fa}\x{10fc}-\x{1248}\x{124a}-\x{124d}\x{1250}-\x{1256}\x{1258}\x{125a}-\x{125d}\x{1260}-\x{1288}\x{128a}-\x{128d}\x{1290}-\x{12b0}\x{12b2}-\x{12b5}\x{12b8}-\x{12be}\x{12c0}\x{12c2}-\x{12c5}\x{12c8}-\x{12d6}\x{12d8}-\x{1310}\x{1312}-\x{1315}\x{1318}-\x{135a}\x{1380}-\x{138f}\x{13a0}-\x{13f4}\x{1401}-\x{166c}\x{166f}-\x{167f}\x{1681}-\x{169a}\x{16a0}-\x{16ea}\x{16ee}-\x{16f0}\x{1700}-\x{170c}\x{170e}-\x{1711}\x{1720}-\x{1731}\x{1740}-\x{1751}\x{1760}-\x{176c}\x{176e}-\x{1770}\x{1780}-\x{17b3}\x{17d7}\x{17dc}\x{1820}-\x{1877}\x{1880}-\x{18a8}\x{18aa}\x{18b0}-\x{18f5}\x{1900}-\x{191c}\x{1950}-\x{196d}\x{1970}-\x{1974}\x{1980}-\x{19ab}\x{19c1}-\x{19c7}\x{1a00}-\x{1a16}\x{1a20}-\x{1a54}\x{1aa7}\x{1b05}-\x{1b33}\x{1b45}-\x{1b4b}\x{1b83}-\x{1ba0}\x{1bae}\x{1baf}\x{1bba}-\x{1be5}\x{1c00}-\x{1c23}\x{1c4d}-\x{1c4f}\x{1c5a}-\x{1c7d}\x{1ce9}-\x{1cec}\x{1cee}-\x{1cf1}\x{1cf5}\x{1cf6}\x{1d00}-\x{1dbf}\x{1e00}-\x{1f15}\x{1f18}-\x{1f1d}\x{1f20}-\x{1f45}\x{1f48}-\x{1f4d}\x{1f50}-\x{1f57}\x{1f59}\x{1f5b}\x{1f5d}\x{1f5f}-\x{1f7d}\x{1f80}-\x{1fb4}\x{1fb6}-\x{1fbc}\x{1fbe}\x{1fc2}-\x{1fc4}\x{1fc6}-\x{1fcc}\x{1fd0}-\x{1fd3}\x{1fd6}-\x{1fdb}\x{1fe0}-\x{1fec}\x{1ff2}-\x{1ff4}\x{1ff6}-\x{1ffc}\x{2071}\x{207f}\x{2090}-\x{209c}\x{2102}\x{2107}\x{210a}-\x{2113}\x{2115}\x{2119}-\x{211d}\x{2124}\x{2126}\x{2128}\x{212a}-\x{212d}\x{212f}-\x{2139}\x{213c}-\x{213f}\x{2145}-\x{2149}\x{214e}\x{2160}-\x{2188}\x{2c00}-\x{2c2e}\x{2c30}-\x{2c5e}\x{2c60}-\x{2ce4}\x{2ceb}-\x{2cee}\x{2cf2}\x{2cf3}\x{2d00}-\x{2d25}\x{2d27}\x{2d2d}\x{2d30}-\x{2d67}\x{2d6f}\x{2d80}-\x{2d96}\x{2da0}-\x{2da6}\x{2da8}-\x{2dae}\x{2db0}-\x{2db6}\x{2db8}-\x{2dbe}\x{2dc0}-\x{2dc6}\x{2dc8}-\x{2dce}\x{2dd0}-\x{2dd6}\x{2dd8}-\x{2dde}\x{2e2f}\x{3005}-\x{3007}\x{3021}-\x{3029}\x{3031}-\x{3035}\x{3038}-\x{303c}\x{3041}-\x{3096}\x{309d}-\x{309f}\x{30a1}-\x{30fa}\x{30fc}-\x{30ff}\x{3105}-\x{312d}\x{3131}-\x{318e}\x{31a0}-\x{31ba}\x{31f0}-\x{31ff}\x{3400}-\x{4db5}\x{4e00}-\x{9fcc}\x{a000}-\x{a48c}\x{a4d0}-\x{a4fd}\x{a500}-\x{a60c}\x{a610}-\x{a61f}\x{a62a}\x{a62b}\x{a640}-\x{a66e}\x{a67f}-\x{a697}\x{a6a0}-\x{a6ef}\x{a717}-\x{a71f}\x{a722}-\x{a788}\x{a78b}-\x{a78e}\x{a790}-\x{a793}\x{a7a0}-\x{a7aa}\x{a7f8}-\x{a801}\x{a803}-\x{a805}\x{a807}-\x{a80a}\x{a80c}-\x{a822}\x{a840}-\x{a873}\x{a882}-\x{a8b3}\x{a8f2}-\x{a8f7}\x{a8fb}\x{a90a}-\x{a925}\x{a930}-\x{a946}\x{a960}-\x{a97c}\x{a984}-\x{a9b2}\x{a9cf}\x{aa00}-\x{aa28}\x{aa40}-\x{aa42}\x{aa44}-\x{aa4b}\x{aa60}-\x{aa76}\x{aa7a}\x{aa80}-\x{aaaf}\x{aab1}\x{aab5}\x{aab6}\x{aab9}-\x{aabd}\x{aac0}\x{aac2}\x{aadb}-\x{aadd}\x{aae0}-\x{aaea}\x{aaf2}-\x{aaf4}\x{ab01}-\x{ab06}\x{ab09}-\x{ab0e}\x{ab11}-\x{ab16}\x{ab20}-\x{ab26}\x{ab28}-\x{ab2e}\x{abc0}-\x{abe2}\x{ac00}-\x{d7a3}\x{d7b0}-\x{d7c6}\x{d7cb}-\x{d7fb}\x{f900}-\x{fa6d}\x{fa70}-\x{fad9}\x{fb00}-\x{fb06}\x{fb13}-\x{fb17}\x{fb1d}\x{fb1f}-\x{fb28}\x{fb2a}-\x{fb36}\x{fb38}-\x{fb3c}\x{fb3e}\x{fb40}\x{fb41}\x{fb43}\x{fb44}\x{fb46}-\x{fbb1}\x{fbd3}-\x{fd3d}\x{fd50}-\x{fd8f}\x{fd92}-\x{fdc7}\x{fdf0}-\x{fdfb}\x{fe70}-\x{fe74}\x{fe76}-\x{fefc}\x{ff21}-\x{ff3a}\x{ff41}-\x{ff5a}\x{ff66}-\x{ffbe}\x{ffc2}-\x{ffc7}\x{ffca}-\x{ffcf}\x{ffd2}-\x{ffd7}\x{ffda}-\x{ffdc}0-9\x{0300}-\x{036f}\x{0483}-\x{0487}\x{0591}-\x{05bd}\x{05bf}\x{05c1}\x{05c2}\x{05c4}\x{05c5}\x{05c7}\x{0610}-\x{061a}\x{064b}-\x{0669}\x{0670}\x{06d6}-\x{06dc}\x{06df}-\x{06e4}\x{06e7}\x{06e8}\x{06ea}-\x{06ed}\x{06f0}-\x{06f9}\x{0711}\x{0730}-\x{074a}\x{07a6}-\x{07b0}\x{07c0}-\x{07c9}\x{07eb}-\x{07f3}\x{0816}-\x{0819}\x{081b}-\x{0823}\x{0825}-\x{0827}\x{0829}-\x{082d}\x{0859}-\x{085b}\x{08e4}-\x{08fe}\x{0900}-\x{0903}\x{093a}-\x{093c}\x{093e}-\x{094f}\x{0951}-\x{0957}\x{0962}\x{0963}\x{0966}-\x{096f}\x{0981}-\x{0983}\x{09bc}\x{09be}-\x{09c4}\x{09c7}\x{09c8}\x{09cb}-\x{09cd}\x{09d7}\x{09e2}\x{09e3}\x{09e6}-\x{09ef}\x{0a01}-\x{0a03}\x{0a3c}\x{0a3e}-\x{0a42}\x{0a47}\x{0a48}\x{0a4b}-\x{0a4d}\x{0a51}\x{0a66}-\x{0a71}\x{0a75}\x{0a81}-\x{0a83}\x{0abc}\x{0abe}-\x{0ac5}\x{0ac7}-\x{0ac9}\x{0acb}-\x{0acd}\x{0ae2}\x{0ae3}\x{0ae6}-\x{0aef}\x{0b01}-\x{0b03}\x{0b3c}\x{0b3e}-\x{0b44}\x{0b47}\x{0b48}\x{0b4b}-\x{0b4d}\x{0b56}\x{0b57}\x{0b62}\x{0b63}\x{0b66}-\x{0b6f}\x{0b82}\x{0bbe}-\x{0bc2}\x{0bc6}-\x{0bc8}\x{0bca}-\x{0bcd}\x{0bd7}\x{0be6}-\x{0bef}\x{0c01}-\x{0c03}\x{0c3e}-\x{0c44}\x{0c46}-\x{0c48}\x{0c4a}-\x{0c4d}\x{0c55}\x{0c56}\x{0c62}\x{0c63}\x{0c66}-\x{0c6f}\x{0c82}\x{0c83}\x{0cbc}\x{0cbe}-\x{0cc4}\x{0cc6}-\x{0cc8}\x{0cca}-\x{0ccd}\x{0cd5}\x{0cd6}\x{0ce2}\x{0ce3}\x{0ce6}-\x{0cef}\x{0d02}\x{0d03}\x{0d3e}-\x{0d44}\x{0d46}-\x{0d48}\x{0d4a}-\x{0d4d}\x{0d57}\x{0d62}\x{0d63}\x{0d66}-\x{0d6f}\x{0d82}\x{0d83}\x{0dca}\x{0dcf}-\x{0dd4}\x{0dd6}\x{0dd8}-\x{0ddf}\x{0df2}\x{0df3}\x{0e31}\x{0e34}-\x{0e3a}\x{0e47}-\x{0e4e}\x{0e50}-\x{0e59}\x{0eb1}\x{0eb4}-\x{0eb9}\x{0ebb}\x{0ebc}\x{0ec8}-\x{0ecd}\x{0ed0}-\x{0ed9}\x{0f18}\x{0f19}\x{0f20}-\x{0f29}\x{0f35}\x{0f37}\x{0f39}\x{0f3e}\x{0f3f}\x{0f71}-\x{0f84}\x{0f86}\x{0f87}\x{0f8d}-\x{0f97}\x{0f99}-\x{0fbc}\x{0fc6}\x{102b}-\x{103e}\x{1040}-\x{1049}\x{1056}-\x{1059}\x{105e}-\x{1060}\x{1062}-\x{1064}\x{1067}-\x{106d}\x{1071}-\x{1074}\x{1082}-\x{108d}\x{108f}-\x{109d}\x{135d}-\x{135f}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}\x{1753}\x{1772}\x{1773}\x{17b4}-\x{17d3}\x{17dd}\x{17e0}-\x{17e9}\x{180b}-\x{180d}\x{1810}-\x{1819}\x{18a9}\x{1920}-\x{192b}\x{1930}-\x{193b}\x{1946}-\x{194f}\x{19b0}-\x{19c0}\x{19c8}\x{19c9}\x{19d0}-\x{19d9}\x{1a17}-\x{1a1b}\x{1a55}-\x{1a5e}\x{1a60}-\x{1a7c}\x{1a7f}-\x{1a89}\x{1a90}-\x{1a99}\x{1b00}-\x{1b04}\x{1b34}-\x{1b44}\x{1b50}-\x{1b59}\x{1b6b}-\x{1b73}\x{1b80}-\x{1b82}\x{1ba1}-\x{1bad}\x{1bb0}-\x{1bb9}\x{1be6}-\x{1bf3}\x{1c24}-\x{1c37}\x{1c40}-\x{1c49}\x{1c50}-\x{1c59}\x{1cd0}-\x{1cd2}\x{1cd4}-\x{1ce8}\x{1ced}\x{1cf2}-\x{1cf4}\x{1dc0}-\x{1de6}\x{1dfc}-\x{1dff}\x{200c}\x{200d}\x{203f}\x{2040}\x{2054}\x{20d0}-\x{20dc}\x{20e1}\x{20e5}-\x{20f0}\x{2cef}-\x{2cf1}\x{2d7f}\x{2de0}-\x{2dff}\x{302a}-\x{302f}\x{3099}\x{309a}\x{a620}-\x{a629}\x{a66f}\x{a674}-\x{a67d}\x{a69f}\x{a6f0}\x{a6f1}\x{a802}\x{a806}\x{a80b}\x{a823}-\x{a827}\x{a880}\x{a881}\x{a8b4}-\x{a8c4}\x{a8d0}-\x{a8d9}\x{a8e0}-\x{a8f1}\x{a900}-\x{a909}\x{a926}-\x{a92d}\x{a947}-\x{a953}\x{a980}-\x{a983}\x{a9b3}-\x{a9c0}\x{a9d0}-\x{a9d9}\x{aa29}-\x{aa36}\x{aa43}\x{aa4c}\x{aa4d}\x{aa50}-\x{aa59}\x{aa7b}\x{aab0}\x{aab2}-\x{aab4}\x{aab7}\x{aab8}\x{aabe}\x{aabf}\x{aac1}\x{aaeb}-\x{aaef}\x{aaf5}\x{aaf6}\x{abe3}-\x{abea}\x{abec}\x{abed}\x{abf0}-\x{abf9}\x{fb1e}\x{fe00}-\x{fe0f}\x{fe20}-\x{fe26}\x{fe33}\x{fe34}\x{fe4d}-\x{fe4f}\x{ff10}-\x{ff19}\x{ff3f}]*\b';
26
+
27
+	/**
28
+	 * Full list of JavaScript reserved words.
29
+	 * Will be loaded from /data/js/keywords_reserved.txt.
30
+	 *
31
+	 * @see https://mathiasbynens.be/notes/reserved-keywords
32
+	 *
33
+	 * @var string[]
34
+	 */
35
+	protected $keywordsReserved = array();
36
+
37
+	/**
38
+	 * List of JavaScript reserved words that accept a <variable, value, ...>
39
+	 * after them. Some end of lines are not the end of a statement, like with
40
+	 * these keywords.
41
+	 *
42
+	 * E.g.: we shouldn't insert a ; after this else
43
+	 * else
44
+	 *     console.log('this is quite fine')
45
+	 *
46
+	 * Will be loaded from /data/js/keywords_before.txt
47
+	 *
48
+	 * @var string[]
49
+	 */
50
+	protected $keywordsBefore = array();
51
+
52
+	/**
53
+	 * List of JavaScript reserved words that accept a <variable, value, ...>
54
+	 * before them. Some end of lines are not the end of a statement, like when
55
+	 * continued by one of these keywords on the newline.
56
+	 *
57
+	 * E.g.: we shouldn't insert a ; before this instanceof
58
+	 * variable
59
+	 *     instanceof String
60
+	 *
61
+	 * Will be loaded from /data/js/keywords_after.txt
62
+	 *
63
+	 * @var string[]
64
+	 */
65
+	protected $keywordsAfter = array();
66
+
67
+	/**
68
+	 * List of JavaScript operators that accept a <variable, value, ...> after
69
+	 * them. Some end of lines are not the end of a statement, like with these
70
+	 * operators.
71
+	 *
72
+	 * Note: Most operators are fine, we've only removed !, ++ and --.
73
+	 * There can't be a newline separating ! and whatever it is negating.
74
+	 * ++ & -- have to be joined with the value they're in-/decrementing.
75
+	 *
76
+	 * Will be loaded from /data/js/operators_before.txt
77
+	 *
78
+	 * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators
79
+	 *
80
+	 * @var string[]
81
+	 */
82
+	protected $operatorsBefore = array();
83
+
84
+	/**
85
+	 * List of JavaScript operators that accept a <variable, value, ...> before
86
+	 * them. Some end of lines are not the end of a statement, like when
87
+	 * continued by one of these operators on the newline.
88
+	 *
89
+	 * Note: Most operators are fine, we've only removed ), ], ++ and --.
90
+	 * ++ & -- have to be joined with the value they're in-/decrementing.
91
+	 * ) & ] are "special" in that they have lots or usecases. () for example
92
+	 * is used for function calls, for grouping, in if () and for (), ...
93
+	 *
94
+	 * Will be loaded from /data/js/operators_after.txt
95
+	 *
96
+	 * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators
97
+	 *
98
+	 * @var string[]
99
+	 */
100
+	protected $operatorsAfter = array();
101
+
102
+	/**
103
+	 * {@inheritdoc}
104
+	 */
105
+	public function __construct()
106
+	{
107
+		call_user_func_array(array('parent', '__construct'), func_get_args());
108
+
109
+		$dataDir = __DIR__.'/../data/js/';
110
+		$options = FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES;
111
+		$this->keywordsReserved = file($dataDir.'keywords_reserved.txt', $options);
112
+		$this->keywordsBefore = file($dataDir.'keywords_before.txt', $options);
113
+		$this->keywordsAfter = file($dataDir.'keywords_after.txt', $options);
114
+		$this->operatorsBefore = file($dataDir.'operators_before.txt', $options);
115
+		$this->operatorsAfter = file($dataDir.'operators_after.txt', $options);
116
+	}
117
+
118
+	/**
119
+	 * Minify the data.
120
+	 * Perform JS optimizations.
121
+	 *
122
+	 * @param string[optional] $path Path to write the data to.
123
+	 *
124
+	 * @return string The minified data.
125
+	 */
126
+	public function execute($path = null)
127
+	{
128
+		$content = '';
129
+
130
+		// loop files
131
+		foreach ($this->data as $source => $js) {
132
+			/*
133 133
              * Combine js: separating the scripts by a ;
134 134
              * I'm also adding a newline: it will be eaten when whitespace is
135 135
              * stripped, but we need to make sure we're not just appending
@@ -137,10 +137,10 @@  discard block
 block discarded – undo
137 137
              * singe-line comment on the last line (in which case it would also
138 138
              * be seen as part of that comment)
139 139
              */
140
-            $content .= $js."\n;";
141
-        }
140
+			$content .= $js."\n;";
141
+		}
142 142
 
143
-        /*
143
+		/*
144 144
          * Let's first take out strings, comments and regular expressions.
145 145
          * All of these can contain JS code-like characters, and we should make
146 146
          * sure any further magic ignores anything inside of these.
@@ -151,159 +151,159 @@  discard block
 block discarded – undo
151 151
          * Comments will be removed altogether, strings and regular expressions
152 152
          * will be replaced by placeholder text, which we'll restore later.
153 153
          */
154
-        $this->extractStrings('\'"`');
155
-        $this->stripComments();
156
-        $this->extractRegex();
157
-        $content = $this->replace($content);
154
+		$this->extractStrings('\'"`');
155
+		$this->stripComments();
156
+		$this->extractRegex();
157
+		$content = $this->replace($content);
158 158
 
159
-        $content = $this->stripWhitespace($content);
160
-        $content = $this->propertyNotation($content);
161
-        $content = $this->shortenBools($content);
159
+		$content = $this->stripWhitespace($content);
160
+		$content = $this->propertyNotation($content);
161
+		$content = $this->shortenBools($content);
162 162
 
163
-        /*
163
+		/*
164 164
          * Earlier, we extracted strings & regular expressions and replaced them
165 165
          * with placeholder text. This will restore them.
166 166
          */
167
-        $content = $this->restoreExtractedData($content);
168
-
169
-        return $content;
170
-    }
171
-
172
-    /**
173
-     * Strip comments from source code.
174
-     */
175
-    protected function stripComments()
176
-    {
177
-        // single-line comments
178
-        $this->registerPattern('/\/\/.*$/m', '');
179
-
180
-        // multi-line comments
181
-        $this->registerPattern('/\/\*.*?\*\//s', '');
182
-    }
183
-
184
-    /**
185
-     * JS can have /-delimited regular expressions, like: /ab+c/.match(string).
186
-     *
187
-     * The content inside the regex can contain characters that may be confused
188
-     * for JS code: e.g. it could contain whitespace it needs to match & we
189
-     * don't want to strip whitespace in there.
190
-     *
191
-     * The regex can be pretty simple: we don't have to care about comments,
192
-     * (which also use slashes) because stripComments() will have stripped those
193
-     * already.
194
-     *
195
-     * This method will replace all string content with simple REGEX#
196
-     * placeholder text, so we've rid all regular expressions from characters
197
-     * that may be misinterpreted. Original regex content will be saved in
198
-     * $this->extracted and after doing all other minifying, we can restore the
199
-     * original content via restoreRegex()
200
-     */
201
-    protected function extractRegex()
202
-    {
203
-        // PHP only supports $this inside anonymous functions since 5.4
204
-        $minifier = $this;
205
-        $callback = function ($match) use ($minifier) {
206
-            $count = count($minifier->extracted);
207
-            $placeholder = '/'.$count.'/';
208
-            $minifier->extracted[$placeholder] = $match[1];
209
-
210
-            return $placeholder;
211
-        };
212
-
213
-        // it's a regex if we can find an opening and (not escaped) closing /,
214
-        // include \n because it may be there for a reason
215
-        // (https://github.com/matthiasmullie/minify/issues/56)
216
-        $pattern = '(\/.*?(?<!\\\\)(\\\\\\\\)*+\/\n?)';
217
-
218
-        // / can't be preceded by variable, value, or similar because then
219
-        // it's going to be division
220
-        // checking for that is complex, so we'll do inverse:
221
-        // * at the beginning of the file, it's not division, but regex
222
-        $this->registerPattern('/^\s*\K'.$pattern.'/', $callback);
223
-        // * following another operator, it's not division, but regex
224
-        $operators = $this->getOperatorsForRegex($this->operatorsBefore, '/');
225
-        $operators += $this->getKeywordsForRegex($this->keywordsReserved, '/');
226
-        $this->registerPattern('/(?:'.implode('|', $operators).')\s*\K'.$pattern.'/', $callback);
227
-    }
228
-
229
-    /**
230
-     * Strip whitespace.
231
-     *
232
-     * We won't strip *all* whitespace, but as much as possible. The thing that
233
-     * we'll preserve are newlines we're unsure about.
234
-     * JavaScript doesn't require statements to be terminated with a semicolon.
235
-     * It will automatically fix missing semicolons with ASI (automatic semi-
236
-     * colon insertion) at the end of line causing errors (without semicolon.)
237
-     *
238
-     * Because it's sometimes hard to tell if a newline is part of a statement
239
-     * that should be terminated or not, we'll just leave some of them alone.
240
-     *
241
-     * @param string $content The content to strip the whitespace for.
242
-     *
243
-     * @return string
244
-     */
245
-    protected function stripWhitespace($content)
246
-    {
247
-        // uniform line endings, make them all line feed
248
-        $content = str_replace(array("\r\n", "\r"), "\n", $content);
249
-
250
-        // collapse all non-line feed whitespace into a single space
251
-        $content = preg_replace('/[^\S\n]+/', ' ', $content);
252
-
253
-        // strip leading & trailing whitespace
254
-        $content = str_replace(array(" \n", "\n "), "\n", $content);
255
-
256
-        // collapse consecutive line feeds into just 1
257
-        $content = preg_replace('/\n+/', "\n", $content);
258
-
259
-        $before = $this->getOperatorsForRegex($this->operatorsBefore, '/');
260
-        $after = $this->getOperatorsForRegex($this->operatorsAfter, '/');
261
-        $operators = $before + $after;
262
-
263
-        // strip whitespace that ends in (or next line begin with) an operator
264
-        // that allows statements to be broken up over multiple lines
265
-        unset($before['+'], $before['-'], $after['+'], $after['-']);
266
-        $content = preg_replace(
267
-            array(
268
-                '/('.implode('|', $before).')\s+/',
269
-                '/\s+('.implode('|', $after).')/',
270
-            ), '\\1', $content
271
-        );
272
-
273
-        // make sure + and - can't be mistaken for, or joined into ++ and --
274
-        $content = preg_replace(
275
-            array(
276
-                '/(?<![\+\-])\s*([\+\-])(?![\+\-])/',
277
-                '/(?<![\+\-])([\+\-])\s*(?![\+\-])/',
278
-            ), '\\1', $content
279
-        );
280
-
281
-        /*
167
+		$content = $this->restoreExtractedData($content);
168
+
169
+		return $content;
170
+	}
171
+
172
+	/**
173
+	 * Strip comments from source code.
174
+	 */
175
+	protected function stripComments()
176
+	{
177
+		// single-line comments
178
+		$this->registerPattern('/\/\/.*$/m', '');
179
+
180
+		// multi-line comments
181
+		$this->registerPattern('/\/\*.*?\*\//s', '');
182
+	}
183
+
184
+	/**
185
+	 * JS can have /-delimited regular expressions, like: /ab+c/.match(string).
186
+	 *
187
+	 * The content inside the regex can contain characters that may be confused
188
+	 * for JS code: e.g. it could contain whitespace it needs to match & we
189
+	 * don't want to strip whitespace in there.
190
+	 *
191
+	 * The regex can be pretty simple: we don't have to care about comments,
192
+	 * (which also use slashes) because stripComments() will have stripped those
193
+	 * already.
194
+	 *
195
+	 * This method will replace all string content with simple REGEX#
196
+	 * placeholder text, so we've rid all regular expressions from characters
197
+	 * that may be misinterpreted. Original regex content will be saved in
198
+	 * $this->extracted and after doing all other minifying, we can restore the
199
+	 * original content via restoreRegex()
200
+	 */
201
+	protected function extractRegex()
202
+	{
203
+		// PHP only supports $this inside anonymous functions since 5.4
204
+		$minifier = $this;
205
+		$callback = function ($match) use ($minifier) {
206
+			$count = count($minifier->extracted);
207
+			$placeholder = '/'.$count.'/';
208
+			$minifier->extracted[$placeholder] = $match[1];
209
+
210
+			return $placeholder;
211
+		};
212
+
213
+		// it's a regex if we can find an opening and (not escaped) closing /,
214
+		// include \n because it may be there for a reason
215
+		// (https://github.com/matthiasmullie/minify/issues/56)
216
+		$pattern = '(\/.*?(?<!\\\\)(\\\\\\\\)*+\/\n?)';
217
+
218
+		// / can't be preceded by variable, value, or similar because then
219
+		// it's going to be division
220
+		// checking for that is complex, so we'll do inverse:
221
+		// * at the beginning of the file, it's not division, but regex
222
+		$this->registerPattern('/^\s*\K'.$pattern.'/', $callback);
223
+		// * following another operator, it's not division, but regex
224
+		$operators = $this->getOperatorsForRegex($this->operatorsBefore, '/');
225
+		$operators += $this->getKeywordsForRegex($this->keywordsReserved, '/');
226
+		$this->registerPattern('/(?:'.implode('|', $operators).')\s*\K'.$pattern.'/', $callback);
227
+	}
228
+
229
+	/**
230
+	 * Strip whitespace.
231
+	 *
232
+	 * We won't strip *all* whitespace, but as much as possible. The thing that
233
+	 * we'll preserve are newlines we're unsure about.
234
+	 * JavaScript doesn't require statements to be terminated with a semicolon.
235
+	 * It will automatically fix missing semicolons with ASI (automatic semi-
236
+	 * colon insertion) at the end of line causing errors (without semicolon.)
237
+	 *
238
+	 * Because it's sometimes hard to tell if a newline is part of a statement
239
+	 * that should be terminated or not, we'll just leave some of them alone.
240
+	 *
241
+	 * @param string $content The content to strip the whitespace for.
242
+	 *
243
+	 * @return string
244
+	 */
245
+	protected function stripWhitespace($content)
246
+	{
247
+		// uniform line endings, make them all line feed
248
+		$content = str_replace(array("\r\n", "\r"), "\n", $content);
249
+
250
+		// collapse all non-line feed whitespace into a single space
251
+		$content = preg_replace('/[^\S\n]+/', ' ', $content);
252
+
253
+		// strip leading & trailing whitespace
254
+		$content = str_replace(array(" \n", "\n "), "\n", $content);
255
+
256
+		// collapse consecutive line feeds into just 1
257
+		$content = preg_replace('/\n+/', "\n", $content);
258
+
259
+		$before = $this->getOperatorsForRegex($this->operatorsBefore, '/');
260
+		$after = $this->getOperatorsForRegex($this->operatorsAfter, '/');
261
+		$operators = $before + $after;
262
+
263
+		// strip whitespace that ends in (or next line begin with) an operator
264
+		// that allows statements to be broken up over multiple lines
265
+		unset($before['+'], $before['-'], $after['+'], $after['-']);
266
+		$content = preg_replace(
267
+			array(
268
+				'/('.implode('|', $before).')\s+/',
269
+				'/\s+('.implode('|', $after).')/',
270
+			), '\\1', $content
271
+		);
272
+
273
+		// make sure + and - can't be mistaken for, or joined into ++ and --
274
+		$content = preg_replace(
275
+			array(
276
+				'/(?<![\+\-])\s*([\+\-])(?![\+\-])/',
277
+				'/(?<![\+\-])([\+\-])\s*(?![\+\-])/',
278
+			), '\\1', $content
279
+		);
280
+
281
+		/*
282 282
          * We didn't strip whitespace after a couple of operators because they
283 283
          * could be used in different contexts and we can't be sure it's ok to
284 284
          * strip the newlines. However, we can safely strip any non-line feed
285 285
          * whitespace that follows them.
286 286
          */
287
-        $content = preg_replace('/([\}\)\]])[^\S\n]+(?!'.implode('|', $operators).')/', '\\1', $content);
287
+		$content = preg_replace('/([\}\)\]])[^\S\n]+(?!'.implode('|', $operators).')/', '\\1', $content);
288 288
 
289
-        // collapse whitespace around reserved words into single space
290
-        $before = $this->getKeywordsForRegex($this->keywordsBefore, '/');
291
-        $after = $this->getKeywordsForRegex($this->keywordsAfter, '/');
292
-        $content = preg_replace('/(^|[;\}\s])\K('.implode('|', $before).')\s+/', '\\2 ', $content);
293
-        $content = preg_replace('/\s+('.implode('|', $after).')(?=([;\{\s]|$))/', ' \\1', $content);
289
+		// collapse whitespace around reserved words into single space
290
+		$before = $this->getKeywordsForRegex($this->keywordsBefore, '/');
291
+		$after = $this->getKeywordsForRegex($this->keywordsAfter, '/');
292
+		$content = preg_replace('/(^|[;\}\s])\K('.implode('|', $before).')\s+/', '\\2 ', $content);
293
+		$content = preg_replace('/\s+('.implode('|', $after).')(?=([;\{\s]|$))/', ' \\1', $content);
294 294
 
295
-        /*
295
+		/*
296 296
          * Get rid of double semicolons, except where they can be used like:
297 297
          * "for(v=1,_=b;;)", "for(v=1;;v++)" or "for(;;ja||(ja=true))".
298 298
          * I'll safeguard these double semicolons inside for-loops by
299 299
          * temporarily replacing them with an invalid condition: they won't have
300 300
          * a double semicolon and will be easy to spot to restore afterwards.
301 301
          */
302
-        $content = preg_replace('/\bfor\(([^;]*);;([^;]*)\)/', 'for(\\1;-;\\2)', $content);
303
-        $content = preg_replace('/;+/', ';', $content);
304
-        $content = preg_replace('/\bfor\(([^;]*);-;([^;]*)\)/', 'for(\\1;;\\2)', $content);
302
+		$content = preg_replace('/\bfor\(([^;]*);;([^;]*)\)/', 'for(\\1;-;\\2)', $content);
303
+		$content = preg_replace('/;+/', ';', $content);
304
+		$content = preg_replace('/\bfor\(([^;]*);-;([^;]*)\)/', 'for(\\1;;\\2)', $content);
305 305
 
306
-        /*
306
+		/*
307 307
          * Next, we'll be removing all semicolons where ASI kicks in.
308 308
          * for-loops however, can have an empty body (ending in only a
309 309
          * semicolon), like: `for(i=1;i<3;i++);`
@@ -313,9 +313,9 @@  discard block
 block discarded – undo
313 313
          * I'm going to double that semicolon (if any) so after the next line,
314 314
          * which strips semicolons here & there, we're still left with this one.
315 315
          */
316
-        $content = preg_replace('/(for\([^;]*;[^;]*;[^;\{]*\));(\}|$)/s', '\\1;;\\2', $content);
316
+		$content = preg_replace('/(for\([^;]*;[^;]*;[^;\{]*\));(\}|$)/s', '\\1;;\\2', $content);
317 317
 
318
-        /*
318
+		/*
319 319
          * We also can't strip empty else-statements. Even though they're
320 320
          * useless and probably shouldn't be in the code in the first place, we
321 321
          * shouldn't be stripping the `;` that follows it as it breaks the code.
@@ -323,114 +323,114 @@  discard block
 block discarded – undo
323 323
          *
324 324
          * @see https://github.com/matthiasmullie/minify/issues/91
325 325
          */
326
-        $content = preg_replace('/else;/s', '', $content);
326
+		$content = preg_replace('/else;/s', '', $content);
327 327
 
328
-        /*
328
+		/*
329 329
          * We also don't really want to terminate statements followed by closing
330 330
          * curly braces (which we've ignored completely up until now) or end-of-
331 331
          * script: ASI will kick in here & we're all about minifying.
332 332
          * Semicolons at beginning of the file don't make any sense either.
333 333
          */
334
-        $content = preg_replace('/;(\}|$)/s', '\\1', $content);
335
-        $content = ltrim($content, ';');
336
-
337
-        // get rid of remaining whitespace af beginning/end
338
-        return trim($content);
339
-    }
340
-
341
-    /**
342
-     * We'll strip whitespace around certain operators with regular expressions.
343
-     * This will prepare the given array by escaping all characters.
344
-     *
345
-     * @param string[] $operators
346
-     * @param string   $delimiter
347
-     *
348
-     * @return string[]
349
-     */
350
-    protected function getOperatorsForRegex(array $operators, $delimiter = '/')
351
-    {
352
-        // escape operators for use in regex
353
-        $delimiter = array_fill(0, count($operators), $delimiter);
354
-        $escaped = array_map('preg_quote', $operators, $delimiter);
355
-
356
-        $operators = array_combine($operators, $escaped);
357
-
358
-        // ignore + & - for now, they'll get special treatment
359
-        unset($operators['+'], $operators['-']);
360
-
361
-        // dot can not just immediately follow a number; it can be confused for
362
-        // decimal point, or calling a method on it, e.g. 42 .toString()
363
-        $operators['.'] = '(?<![0-9]\s)\.';
364
-
365
-        // don't confuse = with other assignment shortcuts (e.g. +=)
366
-        $chars = preg_quote('+-*\=<>%&|');
367
-        $operators['='] = '(?<!['.$chars.'])\=';
368
-
369
-        return $operators;
370
-    }
371
-
372
-    /**
373
-     * We'll strip whitespace around certain keywords with regular expressions.
374
-     * This will prepare the given array by escaping all characters.
375
-     *
376
-     * @param string[] $keywords
377
-     * @param string   $delimiter
378
-     *
379
-     * @return string[]
380
-     */
381
-    protected function getKeywordsForRegex(array $keywords, $delimiter = '/')
382
-    {
383
-        // escape keywords for use in regex
384
-        $delimiter = array_fill(0, count($keywords), $delimiter);
385
-        $escaped = array_map('preg_quote', $keywords, $delimiter);
386
-
387
-        // add word boundaries
388
-        array_walk($keywords, function ($value) {
389
-            return '\b'.$value.'\b';
390
-        });
391
-
392
-        $keywords = array_combine($keywords, $escaped);
393
-
394
-        return $keywords;
395
-    }
396
-
397
-    /**
398
-     * Replaces all occurrences of array['key'] by array.key.
399
-     *
400
-     * @param string $content
401
-     *
402
-     * @return string
403
-     */
404
-    protected function propertyNotation($content)
405
-    {
406
-        // PHP only supports $this inside anonymous functions since 5.4
407
-        $minifier = $this;
408
-        $keywords = $this->keywordsReserved;
409
-        $callback = function ($match) use ($minifier, $keywords) {
410
-            $property = trim($minifier->extracted[$match[1]], '\'"');
411
-
412
-            /*
334
+		$content = preg_replace('/;(\}|$)/s', '\\1', $content);
335
+		$content = ltrim($content, ';');
336
+
337
+		// get rid of remaining whitespace af beginning/end
338
+		return trim($content);
339
+	}
340
+
341
+	/**
342
+	 * We'll strip whitespace around certain operators with regular expressions.
343
+	 * This will prepare the given array by escaping all characters.
344
+	 *
345
+	 * @param string[] $operators
346
+	 * @param string   $delimiter
347
+	 *
348
+	 * @return string[]
349
+	 */
350
+	protected function getOperatorsForRegex(array $operators, $delimiter = '/')
351
+	{
352
+		// escape operators for use in regex
353
+		$delimiter = array_fill(0, count($operators), $delimiter);
354
+		$escaped = array_map('preg_quote', $operators, $delimiter);
355
+
356
+		$operators = array_combine($operators, $escaped);
357
+
358
+		// ignore + & - for now, they'll get special treatment
359
+		unset($operators['+'], $operators['-']);
360
+
361
+		// dot can not just immediately follow a number; it can be confused for
362
+		// decimal point, or calling a method on it, e.g. 42 .toString()
363
+		$operators['.'] = '(?<![0-9]\s)\.';
364
+
365
+		// don't confuse = with other assignment shortcuts (e.g. +=)
366
+		$chars = preg_quote('+-*\=<>%&|');
367
+		$operators['='] = '(?<!['.$chars.'])\=';
368
+
369
+		return $operators;
370
+	}
371
+
372
+	/**
373
+	 * We'll strip whitespace around certain keywords with regular expressions.
374
+	 * This will prepare the given array by escaping all characters.
375
+	 *
376
+	 * @param string[] $keywords
377
+	 * @param string   $delimiter
378
+	 *
379
+	 * @return string[]
380
+	 */
381
+	protected function getKeywordsForRegex(array $keywords, $delimiter = '/')
382
+	{
383
+		// escape keywords for use in regex
384
+		$delimiter = array_fill(0, count($keywords), $delimiter);
385
+		$escaped = array_map('preg_quote', $keywords, $delimiter);
386
+
387
+		// add word boundaries
388
+		array_walk($keywords, function ($value) {
389
+			return '\b'.$value.'\b';
390
+		});
391
+
392
+		$keywords = array_combine($keywords, $escaped);
393
+
394
+		return $keywords;
395
+	}
396
+
397
+	/**
398
+	 * Replaces all occurrences of array['key'] by array.key.
399
+	 *
400
+	 * @param string $content
401
+	 *
402
+	 * @return string
403
+	 */
404
+	protected function propertyNotation($content)
405
+	{
406
+		// PHP only supports $this inside anonymous functions since 5.4
407
+		$minifier = $this;
408
+		$keywords = $this->keywordsReserved;
409
+		$callback = function ($match) use ($minifier, $keywords) {
410
+			$property = trim($minifier->extracted[$match[1]], '\'"');
411
+
412
+			/*
413 413
              * Check if the property is a reserved keyword. In this context (as
414 414
              * property of an object literal/array) it shouldn't matter, but IE8
415 415
              * freaks out with "Expected identifier".
416 416
              */
417
-            if (in_array($property, $keywords)) {
418
-                return $match[0];
419
-            }
417
+			if (in_array($property, $keywords)) {
418
+				return $match[0];
419
+			}
420 420
 
421
-            /*
421
+			/*
422 422
              * See if the property is in a variable-like format (e.g.
423 423
              * array['key-here'] can't be replaced by array.key-here since '-'
424 424
              * is not a valid character there.
425 425
              */
426
-            if (!preg_match('/^'.$minifier::REGEX_VARIABLE.'$/u', $property)) {
427
-                return $match[0];
428
-            }
426
+			if (!preg_match('/^'.$minifier::REGEX_VARIABLE.'$/u', $property)) {
427
+				return $match[0];
428
+			}
429 429
 
430
-            return '.'.$property;
431
-        };
430
+			return '.'.$property;
431
+		};
432 432
 
433
-        /*
433
+		/*
434 434
          * Figure out if previous character is a variable name (of the array
435 435
          * we want to use property notation on) - this is to make sure
436 436
          * standalone ['value'] arrays aren't confused for keys-of-an-array.
@@ -438,61 +438,61 @@  discard block
 block discarded – undo
438 438
          * regex implementation doesn't allow unfixed-length look-behind
439 439
          * assertions.
440 440
          */
441
-        preg_match('/(\[[^\]]+\])[^\]]*$/', static::REGEX_VARIABLE, $previousChar);
442
-        $previousChar = $previousChar[1];
441
+		preg_match('/(\[[^\]]+\])[^\]]*$/', static::REGEX_VARIABLE, $previousChar);
442
+		$previousChar = $previousChar[1];
443 443
 
444
-        /*
444
+		/*
445 445
          * Make sure word preceding the ['value'] is not a keyword, e.g.
446 446
          * return['x']. Because -again- PHP's regex implementation doesn't allow
447 447
          * unfixed-length look-behind assertions, I'm just going to do a lot of
448 448
          * separate look-behind assertions, one for each keyword.
449 449
          */
450
-        $keywords = $this->getKeywordsForRegex($keywords);
451
-        $keywords = '(?<!'.implode(')(?<!', $keywords).')';
452
-
453
-        return preg_replace_callback('/(?<='.$previousChar.'|\])'.$keywords.'\[(([\'"])[0-9]+\\2)\]/u', $callback, $content);
454
-    }
455
-
456
-    /**
457
-     * Replaces true & false by !0 and !1.
458
-     *
459
-     * @param string $content
460
-     *
461
-     * @return string
462
-     */
463
-    protected function shortenBools($content)
464
-    {
465
-        $content = preg_replace('/\btrue\b/', '!0', $content);
466
-        $content = preg_replace('/\bfalse\b/', '!1', $content);
467
-
468
-        // for(;;) is exactly the same as while(true)
469
-        $content = preg_replace('/\bwhile\(!0\){/', 'for(;;){', $content);
470
-
471
-        // now make sure we didn't turn any do ... while(true) into do ... for(;;)
472
-        preg_match_all('/\bdo\b/', $content, $dos, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
473
-
474
-        // go backward to make sure positional offsets aren't altered when $content changes
475
-        $dos = array_reverse($dos);
476
-        foreach ($dos as $do) {
477
-            $offsetDo = $do[0][1];
478
-
479
-            // find all `while` (now `for`) following `do`: one of those must be
480
-            // associated with the `do` and be turned back into `while`
481
-            preg_match_all('/\bfor\(;;\)/', $content, $whiles, PREG_OFFSET_CAPTURE | PREG_SET_ORDER, $offsetDo);
482
-            foreach ($whiles as $while) {
483
-                $offsetWhile = $while[0][1];
484
-
485
-                $open = substr_count($content, '{', $offsetDo, $offsetWhile - $offsetDo);
486
-                $close = substr_count($content, '}', $offsetDo, $offsetWhile - $offsetDo);
487
-                if ($open === $close) {
488
-                    // only restore `while` if amount of `{` and `}` are the same;
489
-                    // otherwise, that `for` isn't associated with this `do`
490
-                    $content = substr_replace($content, 'while(!0)', $offsetWhile, strlen('for(;;)'));
491
-                    break;
492
-                }
493
-            }
494
-        }
495
-
496
-        return $content;
497
-    }
450
+		$keywords = $this->getKeywordsForRegex($keywords);
451
+		$keywords = '(?<!'.implode(')(?<!', $keywords).')';
452
+
453
+		return preg_replace_callback('/(?<='.$previousChar.'|\])'.$keywords.'\[(([\'"])[0-9]+\\2)\]/u', $callback, $content);
454
+	}
455
+
456
+	/**
457
+	 * Replaces true & false by !0 and !1.
458
+	 *
459
+	 * @param string $content
460
+	 *
461
+	 * @return string
462
+	 */
463
+	protected function shortenBools($content)
464
+	{
465
+		$content = preg_replace('/\btrue\b/', '!0', $content);
466
+		$content = preg_replace('/\bfalse\b/', '!1', $content);
467
+
468
+		// for(;;) is exactly the same as while(true)
469
+		$content = preg_replace('/\bwhile\(!0\){/', 'for(;;){', $content);
470
+
471
+		// now make sure we didn't turn any do ... while(true) into do ... for(;;)
472
+		preg_match_all('/\bdo\b/', $content, $dos, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
473
+
474
+		// go backward to make sure positional offsets aren't altered when $content changes
475
+		$dos = array_reverse($dos);
476
+		foreach ($dos as $do) {
477
+			$offsetDo = $do[0][1];
478
+
479
+			// find all `while` (now `for`) following `do`: one of those must be
480
+			// associated with the `do` and be turned back into `while`
481
+			preg_match_all('/\bfor\(;;\)/', $content, $whiles, PREG_OFFSET_CAPTURE | PREG_SET_ORDER, $offsetDo);
482
+			foreach ($whiles as $while) {
483
+				$offsetWhile = $while[0][1];
484
+
485
+				$open = substr_count($content, '{', $offsetDo, $offsetWhile - $offsetDo);
486
+				$close = substr_count($content, '}', $offsetDo, $offsetWhile - $offsetDo);
487
+				if ($open === $close) {
488
+					// only restore `while` if amount of `{` and `}` are the same;
489
+					// otherwise, that `for` isn't associated with this `do`
490
+					$content = substr_replace($content, 'while(!0)', $offsetWhile, strlen('for(;;)'));
491
+					break;
492
+				}
493
+			}
494
+		}
495
+
496
+		return $content;
497
+	}
498 498
 }
Please login to merge, or discard this patch.
Spacing   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -106,13 +106,13 @@  discard block
 block discarded – undo
106 106
     {
107 107
         call_user_func_array(array('parent', '__construct'), func_get_args());
108 108
 
109
-        $dataDir = __DIR__.'/../data/js/';
109
+        $dataDir = __DIR__ . '/../data/js/';
110 110
         $options = FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES;
111
-        $this->keywordsReserved = file($dataDir.'keywords_reserved.txt', $options);
112
-        $this->keywordsBefore = file($dataDir.'keywords_before.txt', $options);
113
-        $this->keywordsAfter = file($dataDir.'keywords_after.txt', $options);
114
-        $this->operatorsBefore = file($dataDir.'operators_before.txt', $options);
115
-        $this->operatorsAfter = file($dataDir.'operators_after.txt', $options);
111
+        $this->keywordsReserved = file($dataDir . 'keywords_reserved.txt', $options);
112
+        $this->keywordsBefore = file($dataDir . 'keywords_before.txt', $options);
113
+        $this->keywordsAfter = file($dataDir . 'keywords_after.txt', $options);
114
+        $this->operatorsBefore = file($dataDir . 'operators_before.txt', $options);
115
+        $this->operatorsAfter = file($dataDir . 'operators_after.txt', $options);
116 116
     }
117 117
 
118 118
     /**
@@ -137,7 +137,7 @@  discard block
 block discarded – undo
137 137
              * singe-line comment on the last line (in which case it would also
138 138
              * be seen as part of that comment)
139 139
              */
140
-            $content .= $js."\n;";
140
+            $content .= $js . "\n;";
141 141
         }
142 142
 
143 143
         /*
@@ -202,9 +202,9 @@  discard block
 block discarded – undo
202 202
     {
203 203
         // PHP only supports $this inside anonymous functions since 5.4
204 204
         $minifier = $this;
205
-        $callback = function ($match) use ($minifier) {
205
+        $callback = function($match) use ($minifier) {
206 206
             $count = count($minifier->extracted);
207
-            $placeholder = '/'.$count.'/';
207
+            $placeholder = '/' . $count . '/';
208 208
             $minifier->extracted[$placeholder] = $match[1];
209 209
 
210 210
             return $placeholder;
@@ -219,11 +219,11 @@  discard block
 block discarded – undo
219 219
         // it's going to be division
220 220
         // checking for that is complex, so we'll do inverse:
221 221
         // * at the beginning of the file, it's not division, but regex
222
-        $this->registerPattern('/^\s*\K'.$pattern.'/', $callback);
222
+        $this->registerPattern('/^\s*\K' . $pattern . '/', $callback);
223 223
         // * following another operator, it's not division, but regex
224 224
         $operators = $this->getOperatorsForRegex($this->operatorsBefore, '/');
225 225
         $operators += $this->getKeywordsForRegex($this->keywordsReserved, '/');
226
-        $this->registerPattern('/(?:'.implode('|', $operators).')\s*\K'.$pattern.'/', $callback);
226
+        $this->registerPattern('/(?:' . implode('|', $operators) . ')\s*\K' . $pattern . '/', $callback);
227 227
     }
228 228
 
229 229
     /**
@@ -265,8 +265,8 @@  discard block
 block discarded – undo
265 265
         unset($before['+'], $before['-'], $after['+'], $after['-']);
266 266
         $content = preg_replace(
267 267
             array(
268
-                '/('.implode('|', $before).')\s+/',
269
-                '/\s+('.implode('|', $after).')/',
268
+                '/(' . implode('|', $before) . ')\s+/',
269
+                '/\s+(' . implode('|', $after) . ')/',
270 270
             ), '\\1', $content
271 271
         );
272 272
 
@@ -284,13 +284,13 @@  discard block
 block discarded – undo
284 284
          * strip the newlines. However, we can safely strip any non-line feed
285 285
          * whitespace that follows them.
286 286
          */
287
-        $content = preg_replace('/([\}\)\]])[^\S\n]+(?!'.implode('|', $operators).')/', '\\1', $content);
287
+        $content = preg_replace('/([\}\)\]])[^\S\n]+(?!' . implode('|', $operators) . ')/', '\\1', $content);
288 288
 
289 289
         // collapse whitespace around reserved words into single space
290 290
         $before = $this->getKeywordsForRegex($this->keywordsBefore, '/');
291 291
         $after = $this->getKeywordsForRegex($this->keywordsAfter, '/');
292
-        $content = preg_replace('/(^|[;\}\s])\K('.implode('|', $before).')\s+/', '\\2 ', $content);
293
-        $content = preg_replace('/\s+('.implode('|', $after).')(?=([;\{\s]|$))/', ' \\1', $content);
292
+        $content = preg_replace('/(^|[;\}\s])\K(' . implode('|', $before) . ')\s+/', '\\2 ', $content);
293
+        $content = preg_replace('/\s+(' . implode('|', $after) . ')(?=([;\{\s]|$))/', ' \\1', $content);
294 294
 
295 295
         /*
296 296
          * Get rid of double semicolons, except where they can be used like:
@@ -364,7 +364,7 @@  discard block
 block discarded – undo
364 364
 
365 365
         // don't confuse = with other assignment shortcuts (e.g. +=)
366 366
         $chars = preg_quote('+-*\=<>%&|');
367
-        $operators['='] = '(?<!['.$chars.'])\=';
367
+        $operators['='] = '(?<![' . $chars . '])\=';
368 368
 
369 369
         return $operators;
370 370
     }
@@ -385,8 +385,8 @@  discard block
 block discarded – undo
385 385
         $escaped = array_map('preg_quote', $keywords, $delimiter);
386 386
 
387 387
         // add word boundaries
388
-        array_walk($keywords, function ($value) {
389
-            return '\b'.$value.'\b';
388
+        array_walk($keywords, function($value) {
389
+            return '\b' . $value . '\b';
390 390
         });
391 391
 
392 392
         $keywords = array_combine($keywords, $escaped);
@@ -406,7 +406,7 @@  discard block
 block discarded – undo
406 406
         // PHP only supports $this inside anonymous functions since 5.4
407 407
         $minifier = $this;
408 408
         $keywords = $this->keywordsReserved;
409
-        $callback = function ($match) use ($minifier, $keywords) {
409
+        $callback = function($match) use ($minifier, $keywords) {
410 410
             $property = trim($minifier->extracted[$match[1]], '\'"');
411 411
 
412 412
             /*
@@ -423,11 +423,11 @@  discard block
 block discarded – undo
423 423
              * array['key-here'] can't be replaced by array.key-here since '-'
424 424
              * is not a valid character there.
425 425
              */
426
-            if (!preg_match('/^'.$minifier::REGEX_VARIABLE.'$/u', $property)) {
426
+            if (!preg_match('/^' . $minifier::REGEX_VARIABLE . '$/u', $property)) {
427 427
                 return $match[0];
428 428
             }
429 429
 
430
-            return '.'.$property;
430
+            return '.' . $property;
431 431
         };
432 432
 
433 433
         /*
@@ -448,9 +448,9 @@  discard block
 block discarded – undo
448 448
          * separate look-behind assertions, one for each keyword.
449 449
          */
450 450
         $keywords = $this->getKeywordsForRegex($keywords);
451
-        $keywords = '(?<!'.implode(')(?<!', $keywords).')';
451
+        $keywords = '(?<!' . implode(')(?<!', $keywords) . ')';
452 452
 
453
-        return preg_replace_callback('/(?<='.$previousChar.'|\])'.$keywords.'\[(([\'"])[0-9]+\\2)\]/u', $callback, $content);
453
+        return preg_replace_callback('/(?<=' . $previousChar . '|\])' . $keywords . '\[(([\'"])[0-9]+\\2)\]/u', $callback, $content);
454 454
     }
455 455
 
456 456
     /**
Please login to merge, or discard this patch.
Sources/minify/src/Converter.php 2 patches
Indentation   +169 added lines, -169 removed lines patch added patch discarded remove patch
@@ -18,178 +18,178 @@
 block discarded – undo
18 18
  */
19 19
 class Converter
20 20
 {
21
-    /**
22
-     * @var string
23
-     */
24
-    protected $from;
25
-
26
-    /**
27
-     * @var string
28
-     */
29
-    protected $to;
30
-
31
-    /**
32
-     * @param string $from The original base path (directory, not file!)
33
-     * @param string $to   The new base path (directory, not file!)
34
-     */
35
-    public function __construct($from, $to)
36
-    {
37
-        $shared = $this->shared($from, $to);
38
-        if ($shared === '') {
39
-            // when both paths have nothing in common, one of them is probably
40
-            // absolute while the other is relative
41
-            $cwd = getcwd();
42
-            $from = strpos($from, $cwd) === 0 ? $from : $cwd.'/'.$from;
43
-            $to = strpos($to, $cwd) === 0 ? $to : $cwd.'/'.$to;
44
-
45
-            // or traveling the tree via `..`
46
-            // attempt to resolve path, or assume it's fine if it doesn't exist
47
-            $from = realpath($from) ?: $from;
48
-            $to = realpath($to) ?: $to;
49
-        }
50
-
51
-        $from = $this->normalize($from);
52
-        $to = $this->normalize($to);
53
-
54
-        $from = $this->dirname($from);
55
-        $to = $this->dirname($to);
56
-
57
-        $this->from = $from;
58
-        $this->to = $to;
59
-    }
60
-
61
-    /**
62
-     * Normalize path.
63
-     *
64
-     * @param string $path
65
-     *
66
-     * @return string
67
-     */
68
-    protected function normalize($path)
69
-    {
70
-        // deal with different operating systems' directory structure
71
-        $path = rtrim(str_replace(DIRECTORY_SEPARATOR, '/', $path), '/');
72
-
73
-        /*
21
+	/**
22
+	 * @var string
23
+	 */
24
+	protected $from;
25
+
26
+	/**
27
+	 * @var string
28
+	 */
29
+	protected $to;
30
+
31
+	/**
32
+	 * @param string $from The original base path (directory, not file!)
33
+	 * @param string $to   The new base path (directory, not file!)
34
+	 */
35
+	public function __construct($from, $to)
36
+	{
37
+		$shared = $this->shared($from, $to);
38
+		if ($shared === '') {
39
+			// when both paths have nothing in common, one of them is probably
40
+			// absolute while the other is relative
41
+			$cwd = getcwd();
42
+			$from = strpos($from, $cwd) === 0 ? $from : $cwd.'/'.$from;
43
+			$to = strpos($to, $cwd) === 0 ? $to : $cwd.'/'.$to;
44
+
45
+			// or traveling the tree via `..`
46
+			// attempt to resolve path, or assume it's fine if it doesn't exist
47
+			$from = realpath($from) ?: $from;
48
+			$to = realpath($to) ?: $to;
49
+		}
50
+
51
+		$from = $this->normalize($from);
52
+		$to = $this->normalize($to);
53
+
54
+		$from = $this->dirname($from);
55
+		$to = $this->dirname($to);
56
+
57
+		$this->from = $from;
58
+		$this->to = $to;
59
+	}
60
+
61
+	/**
62
+	 * Normalize path.
63
+	 *
64
+	 * @param string $path
65
+	 *
66
+	 * @return string
67
+	 */
68
+	protected function normalize($path)
69
+	{
70
+		// deal with different operating systems' directory structure
71
+		$path = rtrim(str_replace(DIRECTORY_SEPARATOR, '/', $path), '/');
72
+
73
+		/*
74 74
          * Example:
75 75
          *     /home/forkcms/frontend/cache/compiled_templates/../../core/layout/css/../images/img.gif
76 76
          * to
77 77
          *     /home/forkcms/frontend/core/layout/images/img.gif
78 78
          */
79
-        do {
80
-            $path = preg_replace('/[^\/]+(?<!\.\.)\/\.\.\//', '', $path, -1, $count);
81
-        } while ($count);
82
-
83
-        return $path;
84
-    }
85
-
86
-    /**
87
-     * Figure out the shared path of 2 locations.
88
-     *
89
-     * Example:
90
-     *     /home/forkcms/frontend/core/layout/images/img.gif
91
-     * and
92
-     *     /home/forkcms/frontend/cache/minified_css
93
-     * share
94
-     *     /home/forkcms/frontend
95
-     *
96
-     * @param string $path1
97
-     * @param string $path2
98
-     *
99
-     * @return string
100
-     */
101
-    protected function shared($path1, $path2)
102
-    {
103
-        // $path could theoretically be empty (e.g. no path is given), in which
104
-        // case it shouldn't expand to array(''), which would compare to one's
105
-        // root /
106
-        $path1 = $path1 ? explode('/', $path1) : array();
107
-        $path2 = $path2 ? explode('/', $path2) : array();
108
-
109
-        $shared = array();
110
-
111
-        // compare paths & strip identical ancestors
112
-        foreach ($path1 as $i => $chunk) {
113
-            if (isset($path2[$i]) && $path1[$i] == $path2[$i]) {
114
-                $shared[] = $chunk;
115
-            } else {
116
-                break;
117
-            }
118
-        }
119
-
120
-        return implode('/', $shared);
121
-    }
122
-
123
-    /**
124
-     * Convert paths relative from 1 file to another.
125
-     *
126
-     * E.g.
127
-     *     ../images/img.gif relative to /home/forkcms/frontend/core/layout/css
128
-     * should become:
129
-     *     ../../core/layout/images/img.gif relative to
130
-     *     /home/forkcms/frontend/cache/minified_css
131
-     *
132
-     * @param string $path The relative path that needs to be converted.
133
-     *
134
-     * @return string The new relative path.
135
-     */
136
-    public function convert($path)
137
-    {
138
-        // quit early if conversion makes no sense
139
-        if ($this->from === $this->to) {
140
-            return $path;
141
-        }
142
-
143
-        $path = $this->normalize($path);
144
-        // if we're not dealing with a relative path, just return absolute
145
-        if (strpos($path, '/') === 0) {
146
-            return $path;
147
-        }
148
-
149
-        // normalize paths
150
-        $path = $this->normalize($this->from.'/'.$path);
151
-
152
-        // strip shared ancestor paths
153
-        $shared = $this->shared($path, $this->to);
154
-        $path = mb_substr($path, mb_strlen($shared));
155
-        $to = mb_substr($this->to, mb_strlen($shared));
156
-
157
-        // add .. for every directory that needs to be traversed to new path
158
-        $to = str_repeat('../', mb_substr_count($to, '/'));
159
-
160
-        return $to.ltrim($path, '/');
161
-    }
162
-
163
-    /**
164
-     * Attempt to get the directory name from a path.
165
-     *
166
-     * @param string $path
167
-     *
168
-     * @return string
169
-     */
170
-    public function dirname($path)
171
-    {
172
-        if (is_file($path)) {
173
-            return dirname($path);
174
-        }
175
-
176
-        if (is_dir($path)) {
177
-            return rtrim($path, '/');
178
-        }
179
-
180
-        // no known file/dir, start making assumptions
181
-
182
-        // ends in / = dir
183
-        if (mb_substr($path, -1) === '/') {
184
-            return rtrim($path, '/');
185
-        }
186
-
187
-        // has a dot in the name, likely a file
188
-        if (preg_match('/.*\..*$/', basename($path)) !== 0) {
189
-            return dirname($path);
190
-        }
191
-
192
-        // you're on your own here!
193
-        return $path;
194
-    }
79
+		do {
80
+			$path = preg_replace('/[^\/]+(?<!\.\.)\/\.\.\//', '', $path, -1, $count);
81
+		} while ($count);
82
+
83
+		return $path;
84
+	}
85
+
86
+	/**
87
+	 * Figure out the shared path of 2 locations.
88
+	 *
89
+	 * Example:
90
+	 *     /home/forkcms/frontend/core/layout/images/img.gif
91
+	 * and
92
+	 *     /home/forkcms/frontend/cache/minified_css
93
+	 * share
94
+	 *     /home/forkcms/frontend
95
+	 *
96
+	 * @param string $path1
97
+	 * @param string $path2
98
+	 *
99
+	 * @return string
100
+	 */
101
+	protected function shared($path1, $path2)
102
+	{
103
+		// $path could theoretically be empty (e.g. no path is given), in which
104
+		// case it shouldn't expand to array(''), which would compare to one's
105
+		// root /
106
+		$path1 = $path1 ? explode('/', $path1) : array();
107
+		$path2 = $path2 ? explode('/', $path2) : array();
108
+
109
+		$shared = array();
110
+
111
+		// compare paths & strip identical ancestors
112
+		foreach ($path1 as $i => $chunk) {
113
+			if (isset($path2[$i]) && $path1[$i] == $path2[$i]) {
114
+				$shared[] = $chunk;
115
+			} else {
116
+				break;
117
+			}
118
+		}
119
+
120
+		return implode('/', $shared);
121
+	}
122
+
123
+	/**
124
+	 * Convert paths relative from 1 file to another.
125
+	 *
126
+	 * E.g.
127
+	 *     ../images/img.gif relative to /home/forkcms/frontend/core/layout/css
128
+	 * should become:
129
+	 *     ../../core/layout/images/img.gif relative to
130
+	 *     /home/forkcms/frontend/cache/minified_css
131
+	 *
132
+	 * @param string $path The relative path that needs to be converted.
133
+	 *
134
+	 * @return string The new relative path.
135
+	 */
136
+	public function convert($path)
137
+	{
138
+		// quit early if conversion makes no sense
139
+		if ($this->from === $this->to) {
140
+			return $path;
141
+		}
142
+
143
+		$path = $this->normalize($path);
144
+		// if we're not dealing with a relative path, just return absolute
145
+		if (strpos($path, '/') === 0) {
146
+			return $path;
147
+		}
148
+
149
+		// normalize paths
150
+		$path = $this->normalize($this->from.'/'.$path);
151
+
152
+		// strip shared ancestor paths
153
+		$shared = $this->shared($path, $this->to);
154
+		$path = mb_substr($path, mb_strlen($shared));
155
+		$to = mb_substr($this->to, mb_strlen($shared));
156
+
157
+		// add .. for every directory that needs to be traversed to new path
158
+		$to = str_repeat('../', mb_substr_count($to, '/'));
159
+
160
+		return $to.ltrim($path, '/');
161
+	}
162
+
163
+	/**
164
+	 * Attempt to get the directory name from a path.
165
+	 *
166
+	 * @param string $path
167
+	 *
168
+	 * @return string
169
+	 */
170
+	public function dirname($path)
171
+	{
172
+		if (is_file($path)) {
173
+			return dirname($path);
174
+		}
175
+
176
+		if (is_dir($path)) {
177
+			return rtrim($path, '/');
178
+		}
179
+
180
+		// no known file/dir, start making assumptions
181
+
182
+		// ends in / = dir
183
+		if (mb_substr($path, -1) === '/') {
184
+			return rtrim($path, '/');
185
+		}
186
+
187
+		// has a dot in the name, likely a file
188
+		if (preg_match('/.*\..*$/', basename($path)) !== 0) {
189
+			return dirname($path);
190
+		}
191
+
192
+		// you're on your own here!
193
+		return $path;
194
+	}
195 195
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -39,8 +39,8 @@  discard block
 block discarded – undo
39 39
             // when both paths have nothing in common, one of them is probably
40 40
             // absolute while the other is relative
41 41
             $cwd = getcwd();
42
-            $from = strpos($from, $cwd) === 0 ? $from : $cwd.'/'.$from;
43
-            $to = strpos($to, $cwd) === 0 ? $to : $cwd.'/'.$to;
42
+            $from = strpos($from, $cwd) === 0 ? $from : $cwd . '/' . $from;
43
+            $to = strpos($to, $cwd) === 0 ? $to : $cwd . '/' . $to;
44 44
 
45 45
             // or traveling the tree via `..`
46 46
             // attempt to resolve path, or assume it's fine if it doesn't exist
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
         }
148 148
 
149 149
         // normalize paths
150
-        $path = $this->normalize($this->from.'/'.$path);
150
+        $path = $this->normalize($this->from . '/' . $path);
151 151
 
152 152
         // strip shared ancestor paths
153 153
         $shared = $this->shared($path, $this->to);
@@ -157,7 +157,7 @@  discard block
 block discarded – undo
157 157
         // add .. for every directory that needs to be traversed to new path
158 158
         $to = str_repeat('../', mb_substr_count($to, '/'));
159 159
 
160
-        return $to.ltrim($path, '/');
160
+        return $to . ltrim($path, '/');
161 161
     }
162 162
 
163 163
     /**
Please login to merge, or discard this patch.
Sources/minify/src/CSS.php 2 patches
Indentation   +412 added lines, -412 removed lines patch added patch discarded remove patch
@@ -17,97 +17,97 @@  discard block
 block discarded – undo
17 17
  */
18 18
 class CSS extends Minify
19 19
 {
20
-    /**
21
-     * @var int
22
-     */
23
-    protected $maxImportSize = 5;
24
-
25
-    /**
26
-     * @var string[]
27
-     */
28
-    protected $importExtensions = array(
29
-        'gif' => 'data:image/gif',
30
-        'png' => 'data:image/png',
31
-        'jpe' => 'data:image/jpeg',
32
-        'jpg' => 'data:image/jpeg',
33
-        'jpeg' => 'data:image/jpeg',
34
-        'svg' => 'data:image/svg+xml',
35
-        'woff' => 'data:application/x-font-woff',
36
-        'tif' => 'image/tiff',
37
-        'tiff' => 'image/tiff',
38
-        'xbm' => 'image/x-xbitmap',
39
-    );
40
-
41
-    /**
42
-     * Set the maximum size if files to be imported.
43
-     *
44
-     * Files larger than this size (in kB) will not be imported into the CSS.
45
-     * Importing files into the CSS as data-uri will save you some connections,
46
-     * but we should only import relatively small decorative images so that our
47
-     * CSS file doesn't get too bulky.
48
-     *
49
-     * @param int $size Size in kB
50
-     */
51
-    public function setMaxImportSize($size)
52
-    {
53
-        $this->maxImportSize = $size;
54
-    }
55
-
56
-    /**
57
-     * Set the type of extensions to be imported into the CSS (to save network
58
-     * connections).
59
-     * Keys of the array should be the file extensions & respective values
60
-     * should be the data type.
61
-     *
62
-     * @param string[] $extensions Array of file extensions
63
-     */
64
-    public function setImportExtensions(array $extensions)
65
-    {
66
-        $this->importExtensions = $extensions;
67
-    }
68
-
69
-    /**
70
-     * Move any import statements to the top.
71
-     *
72
-     * @param string $content Nearly finished CSS content
73
-     *
74
-     * @return string
75
-     */
76
-    protected function moveImportsToTop($content)
77
-    {
78
-        if (preg_match_all('/@import[^;]+;/', $content, $matches)) {
79
-
80
-            // remove from content
81
-            foreach ($matches[0] as $import) {
82
-                $content = str_replace($import, '', $content);
83
-            }
84
-
85
-            // add to top
86
-            $content = implode('', $matches[0]).$content;
87
-        };
88
-
89
-        return $content;
90
-    }
91
-
92
-    /**
93
-     * Combine CSS from import statements.
94
-     *
95
-     * @import's will be loaded and their content merged into the original file,
96
-     * to save HTTP requests.
97
-     *
98
-     * @param string   $source  The file to combine imports for.
99
-     * @param string   $content The CSS content to combine imports for.
100
-     * @param string[] $parents Parent paths, for circular reference checks.
101
-     *
102
-     * @return string
103
-     *
104
-     * @throws FileImportException
105
-     */
106
-    protected function combineImports($source, $content, $parents)
107
-    {
108
-        $importRegexes = array(
109
-            // @import url(xxx)
110
-            '/
20
+	/**
21
+	 * @var int
22
+	 */
23
+	protected $maxImportSize = 5;
24
+
25
+	/**
26
+	 * @var string[]
27
+	 */
28
+	protected $importExtensions = array(
29
+		'gif' => 'data:image/gif',
30
+		'png' => 'data:image/png',
31
+		'jpe' => 'data:image/jpeg',
32
+		'jpg' => 'data:image/jpeg',
33
+		'jpeg' => 'data:image/jpeg',
34
+		'svg' => 'data:image/svg+xml',
35
+		'woff' => 'data:application/x-font-woff',
36
+		'tif' => 'image/tiff',
37
+		'tiff' => 'image/tiff',
38
+		'xbm' => 'image/x-xbitmap',
39
+	);
40
+
41
+	/**
42
+	 * Set the maximum size if files to be imported.
43
+	 *
44
+	 * Files larger than this size (in kB) will not be imported into the CSS.
45
+	 * Importing files into the CSS as data-uri will save you some connections,
46
+	 * but we should only import relatively small decorative images so that our
47
+	 * CSS file doesn't get too bulky.
48
+	 *
49
+	 * @param int $size Size in kB
50
+	 */
51
+	public function setMaxImportSize($size)
52
+	{
53
+		$this->maxImportSize = $size;
54
+	}
55
+
56
+	/**
57
+	 * Set the type of extensions to be imported into the CSS (to save network
58
+	 * connections).
59
+	 * Keys of the array should be the file extensions & respective values
60
+	 * should be the data type.
61
+	 *
62
+	 * @param string[] $extensions Array of file extensions
63
+	 */
64
+	public function setImportExtensions(array $extensions)
65
+	{
66
+		$this->importExtensions = $extensions;
67
+	}
68
+
69
+	/**
70
+	 * Move any import statements to the top.
71
+	 *
72
+	 * @param string $content Nearly finished CSS content
73
+	 *
74
+	 * @return string
75
+	 */
76
+	protected function moveImportsToTop($content)
77
+	{
78
+		if (preg_match_all('/@import[^;]+;/', $content, $matches)) {
79
+
80
+			// remove from content
81
+			foreach ($matches[0] as $import) {
82
+				$content = str_replace($import, '', $content);
83
+			}
84
+
85
+			// add to top
86
+			$content = implode('', $matches[0]).$content;
87
+		};
88
+
89
+		return $content;
90
+	}
91
+
92
+	/**
93
+	 * Combine CSS from import statements.
94
+	 *
95
+	 * @import's will be loaded and their content merged into the original file,
96
+	 * to save HTTP requests.
97
+	 *
98
+	 * @param string   $source  The file to combine imports for.
99
+	 * @param string   $content The CSS content to combine imports for.
100
+	 * @param string[] $parents Parent paths, for circular reference checks.
101
+	 *
102
+	 * @return string
103
+	 *
104
+	 * @throws FileImportException
105
+	 */
106
+	protected function combineImports($source, $content, $parents)
107
+	{
108
+		$importRegexes = array(
109
+			// @import url(xxx)
110
+			'/
111 111
             # import statement
112 112
             @import
113 113
 
@@ -152,8 +152,8 @@  discard block
 block discarded – undo
152 152
 
153 153
             /ix',
154 154
 
155
-            // @import 'xxx'
156
-            '/
155
+			// @import 'xxx'
156
+			'/
157 157
 
158 158
             # import statement
159 159
             @import
@@ -192,172 +192,172 @@  discard block
 block discarded – undo
192 192
             ;?
193 193
 
194 194
             /ix',
195
-        );
196
-
197
-        // find all relative imports in css
198
-        $matches = array();
199
-        foreach ($importRegexes as $importRegex) {
200
-            if (preg_match_all($importRegex, $content, $regexMatches, PREG_SET_ORDER)) {
201
-                $matches = array_merge($matches, $regexMatches);
202
-            }
203
-        }
204
-
205
-        $search = array();
206
-        $replace = array();
207
-
208
-        // loop the matches
209
-        foreach ($matches as $match) {
210
-            // get the path for the file that will be imported
211
-            $importPath = dirname($source).'/'.$match['path'];
212
-
213
-            // only replace the import with the content if we can grab the
214
-            // content of the file
215
-            if ($this->canImportFile($importPath)) {
216
-                // check if current file was not imported previously in the same
217
-                // import chain.
218
-                if (in_array($importPath, $parents)) {
219
-                    throw new FileImportException('Failed to import file "'.$importPath.'": circular reference detected.');
220
-                }
221
-
222
-                // grab referenced file & minify it (which may include importing
223
-                // yet other @import statements recursively)
224
-                $minifier = new static($importPath);
225
-                $importContent = $minifier->execute($source, $parents);
226
-
227
-                // check if this is only valid for certain media
228
-                if (!empty($match['media'])) {
229
-                    $importContent = '@media '.$match['media'].'{'.$importContent.'}';
230
-                }
231
-
232
-                // add to replacement array
233
-                $search[] = $match[0];
234
-                $replace[] = $importContent;
235
-            }
236
-        }
237
-
238
-        // replace the import statements
239
-        $content = str_replace($search, $replace, $content);
240
-
241
-        return $content;
242
-    }
243
-
244
-    /**
245
-     * Import files into the CSS, base64-ized.
246
-     *
247
-     * @url(image.jpg) images will be loaded and their content merged into the
248
-     * original file, to save HTTP requests.
249
-     *
250
-     * @param string $source  The file to import files for.
251
-     * @param string $content The CSS content to import files for.
252
-     *
253
-     * @return string
254
-     */
255
-    protected function importFiles($source, $content)
256
-    {
257
-        $extensions = array_keys($this->importExtensions);
258
-        $regex = '/url\((["\']?)((?!["\']?data:).*?\.('.implode('|', $extensions).'))\\1\)/i';
259
-        if ($extensions && preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) {
260
-            $search = array();
261
-            $replace = array();
262
-
263
-            // loop the matches
264
-            foreach ($matches as $match) {
265
-                // get the path for the file that will be imported
266
-                $path = $match[2];
267
-                $path = dirname($source).'/'.$path;
268
-                $extension = $match[3];
269
-
270
-                // only replace the import with the content if we're able to get
271
-                // the content of the file, and it's relatively small
272
-                if ($this->canImportFile($path) && $this->canImportBySize($path)) {
273
-                    // grab content && base64-ize
274
-                    $importContent = $this->load($path);
275
-                    $importContent = base64_encode($importContent);
276
-
277
-                    // build replacement
278
-                    $search[] = $match[0];
279
-                    $replace[] = 'url('.$this->importExtensions[$extension].';base64,'.$importContent.')';
280
-                }
281
-            }
282
-
283
-            // replace the import statements
284
-            $content = str_replace($search, $replace, $content);
285
-        }
286
-
287
-        return $content;
288
-    }
289
-
290
-    /**
291
-     * Minify the data.
292
-     * Perform CSS optimizations.
293
-     *
294
-     * @param string[optional] $path    Path to write the data to.
295
-     * @param string[]         $parents Parent paths, for circular reference checks.
296
-     *
297
-     * @return string The minified data.
298
-     */
299
-    public function execute($path = null, $parents = array())
300
-    {
301
-        $content = '';
302
-
303
-        // loop css data (raw data and files)
304
-        foreach ($this->data as $source => $css) {
305
-            /*
195
+		);
196
+
197
+		// find all relative imports in css
198
+		$matches = array();
199
+		foreach ($importRegexes as $importRegex) {
200
+			if (preg_match_all($importRegex, $content, $regexMatches, PREG_SET_ORDER)) {
201
+				$matches = array_merge($matches, $regexMatches);
202
+			}
203
+		}
204
+
205
+		$search = array();
206
+		$replace = array();
207
+
208
+		// loop the matches
209
+		foreach ($matches as $match) {
210
+			// get the path for the file that will be imported
211
+			$importPath = dirname($source).'/'.$match['path'];
212
+
213
+			// only replace the import with the content if we can grab the
214
+			// content of the file
215
+			if ($this->canImportFile($importPath)) {
216
+				// check if current file was not imported previously in the same
217
+				// import chain.
218
+				if (in_array($importPath, $parents)) {
219
+					throw new FileImportException('Failed to import file "'.$importPath.'": circular reference detected.');
220
+				}
221
+
222
+				// grab referenced file & minify it (which may include importing
223
+				// yet other @import statements recursively)
224
+				$minifier = new static($importPath);
225
+				$importContent = $minifier->execute($source, $parents);
226
+
227
+				// check if this is only valid for certain media
228
+				if (!empty($match['media'])) {
229
+					$importContent = '@media '.$match['media'].'{'.$importContent.'}';
230
+				}
231
+
232
+				// add to replacement array
233
+				$search[] = $match[0];
234
+				$replace[] = $importContent;
235
+			}
236
+		}
237
+
238
+		// replace the import statements
239
+		$content = str_replace($search, $replace, $content);
240
+
241
+		return $content;
242
+	}
243
+
244
+	/**
245
+	 * Import files into the CSS, base64-ized.
246
+	 *
247
+	 * @url(image.jpg) images will be loaded and their content merged into the
248
+	 * original file, to save HTTP requests.
249
+	 *
250
+	 * @param string $source  The file to import files for.
251
+	 * @param string $content The CSS content to import files for.
252
+	 *
253
+	 * @return string
254
+	 */
255
+	protected function importFiles($source, $content)
256
+	{
257
+		$extensions = array_keys($this->importExtensions);
258
+		$regex = '/url\((["\']?)((?!["\']?data:).*?\.('.implode('|', $extensions).'))\\1\)/i';
259
+		if ($extensions && preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) {
260
+			$search = array();
261
+			$replace = array();
262
+
263
+			// loop the matches
264
+			foreach ($matches as $match) {
265
+				// get the path for the file that will be imported
266
+				$path = $match[2];
267
+				$path = dirname($source).'/'.$path;
268
+				$extension = $match[3];
269
+
270
+				// only replace the import with the content if we're able to get
271
+				// the content of the file, and it's relatively small
272
+				if ($this->canImportFile($path) && $this->canImportBySize($path)) {
273
+					// grab content && base64-ize
274
+					$importContent = $this->load($path);
275
+					$importContent = base64_encode($importContent);
276
+
277
+					// build replacement
278
+					$search[] = $match[0];
279
+					$replace[] = 'url('.$this->importExtensions[$extension].';base64,'.$importContent.')';
280
+				}
281
+			}
282
+
283
+			// replace the import statements
284
+			$content = str_replace($search, $replace, $content);
285
+		}
286
+
287
+		return $content;
288
+	}
289
+
290
+	/**
291
+	 * Minify the data.
292
+	 * Perform CSS optimizations.
293
+	 *
294
+	 * @param string[optional] $path    Path to write the data to.
295
+	 * @param string[]         $parents Parent paths, for circular reference checks.
296
+	 *
297
+	 * @return string The minified data.
298
+	 */
299
+	public function execute($path = null, $parents = array())
300
+	{
301
+		$content = '';
302
+
303
+		// loop css data (raw data and files)
304
+		foreach ($this->data as $source => $css) {
305
+			/*
306 306
              * Let's first take out strings & comments, since we can't just remove
307 307
              * whitespace anywhere. If whitespace occurs inside a string, we should
308 308
              * leave it alone. E.g.:
309 309
              * p { content: "a   test" }
310 310
              */
311
-            $this->extractStrings();
312
-            $this->stripComments();
313
-            $css = $this->replace($css);
311
+			$this->extractStrings();
312
+			$this->stripComments();
313
+			$css = $this->replace($css);
314 314
 
315
-            $css = $this->stripWhitespace($css);
316
-            $css = $this->shortenHex($css);
317
-            $css = $this->shortenZeroes($css);
318
-            $css = $this->stripEmptyTags($css);
315
+			$css = $this->stripWhitespace($css);
316
+			$css = $this->shortenHex($css);
317
+			$css = $this->shortenZeroes($css);
318
+			$css = $this->stripEmptyTags($css);
319 319
 
320
-            // restore the string we've extracted earlier
321
-            $css = $this->restoreExtractedData($css);
320
+			// restore the string we've extracted earlier
321
+			$css = $this->restoreExtractedData($css);
322 322
 
323
-            $source = is_int($source) ? '' : $source;
324
-            $parents = $source ? array_merge($parents, array($source)) : $parents;
325
-            $css = $this->combineImports($source, $css, $parents);
326
-            $css = $this->importFiles($source, $css);
323
+			$source = is_int($source) ? '' : $source;
324
+			$parents = $source ? array_merge($parents, array($source)) : $parents;
325
+			$css = $this->combineImports($source, $css, $parents);
326
+			$css = $this->importFiles($source, $css);
327 327
 
328
-            /*
328
+			/*
329 329
              * If we'll save to a new path, we'll have to fix the relative paths
330 330
              * to be relative no longer to the source file, but to the new path.
331 331
              * If we don't write to a file, fall back to same path so no
332 332
              * conversion happens (because we still want it to go through most
333 333
              * of the move code...)
334 334
              */
335
-            $converter = new Converter($source, $path ?: $source);
336
-            $css = $this->move($converter, $css);
337
-
338
-            // combine css
339
-            $content .= $css;
340
-        }
341
-
342
-        $content = $this->moveImportsToTop($content);
343
-
344
-        return $content;
345
-    }
346
-
347
-    /**
348
-     * Moving a css file should update all relative urls.
349
-     * Relative references (e.g. ../images/image.gif) in a certain css file,
350
-     * will have to be updated when a file is being saved at another location
351
-     * (e.g. ../../images/image.gif, if the new CSS file is 1 folder deeper).
352
-     *
353
-     * @param Converter $converter Relative path converter
354
-     * @param string    $content   The CSS content to update relative urls for.
355
-     *
356
-     * @return string
357
-     */
358
-    protected function move(Converter $converter, $content)
359
-    {
360
-        /*
335
+			$converter = new Converter($source, $path ?: $source);
336
+			$css = $this->move($converter, $css);
337
+
338
+			// combine css
339
+			$content .= $css;
340
+		}
341
+
342
+		$content = $this->moveImportsToTop($content);
343
+
344
+		return $content;
345
+	}
346
+
347
+	/**
348
+	 * Moving a css file should update all relative urls.
349
+	 * Relative references (e.g. ../images/image.gif) in a certain css file,
350
+	 * will have to be updated when a file is being saved at another location
351
+	 * (e.g. ../../images/image.gif, if the new CSS file is 1 folder deeper).
352
+	 *
353
+	 * @param Converter $converter Relative path converter
354
+	 * @param string    $content   The CSS content to update relative urls for.
355
+	 *
356
+	 * @return string
357
+	 */
358
+	protected function move(Converter $converter, $content)
359
+	{
360
+		/*
361 361
          * Relative path references will usually be enclosed by url(). @import
362 362
          * is an exception, where url() is not necessary around the path (but is
363 363
          * allowed).
@@ -368,9 +368,9 @@  discard block
 block discarded – undo
368 368
          * recent PCRE version. That's why I'm doing 2 separate regular
369 369
          * expressions & combining the matches after executing of both.
370 370
          */
371
-        $relativeRegexes = array(
372
-            // url(xxx)
373
-            '/
371
+		$relativeRegexes = array(
372
+			// url(xxx)
373
+			'/
374 374
             # open url()
375 375
             url\(
376 376
 
@@ -402,8 +402,8 @@  discard block
 block discarded – undo
402 402
 
403 403
             /ix',
404 404
 
405
-            // @import "xxx"
406
-            '/
405
+			// @import "xxx"
406
+			'/
407 407
             # import statement
408 408
             @import
409 409
 
@@ -432,167 +432,167 @@  discard block
 block discarded – undo
432 432
                 (?P=quotes)
433 433
 
434 434
             /ix',
435
-        );
436
-
437
-        // find all relative urls in css
438
-        $matches = array();
439
-        foreach ($relativeRegexes as $relativeRegex) {
440
-            if (preg_match_all($relativeRegex, $content, $regexMatches, PREG_SET_ORDER)) {
441
-                $matches = array_merge($matches, $regexMatches);
442
-            }
443
-        }
444
-
445
-        $search = array();
446
-        $replace = array();
447
-
448
-        // loop all urls
449
-        foreach ($matches as $match) {
450
-            // determine if it's a url() or an @import match
451
-            $type = (strpos($match[0], '@import') === 0 ? 'import' : 'url');
452
-
453
-            // attempting to interpret GET-params makes no sense, so let's discard them for awhile
454
-            $params = strrchr($match['path'], '?');
455
-            $url = $params ? substr($match['path'], 0, -strlen($params)) : $match['path'];
456
-
457
-            // fix relative url
458
-            $url = $converter->convert($url);
459
-
460
-            // now that the path has been converted, re-apply GET-params
461
-            $url .= $params;
462
-
463
-            // build replacement
464
-            $search[] = $match[0];
465
-            if ($type == 'url') {
466
-                $replace[] = 'url('.$url.')';
467
-            } elseif ($type == 'import') {
468
-                $replace[] = '@import "'.$url.'"';
469
-            }
470
-        }
471
-
472
-        // replace urls
473
-        $content = str_replace($search, $replace, $content);
474
-
475
-        return $content;
476
-    }
477
-
478
-    /**
479
-     * Shorthand hex color codes.
480
-     * #FF0000 -> #F00.
481
-     *
482
-     * @param string $content The CSS content to shorten the hex color codes for.
483
-     *
484
-     * @return string
485
-     */
486
-    protected function shortenHex($content)
487
-    {
488
-        $content = preg_replace('/(?<![\'"])#([0-9a-z])\\1([0-9a-z])\\2([0-9a-z])\\3(?![\'"])/i', '#$1$2$3', $content);
489
-
490
-        return $content;
491
-    }
492
-
493
-    /**
494
-     * Shorthand 0 values to plain 0, instead of e.g. -0em.
495
-     *
496
-     * @param string $content The CSS content to shorten the zero values for.
497
-     *
498
-     * @return string
499
-     */
500
-    protected function shortenZeroes($content)
501
-    {
502
-        // reusable bits of code throughout these regexes:
503
-        // before & after are used to make sure we don't match lose unintended
504
-        // 0-like values (e.g. in #000, or in http://url/1.0)
505
-        // units can be stripped from 0 values, or used to recognize non 0
506
-        // values (where wa may be able to strip a .0 suffix)
507
-        $before = '(?<=[:(, ])';
508
-        $after = '(?=[ ,);}])';
509
-        $units = '(em|ex|%|px|cm|mm|in|pt|pc|ch|rem|vh|vw|vmin|vmax|vm)';
510
-
511
-        // strip units after zeroes (0px -> 0)
512
-        // NOTE: it should be safe to remove all units for a 0 value, but in
513
-        // practice, Webkit (especially Safari) seems to stumble over at least
514
-        // 0%, potentially other units as well. Only stripping 'px' for now.
515
-        // @see https://github.com/matthiasmullie/minify/issues/60
516
-        $content = preg_replace('/'.$before.'(-?0*(\.0+)?)(?<=0)px'.$after.'/', '\\1', $content);
517
-
518
-        // strip 0-digits (.0 -> 0)
519
-        $content = preg_replace('/'.$before.'\.0+'.$units.'?'.$after.'/', '0\\1', $content);
520
-        // strip trailing 0: 50.10 -> 50.1, 50.10px -> 50.1px
521
-        $content = preg_replace('/'.$before.'(-?[0-9]+\.[0-9]+)0+'.$units.'?'.$after.'/', '\\1\\2', $content);
522
-        // strip trailing 0: 50.00 -> 50, 50.00px -> 50px
523
-        $content = preg_replace('/'.$before.'(-?[0-9]+)\.0+'.$units.'?'.$after.'/', '\\1\\2', $content);
524
-        // strip leading 0: 0.1 -> .1, 01.1 -> 1.1
525
-        $content = preg_replace('/'.$before.'(-?)0+([0-9]*\.[0-9]+)'.$units.'?'.$after.'/', '\\1\\2\\3', $content);
526
-
527
-        // strip negative zeroes (-0 -> 0) & truncate zeroes (00 -> 0)
528
-        $content = preg_replace('/'.$before.'-?0+'.$units.'?'.$after.'/', '0\\1', $content);
529
-
530
-        return $content;
531
-    }
532
-
533
-    /**
534
-     * Strip comments from source code.
535
-     *
536
-     * @param string $content
537
-     *
538
-     * @return string
539
-     */
540
-    protected function stripEmptyTags($content)
541
-    {
542
-        return preg_replace('/(^|\})[^\{\}]+\{\s*\}/', '\\1', $content);
543
-    }
544
-
545
-    /**
546
-     * Strip comments from source code.
547
-     */
548
-    protected function stripComments()
549
-    {
550
-        $this->registerPattern('/\/\*.*?\*\//s', '');
551
-    }
552
-
553
-    /**
554
-     * Strip whitespace.
555
-     *
556
-     * @param string $content The CSS content to strip the whitespace for.
557
-     *
558
-     * @return string
559
-     */
560
-    protected function stripWhitespace($content)
561
-    {
562
-        // remove leading & trailing whitespace
563
-        $content = preg_replace('/^\s*/m', '', $content);
564
-        $content = preg_replace('/\s*$/m', '', $content);
565
-
566
-        // replace newlines with a single space
567
-        $content = preg_replace('/\s+/', ' ', $content);
568
-
569
-        // remove whitespace around meta characters
570
-        // inspired by stackoverflow.com/questions/15195750/minify-compress-css-with-regex
571
-        $content = preg_replace('/\s*([\*$~^|]?+=|[{};,>~]|!important\b)\s*/', '$1', $content);
572
-        $content = preg_replace('/([\[(:])\s+/', '$1', $content);
573
-        $content = preg_replace('/\s+([\]\)])/', '$1', $content);
574
-        $content = preg_replace('/\s+(:)(?![^\}]*\{)/', '$1', $content);
575
-
576
-        // whitespace around + and - can only be stripped in selectors, like
577
-        // :nth-child(3+2n), not in things like calc(3px + 2px) or shorthands
578
-        // like 3px -2px
579
-        $content = preg_replace('/\s*([+-])\s*(?=[^}]*{)/', '$1', $content);
580
-
581
-        // remove semicolon/whitespace followed by closing bracket
582
-        $content = str_replace(';}', '}', $content);
583
-
584
-        return trim($content);
585
-    }
586
-
587
-    /**
588
-     * Check if file is small enough to be imported.
589
-     *
590
-     * @param string $path The path to the file.
591
-     *
592
-     * @return bool
593
-     */
594
-    protected function canImportBySize($path)
595
-    {
596
-        return ($size = @filesize($path)) && $size <= $this->maxImportSize * 1024;
597
-    }
435
+		);
436
+
437
+		// find all relative urls in css
438
+		$matches = array();
439
+		foreach ($relativeRegexes as $relativeRegex) {
440
+			if (preg_match_all($relativeRegex, $content, $regexMatches, PREG_SET_ORDER)) {
441
+				$matches = array_merge($matches, $regexMatches);
442
+			}
443
+		}
444
+
445
+		$search = array();
446
+		$replace = array();
447
+
448
+		// loop all urls
449
+		foreach ($matches as $match) {
450
+			// determine if it's a url() or an @import match
451
+			$type = (strpos($match[0], '@import') === 0 ? 'import' : 'url');
452
+
453
+			// attempting to interpret GET-params makes no sense, so let's discard them for awhile
454
+			$params = strrchr($match['path'], '?');
455
+			$url = $params ? substr($match['path'], 0, -strlen($params)) : $match['path'];
456
+
457
+			// fix relative url
458
+			$url = $converter->convert($url);
459
+
460
+			// now that the path has been converted, re-apply GET-params
461
+			$url .= $params;
462
+
463
+			// build replacement
464
+			$search[] = $match[0];
465
+			if ($type == 'url') {
466
+				$replace[] = 'url('.$url.')';
467
+			} elseif ($type == 'import') {
468
+				$replace[] = '@import "'.$url.'"';
469
+			}
470
+		}
471
+
472
+		// replace urls
473
+		$content = str_replace($search, $replace, $content);
474
+
475
+		return $content;
476
+	}
477
+
478
+	/**
479
+	 * Shorthand hex color codes.
480
+	 * #FF0000 -> #F00.
481
+	 *
482
+	 * @param string $content The CSS content to shorten the hex color codes for.
483
+	 *
484
+	 * @return string
485
+	 */
486
+	protected function shortenHex($content)
487
+	{
488
+		$content = preg_replace('/(?<![\'"])#([0-9a-z])\\1([0-9a-z])\\2([0-9a-z])\\3(?![\'"])/i', '#$1$2$3', $content);
489
+
490
+		return $content;
491
+	}
492
+
493
+	/**
494
+	 * Shorthand 0 values to plain 0, instead of e.g. -0em.
495
+	 *
496
+	 * @param string $content The CSS content to shorten the zero values for.
497
+	 *
498
+	 * @return string
499
+	 */
500
+	protected function shortenZeroes($content)
501
+	{
502
+		// reusable bits of code throughout these regexes:
503
+		// before & after are used to make sure we don't match lose unintended
504
+		// 0-like values (e.g. in #000, or in http://url/1.0)
505
+		// units can be stripped from 0 values, or used to recognize non 0
506
+		// values (where wa may be able to strip a .0 suffix)
507
+		$before = '(?<=[:(, ])';
508
+		$after = '(?=[ ,);}])';
509
+		$units = '(em|ex|%|px|cm|mm|in|pt|pc|ch|rem|vh|vw|vmin|vmax|vm)';
510
+
511
+		// strip units after zeroes (0px -> 0)
512
+		// NOTE: it should be safe to remove all units for a 0 value, but in
513
+		// practice, Webkit (especially Safari) seems to stumble over at least
514
+		// 0%, potentially other units as well. Only stripping 'px' for now.
515
+		// @see https://github.com/matthiasmullie/minify/issues/60
516
+		$content = preg_replace('/'.$before.'(-?0*(\.0+)?)(?<=0)px'.$after.'/', '\\1', $content);
517
+
518
+		// strip 0-digits (.0 -> 0)
519
+		$content = preg_replace('/'.$before.'\.0+'.$units.'?'.$after.'/', '0\\1', $content);
520
+		// strip trailing 0: 50.10 -> 50.1, 50.10px -> 50.1px
521
+		$content = preg_replace('/'.$before.'(-?[0-9]+\.[0-9]+)0+'.$units.'?'.$after.'/', '\\1\\2', $content);
522
+		// strip trailing 0: 50.00 -> 50, 50.00px -> 50px
523
+		$content = preg_replace('/'.$before.'(-?[0-9]+)\.0+'.$units.'?'.$after.'/', '\\1\\2', $content);
524
+		// strip leading 0: 0.1 -> .1, 01.1 -> 1.1
525
+		$content = preg_replace('/'.$before.'(-?)0+([0-9]*\.[0-9]+)'.$units.'?'.$after.'/', '\\1\\2\\3', $content);
526
+
527
+		// strip negative zeroes (-0 -> 0) & truncate zeroes (00 -> 0)
528
+		$content = preg_replace('/'.$before.'-?0+'.$units.'?'.$after.'/', '0\\1', $content);
529
+
530
+		return $content;
531
+	}
532
+
533
+	/**
534
+	 * Strip comments from source code.
535
+	 *
536
+	 * @param string $content
537
+	 *
538
+	 * @return string
539
+	 */
540
+	protected function stripEmptyTags($content)
541
+	{
542
+		return preg_replace('/(^|\})[^\{\}]+\{\s*\}/', '\\1', $content);
543
+	}
544
+
545
+	/**
546
+	 * Strip comments from source code.
547
+	 */
548
+	protected function stripComments()
549
+	{
550
+		$this->registerPattern('/\/\*.*?\*\//s', '');
551
+	}
552
+
553
+	/**
554
+	 * Strip whitespace.
555
+	 *
556
+	 * @param string $content The CSS content to strip the whitespace for.
557
+	 *
558
+	 * @return string
559
+	 */
560
+	protected function stripWhitespace($content)
561
+	{
562
+		// remove leading & trailing whitespace
563
+		$content = preg_replace('/^\s*/m', '', $content);
564
+		$content = preg_replace('/\s*$/m', '', $content);
565
+
566
+		// replace newlines with a single space
567
+		$content = preg_replace('/\s+/', ' ', $content);
568
+
569
+		// remove whitespace around meta characters
570
+		// inspired by stackoverflow.com/questions/15195750/minify-compress-css-with-regex
571
+		$content = preg_replace('/\s*([\*$~^|]?+=|[{};,>~]|!important\b)\s*/', '$1', $content);
572
+		$content = preg_replace('/([\[(:])\s+/', '$1', $content);
573
+		$content = preg_replace('/\s+([\]\)])/', '$1', $content);
574
+		$content = preg_replace('/\s+(:)(?![^\}]*\{)/', '$1', $content);
575
+
576
+		// whitespace around + and - can only be stripped in selectors, like
577
+		// :nth-child(3+2n), not in things like calc(3px + 2px) or shorthands
578
+		// like 3px -2px
579
+		$content = preg_replace('/\s*([+-])\s*(?=[^}]*{)/', '$1', $content);
580
+
581
+		// remove semicolon/whitespace followed by closing bracket
582
+		$content = str_replace(';}', '}', $content);
583
+
584
+		return trim($content);
585
+	}
586
+
587
+	/**
588
+	 * Check if file is small enough to be imported.
589
+	 *
590
+	 * @param string $path The path to the file.
591
+	 *
592
+	 * @return bool
593
+	 */
594
+	protected function canImportBySize($path)
595
+	{
596
+		return ($size = @filesize($path)) && $size <= $this->maxImportSize * 1024;
597
+	}
598 598
 }
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -83,7 +83,7 @@  discard block
 block discarded – undo
83 83
             }
84 84
 
85 85
             // add to top
86
-            $content = implode('', $matches[0]).$content;
86
+            $content = implode('', $matches[0]) . $content;
87 87
         };
88 88
 
89 89
         return $content;
@@ -208,7 +208,7 @@  discard block
 block discarded – undo
208 208
         // loop the matches
209 209
         foreach ($matches as $match) {
210 210
             // get the path for the file that will be imported
211
-            $importPath = dirname($source).'/'.$match['path'];
211
+            $importPath = dirname($source) . '/' . $match['path'];
212 212
 
213 213
             // only replace the import with the content if we can grab the
214 214
             // content of the file
@@ -216,7 +216,7 @@  discard block
 block discarded – undo
216 216
                 // check if current file was not imported previously in the same
217 217
                 // import chain.
218 218
                 if (in_array($importPath, $parents)) {
219
-                    throw new FileImportException('Failed to import file "'.$importPath.'": circular reference detected.');
219
+                    throw new FileImportException('Failed to import file "' . $importPath . '": circular reference detected.');
220 220
                 }
221 221
 
222 222
                 // grab referenced file & minify it (which may include importing
@@ -226,7 +226,7 @@  discard block
 block discarded – undo
226 226
 
227 227
                 // check if this is only valid for certain media
228 228
                 if (!empty($match['media'])) {
229
-                    $importContent = '@media '.$match['media'].'{'.$importContent.'}';
229
+                    $importContent = '@media ' . $match['media'] . '{' . $importContent . '}';
230 230
                 }
231 231
 
232 232
                 // add to replacement array
@@ -255,7 +255,7 @@  discard block
 block discarded – undo
255 255
     protected function importFiles($source, $content)
256 256
     {
257 257
         $extensions = array_keys($this->importExtensions);
258
-        $regex = '/url\((["\']?)((?!["\']?data:).*?\.('.implode('|', $extensions).'))\\1\)/i';
258
+        $regex = '/url\((["\']?)((?!["\']?data:).*?\.(' . implode('|', $extensions) . '))\\1\)/i';
259 259
         if ($extensions && preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) {
260 260
             $search = array();
261 261
             $replace = array();
@@ -264,7 +264,7 @@  discard block
 block discarded – undo
264 264
             foreach ($matches as $match) {
265 265
                 // get the path for the file that will be imported
266 266
                 $path = $match[2];
267
-                $path = dirname($source).'/'.$path;
267
+                $path = dirname($source) . '/' . $path;
268 268
                 $extension = $match[3];
269 269
 
270 270
                 // only replace the import with the content if we're able to get
@@ -276,7 +276,7 @@  discard block
 block discarded – undo
276 276
 
277 277
                     // build replacement
278 278
                     $search[] = $match[0];
279
-                    $replace[] = 'url('.$this->importExtensions[$extension].';base64,'.$importContent.')';
279
+                    $replace[] = 'url(' . $this->importExtensions[$extension] . ';base64,' . $importContent . ')';
280 280
                 }
281 281
             }
282 282
 
@@ -463,9 +463,9 @@  discard block
 block discarded – undo
463 463
             // build replacement
464 464
             $search[] = $match[0];
465 465
             if ($type == 'url') {
466
-                $replace[] = 'url('.$url.')';
466
+                $replace[] = 'url(' . $url . ')';
467 467
             } elseif ($type == 'import') {
468
-                $replace[] = '@import "'.$url.'"';
468
+                $replace[] = '@import "' . $url . '"';
469 469
             }
470 470
         }
471 471
 
@@ -513,19 +513,19 @@  discard block
 block discarded – undo
513 513
         // practice, Webkit (especially Safari) seems to stumble over at least
514 514
         // 0%, potentially other units as well. Only stripping 'px' for now.
515 515
         // @see https://github.com/matthiasmullie/minify/issues/60
516
-        $content = preg_replace('/'.$before.'(-?0*(\.0+)?)(?<=0)px'.$after.'/', '\\1', $content);
516
+        $content = preg_replace('/' . $before . '(-?0*(\.0+)?)(?<=0)px' . $after . '/', '\\1', $content);
517 517
 
518 518
         // strip 0-digits (.0 -> 0)
519
-        $content = preg_replace('/'.$before.'\.0+'.$units.'?'.$after.'/', '0\\1', $content);
519
+        $content = preg_replace('/' . $before . '\.0+' . $units . '?' . $after . '/', '0\\1', $content);
520 520
         // strip trailing 0: 50.10 -> 50.1, 50.10px -> 50.1px
521
-        $content = preg_replace('/'.$before.'(-?[0-9]+\.[0-9]+)0+'.$units.'?'.$after.'/', '\\1\\2', $content);
521
+        $content = preg_replace('/' . $before . '(-?[0-9]+\.[0-9]+)0+' . $units . '?' . $after . '/', '\\1\\2', $content);
522 522
         // strip trailing 0: 50.00 -> 50, 50.00px -> 50px
523
-        $content = preg_replace('/'.$before.'(-?[0-9]+)\.0+'.$units.'?'.$after.'/', '\\1\\2', $content);
523
+        $content = preg_replace('/' . $before . '(-?[0-9]+)\.0+' . $units . '?' . $after . '/', '\\1\\2', $content);
524 524
         // strip leading 0: 0.1 -> .1, 01.1 -> 1.1
525
-        $content = preg_replace('/'.$before.'(-?)0+([0-9]*\.[0-9]+)'.$units.'?'.$after.'/', '\\1\\2\\3', $content);
525
+        $content = preg_replace('/' . $before . '(-?)0+([0-9]*\.[0-9]+)' . $units . '?' . $after . '/', '\\1\\2\\3', $content);
526 526
 
527 527
         // strip negative zeroes (-0 -> 0) & truncate zeroes (00 -> 0)
528
-        $content = preg_replace('/'.$before.'-?0+'.$units.'?'.$after.'/', '0\\1', $content);
528
+        $content = preg_replace('/' . $before . '-?0+' . $units . '?' . $after . '/', '0\\1', $content);
529 529
 
530 530
         return $content;
531 531
     }
Please login to merge, or discard this patch.
Sources/minify/src/Minify.php 2 patches
Indentation   +383 added lines, -383 removed lines patch added patch discarded remove patch
@@ -16,326 +16,326 @@  discard block
 block discarded – undo
16 16
  */
17 17
 abstract class Minify
18 18
 {
19
-    /**
20
-     * The data to be minified.
21
-     *
22
-     * @var string[]
23
-     */
24
-    protected $data = array();
25
-
26
-    /**
27
-     * Array of patterns to match.
28
-     *
29
-     * @var string[]
30
-     */
31
-    protected $patterns = array();
32
-
33
-    /**
34
-     * This array will hold content of strings and regular expressions that have
35
-     * been extracted from the JS source code, so we can reliably match "code",
36
-     * without having to worry about potential "code-like" characters inside.
37
-     *
38
-     * @var string[]
39
-     */
40
-    public $extracted = array();
41
-
42
-    /**
43
-     * Init the minify class - optionally, code may be passed along already.
44
-     */
45
-    public function __construct(/* $data = null, ... */)
46
-    {
47
-        // it's possible to add the source through the constructor as well ;)
48
-        if (func_num_args()) {
49
-            call_user_func_array(array($this, 'add'), func_get_args());
50
-        }
51
-    }
52
-
53
-    /**
54
-     * Add a file or straight-up code to be minified.
55
-     *
56
-     * @param string $data
57
-     */
58
-    public function add($data /* $data = null, ... */)
59
-    {
60
-        // bogus "usage" of parameter $data: scrutinizer warns this variable is
61
-        // not used (we're using func_get_args instead to support overloading),
62
-        // but it still needs to be defined because it makes no sense to have
63
-        // this function without argument :)
64
-        $args = array($data) + func_get_args();
65
-
66
-        // this method can be overloaded
67
-        foreach ($args as $data) {
68
-            // redefine var
69
-            $data = (string) $data;
70
-
71
-            // load data
72
-            $value = $this->load($data);
73
-            $key = ($data != $value) ? $data : count($this->data);
74
-
75
-            // store data
76
-            $this->data[$key] = $value;
77
-        }
78
-    }
79
-
80
-    /**
81
-     * Minify the data & (optionally) saves it to a file.
82
-     *
83
-     * @param string[optional] $path Path to write the data to.
84
-     *
85
-     * @return string The minified data.
86
-     */
87
-    public function minify($path = null)
88
-    {
89
-        $content = $this->execute($path);
90
-
91
-        // save to path
92
-        if ($path !== null) {
93
-            $this->save($content, $path);
94
-        }
95
-
96
-        return $content;
97
-    }
98
-
99
-    /**
100
-     * Minify & gzip the data & (optionally) saves it to a file.
101
-     *
102
-     * @param string[optional] $path  Path to write the data to.
103
-     * @param int[optional]    $level Compression level, from 0 to 9.
104
-     *
105
-     * @return string The minified & gzipped data.
106
-     */
107
-    public function gzip($path = null, $level = 9)
108
-    {
109
-        $content = $this->execute($path);
110
-        $content = gzencode($content, $level, FORCE_GZIP);
111
-
112
-        // save to path
113
-        if ($path !== null) {
114
-            $this->save($content, $path);
115
-        }
116
-
117
-        return $content;
118
-    }
119
-
120
-    /**
121
-     * Minify the data & write it to a CacheItemInterface object.
122
-     *
123
-     * @param CacheItemInterface $item Cache item to write the data to.
124
-     *
125
-     * @return CacheItemInterface Cache item with the minifier data.
126
-     */
127
-    public function cache(CacheItemInterface $item)
128
-    {
129
-        $content = $this->execute();
130
-        $item->set($content);
131
-
132
-        return $item;
133
-    }
134
-
135
-    /**
136
-     * Minify the data.
137
-     *
138
-     * @param string[optional] $path Path to write the data to.
139
-     *
140
-     * @return string The minified data.
141
-     */
142
-    abstract public function execute($path = null);
143
-
144
-    /**
145
-     * Load data.
146
-     *
147
-     * @param string $data Either a path to a file or the content itself.
148
-     *
149
-     * @return string
150
-     */
151
-    protected function load($data)
152
-    {
153
-        // check if the data is a file
154
-        if ($this->canImportFile($data)) {
155
-            $data = file_get_contents($data);
156
-
157
-            // strip BOM, if any
158
-            if (substr($data, 0, 3) == "\xef\xbb\xbf") {
159
-                $data = substr($data, 3);
160
-            }
161
-        }
162
-
163
-        return $data;
164
-    }
165
-
166
-    /**
167
-     * Save to file.
168
-     *
169
-     * @param string $content The minified data.
170
-     * @param string $path    The path to save the minified data to.
171
-     *
172
-     * @throws IOException
173
-     */
174
-    protected function save($content, $path)
175
-    {
176
-        $handler = $this->openFileForWriting($path);
177
-
178
-        $this->writeToFile($handler, $content);
179
-
180
-        @fclose($handler);
181
-    }
182
-
183
-    /**
184
-     * Register a pattern to execute against the source content.
185
-     *
186
-     * @param string          $pattern     PCRE pattern.
187
-     * @param string|callable $replacement Replacement value for matched pattern.
188
-     */
189
-    protected function registerPattern($pattern, $replacement = '')
190
-    {
191
-        // study the pattern, we'll execute it more than once
192
-        $pattern .= 'S';
193
-
194
-        $this->patterns[] = array($pattern, $replacement);
195
-    }
196
-
197
-    /**
198
-     * We can't "just" run some regular expressions against JavaScript: it's a
199
-     * complex language. E.g. having an occurrence of // xyz would be a comment,
200
-     * unless it's used within a string. Of you could have something that looks
201
-     * like a 'string', but inside a comment.
202
-     * The only way to accurately replace these pieces is to traverse the JS one
203
-     * character at a time and try to find whatever starts first.
204
-     *
205
-     * @param string $content The content to replace patterns in.
206
-     *
207
-     * @return string The (manipulated) content.
208
-     */
209
-    protected function replace($content)
210
-    {
211
-        $processed = '';
212
-        $positions = array_fill(0, count($this->patterns), -1);
213
-        $matches = array();
214
-
215
-        while ($content) {
216
-            // find first match for all patterns
217
-            foreach ($this->patterns as $i => $pattern) {
218
-                list($pattern, $replacement) = $pattern;
219
-
220
-                // no need to re-run matches that are still in the part of the
221
-                // content that hasn't been processed
222
-                if ($positions[$i] >= 0) {
223
-                    continue;
224
-                }
225
-
226
-                $match = null;
227
-                if (preg_match($pattern, $content, $match)) {
228
-                    $matches[$i] = $match;
229
-
230
-                    // we'll store the match position as well; that way, we
231
-                    // don't have to redo all preg_matches after changing only
232
-                    // the first (we'll still know where those others are)
233
-                    $positions[$i] = strpos($content, $match[0]);
234
-                } else {
235
-                    // if the pattern couldn't be matched, there's no point in
236
-                    // executing it again in later runs on this same content;
237
-                    // ignore this one until we reach end of content
238
-                    unset($matches[$i]);
239
-                    $positions[$i] = strlen($content);
240
-                }
241
-            }
242
-
243
-            // no more matches to find: everything's been processed, break out
244
-            if (!$matches) {
245
-                $processed .= $content;
246
-                break;
247
-            }
248
-
249
-            // see which of the patterns actually found the first thing (we'll
250
-            // only want to execute that one, since we're unsure if what the
251
-            // other found was not inside what the first found)
252
-            $discardLength = min($positions);
253
-            $firstPattern = array_search($discardLength, $positions);
254
-            $match = $matches[$firstPattern][0];
255
-
256
-            // execute the pattern that matches earliest in the content string
257
-            list($pattern, $replacement) = $this->patterns[$firstPattern];
258
-            $replacement = $this->replacePattern($pattern, $replacement, $content);
259
-
260
-            // figure out which part of the string was unmatched; that's the
261
-            // part we'll execute the patterns on again next
262
-            $content = substr($content, $discardLength);
263
-            $unmatched = (string) substr($content, strpos($content, $match) + strlen($match));
264
-
265
-            // move the replaced part to $processed and prepare $content to
266
-            // again match batch of patterns against
267
-            $processed .= substr($replacement, 0, strlen($replacement) - strlen($unmatched));
268
-            $content = $unmatched;
269
-
270
-            // first match has been replaced & that content is to be left alone,
271
-            // the next matches will start after this replacement, so we should
272
-            // fix their offsets
273
-            foreach ($positions as $i => $position) {
274
-                $positions[$i] -= $discardLength + strlen($match);
275
-            }
276
-        }
277
-
278
-        return $processed;
279
-    }
280
-
281
-    /**
282
-     * This is where a pattern is matched against $content and the matches
283
-     * are replaced by their respective value.
284
-     * This function will be called plenty of times, where $content will always
285
-     * move up 1 character.
286
-     *
287
-     * @param string          $pattern     Pattern to match.
288
-     * @param string|callable $replacement Replacement value.
289
-     * @param string          $content     Content to match pattern against.
290
-     *
291
-     * @return string
292
-     */
293
-    protected function replacePattern($pattern, $replacement, $content)
294
-    {
295
-        if (is_callable($replacement)) {
296
-            return preg_replace_callback($pattern, $replacement, $content, 1, $count);
297
-        } else {
298
-            return preg_replace($pattern, $replacement, $content, 1, $count);
299
-        }
300
-    }
301
-
302
-    /**
303
-     * Strings are a pattern we need to match, in order to ignore potential
304
-     * code-like content inside them, but we just want all of the string
305
-     * content to remain untouched.
306
-     *
307
-     * This method will replace all string content with simple STRING#
308
-     * placeholder text, so we've rid all strings from characters that may be
309
-     * misinterpreted. Original string content will be saved in $this->extracted
310
-     * and after doing all other minifying, we can restore the original content
311
-     * via restoreStrings().
312
-     *
313
-     * @param string[optional] $chars
314
-     */
315
-    protected function extractStrings($chars = '\'"')
316
-    {
317
-        // PHP only supports $this inside anonymous functions since 5.4
318
-        $minifier = $this;
319
-        $callback = function ($match) use ($minifier) {
320
-            // check the second index here, because the first always contains a quote
321
-            if (!$match[2]) {
322
-                /*
19
+	/**
20
+	 * The data to be minified.
21
+	 *
22
+	 * @var string[]
23
+	 */
24
+	protected $data = array();
25
+
26
+	/**
27
+	 * Array of patterns to match.
28
+	 *
29
+	 * @var string[]
30
+	 */
31
+	protected $patterns = array();
32
+
33
+	/**
34
+	 * This array will hold content of strings and regular expressions that have
35
+	 * been extracted from the JS source code, so we can reliably match "code",
36
+	 * without having to worry about potential "code-like" characters inside.
37
+	 *
38
+	 * @var string[]
39
+	 */
40
+	public $extracted = array();
41
+
42
+	/**
43
+	 * Init the minify class - optionally, code may be passed along already.
44
+	 */
45
+	public function __construct(/* $data = null, ... */)
46
+	{
47
+		// it's possible to add the source through the constructor as well ;)
48
+		if (func_num_args()) {
49
+			call_user_func_array(array($this, 'add'), func_get_args());
50
+		}
51
+	}
52
+
53
+	/**
54
+	 * Add a file or straight-up code to be minified.
55
+	 *
56
+	 * @param string $data
57
+	 */
58
+	public function add($data /* $data = null, ... */)
59
+	{
60
+		// bogus "usage" of parameter $data: scrutinizer warns this variable is
61
+		// not used (we're using func_get_args instead to support overloading),
62
+		// but it still needs to be defined because it makes no sense to have
63
+		// this function without argument :)
64
+		$args = array($data) + func_get_args();
65
+
66
+		// this method can be overloaded
67
+		foreach ($args as $data) {
68
+			// redefine var
69
+			$data = (string) $data;
70
+
71
+			// load data
72
+			$value = $this->load($data);
73
+			$key = ($data != $value) ? $data : count($this->data);
74
+
75
+			// store data
76
+			$this->data[$key] = $value;
77
+		}
78
+	}
79
+
80
+	/**
81
+	 * Minify the data & (optionally) saves it to a file.
82
+	 *
83
+	 * @param string[optional] $path Path to write the data to.
84
+	 *
85
+	 * @return string The minified data.
86
+	 */
87
+	public function minify($path = null)
88
+	{
89
+		$content = $this->execute($path);
90
+
91
+		// save to path
92
+		if ($path !== null) {
93
+			$this->save($content, $path);
94
+		}
95
+
96
+		return $content;
97
+	}
98
+
99
+	/**
100
+	 * Minify & gzip the data & (optionally) saves it to a file.
101
+	 *
102
+	 * @param string[optional] $path  Path to write the data to.
103
+	 * @param int[optional]    $level Compression level, from 0 to 9.
104
+	 *
105
+	 * @return string The minified & gzipped data.
106
+	 */
107
+	public function gzip($path = null, $level = 9)
108
+	{
109
+		$content = $this->execute($path);
110
+		$content = gzencode($content, $level, FORCE_GZIP);
111
+
112
+		// save to path
113
+		if ($path !== null) {
114
+			$this->save($content, $path);
115
+		}
116
+
117
+		return $content;
118
+	}
119
+
120
+	/**
121
+	 * Minify the data & write it to a CacheItemInterface object.
122
+	 *
123
+	 * @param CacheItemInterface $item Cache item to write the data to.
124
+	 *
125
+	 * @return CacheItemInterface Cache item with the minifier data.
126
+	 */
127
+	public function cache(CacheItemInterface $item)
128
+	{
129
+		$content = $this->execute();
130
+		$item->set($content);
131
+
132
+		return $item;
133
+	}
134
+
135
+	/**
136
+	 * Minify the data.
137
+	 *
138
+	 * @param string[optional] $path Path to write the data to.
139
+	 *
140
+	 * @return string The minified data.
141
+	 */
142
+	abstract public function execute($path = null);
143
+
144
+	/**
145
+	 * Load data.
146
+	 *
147
+	 * @param string $data Either a path to a file or the content itself.
148
+	 *
149
+	 * @return string
150
+	 */
151
+	protected function load($data)
152
+	{
153
+		// check if the data is a file
154
+		if ($this->canImportFile($data)) {
155
+			$data = file_get_contents($data);
156
+
157
+			// strip BOM, if any
158
+			if (substr($data, 0, 3) == "\xef\xbb\xbf") {
159
+				$data = substr($data, 3);
160
+			}
161
+		}
162
+
163
+		return $data;
164
+	}
165
+
166
+	/**
167
+	 * Save to file.
168
+	 *
169
+	 * @param string $content The minified data.
170
+	 * @param string $path    The path to save the minified data to.
171
+	 *
172
+	 * @throws IOException
173
+	 */
174
+	protected function save($content, $path)
175
+	{
176
+		$handler = $this->openFileForWriting($path);
177
+
178
+		$this->writeToFile($handler, $content);
179
+
180
+		@fclose($handler);
181
+	}
182
+
183
+	/**
184
+	 * Register a pattern to execute against the source content.
185
+	 *
186
+	 * @param string          $pattern     PCRE pattern.
187
+	 * @param string|callable $replacement Replacement value for matched pattern.
188
+	 */
189
+	protected function registerPattern($pattern, $replacement = '')
190
+	{
191
+		// study the pattern, we'll execute it more than once
192
+		$pattern .= 'S';
193
+
194
+		$this->patterns[] = array($pattern, $replacement);
195
+	}
196
+
197
+	/**
198
+	 * We can't "just" run some regular expressions against JavaScript: it's a
199
+	 * complex language. E.g. having an occurrence of // xyz would be a comment,
200
+	 * unless it's used within a string. Of you could have something that looks
201
+	 * like a 'string', but inside a comment.
202
+	 * The only way to accurately replace these pieces is to traverse the JS one
203
+	 * character at a time and try to find whatever starts first.
204
+	 *
205
+	 * @param string $content The content to replace patterns in.
206
+	 *
207
+	 * @return string The (manipulated) content.
208
+	 */
209
+	protected function replace($content)
210
+	{
211
+		$processed = '';
212
+		$positions = array_fill(0, count($this->patterns), -1);
213
+		$matches = array();
214
+
215
+		while ($content) {
216
+			// find first match for all patterns
217
+			foreach ($this->patterns as $i => $pattern) {
218
+				list($pattern, $replacement) = $pattern;
219
+
220
+				// no need to re-run matches that are still in the part of the
221
+				// content that hasn't been processed
222
+				if ($positions[$i] >= 0) {
223
+					continue;
224
+				}
225
+
226
+				$match = null;
227
+				if (preg_match($pattern, $content, $match)) {
228
+					$matches[$i] = $match;
229
+
230
+					// we'll store the match position as well; that way, we
231
+					// don't have to redo all preg_matches after changing only
232
+					// the first (we'll still know where those others are)
233
+					$positions[$i] = strpos($content, $match[0]);
234
+				} else {
235
+					// if the pattern couldn't be matched, there's no point in
236
+					// executing it again in later runs on this same content;
237
+					// ignore this one until we reach end of content
238
+					unset($matches[$i]);
239
+					$positions[$i] = strlen($content);
240
+				}
241
+			}
242
+
243
+			// no more matches to find: everything's been processed, break out
244
+			if (!$matches) {
245
+				$processed .= $content;
246
+				break;
247
+			}
248
+
249
+			// see which of the patterns actually found the first thing (we'll
250
+			// only want to execute that one, since we're unsure if what the
251
+			// other found was not inside what the first found)
252
+			$discardLength = min($positions);
253
+			$firstPattern = array_search($discardLength, $positions);
254
+			$match = $matches[$firstPattern][0];
255
+
256
+			// execute the pattern that matches earliest in the content string
257
+			list($pattern, $replacement) = $this->patterns[$firstPattern];
258
+			$replacement = $this->replacePattern($pattern, $replacement, $content);
259
+
260
+			// figure out which part of the string was unmatched; that's the
261
+			// part we'll execute the patterns on again next
262
+			$content = substr($content, $discardLength);
263
+			$unmatched = (string) substr($content, strpos($content, $match) + strlen($match));
264
+
265
+			// move the replaced part to $processed and prepare $content to
266
+			// again match batch of patterns against
267
+			$processed .= substr($replacement, 0, strlen($replacement) - strlen($unmatched));
268
+			$content = $unmatched;
269
+
270
+			// first match has been replaced & that content is to be left alone,
271
+			// the next matches will start after this replacement, so we should
272
+			// fix their offsets
273
+			foreach ($positions as $i => $position) {
274
+				$positions[$i] -= $discardLength + strlen($match);
275
+			}
276
+		}
277
+
278
+		return $processed;
279
+	}
280
+
281
+	/**
282
+	 * This is where a pattern is matched against $content and the matches
283
+	 * are replaced by their respective value.
284
+	 * This function will be called plenty of times, where $content will always
285
+	 * move up 1 character.
286
+	 *
287
+	 * @param string          $pattern     Pattern to match.
288
+	 * @param string|callable $replacement Replacement value.
289
+	 * @param string          $content     Content to match pattern against.
290
+	 *
291
+	 * @return string
292
+	 */
293
+	protected function replacePattern($pattern, $replacement, $content)
294
+	{
295
+		if (is_callable($replacement)) {
296
+			return preg_replace_callback($pattern, $replacement, $content, 1, $count);
297
+		} else {
298
+			return preg_replace($pattern, $replacement, $content, 1, $count);
299
+		}
300
+	}
301
+
302
+	/**
303
+	 * Strings are a pattern we need to match, in order to ignore potential
304
+	 * code-like content inside them, but we just want all of the string
305
+	 * content to remain untouched.
306
+	 *
307
+	 * This method will replace all string content with simple STRING#
308
+	 * placeholder text, so we've rid all strings from characters that may be
309
+	 * misinterpreted. Original string content will be saved in $this->extracted
310
+	 * and after doing all other minifying, we can restore the original content
311
+	 * via restoreStrings().
312
+	 *
313
+	 * @param string[optional] $chars
314
+	 */
315
+	protected function extractStrings($chars = '\'"')
316
+	{
317
+		// PHP only supports $this inside anonymous functions since 5.4
318
+		$minifier = $this;
319
+		$callback = function ($match) use ($minifier) {
320
+			// check the second index here, because the first always contains a quote
321
+			if (!$match[2]) {
322
+				/*
323 323
                  * Empty strings need no placeholder; they can't be confused for
324 324
                  * anything else anyway.
325 325
                  * But we still needed to match them, for the extraction routine
326 326
                  * to skip over this particular string.
327 327
                  */
328
-                return $match[0];
329
-            }
328
+				return $match[0];
329
+			}
330 330
 
331
-            $count = count($minifier->extracted);
332
-            $placeholder = $match[1].$count.$match[1];
333
-            $minifier->extracted[$placeholder] = $match[1].$match[2].$match[1];
331
+			$count = count($minifier->extracted);
332
+			$placeholder = $match[1].$count.$match[1];
333
+			$minifier->extracted[$placeholder] = $match[1].$match[2].$match[1];
334 334
 
335
-            return $placeholder;
336
-        };
335
+			return $placeholder;
336
+		};
337 337
 
338
-        /*
338
+		/*
339 339
          * The \\ messiness explained:
340 340
          * * Don't count ' or " as end-of-string if it's escaped (has backslash
341 341
          * in front of it)
@@ -347,75 +347,75 @@  discard block
 block discarded – undo
347 347
          * considered as escape-char (times 2) and to get it in the regex,
348 348
          * escaped (times 2)
349 349
          */
350
-        $this->registerPattern('/(['.$chars.'])(.*?(?<!\\\\)(\\\\\\\\)*+)\\1/s', $callback);
351
-    }
352
-
353
-    /**
354
-     * This method will restore all extracted data (strings, regexes) that were
355
-     * replaced with placeholder text in extract*(). The original content was
356
-     * saved in $this->extracted.
357
-     *
358
-     * @param string $content
359
-     *
360
-     * @return string
361
-     */
362
-    protected function restoreExtractedData($content)
363
-    {
364
-        if (!$this->extracted) {
365
-            // nothing was extracted, nothing to restore
366
-            return $content;
367
-        }
368
-
369
-        $content = strtr($content, $this->extracted);
370
-
371
-        $this->extracted = array();
372
-
373
-        return $content;
374
-    }
375
-
376
-    /**
377
-     * Check if the path is a regular file and can be read.
378
-     *
379
-     * @param string $path
380
-     *
381
-     * @return bool
382
-     */
383
-    protected function canImportFile($path)
384
-    {
385
-        return strlen($path) < PHP_MAXPATHLEN && is_file($path) && is_readable($path);
386
-    }
387
-
388
-    /**
389
-     * Attempts to open file specified by $path for writing.
390
-     *
391
-     * @param string $path The path to the file.
392
-     *
393
-     * @return resource Specifier for the target file.
394
-     *
395
-     * @throws IOException
396
-     */
397
-    protected function openFileForWriting($path)
398
-    {
399
-        if (($handler = @fopen($path, 'w')) === false) {
400
-            throw new IOException('The file "'.$path.'" could not be opened for writing. Check if PHP has enough permissions.');
401
-        }
402
-
403
-        return $handler;
404
-    }
405
-
406
-    /**
407
-     * Attempts to write $content to the file specified by $handler. $path is used for printing exceptions.
408
-     *
409
-     * @param resource $handler The resource to write to.
410
-     * @param string   $content The content to write.
411
-     * @param string   $path    The path to the file (for exception printing only).
412
-     *
413
-     * @throws IOException
414
-     */
415
-    protected function writeToFile($handler, $content, $path = '')
416
-    {
417
-        if (($result = @fwrite($handler, $content)) === false || ($result < strlen($content))) {
418
-            throw new IOException('The file "'.$path.'" could not be written to. Check your disk space and file permissions.');
419
-        }
420
-    }
350
+		$this->registerPattern('/(['.$chars.'])(.*?(?<!\\\\)(\\\\\\\\)*+)\\1/s', $callback);
351
+	}
352
+
353
+	/**
354
+	 * This method will restore all extracted data (strings, regexes) that were
355
+	 * replaced with placeholder text in extract*(). The original content was
356
+	 * saved in $this->extracted.
357
+	 *
358
+	 * @param string $content
359
+	 *
360
+	 * @return string
361
+	 */
362
+	protected function restoreExtractedData($content)
363
+	{
364
+		if (!$this->extracted) {
365
+			// nothing was extracted, nothing to restore
366
+			return $content;
367
+		}
368
+
369
+		$content = strtr($content, $this->extracted);
370
+
371
+		$this->extracted = array();
372
+
373
+		return $content;
374
+	}
375
+
376
+	/**
377
+	 * Check if the path is a regular file and can be read.
378
+	 *
379
+	 * @param string $path
380
+	 *
381
+	 * @return bool
382
+	 */
383
+	protected function canImportFile($path)
384
+	{
385
+		return strlen($path) < PHP_MAXPATHLEN && is_file($path) && is_readable($path);
386
+	}
387
+
388
+	/**
389
+	 * Attempts to open file specified by $path for writing.
390
+	 *
391
+	 * @param string $path The path to the file.
392
+	 *
393
+	 * @return resource Specifier for the target file.
394
+	 *
395
+	 * @throws IOException
396
+	 */
397
+	protected function openFileForWriting($path)
398
+	{
399
+		if (($handler = @fopen($path, 'w')) === false) {
400
+			throw new IOException('The file "'.$path.'" could not be opened for writing. Check if PHP has enough permissions.');
401
+		}
402
+
403
+		return $handler;
404
+	}
405
+
406
+	/**
407
+	 * Attempts to write $content to the file specified by $handler. $path is used for printing exceptions.
408
+	 *
409
+	 * @param resource $handler The resource to write to.
410
+	 * @param string   $content The content to write.
411
+	 * @param string   $path    The path to the file (for exception printing only).
412
+	 *
413
+	 * @throws IOException
414
+	 */
415
+	protected function writeToFile($handler, $content, $path = '')
416
+	{
417
+		if (($result = @fwrite($handler, $content)) === false || ($result < strlen($content))) {
418
+			throw new IOException('The file "'.$path.'" could not be written to. Check your disk space and file permissions.');
419
+		}
420
+	}
421 421
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -316,7 +316,7 @@  discard block
 block discarded – undo
316 316
     {
317 317
         // PHP only supports $this inside anonymous functions since 5.4
318 318
         $minifier = $this;
319
-        $callback = function ($match) use ($minifier) {
319
+        $callback = function($match) use ($minifier) {
320 320
             // check the second index here, because the first always contains a quote
321 321
             if (!$match[2]) {
322 322
                 /*
@@ -329,8 +329,8 @@  discard block
 block discarded – undo
329 329
             }
330 330
 
331 331
             $count = count($minifier->extracted);
332
-            $placeholder = $match[1].$count.$match[1];
333
-            $minifier->extracted[$placeholder] = $match[1].$match[2].$match[1];
332
+            $placeholder = $match[1] . $count . $match[1];
333
+            $minifier->extracted[$placeholder] = $match[1] . $match[2] . $match[1];
334 334
 
335 335
             return $placeholder;
336 336
         };
@@ -347,7 +347,7 @@  discard block
 block discarded – undo
347 347
          * considered as escape-char (times 2) and to get it in the regex,
348 348
          * escaped (times 2)
349 349
          */
350
-        $this->registerPattern('/(['.$chars.'])(.*?(?<!\\\\)(\\\\\\\\)*+)\\1/s', $callback);
350
+        $this->registerPattern('/([' . $chars . '])(.*?(?<!\\\\)(\\\\\\\\)*+)\\1/s', $callback);
351 351
     }
352 352
 
353 353
     /**
@@ -397,7 +397,7 @@  discard block
 block discarded – undo
397 397
     protected function openFileForWriting($path)
398 398
     {
399 399
         if (($handler = @fopen($path, 'w')) === false) {
400
-            throw new IOException('The file "'.$path.'" could not be opened for writing. Check if PHP has enough permissions.');
400
+            throw new IOException('The file "' . $path . '" could not be opened for writing. Check if PHP has enough permissions.');
401 401
         }
402 402
 
403 403
         return $handler;
@@ -415,7 +415,7 @@  discard block
 block discarded – undo
415 415
     protected function writeToFile($handler, $content, $path = '')
416 416
     {
417 417
         if (($result = @fwrite($handler, $content)) === false || ($result < strlen($content))) {
418
-            throw new IOException('The file "'.$path.'" could not be written to. Check your disk space and file permissions.');
418
+            throw new IOException('The file "' . $path . '" could not be written to. Check your disk space and file permissions.');
419 419
         }
420 420
     }
421 421
 }
Please login to merge, or discard this patch.
Sources/SplitTopics.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -360,7 +360,7 @@  discard block
 block discarded – undo
360 360
 		)
361 361
 	);
362 362
 	$context['messages'] = array();
363
-	for ($counter = 0; $row = $smcFunc['db_fetch_assoc']($request); $counter ++)
363
+	for ($counter = 0; $row = $smcFunc['db_fetch_assoc']($request); $counter++)
364 364
 	{
365 365
 		censorText($row['subject']);
366 366
 		censorText($row['body']);
@@ -400,7 +400,7 @@  discard block
 block discarded – undo
400 400
 			)
401 401
 		);
402 402
 		$context['messages'] = array();
403
-		for ($counter = 0; $row = $smcFunc['db_fetch_assoc']($request); $counter ++)
403
+		for ($counter = 0; $row = $smcFunc['db_fetch_assoc']($request); $counter++)
404 404
 		{
405 405
 			censorText($row['subject']);
406 406
 			censorText($row['body']);
@@ -1098,7 +1098,7 @@  discard block
 block discarded – undo
1098 1098
 			$firstTopic = $row['id_topic'];
1099 1099
 
1100 1100
 		// Lowest topic id gets selected as surviving topic id. We need to store this board so we can adjust the topic count (This one will not have a redirect topic)
1101
-		if($row['id_topic'] < $lowestTopicId || empty($lowestTopicId) )
1101
+		if ($row['id_topic'] < $lowestTopicId || empty($lowestTopicId))
1102 1102
 		{
1103 1103
 			$lowestTopicId = $row['id_topic'];
1104 1104
 			$lowestTopicBoard = $row['id_board'];
@@ -1404,7 +1404,7 @@  discard block
 block discarded – undo
1404 1404
 			}
1405 1405
 
1406 1406
 			// Update subject search index
1407
-			updateStats('subject',$this_old_topic,$redirect_subject);
1407
+			updateStats('subject', $this_old_topic, $redirect_subject);
1408 1408
 		}
1409 1409
 	}
1410 1410
 
Please login to merge, or discard this patch.
Braces   +260 added lines, -186 removed lines patch added patch discarded remove patch
@@ -15,8 +15,9 @@  discard block
 block discarded – undo
15 15
  * Original module by Mach8 - We'll never forget you.
16 16
  */
17 17
 
18
-if (!defined('SMF'))
18
+if (!defined('SMF')) {
19 19
 	die('No direct access...');
20
+}
20 21
 
21 22
 /**
22 23
  * splits a topic into two topics.
@@ -30,15 +31,17 @@  discard block
 block discarded – undo
30 31
 	global $topic, $sourcedir;
31 32
 
32 33
 	// And... which topic were you splitting, again?
33
-	if (empty($topic))
34
-		fatal_lang_error('numbers_one_to_nine', false);
34
+	if (empty($topic)) {
35
+			fatal_lang_error('numbers_one_to_nine', false);
36
+	}
35 37
 
36 38
 	// Are you allowed to split topics?
37 39
 	isAllowedTo('split_any');
38 40
 
39 41
 	// Load up the "dependencies" - the template, getMsgMemberID(), and sendNotifications().
40
-	if (!isset($_REQUEST['xml']))
41
-		loadTemplate('SplitTopics');
42
+	if (!isset($_REQUEST['xml'])) {
43
+			loadTemplate('SplitTopics');
44
+	}
42 45
 	require_once($sourcedir . '/Subs-Boards.php');
43 46
 	require_once($sourcedir . '/Subs-Post.php');
44 47
 
@@ -50,12 +53,12 @@  discard block
 block discarded – undo
50 53
 	);
51 54
 
52 55
 	// ?action=splittopics;sa=LETSBREAKIT won't work, sorry.
53
-	if (empty($_REQUEST['sa']) || !isset($subActions[$_REQUEST['sa']]))
54
-		SplitIndex();
55
-
56
-	else
57
-		call_helper($subActions[$_REQUEST['sa']]);
58
-}
56
+	if (empty($_REQUEST['sa']) || !isset($subActions[$_REQUEST['sa']])) {
57
+			SplitIndex();
58
+	} else {
59
+			call_helper($subActions[$_REQUEST['sa']]);
60
+	}
61
+	}
59 62
 
60 63
 /**
61 64
  * screen shown before the actual split.
@@ -71,8 +74,9 @@  discard block
 block discarded – undo
71 74
 	global $txt, $topic, $context, $smcFunc, $modSettings;
72 75
 
73 76
 	// Validate "at".
74
-	if (empty($_GET['at']))
75
-		fatal_lang_error('numbers_one_to_nine', false);
77
+	if (empty($_GET['at'])) {
78
+			fatal_lang_error('numbers_one_to_nine', false);
79
+	}
76 80
 	$_GET['at'] = (int) $_GET['at'];
77 81
 
78 82
 	// Retrieve the subject and stuff of the specific topic/message.
@@ -89,26 +93,31 @@  discard block
 block discarded – undo
89 93
 			'split_at' => $_GET['at'],
90 94
 		)
91 95
 	);
92
-	if ($smcFunc['db_num_rows']($request) == 0)
93
-		fatal_lang_error('cant_find_messages');
96
+	if ($smcFunc['db_num_rows']($request) == 0) {
97
+			fatal_lang_error('cant_find_messages');
98
+	}
94 99
 	list ($_REQUEST['subname'], $num_replies, $unapproved_posts, $id_first_msg, $approved) = $smcFunc['db_fetch_row']($request);
95 100
 	$smcFunc['db_free_result']($request);
96 101
 
97 102
 	// If not approved validate they can see it.
98
-	if ($modSettings['postmod_active'] && !$approved)
99
-		isAllowedTo('approve_posts');
103
+	if ($modSettings['postmod_active'] && !$approved) {
104
+			isAllowedTo('approve_posts');
105
+	}
100 106
 
101 107
 	// If this topic has unapproved posts, we need to count them too...
102
-	if ($modSettings['postmod_active'] && allowedTo('approve_posts'))
103
-		$num_replies += $unapproved_posts - ($approved ? 0 : 1);
108
+	if ($modSettings['postmod_active'] && allowedTo('approve_posts')) {
109
+			$num_replies += $unapproved_posts - ($approved ? 0 : 1);
110
+	}
104 111
 
105 112
 	// Check if there is more than one message in the topic.  (there should be.)
106
-	if ($num_replies < 1)
107
-		fatal_lang_error('topic_one_post', false);
113
+	if ($num_replies < 1) {
114
+			fatal_lang_error('topic_one_post', false);
115
+	}
108 116
 
109 117
 	// Check if this is the first message in the topic (if so, the first and second option won't be available)
110
-	if ($id_first_msg == $_GET['at'])
111
-		return SplitSelectTopics();
118
+	if ($id_first_msg == $_GET['at']) {
119
+			return SplitSelectTopics();
120
+	}
112 121
 
113 122
 	// Basic template information....
114 123
 	$context['message'] = array(
@@ -137,8 +146,9 @@  discard block
 block discarded – undo
137 146
 	checkSession();
138 147
 
139 148
 	// Clean up the subject.
140
-	if (!isset($_POST['subname']) || $_POST['subname'] == '')
141
-		$_POST['subname'] = $txt['new_topic'];
149
+	if (!isset($_POST['subname']) || $_POST['subname'] == '') {
150
+			$_POST['subname'] = $txt['new_topic'];
151
+	}
142 152
 
143 153
 	// Redirect to the selector if they chose selective.
144 154
 	if ($_POST['step2'] == 'selective')
@@ -163,16 +173,19 @@  discard block
 block discarded – undo
163 173
 				'split_at' => $_POST['at'],
164 174
 			)
165 175
 		);
166
-		while ($row = $smcFunc['db_fetch_assoc']($request))
167
-			$messagesToBeSplit[] = $row['id_msg'];
176
+		while ($row = $smcFunc['db_fetch_assoc']($request)) {
177
+					$messagesToBeSplit[] = $row['id_msg'];
178
+		}
168 179
 		$smcFunc['db_free_result']($request);
169 180
 	}
170 181
 	// Only the selected message has to be split. That should be easy.
171
-	elseif ($_POST['step2'] == 'onlythis')
172
-		$messagesToBeSplit[] = $_POST['at'];
182
+	elseif ($_POST['step2'] == 'onlythis') {
183
+			$messagesToBeSplit[] = $_POST['at'];
184
+	}
173 185
 	// There's another action?!
174
-	else
175
-		fatal_lang_error('no_access', false);
186
+	else {
187
+			fatal_lang_error('no_access', false);
188
+	}
176 189
 
177 190
 	$context['old_topic'] = $topic;
178 191
 	$context['new_topic'] = splitTopic($topic, $messagesToBeSplit, $_POST['subname']);
@@ -199,8 +212,9 @@  discard block
 block discarded – undo
199 212
 	$_SESSION['split_selection'][$topic] = empty($_SESSION['split_selection'][$topic]) ? array() : $_SESSION['split_selection'][$topic];
200 213
 
201 214
 	// This is a special case for split topics from quick-moderation checkboxes
202
-	if (isset($_REQUEST['subname_enc']))
203
-		$_REQUEST['subname'] = urldecode($_REQUEST['subname_enc']);
215
+	if (isset($_REQUEST['subname_enc'])) {
216
+			$_REQUEST['subname'] = urldecode($_REQUEST['subname_enc']);
217
+	}
204 218
 
205 219
 	$context['not_selected'] = array(
206 220
 		'num_messages' => 0,
@@ -252,10 +266,12 @@  discard block
 block discarded – undo
252 266
 			)
253 267
 		);
254 268
 		// You can't split the last message off.
255
-		if (empty($context['not_selected']['start']) && $smcFunc['db_num_rows']($request) <= 1 && $_REQUEST['move'] == 'down')
256
-			$_REQUEST['move'] = '';
257
-		while ($row = $smcFunc['db_fetch_assoc']($request))
258
-			$original_msgs['not_selected'][] = $row['id_msg'];
269
+		if (empty($context['not_selected']['start']) && $smcFunc['db_num_rows']($request) <= 1 && $_REQUEST['move'] == 'down') {
270
+					$_REQUEST['move'] = '';
271
+		}
272
+		while ($row = $smcFunc['db_fetch_assoc']($request)) {
273
+					$original_msgs['not_selected'][] = $row['id_msg'];
274
+		}
259 275
 		$smcFunc['db_free_result']($request);
260 276
 		if (!empty($_SESSION['split_selection'][$topic]))
261 277
 		{
@@ -275,8 +291,9 @@  discard block
 block discarded – undo
275 291
 					'messages_per_page' => $context['messages_per_page'],
276 292
 				)
277 293
 			);
278
-			while ($row = $smcFunc['db_fetch_assoc']($request))
279
-				$original_msgs['selected'][] = $row['id_msg'];
294
+			while ($row = $smcFunc['db_fetch_assoc']($request)) {
295
+							$original_msgs['selected'][] = $row['id_msg'];
296
+			}
280 297
 			$smcFunc['db_free_result']($request);
281 298
 		}
282 299
 	}
@@ -286,12 +303,13 @@  discard block
 block discarded – undo
286 303
 	{
287 304
 		$_REQUEST['msg'] = (int) $_REQUEST['msg'];
288 305
 
289
-		if ($_REQUEST['move'] == 'reset')
290
-			$_SESSION['split_selection'][$topic] = array();
291
-		elseif ($_REQUEST['move'] == 'up')
292
-			$_SESSION['split_selection'][$topic] = array_diff($_SESSION['split_selection'][$topic], array($_REQUEST['msg']));
293
-		else
294
-			$_SESSION['split_selection'][$topic][] = $_REQUEST['msg'];
306
+		if ($_REQUEST['move'] == 'reset') {
307
+					$_SESSION['split_selection'][$topic] = array();
308
+		} elseif ($_REQUEST['move'] == 'up') {
309
+					$_SESSION['split_selection'][$topic] = array_diff($_SESSION['split_selection'][$topic], array($_REQUEST['msg']));
310
+		} else {
311
+					$_SESSION['split_selection'][$topic][] = $_REQUEST['msg'];
312
+		}
295 313
 	}
296 314
 
297 315
 	// Make sure the selection is still accurate.
@@ -310,8 +328,9 @@  discard block
 block discarded – undo
310 328
 			)
311 329
 		);
312 330
 		$_SESSION['split_selection'][$topic] = array();
313
-		while ($row = $smcFunc['db_fetch_assoc']($request))
314
-			$_SESSION['split_selection'][$topic][] = $row['id_msg'];
331
+		while ($row = $smcFunc['db_fetch_assoc']($request)) {
332
+					$_SESSION['split_selection'][$topic][] = $row['id_msg'];
333
+		}
315 334
 		$smcFunc['db_free_result']($request);
316 335
 	}
317 336
 
@@ -328,13 +347,15 @@  discard block
 block discarded – undo
328 347
 			'is_approved' => 1,
329 348
 		)
330 349
 	);
331
-	while ($row = $smcFunc['db_fetch_assoc']($request))
332
-		$context[empty($row['is_selected']) || $row['is_selected'] == 'f' ? 'not_selected' : 'selected']['num_messages'] = $row['num_messages'];
350
+	while ($row = $smcFunc['db_fetch_assoc']($request)) {
351
+			$context[empty($row['is_selected']) || $row['is_selected'] == 'f' ? 'not_selected' : 'selected']['num_messages'] = $row['num_messages'];
352
+	}
333 353
 	$smcFunc['db_free_result']($request);
334 354
 
335 355
 	// Fix an oversized starting page (to make sure both pageindexes are properly set).
336
-	if ($context['selected']['start'] >= $context['selected']['num_messages'])
337
-		$context['selected']['start'] = $context['selected']['num_messages'] <= $context['messages_per_page'] ? 0 : ($context['selected']['num_messages'] - (($context['selected']['num_messages'] % $context['messages_per_page']) == 0 ? $context['messages_per_page'] : ($context['selected']['num_messages'] % $context['messages_per_page'])));
356
+	if ($context['selected']['start'] >= $context['selected']['num_messages']) {
357
+			$context['selected']['start'] = $context['selected']['num_messages'] <= $context['messages_per_page'] ? 0 : ($context['selected']['num_messages'] - (($context['selected']['num_messages'] % $context['messages_per_page']) == 0 ? $context['messages_per_page'] : ($context['selected']['num_messages'] % $context['messages_per_page'])));
358
+	}
338 359
 
339 360
 	// Build a page list of the not-selected topics...
340 361
 	$context['not_selected']['page_index'] = constructPageIndex($scripturl . '?action=splittopics;sa=selectTopics;subname=' . strtr(urlencode($_REQUEST['subname']), array('%' => '%%')) . ';topic=' . $topic . '.%1$d;start2=' . $context['selected']['start'], $context['not_selected']['start'], $context['not_selected']['num_messages'], $context['messages_per_page'], true);
@@ -434,11 +455,12 @@  discard block
 block discarded – undo
434 455
 		);
435 456
 
436 457
 		$context['changes'] = array();
437
-		foreach ($changes as $change_type => $change_array)
438
-			foreach ($change_array as $section => $msg_array)
458
+		foreach ($changes as $change_type => $change_array) {
459
+					foreach ($change_array as $section => $msg_array)
439 460
 			{
440 461
 				if (empty($msg_array))
441 462
 					continue;
463
+		}
442 464
 
443 465
 				foreach ($msg_array as $id_msg)
444 466
 				{
@@ -447,8 +469,9 @@  discard block
 block discarded – undo
447 469
 						'type' => $change_type,
448 470
 						'section' => $section,
449 471
 					);
450
-					if ($change_type == 'insert')
451
-						$context['changes']['insert' . $id_msg]['insert_value'] = $context[$section]['messages'][$id_msg];
472
+					if ($change_type == 'insert') {
473
+											$context['changes']['insert' . $id_msg]['insert_value'] = $context[$section]['messages'][$id_msg];
474
+					}
452 475
 				}
453 476
 			}
454 477
 	}
@@ -468,12 +491,14 @@  discard block
 block discarded – undo
468 491
 	checkSession();
469 492
 
470 493
 	// Default the subject in case it's blank.
471
-	if (!isset($_POST['subname']) || $_POST['subname'] == '')
472
-		$_POST['subname'] = $txt['new_topic'];
494
+	if (!isset($_POST['subname']) || $_POST['subname'] == '') {
495
+			$_POST['subname'] = $txt['new_topic'];
496
+	}
473 497
 
474 498
 	// You must've selected some messages!  Can't split out none!
475
-	if (empty($_SESSION['split_selection'][$topic]))
476
-		fatal_lang_error('no_posts_selected', false);
499
+	if (empty($_SESSION['split_selection'][$topic])) {
500
+			fatal_lang_error('no_posts_selected', false);
501
+	}
477 502
 
478 503
 	$context['old_topic'] = $topic;
479 504
 	$context['new_topic'] = splitTopic($topic, $_SESSION['split_selection'][$topic], $_POST['subname']);
@@ -499,8 +524,9 @@  discard block
 block discarded – undo
499 524
 	global $smcFunc, $txt, $sourcedir;
500 525
 
501 526
 	// Nothing to split?
502
-	if (empty($splitMessages))
503
-		fatal_lang_error('no_posts_selected', false);
527
+	if (empty($splitMessages)) {
528
+			fatal_lang_error('no_posts_selected', false);
529
+	}
504 530
 
505 531
 	// Get some board info.
506 532
 	$request = $smcFunc['db_query']('', '
@@ -532,8 +558,9 @@  discard block
 block discarded – undo
532 558
 		)
533 559
 	);
534 560
 	// You can't select ALL the messages!
535
-	if ($smcFunc['db_num_rows']($request) == 0)
536
-		fatal_lang_error('selected_all_posts', false);
561
+	if ($smcFunc['db_num_rows']($request) == 0) {
562
+			fatal_lang_error('selected_all_posts', false);
563
+	}
537 564
 
538 565
 	$split1_first_msg = null;
539 566
 	$split1_last_msg = null;
@@ -541,24 +568,27 @@  discard block
 block discarded – undo
541 568
 	while ($row = $smcFunc['db_fetch_assoc']($request))
542 569
 	{
543 570
 		// Get the right first and last message dependant on approved state...
544
-		if (empty($split1_first_msg) || $row['myid_first_msg'] < $split1_first_msg)
545
-			$split1_first_msg = $row['myid_first_msg'];
546
-		if (empty($split1_last_msg) || $row['approved'])
547
-			$split1_last_msg = $row['myid_last_msg'];
571
+		if (empty($split1_first_msg) || $row['myid_first_msg'] < $split1_first_msg) {
572
+					$split1_first_msg = $row['myid_first_msg'];
573
+		}
574
+		if (empty($split1_last_msg) || $row['approved']) {
575
+					$split1_last_msg = $row['myid_last_msg'];
576
+		}
548 577
 
549 578
 		// Get the counts correct...
550 579
 		if ($row['approved'])
551 580
 		{
552 581
 			$split1_replies = $row['message_count'] - 1;
553 582
 			$split1_unapprovedposts = 0;
554
-		}
555
-		else
583
+		} else
556 584
 		{
557
-			if (!isset($split1_replies))
558
-				$split1_replies = 0;
585
+			if (!isset($split1_replies)) {
586
+							$split1_replies = 0;
587
+			}
559 588
 			// If the topic isn't approved then num replies must go up by one... as first post wouldn't be counted.
560
-			elseif (!$split1_approved)
561
-				$split1_replies++;
589
+			elseif (!$split1_approved) {
590
+							$split1_replies++;
591
+			}
562 592
 
563 593
 			$split1_unapprovedposts = $row['message_count'];
564 594
 		}
@@ -584,10 +614,12 @@  discard block
 block discarded – undo
584 614
 	while ($row = $smcFunc['db_fetch_assoc']($request))
585 615
 	{
586 616
 		// As before get the right first and last message dependant on approved state...
587
-		if (empty($split2_first_msg) || $row['myid_first_msg'] < $split2_first_msg)
588
-			$split2_first_msg = $row['myid_first_msg'];
589
-		if (empty($split2_last_msg) || $row['approved'])
590
-			$split2_last_msg = $row['myid_last_msg'];
617
+		if (empty($split2_first_msg) || $row['myid_first_msg'] < $split2_first_msg) {
618
+					$split2_first_msg = $row['myid_first_msg'];
619
+		}
620
+		if (empty($split2_last_msg) || $row['approved']) {
621
+					$split2_last_msg = $row['myid_last_msg'];
622
+		}
591 623
 
592 624
 		// Then do the counts again...
593 625
 		if ($row['approved'])
@@ -595,18 +627,20 @@  discard block
 block discarded – undo
595 627
 			$split2_approved = true;
596 628
 			$split2_replies = $row['message_count'] - 1;
597 629
 			$split2_unapprovedposts = 0;
598
-		}
599
-		else
630
+		} else
600 631
 		{
601 632
 			// Should this one be approved??
602
-			if ($split2_first_msg == $row['myid_first_msg'])
603
-				$split2_approved = false;
633
+			if ($split2_first_msg == $row['myid_first_msg']) {
634
+							$split2_approved = false;
635
+			}
604 636
 
605
-			if (!isset($split2_replies))
606
-				$split2_replies = 0;
637
+			if (!isset($split2_replies)) {
638
+							$split2_replies = 0;
639
+			}
607 640
 			// As before, fix number of replies.
608
-			elseif (!$split2_approved)
609
-				$split2_replies++;
641
+			elseif (!$split2_approved) {
642
+							$split2_replies++;
643
+			}
610 644
 
611 645
 			$split2_unapprovedposts = $row['message_count'];
612 646
 		}
@@ -616,12 +650,14 @@  discard block
 block discarded – undo
616 650
 	$split2_lastMem = getMsgMemberID($split2_last_msg);
617 651
 
618 652
 	// No database changes yet, so let's double check to see if everything makes at least a little sense.
619
-	if ($split1_first_msg <= 0 || $split1_last_msg <= 0 || $split2_first_msg <= 0 || $split2_last_msg <= 0 || $split1_replies < 0 || $split2_replies < 0 || $split1_unapprovedposts < 0 || $split2_unapprovedposts < 0 || !isset($split1_approved) || !isset($split2_approved))
620
-		fatal_lang_error('cant_find_messages');
653
+	if ($split1_first_msg <= 0 || $split1_last_msg <= 0 || $split2_first_msg <= 0 || $split2_last_msg <= 0 || $split1_replies < 0 || $split2_replies < 0 || $split1_unapprovedposts < 0 || $split2_unapprovedposts < 0 || !isset($split1_approved) || !isset($split2_approved)) {
654
+			fatal_lang_error('cant_find_messages');
655
+	}
621 656
 
622 657
 	// You cannot split off the first message of a topic.
623
-	if ($split1_first_msg > $split2_first_msg)
624
-		fatal_lang_error('split_first_post', false);
658
+	if ($split1_first_msg > $split2_first_msg) {
659
+			fatal_lang_error('split_first_post', false);
660
+	}
625 661
 
626 662
 	// We're off to insert the new topic!  Use 0 for now to avoid UNIQUE errors.
627 663
 	$smcFunc['db_insert']('',
@@ -644,14 +680,16 @@  discard block
 block discarded – undo
644 680
 			array('id_topic')
645 681
 		);
646 682
 	$split2_ID_TOPIC = $smcFunc['db_insert_id']('{db_prefix}topics', 'id_topic');
647
-	if ($split2_ID_TOPIC <= 0)
648
-		fatal_lang_error('cant_insert_topic');
683
+	if ($split2_ID_TOPIC <= 0) {
684
+			fatal_lang_error('cant_insert_topic');
685
+	}
649 686
 
650 687
 	// Move the messages over to the other topic.
651 688
 	$new_subject = strtr($smcFunc['htmltrim']($smcFunc['htmlspecialchars']($new_subject)), array("\r" => '', "\n" => '', "\t" => ''));
652 689
 	// Check the subject length.
653
-	if ($smcFunc['strlen']($new_subject) > 100)
654
-		$new_subject = $smcFunc['substr']($new_subject, 0, 100);
690
+	if ($smcFunc['strlen']($new_subject) > 100) {
691
+			$new_subject = $smcFunc['substr']($new_subject, 0, 100);
692
+	}
655 693
 	// Valid subject?
656 694
 	if ($new_subject != '')
657 695
 	{
@@ -722,8 +760,8 @@  discard block
 block discarded – undo
722 760
 	);
723 761
 
724 762
 	// If the new topic isn't approved ensure the first message flags this just in case.
725
-	if (!$split2_approved)
726
-		$smcFunc['db_query']('', '
763
+	if (!$split2_approved) {
764
+			$smcFunc['db_query']('', '
727 765
 			UPDATE {db_prefix}messages
728 766
 			SET approved = {int:approved}
729 767
 			WHERE id_msg = {int:id_msg}
@@ -734,6 +772,7 @@  discard block
 block discarded – undo
734 772
 				'id_topic' => $split2_ID_TOPIC,
735 773
 			)
736 774
 		);
775
+	}
737 776
 
738 777
 	// The board has more topics now (Or more unapproved ones!).
739 778
 	$smcFunc['db_query']('', '
@@ -760,8 +799,9 @@  discard block
 block discarded – undo
760 799
 	if ($smcFunc['db_num_rows']($request) > 0)
761 800
 	{
762 801
 		$replaceEntries = array();
763
-		while ($row = $smcFunc['db_fetch_assoc']($request))
764
-			$replaceEntries[] = array($row['id_member'], $split2_ID_TOPIC, $row['id_msg'], $row['unwatched']);
802
+		while ($row = $smcFunc['db_fetch_assoc']($request)) {
803
+					$replaceEntries[] = array($row['id_member'], $split2_ID_TOPIC, $row['id_msg'], $row['unwatched']);
804
+		}
765 805
 
766 806
 		$smcFunc['db_insert']('ignore',
767 807
 			'{db_prefix}log_topics',
@@ -785,8 +825,9 @@  discard block
 block discarded – undo
785 825
 	// If there's a search index that needs updating, update it...
786 826
 	require_once($sourcedir . '/Search.php');
787 827
 	$searchAPI = findSearchAPI();
788
-	if (is_callable(array($searchAPI, 'topicSplit')))
789
-		$searchAPI->topicSplit($split2_ID_TOPIC, $splitMessages);
828
+	if (is_callable(array($searchAPI, 'topicSplit'))) {
829
+			$searchAPI->topicSplit($split2_ID_TOPIC, $splitMessages);
830
+	}
790 831
 
791 832
 	// Return the ID of the newly created topic.
792 833
 	return $split2_ID_TOPIC;
@@ -812,12 +853,12 @@  discard block
 block discarded – undo
812 853
 	);
813 854
 
814 855
 	// ?action=mergetopics;sa=LETSBREAKIT won't work, sorry.
815
-	if (empty($_REQUEST['sa']) || !isset($subActions[$_REQUEST['sa']]))
816
-		MergeIndex();
817
-
818
-	else
819
-		call_helper($subActions[$_REQUEST['sa']]);
820
-}
856
+	if (empty($_REQUEST['sa']) || !isset($subActions[$_REQUEST['sa']])) {
857
+			MergeIndex();
858
+	} else {
859
+			call_helper($subActions[$_REQUEST['sa']]);
860
+	}
861
+	}
821 862
 
822 863
 /**
823 864
  * allows to pick a topic to merge the current topic with.
@@ -831,8 +872,9 @@  discard block
 block discarded – undo
831 872
 	global $txt, $board, $context, $smcFunc, $sourcedir;
832 873
 	global $scripturl, $modSettings;
833 874
 
834
-	if (!isset($_GET['from']))
835
-		fatal_lang_error('no_access', false);
875
+	if (!isset($_GET['from'])) {
876
+			fatal_lang_error('no_access', false);
877
+	}
836 878
 	$_GET['from'] = (int) $_GET['from'];
837 879
 
838 880
 	$_REQUEST['targetboard'] = isset($_REQUEST['targetboard']) ? (int) $_REQUEST['targetboard'] : $board;
@@ -843,9 +885,9 @@  discard block
 block discarded – undo
843 885
 	{
844 886
 		$can_approve_boards = boardsAllowedTo('approve_posts');
845 887
 		$onlyApproved = $can_approve_boards !== array(0) && !in_array($_REQUEST['targetboard'], $can_approve_boards);
888
+	} else {
889
+			$onlyApproved = false;
846 890
 	}
847
-	else
848
-		$onlyApproved = false;
849 891
 
850 892
 	// How many topics are on this board?  (used for paging.)
851 893
 	$request = $smcFunc['db_query']('', '
@@ -879,8 +921,9 @@  discard block
 block discarded – undo
879 921
 			'is_approved' => 1,
880 922
 		)
881 923
 	);
882
-	if ($smcFunc['db_num_rows']($request) == 0)
883
-		fatal_lang_error('no_board');
924
+	if ($smcFunc['db_num_rows']($request) == 0) {
925
+			fatal_lang_error('no_board');
926
+	}
884 927
 	list ($subject) = $smcFunc['db_fetch_row']($request);
885 928
 	$smcFunc['db_free_result']($request);
886 929
 
@@ -893,8 +936,9 @@  discard block
 block discarded – undo
893 936
 	// Check which boards you have merge permissions on.
894 937
 	$merge_boards = boardsAllowedTo('merge_any');
895 938
 
896
-	if (empty($merge_boards))
897
-		fatal_lang_error('cannot_merge_any', 'user');
939
+	if (empty($merge_boards)) {
940
+			fatal_lang_error('cannot_merge_any', 'user');
941
+	}
898 942
 
899 943
 	// No sense in loading this if you can only merge on this board
900 944
 	if (count($merge_boards) > 1 || in_array(0, $merge_boards))
@@ -908,8 +952,9 @@  discard block
 block discarded – undo
908 952
 		);
909 953
 
910 954
 		// Only include these boards in the list (0 means you're an admin')
911
-		if (!in_array(0, $merge_boards))
912
-			$options['included_boards'] = $merge_boards;
955
+		if (!in_array(0, $merge_boards)) {
956
+					$options['included_boards'] = $merge_boards;
957
+		}
913 958
 
914 959
 		$context['merge_categories'] = getBoardList($options);
915 960
 	}
@@ -955,8 +1000,9 @@  discard block
 block discarded – undo
955 1000
 	}
956 1001
 	$smcFunc['db_free_result']($request);
957 1002
 
958
-	if (empty($context['topics']) && count($merge_boards) <= 1 && !in_array(0, $merge_boards))
959
-		fatal_lang_error('merge_need_more_topics');
1003
+	if (empty($context['topics']) && count($merge_boards) <= 1 && !in_array(0, $merge_boards)) {
1004
+			fatal_lang_error('merge_need_more_topics');
1005
+	}
960 1006
 
961 1007
 	$context['sub_template'] = 'merge';
962 1008
 }
@@ -986,24 +1032,29 @@  discard block
 block discarded – undo
986 1032
 	checkSession('request');
987 1033
 
988 1034
 	// Handle URLs from MergeIndex.
989
-	if (!empty($_GET['from']) && !empty($_GET['to']))
990
-		$topics = array((int) $_GET['from'], (int) $_GET['to']);
1035
+	if (!empty($_GET['from']) && !empty($_GET['to'])) {
1036
+			$topics = array((int) $_GET['from'], (int) $_GET['to']);
1037
+	}
991 1038
 
992 1039
 	// If we came from a form, the topic IDs came by post.
993
-	if (!empty($_POST['topics']) && is_array($_POST['topics']))
994
-		$topics = $_POST['topics'];
1040
+	if (!empty($_POST['topics']) && is_array($_POST['topics'])) {
1041
+			$topics = $_POST['topics'];
1042
+	}
995 1043
 
996 1044
 	// There's nothing to merge with just one topic...
997
-	if (empty($topics) || !is_array($topics) || count($topics) == 1)
998
-		fatal_lang_error('merge_need_more_topics');
1045
+	if (empty($topics) || !is_array($topics) || count($topics) == 1) {
1046
+			fatal_lang_error('merge_need_more_topics');
1047
+	}
999 1048
 
1000 1049
 	// Make sure every topic is numeric, or some nasty things could be done with the DB.
1001
-	foreach ($topics as $id => $topic)
1002
-		$topics[$id] = (int) $topic;
1050
+	foreach ($topics as $id => $topic) {
1051
+			$topics[$id] = (int) $topic;
1052
+	}
1003 1053
 
1004 1054
 	// Joy of all joys, make sure they're not messing about with unapproved topics they can't see :P
1005
-	if ($modSettings['postmod_active'])
1006
-		$can_approve_boards = boardsAllowedTo('approve_posts');
1055
+	if ($modSettings['postmod_active']) {
1056
+			$can_approve_boards = boardsAllowedTo('approve_posts');
1057
+	}
1007 1058
 
1008 1059
 	// Get info about the topics and polls that will be merged.
1009 1060
 	$request = $smcFunc['db_query']('', '
@@ -1024,8 +1075,9 @@  discard block
 block discarded – undo
1024 1075
 			'limit' => count($topics),
1025 1076
 		)
1026 1077
 	);
1027
-	if ($smcFunc['db_num_rows']($request) < 2)
1028
-		fatal_lang_error('no_topic_id');
1078
+	if ($smcFunc['db_num_rows']($request) < 2) {
1079
+			fatal_lang_error('no_topic_id');
1080
+	}
1029 1081
 	$num_views = 0;
1030 1082
 	$is_sticky = 0;
1031 1083
 	$boardTotals = array();
@@ -1038,34 +1090,38 @@  discard block
 block discarded – undo
1038 1090
 	while ($row = $smcFunc['db_fetch_assoc']($request))
1039 1091
 	{
1040 1092
 		// Sorry, redirection topics can't be merged
1041
-		if (!empty($row['id_redirect_topic']))
1042
-			fatal_lang_error('cannot_merge_redirect', false);
1093
+		if (!empty($row['id_redirect_topic'])) {
1094
+					fatal_lang_error('cannot_merge_redirect', false);
1095
+		}
1043 1096
 
1044 1097
 		// Make a note for the board counts...
1045
-		if (!isset($boardTotals[$row['id_board']]))
1046
-			$boardTotals[$row['id_board']] = array(
1098
+		if (!isset($boardTotals[$row['id_board']])) {
1099
+					$boardTotals[$row['id_board']] = array(
1047 1100
 				'posts' => 0,
1048 1101
 				'topics' => 0,
1049 1102
 				'unapproved_posts' => 0,
1050 1103
 				'unapproved_topics' => 0
1051 1104
 			);
1105
+		}
1052 1106
 
1053 1107
 		// We can't see unapproved topics here?
1054 1108
 		if ($modSettings['postmod_active'] && !$row['approved'] && $can_approve_boards != array(0) && in_array($row['id_board'], $can_approve_boards))
1055 1109
 		{
1056 1110
 			unset($topics[$row['id_topic']]); // If we can't see it, we should not merge it and not adjust counts! Instead skip it.
1057 1111
 			continue;
1058
-		}elseif (!$row['approved'])
1059
-			$boardTotals[$row['id_board']]['unapproved_topics']++;
1060
-		else
1061
-			$boardTotals[$row['id_board']]['topics']++;
1112
+		} elseif (!$row['approved']) {
1113
+					$boardTotals[$row['id_board']]['unapproved_topics']++;
1114
+		} else {
1115
+					$boardTotals[$row['id_board']]['topics']++;
1116
+		}
1062 1117
 
1063 1118
 		$boardTotals[$row['id_board']]['unapproved_posts'] += $row['unapproved_posts'];
1064 1119
 		$boardTotals[$row['id_board']]['posts'] += $row['num_replies'] + ($row['approved'] ? 1 : 0);
1065 1120
 
1066 1121
 		// In the case of making a redirect, the topic count goes up by one due to the redirect topic.
1067
-		if (isset($_POST['postRedirect']))
1068
-			$boardTotals[$row['id_board']]['topics']--;
1122
+		if (isset($_POST['postRedirect'])) {
1123
+					$boardTotals[$row['id_board']]['topics']--;
1124
+		}
1069 1125
 
1070 1126
 		$topic_data[$row['id_topic']] = array(
1071 1127
 			'id' => $row['id_topic'],
@@ -1091,11 +1147,13 @@  discard block
 block discarded – undo
1091 1147
 		$boards[] = $row['id_board'];
1092 1148
 
1093 1149
 		// If there's no poll, id_poll == 0...
1094
-		if ($row['id_poll'] > 0)
1095
-			$polls[] = $row['id_poll'];
1150
+		if ($row['id_poll'] > 0) {
1151
+					$polls[] = $row['id_poll'];
1152
+		}
1096 1153
 		// Store the id_topic with the lowest id_first_msg.
1097
-		if (empty($firstTopic))
1098
-			$firstTopic = $row['id_topic'];
1154
+		if (empty($firstTopic)) {
1155
+					$firstTopic = $row['id_topic'];
1156
+		}
1099 1157
 
1100 1158
 		// Lowest topic id gets selected as surviving topic id. We need to store this board so we can adjust the topic count (This one will not have a redirect topic)
1101 1159
 		if($row['id_topic'] < $lowestTopicId || empty($lowestTopicId) )
@@ -1109,11 +1167,13 @@  discard block
 block discarded – undo
1109 1167
 	$smcFunc['db_free_result']($request);
1110 1168
 
1111 1169
 	// If we didn't get any topics then they've been messing with unapproved stuff.
1112
-	if (empty($topic_data))
1113
-		fatal_lang_error('no_topic_id');
1170
+	if (empty($topic_data)) {
1171
+			fatal_lang_error('no_topic_id');
1172
+	}
1114 1173
 
1115
-	if (isset($_POST['postRedirect']) && !empty($lowestTopicBoard))
1116
-		$boardTotals[$lowestTopicBoard]['topics']++;
1174
+	if (isset($_POST['postRedirect']) && !empty($lowestTopicBoard)) {
1175
+			$boardTotals[$lowestTopicBoard]['topics']++;
1176
+	}
1117 1177
 
1118 1178
 	// Will this be approved?
1119 1179
 	$context['is_approved'] = $topic_data[$firstTopic]['approved'];
@@ -1129,8 +1189,9 @@  discard block
 block discarded – undo
1129 1189
 
1130 1190
 	// Get the boards a user is allowed to merge in.
1131 1191
 	$merge_boards = boardsAllowedTo('merge_any');
1132
-	if (empty($merge_boards))
1133
-		fatal_lang_error('cannot_merge_any', 'user');
1192
+	if (empty($merge_boards)) {
1193
+			fatal_lang_error('cannot_merge_any', 'user');
1194
+	}
1134 1195
 
1135 1196
 	// Make sure they can see all boards....
1136 1197
 	$request = $smcFunc['db_query']('', '
@@ -1147,8 +1208,9 @@  discard block
 block discarded – undo
1147 1208
 		)
1148 1209
 	);
1149 1210
 	// If the number of boards that's in the output isn't exactly the same as we've put in there, you're in trouble.
1150
-	if ($smcFunc['db_num_rows']($request) != count($boards))
1151
-		fatal_lang_error('no_board');
1211
+	if ($smcFunc['db_num_rows']($request) != count($boards)) {
1212
+			fatal_lang_error('no_board');
1213
+	}
1152 1214
 	$smcFunc['db_free_result']($request);
1153 1215
 
1154 1216
 	if (empty($_REQUEST['sa']) || $_REQUEST['sa'] == 'options')
@@ -1167,8 +1229,8 @@  discard block
 block discarded – undo
1167 1229
 					'limit' => count($polls),
1168 1230
 				)
1169 1231
 			);
1170
-			while ($row = $smcFunc['db_fetch_assoc']($request))
1171
-				$context['polls'][] = array(
1232
+			while ($row = $smcFunc['db_fetch_assoc']($request)) {
1233
+							$context['polls'][] = array(
1172 1234
 					'id' => $row['id_poll'],
1173 1235
 					'topic' => array(
1174 1236
 						'id' => $row['id_topic'],
@@ -1177,6 +1239,7 @@  discard block
 block discarded – undo
1177 1239
 					'question' => $row['question'],
1178 1240
 					'selected' => $row['id_topic'] == $firstTopic
1179 1241
 				);
1242
+			}
1180 1243
 			$smcFunc['db_free_result']($request);
1181 1244
 		}
1182 1245
 		if (count($boards) > 1)
@@ -1192,18 +1255,20 @@  discard block
 block discarded – undo
1192 1255
 					'limit' => count($boards),
1193 1256
 				)
1194 1257
 			);
1195
-			while ($row = $smcFunc['db_fetch_assoc']($request))
1196
-				$context['boards'][] = array(
1258
+			while ($row = $smcFunc['db_fetch_assoc']($request)) {
1259
+							$context['boards'][] = array(
1197 1260
 					'id' => $row['id_board'],
1198 1261
 					'name' => $row['name'],
1199 1262
 					'selected' => $row['id_board'] == $topic_data[$firstTopic]['board']
1200 1263
 				);
1264
+			}
1201 1265
 			$smcFunc['db_free_result']($request);
1202 1266
 		}
1203 1267
 
1204 1268
 		$context['topics'] = $topic_data;
1205
-		foreach ($topic_data as $id => $topic)
1206
-			$context['topics'][$id]['selected'] = $topic['id'] == $firstTopic;
1269
+		foreach ($topic_data as $id => $topic) {
1270
+					$context['topics'][$id]['selected'] = $topic['id'] == $firstTopic;
1271
+		}
1207 1272
 
1208 1273
 		$context['page_title'] = $txt['merge'];
1209 1274
 		$context['sub_template'] = 'merge_extra_options';
@@ -1212,13 +1277,15 @@  discard block
 block discarded – undo
1212 1277
 
1213 1278
 	// Determine target board.
1214 1279
 	$target_board = count($boards) > 1 ? (int) $_REQUEST['board'] : $boards[0];
1215
-	if (!in_array($target_board, $boards))
1216
-		fatal_lang_error('no_board');
1280
+	if (!in_array($target_board, $boards)) {
1281
+			fatal_lang_error('no_board');
1282
+	}
1217 1283
 
1218 1284
 	// Determine which poll will survive and which polls won't.
1219 1285
 	$target_poll = count($polls) > 1 ? (int) $_POST['poll'] : (count($polls) == 1 ? $polls[0] : 0);
1220
-	if ($target_poll > 0 && !in_array($target_poll, $polls))
1221
-		fatal_lang_error('no_access', false);
1286
+	if ($target_poll > 0 && !in_array($target_poll, $polls)) {
1287
+			fatal_lang_error('no_access', false);
1288
+	}
1222 1289
 	$deleted_polls = empty($target_poll) ? $polls : array_diff($polls, array($target_poll));
1223 1290
 
1224 1291
 	// Determine the subject of the newly merged topic - was a custom subject specified?
@@ -1226,19 +1293,23 @@  discard block
 block discarded – undo
1226 1293
 	{
1227 1294
 		$target_subject = strtr($smcFunc['htmltrim']($smcFunc['htmlspecialchars']($_POST['custom_subject'])), array("\r" => '', "\n" => '', "\t" => ''));
1228 1295
 		// Keep checking the length.
1229
-		if ($smcFunc['strlen']($target_subject) > 100)
1230
-			$target_subject = $smcFunc['substr']($target_subject, 0, 100);
1296
+		if ($smcFunc['strlen']($target_subject) > 100) {
1297
+					$target_subject = $smcFunc['substr']($target_subject, 0, 100);
1298
+		}
1231 1299
 
1232 1300
 		// Nothing left - odd but pick the first topics subject.
1233
-		if ($target_subject == '')
1234
-			$target_subject = $topic_data[$firstTopic]['subject'];
1301
+		if ($target_subject == '') {
1302
+					$target_subject = $topic_data[$firstTopic]['subject'];
1303
+		}
1235 1304
 	}
1236 1305
 	// A subject was selected from the list.
1237
-	elseif (!empty($topic_data[(int) $_POST['subject']]['subject']))
1238
-		$target_subject = $topic_data[(int) $_POST['subject']]['subject'];
1306
+	elseif (!empty($topic_data[(int) $_POST['subject']]['subject'])) {
1307
+			$target_subject = $topic_data[(int) $_POST['subject']]['subject'];
1308
+	}
1239 1309
 	// Nothing worked? Just take the subject of the first message.
1240
-	else
1241
-		$target_subject = $topic_data[$firstTopic]['subject'];
1310
+	else {
1311
+			$target_subject = $topic_data[$firstTopic]['subject'];
1312
+	}
1242 1313
 
1243 1314
 	// Get the first and last message and the number of messages....
1244 1315
 	$request = $smcFunc['db_query']('', '
@@ -1264,15 +1335,13 @@  discard block
 block discarded – undo
1264 1335
 			{
1265 1336
 				$num_replies = $row['message_count'] - 1;
1266 1337
 				$num_unapproved = 0;
1267
-			}
1268
-			else
1338
+			} else
1269 1339
 			{
1270 1340
 				$topic_approved = 0;
1271 1341
 				$num_replies = 0;
1272 1342
 				$num_unapproved = $row['message_count'];
1273 1343
 			}
1274
-		}
1275
-		else
1344
+		} else
1276 1345
 		{
1277 1346
 			// If this has a lower first_msg then the first post is not approved and hence the number of replies was wrong!
1278 1347
 			if ($first_msg > $row['first_msg'])
@@ -1318,8 +1387,9 @@  discard block
 block discarded – undo
1318 1387
 	list ($member_started) = $smcFunc['db_fetch_row']($request);
1319 1388
 	list ($member_updated) = $smcFunc['db_fetch_row']($request);
1320 1389
 	// First and last message are the same, so only row was returned.
1321
-	if ($member_updated === NULL)
1322
-		$member_updated = $member_started;
1390
+	if ($member_updated === NULL) {
1391
+			$member_updated = $member_started;
1392
+	}
1323 1393
 
1324 1394
 	$smcFunc['db_free_result']($request);
1325 1395
 
@@ -1332,8 +1402,9 @@  discard block
 block discarded – undo
1332 1402
 		array(
1333 1403
 			'topic_list' => $topics,
1334 1404
 	));
1335
-	while ($row = $smcFunc['db_fetch_row']($request))
1336
-		$affected_msgs[] = $row[0];
1405
+	while ($row = $smcFunc['db_fetch_row']($request)) {
1406
+			$affected_msgs[] = $row[0];
1407
+	}
1337 1408
 	$smcFunc['db_free_result']($request);
1338 1409
 
1339 1410
 	// Assign the first topic ID to be the merged topic.
@@ -1411,9 +1482,9 @@  discard block
 block discarded – undo
1411 1482
 	// Grab the response prefix (like 'Re: ') in the default forum language.
1412 1483
 	if (!isset($context['response_prefix']) && !($context['response_prefix'] = cache_get_data('response_prefix')))
1413 1484
 	{
1414
-		if ($language === $user_info['language'])
1415
-			$context['response_prefix'] = $txt['response_prefix'];
1416
-		else
1485
+		if ($language === $user_info['language']) {
1486
+					$context['response_prefix'] = $txt['response_prefix'];
1487
+		} else
1417 1488
 		{
1418 1489
 			loadLanguage('index', $language, false);
1419 1490
 			$context['response_prefix'] = $txt['response_prefix'];
@@ -1493,8 +1564,9 @@  discard block
 block discarded – undo
1493 1564
 	if ($smcFunc['db_num_rows']($request) > 0)
1494 1565
 	{
1495 1566
 		$replaceEntries = array();
1496
-		while ($row = $smcFunc['db_fetch_assoc']($request))
1497
-			$replaceEntries[] = array($row['id_member'], $id_topic, $row['new_id_msg'], $row['unwatched']);
1567
+		while ($row = $smcFunc['db_fetch_assoc']($request)) {
1568
+					$replaceEntries[] = array($row['id_member'], $id_topic, $row['new_id_msg'], $row['unwatched']);
1569
+		}
1498 1570
 
1499 1571
 		$smcFunc['db_insert']('replace',
1500 1572
 			'{db_prefix}log_topics',
@@ -1531,8 +1603,9 @@  discard block
 block discarded – undo
1531 1603
 		if ($smcFunc['db_num_rows']($request) > 0)
1532 1604
 		{
1533 1605
 			$replaceEntries = array();
1534
-			while ($row = $smcFunc['db_fetch_assoc']($request))
1535
-				$replaceEntries[] = array($row['id_member'], $id_topic, 0, $row['sent']);
1606
+			while ($row = $smcFunc['db_fetch_assoc']($request)) {
1607
+							$replaceEntries[] = array($row['id_member'], $id_topic, 0, $row['sent']);
1608
+			}
1536 1609
 
1537 1610
 			$smcFunc['db_insert']('replace',
1538 1611
 					'{db_prefix}log_notify',
@@ -1707,8 +1780,9 @@  discard block
 block discarded – undo
1707 1780
 	// If there's a search index that needs updating, update it...
1708 1781
 	require_once($sourcedir . '/Search.php');
1709 1782
 	$searchAPI = findSearchAPI();
1710
-	if (is_callable(array($searchAPI, 'topicMerge')))
1711
-		$searchAPI->topicMerge($id_topic, $topics, $affected_msgs, empty($_POST['enforce_subject']) ? null : array($context['response_prefix'], $target_subject));
1783
+	if (is_callable(array($searchAPI, 'topicMerge'))) {
1784
+			$searchAPI->topicMerge($id_topic, $topics, $affected_msgs, empty($_POST['enforce_subject']) ? null : array($context['response_prefix'], $target_subject));
1785
+	}
1712 1786
 
1713 1787
 	// Send them to the all done page.
1714 1788
 	redirectexit('action=mergetopics;sa=done;to=' . $id_topic . ';targetboard=' . $target_board);
Please login to merge, or discard this patch.
Sources/ManageBoards.php 2 patches
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -842,7 +842,7 @@
 block discarded – undo
842 842
 	require_once($sourcedir . '/Subs-Boards.php');
843 843
 	sortBoards($recycle_boards);
844 844
 
845
-        $recycle_boards = array('') + $recycle_boards;
845
+		$recycle_boards = array('') + $recycle_boards;
846 846
 
847 847
 	// Here and the board settings...
848 848
 	$config_vars = array(
Please login to merge, or discard this patch.
Braces   +145 added lines, -112 removed lines patch added patch discarded remove patch
@@ -13,8 +13,9 @@  discard block
 block discarded – undo
13 13
  * @version 2.1 Beta 3
14 14
  */
15 15
 
16
-if (!defined('SMF'))
16
+if (!defined('SMF')) {
17 17
 	die('No direct access...');
18
+}
18 19
 
19 20
 /**
20 21
  * The main dispatcher; doesn't do anything, just delegates.
@@ -92,18 +93,19 @@  discard block
 block discarded – undo
92 93
 		checkSession('get');
93 94
 		validateToken('admin-bm-' . (int) $_REQUEST['src_board'], 'request');
94 95
 
95
-		if ($_REQUEST['move_to'] === 'top')
96
-			$boardOptions = array(
96
+		if ($_REQUEST['move_to'] === 'top') {
97
+					$boardOptions = array(
97 98
 				'move_to' => $_REQUEST['move_to'],
98 99
 				'target_category' => (int) $_REQUEST['target_cat'],
99 100
 				'move_first_child' => true,
100 101
 			);
101
-		else
102
-			$boardOptions = array(
102
+		} else {
103
+					$boardOptions = array(
103 104
 				'move_to' => $_REQUEST['move_to'],
104 105
 				'target_board' => (int) $_REQUEST['target_board'],
105 106
 				'move_first_child' => true,
106 107
 			);
108
+		}
107 109
 		modifyBoard((int) $_REQUEST['src_board'], $boardOptions);
108 110
 	}
109 111
 
@@ -148,15 +150,16 @@  discard block
 block discarded – undo
148 150
 			$security = $context['session_var'] . '=' . $context['session_id'] . ';' . $context['admin-bm-' . $context['move_board'] . '_token_var'] . '=' . $context['admin-bm-' . $context['move_board'] . '_token'];
149 151
 			foreach ($boardList[$catid] as $boardid)
150 152
 			{
151
-				if (!isset($context['categories'][$catid]['move_link']))
152
-					$context['categories'][$catid]['move_link'] = array(
153
+				if (!isset($context['categories'][$catid]['move_link'])) {
154
+									$context['categories'][$catid]['move_link'] = array(
153 155
 						'child_level' => 0,
154 156
 						'label' => $txt['mboards_order_before'] . ' \'' . $smcFunc['htmlspecialchars']($boards[$boardid]['name']) . '\'',
155 157
 						'href' => $scripturl . '?action=admin;area=manageboards;sa=move;src_board=' . $context['move_board'] . ';target_board=' . $boardid . ';move_to=before;' . $security,
156 158
 					);
159
+				}
157 160
 
158
-				if (!$context['categories'][$catid]['boards'][$boardid]['move'])
159
-				$context['categories'][$catid]['boards'][$boardid]['move_links'] = array(
161
+				if (!$context['categories'][$catid]['boards'][$boardid]['move']) {
162
+								$context['categories'][$catid]['boards'][$boardid]['move_links'] = array(
160 163
 					array(
161 164
 						'child_level' => $boards[$boardid]['level'],
162 165
 						'label' => $txt['mboards_order_after'] . '\'' . $smcFunc['htmlspecialchars']($boards[$boardid]['name']) . '\'',
@@ -170,34 +173,39 @@  discard block
 block discarded – undo
170 173
 						'class' => 'here',
171 174
 					),
172 175
 				);
176
+				}
173 177
 
174 178
 				$difference = $boards[$boardid]['level'] - $prev_child_level;
175
-				if ($difference == 1)
176
-					array_push($stack, !empty($context['categories'][$catid]['boards'][$prev_board]['move_links']) ? array_shift($context['categories'][$catid]['boards'][$prev_board]['move_links']) : null);
177
-				elseif ($difference < 0)
179
+				if ($difference == 1) {
180
+									array_push($stack, !empty($context['categories'][$catid]['boards'][$prev_board]['move_links']) ? array_shift($context['categories'][$catid]['boards'][$prev_board]['move_links']) : null);
181
+				} elseif ($difference < 0)
178 182
 				{
179
-					if (empty($context['categories'][$catid]['boards'][$prev_board]['move_links']))
180
-						$context['categories'][$catid]['boards'][$prev_board]['move_links'] = array();
181
-					for ($i = 0; $i < -$difference; $i++)
182
-						if (($temp = array_pop($stack)) != null)
183
+					if (empty($context['categories'][$catid]['boards'][$prev_board]['move_links'])) {
184
+											$context['categories'][$catid]['boards'][$prev_board]['move_links'] = array();
185
+					}
186
+					for ($i = 0; $i < -$difference; $i++) {
187
+											if (($temp = array_pop($stack)) != null)
183 188
 							array_unshift($context['categories'][$catid]['boards'][$prev_board]['move_links'], $temp);
189
+					}
184 190
 				}
185 191
 
186 192
 				$prev_board = $boardid;
187 193
 				$prev_child_level = $boards[$boardid]['level'];
188 194
 
189 195
 			}
190
-			if (!empty($stack) && !empty($context['categories'][$catid]['boards'][$prev_board]['move_links']))
191
-				$context['categories'][$catid]['boards'][$prev_board]['move_links'] = array_merge($stack, $context['categories'][$catid]['boards'][$prev_board]['move_links']);
192
-			elseif (!empty($stack))
193
-				$context['categories'][$catid]['boards'][$prev_board]['move_links'] = $stack;
196
+			if (!empty($stack) && !empty($context['categories'][$catid]['boards'][$prev_board]['move_links'])) {
197
+							$context['categories'][$catid]['boards'][$prev_board]['move_links'] = array_merge($stack, $context['categories'][$catid]['boards'][$prev_board]['move_links']);
198
+			} elseif (!empty($stack)) {
199
+							$context['categories'][$catid]['boards'][$prev_board]['move_links'] = $stack;
200
+			}
194 201
 
195
-			if (empty($boardList[$catid]))
196
-				$context['categories'][$catid]['move_link'] = array(
202
+			if (empty($boardList[$catid])) {
203
+							$context['categories'][$catid]['move_link'] = array(
197 204
 					'child_level' => 0,
198 205
 					'label' => $txt['mboards_order_before'] . ' \'' . $smcFunc['htmlspecialchars']($tree['node']['name']) . '\'',
199 206
 					'href' => $scripturl . '?action=admin;area=manageboards;sa=move;src_board=' . $context['move_board'] . ';target_cat=' . $catid . ';move_to=top;' . $security,
200 207
 				);
208
+			}
201 209
 		}
202 210
 	}
203 211
 
@@ -253,9 +261,9 @@  discard block
 block discarded – undo
253 261
 		);
254 262
 	}
255 263
 	// Category doesn't exist, man... sorry.
256
-	elseif (!isset($cat_tree[$_REQUEST['cat']]))
257
-		redirectexit('action=admin;area=manageboards');
258
-	else
264
+	elseif (!isset($cat_tree[$_REQUEST['cat']])) {
265
+			redirectexit('action=admin;area=manageboards');
266
+	} else
259 267
 	{
260 268
 		$context['category'] = array(
261 269
 			'id' => $_REQUEST['cat'],
@@ -267,30 +275,31 @@  discard block
 block discarded – undo
267 275
 			'is_empty' => empty($cat_tree[$_REQUEST['cat']]['children'])
268 276
 		);
269 277
 
270
-		foreach ($boardList[$_REQUEST['cat']] as $child_board)
271
-			$context['category']['children'][] = str_repeat('-', $boards[$child_board]['level']) . ' ' . $boards[$child_board]['name'];
278
+		foreach ($boardList[$_REQUEST['cat']] as $child_board) {
279
+					$context['category']['children'][] = str_repeat('-', $boards[$child_board]['level']) . ' ' . $boards[$child_board]['name'];
280
+		}
272 281
 	}
273 282
 
274 283
 	$prevCat = 0;
275 284
 	foreach ($cat_tree as $catid => $tree)
276 285
 	{
277
-		if ($catid == $_REQUEST['cat'] && $prevCat > 0)
278
-			$context['category_order'][$prevCat]['selected'] = true;
279
-		elseif ($catid != $_REQUEST['cat'])
280
-			$context['category_order'][$catid] = array(
286
+		if ($catid == $_REQUEST['cat'] && $prevCat > 0) {
287
+					$context['category_order'][$prevCat]['selected'] = true;
288
+		} elseif ($catid != $_REQUEST['cat']) {
289
+					$context['category_order'][$catid] = array(
281 290
 				'id' => $catid,
282 291
 				'name' => $txt['mboards_order_after'] . $tree['node']['name'],
283 292
 				'selected' => false,
284 293
 				'true_name' => $tree['node']['name']
285 294
 			);
295
+		}
286 296
 		$prevCat = $catid;
287 297
 	}
288 298
 	if (!isset($_REQUEST['delete']))
289 299
 	{
290 300
 		$context['sub_template'] = 'modify_category';
291 301
 		$context['page_title'] = $_REQUEST['sa'] == 'newcat' ? $txt['mboards_new_cat_name'] : $txt['catEdit'];
292
-	}
293
-	else
302
+	} else
294 303
 	{
295 304
 		$context['sub_template'] = 'confirm_category_delete';
296 305
 		$context['page_title'] = $txt['mboards_delete_cat'];
@@ -327,8 +336,9 @@  discard block
 block discarded – undo
327 336
 	{
328 337
 		$catOptions = array();
329 338
 
330
-		if (isset($_POST['cat_order']))
331
-			$catOptions['move_after'] = (int) $_POST['cat_order'];
339
+		if (isset($_POST['cat_order'])) {
340
+					$catOptions['move_after'] = (int) $_POST['cat_order'];
341
+		}
332 342
 
333 343
 		// Change "This & That" to "This &amp; That" but don't change "&cent" to "&amp;cent;"...
334 344
 		$catOptions['cat_name'] = parse_bbc($smcFunc['htmlspecialchars']($_POST['cat_name']), false, '', $context['description_allowed_tags']);
@@ -336,10 +346,11 @@  discard block
 block discarded – undo
336 346
 
337 347
 		$catOptions['is_collapsible'] = isset($_POST['collapse']);
338 348
 
339
-		if (isset($_POST['add']))
340
-			createCategory($catOptions);
341
-		else
342
-			modifyCategory($_POST['cat'], $catOptions);
349
+		if (isset($_POST['add'])) {
350
+					createCategory($catOptions);
351
+		} else {
352
+					modifyCategory($_POST['cat'], $catOptions);
353
+		}
343 354
 	}
344 355
 	// If they want to delete - first give them confirmation.
345 356
 	elseif (isset($_POST['delete']) && !isset($_POST['confirmation']) && !isset($_POST['empty']))
@@ -353,13 +364,14 @@  discard block
 block discarded – undo
353 364
 		// First off - check if we are moving all the current boards first - before we start deleting!
354 365
 		if (isset($_POST['delete_action']) && $_POST['delete_action'] == 1)
355 366
 		{
356
-			if (empty($_POST['cat_to']))
357
-				fatal_lang_error('mboards_delete_error');
367
+			if (empty($_POST['cat_to'])) {
368
+							fatal_lang_error('mboards_delete_error');
369
+			}
358 370
 
359 371
 			deleteCategories(array($_POST['cat']), (int) $_POST['cat_to']);
372
+		} else {
373
+					deleteCategories(array($_POST['cat']));
360 374
 		}
361
-		else
362
-			deleteCategories(array($_POST['cat']));
363 375
 	}
364 376
 
365 377
 	redirectexit('action=admin;area=manageboards');
@@ -404,8 +416,9 @@  discard block
 block discarded – undo
404 416
 	if ($_REQUEST['sa'] == 'newboard')
405 417
 	{
406 418
 		// Category doesn't exist, man... sorry.
407
-		if (empty($_REQUEST['cat']))
408
-			redirectexit('action=admin;area=manageboards');
419
+		if (empty($_REQUEST['cat'])) {
420
+					redirectexit('action=admin;area=manageboards');
421
+		}
409 422
 
410 423
 		// Some things that need to be setup for a new board.
411 424
 		$curBoard = array(
@@ -429,8 +442,7 @@  discard block
 block discarded – undo
429 442
 			'category' => (int) $_REQUEST['cat'],
430 443
 			'no_children' => true,
431 444
 		);
432
-	}
433
-	else
445
+	} else
434 446
 	{
435 447
 		// Just some easy shortcuts.
436 448
 		$curBoard = &$boards[$_REQUEST['boardid']];
@@ -478,8 +490,9 @@  discard block
 block discarded – undo
478 490
 	);
479 491
 	while ($row = $smcFunc['db_fetch_assoc']($request))
480 492
 	{
481
-		if ($_REQUEST['sa'] == 'newboard' && $row['min_posts'] == -1)
482
-			$curBoard['member_groups'][] = $row['id_group'];
493
+		if ($_REQUEST['sa'] == 'newboard' && $row['min_posts'] == -1) {
494
+					$curBoard['member_groups'][] = $row['id_group'];
495
+		}
483 496
 
484 497
 		$context['groups'][(int) $row['id_group']] = array(
485 498
 			'id' => $row['id_group'],
@@ -492,8 +505,9 @@  discard block
 block discarded – undo
492 505
 	$smcFunc['db_free_result']($request);
493 506
 
494 507
 	// Category doesn't exist, man... sorry.
495
-	if (!isset($boardList[$curBoard['category']]))
496
-		redirectexit('action=admin;area=manageboards');
508
+	if (!isset($boardList[$curBoard['category']])) {
509
+			redirectexit('action=admin;area=manageboards');
510
+	}
497 511
 
498 512
 	foreach ($boardList[$curBoard['category']] as $boardid)
499 513
 	{
@@ -507,8 +521,7 @@  discard block
 block discarded – undo
507 521
 				'is_child' => false,
508 522
 				'selected' => true
509 523
 			);
510
-		}
511
-		else
524
+		} else
512 525
 		{
513 526
 			$context['board_order'][] = array(
514 527
 				'id' => $boardid,
@@ -525,19 +538,21 @@  discard block
 block discarded – undo
525 538
 		$context['can_move_children'] = false;
526 539
 		$context['children'] = $boards[$_REQUEST['boardid']]['tree']['children'];
527 540
 
528
-		foreach ($context['board_order'] as $lBoard)
529
-			if ($lBoard['is_child'] == false && $lBoard['selected'] == false)
541
+		foreach ($context['board_order'] as $lBoard) {
542
+					if ($lBoard['is_child'] == false && $lBoard['selected'] == false)
530 543
 				$context['can_move_children'] = true;
544
+		}
531 545
 	}
532 546
 
533 547
 	// Get other available categories.
534 548
 	$context['categories'] = array();
535
-	foreach ($cat_tree as $catID => $tree)
536
-		$context['categories'][] = array(
549
+	foreach ($cat_tree as $catID => $tree) {
550
+			$context['categories'][] = array(
537 551
 			'id' => $catID == $curBoard['category'] ? 0 : $catID,
538 552
 			'name' => $tree['node']['name'],
539 553
 			'selected' => $catID == $curBoard['category']
540 554
 		);
555
+	}
541 556
 
542 557
 	$request = $smcFunc['db_query']('', '
543 558
 		SELECT mem.id_member, mem.real_name
@@ -549,14 +564,16 @@  discard block
 block discarded – undo
549 564
 		)
550 565
 	);
551 566
 	$context['board']['moderators'] = array();
552
-	while ($row = $smcFunc['db_fetch_assoc']($request))
553
-		$context['board']['moderators'][$row['id_member']] = $row['real_name'];
567
+	while ($row = $smcFunc['db_fetch_assoc']($request)) {
568
+			$context['board']['moderators'][$row['id_member']] = $row['real_name'];
569
+	}
554 570
 	$smcFunc['db_free_result']($request);
555 571
 
556 572
 	$context['board']['moderator_list'] = empty($context['board']['moderators']) ? '' : '&quot;' . implode('&quot;, &quot;', $context['board']['moderators']) . '&quot;';
557 573
 
558
-	if (!empty($context['board']['moderators']))
559
-		list ($context['board']['last_moderator_id']) = array_slice(array_keys($context['board']['moderators']), -1);
574
+	if (!empty($context['board']['moderators'])) {
575
+			list ($context['board']['last_moderator_id']) = array_slice(array_keys($context['board']['moderators']), -1);
576
+	}
560 577
 
561 578
 	// Get all the groups assigned as moderators
562 579
 	$request = $smcFunc['db_query']('', '
@@ -568,14 +585,16 @@  discard block
 block discarded – undo
568 585
 		)
569 586
 	);
570 587
 	$context['board']['moderator_groups'] = array();
571
-	while ($row = $smcFunc['db_fetch_assoc']($request))
572
-		$context['board']['moderator_groups'][$row['id_group']] = $context['groups'][$row['id_group']]['name'];
588
+	while ($row = $smcFunc['db_fetch_assoc']($request)) {
589
+			$context['board']['moderator_groups'][$row['id_group']] = $context['groups'][$row['id_group']]['name'];
590
+	}
573 591
 	$smcFunc['db_free_result']($request);
574 592
 
575 593
 	$context['board']['moderator_groups_list'] = empty($context['board']['moderator_groups']) ? '' : '&quot;' . implode('&quot;, &qout;', $context['board']['moderator_groups']) . '&quot;';
576 594
 
577
-	if (!empty($context['board']['moderator_groups']))
578
-		list ($context['board']['last_moderator_group_id']) = array_slice(array_keys($context['board']['moderator_groups']), -1);
595
+	if (!empty($context['board']['moderator_groups'])) {
596
+			list ($context['board']['last_moderator_group_id']) = array_slice(array_keys($context['board']['moderator_groups']), -1);
597
+	}
579 598
 
580 599
 	// Get all the themes...
581 600
 	$request = $smcFunc['db_query']('', '
@@ -587,8 +606,9 @@  discard block
 block discarded – undo
587 606
 		)
588 607
 	);
589 608
 	$context['themes'] = array();
590
-	while ($row = $smcFunc['db_fetch_assoc']($request))
591
-		$context['themes'][] = $row;
609
+	while ($row = $smcFunc['db_fetch_assoc']($request)) {
610
+			$context['themes'][] = $row;
611
+	}
592 612
 	$smcFunc['db_free_result']($request);
593 613
 
594 614
 	if (!isset($_REQUEST['delete']))
@@ -596,8 +616,7 @@  discard block
 block discarded – undo
596 616
 		$context['sub_template'] = 'modify_board';
597 617
 		$context['page_title'] = $txt['boardsEdit'];
598 618
 		loadJavaScriptFile('suggest.js', array('defer' => false), 'smf_suggest');
599
-	}
600
-	else
619
+	} else
601 620
 	{
602 621
 		$context['sub_template'] = 'confirm_board_delete';
603 622
 		$context['page_title'] = $txt['mboards_delete_board'];
@@ -641,8 +660,9 @@  discard block
 block discarded – undo
641 660
 		// Change the boardorder of this board?
642 661
 		elseif (!empty($_POST['placement']) && !empty($_POST['board_order']))
643 662
 		{
644
-			if (!in_array($_POST['placement'], array('before', 'after', 'child')))
645
-				fatal_lang_error('mangled_post', false);
663
+			if (!in_array($_POST['placement'], array('before', 'after', 'child'))) {
664
+							fatal_lang_error('mangled_post', false);
665
+			}
646 666
 
647 667
 			$boardOptions['move_to'] = $_POST['placement'];
648 668
 			$boardOptions['target_board'] = (int) $_POST['board_order'];
@@ -655,13 +675,14 @@  discard block
 block discarded – undo
655 675
 		$boardOptions['access_groups'] = array();
656 676
 		$boardOptions['deny_groups'] = array();
657 677
 
658
-		if (!empty($_POST['groups']))
659
-			foreach ($_POST['groups'] as $group => $action)
678
+		if (!empty($_POST['groups'])) {
679
+					foreach ($_POST['groups'] as $group => $action)
660 680
 			{
661 681
 				if ($action == 'allow')
662 682
 					$boardOptions['access_groups'][] = (int) $group;
663
-				elseif ($action == 'deny')
664
-					$boardOptions['deny_groups'][] = (int) $group;
683
+		} elseif ($action == 'deny') {
684
+									$boardOptions['deny_groups'][] = (int) $group;
685
+				}
665 686
 			}
666 687
 
667 688
 		// People with manage-boards are special.
@@ -673,8 +694,9 @@  discard block
 block discarded – undo
673 694
 		// Secondly, make sure those with super cow powers (like apt-get, or in this case manage boards) are upgraded.
674 695
 		$boardOptions['access_groups'] = array_unique(array_merge($boardOptions['access_groups'], $board_managers));
675 696
 
676
-		if (strlen(implode(',', $boardOptions['access_groups'])) > 255 || strlen(implode(',', $boardOptions['deny_groups'])) > 255)
677
-			fatal_lang_error('too_many_groups', false);
697
+		if (strlen(implode(',', $boardOptions['access_groups'])) > 255 || strlen(implode(',', $boardOptions['deny_groups'])) > 255) {
698
+					fatal_lang_error('too_many_groups', false);
699
+		}
678 700
 
679 701
 		// Do not allow HTML tags. Parse the string.
680 702
 		$boardOptions['board_name'] = parse_bbc($smcFunc['htmlspecialchars']($_POST['board_name']), false, '', $context['description_allowed_tags']);
@@ -685,8 +707,9 @@  discard block
 block discarded – undo
685 707
 		if (isset($_POST['moderator_list']) && is_array($_POST['moderator_list']))
686 708
 		{
687 709
 			$moderators = array();
688
-			foreach ($_POST['moderator_list'] as $moderator)
689
-				$moderators[(int) $moderator] = (int) $moderator;
710
+			foreach ($_POST['moderator_list'] as $moderator) {
711
+							$moderators[(int) $moderator] = (int) $moderator;
712
+			}
690 713
 			$boardOptions['moderators'] = $moderators;
691 714
 		}
692 715
 
@@ -695,8 +718,9 @@  discard block
 block discarded – undo
695 718
 		if (isset($_POST['moderator_group_list']) && is_array($_POST['moderator_group_list']))
696 719
 		{
697 720
 			$moderator_groups = array();
698
-			foreach ($_POST['moderator_group_list'] as $moderator_group)
699
-				$moderator_groups[(int) $moderator_group] = (int) $moderator_group;
721
+			foreach ($_POST['moderator_group_list'] as $moderator_group) {
722
+							$moderator_groups[(int) $moderator_group] = (int) $moderator_group;
723
+			}
700 724
 			$boardOptions['moderator_groups'] = $moderator_groups;
701 725
 		}
702 726
 
@@ -722,56 +746,62 @@  discard block
 block discarded – undo
722 746
 			$smcFunc['db_free_result']($request);
723 747
 
724 748
 			// If we're turning redirection on check the board doesn't have posts in it - if it does don't make it a redirection board.
725
-			if ($boardOptions['redirect'] && empty($oldRedirect) && $numPosts)
726
-				unset($boardOptions['redirect']);
749
+			if ($boardOptions['redirect'] && empty($oldRedirect) && $numPosts) {
750
+							unset($boardOptions['redirect']);
751
+			}
727 752
 			// Reset the redirection count when switching on/off.
728
-			elseif (empty($boardOptions['redirect']) != empty($oldRedirect))
729
-				$boardOptions['num_posts'] = 0;
753
+			elseif (empty($boardOptions['redirect']) != empty($oldRedirect)) {
754
+							$boardOptions['num_posts'] = 0;
755
+			}
730 756
 			// Resetting the count?
731
-			elseif ($boardOptions['redirect'] && !empty($_POST['reset_redirect']))
732
-				$boardOptions['num_posts'] = 0;
757
+			elseif ($boardOptions['redirect'] && !empty($_POST['reset_redirect'])) {
758
+							$boardOptions['num_posts'] = 0;
759
+			}
733 760
 		}
734 761
 
735 762
 		// Create a new board...
736 763
 		if (isset($_POST['add']))
737 764
 		{
738 765
 			// New boards by default go to the bottom of the category.
739
-			if (empty($_POST['new_cat']))
740
-				$boardOptions['target_category'] = (int) $_POST['cur_cat'];
741
-			if (!isset($boardOptions['move_to']))
742
-				$boardOptions['move_to'] = 'bottom';
766
+			if (empty($_POST['new_cat'])) {
767
+							$boardOptions['target_category'] = (int) $_POST['cur_cat'];
768
+			}
769
+			if (!isset($boardOptions['move_to'])) {
770
+							$boardOptions['move_to'] = 'bottom';
771
+			}
743 772
 
744 773
 			createBoard($boardOptions);
745 774
 		}
746 775
 
747 776
 		// ...or update an existing board.
748
-		else
749
-			modifyBoard($_POST['boardid'], $boardOptions);
750
-	}
751
-	elseif (isset($_POST['delete']) && !isset($_POST['confirmation']) && !isset($_POST['no_children']))
777
+		else {
778
+					modifyBoard($_POST['boardid'], $boardOptions);
779
+		}
780
+	} elseif (isset($_POST['delete']) && !isset($_POST['confirmation']) && !isset($_POST['no_children']))
752 781
 	{
753 782
 		EditBoard();
754 783
 		return;
755
-	}
756
-	elseif (isset($_POST['delete']))
784
+	} elseif (isset($_POST['delete']))
757 785
 	{
758 786
 		// First off - check if we are moving all the current child boards first - before we start deleting!
759 787
 		if (isset($_POST['delete_action']) && $_POST['delete_action'] == 1)
760 788
 		{
761
-			if (empty($_POST['board_to']))
762
-				fatal_lang_error('mboards_delete_board_error');
789
+			if (empty($_POST['board_to'])) {
790
+							fatal_lang_error('mboards_delete_board_error');
791
+			}
763 792
 
764 793
 			deleteBoards(array($_POST['boardid']), (int) $_POST['board_to']);
794
+		} else {
795
+					deleteBoards(array($_POST['boardid']), 0);
765 796
 		}
766
-		else
767
-			deleteBoards(array($_POST['boardid']), 0);
768 797
 	}
769 798
 
770
-	if (isset($_REQUEST['rid']) && $_REQUEST['rid'] == 'permissions')
771
-		redirectexit('action=admin;area=permissions;sa=board;' . $context['session_var'] . '=' . $context['session_id']);
772
-	else
773
-		redirectexit('action=admin;area=manageboards');
774
-}
799
+	if (isset($_REQUEST['rid']) && $_REQUEST['rid'] == 'permissions') {
800
+			redirectexit('action=admin;area=permissions;sa=board;' . $context['session_var'] . '=' . $context['session_id']);
801
+	} else {
802
+			redirectexit('action=admin;area=manageboards');
803
+	}
804
+	}
775 805
 
776 806
 /**
777 807
  * Used to retrieve data for modifying a board category
@@ -808,8 +838,9 @@  discard block
 block discarded – undo
808 838
 	$smcFunc['db_free_result']($request);
809 839
 
810 840
 	// This would probably never happen, but just to be sure.
811
-	if ($cat .= $allowed_sa[1])
812
-		die(str_replace(',', ' to', $cat));
841
+	if ($cat .= $allowed_sa[1]) {
842
+			die(str_replace(',', ' to', $cat));
843
+	}
813 844
 
814 845
 	redirectexit();
815 846
 }
@@ -835,8 +866,9 @@  discard block
 block discarded – undo
835 866
 			'empty_string' => '',
836 867
 		)
837 868
 	);
838
-	while ($row = $smcFunc['db_fetch_assoc']($request))
839
-		$recycle_boards[$row['id_board']] = $row['cat_name'] . ' - ' . $row['board_name'];
869
+	while ($row = $smcFunc['db_fetch_assoc']($request)) {
870
+			$recycle_boards[$row['id_board']] = $row['cat_name'] . ' - ' . $row['board_name'];
871
+	}
840 872
 	$smcFunc['db_free_result']($request);
841 873
 
842 874
 	require_once($sourcedir . '/Subs-Boards.php');
@@ -860,8 +892,9 @@  discard block
 block discarded – undo
860 892
 
861 893
 	call_integration_hook('integrate_modify_board_settings', array(&$config_vars));
862 894
 
863
-	if ($return_config)
864
-		return $config_vars;
895
+	if ($return_config) {
896
+			return $config_vars;
897
+	}
865 898
 
866 899
 	// Needed for the settings template.
867 900
 	require_once($sourcedir . '/ManageServer.php');
Please login to merge, or discard this patch.