Skip to content

Commit 6e3deac

Browse files
author
Sanders Kleinfeld
committed
Merge pull request #137 from oreillymedia/labels
Improved default handling of NCX/OPF identifiers
2 parents 1a941c2 + 9f55c13 commit 6e3deac

File tree

4 files changed

+52
-50
lines changed

4 files changed

+52
-50
lines changed

htmlbook-xsl/epub.xsl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@
4949
<xsl:value-of select="//h:head/h:meta[contains(@name, 'identifier')][1]/@content"/>
5050
</xsl:param>
5151

52+
<xsl:param name="computed.identifier">
53+
<xsl:value-of select="$metadata.unique-identifier"/>
54+
<!-- If no identifier supplied, add a default value to ensure validity -->
55+
<xsl:if test="not($metadata.unique-identifier) or normalize-space($metadata.unique-identifier) = ''">
56+
<xsl:value-of select="concat('randomid-', generate-id())"/>
57+
</xsl:if>
58+
</xsl:param>
59+
5260
<!-- ID to use on the dc:identifier element corresponding to the EPUB unique identifier -->
5361
<xsl:param name="metadata.unique-identifier.id" select="'pub-identifier'"/>
5462

htmlbook-xsl/ncx.xsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
<xsl:if test="$generate.cover.html = 1">
4141
<meta name="cover" content="{$epub.cover.html.id}"/>
4242
</xsl:if>
43-
<meta name="dtb:uid" content="{$metadata.unique-identifier}"/>
43+
<meta name="dtb:uid" content="{$computed.identifier}"/>
4444
</head>
4545
<docTitle>
4646
<text>

htmlbook-xsl/opf.xsl

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,8 @@
237237
</xsl:template>
238238

239239
<xsl:template name="opf.metadata">
240-
<xsl:param name="metadata.unique-identifier" select="$metadata.unique-identifier"/>
241240
<xsl:param name="metadata.unique-identifier.id" select="$metadata.unique-identifier.id"/>
241+
<xsl:param name="computed.identifier" select="$computed.identifier"/>
242242
<xsl:param name="metadata.title" select="$metadata.title"/>
243243
<xsl:param name="metadata.language" select="$metadata.language"/>
244244
<xsl:param name="metadata.modified" select="$metadata.modified"/>
@@ -252,13 +252,6 @@
252252
<xsl:param name="metadata.ibooks-specified-fonts" select="$metadata.ibooks-specified-fonts"/>
253253
<xsl:param name="generate.cover.html" select="$generate.cover.html"/>
254254
<metadata>
255-
<xsl:variable name="computed.identifier">
256-
<xsl:value-of select="$metadata.unique-identifier"/>
257-
<!-- If no identifier supplied, add a default value to ensure validity -->
258-
<xsl:if test="not($metadata.unique-identifier) or normalize-space($metadata.unique-identifier) = ''">
259-
<xsl:value-of select="concat('randomid-', generate-id())"/>
260-
</xsl:if>
261-
</xsl:variable>
262255

263256
<xsl:variable name="computed.title">
264257
<xsl:value-of select="$metadata.title"/>

htmlbook-xsl/xspec/opf.xspec

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
<!-- Global params for testing -->
1717
<x:param name="metadata.unique-identifier.id" select="'pub-identifier'"/>
18+
<x:param name="metadata.unique-identifier"/> <!-- Leave blank globally -->
1819
<x:param name="metadata.ibooks-specified-fonts" select="1"/>
1920
<x:param name="generate.cover.html" select="1"/>
2021

@@ -249,7 +250,7 @@ UbuntuMono-Regular.otf
249250

