diff --git a/README.md b/README.md index e69de29..5b0538d 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,5 @@ +# Overskrift + + +## underskrift + diff --git a/app.py b/app.py index 813b78a..17be332 100644 --- a/app.py +++ b/app.py @@ -4,14 +4,17 @@ from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates import json import os +from markdown_render import MarkdownRenderer + from starlette.middleware.httpsredirect import HTTPSRedirectMiddleware app = FastAPI() +md_renderer = MarkdownRenderer() # Mount static files app.mount("/static", StaticFiles(directory="static"), name="static") -app.add_middleware( HTTPSRedirectMiddleware ) +#app.add_middleware( HTTPSRedirectMiddleware ) # Templates directory templates = Jinja2Templates(directory="templates") @@ -20,6 +23,51 @@ templates = Jinja2Templates(directory="templates") with open("mock_data.json") as file: data = json.load(file) +@app.get("/test", response_class=HTMLResponse) +async def mark_test(): + markdown_content = """ + # Custom Tags Test + + Here is an image overlay: + {img-left-overlay: src=my-cat.png} + + Here is a box: + {box: title=Important, content=This is a reusable box.} + + And a note: + {note: content=This is a note for the user.} + + Warning section: + {warning: content=Pay attention to this warning!} + """ + + # Render Markdown content + rendered_html = md_renderer.render( markdown_content ) + + # Wrap in a basic template + template = f""" + + + + + + Markdown Tags + + + +
+ {rendered_html} +
+ + + """ + return HTMLResponse( content = template ) + # Index route @app.get("/", response_class=HTMLResponse) async def get_index(request: Request): @@ -28,6 +76,8 @@ async def get_index(request: Request): {"request": request, "data": data, "page_title": "Forside", "author": "Henrik"} ) + + # Category route @app.get("/category/{category_name}", response_class=HTMLResponse) async def get_category(request: Request, category_name: str): diff --git a/markdown_render.py b/markdown_render.py new file mode 100644 index 0000000..ef8aad4 --- /dev/null +++ b/markdown_render.py @@ -0,0 +1,101 @@ +from markdown_it import MarkdownIt +import re + +class MarkdownRenderer: + def render_img_left_overlay(self, params): + src = params.get("src", "") + return f''' +
+ Overlay Image +
Overlay Text
+
+ ''' + + def render_box(self, params): + title = params.get("title", "Box") + content = params.get("content", "") + return f''' +
+ {title} +

{content}

+
+ ''' + + def render_note(self, params): + content = params.get("content", "") + return f''' +
+

{content}

+
+ ''' + + def render_warning(self, params): + content = params.get("content", "") + return f''' +
+ ⚠️

{content}

+
+ ''' + + def __init__(self): + self.md = MarkdownIt() + self.TAG_RENDERERS = { + "img-left-overlay": self.render_img_left_overlay, + "box": self.render_box, + "note": self.render_note, + "warning": self.render_warning, + } + self._add_custom_tags_plugin() + print("Custom Markdown renderer initialized!") + + def _add_custom_tags_plugin(self): + def custom_tag_rule(state, silent): + # Match custom tags + pattern = r"^\{(\w+):\s*([^}]*)\}$" + line = state.src[state.pos:].strip() + print(f"Parsing line: '{line}'") # Debug current line + + match = re.match(pattern, line) + if not match: + print("No match for custom tag.") + return False + + tag_name = match.group(1) + params_raw = match.group(2) + print(f"Matched tag: {tag_name}, Params: {params_raw}") + + # Parse parameters + params = {} + for pair in params_raw.split(","): + if "=" in pair: + key, value = pair.split("=", 1) + params[key.strip()] = value.strip() + + # Check if the tag_name exists in TAG_RENDERERS + if tag_name in self.TAG_RENDERERS: + print(f"Tag '{tag_name}' found. Creating token...") + token = state.push("custom_tag", "", 0) + token.meta = {"tag_name": tag_name, "params": params} + state.pos += len(line) + return True + + print(f"Tag '{tag_name}' not found in TAG_RENDERERS.") + return False + + def render_custom_tag(tokens, idx, options, env, *args): + token = tokens[idx] + tag_name = token.meta["tag_name"] + params = token.meta["params"] + print(f"Rendering tag '{tag_name}' with params: {params}") + if tag_name in self.TAG_RENDERERS: + return self.TAG_RENDERERS[tag_name](params) + return "" + + # Register the plugin + self.md.inline.ruler.before("emphasis", "custom_tags", custom_tag_rule) + self.md.add_render_rule("custom_tag", render_custom_tag) + print("Custom tag plugin registered!") + + def render(self, markdown_content): + print("Rendering Markdown content...") + return self.md.render(markdown_content) \ No newline at end of file diff --git a/test_markdown_render.py b/test_markdown_render.py new file mode 100644 index 0000000..535eb51 --- /dev/null +++ b/test_markdown_render.py @@ -0,0 +1,18 @@ +from markdown_render import MarkdownRenderer + +# Initialize MarkdownRenderer +renderer = MarkdownRenderer() + +# Test Markdown input +markdown_content = """ +{img-left-overlay: src=my-cat.png} +{box: title=Test Box, content=This is a test.} +{note: content=This is a note.} +{warning: content=Be careful!} +""" + +# Render to HTML +print("Rendering Markdown...") +html_output = renderer.render(markdown_content) +print("Rendered HTML:") +print(html_output) \ No newline at end of file