mirror of
https://github.com/doctrine/doctrine-website.git
synced 2026-03-23 22:32:11 +01:00
56 lines
1.4 KiB
PHP
56 lines
1.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Doctrine\Website\Docs;
|
|
|
|
use function count;
|
|
use function implode;
|
|
use function ltrim;
|
|
use function sprintf;
|
|
use function substr;
|
|
|
|
/** @final */
|
|
class CodeBlockConsoleRenderer
|
|
{
|
|
/** @param string[] $lines */
|
|
public function render(array $lines): string
|
|
{
|
|
$code = '<div class="console">';
|
|
|
|
$consoleLines = [];
|
|
|
|
foreach ($lines as $line) {
|
|
$hasDollarSign = isset($line[0]) && $line[0] === '$';
|
|
|
|
$consoleLines[] = $this->renderConsoleLine($line, $hasDollarSign);
|
|
}
|
|
|
|
$consoleLines = implode("\n", $consoleLines);
|
|
|
|
$firstLineHasDollarSign = isset($lines[0][0]) && $lines[0][0] === '$';
|
|
|
|
// if console example has only 1 line and no $ explicitely existed put a $ there manually.
|
|
if (count($lines) === 1 && ! $firstLineHasDollarSign) {
|
|
$consoleLines = sprintf('<span class="noselect">$ </span>%s', ltrim($consoleLines)) . "\n";
|
|
}
|
|
|
|
$code .= sprintf('<pre><code class="console">%s</code></pre>', $consoleLines);
|
|
|
|
$code .= '</div>';
|
|
|
|
return $code;
|
|
}
|
|
|
|
private function renderConsoleLine(string $line, bool $hasDollarSign): string
|
|
{
|
|
if ($hasDollarSign) {
|
|
$line = substr($line, 1);
|
|
|
|
return sprintf('<span class="noselect">$ </span>%s', ltrim($line));
|
|
}
|
|
|
|
return $line;
|
|
}
|
|
}
|