1
0
mirror of https://github.com/BookStackApp/BookStack.git synced 2025-11-04 13:31:45 +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; $offset = 0;
$term = mb_strtolower($term); $term = mb_strtolower($term);
$pos = mb_strpos($text, $term, $offset); $pos = mb_strpos($text, $term, $offset);
while ($pos !== false) { while ($pos !== false && count($matchRefs) < 25) {
$end = $pos + mb_strlen($term); $end = $pos + mb_strlen($term);
$matchRefs[$pos] = $end; $matchRefs[$pos] = $end;
$offset = $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); $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() 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>']); $this->entities->newPage(['name' => 'My <cool> TestPageContent', 'html' => '<p>My supercool &lt;great&gt; TestPageContent page</p>']);