From 82228fdb27995942ecfd32f37cb705835ad5ba42 Mon Sep 17 00:00:00 2001
From: Henrik Jess Nielsen
Date: Wed, 11 Dec 2024 23:56:15 +0100
Subject: [PATCH 1/2] Lets test
---
app.py | 103 +-----------------
app/__init__.py | 0
app/controllers/__init__.py | 0
app/controllers/category_controller.py | 56 ++++++++++
app/controllers/dynamic_controller.py | 65 +++++++++++
app/main.py | 53 +++++++++
app/services/__init__.py | 0
app/services/markdown_processor.py | 87 +++++++++++++++
.../services/markdown_render.py | 33 ++++--
app/services/metadata_processor.py | 83 ++++++++++++++
data/bolig/index.html | 1 -
data/bolig/lidt_omkring_boliger.html | 10 --
data/bolig/lidt_omkring_boliger.md | 18 +--
data/job/det_ved_jeg_om_job.html | 7 --
data/job/det_ved_jeg_om_job.md | 10 ++
data/job/index.html | 16 ++-
data/kontor/lidt_om_kontore.md | 16 +++
data/skat/index.html | 1 -
data/skat/portugal_vs_dansk_skat.md | 13 +++
data/skole/index.html | 1 -
data/skole/skole.md | 17 +++
.../convert_markdown_to_html.py | 2 +-
depricated/markdown_service.py | 25 +++++
depricated/mock_data.json | 13 +++
.../test_markdown_render.py | 2 +-
mock_data.json | 50 +++++++--
templates/combined_template.html | 14 +++
27 files changed, 545 insertions(+), 151 deletions(-)
create mode 100644 app/__init__.py
create mode 100644 app/controllers/__init__.py
create mode 100644 app/controllers/category_controller.py
create mode 100644 app/controllers/dynamic_controller.py
create mode 100644 app/main.py
create mode 100644 app/services/__init__.py
create mode 100644 app/services/markdown_processor.py
rename markdown_render.py => app/services/markdown_render.py (51%)
create mode 100644 app/services/metadata_processor.py
delete mode 100644 data/bolig/index.html
delete mode 100644 data/bolig/lidt_omkring_boliger.html
delete mode 100644 data/job/det_ved_jeg_om_job.html
create mode 100644 data/kontor/lidt_om_kontore.md
delete mode 100644 data/skat/index.html
create mode 100644 data/skat/portugal_vs_dansk_skat.md
delete mode 100644 data/skole/index.html
create mode 100644 data/skole/skole.md
rename convert_markdown_to_html.py => depricated/convert_markdown_to_html.py (96%)
create mode 100644 depricated/markdown_service.py
create mode 100644 depricated/mock_data.json
rename test_markdown_render.py => depricated/test_markdown_render.py (83%)
create mode 100644 templates/combined_template.html
diff --git a/app.py b/app.py
index 8d56901..63de10b 100644
--- a/app.py
+++ b/app.py
@@ -1,100 +1,5 @@
-from fastapi import FastAPI, Request
-from fastapi.staticfiles import StaticFiles
-from fastapi.templating import Jinja2Templates
-from fastapi.responses import HTMLResponse
-from contextlib import asynccontextmanager
-import json
-import os
-from markdown_render import render_markdown_with_jinja
+import uvicorn
+from app.main import app
-
-class App:
- def __init__(self):
- """Initialize the FastAPI app."""
- self.app = FastAPI(lifespan=self.lifespan)
- self.templates = Jinja2Templates(directory="templates")
- self.data = self.load_mock_data()
-
- # Mount directories
- self.app.mount("/data", StaticFiles(directory="data"), name="data")
- self.app.mount("/static", StaticFiles(directory="static"), name="static")
-
- # Add routes
- self.add_routes()
-
- # 1. Lifespan events
- @asynccontextmanager
- async def lifespan(self, app: FastAPI):
- print("App startup: Processing Markdown files...")
- self.process_markdown_files("./data", "./data") # Process all Markdown files
- print("Markdown processing complete!")
- yield # Allow the app to start
- print("App shutdown: Cleanup complete.")
-
- # 2. Load JSON data
- def load_mock_data(self):
- """Load mock data from a JSON file."""
- with open("mock_data.json") as file:
- return json.load(file)
-
- # 3. Markdown processing logic
- @staticmethod
- def process_markdown_files(input_dir: str, output_dir: str):
- """
- Recursively process all Markdown files in the input directory,
- render them to HTML, and save them in the output directory.
- """
- for root, _, files in os.walk(input_dir):
- for file in files:
- if file.endswith(".md"):
- input_file_path = os.path.join(root, file)
- relative_path = os.path.relpath(input_file_path, input_dir)
- output_file_path = os.path.join(output_dir, os.path.splitext(relative_path)[0] + ".html")
-
- os.makedirs(os.path.dirname(output_file_path), exist_ok=True)
-
- with open(input_file_path, "r", encoding="utf-8") as md_file:
- markdown_content = md_file.read()
-
- print(f"Processing: {input_file_path} -> {output_file_path}")
- rendered_html = render_markdown_with_jinja(markdown_content)
-
- with open(output_file_path, "w", encoding="utf-8") as html_file:
- html_file.write(rendered_html)
-
- # 4. Routes
- def add_routes(self):
- """Add all routes to the FastAPI app."""
- @self.app.get("/", response_class=HTMLResponse)
- async def get_index(request: Request):
- """Index route."""
- return self.templates.TemplateResponse(
- "index.html",
- {"request": request, "data": self.data, "page_title": "Forside", "author": "Henrik"},
- )
-
- @self.app.get("/category/{category_name}", response_class=HTMLResponse)
- async def get_category(request: Request, category_name: str):
- """Category route."""
- category = next((cat for cat in self.data["categories"] if cat["path"] == category_name), None)
- if category:
- category_file = f"data/{category_name}/index.html"
- if os.path.exists(category_file):
- with open(category_file) as file:
- category_content = file.read()
- return self.templates.TemplateResponse(
- "category.html",
- {
- "request": request,
- "data": self.data,
- "page_title": category["name"],
- "author": category["author"],
- "content": category_content,
- },
- )
- return HTMLResponse("Kategori ikke fundet", status_code=404)
-
-
-# Create the app instance
-app_instance = App()
-app = app_instance.app
+if __name__ == "__main__":
+ uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
diff --git a/app/__init__.py b/app/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/app/controllers/__init__.py b/app/controllers/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/app/controllers/category_controller.py b/app/controllers/category_controller.py
new file mode 100644
index 0000000..211c27f
--- /dev/null
+++ b/app/controllers/category_controller.py
@@ -0,0 +1,56 @@
+import os
+import json
+from fastapi import APIRouter, Request
+from fastapi.responses import HTMLResponse
+from fastapi.templating import Jinja2Templates
+
+
+class CategoryController:
+ def __init__(self):
+ """Initialize the controller."""
+ self.router = APIRouter()
+ self.templates = Jinja2Templates(directory="templates")
+ self.data = self._load_mock_data()
+ self._add_routes()
+
+ def _load_mock_data(self):
+ """Load mock data from a JSON file."""
+ with open("mock_data.json") as file:
+ return json.load(file)
+
+ def _add_routes(self):
+ """Add routes to the router."""
+ self.router.add_api_route("/", self.get_index, methods=["GET"], response_class=HTMLResponse)
+ self.router.add_api_route(
+ "/category/{category_name}",
+ self.get_category,
+ methods=["GET"],
+ response_class=HTMLResponse,
+ )
+
+ async def get_index(self, request: Request):
+ """Index route."""
+ return self.templates.TemplateResponse(
+ "index.html",
+ {"request": request, "data": self.data, "page_title": "Forside", "author": "Henrik"},
+ )
+
+ async def get_category(self, request: Request, category_name: str):
+ """Category route."""
+ category = next((cat for cat in self.data["categories"] if cat["path"] == category_name), None)
+ if category:
+ category_file = f"data/{category_name}/index.html"
+ if os.path.exists(category_file):
+ with open(category_file) as file:
+ category_content = file.read()
+ return self.templates.TemplateResponse(
+ "category.html",
+ {
+ "request": request,
+ "data": self.data,
+ "page_title": category["name"],
+ "author": category["author"],
+ "content": category_content,
+ },
+ )
+ return HTMLResponse("Kategori ikke fundet", status_code=404)
diff --git a/app/controllers/dynamic_controller.py b/app/controllers/dynamic_controller.py
new file mode 100644
index 0000000..cdc3c76
--- /dev/null
+++ b/app/controllers/dynamic_controller.py
@@ -0,0 +1,65 @@
+import os
+import json
+from fastapi import APIRouter, Request
+from fastapi.responses import HTMLResponse, Response
+from fastapi.templating import Jinja2Templates
+
+class DynamicController:
+ def __init__(self, data_dir: str):
+ """Initialize the dynamic controller."""
+ self.router = APIRouter()
+ self.templates = Jinja2Templates(directory="templates")
+ self.data_dir = data_dir
+ self.data = self._load_mock_data()
+ self._add_dynamic_routes()
+
+ def _load_mock_data(self):
+ """Load mock data from a JSON file."""
+ with open("mock_data.json") as file:
+ return json.load(file)
+
+ def _add_dynamic_routes(self):
+ """Scan data directory and create dynamic routes."""
+ for root, dirs, files in os.walk(self.data_dir):
+ for directory in dirs:
+ route_path = f"/{directory}" # Create route based on directory name
+ directory_path = os.path.join(root, directory)
+
+ # Register route dynamically
+ self.router.add_api_route(
+ route_path,
+ self._serve_dynamic_template(directory, directory_path),
+ methods=["GET"],
+ response_class=HTMLResponse,
+ )
+
+ def _serve_dynamic_template(self, route_name: str, directory_path: str):
+ """Closure to serve templates for each route."""
+
+ async def route_handler(request: Request):
+ # Look for index.html or render fallback content
+ index_html = os.path.join(directory_path, "index.html")
+ if os.path.exists(index_html):
+ with open(index_html, "r", encoding="utf-8") as file:
+ content = file.read()
+ # Find the author for this route from preloaded data
+ for category in self.data.get("categories", []):
+ if category["path"] == route_name:
+ author_name = category["author"]
+ break
+ # Pass required data to the template
+ return self.templates.TemplateResponse(
+ "category.html",
+ {
+ "request": request,
+ "page_title": route_name.capitalize(),
+ "content": content,
+ "author": author_name,
+ "data": self.data, # Pass additional data if needed
+ },
+ )
+
+ # Fallback: Return a 404 if no content is found
+ return Response(f"No content found for {route_name}", status_code=404)
+
+ return route_handler
diff --git a/app/main.py b/app/main.py
new file mode 100644
index 0000000..8edb055
--- /dev/null
+++ b/app/main.py
@@ -0,0 +1,53 @@
+from fastapi import FastAPI
+from contextlib import asynccontextmanager
+from fastapi.staticfiles import StaticFiles
+from app.services.markdown_processor import MarkdownProcessor
+from app.services.metadata_processor import MetadataProcessor
+from app.controllers.dynamic_controller import DynamicController
+from app.controllers.category_controller import CategoryController
+
+
+class Application:
+ def __init__(self):
+ """Initialize the FastAPI app and configure it."""
+ self.app = FastAPI(lifespan=self._lifespan_event)
+ self._setup_static_files()
+ self._include_routers()
+
+ @asynccontextmanager
+ async def _lifespan_event(self, app: FastAPI):
+ """Lifespan event for startup and shutdown logic."""
+ print("App startup: Processing Markdown files...")
+ # Process Markdown files into HTML
+ processor = MarkdownProcessor(input_dir="./data", templates_dir="./templates")
+ processor.run()
+
+ # Generate dynamic JSON data
+ metadata_processor = MetadataProcessor(input_dir="./data", output_file="generated_data.json")
+ metadata_processor.generate_json()
+ print("Generated dynamic data file.")
+ print("Markdown processing complete!")
+
+ yield
+ print("App shutdown: Cleanup complete.")
+
+ def _setup_static_files(self):
+ """Mount static file directories."""
+ self.app.mount("/data", StaticFiles(directory="data"), name="data")
+ self.app.mount("/static", StaticFiles(directory="static"), name="static")
+
+ def _include_routers(self):
+ """Include all route controllers."""
+ category_controller = CategoryController()
+ dynamic_controller = DynamicController("./data")
+
+ self.app.include_router(category_controller.router)
+ self.app.include_router(dynamic_controller.router)
+
+ def get_app(self):
+ """Return the FastAPI app instance."""
+ return self.app
+
+
+application = Application()
+app = application.get_app()
diff --git a/app/services/__init__.py b/app/services/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/app/services/markdown_processor.py b/app/services/markdown_processor.py
new file mode 100644
index 0000000..ab9ee32
--- /dev/null
+++ b/app/services/markdown_processor.py
@@ -0,0 +1,87 @@
+import os
+from app.services.markdown_render import render_markdown_with_jinja # Your custom renderer
+from jinja2 import Environment, FileSystemLoader
+
+
+class MarkdownProcessor:
+ """
+ A class to process Markdown files, extract metadata, and generate a single
+ 'index.html' per category directory using a custom rendering engine.
+ """
+
+ def __init__(self, input_dir: str, templates_dir: str):
+ """
+ Initialize the MarkdownProcessor.
+
+ Args:
+ input_dir (str): Root directory containing category subdirectories.
+ templates_dir (str): Directory containing Jinja2 templates.
+ """
+ self.input_dir = input_dir
+ self.env = Environment(loader=FileSystemLoader(templates_dir))
+
+ def _process_markdown_files_in_directory(self, directory_path: str) -> list:
+ """
+ Process all Markdown files in a directory using Markdown and Jinja2 custom tags.
+
+ Args:
+ directory_path (str): Path to the category directory.
+
+ Returns:
+ list: A list of processed sections containing metadata and rendered content.
+ """
+ sections = []
+ for file in sorted(os.listdir(directory_path)):
+ if file.endswith(".md"):
+ file_path = os.path.join(directory_path, file)
+ with open(file_path, "r", encoding="utf-8") as md_file:
+ markdown_content = md_file.read()
+
+ # Process Markdown and Jinja2
+ rendered_content, metadata = render_markdown_with_jinja(markdown_content)
+
+ # Append the section to the list
+ sections.append({
+ "name": metadata.get("title", "Untitled"),
+ "content": rendered_content,
+ "summary": metadata.get("summary", ""),
+ "author": metadata.get("author", "Unknown"),
+ })
+
+ return sections
+
+ def _generate_index_html(self, directory_path: str, sections: list, output_file: str):
+ """
+ Generate the index.html file for a category using the combined sections.
+
+ Args:
+ directory_path (str): Path to the category directory.
+ sections (list): List of processed Markdown content and metadata.
+ output_file (str): Path to save the generated index.html.
+ """
+ # Render the template with the combined sections
+ template = self.env.get_template("combined_template.html")
+ rendered_html = template.render(
+ title=os.path.basename(directory_path).capitalize(),
+ sections=sections
+ )
+
+ # Write the rendered HTML to index.html
+ os.makedirs(directory_path, exist_ok=True)
+ with open(output_file, "w", encoding="utf-8") as output:
+ output.write(rendered_html)
+ print(f"Generated: {output_file}")
+
+ def run(self):
+ """
+ Run the Markdown processing workflow: one 'index.html' per category.
+ """
+ for root, dirs, _ in os.walk(self.input_dir):
+ for directory in dirs:
+ category_path = os.path.join(root, directory)
+ output_file = os.path.join(category_path, "index.html")
+
+ # Process all Markdown files in the current category directory
+ sections = self._process_markdown_files_in_directory(category_path)
+ if sections:
+ self._generate_index_html(category_path, sections, output_file)
diff --git a/markdown_render.py b/app/services/markdown_render.py
similarity index 51%
rename from markdown_render.py
rename to app/services/markdown_render.py
index 7731b1b..5091602 100644
--- a/markdown_render.py
+++ b/app/services/markdown_render.py
@@ -1,6 +1,7 @@
-from jinja2 import Environment, FileSystemLoader
import markdown
+from jinja2 import Environment, DictLoader
+# Define Jinja2 custom functions
def img_left_overlay(src):
"""Render an image with overlay."""
return f'''
@@ -35,9 +36,9 @@ def warning(content):
'''
-def create_jinja_environment(template_dir="templates"):
+def create_jinja_environment():
"""Set up Jinja2 environment and register custom components."""
- env = Environment(loader=FileSystemLoader(template_dir))
+ env = Environment(loader=DictLoader({"base_template": "{{ content | safe }}"}))
env.globals.update({
"img_left_overlay": img_left_overlay,
"box": box,
@@ -46,14 +47,24 @@ def create_jinja_environment(template_dir="templates"):
})
return env
-def render_markdown_with_jinja(markdown_content, template_data=None):
- """Process Markdown first, then inject Jinja2 components."""
- # Step 1: Convert Markdown to HTML
- md_html = markdown.markdown(markdown_content, extensions=['extra', 'nl2br'])
+def render_markdown_with_jinja(markdown_content: str):
+ """
+ Convert Markdown to HTML and apply Jinja2 rendering for custom tags.
- # Step 2: Use Jinja2 to inject components into the already-rendered HTML
+ Args:
+ markdown_content (str): Raw Markdown content.
+
+ Returns:
+ tuple: Rendered HTML content and metadata as a dictionary.
+ """
+ # Step 1: Convert Markdown to HTML and extract metadata
+ md = markdown.Markdown(extensions=["extra", "nl2br", "meta"])
+ html_content = md.convert(markdown_content)
+ metadata = {key: " ".join(value) for key, value in md.Meta.items()} if md.Meta else {}
+
+ # Step 2: Render the HTML with Jinja2 to apply custom tags
env = create_jinja_environment()
- template = env.from_string(md_html)
- rendered_html = template.render(template_data or {})
+ template = env.get_template("base_template")
+ final_html = template.render(content=html_content)
- return rendered_html
+ return final_html, metadata
diff --git a/app/services/metadata_processor.py b/app/services/metadata_processor.py
new file mode 100644
index 0000000..8b71fa4
--- /dev/null
+++ b/app/services/metadata_processor.py
@@ -0,0 +1,83 @@
+import os
+import markdown
+import json
+from typing import List, Dict
+
+
+class MetadataProcessor:
+ """
+ A class to scan Markdown files, extract front matter metadata,
+ and generate a structured JSON file.
+ """
+
+ def __init__(self, input_dir: str, output_file: str):
+ """
+ Initialize the MetadataProcessor.
+
+ Args:
+ input_dir (str): Directory containing Markdown files.
+ output_file (str): Path to save the generated JSON file.
+ """
+ self.input_dir = input_dir
+ self.output_file = output_file
+ self.data = {"categories": [], "favorites": []}
+
+ def _extract_metadata(self, file_path: str) -> Dict:
+ """
+ Extract front matter metadata using the 'markdown' package.
+
+ Args:
+ file_path (str): Path to the Markdown file.
+
+ Returns:
+ dict: A dictionary containing the extracted metadata.
+ """
+ with open(file_path, "r", encoding="utf-8") as file:
+ markdown_content = file.read()
+
+ # Initialize Markdown with meta extension
+ md = markdown.Markdown(extensions=["extra", "nl2br", "meta"])
+ md.convert(markdown_content)
+
+ # Metadata is stored in md.Meta as a dictionary of lists
+ meta = {key: " ".join(value) for key, value in md.Meta.items()} if md.Meta else {}
+ return meta
+
+ def _process_directory(self):
+ """
+ Recursively scan the input directory for Markdown files
+ and extract metadata to build the JSON structure.
+ """
+ for root, _, files in os.walk(self.input_dir):
+ for file in files:
+ if file.endswith(".md"):
+ file_path = os.path.join(root, file)
+ metadata = self._extract_metadata(file_path)
+
+ if metadata:
+ # Add to 'categories'
+ self.data["categories"].append({
+ "name": metadata.get("name", "Unknown"),
+ "path": os.path.relpath(root, self.input_dir).replace(os.sep, "/"),
+ "author": metadata.get("author", "Unknown")
+ })
+
+ # Add to 'favorites' if 'favorite' is true
+ if metadata.get("favorite") and metadata["favorite"].lower() == "true":
+ self.data["favorites"].append({
+ "name": metadata.get("name", "Unknown"),
+ "image": metadata.get("image", "images/default.jpg"),
+ "description": metadata.get("summary", "No description provided")
+ })
+
+ def generate_json(self):
+ """
+ Generate the JSON structure and save it to the output file.
+ """
+ self._process_directory()
+
+ # Save JSON to file
+ with open(self.output_file, "w", encoding="utf-8") as json_file:
+ json.dump(self.data, json_file, indent=4, ensure_ascii=False)
+
+ print(f"Generated JSON saved to {self.output_file}")
diff --git a/data/bolig/index.html b/data/bolig/index.html
deleted file mode 100644
index 402fca6..0000000
--- a/data/bolig/index.html
+++ /dev/null
@@ -1 +0,0 @@
- Lidt om Bolig
\ No newline at end of file
diff --git a/data/bolig/lidt_omkring_boliger.html b/data/bolig/lidt_omkring_boliger.html
deleted file mode 100644
index 90d9605..0000000
--- a/data/bolig/lidt_omkring_boliger.html
+++ /dev/null
@@ -1,10 +0,0 @@
-PortugalFAQ - Henriks og Erikas lille side
-
-BoligBolig Bolig Bolig - Hvor skal sengen placeres
-Nu bliver det spænde!
-
-
-
Dette er stadig en test side
-
-
-
\ No newline at end of file
diff --git a/data/bolig/lidt_omkring_boliger.md b/data/bolig/lidt_omkring_boliger.md
index b4a1eb0..f7e66c8 100644
--- a/data/bolig/lidt_omkring_boliger.md
+++ b/data/bolig/lidt_omkring_boliger.md
@@ -1,13 +1,17 @@
+---
+name: Generalt
+description: Hvem, hvad og hvor
+author: Henrik Jess
+date: ons 11 dec 22:16:13 CET 2024
+summary: Lidt omkring job situationen og hvordan det fungere
+favorite: true
+image: images/pic07.jpg
+---
-{% block title %}PortugalFAQ - Henriks og Erikas lille side{% endblock %}
-
-{% block content %}
-
-
-# BoligBolig Bolig Bolig - Hvor skal sengen placeres
+# Bolig Bolig Bolig Bolig - Hvor skal sengen placeres
Nu bliver det spænde!
{{ note("Dette er stadig en test side") }}
-{% endblock %}
\ No newline at end of file
+{img-left-overlay: images/my-cat.png}
diff --git a/data/job/det_ved_jeg_om_job.html b/data/job/det_ved_jeg_om_job.html
deleted file mode 100644
index 887024e..0000000
--- a/data/job/det_ved_jeg_om_job.html
+++ /dev/null
@@ -1,7 +0,0 @@
-Lidt mere info om job
-Der skal langt mere tekst her
-
-
-
\ No newline at end of file
diff --git a/data/job/det_ved_jeg_om_job.md b/data/job/det_ved_jeg_om_job.md
index 49baf7b..73d7325 100644
--- a/data/job/det_ved_jeg_om_job.md
+++ b/data/job/det_ved_jeg_om_job.md
@@ -1,3 +1,13 @@
+---
+name: Job
+description: Hvem, hvad og hvor
+author: Henrik Jess
+date: ons 11 dec 22:16:13 CET 2024
+summary: Lidt omkring job situationen og hvordan det fungere
+favorite: true
+image: images/pic04.jpg
+---
+
# Lidt mere info om job
Der skal langt mere tekst her
diff --git a/data/job/index.html b/data/job/index.html
index 7a19573..b1aab3c 100644
--- a/data/job/index.html
+++ b/data/job/index.html
@@ -1 +1,15 @@
- Lidt om job
\ No newline at end of file
+
+
+
+ Untitled
+ Summary: Lidt omkring job situationen og hvordan det fungere
+ Author: Henrik Jess
+
+
Lidt mere info om job
+
Der skal langt mere tekst her
+
{{ note("Husk alpha side") }}
+
+
+
+
+
diff --git a/data/kontor/lidt_om_kontore.md b/data/kontor/lidt_om_kontore.md
new file mode 100644
index 0000000..205b274
--- /dev/null
+++ b/data/kontor/lidt_om_kontore.md
@@ -0,0 +1,16 @@
+---
+name: Job
+description: Kontorfælleskaber osv
+author: Henrik Jess
+date: today
+summary: Lad os snakke kontor fælleskaber
+favorite: false
+image: images/pic05.jpg
+---
+
+# Kontorfællesskab!
+
+Der skal langt mere tekst her
+
+
+{{ note("Husk alpha side") }}
\ No newline at end of file
diff --git a/data/skat/index.html b/data/skat/index.html
deleted file mode 100644
index b3fad0c..0000000
--- a/data/skat/index.html
+++ /dev/null
@@ -1 +0,0 @@
- Lidt om skat
\ No newline at end of file
diff --git a/data/skat/portugal_vs_dansk_skat.md b/data/skat/portugal_vs_dansk_skat.md
new file mode 100644
index 0000000..a6db716
--- /dev/null
+++ b/data/skat/portugal_vs_dansk_skat.md
@@ -0,0 +1,13 @@
+---
+name: Skat
+description: SKAT,SKAT, SKAT - Det skal betales den slags
+author: Henrik Jess
+date: today
+summary: Jeg er langt fra expert, men her er lidt hvad jeg har indsamlet omkring skat
+favorite: false
+image: images/pic07.jpg
+---
+
+# Skat! - Det skal jo også være sjovt og leve
+
+dette er mere tekst omkring skat
\ No newline at end of file
diff --git a/data/skole/index.html b/data/skole/index.html
deleted file mode 100644
index 0af5540..0000000
--- a/data/skole/index.html
+++ /dev/null
@@ -1 +0,0 @@
- Lidt om skole
\ No newline at end of file
diff --git a/data/skole/skole.md b/data/skole/skole.md
new file mode 100644
index 0000000..b56fb23
--- /dev/null
+++ b/data/skole/skole.md
@@ -0,0 +1,17 @@
+---
+name: Skole
+description: Skole, ny kultur og menesker
+author: Erika Nielsen
+date: today
+summary: Nørj det er lidt spændende..
+favorite: false
+image: images/pic07.jpg
+---
+
+# Skole start!
+
+dette er mere tekst omkring skole
+
+# Skole efter lidt tid
+
+HA!
diff --git a/convert_markdown_to_html.py b/depricated/convert_markdown_to_html.py
similarity index 96%
rename from convert_markdown_to_html.py
rename to depricated/convert_markdown_to_html.py
index 94a3cbe..f05ea83 100644
--- a/convert_markdown_to_html.py
+++ b/depricated/convert_markdown_to_html.py
@@ -1,5 +1,5 @@
import os
-from markdown_render import render_markdown_with_jinja
+from app.services.markdown_render import render_markdown_with_jinja
def process_markdown_files(input_dir: str, output_dir: str):
"""
diff --git a/depricated/markdown_service.py b/depricated/markdown_service.py
new file mode 100644
index 0000000..b2f4fc9
--- /dev/null
+++ b/depricated/markdown_service.py
@@ -0,0 +1,25 @@
+import os
+from app.services.markdown_render import render_markdown_with_jinja
+
+def process_markdown_files(input_dir: str, output_dir: str):
+ """
+ Recursively process all Markdown files in the input directory,
+ render them to HTML, and save them in the output directory.
+ """
+ for root, _, files in os.walk(input_dir):
+ for file in files:
+ if file.endswith(".md"):
+ input_file_path = os.path.join(root, file)
+ relative_path = os.path.relpath(input_file_path, input_dir)
+ output_file_path = os.path.join(output_dir, os.path.splitext(relative_path)[0] + ".html")
+
+ os.makedirs(os.path.dirname(output_file_path), exist_ok=True)
+
+ with open(input_file_path, "r", encoding="utf-8") as md_file:
+ markdown_content = md_file.read()
+
+ print(f"Processing: {input_file_path} -> {output_file_path}")
+ rendered_html = render_markdown_with_jinja(markdown_content)
+
+ with open(output_file_path, "w", encoding="utf-8") as html_file:
+ html_file.write(rendered_html)
diff --git a/depricated/mock_data.json b/depricated/mock_data.json
new file mode 100644
index 0000000..59881d5
--- /dev/null
+++ b/depricated/mock_data.json
@@ -0,0 +1,13 @@
+{
+ "categories": [
+ {"name": "SKAT", "path": "skat", "author": "Henrik"},
+ {"name": "Skole", "path": "skole", "author": "Erika"},
+ {"name": "Bolig", "path": "bolig", "author": "Henrik"},
+ {"name": "Job", "path": "job", "author": "Henrik"}
+ ],
+ "favorites": [
+ {"name": "SKAT", "image": "images/pic07.jpg", "description": "Favorit Kategori"},
+ {"name": "Skole", "image": "images/pic08.jpg", "description": "Skole information"},
+ {"name": "Bolig", "image": "images/pic09.jpg", "description": "Bolig detaljer"}
+ ]
+}
\ No newline at end of file
diff --git a/test_markdown_render.py b/depricated/test_markdown_render.py
similarity index 83%
rename from test_markdown_render.py
rename to depricated/test_markdown_render.py
index 535eb51..d71869a 100644
--- a/test_markdown_render.py
+++ b/depricated/test_markdown_render.py
@@ -1,4 +1,4 @@
-from markdown_render import MarkdownRenderer
+from app.services.markdown_render import MarkdownRenderer
# Initialize MarkdownRenderer
renderer = MarkdownRenderer()
diff --git a/mock_data.json b/mock_data.json
index 59881d5..36d3be2 100644
--- a/mock_data.json
+++ b/mock_data.json
@@ -1,13 +1,41 @@
{
- "categories": [
- {"name": "SKAT", "path": "skat", "author": "Henrik"},
- {"name": "Skole", "path": "skole", "author": "Erika"},
- {"name": "Bolig", "path": "bolig", "author": "Henrik"},
- {"name": "Job", "path": "job", "author": "Henrik"}
- ],
- "favorites": [
- {"name": "SKAT", "image": "images/pic07.jpg", "description": "Favorit Kategori"},
- {"name": "Skole", "image": "images/pic08.jpg", "description": "Skole information"},
- {"name": "Bolig", "image": "images/pic09.jpg", "description": "Bolig detaljer"}
- ]
+ "categories": [
+ {
+ "name": "Skole",
+ "path": "skole",
+ "author": "Erika Nielsen"
+ },
+ {
+ "name": "Generalt",
+ "path": "bolig",
+ "author": "Henrik Jess"
+ },
+ {
+ "name": "Job",
+ "path": "job",
+ "author": "Henrik Jess"
+ },
+ {
+ "name": "Skat",
+ "path": "skat",
+ "author": "Henrik Jess"
+ },
+ {
+ "name": "Job",
+ "path": "kontor",
+ "author": "Henrik Jess"
+ }
+ ],
+ "favorites": [
+ {
+ "name": "Generalt",
+ "image": "images/pic07.jpg",
+ "description": "Lidt omkring job situationen og hvordan det fungere"
+ },
+ {
+ "name": "Job",
+ "image": "images/pic04.jpg",
+ "description": "Lidt omkring job situationen og hvordan det fungere"
+ }
+ ]
}
\ No newline at end of file
diff --git a/templates/combined_template.html b/templates/combined_template.html
new file mode 100644
index 0000000..c7282df
--- /dev/null
+++ b/templates/combined_template.html
@@ -0,0 +1,14 @@
+
+ {% for section in sections %}
+
+ {{ section.name }}
+ Summary: {{ section.summary }}
+ Author: {{ section.author }}
+
+ {{ section.content | safe }}
+
+
+
+ {% endfor %}
+
+
From e4887345a5984f9ebfd7eae568363c7db85aa590 Mon Sep 17 00:00:00 2001
From: Henrik Jess Nielsen
Date: Wed, 11 Dec 2024 23:56:30 +0100
Subject: [PATCH 2/2] Lets test
---
data/bolig/index.html | 16 ++++++++++++++++
data/kontor/index.html | 15 +++++++++++++++
data/skat/index.html | 14 ++++++++++++++
data/skole/index.html | 16 ++++++++++++++++
generated_data.json | 41 +++++++++++++++++++++++++++++++++++++++++
5 files changed, 102 insertions(+)
create mode 100644 data/bolig/index.html
create mode 100644 data/kontor/index.html
create mode 100644 data/skat/index.html
create mode 100644 data/skole/index.html
create mode 100644 generated_data.json
diff --git a/data/bolig/index.html b/data/bolig/index.html
new file mode 100644
index 0000000..98acbf6
--- /dev/null
+++ b/data/bolig/index.html
@@ -0,0 +1,16 @@
+
+
+
+ Untitled
+ Summary: Lidt omkring job situationen og hvordan det fungere
+ Author: Henrik Jess
+
+
Bolig Bolig Bolig Bolig - Hvor skal sengen placeres
+
Nu bliver det spænde!
+
{{ note("Dette er stadig en test side") }}
+
{img-left-overlay: images/my-cat.png}
+
+
+
+
+
diff --git a/data/kontor/index.html b/data/kontor/index.html
new file mode 100644
index 0000000..23517e0
--- /dev/null
+++ b/data/kontor/index.html
@@ -0,0 +1,15 @@
+
+
+
+ Untitled
+ Summary: Lad os snakke kontor fælleskaber
+ Author: Henrik Jess
+
+
Kontorfællesskab!
+
Der skal langt mere tekst her
+
{{ note("Husk alpha side") }}
+
+
+
+
+
diff --git a/data/skat/index.html b/data/skat/index.html
new file mode 100644
index 0000000..d5053e2
--- /dev/null
+++ b/data/skat/index.html
@@ -0,0 +1,14 @@
+
+
+
+ Untitled
+ Summary: Jeg er langt fra expert, men her er lidt hvad jeg har indsamlet omkring skat
+ Author: Henrik Jess
+
+
Skat! - Det skal jo også være sjovt og leve
+
dette er mere tekst omkring skat
+
+
+
+
+
diff --git a/data/skole/index.html b/data/skole/index.html
new file mode 100644
index 0000000..24a7e2b
--- /dev/null
+++ b/data/skole/index.html
@@ -0,0 +1,16 @@
+
+
+
+ Untitled
+ Summary: Nørj det er lidt spændende..
+ Author: Erika Nielsen
+
+
Skole start!
+
dette er mere tekst omkring skole
+
Skole efter lidt tid
+
HA!
+
+
+
+
+
diff --git a/generated_data.json b/generated_data.json
new file mode 100644
index 0000000..36d3be2
--- /dev/null
+++ b/generated_data.json
@@ -0,0 +1,41 @@
+{
+ "categories": [
+ {
+ "name": "Skole",
+ "path": "skole",
+ "author": "Erika Nielsen"
+ },
+ {
+ "name": "Generalt",
+ "path": "bolig",
+ "author": "Henrik Jess"
+ },
+ {
+ "name": "Job",
+ "path": "job",
+ "author": "Henrik Jess"
+ },
+ {
+ "name": "Skat",
+ "path": "skat",
+ "author": "Henrik Jess"
+ },
+ {
+ "name": "Job",
+ "path": "kontor",
+ "author": "Henrik Jess"
+ }
+ ],
+ "favorites": [
+ {
+ "name": "Generalt",
+ "image": "images/pic07.jpg",
+ "description": "Lidt omkring job situationen og hvordan det fungere"
+ },
+ {
+ "name": "Job",
+ "image": "images/pic04.jpg",
+ "description": "Lidt omkring job situationen og hvordan det fungere"
+ }
+ ]
+}
\ No newline at end of file