@@ -262,11 +262,21 @@ private function fileExcerpt(string $file, int $line, int $srcContext = 3): stri
262262 // highlight_file could throw warnings
263263 // see https://bugs.php.net/25725
264264 $ code = @highlight_file ($ file , true );
265- // remove main code/span tags
266- $ code = preg_replace ('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s ' , '\\1 ' , $ code );
267- // split multiline spans
268- $ code = preg_replace_callback ('#<span ([^>]++)>((?:[^<]*+<br \/>)++[^<]*+)</span># ' , fn ($ m ) => "<span $ m [1 ]> " .str_replace ('<br /> ' , "</span><br /><span $ m [1 ]> " , $ m [2 ]).'</span> ' , $ code );
269- $ content = explode ('<br /> ' , $ code );
265+ if (\PHP_VERSION_ID >= 80300 ) {
266+ // remove main pre/code tags
267+ $ code = preg_replace ('#^<pre.*?>\s*<code.*?>(.*)</code>\s*</pre>#s ' , '\\1 ' , $ code );
268+ // split multiline code tags
269+ $ code = preg_replace_callback ('#<code ([^>]++)>((?:[^<]*+ \\n)++[^<]*+)</code># ' , fn ($ m ) => "<code $ m [1 ]> " .str_replace ("\n" , "</code> \n<code $ m [1 ]> " , $ m [2 ]).'</code> ' , $ code );
270+ // Convert spaces to html entities to preserve indentation when rendered
271+ $ code = str_replace (' ' , ' ' , $ code );
272+ $ content = explode ("\n" , $ code );
273+ } else {
274+ // remove main code/span tags
275+ $ code = preg_replace ('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s ' , '\\1 ' , $ code );
276+ // split multiline spans
277+ $ code = preg_replace_callback ('#<span ([^>]++)>((?:[^<]*+<br \/>)++[^<]*+)</span># ' , fn ($ m ) => "<span $ m [1 ]> " .str_replace ('<br /> ' , "</span><br /><span $ m [1 ]> " , $ m [2 ]).'</span> ' , $ code );
278+ $ content = explode ('<br /> ' , $ code );
279+ }
270280
271281 $ lines = [];
272282 if (0 > $ srcContext ) {
0 commit comments