xml_encode($urlPrefix . $urlHost . $urlRequest); $extraInfos = $this->getExtraInfos(); $title = $this->xml_encode($extraInfos['name']); $uri = !empty($extraInfos['uri']) ? $extraInfos['uri'] : REPOSITORY; // since we can't guarantee that all items have an author, // a global feed author is mandatory $feedAuthor = 'RSS-Bridge'; $uriparts = parse_url($uri); if(!empty($extraInfos['icon'])) { $icon = $extraInfos['icon']; } else { $icon = $this->xml_encode($uriparts['scheme'] . '://' . $uriparts['host'] . '/favicon.ico'); } $uri = $this->xml_encode($uri); $entries = ''; foreach($this->getItems() as $item) { $entryTimestamp = $item->getTimestamp(); $entryTitle = $item->getTitle(); $entryContent = $item->getContent(); $entryUri = $item->getURI(); $entryID = ''; if (!empty($item->getUid())) $entryID = 'urn:sha1:' . $item->getUid(); if (empty($entryID)) // Fallback to provided URI $entryID = $this->xml_encode($entryUri); if (empty($entryID)) // Fallback to title and content $entryID = 'urn:sha1:' . hash('sha1', $entryTitle . $entryContent); if (empty($entryTimestamp)) $entryTimestamp = $this->lastModified; if (empty($entryTitle)) { $entryTitle = str_replace("\n", ' ', strip_tags($entryContent)); if (strlen($entryTitle) > self::LIMIT_TITLE) { $wrapPos = strpos(wordwrap($entryTitle, self::LIMIT_TITLE), "\n"); $entryTitle = substr($entryTitle, 0, $wrapPos) . '...'; } } if (empty($entryContent)) $entryContent = $entryTitle; $entryAuthor = $this->xml_encode($item->getAuthor()); $entryTitle = $this->xml_encode($entryTitle); $entryUri = $this->xml_encode($entryUri); $entryTimestamp = $this->xml_encode(gmdate(DATE_ATOM, $entryTimestamp)); $entryContent = $this->xml_encode($this->sanitizeHtml($entryContent)); $entryEnclosures = ''; foreach($item->getEnclosures() as $enclosure) { $entryEnclosures .= '' . PHP_EOL; } $entryCategories = ''; foreach($item->getCategories() as $category) { $entryCategories .= '' . PHP_EOL; } $entryThumbnail = $item->thumbnail; if (!empty($entryThumbnail)) $entryThumbnail = ''; $entryLinkAlternate = ''; if (!empty($entryUri)) { $entryLinkAlternate = ''; } if (!empty($entryAuthor)) { $entryAuthor = '' . $entryAuthor . ''; } $entries .= << {$entryTitle} {$entryTimestamp} {$entryTimestamp} {$entryID} {$entryLinkAlternate} {$entryAuthor} {$entryContent} {$entryEnclosures} {$entryCategories} {$entryThumbnail} EOD; } $feedTimestamp = gmdate(DATE_ATOM, $this->lastModified); $charset = $this->getCharset(); /* Data are prepared, now let's begin the "MAGIE !!!" */ $toReturn = << {$title} {$feedUrl} {$icon} {$icon} {$feedTimestamp} {$feedAuthor} {$entries} EOD; // Remove invalid characters ini_set('mbstring.substitute_character', 'none'); $toReturn = mb_convert_encoding($toReturn, $this->getCharset(), 'UTF-8'); return $toReturn; } public function display(){ $this ->setContentType(self::MIME_TYPE . '; charset=' . $this->getCharset()) ->callContentType(); return parent::display(); } private function xml_encode($text){ return htmlspecialchars($text, ENT_XML1); } }