From 48df7c38bdb65d163d7ee307849480721e4e008b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 25 Jul 2010 13:27:55 -0600 Subject: [PATCH] Switch to Sphinx 1.0 to generate User Manual --- setup/publish.py | 8 +- src/calibre/manual/Makefile | 2 +- src/calibre/manual/conf.py | 18 +- src/calibre/manual/custom.py | 13 +- src/calibre/manual/epub.py | 331 +++-------------------- src/calibre/manual/resources/calibre.css | 5 - src/calibre/manual/resources/logo.png | Bin 9261 -> 10566 bytes 7 files changed, 64 insertions(+), 313 deletions(-) delete mode 100644 src/calibre/manual/resources/calibre.css diff --git a/setup/publish.py b/setup/publish.py index 599c881be3..ba8a4992a7 100644 --- a/setup/publish.py +++ b/setup/publish.py @@ -73,11 +73,11 @@ class Manual(Command): os.makedirs(d) if not os.path.exists('.build'+os.sep+'html'): os.makedirs('.build'+os.sep+'html') - os.environ['__appname__']= __appname__ - os.environ['__version__']= __version__ - subprocess.check_call(['sphinx-build', '-b', 'custom', '-t', 'online', + os.environ['__appname__'] = __appname__ + os.environ['__version__'] = __version__ + subprocess.check_call(['sphinx-build', '-b', 'html', '-t', 'online', '-d', '.build/doctrees', '.', '.build/html']) - subprocess.check_call(['sphinx-build', '-b', 'epub', '-d', + subprocess.check_call(['sphinx-build', '-b', 'myepub', '-d', '.build/doctrees', '.', '.build/epub']) shutil.copyfile(self.j('.build', 'epub', 'calibre.epub'), self.j('.build', 'html', 'calibre.epub')) diff --git a/src/calibre/manual/Makefile b/src/calibre/manual/Makefile index c856e105fd..f991cb8777 100644 --- a/src/calibre/manual/Makefile +++ b/src/calibre/manual/Makefile @@ -37,7 +37,7 @@ qthelp: epub: mkdir -p .build/qthelp .build/doctrees - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) .build/epub + $(SPHINXBUILD) -b myepub $(ALLSPHINXOPTS) .build/epub @echo @echo "Build finished." diff --git a/src/calibre/manual/conf.py b/src/calibre/manual/conf.py index 3866008f1f..fc8962bcfd 100644 --- a/src/calibre/manual/conf.py +++ b/src/calibre/manual/conf.py @@ -23,9 +23,11 @@ custom # General configuration # --------------------- +needs_sphinx = '1.0' + # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.addons.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'custom'] +extensions = ['sphinx.ext.autodoc', 'custom', 'sphinx.ext.viewcode'] # Add any paths that contain templates here, relative to this directory. templates_path = ['templates'] @@ -36,6 +38,9 @@ source_suffix = '.rst' # The master toctree document. master_doc = 'index' +# The language +language = 'en' + # General substitutions. project = __appname__ copyright = '2008, Kovid Goyal' @@ -81,7 +86,6 @@ pygments_style = 'sphinx' # given in html_static_path. html_theme = 'default' html_theme_options = {'stickysidebar':'true', 'relbarbgcolor':'black'} -html_style = 'calibre.css' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -100,8 +104,16 @@ html_use_smartypants = True html_title = 'calibre User Manual' html_short_title = 'Start' html_logo = 'resources/logo.png' + epub_author = 'Kovid Goyal' -epub_cover = 'resources/epub_cover.jpg' +epub_cover = 'epub_cover.jpg' +epub_publisher = 'Kovid Goyal' +epub_identifier = 'http://calibre-ebook.com/user_manual' +epub_scheme = 'url' +epub_uid = 'S54a88f8e9d42455e9c6db000e989225f' +epub_tocdepth = 4 +epub_tocdup = True +epub_pre_files = [('epub_titlepage.html', 'Cover')] # Custom sidebar templates, maps document names to template names. #html_sidebars = {} diff --git a/src/calibre/manual/custom.py b/src/calibre/manual/custom.py index 917b927086..b50853f6d5 100644 --- a/src/calibre/manual/custom.py +++ b/src/calibre/manual/custom.py @@ -9,9 +9,6 @@ sys.path.insert(0, os.path.abspath('../../')) sys.extensions_location = '../plugins' sys.resources_location = '../../../resources' -from sphinx.builders.html import StandaloneHTMLBuilder -from qthelp import QtHelpBuilder -from epub import EPUBHelpBuilder from sphinx.util import rpartition from sphinx.util.console import bold from sphinx.ext.autodoc import prepare_docstring @@ -20,12 +17,7 @@ from docutils import nodes sys.path.append(os.path.abspath('../../../')) from calibre.linux import entry_points - -class CustomBuilder(StandaloneHTMLBuilder): - name = 'custom' - -class CustomQtBuild(QtHelpBuilder): - name = 'customqt' +from epub import EPUBHelpBuilder def substitute(app, doctree): pass @@ -305,9 +297,6 @@ def auto_member(dirname, arguments, options, content, lineno, def setup(app): app.add_config_value('epub_cover', None, False) - app.add_config_value('epub_author', '', False) - app.add_builder(CustomBuilder) - app.add_builder(CustomQtBuild) app.add_builder(EPUBHelpBuilder) app.add_directive('automember', auto_member, 1, (1, 0, 1)) app.connect('doctree-read', substitute) diff --git a/src/calibre/manual/epub.py b/src/calibre/manual/epub.py index d54eb99a8d..a162303b09 100644 --- a/src/calibre/manual/epub.py +++ b/src/calibre/manual/epub.py @@ -6,298 +6,53 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, mimetypes, uuid, shutil -from datetime import datetime -from docutils import nodes -from xml.sax.saxutils import escape, quoteattr -from urlparse import urldefrag -from zipfile import ZipFile, ZIP_STORED, ZipInfo +import os, time -from sphinx import addnodes -from sphinx.builders.html import StandaloneHTMLBuilder +from sphinx.builders.epub import EpubBuilder -NCX = '''\ - - - - - - - - - - Table of Contents - - {navpoints} - - -''' +class EPUBHelpBuilder(EpubBuilder): + name = 'myepub' -OPF = '''\ - - - - {title} - {author} - Sphinx - {uid} - {date} - - - - - {manifest} - - - {spine} - - - {guide} - - -''' + def add_cover(self, outdir, cover_fname): + href = '_static/'+cover_fname + opf = os.path.join(self.outdir, 'content.opf') -CONTAINER='''\ - - - - - - -''' - -SVG_TEMPLATE = '''\ - - - - - Cover - - - - - - - - -''' - -class TOC(list): - - def __init__(self, title=None, href=None): - list.__init__(self) - self.title, self.href = title, href - - def create_child(self, title, href): - self.append(TOC(title, href)) - return self[-1] - - def depth(self): - try: - return max(node.depth() for node in self)+1 - except ValueError: - return 1 + cover = '''\ + + + + + Cover + + + + + + + + + '''%href + self.files.append('epub_titlepage.html') + open(os.path.join(outdir, self.files[-1]), 'wb').write(cover) -class EPUBHelpBuilder(StandaloneHTMLBuilder): - """ - Builder that also outputs Qt help project, contents and index files. - """ - name = 'epub' - - # don't copy the reST source - copysource = False - - supported_image_types = ['image/svg+xml', 'image/png', 'image/gif', - 'image/jpeg'] - - # don't add links - add_permalinks = False - # don't add sidebar etc. - embedded = True - - def init(self): - StandaloneHTMLBuilder.init(self) - self.out_suffix = '.html' - self.link_suffix = '.html' - self.html_outdir = self.outdir = os.path.join(self.outdir, 'src') - self.conf = self.config - - def finish(self): - StandaloneHTMLBuilder.finish(self) - self.create_titlepage() - self.outdir = os.path.dirname(self.outdir) - cwd = os.getcwd() - os.chdir(self.html_outdir) - try: - self.generate_manifest() - self.generate_toc() - self.render_opf() - self.render_epub() - finally: - os.chdir(cwd) - - def render_epub(self): - container = CONTAINER.format('content.opf') - path = os.path.abspath('..'+os.sep+self.conf.project+'.epub') - zf = ZipFile(path, 'w') - zi = ZipInfo('mimetype') - zi.compress_type = ZIP_STORED - zf.writestr(zi, 'application/epub+zip') - zf.writestr('META-INF/container.xml', container) - for url in self.manifest: - fp = os.path.join(self.html_outdir, *url.split('/')) - zf.write(fp, url) - zf.close() - self.info('EPUB created at: '+path) - - - def render_opf(self): - manifest = [] - for href in self.manifest: - mt, id = self.manifest[href] - manifest.append(' '*8 + ''%\ - tuple(map(quoteattr, (id, href, mt)))) - manifest = '\n'.join(manifest) - spine = [' '*8+''%quoteattr(x) for x in self.spine] - spine = '\n'.join(spine) - guide = '' - - opf = OPF.format(title=escape(self.conf.html_title), - author=escape(self.conf.epub_author), uid=str(uuid.uuid4()), - date=datetime.now().isoformat(), manifest=manifest, spine=spine, - guide=guide) - open('content.opf', 'wb').write(opf) - self.manifest['content.opf'] = ('application/oebps-package+xml', 'opf') - - def create_titlepage(self): - self.cover_image_url = None - if self.conf.epub_cover: - img = '_static/'+os.path.basename(self.conf.epub_cover) - shutil.copyfile(self.conf.epub_cover, os.path.join(self.html_outdir, - *img.split('/'))) - self.cover_image_url = img - tp = SVG_TEMPLATE%img.split('/')[-1] - open(os.path.join(self.html_outdir, '_static', 'titlepage.html'), - 'wb').write(tp) - - def generate_manifest(self): - self.manifest = {} - id = 1 - for dirpath, dirnames, filenames in os.walk('.'): - for fname in filenames: - if fname == '.buildinfo': - continue - fpath = os.path.abspath(os.path.join(dirpath, fname)) - url = os.path.relpath(fpath).replace(os.sep, '/') - self.manifest[url] = mimetypes.guess_type(url, False)[0] - if self.manifest[url] is None: - self.warn('Unknown mimetype for: ' + url) - self.manifest[url] = 'application/octet-stream' - if self.manifest[url] == 'text/html': - self.manifest[url] = 'application/xhtml+xml' - if self.cover_image_url and url.endswith(self.cover_image_url): - id_ = 'cover' - else: - id_ = 'id'+str(id) - id += 1 - self.manifest[url] = (self.manifest[url], id_) - - def isdocnode(self, node): - if not isinstance(node, nodes.list_item): - return False - if len(node.children) != 2: - return False - if not isinstance(node.children[0], addnodes.compact_paragraph): - return False - if not isinstance(node.children[0][0], nodes.reference): - return False - if not isinstance(node.children[1], nodes.bullet_list): - return False - return True - - def generate_toc(self): - tocdoc = self.env.get_and_resolve_doctree(self.config.master_doc, self, - prune_toctrees=False) - istoctree = lambda node: ( - isinstance(node, addnodes.compact_paragraph) - and node.has_key('toctree')) - toc = TOC() - for node in tocdoc.traverse(istoctree): - self.extend_toc(toc, node) - self._parts = [] - self._po = 0 - self._po_map = {} - self.spine_map = {} - self.spine = [] - self.render_toc(toc) - navpoints = '\n'.join(self._parts).strip() - ncx = NCX.format(uid=str(uuid.uuid4()), depth=toc.depth(), - navpoints=navpoints) - open('toc.ncx', 'wb').write(ncx) - self.manifest['toc.ncx'] = ('application/x-dtbncx+xml', 'ncx') - self.spine.insert(0, self.manifest[self.conf.master_doc+'.html'][1]) - if self.conf.epub_cover: - self.spine.insert(0, self.manifest['_static/titlepage.html'][1]) - - def add_to_spine(self, href): - href = urldefrag(href)[0] - if href not in self.spine_map: - for url in self.manifest: - if url == href: - self.spine_map[href]= self.manifest[url][1] - self.spine.append(self.spine_map[href]) - - def render_toc(self, toc, level=2): - for child in toc: - if child.title and child.href: - href = child.href - self.add_to_spine(href) - title = escape(child.title) - if isinstance(title, unicode): - title = title.encode('utf-8') - if child.href in self._po_map: - po = self._po_map[child.href] - else: - self._po += 1 - po = self._po - self._parts.append(' '*(level*4)+ - ''%(uuid.uuid4(), - po)) - self._parts.append(' '*((level+1)*4)+ - '%s'%title) - self._parts.append(' '*((level+1)*4)+ - ''%quoteattr(href)) - self.render_toc(child, level+1) - self._parts.append(' '*(level*4)+'') - - - - - def extend_toc(self, toc, node): - if self.isdocnode(node): - refnode = node.children[0][0] - parent = toc.create_child(refnode.astext(), refnode['refuri']) - for subnode in node.children[1]: - self.extend_toc(parent, subnode) - elif isinstance(node, (nodes.list_item, nodes.bullet_list, - addnodes.compact_paragraph)): - for subnode in node: - self.extend_toc(toc, subnode) - elif isinstance(node, nodes.reference): - parent = toc.create_child(node.astext(), node['refuri']) - + raw = open(opf, 'rb').read() + raw = raw.replace('', + ('\n' + '%s\n') % + (href.replace('/', '_'), time.strftime('%Y-%m-%d'))) + raw = raw.replace('', + ('\n').\ + format('epub_titlepage.html')) + open(opf, 'wb').write(raw) + def build_epub(self, outdir, *args, **kwargs): + if self.config.epub_cover: + self.add_cover(outdir, self.config.epub_cover) + EpubBuilder.build_epub(self, outdir, *args, **kwargs) diff --git a/src/calibre/manual/resources/calibre.css b/src/calibre/manual/resources/calibre.css deleted file mode 100644 index f815378df4..0000000000 --- a/src/calibre/manual/resources/calibre.css +++ /dev/null @@ -1,5 +0,0 @@ - -@import url("default.css"); - -table.docutils td, table.docutils th { padding: 1em; border-bottom: 0; } - diff --git a/src/calibre/manual/resources/logo.png b/src/calibre/manual/resources/logo.png index 42b9568956496f00a3b707126d35529af745adae..158bc9d1b5113db517136636ec2d58dcb29e446a 100644 GIT binary patch literal 10566 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 R-~ST;6l7GSt0j$p{vRq1lnnp? literal 9261 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 P00000NkvXXu0mjf2#Lp*