91 lines
3.3 KiB
Python
91 lines
3.3 KiB
Python
"""
|
|
Markdown renderer for report generation.
|
|
"""
|
|
|
|
from .base_renderer import BaseRenderer
|
|
from typing import Dict, Any, Tuple, List
|
|
|
|
class MarkdownRenderer(BaseRenderer):
|
|
"""Renders content to Markdown format with format-specific extraction."""
|
|
|
|
@classmethod
|
|
def get_supported_formats(cls) -> List[str]:
|
|
"""Return supported Markdown formats."""
|
|
return ['md', 'markdown']
|
|
|
|
@classmethod
|
|
def get_format_aliases(cls) -> List[str]:
|
|
"""Return format aliases."""
|
|
return ['mdown', 'mkd']
|
|
|
|
@classmethod
|
|
def get_priority(cls) -> int:
|
|
"""Return priority for markdown renderer."""
|
|
return 95
|
|
|
|
def getExtractionPrompt(self, user_prompt: str, title: str) -> str:
|
|
"""Get Markdown-specific extraction prompt."""
|
|
return f"""
|
|
{user_prompt}
|
|
|
|
Generate a comprehensive Markdown report with the title: "{title}"
|
|
|
|
MARKDOWN FORMAT REQUIREMENTS:
|
|
- Use proper Markdown syntax throughout
|
|
- Use # for main title, ## for sections, ### for subsections
|
|
- Use tables with | separators and header rows
|
|
- Use bullet points with - or *
|
|
- Use **bold** and *italic* for emphasis
|
|
- Use code blocks with ``` for code/examples
|
|
- Include emojis for visual appeal (📋, 📊, ✅, etc.)
|
|
- Use horizontal rules (---) to separate sections
|
|
- Include source document information
|
|
|
|
FORMATTING RULES:
|
|
- Title: Use # Title
|
|
- Main sections: Use ## Section Name
|
|
- Subsections: Use ### Subsection Name
|
|
- Tables: Use | Header | Header | format with separator row
|
|
- Lists: Use - for bullet points
|
|
- Emphasis: Use **bold** and *italic*
|
|
- Code: Use ```language for code blocks
|
|
- Links: Use [text](url) format
|
|
- Images: Use  format
|
|
|
|
OUTPUT POLICY:
|
|
- Return ONLY Markdown content
|
|
- No HTML, no plain text, no code blocks around content
|
|
- Clean, readable Markdown format
|
|
- Professional appearance with good structure
|
|
- Include all necessary information
|
|
|
|
CRITICAL: Use the actual data from the source documents to create the content. Do not generate placeholder text or templates. Extract and use the real data provided in the source documents to create meaningful content.
|
|
|
|
Generate the complete Markdown report using the actual data from the source documents:
|
|
"""
|
|
|
|
async def render(self, extracted_content: str, title: str) -> Tuple[str, str]:
|
|
"""Render extracted content to Markdown format."""
|
|
try:
|
|
# The extracted content should already be Markdown from the AI
|
|
# Just clean it up
|
|
markdown_content = self._clean_markdown_content(extracted_content, title)
|
|
|
|
return markdown_content, "text/markdown"
|
|
|
|
except Exception as e:
|
|
self.logger.error(f"Error rendering markdown: {str(e)}")
|
|
# Return minimal markdown fallback
|
|
return f"# {title}\n\nError rendering report: {str(e)}", "text/markdown"
|
|
|
|
def _clean_markdown_content(self, content: str, title: str) -> str:
|
|
"""Clean and validate Markdown content from AI."""
|
|
content = content.strip()
|
|
|
|
# Remove markdown code blocks if present
|
|
if content.startswith("```") and content.endswith("```"):
|
|
lines = content.split('\n')
|
|
if len(lines) > 2:
|
|
content = '\n'.join(lines[1:-1]).strip()
|
|
|
|
return content
|