From d13fcd44c7fbeb5bf98bfdb9e9dfb2a7bec5d49f Mon Sep 17 00:00:00 2001
From: Nick Liu <deltik@gmx.com>
Date: Sun, 12 Jan 2020 23:15:25 +0100
Subject: [PATCH] De-indented e107::url() with guard clause

Less cognitive complexity now that the e_url.php check is a guard clause
---
 e107_handlers/e107_class.php | 233 +++++++++++++++--------------------
 1 file changed, 97 insertions(+), 136 deletions(-)

diff --git a/e107_handlers/e107_class.php b/e107_handlers/e107_class.php
index f2fffd146..8ca8e8eab 100755
--- a/e107_handlers/e107_class.php
+++ b/e107_handlers/e107_class.php
@@ -3403,18 +3403,16 @@ class e107
 	 * @param bool      $options['legacy'] When true legacy urls will be generated regardless of mod-rewrite status.
 	 * @return string
 	 */
-	public static function url($plugin='', $key=null, $row=array(), $options = array())
+	public static function url($plugin = '', $key = null, $row = array(), $options = array())
 	{
 
 		/* backward compat - core keys. ie. news/xxx/xxx user/xxx/xxx etc, */
-		$legacy = array('news','page','search','user','download','gallery');
+		$legacy = array('news', 'page', 'search', 'user', 'download', 'gallery');
 
-		if(strpos($plugin,'/')!==false)
-		{
-			$tmp = explode("/",$plugin,2);
+		if (strpos($plugin, '/') !== false) {
+			$tmp = explode("/", $plugin, 2);
 
-			if(in_array($tmp[0], $legacy))
-			{
+			if (in_array($tmp[0], $legacy)) {
 				return self::getUrl()->create($plugin, $key, $row);
 			}
 
@@ -3424,10 +3422,9 @@ class e107
 			$key = $tmp[1];
 		}
 
-		if(!$tmp = self::getRegistry('core/e107/addons/e_url'))
-		{
+		if (!$tmp = self::getRegistry('core/e107/addons/e_url')) {
 			$tmp = self::getUrlConfig();
-			self::setRegistry('core/e107/addons/e_url',$tmp);
+			self::setRegistry('core/e107/addons/e_url', $tmp);
 		}
 
 		$tp = self::getParser();
@@ -3437,7 +3434,7 @@ class e107
 		$rootNamespace = self::getPref('url_main_module');
 
 
-		if(is_string($options)) // backwards compat.
+		if (is_string($options)) // backwards compat.
 		{
 			$options = array(
 				'mode' => $options,
@@ -3446,159 +3443,123 @@ class e107
 
 		// Merge in defaults.
 		$options += array(
-			'mode'     => 'abs',
+			'mode' => 'abs',
 			'fragment' => '',
-			'query'    => array(),
+			'query' => array(),
 		);
 
-		if(isset($options['fragment']) && $options['fragment'] !== '')
-		{
+		if (isset($options['fragment']) && $options['fragment'] !== '') {
 			$options['fragment'] = '#' . $options['fragment'];
 		}
 
-		if(!empty($tmp[$plugin][$key]['sef']))
+		if (!empty($plugin) && empty($tmp[$plugin][$key]['sef'])) {
+			self::getMessage()->addDebug("e_url.php in <b>" . e_PLUGIN . $plugin . "</b> is missing the key: <b>" . $key . "</b>. Or, you may need to <a href='" . e_ADMIN . "db.php?mode=plugin_scan'>scan your plugin directories</a> to register e_url.php");
+			return false;
+		}
+
+		if (!empty($tmp[$plugin][$key]['alias'])) {
+			$alias = (!empty($pref[e_LAN][$plugin][$key])) ? $pref[e_LAN][$plugin][$key] : $tmp[$plugin][$key]['alias'];
+
+			if (!empty($rootNamespace) && $rootNamespace === $plugin) {
+				$replaceAlias = array('{alias}\/', '{alias}/');
+				$tmp[$plugin][$key]['sef'] = str_replace($replaceAlias, '', $tmp[$plugin][$key]['sef']);
+			} else {
+				$tmp[$plugin][$key]['sef'] = str_replace('{alias}', $alias, $tmp[$plugin][$key]['sef']);
+			}
+
+		}
+
+
+		preg_match_all('#{([a-z_]*)}#', $tmp[$plugin][$key]['sef'], $matches);
+
+		$active = true;
+
+		foreach ($matches[1] as $k => $v) // check if a field value is missing, if so, revent to legacy url.
 		{
-			if(!empty($tmp[$plugin][$key]['alias']))
-			{
-				$alias = (!empty($pref[e_LAN][$plugin][$key])) ? $pref[e_LAN][$plugin][$key] : $tmp[$plugin][$key]['alias'];
-
-				if(!empty($rootNamespace) && $rootNamespace === $plugin)
-				{
-					$replaceAlias = array('{alias}\/','{alias}/');
-					$tmp[$plugin][$key]['sef'] = str_replace($replaceAlias, '', $tmp[$plugin][$key]['sef']);
-				}
-				else
-				{
-					$tmp[$plugin][$key]['sef'] = str_replace('{alias}', $alias, $tmp[$plugin][$key]['sef']);
-				}
-
-			}
-
-
-			preg_match_all('#{([a-z_]*)}#', $tmp[$plugin][$key]['sef'],$matches);
-
-			$active = true;
-
-			foreach($matches[1] as $k=>$v) // check if a field value is missing, if so, revent to legacy url.
-			{
-				if(!isset($row[$v]))
-				{
-					self::getMessage()->addDebug("Missing value for ".$v." in ".$plugin."/e_url.php - '".$key."'");
-					$active = false;
-					break;
-				}
-			}
-
-			if(empty($sefActive[$plugin])) // SEF disabled.
-			{
-				self::getDebug()->log('SEF URL for <b>'.$plugin.'</b> disabled.');
+			if (!isset($row[$v])) {
+				self::getMessage()->addDebug("Missing value for " . $v . " in " . $plugin . "/e_url.php - '" . $key . "'");
 				$active = false;
+				break;
+			}
+		}
+
+		if (empty($sefActive[$plugin])) // SEF disabled.
+		{
+			self::getDebug()->log('SEF URL for <b>' . $plugin . '</b> disabled.');
+			$active = false;
+		}
+
+
+		if (deftrue('e_MOD_REWRITE') && ($active == true) && empty($options['legacy']))  // Search-Engine-Friendly URLs active.
+		{
+			$rawUrl = $tp->simpleParse($tmp[$plugin][$key]['sef'], $row);
+
+			if ($options['mode'] === 'full') {
+				$sefUrl = SITEURL . $rawUrl;
+			} elseif ($options['mode'] === 'raw') {
+				$sefUrl = $rawUrl;
+			} else {
+				$sefUrl = e_HTTP . $rawUrl;
 			}
 
-
-
-			if(deftrue('e_MOD_REWRITE') && ($active == true) && empty($options['legacy']))  // Search-Engine-Friendly URLs active.
-			{
-				$rawUrl = $tp->simpleParse($tmp[$plugin][$key]['sef'], $row);
-
-				if($options['mode'] === 'full')
-				{
-					$sefUrl = SITEURL.$rawUrl;
-				}
-				elseif($options['mode'] === 'raw')
-				{
-					$sefUrl = $rawUrl;
-				}
-				else
-				{
-					$sefUrl = e_HTTP.$rawUrl;
-				}
-
-				// Append the query.
-				if (is_array($options['query']) && !empty($options['query'])) {
-					$sefUrl .= (strpos($sefUrl, '?') !== FALSE ? '&' : '?') . self::httpBuildQuery($options['query']);
-				}
-
-				return $sefUrl . $options['fragment'];
+			// Append the query.
+			if (is_array($options['query']) && !empty($options['query'])) {
+				$sefUrl .= (strpos($sefUrl, '?') !== FALSE ? '&' : '?') . self::httpBuildQuery($options['query']);
 			}
-			else // Legacy URL.
-			{
 
-				$srch = array();
-				$repl = array();
+			return $sefUrl . $options['fragment'];
+		} else // Legacy URL.
+		{
 
-				foreach($matches[0] as $k=>$val)
-				{
-					$srch[] = '$'.($k+1);
-					$repl[] = $val;
-				}
+			$srch = array();
+			$repl = array();
 
-				$template = isset($tmp[$plugin][$key]['legacy']) ? $tmp[$plugin][$key]['legacy'] : $tmp[$plugin][$key]['redirect'];
+			foreach ($matches[0] as $k => $val) {
+				$srch[] = '$' . ($k + 1);
+				$repl[] = $val;
+			}
 
-				$urlTemplate = str_replace($srch,$repl, $template);
-				$urlTemplate = $tp->replaceConstants($urlTemplate, $options['mode']);
-				$legacyUrl = $tp->simpleParse($urlTemplate, $row);
+			$template = isset($tmp[$plugin][$key]['legacy']) ? $tmp[$plugin][$key]['legacy'] : $tmp[$plugin][$key]['redirect'];
 
-				$legacyUrl = preg_replace('/&?\$[\d]/i', "", $legacyUrl); // remove any left-over $x (including prefix of '&')
+			$urlTemplate = str_replace($srch, $repl, $template);
+			$urlTemplate = $tp->replaceConstants($urlTemplate, $options['mode']);
+			$legacyUrl = $tp->simpleParse($urlTemplate, $row);
+
+			$legacyUrl = preg_replace('/&?\$[\d]/i', "", $legacyUrl); // remove any left-over $x (including prefix of '&')
 
 
-				// Avoid duplicate query keys. eg. URL has ?id=x and $options['query']['id'] exists.
-				// @see forum/e_url.php - topic/redirect and forum/view_shortcodes.php sc_post_url()
-				list($legacyUrl,$tmp) = explode("?",$legacyUrl);
+			// Avoid duplicate query keys. eg. URL has ?id=x and $options['query']['id'] exists.
+			// @see forum/e_url.php - topic/redirect and forum/view_shortcodes.php sc_post_url()
+			list($legacyUrl, $tmp) = explode("?", $legacyUrl);
 
-				if(!empty($tmp))
-				{
-					if (strpos($tmp, '=') === false)
-					{
-						// required for legacy urls of type "request.php?download.43"
-						// @see: issue #3275
-						$legacyUrl .= '?' . $tmp;
-						$options['query'] = null;
-					}
-					else
-					{
+			if (!empty($tmp)) {
+				if (strpos($tmp, '=') === false) {
+					// required for legacy urls of type "request.php?download.43"
+					// @see: issue #3275
+					$legacyUrl .= '?' . $tmp;
+					$options['query'] = null;
+				} else {
 
-						parse_str($tmp,$qry);
+					parse_str($tmp, $qry);
 
-						foreach($qry as $k=>$v)
+					foreach ($qry as $k => $v) {
+						if (!isset($options['query'][$k])) // $options['query'] overrides any in the original URL.
 						{
-							if(!isset($options['query'][$k])) // $options['query'] overrides any in the original URL.
-							{
-								$options['query'][$k] = $v;
-							}
+							$options['query'][$k] = $v;
 						}
-
 					}
+
 				}
-
-				// Append the query.
-				if (is_array($options['query']) && !empty($options['query']))
-				{
-
-					$legacyUrl .= (strpos($legacyUrl, '?') !== FALSE ? '&' : '?') . self::httpBuildQuery($options['query']);
-				}
-
-				return $legacyUrl . $options['fragment'];
 			}
 
+			// Append the query.
+			if (is_array($options['query']) && !empty($options['query'])) {
 
+				$legacyUrl .= (strpos($legacyUrl, '?') !== FALSE ? '&' : '?') . self::httpBuildQuery($options['query']);
+			}
+
+			return $legacyUrl . $options['fragment'];
 		}
-
-		if(!empty($plugin))
-		{
-			self::getMessage()->addDebug("e_url.php in <b>".e_PLUGIN.$plugin."</b> is missing the key: <b>".$key."</b>. Or, you may need to <a href='".e_ADMIN."db.php?mode=plugin_scan'>scan your plugin directories</a> to register e_url.php");
-		}
-		return false;
-
-		/*
-		elseif(varset($tmp[$plugin][$key]['redirect']))
-		{
-			return self::getParser()->replaceConstants($tmp[$plugin][$key]['redirect'],'full');
-		}
-
-		return;
-		*/
-
 	}
 
 
@@ -3643,7 +3604,7 @@ class e107
 	 * rawurlencode() (instead of urlencode()) all query parameters.
 	 * @param array $query The query parameter array to be processed, e.g. $_GET.
 	 * @param string $parent Internal use only. Used to build the $query array key for nested items.
-	 * @return array A rawurlencoded string which can be used as or appended to the URL query string.
+	 * @return string A rawurlencoded string which can be used as or appended to the URL query string.
 	 */
 	public static function httpBuildQuery(array $query, $parent = '')
 	{