From 139a70db5159f1ca47b0d24d0a47f3e6332395f7 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Thu, 18 Apr 2024 15:41:53 -0400 Subject: [PATCH] created split images and split nodes --- src/inline_markdown.py | 107 ++++++++++++++++++++++++++++++------ src/test_inline_markdown.py | 101 +++++++++++++++++++++++++++++++++- 2 files changed, 189 insertions(+), 19 deletions(-) diff --git a/src/inline_markdown.py b/src/inline_markdown.py index 1da9d3c..ba10d0a 100644 --- a/src/inline_markdown.py +++ b/src/inline_markdown.py @@ -4,25 +4,89 @@ from textnode import TextNode def split_nodes_delimiter(old_nodes, delimiter, text_type): - final_node_list = [] + new_nodes = [] for old_node in old_nodes: - node_list = [] - if not isinstance(old_node, TextNode): - node_list.append(old_node) - return node_list - split_list = old_node.text.split(delimiter) - if old_node.text.count(delimiter) % 2 != 0: - raise ValueError("No closing delimiter found") - for i in range(len(split_list)): - if i % 2 != 0 and len(split_list[i]) > 0: - part = TextNode(split_list[i], text_type) - node_list.append(part) - elif len(split_list[i]) > 0: - part = TextNode(split_list[i], "text") - node_list.append(part) - final_node_list.extend(node_list) + if old_node.text_type != "text": + new_nodes.append(old_node) + continue + split_nodes = [] + sections = old_node.text.split(delimiter) + if len(sections) % 2 == 0: + raise ValueError("Invalid markdown, formatted section not closed") + for i in range(len(sections)): + if sections[i] == "": + continue + if i % 2 == 0: + split_nodes.append(TextNode(sections[i], "text")) + else: + split_nodes.append(TextNode(sections[i], text_type)) + new_nodes.extend(split_nodes) + return new_nodes - return final_node_list + +def split_nodes_image(old_nodes): + new_nodes = [] + for old_node in old_nodes: + images = extract_markdown_images(old_node.text) + if old_node.text_type != "text" or len(images) == 0: + new_nodes.append(old_node) + continue + if len(old_node.text) == 0: + continue + split_nodes = [] + original_text = old_node.text + sections = [] + for i in range(len(images)): + section = original_text.split(f"![{images[i][0]}]({images[i][1]})", 1) + if len(section) != 2: + raise ValueError("Invalid markdown, image section not closed") + sections.append(section[0]) + sections.append(images[i]) + if i+1 is len(images): + sections.append(section[1]) + else: + original_text = section[1] + for i in range(len(sections)): + if sections[i] == "": + continue + if isinstance(sections[i], str): + split_nodes.append(TextNode(sections[i], "text")) + else: + split_nodes.append(TextNode(sections[i][0], "image", sections[i][1])) + new_nodes.extend(split_nodes) + return new_nodes + +def split_nodes_link(old_nodes): + new_nodes = [] + for old_node in old_nodes: + links = extract_markdown_links(old_node.text) + if old_node.text_type != "text" or len(links) == 0: + new_nodes.append(old_node) + continue + if len(old_node.text) == 0: + continue + split_nodes = [] + original_text = old_node.text + sections = [] + for i in range(len(links)): + section = original_text.split(f"[{links[i][0]}]({links[i][1]})", 1) + if len(section) != 2: + raise ValueError("Invalid markdown, link section not closed") + sections.append(section[0]) + sections.append(links[i]) + if i+1 is len(links): + sections.append(section[1]) + else: + original_text = section[1] + for i in range(len(sections)): + if sections[i] == "": + continue + if isinstance(sections[i], str): + split_nodes.append(TextNode(sections[i], "text")) + else: + split_nodes.append(TextNode(sections[i][0], "link", sections[i][1])) + new_nodes.extend(split_nodes) + return new_nodes def extract_markdown_images(text): @@ -31,3 +95,12 @@ def extract_markdown_images(text): def extract_markdown_links(text): return re.findall(r"\[(.*?)\]\((.*?)\)", text) + + +node_image_first = TextNode( + "![image](https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/zjjcJKZ.png) and another ![second image](https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/3elNhQu.png). Isn't this awesome!", + "text" + ), + +new_node = split_nodes_image(node_image_first) +print(new_node) \ No newline at end of file diff --git a/src/test_inline_markdown.py b/src/test_inline_markdown.py index 52ec859..2125234 100644 --- a/src/test_inline_markdown.py +++ b/src/test_inline_markdown.py @@ -1,9 +1,9 @@ import unittest from inline_markdown import (extract_markdown_images, extract_markdown_links, - split_nodes_delimiter) + split_nodes_delimiter, split_nodes_image, split_nodes_link) from textnode import (TextNode, text_type_bold, text_type_code, - text_type_italic, text_type_text) + text_type_italic, text_type_text, text_type_image, text_type_link) class TestInlineMarkdown(unittest.TestCase): @@ -73,6 +73,103 @@ class TestInlineMarkdown(unittest.TestCase): new_nodes, ) + def test_delim_images(self): + no_images = TextNode("There are no images in this text", text_type_text) + no_images_answer = split_nodes_image([no_images]) + self.assertEqual( + [ + TextNode("There are no images in this text", text_type_text) + ], + no_images_answer + ) + + node = TextNode( + "This is text with an ![image](https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/zjjcJKZ.png) and another ![second image](https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/3elNhQu.png)", + text_type_text, + ) + new_nodes = split_nodes_image([node]) + self.assertEqual( + [ + TextNode("This is text with an ", text_type_text), + TextNode("image", text_type_image, "https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/zjjcJKZ.png"), + TextNode(" and another ", text_type_text), + TextNode( + "second image", text_type_image, "https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/3elNhQu.png" + ), + ], + new_nodes, + ) + + node_with_extra_content = TextNode( + "This is text with an ![image](https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/zjjcJKZ.png) and another ![second image](https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/3elNhQu.png). Isn't this awesome!", + text_type_text, + ) + + new_nodes_extra = split_nodes_image([node_with_extra_content]) + self.assertEqual( + [ + TextNode("This is text with an ", text_type_text), + TextNode("image", text_type_image, "https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/zjjcJKZ.png"), + TextNode(" and another ", text_type_text), + TextNode( + "second image", text_type_image, "https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/3elNhQu.png" + ), + TextNode(". Isn't this awesome!", text_type_text), + ], + new_nodes_extra, + ) + + node_image_first = TextNode( + "![image](https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/zjjcJKZ.png) and another ![second image](https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/3elNhQu.png). Isn't this awesome!", + text_type_text + ) + new_node_image_first = split_nodes_image([node_image_first]) + self.assertEqual( + [ + TextNode("image", text_type_image, "https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/zjjcJKZ.png"), + TextNode(" and another ", text_type_text), + TextNode( + "second image", text_type_image, "https://storage.googleapis.com/qvault-webapp-dynamic-assets/course_assets/3elNhQu.png" + ), + TextNode(". Isn't this awesome!", text_type_text), + ], + new_node_image_first, + ) + + def test_delim_links(self): + node = TextNode( + "This is a website with [Google](https://www.google.com) and another [Games Database](https://games.linuxhg.com)", + text_type_text, + ) + new_nodes = split_nodes_link([node]) + self.assertEqual( + [ + TextNode("This is a website with ", text_type_text), + TextNode("Google", text_type_link, "https://www.google.com"), + TextNode(" and another ", text_type_text), + TextNode("Games Database", text_type_link, "https://games.linuxhg.com"), + ], + new_nodes, + ) + + node_with_extra_content = TextNode( + "This is a website with [Google](https://www.google.com) and another [Games Database](https://games.linuxhg.com). Isn't this awesome!", + text_type_text, + ) + + new_nodes_extra = split_nodes_link([node_with_extra_content]) + self.assertEqual( + [ + TextNode("This is a website with ", text_type_text), + TextNode("Google", text_type_link, "https://www.google.com"), + TextNode(" and another ", text_type_text), + TextNode("Games Database", text_type_link, "https://games.linuxhg.com"), + TextNode(". Isn't this awesome!", text_type_text), + ], + new_nodes_extra, + ) + + def test_extract_markdown_images(self): matches = extract_markdown_images(