summaryrefslogtreecommitdiff
path: root/sphinx/builders/epub3.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/builders/epub3.py')
-rw-r--r--sphinx/builders/epub3.py87
1 files changed, 74 insertions, 13 deletions
diff --git a/sphinx/builders/epub3.py b/sphinx/builders/epub3.py
index d792bd6e9..ae799986e 100644
--- a/sphinx/builders/epub3.py
+++ b/sphinx/builders/epub3.py
@@ -14,6 +14,7 @@ import codecs
from os import path
from datetime import datetime
+from sphinx.config import string_classes
from sphinx.builders.epub import EpubBuilder
@@ -52,7 +53,8 @@ NAVLIST_INDENT = ' '
PACKAGE_DOC_TEMPLATE = u'''\
<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="%(lang)s"
- unique-identifier="%(uid)s">
+ unique-identifier="%(uid)s"
+ prefix="ibooks: http://vocabulary.itunes.apple.com/rdf/ibooks/vocabulary-extensions-1.0/">
<metadata xmlns:opf="http://www.idpf.org/2007/opf"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:language>%(lang)s</dc:language>
@@ -65,6 +67,10 @@ PACKAGE_DOC_TEMPLATE = u'''\
<dc:identifier id="%(uid)s">%(id)s</dc:identifier>
<dc:date>%(date)s</dc:date>
<meta property="dcterms:modified">%(date)s</meta>
+ <meta property="ibooks:version">%(version)s</meta>
+ <meta property="ibooks:specified-fonts">true</meta>
+ <meta property="ibooks:binding">true</meta>
+ <meta property="ibooks:scroll-axis">%(ibook_scroll_axis)s</meta>
</metadata>
<manifest>
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />
@@ -94,7 +100,7 @@ class Epub3Builder(EpubBuilder):
and META-INF/container.xml. Afterwards, all necessary files are zipped to
an epub file.
"""
- name = 'epub3'
+ name = 'epub'
navigation_doc_template = NAVIGATION_DOC_TEMPLATE
navlist_template = NAVLIST_TEMPLATE
@@ -122,13 +128,43 @@ class Epub3Builder(EpubBuilder):
"""
metadata = super(Epub3Builder, self).content_metadata(
files, spine, guide)
- metadata['description'] = self.esc(self.config.epub3_description)
- metadata['contributor'] = self.esc(self.config.epub3_contributor)
- metadata['page_progression_direction'] = self.esc(
- self.config.epub3_page_progression_direction) or 'default'
+ metadata['description'] = self.esc(self.config.epub_description)
+ metadata['contributor'] = self.esc(self.config.epub_contributor)
+ metadata['page_progression_direction'] = self._page_progression_direction()
+ metadata['ibook_scroll_axis'] = self._ibook_scroll_axis()
metadata['date'] = self.esc(datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"))
+ metadata['version'] = self.esc(self.config.version)
return metadata
+ def _page_progression_direction(self):
+ if self.config.epub_writing_mode == 'horizontal':
+ page_progression_direction = 'ltr'
+ elif self.config.epub_writing_mode == 'vertical':
+ page_progression_direction = 'rtl'
+ else:
+ page_progression_direction = 'default'
+ return page_progression_direction
+
+ def _ibook_scroll_axis(self):
+ if self.config.epub_writing_mode == 'horizontal':
+ scroll_axis = 'vertical'
+ elif self.config.epub_writing_mode == 'vertical':
+ scroll_axis = 'horizontal'
+ else:
+ scroll_axis = 'default'
+ return scroll_axis
+
+ def _css_writing_mode(self):
+ if self.config.epub_writing_mode == 'vertical':
+ editing_mode = 'vertical-rl'
+ else:
+ editing_mode = 'horizontal-tb'
+ return editing_mode
+
+ def prepare_writing(self, docnames):
+ super(Epub3Builder, self).prepare_writing(docnames)
+ self.globalcontext['theme_writing_mode'] = self._css_writing_mode()
+
def new_navlist(self, node, level, has_child):
"""Create a new entry in the toc from the node at given level."""
# XXX Modifies the node
@@ -211,12 +247,37 @@ class Epub3Builder(EpubBuilder):
# 'includehidden'
refnodes = self.refnodes
navlist = self.build_navlist(refnodes)
- f = codecs.open(path.join(outdir, outname), 'w', 'utf-8')
- try:
+ with codecs.open(path.join(outdir, outname), 'w', 'utf-8') as f:
f.write(self.navigation_doc_template %
self.navigation_doc_metadata(navlist))
- finally:
- f.close()
- # Add nav.xhtml to epub file
- if outname not in self.files:
- self.files.append(outname)
+
+ # Add nav.xhtml to epub file
+ if outname not in self.files:
+ self.files.append(outname)
+
+
+def validate_config_values(app):
+ if app.config.epub3_description is not None:
+ app.warn('epub3_description is deprecated. Use epub_description instead.')
+ app.config.epub_description = app.config.epub3_description
+
+ if app.config.epub3_contributor is not None:
+ app.warn('epub3_contributor is deprecated. Use epub_contributor instead.')
+ app.config.epub_contributor = app.config.epub3_contributor
+
+ if app.config.epub3_page_progression_direction is not None:
+ app.warn('epub3_page_progression_direction option is deprecated'
+ ' from 1.5. Use epub_writing_mode instead.')
+
+
+def setup(app):
+ app.setup_extension('sphinx.builders.epub')
+ app.add_builder(Epub3Builder)
+ app.connect('builder-inited', validate_config_values)
+
+ app.add_config_value('epub_description', '', 'epub3', string_classes)
+ app.add_config_value('epub_contributor', 'unknown', 'epub3', string_classes)
+ app.add_config_value('epub_writing_mode', 'horizontal', 'epub3', string_classes)
+ app.add_config_value('epub3_description', None, 'epub3', string_classes)
+ app.add_config_value('epub3_contributor', None, 'epub3', string_classes)
+ app.add_config_value('epub3_page_progression_direction', None, 'epub3', string_classes)