[ Index ]

PHP Cross Reference of DokuWiki

title

Body

[close]

/inc/Feed/ -> FeedMediaProcessor.php (source)

   1  <?php
   2  
   3  namespace dokuwiki\Feed;
   4  
   5  use dokuwiki\ChangeLog\MediaChangeLog;
   6  use dokuwiki\File\MediaFile;
   7  use dokuwiki\Ui\Media\Display;
   8  
   9  class FeedMediaProcessor extends FeedItemProcessor
  10  {
  11      /** @inheritdoc */
  12      public function getURL($linkto)
  13      {
  14          $opt = match ($linkto) {
  15              'page' => [
  16                  'image' => $this->getId(),
  17                  'ns' => getNS($this->getId()),
  18                  'rev' => $this->getRev()
  19              ],
  20              'rev' => [
  21                  'image' => $this->getId(),
  22                  'ns' => getNS($this->getId()),
  23                  'rev' => $this->getRev(),
  24                  'tab_details' => 'history'
  25              ],
  26              'current' => [
  27                  'image' => $this->getId(),
  28                  'ns' => getNS($this->getId())
  29              ],
  30              default => [
  31                  'image' => $this->getId(),
  32                  'ns' => getNS($this->getId()),
  33                  'rev' => $this->getRev(),
  34                  'tab_details' => 'history',
  35                  'media_do' => 'diff'
  36              ],
  37          };
  38  
  39          return media_managerURL($opt, '&', true);
  40      }
  41  
  42      public function getBody($content)
  43      {
  44          switch ($content) {
  45              case 'diff':
  46              case 'htmldiff':
  47                  $prev = $this->getPrev();
  48  
  49                  if ($prev) {
  50                      if ($this->isExisting()) {
  51                          $src1 = new MediaFile($this->getId(), $prev);
  52                          $src2 = new MediaFile($this->getId());
  53                      } else {
  54                          $src1 = new MediaFile($this->getId(), $prev);
  55                          $src2 = null;
  56                      }
  57                  } else {
  58                      $src1 = null;
  59                      $src2 = new MediaFile($this->getId());
  60                  }
  61                  return $this->createDiffTable($src1, $src2);
  62  
  63              case 'abstract':
  64              case 'html':
  65              default:
  66                  $src = new Display(new MediaFile($this->getId()));
  67                  return $this->cleanHTML($src->getPreviewHtml(500, 500));
  68          }
  69      }
  70  
  71      /**
  72       * @inheritdoc
  73       * @todo read exif keywords
  74       */
  75      public function getCategory()
  76      {
  77          return (array)getNS($this->getId());
  78      }
  79  
  80      /**
  81       * Get the revision timestamp of this page
  82       *
  83       * Note: we only handle most current revisions in feeds, so the revision is usually just the
  84       * lastmodifed timestamp of the page file. However, if the page does not exist, we need to
  85       * determine the revision from the changelog.
  86       * @return int
  87       */
  88      public function getRev()
  89      {
  90          $rev = parent::getRev();
  91          if ($rev) return $rev;
  92  
  93          if (media_exists($this->id)) {
  94              $this->data['rev'] = filemtime(mediaFN($this->id));
  95              $this->data['exists'] = true;
  96          } else {
  97              $this->loadRevisions();
  98          }
  99          return $this->data['rev'];
 100      }
 101  
 102      /**
 103       * Get the previous revision timestamp of this page
 104       *
 105       * @return int|null The previous revision or null if there is none
 106       */
 107      public function getPrev()
 108      {
 109          if ($this->data['prev'] ?? 0) return $this->data['prev'];
 110          $this->loadRevisions();
 111          return $this->data['prev'];
 112      }
 113  
 114      /**
 115       * Does this page exist?
 116       *
 117       * @return bool
 118       */
 119      public function isExisting()
 120      {
 121          if (!isset($this->data['exists'])) {
 122              $this->data['exists'] = media_exists($this->id);
 123          }
 124          return $this->data['exists'];
 125      }
 126  
 127      /**
 128       * Load the current and previous revision from the changelog
 129       * @return void
 130       */
 131      protected function loadRevisions()
 132      {
 133          $changelog = new MediaChangeLog($this->id);
 134          $revs = $changelog->getRevisions(-1, 2);
 135          if (!isset($this->data['rev'])) {
 136              // prefer an already set date, only set if missing
 137              // it should usally not happen that neither is available
 138              $this->data['rev'] = $revs[0] ?? 0;
 139          }
 140          // a previous revision might not exist
 141          $this->data['prev'] = $revs[1] ?? null;
 142      }
 143  
 144      /**
 145       * Create a table showing the two media files
 146       *
 147       * @param MediaFile|null $src1
 148       * @param MediaFile|null $src2
 149       * @return string
 150       */
 151      protected function createDiffTable($src1, $src2)
 152      {
 153          global $lang;
 154  
 155          $content = '<table>';
 156          $content .= '<tr>';
 157          $content .= '<th width="50%">' . ($src1 ? $src1->getRev() : '') . '</th>';
 158          $content .= '<th width="50%">' . $lang['current'] . '</th>';
 159          $content .= '</tr>';
 160          $content .= '<tr>';
 161  
 162          $content .= '<td align="center">';
 163          if ($src1) {
 164              $display = new Display($src1);
 165              $display->getPreviewHtml(300, 300);
 166          }
 167          $content .= '</td>';
 168  
 169          $content .= '<td align="center">';
 170          if ($src2) {
 171              $display = new Display($src2);
 172              $display->getPreviewHtml(300, 300);
 173          }
 174          $content .= '</td>';
 175  
 176          $content .= '</tr>';
 177          $content .= '</table>';
 178  
 179          return $this->cleanHTML($content);
 180      }
 181  }