From 7cbee05b769335c798db58f1832e41bd28dc5ccd Mon Sep 17 00:00:00 2001 From: David Grudl Date: Sat, 18 Dec 2021 19:00:48 +0100 Subject: [PATCH] BlueScreenPanel: added source mapping & files creating in Tracy 2.9 --- src/Bridges/Tracy/BlueScreenPanel.php | 61 ++++++++++++++++++++------- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/src/Bridges/Tracy/BlueScreenPanel.php b/src/Bridges/Tracy/BlueScreenPanel.php index 75516e8cf..2f8b74363 100644 --- a/src/Bridges/Tracy/BlueScreenPanel.php +++ b/src/Bridges/Tracy/BlueScreenPanel.php @@ -25,6 +25,17 @@ public static function initialize(?BlueScreen $blueScreen = null): void $blueScreen = $blueScreen ?? Tracy\Debugger::getBlueScreen(); $blueScreen->addPanel([self::class, 'renderError']); $blueScreen->addAction([self::class, 'renderUnknownMacro']); + if ( + version_compare(Tracy\Debugger::VERSION, '2.9.0', '>=') + && version_compare(Tracy\Debugger::VERSION, '3.0', '<') + ) { + Tracy\Debugger::addSourceMapper([self::class, 'mapLatteSourceCode']); + $blueScreen->addFileGenerator(function (string $file) { + return substr($file, -6) === '.latte' + ? "{block content}\n\$END\$" + : null; + }); + } } @@ -45,22 +56,19 @@ public static function renderError(?\Throwable $e): ?array . '', ]; - } elseif ($e && strpos($file = $e->getFile(), '.latte--')) { - $lines = file($file); - if ( - preg_match('#/\*\* source: (\S+\.latte)#', $lines[4], $m) - && @is_file($m[1]) // @ - may trigger error - ) { - $templateFile = $m[1]; - $templateLine = $e->getLine() && preg_match('#/\* line (\d+) \*/#', $lines[$e->getLine() - 1], $m) ? (int) $m[1] : 0; - return [ - 'tab' => 'Template', - 'panel' => '

File: ' . Helpers::editorLink($templateFile, $templateLine) . '

' - . ($templateLine === null - ? '' - : BlueScreen::highlightFile($templateFile, $templateLine)), - ]; - } + } elseif ( + $e + && ($file = $e->getFile()) + && (version_compare(Tracy\Debugger::VERSION, '2.9.0', '<')) + && ($mapped = self::mapLatteSourceCode($file, $e->getLine())) + ) { + return [ + 'tab' => 'Template', + 'panel' => '

File: ' . Helpers::editorLink($mapped['file'], $mapped['line']) . '

' + . ($mapped['line'] + ? BlueScreen::highlightFile($mapped['file'], $mapped['line']) + : ''), + ]; } return null; @@ -84,4 +92,25 @@ public static function renderUnknownMacro(?\Throwable $e): ?array return null; } + + + /** @return array{file: string, line: int, label: string, active: bool} */ + public static function mapLatteSourceCode(string $file, int $line): ?array + { + if (!strpos($file, '.latte--')) { + return null; + } + + $lines = file($file); + if ( + !preg_match('#^/\*\* source: (\S+\.latte)#m', implode('', array_slice($lines, 0, 10)), $m) + || !@is_file($m[1]) // @ - may trigger error + ) { + return null; + } + + $file = $m[1]; + $line = $line && preg_match('#/\* line (\d+) \*/#', $lines[$line - 1], $m) ? (int) $m[1] : 0; + return ['file' => $file, 'line' => $line, 'label' => 'Latte', 'active' => true]; + } }