예제 #1
0
 /**
  * Get the update date/time for the item
  *
  * Uses `<atom:updated>`
  *
  * Note: obeys PHP's timezone setting. To get a UTC date/time, use
  * {@see get_gmdate}
  *
  * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data)
  * @return int|string|null
  */
 public function get_updated_date($date_format = 'j F Y, g:i a')
 {
     if (!isset($this->data['updated'])) {
         if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) {
             $this->data['updated']['raw'] = $return[0]['data'];
         }
         if (!empty($this->data['updated']['raw'])) {
             $parser = $this->registry->call('Parse_Date', 'get');
             $this->data['updated']['parsed'] = $parser->parse($this->data['date']['raw']);
         } else {
             $this->data['updated'] = null;
         }
     }
     if ($this->data['updated']) {
         $date_format = (string) $date_format;
         switch ($date_format) {
             case '':
                 return $this->sanitize($this->data['updated']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
             case 'U':
                 return $this->data['updated']['parsed'];
             default:
                 return date($date_format, $this->data['updated']['parsed']);
         }
     } else {
         return null;
     }
 }
예제 #2
0
파일: Item.php 프로젝트: oparoz/core-1
 /**
  * Get the `<atom:source>` for the item
  *
  * @since 1.1
  * @return SimplePie_Source|null
  */
 public function get_source()
 {
     if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source')) {
         return $this->registry->create('Source', array($this, $return[0]));
     } else {
         return null;
     }
 }
예제 #3
0
 /**
  * Get all items from the feed
  *
  * This is better suited for {@link http://php.net/for for()} loops, whereas
  * {@see get_items()} is better suited for
  * {@link http://php.net/foreach foreach()} loops.
  *
  * @see get_item_quantity
  * @since Beta 2
  * @param int $start Index to start at
  * @param int $end Number of items to return. 0 for all items after `$start`
  * @return array|null List of {@see SimplePie_Item} objects
  */
 public function get_items($start = 0, $end = 0)
 {
     if (!isset($this->data['items'])) {
         if (!empty($this->multifeed_objects)) {
             $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);
         } else {
             $this->data['items'] = array();
             if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry')) {
                 $keys = array_keys($items);
                 foreach ($keys as $key) {
                     $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                 }
             }
             if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry')) {
                 $keys = array_keys($items);
                 foreach ($keys as $key) {
                     $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                 }
             }
             if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item')) {
                 $keys = array_keys($items);
                 foreach ($keys as $key) {
                     $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                 }
             }
             if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item')) {
                 $keys = array_keys($items);
                 foreach ($keys as $key) {
                     $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                 }
             }
             if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item')) {
                 $keys = array_keys($items);
                 foreach ($keys as $key) {
                     $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                 }
             }
         }
     }
     if (!empty($this->data['items'])) {
         // If we want to order it by date, check if all items have a date, and then sort it
         if ($this->order_by_date && empty($this->multifeed_objects)) {
             if (!isset($this->data['ordered_items'])) {
                 $do_sort = true;
                 foreach ($this->data['items'] as $item) {
                     if (!$item->get_date('U')) {
                         $do_sort = false;
                         break;
                     }
                 }
                 $item = null;
                 $this->data['ordered_items'] = $this->data['items'];
                 if ($do_sort) {
                     usort($this->data['ordered_items'], array(get_class($this), 'sort_items'));
                 }
             }
             $items = $this->data['ordered_items'];
         } else {
             $items = $this->data['items'];
         }
         // Slice the data as desired
         if ($end === 0) {
             return array_slice($items, $start);
         } else {
             return array_slice($items, $start, $end);
         }
     } else {
         return array();
     }
 }