250251
<x:scenario label="When generating OPF metadata for a book (with all metadata supplied)">
251252
<x:call template="opf.metadata">
252-
<x:param name="metadata.unique-identifier" select="'9780000000000'"/>
253+
<x:param name="computed.identifier" select="'9780000000000'"/>
253254
<x:param name="metadata.ibooks-specified-fonts" select="1"/>
254255
<x:param name="metadata.title" select="'Understanding Computation'"/>
255256
<x:param name="metadata.language" select="'fr'"/>
@@ -295,46 +296,6 @@ UbuntuMono-Regular.otf
295296
<x:expect label="Cover metadata should be generated" test="exists(/opf:metadata/opf:meta[@name='cover' and @content='bookcoverimage'])"/>
296297
<x:expect label="iBooks metadata should be generated if specified" test="exists(/opf:metadata/opf:meta[@property='ibooks:specified-fonts' and . = 'true'])"/>
297298

298-
<x:scenario label="When generating OPF metadata for book without any metadata supplied or a cover">
299-
<x:call>
300-
<x:param name="metadata.unique-identifier"/>
301-
<x:param name="metadata.ibooks-specified-fonts"/>
302-
<x:param name="metadata.title"/>
303-
<x:param name="metadata.language"/>
304-
<x:param name="metadata.modified"/>
305-
<x:param name="metadata.rights"/>
306-
<x:param name="metadata.publisher"/>
307-
<x:param name="metadata.subject"/>
308-
<x:param name="metadata.date"/>
309-
<x:param name="metadata.description"/>
310-
<x:param name="metadata.contributors"/>
311-
<x:param name="metadata.creators"/>
312-
<x:param name="generate.cover.html"/>
313-
</x:call>
314-
<x:expect label="Default value should be subbed in for book identifier to ensure EPUB validity" test="exists(/opf:metadata/dc:identifier[contains(., 'randomid')]) and
315-
exists(/opf:metadata/opf:meta[@property = 'dcterms:identifier' and contains(., 'randomid')])"/>
316-
<x:expect label="Default value should be subbed in for book title to ensure EPUB validity" test="exists(/opf:metadata/dc:title[. = 'Untitled Book']) and
317-
exists(/opf:metadata/opf:meta[@property = 'dcterms:title' and . = 'Untitled Book'])"/>
318-
<x:expect label="Default value should be subbed in for book language to ensure EPUB validity" test="exists(/opf:metadata/dc:language[. = 'en']) and
319-
exists(/opf:metadata/opf:meta[@property = 'dcterms:language' and . = 'en'])"/>
320-
<x:expect label="Default value should be subbed in for book modification date to ensure EPUB validity" test="exists(/opf:metadata/opf:meta[@property = 'dcterms:modified' and . = '2014-01-01'])"/>
321-
<x:expect label="Rights information *should not* be generated" test="not(exists(/opf:metadata/dc:rights)) and
322-
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:rightsHolder']))"/>
323-
<x:expect label="Publisher information *should not* be generated" test="not(exists(/opf:metadata/dc:publisher)) and
324-
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:publisher']))"/>
325-
<x:expect label="Subject (category) information *should not* be generated" test="not(exists(/opf:metadata/dc:subject)) and
326-
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:subject']))"/>
327-
<x:expect label="Publication date information *should not* be generated" test="not(exists(/opf:metadata/dc:date)) and
328-
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:date']))"/>
329-
<x:expect label="Description information *should not* be generated" test="not(exists(/opf:metadata/dc:description)) and
330-
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:description']))"/>
331-
<x:expect label="Contributor information *should not* be generated" test="not(exists(/opf:metadata/dc:contributor)) and
332-
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:contributor']))"/>
333-
<x:expect label="Creator information *should not* be generated" test="not(exists(/opf:metadata/dc:creator)) and
334-
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:creator']))"/>
335-
<x:expect label="Cover metadata *should not* be generated if book does not have a cover" test="not(exists(/opf:metadata/opf:meta[@name = 'cover']))"/>
336-
<x:expect label="iBooks metadata *should not* be generated if *not* specified" test="not(exists(/opf:metadata/opf:meta[@property='ibooks:specified-fonts']))"/>
337-
</x:scenario>
338299
<x:scenario label="When generating OPF metadata for a book with two authors specified">
339300
<x:call>
340301
<x:param name="metadata.creators">
@@ -385,6 +346,46 @@ UbuntuMono-Regular.otf
385346

