| 
							- <?php
 - 
 - namespace dokuwiki\Ui;
 - 
 - use dokuwiki\ChangeLog\MediaChangeLog;
 - use dokuwiki\ChangeLog\RevisionInfo;
 - use dokuwiki\Form\Form;
 - use InvalidArgumentException;
 - use JpegMeta;
 - 
 - /**
 -  * DokuWiki MediaDiff Interface
 -  *
 -  * @package dokuwiki\Ui
 -  */
 - class MediaDiff extends Diff
 - {
 -     /* @var MediaChangeLog */
 -     protected $changelog;
 - 
 -     /* @var RevisionInfo older revision */
 -     protected $RevInfo1;
 -     /* @var RevisionInfo newer revision */
 -     protected $RevInfo2;
 - 
 -     /* @var bool */
 -     protected $is_img;
 - 
 -     /**
 -      * MediaDiff Ui constructor
 -      *
 -      * @param string $id media id
 -      */
 -     public function __construct($id)
 -     {
 -         if (!isset($id)) {
 -             throw new InvalidArgumentException('media id should not be empty!');
 -         }
 - 
 -         // init preference
 -         $this->preference['fromAjax'] = false;  // see dokuwiki\Ajax::callMediadiff()
 -         $this->preference['showIntro'] = false;
 -         $this->preference['difftype'] = 'both'; // diff view type: both, opacity or portions
 - 
 -         parent::__construct($id);
 -     }
 - 
 -     /** @inheritdoc */
 -     protected function setChangeLog()
 -     {
 -         $this->changelog = new MediaChangeLog($this->id);
 -     }
 - 
 -     /**
 -      * Handle requested revision(s) and diff view preferences
 -      *
 -      * @return void
 -      */
 -     protected function handle()
 -     {
 -         global $INPUT;
 - 
 -         // retrieve requested rev or rev2
 -         parent::handle();
 - 
 -         // requested diff view type
 -         if ($INPUT->has('difftype')) {
 -             $this->preference['difftype'] = $INPUT->str('difftype');
 -         }
 -     }
 - 
 -     /**
 -      * Prepare revision info of comparison pair
 -      */
 -     protected function preProcess()
 -     {
 -         $changelog =& $this->changelog;
 - 
 -         // create revision info object for older and newer sides
 -         // RevInfo1 : older, left side
 -         // RevInfo2 : newer, right side
 - 
 -         $changelogRev1 = $changelog->getRevisionInfo($this->rev1);
 -         $changelogRev2 = $changelog->getRevisionInfo($this->rev2);
 - 
 -         $this->RevInfo1 = new RevisionInfo($changelogRev1);
 -         $this->RevInfo2 = new RevisionInfo($changelogRev2);
 - 
 -         $this->is_img = preg_match('/\.(jpe?g|gif|png)$/', $this->id);
 - 
 -         foreach ([$this->RevInfo1, $this->RevInfo2] as $RevInfo) {
 -             $isCurrent = $changelog->isCurrentRevision($RevInfo->val('date'));
 -             $RevInfo->isCurrent($isCurrent);
 - 
 -             if ($this->is_img) {
 -                 $rev = $isCurrent ? '' : $RevInfo->val('date');
 -                 $meta = new JpegMeta(mediaFN($this->id, $rev));
 -                 // get image width and height for the media manager preview panel
 -                 $RevInfo->append([
 -                     'previewSize' => media_image_preview_size($this->id, $rev, $meta)
 -                 ]);
 -             }
 -         }
 - 
 -         // re-check image, ensure minimum image width for showImageDiff()
 -         $this->is_img = ($this->is_img
 -             && ($this->RevInfo1->val('previewSize')[0] ?? 0) >= 30
 -             && ($this->RevInfo2->val('previewSize')[0] ?? 0) >= 30
 -         );
 -         // adjust requested diff view type
 -         if (!$this->is_img) {
 -             $this->preference['difftype'] = 'both';
 -         }
 -     }
 - 
 - 
 -     /**
 -      * Shows difference between two revisions of media
 -      *
 -      * @author Kate Arzamastseva <pshns@ukr.net>
 -      */
 -     public function show()
 -     {
 -         global $conf;
 - 
 -         $ns = getNS($this->id);
 -         $auth = auth_quickaclcheck("$ns:*");
 - 
 -         if ($auth < AUTH_READ || !$this->id || !$conf['mediarevisions']) return;
 - 
 -         // retrieve form parameters: rev, rev2, difftype
 -         $this->handle();
 -         // prepare revision info of comparison pair
 -         $this->preProcess();
 - 
 -         // display intro
 -         if ($this->preference['showIntro']) echo p_locale_xhtml('diff');
 - 
 -         // print form to choose diff view type
 -         if ($this->is_img && !$this->preference['fromAjax']) {
 -             $this->showDiffViewSelector();
 -             echo '<div id="mediamanager__diff" >';
 -         }
 - 
 -         switch ($this->preference['difftype']) {
 -             case 'opacity':
 -             case 'portions':
 -                 $this->showImageDiff();
 -                 break;
 -             case 'both':
 -             default:
 -                 $this->showFileDiff();
 -                 break;
 -         }
 - 
 -         if ($this->is_img && !$this->preference['fromAjax']) {
 -             echo '</div>';
 -         }
 -     }
 - 
 -     /**
 -      * Print form to choose diff view type
 -      * the dropdown is to be added through JavaScript, see lib/scripts/media.js
 -      */
 -     protected function showDiffViewSelector()
 -     {
 -         // use timestamp for current revision, date may be false when revisions < 2
 -         [$rev1, $rev2] = [(int)$this->RevInfo1->val('date'), (int)$this->RevInfo2->val('date')];
 - 
 -         echo '<div class="diffoptions group">';
 - 
 -         $form = new Form([
 -             'id' => 'mediamanager__form_diffview',
 -             'action' => media_managerURL([], '&'),
 -             'method' => 'get',
 -             'class' => 'diffView',
 -         ]);
 -         $form->addTagOpen('div')->addClass('no');
 -         $form->setHiddenField('sectok', null);
 -         $form->setHiddenField('mediado', 'diff');
 -         $form->setHiddenField('rev2[0]', $rev1);
 -         $form->setHiddenField('rev2[1]', $rev2);
 -         $form->addTagClose('div');
 -         echo $form->toHTML();
 - 
 -         echo '</div>'; // .diffoptions
 -     }
 - 
 -     /**
 -      * Prints two images side by side
 -      * and slider
 -      *
 -      * @author Kate Arzamastseva <pshns@ukr.net>
 -      */
 -     protected function showImageDiff()
 -     {
 -         $rev1 = $this->RevInfo1->isCurrent() ? '' : $this->RevInfo1->val('date');
 -         $rev2 = $this->RevInfo2->isCurrent() ? '' : $this->RevInfo2->val('date');
 - 
 -         // diff view type: opacity or portions
 -         $type = $this->preference['difftype'];
 - 
 -         // adjust image width, right side (newer) has priority
 -         $rev1Size = $this->RevInfo1->val('previewSize');
 -         $rev2Size = $this->RevInfo2->val('previewSize');
 -         if ($rev1Size != $rev2Size) {
 -             if ($rev2Size[0] > $rev1Size[0]) {
 -                 $rev1Size = $rev2Size;
 -             }
 -         }
 - 
 -         $rev1Src = ml($this->id, ['rev' => $rev1, 'h' => $rev1Size[1], 'w' => $rev1Size[0]]);
 -         $rev2Src = ml($this->id, ['rev' => $rev2, 'h' => $rev1Size[1], 'w' => $rev1Size[0]]);
 - 
 -         // slider
 -         echo '<div class="slider" style="max-width: ' . ($rev1Size[0] - 20) . 'px;" ></div>';
 - 
 -         // two images in divs
 -         echo '<div class="imageDiff ' . $type . '">';
 -         echo '<div class="image1" style="max-width: ' . $rev1Size[0] . 'px;">';
 -         echo '<img src="' . $rev1Src . '" alt="" />';
 -         echo '</div>';
 -         echo '<div class="image2" style="max-width: ' . $rev1Size[0] . 'px;">';
 -         echo '<img src="' . $rev2Src . '" alt="" />';
 -         echo '</div>';
 -         echo '</div>';
 -     }
 - 
 -     /**
 -      * Shows difference between two revisions of media file
 -      *
 -      * @author Kate Arzamastseva <pshns@ukr.net>
 -      */
 -     protected function showFileDiff()
 -     {
 -         global $lang;
 - 
 -         $ns = getNS($this->id);
 -         $auth = auth_quickaclcheck("$ns:*");
 - 
 -         $rev1 = $this->RevInfo1->isCurrent() ? '' : (int)$this->RevInfo1->val('date');
 -         $rev2 = $this->RevInfo2->isCurrent() ? '' : (int)$this->RevInfo2->val('date');
 - 
 -         // revision title
 -         $rev1Title = trim($this->RevInfo1->showRevisionTitle() . ' ' . $this->RevInfo1->showCurrentIndicator());
 -         $rev1Summary = ($this->RevInfo1->val('date'))
 -             ? $this->RevInfo1->showEditSummary() . ' ' . $this->RevInfo1->showEditor()
 -             : '';
 -         $rev2Title = trim($this->RevInfo2->showRevisionTitle() . ' ' . $this->RevInfo2->showCurrentIndicator());
 -         $rev2Summary = ($this->RevInfo2->val('date'))
 -             ? $this->RevInfo2->showEditSummary() . ' ' . $this->RevInfo2->showEditor()
 -             : '';
 - 
 -         $rev1Meta = new JpegMeta(mediaFN($this->id, $rev1));
 -         $rev2Meta = new JpegMeta(mediaFN($this->id, $rev2));
 - 
 -         // display diff view table
 -         echo '<div class="table">';
 -         echo '<table>';
 -         echo '<tr>';
 -         echo '<th>' . $rev1Title . ' ' . $rev1Summary . '</th>';
 -         echo '<th>' . $rev2Title . ' ' . $rev2Summary . '</th>';
 -         echo '</tr>';
 - 
 -         echo '<tr class="image">';
 -         echo '<td>';
 -         media_preview($this->id, $auth, $rev1, $rev1Meta); // $auth not used in media_preview()?
 -         echo '</td>';
 - 
 -         echo '<td>';
 -         media_preview($this->id, $auth, $rev2, $rev2Meta);
 -         echo '</td>';
 -         echo '</tr>';
 - 
 -         echo '<tr class="actions">';
 -         echo '<td>';
 -         media_preview_buttons($this->id, $auth, $rev1); // $auth used in media_preview_buttons()
 -         echo '</td>';
 - 
 -         echo '<td>';
 -         media_preview_buttons($this->id, $auth, $rev2);
 -         echo '</td>';
 -         echo '</tr>';
 - 
 -         $rev1Tags = media_file_tags($rev1Meta);
 -         $rev2Tags = media_file_tags($rev2Meta);
 -         // FIXME rev2Tags-only stuff ignored
 -         foreach ($rev1Tags as $key => $tag) {
 -             if ($tag['value'] != $rev2Tags[$key]['value']) {
 -                 $rev2Tags[$key]['highlighted'] = true;
 -                 $rev1Tags[$key]['highlighted'] = true;
 -             } elseif (!$tag['value'] || !$rev2Tags[$key]['value']) {
 -                 unset($rev2Tags[$key]);
 -                 unset($rev1Tags[$key]);
 -             }
 -         }
 - 
 -         echo '<tr>';
 -         foreach ([$rev1Tags, $rev2Tags] as $tags) {
 -             echo '<td>';
 - 
 -             echo '<dl class="img_tags">';
 -             foreach ($tags as $tag) {
 -                 $value = cleanText($tag['value']);
 -                 if (!$value) $value = '-';
 -                 echo '<dt>' . $lang[$tag['tag'][1]] . '</dt>';
 -                 echo '<dd>';
 -                 if (!empty($tag['highlighted'])) echo '<strong>';
 -                 if ($tag['tag'][2] == 'date') {
 -                     echo dformat($value);
 -                 } else {
 -                     echo hsc($value);
 -                 }
 -                 if (!empty($tag['highlighted'])) echo '</strong>';
 -                 echo '</dd>';
 -             }
 -             echo '</dl>';
 - 
 -             echo '</td>';
 -         }
 -         echo '</tr>';
 - 
 -         echo '</table>';
 -         echo '</div>';
 -     }
 - }
 
 
  |