*/
// based on http://wiki.splitbrain.org/plugin:tutorial
// must be run within Dokuwiki
if (!defined('DOKU_INC')) die();
if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
require_once(DOKU_PLUGIN . 'syntax.php');
require_once(DOKU_PLUGIN . 'mantis/lib/nusoap.php');
/**
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class syntax_plugin_mantis extends DokuWiki_Syntax_Plugin {
private $sPath = "data/cache/mantis/";
function getInfo() {
return array(
'author' => 'Christoph Lang',
'email' => 'calbity@gmx.de',
'date' => '2010-04-05',
'name' => 'Mantis Bug Tracker',
'desc' => 'Show Bugs from Mantis',
'url' => 'http://www.sdzecom.de'
);
}
private function _load($filename){
$Cache = null;
$Update = true;
if(file_exists($filename)){
$Content = file_get_contents($filename);
$Content = unserialize($Content);
$Update = $Content["Update"];
if(time() > $Update)
$Update = true;
else
$Update = false;
$Cache = $Content["Content"];
}
return array($Update,$Cache);
}
private function _save($filename,$rs,$timestamp){
$timestamp = (time() + ($timestamp*60));
$Cache = array();
$Cache["Update"] = $timestamp;
$Cache["Content"] = $rs;
$Cache = serialize($Cache);
$handle = fopen($filename,"w");
fwrite($handle,$Cache);
fclose($handle);
}
private function getBox($text){
$sText = '
'.$text.'
';
return $sText;
}
private function replace($data) {
$info = $this->getInfo();
$sReturn = "";
if(!class_exists("soapclient")){
$text = str_replace('[url]',$info['url'],$this->getLang('nosoap'));
$sReturn = $this->getBox($text);
return $sReturn;
}
$server = $this->getConf('mantis_server');
$user = $this->getConf('mantis_user');
$pass = $this->getConf('mantis_password');
$refresh = $this->getConf('mantis_refresh');
$limit = $this->getConf('mantis_limit');
if(empty($server) || empty($user) || empty($pass)){
$text = str_replace('[url]',$info['url'],$this->getLang('noconfig'));
$sReturn = $this->getBox($text);
return $sReturn;
}
if(!is_dir($this->sPath))
mkdir($this->sPath);
$filename = $this->sPath.md5(implode(".",$data));
$Cache = $this->_load($filename);
//print_r($Cache);
if(is_array($Cache)){
if($Cache[0] == false)
return $Cache[1];
}
if (extension_loaded('soap'))
$client = new soapclient($server);
else
$client = new soapclient($server,true);
$sReturn .= "Project: ";
if(!is_numeric($data[1])){
try{
if (extension_loaded('soap')){
$return = $client->mc_projects_get_user_accessible($user,$pass);
$i=1;
$project_name = $data[$i];
while(isset($project_name) && !empty($project_name)){
if($return == false){
$text = str_replace(array('[url]','[project]'),array($server,$project_name),$this->getLang('accessdenied'));
$sReturn = $this->getBox($text);
return $sReturn;
}
if(empty($return)){
$text = str_replace(array('[url]','[project]'),array($info['url'],$project_name),$this->getLang('projectnotfound'));
$sReturn = $this->getBox($text);
return $sReturn;
}
foreach($return as $project){
if($project->name == $project_name){
$projectid = $project->id;
$return = $project->subprojects;
}
}
if($i > 1)
$sReturn .= " > ";
$sReturn .= $project_name." (".$projectid.")";
$i++;
$project_name = $data[$i];
}
if(empty($projectid)){
$text = str_replace(array('[url]','[project]'),array($info['url'],$data[($i-1)]),$this->getLang('projectnotfound'));
$sReturn = $this->getBox($text);
return $sReturn;
}
}else{
$return = $client->call("mc_projects_get_user_accessible",array($user,$pass));
$i=1;
$project_name = $data[$i];
while(isset($project_name) && !empty($project_name)){
if($return == false){
$text = str_replace(array('[url]','[project]'),array($server,$project_name),$this->getLang('accessdenied'));
$sReturn = $this->getBox($text);
return $sReturn;
}
if(empty($return)){
$text = str_replace(array('[url]','[project]'),array($info['url'],$project_name),$this->getLang('projectnotfound'));
$sReturn = $this->getBox($text);
return $sReturn;
}
foreach($return as $project){
if($project["name"] == $project_name){
$projectid = $project["id"];
$return = $project["subprojects"];
}
}
if($i > 1)
$sReturn .= " > ";
$sReturn .= $project_name." (".$projectid.")";
$i++;
$project_name = $data[$i];
}
if(empty($projectid)){
$text = str_replace(array('[url]','[project]'),array($info['url'],$data[($i-1)]),$this->getLang('projectnotfound'));
$sReturn = $this->getBox($text);
return $sReturn;
}
}
}catch(Exception $ex){
$text = str_replace('[url]',$server,$this->getLang('accessdenied'));
$sReturn = $this->getBox($text);
return $sReturn;
}
}else{
$projectid = $data[1];
}
// make the call
try{
if (extension_loaded('soap'))
$return = $client->mc_project_get_issues($user,$pass,$projectid,1,$limit);
else
$return = $client->call("mc_project_get_issues",array($user,$pass,$projectid,1,$limit));
}catch(Exception $ex){
$text = str_replace('[url]',$info['url'],$this->getLang('accessdenied'));
$sReturn = $this->getBox($text);
return $sReturn;
}
if(empty($return)){
$text = str_replace('[url]',$info['url'],$this->getLang('noissuesfound'));
$sReturn = $this->getBox($text);
return $sReturn;
}
$sReturn .= " - Issues: ".count($return)."
";
$sReturn .= '';
$i=0;
$sReturn .= '';
$sReturn .= ''.$this->getLang('table_summary').' | '.$this->getLang('table_reporter').' | '.$this->getLang('table_description').' | ';
$sReturn .= '
';
foreach($return as $key => $value){
$i++;
if (extension_loaded('soap')){
$sReturn .= '';
$sReturn .= '';
if($value->status->id == 60)
$sReturn .= "";
$sReturn .= $value->summary;
if($value->status->id == 60)
$sReturn .= "";
$sReturn .= ' | ';
$sReturn .= '';
if(!empty($value->reporter->real_name))
$sReturn .= $value->reporter->name;
else
$sReturn .= $value->reporter->real_name;
$sReturn .= ' | ';
$sReturn .= '';
$sReturn .= nl2br(trim($value->description));
$sReturn .= ' | ';
$sReturn .= '
';
}else{
$sReturn .= '';
$sReturn .= '';
if($value["status"]["id"] == 60)
$sReturn .= "";
$sReturn .= $value["summary"];
if($value["status"]["id"] == 60)
$sReturn .= "";
$sReturn .= ' | ';
$sReturn .= '';
if(!empty($value["reporter"]["real_name"]))
$sReturn .= $value["reporter"]["name"];
else
$sReturn .= $value["reporter"]["real_name"];
$sReturn .= ' | ';
$sReturn .= '';
$sReturn .= nl2br(trim($value["description"]));
$sReturn .= ' | ';
$sReturn .= '
';
}
}
$sReturn .= '
';
$sReturn = utf8_encode($sReturn);
$this->_save($filename,$sReturn,$refresh);
return $sReturn;
}
function connectTo($mode) {
//$this->Lexer->addSpecialPattern('\[\[Mantis\:.*?\]\]', $mode, 'plugin_mantis');
$this->Lexer->addSpecialPattern('{{Mantis>.*?}}', $mode, 'plugin_mantis');
}
function getType() { return 'substition'; }
function getSort() { return 215; }
function handle($match, $state, $pos, &$handler) {
$match = substr($match,2,-2);
$match = str_replace(":",">",$match);
$arrData = explode(">",$match);
return $arrData;
}
function render($mode, &$renderer, $data) {
if ($mode == 'xhtml') {
$renderer->doc .= $this->replace($data);
return true;
}
return false;
}
}