You are here

public static function Reader::detectType in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/zendframework/zend-feed/src/Reader/Reader.php \Zend\Feed\Reader\Reader::detectType()

Detect the feed type of the provided feed

Parameters

Feed\AbstractFeed|DOMDocument|string $feed:

bool $specOnly:

Return value

string

Throws

Exception\InvalidArgumentException

Exception\RuntimeException

3 calls to Reader::detectType()
AbstractEntry::__construct in vendor/zendframework/zend-feed/src/Reader/AbstractEntry.php
Constructor
AbstractFeed::__construct in vendor/zendframework/zend-feed/src/Reader/AbstractFeed.php
Constructor
Reader::importString in vendor/zendframework/zend-feed/src/Reader/Reader.php
Import a feed from a string

File

vendor/zendframework/zend-feed/src/Reader/Reader.php, line 413

Class

Reader

Namespace

Zend\Feed\Reader

Code

public static function detectType($feed, $specOnly = false) {
  if ($feed instanceof Feed\AbstractFeed) {
    $dom = $feed
      ->getDomDocument();
  }
  elseif ($feed instanceof DOMDocument) {
    $dom = $feed;
  }
  elseif (is_string($feed) && !empty($feed)) {
    ErrorHandler::start(E_NOTICE | E_WARNING);
    ini_set('track_errors', 1);
    $oldValue = libxml_disable_entity_loader(true);
    $dom = new DOMDocument();
    $status = $dom
      ->loadXML($feed);
    foreach ($dom->childNodes as $child) {
      if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
        throw new Exception\InvalidArgumentException('Invalid XML: Detected use of illegal DOCTYPE');
      }
    }
    libxml_disable_entity_loader($oldValue);
    ini_restore('track_errors');
    ErrorHandler::stop();
    if (!$status) {
      if (!isset($phpErrormsg)) {
        if (function_exists('xdebug_is_enabled')) {
          $phpErrormsg = '(error message not available, when XDebug is running)';
        }
        else {
          $phpErrormsg = '(error message not available)';
        }
      }
      throw new Exception\RuntimeException("DOMDocument cannot parse XML: {$phpErrormsg}");
    }
  }
  else {
    throw new Exception\InvalidArgumentException('Invalid object/scalar provided: must' . ' be of type Zend\\Feed\\Reader\\Feed, DomDocument or string');
  }
  $xpath = new DOMXPath($dom);
  if ($xpath
    ->query('/rss')->length) {
    $type = self::TYPE_RSS_ANY;
    $version = $xpath
      ->evaluate('string(/rss/@version)');
    if (strlen($version) > 0) {
      switch ($version) {
        case '2.0':
          $type = self::TYPE_RSS_20;
          break;
        case '0.94':
          $type = self::TYPE_RSS_094;
          break;
        case '0.93':
          $type = self::TYPE_RSS_093;
          break;
        case '0.92':
          $type = self::TYPE_RSS_092;
          break;
        case '0.91':
          $type = self::TYPE_RSS_091;
          break;
      }
    }
    return $type;
  }
  $xpath
    ->registerNamespace('rdf', self::NAMESPACE_RDF);
  if ($xpath
    ->query('/rdf:RDF')->length) {
    $xpath
      ->registerNamespace('rss', self::NAMESPACE_RSS_10);
    if ($xpath
      ->query('/rdf:RDF/rss:channel')->length || $xpath
      ->query('/rdf:RDF/rss:image')->length || $xpath
      ->query('/rdf:RDF/rss:item')->length || $xpath
      ->query('/rdf:RDF/rss:textinput')->length) {
      return self::TYPE_RSS_10;
    }
    $xpath
      ->registerNamespace('rss', self::NAMESPACE_RSS_090);
    if ($xpath
      ->query('/rdf:RDF/rss:channel')->length || $xpath
      ->query('/rdf:RDF/rss:image')->length || $xpath
      ->query('/rdf:RDF/rss:item')->length || $xpath
      ->query('/rdf:RDF/rss:textinput')->length) {
      return self::TYPE_RSS_090;
    }
  }
  $xpath
    ->registerNamespace('atom', self::NAMESPACE_ATOM_10);
  if ($xpath
    ->query('//atom:feed')->length) {
    return self::TYPE_ATOM_10;
  }
  if ($xpath
    ->query('//atom:entry')->length) {
    if ($specOnly == true) {
      return self::TYPE_ATOM_10;
    }
    else {
      return self::TYPE_ATOM_10_ENTRY;
    }
  }
  $xpath
    ->registerNamespace('atom', self::NAMESPACE_ATOM_03);
  if ($xpath
    ->query('//atom:feed')->length) {
    return self::TYPE_ATOM_03;
  }
  return self::TYPE_ANY;
}