Reviewed #2393, Removed image guessing and added testing

For review of meta tag additions as per PR #2393.
This commit removes any image guesswork and only uses images that have
been set by the author for the specific content.
This also adds tests to cover the expected OG tags.
This commit is contained in:
Dan Brown 2021-06-23 20:42:48 +01:00
parent 58fa7679bc
commit 265f5db03f
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
7 changed files with 110 additions and 39 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -8,7 +8,9 @@
@push('social-meta')
<meta property="og:description" content="{{ Str::limit($book->description, 100, '...') }}">
<meta property="og:image" content="{{ $book->getBookCover() }}">
@if($book->cover)
<meta property="og:image" content="{{ $book->getBookCover() }}">
@endif
@endpush
@section('body')

View File

@ -7,8 +7,7 @@
@stop
@push('social-meta')
<meta property="og:description" content="{{ Str::limit($chapter->description, 100) }}">
<meta property="og:image" content="{{ $chapter->book->getBookCover() }}">
<meta property="og:description" content="{{ Str::limit($chapter->description, 100, '...') }}">
@endpush
@section('body')

View File

@ -2,7 +2,6 @@
@push('social-meta')
<meta property="og:description" content="{{ Str::limit($page->text, 100, '...') }}">
<meta property="og:image" content="{{ $page->getCoverImage() }}">
@endpush
@section('body')

View File

@ -1,8 +1,10 @@
@extends('tri-layout')
@push('social-meta')
<meta property="og:description" content="{{ Str::limit($shelf->description, 100) }}">
<meta property="og:image" content="{{ $shelf->getBookCover() }}">
<meta property="og:description" content="{{ Str::limit($shelf->description, 100, '...') }}">
@if($shelf->cover)
<meta property="og:image" content="{{ $shelf->getBookCover() }}">
@endif
@endpush
@section('body')

102
tests/OpenGraphTest.php Normal file
View File

@ -0,0 +1,102 @@
<?php namespace Tests;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
use BookStack\Entities\Repos\BookRepo;
use BookStack\Entities\Repos\BookshelfRepo;
use Illuminate\Support\Str;
use Tests\Uploads\UsesImages;
class OpenGraphTest extends TestCase
{
use UsesImages;
public function test_page_tags()
{
$page = Page::query()->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;
}
}