[Python-modules-commits] [sphinx] 01/01: Backport upstream patch to add section numbering in text writer.
Dmitry Shachnev
mitya57 at moszumanska.debian.org
Wed Jan 24 18:54:10 UTC 2018
This is an automated email from the git hooks/post-receive script.
mitya57 pushed a commit to branch debian/master
in repository sphinx.
commit 85e2cf0f97ed524924404736f5f830b444441504
Author: Dmitry Shachnev <mitya57 at gmail.com>
Date: Wed Jan 24 21:52:55 2018 +0300
Backport upstream patch to add section numbering in text writer.
It can be enabled by setting text_add_secnumbers = True.
Closes: #872868.
---
debian/changelog | 7 +
debian/patches/series | 1 +
debian/patches/text_section_numbering.diff | 261 +++++++++++++++++++++++++++++
3 files changed, 269 insertions(+)
diff --git a/debian/changelog b/debian/changelog
index 3d697b3..88682fa 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+sphinx (1.6.6-2) UNRELEASED; urgency=medium
+
+ * Backport upstream patch to add optional section numbering in plain
+ text output (closes: #872868).
+
+ -- Dmitry Shachnev <mitya57 at debian.org> Wed, 24 Jan 2018 21:51:28 +0300
+
sphinx (1.6.6-1) unstable; urgency=medium
* New upstream release (closes: #881923).
diff --git a/debian/patches/series b/debian/patches/series
index 610993d..f847bce 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -4,3 +4,4 @@ no_snowballstemmer.diff
skip_tests_network.diff
no_require_websupport.diff
reproducible_epub.diff
+text_section_numbering.diff
diff --git a/debian/patches/text_section_numbering.diff b/debian/patches/text_section_numbering.diff
new file mode 100644
index 0000000..d8247c8
--- /dev/null
+++ b/debian/patches/text_section_numbering.diff
@@ -0,0 +1,261 @@
+From: Matthew Woodcraft <matthew at woodcraft.me.uk>
+Date: Sun, 5 Nov 2017 22:47:57 +0000
+Subject: Add optional section numbering in plain text output
+
+Controlled by new config values: text_add_secnumbers and
+text_secnumber_suffix.
+
+(cherry picked from commit 6b15c9c1c738c587a73b4144e8fe2b0d3b8aa4b4)
+---
+ doc/config.rst | 14 ++++++
+ sphinx/builders/text.py | 8 +++-
+ sphinx/writers/text.py | 20 +++++++-
+ tests/roots/test-build-text/contents.txt | 3 ++
+ tests/roots/test-build-text/doc1.txt | 2 +
+ tests/roots/test-build-text/doc2.txt | 9 ++++
+ tests/test_build_text.py | 80 ++++++++++++++++++++++++++++++++
+ 7 files changed, 133 insertions(+), 3 deletions(-)
+ create mode 100644 tests/roots/test-build-text/doc1.txt
+ create mode 100644 tests/roots/test-build-text/doc2.txt
+
+diff --git a/doc/config.rst b/doc/config.rst
+index 6b7690c..bc57999 100644
+--- a/doc/config.rst
++++ b/doc/config.rst
+@@ -2039,6 +2039,20 @@ These options influence text output.
+
+ .. versionadded:: 1.1
+
++.. confval:: text_add_secnumbers
++
++ A boolean that decides whether section numbers are included in text output.
++ Default is ``False``.
++
++ .. versionadded:: 1.7
++
++.. confval:: text_secnumber_suffix
++
++ Suffix for section numbers in text output. Default: ``". "``. Set to ``" "``
++ to suppress the final dot on section numbers.
++
++ .. versionadded:: 1.7
++
+
+ .. _man-options:
+
+diff --git a/sphinx/builders/text.py b/sphinx/builders/text.py
+index 7b977b1..0bfb97f 100644
+--- a/sphinx/builders/text.py
++++ b/sphinx/builders/text.py
+@@ -21,7 +21,7 @@ from sphinx.writers.text import TextWriter, TextTranslator
+
+ if False:
+ # For type annotation
+- from typing import Any, Dict, Iterator, Set # NOQA
++ from typing import Any, Dict, Iterator, Set, Tuple # NOQA
+ from docutils import nodes # NOQA
+ from sphinx.application import Sphinx # NOQA
+
+@@ -39,7 +39,8 @@ class TextBuilder(Builder):
+
+ def init(self):
+ # type: () -> None
+- pass
++ # section numbers for headings in the currently visited document
++ self.secnumbers = {} # type: Dict[unicode, Tuple[int, ...]]
+
+ def get_outdated_docs(self):
+ # type: () -> Iterator[unicode]
+@@ -72,6 +73,7 @@ class TextBuilder(Builder):
+ def write_doc(self, docname, doctree):
+ # type: (unicode, nodes.Node) -> None
+ self.current_docname = docname
++ self.secnumbers = self.env.toc_secnumbers.get(docname, {})
+ destination = StringOutput(encoding='utf-8')
+ self.writer.write(doctree, destination)
+ outfilename = path.join(self.outdir, os_path(docname) + self.out_suffix)
+@@ -93,6 +95,8 @@ def setup(app):
+
+ app.add_config_value('text_sectionchars', '*=-~"+`', 'env')
+ app.add_config_value('text_newlines', 'unix', 'env')
++ app.add_config_value('text_add_secnumbers', False, 'env')
++ app.add_config_value('text_secnumber_suffix', '. ', 'env')
+
+ return {
+ 'version': 'builtin',
+diff --git a/sphinx/writers/text.py b/sphinx/writers/text.py
+index b6e3f4c..dda8030 100644
+--- a/sphinx/writers/text.py
++++ b/sphinx/writers/text.py
+@@ -183,6 +183,8 @@ class TextTranslator(nodes.NodeVisitor):
+ else:
+ self.nl = '\n'
+ self.sectionchars = builder.config.text_sectionchars
++ self.add_secnumbers = builder.config.text_add_secnumbers
++ self.secnumber_suffix = builder.config.text_secnumber_suffix
+ self.states = [[]] # type: List[List[Tuple[int, Union[unicode, List[unicode]]]]]
+ self.stateindent = [0]
+ self.list_counter = [] # type: List[int]
+@@ -307,6 +309,17 @@ class TextTranslator(nodes.NodeVisitor):
+ raise nodes.SkipNode
+ self.new_state(0)
+
++ def get_section_number_string(self, node):
++ # type: (nodes.Node) -> unicode
++ if isinstance(node.parent, nodes.section):
++ anchorname = '#' + node.parent['ids'][0]
++ numbers = self.builder.secnumbers.get(anchorname)
++ if numbers is None:
++ numbers = self.builder.secnumbers.get('')
++ if numbers is not None:
++ return '.'.join(map(str, numbers)) + self.secnumber_suffix
++ return ''
++
+ def depart_title(self, node):
+ # type: (nodes.Node) -> None
+ if isinstance(node.parent, nodes.section):
+@@ -315,6 +328,8 @@ class TextTranslator(nodes.NodeVisitor):
+ char = '^'
+ text = None # type: unicode
+ text = ''.join(x[1] for x in self.states.pop() if x[0] == -1) # type: ignore
++ if self.add_secnumbers:
++ text = self.get_section_number_string(node) + text
+ self.stateindent.pop()
+ title = ['', text, '%s' % (char * column_width(text)), ''] # type: List[unicode]
+ if len(self.states) == 2 and len(self.states[-1]) == 0:
+@@ -987,7 +1002,10 @@ class TextTranslator(nodes.NodeVisitor):
+
+ def visit_reference(self, node):
+ # type: (nodes.Node) -> None
+- pass
++ if self.add_secnumbers:
++ numbers = node.get("secnumber")
++ if numbers is not None:
++ self.add_text('.'.join(map(str, numbers)) + self.secnumber_suffix)
+
+ def depart_reference(self, node):
+ # type: (nodes.Node) -> None
+diff --git a/tests/roots/test-build-text/contents.txt b/tests/roots/test-build-text/contents.txt
+index 420d142..ca9f8dc 100644
+--- a/tests/roots/test-build-text/contents.txt
++++ b/tests/roots/test-build-text/contents.txt
+@@ -1,5 +1,8 @@
+ .. toctree::
++ :numbered:
+
++ doc1
++ doc2
+ maxwidth
+ lineblock
+ nonascii_title
+diff --git a/tests/roots/test-build-text/doc1.txt b/tests/roots/test-build-text/doc1.txt
+new file mode 100644
+index 0000000..da1909a
+--- /dev/null
++++ b/tests/roots/test-build-text/doc1.txt
+@@ -0,0 +1,2 @@
++Section A
++=========
+diff --git a/tests/roots/test-build-text/doc2.txt b/tests/roots/test-build-text/doc2.txt
+new file mode 100644
+index 0000000..ebc88e9
+--- /dev/null
++++ b/tests/roots/test-build-text/doc2.txt
+@@ -0,0 +1,9 @@
++Section B
++=========
++
++Sub Ba
++------
++
++Sub Bb
++------
++
+diff --git a/tests/test_build_text.py b/tests/test_build_text.py
+index 382e62b..553426e 100644
+--- a/tests/test_build_text.py
++++ b/tests/test_build_text.py
+@@ -111,3 +111,83 @@ def test_list_items_in_admonition(app, status, warning):
+ assert lines[2] == " * item 1"
+ assert lines[3] == ""
+ assert lines[4] == " * item 2"
++
++
++ at with_text_app()
++def test_secnums(app, status, warning):
++ app.builder.build_all()
++ contents = (app.outdir / 'contents.txt').text(encoding='utf8')
++ lines = contents.splitlines()
++ assert lines[0] == "* Section A"
++ assert lines[1] == ""
++ assert lines[2] == "* Section B"
++ assert lines[3] == ""
++ assert lines[4] == " * Sub Ba"
++ assert lines[5] == ""
++ assert lines[6] == " * Sub Bb"
++ doc2 = (app.outdir / 'doc2.txt').text(encoding='utf8')
++ expect = (
++ "Section B\n"
++ "*********\n"
++ "\n"
++ "\n"
++ "Sub Ba\n"
++ "======\n"
++ "\n"
++ "\n"
++ "Sub Bb\n"
++ "======\n"
++ )
++ assert doc2 == expect
++
++ app.config.text_add_secnumbers = True
++ app.builder.build_all()
++ contents = (app.outdir / 'contents.txt').text(encoding='utf8')
++ lines = contents.splitlines()
++ assert lines[0] == "* 1. Section A"
++ assert lines[1] == ""
++ assert lines[2] == "* 2. Section B"
++ assert lines[3] == ""
++ assert lines[4] == " * 2.1. Sub Ba"
++ assert lines[5] == ""
++ assert lines[6] == " * 2.2. Sub Bb"
++ doc2 = (app.outdir / 'doc2.txt').text(encoding='utf8')
++ expect = (
++ "2. Section B\n"
++ "************\n"
++ "\n"
++ "\n"
++ "2.1. Sub Ba\n"
++ "===========\n"
++ "\n"
++ "\n"
++ "2.2. Sub Bb\n"
++ "===========\n"
++ )
++ assert doc2 == expect
++
++ app.config.text_secnumber_suffix = " "
++ app.builder.build_all()
++ contents = (app.outdir / 'contents.txt').text(encoding='utf8')
++ lines = contents.splitlines()
++ assert lines[0] == "* 1 Section A"
++ assert lines[1] == ""
++ assert lines[2] == "* 2 Section B"
++ assert lines[3] == ""
++ assert lines[4] == " * 2.1 Sub Ba"
++ assert lines[5] == ""
++ assert lines[6] == " * 2.2 Sub Bb"
++ doc2 = (app.outdir / 'doc2.txt').text(encoding='utf8')
++ expect = (
++ "2 Section B\n"
++ "***********\n"
++ "\n"
++ "\n"
++ "2.1 Sub Ba\n"
++ "==========\n"
++ "\n"
++ "\n"
++ "2.2 Sub Bb\n"
++ "==========\n"
++ )
++ assert doc2 == expect
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/sphinx.git
More information about the Python-modules-commits
mailing list