xref: /dokuwiki/inc/Ui/Diff.php (revision d9c75b22c52ca1b35878418dff1a583d3968d8ad)
163ab9afeSSatoshi Sahara<?php
263ab9afeSSatoshi Sahara
363ab9afeSSatoshi Saharanamespace dokuwiki\Ui;
463ab9afeSSatoshi Sahara
563ab9afeSSatoshi Sahara/**
663ab9afeSSatoshi Sahara * DokuWiki Diff Interface
763ab9afeSSatoshi Sahara * parent class of PageDiff and MediaDiff
863ab9afeSSatoshi Sahara *
963ab9afeSSatoshi Sahara * @package dokuwiki\Ui
1063ab9afeSSatoshi Sahara */
1163ab9afeSSatoshi Saharaabstract class Diff extends Ui
1263ab9afeSSatoshi Sahara{
13edb50e6aSSatoshi Sahara    /* @var string */
14edb50e6aSSatoshi Sahara    protected $id;   // page id or media id
15e71e09a6SSatoshi Sahara    protected $item; // page or media
16edb50e6aSSatoshi Sahara
17b4b4c5c6SSatoshi Sahara    /* @var int */
183d0f231eSSatoshi Sahara    protected $oldRev;  // timestamp of older revision, left side
193d0f231eSSatoshi Sahara    protected $newRev;  // timestamp of newer revision, right side
200bb448f0SSatoshi Sahara    protected $last_rev; // current revision, or last revision when it had removed
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    /**
45*d9c75b22SSatoshi Sahara     * item filename resolver
46*d9c75b22SSatoshi Sahara     *
47*d9c75b22SSatoshi Sahara     * @param string $id  page id or media id
48*d9c75b22SSatoshi Sahara     * @param int|string $rev revision timestamp, or empty string for current one
49*d9c75b22SSatoshi Sahara     * @return string full path
50*d9c75b22SSatoshi Sahara     */
51*d9c75b22SSatoshi Sahara    abstract protected function itemFN($id, $rev = '');
52*d9c75b22SSatoshi Sahara
53*d9c75b22SSatoshi Sahara    /**
54b4b4c5c6SSatoshi Sahara     * Set a pair of revisions to be compared
55b4b4c5c6SSatoshi Sahara     *
563d0f231eSSatoshi Sahara     * @param int $oldRev
573d0f231eSSatoshi Sahara     * @param int $newRev
58b4b4c5c6SSatoshi Sahara     * @return $this
59b4b4c5c6SSatoshi Sahara     */
603d0f231eSSatoshi Sahara    public function compare($oldRev, $newRev)
61b4b4c5c6SSatoshi Sahara    {
623d0f231eSSatoshi Sahara        $this->oldRev = $oldRev;
633d0f231eSSatoshi Sahara        $this->newRev = $newRev;
64b4b4c5c6SSatoshi Sahara        return $this;
65b4b4c5c6SSatoshi Sahara    }
66b4b4c5c6SSatoshi Sahara
67b4b4c5c6SSatoshi Sahara    /**
68edb50e6aSSatoshi Sahara     * Gets or Sets preference of the Ui\Diff object
69edb50e6aSSatoshi Sahara     *
70edb50e6aSSatoshi Sahara     * @param string|array $prefs  a key name or key-value pair(s)
71edb50e6aSSatoshi Sahara     * @param mixed $value         value used when the first args is string
72edb50e6aSSatoshi Sahara     * @return array|$this
73edb50e6aSSatoshi Sahara     */
74edb50e6aSSatoshi Sahara    public function preference($prefs = null, $value = null)
75edb50e6aSSatoshi Sahara    {
76edb50e6aSSatoshi Sahara        // set
77295564cdSSatoshi Sahara        if (is_string($prefs) && isset($value)) {
78295564cdSSatoshi Sahara            $this->preference[$prefs] = $value;
79295564cdSSatoshi Sahara            return $this;
80295564cdSSatoshi Sahara        } elseif (is_array($prefs)) {
81edb50e6aSSatoshi Sahara            foreach ($prefs as $name => $value) {
82edb50e6aSSatoshi Sahara                $this->preference[$name] = $value;
83edb50e6aSSatoshi Sahara            }
84edb50e6aSSatoshi Sahara            return $this;
85edb50e6aSSatoshi Sahara        }
86edb50e6aSSatoshi Sahara        // get
87edb50e6aSSatoshi Sahara        return $this->preference;
88edb50e6aSSatoshi Sahara    }
89edb50e6aSSatoshi Sahara
90b4b4c5c6SSatoshi Sahara    /**
91b4b4c5c6SSatoshi Sahara     * Retrieve requested revision(s) and difftype from Ui\Revisions
92b4b4c5c6SSatoshi Sahara     *
93b4b4c5c6SSatoshi Sahara     * @return void
94b4b4c5c6SSatoshi Sahara     */
95b4b4c5c6SSatoshi Sahara    protected function preProcess()
96b4b4c5c6SSatoshi Sahara    {
97b4b4c5c6SSatoshi Sahara        global $INPUT;
98b4b4c5c6SSatoshi Sahara
99b4b4c5c6SSatoshi Sahara        // difflink icon click, eg. ?rev=123456789&do=diff
100b4b4c5c6SSatoshi Sahara        if ($INPUT->has('rev')) {
1013d0f231eSSatoshi Sahara            $this->oldRev = $INPUT->int('rev');
1023d0f231eSSatoshi Sahara            $this->newRev = ''; // current revision
103b4b4c5c6SSatoshi Sahara        }
104b4b4c5c6SSatoshi Sahara
105b4b4c5c6SSatoshi Sahara        // submit button with two checked boxes
106b4b4c5c6SSatoshi Sahara        $rev2 = $INPUT->arr('rev2', []);
107b4b4c5c6SSatoshi Sahara        if (count($rev2) > 1) {
108b4b4c5c6SSatoshi Sahara            if ($rev2[0] == 'current') {
1093d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], ''];
110b4b4c5c6SSatoshi Sahara            } elseif ($rev2[1] == 'current') {
1113d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], ''];
112b4b4c5c6SSatoshi Sahara            } elseif ($rev2[0] < $rev2[1]) {
1133d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[0], $rev2[1]];
114b4b4c5c6SSatoshi Sahara            } else {
1153d0f231eSSatoshi Sahara                [$this->oldRev, $this->newRev] = [$rev2[1], $rev2[0]];
116b4b4c5c6SSatoshi Sahara            }
117b4b4c5c6SSatoshi Sahara        }
118b4b4c5c6SSatoshi Sahara
119b4b4c5c6SSatoshi Sahara        // diff view type
120b4b4c5c6SSatoshi Sahara        if ($INPUT->has('difftype')) {
121b4b4c5c6SSatoshi Sahara            // retrieve requested $difftype
122b4b4c5c6SSatoshi Sahara            $this->preference['difftype'] = $INPUT->str('difftype');
123b4b4c5c6SSatoshi Sahara        } else {
124b4b4c5c6SSatoshi Sahara            // read preference from DokuWiki cookie. PageDiff only
12591e70b5fSSatoshi Sahara            get_doku_pref('difftype', $mode);
12691e70b5fSSatoshi Sahara            if (isset($mode)) $this->preference['difftype'] = $mode;
127b4b4c5c6SSatoshi Sahara        }
128b4b4c5c6SSatoshi Sahara    }
129b4b4c5c6SSatoshi Sahara
130179b4660SSatoshi Sahara    /**
131179b4660SSatoshi Sahara     * get extended revision info
132179b4660SSatoshi Sahara     *
133179b4660SSatoshi Sahara     * @param int|string $rev  revision identifier, '' means current one
134179b4660SSatoshi Sahara     * @return array  revision info structure of a page or media file
135179b4660SSatoshi Sahara     */
136179b4660SSatoshi Sahara    protected function getExtendedRevisionInfo($rev)
137179b4660SSatoshi Sahara    {
138179b4660SSatoshi Sahara        $changelog =& $this->changelog;
139179b4660SSatoshi Sahara
140179b4660SSatoshi Sahara        if ($rev) {
141179b4660SSatoshi Sahara            $info = $changelog->getRevisionInfo($rev);
142179b4660SSatoshi Sahara        } elseif (file_exists($filename = $this->itemFN($this->id))) {
143179b4660SSatoshi Sahara            $rev = filemtime(fullpath($filename));
144179b4660SSatoshi Sahara            $info = $changelog->getRevisionInfo($rev) + array(
145179b4660SSatoshi Sahara                'current' => true,
146179b4660SSatoshi Sahara            );
147179b4660SSatoshi Sahara        } else { // once exists, but now removed
148179b4660SSatoshi Sahara            $info = array(
149179b4660SSatoshi Sahara                'current' => true,
150179b4660SSatoshi Sahara            );
151179b4660SSatoshi Sahara        }
152179b4660SSatoshi Sahara        return array('item' => $this->item) + $info;
153179b4660SSatoshi Sahara    }
154179b4660SSatoshi Sahara
155b4b4c5c6SSatoshi Sahara
156edb50e6aSSatoshi Sahara
15763ab9afeSSatoshi Sahara    /**
158ec019cbfSSatoshi Sahara     * Build header of diff HTML
15963ab9afeSSatoshi Sahara     *
16063ab9afeSSatoshi Sahara     * @param string $l_rev   Left revisions
16163ab9afeSSatoshi Sahara     * @param string $r_rev   Right revision
16263ab9afeSSatoshi Sahara     * @return string[] HTML snippets for diff header
163cb5998b4SSatoshi Sahara     * @deprecated 2020-12-31
16463ab9afeSSatoshi Sahara     */
1658068440fSSatoshi Sahara    public function buildDiffHead($l_rev, $r_rev)
16663ab9afeSSatoshi Sahara    {
167cb5998b4SSatoshi Sahara        dbg_deprecated('not used see '. \dokuwiki\Ui\PageDiff::class .'::show()');
16863ab9afeSSatoshi Sahara    }
16963ab9afeSSatoshi Sahara
17063ab9afeSSatoshi Sahara}
171