import re


def leading(string, character):
    return len(string) - len(string.lstrip(character))


def trailing(string, character):
    return len(string) - len(string.rstrip(character))


class Element:
    def __init__(self):
        pass

    def __repr__(self):
        return "Void block"


class Heading(Element):
    def __init__(self, content, level):
        super().__init__()
        self.content = content
        self.level = level
        pass

    def __repr__(self):
        return f"Heading level {self.level}:\n\t" + self.content


class Paragraph(Element):
    def __init__(self, content):
        super().__init__()
        self.content = content

    def addLine(self, content):
        self.content += content.strip() + " "

    def __repr__(self):
        return "Paragraph:\n\t" + self.content


def _tokenise(source):
    tokens = []

    currentBlock = Element

    for line in source.split("\n"):
        if not line.strip():
            # Void block

            tokens.append(currentBlock)
            currentBlock = Element()
        elif line.startswith("#") and leading(line.lstrip("#"), " ") == 1:
            tokens.append(currentBlock)

            content = line.lstrip("#").strip()
            currentBlock = Heading(content, leading(line, "#"))
        else:
            if not isinstance(currentBlock, Paragraph):
                tokens.append(currentBlock)
                currentBlock = Paragraph("")

            currentBlock.addLine(line)

    tokens.append(currentBlock)

    return tokens


for i in _tokenise(
    """
# Hello World!
## Title 1
### Part 1
#### Chapter 1
##### Article 1
###### Section 1
Lorem ipsum
dolor sit amet"""
):
    print(repr(i))


def parseMarkdown(source):
    tokens = _tokenise(source)


parseMarkdown("")
