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;
{
/**
* 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);
*
* @param Entity[] $entities
*/
- public function indexEntities(array $entities)
+ public function indexEntities(array $entities): void
{
$terms = [];
foreach ($entities as $entity) {
*
* @param callable(Entity, int, int):void|null $progressCallback
*/
- public function indexAllEntities(?callable $progressCallback = null)
+ public function indexAllEntities(?callable $progressCallback = null): void
{
SearchTerm::query()->truncate();
/**
* Delete related Entity search terms.
*/
- public function deleteEntityTerms(Entity $entity)
+ public function deleteEntityTerms(Entity $entity): void
{
$entity->searchTerms()->delete();
}
'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) {
*/
protected function generateTermScoreMapFromTags(array $tags): array
{
- $scoreMap = [];
$names = [];
$values = [];