Skip to content

Commit

Permalink
1.3.10
Browse files Browse the repository at this point in the history
- `OpfMetadata::class` fix only one tag
  • Loading branch information
ewilan-riviere committed Jun 19, 2023
1 parent cddaf3f commit e89527c
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 3 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "kiwilan/php-ebook",
"description": "PHP package to read metadata and extract covers from eBooks (.epub, .cbz, .cbr, .cb7, .cbt, .pdf) and audiobooks (.mp3, .m4a, .m4b, .flac, .ogg).",
"version": "1.3.0",
"version": "1.3.10",
"keywords": [
"php",
"ebook",
Expand Down
12 changes: 10 additions & 2 deletions src/Formats/Epub/OpfMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,10 @@ private function setDcSubjects(): array
$items = $core;
}

if (array_key_exists('_value', $items)) {
$items = [$items];
}

$temp = [];
foreach ($items as $item) {
$temp[] = $item['_value'] ?? null;
Expand Down Expand Up @@ -391,7 +395,7 @@ private function setDcCreators(): array
*/
private function setDcContributors(): array
{
$core = $this->metadata['dc:contributor'] ?? null;
$core = $this->metadata['dc:contributor']['_value'] ?? null;

if (! $core) {
return [];
Expand Down Expand Up @@ -492,8 +496,12 @@ private function setMeta(): array
return $items;
}

private function multipleItems(array $items): array
private function multipleItems(mixed $items): array
{
if (! is_array($items)) {
$items = [$items];
}

$core = $items;
// Check if subarrays exists
$isMultiple = array_key_exists(0, $items);
Expand Down
19 changes: 19 additions & 0 deletions tests/EpubOpfTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,22 @@
expect($opf->coverPath())->toBeString();
expect($opf->epubVersion())->toBeGreaterThanOrEqual(2);
});

it('can parse epub opf without tags', function () {
$opf = OpfMetadata::make(file_get_contents(EPUB_OPF_EPUB2_NO_TAGS), EPUB_OPF_EPUB2_NO_TAGS);

expect($opf)->tobeInstanceOf(OpfMetadata::class);
expect(EPUB_OPF_EPUB2_NO_TAGS)->toBeReadableFile();
expect($opf->dcTitle())->toBeString();
expect($opf->dcCreators())->toBeArray();
expect($opf->dcDescription())->toBeString();
expect($opf->dcContributors())->toBeArray();
expect($opf->dcRights())->toBeArray();
expect($opf->dcPublisher())->toBeString();
expect($opf->dcIdentifiers())->toBeArray();
expect($opf->dcSubject())->toBeArray();
expect($opf->dcLanguage())->toBeString();
expect($opf->meta())->toBeArray();
expect($opf->coverPath())->toBeString();
expect($opf->epubVersion())->toBeGreaterThanOrEqual(2);
});
7 changes: 7 additions & 0 deletions tests/EpubTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -148,3 +148,10 @@

expect($ebook->execTime())->toBeLessThan(0.06);
})->skip(PHP_OS_FAMILY === 'Windows', 'Skip on Windows');

it('can parse epub without tags', function () {
$ebook = Ebook::read(EPUB_ONE_TAG);

expect($ebook->tags())->toBeArray();
expect($ebook->tags()[0])->toBeString();
});
2 changes: 2 additions & 0 deletions tests/Pest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@
define('EPUB_CONTAINER_EPUB3', __DIR__.'/media/container-epub3.xml');

define('EPUB_OPF_EPUB2', __DIR__.'/media/opf-epub2.opf');
define('EPUB_OPF_EPUB2_NO_TAGS', __DIR__.'/media/opf-epub2-no-tags.opf');
define('EPUB_OPF_EPUB3', __DIR__.'/media/opf-epub3.opf');
define('EPUB_OPF_EPUB3_ALT', __DIR__.'/media/opf-epub3-alt.opf');

