*/
// 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');
// library providing the global 'cleanID()'/'getID()'/'wikiFN()' functions:
require_once(DOKU_INC . 'inc/pageutils.php');
/**
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class syntax_plugin_pchart extends DokuWiki_Syntax_Plugin {
function getInfo(){
return array(
'author' => 'Philippe Doussaint',
'email' => 'philippe.doussaint [at] freesbee [dot] fr',
'date' => '2008-08-22',
'name' => 'pChart plugin',
'desc' => 'Insert pChart graph in your DokuWiki pages.
See plugin page for syntax.',
'url' => 'http://www.dokuwiki.org/plugin:pChart',
);
}
function getType(){ return 'formatting'; }
function getAllowedTypes() { return array('substition'); }
function getSort() { return 208; }
function connectTo($mode) { $this->Lexer->addEntryPattern('.*?)',$mode,'plugin_pchart'); }
function postConnect() { $this->Lexer->addExitPattern('','plugin_pchart'); }
/**
* Handle the match
*/
function handle($match, $state, $pos, &$handler){
if ($state == DOKU_LEXER_UNMATCHED ) {
//keep name (if exist?) and syntax
list($name, $syntax) = preg_split('/>/u', $match, 2);
//find align
if (substr($syntax, 0, 1).substr($syntax, -1) == ' ' ) $align = 'center';
elseif (substr($syntax, 0, 1) == ' ' ) $align = 'right';
elseif (substr($syntax, -1) == ' ' ) $align = 'left';
else $align = 'normal';
//trim syntax
$syntax=trim($syntax);
//if name don't exist, we create one, else we removename=...
if ( $name == "" ) $name = "pchart_".md5($syntax);
else $name=preg_replace(array('/name=/'), array(''), $name);
//and add extension in any case
$name .= '.png';
return array($state,array($name, $syntax, $align));
}
return array();
}
/**
* Create output
*/
function render($mode, &$renderer, $data) {
if($mode == 'xhtml'){
$error_level = error_reporting();
error_reporting($error_level & ~E_NOTICE);
list($state, $match) = $data;
if ($state == DOKU_LEXER_UNMATCHED ) {
list($name, $syntax, $align) = $match;
//Just print info for debug
//$renderer->doc .= $name."-".$syntax."-".$align;
// build the chart file
$this->doChart($name, $syntax);
// render it
$renderer->doc .= $this->getHtmlCode($name, $syntax, $align);
return true;
}
return false;
}
}
/**
* Get HTML code
*/
function getHtmlCode($name, $syntax, $align) {
$chartNamespace = str_replace(":", "%3A", getNS(getID()));
$chartWikiFullPath = $chartNamespace.'%3A'.$name;
//Now, buil html code
$html_code = ''; break;
case 'right' : $html_code .= 'right" align="right" alt="" />'; break;
case 'center' : $html_code .= 'center" alt="" />'; break;
case 'normal' : $html_code .= '" alt="" />'; break;
}
return $html_code;
}
/**
* Do chart
*/
function doChart($name, $syntax) {
global $conf;
$chartFullPath = $conf['mediadir']."/".str_replace(":", "/", getNS(getID())).'/'.$name;
// Please Fixme ! How can I handle doku cache correctly ?
//if (!@is_file($chartFullPath)) {
$data=explode(":",$syntax);
// switch chart
switch ($data[0]) {
case 'line' : $this->doLine($chartFullPath, $data); break;
case 'cubic' : $this->doCubic($chartFullPath, $data); break;
case 'bar' : $this->doBar($chartFullPath, $data); break;
case 'stackedbar' : $this->doStackedBar($chartFullPath, $data); break;
case 'limit' : $this->doLimit($chartFullPath, $data); break;
case 'radar' : $this->doRadar($chartFullPath, $data); break;
case 'pie' : $this->doPie($chartFullPath, $data); break;
//}
}
return true;
}
/* Now that's raw code from examples...
* Sorry, It's not really clean!!
*/
/**
* Do line
*/
function doLine($chartFullPath, $data) {
// Standard inclusions
require_once(DOKU_PLUGIN."pchart/pChart/pData.class");
require_once(DOKU_PLUGIN."pchart/pChart/pChart.class");
$title = $data[1];
$xlegend = $data[2];
$xunit = $data[3];
$ylegend = $data[4];
$yunit = $data[5];
$label = explode(";", $data[6]);
// Dataset definition
$DataSet = new pData;
for ($i = 7; $i < count( $data ); $i++){
$DataSet->AddPoint(explode(";", $data[$i]),"Serie".($i - 6));
}
$DataSet->AddAllSeries();
$DataSet->SetAbsciseLabelSerie();
for ($i = 7; $i < count( $data ); $i++){
$DataSet->SetSerieName($label[$i - 7],"Serie".($i - 6));
}
$DataSet->SetXAxisName($xlegend);
$DataSet->SetXAxisUnit($xunit);
$DataSet->SetYAxisName($ylegend);
$DataSet->SetYAxisUnit($yunit);
// Initialise the graph
$Test = new pChart(600,240);
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->setGraphArea(70,30,500,200);
$Test->drawFilledRoundedRectangle(7,7,573,233,5,240,240,240);
$Test->drawRoundedRectangle(5,5,575,235,5,230,230,230);
$Test->drawGraphArea(255,255,255,TRUE);
$Test->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_NORMAL,150,150,150,TRUE,0,2);
$Test->drawGrid(4,TRUE,230,230,230,50);
// Draw the 0 line
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->drawTreshold(0,143,55,72,TRUE,TRUE);
// Draw the graph
$Test->drawLineGraph($DataSet->GetData(),$DataSet->GetDataDescription());
$Test->drawPlotGraph($DataSet->GetData(),$DataSet->GetDataDescription(),3,2,255,255,255);
// Draw legend
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",10);
$Test->drawLegend(510,25,$DataSet->GetDataDescription(),250,250,250);
// Draw title
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",12);
$Test->drawTitle(60,22,$title,0,0,0,-1,8);
// Render graph
$Test->Render($chartFullPath);
return true;
}
/**
* Do cubic
*/
function doCubic($chartFullPath, $data) {
// Standard inclusions
require_once(DOKU_PLUGIN."pchart/pChart/pData.class");
require_once(DOKU_PLUGIN."pchart/pChart/pChart.class");
$title = $data[1];
$xlegend = $data[2];
$xunit = $data[3];
$ylegend = $data[4];
$yunit = $data[5];
$label = explode(";", $data[6]);
// Dataset definition
$DataSet = new pData;
for ($i = 7; $i < count( $data ); $i++){
$DataSet->AddPoint(explode(";", $data[$i]),"Serie".($i - 6));
}
$DataSet->AddAllSeries();
$DataSet->SetAbsciseLabelSerie();
for ($i = 7; $i < count( $data ); $i++){
$DataSet->SetSerieName($label[$i - 7],"Serie".($i - 6));
}
$DataSet->SetXAxisName($xlegend);
$DataSet->SetXAxisUnit($xunit);
$DataSet->SetYAxisName($ylegend);
$DataSet->SetYAxisUnit($yunit);
// Initialise the graph
$Test = new pChart(600,240);
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->setGraphArea(70,30,500,200);
$Test->drawFilledRoundedRectangle(7,7,573,233,5,240,240,240);
$Test->drawRoundedRectangle(5,5,575,235,5,230,230,230);
$Test->drawGraphArea(255,255,255,TRUE);
$Test->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_NORMAL,150,150,150,TRUE,0,2);
$Test->drawGrid(4,TRUE,230,230,230,50);
// Draw the 0 line
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->drawTreshold(0,143,55,72,TRUE,TRUE);
// Draw the graph
$Test->drawCubicCurve($DataSet->GetData(),$DataSet->GetDataDescription());
// Draw legend
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",10);
$Test->drawLegend(510,25,$DataSet->GetDataDescription(),250,250,250);
// Draw title
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",12);
$Test->drawTitle(60,22,$title,0,0,0,-1,8);
// Render graph
$Test->Render($chartFullPath);
return true;
}
/**
* Do bar
*/
function doBar($chartFullPath, $data) {
// Standard inclusions
require_once(DOKU_PLUGIN."pchart/pChart/pData.class");
require_once(DOKU_PLUGIN."pchart/pChart/pChart.class");
$title = $data[1];
$xlegend = $data[2];
$xunit = $data[3];
$ylegend = $data[4];
$yunit = $data[5];
$label = explode(";", $data[6]);
// Dataset definition
$DataSet = new pData;
for ($i = 7; $i < count( $data ); $i++){
$DataSet->AddPoint(explode(";", $data[$i]),"Serie".($i - 6));
}
$DataSet->AddAllSeries();
$DataSet->SetAbsciseLabelSerie();
for ($i = 7; $i < count( $data ); $i++){
$DataSet->SetSerieName($label[$i - 7],"Serie".($i - 6));
}
$DataSet->SetXAxisName($xlegend);
$DataSet->SetXAxisUnit($xunit);
$DataSet->SetYAxisName($ylegend);
$DataSet->SetYAxisUnit($yunit);
// Initialise the graph
$Test = new pChart(600,240);
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->setGraphArea(70,30,500,200);
$Test->drawFilledRoundedRectangle(7,7,573,233,5,240,240,240);
$Test->drawRoundedRectangle(5,5,575,235,5,230,230,230);
$Test->drawGraphArea(255,255,255,TRUE);
$Test->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_NORMAL,150,150,150,TRUE,0,2,TRUE);
$Test->drawGrid(4,TRUE,230,230,230,50);
// Draw the 0 line
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->drawTreshold(0,143,55,72,TRUE,TRUE);
// Draw the graph
$Test->drawBarGraph($DataSet->GetData(),$DataSet->GetDataDescription(),TRUE);
// Draw legend
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",10);
$Test->drawLegend(510,25,$DataSet->GetDataDescription(),250,250,250);
// Draw title
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",12);
$Test->drawTitle(60,22,$title,0,0,0,-1,8);
// Render graph
$Test->Render($chartFullPath);
return true;
}
/**
* Do stacked bar
*/
function doStackedBar($chartFullPath, $data) {
// Standard inclusions
require_once(DOKU_PLUGIN."pchart/pChart/pData.class");
require_once(DOKU_PLUGIN."pchart/pChart/pChart.class");
$title = $data[1];
$xlegend = $data[2];
$xunit = $data[3];
$ylegend = $data[4];
$yunit = $data[5];
$label = explode(";", $data[6]);
// Dataset definition
$DataSet = new pData;
for ($i = 7; $i < count( $data ); $i++){
$DataSet->AddPoint(explode(";", $data[$i]),"Serie".($i - 6));
}
$DataSet->AddAllSeries();
$DataSet->SetAbsciseLabelSerie();
for ($i = 7; $i < count( $data ); $i++){
$DataSet->SetSerieName($label[$i - 7],"Serie".($i - 6));
}
$DataSet->SetXAxisName($xlegend);
$DataSet->SetXAxisUnit($xunit);
$DataSet->SetYAxisName($ylegend);
$DataSet->SetYAxisUnit($yunit);
// Initialise the graph
$Test = new pChart(600,240);
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->setGraphArea(70,30,500,200);
$Test->drawFilledRoundedRectangle(7,7,573,233,5,240,240,240);
$Test->drawRoundedRectangle(5,5,575,235,5,230,230,230);
$Test->drawGraphArea(255,255,255,TRUE);
$Test->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_ADDALL,150,150,150,TRUE,0,0,TRUE);
$Test->drawGrid(4,TRUE,230,230,230,50);
// Draw the 0 line
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->drawTreshold(0,143,55,72,TRUE,TRUE);
// Draw the graph
$Test->drawStackedBarGraph($DataSet->GetData(),$DataSet->GetDataDescription(),TRUE);
// Draw legend
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",10);
$Test->drawLegend(510,25,$DataSet->GetDataDescription(),250,250,250);
// Draw title
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",12);
$Test->drawTitle(60,22,$title,0,0,0,-1,8);
// Render graph
$Test->Render($chartFullPath);
return true;
}
/**
* Do limit
*/
function doLimit($chartFullPath, $data) {
// Standard inclusions
require_once(DOKU_PLUGIN."pchart/pChart/pData.class");
require_once(DOKU_PLUGIN."pchart/pChart/pChart.class");
$title = $data[1];
$xlegend = $data[2];
$xunit = $data[3];
$ylegend = $data[4];
$yunit = $data[5];
$label = explode(";", $data[6]);
$serie1 = explode(";", $data[7]);
$serie2 = explode(";", $data[8]);
// Dataset definition
$DataSet = new pData;
$DataSet->AddPoint($serie1,"Serie1");
$DataSet->AddPoint($serie2,"Serie2");
$DataSet->AddAllSeries();
$DataSet->SetAbsciseLabelSerie();
$DataSet->SetSerieName($label[0],"Serie1");
$DataSet->SetSerieName($label[1],"Serie2");
$DataSet->SetXAxisName($xlegend);
$DataSet->SetXAxisUnit($xunit);
$DataSet->SetYAxisName($ylegend);
$DataSet->SetYAxisUnit($yunit);
// Initialise the graph
$Test = new pChart(600,240);
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->setGraphArea(70,30,500,200);
$Test->drawFilledRoundedRectangle(7,7,573,233,5,240,240,240);
$Test->drawRoundedRectangle(5,5,575,235,5,230,230,230);
$Test->drawGraphArea(255,255,255,TRUE);
$Test->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_ADDALL,150,150,150,TRUE,0,0,TRUE);
$Test->drawGrid(4,TRUE,230,230,230,50);
// Draw the 0 line
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->drawTreshold(0,143,55,72,TRUE,TRUE);
// Draw the graph
$Test->drawLimitsGraph($DataSet->GetData(),$DataSet->GetDataDescription(),180,180,180);
// Draw legend
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",10);
$Test->drawLegend(510,25,$DataSet->GetDataDescription(),250,250,250);
// Draw title
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",12);
$Test->drawTitle(60,22,$title,0,0,0,-1,8);
// Render graph
$Test->Render($chartFullPath);
return true;
}
/**
* Do radar bar
*/
function doRadar($chartFullPath, $data) {
// Standard inclusions
require_once(DOKU_PLUGIN."pchart/pChart/pData.class");
require_once(DOKU_PLUGIN."pchart/pChart/pChart.class");
$title = $data[1];
$label = explode(";", $data[2]);
// Dataset definition
$DataSet = new pData;
$DataSet->AddPoint(explode(";", $data[3]),"Label");
for ($i = 4; $i < count( $data ); $i++){
$DataSet->AddPoint(explode(";", $data[$i]),"Serie".($i - 3));
$DataSet->AddSerie("Serie".($i - 3));
}
$DataSet->SetAbsciseLabelSerie("Label");
for ($i = 0; $i < count( $label ); $i++){
$DataSet->SetSerieName($label[$i],"Serie".($i+1));
}
// Initialise the graph
$Test = new pChart(300,240);
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->drawFilledRoundedRectangle(7,7,273,233,5,240,240,240);
$Test->drawRoundedRectangle(5,5,275,235,5,230,230,230);
$Test->setGraphArea(35,30,185,220);
// Draw the graph
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->drawRadarAxis($DataSet->GetData(),$DataSet->GetDataDescription(),TRUE,20,120,120,120,230,230,230);
$Test->drawFilledRadar($DataSet->GetData(),$DataSet->GetDataDescription(),20,20);
// Draw legend
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",10);
$Test->drawLegend(210,25,$DataSet->GetDataDescription(),255,255,255);
// Draw title
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",12);
$Test->drawTitle(60,22,$title,0,0,0,-1,8);
// Render graph
$Test->Render($chartFullPath);
return true;
}
/**
* Do pie
*/
function doPie($chartFullPath, $data) {
$title=$data[1];
$serie1=explode(";",$data[3]);
$serie2=explode(";",$data[2]);
// Standard inclusions
require_once(DOKU_PLUGIN."pchart/pChart/pData.class");
require_once(DOKU_PLUGIN."pchart/pChart/pChart.class");
// Dataset definition
$DataSet = new pData;
$DataSet->AddPoint($serie1,"Serie1");
$DataSet->AddPoint($serie2,"Serie2");
$DataSet->AddAllSeries();
$DataSet->SetAbsciseLabelSerie("Serie2");
// Init the graph
$Test = new pChart(300, 240);
$Test->drawFilledRoundedRectangle(7,7,273,237,5,240,240,240);
$Test->drawRoundedRectangle(5,5,275,235,5,230,230,230);
// Draw legend
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",10);
$Test->drawPieLegend(210,25,$DataSet->GetData(), $DataSet->GetDataDescription(),250,250,250);
// Draw the graph
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",8);
$Test->drawPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),115,130,70,PIE_PERCENTAGE,TRUE,90,20,10);
// Draw title
$Test->setFontProperties(DOKU_PLUGIN."pchart/Fonts/tahoma.ttf",12);
$Test->drawTitle(60,22,$title,0,0,0,-1,8);
// Render graph
$Test->Render($chartFullPath);
return true;
}
}