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 18eeda7adaSGerrit Uitslag /* @var int|false */ 196714d8ceSSatoshi Sahara protected $rev1; // timestamp of older revision 20eeda7adaSGerrit Uitslag /* @var int|false */ 216714d8ceSSatoshi Sahara protected $rev2; // timestamp of newer revision 22b4b4c5c6SSatoshi Sahara 23edb50e6aSSatoshi Sahara /* @var array */ 24edb50e6aSSatoshi Sahara protected $preference = []; 25edb50e6aSSatoshi Sahara 268068440fSSatoshi Sahara /* @var ChangeLog */ 278068440fSSatoshi Sahara protected $changelog; // PageChangeLog or MediaChangeLog object 288068440fSSatoshi 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; 378068440fSSatoshi Sahara $this->setChangeLog(); 38edb50e6aSSatoshi Sahara } 39edb50e6aSSatoshi Sahara 40edb50e6aSSatoshi Sahara /** 418068440fSSatoshi Sahara * set class property changelog 428068440fSSatoshi Sahara */ 438068440fSSatoshi Sahara abstract protected function setChangeLog(); 448068440fSSatoshi Sahara 458068440fSSatoshi Sahara /** 460ea1f71bSSatoshi Sahara * Prepare revision info of comparison pair 470ea1f71bSSatoshi Sahara */ 480ea1f71bSSatoshi Sahara abstract protected function preProcess(); 490ea1f71bSSatoshi Sahara 500ea1f71bSSatoshi Sahara /** 51b4b4c5c6SSatoshi Sahara * Set a pair of revisions to be compared 52b4b4c5c6SSatoshi Sahara * 53e59e4a07SSatoshi Sahara * @param int $rev1 older revision 54e59e4a07SSatoshi Sahara * @param int $rev2 newer revision 55b4b4c5c6SSatoshi Sahara * @return $this 56b4b4c5c6SSatoshi Sahara */ 57e59e4a07SSatoshi Sahara public function compare($rev1, $rev2) 58b4b4c5c6SSatoshi Sahara { 59e59e4a07SSatoshi Sahara if ($rev2 < $rev1) [$rev1, $rev2] = [$rev2, $rev1]; 606714d8ceSSatoshi Sahara $this->rev1 = (int)$rev1; 616714d8ceSSatoshi Sahara $this->rev2 = (int)$this->changelog->traceCurrentRevision($rev2); 62b4b4c5c6SSatoshi Sahara return $this; 63b4b4c5c6SSatoshi Sahara } 64b4b4c5c6SSatoshi Sahara 65b4b4c5c6SSatoshi Sahara /** 66edb50e6aSSatoshi Sahara * Gets or Sets preference of the Ui\Diff object 67edb50e6aSSatoshi Sahara * 68edb50e6aSSatoshi Sahara * @param string|array $prefs a key name or key-value pair(s) 69edb50e6aSSatoshi Sahara * @param mixed $value value used when the first args is string 70edb50e6aSSatoshi Sahara * @return array|$this 71edb50e6aSSatoshi Sahara */ 72edb50e6aSSatoshi Sahara public function preference($prefs = null, $value = null) 73edb50e6aSSatoshi Sahara { 74edb50e6aSSatoshi Sahara // set 75295564cdSSatoshi Sahara if (is_string($prefs) && isset($value)) { 76295564cdSSatoshi Sahara $this->preference[$prefs] = $value; 77295564cdSSatoshi Sahara return $this; 78295564cdSSatoshi Sahara } elseif (is_array($prefs)) { 79edb50e6aSSatoshi Sahara foreach ($prefs as $name => $value) { 80edb50e6aSSatoshi Sahara $this->preference[$name] = $value; 81edb50e6aSSatoshi Sahara } 82edb50e6aSSatoshi Sahara return $this; 83edb50e6aSSatoshi Sahara } 84edb50e6aSSatoshi Sahara // get 85edb50e6aSSatoshi Sahara return $this->preference; 86edb50e6aSSatoshi Sahara } 87edb50e6aSSatoshi Sahara 88b4b4c5c6SSatoshi Sahara /** 890ea1f71bSSatoshi Sahara * Handle requested revision(s) 90b4b4c5c6SSatoshi Sahara * 91b4b4c5c6SSatoshi Sahara * @return void 92b4b4c5c6SSatoshi Sahara */ 930ea1f71bSSatoshi Sahara protected function handle() 94b4b4c5c6SSatoshi Sahara { 95b4b4c5c6SSatoshi Sahara global $INPUT; 96b4b4c5c6SSatoshi Sahara 97312e7095SSatoshi Sahara // diff link icon click, eg. &do=diff&rev=# 98b4b4c5c6SSatoshi Sahara if ($INPUT->has('rev')) { 996714d8ceSSatoshi Sahara $this->rev1 = $INPUT->int('rev'); 1006714d8ceSSatoshi Sahara $this->rev2 = $this->changelog->currentRevision(); 1014cf9cfacSSatoshi Sahara if ($this->rev2 <= $this->rev1) { 1024cf9cfacSSatoshi Sahara // fallback to compare previous with current 1034cf9cfacSSatoshi Sahara unset($this->rev1, $this->rev2); 1044cf9cfacSSatoshi Sahara } 105b4b4c5c6SSatoshi Sahara } 106b4b4c5c6SSatoshi Sahara 107312e7095SSatoshi Sahara // submit button with two checked boxes, eg. &do=diff&rev2[0]=#&rev2[1]=# 108312e7095SSatoshi Sahara $revs = $INPUT->arr('rev2', []); 109312e7095SSatoshi Sahara if (count($revs) > 1) { 110*e2d055f5SAndreas Gohr [$rev1, $rev2] = $revs; 111312e7095SSatoshi Sahara if ($rev2 < $rev1) [$rev1, $rev2] = [$rev2, $rev1]; 1126714d8ceSSatoshi Sahara $this->rev1 = (int)$rev1; 1136714d8ceSSatoshi Sahara $this->rev2 = (int)$this->changelog->traceCurrentRevision($rev2); 114b4b4c5c6SSatoshi Sahara } 115312e7095SSatoshi Sahara 1165cb97057SSatoshi Sahara // no revision was given, compare previous to current 1174cf9cfacSSatoshi Sahara if (!isset($this->rev1, $this->rev2)) { 118312e7095SSatoshi Sahara $rev2 = $this->changelog->currentRevision(); 119312e7095SSatoshi Sahara if ($rev2 > $this->changelog->lastRevision()) { 120312e7095SSatoshi Sahara $rev1 = $this->changelog->lastRevision(); 121312e7095SSatoshi Sahara } else { 1226714d8ceSSatoshi Sahara $revs = $this->changelog->getRevisions(0, 1); 123312e7095SSatoshi Sahara $rev1 = count($revs) ? $revs[0] : false; 124312e7095SSatoshi Sahara } 1256714d8ceSSatoshi Sahara $this->rev1 = $rev1; 1266714d8ceSSatoshi Sahara $this->rev2 = $rev2; 1275cb97057SSatoshi Sahara } 128b4b4c5c6SSatoshi Sahara } 12963ab9afeSSatoshi Sahara} 130