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'''
'''
def format_error_message(color: str, index: int) -> str:
"""Format error message when confidence is too low."""
return f'''
⚠️
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'''
📋 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'''
ℹ️
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'''
📋 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"""
{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 """
"""