xref: /dokuwiki/inc/Ui/Diff.php (revision 5cb9705720420bb535ba5b4337969e54bc24c401)
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
98b4b4c5c6SSatoshi Sahara        // difflink icon click, eg. ?rev=123456789&do=diff
99b4b4c5c6SSatoshi Sahara        if ($INPUT->has('rev')) {
1003d0f231eSSatoshi Sahara            $this->oldRev = $INPUT->int('rev');
1010ea1f71bSSatoshi Sahara            $this->newRev = $this->changelog->currentRevision();
102b4b4c5c6SSatoshi Sahara        }
103b4b4c5c6SSatoshi Sahara
104b4b4c5c6SSatoshi Sahara        // submit button with two checked boxes
105b4b4c5c6SSatoshi Sahara        $rev2 = $INPUT->arr('rev2', []);
106b4b4c5c6SSatoshi Sahara        if (count($rev2) > 1) {
1070ea1f71bSSatoshi Sahara            if ($rev2[0] < $rev2[1]) {
1083d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], $rev2[1]];
109b4b4c5c6SSatoshi Sahara            } else {
1103d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], $rev2[0]];
111b4b4c5c6SSatoshi Sahara            }
112b4b4c5c6SSatoshi Sahara        }
113*5cb97057SSatoshi Sahara
114*5cb97057SSatoshi Sahara        if (!isset($this->oldRev, $this->newRev)) {
115*5cb97057SSatoshi Sahara            // no revision was given, compare previous to current
116*5cb97057SSatoshi Sahara            $revs = $this->changelog->getRevisions(-1, 2);
117*5cb97057SSatoshi Sahara            $this->newRev = $this->changelog->currentRevision();
118*5cb97057SSatoshi Sahara            $this->oldRev = ($revs[0] == $this->newRev) ? $revs[1] : $revs[0];
119*5cb97057SSatoshi Sahara        }
120b4b4c5c6SSatoshi Sahara    }
121b4b4c5c6SSatoshi Sahara
122179b4660SSatoshi Sahara
123b4b4c5c6SSatoshi Sahara
124edb50e6aSSatoshi Sahara
12563ab9afeSSatoshi Sahara    /**
126ec019cbfSSatoshi Sahara     * Build header of diff HTML
12763ab9afeSSatoshi Sahara     *
12863ab9afeSSatoshi Sahara     * @param string $l_rev   Left revisions
12963ab9afeSSatoshi Sahara     * @param string $r_rev   Right revision
13063ab9afeSSatoshi Sahara     * @return string[] HTML snippets for diff header
131cb5998b4SSatoshi Sahara     * @deprecated 2020-12-31
13263ab9afeSSatoshi Sahara     */
1338068440fSSatoshi Sahara    public function buildDiffHead($l_rev, $r_rev)
13463ab9afeSSatoshi Sahara    {
135cb5998b4SSatoshi Sahara        dbg_deprecated('not used see '. \dokuwiki\Ui\PageDiff::class .'::show()');
13663ab9afeSSatoshi Sahara    }
13763ab9afeSSatoshi Sahara
13863ab9afeSSatoshi Sahara}
139