1
0
mirror of https://github.com/BookStackApp/BookStack.git synced 2025-11-03 02:13:16 +03:00

Search: Fixed formatting timeout with many term occurrences

For #5863
This commit is contained in:
Dan Brown
2025-10-31 15:55:45 +00:00
parent 7881bddce0
commit 1df850ea3e
2 changed files with 16 additions and 1 deletions

View File

@@ -91,7 +91,7 @@ class SearchResultsFormatter
$offset = 0;
$term = mb_strtolower($term);
$pos = mb_strpos($text, $term, $offset);
while ($pos !== false) {
while ($pos !== false && count($matchRefs) < 25) {
$end = $pos + mb_strlen($term);
$matchRefs[$pos] = $end;
$offset = $end;

View File

@@ -378,6 +378,21 @@ class EntitySearchTest extends TestCase
$search->assertSee('<strong>На</strong> <strong>мен</strong> <strong>ми</strong> <strong>трябва</strong> <strong>нещо</strong> <strong>добро</strong> test', false);
}
public function test_match_highlighting_is_efficient_with_large_frequency_in_content()
{
$content = str_repeat('superbeans ', 10000);
$this->entities->newPage([
'name' => 'Test Page',
'html' => "<p>{$content}</p>",
]);
$time = microtime(true);
$resp = $this->asEditor()->get('/search?term=' . urlencode('superbeans'));
$this->assertLessThan(0.5, microtime(true) - $time);
$resp->assertSee('<strong>superbeans</strong>', false);
}
public function test_html_entities_in_item_details_remains_escaped_in_search_results()
{
$this->entities->newPage(['name' => 'My <cool> TestPageContent', 'html' => '<p>My supercool &lt;great&gt; TestPageContent page</p>']);