|
- <?php
-
- namespace dokuwiki\Feed;
-
- use dokuwiki\Extension\AuthPlugin;
- use RuntimeException;
-
- /**
- * Accept more or less arbitrary data to represent data to later construct a feed item from.
- * Provide lazy loading accessors to all the data we need for feed generation.
- */
- abstract class FeedItemProcessor
- {
- /** @var string This page's ID */
- protected $id;
-
- /** @var array bag of holding */
- protected $data;
-
-
- /**
- * Constructor
- *
- * @param array $data Needs to have at least an 'id' key
- */
- public function __construct($data)
- {
- if (!isset($data['id'])) throw new RuntimeException('Missing ID');
- $this->id = cleanID($data['id']);
- $this->data = $data;
- }
-
- /**
- * Get the page ID
- *
- * @return string
- */
- public function getId()
- {
- return $this->id;
- }
-
- /**
- * Get the revision timestamp of this page
- *
- * If the input gave us a revision, date or lastmodified already, we trust that it is correct.
- *
- * Note: we only handle most current revisions in feeds, so the revision is usually just the
- * lastmodifed timestamp of the page file. However, if the item does not exist, we need to
- * determine the revision from the changelog.
- *
- * @return int
- */
- public function getRev()
- {
- if ($this->data['rev'] ?? 0) return $this->data['rev'];
-
- if (isset($this->data['date'])) {
- $this->data['rev'] = (int)$this->data['date'];
- }
-
- if (isset($this->data['lastmodified'])) {
- $this->data['rev'] = (int)$this->data['lastmodified'];
- }
-
- return $this->data['rev'] ?? 0;
- }
-
- /**
- * Construct the URL for the feed item based on the link_to option
- *
- * @param string $linkto The link_to option
- * @return string URL
- */
- abstract public function getURL($linkto);
-
- /**
- * @return string
- */
- public function getTitle()
- {
- return $this->data['title'] ?? noNS($this->getId());
- }
-
- /**
- * Construct the body of the feed item based on the item_content option
- *
- * @param string $content The item_content option
- * @return string
- */
- abstract public function getBody($content);
-
- /**
- * Get the change summary for this item if any
- *
- * @return string
- */
- public function getSummary()
- {
- return (string)($this->data['sum'] ?? '');
- }
-
- /**
- * Get the author info for this item
- *
- * @return string[] [email, author]
- */
- public function getAuthor()
- {
- global $conf;
- global $auth;
-
- $user = $this->data['user'] ?? '';
- $author = 'Anonymous';
- $email = 'anonymous@undisclosed.example.com';
-
- if (!$user) return [$email, $author];
- $author = $user;
- $email = $user . '@undisclosed.example.com';
-
- if ($conf['useacl'] && $auth instanceof AuthPlugin) {
- $userInfo = $auth->getUserData($user);
- if ($userInfo) {
- switch ($conf['showuseras']) {
- case 'username':
- case 'username_link':
- $author = $userInfo['name'];
- break;
- }
- }
- }
- return [$email, $author];
- }
-
- /**
- * Get the categories for this item
- *
- * @return string[]
- */
- abstract public function getCategory();
-
-
- /**
- * Clean HTML for the use in feeds
- *
- * @param string $html
- * @return string
- */
- protected function cleanHTML($html)
- {
- global $conf;
-
- // no TOC in feeds
- $html = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s', '', $html);
-
- // add alignment for images
- $html = preg_replace('/(<img .*?class="medialeft")/s', '\\1 align="left"', $html);
- $html = preg_replace('/(<img .*?class="mediaright")/s', '\\1 align="right"', $html);
-
- // make URLs work when canonical is not set, regexp instead of rerendering!
- if (!$conf['canonical']) {
- $base = preg_quote(DOKU_REL, '/');
- $html = preg_replace(
- '/(<a href|<img src)="(' . $base . ')/s',
- '$1="' . DOKU_URL,
- $html
- );
- }
-
- return $html;
- }
- }
|