@@ -269,13 +269,25 @@ private function fileExcerpt(string $file, int $line, int $srcContext = 3): stri
269
269
// highlight_file could throw warnings
270
270
// see https://bugs.php.net/25725
271
271
$ code = @highlight_file ($ file , true );
272
- // remove main code/span tags
273
- $ code = preg_replace ('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s ' , '\\1 ' , $ code );
274
- // split multiline spans
275
- $ code = preg_replace_callback ('#<span ([^>]++)>((?:[^<]*+<br \/>)++[^<]*+)</span># ' , function ($ m ) {
276
- return "<span $ m [1 ]> " .str_replace ('<br /> ' , "</span><br /><span $ m [1 ]> " , $ m [2 ]).'</span> ' ;
277
- }, $ code );
278
- $ content = explode ('<br /> ' , $ code );
272
+ if (\PHP_VERSION_ID >= 80300 ) {
273
+ // remove main pre/code tags
274
+ $ code = preg_replace ('#^<pre.*?>\s*<code.*?>(.*)</code>\s*</pre>#s ' , '\\1 ' , $ code );
275
+ // split multiline code tags
276
+ $ code = preg_replace_callback ('#<code ([^>]++)>((?:[^<]*+ \\n)++[^<]*+)</code># ' , function ($ m ) {
277
+ return "<code $ m [1 ]> " .str_replace ("\n" , "</code> \n<code $ m [1 ]> " , $ m [2 ]).'</code> ' ;
278
+ }, $ code );
279
+ // Convert spaces to html entities to preserve indentation when rendered
280
+ $ code = str_replace (' ' , ' ' , $ code );
281
+ $ content = explode ("\n" , $ code );
282
+ } else {
283
+ // remove main code/span tags
284
+ $ code = preg_replace ('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s ' , '\\1 ' , $ code );
285
+ // split multiline spans
286
+ $ code = preg_replace_callback ('#<span ([^>]++)>((?:[^<]*+<br \/>)++[^<]*+)</span># ' , function ($ m ) {
287
+ return "<span $ m [1 ]> " .str_replace ('<br /> ' , "</span><br /><span $ m [1 ]> " , $ m [2 ]).'</span> ' ;
288
+ }, $ code );
289
+ $ content = explode ('<br /> ' , $ code );
290
+ }
279
291
280
292
$ lines = [];
281
293
if (0 > $ srcContext ) {
0 commit comments