@@ -123,13 +123,25 @@ public function fileExcerpt(string $file, int $line, int $srcContext = 3): ?stri
123123 // highlight_file could throw warnings
124124 // see https://bugs.php.net/25725
125125 $ code = @highlight_file ($ file , true );
126- // remove main code/span tags
127- $ code = preg_replace ('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s ' , '\\1 ' , $ code );
128- // split multiline spans
129- $ code = preg_replace_callback ('#<span ([^>]++)>((?:[^<]*+<br \/>)++[^<]*+)</span># ' , function ($ m ) {
130- return "<span $ m [1 ]> " .str_replace ('<br /> ' , "</span><br /><span $ m [1 ]> " , $ m [2 ]).'</span> ' ;
131- }, $ code );
132- $ content = explode ('<br /> ' , $ code );
126+ if (\PHP_VERSION_ID >= 80300 ) {
127+ // remove main pre/code tags
128+ $ code = preg_replace ('#^<pre.*?>\s*<code.*?>(.*)</code>\s*</pre>#s ' , '\\1 ' , $ code );
129+ // split multiline code tags
130+ $ code = preg_replace_callback ('#<code ([^>]++)>((?:[^<]*+ \\n)++[^<]*+)</code># ' , function ($ m ) {
131+ return "<code $ m [1 ]> " .str_replace ("\n" , "</code> \n<code $ m [1 ]> " , $ m [2 ]).'</code> ' ;
132+ }, $ code );
133+ // Convert spaces to html entities to preserve indentation when rendered
134+ $ code = str_replace (' ' , ' ' , $ code );
135+ $ content = explode ("\n" , $ code );
136+ } else {
137+ // remove main code/span tags
138+ $ code = preg_replace ('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s ' , '\\1 ' , $ code );
139+ // split multiline spans
140+ $ code = preg_replace_callback ('#<span ([^>]++)>((?:[^<]*+<br \/>)++[^<]*+)</span># ' , function ($ m ) {
141+ return "<span $ m [1 ]> " .str_replace ('<br /> ' , "</span><br /><span $ m [1 ]> " , $ m [2 ]).'</span> ' ;
142+ }, $ code );
143+ $ content = explode ('<br /> ' , $ code );
144+ }
133145
134146 $ lines = [];
135147 if (0 > $ srcContext ) {
0 commit comments