/** * Scrape metatags from DOM * @return array */ public function dom() { $url = $this->url->getURL(); $meta['url'] = $url; $meta['title'] = parse_url($url, PHP_URL_HOST); $meta['description'] = ''; $html = $this->url->getContent(); $doc = new DOMDocument(); @$doc->loadHTML($html); // Get document title $node = $doc->getElementsByTagName('title'); $title = $node->item(0)->nodeValue; if ($title) { $meta['title'] = $title; } // Get oEmbed content and canonical URLs $nodes = $doc->getElementsByTagName('link'); foreach ($nodes as $node) { $rel = $node->getAttribute('rel'); $href = $node->getAttribute('href'); switch ($rel) { case 'icon': $meta['icons'][] = $href; break; case 'canonical': $meta['canonical'] = $href; break; case 'alternate': $type = $node->getAttribute('type'); if ($type == 'application/json+oembed' || $type == 'text/json+oembed') { $oembed_endpoint = $href; } break; } } if ($oembed_endpoint) { $oembed_handler = new UrlHandler($oembed_endpoint); $json = $oembed_handler->getContent(); if ($json) { $oembed_params = json_decode($json, true); if ($oembed_params) { foreach ($oembed_params as $key => $value) { if (!$meta[$key]) { $meta[$key] = $value; } if ($key == 'url') { $meta['oembed_url'] = $value; } if ($key == 'thumbnail_url' && !$meta['oembed_url']) { $meta['oembed_url'] = $value; } } } } } if ($title) { $meta['title'] = $title; } $nodes = $doc->getElementsByTagName('meta'); if (!empty($nodes)) { foreach ($nodes as $node) { $name = $node->getAttribute('name'); if (!$name) { $name = $node->getAttribute('property'); } if (!$name) { continue; } $name = strtolower($name); $content = $node->getAttribute('content'); switch ($name) { default: if ($name && !$meta[$name]) { $name = str_replace(':', '_', $name); $meta[$name] = $content; } break; case 'title': case 'og:title': case 'twitter:title': if (!$meta['title']) { $meta['title'] = $content; } break; case 'description': case 'og:description': case 'twitter:description': if (!$meta['description']) { $meta['description'] = $content; } break; case 'keywords': $meta['keywords'] = $content; break; case 'og:site_name': case 'twitter:site': if (!$meta['provider_name']) { $meta['provider_name'] = $content; } break; case 'og:type': $meta['og_type'] = $content; break; case 'og:image': case 'twitter:image': $meta['thumbnails'][] = $content; break; } } } if (count($meta['thumbnails'])) { // Display a thumbnail parsed from <meta> tags $meta['thumbnail_url'] = $meta['thumbnails'][0]; } else { if (count($meta['icons'])) { // Display an icon parsed from <link> tags $meta['thumbnail_url'] = $meta['icons'][0]; } else { $max_width = 0; $nodes = $doc->getElementsByTagName('img'); foreach ($nodes as $node) { $src = $node->getAttribute('src'); $width = $node->getAttribute('width'); if (!$meta['thumbnail_url'] || $width > $max_width) { $meta['thumbnail_url'] = $src; $max_width = $width; } } } } /** * @todo: figure out what to do with relative URLs in DOM */ if (!Validator::isImage($meta['thumbnail_url'])) { unset($meta['thumbnail_url']); } return $meta; }
/** * @covers ::setURL * @covers ::getURL */ public function testSetURL() { $url = 'http://example.com'; $this->object->setURL($url); $this->assertEquals($this->object->getURL(), $url); }
/** * Prepare view/hook params * * @param array $params Params to pass by default * @return array */ public function prepareParams(array $params = array()) { $embed_params = array_filter(array('src' => $this->url->getURL(), 'entity' => $this->getEntity(), 'meta' => $this->getMeta())); $params = array_merge($params, $embed_params); return $params; }