Skip to content

Commit 688c8ba

Browse files
committed
fix: highlightFile() in BaseExceptionHandler
1 parent 69fc51f commit 688c8ba

4 files changed

Lines changed: 59 additions & 4 deletions

File tree

system/Debug/BaseExceptionHandler.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,16 @@ protected static function highlightFile(string $file, int $lineNumber, int $line
180180
return false;
181181
}
182182

183-
$source = str_replace(["\r\n", "\r"], "\n", $source);
184-
$source = explode("\n", highlight_string($source, true));
185-
$source = str_replace('<br />', "\n", $source[1]);
183+
if (version_compare(PHP_VERSION, '8.3.0', '<')) {
184+
$source = str_replace(["\r\n", "\r"], "\n", $source);
185+
$source = explode("\n", highlight_string($source, true));
186+
$source = str_replace('<br />', "\n", $source[1]);
187+
} else {
188+
$source = highlight_string($source, true);
189+
// We have to remove these tags since we're preparing the result
190+
// ourselves and these tags are added manually at the end.
191+
$source = str_replace(['<pre><code>', '</code></pre>'], '', $source);
192+
}
186193
$source = explode("\n", str_replace("\r\n", "\n", $source));
187194

188195
// Get just the part to show
@@ -199,7 +206,7 @@ protected static function highlightFile(string $file, int $lineNumber, int $line
199206
// of open and close span tags on one line, we need
200207
// to ensure we can close them all to get the lines
201208
// showing correctly.
202-
$spans = 1;
209+
$spans = 0;
203210

204211
foreach ($source as $n => $row) {
205212
$spans += substr_count($row, '<span') - substr_count($row, '</span');
@@ -216,6 +223,9 @@ protected static function highlightFile(string $file, int $lineNumber, int $line
216223
);
217224
} else {
218225
$out .= sprintf('<span class="line"><span class="number">' . $format . '</span> %s', $n + $start + 1, $row) . "\n";
226+
// We're closing only one span tag we added manually line before,
227+
// so we have to increment $spans count to close this tag later.
228+
$spans++;
219229
}
220230
}
221231

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<pre><code><span class="line"><span class="number"> 9</span> * the LICENSE file that was distributed with this source code.
2+
<span class="line"><span class="number">10</span> */
3+
<span class="line"><span class="number">11</span>
4+
<span class="line"><span class="number">12</span> </span><span style="color: #f1ce61;">namespace </span><span style="color: #c7c7c7">Tests\Support\Controllers</span><span style="color: #f1ce61;">;
5+
<span class="line"><span class="number">13</span>
6+
<span class="line"><span class="number">14</span> use </span><span style="color: #c7c7c7">CodeIgniter\Controller</span><span style="color: #f1ce61;">;
7+
<span class="line"><span class="number">15</span>
8+
<span class='line highlight'><span class='number'>16</span> class Hello extends Controller
9+
</span></span><span style="color: #c7c7c7"></span><span style="color: #f1ce61;"></span><span style="color: #c7c7c7"><span class="line"><span class="number">17</span> </span><span style="color: #f1ce61;">{
10+
<span class="line"><span class="number">18</span> public function </span><span style="color: #c7c7c7">index</span><span style="color: #f1ce61;">()
11+
<span class="line"><span class="number">19</span> {
12+
<span class="line"><span class="number">20</span> return </span><span style="color: #869d6a">'Hello'</span><span style="color: #f1ce61;">;
13+
<span class="line"><span class="number">21</span> }
14+
<span class="line"><span class="number">22</span> }
15+
<span class="line"><span class="number">23</span> </span>
16+
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<pre><code><span class="line"><span class="number"> 9</span> &nbsp;*&nbsp;the&nbsp;LICENSE&nbsp;file&nbsp;that&nbsp;was&nbsp;distributed&nbsp;with&nbsp;this&nbsp;source&nbsp;code.
2+
<span class="line"><span class="number">10</span> &nbsp;*/
3+
<span class="line"><span class="number">11</span>
4+
<span class="line"><span class="number">12</span> </span><span style="color: #f1ce61;">namespace&nbsp;</span><span style="color: #c7c7c7">Tests\Support\Controllers</span><span style="color: #f1ce61;">;
5+
<span class="line"><span class="number">13</span>
6+
<span class="line"><span class="number">14</span> use&nbsp;</span><span style="color: #c7c7c7">CodeIgniter\Controller</span><span style="color: #f1ce61;">;
7+
<span class="line"><span class="number">15</span>
8+
<span class='line highlight'><span class='number'>16</span> class&nbsp;Hello&nbsp;extends&nbsp;Controller
9+
</span></span><span style="color: #c7c7c7"></span><span style="color: #f1ce61;"></span><span style="color: #c7c7c7"><span class="line"><span class="number">17</span> </span><span style="color: #f1ce61;">{
10+
<span class="line"><span class="number">18</span> &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #c7c7c7">index</span><span style="color: #f1ce61;">()
11+
<span class="line"><span class="number">19</span> &nbsp;&nbsp;&nbsp;&nbsp;{
12+
<span class="line"><span class="number">20</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #869d6a">'Hello'</span><span style="color: #f1ce61;">;
13+
<span class="line"><span class="number">21</span> &nbsp;&nbsp;&nbsp;&nbsp;}
14+
<span class="line"><span class="number">22</span> }
15+
<span class="line"><span class="number">23</span> </span>
16+
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>

tests/system/Debug/ExceptionHandlerTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,17 @@ public function testMaskSensitiveDataTraceDataKey(): void
237237

238238
$this->assertSame('/var/www/CodeIgniter4/app/Controllers/Home.php', $newTrace[0]['file']);
239239
}
240+
241+
public function testHighlightFile(): void
242+
{
243+
$highlightFile = $this->getPrivateMethodInvoker($this->handler, 'highlightFile');
244+
$result = $highlightFile(SUPPORTPATH . 'Controllers' . DIRECTORY_SEPARATOR . 'Hello.php', 16);
245+
$resultFile = version_compare(PHP_VERSION, '8.3.0', '<') ?
246+
'highlightFile_pre_8_3_0.html' :
247+
'highlightFile.html';
248+
249+
$expected = file_get_contents(SUPPORTPATH . 'Debug' . DIRECTORY_SEPARATOR . $resultFile);
250+
251+
$this->assertSame($expected, $result);
252+
}
240253
}

0 commit comments

Comments
 (0)