163ab9afeSSatoshi Sahara<?php 263ab9afeSSatoshi Sahara 363ab9afeSSatoshi Saharanamespace dokuwiki\Ui; 463ab9afeSSatoshi Sahara 563ab9afeSSatoshi Sahara/** 663ab9afeSSatoshi Sahara * DokuWiki Diff Interface 763ab9afeSSatoshi Sahara * parent class of PageDiff and MediaDiff 863ab9afeSSatoshi Sahara * 963ab9afeSSatoshi Sahara * @package dokuwiki\Ui 1063ab9afeSSatoshi Sahara */ 1163ab9afeSSatoshi Saharaabstract class Diff extends Ui 1263ab9afeSSatoshi Sahara{ 13edb50e6aSSatoshi Sahara /* @var string */ 14edb50e6aSSatoshi Sahara protected $id; // page id or media id 15e71e09a6SSatoshi Sahara protected $item; // page or media 16edb50e6aSSatoshi Sahara 17b4b4c5c6SSatoshi Sahara /* @var int */ 183d0f231eSSatoshi Sahara protected $oldRev; // timestamp of older revision, left side 193d0f231eSSatoshi Sahara protected $newRev; // timestamp of newer revision, right side 200bb448f0SSatoshi Sahara protected $last_rev; // current revision, or last revision when it had removed 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(); 37edb50e6aSSatoshi Sahara } 38edb50e6aSSatoshi Sahara 39edb50e6aSSatoshi Sahara /** 408068440fSSatoshi Sahara * set class property changelog 418068440fSSatoshi Sahara */ 428068440fSSatoshi Sahara abstract protected function setChangeLog(); 438068440fSSatoshi Sahara 448068440fSSatoshi Sahara /** 45*d9c75b22SSatoshi Sahara * item filename resolver 46*d9c75b22SSatoshi Sahara * 47*d9c75b22SSatoshi Sahara * @param string $id page id or media id 48*d9c75b22SSatoshi Sahara * @param int|string $rev revision timestamp, or empty string for current one 49*d9c75b22SSatoshi Sahara * @return string full path 50*d9c75b22SSatoshi Sahara */ 51*d9c75b22SSatoshi Sahara abstract protected function itemFN($id, $rev = ''); 52*d9c75b22SSatoshi Sahara 53*d9c75b22SSatoshi Sahara /** 54b4b4c5c6SSatoshi Sahara * Set a pair of revisions to be compared 55b4b4c5c6SSatoshi Sahara * 563d0f231eSSatoshi Sahara * @param int $oldRev 573d0f231eSSatoshi Sahara * @param int $newRev 58b4b4c5c6SSatoshi Sahara * @return $this 59b4b4c5c6SSatoshi Sahara */ 603d0f231eSSatoshi Sahara public function compare($oldRev, $newRev) 61b4b4c5c6SSatoshi Sahara { 623d0f231eSSatoshi Sahara $this->oldRev = $oldRev; 633d0f231eSSatoshi Sahara $this->newRev = $newRev; 64b4b4c5c6SSatoshi Sahara return $this; 65b4b4c5c6SSatoshi Sahara } 66b4b4c5c6SSatoshi Sahara 67b4b4c5c6SSatoshi Sahara /** 68edb50e6aSSatoshi Sahara * Gets or Sets preference of the Ui\Diff object 69edb50e6aSSatoshi Sahara * 70edb50e6aSSatoshi Sahara * @param string|array $prefs a key name or key-value pair(s) 71edb50e6aSSatoshi Sahara * @param mixed $value value used when the first args is string 72edb50e6aSSatoshi Sahara * @return array|$this 73edb50e6aSSatoshi Sahara */ 74edb50e6aSSatoshi Sahara public function preference($prefs = null, $value = null) 75edb50e6aSSatoshi Sahara { 76edb50e6aSSatoshi Sahara // set 77295564cdSSatoshi Sahara if (is_string($prefs) && isset($value)) { 78295564cdSSatoshi Sahara $this->preference[$prefs] = $value; 79295564cdSSatoshi Sahara return $this; 80295564cdSSatoshi Sahara } elseif (is_array($prefs)) { 81edb50e6aSSatoshi Sahara foreach ($prefs as $name => $value) { 82edb50e6aSSatoshi Sahara $this->preference[$name] = $value; 83edb50e6aSSatoshi Sahara } 84edb50e6aSSatoshi Sahara return $this; 85edb50e6aSSatoshi Sahara } 86edb50e6aSSatoshi Sahara // get 87edb50e6aSSatoshi Sahara return $this->preference; 88edb50e6aSSatoshi Sahara } 89edb50e6aSSatoshi Sahara 90b4b4c5c6SSatoshi Sahara /** 91b4b4c5c6SSatoshi Sahara * Retrieve requested revision(s) and difftype from Ui\Revisions 92b4b4c5c6SSatoshi Sahara * 93b4b4c5c6SSatoshi Sahara * @return void 94b4b4c5c6SSatoshi Sahara */ 95b4b4c5c6SSatoshi Sahara protected function preProcess() 96b4b4c5c6SSatoshi Sahara { 97b4b4c5c6SSatoshi Sahara global $INPUT; 98b4b4c5c6SSatoshi Sahara 99b4b4c5c6SSatoshi Sahara // difflink icon click, eg. ?rev=123456789&do=diff 100b4b4c5c6SSatoshi Sahara if ($INPUT->has('rev')) { 1013d0f231eSSatoshi Sahara $this->oldRev = $INPUT->int('rev'); 1023d0f231eSSatoshi Sahara $this->newRev = ''; // current revision 103b4b4c5c6SSatoshi Sahara } 104b4b4c5c6SSatoshi Sahara 105b4b4c5c6SSatoshi Sahara // submit button with two checked boxes 106b4b4c5c6SSatoshi Sahara $rev2 = $INPUT->arr('rev2', []); 107b4b4c5c6SSatoshi Sahara if (count($rev2) > 1) { 108b4b4c5c6SSatoshi Sahara if ($rev2[0] == 'current') { 1093d0f231eSSatoshi Sahara [$this->oldRev, $this->newRev] = [$rev2[1], '']; 110b4b4c5c6SSatoshi Sahara } elseif ($rev2[1] == 'current') { 1113d0f231eSSatoshi Sahara [$this->oldRev, $this->newRev] = [$rev2[0], '']; 112b4b4c5c6SSatoshi Sahara } elseif ($rev2[0] < $rev2[1]) { 1133d0f231eSSatoshi Sahara [$this->oldRev, $this->newRev] = [$rev2[0], $rev2[1]]; 114b4b4c5c6SSatoshi Sahara } else { 1153d0f231eSSatoshi Sahara [$this->oldRev, $this->newRev] = [$rev2[1], $rev2[0]]; 116b4b4c5c6SSatoshi Sahara } 117b4b4c5c6SSatoshi Sahara } 118b4b4c5c6SSatoshi Sahara 119b4b4c5c6SSatoshi Sahara // diff view type 120b4b4c5c6SSatoshi Sahara if ($INPUT->has('difftype')) { 121b4b4c5c6SSatoshi Sahara // retrieve requested $difftype 122b4b4c5c6SSatoshi Sahara $this->preference['difftype'] = $INPUT->str('difftype'); 123b4b4c5c6SSatoshi Sahara } else { 124b4b4c5c6SSatoshi Sahara // read preference from DokuWiki cookie. PageDiff only 12591e70b5fSSatoshi Sahara get_doku_pref('difftype', $mode); 12691e70b5fSSatoshi Sahara if (isset($mode)) $this->preference['difftype'] = $mode; 127b4b4c5c6SSatoshi Sahara } 128b4b4c5c6SSatoshi Sahara } 129b4b4c5c6SSatoshi Sahara 130179b4660SSatoshi Sahara /** 131179b4660SSatoshi Sahara * get extended revision info 132179b4660SSatoshi Sahara * 133179b4660SSatoshi Sahara * @param int|string $rev revision identifier, '' means current one 134179b4660SSatoshi Sahara * @return array revision info structure of a page or media file 135179b4660SSatoshi Sahara */ 136179b4660SSatoshi Sahara protected function getExtendedRevisionInfo($rev) 137179b4660SSatoshi Sahara { 138179b4660SSatoshi Sahara $changelog =& $this->changelog; 139179b4660SSatoshi Sahara 140179b4660SSatoshi Sahara if ($rev) { 141179b4660SSatoshi Sahara $info = $changelog->getRevisionInfo($rev); 142179b4660SSatoshi Sahara } elseif (file_exists($filename = $this->itemFN($this->id))) { 143179b4660SSatoshi Sahara $rev = filemtime(fullpath($filename)); 144179b4660SSatoshi Sahara $info = $changelog->getRevisionInfo($rev) + array( 145179b4660SSatoshi Sahara 'current' => true, 146179b4660SSatoshi Sahara ); 147179b4660SSatoshi Sahara } else { // once exists, but now removed 148179b4660SSatoshi Sahara $info = array( 149179b4660SSatoshi Sahara 'current' => true, 150179b4660SSatoshi Sahara ); 151179b4660SSatoshi Sahara } 152179b4660SSatoshi Sahara return array('item' => $this->item) + $info; 153179b4660SSatoshi Sahara } 154179b4660SSatoshi Sahara 155b4b4c5c6SSatoshi Sahara 156edb50e6aSSatoshi Sahara 15763ab9afeSSatoshi Sahara /** 158ec019cbfSSatoshi Sahara * Build header of diff HTML 15963ab9afeSSatoshi Sahara * 16063ab9afeSSatoshi Sahara * @param string $l_rev Left revisions 16163ab9afeSSatoshi Sahara * @param string $r_rev Right revision 16263ab9afeSSatoshi Sahara * @return string[] HTML snippets for diff header 163cb5998b4SSatoshi Sahara * @deprecated 2020-12-31 16463ab9afeSSatoshi Sahara */ 1658068440fSSatoshi Sahara public function buildDiffHead($l_rev, $r_rev) 16663ab9afeSSatoshi Sahara { 167cb5998b4SSatoshi Sahara dbg_deprecated('not used see '. \dokuwiki\Ui\PageDiff::class .'::show()'); 16863ab9afeSSatoshi Sahara } 16963ab9afeSSatoshi Sahara 17063ab9afeSSatoshi Sahara} 171