mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
merge
This commit is contained in:
commit
2450c655fe
@ -747,7 +747,7 @@ the `Dublin Core metadata <http://dublincore.org/>`_.
|
|||||||
|
|
||||||
Additional files that should be inserted before the text generated by
|
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.
|
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 = [
|
epub_pre_files = [
|
||||||
('index.html', 'Welcome'),
|
('index.html', 'Welcome'),
|
||||||
@ -759,7 +759,8 @@ the `Dublin Core metadata <http://dublincore.org/>`_.
|
|||||||
|
|
||||||
Additional files that should be inserted after the text generated by Sphinx.
|
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
|
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
|
.. confval:: epub_exclude_files
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import time
|
||||||
import codecs
|
import codecs
|
||||||
import zipfile
|
import zipfile
|
||||||
from os import path
|
from os import path
|
||||||
@ -84,6 +85,7 @@ _content_template = u'''\
|
|||||||
<dc:publisher>%(publisher)s</dc:publisher>
|
<dc:publisher>%(publisher)s</dc:publisher>
|
||||||
<dc:rights>%(copyright)s</dc:rights>
|
<dc:rights>%(copyright)s</dc:rights>
|
||||||
<dc:identifier id="%(uid)s" opf:scheme="%(scheme)s">%(id)s</dc:identifier>
|
<dc:identifier id="%(uid)s" opf:scheme="%(scheme)s">%(id)s</dc:identifier>
|
||||||
|
<dc:date>%(date)s</dc:date>
|
||||||
</metadata>
|
</metadata>
|
||||||
<manifest>
|
<manifest>
|
||||||
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />
|
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />
|
||||||
@ -202,6 +204,11 @@ class EpubBuilder(StandaloneHTMLBuilder):
|
|||||||
doctree = self.env.get_and_resolve_doctree(self.config.master_doc,
|
doctree = self.env.get_and_resolve_doctree(self.config.master_doc,
|
||||||
self, prune_toctrees=False)
|
self, prune_toctrees=False)
|
||||||
self.refnodes = self.get_refnodes(doctree, [])
|
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, {
|
self.refnodes.insert(0, {
|
||||||
'level': 1,
|
'level': 1,
|
||||||
'refuri': self.esc(self.config.master_doc + '.html'),
|
'refuri': self.esc(self.config.master_doc + '.html'),
|
||||||
@ -221,10 +228,10 @@ class EpubBuilder(StandaloneHTMLBuilder):
|
|||||||
'text': ssp(self.esc(text))
|
'text': ssp(self.esc(text))
|
||||||
})
|
})
|
||||||
|
|
||||||
def fix_fragment(self, match):
|
def fix_fragment(self, prefix, fragment):
|
||||||
"""Return a href attribute with colons replaced by hyphens.
|
"""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):
|
def fix_ids(self, tree):
|
||||||
"""Replace colons with hyphens in href and id attributes.
|
"""Replace colons with hyphens in href and id attributes.
|
||||||
@ -235,14 +242,14 @@ class EpubBuilder(StandaloneHTMLBuilder):
|
|||||||
if 'refuri' in node:
|
if 'refuri' in node:
|
||||||
m = _refuri_re.match(node['refuri'])
|
m = _refuri_re.match(node['refuri'])
|
||||||
if m:
|
if m:
|
||||||
node['refuri'] = self.fix_fragment(m)
|
node['refuri'] = self.fix_fragment(m.group(1), m.group(2))
|
||||||
if 'refid' in node:
|
if 'refid' in node:
|
||||||
node['refid'] = node['refid'].replace(':', '-')
|
node['refid'] = self.fix_fragment('', node['refid'])
|
||||||
for node in tree.traverse(addnodes.desc_signature):
|
for node in tree.traverse(addnodes.desc_signature):
|
||||||
ids = node.attributes['ids']
|
ids = node.attributes['ids']
|
||||||
newids = []
|
newids = []
|
||||||
for id in ids:
|
for id in ids:
|
||||||
newids.append(id.replace(':', '-'))
|
newids.append(self.fix_fragment('', id))
|
||||||
node.attributes['ids'] = newids
|
node.attributes['ids'] = newids
|
||||||
|
|
||||||
def add_visible_links(self, tree):
|
def add_visible_links(self, tree):
|
||||||
@ -278,12 +285,13 @@ class EpubBuilder(StandaloneHTMLBuilder):
|
|||||||
for (i, link) in enumerate(links):
|
for (i, link) in enumerate(links):
|
||||||
m = _refuri_re.match(link)
|
m = _refuri_re.match(link)
|
||||||
if m:
|
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 subentryname, subentrylinks in subitems:
|
||||||
for (i, link) in enumerate(subentrylinks):
|
for (i, link) in enumerate(subentrylinks):
|
||||||
m = _refuri_re.match(link)
|
m = _refuri_re.match(link)
|
||||||
if m:
|
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',
|
def handle_page(self, pagename, addctx, templatename='page.html',
|
||||||
outfilename=None, event_arg=None):
|
outfilename=None, event_arg=None):
|
||||||
@ -344,6 +352,7 @@ class EpubBuilder(StandaloneHTMLBuilder):
|
|||||||
metadata['copyright'] = self.esc(self.config.epub_copyright)
|
metadata['copyright'] = self.esc(self.config.epub_copyright)
|
||||||
metadata['scheme'] = self.esc(self.config.epub_scheme)
|
metadata['scheme'] = self.esc(self.config.epub_scheme)
|
||||||
metadata['id'] = self.esc(self.config.epub_identifier)
|
metadata['id'] = self.esc(self.config.epub_identifier)
|
||||||
|
metadata['date'] = self.esc(time.strftime('%Y-%m-%d'))
|
||||||
metadata['files'] = files
|
metadata['files'] = files
|
||||||
metadata['spine'] = spine
|
metadata['spine'] = spine
|
||||||
return metadata
|
return metadata
|
||||||
@ -430,6 +439,8 @@ class EpubBuilder(StandaloneHTMLBuilder):
|
|||||||
level = 1
|
level = 1
|
||||||
lastnode = None
|
lastnode = None
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
|
if not node['text']:
|
||||||
|
continue
|
||||||
file = node['refuri'].split('#')[0]
|
file = node['refuri'].split('#')[0]
|
||||||
if file in self.ignored_files:
|
if file in self.ignored_files:
|
||||||
continue
|
continue
|
||||||
@ -498,5 +509,7 @@ class EpubBuilder(StandaloneHTMLBuilder):
|
|||||||
epub.write(path.join(outdir, 'mimetype'), 'mimetype', \
|
epub.write(path.join(outdir, 'mimetype'), 'mimetype', \
|
||||||
zipfile.ZIP_STORED)
|
zipfile.ZIP_STORED)
|
||||||
for file in projectfiles:
|
for file in projectfiles:
|
||||||
|
if isinstance(file, unicode):
|
||||||
|
file = file.encode('utf-8')
|
||||||
epub.write(path.join(outdir, file), file, zipfile.ZIP_DEFLATED)
|
epub.write(path.join(outdir, file), file, zipfile.ZIP_DEFLATED)
|
||||||
epub.close()
|
epub.close()
|
||||||
|
Loading…
Reference in New Issue
Block a user