diff options
Diffstat (limited to 'sphinx/builders/epub.py')
-rw-r--r-- | sphinx/builders/epub.py | 69 |
1 files changed, 50 insertions, 19 deletions
diff --git a/sphinx/builders/epub.py b/sphinx/builders/epub.py index ade887e56..b4b657468 100644 --- a/sphinx/builders/epub.py +++ b/sphinx/builders/epub.py @@ -29,7 +29,7 @@ from docutils import nodes from sphinx import addnodes from sphinx.builders.html import StandaloneHTMLBuilder -from sphinx.util.osutil import ensuredir, copyfile, EEXIST +from sphinx.util.osutil import ensuredir, copyfile, make_filename, EEXIST from sphinx.util.smartypants import sphinx_smarty_pants as ssp from sphinx.util.console import brown @@ -179,7 +179,7 @@ class EpubBuilder(StandaloneHTMLBuilder): META-INF/container.xml. Afterwards, all necessary files are zipped to an epub file. """ - name = 'epub' + name = 'epub2' # don't copy the reST source copysource = False @@ -188,8 +188,12 @@ class EpubBuilder(StandaloneHTMLBuilder): # don't add links add_permalinks = False + # don't use # as current path. ePub check reject it. + allow_sharp_as_current_path = False # don't add sidebar etc. embedded = True + # disable download role + download_support = False # dont' create links to original images from images html_scaled_image_link = False # don't generate search index or include search page @@ -223,6 +227,7 @@ class EpubBuilder(StandaloneHTMLBuilder): self.link_suffix = '.xhtml' self.playorder = 0 self.tocid = 0 + self.use_index = self.get_builder_config('use_index', 'epub') def get_theme_config(self): return self.config.epub_theme, self.config.epub_theme_options @@ -485,6 +490,9 @@ class EpubBuilder(StandaloneHTMLBuilder): else: super(EpubBuilder, self).copy_image_files() + def copy_download_files(self): + pass + def handle_page(self, pagename, addctx, templatename='page.html', outfilename=None, event_arg=None): """Create a rendered page. @@ -493,6 +501,8 @@ class EpubBuilder(StandaloneHTMLBuilder): attributes. """ if pagename.startswith('genindex'): + if not self.use_index: + return self.fix_genindex(addctx['genindexentries']) addctx['doctype'] = self.doctype StandaloneHTMLBuilder.handle_page(self, pagename, addctx, templatename, @@ -511,11 +521,8 @@ class EpubBuilder(StandaloneHTMLBuilder): def build_mimetype(self, outdir, outname): """Write the metainfo file mimetype.""" self.info('writing %s file...' % outname) - 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.mimetype_template) - finally: - f.close() def build_container(self, outdir, outname): """Write the metainfo file META-INF/cointainer.xml.""" @@ -526,11 +533,8 @@ class EpubBuilder(StandaloneHTMLBuilder): except OSError as err: if err.errno != EEXIST: raise - 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.container_template) - finally: - f.close() def content_metadata(self, files, spine, guide): """Create a dictionary with all metadata for the content.opf @@ -565,8 +569,11 @@ class EpubBuilder(StandaloneHTMLBuilder): self.files = [] self.ignored_files = ['.buildinfo', 'mimetype', 'content.opf', 'toc.ncx', 'META-INF/container.xml', + 'Thumbs.db', 'ehthumbs.db', '.DS_Store', self.config.epub_basename + '.epub'] + \ self.config.epub_exclude_files + if not self.use_index: + self.ignored_files.append('genindex' + self.out_suffix) for root, dirs, files in os.walk(outdir): for fn in files: filename = path.join(root, fn)[olen:] @@ -604,7 +611,7 @@ class EpubBuilder(StandaloneHTMLBuilder): 'idref': self.esc(self.make_id(info[0] + self.out_suffix)) }) spinefiles.add(info[0] + self.out_suffix) - if self.get_builder_config('use_index', 'epub'): + if self.use_index: spine.append(self.spine_template % { 'idref': self.esc(self.make_id('genindex' + self.out_suffix)) }) @@ -677,12 +684,9 @@ class EpubBuilder(StandaloneHTMLBuilder): guide = '\n'.join(guide) # write the project file - 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(content_tmpl % self.content_metadata(projectfiles, spine, guide)) - finally: - f.close() def new_navpoint(self, node, level, incr=True): """Create a new entry in the toc from the node at given level.""" @@ -774,11 +778,8 @@ class EpubBuilder(StandaloneHTMLBuilder): navpoints = self.build_navpoints(refnodes) level = max(item['level'] for item in self.refnodes) level = min(level, self.config.epub_tocdepth) - 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.toc_template % self.toc_metadata(level, navpoints)) - finally: - f.close() def build_epub(self, outdir, outname): """Write the epub file. @@ -797,3 +798,33 @@ class EpubBuilder(StandaloneHTMLBuilder): fp = path.join(outdir, file) epub.write(fp, file, zipfile.ZIP_DEFLATED) epub.close() + + +def setup(app): + app.setup_extension('sphinx.builders.html') + app.add_builder(EpubBuilder) + + # config values + app.add_config_value('epub_basename', lambda self: make_filename(self.project), None) + app.add_config_value('epub_theme', 'epub', 'html') + app.add_config_value('epub_theme_options', {}, 'html') + app.add_config_value('epub_title', lambda self: self.html_title, 'html') + app.add_config_value('epub_author', 'unknown', 'html') + app.add_config_value('epub_language', lambda self: self.language or 'en', 'html') + app.add_config_value('epub_publisher', 'unknown', 'html') + app.add_config_value('epub_copyright', lambda self: self.copyright, 'html') + app.add_config_value('epub_identifier', 'unknown', 'html') + app.add_config_value('epub_scheme', 'unknown', 'html') + app.add_config_value('epub_uid', 'unknown', 'env') + app.add_config_value('epub_cover', (), 'env') + app.add_config_value('epub_guide', (), 'env') + app.add_config_value('epub_pre_files', [], 'env') + app.add_config_value('epub_post_files', [], 'env') + app.add_config_value('epub_exclude_files', [], 'env') + app.add_config_value('epub_tocdepth', 3, 'env') + app.add_config_value('epub_tocdup', True, 'env') + app.add_config_value('epub_tocscope', 'default', 'env') + app.add_config_value('epub_fix_images', False, 'env') + app.add_config_value('epub_max_image_width', 0, 'env') + app.add_config_value('epub_show_urls', 'inline', 'html') + app.add_config_value('epub_use_index', lambda self: self.html_use_index, 'html') |