| | """ |
| | Interactive template selector for conference presets. |
| | |
| | Provides a terminal UI for selecting a conference template |
| | with information about requirements and rules. |
| | """ |
| | from typing import Optional |
| |
|
| | from rich.console import Console |
| | from rich.panel import Panel |
| | from rich.table import Table |
| | from rich.prompt import Prompt |
| | from rich.columns import Columns |
| | from rich.text import Text |
| |
|
| | from ..templates.base_template import ( |
| | ConferenceTemplate, |
| | get_template, |
| | get_all_templates, |
| | ConferenceField |
| | ) |
| |
|
| |
|
| | class TemplateSelector: |
| | """Interactive terminal selector for conference templates.""" |
| | |
| | def __init__(self): |
| | self.console = Console() |
| | self.templates = get_all_templates() |
| | |
| | def display_templates(self): |
| | """Display all available templates grouped by field.""" |
| | self.console.clear() |
| | |
| | |
| | self.console.print(Panel( |
| | "[bold blue]π Conference Template Selector[/bold blue]\n" |
| | "[dim]Choose a conference template for submission checks[/dim]", |
| | border_style="blue" |
| | )) |
| | self.console.print() |
| | |
| | |
| | fields = { |
| | ConferenceField.NLP: ("π£οΈ NLP Conferences", []), |
| | ConferenceField.CV: ("ποΈ Computer Vision Conferences", []), |
| | ConferenceField.ML: ("π§ Machine Learning Conferences", []), |
| | } |
| | |
| | for template in self.templates.values(): |
| | fields[template.field][1].append(template) |
| | |
| | |
| | for field_enum, (title, templates) in fields.items(): |
| | self.console.print(f"[bold cyan]{title}[/bold cyan]") |
| | |
| | table = Table(show_header=True, header_style="bold", box=None, padding=(0, 2)) |
| | table.add_column("ID", style="yellow", width=10) |
| | table.add_column("Conference", width=15) |
| | table.add_column("Pages", width=12) |
| | table.add_column("Key Requirements", style="dim") |
| | |
| | for template in templates: |
| | pages = f"{template.page_limit_review}β{template.page_limit_camera}" |
| | requirements = [] |
| | if template.mandatory_sections: |
| | requirements.append(f"Required: {', '.join(template.mandatory_sections)}") |
| | if template.extra_rules: |
| | first_rule = list(template.extra_rules.values())[0] |
| | requirements.append(first_rule[:50]) |
| | |
| | table.add_row( |
| | template.short_name, |
| | template.name, |
| | pages, |
| | " | ".join(requirements) if requirements else "Standard format" |
| | ) |
| | |
| | self.console.print(table) |
| | self.console.print() |
| | |
| | def display_template_details(self, template: ConferenceTemplate): |
| | """Display detailed information about a template.""" |
| | self.console.print() |
| | self.console.print(Panel( |
| | f"[bold]{template.name}[/bold]", |
| | border_style="cyan" |
| | )) |
| | |
| | |
| | info = Table(show_header=False, box=None, padding=(0, 2)) |
| | info.add_column("Label", style="dim") |
| | info.add_column("Value") |
| | |
| | info.add_row("Style Package", f"[cyan]{template.style_package}[/cyan]") |
| | info.add_row("Page Limit (Review)", f"[yellow]{template.page_limit_review}[/yellow] pages") |
| | info.add_row("Page Limit (Camera)", f"[green]{template.page_limit_camera}[/green] pages") |
| | info.add_row("Double-Blind", "β Yes" if template.double_blind else "β No") |
| | |
| | if template.mandatory_sections: |
| | info.add_row("Mandatory Sections", ", ".join(template.mandatory_sections)) |
| | if template.optional_sections: |
| | info.add_row("Optional Sections", ", ".join(template.optional_sections)) |
| | |
| | self.console.print(info) |
| | |
| | |
| | if template.extra_rules: |
| | self.console.print() |
| | self.console.print("[bold]Special Requirements:[/bold]") |
| | for key, value in template.extra_rules.items(): |
| | self.console.print(f" β’ [dim]{key}:[/dim] {value}") |
| | |
| | self.console.print() |
| | |
| | def run(self) -> Optional[ConferenceTemplate]: |
| | """Run the interactive selector and return the chosen template.""" |
| | while True: |
| | self.display_templates() |
| | |
| | |
| | choice = Prompt.ask( |
| | "[bold]Enter template ID (or 'q' to quit, 'd <id>' for details)[/bold]", |
| | default="q" |
| | ) |
| | |
| | if choice.lower() == 'q': |
| | return None |
| | |
| | |
| | if choice.lower().startswith('d '): |
| | template_id = choice[2:].strip().lower() |
| | template = get_template(template_id) |
| | if template: |
| | self.display_template_details(template) |
| | Prompt.ask("Press Enter to continue") |
| | else: |
| | self.console.print(f"[red]Unknown template: {template_id}[/red]") |
| | Prompt.ask("Press Enter to continue") |
| | continue |
| | |
| | |
| | template = get_template(choice) |
| | if template: |
| | self.console.print(f"[green]β Selected: {template.name}[/green]") |
| | return template |
| | else: |
| | self.console.print(f"[red]Unknown template: {choice}[/red]") |
| | self.console.print("[dim]Available: " + ", ".join(self.templates.keys()) + "[/dim]") |
| | Prompt.ask("Press Enter to continue") |
| |
|
| |
|
| | def launch_template_selector() -> Optional[ConferenceTemplate]: |
| | """Launch the template selector and return the chosen template.""" |
| | selector = TemplateSelector() |
| | return selector.run() |
| |
|
| |
|
| | def list_templates(console: Console = None): |
| | """Print a simple list of available templates.""" |
| | if console is None: |
| | console = Console() |
| | |
| | console.print("\n[bold]Available Conference Templates:[/bold]\n") |
| | |
| | templates = get_all_templates() |
| | |
| | |
| | by_field = {} |
| | for t in templates.values(): |
| | if t.field not in by_field: |
| | by_field[t.field] = [] |
| | by_field[t.field].append(t) |
| | |
| | field_names = { |
| | ConferenceField.NLP: "NLP", |
| | ConferenceField.CV: "Computer Vision", |
| | ConferenceField.ML: "Machine Learning", |
| | } |
| | |
| | for field, field_templates in by_field.items(): |
| | console.print(f"[cyan]{field_names[field]}:[/cyan]") |
| | for t in field_templates: |
| | console.print(f" β’ [yellow]{t.short_name:8}[/yellow] - {t.name} ({t.page_limit_review}/{t.page_limit_camera} pages)") |
| | |
| | console.print() |
| |
|