45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
"""Grounded intermediate Markdown assembler."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import List, Optional
|
|
|
|
from src.runtime.candidate.models import CandidateObject
|
|
|
|
|
|
def assemble_intermediate_markdown(
|
|
title: str,
|
|
subtitle: Optional[str],
|
|
ordered_blocks: List[CandidateObject],
|
|
) -> str:
|
|
"""Assembles sanitized intermediate Markdown from validated editorial components."""
|
|
parts: List[str] = []
|
|
|
|
# Title as H1
|
|
clean_title = title.strip()
|
|
parts.append(f"# {clean_title}")
|
|
|
|
# Subtitle if present
|
|
if subtitle and subtitle.strip():
|
|
parts.append(f"*{subtitle.strip()}*")
|
|
|
|
# Ordered body blocks
|
|
for blk in ordered_blocks:
|
|
b_text = blk.text.strip()
|
|
if not b_text:
|
|
continue
|
|
|
|
if blk.type == "heading":
|
|
level = blk.level or 2
|
|
prefix = "#" * max(2, min(6, level))
|
|
parts.append(f"{prefix} {b_text}")
|
|
elif blk.type == "list_item":
|
|
parts.append(f"- {b_text}")
|
|
elif blk.type == "quote":
|
|
parts.append(f"> {b_text}")
|
|
else:
|
|
# Standard paragraph
|
|
parts.append(b_text)
|
|
|
|
return "\n\n".join(parts)
|