You are here

class FeedsSimplePieParser in Feeds 7

Same name and namespace in other branches
  1. 6 plugins/FeedsSimplePieParser.inc \FeedsSimplePieParser
  2. 7.2 plugins/FeedsSimplePieParser.inc \FeedsSimplePieParser

Class definition for Common Syndication Parser.

Parses RSS and Atom feeds.

Hierarchy

Expanded class hierarchy of FeedsSimplePieParser

3 string references to 'FeedsSimplePieParser'
FeedsMapperFileFieldTestCase::test in tests/feeds_mapper_filefield.test
Basic test loading a single entry CSV file.
FeedsSyndicationParserTestCase::test in tests/feeds_parser_syndication.test
Run tests.
_feeds_feeds_plugins in ./feeds.plugins.inc
Break out for feeds_feed_plugins().

File

plugins/FeedsSimplePieParser.inc, line 57

View source
class FeedsSimplePieParser extends FeedsParser {

  /**
   * Implements FeedsParser::parse().
   */
  public function parse(FeedsImportBatch $batch, FeedsSource $source) {
    feeds_include_library('simplepie.inc', 'simplepie');

    // Initialize SimplePie.
    $parser = new SimplePie();
    $parser
      ->set_raw_data($batch
      ->getRaw());
    $parser
      ->set_stupidly_fast(TRUE);
    $parser
      ->encode_instead_of_strip(FALSE);

    // @todo Is caching effective when we pass in raw data?
    $parser
      ->enable_cache(TRUE);
    $parser
      ->set_cache_location($this
      ->cacheDirectory());
    $parser
      ->init();

    // Construct the standard form of the parsed feed
    $batch
      ->setTitle(html_entity_decode(($title = $parser
      ->get_title()) ? $title : $this
      ->createTitle($parser
      ->get_description())));
    $batch
      ->setDescription($parser
      ->get_description());
    $batch
      ->setLink(html_entity_decode($parser
      ->get_link()));
    $items_num = $parser
      ->get_item_quantity();
    for ($i = 0; $i < $items_num; $i++) {
      $item = array();
      $simplepie_item = $parser
        ->get_item($i);
      $item['title'] = html_entity_decode(($title = $simplepie_item
        ->get_title()) ? $title : $this
        ->createTitle($simplepie_item
        ->get_content()));
      $item['description'] = $simplepie_item
        ->get_content();
      $item['url'] = html_entity_decode($simplepie_item
        ->get_link());

      // Use UNIX time. If no date is defined, fall back to REQUEST_TIME.
      $item['timestamp'] = $simplepie_item
        ->get_date("U");
      if (empty($item['timestamp'])) {
        $item['timestamp'] = REQUEST_TIME;
      }
      $item['guid'] = $simplepie_item
        ->get_id();

      // Use URL as GUID if there is no GUID.
      if (empty($item['guid'])) {
        $item['guid'] = $item['url'];
      }
      $author = $simplepie_item
        ->get_author();
      $item['author_name'] = isset($author->name) ? html_entity_decode($author->name) : '';
      $item['author_link'] = isset($author->link) ? $author->link : '';
      $item['author_email'] = isset($author->email) ? $author->email : '';

      // Enclosures
      $enclosures = $simplepie_item
        ->get_enclosures();
      if (is_array($enclosures)) {
        foreach ($enclosures as $enclosure) {
          $item['enclosures'][] = new FeedsSimplePieEnclosure($enclosure);
        }
      }

      // Location
      $latitude = $simplepie_item
        ->get_latitude();
      $longitude = $simplepie_item
        ->get_longitude();
      if (!is_null($latitude) && !is_null($longitude)) {
        $item['location_latitude'][] = $latitude;
        $item['location_longitude'][] = $longitude;
      }

      // Extract tags related to the item
      $simplepie_tags = $simplepie_item
        ->get_categories();
      $tags = array();
      $domains = array();
      if (count($simplepie_tags) > 0) {
        foreach ($simplepie_tags as $tag) {
          $tags[] = (string) $tag->term;
          $domain = (string) $tag
            ->get_scheme();
          if (!empty($domain)) {
            if (!isset($domains[$domain])) {
              $domains[$domain] = array();
            }
            $domains[$domain][] = count($tags) - 1;
          }
        }
      }
      $item['domains'] = $domains;
      $item['tags'] = $tags;

      // Allow parsing to be extended.
      $this
        ->parseExtensions($item, $simplepie_item);
      $item['raw'] = $simplepie_item->data;
      $batch
        ->addItem($item);
    }

    // Release parser.
    unset($parser);
  }

  /**
   * Allow extension of FeedsSimplePie item parsing.
   */
  protected function parseExtensions(&$item, $simplepie_item) {
  }

