180 lines
4.2 KiB
PHP
180 lines
4.2 KiB
PHP
<?php
|
|
class FeedItem_Atom extends FeedItem_Common {
|
|
|
|
function get_id() {
|
|
$id = $this->elem->getElementsByTagName("id")->item(0);
|
|
|
|
if ($id) {
|
|
return $id->nodeValue;
|
|
} else {
|
|
return $this->get_link();
|
|
}
|
|
}
|
|
|
|
function get_date() {
|
|
$updated = $this->elem->getElementsByTagName("updated")->item(0);
|
|
|
|
if ($updated) {
|
|
return strtotime($updated->nodeValue);
|
|
}
|
|
|
|
$published = $this->elem->getElementsByTagName("published")->item(0);
|
|
|
|
if ($published) {
|
|
return strtotime($published->nodeValue);
|
|
}
|
|
|
|
$date = $this->xpath->query("dc:date", $this->elem)->item(0);
|
|
|
|
if ($date) {
|
|
return strtotime($date->nodeValue);
|
|
}
|
|
}
|
|
|
|
function rel2abs($rel, $base)
|
|
{
|
|
/* return if already absolute URL */
|
|
if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
|
|
|
|
/* queries and anchors */
|
|
if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel;
|
|
|
|
/* parse base URL and convert to local variables:
|
|
$scheme, $host, $path */
|
|
extract(parse_url($base));
|
|
|
|
/* remove non-directory element from path */
|
|
$path = preg_replace('#/[^/]*$#', '', $path);
|
|
|
|
/* destroy path if relative url points to root */
|
|
if ($rel[0] == '/') $path = '';
|
|
|
|
/* dirty absolute URL */
|
|
$abs = "$host$path/$rel";
|
|
|
|
/* replace '//' or '/./' or '/foo/../' with '/' */
|
|
$re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
|
|
for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}
|
|
|
|
/* absolute URL is ready! */
|
|
return $scheme.'://'.$abs;
|
|
}
|
|
|
|
function get_link() {
|
|
$links = $this->elem->getElementsByTagName("link");
|
|
|
|
foreach ($links as $link) {
|
|
if ($link && $link->hasAttribute("href") &&
|
|
(!$link->hasAttribute("rel")
|
|
|| $link->getAttribute("rel") == "alternate"
|
|
|| $link->getAttribute("rel") == "standout")) {
|
|
$base = $this->xpath->evaluate("string(ancestor-or-self::*[@xml:base][1]/@xml:base)",$link);
|
|
return $this->rel2abs($link->getAttribute("href"), $base);
|
|
}
|
|
}
|
|
}
|
|
|
|
function get_title() {
|
|
$title = $this->elem->getElementsByTagName("title")->item(0);
|
|
|
|
if ($title) {
|
|
return $title->nodeValue;
|
|
}
|
|
}
|
|
|
|
function get_content() {
|
|
$content = $this->elem->getElementsByTagName("content")->item(0);
|
|
|
|
if ($content) {
|
|
if ($content->hasAttribute('type')) {
|
|
if ($content->getAttribute('type') == 'xhtml') {
|
|
for ($i = 0; $i < $content->childNodes->length; $i++) {
|
|
$child = $content->childNodes->item($i);
|
|
|
|
if ($child->hasChildNodes()) {
|
|
return $this->doc->saveXML($child);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $content->nodeValue;
|
|
}
|
|
}
|
|
|
|
function get_description() {
|
|
$content = $this->elem->getElementsByTagName("summary")->item(0);
|
|
|
|
if ($content) {
|
|
if ($content->hasAttribute('type')) {
|
|
if ($content->getAttribute('type') == 'xhtml') {
|
|
for ($i = 0; $i < $content->childNodes->length; $i++) {
|
|
$child = $content->childNodes->item($i);
|
|
|
|
if ($child->hasChildNodes()) {
|
|
return $this->doc->saveXML($child);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $content->nodeValue;
|
|
}
|
|
|
|
}
|
|
|
|
function get_categories() {
|
|
$categories = $this->elem->getElementsByTagName("category");
|
|
$cats = array();
|
|
|
|
foreach ($categories as $cat) {
|
|
if ($cat->hasAttribute("term"))
|
|
array_push($cats, $cat->getAttribute("term"));
|
|
}
|
|
|
|
$categories = $this->xpath->query("dc:subject", $this->elem);
|
|
|
|
foreach ($categories as $cat) {
|
|
array_push($cats, $cat->nodeValue);
|
|
}
|
|
|
|
return $cats;
|
|
}
|
|
|
|
function get_enclosures() {
|
|
$links = $this->elem->getElementsByTagName("link");
|
|
|
|
$encs = array();
|
|
|
|
foreach ($links as $link) {
|
|
if ($link && $link->hasAttribute("href") && $link->hasAttribute("rel")) {
|
|
if ($link->getAttribute("rel") == "enclosure") {
|
|
$enc = new FeedEnclosure();
|
|
|
|
$enc->type = $link->getAttribute("type");
|
|
$enc->link = $link->getAttribute("href");
|
|
$enc->length = $link->getAttribute("length");
|
|
|
|
array_push($encs, $enc);
|
|
}
|
|
}
|
|
}
|
|
|
|
$enclosures = $this->xpath->query("media:content", $this->elem);
|
|
|
|
foreach ($enclosures as $enclosure) {
|
|
$enc = new FeedEnclosure();
|
|
|
|
$enc->type = $enclosure->getAttribute("type");
|
|
$enc->link = $enclosure->getAttribute("url");
|
|
$enc->length = $enclosure->getAttribute("length");
|
|
|
|
array_push($encs, $enc);
|
|
}
|
|
|
|
return $encs;
|
|
}
|
|
|
|
}
|
|
?>
|