diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2018-01-08 14:38:47 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-08 14:38:47 +0900 |
commit | b6e38b406541f6eef74e2d19a727522307c96eb9 (patch) | |
tree | c2129b90f855c2103134dc0cdf8bddef163adcba /sphinx/util/docutils.py | |
parent | 42000e0f007ce78c3a40d194ae1a4ac8b3c4674b (diff) | |
parent | 1c0a5ee55d45b1332e04011e0d5cc3c7c1c44a6c (diff) | |
download | sphinx-git-b6e38b406541f6eef74e2d19a727522307c96eb9.tar.gz |
Merge pull request #4310 from tk0miya/refactor_AutoDirective
Refactor AutoDirective
Diffstat (limited to 'sphinx/util/docutils.py')
-rw-r--r-- | sphinx/util/docutils.py | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/sphinx/util/docutils.py b/sphinx/util/docutils.py index b6ddd2dd8..bfaff758f 100644 --- a/sphinx/util/docutils.py +++ b/sphinx/util/docutils.py @@ -18,7 +18,7 @@ from contextlib import contextmanager import docutils from docutils.languages import get_language -from docutils.statemachine import ViewList +from docutils.statemachine import StateMachine, ViewList from docutils.parsers.rst import directives, roles, convert_directive_function from docutils.utils import Reporter @@ -31,8 +31,9 @@ report_re = re.compile('^(.+?:(?:\\d+)?): \\((DEBUG|INFO|WARNING|ERROR|SEVERE)/( if False: # For type annotation - from typing import Any, Callable, Iterator, List, Tuple # NOQA + from typing import Any, Callable, Generator, Iterator, List, Tuple # NOQA from docutils import nodes # NOQA + from docutils.statemachine import State # NOQA from sphinx.environment import BuildEnvironment # NOQA from sphinx.io import SphinxFileInput # NOQA @@ -216,3 +217,22 @@ def directive_helper(obj, has_content=None, argument_spec=None, **option_spec): raise ExtensionError(__('when adding directive classes, no ' 'additional arguments may be given')) return obj + + +@contextmanager +def switch_source_input(state, content): + # type: (State, ViewList) -> Generator + """Switch current source input of state temporarily.""" + try: + # remember the original ``get_source_and_line()`` method + get_source_and_line = state.memo.reporter.get_source_and_line + + # replace it by new one + state_machine = StateMachine([], None) + state_machine.input_lines = content + state.memo.reporter.get_source_and_line = state_machine.get_source_and_line + + yield + finally: + # restore the method + state.memo.reporter.get_source_and_line = get_source_and_line |