from typing import Dict, List, Union, Any, Optional, Callable from urllib.parse import quote def get_akc_breeds_link(breed: str) -> str: """Generate AKC breed page URL with intelligent name handling.""" breed_name = breed.lower() breed_name = breed_name.replace('_', '-') breed_name = breed_name.replace("'", '') breed_name = breed_name.replace(" ", '-') special_cases = { 'mexican-hairless': 'xoloitzcuintli', 'brabancon-griffon': 'brussels-griffon', 'bull-mastiff': 'bullmastiff', 'walker-hound': 'treeing-walker-coonhound' } breed_name = special_cases.get(breed_name, breed_name) return f"https://www.akc.org/dog-breeds/{breed_name}/" def get_color_scheme(is_single_dog: bool) -> Union[str, List[str]]: """Get color scheme for dog detection visualization.""" single_dog_color = '#34C759' # 清爽的綠色作為單狗顏色 color_list = [ '#FF5733', # 珊瑚紅 '#28A745', # 深綠色 '#3357FF', # 寶藍色 '#FF33F5', # 粉紫色 '#FFB733', # 橙黃色 '#33FFF5', # 青藍色 '#A233FF', # 紫色 '#FF3333', # 紅色 '#33FFB7', # 青綠色 '#FFE033' # 金黃色 ] return single_dog_color if is_single_dog else color_list def format_warning_html(message: str) -> str: """Format warning messages in a consistent style.""" return f'''

⚠️ {message}

