*/ // 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; } }