xref: /plugin/publish/helper.php (revision 1794c5facebc8ae31437fc55d2d73a19fef4f734)
1f576111dSAndreas Gohr<?php
2f576111dSAndreas Gohr/**
3f576111dSAndreas Gohr * DokuWiki Plugin publish (Helper Component)
4f576111dSAndreas Gohr *
5f576111dSAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6f576111dSAndreas Gohr * @author  Jarrod Lowe <dokuwiki@rrod.net>
7f576111dSAndreas Gohr * @author  Andreas Gohr <gohr@cosmocode.de>
8f576111dSAndreas Gohr */
9f576111dSAndreas Gohr
10f576111dSAndreas Gohr// must be run within Dokuwiki
11f576111dSAndreas Gohrif (!defined('DOKU_INC')) die();
12f576111dSAndreas Gohr
13f576111dSAndreas Gohrclass helper_plugin_publish extends DokuWiki_Plugin {
14f576111dSAndreas Gohr
15*1794c5faSDominik Eckelmann    private $sortedApprovedRevisions = null;
16*1794c5faSDominik Eckelmann
17f576111dSAndreas Gohr    // FIXME find out what this is supposed to do and how it can be done better
18f576111dSAndreas Gohr    function in_namespace($valid, $check) {
19f576111dSAndreas Gohr        // PHP apparantly does not have closures -
20f576111dSAndreas Gohr        // so we will parse $valid ourselves. Wasteful.
21f576111dSAndreas Gohr        $valid = preg_split('/\s+/', $valid);
22f576111dSAndreas Gohr        //if(count($valid) == 0) { return true; }//whole wiki matches
23f576111dSAndreas Gohr        if((count($valid)==1) and ($valid[0]=="")) { return true; }//whole wiki matches
24f576111dSAndreas Gohr        $check = trim($check, ':');
25f576111dSAndreas Gohr        $check = explode(':', $check);
26f576111dSAndreas Gohr
27f576111dSAndreas Gohr        // Check against all possible namespaces
28f576111dSAndreas Gohr        foreach($valid as $v) {
29f576111dSAndreas Gohr            $v = explode(':', $v);
30f576111dSAndreas Gohr            $n = 0;
31f576111dSAndreas Gohr            $c = count($v);
32f576111dSAndreas Gohr            $matching = 1;
33f576111dSAndreas Gohr
34f576111dSAndreas Gohr            // Check each element, untill all elements of $v satisfied
35f576111dSAndreas Gohr            while($n < $c) {
36f576111dSAndreas Gohr                if($v[$n] != $check[$n]) {
37f576111dSAndreas Gohr                    // not a match
38f576111dSAndreas Gohr                    $matching = 0;
39f576111dSAndreas Gohr                    break;
40f576111dSAndreas Gohr                }
41f576111dSAndreas Gohr                $n += 1;
42f576111dSAndreas Gohr            }
43f576111dSAndreas Gohr            if($matching == 1) { return true; } // a match
44f576111dSAndreas Gohr        }
45f576111dSAndreas Gohr        return false;
46f576111dSAndreas Gohr    }
47f576111dSAndreas Gohr
48f576111dSAndreas Gohr    // FIXME find out what this is supposed to do and how it can be done better
49f576111dSAndreas Gohr    function in_sub_namespace($valid, $check) {
50f576111dSAndreas Gohr        // is check a dir which contains any valid?
51f576111dSAndreas Gohr        // PHP apparantly does not have closures -
52f576111dSAndreas Gohr        // so we will parse $valid ourselves. Wasteful.
53f576111dSAndreas Gohr        $valid = preg_split('/\s+/', $valid);
54f576111dSAndreas Gohr        //if(count($valid) == 0) { return true; }//whole wiki matches
55f576111dSAndreas Gohr        if((count($valid)==1) and ($valid[0]=="")) { return true; }//whole wiki matches
56f576111dSAndreas Gohr        $check = trim($check, ':');
57f576111dSAndreas Gohr        $check = explode(':', $check);
58f576111dSAndreas Gohr
59f576111dSAndreas Gohr        // Check against all possible namespaces
60f576111dSAndreas Gohr        foreach($valid as $v) {
61f576111dSAndreas Gohr            $v = explode(':', $v);
62f576111dSAndreas Gohr            $n = 0;
63f576111dSAndreas Gohr            $c = count($check); //this is what is different from above!
64f576111dSAndreas Gohr            $matching = 1;
65f576111dSAndreas Gohr
66f576111dSAndreas Gohr            // Check each element, untill all elements of $v satisfied
67f576111dSAndreas Gohr            while($n < $c) {
68f576111dSAndreas Gohr                if($v[$n] != $check[$n]) {
69f576111dSAndreas Gohr                    // not a match
70f576111dSAndreas Gohr                    $matching = 0;
71f576111dSAndreas Gohr                    break;
72f576111dSAndreas Gohr                }
73f576111dSAndreas Gohr                $n += 1;
74f576111dSAndreas Gohr            }
75f576111dSAndreas Gohr            if($matching == 1) { return true; } // a match
76f576111dSAndreas Gohr        }
77f576111dSAndreas Gohr        return false;
78f576111dSAndreas Gohr    }
79f576111dSAndreas Gohr
80*1794c5faSDominik Eckelmann    function canApprove() {
81*1794c5faSDominik Eckelmann        global $INFO;
82*1794c5faSDominik Eckelmann        global $ID;
83*1794c5faSDominik Eckelmann
84*1794c5faSDominik Eckelmann        if (!$this->in_namespace($this->getConf('apr_namespaces'), $ID)) {
85*1794c5faSDominik Eckelmann            return false;
86*1794c5faSDominik Eckelmann        }
87*1794c5faSDominik Eckelmann
88*1794c5faSDominik Eckelmann        return ($INFO['perm'] >= AUTH_DELETE);
89*1794c5faSDominik Eckelmann    }
90*1794c5faSDominik Eckelmann
91*1794c5faSDominik Eckelmann    function getRevision() {
92*1794c5faSDominik Eckelmann        global $INFO;
93*1794c5faSDominik Eckelmann        if (!$INFO['rev']) {
94*1794c5faSDominik Eckelmann            return $INFO['lastmod'];
95*1794c5faSDominik Eckelmann        }
96*1794c5faSDominik Eckelmann        return $INFO['rev'];
97*1794c5faSDominik Eckelmann    }
98*1794c5faSDominik Eckelmann
99*1794c5faSDominik Eckelmann    function getApprovals() {
100*1794c5faSDominik Eckelmann        global $INFO;
101*1794c5faSDominik Eckelmann        if (!isset($INFO['meta']['approval'])) {
102*1794c5faSDominik Eckelmann            return array();
103*1794c5faSDominik Eckelmann        }
104*1794c5faSDominik Eckelmann        $approvals = $INFO['meta']['approval'];
105*1794c5faSDominik Eckelmann        return $approvals;
106*1794c5faSDominik Eckelmann    }
107*1794c5faSDominik Eckelmann
108*1794c5faSDominik Eckelmann    function getApprovalsOnRevision($revision) {
109*1794c5faSDominik Eckelmann        $approvals = $this->getApprovals();
110*1794c5faSDominik Eckelmann
111*1794c5faSDominik Eckelmann        if (isset($approvals[$revision])) {
112*1794c5faSDominik Eckelmann            return $approvals[$revision];
113*1794c5faSDominik Eckelmann        }
114*1794c5faSDominik Eckelmann        return array();
115*1794c5faSDominik Eckelmann    }
116*1794c5faSDominik Eckelmann
117*1794c5faSDominik Eckelmann    function getSortedApprovedRevisions() {
118*1794c5faSDominik Eckelmann        if ($this->sortedApprovedRevisions === null) {
119*1794c5faSDominik Eckelmann            $approvals = $this->getApprovals();
120*1794c5faSDominik Eckelmann            krsort($approvals);
121*1794c5faSDominik Eckelmann            $this->sortedApprovedRevisions = $approvals;
122*1794c5faSDominik Eckelmann        }
123*1794c5faSDominik Eckelmann        return $this->sortedApprovedRevisions;
124*1794c5faSDominik Eckelmann    }
125*1794c5faSDominik Eckelmann
126*1794c5faSDominik Eckelmann    function isRevisionApproved($revision) {
127*1794c5faSDominik Eckelmann        $approvals = $this->getApprovals();
128*1794c5faSDominik Eckelmann        if (!isset($approvals[$revision])) {
129*1794c5faSDominik Eckelmann            return false;
130*1794c5faSDominik Eckelmann        }
131*1794c5faSDominik Eckelmann        return (count($approvals[$revision]) >= $this->getConf('number_of_approved'));
132*1794c5faSDominik Eckelmann    }
133*1794c5faSDominik Eckelmann
134*1794c5faSDominik Eckelmann    function isCurrentRevisionApproved() {
135*1794c5faSDominik Eckelmann        return $this->isRevisionApproved($this->getRevision());
136*1794c5faSDominik Eckelmann    }
137*1794c5faSDominik Eckelmann
138*1794c5faSDominik Eckelmann    function getLatestApprovedRevision() {
139*1794c5faSDominik Eckelmann        $approvals = $this->getSortedApprovedRevisions();
140*1794c5faSDominik Eckelmann        foreach ($approvals as $revision => $ignored) {
141*1794c5faSDominik Eckelmann            if ($this->isRevisionApproved($revision)) {
142*1794c5faSDominik Eckelmann                return $revision;
143*1794c5faSDominik Eckelmann            }
144*1794c5faSDominik Eckelmann        }
145*1794c5faSDominik Eckelmann        return 0;
146*1794c5faSDominik Eckelmann    }
147*1794c5faSDominik Eckelmann
148*1794c5faSDominik Eckelmann    function getLastestRevision() {
149*1794c5faSDominik Eckelmann        global $INFO;
150*1794c5faSDominik Eckelmann        return $INFO['meta']['date']['modified'];
151*1794c5faSDominik Eckelmann    }
152*1794c5faSDominik Eckelmann
153*1794c5faSDominik Eckelmann    function getApprovalDate() {
154*1794c5faSDominik Eckelmann        if (!$this->isCurrentRevisionApproved()) {
155*1794c5faSDominik Eckelmann            return -1;
156*1794c5faSDominik Eckelmann        }
157*1794c5faSDominik Eckelmann
158*1794c5faSDominik Eckelmann        $approvals = $this->getApprovalsOnRevision($this->getRevision());
159*1794c5faSDominik Eckelmann        uasort($approvals, array(&$this, 'cmpApprovals'));
160*1794c5faSDominik Eckelmann        $keys = array_keys($approvals);
161*1794c5faSDominik Eckelmann        return $approvals[$keys[$this->getConf('number_of_approved') -1]][3];
162*1794c5faSDominik Eckelmann
163*1794c5faSDominik Eckelmann    }
164*1794c5faSDominik Eckelmann
165*1794c5faSDominik Eckelmann    function cmpApprovals($left, $right) {
166*1794c5faSDominik Eckelmann        if ($left[3] == $right[3]) {
167*1794c5faSDominik Eckelmann            return 0;
168*1794c5faSDominik Eckelmann        }
169*1794c5faSDominik Eckelmann        return ($left[3] < $right[3]) ? -1 : 1;
170*1794c5faSDominik Eckelmann    }
171*1794c5faSDominik Eckelmann
172*1794c5faSDominik Eckelmann    function getApprovers() {
173*1794c5faSDominik Eckelmann        $approvers = $this->getApprovalsOnRevision($this->getRevision());
174*1794c5faSDominik Eckelmann        $result = array();
175*1794c5faSDominik Eckelmann        foreach ($approvers as $approver) {
176*1794c5faSDominik Eckelmann            $result[] = editorinfo($this->getApproverName($approver));
177*1794c5faSDominik Eckelmann        }
178*1794c5faSDominik Eckelmann        return $result;
179*1794c5faSDominik Eckelmann    }
180*1794c5faSDominik Eckelmann
181*1794c5faSDominik Eckelmann    function getApproverName($approver) {
182*1794c5faSDominik Eckelmann        if ($approver[1]) {
183*1794c5faSDominik Eckelmann            return $approver[1];
184*1794c5faSDominik Eckelmann        }
185*1794c5faSDominik Eckelmann        if ($approver[2]) {
186*1794c5faSDominik Eckelmann            return $approver[2];
187*1794c5faSDominik Eckelmann        }
188*1794c5faSDominik Eckelmann        return $approver[0];
189*1794c5faSDominik Eckelmann    }
190*1794c5faSDominik Eckelmann
191*1794c5faSDominik Eckelmann    function getPreviousApprovedRevision() {
192*1794c5faSDominik Eckelmann        $currentRevision = $this->getRevision();
193*1794c5faSDominik Eckelmann        $approvals = $this->getSortedApprovedRevisions();
194*1794c5faSDominik Eckelmann        foreach ($approvals as $revision => $ignored) {
195*1794c5faSDominik Eckelmann            if ($revision >= $currentRevision) {
196*1794c5faSDominik Eckelmann                continue;
197*1794c5faSDominik Eckelmann            }
198*1794c5faSDominik Eckelmann            if ($this->isRevisionApproved($revision)) {
199*1794c5faSDominik Eckelmann                return $revision;
200*1794c5faSDominik Eckelmann            }
201*1794c5faSDominik Eckelmann        }
202*1794c5faSDominik Eckelmann        return 0;
203*1794c5faSDominik Eckelmann    }
204*1794c5faSDominik Eckelmann
205f576111dSAndreas Gohr}
206