| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- from __future__ import annotations
- from pathlib import Path
- from typing import TYPE_CHECKING
- from rich import box
- from rich.console import Console
- from rich.panel import Panel
- from rich.text import Text
- from .display_icons import IconManager
- from .display_settings import DisplaySettings
- if TYPE_CHECKING:
- from ..template import Template
- from .display_base import BaseDisplay
- from .display_status import StatusDisplay
- from .display_variable import VariableDisplay
- class TemplateDisplay:
- """Template-related rendering.
- Provides methods for displaying template information,
- file trees, and metadata.
- """
- def __init__(
- self,
- settings: DisplaySettings,
- base: BaseDisplay,
- variables: VariableDisplay,
- status: StatusDisplay,
- ):
- """Initialize TemplateDisplay.
- Args:
- settings: Display settings for formatting
- base: BaseDisplay instance
- variables: VariableDisplay instance for rendering variables
- status: StatusDisplay instance for markdown rendering
- """
- self.settings = settings
- self.base = base
- self.variables = variables
- self.status = status
- def render_template(self, template: Template, template_id: str) -> None:
- """Display template information panel and variables table.
- Args:
- template: Template instance to display
- template_id: ID of the template
- """
- self.render_template_header(template, template_id)
- self.render_file_tree(template)
- self.variables.render_variables_table(template)
- def render_template_header(self, template: Template, template_id: str) -> None:
- """Display the header for a template with library information.
- Args:
- template: Template instance
- template_id: ID of the template
- """
- settings = self.settings
- template_name = template.metadata.name or settings.TEXT_UNNAMED_TEMPLATE
- version = str(template.metadata.version) if template.metadata.version else settings.TEXT_VERSION_NOT_SPECIFIED
- schema = template.schema_version if hasattr(template, "schema_version") else "1.0"
- description = template.metadata.description or settings.TEXT_NO_DESCRIPTION
- # Get library information and format with icon/color
- library_name = template.metadata.library or ""
- library_type = template.metadata.library_type or "git"
- icon = IconManager.UI_LIBRARY_STATIC if library_type == "static" else IconManager.UI_LIBRARY_GIT
- color = "yellow" if library_type == "static" else "blue"
- # Create custom H1-style header with Rich markup support
- # Build header content with Rich formatting
- header_content = Text()
- header_content.append(template_name, style="bold white")
- header_content.append(" (", style="white")
- header_content.append("id:", style="white")
- header_content.append(template_id, style="dim")
- header_content.append(" │ ", style="dim")
- header_content.append("version:", style="white")
- header_content.append(version, style="cyan")
- header_content.append(" │ ", style="dim")
- header_content.append("schema:", style="white")
- header_content.append(schema, style="magenta")
- header_content.append(" │ ", style="dim")
- header_content.append("library:", style="white")
- header_content.append(icon + " ", style=color)
- header_content.append(library_name, style=color)
- header_content.append(")", style="white")
- panel = Panel(header_content, box=box.HEAVY, style="markdown.h1.border")
- Console().print(panel)
- self.base.text("")
- self.status.markdown(description)
- def render_file_tree(self, template: Template) -> None:
- """Display the file structure of a template.
- Args:
- template: Template instance
- """
- self.base.text("")
- self.base.heading("Template File Structure")
- def get_template_file_info(template_file):
- display_name = (
- template_file.output_path.name
- if hasattr(template_file, "output_path")
- else template_file.relative_path.name
- )
- return (template_file.relative_path, display_name, "white", None)
- if template.template_files:
- self.base.file_tree(
- f"{IconManager.folder()} [white]{template.id}[/white]",
- template.template_files,
- get_template_file_info,
- )
- def render_file_generation_confirmation(
- self,
- output_dir: Path,
- files: dict[str, str],
- existing_files: list[Path] | None = None,
- ) -> None:
- """Display files to be generated with confirmation prompt.
- Args:
- output_dir: Output directory path
- files: Dictionary of file paths to content
- existing_files: List of existing files that will be overwritten
- """
- self.base.text("")
- self.base.heading("Files to be Generated")
- def get_file_generation_info(file_path_str):
- file_path = Path(file_path_str)
- file_name = file_path.parts[-1] if file_path.parts else file_path.name
- full_path = output_dir / file_path
- if existing_files and full_path in existing_files:
- return (file_path, file_name, "yellow", "[red](will overwrite)[/red]")
- return (file_path, file_name, "green", None)
- self.base.file_tree(
- f"{IconManager.folder()} [cyan]{output_dir.resolve()}[/cyan]",
- files.keys(),
- get_file_generation_info,
- )
- self.base.text("")
|