forked from joomla/joomla-platform
/
atom.php
142 lines (131 loc) · 5.18 KB
/
atom.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
/**
* @package Joomla.Platform
* @subpackage Document
*
* @copyright Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/
defined('JPATH_PLATFORM') or die;
/**
* JDocumentRenderer_Atom is a feed that implements the atom specification
*
* Please note that just by using this class you won't automatically
* produce valid atom files. For example, you have to specify either an editor
* for the feed or an author for every single feed item.
*
* @package Joomla.Platform
* @subpackage Document
* @see http://www.atomenabled.org/developers/syndication/atom-format-spec.php
* @since 11.1
*/
class JDocumentRendererAtom extends JDocumentRenderer
{
/**
* Document mime type
*
* @var string
*/
protected $_mime = "application/atom+xml";
/**
* Render the feed
*
* @return string
*/
public function render()
{
$app = JFactory::getApplication();
$now = JFactory::getDate();
$data = &$this->_doc;
$uri = JFactory::getURI();
$url = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port'));
$syndicationURL = JRoute::_('&format=feed&type=atom');
if ($app->getCfg('sitename_pagetitles', 0) == 1) {
$title = JText::sprintf('JPAGETITLE', $app->getCfg('sitename'), $data->title);
}
elseif ($app->getCfg('sitename_pagetitles', 0) == 2) {
$title = JText::sprintf('JPAGETITLE', $data->title, $app->getCfg('sitename'));
}
else {
$title = $data->title;
}
$feed_title = htmlspecialchars($title, ENT_COMPAT, 'UTF-8');
$feed = "<feed xmlns=\"http://www.w3.org/2005/Atom\" ";
if ($data->language!="") {
$feed.= " xml:lang=\"".$data->language."\"";
}
$feed.= ">\n";
$feed.= " <title type=\"text\">".$feed_title."</title>\n";
$feed.= " <subtitle type=\"text\">".htmlspecialchars($data->description, ENT_COMPAT, 'UTF-8')."</subtitle>\n";
if (empty($data->category) === false) {
if (is_array($data->category)) {
foreach ($data->category as $cat) {
$feed.= " <category term=\"".htmlspecialchars($cat, ENT_COMPAT, 'UTF-8')."\" />\n";
}
}
else {
$feed.= " <category term=\"".htmlspecialchars($data->category, ENT_COMPAT, 'UTF-8')."\" />\n";
}
}
$feed.= " <link rel=\"alternate\" type=\"text/html\" href=\"".$url."\"/>\n";
$feed.= " <id>".str_replace(' ','%20',$data->getBase())."</id>\n";
$feed.= " <updated>".htmlspecialchars($now->toISO8601(), ENT_COMPAT, 'UTF-8')."</updated>\n";
if ($data->editor!="") {
$feed.= " <author>\n";
$feed.= " <name>".$data->editor."</name>\n";
if ($data->editorEmail!="") {
$feed.= " <email>".htmlspecialchars($data->editorEmail, ENT_COMPAT, 'UTF-8')."</email>\n";
}
$feed.= " </author>\n";
}
$feed.= " <generator uri=\"http://joomla.org\" version=\"1.6\">".$data->getGenerator()."</generator>\n";
$feed.= ' <link rel="self" type="application/atom+xml" href="'.str_replace(' ','%20',$url.$syndicationURL)."\"/>\n";
for ($i = 0, $count = count($data->items); $i < $count; $i++)
{
$feed.= " <entry>\n";
$feed.= " <title>".htmlspecialchars(strip_tags($data->items[$i]->title), ENT_COMPAT, 'UTF-8')."</title>\n";
$feed.= ' <link rel="alternate" type="text/html" href="'.$url.$data->items[$i]->link."\"/>\n";
if ($data->items[$i]->date=="") {
$data->items[$i]->date = $now->toUnix();
}
$itemDate = JFactory::getDate($data->items[$i]->date);
$feed.= " <published>".htmlspecialchars($itemDate->toISO8601(), ENT_COMPAT, 'UTF-8')."</published>\n";
$feed.= " <updated>".htmlspecialchars($itemDate->toISO8601(),ENT_COMPAT, 'UTF-8')."</updated>\n";
if (empty($data->items[$i]->guid) === true) {
$feed.= " <id>".str_replace(' ', '%20', $url.$data->items[$i]->link)."</id>\n";
}
else {
$feed.= " <id>".htmlspecialchars($data->items[$i]->guid, ENT_COMPAT, 'UTF-8')."</id>\n";
}
if ($data->items[$i]->author!="")
{
$feed.= " <author>\n";
$feed.= " <name>".htmlspecialchars($data->items[$i]->author, ENT_COMPAT, 'UTF-8')."</name>\n";
if ($data->items[$i]->authorEmail!="") {
$feed.= " <email>".htmlspecialchars($data->items[$i]->authorEmail, ENT_COMPAT, 'UTF-8')."</email>\n";
}
$feed.= " </author>\n";
}
if ($data->items[$i]->description!="") {
$feed.= " <summary type=\"html\">".htmlspecialchars($data->items[$i]->description, ENT_COMPAT, 'UTF-8')."</summary>\n";
$feed.= " <content type=\"html\">".htmlspecialchars($data->items[$i]->description, ENT_COMPAT, 'UTF-8')."</content>\n";
}
if (empty($data->items[$i]->category) === false) {
if (is_array($data->items[$i]->category)) {
foreach ($data->items[$i]->category as $cat) {
$feed.= " <category term=\"".htmlspecialchars($cat, ENT_COMPAT, 'UTF-8')."\" />\n";
}
}
else {
$feed.= " <category term=\"".htmlspecialchars($data->items[$i]->category, ENT_COMPAT, 'UTF-8')."\" />\n";
}
}
if ($data->items[$i]->enclosure != NULL) {
$feed.=" <link rel=\"enclosure\" href=\"". $data->items[$i]->enclosure->url ."\" type=\"". $data->items[$i]->enclosure->type."\" length=\"". $data->items[$i]->enclosure->length . "\" />\n";
}
$feed.= " </entry>\n";
}
$feed.= "</feed>\n";
return $feed;
}
}