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