  /**
   * Return mapping sources.
   */
  public function getMappingSources() {
    return array(
      'title' => array(
        'name' => t('Title'),
        'description' => t('Title of the feed item.'),
      ),
      'description' => array(
        'name' => t('Description'),
        'description' => t('Description of the feed item.'),
      ),
      'author_name' => array(
        'name' => t('Author name'),
        'description' => t('Name of the feed item\'s author.'),
      ),
      'author_link' => array(
        'name' => t('Author link'),
        'description' => t('Link to the feed item\'s author.'),
      ),
      'author_email' => array(
        'name' => t('Author email'),
        'description' => t('Email address of the feed item\'s author.'),
      ),
      'timestamp' => array(
        'name' => t('Published date'),
        'description' => t('Published date as UNIX time GMT of the feed item.'),
      ),
      'url' => array(
        'name' => t('Item URL (link)'),
        'description' => t('URL of the feed item.'),
      ),
      'guid' => array(
        'name' => t('Item GUID'),
        'description' => t('Global Unique Identifier of the feed item.'),
      ),
      'tags' => array(
        'name' => t('Categories'),
        'description' => t('An array of categories that have been assigned to the feed item.'),
      ),
      'domains' => array(
        'name' => t('Category domains'),
        'description' => t('Domains of the categories.'),
      ),
      'location_latitude' => array(
        'name' => t('Latitudes'),
        'description' => t('An array of latitudes assigned to the feed item.'),
      ),
      'location_longitude' => array(
        'name' => t('Longitudes'),
        'description' => t('An array of longitudes assigned to the feed item.'),
      ),
      'enclosures' => array(
        'name' => t('Enclosures'),
        'description' => t('An array of enclosures attached to the feed item.'),
      ),
    ) + parent::getMappingSources();
  }

  /**
   * Returns cache directory. Creates it if it doesn't exist.
   */
  protected function cacheDirectory() {
    $directory = 'public://simplepie';
    file_prepare_directory($dir, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
    return $directory;
  }

  /**
   * Generate a title from a random text.
   */
  protected function createTitle($text = FALSE) {

    // Explode to words and use the first 3 words.
    $words = preg_split("/[\\s,]+/", $text);
    $words = array_slice($words, 0, 3);
    return implode(' ', $words);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
FeedsConfigurable::$config protected property
FeedsConfigurable::$disabled protected property CTools export enabled status of this object.
FeedsConfigurable::$export_type protected property
FeedsConfigurable::$id protected property
FeedsConfigurable::addConfig public function Similar to setConfig but adds to existing configuration.
FeedsConfigurable::configDefaults public function Return default configuration. 6
FeedsConfigurable::configForm public function Return configuration form for this object. The keys of the configuration form must match the keys of the array returned by configDefaults(). 9
FeedsConfigurable::configFormSubmit public function Submission handler for configForm(). 2
FeedsConfigurable::configFormValidate public function Validation handler for configForm(). 3
FeedsConfigurable::copy public function Copy a configuration. 1
FeedsConfigurable::existing public function Determine whether this object is persistent and enabled. I. e. it is defined either in code or in the database and it is enabled. 1
FeedsConfigurable::getConfig public function Implements getConfig(). 1
FeedsConfigurable::instance public static function Instantiate a FeedsConfigurable object. 1
FeedsConfigurable::setConfig public function Set configuration.
FeedsConfigurable::__get public function Override magic method __get(). Make sure that $this->config goes through getConfig()
FeedsParser::clear public function Clear all caches for results for given source.
FeedsParser::getSourceElement public function Get an element identified by $element_key of the given item. The element key corresponds to the values in the array returned by FeedsParser::getMappingSources(). 1
FeedsPlugin::all public static function Get all available plugins.
FeedsPlugin::byType public static function Gets all available plugins of a particular type.
FeedsPlugin::child public static function Determines whether given plugin is derived from given base plugin.
FeedsPlugin::hasSourceConfig public function Returns TRUE if $this->sourceForm() returns a form. Overrides FeedsSourceInterface::hasSourceConfig
FeedsPlugin::loadMappers protected static function Loads on-behalf implementations from mappers/ directory.
FeedsPlugin::save public function Save changes to the configuration of this object. Delegate saving to parent (= Feed) which will collect information from this object by way of getConfig() and store it. Overrides FeedsConfigurable::save
FeedsPlugin::sourceDefaults public function Implements FeedsSourceInterface::sourceDefaults(). Overrides FeedsSourceInterface::sourceDefaults 1
FeedsPlugin::sourceDelete public function A source is being deleted. Overrides FeedsSourceInterface::sourceDelete 2
FeedsPlugin::sourceForm public function Callback methods, exposes source form. Overrides FeedsSourceInterface::sourceForm 3
FeedsPlugin::sourceFormValidate public function Validation handler for sourceForm. Overrides FeedsSourceInterface::sourceFormValidate 2
FeedsPlugin::sourceSave public function A source is being saved. Overrides FeedsSourceInterface::sourceSave 2
FeedsPlugin::typeOf public static function Determines the type of a plugin.
FeedsPlugin::__construct protected function Constructor. Overrides FeedsConfigurable::__construct
FeedsSimplePieParser::cacheDirectory protected function Returns cache directory. Creates it if it doesn't exist.
FeedsSimplePieParser::createTitle protected function Generate a title from a random text.
FeedsSimplePieParser::getMappingSources public function Return mapping sources. Overrides FeedsParser::getMappingSources
FeedsSimplePieParser::parse public function Implements FeedsParser::parse(). Overrides FeedsParser::parse
FeedsSimplePieParser::parseExtensions protected function Allow extension of FeedsSimplePie item parsing.