]> git.wh0rd.org Git - tt-rss.git/blob - classes/feeditem/atom.php
8c3e0f8a748b029b8c81b9df86cce89269efabdd
[tt-rss.git] / classes / feeditem / atom.php
1 <?php
2 class FeedItem_Atom extends FeedItem_Common {
3         const NS_XML = "http://www.w3.org/XML/1998/namespace";
4
5         function get_id() {
6                 $id = $this->elem->getElementsByTagName("id")->item(0);
7
8                 if ($id) {
9                         return $id->nodeValue;
10                 } else {
11                         return $this->get_link();
12                 }
13         }
14
15         function get_date() {
16                 $updated = $this->elem->getElementsByTagName("updated")->item(0);
17
18                 if ($updated) {
19                         return strtotime($updated->nodeValue);
20                 }
21
22                 $published = $this->elem->getElementsByTagName("published")->item(0);
23
24                 if ($published) {
25                         return strtotime($published->nodeValue);
26                 }
27
28                 $date = $this->xpath->query("dc:date", $this->elem)->item(0);
29
30                 if ($date) {
31                         return strtotime($date->nodeValue);
32                 }
33         }
34
35
36         function get_link() {
37                 $links = $this->elem->getElementsByTagName("link");
38
39                 foreach ($links as $link) {
40                         if ($link && $link->hasAttribute("href") &&
41                                 (!$link->hasAttribute("rel")
42                                         || $link->getAttribute("rel") == "alternate"
43                                         || $link->getAttribute("rel") == "standout")) {
44                                 $base = $this->xpath->evaluate("string(ancestor-or-self::*[@xml:base][1]/@xml:base)", $link);
45
46                                 if ($base)
47                                         return rewrite_relative_url($base, trim($link->getAttribute("href")));
48                                 else
49                                         return trim($link->getAttribute("href"));
50
51                         }
52                 }
53         }
54
55         function get_title() {
56                 $title = $this->elem->getElementsByTagName("title")->item(0);
57
58                 if ($title) {
59                         return trim($title->nodeValue);
60                 }
61         }
62
63         function get_content() {
64                 $content = $this->elem->getElementsByTagName("content")->item(0);
65
66                 if ($content) {
67                         if ($content->hasAttribute('type')) {
68                                 if ($content->getAttribute('type') == 'xhtml') {
69                                         for ($i = 0; $i < $content->childNodes->length; $i++) {
70                                                 $child = $content->childNodes->item($i);
71
72                                                 if ($child->hasChildNodes()) {
73                                                         return $this->doc->saveHTML($child);
74                                                 }
75                                         }
76                                 }
77                         }
78
79                         return $this->subtree_or_text($content);
80                 }
81         }
82
83         function get_description() {
84                 $content = $this->elem->getElementsByTagName("summary")->item(0);
85
86                 if ($content) {
87                         if ($content->hasAttribute('type')) {
88                                 if ($content->getAttribute('type') == 'xhtml') {
89                                         for ($i = 0; $i < $content->childNodes->length; $i++) {
90                                                 $child = $content->childNodes->item($i);
91
92                                                 if ($child->hasChildNodes()) {
93                                                         return $this->doc->saveHTML($child);
94                                                 }
95                                         }
96                                 }
97                         }
98
99                         return $this->subtree_or_text($content);
100                 }
101
102         }
103
104         function get_categories() {
105                 $categories = $this->elem->getElementsByTagName("category");
106                 $cats = array();
107
108                 foreach ($categories as $cat) {
109                         if ($cat->hasAttribute("term"))
110                                 array_push($cats, trim($cat->getAttribute("term")));
111                 }
112
113                 $categories = $this->xpath->query("dc:subject", $this->elem);
114
115                 foreach ($categories as $cat) {
116                         array_push($cats, trim($cat->nodeValue));
117                 }
118
119                 return $cats;
120         }
121
122         function get_enclosures() {
123                 $links = $this->elem->getElementsByTagName("link");
124
125                 $encs = array();
126
127                 foreach ($links as $link) {
128                         if ($link && $link->hasAttribute("href") && $link->hasAttribute("rel")) {
129                                 if ($link->getAttribute("rel") == "enclosure") {
130                                         $enc = new FeedEnclosure();
131
132                                         $enc->type = $link->getAttribute("type");
133                                         $enc->link = $link->getAttribute("href");
134                                         $enc->length = $link->getAttribute("length");
135
136                                         array_push($encs, $enc);
137                                 }
138                         }
139                 }
140
141                 $enclosures = $this->xpath->query("media:content", $this->elem);
142
143                 foreach ($enclosures as $enclosure) {
144                         $enc = new FeedEnclosure();
145
146                         $enc->type = $enclosure->getAttribute("type");
147                         $enc->link = $enclosure->getAttribute("url");
148                         $enc->length = $enclosure->getAttribute("length");
149                         $enc->height = $enclosure->getAttribute("height");
150                         $enc->width = $enclosure->getAttribute("width");
151
152                         $desc = $this->xpath->query("media:description", $enclosure)->item(0);
153                         if ($desc) $enc->title = strip_tags($desc->nodeValue);
154
155                         array_push($encs, $enc);
156                 }
157
158
159                 $enclosures = $this->xpath->query("media:group", $this->elem);
160
161                 foreach ($enclosures as $enclosure) {
162                         $enc = new FeedEnclosure();
163
164                         $content = $this->xpath->query("media:content", $enclosure)->item(0);
165
166                         if ($content) {
167                                 $enc->type = $content->getAttribute("type");
168                                 $enc->link = $content->getAttribute("url");
169                                 $enc->length = $content->getAttribute("length");
170                                 $enc->height = $content->getAttribute("height");
171                                 $enc->width = $content->getAttribute("width");
172
173                                 $desc = $this->xpath->query("media:description", $content)->item(0);
174                                 if ($desc) {
175                                         $enc->title = strip_tags($desc->nodeValue);
176                                 } else {
177                                         $desc = $this->xpath->query("media:description", $enclosure)->item(0);
178                                         if ($desc) $enc->title = strip_tags($desc->nodeValue);
179                                 }
180
181                                 array_push($encs, $enc);
182                         }
183                 }
184
185                 $enclosures = $this->xpath->query("media:thumbnail", $this->elem);
186
187                 foreach ($enclosures as $enclosure) {
188                         $enc = new FeedEnclosure();
189
190                         $enc->type = "image/generic";
191                         $enc->link = $enclosure->getAttribute("url");
192                         $enc->height = $enclosure->getAttribute("height");
193                         $enc->width = $enclosure->getAttribute("width");
194
195                         array_push($encs, $enc);
196                 }
197
198                 return $encs;
199         }
200
201         function get_language() {
202                 $lang = $this->elem->getAttributeNS(self::NS_XML, "lang");
203
204                 if (!empty($lang)) {
205                         return $lang;
206                 } else {
207                         // Fall back to the language declared on the feed, if any.
208                         foreach ($this->doc->childNodes as $child) {
209                                 if (method_exists($child, "getAttributeNS")) {
210                                         return $child->getAttributeNS(self::NS_XML, "lang");
211                                 }
212                         }
213                 }
214         }
215 }