import markdown from jinja2 import Environment, DictLoader # Define Jinja2 custom functions def img_left_overlay(src): """Render an image with overlay.""" return f'''
Overlay Image
Overlay Text
''' def box(title, content): """Render a box component.""" return f'''
{title}

{content}

''' def note(content): """Render a note component.""" return f'''

{content}

''' def link_to(title, url): """Render a box component.""" return f''' {title} ''' def warning(content): """Render a warning component.""" return f'''
⚠️

{content}

''' def slider(options, images): """Render a slider using the provided HTML structure.""" width = options.get("width", 500) height = options.get("height", 375) # First image with a
and
first_image_html = f'''

Fylgja CSS Slider

''' ## Todo: https://codepen.io/dp_lewis/pen/WNZQzN # Remaining images as plain tags other_images_html = "".join([ f'' for img in images[1:] ]) # Final combined HTML return f'''
{first_image_html} {other_images_html}
''' def create_jinja_environment(): """Create and configure the Jinja2 environment.""" env = Environment(loader=DictLoader({"base_template": "{{ content | safe }}"})) env.globals.update({ "img_left_overlay": img_left_overlay, "box": box, "note": note, "warning": warning, "link_to": link_to, "slider": slider, }) return env def render_markdown_with_jinja(markdown_content: str): """ Convert Markdown to HTML and apply Jinja2 rendering for custom tags. 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"]) intermediate_html = md.convert(markdown_content) metadata = {key: " ".join(value) for key, value in md.Meta.items()} if md.Meta else {} # Step 2: Pass the resulting HTML with Jinja2 custom tags through Jinja2 env = create_jinja_environment() template = env.get_template("base_template") final_html = template.render(content=intermediate_html) # Step 3: Re-render final_html in Jinja2 for embedded tags like {{ box(...) }} final_output = env.from_string(final_html).render() return final_output, metadata