xref: /dokuwiki/inc/Ui/Diff.php (revision 312e70954b2d03b55670ce8dc5afccba9269f4d2)
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