from ..util import strip_end def render_list(renderer, token, state) -> str: attrs = token['attrs'] if attrs['ordered']: children = _render_ordered_list(renderer, token, state) else: children = _render_unordered_list(renderer, token, state) text = ''.join(children) parent = token.get('parent') if parent: if parent['tight']: return text return text + '\n' return strip_end(text) + '\n' def _render_list_item(renderer, parent, item, state): leading = parent['leading'] text = '' for tok in item['children']: if tok['type'] == 'list': tok['parent'] = parent elif tok['type'] == 'blank_line': continue text += renderer.render_token(tok, state) lines = text.splitlines() text = lines[0] + '\n' prefix = ' ' * len(leading) for line in lines[1:]: if line: text += prefix + line + '\n' else: text += '\n' return leading + text def _render_ordered_list(renderer, token, state): attrs = token['attrs'] start = attrs.get('start', 1) for item in token['children']: leading = str(start) + token['bullet'] + ' ' parent = { 'leading': leading, 'tight': token['tight'], } yield _render_list_item(renderer, parent, item, state) start += 1 def _render_unordered_list(renderer, token, state): parent = { 'leading': token['bullet'] + ' ', 'tight': token['tight'], } for item in token['children']: yield _render_list_item(renderer, parent, item, state)