386347
</x:scenario>
387348

349+
<x:scenario label="When generating OPF metadata for book without any metadata supplied or a cover">
350+
<x:call template="opf.metadata">
351+
<x:param name="metadata.ibooks-specified-fonts"/>
352+
<x:param name="metadata.title"/>
353+
<x:param name="metadata.language"/>
354+
<x:param name="metadata.modified"/>
355+
<x:param name="metadata.rights"/>
356+
<x:param name="metadata.publisher"/>
357+
<x:param name="metadata.subject"/>
358+
<x:param name="metadata.date"/>
359+
<x:param name="metadata.description"/>
360+
<x:param name="metadata.contributors"/>
361+
<x:param name="metadata.creators"/>
362+
<x:param name="generate.cover.html"/>
363+
</x:call>
364+
<x:expect label="Default value should be subbed in for book identifier to ensure EPUB validity" test="exists(/opf:metadata/dc:identifier[contains(., 'randomid')]) and
365+
exists(/opf:metadata/opf:meta[@property = 'dcterms:identifier' and contains(., 'randomid')])"/>
366+
<x:expect label="Default value should be subbed in for book title to ensure EPUB validity" test="exists(/opf:metadata/dc:title[. = 'Untitled Book']) and
367+
exists(/opf:metadata/opf:meta[@property = 'dcterms:title' and . = 'Untitled Book'])"/>
368+
<x:expect label="Default value should be subbed in for book language to ensure EPUB validity" test="exists(/opf:metadata/dc:language[. = 'en']) and
369+
exists(/opf:metadata/opf:meta[@property = 'dcterms:language' and . = 'en'])"/>
370+
<x:expect label="Default value should be subbed in for book modification date to ensure EPUB validity" test="exists(/opf:metadata/opf:meta[@property = 'dcterms:modified' and . = '2014-01-01'])"/>
371+
<x:expect label="Rights information *should not* be generated" test="not(exists(/opf:metadata/dc:rights)) and
372+
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:rightsHolder']))"/>
373+
<x:expect label="Publisher information *should not* be generated" test="not(exists(/opf:metadata/dc:publisher)) and
374+
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:publisher']))"/>
375+
<x:expect label="Subject (category) information *should not* be generated" test="not(exists(/opf:metadata/dc:subject)) and
376+
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:subject']))"/>
377+
<x:expect label="Publication date information *should not* be generated" test="not(exists(/opf:metadata/dc:date)) and
378+
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:date']))"/>
379+
<x:expect label="Description information *should not* be generated" test="not(exists(/opf:metadata/dc:description)) and
380+
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:description']))"/>
381+
<x:expect label="Contributor information *should not* be generated" test="not(exists(/opf:metadata/dc:contributor)) and
382+
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:contributor']))"/>
383+
<x:expect label="Creator information *should not* be generated" test="not(exists(/opf:metadata/dc:creator)) and
384+
not(exists(/opf:metadata/opf:meta[@property = 'dcterms:creator']))"/>
385+
<x:expect label="Cover metadata *should not* be generated if book does not have a cover" test="not(exists(/opf:metadata/opf:meta[@name = 'cover']))"/>
386+
<x:expect label="iBooks metadata *should not* be generated if *not* specified" test="not(exists(/opf:metadata/opf:meta[@property='ibooks:specified-fonts']))"/>
387+
</x:scenario>
388+
388389
<x:scenario label="When generate-spine is called">
389390
<x:call template="generate-spine">
390391
<x:param name="generate.ncx.toc" select="1"/>

0 commit comments

Comments
 (0)