diff --git a/doc/config.rst b/doc/config.rst index e0fbeb46e..8fdb50dbd 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -747,7 +747,7 @@ the `Dublin Core metadata `_. Additional files that should be inserted before the text generated by Sphinx. It is a list of tuples containing the file name and the title. - Example:: + If the title is empty, no entry is added to :file:`toc.ncx`. Example:: epub_pre_files = [ ('index.html', 'Welcome'), @@ -759,7 +759,8 @@ the `Dublin Core metadata `_. Additional files that should be inserted after the text generated by Sphinx. It is a list of tuples containing the file name and the title. This option - can be used to add an appendix. The default value is ``[]``. + can be used to add an appendix. If the title is empty, no entry is added + to :file:`toc.ncx`. The default value is ``[]``. .. confval:: epub_exclude_files diff --git a/sphinx/builders/epub.py b/sphinx/builders/epub.py index aea07d4d1..93a2eb9c2 100644 --- a/sphinx/builders/epub.py +++ b/sphinx/builders/epub.py @@ -12,6 +12,7 @@ import os import re +import time import codecs import zipfile from os import path @@ -84,6 +85,7 @@ _content_template = u'''\ %(publisher)s %(copyright)s %(id)s + %(date)s @@ -202,6 +204,11 @@ class EpubBuilder(StandaloneHTMLBuilder): doctree = self.env.get_and_resolve_doctree(self.config.master_doc, self, prune_toctrees=False) self.refnodes = self.get_refnodes(doctree, []) + master_dir = os.path.dirname(self.config.master_doc) + if master_dir: + master_dir += '/' # XXX or os.sep? + for item in self.refnodes: + item['refuri'] = master_dir + item['refuri'] self.refnodes.insert(0, { 'level': 1, 'refuri': self.esc(self.config.master_doc + '.html'), @@ -221,10 +228,10 @@ class EpubBuilder(StandaloneHTMLBuilder): 'text': ssp(self.esc(text)) }) - def fix_fragment(self, match): - """Return a href attribute with colons replaced by hyphens. + def fix_fragment(self, prefix, fragment): + """Return a href/id attribute with colons replaced by hyphens. """ - return match.group(1) + match.group(2).replace(':', '-') + return prefix + fragment.replace(':', '-') def fix_ids(self, tree): """Replace colons with hyphens in href and id attributes. @@ -235,14 +242,14 @@ class EpubBuilder(StandaloneHTMLBuilder): if 'refuri' in node: m = _refuri_re.match(node['refuri']) if m: - node['refuri'] = self.fix_fragment(m) + node['refuri'] = self.fix_fragment(m.group(1), m.group(2)) if 'refid' in node: - node['refid'] = node['refid'].replace(':', '-') + node['refid'] = self.fix_fragment('', node['refid']) for node in tree.traverse(addnodes.desc_signature): ids = node.attributes['ids'] newids = [] for id in ids: - newids.append(id.replace(':', '-')) + newids.append(self.fix_fragment('', id)) node.attributes['ids'] = newids def add_visible_links(self, tree): @@ -278,12 +285,13 @@ class EpubBuilder(StandaloneHTMLBuilder): for (i, link) in enumerate(links): m = _refuri_re.match(link) if m: - links[i] = self.fix_fragment(m) + links[i] = self.fix_fragment(m.group(1), m.group(2)) for subentryname, subentrylinks in subitems: for (i, link) in enumerate(subentrylinks): m = _refuri_re.match(link) if m: - subentrylinks[i] = self.fix_fragment(m) + subentrylinks[i] = \ + self.fix_fragment(m.group(1), m.group(2)) def handle_page(self, pagename, addctx, templatename='page.html', outfilename=None, event_arg=None): @@ -344,6 +352,7 @@ class EpubBuilder(StandaloneHTMLBuilder): metadata['copyright'] = self.esc(self.config.epub_copyright) metadata['scheme'] = self.esc(self.config.epub_scheme) metadata['id'] = self.esc(self.config.epub_identifier) + metadata['date'] = self.esc(time.strftime('%Y-%m-%d')) metadata['files'] = files metadata['spine'] = spine return metadata @@ -430,6 +439,8 @@ class EpubBuilder(StandaloneHTMLBuilder): level = 1 lastnode = None for node in nodes: + if not node['text']: + continue file = node['refuri'].split('#')[0] if file in self.ignored_files: continue @@ -498,5 +509,7 @@ class EpubBuilder(StandaloneHTMLBuilder): epub.write(path.join(outdir, 'mimetype'), 'mimetype', \ zipfile.ZIP_STORED) for file in projectfiles: + if isinstance(file, unicode): + file = file.encode('utf-8') epub.write(path.join(outdir, file), file, zipfile.ZIP_DEFLATED) epub.close()