'left', 'color' => 'green', 'font-family' => 'monospace', 'font-size' => '16px', 'line-height' => '1.5', 'font-weight' => '500', 'width' => '100%', 'table-layout' => 'fixed', 'border-collapse' => 'collapse', ]; /** * @param iterable $lines */ public function __construct(iterable $lines, array $styles = [], array $headers = []) { $styles += self::STYLES; Assert::isMap($styles); $css = \array_reduce( \array_keys($styles), static fn (string $css, string $key) => "$css{$key}:$styles[$key];", '' ); $rows = ''; foreach ($lines as $line) { \preg_match( '/\[(?\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})]\s(?\w+)\.(?DEBUG|INFO|NOTICE|WARNING|ERROR|CRITICAL):\s?(?.+)/', $line, $matches ); [ 'date' => $date, 'channel' => $channel, 'level' => $level, 'message' => $message ] = $matches + [ 'date' => '', 'channel' => '', 'level' => 'INFO', 'message' => $line, ]; $rows .= ('' === $formattedMessage = self::removeEmptyContextFromMessage($message)) ? '' : <<<"HTML" {$date} {$channel} {$level}
{$formattedMessage}
HTML; } $content = <<<"HTML"
{$rows}
Logged at Channel Level Message
HTML; parent::__construct($content, Response::HTTP_OK, $headers); } private static function removeEmptyContextFromMessage(string $message): string { return \trim(\preg_replace('/(\s*\[]\s*)+/', '', $message) ?? ''); } }