xref: /dokuwiki/inc/Ui/Diff.php (revision e59e4a07f33d9032aad8b3fe4a0ca0aba9f9cc6a)
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     *
52*e59e4a07SSatoshi Sahara     * @param int $rev1 older revision
53*e59e4a07SSatoshi Sahara     * @param int $rev2 newer revision
54b4b4c5c6SSatoshi Sahara     * @return $this
55b4b4c5c6SSatoshi Sahara     */
56*e59e4a07SSatoshi Sahara    public function compare($rev1, $rev2)
57b4b4c5c6SSatoshi Sahara    {
58*e59e4a07SSatoshi Sahara        if ($rev2 < $rev1) [$rev1, $rev2] = [$rev2, $rev1];
59*e59e4a07SSatoshi Sahara        $this->oldRev = (int)$rev1;
60*e59e4a07SSatoshi Sahara        $this->newRev = (int)$this->changelog->traceCurrentRevision($rev2);
61b4b4c5c6SSatoshi Sahara        return $this;
62b4b4c5c6SSatoshi Sahara    }
63b4b4c5c6SSatoshi Sahara
64b4b4c5c6SSatoshi Sahara    /**
65edb50e6aSSatoshi Sahara     * Gets or Sets preference of the Ui\Diff object
66edb50e6aSSatoshi Sahara     *
67edb50e6aSSatoshi Sahara     * @param string|array $prefs  a key name or key-value pair(s)
68edb50e6aSSatoshi Sahara     * @param mixed $value         value used when the first args is string
69edb50e6aSSatoshi Sahara     * @return array|$this
70edb50e6aSSatoshi Sahara     */
71edb50e6aSSatoshi Sahara    public function preference($prefs = null, $value = null)
72edb50e6aSSatoshi Sahara    {
73edb50e6aSSatoshi Sahara        // set
74295564cdSSatoshi Sahara        if (is_string($prefs) && isset($value)) {
75295564cdSSatoshi Sahara            $this->preference[$prefs] = $value;
76295564cdSSatoshi Sahara            return $this;
77295564cdSSatoshi Sahara        } elseif (is_array($prefs)) {
78edb50e6aSSatoshi Sahara            foreach ($prefs as $name => $value) {
79edb50e6aSSatoshi Sahara                $this->preference[$name] = $value;
80edb50e6aSSatoshi Sahara            }
81edb50e6aSSatoshi Sahara            return $this;
82edb50e6aSSatoshi Sahara        }
83edb50e6aSSatoshi Sahara        // get
84edb50e6aSSatoshi Sahara        return $this->preference;
85edb50e6aSSatoshi Sahara    }
86edb50e6aSSatoshi Sahara
87b4b4c5c6SSatoshi Sahara    /**
880ea1f71bSSatoshi Sahara     * Handle requested revision(s)
89b4b4c5c6SSatoshi Sahara     *
90b4b4c5c6SSatoshi Sahara     * @return void
91b4b4c5c6SSatoshi Sahara     */
920ea1f71bSSatoshi Sahara    protected function handle()
93b4b4c5c6SSatoshi Sahara    {
94b4b4c5c6SSatoshi Sahara        global $INPUT;
95b4b4c5c6SSatoshi Sahara
96312e7095SSatoshi Sahara        // difflink icon click, eg. &do=diff&rev=#
97b4b4c5c6SSatoshi Sahara        if ($INPUT->has('rev')) {
983d0f231eSSatoshi Sahara            $this->oldRev = $INPUT->int('rev');
990ea1f71bSSatoshi Sahara            $this->newRev = $this->changelog->currentRevision();
100b4b4c5c6SSatoshi Sahara        }
101b4b4c5c6SSatoshi Sahara
102312e7095SSatoshi Sahara        // submit button with two checked boxes, eg. &do=diff&rev2[0]=#&rev2[1]=#
103312e7095SSatoshi Sahara        $revs = $INPUT->arr('rev2', []);
104312e7095SSatoshi Sahara        if (count($revs) > 1) {
105312e7095SSatoshi Sahara            list($rev1, $rev2) = $revs;
106312e7095SSatoshi Sahara            if ($rev2 < $rev1) [$rev1, $rev2] = [$rev2, $rev1];
107312e7095SSatoshi Sahara            $this->oldRev = (int)$rev1;
108312e7095SSatoshi Sahara            $this->newRev = (int)$this->changelog->traceCurrentRevision($rev2);
109b4b4c5c6SSatoshi Sahara        }
110312e7095SSatoshi Sahara
1115cb97057SSatoshi Sahara
1125cb97057SSatoshi Sahara        if (!isset($this->oldRev, $this->newRev)) {
1135cb97057SSatoshi Sahara            // no revision was given, compare previous to current
114312e7095SSatoshi Sahara            $rev2 = $this->changelog->currentRevision();
115312e7095SSatoshi Sahara            if ($rev2 > $this->changelog->lastRevision()) {
116312e7095SSatoshi Sahara                $rev1 = $this->changelog->lastRevision();
117312e7095SSatoshi Sahara            } else {
118312e7095SSatoshi Sahara                $revs = $changelog->getRevisions(0, 1);
119312e7095SSatoshi Sahara                $rev1 = count($revs) ? $revs[0] : false;
120312e7095SSatoshi Sahara            }
121312e7095SSatoshi Sahara            $this->oldRev = $rev1;
122312e7095SSatoshi Sahara            $this->newRev = $rev2;
1235cb97057SSatoshi Sahara        }
124b4b4c5c6SSatoshi Sahara    }
12563ab9afeSSatoshi Sahara}
126