define('EPUB', __DIR__.'/media/test-epub.epub');
define('EPUB_ONE_TAG', __DIR__.'/media/epub-one-tag.epub');
define('EPUB_NO_META', __DIR__.'/media/epub-no-meta.epub');
define('EPUB_MULTIPLE_CREATORS', __DIR__.'/media/epub-multiple-creators.epub');
define('EPUB_BAD_MULTIPLE_CREATORS', __DIR__.'/media/epub-bad-multiple-creators.epub');
Expand Down
Binary file added tests/media/epub-one-tag.epub
Binary file not shown.
81 changes: 81 additions & 0 deletions tests/media/opf-epub2-no-tags.opf
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="uuid_id">
<metadata xmlns:opf="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:calibre="http://calibre.kovidgoyal.net/2009/metadata">
<dc:title>Le clan de l'ours des cavernes</dc:title>
<dc:creator opf:role="aut" opf:file-as="Auel, Jean M.">Jean M. Auel</dc:creator>
<dc:contributor opf:role="bkp">calibre (6.12.0) [https://calibre-ebook.com]</dc:contributor>
<dc:description>&lt;div&gt;
&lt;p&gt;Quelque part en Europe, 35 000 ans avant notre ère. Petite fille Cro-Magnon de cinq
ans, Ayla est séparée de ses parents à la suite d'un violent tremblement de terre. Elle est
recueillie par le clan de l'ours des cavernes, une tribu Neandertal qui l'adopte, non sans
réticence, ayant reconnu en elle la représentante d'une autre espèce, plus évoluée.
&lt;br&gt;&lt;br&gt;Iza, la guérisseuse, Brun, le chef et Creb, le magicien lui enseignent les
règles de la vie communautaire, leurs rites, leurs peurs, leurs audaces. Mais Ayla, la
fillette blonde aux yeux bleus les surprend par sa puissance de raisonnement qui lui permet de
s'adapter, de réagir rapidement et de ne pas être totalement dépendante de son environnement.
Une différence qui ne tarde pas à faire d'elle une menace pour tout le clan, et à attiser la
convoitise de Brud, le fils du chef...&lt;/p&gt;&lt;/div&gt;</dc:description>
<dc:publisher>Presses de la cité</dc:publisher>
<dc:identifier id="uuid_id" opf:scheme="uuid">a2cf2f25-4de2-4f77-82cc-0198352b0851</dc:identifier>
<dc:date>1980-01-13T21:00:00+00:00</dc:date>
<dc:subject>Fiction</dc:subject>
<dc:language>fr</dc:language>
<dc:identifier opf:scheme="calibre">a2cf2f25-4de2-4f77-82cc-0198352b0851</dc:identifier>
<dc:identifier opf:scheme="GOOGLE">63CTHAAACAAJ</dc:identifier>
<dc:identifier opf:scheme="ISBN">9782266122122</dc:identifier>
<meta name="calibre:title_sort" content="clan de l'ours des cavernes, Le" />
<meta name="calibre:series" content="Les Enfants de la Terre" />
<meta name="calibre:series_index" content="1.0" />
<meta name="calibre:timestamp" content="2023-03-25T10:32:21+00:00" />
<meta name="calibre:rating" content="10.0" />
<meta name="cover" content="cover" />
<meta name="calibre:author_link_map" content="{&quot;Jean M. Auel&quot;: &quot;&quot;}" />
</metadata>
<manifest>
<item id="titlepage" href="titlepage.xhtml" media-type="application/xhtml+xml" />
<item id="html8"
href="Auel,Jean M.-[Les Enfants de la Terre-1]Le clan de l'ours des cavernes.French.ebook.AlexandriZ_split_000.htm"
media-type="application/xhtml+xml" />
<item id="html7"
href="Auel,Jean M.-[Les Enfants de la Terre-1]Le clan de l'ours des cavernes.French.ebook.AlexandriZ_split_001.htm"
media-type="application/xhtml+xml" />
<item id="html6"
href="Auel,Jean M.-[Les Enfants de la Terre-1]Le clan de l'ours des cavernes.French.ebook.AlexandriZ_split_002.htm"
media-type="application/xhtml+xml" />
<item id="html5"
href="Auel,Jean M.-[Les Enfants de la Terre-1]Le clan de l'ours des cavernes.French.ebook.AlexandriZ_split_003.htm"
media-type="application/xhtml+xml" />
<item id="html4"
href="Auel,Jean M.-[Les Enfants de la Terre-1]Le clan de l'ours des cavernes.French.ebook.AlexandriZ_split_004.htm"
media-type="application/xhtml+xml" />
<item id="html3"
href="Auel,Jean M.-[Les Enfants de la Terre-1]Le clan de l'ours des cavernes.French.ebook.AlexandriZ_split_005.htm"
media-type="application/xhtml+xml" />
<item id="html2"
href="Auel,Jean M.-[Les Enfants de la Terre-1]Le clan de l'ours des cavernes.French.ebook.AlexandriZ_split_006.htm"
media-type="application/xhtml+xml" />
<item id="html1"
href="Auel,Jean M.-[Les Enfants de la Terre-1]Le clan de l'ours des cavernes.French.ebook.AlexandriZ_split_007.htm"
media-type="application/xhtml+xml" />
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />
<item id="page_css" href="page_styles.css" media-type="text/css" />
<item id="css" href="stylesheet.css" media-type="text/css" />
<item id="cover" href="cover.jpeg" media-type="image/jpeg" />
</manifest>
<spine toc="ncx">
<itemref idref="titlepage" />
<itemref idref="html8" />
<itemref idref="html7" />
<itemref idref="html6" />
<itemref idref="html5" />
<itemref idref="html4" />
<itemref idref="html3" />
<itemref idref="html2" />
<itemref idref="html1" />
</spine>
<guide>
<reference type="cover" href="titlepage.xhtml" title="Cover" />
</guide>
</package>

0 comments on commit e89527c

Please sign in to comment.