]> BookStack Code Mirror - bookstack/blobdiff - app/Search/SearchIndex.php
Lexical: Updated tests for node changes
[bookstack] / app / Search / SearchIndex.php
index 54ed95ebbe515f8aa322c2cbf405a7c7fbe99213..d9fc4e7aadce9aabc3b8b7aa70e17f6edf8d5af3 100644 (file)
@@ -2,11 +2,11 @@
 
 namespace BookStack\Search;
 
-use BookStack\Actions\Tag;
+use BookStack\Activity\Models\Tag;
 use BookStack\Entities\EntityProvider;
 use BookStack\Entities\Models\Entity;
 use BookStack\Entities\Models\Page;
-use DOMDocument;
+use BookStack\Util\HtmlDocument;
 use DOMNode;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Collection;
@@ -15,25 +15,18 @@ class SearchIndex
 {
     /**
      * A list of delimiter characters used to break-up parsed content into terms for indexing.
-     *
-     * @var string
-     */
-    public static $delimiters = " \n\t.,!?:;()[]{}<>`'\"";
-
-    /**
-     * @var EntityProvider
      */
-    protected $entityProvider;
+    public static string $delimiters = " \n\t.,!?:;()[]{}<>`'\"";
 
-    public function __construct(EntityProvider $entityProvider)
-    {
-        $this->entityProvider = $entityProvider;
+    public function __construct(
+        protected EntityProvider $entityProvider
+    ) {
     }
 
     /**
      * Index the given entity.
      */
-    public function indexEntity(Entity $entity)
+    public function indexEntity(Entity $entity): void
     {
         $this->deleteEntityTerms($entity);
         $terms = $this->entityToTermDataArray($entity);
@@ -45,7 +38,7 @@ class SearchIndex
      *
      * @param Entity[] $entities
      */
-    public function indexEntities(array $entities)
+    public function indexEntities(array $entities): void
     {
         $terms = [];
         foreach ($entities as $entity) {
@@ -69,7 +62,7 @@ class SearchIndex
      *
      * @param callable(Entity, int, int):void|null $progressCallback
      */
-    public function indexAllEntities(?callable $progressCallback = null)
+    public function indexAllEntities(?callable $progressCallback = null): void
     {
         SearchTerm::query()->truncate();
 
@@ -101,7 +94,7 @@ class SearchIndex
     /**
      * Delete related Entity search terms.
      */
-    public function deleteEntityTerms(Entity $entity)
+    public function deleteEntityTerms(Entity $entity): void
     {
         $entity->searchTerms()->delete();
     }
@@ -145,16 +138,11 @@ class SearchIndex
             'h6' => 1.5,
         ];
 
-        $html = '<body>' . $html . '</body>';
         $html = str_ireplace(['<br>', '<br />', '<br/>'], "\n", $html);
+        $doc = new HtmlDocument($html);
 
-        libxml_use_internal_errors(true);
-        $doc = new DOMDocument();
-        $doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
-
-        $topElems = $doc->documentElement->childNodes->item(0)->childNodes;
         /** @var DOMNode $child */
-        foreach ($topElems as $child) {
+        foreach ($doc->getBodyChildren() as $child) {
             $nodeName = $child->nodeName;
             $termCounts = $this->textToTermCountMap(trim($child->textContent));
             foreach ($termCounts as $term => $count) {
@@ -175,7 +163,6 @@ class SearchIndex
      */
     protected function generateTermScoreMapFromTags(array $tags): array
     {
-        $scoreMap = [];
         $names = [];
         $values = [];