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 180ea1f71bSSatoshi Sahara /* @var int */ 19d1575179SSatoshi Sahara protected $oldRev; // timestamp of older revision 200ea1f71bSSatoshi Sahara protected $newRev; // timestamp of newer revision 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 /** 450ea1f71bSSatoshi Sahara * Prepare revision info of comparison pair 460ea1f71bSSatoshi Sahara */ 470ea1f71bSSatoshi Sahara abstract protected function preProcess(); 480ea1f71bSSatoshi Sahara 490ea1f71bSSatoshi Sahara /** 50b4b4c5c6SSatoshi Sahara * Set a pair of revisions to be compared 51b4b4c5c6SSatoshi Sahara * 523d0f231eSSatoshi Sahara * @param int $oldRev 533d0f231eSSatoshi Sahara * @param int $newRev 54b4b4c5c6SSatoshi Sahara * @return $this 55b4b4c5c6SSatoshi Sahara */ 563d0f231eSSatoshi Sahara public function compare($oldRev, $newRev) 57b4b4c5c6SSatoshi Sahara { 580ea1f71bSSatoshi Sahara if ($oldRev < $newRev) { 590ea1f71bSSatoshi Sahara [$this->oldRev, $this->newRev] = [$oldRev, $newRev]; 600ea1f71bSSatoshi Sahara } else { 610ea1f71bSSatoshi Sahara [$this->oldRev, $this->newRev] = [$newRev, $oldRev]; 620ea1f71bSSatoshi Sahara } 63b4b4c5c6SSatoshi Sahara return $this; 64b4b4c5c6SSatoshi Sahara } 65b4b4c5c6SSatoshi Sahara 66b4b4c5c6SSatoshi Sahara /** 67edb50e6aSSatoshi Sahara * Gets or Sets preference of the Ui\Diff object 68edb50e6aSSatoshi Sahara * 69edb50e6aSSatoshi Sahara * @param string|array $prefs a key name or key-value pair(s) 70edb50e6aSSatoshi Sahara * @param mixed $value value used when the first args is string 71edb50e6aSSatoshi Sahara * @return array|$this 72edb50e6aSSatoshi Sahara */ 73edb50e6aSSatoshi Sahara public function preference($prefs = null, $value = null) 74edb50e6aSSatoshi Sahara { 75edb50e6aSSatoshi Sahara // set 76295564cdSSatoshi Sahara if (is_string($prefs) && isset($value)) { 77295564cdSSatoshi Sahara $this->preference[$prefs] = $value; 78295564cdSSatoshi Sahara return $this; 79295564cdSSatoshi Sahara } elseif (is_array($prefs)) { 80edb50e6aSSatoshi Sahara foreach ($prefs as $name => $value) { 81edb50e6aSSatoshi Sahara $this->preference[$name] = $value; 82edb50e6aSSatoshi Sahara } 83edb50e6aSSatoshi Sahara return $this; 84edb50e6aSSatoshi Sahara } 85edb50e6aSSatoshi Sahara // get 86edb50e6aSSatoshi Sahara return $this->preference; 87edb50e6aSSatoshi Sahara } 88edb50e6aSSatoshi Sahara 89b4b4c5c6SSatoshi Sahara /** 900ea1f71bSSatoshi Sahara * Handle requested revision(s) 91b4b4c5c6SSatoshi Sahara * 92b4b4c5c6SSatoshi Sahara * @return void 93b4b4c5c6SSatoshi Sahara */ 940ea1f71bSSatoshi Sahara protected function handle() 95b4b4c5c6SSatoshi Sahara { 96b4b4c5c6SSatoshi Sahara global $INPUT; 97b4b4c5c6SSatoshi Sahara 98*312e7095SSatoshi Sahara // difflink icon click, eg. &do=diff&rev=# 99b4b4c5c6SSatoshi Sahara if ($INPUT->has('rev')) { 1003d0f231eSSatoshi Sahara $this->oldRev = $INPUT->int('rev'); 1010ea1f71bSSatoshi Sahara $this->newRev = $this->changelog->currentRevision(); 102b4b4c5c6SSatoshi Sahara } 103b4b4c5c6SSatoshi Sahara 104*312e7095SSatoshi Sahara // submit button with two checked boxes, eg. &do=diff&rev2[0]=#&rev2[1]=# 105*312e7095SSatoshi Sahara $revs = $INPUT->arr('rev2', []); 106*312e7095SSatoshi Sahara if (count($revs) > 1) { 107*312e7095SSatoshi Sahara list($rev1, $rev2) = $revs; 108*312e7095SSatoshi Sahara if ($rev2 < $rev1) [$rev1, $rev2] = [$rev2, $rev1]; 109*312e7095SSatoshi Sahara $this->oldRev = (int)$rev1; 110*312e7095SSatoshi Sahara $this->newRev = (int)$this->changelog->traceCurrentRevision($rev2); 111b4b4c5c6SSatoshi Sahara } 112*312e7095SSatoshi Sahara 1135cb97057SSatoshi Sahara 1145cb97057SSatoshi Sahara if (!isset($this->oldRev, $this->newRev)) { 1155cb97057SSatoshi Sahara // no revision was given, compare previous to current 116*312e7095SSatoshi Sahara $rev2 = $this->changelog->currentRevision(); 117*312e7095SSatoshi Sahara if ($rev2 > $this->changelog->lastRevision()) { 118*312e7095SSatoshi Sahara $rev1 = $this->changelog->lastRevision(); 119*312e7095SSatoshi Sahara } else { 120*312e7095SSatoshi Sahara $revs = $changelog->getRevisions(0, 1); 121*312e7095SSatoshi Sahara $rev1 = count($revs) ? $revs[0] : false; 122*312e7095SSatoshi Sahara } 123*312e7095SSatoshi Sahara $this->oldRev = $rev1; 124*312e7095SSatoshi Sahara $this->newRev = $rev2; 1255cb97057SSatoshi Sahara } 126b4b4c5c6SSatoshi Sahara } 12763ab9afeSSatoshi Sahara} 128