1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Twig\Profiler\Dumper;
13
14use Twig\Profiler\Profile;
15
16/**
17 * @author Fabien Potencier <fabien@symfony.com>
18 */
19abstract class BaseDumper
20{
21    private $root;
22
23    public function dump(Profile $profile)
24    {
25        return $this->dumpProfile($profile);
26    }
27
28    abstract protected function formatTemplate(Profile $profile, $prefix);
29
30    abstract protected function formatNonTemplate(Profile $profile, $prefix);
31
32    abstract protected function formatTime(Profile $profile, $percent);
33
34    private function dumpProfile(Profile $profile, $prefix = '', $sibling = false): string
35    {
36        if ($profile->isRoot()) {
37            $this->root = $profile->getDuration();
38            $start = $profile->getName();
39        } else {
40            if ($profile->isTemplate()) {
41                $start = $this->formatTemplate($profile, $prefix);
42            } else {
43                $start = $this->formatNonTemplate($profile, $prefix);
44            }
45            $prefix .= $sibling ? '│ ' : '  ';
46        }
47
48        $percent = $this->root ? $profile->getDuration() / $this->root * 100 : 0;
49
50        if ($profile->getDuration() * 1000 < 1) {
51            $str = $start."\n";
52        } else {
53            $str = sprintf("%s %s\n", $start, $this->formatTime($profile, $percent));
54        }
55
56        $nCount = \count($profile->getProfiles());
57        foreach ($profile as $i => $p) {
58            $str .= $this->dumpProfile($p, $prefix, $i + 1 !== $nCount);
59        }
60
61        return $str;
62    }
63}
64
65class_alias('Twig\Profiler\Dumper\BaseDumper', 'Twig_Profiler_Dumper_Base');
66