-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
Copy pathJsonFormat.php
118 lines (103 loc) · 3.39 KB
/
JsonFormat.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
/**
* 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 MIME_TYPE = 'application/json';
const VENDOR_EXCLUDES = [
'author',
'title',
'uri',
'timestamp',
'content',
'enclosures',
'categories',
'uid',
];
public function render(): string
{
$feedArray = $this->getFeed();
$data = [
'version' => 'https://jsonfeed.org/version/1',
'title' => $feedArray['name'],
'home_page_url' => $feedArray['uri'],
'feed_url' => get_current_url(),
];
if ($feedArray['icon']) {
$data['icon'] = $feedArray['icon'];
$data['favicon'] = $feedArray['icon'];
}
$items = [];
foreach ($this->getItems() as $item) {
$entry = [];
$entryAuthor = $item->getAuthor();
$entryTitle = $item->getTitle();
$entryUri = $item->getURI();
$entryTimestamp = $item->getTimestamp();
$entryContent = $item->getContent() ?? '';
$entryEnclosures = $item->getEnclosures();
$entryCategories = $item->getCategories();
$vendorFields = $item->toArray();
foreach (self::VENDOR_EXCLUDES as $key) {
unset($vendorFields[$key]);
}
$entry['id'] = $item->getUid();
if (empty($entry['id'])) {
$entry['id'] = $entryUri;
}
if (!empty($entryTitle)) {
$entry['title'] = $entryTitle;
}
if (!empty($entryAuthor)) {
$entry['author'] = [
'name' => $entryAuthor
];
}
if (!empty($entryTimestamp)) {
$entry['date_modified'] = gmdate(\DATE_ATOM, $entryTimestamp);
}
if (!empty($entryUri)) {
$entry['url'] = $entryUri;
}
if (!empty($entryContent)) {
if (is_html($entryContent)) {
$entry['content_html'] = $entryContent;
} else {
$entry['content_text'] = $entryContent;
}
}
if (!empty($entryEnclosures)) {
$entry['attachments'] = [];
foreach ($entryEnclosures as $enclosure) {
$entry['attachments'][] = [
'url' => $enclosure,
'mime_type' => parse_mime_type($enclosure)
];
}
}
if (!empty($entryCategories)) {
$entry['tags'] = [];
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;
// Ignoring invalid json
$json = json_encode($data, \JSON_PRETTY_PRINT | \JSON_INVALID_UTF8_IGNORE);
return $json;
}
}