# Python
#
# This module implements tests for Header class.
#
# This file is part of mdutils. https://github.com/didix21/mdutils
#
# MIT License: (C) 2020 Dídac Coll
import re
[docs]class MDListHelper:
def __init__(self):
self.n_tabs = 0
def _get_unordered_markdown_list(self, items: [str], marker: str) -> str:
md_list = ""
for item in items:
if isinstance(item, list):
self.n_tabs += 1
md_list += self._get_unordered_markdown_list(item, marker)
self.n_tabs -= 1
else:
md_list += self._add_new_item(item, marker)
return md_list
def _get_ordered_markdown_list(self, items: [str]) -> str:
md_list = ""
n_marker = 1
for item in items:
if isinstance(item, list):
self.n_tabs += 1
md_list += self._get_ordered_markdown_list(items=item)
self.n_tabs -= 1
else:
md_list += self._add_new_item(item, f"{n_marker}.")
n_marker += 1
return md_list
def _add_new_item(self, item: str, marker: str):
item_with_hyphen = item if self._is_there_marker_in_item(item) else self._add_hyphen(item, marker)
return self._n_spaces(4 * self.n_tabs) + item_with_hyphen + '\n'
@classmethod
def _is_there_marker_in_item(cls, item: str) -> bool:
if item.startswith('-') or item.startswith('*') or item.startswith('+') or re.search(r"^(\d\.)", item):
return True
return False
@classmethod
def _add_hyphen(cls, item: str, marker: str):
return f"{marker} {item}"
@classmethod
def _n_spaces(cls, number_spaces: int = 1):
return " " * number_spaces
[docs]class MDList(MDListHelper):
"""This class allows to create unordered or ordered MarkDown list.
"""
def __init__(self, items: [str], marked_with: str = '-'):
"""
:param items: Array of items for generating the list.
:type items: [str]
:param marked_with: By default has the value of ``'-'``, can be ``'+'``, ``'*'``. If you want to generate
an ordered list then set to ``'1'``.
:type marked_with: str
"""
super().__init__()
self.md_list = self._get_ordered_markdown_list(items) if marked_with == '1' else \
self._get_unordered_markdown_list(items, marked_with)
[docs] def get_md(self) -> str:
"""Get the list in markdown format.
:return:
:rtype: str
"""
return self.md_list
[docs]class MDCheckbox(MDListHelper):
"""This class allows to create checkbox MarkDown list.
"""
def __init__(self, items: [str], checked: bool = False):
"""
:param items: Array of items for generating the list.
:type items: [str]
:param checked: Set to ``True``, if you want that all items become checked. By default is set to ``False``.
:type checked: bool
"""
super().__init__()
self.checked = " " if not checked else 'x'
self.md_list = self._get_unordered_markdown_list(items, marker=f'- [{self.checked}]')
[docs] def get_md(self) -> str:
return self.md_list
def _add_new_item(self, item: str, marker: str):
item_with_hyphen = self._add_hyphen(item[2:], '- [x]') if self.__is_checked(item) \
else self._add_hyphen(item, marker)
return self._n_spaces(4 * self.n_tabs) + item_with_hyphen + '\n'
@classmethod
def __is_checked(cls, item: str) -> bool:
return item.startswith('x')