docs: kernel_include.py: move rawtext logic to separate functions

The run function is too complex. merge run() and _run() into
a single function and move the read logic to separate functions.

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Link: https://lore.kernel.org/r/04776a94c85b6c931c198a149f08b299c9f571a3.1755872208.git.mchehab+huawei@kernel.org
This commit is contained in:
Mauro Carvalho Chehab
2025-08-22 16:19:25 +02:00
committed by Jonathan Corbet
parent 39f5f2fa8c
commit 012e00dda3

View File

@@ -92,7 +92,47 @@ class KernelInclude(Include):
'exception-file': directives.unchanged,
})
def read_rawtext(self, path, encoding):
"""Read and process file content with error handling"""
try:
self.state.document.settings.record_dependencies.add(path)
include_file = io.FileInput(source_path=path,
encoding=encoding,
error_handler=self.state.document.settings.input_encoding_error_handler)
except UnicodeEncodeError:
raise self.severe('Problems with directive path:\n'
'Cannot encode input file path "%s" '
'(wrong locale?).' % SafeString(path))
except IOError as error:
raise self.severe('Problems with directive path:\n%s.' % ErrorString(error))
try:
return include_file.read()
except UnicodeError as error:
raise self.severe('Problem with directive:\n%s' % ErrorString(error))
def read_rawtext_with_xrefs(self, env, path):
parser = ParseDataStructs()
parser.parse_file(path)
if 'exception-file' in self.options:
source_dir = os.path.dirname(os.path.abspath(
self.state_machine.input_lines.source(
self.lineno - self.state_machine.input_offset - 1)))
exceptions_file = os.path.join(source_dir, self.options['exception-file'])
parser.process_exceptions(exceptions_file)
if self.options.get("start-line") or self.options.get("end-line"):
raise self.severe('generate-cross-refs can\'t be used with "start-line" or "end-line"')
# Store references on a symbol dict to be used at check time
if 'warn-broken' in self.options:
env._xref_files.add(path)
return parser.gen_output()
def run(self):
"""Include a file as part of the content of this reST file."""
env = self.state.document.settings.env
path = os.path.realpath(os.path.expandvars(self.arguments[0]))
@@ -105,12 +145,6 @@ class KernelInclude(Include):
env.note_dependency(os.path.abspath(path))
# return super(KernelInclude, self).run() # won't work, see HINTs in _run()
return self._run(env)
def _run(self, env):
"""Include a file as part of the content of this reST file."""
# HINT: I had to copy&paste the whole Include.run method. I'am not happy
# with this, but due to security reasons, the Include.run method does
# not allow absolute or relative pathnames pointing to locations *above*
@@ -139,47 +173,17 @@ class KernelInclude(Include):
# Get optional arguments to related to cross-references generation
if 'generate-cross-refs' in self.options:
parser = ParseDataStructs()
parser.parse_file(path)
exceptions_file = self.options.get('exception-file')
if exceptions_file:
exceptions_file = os.path.join(source_dir, exceptions_file)
parser.process_exceptions(exceptions_file)
rawtext = self.read_rawtext_with_xrefs(env, path)
title = os.path.basename(path)
rawtext = parser.gen_output()
if startline or endline:
raise self.severe('generate-cross-refs can\'t be used together with "start-line" or "end-line"')
if "code" not in self.options:
rawtext = ".. parsed-literal::\n\n" + rawtext
# Store references on a symbol dict to be used at check time
if 'warn-broken' in self.options:
env._xref_files.add(path)
else:
try:
self.state.document.settings.record_dependencies.add(path)
include_file = io.FileInput(source_path=path, encoding=encoding,
error_handler=e_handler)
except UnicodeEncodeError:
raise self.severe('Problems with "%s" directive path:\n'
'Cannot encode input file path "%s" '
"(wrong locale?)." % (self.name, SafeString(path)))
except IOError as error:
raise self.severe('Problems with "%s" directive path:\n%s.'
% (self.name, ErrorString(error)))
try:
if startline or (endline is not None):
lines = include_file.readlines()
rawtext = "".join(lines[startline:endline])
else:
rawtext = include_file.read()
except UnicodeError as error:
raise self.severe('Problem with "%s" directive:\n%s' %
(self.name, ErrorString(error)))
rawtext = self.read_rawtext(path, encoding)
# start-after/end-before: no restrictions on newlines in match-text,
# and no restrictions on matching inside lines vs. line boundaries