"""Render CV analysis results in tactical-themed HTML format.""" from __future__ import annotations import html from typing import Any, Dict def render_cv_analysis_html(skills_data: Dict[str, Any], filename: str = "Unknown") -> str: """ Renders CV analysis data into a Tactical-themed card layout similar to project analysis. Args: skills_data: Dictionary containing extracted skills and candidate information filename: Name of the CV file Returns: HTML string for display """ # Internal CSS css = """ """ # Check for errors if "error" in skills_data: error_msg = html.escape(skills_data.get("summary", "Unknown error occurred")) return f""" {css}

⚠️ CV ANALYSIS FAILED

{error_msg}

""" # Extract data tech_skills = skills_data.get("technical_skills", []) soft_skills = skills_data.get("soft_skills", []) experience_years = skills_data.get("experience_years", "unknown") recent_roles = skills_data.get("recent_roles", []) education = skills_data.get("education", []) certifications = skills_data.get("certifications", []) domain_expertise = skills_data.get("domain_expertise", []) summary = skills_data.get("summary", "") # Calculate stats total_skills = len(tech_skills) + len(soft_skills) # Build HTML html_parts = [css, '
'] # Header safe_filename = html.escape(filename) html_parts.append(f"""

CV ANALYSIS REPORT

SOURCE: {safe_filename}
STATUS: PROCESSED
TIMESTAMP: {html.escape(str(__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M')))}
""") # Stats Bar html_parts.append(f"""
Total Skills
{total_skills}
Technical
{len(tech_skills)}
Soft Skills
{len(soft_skills)}
Experience
{html.escape(str(experience_years))}
""") # Summary if summary: safe_summary = html.escape(summary) html_parts.append(f"""
📄 CANDIDATE PROFILE SUMMARY
{safe_summary}
""") # Skills Grid html_parts.append('
') # Technical Skills Card if tech_skills: html_parts.append('
') html_parts.append('
💻 Technical Skills
') html_parts.append('
') for skill in tech_skills: safe_skill = html.escape(skill) html_parts.append(f'{safe_skill}') html_parts.append('
') # Soft Skills Card if soft_skills: html_parts.append('
') html_parts.append('
🤝 Soft Skills
') html_parts.append('
') for skill in soft_skills: safe_skill = html.escape(skill) html_parts.append(f'{safe_skill}') html_parts.append('
') # Domain Expertise Card if domain_expertise: html_parts.append('
') html_parts.append('
🎯 Domain Expertise
') html_parts.append('
') for domain in domain_expertise: safe_domain = html.escape(domain) html_parts.append(f'{safe_domain}') html_parts.append('
') # Experience Card if recent_roles or experience_years != "unknown": html_parts.append('
') html_parts.append('
💼 Professional Experience
') if experience_years != "unknown": html_parts.append(f'
') html_parts.append(f'
Years
') html_parts.append(f'
{html.escape(str(experience_years))}
') html_parts.append('
') if recent_roles: html_parts.append('
    ') for role in recent_roles[:5]: # Limit to 5 roles safe_role = html.escape(role) html_parts.append(f'
  • {safe_role}
  • ') html_parts.append('
') html_parts.append('
') # Education Card if education: html_parts.append('
') html_parts.append('
🎓 Education
') html_parts.append('
    ') for edu in education: safe_edu = html.escape(edu) html_parts.append(f'
  • {safe_edu}
  • ') html_parts.append('
') # Certifications Card if certifications: html_parts.append('
') html_parts.append('
📜 Certifications
') html_parts.append('
    ') for cert in certifications: safe_cert = html.escape(cert) html_parts.append(f'
  • {safe_cert}
  • ') html_parts.append('
') html_parts.append('
') # Close grid html_parts.append('
') # Close wrapper return ''.join(html_parts)