aboutsummaryrefslogtreecommitdiff
path: root/formats/JsonFormat.php
diff options
context:
space:
mode:
Diffstat (limited to 'formats/JsonFormat.php')
-rw-r--r--formats/JsonFormat.php110
1 files changed, 103 insertions, 7 deletions
diff --git a/formats/JsonFormat.php b/formats/JsonFormat.php
index c3f85f94..fafe7a5a 100644
--- a/formats/JsonFormat.php
+++ b/formats/JsonFormat.php
@@ -1,17 +1,109 @@
<?php
/**
-* Json
-* Builds a JSON string from $this->items and return it to browser.
-*/
+ * JsonFormat - JSON Feed Version 1
+ * https://jsonfeed.org/version/1
+ *
+ * Validators:
+ * https://validator.jsonfeed.org
+ * https://github.com/vigetlabs/json-feed-validator
+ */
class JsonFormat extends FormatAbstract {
+ const VENDOR_EXCLUDES = array(
+ 'author',
+ 'title',
+ 'uri',
+ 'timestamp',
+ 'content',
+ 'enclosures',
+ 'categories',
+ );
+
public function stringify(){
- $items = $this->getItems();
- $data = array();
+ $urlScheme = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
+ $urlHost = (isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : '';
+ $urlPath = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : '';
+ $urlRequest = (isset($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : '';
+
+ $extraInfos = $this->getExtraInfos();
- foreach($items as $item) {
- $data[] = $item->toArray();
+ $data = array(
+ 'version' => 'https://jsonfeed.org/version/1',
+ 'title' => (!empty($extraInfos['name'])) ? $extraInfos['name'] : $urlHost,
+ 'home_page_url' => (!empty($extraInfos['uri'])) ? $extraInfos['uri'] : REPOSITORY,
+ 'feed_url' => $urlScheme . $urlHost . $urlRequest
+ );
+
+ if (!empty($extraInfos['icon'])) {
+ $data['icon'] = $extraInfos['icon'];
+ $data['favicon'] = $extraInfos['icon'];
}
+ $items = array();
+ foreach ($this->getItems() as $item) {
+ $entry = array();
+
+ $entryAuthor = $item->getAuthor();
+ $entryTitle = $item->getTitle();
+ $entryUri = $item->getURI();
+ $entryTimestamp = $item->getTimestamp();
+ $entryContent = $this->sanitizeHtml($item->getContent());
+ $entryEnclosures = $item->getEnclosures();
+ $entryCategories = $item->getCategories();
+
+ $vendorFields = $item->toArray();
+ foreach (self::VENDOR_EXCLUDES as $key) {
+ unset($vendorFields[$key]);
+ }
+
+ $entry['id'] = $entryUri;
+
+ if (!empty($entryTitle)) {
+ $entry['title'] = $entryTitle;
+ }
+ if (!empty($entryAuthor)) {
+ $entry['author'] = array(
+ 'name' => $entryAuthor
+ );
+ }
+ if (!empty($entryTimestamp)) {
+ $entry['date_modified'] = gmdate(DATE_ATOM, $entryTimestamp);
+ }
+ if (!empty($entryUri)) {
+ $entry['url'] = $entryUri;
+ }
+ if (!empty($entryContent)) {
+ if ($this->isHTML($entryContent)) {
+ $entry['content_html'] = $entryContent;
+ } else {
+ $entry['content_text'] = $entryContent;
+ }
+ }
+ if (!empty($entryEnclosures)) {
+ $entry['attachments'] = array();
+ foreach ($entryEnclosures as $enclosure) {
+ $entry['attachments'][] = array(
+ 'url' => $enclosure,
+ 'mime_type' => getMimeType($enclosure)
+ );
+ }
+ }
+ if (!empty($entryCategories)) {
+ $entry['tags'] = array();
+ foreach ($entryCategories as $category) {
+ $entry['tags'][] = $category;
+ }
+ }
+ if (!empty($vendorFields)) {
+ $entry['_rssbridge'] = $vendorFields;
+ }
+
+ if (empty($entry['id']))
+ $entry['id'] = hash('sha1', $entryTitle . $entryContent);
+
+ $items[] = $entry;
+ }
+ $data['items'] = $items;
+
$toReturn = json_encode($data, JSON_PRETTY_PRINT);
// Remove invalid non-UTF8 characters
@@ -27,4 +119,8 @@ class JsonFormat extends FormatAbstract {
return parent::display();
}
+
+ private function isHTML($text) {
+ return (strlen(strip_tags($text)) != strlen($text));
+ }
}