diff --git a/src/conversions.py b/src/conversions.py index 40911f6..9ced479 100644 --- a/src/conversions.py +++ b/src/conversions.py @@ -1,9 +1,28 @@ from textnode import TextType, TextNode -from htmlnode import LeafNode +from htmlnode import ParentNode, LeafNode import re # ====Markdown Parsing and Block Handling==== +def markdown_to_blocks(markdown): + lines = markdown.split('\n') + blocks = [] + current_block = [] + for line in lines: + stripped = line.strip() + if stripped == "": + if current_block == []: + continue + else: + blocks.append("\n".join(current_block).strip()) + current_block = [] + else: + current_block.append(line) + if current_block != []: + blocks.append("\n".join(current_block).strip()) + current_block = [] + return blocks + def block_to_block_type(markdown): markdown = markdown.strip() # Remove leading/trailing whitespace @@ -49,37 +68,56 @@ def block_to_block_type(markdown): else: return "paragraph" - -def markdown_to_blocks(markdown): - lines = markdown.split('\n') - blocks = [] - current_block = [] - for line in lines: - stripped = line.strip() - if stripped == "": - if current_block == []: - continue - else: - blocks.append("\n".join(current_block).strip()) - current_block = [] - else: - current_block.append(line) - if current_block != []: - blocks.append("\n".join(current_block).strip()) - current_block = [] - return blocks - - -# ====Markdown Node Conversion==== +def markdown_to_html_node(markdown): + blocks = markdown_to_blocks(markdown) + nodes = [] + for block in blocks: + block_type = block_to_block_type(block) + match block_type: + case "paragraph": + nodes.append(ParentNode("p",text_to_children(block))) + case "heading": + nodes.append(ParentNode(f"h{block.count("#")}",text_to_children(block.strip("#"*block.count("#")+" ")))) + case "quote": + nodes.append(ParentNode("blockquote",text_to_children(block.strip("> ")))) + case "code": + tnodes = text_to_textnodes(block.strip("```").strip("\n")) + hnodes = [] + for node in tnodes: + hnodes.append(text_node_to_html_node(node)) + nodes.append(ParentNode("pre",[ParentNode("code",hnodes)])) + case "ordered_list": + items = block.split("\n") + trimmed = [] + for item in items: + item = re.sub(r'^\d+\. ', '', item) + trimmed.append(ParentNode("li",text_to_children(item))) + nodes.append(ParentNode("ol",trimmed)) + case "unordered_list": + items = block.split("\n") + trimmed = [] + for item in items: + item = item.lstrip("* ") + item = item.lstrip("- ") + trimmed.append(ParentNode("li",text_to_children(item))) + nodes.append(ParentNode("ul",trimmed)) + return ParentNode("div",nodes) +# ====Markdown to HTML Helpers==== +def text_to_children(text): + text_nodes = text_to_textnodes(text) + html_nodes = [] + for node in text_nodes: + html_nodes.append(text_node_to_html_node(node)) + return html_nodes def text_node_to_html_node(text_node): match text_node.text_type: case TextType.NORMAL_TEXT: return LeafNode(value=text_node.text) case TextType.BOLD_TEXT: - return LeafNode(value=text_node.text, tag="b") + return LeafNode(value=text_node.text, tag="strong") case TextType.ITALIC_TEXT: - return LeafNode(value=text_node.text, tag="i") + return LeafNode(value=text_node.text, tag="em") case TextType.CODE_TEXT: return LeafNode(value=text_node.text, tag="code") case TextType.LINK_TEXT: diff --git a/src/main.py b/src/main.py index 983f032..c344dc5 100644 --- a/src/main.py +++ b/src/main.py @@ -1,15 +1,10 @@ from textnode import TextNode,TextType -from conversions import markdown_to_blocks +from conversions import markdown_to_html_node def main(): - md = """# This is a heading - - This is a paragraph of text. It has some **bold** and *italic* words inside of it. - - * This is the first list item in a list block - * This is a list item - * This is another list item - """ - print(markdown_to_blocks(md)) + test_input = "This is *italics* and **bold**" + result = markdown_to_html_node(test_input).to_html() + print(f"Expected:
This is italics and bold
This is a paragraph
code blockQuote
This is italics and bold