xref: /dokuwiki/inc/Ui/Diff.php (revision 0a4751547d37ca4ab439c6b32d37c8f1f87c159d)
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
1892440599SSatoshi Sahara    /* @var int|string */
1992440599SSatoshi Sahara    protected $oldRev;  // timestamp of older revision, '' means current one
2092440599SSatoshi Sahara    protected $newRev;  // timestamp of newer revision, '' means current one
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();
37*0a475154SSatoshi Sahara        // ensure to have valid changelog::currentRevision property
38*0a475154SSatoshi 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    /**
47b4b4c5c6SSatoshi Sahara     * Set a pair of revisions to be compared
48b4b4c5c6SSatoshi Sahara     *
493d0f231eSSatoshi Sahara     * @param int $oldRev
503d0f231eSSatoshi Sahara     * @param int $newRev
51b4b4c5c6SSatoshi Sahara     * @return $this
52b4b4c5c6SSatoshi Sahara     */
533d0f231eSSatoshi Sahara    public function compare($oldRev, $newRev)
54b4b4c5c6SSatoshi Sahara    {
553d0f231eSSatoshi Sahara        $this->oldRev = $oldRev;
563d0f231eSSatoshi Sahara        $this->newRev = $newRev;
57b4b4c5c6SSatoshi Sahara        return $this;
58b4b4c5c6SSatoshi Sahara    }
59b4b4c5c6SSatoshi Sahara
60b4b4c5c6SSatoshi Sahara    /**
61edb50e6aSSatoshi Sahara     * Gets or Sets preference of the Ui\Diff object
62edb50e6aSSatoshi Sahara     *
63edb50e6aSSatoshi Sahara     * @param string|array $prefs  a key name or key-value pair(s)
64edb50e6aSSatoshi Sahara     * @param mixed $value         value used when the first args is string
65edb50e6aSSatoshi Sahara     * @return array|$this
66edb50e6aSSatoshi Sahara     */
67edb50e6aSSatoshi Sahara    public function preference($prefs = null, $value = null)
68edb50e6aSSatoshi Sahara    {
69edb50e6aSSatoshi Sahara        // set
70295564cdSSatoshi Sahara        if (is_string($prefs) && isset($value)) {
71295564cdSSatoshi Sahara            $this->preference[$prefs] = $value;
72295564cdSSatoshi Sahara            return $this;
73295564cdSSatoshi Sahara        } elseif (is_array($prefs)) {
74edb50e6aSSatoshi Sahara            foreach ($prefs as $name => $value) {
75edb50e6aSSatoshi Sahara                $this->preference[$name] = $value;
76edb50e6aSSatoshi Sahara            }
77edb50e6aSSatoshi Sahara            return $this;
78edb50e6aSSatoshi Sahara        }
79edb50e6aSSatoshi Sahara        // get
80edb50e6aSSatoshi Sahara        return $this->preference;
81edb50e6aSSatoshi Sahara    }
82edb50e6aSSatoshi Sahara
83b4b4c5c6SSatoshi Sahara    /**
84b4b4c5c6SSatoshi Sahara     * Retrieve requested revision(s) and difftype from Ui\Revisions
85b4b4c5c6SSatoshi Sahara     *
86b4b4c5c6SSatoshi Sahara     * @return void
87b4b4c5c6SSatoshi Sahara     */
88b4b4c5c6SSatoshi Sahara    protected function preProcess()
89b4b4c5c6SSatoshi Sahara    {
90b4b4c5c6SSatoshi Sahara        global $INPUT;
91*0a475154SSatoshi Sahara        $changelog =& $this->changelog;
92b4b4c5c6SSatoshi Sahara
93b4b4c5c6SSatoshi Sahara        // difflink icon click, eg. ?rev=123456789&do=diff
94b4b4c5c6SSatoshi Sahara        if ($INPUT->has('rev')) {
953d0f231eSSatoshi Sahara            $this->oldRev = $INPUT->int('rev');
96*0a475154SSatoshi Sahara            $this->newRev = $changelog->currentRevision();
97b4b4c5c6SSatoshi Sahara        }
98b4b4c5c6SSatoshi Sahara
99b4b4c5c6SSatoshi Sahara        // submit button with two checked boxes
100b4b4c5c6SSatoshi Sahara        $rev2 = $INPUT->arr('rev2', []);
101b4b4c5c6SSatoshi Sahara        if (count($rev2) > 1) {
102b4b4c5c6SSatoshi Sahara            if ($rev2[0] == 'current') {
103*0a475154SSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], $changelog->currentRevision()];
104b4b4c5c6SSatoshi Sahara            } elseif ($rev2[1] == 'current') {
105*0a475154SSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], $changelog->currentRevision()];
106b4b4c5c6SSatoshi Sahara            } elseif ($rev2[0] < $rev2[1]) {
1073d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], $rev2[1]];
108b4b4c5c6SSatoshi Sahara            } else {
1093d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], $rev2[0]];
110b4b4c5c6SSatoshi Sahara            }
111b4b4c5c6SSatoshi Sahara        }
112b4b4c5c6SSatoshi Sahara
113b4b4c5c6SSatoshi Sahara        // diff view type
114b4b4c5c6SSatoshi Sahara        if ($INPUT->has('difftype')) {
115b4b4c5c6SSatoshi Sahara            // retrieve requested $difftype
116b4b4c5c6SSatoshi Sahara            $this->preference['difftype'] = $INPUT->str('difftype');
117b4b4c5c6SSatoshi Sahara        } else {
118b4b4c5c6SSatoshi Sahara            // read preference from DokuWiki cookie. PageDiff only
1192fe2fb53SSatoshi Sahara            $mode = get_doku_pref('difftype', $mode = null);
12091e70b5fSSatoshi Sahara            if (isset($mode)) $this->preference['difftype'] = $mode;
121b4b4c5c6SSatoshi Sahara        }
122b4b4c5c6SSatoshi Sahara    }
123b4b4c5c6SSatoshi Sahara
124179b4660SSatoshi Sahara    /**
125179b4660SSatoshi Sahara     * get extended revision info
126179b4660SSatoshi Sahara     *
127cc5508feSSatoshi Sahara     * @param int|string $rev  revision identifier, '' means current one, null means
128179b4660SSatoshi Sahara     * @return array  revision info structure of a page or media file
129179b4660SSatoshi Sahara     */
130179b4660SSatoshi Sahara    protected function getExtendedRevisionInfo($rev)
131179b4660SSatoshi Sahara    {
132179b4660SSatoshi Sahara        $changelog =& $this->changelog;
133179b4660SSatoshi Sahara
134*0a475154SSatoshi Sahara        if ($rev == '' || $rev == 'current') {
135*0a475154SSatoshi Sahara            $info = $changelog->getCurrentRevisionInfo();
136*0a475154SSatoshi Sahara        } elseif (is_numeric($rev)) {
137179b4660SSatoshi Sahara            $info = $changelog->getRevisionInfo($rev);
138*0a475154SSatoshi Sahara        } else { //if do=diff at just created page
139*0a475154SSatoshi Sahara            $info = ['none' => true];
140179b4660SSatoshi Sahara        }
141*0a475154SSatoshi Sahara        return $info;
142179b4660SSatoshi Sahara    }
143179b4660SSatoshi Sahara
144b4b4c5c6SSatoshi Sahara
145edb50e6aSSatoshi Sahara
14663ab9afeSSatoshi Sahara    /**
147ec019cbfSSatoshi Sahara     * Build header of diff HTML
14863ab9afeSSatoshi Sahara     *
14963ab9afeSSatoshi Sahara     * @param string $l_rev   Left revisions
15063ab9afeSSatoshi Sahara     * @param string $r_rev   Right revision
15163ab9afeSSatoshi Sahara     * @return string[] HTML snippets for diff header
152cb5998b4SSatoshi Sahara     * @deprecated 2020-12-31
15363ab9afeSSatoshi Sahara     */
1548068440fSSatoshi Sahara    public function buildDiffHead($l_rev, $r_rev)
15563ab9afeSSatoshi Sahara    {
156cb5998b4SSatoshi Sahara        dbg_deprecated('not used see '. \dokuwiki\Ui\PageDiff::class .'::show()');
15763ab9afeSSatoshi Sahara    }
15863ab9afeSSatoshi Sahara
15963ab9afeSSatoshi Sahara}
160