added recursive page generation
This commit is contained in:
parent
4a07aec860
commit
d865326ee4
6 changed files with 146 additions and 2 deletions
32
content/index.md
Normal file
32
content/index.md
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
# Tolkien Fan Club
|
||||||
|
|
||||||
|
**I like Tolkien**. Read my [first post here](/majesty) (sorry the link doesn't work yet)
|
||||||
|
|
||||||
|
> All that is gold does not glitter
|
||||||
|
|
||||||
|
## Reasons I like Tolkien
|
||||||
|
|
||||||
|
* You can spend years studying the legendarium and still not understand its depths
|
||||||
|
* It can be enjoyed by children and adults alike
|
||||||
|
* Disney *didn't ruin it*
|
||||||
|
* It created an entirely new genre of fantasy
|
||||||
|
|
||||||
|
## My favorite characters (in order)
|
||||||
|
|
||||||
|
1. Gandalf
|
||||||
|
2. Bilbo
|
||||||
|
3. Sam
|
||||||
|
4. Glorfindel
|
||||||
|
5. Galadriel
|
||||||
|
6. Elrond
|
||||||
|
7. Thorin
|
||||||
|
8. Sauron
|
||||||
|
9. Aragorn
|
||||||
|
|
||||||
|
Here's what `elflang` looks like (the perfect coding language):
|
||||||
|
|
||||||
|
```
|
||||||
|
func main(){
|
||||||
|
fmt.Println("Hello, World!")
|
||||||
|
}
|
||||||
|
```
|
||||||
18
content/nested/test.md
Normal file
18
content/nested/test.md
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
# My First Blog Post
|
||||||
|
|
||||||
|
Welcome to my **fantastic** blog! I hope you enjoy your stay.
|
||||||
|
|
||||||
|
## Things I Like
|
||||||
|
|
||||||
|
* Coding
|
||||||
|
* Writing
|
||||||
|
* Making static sites
|
||||||
|
|
||||||
|
> Every journey begins with a single static page
|
||||||
|
|
||||||
|
Here's a sample of my favorite code:
|
||||||
|
|
||||||
|
```python
|
||||||
|
def hello():
|
||||||
|
return "Welcome to my blog!"
|
||||||
|
```
|
||||||
1
main.sh
1
main.sh
|
|
@ -1 +1,2 @@
|
||||||
python3 src/main.py
|
python3 src/main.py
|
||||||
|
cd public && python3 -m http.server 8888
|
||||||
|
|
|
||||||
53
src/main.py
53
src/main.py
|
|
@ -2,6 +2,14 @@ from textnode import TextNode,TextType
|
||||||
from conversions import markdown_to_html_node
|
from conversions import markdown_to_html_node
|
||||||
import shutil
|
import shutil
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
def extract_title(markdown):
|
||||||
|
split = markdown.split("\n")
|
||||||
|
for item in split:
|
||||||
|
if item.startswith("# "):
|
||||||
|
return(item.strip("# "))
|
||||||
|
raise Exception("no title found")
|
||||||
|
|
||||||
def empty_public():
|
def empty_public():
|
||||||
dir_path = os.path.abspath("./public/")
|
dir_path = os.path.abspath("./public/")
|
||||||
|
|
@ -21,9 +29,50 @@ def copy_directory_recursive(src, dest):
|
||||||
# Recursively copy source directory to destination
|
# Recursively copy source directory to destination
|
||||||
shutil.copytree(src, dest)
|
shutil.copytree(src, dest)
|
||||||
|
|
||||||
|
def get_files_from_path_recursively(path):
|
||||||
|
files = []
|
||||||
|
for entry in os.scandir(path):
|
||||||
|
if entry.is_file():
|
||||||
|
files.append(entry.path) # Use full path
|
||||||
|
elif entry.is_dir():
|
||||||
|
# Recursively get files from subdirectory
|
||||||
|
files.extend(get_files_from_path_recursively(entry.path))
|
||||||
|
return files
|
||||||
|
|
||||||
|
def generate_page(from_path, template_path, dest_path):
|
||||||
|
for file_path in get_files_from_path_recursively(from_path):
|
||||||
|
match = re.search(r"content/(.*)", file_path)
|
||||||
|
if match:
|
||||||
|
relative_path = match.group(1)
|
||||||
|
|
||||||
|
print(f"Generating page from {file_path} to {dest_path}{re.sub(r'\.md$', '.html', relative_path)} using {template_path}")
|
||||||
|
|
||||||
|
# Read the markdown file
|
||||||
|
with open(file_path, 'r') as file:
|
||||||
|
md = file.read()
|
||||||
|
|
||||||
|
# Read the template
|
||||||
|
with open(template_path, 'r') as file:
|
||||||
|
template = file.read()
|
||||||
|
|
||||||
|
title = extract_title(md)
|
||||||
|
html = markdown_to_html_node(md).to_html()
|
||||||
|
|
||||||
|
final_html = template.replace("{{ Title }}", title)
|
||||||
|
final_html = final_html.replace("{{ Content }}", html)
|
||||||
|
|
||||||
|
# Create output directory if it doesn't exist
|
||||||
|
output_dir = os.path.dirname(f"{dest_path}/{relative_path}")
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
|
# Write the final HTML
|
||||||
|
with open(f"{dest_path}/{re.sub(r'\.md$', '.html', relative_path)}", "w") as f:
|
||||||
|
f.write(final_html)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
empty_public()
|
empty_public()
|
||||||
copy_directory_recursive("./static/","./public/")
|
copy_directory_recursive("./static/","./public/")
|
||||||
|
generate_page("./content/","./template.html","./public/")
|
||||||
|
|
||||||
if __name__=="__main__":
|
if __name__=="__main__":
|
||||||
main()
|
main()
|
||||||
|
|
|
||||||
27
src/test_main.py
Normal file
27
src/test_main.py
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
def test_extract_title():
|
||||||
|
# Basic case
|
||||||
|
assert extract_title("# Simple Title") == "Simple Title"
|
||||||
|
|
||||||
|
# Extra spaces case
|
||||||
|
assert extract_title("# Extra Spaces ") == " Extra Spaces "
|
||||||
|
|
||||||
|
# Multiple lines case
|
||||||
|
text = """# Main Title
|
||||||
|
## Subtitle
|
||||||
|
Some content
|
||||||
|
More content"""
|
||||||
|
assert extract_title(text) == "Main Title"
|
||||||
|
|
||||||
|
# Empty input
|
||||||
|
try:
|
||||||
|
extract_title("")
|
||||||
|
assert False, "Empty input should raise exception"
|
||||||
|
except Exception:
|
||||||
|
assert True
|
||||||
|
|
||||||
|
# Invalid headers
|
||||||
|
try:
|
||||||
|
extract_title("##Not a title\nJust some text")
|
||||||
|
assert False, "Invalid header should raise exception"
|
||||||
|
except Exception:
|
||||||
|
assert True
|
||||||
17
template.html
Normal file
17
template.html
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title> {{ Title }} </title>
|
||||||
|
<link href="/index.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<article>
|
||||||
|
{{ Content }}
|
||||||
|
</article>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue