163ab9afeSSatoshi Sahara<?php 263ab9afeSSatoshi Sahara 363ab9afeSSatoshi Saharanamespace dokuwiki\Ui; 463ab9afeSSatoshi Sahara 563ab9afeSSatoshi Saharause dokuwiki\ChangeLog\PageChangeLog; 663ab9afeSSatoshi Saharause dokuwiki\ChangeLog\MediaChangeLog; 763ab9afeSSatoshi Sahara 863ab9afeSSatoshi Sahara/** 963ab9afeSSatoshi Sahara * DokuWiki Diff Interface 1063ab9afeSSatoshi Sahara * parent class of PageDiff and MediaDiff 1163ab9afeSSatoshi Sahara * 1263ab9afeSSatoshi Sahara * @package dokuwiki\Ui 1363ab9afeSSatoshi Sahara */ 1463ab9afeSSatoshi Saharaabstract class Diff extends Ui 1563ab9afeSSatoshi Sahara{ 16edb50e6aSSatoshi Sahara /* @var string */ 17edb50e6aSSatoshi Sahara protected $id; // page id or media id 18edb50e6aSSatoshi Sahara 19b4b4c5c6SSatoshi Sahara /* @var int */ 20b4b4c5c6SSatoshi Sahara protected $old_rev; // older revision, timestamp of left side 21b4b4c5c6SSatoshi Sahara protected $new_rev; // newer revision, timestamp of right side 22b4b4c5c6SSatoshi Sahara 23edb50e6aSSatoshi Sahara /* @var array */ 24edb50e6aSSatoshi Sahara protected $preference = []; 25edb50e6aSSatoshi Sahara 26*8068440fSSatoshi Sahara /* @var ChangeLog */ 27*8068440fSSatoshi Sahara protected $changelog; // PageChangeLog or MediaChangeLog object 28*8068440fSSatoshi Sahara 29edb50e6aSSatoshi Sahara /** 30edb50e6aSSatoshi Sahara * Diff Ui constructor 31edb50e6aSSatoshi Sahara * 32edb50e6aSSatoshi Sahara * @param string $id page id or media id 33edb50e6aSSatoshi Sahara */ 34edb50e6aSSatoshi Sahara public function __construct($id) 35edb50e6aSSatoshi Sahara { 36edb50e6aSSatoshi Sahara $this->id = $id; 37*8068440fSSatoshi Sahara $this->setChangeLog(); 38edb50e6aSSatoshi Sahara } 39edb50e6aSSatoshi Sahara 40edb50e6aSSatoshi Sahara /** 41*8068440fSSatoshi Sahara * set class property changelog 42*8068440fSSatoshi Sahara */ 43*8068440fSSatoshi Sahara abstract protected function setChangeLog(); 44*8068440fSSatoshi Sahara 45*8068440fSSatoshi Sahara /** 46b4b4c5c6SSatoshi Sahara * Set a pair of revisions to be compared 47b4b4c5c6SSatoshi Sahara * 48b4b4c5c6SSatoshi Sahara * @param int $old_rev 49b4b4c5c6SSatoshi Sahara * @param int $new_rev 50b4b4c5c6SSatoshi Sahara * @return $this 51b4b4c5c6SSatoshi Sahara */ 52b4b4c5c6SSatoshi Sahara public function compare($old_rev, $new_rev) 53b4b4c5c6SSatoshi Sahara { 54b4b4c5c6SSatoshi Sahara $this->old_rev = $old_rev; 55b4b4c5c6SSatoshi Sahara $this->new_rev = $new_rev; 56b4b4c5c6SSatoshi Sahara return $this; 57b4b4c5c6SSatoshi Sahara } 58b4b4c5c6SSatoshi Sahara 59b4b4c5c6SSatoshi Sahara /** 60edb50e6aSSatoshi Sahara * Gets or Sets preference of the Ui\Diff object 61edb50e6aSSatoshi Sahara * 62edb50e6aSSatoshi Sahara * @param string|array $prefs a key name or key-value pair(s) 63edb50e6aSSatoshi Sahara * @param mixed $value value used when the first args is string 64edb50e6aSSatoshi Sahara * @return array|$this 65edb50e6aSSatoshi Sahara */ 66edb50e6aSSatoshi Sahara public function preference($prefs = null, $value = null) 67edb50e6aSSatoshi Sahara { 68edb50e6aSSatoshi Sahara // set 69edb50e6aSSatoshi Sahara if (is_array($prefs)) { 70edb50e6aSSatoshi Sahara foreach ($prefs as $name => $value) { 71edb50e6aSSatoshi Sahara $this->preference[$name] = $value; 72edb50e6aSSatoshi Sahara } 73edb50e6aSSatoshi Sahara return $this; 74edb50e6aSSatoshi Sahara } elseif (is_string($prefs) && isset($value)) { 75edb50e6aSSatoshi Sahara $this->preference[$prefs] = $value; 76edb50e6aSSatoshi Sahara return $this; 77edb50e6aSSatoshi Sahara } 78edb50e6aSSatoshi Sahara // get 79edb50e6aSSatoshi Sahara return $this->preference; 80edb50e6aSSatoshi Sahara } 81edb50e6aSSatoshi Sahara 82b4b4c5c6SSatoshi Sahara /** 83b4b4c5c6SSatoshi Sahara * Retrieve requested revision(s) and difftype from Ui\Revisions 84b4b4c5c6SSatoshi Sahara * 85b4b4c5c6SSatoshi Sahara * @return void 86b4b4c5c6SSatoshi Sahara */ 87b4b4c5c6SSatoshi Sahara protected function preProcess() 88b4b4c5c6SSatoshi Sahara { 89b4b4c5c6SSatoshi Sahara global $INPUT; 90b4b4c5c6SSatoshi Sahara 91b4b4c5c6SSatoshi Sahara // difflink icon click, eg. ?rev=123456789&do=diff 92b4b4c5c6SSatoshi Sahara if ($INPUT->has('rev')) { 93b4b4c5c6SSatoshi Sahara $this->old_rev = $INPUT->int('rev'); 94b4b4c5c6SSatoshi Sahara $this->new_rev = ''; // current revision 95b4b4c5c6SSatoshi Sahara } 96b4b4c5c6SSatoshi Sahara 97b4b4c5c6SSatoshi Sahara // submit button with two checked boxes 98b4b4c5c6SSatoshi Sahara $rev2 = $INPUT->arr('rev2', []); 99b4b4c5c6SSatoshi Sahara if (count($rev2) > 1) { 100b4b4c5c6SSatoshi Sahara if ($rev2[0] == 'current') { 101b4b4c5c6SSatoshi Sahara [$this->old_rev, $this->new_rev] = [$rev2[1], '']; 102b4b4c5c6SSatoshi Sahara } elseif ($rev2[1] == 'current') { 103b4b4c5c6SSatoshi Sahara [$this->old_rev, $this->new_rev] = [$rev2[0], '']; 104b4b4c5c6SSatoshi Sahara } elseif ($rev2[0] < $rev2[1]) { 105b4b4c5c6SSatoshi Sahara [$this->old_rev, $this->new_rev] = [$rev2[0], $rev2[1]]; 106b4b4c5c6SSatoshi Sahara } else { 107b4b4c5c6SSatoshi Sahara [$this->old_rev, $this->new_rev] = [$rev2[1], $rev2[0]]; 108b4b4c5c6SSatoshi Sahara } 109b4b4c5c6SSatoshi Sahara } 110b4b4c5c6SSatoshi Sahara 111b4b4c5c6SSatoshi Sahara // diff view type 112b4b4c5c6SSatoshi Sahara if ($INPUT->has('difftype')) { 113b4b4c5c6SSatoshi Sahara // retrieve requested $difftype 114b4b4c5c6SSatoshi Sahara $this->preference['difftype'] = $INPUT->str('difftype'); 115b4b4c5c6SSatoshi Sahara } else { 116b4b4c5c6SSatoshi Sahara // read preference from DokuWiki cookie. PageDiff only 117b4b4c5c6SSatoshi Sahara $this->preference['difftype'] = get_doku_pref('difftype', $mode); 118b4b4c5c6SSatoshi Sahara } 119b4b4c5c6SSatoshi Sahara } 120b4b4c5c6SSatoshi Sahara 121b4b4c5c6SSatoshi Sahara 122edb50e6aSSatoshi Sahara 12363ab9afeSSatoshi Sahara /** 124ec019cbfSSatoshi Sahara * Build header of diff HTML 12563ab9afeSSatoshi Sahara * 12663ab9afeSSatoshi Sahara * @param string $l_rev Left revisions 12763ab9afeSSatoshi Sahara * @param string $r_rev Right revision 12863ab9afeSSatoshi Sahara * @return string[] HTML snippets for diff header 12963ab9afeSSatoshi Sahara */ 130*8068440fSSatoshi Sahara public function buildDiffHead($l_rev, $r_rev) 13163ab9afeSSatoshi Sahara { 13263ab9afeSSatoshi Sahara global $lang; 133edb50e6aSSatoshi Sahara 134edb50e6aSSatoshi Sahara // detect PageDiff or MediaDiff 135*8068440fSSatoshi Sahara switch (get_class($this->changelog)) { 136edb50e6aSSatoshi Sahara case PageChangeLog::class : 137edb50e6aSSatoshi Sahara $media_or_wikiFN = 'wikiFN'; 138edb50e6aSSatoshi Sahara $ml_or_wl = 'wl'; 139edb50e6aSSatoshi Sahara $media = false; 140edb50e6aSSatoshi Sahara break; 141edb50e6aSSatoshi Sahara case MediaChangeLog::class : 142edb50e6aSSatoshi Sahara $media_or_wikiFN = 'mediaFN'; 143edb50e6aSSatoshi Sahara $ml_or_wl = 'ml'; 144edb50e6aSSatoshi Sahara $media = true; 145edb50e6aSSatoshi Sahara break; 14663ab9afeSSatoshi Sahara } 147edb50e6aSSatoshi Sahara 148edb50e6aSSatoshi Sahara $head_separator = ($this->preference['difftype'] === 'inline') ? ' ' : '<br />'; 14963ab9afeSSatoshi Sahara $l_minor = $r_minor = ''; 15063ab9afeSSatoshi Sahara 151edb50e6aSSatoshi Sahara // left side 15263ab9afeSSatoshi Sahara if (!$l_rev) { 15363ab9afeSSatoshi Sahara $l_head = '—'; 15463ab9afeSSatoshi Sahara } else { 155*8068440fSSatoshi Sahara $l_info = $this->changelog->getRevisionInfo($l_rev); 15663ab9afeSSatoshi Sahara if ($l_info['user']) { 15763ab9afeSSatoshi Sahara $l_user = '<bdi>'.editorinfo($l_info['user']).'</bdi>'; 15863ab9afeSSatoshi Sahara if (auth_ismanager()) $l_user .= ' <bdo dir="ltr">('.$l_info['ip'].')</bdo>'; 15963ab9afeSSatoshi Sahara } else { 16063ab9afeSSatoshi Sahara $l_user = '<bdo dir="ltr">'.$l_info['ip'].'</bdo>'; 16163ab9afeSSatoshi Sahara } 16263ab9afeSSatoshi Sahara $l_user = '<span class="user">'.$l_user.'</span>'; 16363ab9afeSSatoshi Sahara $l_sum = ($l_info['sum']) ? '<span class="sum"><bdi>'.hsc($l_info['sum']).'</bdi></span>' : ''; 16463ab9afeSSatoshi Sahara if ($l_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $l_minor = 'class="minor"'; 16563ab9afeSSatoshi Sahara 166edb50e6aSSatoshi Sahara $l_head_title = ($media) ? dformat($l_rev) : $this->id.' ['.dformat($l_rev).']'; 167edb50e6aSSatoshi Sahara $l_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id,"rev=$l_rev").'">' 16863ab9afeSSatoshi Sahara . $l_head_title.'</a></bdi>'.$head_separator.$l_user.' '.$l_sum; 16963ab9afeSSatoshi Sahara } 17063ab9afeSSatoshi Sahara 171edb50e6aSSatoshi Sahara // right side 17263ab9afeSSatoshi Sahara if ($r_rev) { 173*8068440fSSatoshi Sahara $r_info = $this->changelog->getRevisionInfo($r_rev); 17463ab9afeSSatoshi Sahara if ($r_info['user']) { 17563ab9afeSSatoshi Sahara $r_user = '<bdi>'.editorinfo($r_info['user']).'</bdi>'; 17663ab9afeSSatoshi Sahara if (auth_ismanager()) $r_user .= ' <bdo dir="ltr">('.$r_info['ip'].')</bdo>'; 17763ab9afeSSatoshi Sahara } else { 17863ab9afeSSatoshi Sahara $r_user = '<bdo dir="ltr">'.$r_info['ip'].'</bdo>'; 17963ab9afeSSatoshi Sahara } 18063ab9afeSSatoshi Sahara $r_user = '<span class="user">'.$r_user.'</span>'; 18163ab9afeSSatoshi Sahara $r_sum = ($r_info['sum']) ? '<span class="sum"><bdi>'.hsc($r_info['sum']).'</bdi></span>' : ''; 18263ab9afeSSatoshi Sahara if ($r_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"'; 18363ab9afeSSatoshi Sahara 184edb50e6aSSatoshi Sahara $r_head_title = ($media) ? dformat($r_rev) : $this->id.' ['.dformat($r_rev).']'; 185edb50e6aSSatoshi Sahara $r_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id,"rev=$r_rev").'">' 18663ab9afeSSatoshi Sahara . $r_head_title.'</a></bdi>'.$head_separator.$r_user.' '.$r_sum; 187edb50e6aSSatoshi Sahara } elseif ($_rev = @filemtime($media_or_wikiFN($this->id))) { 188*8068440fSSatoshi Sahara $_info = $this->changelog->getRevisionInfo($_rev); 18963ab9afeSSatoshi Sahara if ($_info['user']) { 19063ab9afeSSatoshi Sahara $_user = '<bdi>'.editorinfo($_info['user']).'</bdi>'; 19163ab9afeSSatoshi Sahara if (auth_ismanager()) $_user .= ' <bdo dir="ltr">('.$_info['ip'].')</bdo>'; 19263ab9afeSSatoshi Sahara } else { 19363ab9afeSSatoshi Sahara $_user = '<bdo dir="ltr">'.$_info['ip'].'</bdo>'; 19463ab9afeSSatoshi Sahara } 19563ab9afeSSatoshi Sahara $_user = '<span class="user">'.$_user.'</span>'; 19663ab9afeSSatoshi Sahara $_sum = ($_info['sum']) ? '<span class="sum"><bdi>'.hsc($_info['sum']).'</span></bdi>' : ''; 19763ab9afeSSatoshi Sahara if ($_info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"'; 19863ab9afeSSatoshi Sahara 199edb50e6aSSatoshi Sahara $r_head_title = ($media) ? dformat($_rev) : $this->id.' ['.dformat($_rev).']'; 200edb50e6aSSatoshi Sahara $r_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($this->id).'">' 20163ab9afeSSatoshi Sahara . $r_head_title.'</a></bdi> '.'('.$lang['current'].')'.$head_separator.$_user.' '.$_sum; 20263ab9afeSSatoshi Sahara }else{ 20363ab9afeSSatoshi Sahara $r_head = '— ('.$lang['current'].')'; 20463ab9afeSSatoshi Sahara } 20563ab9afeSSatoshi Sahara 20663ab9afeSSatoshi Sahara return array($l_head, $r_head, $l_minor, $r_minor); 20763ab9afeSSatoshi Sahara } 20863ab9afeSSatoshi Sahara 20963ab9afeSSatoshi Sahara} 210