You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
2.0 KiB

  1. <?php
  2. namespace p3k\XRay\Formats;
  3. use HTMLPurifier, HTMLPurifier_Config;
  4. use DOMDocument, DOMXPath;
  5. use p3k\XRay\Formats;
  6. use PicoFeed\Reader\Reader;
  7. use PicoFeed\PicoFeedException;
  8. class XML extends Format {
  9. public static function matches_host($url) { return true; }
  10. public static function matches($url) { return true; }
  11. public static function parse($xml, $url) {
  12. $result = [
  13. 'data' => [
  14. 'type' => 'unknown',
  15. ],
  16. 'url' => $url,
  17. ];
  18. try {
  19. $reader = new Reader();
  20. $parser = $reader->getParser($url, $xml, '');
  21. $feed = $parser->execute();
  22. $result['data']['type'] = 'feed';
  23. $result['data']['items'] = [];
  24. foreach($feed->getItems() as $item) {
  25. $result['data']['items'][] = self::_hEntryFromFeedItem($item, $feed);
  26. }
  27. } catch(PicoFeedException $e) {
  28. }
  29. return $result;
  30. }
  31. private static function _hEntryFromFeedItem($item, $feed) {
  32. $entry = [
  33. 'type' => 'entry',
  34. 'author' => [
  35. 'name' => null,
  36. 'url' => null,
  37. 'photo' => null
  38. ]
  39. ];
  40. if($item->getUrl())
  41. $entry['url'] = $item->getUrl();
  42. if($item->getPublishedDate())
  43. $entry['published'] = $item->getPublishedDate()->format('c');
  44. if($item->getTitle() && $item->getTitle() != $item->getUrl())
  45. $entry['name'] = $item->getTitle();
  46. if($item->getContent())
  47. $entry['content'] = [
  48. 'html' => self::sanitizeHTML($item->getContent()),
  49. 'text' => self::stripHTML($item->getContent())
  50. ];
  51. if($item->getAuthor()) {
  52. $entry['author']['name'] = $item->getAuthor();
  53. }
  54. if($feed->siteUrl) {
  55. $entry['author']['url'] = $feed->siteUrl;
  56. }
  57. if($item->getEnclosureType()) {
  58. $prop = false;
  59. switch($item->getEnclosureType()) {
  60. case 'audio/mpeg':
  61. $prop = 'audio'; break;
  62. case 'image/jpeg':
  63. case 'image/png':
  64. case 'image/gif':
  65. $prop = 'photo'; break;
  66. }
  67. if($prop)
  68. $entry[$prop] = $item->getEnclosureUrl();
  69. }
  70. return $entry;
  71. }
  72. }