|
- <?php
-
- namespace dokuwiki\Feed;
-
- use dokuwiki\ChangeLog\MediaChangeLog;
- use dokuwiki\File\MediaFile;
- use dokuwiki\Ui\Media\Display;
-
- class FeedMediaProcessor extends FeedItemProcessor
- {
- /** @inheritdoc */
- public function getURL($linkto)
- {
- switch ($linkto) {
- case 'page':
- $opt = [
- 'image' => $this->getId(),
- 'ns' => getNS($this->getId()),
- 'rev' => $this->getRev()
- ];
- break;
- case 'rev':
- $opt = [
- 'image' => $this->getId(),
- 'ns' => getNS($this->getId()),
- 'rev' => $this->getRev(),
- 'tab_details' => 'history'
- ];
- break;
- case 'current':
- $opt = [
- 'image' => $this->getId(),
- 'ns' => getNS($this->getId())
- ];
- break;
- case 'diff':
- default:
- $opt = [
- 'image' => $this->getId(),
- 'ns' => getNS($this->getId()),
- 'rev' => $this->getRev(),
- 'tab_details' => 'history',
- 'media_do' => 'diff'
- ];
- }
-
- return media_managerURL($opt, '&', true);
- }
-
- public function getBody($content)
- {
- switch ($content) {
- case 'diff':
- case 'htmldiff':
- $prev = $this->getPrev();
-
- if ($prev) {
- if ($this->isExisting()) {
- $src1 = new MediaFile($this->getId(), $prev);
- $src2 = new MediaFile($this->getId());
- } else {
- $src1 = new MediaFile($this->getId(), $prev);
- $src2 = null;
- }
- } else {
- $src1 = null;
- $src2 = new MediaFile($this->getId());
- }
- return $this->createDiffTable($src1, $src2);
-
- case 'abstract':
- case 'html':
- default:
- $src = new Display(new MediaFile($this->getId()));
- return $this->cleanHTML($src->getPreviewHtml(500, 500));
- }
- }
-
- /**
- * @inheritdoc
- * @todo read exif keywords
- */
- public function getCategory()
- {
- return (array)getNS($this->getId());
- }
-
- /**
- * Get the revision timestamp of this page
- *
- * 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 page does not exist, we need to
- * determine the revision from the changelog.
- * @return int
- */
- public function getRev()
- {
- $rev = parent::getRev();
- if ($rev) return $rev;
-
- if (media_exists($this->id)) {
- $this->data['rev'] = filemtime(mediaFN($this->id));
- $this->data['exists'] = true;
- } else {
- $this->loadRevisions();
- }
- return $this->data['rev'];
- }
-
- /**
- * Get the previous revision timestamp of this page
- *
- * @return int|null The previous revision or null if there is none
- */
- public function getPrev()
- {
- if ($this->data['prev'] ?? 0) return $this->data['prev'];
- $this->loadRevisions();
- return $this->data['prev'];
- }
-
- /**
- * Does this page exist?
- *
- * @return bool
- */
- public function isExisting()
- {
- if (!isset($this->data['exists'])) {
- $this->data['exists'] = media_exists($this->id);
- }
- return $this->data['exists'];
- }
-
- /**
- * Load the current and previous revision from the changelog
- * @return void
- */
- protected function loadRevisions()
- {
- $changelog = new MediaChangeLog($this->id);
- $revs = $changelog->getRevisions(0, 2); // FIXME check that this returns the current one correctly
- if (!isset($this->data['rev'])) {
- // prefer an already set date, only set if missing
- // it should usally not happen that neither is available
- $this->data['rev'] = $revs[0] ?? 0;
- }
- // a previous revision might not exist
- $this->data['prev'] = $revs[1] ?? null;
- }
-
- /**
- * Create a table showing the two media files
- *
- * @param MediaFile|null $src1
- * @param MediaFile|null $src2
- * @return string
- */
- protected function createDiffTable($src1, $src2)
- {
- global $lang;
-
- $content = '<table>';
- $content .= '<tr>';
- $content .= '<th width="50%">' . ($src1 ? $src1->getRev() : '') . '</th>';
- $content .= '<th width="50%">' . $lang['current'] . '</th>';
- $content .= '</tr>';
- $content .= '<tr>';
-
- $content .= '<td align="center">';
- if ($src1) {
- $display = new Display($src1);
- $display->getPreviewHtml(300, 300);
- }
- $content .= '</td>';
-
- $content .= '<td align="center">';
- if ($src2) {
- $display = new Display($src2);
- $display->getPreviewHtml(300, 300);
- }
- $content .= '</td>';
-
- $content .= '</tr>';
- $content .= '</table>';
-
- return $this->cleanHTML($content);
- }
- }
|