| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- <?php
- /**
- * @link http://www.yiiframework.com/
- * @copyright Copyright (c) 2008 Yii Software LLC
- * @license http://www.yiiframework.com/license/
- */
- namespace yii\debug\models\timeline;
- use yii\base\Object;
- use yii\debug\panels\TimelinePanel;
- use yii\helpers\StringHelper;
- /**
- * Svg is used to draw a graph using SVG
- *
- * @author Dmitriy Bashkarev <dmitriy@bashkarev.com>
- * @since 2.0.8
- */
- class Svg extends Object
- {
- /**
- * @var int Max X coordinate
- */
- public $x = 1920;
- /**
- * @var int Max Y coordinate
- */
- public $y = 40;
- /**
- * @var string Stroke color
- */
- public $stroke = '#1e6823';
- /**
- * @var array Listen messages panels
- */
- public $listenMessages = ['log', 'profiling'];
- /**
- * @var array Color indicators svg graph.
- */
- public $gradient = [
- 10 => '#d6e685',
- 60 => '#8cc665',
- 90 => '#44a340',
- 100 => '#1e6823'
- ];
- /**
- * @var string Svg template
- */
- public $template = '<svg width="{x}" height="{y}" viewBox="0 0 {x} {y}" preserveAspectRatio="none"><defs>{linearGradient}</defs><g><polygon points="{polygon}" fill="url(#gradient)"/><polyline points="{polyline}" fill="none" stroke="{stroke}" stroke-width="1"/></g></svg>';
- /**
- * ```php
- * [
- * [x, y]
- * ]
- * ```
- * @var array Each point is define by a X and a Y coordinate.
- */
- protected $points = [];
- /**
- * @var TimelinePanel
- */
- protected $panel;
- /**
- * @inheritdoc
- */
- public function __construct(TimelinePanel $panel, $config = [])
- {
- parent::__construct($config);
- $this->panel = $panel;
- foreach ($this->listenMessages as $panel) {
- if (isset($this->panel->module->panels[$panel]->data['messages'])) {
- $this->addPoints($this->panel->module->panels[$panel]->data['messages']);
- }
- }
- }
- /**
- * @return string
- */
- public function __toString()
- {
- if ($this->points === []) {
- return '';
- }
- return strtr($this->template, [
- '{x}' => StringHelper::normalizeNumber($this->x),
- '{y}' => StringHelper::normalizeNumber($this->y),
- '{stroke}' => $this->stroke,
- '{polygon}' => $this->polygon(),
- '{polyline}' => $this->polyline(),
- '{linearGradient}' => $this->linearGradient()
- ]);
- }
- /**
- * @return bool Has points
- */
- public function hasPoints()
- {
- return ($this->points !== []);
- }
- /**
- * @param array $messages log messages. See [[Logger::messages]] for the structure
- * @return int added points
- */
- protected function addPoints($messages)
- {
- $hasPoints = $this->hasPoints();
- $memory = $this->panel->memory / 100; // 1 percent memory
- $yOne = $this->y / 100; // 1 percent Y coordinate
- $xOne = $this->panel->duration / $this->x; // 1 percent X coordinate
- $i = 0;
- foreach ($messages as $message) {
- if (empty($message[5])) {
- break;
- }
- ++$i;
- $this->points[] = [
- ($message[3] * 1000 - $this->panel->start) / $xOne,
- $this->y - ($message[5] / $memory * $yOne),
- ];
- }
- if ($hasPoints && $i) {
- usort($this->points, function ($a, $b) {
- return ($a[0] < $b[0]) ? -1 : 1;
- });
- }
- return $i;
- }
- /**
- * @return string Points attribute for polygon path
- */
- protected function polygon()
- {
- $str = "0 $this->y ";
- foreach ($this->points as $point) {
- list($x, $y) = $point;
- $str .= "{$x} {$y} ";
- }
- $str .= $this->x - 0.001 . " {$y} {$this->x} {$this->y}";
- return StringHelper::normalizeNumber($str);
- }
- /**
- * @return string Points attribute for polyline path
- */
- protected function polyline()
- {
- $str = "0 $this->y ";
- foreach ($this->points as $point) {
- list($x, $y) = $point;
- $str .= "{$x} {$y} ";
- }
- $str .= "$this->x {$y}";
- return StringHelper::normalizeNumber($str);
- }
- /**
- * @return string
- */
- protected function linearGradient()
- {
- $gradient = '<linearGradient id="gradient" x1="0" x2="0" y1="1" y2="0">';
- foreach ($this->gradient as $percent => $color) {
- $gradient .= '<stop offset="' . StringHelper::normalizeNumber($percent) . '%" stop-color="' . $color . '"></stop>';
- }
- return $gradient . '</linearGradient>';
- }
- }
|