summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sphinx/builders/changes.py11
-rw-r--r--sphinx/builders/htmlhelp.py6
-rw-r--r--sphinx/builders/qthelp.py30
-rw-r--r--sphinx/highlighting.py4
-rw-r--r--sphinx/util/inspect.py5
-rw-r--r--sphinx/util/pycompat.py5
-rw-r--r--sphinx/websupport/__init__.py4
-rw-r--r--sphinx/websupport/storage/differ.py5
-rw-r--r--tests/test_build_html.py6
9 files changed, 46 insertions, 30 deletions
diff --git a/sphinx/builders/changes.py b/sphinx/builders/changes.py
index 3e351e6cb..22fcab869 100644
--- a/sphinx/builders/changes.py
+++ b/sphinx/builders/changes.py
@@ -11,7 +11,6 @@
import codecs
from os import path
-from cgi import escape
from sphinx import package_dir
from sphinx.util import copy_static_entry
@@ -20,6 +19,7 @@ from sphinx.theming import Theme
from sphinx.builders import Builder
from sphinx.util.osutil import ensuredir, os_path
from sphinx.util.console import bold
+from sphinx.util.pycompat import htmlescape
class ChangesBuilder(Builder):
@@ -115,7 +115,7 @@ class ChangesBuilder(Builder):
'.. deprecated:: %s' % version]
def hl(no, line):
- line = '<a name="L%s"> </a>' % no + escape(line)
+ line = '<a name="L%s"> </a>' % no + htmlescape(line)
for x in hltext:
if x in line:
line = '<span class="hl">%s</span>' % line
@@ -125,7 +125,10 @@ class ChangesBuilder(Builder):
self.info(bold('copying source files...'))
for docname in self.env.all_docs:
f = codecs.open(self.env.doc2path(docname), 'r', 'latin1')
- lines = f.readlines()
+ try:
+ lines = f.readlines()
+ finally:
+ f.close()
targetfn = path.join(self.outdir, 'rst', os_path(docname)) + '.html'
ensuredir(path.dirname(targetfn))
f = codecs.open(targetfn, 'w', 'latin1')
@@ -148,7 +151,7 @@ class ChangesBuilder(Builder):
self.outdir, self)
def hl(self, text, version):
- text = escape(text)
+ text = htmlescape(text)
for directive in ['versionchanged', 'versionadded', 'deprecated']:
text = text.replace('.. %s:: %s' % (directive, version),
'<b>.. %s:: %s</b>' % (directive, version))
diff --git a/sphinx/builders/htmlhelp.py b/sphinx/builders/htmlhelp.py
index 9a9238f97..fdf25cc81 100644
--- a/sphinx/builders/htmlhelp.py
+++ b/sphinx/builders/htmlhelp.py
@@ -11,7 +11,6 @@
"""
import os
-import cgi
import codecs
from os import path
@@ -19,6 +18,7 @@ from docutils import nodes
from sphinx import addnodes
from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.util.pycompat import htmlescape
# Project file (*.hhp) template. 'outname' is the file basename (like
@@ -241,7 +241,7 @@ class HTMLHelpBuilder(StandaloneHTMLBuilder):
write_toc(subnode, ullevel)
elif isinstance(node, nodes.reference):
link = node['refuri']
- title = cgi.escape(node.astext()).replace('"','&quot;')
+ title = htmlescape(node.astext()).replace('"','&quot;')
f.write(object_sitemap % (title, link))
elif isinstance(node, nodes.bullet_list):
if ullevel != 0:
@@ -272,7 +272,7 @@ class HTMLHelpBuilder(StandaloneHTMLBuilder):
item = ' <param name="%s" value="%s">\n' % \
(name, value)
f.write(item)
- title = cgi.escape(title)
+ title = htmlescape(title)
f.write('<LI> <OBJECT type="text/sitemap">\n')
write_param('Keyword', title)
if len(refs) == 0:
diff --git a/sphinx/builders/qthelp.py b/sphinx/builders/qthelp.py
index b2ff26f4d..662c443e0 100644
--- a/sphinx/builders/qthelp.py
+++ b/sphinx/builders/qthelp.py
@@ -14,12 +14,12 @@ import re
import codecs
import posixpath
from os import path
-from cgi import escape
from docutils import nodes
from sphinx import addnodes
from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.util.pycompat import htmlescape
_idpattern = re.compile(
@@ -164,7 +164,7 @@ class QtHelpBuilder(StandaloneHTMLBuilder):
fn.endswith('.html'):
filename = path.join(root, fn)[olen:]
projectfiles.append(file_template %
- {'filename': escape(filename)})
+ {'filename': htmlescape(filename)})
projectfiles = '\n'.join(projectfiles)
# it seems that the "namespace" may not contain non-alphanumeric
@@ -179,12 +179,12 @@ class QtHelpBuilder(StandaloneHTMLBuilder):
f = codecs.open(path.join(outdir, outname+'.qhp'), 'w', 'utf-8')
try:
f.write(project_template % {
- 'outname': escape(outname),
- 'title': escape(self.config.html_title),
- 'version': escape(self.config.version),
- 'project': escape(self.config.project),
- 'namespace': escape(nspace),
- 'masterdoc': escape(self.config.master_doc),
+ 'outname': htmlescape(outname),
+ 'title': htmlescape(self.config.html_title),
+ 'version': htmlescape(self.config.version),
+ 'project': htmlescape(self.config.project),
+ 'namespace': htmlescape(nspace),
+ 'masterdoc': htmlescape(self.config.master_doc),
'sections': sections,
'keywords': keywords,
'files': projectfiles})
@@ -199,10 +199,10 @@ class QtHelpBuilder(StandaloneHTMLBuilder):
f = codecs.open(path.join(outdir, outname+'.qhcp'), 'w', 'utf-8')
try:
f.write(collection_template % {
- 'outname': escape(outname),
- 'title': escape(self.config.html_short_title),
- 'homepage': escape(homepage),
- 'startpage': escape(startpage)})
+ 'outname': htmlescape(outname),
+ 'title': htmlescape(self.config.html_short_title),
+ 'homepage': htmlescape(homepage),
+ 'startpage': htmlescape(startpage)})
finally:
f.close()
@@ -224,7 +224,7 @@ class QtHelpBuilder(StandaloneHTMLBuilder):
if self.isdocnode(node):
refnode = node.children[0][0]
link = refnode['refuri']
- title = escape(refnode.astext()).replace('"','&quot;')
+ title = htmlescape(refnode.astext()).replace('"','&quot;')
item = '<section title="%(title)s" ref="%(ref)s">' % {
'title': title,
'ref': link}
@@ -237,7 +237,7 @@ class QtHelpBuilder(StandaloneHTMLBuilder):
parts.extend(self.write_toc(subnode, indentlevel))
elif isinstance(node, nodes.reference):
link = node['refuri']
- title = escape(node.astext()).replace('"','&quot;')
+ title = htmlescape(node.astext()).replace('"','&quot;')
item = section_template % {'title': title, 'ref': link}
item = u' ' * 4 * indentlevel + item
parts.append(item.encode('ascii', 'xmlcharrefreplace'))
@@ -274,7 +274,7 @@ class QtHelpBuilder(StandaloneHTMLBuilder):
def build_keywords(self, title, refs, subitems):
keywords = []
- title = escape(title)
+ title = htmlescape(title)
# if len(refs) == 0: # XXX
# write_param('See Also', title)
if len(refs) == 1:
diff --git a/sphinx/highlighting.py b/sphinx/highlighting.py
index 8e10cf57d..2f61c1ef1 100644
--- a/sphinx/highlighting.py
+++ b/sphinx/highlighting.py
@@ -10,7 +10,6 @@
"""
import sys
-import cgi
import re
import textwrap
@@ -20,6 +19,7 @@ except ImportError:
# parser is not available on Jython
parser = None
+from sphinx.util.pycompat import htmlescape
from sphinx.util.texescape import tex_hl_escape_map_new
from sphinx.ext import doctest
@@ -105,7 +105,7 @@ class PygmentsBridge(object):
def unhighlighted(self, source):
if self.dest == 'html':
- return '<pre>' + cgi.escape(source) + '</pre>\n'
+ return '<pre>' + htmlescape(source) + '</pre>\n'
else:
# first, escape highlighting characters like Pygments does
source = source.translate(escape_hl_chars)
diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py
index f5c8911da..b5c3db598 100644
--- a/sphinx/util/inspect.py
+++ b/sphinx/util/inspect.py
@@ -16,6 +16,7 @@ import sys
inspect = __import__('inspect')
from sphinx.util import force_decode
+from sphinx.util.pycompat import bytes
if sys.version_info >= (2, 5):
@@ -89,4 +90,6 @@ def safe_repr(object):
s = repr(object)
except Exception:
raise ValueError
- return force_decode(s, None).replace('\n', ' ')
+ if isinstance(s, bytes):
+ return force_decode(s, None).replace('\n', ' ')
+ return s.replace('\n', ' ')
diff --git a/sphinx/util/pycompat.py b/sphinx/util/pycompat.py
index cd9f6e2fc..9e081b02f 100644
--- a/sphinx/util/pycompat.py
+++ b/sphinx/util/pycompat.py
@@ -64,6 +64,11 @@ else:
return s.encode('ascii', 'backslashreplace')
+try:
+ from html import escape as htmlescape
+except ImportError:
+ from cgi import escape as htmlescape
+
# ------------------------------------------------------------------------------
# Missing builtins and itertools in Python < 2.6
diff --git a/sphinx/websupport/__init__.py b/sphinx/websupport/__init__.py
index 61b63cab2..72864a17b 100644
--- a/sphinx/websupport/__init__.py
+++ b/sphinx/websupport/__init__.py
@@ -9,7 +9,6 @@
:license: BSD, see LICENSE for details.
"""
-import cgi
import sys
import cPickle as pickle
import posixpath
@@ -22,6 +21,7 @@ from docutils.core import publish_parts
from sphinx.application import Sphinx
from sphinx.util.osutil import ensuredir
from sphinx.util.jsonimpl import dumps as dump_json
+from sphinx.util.pycompat import htmlescape
from sphinx.websupport import errors
from sphinx.websupport.search import BaseSearch, SEARCH_ADAPTERS
from sphinx.websupport.storage import StorageBackend
@@ -452,5 +452,5 @@ class WebSupport(object):
ret = publish_parts(text, writer_name='html',
settings_overrides=settings)['fragment']
except Exception:
- ret = cgi.escape(text)
+ ret = htmlescape(text)
return ret
diff --git a/sphinx/websupport/storage/differ.py b/sphinx/websupport/storage/differ.py
index 33fe54f34..fb3b8dc95 100644
--- a/sphinx/websupport/storage/differ.py
+++ b/sphinx/websupport/storage/differ.py
@@ -10,9 +10,10 @@
"""
import re
-from cgi import escape
from difflib import Differ
+from sphinx.util.pycompat import htmlescape
+
class CombinedHtmlDiff(object):
"""Create an HTML representation of the differences between two pieces
@@ -21,7 +22,7 @@ class CombinedHtmlDiff(object):
highlight_regex = re.compile(r'([\+\-\^]+)')
def __init__(self, source, proposal):
- proposal = escape(proposal)
+ proposal = htmlescape(proposal)
differ = Differ()
self.diff = list(differ.compare(source.splitlines(1),
diff --git a/tests/test_build_html.py b/tests/test_build_html.py
index 14b9d377d..a38806a86 100644
--- a/tests/test_build_html.py
+++ b/tests/test_build_html.py
@@ -328,7 +328,11 @@ def test_html(app):
for fname, paths in HTML_XPATH.iteritems():
parser = NslessParser()
parser.entity.update(htmlentitydefs.entitydefs)
- etree = ET.parse(os.path.join(app.outdir, fname), parser)
+ fp = open(os.path.join(app.outdir, fname))
+ try:
+ etree = ET.parse(fp, parser)
+ finally:
+ fp.close()
for path, check in paths:
yield check_xpath, etree, fname, path, check