"""Output formatting utilities for Gradio.""" import pandas as pd from typing import Dict, List, Any def format_overall_score(score: float) -> str: """Format overall score as HTML progress bar.""" score_int = int(round(score)) color = "#2ecc71" if score_int >= 70 else "#f39c12" if score_int >= 50 else "#e74c3c" return f"""
Overall Score
{score_int}/100
""" def format_sub_scores(sub_scores: Dict[str, float]) -> pd.DataFrame: """Format sub-scores as a DataFrame for gr.BarPlot.""" df = pd.DataFrame({ "Sub-Score": list(sub_scores.keys()), "Score": list(sub_scores.values()) }) return df def format_strengths(strengths: List[str]) -> str: """Format strengths as HTML list.""" if not strengths: return "No notable strengths detected." items = "\n".join(f"
  • ✅ {s}
  • " for s in strengths) return f"" def format_weaknesses(weaknesses: List[str]) -> str: """Format weaknesses as HTML list.""" if not weaknesses: return "No notable weaknesses detected." items = "\n".join(f"
  • ⚠️ {w}
  • " for w in weaknesses) return f"" def format_suggestions(suggestions: List[Dict[str, Any]]) -> str: """Format suggestions as numbered HTML list.""" if not suggestions: return "No specific suggestions — your image scores well across all dimensions." items = [] for i, s in enumerate(suggestions[:5], 1): priority_emoji = {1: "🔴", 2: "🟡", 3: "🟡"}.get(i, "🟢") items.append( f"
    "> f"{priority_emoji} Priority {i} — {s['sub_score_target']}
    " f"
    {s['message']}
    " f"
    📈 Projected gain: +{s['projected_gain']:.0f} points
    " f"
    " ) return "\n".join(items) def format_projected_improvement(current: float, projected: float) -> str: """Format projected improvement as HTML.""" delta = projected - current if delta <= 0: return "
    🎉 This image is already well-optimized!
    " return f"""
    💡 Projected Improvement
    Current: {current:.0f}/100 → After suggestions: {projected:.0f}/100 (+{delta:.0f} points)
    """ def format_comparison(original: Dict[str, Any], revised: Dict[str, Any], improvements: List, regressions: List, next_steps: List[Dict[str, Any]]) -> str: """Format comparison results as HTML.""" orig_score = original.get("overall_score", 0) rev_score = revised.get("overall_score", 0) delta = rev_score - orig_score result = f"""
    Original
    {orig_score:.0f}
    Revised
    {rev_score:.0f}
    """ if delta > 0: result += f"
    📈 Overall improved by +{delta:.0f} points
    " elif delta < 0: result += f"
    📉 Overall decreased by {delta:.0f} points
    " else: result += "
    Overall score unchanged
    " if improvements: result += "
    ✅ Improvements:
    " if regressions: result += "
    ⚠️ Regressions:
    " if next_steps: result += "
    📋 Next Recommended Edits:
    " for step in next_steps[:3]: result += f"
    {step['message']}
    " result += "
    " return result