"""Markdown formatter for daily briefings."""
from daily_briefing.models import DailyBriefing, Priority
class MarkdownFormatter:
"""Formats briefings as Markdown."""
@staticmethod
def format(briefing: DailyBriefing) -> str:
"""Format a briefing as Markdown.
Args:
briefing: The briefing to format
Returns:
Markdown representation
"""
lines = []
lines.append(f"# Daily Briefing - {briefing.date.strftime('%A, %B %d, %Y')}")
lines.append("")
# Today's Schedule
lines.append("## Today's Schedule")
lines.append("")
if briefing.events:
for event in briefing.events:
if event.is_all_day:
lines.append(f"- **[All Day]** {event.title}")
else:
start_time = event.start.strftime("%I:%M %p")
end_time = event.end.strftime("%I:%M %p")
duration = int((event.end - event.start).total_seconds() / 60)
lines.append(f"- **{start_time} - {end_time}** ({duration}m)")
lines.append(f" - {event.title}")
if event.location:
lines.append(f" - *Location:* {event.location}")
else:
lines.append("*No events scheduled*")
lines.append("")
# Conflicts
if briefing.conflicts:
lines.append("## Conflicts")
lines.append("")
for conflict in briefing.conflicts:
emoji = "🔴" if conflict.severity == Priority.HIGH else "🟡"
lines.append(f"{emoji} {conflict.description}")
lines.append("")
# Travel Alerts
if briefing.travel_alerts:
lines.append("## Travel Alerts")
lines.append("")
for alert in briefing.travel_alerts:
lines.append(f"✈️ {alert}")
lines.append("")
# Focus Time
if briefing.free_slots:
focus_slots = [s for s in briefing.free_slots if s.duration_minutes >= 30]
if focus_slots:
lines.append("## Available Focus Time")
lines.append("")
for slot in focus_slots:
start_time = slot.start.strftime("%I:%M %p")
end_time = slot.end.strftime("%I:%M %p")
lines.append(
f"- {start_time} - {end_time} ({slot.duration_minutes}m)"
)
lines.append("")
# Upcoming Travel
if briefing.upcoming_travel:
lines.append("## Upcoming Travel")
lines.append("")
for trip in briefing.upcoming_travel:
days_until = (trip.start_date - briefing.date).days
if days_until == 0:
timing = "**Today**"
elif days_until == 1:
timing = "**Tomorrow**"
else:
timing = f"In {days_until} days"
lines.append(f"- {timing}: {trip.title}")
if trip.destination:
lines.append(f" - Destination: {trip.destination}")
lines.append("")
# Recent Meetings
if briefing.recent_meetings:
lines.append("## Recent Meeting Summaries")
lines.append("")
for meeting in briefing.recent_meetings[:3]:
lines.append(f"### {meeting.title}")
lines.append(f"*{meeting.date.strftime('%B %d, %Y')}*")
lines.append("")
if meeting.overview:
lines.append(meeting.overview)
lines.append("")
if meeting.action_items:
lines.append("**Action Items:**")
for item in meeting.action_items[:5]:
lines.append(f"- [ ] {item}")
lines.append("")
# All Action Items
if briefing.action_items:
lines.append("## Pending Action Items")
lines.append("")
for item in briefing.action_items[:10]:
lines.append(f"- [ ] {item.text}")
if item.meeting_title:
lines.append(f" - *From: {item.meeting_title}*")
lines.append("")
# Stats
lines.append("## Today's Stats")
lines.append("")
lines.append(f"| Metric | Value |")
lines.append(f"|--------|-------|")
lines.append(f"| Total Meetings | {briefing.total_meetings} |")
lines.append(f"| Meeting Time | {briefing.total_meeting_hours:.1f} hours |")
lines.append(f"| Focus Time | {briefing.focus_time_hours:.1f} hours |")
lines.append("")
lines.append("---")
lines.append(
f"*Generated at {briefing.generated_at.strftime('%I:%M %p')}*"
)
return "\n".join(lines)