$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 = ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= ''; $content .= '
' . ($src1 ? $src1->getRev() : '') . '' . $lang['current'] . '
'; if ($src1) { $display = new Display($src1); $display->getPreviewHtml(300, 300); } $content .= ''; if ($src2) { $display = new Display($src2); $display->getPreviewHtml(300, 300); } $content .= '
'; return $this->cleanHTML($content); } }