*
* 2009/01/23 : Creation
* 2009/01/26 : inherited subscription display option added, recursive parent subscription check fixed
* 2009/01/27 : Added ACL check for quick subscribe dropdown filling
*/
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'syntax.php');
/**
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class syntax_plugin_usersubscriptions extends DokuWiki_Syntax_Plugin {
/**
* return some info
*/
function getInfo(){
return confToHash(dirname(__FILE__).'/INFO');
}
function getType(){ return 'substition';}
function getSort(){ return 167; }
/**
* Connect pattern to lexer
*/
function connectTo($mode){
$this->Lexer->addSpecialPattern('', $mode, 'plugin_usersubscriptions');
}
/**
* Handle the match
*/
function handle($match, $state, $pos, &$handler) {
$match = strtolower(trim(substr($match, 19, -2)));
$options = preg_split('/\s/u', $match);
$recursive = false;
$deletelink = false;
$quicksubscribe = false;
$displayinheritedsubscriptions = false;
$ns = '';
if(count($options) > 0) {
$ns = trim($options[0]);
if(count($options) > 1) {
$os = array_slice($options, 1);
$opts = array();
for($i=0; $iinfo['cache'] = false;
if(($mode == 'xhtml') && isset($INFO['userinfo'])) {
global $ID;
$ns = $data[0];
$recursive = $data[1];
$deletelink = $data[2];
$quicksubscribe = $data[3];
$displayinheritedsubscriptions = $data[4];
$status = '';
// check if user requested a subscription deletion
if($unsubscribe = $_REQUEST['pluginusersubscriptions_unsubscribe']) {
// user chooses to unsubscribe -> update mlist file
list($type, $id) = preg_split('/-/u', $unsubscribe, 2);
if($type == 'pg') {
$file = metaFN($id, '.mlist');
}else{
if(!getNS($id)) {
$file = metaFN(getNS($id), '.mlist');
}else{
$file = metaFN(getNS($id), '/.mlist');
}
}
if(@file_exists($file)) {
$status = io_deleteFromFile($file, $INFO['client']."\n") ? 'success' : 'failure';
}
}
// check if user requested a new subscription
if($subscribe = $_REQUEST['pluginusersubscriptions_subscribe']) {
if($subscribe != '') {
// user chooses to subscribe -> update mlist file
list($type, $id) = preg_split('/-/u', $subscribe, 2);
if(auth_quickaclcheck($id) >= AUTH_READ) {
if($type == 'pg') {
$file = metaFN($id, '.mlist');
$update = !is_subscribed($id, $INFO['client'], false);
}else{
$file = metaFN($id, '/.mlist');
$update = !is_subscribed($id.':', $INFO['client'], true);
}
if($update) {
$status = io_saveFile($file, $INFO['client']."\n", @file_exists($file)) ? 'success' : 'failure';
}
}
}
}
// output the list
if($ns == '' || $ns == '.') {
$nss = $this->getLang('current_namespace');
$ns = getNS($ID);
}else if($ns == '*') {
$nss = $this->getLang('all_namespaces');
$ns = '';
}else $nss = $this->getLang('the_namespace').' '.$fmtns;
// get subscriptions
$elements = array();
$elements = $this->_getUserSubscriptions($ns, $recursive);
ksort($elements);
$tius = false;
$usersubscriptions = array();
foreach($elements as $id => $info) {
$info['inheritedsubscription'] = $info['subscribedfromparent'] && !$info['selfsubscribed'];
$info['deleteoption'] = $info['selfsubscribed'] && $deletelink;
$info['display'] = $info['usersubscribed'] && ($displayinheritedsubscriptions || (!$displayinheritedsubscriptions && $info['selfsubscribed']));
$id = preg_replace('/:$/', '', $id);
$usersubscriptions[$id] = $info;
}
ob_start();
if(file_exists(DOKU_TPLINC.'usersubscriptions.tpl.php')) include DOKU_TPLINC.'usersubscriptions.tpl.php';
else include DOKU_PLUGIN.'usersubscriptions/usersubscriptions.tpl.php';
$content = ob_get_contents();
ob_end_clean();
$renderer->doc .= $content;
return true;
}
return false;
}
function _getUserSubscriptions($ns, $recursive, $lvl=0, $nss=false) {
global $INFO;
$us = array();
$exclude = array(
'`\_+template\.txt:?$`',
'`sidebar\.txt:?$`'
);
$isns = !preg_match('/\.txt:$/', $ns);
foreach($exclude as $r) if(preg_match($r, $ns)) return $us;
if(auth_quickaclcheck($ns) < AUTH_READ) return $us;
$cns = preg_replace('/\.txt:$/', '', $ns);
$s = is_subscribed($cns, $INFO['client'], false);
$sns = is_subscribed($cns, $INFO['client'], true);
$us[$cns] = array(
'isnamespace' => $isns,
'usersubscribed' => ($s || $sns || $nss),
'selfsubscribed' => ($isns && $sns) || (!$isns && $s),
'subscribedfromparent' => (!$isns && $sns) || $nss,
'lvl' => $lvl
);
if($ns == $cns) {
foreach(new DirectoryIterator(preg_replace('/\.txt$/', '', wikiFN($cns))) as $item) {
if(!$item->isDot() && ($recursive != -1)) {
$scns = strtolower($cns.$item->getFilename().':');
if($item->isFile() && !preg_match('/\.txt:?$/', $scns)) continue;
$us = array_merge($us, $this->_getUserSubscriptions($scns, $recursive-1, $lvl+1, $nss || ($sns && !$s)));
}
}
}
return $us;
}
}
?>