You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

130 lines
2.7 KiB

<?php
/**
* @package tikiwiki
*/
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
require_once('tiki-setup.php');
require_once('lib/graph-engine/graph.multiline.php');
require_once('lib/graph-engine/gd.php');
require_once('lib/graph-engine/pdflib.php');
// List of valid functions
$valid = [
'abs',
'acos',
'acosh',
'asin',
'asinh',
'atan2',
'atan',
'atanh',
'ceil',
'cos',
'cosh',
'deg2rad',
'exp',
'expm1',
'floor',
'fmod',
'hypot',
'log10',
'log1p',
'log',
'max',
'min',
'pi',
'pow',
'rad2deg',
'round',
'sin',
'sinh',
'sqrt',
'tan',
'tanh'
];
/**
* @param $formula
* @return string
*/
function convert_formula($formula)
{
global $valid;
// Stripping all quotes
$chars = [ '`', "'", '"', '&', '[', ']', '$', '{', '}' ];
$formula = str_replace($chars, array_fill(0, count($chars), ''), $formula);
// Make sure only valid functions are used
preg_match_all('/([a-z0-9_]+)/i', $formula, $out, PREG_PATTERN_ORDER);
foreach ($out[0] as $match) {
if (! is_numeric($match) && ! in_array(strtolower($match), $valid) && $match !== 'x') {
die("Invalid function call {$match}");
}
}
// Replace spaces for commas
$formula = preg_replace('/\s+/', ', ', $formula);
$formula = str_replace('x', '$x', $formula);
return create_function('$x', "return $formula;");
}
$access->check_permission('feature_sheet');
if (
! ( is_numeric($_GET['w'])
&& is_numeric($_GET['h'])
&& is_numeric($_GET['s'])
&& $_GET['s'] <= 500 && $_GET['s'] > 0
&& is_numeric($_GET['min'])
&& is_numeric($_GET['max'])
&& is_array($_GET['f'])
&& $_GET['min'] < $_GET['max']
&& $_GET['w'] >= 100
&& $_GET['h'] >= 100 )
) {
die;
}
switch ($_GET['t']) {
case 'png':
$renderer = new GD_GRenderer($_GET['w'], $_GET['h']);
break;
case 'pdf':
$renderer = new PDFLib_GRenderer($_GET['p'], $_GET['o']);
break;
default:
die;
}
$graph = new MultilineGraphic();
$graph->setTitle($_GET['title']);
$size = ($_GET['max'] - $_GET['min']) / $_GET['s'];
$data = [];
foreach (array_values($_GET['f']) as $key => $formula) {
$formula = convert_formula($formula);
$data['x'] = [];
$data['y' . $key] = [];
for ($x = $_GET['min']; $_GET['max'] > $x; $x += $size) {
$data['x'][] = $x;
$data['y' . $key][] = $formula($x);
}
}
$graph->setData($data);
$graph->draw($renderer);
$renderer->httpOutput("graph.{$_GET['t']}");