summaryrefslogtreecommitdiff
path: root/vendor/miniflux/picofeed/lib/PicoFeed/Serialization
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/miniflux/picofeed/lib/PicoFeed/Serialization')
-rw-r--r--vendor/miniflux/picofeed/lib/PicoFeed/Serialization/Subscription.php175
-rw-r--r--vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionList.php75
-rw-r--r--vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionListBuilder.php204
-rw-r--r--vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionListParser.php100
-rw-r--r--vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionParser.php142
5 files changed, 696 insertions, 0 deletions
diff --git a/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/Subscription.php b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/Subscription.php
new file mode 100644
index 00000000..12eccfd5
--- /dev/null
+++ b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/Subscription.php
@@ -0,0 +1,175 @@
+<?php
+
+namespace PicoFeed\Serialization;
+
+/**
+ * Class Subscription
+ *
+ * @package PicoFeed\Serialization
+ * @author Frederic Guillot
+ */
+class Subscription
+{
+ protected $title = '';
+ protected $feedUrl = '';
+ protected $siteUrl = '';
+ protected $category = '';
+ protected $description = '';
+ protected $type = '';
+
+ /**
+ * Create object instance
+ *
+ * @static
+ * @access public
+ * @return Subscription
+ */
+ public static function create()
+ {
+ return new static();
+ }
+
+ /**
+ * Set title
+ *
+ * @access public
+ * @param string $title
+ * @return Subscription
+ */
+ public function setTitle($title)
+ {
+ $this->title = $title;
+ return $this;
+ }
+
+ /**
+ * Get title
+ *
+ * @access public
+ * @return string
+ */
+ public function getTitle()
+ {
+ return $this->title;
+ }
+
+ /**
+ * Set feed URL
+ *
+ * @access public
+ * @param string $feedUrl
+ * @return Subscription
+ */
+ public function setFeedUrl($feedUrl)
+ {
+ $this->feedUrl = $feedUrl;
+ return $this;
+ }
+
+ /**
+ * Get feed URL
+ *
+ * @access public
+ * @return string
+ */
+ public function getFeedUrl()
+ {
+ return $this->feedUrl;
+ }
+
+ /**
+ * Set site URL
+ *
+ * @access public
+ * @param string $siteUrl
+ * @return Subscription
+ */
+ public function setSiteUrl($siteUrl)
+ {
+ $this->siteUrl = $siteUrl;
+ return $this;
+ }
+
+ /**
+ * Get site URL
+ *
+ * @access public
+ * @return string
+ */
+ public function getSiteUrl()
+ {
+ return $this->siteUrl;
+ }
+
+ /**
+ * Set category
+ *
+ * @access public
+ * @param string $category
+ * @return Subscription
+ */
+ public function setCategory($category)
+ {
+ $this->category = $category;
+ return $this;
+ }
+
+ /**
+ * Get category
+ *
+ * @access public
+ * @return string
+ */
+ public function getCategory()
+ {
+ return $this->category;
+ }
+
+ /**
+ * Set description
+ *
+ * @access public
+ * @param string $description
+ * @return Subscription
+ */
+ public function setDescription($description)
+ {
+ $this->description = $description;
+ return $this;
+ }
+
+ /**
+ * Get description
+ *
+ * @access public
+ * @return string
+ */
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ /**
+ * Set type
+ *
+ * @access public
+ * @param string $type
+ * @return Subscription
+ */
+ public function setType($type)
+ {
+ $this->type = $type;
+ return $this;
+ }
+
+ /**
+ * Get type
+ *
+ * @access public
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+}
diff --git a/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionList.php b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionList.php
new file mode 100644
index 00000000..b173f89b
--- /dev/null
+++ b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionList.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace PicoFeed\Serialization;
+
+/**
+ * Class SubscriptionList
+ *
+ * @package PicoFeed\Serialization
+ * @author Frederic Guillot
+ */
+class SubscriptionList
+{
+ /**
+ * OPML entries
+ *
+ * @var Subscription[]
+ */
+ public $subscriptions = array();
+
+ /**
+ * Title
+ *
+ * @var string
+ */
+ protected $title = '';
+
+ /**
+ * Create object instance
+ *
+ * @static
+ * @access public
+ * @return SubscriptionList
+ */
+ public static function create()
+ {
+ return new static();
+ }
+
+ /**
+ * Set title
+ *
+ * @access public
+ * @param string $title
+ * @return SubscriptionList
+ */
+ public function setTitle($title)
+ {
+ $this->title = $title;
+ return $this;
+ }
+
+ /**
+ * Get title
+ *
+ * @access public
+ * @return string
+ */
+ public function getTitle()
+ {
+ return $this->title;
+ }
+
+ /**
+ * Add subscription
+ *
+ * @access public
+ * @param Subscription $subscription
+ * @return SubscriptionList
+ */
+ public function addSubscription(Subscription $subscription)
+ {
+ $this->subscriptions[] = $subscription;
+ return $this;
+ }
+}
diff --git a/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionListBuilder.php b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionListBuilder.php
new file mode 100644
index 00000000..838e4cb5
--- /dev/null
+++ b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionListBuilder.php
@@ -0,0 +1,204 @@
+<?php
+
+namespace PicoFeed\Serialization;
+
+use DOMDocument;
+use DOMElement;
+
+/**
+ * Class SubscriptionListBuilder
+ *
+ * @package PicoFeed\Serialization
+ * @author Frederic Guillot
+ */
+class SubscriptionListBuilder
+{
+ /**
+ * @var SubscriptionList
+ */
+ protected $subscriptionList;
+
+ /**
+ * @var DOMDocument
+ */
+ protected $document;
+
+ /**
+ * Constructor.
+ *
+ * @access public
+ * @param SubscriptionList $subscriptionList
+ */
+ public function __construct(SubscriptionList $subscriptionList)
+ {
+ $this->subscriptionList = $subscriptionList;
+ }
+
+ /**
+ * Get object instance
+ *
+ * @static
+ * @access public
+ * @param SubscriptionList $subscriptionList
+ * @return SubscriptionListBuilder
+ */
+ public static function create(SubscriptionList $subscriptionList)
+ {
+ return new static($subscriptionList);
+ }
+
+ /**
+ * Build OPML feed
+ *
+ * @access public
+ * @param string $filename
+ * @return string
+ */
+ public function build($filename = '')
+ {
+ $this->document = new DomDocument('1.0', 'UTF-8');
+ $this->document->formatOutput = true;
+
+ $opmlElement = $this->document->createElement('opml');
+ $opmlElement->setAttribute('version', '1.0');
+
+ $headElement = $this->document->createElement('head');
+
+ if ($this->subscriptionList->getTitle() !== '') {
+ $titleElement = $this->document->createElement('title');
+ $titleElement->appendChild($this->document->createTextNode($this->subscriptionList->getTitle()));
+ $headElement->appendChild($titleElement);
+ }
+
+ $opmlElement->appendChild($headElement);
+ $opmlElement->appendChild($this->buildBody());
+ $this->document->appendChild($opmlElement);
+
+ if ($filename !== '') {
+ $this->document->save($filename);
+ return '';
+ }
+
+ return $this->document->saveXML();
+ }
+
+ /**
+ * Return true if the list has categories
+ *
+ * @access public
+ * @return bool
+ */
+ public function hasCategories()
+ {
+ foreach ($this->subscriptionList->subscriptions as $subscription) {
+ if ($subscription->getCategory() !== '') {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Build OPML body
+ *
+ * @access protected
+ * @return DOMElement
+ */
+ protected function buildBody()
+ {
+ $bodyElement = $this->document->createElement('body');
+
+ if ($this->hasCategories()) {
+ $this->buildCategories($bodyElement);
+ return $bodyElement;
+ }
+
+ foreach ($this->subscriptionList->subscriptions as $subscription) {
+ $bodyElement->appendChild($this->buildSubscription($subscription));
+ }
+
+ return $bodyElement;
+ }
+
+ /**
+ * Build categories section
+ *
+ * @access protected
+ * @param DOMElement $bodyElement
+ */
+ protected function buildCategories(DOMElement $bodyElement)
+ {
+ $categories = $this->groupByCategories();
+
+ foreach ($categories as $category => $subscriptions) {
+ $bodyElement->appendChild($this->buildCategory($category, $subscriptions));
+ }
+ }
+
+ /**
+ * Build category tag
+ *
+ * @access protected
+ * @param string $category
+ * @param array $subscriptions
+ * @return DOMElement
+ */
+ protected function buildCategory($category, array $subscriptions)
+ {
+ $outlineElement = $this->document->createElement('outline');
+ $outlineElement->setAttribute('text', $category);
+
+ foreach ($subscriptions as $subscription) {
+ $outlineElement->appendChild($this->buildSubscription($subscription));
+ }
+
+ return $outlineElement;
+ }
+
+ /**
+ * Build subscription entry
+ *
+ * @access public
+ * @param Subscription $subscription
+ * @return DOMElement
+ */
+ protected function buildSubscription(Subscription $subscription)
+ {
+ $outlineElement = $this->document->createElement('outline');
+ $outlineElement->setAttribute('type', $subscription->getType() ?: 'rss');
+ $outlineElement->setAttribute('text', $subscription->getTitle() ?: $subscription->getFeedUrl());
+ $outlineElement->setAttribute('xmlUrl', $subscription->getFeedUrl());
+
+ if ($subscription->getTitle() !== '') {
+ $outlineElement->setAttribute('title', $subscription->getTitle());
+ }
+
+ if ($subscription->getDescription() !== '') {
+ $outlineElement->setAttribute('description', $subscription->getDescription());
+ }
+
+ if ($subscription->getSiteUrl() !== '') {
+ $outlineElement->setAttribute('htmlUrl', $subscription->getSiteUrl());
+ }
+
+ return $outlineElement;
+ }
+
+ /**
+ * Group subscriptions by category
+ *
+ * @access private
+ * @return array
+ */
+ private function groupByCategories()
+ {
+ $categories = array();
+
+ foreach ($this->subscriptionList->subscriptions as $subscription) {
+ $categories[$subscription->getCategory()][] = $subscription;
+ }
+
+ return $categories;
+ }
+}
diff --git a/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionListParser.php b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionListParser.php
new file mode 100644
index 00000000..9085588c
--- /dev/null
+++ b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionListParser.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace PicoFeed\Serialization;
+
+use PicoFeed\Parser\MalformedXmlException;
+use PicoFeed\Parser\XmlParser;
+use SimpleXMLElement;
+
+/**
+ * Class SubscriptionListParser
+ *
+ * @package PicoFeed\Serialization
+ * @author Frederic Guillot
+ */
+class SubscriptionListParser
+{
+ /**
+ * @var SubscriptionList
+ */
+ protected $subscriptionList;
+
+ /**
+ * @var string
+ */
+ protected $data;
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param string $data
+ */
+ public function __construct($data)
+ {
+ $this->subscriptionList = new SubscriptionList();
+ $this->data = trim($data);
+ }
+
+ /**
+ * Get object instance
+ *
+ * @static
+ * @access public
+ * @param string $data
+ * @return SubscriptionListParser
+ */
+ public static function create($data)
+ {
+ return new static($data);
+ }
+
+ /**
+ * Parse a subscription list entry
+ *
+ * @access public
+ * @throws MalformedXmlException
+ * @return SubscriptionList
+ */
+ public function parse()
+ {
+ $xml = XmlParser::getSimpleXml($this->data);
+
+ if (! $xml || !isset($xml->head) || !isset($xml->body)) {
+ throw new MalformedXmlException('Unable to parse OPML file: invalid XML');
+ }
+
+ $this->parseTitle($xml->head);
+ $this->parseEntries($xml->body);
+
+ return $this->subscriptionList;
+ }
+
+ /**
+ * Parse title
+ *
+ * @access protected
+ * @param SimpleXMLElement $xml
+ */
+ protected function parseTitle(SimpleXMLElement $xml)
+ {
+ $this->subscriptionList->setTitle((string) $xml->title);
+ }
+
+ /**
+ * Parse entries
+ *
+ * @access protected
+ * @param SimpleXMLElement $body
+ */
+ private function parseEntries(SimpleXMLElement $body)
+ {
+ foreach ($body->outline as $outlineElement) {
+ if (isset($outlineElement->outline)) {
+ $this->parseEntries($outlineElement);
+ } else {
+ $this->subscriptionList->subscriptions[] = SubscriptionParser::create($body, $outlineElement)->parse();
+ }
+ }
+ }
+}
diff --git a/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionParser.php b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionParser.php
new file mode 100644
index 00000000..caff07c2
--- /dev/null
+++ b/vendor/miniflux/picofeed/lib/PicoFeed/Serialization/SubscriptionParser.php
@@ -0,0 +1,142 @@
+<?php
+
+namespace PicoFeed\Serialization;
+
+use SimpleXMLElement;
+
+/**
+ * Class SubscriptionParser
+ *
+ * @package PicoFeed\Serialization
+ * @author Frederic Guillot
+ */
+class SubscriptionParser
+{
+ /**
+ * @var Subscription
+ */
+ protected $subscription;
+
+ /**
+ * @var SimpleXMLElement
+ */
+ private $outlineElement;
+
+ /**
+ * @var SimpleXMLElement
+ */
+ private $parentElement;
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param SimpleXMLElement $parentElement
+ * @param SimpleXMLElement $outlineElement
+ */
+ public function __construct(SimpleXMLElement $parentElement, SimpleXMLElement $outlineElement)
+ {
+ $this->parentElement = $parentElement;
+ $this->outlineElement = $outlineElement;
+ $this->subscription = new Subscription();
+ }
+
+ /**
+ * Get object instance
+ *
+ * @static
+ * @access public
+ * @param SimpleXMLElement $parentElement
+ * @param SimpleXMLElement $outlineElement
+ * @return SubscriptionParser
+ */
+ public static function create(SimpleXMLElement $parentElement, SimpleXMLElement $outlineElement)
+ {
+ return new static($parentElement, $outlineElement);
+ }
+
+ /**
+ * Parse subscription entry
+ *
+ * @access public
+ * @return Subscription
+ */
+ public function parse()
+ {
+ $this->subscription->setCategory($this->findCategory());
+ $this->subscription->setTitle($this->findTitle());
+ $this->subscription->setFeedUrl($this->findFeedUrl());
+ $this->subscription->setSiteUrl($this->findSiteUrl());
+ $this->subscription->setType($this->findType());
+ $this->subscription->setDescription($this->findDescription());
+
+ return $this->subscription;
+ }
+
+ /**
+ * Find category.
+ *
+ * @access protected
+ * @return string
+ */
+ protected function findCategory()
+ {
+ return isset($this->parentElement['text']) ? (string) $this->parentElement['text'] : '';
+ }
+
+ /**
+ * Find title.
+ *
+ * @access protected
+ * @return string
+ */
+ protected function findTitle()
+ {
+ return isset($this->outlineElement['title']) ? (string) $this->outlineElement['title'] : (string) $this->outlineElement['text'];
+ }
+
+ /**
+ * Find feed url.
+ *
+ * @access protected
+ * @return string
+ */
+ protected function findFeedUrl()
+ {
+ return (string) $this->outlineElement['xmlUrl'];
+ }
+
+ /**
+ * Find site url.
+ *
+ * @access protected
+ * @return string
+ */
+ protected function findSiteUrl()
+ {
+ return isset($this->outlineElement['htmlUrl']) ? (string) $this->outlineElement['htmlUrl'] : $this->findFeedUrl();
+ }
+
+ /**
+ * Find type.
+ *
+ * @access protected
+ * @return string
+ */
+ protected function findType()
+ {
+ return isset($this->outlineElement['version']) ? (string) $this->outlineElement['version'] :
+ isset($this->outlineElement['type']) ? (string) $this->outlineElement['type'] : 'rss';
+ }
+
+ /**
+ * Find description.
+ *
+ * @access protected
+ * @return string
+ */
+ protected function findDescription()
+ {
+ return isset($this->outlineElement['description']) ? (string) $this->outlineElement['description'] : $this->findTitle();
+ }
+}