created split images and split nodes

This commit is contained in:
John O'Keefe 2024-04-18 15:41:53 -04:00
parent d690cb6871
commit 139a70db51
2 changed files with 189 additions and 19 deletions

View File

@ -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)

View File

@ -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(