Make sure verse references are capitalized correctly.

This commit is contained in:
Leonard Smith 2021-05-04 11:41:31 -05:00
parent 5d69a0e89f
commit 559a774d88
5 changed files with 110 additions and 40 deletions

View File

@ -3,6 +3,7 @@ namespace App\Handlers;
use App\Book;
use App\Chapter;
use App\Helpers\Traits\BookTitleHelperTrait;
use App\Word;
use App\Verse;
use DOMDocument;
@ -20,7 +21,7 @@ use Symfony\Component\Console\Output\OutputInterface;
*/
class UlbXmlImportHandler
{
use BookXmlFilesTrait;
use BookXmlFilesTrait, BookTitleHelperTrait;
const REPO_FOLDER = '/ulb/';
@ -472,39 +473,6 @@ class UlbXmlImportHandler
return $document;
}
/**
* @param string $bookTitle
* @return string
*/
protected function prepareBookName(string $bookTitle) : string
{
$parts = $this->parseBookTitle($bookTitle);
return !isset($parts[1]) ? ucfirst($parts[0]) : $parts[0] . " " . ucfirst($parts[1]);
}
/**
* @param string $bookTitle
* @return string
*/
protected function prepareBookId(string $bookTitle) : string
{
$parts = $this->parseBookTitle($bookTitle);
return !isset($parts[1]) ? strtolower($parts[0]) : $parts[0] . " " . strtolower($parts[1]);
}
/**
* @param string $bookTitle
* @return array|string[]
*/
protected function parseBookTitle(string $bookTitle) : array
{
if (is_numeric(substr($bookTitle, 0, 1))) {
return [ substr($bookTitle, 0, 1), substr($bookTitle, 1) ];
} else {
return [ $bookTitle ];
}
}
protected function write($message, $newline)
{
if ($this->output !== null && $this->output instanceof OutputStyle) {

View File

@ -0,0 +1,47 @@
<?php
namespace App\Helpers\Traits;
/**
* This trait provides some helper methods for dealing with Book names, titles, etc.
*
* BookTitleHelperTrait.php
*
* @author: Leonard Smith <leonard@acornwebconsultants.com>
* Date: 5/4/21
* Time: 11:13 AM
*/
trait BookTitleHelperTrait
{
/**
* @param string $bookTitle
* @return string
*/
protected function prepareBookName(string $bookTitle) : string
{
$parts = $this->parseBookTitle($bookTitle);
return !isset($parts[1]) ? ucfirst($parts[0]) : $parts[0] . " " . ucfirst($parts[1]);
}
/**
* @param string $bookTitle
* @return string
*/
protected function prepareBookId(string $bookTitle) : string
{
$parts = $this->parseBookTitle($bookTitle);
return !isset($parts[1]) ? strtolower($parts[0]) : $parts[0] . " " . strtolower($parts[1]);
}
/**
* @param string $bookTitle
* @return array|string[]
*/
protected function parseBookTitle(string $bookTitle) : array
{
if (is_numeric(substr($bookTitle, 0, 1))) {
return [ substr($bookTitle, 0, 1), ltrim(substr($bookTitle, 1)) ];
} else {
return [ $bookTitle ];
}
}
}

View File

@ -2,10 +2,13 @@
namespace App;
use App\Helpers\Traits\BookTitleHelperTrait;
use Illuminate\Database\Eloquent\Model;
class Verse extends Model
{
use BookTitleHelperTrait;
public $incrementing = false;
public $fillable = [
@ -42,6 +45,6 @@ class Verse extends Model
{
$parts = explode('-', $this->id);
return ucfirst($parts[0]) . ' ' . $parts[1] . ':' . $parts[2];
return $this->prepareBookName(ucfirst($parts[0])) . ' ' . $parts[1] . ':' . $parts[2];
}
}

View File

@ -2,15 +2,16 @@
namespace Tests\Unit;
use App\Handlers\UlbXmlImportHandler;
use App\Helpers\Traits\BookTitleHelperTrait;
use Tests\TestCase;
class UlbXmlImportHandlerTest extends TestCase
class BookTitleHelperTraitText extends TestCase
{
public function testThatParseBookTitleHandlesNumberedBooksCorrectly()
{
$handler = new UlbXmlImportHandler();
$handler = new BookTitleTester();
$reflection_class = new \ReflectionClass(UlbXmlImportHandler::class);
$reflection_class = new \ReflectionClass(BookTitleTester::class);
$method = $reflection_class->getMethod('parseBookTitle');
$method->setAccessible(true);
@ -23,9 +24,9 @@ class UlbXmlImportHandlerTest extends TestCase
public function testThatPrepareBookNameReturnsProperlyFormattedName()
{
$handler = new UlbXmlImportHandler();
$handler = new BookTitleTester();
$reflection_class = new \ReflectionClass(UlbXmlImportHandler::class);
$reflection_class = new \ReflectionClass(BookTitleTester::class);
$method = $reflection_class->getMethod('prepareBookName');
$method->setAccessible(true);
@ -35,4 +36,21 @@ class UlbXmlImportHandlerTest extends TestCase
$result = $method->invoke($handler, 'john');
$this->assertEquals('John', $result);
}
public function testThatWhitespaceBetweenNumberAndTextDoesNotBreakCapitalization()
{
$handler = new BookTitleTester();
$reflection_class = new \ReflectionClass(BookTitleTester::class);
$method = $reflection_class->getMethod('prepareBookName');
$method->setAccessible(true);
$result = $method->invoke($handler, '1 corinthians');
$this->assertEquals('1 Corinthians', $result);
}
}
class BookTitleTester
{
use BookTitleHelperTrait;
}

View File

@ -0,0 +1,34 @@
<?php
namespace Tests\Unit;
use App\Verse;
use Tests\TestCase;
/**
* VerseModelTest.php
*
* @author: Leonard Smith <leonard@acornwebconsultants.com>
* Date: 5/4/21
* Time: 11:34 AM
*/
class VerseModelTest extends TestCase
{
public function testThatVerseReferenceIsCorrectlyReturnedForNumberedBooks()
{
$model = new Verse();
$model->id = '1 peter-1-1';
$model->name = '1';
$model->chapter_id = '1 peter-1';
$this->assertEquals('1 Peter 1:1', $model->reference);
}
public function testThatVerseReferenceIsCorrectlyReturnedForUnnumberedBooks()
{
$model = new Verse();
$model->id = 'matthew-28-19';
$model->name = '1';
$model->chapter_id = 'matthew-28';
$this->assertEquals('Matthew 28:19', $model->reference);
}
}