예제 #4
0
 /**
  * Detect XML encoding, as per XML 1.0 Appendix F.1
  *
  * @todo Add support for EBCDIC
  * @param string $data XML data
  * @param SimplePie_Registry $registry Class registry
  * @return array Possible encodings
  */
 public static function xml_encoding($data, $registry)
 {
     // UTF-32 Big Endian BOM
     if (substr($data, 0, 4) === "��") {
         $encoding[] = 'UTF-32BE';
     } elseif (substr($data, 0, 4) === "��") {
         $encoding[] = 'UTF-32LE';
     } elseif (substr($data, 0, 2) === "��") {
         $encoding[] = 'UTF-16BE';
     } elseif (substr($data, 0, 2) === "��") {
         $encoding[] = 'UTF-16LE';
     } elseif (substr($data, 0, 3) === "") {
         $encoding[] = 'UTF-8';
     } elseif (substr($data, 0, 20) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-32BE';
     } elseif (substr($data, 0, 20) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-32LE';
     } elseif (substr($data, 0, 10) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-16BE';
     } elseif (substr($data, 0, 10) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-16LE';
     } elseif (substr($data, 0, 5) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-8';
     } else {
         $encoding[] = 'UTF-8';
     }
     return $encoding;
 }
예제 #5
0
 /**
  * @dataProvider firefoxtests
  */
 public function test_from_file($data)
 {
     $locator = new SimplePie_Locator($data, 0, null, false);
     $registry = new SimplePie_Registry();
     $registry->register('File', 'MockSimplePie_File');
     $locator->set_registry($registry);
     $expected = array();
     $document = new DOMDocument();
     $document->loadHTML($data->body);
     $xpath = new DOMXPath($document);
     foreach ($xpath->query('//link') as $element) {
         $expected[] = 'http://example.com' . $element->getAttribute('href');
     }
     //$expected = SimplePie_Misc::get_element('link', $data->body);
     $feed = $locator->find(SIMPLEPIE_LOCATOR_ALL, $all);
     $this->assertFalse($locator->is_feed($data), 'HTML document not be a feed itself');
     $this->assertInstanceOf('MockSimplePie_File', $feed);
     $success = array_filter($expected, array(get_class(), 'filter_success'));
     $found = array_map(array(get_class(), 'map_url_file'), $all);
     $this->assertEquals($success, $found);
 }
예제 #6
0
 /**
  * Get all items from the feed
  *
  * This is better suited for {@link http://php.net/for for()} loops, whereas
  * {@see get_items()} is better suited for
  * {@link http://php.net/foreach foreach()} loops.
  *
  * @see get_item_quantity
  * @since Beta 2
  * @param int $start Index to start at
  * @param int $end Number of items to return. 0 for all items after `$start`
  * @return SimplePie_Item[]|null List of {@see SimplePie_Item} objects
  */
 public function get_items($start = 0, $end = 0)
 {
     if (!isset($this->data['items'])) {
         if (!empty($this->multifeed_objects)) {
             $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);
             if (empty($this->data['items'])) {
                 return array();
             }
             return $this->data['items'];
         }
         $this->data['items'] = array();
         if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry')) {
             $keys = array_keys($items);
             foreach ($keys as $key) {
                 $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
             }
         }
         if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry')) {
             $keys = array_keys($items);
             foreach ($keys as $key) {
                 $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
             }
         }
         if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item')) {
             $keys = array_keys($items);
             foreach ($keys as $key) {
                 $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
             }
         }
         if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item')) {
             $keys = array_keys($items);
             foreach ($keys as $key) {
                 $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
             }
         }
         if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item')) {
             $keys = array_keys($items);
             foreach ($keys as $key) {
                 $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
             }
         }
     }
     if (empty($this->data['items'])) {
         return array();
     }
     if ($this->order_by_date) {
         if (!isset($this->data['ordered_items'])) {
             $this->data['ordered_items'] = $this->data['items'];
             usort($this->data['ordered_items'], array(get_class($this), 'sort_items'));
         }
         $items = $this->data['ordered_items'];
     } else {
         $items = $this->data['items'];
     }
     // Slice the data as desired
     if ($end === 0) {
         return array_slice($items, $start);
     } else {
         return array_slice($items, $start, $end);
     }
 }