"""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}
→
"""
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:
"
for name, val in improvements[:5]:
result += f"- {name}: +{val:.0f} points
"
result += "
"
if regressions:
result += "
⚠️ Regressions:
"
for name, val in regressions[:5]:
result += f"- {name}: {val:.0f} points
"
result += "
"
if next_steps:
result += "
📋 Next Recommended Edits:
"
for step in next_steps[:3]:
result += f"
{step['message']}
"
result += "
"
return result