xref: /dokuwiki/inc/Ui/Diff.php (revision 0ea1f71b7d54820e8e5d7d960b0a4a8ed4206099)
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
18*0ea1f71bSSatoshi Sahara    /* @var int */
19d1575179SSatoshi Sahara    protected $oldRev;  // timestamp of older revision
20*0ea1f71bSSatoshi 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();
370a475154SSatoshi Sahara        // ensure to have valid changelog::currentRevision property
380a475154SSatoshi Sahara        $this->changelog->getCurrentRevisionInfo();
39edb50e6aSSatoshi Sahara    }
40edb50e6aSSatoshi Sahara
41edb50e6aSSatoshi Sahara    /**
428068440fSSatoshi Sahara     * set class property changelog
438068440fSSatoshi Sahara     */
448068440fSSatoshi Sahara    abstract protected function setChangeLog();
458068440fSSatoshi Sahara
468068440fSSatoshi Sahara    /**
47*0ea1f71bSSatoshi Sahara     * Prepare revision info of comparison pair
48*0ea1f71bSSatoshi Sahara     */
49*0ea1f71bSSatoshi Sahara    abstract protected function preProcess();
50*0ea1f71bSSatoshi Sahara
51*0ea1f71bSSatoshi Sahara    /**
52b4b4c5c6SSatoshi Sahara     * Set a pair of revisions to be compared
53b4b4c5c6SSatoshi Sahara     *
543d0f231eSSatoshi Sahara     * @param int $oldRev
553d0f231eSSatoshi Sahara     * @param int $newRev
56b4b4c5c6SSatoshi Sahara     * @return $this
57b4b4c5c6SSatoshi Sahara     */
583d0f231eSSatoshi Sahara    public function compare($oldRev, $newRev)
59b4b4c5c6SSatoshi Sahara    {
60*0ea1f71bSSatoshi Sahara        if ($oldRev < $newRev) {
61*0ea1f71bSSatoshi Sahara            [$this->oldRev, $this->newRev] = [$oldRev, $newRev];
62*0ea1f71bSSatoshi Sahara        } else {
63*0ea1f71bSSatoshi Sahara            [$this->oldRev, $this->newRev] = [$newRev, $oldRev];
64*0ea1f71bSSatoshi Sahara        }
65b4b4c5c6SSatoshi Sahara        return $this;
66b4b4c5c6SSatoshi Sahara    }
67b4b4c5c6SSatoshi Sahara
68b4b4c5c6SSatoshi Sahara    /**
69edb50e6aSSatoshi Sahara     * Gets or Sets preference of the Ui\Diff object
70edb50e6aSSatoshi Sahara     *
71edb50e6aSSatoshi Sahara     * @param string|array $prefs  a key name or key-value pair(s)
72edb50e6aSSatoshi Sahara     * @param mixed $value         value used when the first args is string
73edb50e6aSSatoshi Sahara     * @return array|$this
74edb50e6aSSatoshi Sahara     */
75edb50e6aSSatoshi Sahara    public function preference($prefs = null, $value = null)
76edb50e6aSSatoshi Sahara    {
77edb50e6aSSatoshi Sahara        // set
78295564cdSSatoshi Sahara        if (is_string($prefs) && isset($value)) {
79295564cdSSatoshi Sahara            $this->preference[$prefs] = $value;
80295564cdSSatoshi Sahara            return $this;
81295564cdSSatoshi Sahara        } elseif (is_array($prefs)) {
82edb50e6aSSatoshi Sahara            foreach ($prefs as $name => $value) {
83edb50e6aSSatoshi Sahara                $this->preference[$name] = $value;
84edb50e6aSSatoshi Sahara            }
85edb50e6aSSatoshi Sahara            return $this;
86edb50e6aSSatoshi Sahara        }
87edb50e6aSSatoshi Sahara        // get
88edb50e6aSSatoshi Sahara        return $this->preference;
89edb50e6aSSatoshi Sahara    }
90edb50e6aSSatoshi Sahara
91b4b4c5c6SSatoshi Sahara    /**
92*0ea1f71bSSatoshi Sahara     * Handle requested revision(s)
93b4b4c5c6SSatoshi Sahara     *
94b4b4c5c6SSatoshi Sahara     * @return void
95b4b4c5c6SSatoshi Sahara     */
96*0ea1f71bSSatoshi Sahara    protected function handle()
97b4b4c5c6SSatoshi Sahara    {
98b4b4c5c6SSatoshi Sahara        global $INPUT;
99b4b4c5c6SSatoshi Sahara
100b4b4c5c6SSatoshi Sahara        // difflink icon click, eg. ?rev=123456789&do=diff
101b4b4c5c6SSatoshi Sahara        if ($INPUT->has('rev')) {
1023d0f231eSSatoshi Sahara            $this->oldRev = $INPUT->int('rev');
103*0ea1f71bSSatoshi Sahara            $this->newRev = $this->changelog->currentRevision();
104b4b4c5c6SSatoshi Sahara        }
105b4b4c5c6SSatoshi Sahara
106b4b4c5c6SSatoshi Sahara        // submit button with two checked boxes
107b4b4c5c6SSatoshi Sahara        $rev2 = $INPUT->arr('rev2', []);
108b4b4c5c6SSatoshi Sahara        if (count($rev2) > 1) {
109*0ea1f71bSSatoshi Sahara            if ($rev2[0] < $rev2[1]) {
1103d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], $rev2[1]];
111b4b4c5c6SSatoshi Sahara            } else {
1123d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], $rev2[0]];
113b4b4c5c6SSatoshi Sahara            }
114b4b4c5c6SSatoshi Sahara        }
115b4b4c5c6SSatoshi Sahara    }
116b4b4c5c6SSatoshi Sahara
117179b4660SSatoshi Sahara
118b4b4c5c6SSatoshi Sahara
119edb50e6aSSatoshi Sahara
12063ab9afeSSatoshi Sahara    /**
121ec019cbfSSatoshi Sahara     * Build header of diff HTML
12263ab9afeSSatoshi Sahara     *
12363ab9afeSSatoshi Sahara     * @param string $l_rev   Left revisions
12463ab9afeSSatoshi Sahara     * @param string $r_rev   Right revision
12563ab9afeSSatoshi Sahara     * @return string[] HTML snippets for diff header
126cb5998b4SSatoshi Sahara     * @deprecated 2020-12-31
12763ab9afeSSatoshi Sahara     */
1288068440fSSatoshi Sahara    public function buildDiffHead($l_rev, $r_rev)
12963ab9afeSSatoshi Sahara    {
130cb5998b4SSatoshi Sahara        dbg_deprecated('not used see '. \dokuwiki\Ui\PageDiff::class .'::show()');
13163ab9afeSSatoshi Sahara    }
13263ab9afeSSatoshi Sahara
13363ab9afeSSatoshi Sahara}
134