163ab9afeSSatoshi Sahara<?php 263ab9afeSSatoshi Sahara 363ab9afeSSatoshi Saharanamespace dokuwiki\Ui; 463ab9afeSSatoshi Sahara 563ab9afeSSatoshi Saharause dokuwiki\ChangeLog\MediaChangeLog; 663ab9afeSSatoshi Saharause dokuwiki\Extension\Event; 763ab9afeSSatoshi Saharause dokuwiki\Form\Form; 863ab9afeSSatoshi Sahara 963ab9afeSSatoshi Sahara/** 1063ab9afeSSatoshi Sahara * DokuWiki MediaDiff Interface 1163ab9afeSSatoshi Sahara * 1263ab9afeSSatoshi Sahara * @package dokuwiki\Ui 1363ab9afeSSatoshi Sahara */ 1463ab9afeSSatoshi Saharaclass MediaDiff extends Diff 1563ab9afeSSatoshi Sahara{ 1663ab9afeSSatoshi Sahara /** 1763ab9afeSSatoshi Sahara * MediaDiff Ui constructor 1863ab9afeSSatoshi Sahara * 19edb50e6aSSatoshi Sahara * @param string $id media id 2063ab9afeSSatoshi Sahara */ 21edb50e6aSSatoshi Sahara public function __construct($id) 2263ab9afeSSatoshi Sahara { 2363ab9afeSSatoshi Sahara $this->id = $id; 24edb50e6aSSatoshi Sahara 25edb50e6aSSatoshi Sahara $this->preference['fromAjax'] = false; // see doluwiki\Ajax::callMediadiff() 26edb50e6aSSatoshi Sahara $this->preference['showIntro'] = false; 27675f74fbSSatoshi Sahara $this->preference['difftype'] = null; // both, opacity or portions. 28*8068440fSSatoshi Sahara 29*8068440fSSatoshi Sahara $this->setChangeLog(); 30*8068440fSSatoshi Sahara } 31*8068440fSSatoshi Sahara 32*8068440fSSatoshi Sahara /** @inheritdoc */ 33*8068440fSSatoshi Sahara protected function setChangeLog() 34*8068440fSSatoshi Sahara { 35*8068440fSSatoshi Sahara $this->changelog = new MediaChangeLog($this->id); 3663ab9afeSSatoshi Sahara } 3763ab9afeSSatoshi Sahara 38b4b4c5c6SSatoshi Sahara /** @inheritdoc */ 39b4b4c5c6SSatoshi Sahara protected function preProcess() 40b4b4c5c6SSatoshi Sahara { 41b4b4c5c6SSatoshi Sahara parent::preProcess(); 42b4b4c5c6SSatoshi Sahara if (!isset($this->old_rev, $this->new_rev)) { 43b4b4c5c6SSatoshi Sahara // no revision was given, compare previous to current 44*8068440fSSatoshi Sahara $revs = $this->changelog->getRevisions(0, 1); 45b4b4c5c6SSatoshi Sahara $this->old_rev = file_exists(mediaFN($this->id, $revs[0])) ? $revs[0] : ''; 46b4b4c5c6SSatoshi Sahara $this->new_rev = ''; 47b4b4c5c6SSatoshi Sahara } 48b4b4c5c6SSatoshi Sahara } 49b4b4c5c6SSatoshi Sahara 5063ab9afeSSatoshi Sahara /** 5163ab9afeSSatoshi Sahara * Shows difference between two revisions of media 52675f74fbSSatoshi Sahara * 53675f74fbSSatoshi Sahara * @author Kate Arzamastseva <pshns@ukr.net> 54675f74fbSSatoshi Sahara * @param string $difftype diff view type for media (both, opacity or portions) 5563ab9afeSSatoshi Sahara */ 56675f74fbSSatoshi Sahara public function show($difftype = null) 5763ab9afeSSatoshi Sahara { 58675f74fbSSatoshi Sahara global $conf; 59675f74fbSSatoshi Sahara 6063ab9afeSSatoshi Sahara $ns = getNS($this->id); 6163ab9afeSSatoshi Sahara $auth = auth_quickaclcheck("$ns:*"); 62675f74fbSSatoshi Sahara 63675f74fbSSatoshi Sahara if ($auth < AUTH_READ || !$this->id || !$conf['mediarevisions']) return ''; 64675f74fbSSatoshi Sahara 65675f74fbSSatoshi Sahara // determine left and right revision 66b4b4c5c6SSatoshi Sahara $this->preProcess(); 67b4b4c5c6SSatoshi Sahara [$l_rev, $r_rev] = [$this->old_rev, $this->new_rev]; 68675f74fbSSatoshi Sahara 69675f74fbSSatoshi Sahara // prepare event data 70675f74fbSSatoshi Sahara // NOTE: MEDIA_DIFF event does not found in DokuWiki Event List? 71675f74fbSSatoshi Sahara $data = array(); 72675f74fbSSatoshi Sahara $data[0] = $this->id; 73675f74fbSSatoshi Sahara $data[1] = $l_rev; 74675f74fbSSatoshi Sahara $data[2] = $r_rev; 75675f74fbSSatoshi Sahara $data[3] = $ns; 76675f74fbSSatoshi Sahara $data[4] = $auth; // permission level 77675f74fbSSatoshi Sahara $data[5] = $this->preference['fromAjax']; 78675f74fbSSatoshi Sahara 79675f74fbSSatoshi Sahara // trigger event 80675f74fbSSatoshi Sahara Event::createAndTrigger('MEDIA_DIFF', $data, null, false); 81675f74fbSSatoshi Sahara 82675f74fbSSatoshi Sahara if (is_array($data) && count($data) === 6) { 83675f74fbSSatoshi Sahara $this->id = $data[0]; 84675f74fbSSatoshi Sahara $l_rev = $data[1]; 85675f74fbSSatoshi Sahara $r_rev = $data[2]; 86675f74fbSSatoshi Sahara $ns = $data[3]; 87675f74fbSSatoshi Sahara $auth = $data[4]; 88675f74fbSSatoshi Sahara $this->preference['fromAjax'] = $data[5]; 89675f74fbSSatoshi Sahara } else { 90675f74fbSSatoshi Sahara return ''; 91675f74fbSSatoshi Sahara } 92675f74fbSSatoshi Sahara 93675f74fbSSatoshi Sahara $l_meta = new \JpegMeta(mediaFN($this->id, $l_rev)); 94675f74fbSSatoshi Sahara $r_meta = new \JpegMeta(mediaFN($this->id, $r_rev)); 95675f74fbSSatoshi Sahara 96675f74fbSSatoshi Sahara $is_img = preg_match('/\.(jpe?g|gif|png)$/', $this->id); 97675f74fbSSatoshi Sahara if ($is_img) { 98675f74fbSSatoshi Sahara // get image width and height for the mediamanager preview panel 99675f74fbSSatoshi Sahara $l_size = media_image_preview_size($this->id, $l_rev, $l_meta); 100675f74fbSSatoshi Sahara $r_size = media_image_preview_size($this->id, $r_rev, $r_meta); 101675f74fbSSatoshi Sahara // re-check image, ensure minimum image width for showImageDiff() 102675f74fbSSatoshi Sahara $is_img = ($l_size && $r_size && ($l_size[0] >= 30 || $r_size[0] >= 30)); 103675f74fbSSatoshi Sahara } 104675f74fbSSatoshi Sahara 105675f74fbSSatoshi Sahara // determine requested diff view type 106675f74fbSSatoshi Sahara $difftype = $this->getDiffType($difftype); 107675f74fbSSatoshi Sahara 108675f74fbSSatoshi Sahara // display intro 109675f74fbSSatoshi Sahara if ($this->preference['showIntro']) echo p_locale_xhtml('diff'); 110675f74fbSSatoshi Sahara 111675f74fbSSatoshi Sahara // print form to choose diff view type 112675f74fbSSatoshi Sahara if ($is_img && !$this->preference['fromAjax']) { 113675f74fbSSatoshi Sahara $this->showDiffViewSelector($l_rev, $r_rev); 114675f74fbSSatoshi Sahara echo '<div id="mediamanager__diff" >'; 115675f74fbSSatoshi Sahara } 116675f74fbSSatoshi Sahara 117675f74fbSSatoshi Sahara if ($is_img) { 118675f74fbSSatoshi Sahara switch ($difftype) { 119675f74fbSSatoshi Sahara case 'opacity': 120675f74fbSSatoshi Sahara case 'portions': 121675f74fbSSatoshi Sahara $this->showImageDiff($l_rev, $r_rev, $l_size, $r_size, $difftype); 122675f74fbSSatoshi Sahara break; 123675f74fbSSatoshi Sahara case 'both': 124675f74fbSSatoshi Sahara default: 125675f74fbSSatoshi Sahara $this->showFileDiff($l_rev, $r_rev, $l_meta, $r_meta, $auth); 126675f74fbSSatoshi Sahara break; 127675f74fbSSatoshi Sahara } 128675f74fbSSatoshi Sahara } else { 129675f74fbSSatoshi Sahara $this->showFileDiff($l_rev, $r_rev, $l_meta, $r_meta, $auth); 130675f74fbSSatoshi Sahara } 131675f74fbSSatoshi Sahara 132675f74fbSSatoshi Sahara if ($is_img && !$this->preference['fromAjax']) { 133675f74fbSSatoshi Sahara echo '</div>'; 134675f74fbSSatoshi Sahara } 1352db397b2SSatoshi Sahara } 1362db397b2SSatoshi Sahara 1372db397b2SSatoshi Sahara /** 138675f74fbSSatoshi Sahara * Determine requested diff view type for media 1392db397b2SSatoshi Sahara * 140675f74fbSSatoshi Sahara * @param string $mode diff view type (both, opacity or portions) 141675f74fbSSatoshi Sahara * @return string 1422db397b2SSatoshi Sahara */ 143675f74fbSSatoshi Sahara protected function getDiffType($mode = null) 1442db397b2SSatoshi Sahara { 1452db397b2SSatoshi Sahara global $INPUT; 146675f74fbSSatoshi Sahara $difftype =& $this->preference['difftype']; 1472db397b2SSatoshi Sahara 148675f74fbSSatoshi Sahara if (!isset($mode)) { 149675f74fbSSatoshi Sahara $difftype = $INPUT->str('difftype'); 150675f74fbSSatoshi Sahara } elseif (in_array($mode, ['both', 'opacity', 'portions'])) { 151675f74fbSSatoshi Sahara $difftype = $mode; 152675f74fbSSatoshi Sahara } 153675f74fbSSatoshi Sahara return $this->preference['difftype']; 154675f74fbSSatoshi Sahara } 155675f74fbSSatoshi Sahara 156675f74fbSSatoshi Sahara /** 157675f74fbSSatoshi Sahara * Print form to choose diff view type 158675f74fbSSatoshi Sahara * the dropdown is to be added through JavaScript, see lib/scripts/media.js 1592db397b2SSatoshi Sahara * 160675f74fbSSatoshi Sahara * @param int $l_rev revision timestamp of left side 161675f74fbSSatoshi Sahara * @param int $r_rev revision timestamp of right side 1622db397b2SSatoshi Sahara */ 163675f74fbSSatoshi Sahara protected function showDiffViewSelector($l_rev, $r_rev) 1642db397b2SSatoshi Sahara { 1652db397b2SSatoshi Sahara $form = new Form([ 1662db397b2SSatoshi Sahara 'id' => 'mediamanager__form_diffview', 1672db397b2SSatoshi Sahara 'action' => media_managerURL([], '&'), 1682db397b2SSatoshi Sahara 'method' => 'get', 1692db397b2SSatoshi Sahara 'class' => 'diffView', 1702db397b2SSatoshi Sahara ]); 1712db397b2SSatoshi Sahara $form->addTagOpen('div')->addClass('no'); 1722db397b2SSatoshi Sahara $form->setHiddenField('sectok', null); 1732db397b2SSatoshi Sahara $form->setHiddenField('mediado', 'diff'); 17458c5cb81SSatoshi Sahara $form->setHiddenField('rev2[0]', $l_rev ?: 'current'); 17558c5cb81SSatoshi Sahara $form->setHiddenField('rev2[1]', $r_rev ?: 'current'); 1762db397b2SSatoshi Sahara $form->addTagClose('div'); 1772db397b2SSatoshi Sahara echo $form->toHTML(); 1782db397b2SSatoshi Sahara } 1792db397b2SSatoshi Sahara 180675f74fbSSatoshi Sahara /** 181675f74fbSSatoshi Sahara * Prints two images side by side 182675f74fbSSatoshi Sahara * and slider 183675f74fbSSatoshi Sahara * 184675f74fbSSatoshi Sahara * @author Kate Arzamastseva <pshns@ukr.net> 185675f74fbSSatoshi Sahara * 186675f74fbSSatoshi Sahara * @param int $l_rev revision timestamp, or empty string 187675f74fbSSatoshi Sahara * @param int $r_rev revision timestamp, or empty string 188675f74fbSSatoshi Sahara * @param array $l_size array with width and height 189675f74fbSSatoshi Sahara * @param array $r_size array with width and height 190675f74fbSSatoshi Sahara * @param string $type diff type: opacity or portions 191675f74fbSSatoshi Sahara */ 192675f74fbSSatoshi Sahara protected function showImageDiff($l_rev, $r_rev, $l_size, $r_size, $type = null) 193675f74fbSSatoshi Sahara { 194675f74fbSSatoshi Sahara if (!isset($type)) { 195675f74fbSSatoshi Sahara $type = $this->preference['difftype']; 196675f74fbSSatoshi Sahara } 197675f74fbSSatoshi Sahara 198675f74fbSSatoshi Sahara // adjust image width, right side (newer) has priority 199675f74fbSSatoshi Sahara if ($l_size != $r_size) { 200675f74fbSSatoshi Sahara if ($r_size[0] > $l_size[0]) { 201675f74fbSSatoshi Sahara $l_size = $r_size; 2022db397b2SSatoshi Sahara } 2032db397b2SSatoshi Sahara } 2042db397b2SSatoshi Sahara 205675f74fbSSatoshi Sahara $l_src = ml($this->id, ['rev' => $l_rev, 'h' => $l_size[1], 'w' => $l_size[0]]); 206675f74fbSSatoshi Sahara $r_src = ml($this->id, ['rev' => $r_rev, 'h' => $l_size[1], 'w' => $l_size[0]]); 207675f74fbSSatoshi Sahara 208675f74fbSSatoshi Sahara // slider 209675f74fbSSatoshi Sahara echo '<div class="slider" style="max-width: '.($l_size[0]-20).'px;" ></div>'; 210675f74fbSSatoshi Sahara 211675f74fbSSatoshi Sahara // two images in divs 212675f74fbSSatoshi Sahara echo '<div class="imageDiff '.$type.'">'; 213675f74fbSSatoshi Sahara echo '<div class="image1" style="max-width: '.$l_size[0].'px;">'; 214675f74fbSSatoshi Sahara echo '<img src="'.$l_src.'" alt="" />'; 215675f74fbSSatoshi Sahara echo '</div>'; 216675f74fbSSatoshi Sahara echo '<div class="image2" style="max-width: '.$l_size[0].'px;">'; 217675f74fbSSatoshi Sahara echo '<img src="'.$r_src.'" alt="" />'; 218675f74fbSSatoshi Sahara echo '</div>'; 219675f74fbSSatoshi Sahara echo '</div>'; 220675f74fbSSatoshi Sahara } 221675f74fbSSatoshi Sahara 222675f74fbSSatoshi Sahara /** 223675f74fbSSatoshi Sahara * Shows difference between two revisions of media file 224675f74fbSSatoshi Sahara * 225675f74fbSSatoshi Sahara * @author Kate Arzamastseva <pshns@ukr.net> 226675f74fbSSatoshi Sahara * 227675f74fbSSatoshi Sahara * @param string|int $l_rev revision timestamp, or empty string 228675f74fbSSatoshi Sahara * @param string|int $r_rev revision timestamp, or empty string 229675f74fbSSatoshi Sahara * @param JpegMeta $l_meta 230675f74fbSSatoshi Sahara * @param JpegMeta $r_meta 231675f74fbSSatoshi Sahara * @param int $auth permission level 232675f74fbSSatoshi Sahara */ 233675f74fbSSatoshi Sahara protected function showFileDiff($l_rev, $r_rev, $l_meta, $r_meta, $auth) 234675f74fbSSatoshi Sahara { 235*8068440fSSatoshi Sahara list($l_head, $r_head) = $this->buildDiffHead($l_rev, $r_rev); 2362db397b2SSatoshi Sahara 2372db397b2SSatoshi Sahara echo '<div class="table">'; 2382db397b2SSatoshi Sahara echo '<table>'; 2392db397b2SSatoshi Sahara echo '<tr>'; 2402db397b2SSatoshi Sahara echo '<th>'. $l_head .'</th>'; 2412db397b2SSatoshi Sahara echo '<th>'. $r_head .'</th>'; 242675f74fbSSatoshi Sahara echo '</tr>'; 2432db397b2SSatoshi Sahara 2442db397b2SSatoshi Sahara echo '<tr class="image">'; 2452db397b2SSatoshi Sahara echo '<td>'; 246675f74fbSSatoshi Sahara media_preview($this->id, $auth, $l_rev, $l_meta); // $auth not used in media_preview()? 2472db397b2SSatoshi Sahara echo '</td>'; 2482db397b2SSatoshi Sahara 2492db397b2SSatoshi Sahara echo '<td>'; 250675f74fbSSatoshi Sahara media_preview($this->id, $auth, $r_rev, $r_meta); 2512db397b2SSatoshi Sahara echo '</td>'; 252675f74fbSSatoshi Sahara echo '</tr>'; 2532db397b2SSatoshi Sahara 2542db397b2SSatoshi Sahara echo '<tr class="actions">'; 2552db397b2SSatoshi Sahara echo '<td>'; 256675f74fbSSatoshi Sahara media_preview_buttons($this->id, $auth, $l_rev); // $auth used in media_preview_buttons() 2572db397b2SSatoshi Sahara echo '</td>'; 2582db397b2SSatoshi Sahara 2592db397b2SSatoshi Sahara echo '<td>'; 260675f74fbSSatoshi Sahara media_preview_buttons($this->id, $auth, $r_rev); 2612db397b2SSatoshi Sahara echo '</td>'; 262675f74fbSSatoshi Sahara echo '</tr>'; 2632db397b2SSatoshi Sahara 2642db397b2SSatoshi Sahara $l_tags = media_file_tags($l_meta); 2652db397b2SSatoshi Sahara $r_tags = media_file_tags($r_meta); 2662db397b2SSatoshi Sahara // FIXME r_tags-only stuff 2672db397b2SSatoshi Sahara foreach ($l_tags as $key => $l_tag) { 2682db397b2SSatoshi Sahara if ($l_tag['value'] != $r_tags[$key]['value']) { 2692db397b2SSatoshi Sahara $r_tags[$key]['highlighted'] = true; 2702db397b2SSatoshi Sahara $l_tags[$key]['highlighted'] = true; 2712db397b2SSatoshi Sahara } elseif (!$l_tag['value'] || !$r_tags[$key]['value']) { 2722db397b2SSatoshi Sahara unset($r_tags[$key]); 2732db397b2SSatoshi Sahara unset($l_tags[$key]); 2742db397b2SSatoshi Sahara } 2752db397b2SSatoshi Sahara } 2762db397b2SSatoshi Sahara 2772db397b2SSatoshi Sahara echo '<tr>'; 2782db397b2SSatoshi Sahara foreach (array($l_tags, $r_tags) as $tags) { 279675f74fbSSatoshi Sahara echo '<td>'; 2802db397b2SSatoshi Sahara 2812db397b2SSatoshi Sahara echo '<dl class="img_tags">'; 2822db397b2SSatoshi Sahara foreach ($tags as $tag) { 2832db397b2SSatoshi Sahara $value = cleanText($tag['value']); 2842db397b2SSatoshi Sahara if (!$value) $value = '-'; 2852db397b2SSatoshi Sahara echo '<dt>'.$lang[$tag['tag'][1]].'</dt>'; 2862db397b2SSatoshi Sahara echo '<dd>'; 2872db397b2SSatoshi Sahara if ($tag['highlighted']) echo '<strong>'; 2882db397b2SSatoshi Sahara if ($tag['tag'][2] == 'date') { 2892db397b2SSatoshi Sahara echo dformat($value); 2902db397b2SSatoshi Sahara } else { 2912db397b2SSatoshi Sahara echo hsc($value); 2922db397b2SSatoshi Sahara } 2932db397b2SSatoshi Sahara if ($tag['highlighted']) echo '</strong>'; 2942db397b2SSatoshi Sahara echo '</dd>'; 2952db397b2SSatoshi Sahara } 296675f74fbSSatoshi Sahara echo '</dl>'; 2972db397b2SSatoshi Sahara 2982db397b2SSatoshi Sahara echo '</td>'; 2992db397b2SSatoshi Sahara } 300675f74fbSSatoshi Sahara echo '</tr>'; 3012db397b2SSatoshi Sahara 302675f74fbSSatoshi Sahara echo '</table>'; 303675f74fbSSatoshi Sahara echo '</div>'; 30463ab9afeSSatoshi Sahara } 30563ab9afeSSatoshi Sahara 30663ab9afeSSatoshi Sahara} 307