CodeTribunal / src /code_tribunal /ui /helpers.py
amine-yagoub's picture
feat: introduce gradio-based interface for courtroom trials
ca2b985
"""HTML rendering helpers for the Gradio UI."""
from pathlib import Path
from code_tribunal.ui.styles import SEVERITY_COLORS
def escape_html(text: str) -> str:
return text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
def severity_badge(severity: str) -> str:
color = SEVERITY_COLORS.get(severity, "#6b7280")
return (
f'<span style="background:{color};color:white;padding:2px 8px;'
f'border-radius:4px;font-size:12px;font-weight:bold">{severity}</span>'
)
def evidence_html(report) -> str:
"""Render an EvidenceReport as an HTML table."""
lines = [
"<h3>Evidence Report</h3>",
f"<p>Files: <b>{report.file_count}</b> | Findings: <b>{len(report.findings)}</b></p>",
]
for domain, findings in report.findings_by_domain.items():
lines.append(f"<h4>{domain.title()} ({len(findings)})</h4>")
lines.append('<table style="width:100%;border-collapse:collapse">')
lines.append(
'<tr style="border-bottom:1px solid #333">'
"<th style='text-align:left;padding:4px'>Sev</th>"
"<th style='text-align:left;padding:4px'>File</th>"
"<th style='text-align:left;padding:4px'>Line</th>"
"<th style='text-align:left;padding:4px'>Code</th></tr>"
)
for finding in findings:
lines.append(
f'<tr style="border-bottom:1px solid #222">'
f"<td style='padding:4px'>{severity_badge(finding.severity_hint)}</td>"
f"<td style='padding:4px;font-family:monospace;font-size:13px'>"
f"{Path(finding.file).name}</td>"
f"<td style='padding:4px;font-family:monospace'>{finding.line}</td>"
f"<td style='padding:4px;font-family:monospace;font-size:13px;color:#a0a0a0'>"
f"{escape_html(finding.code)}</td></tr>"
)
lines.append("</table>")
return "\n".join(lines)