163ab9afeSSatoshi Sahara<?php 263ab9afeSSatoshi Sahara 363ab9afeSSatoshi Saharanamespace dokuwiki\Ui; 463ab9afeSSatoshi Sahara 5cc5508feSSatoshi Saharause dokuwiki\ChangeLog\ChangeLog; 6cc5508feSSatoshi Sahara 763ab9afeSSatoshi Sahara/** 863ab9afeSSatoshi Sahara * DokuWiki Diff Interface 963ab9afeSSatoshi Sahara * parent class of PageDiff and MediaDiff 1063ab9afeSSatoshi Sahara * 1163ab9afeSSatoshi Sahara * @package dokuwiki\Ui 1263ab9afeSSatoshi Sahara */ 1363ab9afeSSatoshi Saharaabstract class Diff extends Ui 1463ab9afeSSatoshi Sahara{ 15edb50e6aSSatoshi Sahara /* @var string */ 16edb50e6aSSatoshi Sahara protected $id; // page id or media id 17edb50e6aSSatoshi Sahara 1892440599SSatoshi Sahara /* @var int|string */ 1992440599SSatoshi Sahara protected $oldRev; // timestamp of older revision, '' means current one 2092440599SSatoshi Sahara protected $newRev; // timestamp of newer revision, '' means current one 21b4b4c5c6SSatoshi Sahara 22edb50e6aSSatoshi Sahara /* @var array */ 23edb50e6aSSatoshi Sahara protected $preference = []; 24edb50e6aSSatoshi Sahara 258068440fSSatoshi Sahara /* @var ChangeLog */ 268068440fSSatoshi Sahara protected $changelog; // PageChangeLog or MediaChangeLog object 278068440fSSatoshi Sahara 28edb50e6aSSatoshi Sahara /** 29edb50e6aSSatoshi Sahara * Diff Ui constructor 30edb50e6aSSatoshi Sahara * 31edb50e6aSSatoshi Sahara * @param string $id page id or media id 32edb50e6aSSatoshi Sahara */ 33edb50e6aSSatoshi Sahara public function __construct($id) 34edb50e6aSSatoshi Sahara { 35edb50e6aSSatoshi Sahara $this->id = $id; 368068440fSSatoshi Sahara $this->setChangeLog(); 37*0a475154SSatoshi Sahara // ensure to have valid changelog::currentRevision property 38*0a475154SSatoshi Sahara $this->changelog->getCurrentRevisionInfo(); 39edb50e6aSSatoshi Sahara } 40edb50e6aSSatoshi Sahara 41edb50e6aSSatoshi Sahara /** 428068440fSSatoshi Sahara * set class property changelog 438068440fSSatoshi Sahara */ 448068440fSSatoshi Sahara abstract protected function setChangeLog(); 458068440fSSatoshi Sahara 468068440fSSatoshi Sahara /** 47b4b4c5c6SSatoshi Sahara * Set a pair of revisions to be compared 48b4b4c5c6SSatoshi Sahara * 493d0f231eSSatoshi Sahara * @param int $oldRev 503d0f231eSSatoshi Sahara * @param int $newRev 51b4b4c5c6SSatoshi Sahara * @return $this 52b4b4c5c6SSatoshi Sahara */ 533d0f231eSSatoshi Sahara public function compare($oldRev, $newRev) 54b4b4c5c6SSatoshi Sahara { 553d0f231eSSatoshi Sahara $this->oldRev = $oldRev; 563d0f231eSSatoshi Sahara $this->newRev = $newRev; 57b4b4c5c6SSatoshi Sahara return $this; 58b4b4c5c6SSatoshi Sahara } 59b4b4c5c6SSatoshi Sahara 60b4b4c5c6SSatoshi Sahara /** 61edb50e6aSSatoshi Sahara * Gets or Sets preference of the Ui\Diff object 62edb50e6aSSatoshi Sahara * 63edb50e6aSSatoshi Sahara * @param string|array $prefs a key name or key-value pair(s) 64edb50e6aSSatoshi Sahara * @param mixed $value value used when the first args is string 65edb50e6aSSatoshi Sahara * @return array|$this 66edb50e6aSSatoshi Sahara */ 67edb50e6aSSatoshi Sahara public function preference($prefs = null, $value = null) 68edb50e6aSSatoshi Sahara { 69edb50e6aSSatoshi Sahara // set 70295564cdSSatoshi Sahara if (is_string($prefs) && isset($value)) { 71295564cdSSatoshi Sahara $this->preference[$prefs] = $value; 72295564cdSSatoshi Sahara return $this; 73295564cdSSatoshi Sahara } elseif (is_array($prefs)) { 74edb50e6aSSatoshi Sahara foreach ($prefs as $name => $value) { 75edb50e6aSSatoshi Sahara $this->preference[$name] = $value; 76edb50e6aSSatoshi Sahara } 77edb50e6aSSatoshi Sahara return $this; 78edb50e6aSSatoshi Sahara } 79edb50e6aSSatoshi Sahara // get 80edb50e6aSSatoshi Sahara return $this->preference; 81edb50e6aSSatoshi Sahara } 82edb50e6aSSatoshi Sahara 83b4b4c5c6SSatoshi Sahara /** 84b4b4c5c6SSatoshi Sahara * Retrieve requested revision(s) and difftype from Ui\Revisions 85b4b4c5c6SSatoshi Sahara * 86b4b4c5c6SSatoshi Sahara * @return void 87b4b4c5c6SSatoshi Sahara */ 88b4b4c5c6SSatoshi Sahara protected function preProcess() 89b4b4c5c6SSatoshi Sahara { 90b4b4c5c6SSatoshi Sahara global $INPUT; 91*0a475154SSatoshi Sahara $changelog =& $this->changelog; 92b4b4c5c6SSatoshi Sahara 93b4b4c5c6SSatoshi Sahara // difflink icon click, eg. ?rev=123456789&do=diff 94b4b4c5c6SSatoshi Sahara if ($INPUT->has('rev')) { 953d0f231eSSatoshi Sahara $this->oldRev = $INPUT->int('rev'); 96*0a475154SSatoshi Sahara $this->newRev = $changelog->currentRevision(); 97b4b4c5c6SSatoshi Sahara } 98b4b4c5c6SSatoshi Sahara 99b4b4c5c6SSatoshi Sahara // submit button with two checked boxes 100b4b4c5c6SSatoshi Sahara $rev2 = $INPUT->arr('rev2', []); 101b4b4c5c6SSatoshi Sahara if (count($rev2) > 1) { 102b4b4c5c6SSatoshi Sahara if ($rev2[0] == 'current') { 103*0a475154SSatoshi Sahara [$this->oldRev, $this->newRev] = [$rev2[1], $changelog->currentRevision()]; 104b4b4c5c6SSatoshi Sahara } elseif ($rev2[1] == 'current') { 105*0a475154SSatoshi Sahara [$this->oldRev, $this->newRev] = [$rev2[0], $changelog->currentRevision()]; 106b4b4c5c6SSatoshi Sahara } elseif ($rev2[0] < $rev2[1]) { 1073d0f231eSSatoshi Sahara [$this->oldRev, $this->newRev] = [$rev2[0], $rev2[1]]; 108b4b4c5c6SSatoshi Sahara } else { 1093d0f231eSSatoshi Sahara [$this->oldRev, $this->newRev] = [$rev2[1], $rev2[0]]; 110b4b4c5c6SSatoshi Sahara } 111b4b4c5c6SSatoshi Sahara } 112b4b4c5c6SSatoshi Sahara 113b4b4c5c6SSatoshi Sahara // diff view type 114b4b4c5c6SSatoshi Sahara if ($INPUT->has('difftype')) { 115b4b4c5c6SSatoshi Sahara // retrieve requested $difftype 116b4b4c5c6SSatoshi Sahara $this->preference['difftype'] = $INPUT->str('difftype'); 117b4b4c5c6SSatoshi Sahara } else { 118b4b4c5c6SSatoshi Sahara // read preference from DokuWiki cookie. PageDiff only 1192fe2fb53SSatoshi Sahara $mode = get_doku_pref('difftype', $mode = null); 12091e70b5fSSatoshi Sahara if (isset($mode)) $this->preference['difftype'] = $mode; 121b4b4c5c6SSatoshi Sahara } 122b4b4c5c6SSatoshi Sahara } 123b4b4c5c6SSatoshi Sahara 124179b4660SSatoshi Sahara /** 125179b4660SSatoshi Sahara * get extended revision info 126179b4660SSatoshi Sahara * 127cc5508feSSatoshi Sahara * @param int|string $rev revision identifier, '' means current one, null means 128179b4660SSatoshi Sahara * @return array revision info structure of a page or media file 129179b4660SSatoshi Sahara */ 130179b4660SSatoshi Sahara protected function getExtendedRevisionInfo($rev) 131179b4660SSatoshi Sahara { 132179b4660SSatoshi Sahara $changelog =& $this->changelog; 133179b4660SSatoshi Sahara 134*0a475154SSatoshi Sahara if ($rev == '' || $rev == 'current') { 135*0a475154SSatoshi Sahara $info = $changelog->getCurrentRevisionInfo(); 136*0a475154SSatoshi Sahara } elseif (is_numeric($rev)) { 137179b4660SSatoshi Sahara $info = $changelog->getRevisionInfo($rev); 138*0a475154SSatoshi Sahara } else { //if do=diff at just created page 139*0a475154SSatoshi Sahara $info = ['none' => true]; 140179b4660SSatoshi Sahara } 141*0a475154SSatoshi Sahara return $info; 142179b4660SSatoshi Sahara } 143179b4660SSatoshi Sahara 144b4b4c5c6SSatoshi Sahara 145edb50e6aSSatoshi Sahara 14663ab9afeSSatoshi Sahara /** 147ec019cbfSSatoshi Sahara * Build header of diff HTML 14863ab9afeSSatoshi Sahara * 14963ab9afeSSatoshi Sahara * @param string $l_rev Left revisions 15063ab9afeSSatoshi Sahara * @param string $r_rev Right revision 15163ab9afeSSatoshi Sahara * @return string[] HTML snippets for diff header 152cb5998b4SSatoshi Sahara * @deprecated 2020-12-31 15363ab9afeSSatoshi Sahara */ 1548068440fSSatoshi Sahara public function buildDiffHead($l_rev, $r_rev) 15563ab9afeSSatoshi Sahara { 156cb5998b4SSatoshi Sahara dbg_deprecated('not used see '. \dokuwiki\Ui\PageDiff::class .'::show()'); 15763ab9afeSSatoshi Sahara } 15863ab9afeSSatoshi Sahara 15963ab9afeSSatoshi Sahara} 160