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.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/sphinx/builders/websupport.py b/sphinx/builders/websupport.py
index 8cc70ea0c..e1bd80111 100644
--- a/sphinx/builders/websupport.py
+++ b/sphinx/builders/websupport.py
@@ -12,14 +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):
"""
@@ -28,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')
@@ -123,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()