diff --git a/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/md.py b/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/md.py index c08675870f6a..3274d6de2fda 100644 --- a/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/md.py +++ b/pkgs/tools/nix/nixos-render-docs/src/nixos_render_docs/md.py @@ -1,7 +1,7 @@ from abc import ABC from collections.abc import Mapping, MutableMapping, Sequence from frozendict import frozendict # type: ignore[attr-defined] -from typing import Any, Callable, Optional +from typing import Any, Callable, cast, Optional import re @@ -364,14 +364,21 @@ class Converter(ABC): # of each item to hidden. this is not useful for our stylesheets, which # signify this with a special css class on list elements instead. wide_stack = [] + end_stack = [] for i in range(0, len(tokens)): if tokens[i].type in [ 'bullet_list_open', 'ordered_list_open' ]: wide_stack.append([i, True]) + end_stack.append([i, cast(int, tokens[i].attrs.get('start', 1))]) elif tokens[i].type in [ 'bullet_list_close', 'ordered_list_close' ]: (idx, compact) = wide_stack.pop() tokens[idx].attrs['compact'] = compact + (idx, end) = end_stack.pop() + if tokens[i].type == 'ordered_list_close': + tokens[idx].meta['end'] = end - 1 elif len(wide_stack) > 0 and tokens[i].type == 'paragraph_open' and not tokens[i].hidden: wide_stack[-1][1] = False + elif tokens[i].type == 'list_item_open': + end_stack[-1][1] += 1 return tokens diff --git a/pkgs/tools/nix/nixos-render-docs/src/tests/test_lists.py b/pkgs/tools/nix/nixos-render-docs/src/tests/test_lists.py index 0f5d28407367..af284c9d3abe 100644 --- a/pkgs/tools/nix/nixos-render-docs/src/tests/test_lists.py +++ b/pkgs/tools/nix/nixos-render-docs/src/tests/test_lists.py @@ -13,9 +13,10 @@ def test_list_wide(ordered: bool) -> None: ("ordered", "ol", ".", "1.", "2.", "1", "2") if ordered else ("bullet", "ul", "-", "-", "-", "", "") ) c = Converter({}) + meta = { 'end': int(e2[:-1]) } if ordered else {} assert c._parse(f"{e1} a\n\n{e2} b") == [ Token(type=f'{t}_list_open', tag=tag, nesting=1, attrs={'compact': False}, map=[0, 3], level=0, - children=None, content='', markup=m, info='', meta={}, block=True, hidden=False), + children=None, content='', markup=m, info='', meta=meta, block=True, hidden=False), Token(type='list_item_open', tag='li', nesting=1, attrs={}, map=[0, 2], level=1, children=None, content='', markup=m, info=i1, meta={}, block=True, hidden=False), Token(type='paragraph_open', tag='p', nesting=1, attrs={}, map=[0, 1], level=2, children=None, @@ -54,9 +55,10 @@ def test_list_narrow(ordered: bool) -> None: ("ordered", "ol", ".", "1.", "2.", "1", "2") if ordered else ("bullet", "ul", "-", "-", "-", "", "") ) c = Converter({}) + meta = { 'end': int(e2[:-1]) } if ordered else {} assert c._parse(f"{e1} a\n{e2} b") == [ Token(type=f'{t}_list_open', tag=tag, nesting=1, attrs={'compact': True}, map=[0, 2], level=0, - children=None, content='', markup=m, info='', meta={}, block=True, hidden=False), + children=None, content='', markup=m, info='', meta=meta, block=True, hidden=False), Token(type='list_item_open', tag='li', nesting=1, attrs={}, map=[0, 1], level=1, children=None, content='', markup=m, info=i1, meta={}, block=True, hidden=False), Token(type='paragraph_open', tag='p', nesting=1, attrs={}, map=[0, 1], level=2, children=None, @@ -90,7 +92,7 @@ def test_list_narrow(ordered: bool) -> None: ] assert c._parse(f"{e1} - a\n{e2} b") == [ Token(type=f'{t}_list_open', tag=tag, nesting=1, attrs={'compact': True}, map=[0, 2], level=0, - children=None, content='', markup=m, info='', meta={}, block=True, hidden=False), + children=None, content='', markup=m, info='', meta=meta, block=True, hidden=False), Token(type='list_item_open', tag='li', nesting=1, attrs={}, map=[0, 1], level=1, children=None, content='', markup=m, info=i1, meta={}, block=True, hidden=False), Token(type='bullet_list_open', tag='ul', nesting=1, attrs={'compact': True}, map=[0, 1], level=2, @@ -132,7 +134,7 @@ def test_list_narrow(ordered: bool) -> None: ] assert c._parse(f"{e1} - a\n{e2} - b") == [ Token(type=f'{t}_list_open', tag=tag, nesting=1, attrs={'compact': True}, map=[0, 2], level=0, - children=None, content='', markup=m, info='', meta={}, block=True, hidden=False), + children=None, content='', markup=m, info='', meta=meta, block=True, hidden=False), Token(type='list_item_open', tag='li', nesting=1, attrs={}, map=[0, 1], level=1, children=None, content='', markup=m, info=i1, meta={}, block=True, hidden=False), Token(type='bullet_list_open', tag='ul', nesting=1, attrs={'compact': True}, map=[0, 1], level=2,