summaryrefslogtreecommitdiff
path: root/sphinx/builders/websupport.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/builders/websupport.py')
-rw-r--r--sphinx/builders/websupport.py70
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)