| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\VarDumper\Command\Descriptor;use Symfony\Component\Console\Output\OutputInterface;use Symfony\Component\VarDumper\Cloner\Data;use Symfony\Component\VarDumper\Dumper\HtmlDumper;/** * Describe collected data clones for html output. * * @author Maxime Steinhausser <maxime.steinhausser@gmail.com> * * @final */class HtmlDescriptor implements DumpDescriptorInterface{    private $dumper;    private $initialized = false;    public function __construct(HtmlDumper $dumper)    {        $this->dumper = $dumper;    }    public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void    {        if (!$this->initialized) {            $styles = file_get_contents(__DIR__.'/../../Resources/css/htmlDescriptor.css');            $scripts = file_get_contents(__DIR__.'/../../Resources/js/htmlDescriptor.js');            $output->writeln("<style>$styles</style><script>$scripts</script>");            $this->initialized = true;        }        $title = '-';        if (isset($context['request'])) {            $request = $context['request'];            $controller = "<span class='dumped-tag'>{$this->dumper->dump($request['controller'], true, ['maxDepth' => 0])}</span>";            $title = sprintf('<code>%s</code> <a href="%s">%s</a>', $request['method'], $uri = $request['uri'], $uri);            $dedupIdentifier = $request['identifier'];        } elseif (isset($context['cli'])) {            $title = '<code>$ </code>'.$context['cli']['command_line'];            $dedupIdentifier = $context['cli']['identifier'];        } else {            $dedupIdentifier = uniqid('', true);        }        $sourceDescription = '';        if (isset($context['source'])) {            $source = $context['source'];            $projectDir = $source['project_dir'] ?? null;            $sourceDescription = sprintf('%s on line %d', $source['name'], $source['line']);            if (isset($source['file_link'])) {                $sourceDescription = sprintf('<a href="%s">%s</a>', $source['file_link'], $sourceDescription);            }        }        $isoDate = $this->extractDate($context, 'c');        $tags = array_filter([            'controller' => $controller ?? null,            'project dir' => $projectDir ?? null,        ]);        $output->writeln(<<<HTML<article data-dedup-id="$dedupIdentifier">    <header>        <div class="row">            <h2 class="col">$title</h2>            <time class="col text-small" title="$isoDate" datetime="$isoDate">                {$this->extractDate($context)}            </time>        </div>        {$this->renderTags($tags)}    </header>    <section class="body">        <p class="text-small">            $sourceDescription        </p>        {$this->dumper->dump($data, true)}    </section></article>HTML        );    }    private function extractDate(array $context, string $format = 'r'): string    {        return date($format, (int) $context['timestamp']);    }    private function renderTags(array $tags): string    {        if (!$tags) {            return '';        }        $renderedTags = '';        foreach ($tags as $key => $value) {            $renderedTags .= sprintf('<li><span class="badge">%s</span>%s</li>', $key, $value);        }        return <<<HTML<div class="row">    <ul class="tags">        $renderedTags    </ul></div>HTML;    }}
 |