docs: kernel_include.py: fix line numbers for TOC

On TOC output, we need to embeed line numbers with ViewList.

Change the parse class to produce a line-number parsed result,
and adjust the output accordingly.

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Message-ID: <74eed96e32f79eaaef7a99ffe7c3224fed369c27.1759329363.git.mchehab+huawei@kernel.org>
pull/1354/merge
Mauro Carvalho Chehab 2025-10-01 16:49:26 +02:00 committed by Jonathan Corbet
parent ba9fbb3d9a
commit 3ed9521772
2 changed files with 24 additions and 14 deletions

View File

@ -104,6 +104,7 @@ logger = logging.getLogger(__name__)
RE_DOMAIN_REF = re.compile(r'\\ :(ref|c:type|c:func):`([^<`]+)(?:<([^>]+)>)?`\\')
RE_SIMPLE_REF = re.compile(r'`([^`]+)`')
RE_LINENO_REF = re.compile(r'^\s*-\s+LINENO_(\d+):\s+(.*)')
def ErrorString(exc): # Shamelessly stolen from docutils
return f'{exc.__class__.__name}: {exc}'
@ -242,23 +243,32 @@ class KernelInclude(Directive):
# TOC output is a ReST file, not a literal. So, we can add line
# numbers
rawtext = parser.gen_toc()
include_lines = statemachine.string2lines(rawtext, tab_width,
convert_whitespace=True)
# Append line numbers data
startline = self.options.get('start-line', None)
endline = self.options.get('end-line', None)
relpath = os.path.relpath(path, srctree)
result = ViewList()
if startline and startline > 0:
offset = startline - 1
else:
offset = 0
for line in parser.gen_toc().split("\n"):
match = RE_LINENO_REF.match(line)
if not match:
result.append(line, path)
continue
for ln, line in enumerate(include_lines, start=offset):
result.append(line, path, ln)
ln, ref = match.groups()
ln = int(ln)
# Filter line range if needed
if startline and (ln < startline):
continue
if endline and (ln > endline):
continue
# Sphinx numerates starting with zero, but text editors
# and other tools start from one
realln = ln + 1
result.append(f"- {ref}: {relpath}#{realln}", path, ln)
self.state_machine.insert_input(result, path)

View File

@ -422,7 +422,7 @@ class ParseDataStructs:
# Sort symbols alphabetically
for symbol, (ref, ln) in sorted(refs.items()):
text.append(f"* {ref}: line #{ln}")
text.append(f"- LINENO_{ln}: {ref}")
text.append("") # Add empty line between categories