diff options
Diffstat (limited to 'sphinx/builders/websupport.py')
-rw-r--r-- | sphinx/builders/websupport.py | 70 |
1 files changed, 53 insertions, 17 deletions
diff --git a/sphinx/builders/websupport.py b/sphinx/builders/websupport.py index 30cf28314..e1bd80111 100644 --- a/sphinx/builders/websupport.py +++ b/sphinx/builders/websupport.py @@ -12,13 +12,23 @@ import cPickle as pickle from os import path from cgi import escape +from glob import glob +import os import posixpath import shutil + from docutils.io import StringOutput +from docutils.utils import Reporter from sphinx.util.osutil import os_path, relative_uri, ensuredir, copyfile +from sphinx.util.jsonimpl import dumps as dump_json from sphinx.builders.html import StandaloneHTMLBuilder from sphinx.writers.websupport import WebSupportTranslator +from sphinx.environment import WarningStream +from sphinx.versioning import add_uids, merge_doctrees + +def is_paragraph(node): + return node.__class__.__name__ == 'paragraph' class WebSupportBuilder(StandaloneHTMLBuilder): """ @@ -27,13 +37,39 @@ class WebSupportBuilder(StandaloneHTMLBuilder): name = 'websupport' out_suffix = '.fpickle' + def init(self): + StandaloneHTMLBuilder.init(self) + for f in glob(path.join(self.doctreedir, '*.doctree')): + copyfile(f, f + '.old') + def init_translator_class(self): self.translator_class = WebSupportTranslator + def get_old_doctree(self, docname): + fp = self.env.doc2path(docname, self.doctreedir, '.doctree.old') + try: + f = open(fp, 'rb') + try: + doctree = pickle.load(f) + finally: + f.close() + except IOError: + return None + doctree.settings.env = self.env + doctree.reporter = Reporter(self.env.doc2path(docname), 2, 5, + stream=WarningStream(self.env._warnfunc)) + return doctree + def write_doc(self, docname, doctree): destination = StringOutput(encoding='utf-8') doctree.settings = self.docsettings + old_doctree = self.get_old_doctree(docname) + if old_doctree: + list(merge_doctrees(old_doctree, doctree, is_paragraph)) + else: + list(add_uids(doctree, is_paragraph)) + self.cur_docname = docname self.secnumbers = self.env.toc_secnumbers.get(docname, {}) self.imgpath = '/' + posixpath.join(self.app.staticdir, '_images') @@ -122,6 +158,9 @@ class WebSupportBuilder(StandaloneHTMLBuilder): shutil.move(path.join(self.outdir, '_static'), path.join(self.app.builddir, self.app.staticdir, '_static')) + for f in glob(path.join(self.doctreedir, '*.doctree.old')): + os.remove(f) + def dump_search_index(self): self.indexer.finish_indexing() @@ -131,20 +170,17 @@ class WebSupportBuilder(StandaloneHTMLBuilder): path = ctx['pathto'](file, 1) return '<script type="text/javascript" src="%s"></script>' % path - opts = """ -<script type="text/javascript"> - var DOCUMENTATION_OPTIONS = { - URL_ROOT: '%s', - VERSION: '%s', - COLLAPSE_INDEX: false, - FILE_SUFFIX: '', - HAS_SOURCE: '%s' - }; -</script>""" - opts = opts % (ctx.get('url_root', ''), escape(ctx['release']), - str(ctx['has_source']).lower()) - scripts = [] - for file in ctx['script_files']: - scripts.append(make_script(file)) - scripts.append(make_script('_static/websupport.js')) - return opts + '\n' + '\n'.join(scripts) + opts = { + 'URL_ROOT': ctx.get('url_root', ''), + 'VERSION': ctx['release'], + 'COLLAPSE_INDEX': False, + 'FILE_SUFFIX': '', + 'HAS_SOURCE': ctx['has_source'] + } + scripts = [make_script('_static/websupport.js')] + scripts += [make_script(file) for file in ctx['script_files']] + return '\n'.join([ + '<script type="text/javascript">' + 'var DOCUMENTATION_OPTIONS = %s;' % dump_json(opts), + '</script>' + ] + scripts) |