예제 #1
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;
     }
 }
예제 #2
0
 /**
  * Get all contributors for the item
  *
  * Uses `<atom:contributor>`
  *
  * @since 1.1
  * @return array|null List of {@see SimplePie_Author} objects
  */
 public function get_contributors()
 {
     $contributors = array();
     foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) {
         $name = null;
         $uri = null;
         $email = null;
         if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) {
             $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
         }
         if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) {
             $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
         }
         if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) {
             $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
         }
         if ($name !== null || $email !== null || $uri !== null) {
             $contributors[] = $this->registry->create('Author', array($name, $uri, $email));
         }
     }
     foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) {
         $name = null;
         $url = null;
         $email = null;
         if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) {
             $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
         }
         if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) {
             $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
         }
         if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) {
             $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
         }
         if ($name !== null || $email !== null || $url !== null) {
             $contributors[] = $this->registry->create('Author', array($name, $url, $email));
         }
     }
     if (!empty($contributors)) {
         return array_unique($contributors);
     } 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
 /**
  * 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);
     }
 }