version = $version; $this->type = $type; $this->charset = $charset; $this->lang = $lang; } /** * 设置标题 * * @param string $title 标题 */ public function setTitle(string $title) { $this->title = $title; } /** * 设置副标题 * * @param string|null $subTitle 副标题 */ public function setSubTitle(?string $subTitle) { $this->subTitle = $subTitle; } /** * 设置聚合地址 * * @param string $feedUrl 聚合地址 */ public function setFeedUrl(string $feedUrl) { $this->feedUrl = $feedUrl; } /** * 设置主页 * * @param string $baseUrl 主页地址 */ public function setBaseUrl(string $baseUrl) { $this->baseUrl = $baseUrl; } /** * $item的格式为 * * array ( * 'title' => 'xxx', * 'content' => 'xxx', * 'excerpt' => 'xxx', * 'date' => 'xxx', * 'link' => 'xxx', * 'author' => 'xxx', * 'comments' => 'xxx', * 'commentsUrl'=> 'xxx', * 'commentsFeedUrl' => 'xxx', * ) * * * @param array $item */ public function addItem(array $item) { $this->items[] = $item; } /** * 输出字符串 * * @return string */ public function __toString(): string { $result = 'charset . '"?>' . self::EOL; if (self::RSS1 == $this->type) { $result .= '' . self::EOL; $content = ''; $links = []; $lastUpdate = 0; foreach ($this->items as $item) { $content .= '' . self::EOL; $content .= '' . htmlspecialchars($item['title']) . '' . self::EOL; $content .= '' . $item['link'] . '' . self::EOL; $content .= '' . $this->dateFormat($item['date']) . '' . self::EOL; $content .= '' . strip_tags($item['content']) . '' . self::EOL; if (!empty($item['suffix'])) { $content .= $item['suffix']; } $content .= '' . self::EOL; $links[] = $item['link']; if ($item['date'] > $lastUpdate) { $lastUpdate = $item['date']; } } $result .= ' ' . htmlspecialchars($this->title) . ' ' . $this->baseUrl . ' ' . htmlspecialchars($this->subTitle ?? '') . ' ' . self::EOL; foreach ($links as $link) { $result .= '' . self::EOL; } $result .= ' ' . self::EOL; $result .= $content . ''; } elseif (self::RSS2 == $this->type) { $result .= ' ' . self::EOL; $content = ''; $lastUpdate = 0; foreach ($this->items as $item) { $content .= '' . self::EOL; $content .= '' . htmlspecialchars($item['title']) . '' . self::EOL; $content .= '' . $item['link'] . '' . self::EOL; $content .= '' . $item['link'] . '' . self::EOL; $content .= '' . $this->dateFormat($item['date']) . '' . self::EOL; $content .= '' . htmlspecialchars($item['author']->screenName) . '' . self::EOL; if (!empty($item['category']) && is_array($item['category'])) { foreach ($item['category'] as $category) { $content .= '' . self::EOL; } } if (!empty($item['excerpt'])) { $content .= '' . self::EOL; } if (!empty($item['content'])) { $content .= '' . self::EOL; } if (isset($item['comments']) && strlen($item['comments']) > 0) { $content .= '' . $item['comments'] . '' . self::EOL; } $content .= '' . $item['link'] . '#comments' . self::EOL; if (!empty($item['commentsFeedUrl'])) { $content .= '' . $item['commentsFeedUrl'] . '' . self::EOL; } if (!empty($item['suffix'])) { $content .= $item['suffix']; } $content .= '' . self::EOL; if ($item['date'] > $lastUpdate) { $lastUpdate = $item['date']; } } $result .= '' . htmlspecialchars($this->title) . ' ' . $this->baseUrl . ' ' . $this->lang . ' ' . htmlspecialchars($this->subTitle ?? '') . ' ' . $this->dateFormat($lastUpdate) . ' ' . $this->dateFormat($lastUpdate) . '' . self::EOL; $result .= $content . ' '; } elseif (self::ATOM1 == $this->type) { $result .= '' . self::EOL; $content = ''; $lastUpdate = 0; foreach ($this->items as $item) { $content .= '' . self::EOL; $content .= '<![CDATA[' . $item['title'] . ']]>' . self::EOL; $content .= '' . self::EOL; $content .= '' . $item['link'] . '' . self::EOL; $content .= '' . $this->dateFormat($item['date']) . '' . self::EOL; $content .= '' . $this->dateFormat($item['date']) . '' . self::EOL; $content .= ' ' . $item['author']->screenName . ' ' . $item['author']->url . ' ' . self::EOL; if (!empty($item['category']) && is_array($item['category'])) { foreach ($item['category'] as $category) { $content .= '' . self::EOL; } } if (!empty($item['excerpt'])) { $content .= '' . self::EOL; } if (!empty($item['content'])) { $content .= '' . self::EOL; } if (isset($item['comments']) && strlen($item['comments']) > 0) { $content .= '' . self::EOL; if (!empty($item['commentsFeedUrl'])) { $content .= '' . self::EOL; } } if (!empty($item['suffix'])) { $content .= $item['suffix']; } $content .= '' . self::EOL; if ($item['date'] > $lastUpdate) { $lastUpdate = $item['date']; } } $result .= '' . htmlspecialchars($this->title) . ' ' . htmlspecialchars($this->subTitle ?? '') . ' ' . $this->dateFormat($lastUpdate) . ' Typecho ' . $this->feedUrl . ' '; $result .= $content . ''; } return $result; } /** * 获取Feed时间格式 * * @param integer $stamp 时间戳 * @return string */ public function dateFormat(int $stamp): string { if (self::RSS2 == $this->type) { return date(self::DATE_RFC822, $stamp); } elseif (self::RSS1 == $this->type || self::ATOM1 == $this->type) { return date(self::DATE_W3CDTF, $stamp); } return ''; } }