@@ -357,14 +357,14 @@ class BBCodeParser
357357 [
358358 'tag ' => 'code ' ,
359359 'type ' => 'unparsed_content ' ,
360- 'content ' => '<div class="codeheader"><span class="code"> {txt_code}</span> <a class="codeoperation smf_select_text"> {txt_code_select}</a> <a class="codeoperation smf_expand_code hidden" data-shrink-txt="{txt_code_shrink}" data-expand-txt="{txt_code_expand}">{txt_code_expand}</a></div><code class="bbc_code">$1</code> ' ,
360+ 'content ' => '<div class="codeheader">{txt_code}</div><pre data-select-txt=" {txt_code_select}" data-shrink-txt="{txt_code_shrink}" data-expand-txt="{txt_code_expand}" class="bbc_code"><code> $1</code></pre > ' ,
361361 'validate ' => __CLASS__ . '::codeValidate ' ,
362362 'block_level ' => true ,
363363 ],
364364 [
365365 'tag ' => 'code ' ,
366366 'type ' => 'unparsed_equals_content ' ,
367- 'content ' => '<div class="codeheader"><span class="code"> {txt_code}</span> ($2) <a class="codeoperation smf_select_text"> {txt_code_select}</a> <a class="codeoperation smf_expand_code hidden" data-shrink-txt="{txt_code_shrink}" data-expand-txt="{txt_code_expand}">{txt_code_expand}</a></div><code class="bbc_code">$1</code> ' ,
367+ 'content ' => '<div class="codeheader">{txt_code} ($2)</div><pre data-select-txt=" {txt_code_select}" data-shrink-txt="{txt_code_shrink}" data-expand-txt="{txt_code_expand}" class="bbc_code"><code> $1</code></pre > ' ,
368368 'validate ' => __CLASS__ . '::codeValidate ' ,
369369 'block_level ' => true ,
370370 ],
@@ -2226,16 +2226,20 @@ public static function highlightPhpCode(string $code): string
22262226 // Remove special characters.
22272227 $ code = Utils::htmlspecialcharsDecode (strtr ($ code , ['<br /> ' => "\n" , '<br> ' => "\n" , "\t" => 'SMF_TAB(); ' , '[ ' => '[ ' ]));
22282228
2229- $ oldlevel = error_reporting (0 );
2230-
2231- $ buffer = str_replace (["\n" , "\r" ], '' , @highlight_string ($ code , true ));
2232-
2233- error_reporting ($ oldlevel );
2229+ $ patterns = ['/<\/?(?:pre|code)[^>]*>/ ' ];
2230+ $ replacements = ['' ];
22342231
22352232 // Yes, I know this is kludging it, but this is the best way to preserve tabs from PHP :P.
2236- $ buffer = preg_replace ('~SMF_TAB(?:</(?:font|span)><(?:font color|span style)="[^"]*?">)?\(\);~ ' , '<pre style="display: inline;"> ' . "\t" . '</pre> ' , $ buffer );
2233+ $ patterns [] = '/SMF_TAB(?:<\/(?:font|span)><(?:font color|span style)="[^"]*?">)?\(\);/ ' ;
2234+ $ replacements [] = "\t" ;
22372235
2238- return strtr ($ buffer , ['\'' => '' ' , '<code> ' => '' , '</code> ' => '' ]);
2236+ // PHP 8.3 changed this to return real linebreaks, but SMF still expects HTML breaks.
2237+ if (version_compare (PHP_VERSION , '8.3 ' , '>= ' )) {
2238+ $ patterns [] = "/ \n/ " ;
2239+ $ replacements [] = '<br /> ' ;
2240+ }
2241+
2242+ return strtr (preg_replace ($ patterns , $ replacements , highlight_string ($ code , true )), array ('\'' => '' ' ));
22392243 }
22402244
22412245 /**
@@ -2460,33 +2464,26 @@ public static function codeValidate(&$tag, &$data, $disabled, $params): void
24602464 if (!isset ($ disabled ['code ' ])) {
24612465 $ code = is_array ($ data ) ? $ data [0 ] : $ data ;
24622466
2463- $ php_parts = preg_split ('~(<\?php|\?>)~ ' , $ code , -1 , PREG_SPLIT_DELIM_CAPTURE );
2467+ $ parts = preg_split ('~(<\?php|\?>)~ ' , $ code , -1 , PREG_SPLIT_DELIM_CAPTURE );
24642468
2465- for ($ php_i = 0 , $ php_n = count ($ php_parts ); $ php_i < $ php_n ; $ php_i ++) {
2469+ for ($ i = 0 , $ n = count ($ parts ); $ i < $ n ; $ i ++) {
24662470 // Do PHP code coloring?
2467- if ($ php_parts [ $ php_i ] != '<?php ' ) {
2471+ if ($ parts [ $ i ] != '<?php ' ) {
24682472 continue ;
24692473 }
24702474
2471- $ php_string = '' ;
2472-
2473- while ($ php_i + 1 < count ($ php_parts ) && $ php_parts [$ php_i ] != '?> ' ) {
2474- $ php_string .= $ php_parts [$ php_i ];
2475- $ php_parts [$ php_i ++] = '' ;
2475+ $ string = '' ;
2476+ while ($ i + 1 < $ n && $ parts [$ i ] != '?> ' ) {
2477+ $ string .= $ parts [$ i ];
2478+ $ parts [$ i ++] = '' ;
24762479 }
2477-
2478- $ php_parts [$ php_i ] = self ::highlightPhpCode ($ php_string . $ php_parts [$ php_i ]);
2480+ $ parts [$ i ] = self ::highlightPhpCode ($ string . $ parts [$ i ]);
24792481 }
24802482
2481- // Fix the PHP code stuff...
2482- $ code = str_replace ("<pre style= \"display: inline; \"> \t</pre> " , "\t" , implode ('' , $ php_parts ));
2483-
2484- $ code = str_replace ("\t" , "<span style= \"white-space: pre; \"> \t</span> " , $ code );
2485-
24862483 if (is_array ($ data )) {
2487- $ data [0 ] = $ code ;
2484+ $ data [0 ] = implode ( '' , $ parts ) ;
24882485 } else {
2489- $ data = $ code ;
2486+ $ data = implode ( '' , $ parts ) ;
24902487 }
24912488 }
24922489 }
0 commit comments