diff --git a/CHANGES b/CHANGES index c21146bc7..1dc59cbc5 100644 --- a/CHANGES +++ b/CHANGES @@ -85,6 +85,7 @@ Bugs fixed * #3295: Could not import extension sphinx.builders.linkcheck * #3285: autosummary: asterisks are escaped twice * LaTeX, pass dvipdfm option to geometry package for Japanese documents (ref #3363) +* Fix parselinenos() could not parse left half open range (cf. "-4") Release 1.5.1 (released Dec 13, 2016) diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index dfe1f60b9..f619cd02e 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -357,14 +357,17 @@ def parselinenos(spec, total): for part in parts: try: begend = part.strip().split('-') - if len(begend) > 2: + if ['', ''] == begend: raise ValueError - if len(begend) == 1: + elif len(begend) == 1: items.append(int(begend[0]) - 1) + elif len(begend) == 2: + start, end = begend + start = start or 1 # left half open (cf. -10) + end = end or total # right half open (cf. 10-) + items.extend(range(int(start) - 1, int(end))) else: - start = (begend[0] == '') and 0 or int(begend[0]) - 1 - end = (begend[1] == '') and total or int(begend[1]) - items.extend(range(start, end)) + raise ValueError except Exception: raise ValueError('invalid line number spec: %r' % spec) return items diff --git a/tests/test_util.py b/tests/test_util.py index 2ee022604..f5d8af0f0 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -56,6 +56,7 @@ def test_splitdocinfo(): def test_parselinenos(): assert parselinenos('1,2,3', 10) == [0, 1, 2] assert parselinenos('4, 5, 6', 10) == [3, 4, 5] + assert parselinenos('-4', 10) == [0, 1, 2, 3] assert parselinenos('7-9', 10) == [6, 7, 8] assert parselinenos('7-', 10) == [6, 7, 8, 9] assert parselinenos('1,7-', 10) == [0, 6, 7, 8, 9]