Reduces multiple whitespaces including line breaks and tabs to one single space character.
public static reduceWhiteSpaces ( string $String ) | ||
$String | string | The string which should be optimized |
/** * Render the entire head module. */ public function toString() { // Add the canonical Url if necessary. if (method_exists($this->_Sender, 'CanonicalUrl') && !c('Garden.Modules.NoCanonicalUrl', false)) { $CanonicalUrl = $this->_Sender->canonicalUrl(); if (!isUrl($CanonicalUrl)) { $CanonicalUrl = Gdn::router()->ReverseRoute($CanonicalUrl); } $this->_Sender->canonicalUrl($CanonicalUrl); // $CurrentUrl = url('', true); // if ($CurrentUrl != $CanonicalUrl) { $this->addTag('link', array('rel' => 'canonical', 'href' => $CanonicalUrl)); // } } // Include facebook open-graph meta information. if ($FbAppID = c('Plugins.Facebook.ApplicationID')) { $this->addTag('meta', array('property' => 'fb:app_id', 'content' => $FbAppID)); } $SiteName = c('Garden.Title', ''); if ($SiteName != '') { $this->addTag('meta', array('property' => 'og:site_name', 'content' => $SiteName)); } $Title = Gdn_Format::text($this->title('', true)); if ($Title != '') { $this->addTag('meta', array('property' => 'og:title', 'itemprop' => 'name', 'content' => $Title)); } if (isset($CanonicalUrl)) { $this->addTag('meta', array('property' => 'og:url', 'content' => $CanonicalUrl)); } if ($Description = Gdn_Format::reduceWhiteSpaces($this->_Sender->Description())) { $this->addTag('meta', array('name' => 'description', 'property' => 'og:description', 'itemprop' => 'description', 'content' => $Description)); } // Default to the site logo if there were no images provided by the controller. if (count($this->_Sender->Image()) == 0) { $Logo = c('Garden.ShareImage', c('Garden.Logo', '')); if ($Logo != '') { // Fix the logo path. if (stringBeginsWith($Logo, 'uploads/')) { $Logo = substr($Logo, strlen('uploads/')); } $Logo = Gdn_Upload::url($Logo); $this->addTag('meta', array('property' => 'og:image', 'itemprop' => 'image', 'content' => $Logo)); } } else { foreach ($this->_Sender->Image() as $Img) { $this->addTag('meta', array('property' => 'og:image', 'itemprop' => 'image', 'content' => $Img)); } } $this->fireEvent('BeforeToString'); $Tags = $this->_Tags; // Make sure that css loads before js (for jquery) usort($this->_Tags, array('HeadModule', 'TagCmp')); // "link" comes before "script" $Tags2 = $this->_Tags; // Start with the title. $Head = '<title>' . Gdn_Format::text($this->title()) . "</title>\n"; $TagStrings = array(); // Loop through each tag. foreach ($this->_Tags as $Index => $Attributes) { $Tag = $Attributes[self::TAG_KEY]; // Inline the content of the tag, if necessary. if (val('_hint', $Attributes) == 'inline') { $Path = val('_path', $Attributes); if ($Path && !stringBeginsWith($Path, 'http')) { $Attributes[self::CONTENT_KEY] = file_get_contents($Path); if (isset($Attributes['src'])) { $Attributes['_src'] = $Attributes['src']; unset($Attributes['src']); } if (isset($Attributes['href'])) { $Attributes['_href'] = $Attributes['href']; unset($Attributes['href']); } } } // If we set an IE conditional AND a "Not IE" condition, we will need to make a second pass. do { // Reset tag string $TagString = ''; // IE conditional? Validates condition. $IESpecific = isset($Attributes['_ie']) && preg_match('/((l|g)t(e)? )?IE [0-9\\.]/', $Attributes['_ie']); // Only allow $NotIE if we're not doing a conditional this loop. $NotIE = !$IESpecific && isset($Attributes['_notie']); // Open IE conditional tag if ($IESpecific) { $TagString .= '<!--[if ' . $Attributes['_ie'] . ']>'; } if ($NotIE) { $TagString .= '<!--[if !IE]> -->'; } // Build tag $TagString .= ' <' . $Tag . Attribute($Attributes, '_'); if (array_key_exists(self::CONTENT_KEY, $Attributes)) { $TagString .= '>' . $Attributes[self::CONTENT_KEY] . '</' . $Tag . '>'; } elseif ($Tag == 'script') { $TagString .= '></script>'; } else { $TagString .= ' />'; } // Close IE conditional tag if ($IESpecific) { $TagString .= '<![endif]-->'; } if ($NotIE) { $TagString .= '<!-- <![endif]-->'; } // Cleanup (prevent infinite loop) if ($IESpecific) { unset($Attributes['_ie']); } $TagStrings[] = $TagString; } while ($IESpecific && isset($Attributes['_notie'])); // We need a second pass } //endforeach $Head .= implode("\n", array_unique($TagStrings)); foreach ($this->_Strings as $String) { $Head .= $String; $Head .= "\n"; } return $Head; }