''' def format_error_message(color: str, index: int) -> str: """Format error message when confidence is too low.""" return f'''
Dog {index}
⚠️ The image is unclear or the breed is not in the dataset. Please upload a clearer image.
''' def format_description_html(description: Dict[str, Any], breed: str) -> str: """Format basic breed description with tooltips.""" if not isinstance(description, dict): return f"

{description}

" fields_order = [ "Size", "Lifespan", "Temperament", "Exercise Needs", "Grooming Needs", "Care Level", "Good with Children", "Description" ] html_parts = [] for field in fields_order: if field in description: value = description[field] tooltip_html = format_tooltip(field, value) html_parts.append(f'
  • {tooltip_html}
  • ') # Add any remaining fields for key, value in description.items(): if key not in fields_order and key != "Breed": html_parts.append(f'
  • {key}: {value}
  • ') return f'' def format_tooltip(key: str, value: str) -> str: """Format tooltip with content for each field.""" tooltip_contents = { "Size": { "title": "Size Categories", "items": [ "Small: Under 20 pounds", "Medium: 20-60 pounds", "Large: Over 60 pounds", "Giant: Over 100 pounds", "Varies: Depends on variety" ] }, "Exercise Needs": { "title": "Exercise Needs", "items": [ "Low: Short walks and play sessions", "Moderate: 1-2 hours of daily activity", "High: Extensive exercise (2+ hours/day)", "Very High: Constant activity and mental stimulation needed" ] }, "Grooming Needs": { "title": "Grooming Requirements", "items": [ "Low: Basic brushing, occasional baths", "Moderate: Weekly brushing, occasional grooming", "High: Daily brushing, frequent professional grooming needed", "Professional care recommended for all levels" ] }, "Care Level": { "title": "Care Level Explained", "items": [ "Low: Basic care and attention needed", "Moderate: Regular care and routine needed", "High: Significant time and attention needed", "Very High: Extensive care, training and attention required" ] }, "Good with Children": { "title": "Child Compatibility", "items": [ "Yes: Excellent with kids, patient and gentle", "Moderate: Good with older children", "No: Better suited for adult households" ] }, "Lifespan": { "title": "Average Lifespan", "items": [ "Short: 6-8 years", "Average: 10-15 years", "Long: 12-20 years", "Varies by size: Larger breeds typically have shorter lifespans" ] }, "Temperament": { "title": "Temperament Guide", "items": [ "Describes the dog's natural behavior and personality", "Important for matching with owner's lifestyle", "Can be influenced by training and socialization" ] } } tooltip = tooltip_contents.get(key, {"title": key, "items": []}) tooltip_content = "
    ".join([f"• {item}" for item in tooltip["items"]]) return f''' {key}: {tooltip["title"]}:
    {tooltip_content}
    {value} ''' def format_single_dog_result(breed: str, description: Dict[str, Any], color: str = "#34C759") -> str: """Format single dog detection result into HTML.""" return f'''
    🐾 {breed}

    📋 BASIC INFORMATION

    📏 Size: Size Categories:
    • Small: Under 20 pounds
    • Medium: 20-60 pounds
    • Large: Over 60 pounds
    • Giant: Over 100 pounds
    • Varies: Depends on variety
    {description['Size']}
    Lifespan: Average Lifespan:
    • Short: 6-8 years
    • Average: 10-15 years
    • Long: 12-20 years
    • Varies by size: Larger breeds typically have shorter lifespans
    {description['Lifespan']}

    🐕 TEMPERAMENT & PERSONALITY

    {description['Temperament']} Temperament Guide:
    • Describes the dog's natural behavior and personality
    • Important for matching with owner's lifestyle
    • Can be influenced by training and socialization

    💪 CARE REQUIREMENTS

    🏃 Exercise: Exercise Needs:
    • Low: Short walks and play sessions
    • Moderate: 1-2 hours of daily activity
    • High: Extensive exercise (2+ hours/day)
    • Very High: Constant activity and mental stimulation needed
    {description['Exercise Needs']}
    ✂️ Grooming: Grooming Requirements:
    • Low: Basic brushing, occasional baths
    • Moderate: Weekly brushing, occasional grooming
    • High: Daily brushing, frequent professional grooming needed
    • Professional care recommended for all levels
    {description['Grooming Needs']}
    Care Level: Care Level Explained:
    • Low: Basic care and attention needed
    • Moderate: Regular care and routine needed
    • High: Significant time and attention needed
    • Very High: Extensive care, training and attention required
    {description['Care Level']}

    👨‍👩‍👧‍👦 FAMILY COMPATIBILITY

    Good with Children: Child Compatibility:
    • Yes: Excellent with kids, patient and gentle
    • Moderate: Good with older children
    • No: Better suited for adult households
    {description['Good with Children']}

    📝 DESCRIPTION About This Description:
    • Comprehensive breed overview
    • Personality and characteristics
    • Historical background
    • Typical behaviors and traits

    {description.get('Description', '')}

    ''' def format_multiple_breeds_result( topk_breeds: List[str], relative_probs: List[str], color: str, index: int, get_dog_description: Callable ) -> str: """Format multiple breed predictions into HTML with complete information.""" result = f'''
    Dog {index+1}
    ℹ️ Note: The model is showing some uncertainty in its predictions. Here are the most likely breeds based on the available visual features.
    ''' for j, (breed, prob) in enumerate(zip(topk_breeds, relative_probs)): description = get_dog_description(breed) result += f'''
    Option {j+1} {breed} Confidence: {prob}

    📋 BASIC INFORMATION

    📏 Size: Size Categories:
    • Small: Under 20 pounds
    • Medium: 20-60 pounds
    • Large: Over 60 pounds
    • Giant: Over 100 pounds
    • Varies: Depends on variety
    {description['Size']}
    Lifespan: Average Lifespan:
    • Short: 6-8 years
    • Average: 10-15 years
    • Long: 12-20 years
    • Varies by size: Larger breeds typically have shorter lifespans
    {description['Lifespan']}

    🐕 TEMPERAMENT & PERSONALITY

    {description['Temperament']} Temperament Guide:
    • Describes the dog's natural behavior and personality
    • Important for matching with owner's lifestyle
    • Can be influenced by training and socialization

    💪 CARE REQUIREMENTS

    🏃 Exercise: Exercise Needs:
    • Low: Short walks and play sessions
    • Moderate: 1-2 hours of daily activity
    • High: Extensive exercise (2+ hours/day)
    • Very High: Constant activity and mental stimulation needed
    {description['Exercise Needs']}
    ✂️ Grooming: Grooming Requirements:
    • Low: Basic brushing, occasional baths
    • Moderate: Weekly brushing, occasional grooming
    • High: Daily brushing, frequent professional grooming needed
    • Professional care recommended for all levels
    {description['Grooming Needs']}
    Care Level: Care Level Explained:
    • Low: Basic care and attention needed
    • Moderate: Regular care and routine needed
    • High: Significant time and attention needed
    • Very High: Extensive care, training and attention required
    {description['Care Level']}

    👨‍👩‍👧‍👦 FAMILY COMPATIBILITY

    Good with Children: Child Compatibility:
    • Yes: Excellent with kids, patient and gentle
    • Moderate: Good with older children
    • No: Better suited for adult households
    {description['Good with Children']}

    📝 DESCRIPTION About This Description:
    • Comprehensive breed overview
    • Personality and characteristics
    • Historical background
    • Typical behaviors and traits

    {description.get('Description', '')}

    ''' result += '
    ' return result def format_multi_dog_container(dogs_info: str) -> str: """Wrap multiple dog detection results in a container.""" return f"""
    {dogs_info}
    """ def format_breed_details_html(description: Dict[str, Any], breed: str) -> str: """Format breed details for the show_details_html function.""" return f"""

    {breed}

    {format_description_html(description, breed)}
    """ def format_comparison_result(breed1: str, breed2: str, comparison_data: Dict) -> str: """Format breed comparison results into HTML.""" return f"""

    Comparison: {breed1} vs {breed2}

    {breed1}

    {format_comparison_details(comparison_data[breed1])}

    {breed2}

    {format_comparison_details(comparison_data[breed2])}
    """ def format_comparison_details(breed_data: Dict) -> str: """Format individual breed details for comparison.""" original_data = breed_data.get('Original_Data', {}) return f"""

    Size: {original_data.get('Size', 'N/A')}

    Exercise Needs: {original_data.get('Exercise Needs', 'N/A')}

    Care Level: {original_data.get('Care Level', 'N/A')}

    Grooming Needs: {original_data.get('Grooming Needs', 'N/A')}

    Good with Children: {original_data.get('Good with Children', 'N/A')}

    Temperament: {original_data.get('Temperament', 'N/A')}

    """ def format_header_html() -> str: """Format the application header HTML.""" return """

    🐾 PawMatch AI

    Your Smart Dog Breed Guide

    Powered by AI • Breed Recognition • Smart Matching • Companion Guide

    """