diff options
Diffstat (limited to 'sphinx/builders/epub3.py')
-rw-r--r-- | sphinx/builders/epub3.py | 87 |
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) |