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.py88
1 files changed, 65 insertions, 23 deletions
diff --git a/sphinx/builders/websupport.py b/sphinx/builders/websupport.py
index 30cf28314..ac9dd7152 100644
--- a/sphinx/builders/websupport.py
+++ b/sphinx/builders/websupport.py
@@ -12,13 +12,21 @@
import cPickle as pickle
from os import path
from cgi import escape
+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.util.websupport import is_commentable
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
+
class WebSupportBuilder(StandaloneHTMLBuilder):
"""
@@ -27,13 +35,42 @@ class WebSupportBuilder(StandaloneHTMLBuilder):
name = 'websupport'
out_suffix = '.fpickle'
+ def init(self):
+ StandaloneHTMLBuilder.init(self)
+ for root, dirs, files in os.walk(self.doctreedir):
+ for fn in files:
+ fp = path.join(root, fn)
+ if fp.endswith('.doctree'):
+ copyfile(fp, fp + '.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_commentable))
+ else:
+ list(add_uids(doctree, is_commentable))
+
self.cur_docname = docname
self.secnumbers = self.env.toc_secnumbers.get(docname, {})
self.imgpath = '/' + posixpath.join(self.app.staticdir, '_images')
@@ -102,7 +139,7 @@ class WebSupportBuilder(StandaloneHTMLBuilder):
ensuredir(path.dirname(outfilename))
f = open(outfilename, 'wb')
try:
- pickle.dump(doc_ctx, f, 2)
+ pickle.dump(doc_ctx, f, pickle.HIGHEST_PROTOCOL)
finally:
f.close()
@@ -116,12 +153,20 @@ class WebSupportBuilder(StandaloneHTMLBuilder):
def handle_finish(self):
StandaloneHTMLBuilder.handle_finish(self)
- shutil.move(path.join(self.outdir, '_images'),
- path.join(self.app.builddir, self.app.staticdir,
- '_images'))
- shutil.move(path.join(self.outdir, '_static'),
- path.join(self.app.builddir, self.app.staticdir,
- '_static'))
+ directories = ['_images', '_static']
+ for directory in directories:
+ try:
+ shutil.move(path.join(self.outdir, directory),
+ path.join(self.app.builddir, self.app.staticdir,
+ directory))
+ except IOError:
+ # in case any of these directories don't exist
+ pass
+ for root, dirs, files in os.walk(self.doctreedir):
+ for fn in files:
+ fp = path.join(root, fn)
+ if fp.endswith('.doctree.old'):
+ os.remove(fp)
def dump_search_index(self):
self.indexer.finish_indexing()
@@ -131,20 +176,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))
+ opts = {
+ 'URL_ROOT': ctx.get('url_root', ''),
+ 'VERSION': ctx['release'],
+ 'COLLAPSE_INDEX': False,
+ 'FILE_SUFFIX': '',
+ 'HAS_SOURCE': ctx['has_source']
+ }
+ scripts = [make_script(file) for file in ctx['script_files']]
scripts.append(make_script('_static/websupport.js'))
- return opts + '\n' + '\n'.join(scripts)
+ return '\n'.join([
+ '<script type="text/javascript">'
+ 'var DOCUMENTATION_OPTIONS = %s;' % dump_json(opts),
+ '</script>'
+ ] + scripts)