3 namespace BookStack\References;
6 use BookStack\References\ModelResolvers\BookLinkModelResolver;
7 use BookStack\References\ModelResolvers\BookshelfLinkModelResolver;
8 use BookStack\References\ModelResolvers\ChapterLinkModelResolver;
9 use BookStack\References\ModelResolvers\CrossLinkModelResolver;
10 use BookStack\References\ModelResolvers\PageLinkModelResolver;
11 use BookStack\References\ModelResolvers\PagePermalinkModelResolver;
18 * @var CrossLinkModelResolver[]
20 protected array $modelResolvers;
22 public function __construct(array $modelResolvers)
24 $this->modelResolvers = $modelResolvers;
28 * Extract any found models within the given HTML content.
32 public function extractLinkedModels(string $html): array
36 $links = $this->getLinksFromContent($html);
38 foreach ($links as $link) {
39 $model = $this->linkToModel($link);
40 if (!is_null($model)) {
41 $models[get_class($model) . ':' . $model->id] = $model;
45 return array_values($models);
49 * Get a list of href values from the given document.
53 protected function getLinksFromContent(string $html): array
57 $html = '<body>' . $html . '</body>';
58 libxml_use_internal_errors(true);
59 $doc = new DOMDocument();
60 $doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
62 $xPath = new DOMXPath($doc);
63 $anchors = $xPath->query('//a[@href]');
65 /** @var \DOMElement $anchor */
66 foreach ($anchors as $anchor) {
67 $links[] = $anchor->getAttribute('href');
74 * Attempt to resolve the given link to a model using the instance model resolvers.
76 protected function linkToModel(string $link): ?Model
78 foreach ($this->modelResolvers as $resolver) {
79 $model = $resolver->resolve($link);
80 if (!is_null($model)) {
89 * Create a new instance with a pre-defined set of model resolvers, specifically for the
90 * default set of entities within BookStack.
92 public static function createWithEntityResolvers(): self
95 new PagePermalinkModelResolver(),
96 new PageLinkModelResolver(),
97 new ChapterLinkModelResolver(),
98 new BookLinkModelResolver(),
99 new BookshelfLinkModelResolver(),