/**
* 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;
}