Updated page navigation logic to ignore empty headers

Fixes #1429
This commit is contained in:
Dan Brown 2019-05-15 21:02:11 +01:00
parent 0ee9e5c4db
commit 896f88174a
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
3 changed files with 50 additions and 14 deletions

View File

@ -422,25 +422,29 @@ class PageRepo extends EntityRepo
return []; return [];
} }
$tree = collect([]); $tree = collect($headers)->map(function($header) {
foreach ($headers as $header) { $text = trim(str_replace("\xc2\xa0", '', $header->nodeValue));
$text = $header->nodeValue; if (strlen($text) > 30) {
$tree->push([ $text = substr($text, 0, 27) . '...';
}
return [
'nodeName' => strtolower($header->nodeName), 'nodeName' => strtolower($header->nodeName),
'level' => intval(str_replace('h', '', $header->nodeName)), 'level' => intval(str_replace('h', '', $header->nodeName)),
'link' => '#' . $header->getAttribute('id'), 'link' => '#' . $header->getAttribute('id'),
'text' => strlen($text) > 30 ? substr($text, 0, 27) . '...' : $text 'text' => $text,
]); ];
} })->filter(function($header) {
return strlen($header['text']) > 0;
});
// Normalise headers if only smaller headers have been used // Normalise headers if only smaller headers have been used
if (count($tree) > 0) {
$minLevel = $tree->pluck('level')->min(); $minLevel = $tree->pluck('level')->min();
$tree = $tree->map(function ($header) use ($minLevel) { $tree = $tree->map(function ($header) use ($minLevel) {
$header['level'] -= ($minLevel - 2); $header['level'] -= ($minLevel - 2);
return $header; return $header;
}); });
}
return $tree->toArray(); return $tree->toArray();
} }

View File

@ -0,0 +1,32 @@
<?php
namespace Tests;
use BookStack\Entities\Repos\PageRepo;
class PageRepoTest extends TestCase
{
/**
* @var PageRepo $pageRepo
*/
protected $pageRepo;
protected function setUp()
{
parent::setUp();
$this->pageRepo = app()->make(PageRepo::class);
}
public function test_get_page_nav_does_not_show_empty_titles()
{
$content = '<h1 id="testa">Hello</h1><h2 id="testb">&nbsp;</h2><h3 id="testc"></h3>';
$navMap = $this->pageRepo->getPageNav($content);
$this->assertCount(1, $navMap);
$this->assertArraySubset([
'nodeName' => 'h1',
'link' => '#testa',
'text' => 'Hello'
], $navMap[0]);
}
}