""" Custom web interface for Wildfire Environment. This module provides a wildfire-specific web interface with visual grid display and wildfire-specific features, without modifying the base web_interface.py. """ from typing import Optional from dataclasses import asdict from core.env_server.types import EnvironmentMetadata from ..models import WildfireAction def get_wildfire_web_interface_html(metadata: Optional[EnvironmentMetadata] = None) -> str: """Generate custom HTML for the wildfire environment web interface.""" # Convert markdown to HTML for instructions instructions_html = "" if metadata and metadata.readme_content: instructions_html = _markdown_to_html_simple(metadata.readme_content) return f""" Wildfire Environment - Web Interface
Wildfire Containment Interface
{_generate_instructions_section(instructions_html, metadata)}

Take Action

Water: Extinguishes fire at target cell
Break: Creates firebreak to prevent spread
Wait: Fire continues spreading

Environment Stats

Step Count 0
Water Remaining 0
Breaks Remaining 0
Burning Cells 0

Current State

Status: Not initialized
Episode ID: -
Wind Direction: -
Humidity: -
Fire Grid Visualization

Legend

Ash (Burned)
Fuel (Safe)
Burning (Fire)
Firebreak
Watered (Damp)

Fire Grid

Waiting for grid data... (Click "Reset Environment" to initialize)

Click on a cell to set coordinates for water/break actions

Action History

No actions taken yet
""".replace('{_generate_instructions_section(instructions_html, metadata)}', _generate_instructions_section(instructions_html, metadata)) def _generate_instructions_section(instructions_html: str, metadata: Optional[EnvironmentMetadata]) -> str: """Generate the instructions section.""" if not instructions_html or not metadata: return '' return f'''

{metadata.name if metadata else "Wildfire Environment"}

{instructions_html}
''' def _markdown_to_html_simple(markdown: str) -> str: """Convert basic markdown to HTML.""" import html import re # Escape HTML first html_content = html.escape(markdown) # Convert headers html_content = re.sub(r'^# (.*?)$', r'

\1

', html_content, flags=re.MULTILINE) html_content = re.sub(r'^## (.*?)$', r'

\1

', html_content, flags=re.MULTILINE) html_content = re.sub(r'^### (.*?)$', r'

\1

', html_content, flags=re.MULTILINE) # Convert code blocks html_content = re.sub(r'```(.*?)\n(.*?)\n```', r'
\2
', html_content, flags=re.DOTALL) html_content = re.sub(r'`([^`]+)`', r'\1', html_content) # Convert bold and italic html_content = re.sub(r'\*\*(.*?)\*\*', r'\1', html_content) html_content = re.sub(r'\*(.*?)\*', r'\1', html_content) # Convert lists html_content = re.sub(r'^- (.*?)$', r'
  • \1
  • ', html_content, flags=re.MULTILINE) html_content = re.sub(r'(
  • .*
  • )', r'', html_content, flags=re.DOTALL) # Convert line breaks html_content = html_content.replace('\n', '
    ') return html_content