diff --git a/app/Entities/Models/Page.php b/app/Entities/Models/Page.php
index 6e521b2b8..93fb21893 100644
--- a/app/Entities/Models/Page.php
+++ b/app/Entities/Models/Page.php
@@ -138,23 +138,4 @@ class Page extends BookChild
$refreshed->html = (new PageContent($refreshed))->render();
return $refreshed;
}
-
- /**
- * Returns URL to a cover image for the page.
- */
- public function getCoverImage()
- {
- //$default = $this->book->getBookCover();
- $default = url('/logo.png');
-
- $firstImage = (new PageContent($this))->fetchFirstImage();
-
- try {
- $cover = $firstImage ? $firstImage : $default;
- } catch (\Exception $err) {
- $cover = $default;
- }
- return $cover;
- }
-
}
diff --git a/app/Entities/Tools/PageContent.php b/app/Entities/Tools/PageContent.php
index d178dc040..381ef172b 100644
--- a/app/Entities/Tools/PageContent.php
+++ b/app/Entities/Tools/PageContent.php
@@ -367,18 +367,4 @@ class PageContent
$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
return $doc;
}
-
- /**
- * Retrieve first image in page content and return the source URL.
- */
- public function fetchFirstImage()
- {
- $htmlContent = $this->page->html;
-
- $dom = new \DomDocument();
- $dom->loadHTML($htmlContent);
- $images = $dom->getElementsByTagName('img');
-
- return $images->length > 0 ? $images[0]->getAttribute('src') : null;
- }
}
diff --git a/resources/views/books/show.blade.php b/resources/views/books/show.blade.php
index 69a945cbe..5879cf6a2 100644
--- a/resources/views/books/show.blade.php
+++ b/resources/views/books/show.blade.php
@@ -8,7 +8,9 @@
@push('social-meta')
-
+ @if($book->cover)
+
+ @endif
@endpush
@section('body')
diff --git a/resources/views/chapters/show.blade.php b/resources/views/chapters/show.blade.php
index a70f0f9f2..e8e0f6374 100644
--- a/resources/views/chapters/show.blade.php
+++ b/resources/views/chapters/show.blade.php
@@ -7,8 +7,7 @@
@stop
@push('social-meta')
-
-
+
@endpush
@section('body')
diff --git a/resources/views/pages/show.blade.php b/resources/views/pages/show.blade.php
index 398c8a853..012454e7c 100644
--- a/resources/views/pages/show.blade.php
+++ b/resources/views/pages/show.blade.php
@@ -2,7 +2,6 @@
@push('social-meta')
-
@endpush
@section('body')
diff --git a/resources/views/shelves/show.blade.php b/resources/views/shelves/show.blade.php
index 1205e8320..f5920d475 100644
--- a/resources/views/shelves/show.blade.php
+++ b/resources/views/shelves/show.blade.php
@@ -1,8 +1,10 @@
@extends('tri-layout')
@push('social-meta')
-
-
+
+ @if($shelf->cover)
+
+ @endif
@endpush
@section('body')
diff --git a/tests/OpenGraphTest.php b/tests/OpenGraphTest.php
new file mode 100644
index 000000000..653f2e57e
--- /dev/null
+++ b/tests/OpenGraphTest.php
@@ -0,0 +1,102 @@
+first();
+ $resp = $this->asEditor()->get($page->getUrl());
+ $tags = $this->getOpenGraphTags($resp);
+
+ $this->assertEquals($page->getShortName() . ' | BookStack', $tags['title']);
+ $this->assertEquals($page->getUrl(), $tags['url']);
+ $this->assertEquals(Str::limit($page->text, 100, '...'), $tags['description']);
+ }
+
+ public function test_chapter_tags()
+ {
+ $chapter = Chapter::query()->first();
+ $resp = $this->asEditor()->get($chapter->getUrl());
+ $tags = $this->getOpenGraphTags($resp);
+
+ $this->assertEquals($chapter->getShortName() . ' | BookStack', $tags['title']);
+ $this->assertEquals($chapter->getUrl(), $tags['url']);
+ $this->assertEquals(Str::limit($chapter->description, 100, '...'), $tags['description']);
+ }
+
+ public function test_book_tags()
+ {
+ $book = Book::query()->first();
+ $resp = $this->asEditor()->get($book->getUrl());
+ $tags = $this->getOpenGraphTags($resp);
+
+ $this->assertEquals($book->getShortName() . ' | BookStack', $tags['title']);
+ $this->assertEquals($book->getUrl(), $tags['url']);
+ $this->assertEquals(Str::limit($book->description, 100, '...'), $tags['description']);
+ $this->assertArrayNotHasKey('image', $tags);
+
+ // Test image set if image has cover image
+ $bookRepo = app(BookRepo::class);
+ $bookRepo->updateCoverImage($book, $this->getTestImage('image.png'));
+ $resp = $this->asEditor()->get($book->getUrl());
+ $tags = $this->getOpenGraphTags($resp);
+
+ $this->assertEquals($book->getBookCover(), $tags['image']);
+ }
+
+ public function test_shelf_tags()
+ {
+ $shelf = Bookshelf::query()->first();
+ $resp = $this->asEditor()->get($shelf->getUrl());
+ $tags = $this->getOpenGraphTags($resp);
+
+ $this->assertEquals($shelf->getShortName() . ' | BookStack', $tags['title']);
+ $this->assertEquals($shelf->getUrl(), $tags['url']);
+ $this->assertEquals(Str::limit($shelf->description, 100, '...'), $tags['description']);
+ $this->assertArrayNotHasKey('image', $tags);
+
+ // Test image set if image has cover image
+ $shelfRepo = app(BookshelfRepo::class);
+ $shelfRepo->updateCoverImage($shelf, $this->getTestImage('image.png'));
+ $resp = $this->asEditor()->get($shelf->getUrl());
+ $tags = $this->getOpenGraphTags($resp);
+
+ $this->assertEquals($shelf->getBookCover(), $tags['image']);
+ }
+
+ /**
+ * Parse the open graph tags from a test response.
+ */
+ protected function getOpenGraphTags(TestResponse $resp): array
+ {
+ $tags = [];
+
+ libxml_use_internal_errors(true);
+ $doc = new \DOMDocument();
+ $doc->loadHTML($resp->getContent());
+ $metaElems = $doc->getElementsByTagName('meta');
+ /** @var \DOMElement $elem */
+ foreach ($metaElems as $elem) {
+ $prop = $elem->getAttribute('property');
+ $name = explode(':', $prop)[1] ?? null;
+ if ($name) {
+ $tags[$name] = $elem->getAttribute('content');
+ }
+ }
+
+ return $tags;
+ }
+
+
+}
\ No newline at end of file