diff options
| author | Georg Brandl <georg@python.org> | 2011-05-15 13:52:48 +0200 |
|---|---|---|
| committer | Georg Brandl <georg@python.org> | 2011-05-15 13:52:48 +0200 |
| commit | fd2c55eaea41cfb0db941c7d0538215306f1da9a (patch) | |
| tree | e930a63eeab723b56cb4a281cf219602010299df /sphinx | |
| parent | 88a4dce9a45b76d990e2768de69eb465a5f216f7 (diff) | |
| parent | ba9d023acf4361093666eaf1aa6e78b0ab41a891 (diff) | |
| download | sphinx-fd2c55eaea41cfb0db941c7d0538215306f1da9a.tar.gz | |
merge with 1.0
Diffstat (limited to 'sphinx')
| -rw-r--r-- | sphinx/builders/htmlhelp.py | 3 | ||||
| -rw-r--r-- | sphinx/directives/code.py | 8 | ||||
| -rw-r--r-- | sphinx/domains/python.py | 23 | ||||
| -rw-r--r-- | sphinx/pycode/__init__.py | 16 | ||||
| -rw-r--r-- | sphinx/themes/basic/static/searchtools.js_t | 2 | ||||
| -rw-r--r-- | sphinx/util/__init__.py | 55 | ||||
| -rw-r--r-- | sphinx/writers/html.py | 12 |
7 files changed, 87 insertions, 32 deletions
diff --git a/sphinx/builders/htmlhelp.py b/sphinx/builders/htmlhelp.py index fcd8a7f3..143f6df9 100644 --- a/sphinx/builders/htmlhelp.py +++ b/sphinx/builders/htmlhelp.py @@ -259,8 +259,7 @@ class HTMLHelpBuilder(StandaloneHTMLBuilder): def write_index(title, refs, subitems): def write_param(name, value): item = ' <param name="%s" value="%s">\n' % (name, value) - f.write(item.encode(self.encoding, 'xmlcharrefreplace') - .decode(self.encoding)) + f.write(item) title = cgi.escape(title) f.write('<LI> <OBJECT type="text/sitemap">\n') write_param('Keyword', title) diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py index 99fb3502..8cedab19 100644 --- a/sphinx/directives/code.py +++ b/sphinx/directives/code.py @@ -138,7 +138,13 @@ class LiteralInclude(Directive): linelist = parselinenos(linespec, len(lines)) except ValueError, err: return [document.reporter.warning(str(err), line=self.lineno)] - lines = [lines[i] for i in linelist] + # just ignore nonexisting lines + nlines = len(lines) + lines = [lines[i] for i in linelist if i < nlines] + if not lines: + return [document.reporter.warning( + 'Line spec %r: no lines pulled from include file %r' % + (linespec, filename), line=self.lineno)] startafter = self.options.get('start-after') endbefore = self.options.get('end-before') diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py index 021aaaaa..4004599c 100644 --- a/sphinx/domains/python.py +++ b/sphinx/domains/python.py @@ -418,18 +418,19 @@ class PyModule(Directive): modname = self.arguments[0].strip() noindex = 'noindex' in self.options env.temp_data['py:module'] = modname - env.domaindata['py']['modules'][modname] = \ - (env.docname, self.options.get('synopsis', ''), - self.options.get('platform', ''), 'deprecated' in self.options) - # make a duplicate entry in 'objects' to facilitate searching for the - # module in PythonDomain.find_obj() - env.domaindata['py']['objects'][modname] = (env.docname, 'module') - targetnode = nodes.target('', '', ids=['module-' + modname], ismod=True) - self.state.document.note_explicit_target(targetnode) - ret = [targetnode] - # the platform and synopsis aren't printed; in fact, they are only used - # in the modindex currently + ret = [] if not noindex: + env.domaindata['py']['modules'][modname] = \ + (env.docname, self.options.get('synopsis', ''), + self.options.get('platform', ''), 'deprecated' in self.options) + # make a duplicate entry in 'objects' to facilitate searching for the + # module in PythonDomain.find_obj() + env.domaindata['py']['objects'][modname] = (env.docname, 'module') + targetnode = nodes.target('', '', ids=['module-' + modname], ismod=True) + self.state.document.note_explicit_target(targetnode) + # the platform and synopsis aren't printed; in fact, they are only used + # in the modindex currently + ret.append(targetnode) indextext = _('%s (module)') % modname inode = addnodes.index(entries=[('single', indextext, 'module-' + modname, '')]) diff --git a/sphinx/pycode/__init__.py b/sphinx/pycode/__init__.py index e15e42bf..bf51e740 100644 --- a/sphinx/pycode/__init__.py +++ b/sphinx/pycode/__init__.py @@ -17,7 +17,7 @@ from cStringIO import StringIO from sphinx.errors import PycodeError from sphinx.pycode import nodes from sphinx.pycode.pgen2 import driver, token, tokenize, parse, literals -from sphinx.util import get_module_source +from sphinx.util import get_module_source, detect_encoding from sphinx.util.pycompat import next from sphinx.util.docstrings import prepare_docstring, prepare_commentdoc @@ -38,10 +38,6 @@ for k, v in token.tok_name.iteritems(): number2name = pygrammar.number2symbol.copy() number2name.update(token.tok_name) - -# a regex to recognize coding cookies -_coding_re = re.compile(r'coding[:=]\s*([-\w.]+)') - _eq = nodes.Leaf(token.EQUAL, '=') @@ -217,11 +213,10 @@ class ModuleAnalyzer(object): self.srcname = srcname # file-like object yielding source lines self.source = source - # will be changed when found by parse() - self.encoding = sys.getdefaultencoding() # cache the source code as well pos = self.source.tell() + self.encoding = detect_encoding(self.source.readline) self.code = self.source.read() self.source.seek(pos) @@ -251,13 +246,6 @@ class ModuleAnalyzer(object): self.parsetree = pydriver.parse_tokens(self.tokens) except parse.ParseError, err: raise PycodeError('parsing failed', err) - # find the source code encoding, if present - comments = self.parsetree.get_prefix() - for line in comments.splitlines()[:2]: - match = _coding_re.search(line) - if match is not None: - self.encoding = match.group(1) - break def find_attr_docs(self, scope=''): """Find class and module-level attributes and their documentation.""" diff --git a/sphinx/themes/basic/static/searchtools.js_t b/sphinx/themes/basic/static/searchtools.js_t index 2f1dc682..0aa291cb 100644 --- a/sphinx/themes/basic/static/searchtools.js_t +++ b/sphinx/themes/basic/static/searchtools.js_t @@ -284,7 +284,7 @@ var Search = { listItem.slideDown(5, function() { displayNextItem(); }); - }); + }, "text"); } else { // no source available, just display title Search.output.append(listItem); diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 8218c04a..b1a3a0d7 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -18,7 +18,7 @@ import tempfile import posixpath import traceback from os import path -from codecs import open +from codecs import open, BOM_UTF8 from collections import deque import docutils @@ -216,6 +216,59 @@ def get_module_source(modname): return 'file', filename +# a regex to recognize coding cookies +_coding_re = re.compile(r'coding[:=]\s*([-\w.]+)') + +def detect_encoding(readline): + """Like tokenize.detect_encoding() from Py3k, but a bit simplified.""" + + def read_or_stop(): + try: + return readline() + except StopIteration: + return None + + def get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace('_', '-') + if enc == 'utf-8' or enc.startswith('utf-8-'): + return 'utf-8' + if enc in ('latin-1', 'iso-8859-1', 'iso-latin-1') or \ + enc.startswith(('latin-1-', 'iso-8859-1-', 'iso-latin-1-')): + return 'iso-8859-1' + return orig_enc + + def find_cookie(line): + try: + line_string = line.decode('ascii') + except UnicodeDecodeError: + return None + + matches = _coding_re.findall(line_string) + if not matches: + return None + return get_normal_name(matches[0]) + + default = sys.getdefaultencoding() + first = read_or_stop() + if first and first.startswith(BOM_UTF8): + first = first[3:] + default = 'utf-8-sig' + if not first: + return default + encoding = find_cookie(first) + if encoding: + return encoding + second = read_or_stop() + if not second: + return default + encoding = find_cookie(second) + if encoding: + return encoding + return default + + # Low-level utility functions and classes. class Tee(object): diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py index eb5c76fa..99d621c6 100644 --- a/sphinx/writers/html.py +++ b/sphinx/writers/html.py @@ -116,12 +116,13 @@ class HTMLTranslator(BaseTranslator): def visit_desc_parameterlist(self, node): self.body.append('<big>(</big>') self.first_param = 1 + self.param_separator = node.child_text_separator def depart_desc_parameterlist(self, node): self.body.append('<big>)</big>') def visit_desc_parameter(self, node): if not self.first_param: - self.body.append(', ') + self.body.append(self.param_separator) else: self.first_param = 0 if not node.hasattr('noemph'): @@ -566,8 +567,15 @@ class SmartyPantsHTMLTranslator(HTMLTranslator): self.no_smarty += 1 try: HTMLTranslator.visit_literal_block(self, node) - finally: + except nodes.SkipNode: + # HTMLTranslator raises SkipNode for simple literal blocks, + # but not for parsed literal blocks self.no_smarty -= 1 + raise + + def depart_literal_block(self, node): + HTMLTranslator.depart_literal_block(self, node) + self.no_smarty -= 1 def visit_literal_emphasis(self, node): self.no_smarty += 1 |
