From 896f88174a9f8e2e90c9fe1b14fcbec3fcb48930 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Wed, 15 May 2019 21:02:11 +0100 Subject: [PATCH] Updated page navigation logic to ignore empty headers Fixes #1429 --- app/Entities/Repos/PageRepo.php | 32 ++++++++++++++++++-------------- tests/{ => Unit}/HelpersTest.php | 0 tests/Unit/PageRepoTest.php | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 14 deletions(-) rename tests/{ => Unit}/HelpersTest.php (100%) create mode 100644 tests/Unit/PageRepoTest.php diff --git a/app/Entities/Repos/PageRepo.php b/app/Entities/Repos/PageRepo.php index 1aeee8dae..208aa5fa3 100644 --- a/app/Entities/Repos/PageRepo.php +++ b/app/Entities/Repos/PageRepo.php @@ -422,25 +422,29 @@ class PageRepo extends EntityRepo return []; } - $tree = collect([]); - foreach ($headers as $header) { - $text = $header->nodeValue; - $tree->push([ + $tree = collect($headers)->map(function($header) { + $text = trim(str_replace("\xc2\xa0", '', $header->nodeValue)); + if (strlen($text) > 30) { + $text = substr($text, 0, 27) . '...'; + } + + return [ 'nodeName' => strtolower($header->nodeName), 'level' => intval(str_replace('h', '', $header->nodeName)), '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 - if (count($tree) > 0) { - $minLevel = $tree->pluck('level')->min(); - $tree = $tree->map(function ($header) use ($minLevel) { - $header['level'] -= ($minLevel - 2); - return $header; - }); - } + $minLevel = $tree->pluck('level')->min(); + $tree = $tree->map(function ($header) use ($minLevel) { + $header['level'] -= ($minLevel - 2); + return $header; + }); + return $tree->toArray(); } diff --git a/tests/HelpersTest.php b/tests/Unit/HelpersTest.php similarity index 100% rename from tests/HelpersTest.php rename to tests/Unit/HelpersTest.php diff --git a/tests/Unit/PageRepoTest.php b/tests/Unit/PageRepoTest.php new file mode 100644 index 000000000..36addcbe4 --- /dev/null +++ b/tests/Unit/PageRepoTest.php @@ -0,0 +1,32 @@ +pageRepo = app()->make(PageRepo::class); + } + + public function test_get_page_nav_does_not_show_empty_titles() + { + $content = '

Hello

 

'; + $navMap = $this->pageRepo->getPageNav($content); + + $this->assertCount(1, $navMap); + $this->assertArraySubset([ + 'nodeName' => 'h1', + 'link' => '#testa', + 'text' => 'Hello' + ], $navMap[0]); + } + +} \ No newline at end of file