{ "file_path": "travel-algorithms/travel_algorithms/poster_generation/template_manager.py", "file_size": 9229, "line_count": 300, "functions": [ { "name": "__init__", "line_start": 26, "line_end": 47, "args": [ { "name": "self" }, { "name": "poster_config", "type_hint": "PosterGenerationConfig" }, { "name": "resource_config", "type_hint": "ResourceConfig" } ], "return_type": null, "docstring": "初始化模板管理器\n\nArgs:\n poster_config: 海报生成配置\n resource_config: 资源配置", "is_async": false, "decorators": [], "code": " def __init__(self, poster_config: PosterGenerationConfig, resource_config: ResourceConfig):\n \"\"\"\n 初始化模板管理器\n\n Args:\n poster_config: 海报生成配置\n resource_config: 资源配置\n \"\"\"\n self.poster_config = poster_config\n self.resource_config = resource_config\n \n # 注册内置模板\n self.templates: Dict[str, Type[BaseTemplate]] = {\n \"vibrant\": VibrantTemplate,\n \"business\": BusinessTemplate,\n \"collage\": CollageTemplate\n }\n \n # 模板实例缓存\n self._template_cache: Dict[str, BaseTemplate] = {}\n \n logger.info(f\"模板管理器初始化完成,注册模板: {list(self.templates.keys())}\")", "code_hash": "9f217b77b8a3bf843d78dfb35dcfa757" }, { "name": "get_template", "line_start": 49, "line_end": 92, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "BaseTemplate", "docstring": "获取模板实例\n\nArgs:\n template_name: 模板名称\n\nReturns:\n 模板实例\n\nRaises:\n ResourceNotFoundError: 模板不存在时抛出", "is_async": false, "decorators": [], "code": " def get_template(self, template_name: str) -> BaseTemplate:\n \"\"\"\n 获取模板实例\n\n Args:\n template_name: 模板名称\n\n Returns:\n 模板实例\n\n Raises:\n ResourceNotFoundError: 模板不存在时抛出\n \"\"\"\n if template_name not in self.templates:\n available_templates = list(self.templates.keys())\n raise ResourceNotFoundError(\n f\"模板 '{template_name}' 不存在。可用模板: {available_templates}\"\n )\n \n # 检查缓存\n if template_name in self._template_cache:\n return self._template_cache[template_name]\n \n try:\n # 创建模板实例\n template_class = self.templates[template_name]\n \n # 获取模板配置\n template_config = self._get_template_config(template_name)\n \n # 实例化模板\n template_instance = template_class(\n size=self.poster_config.default_size,\n config=template_config\n )\n \n # 缓存实例\n self._template_cache[template_name] = template_instance\n \n logger.debug(f\"模板 '{template_name}' 创建成功\")\n return template_instance\n \n except Exception as e:\n raise PosterGenerationError(f\"创建模板 '{template_name}' 失败: {str(e)}\")", "code_hash": "dfa7af216e3c470143e8e3577de2cac5" }, { "name": "_get_template_config", "line_start": 94, "line_end": 126, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "Dict[str, Any]", "docstring": "获取模板特定的配置", "is_async": false, "decorators": [], "code": " def _get_template_config(self, template_name: str) -> Dict[str, Any]:\n \"\"\"获取模板特定的配置\"\"\"\n \n # 基础配置\n base_config = {\n \"size\": self.poster_config.default_size,\n \"color_themes\": self.poster_config.color_themes,\n \"font_configs\": self.poster_config.font_configs,\n \"text_effects\": self.poster_config.text_effects\n }\n \n # 模板特定配置\n if template_name == \"vibrant\":\n base_config.update({\n \"glass_effect\": self.poster_config.glass_effect,\n \"default_theme\": self.poster_config.default_color_theme\n })\n elif template_name == \"business\":\n base_config.update({\n \"professional_colors\": True,\n \"layout_style\": \"symmetrical\"\n })\n elif template_name == \"collage\":\n base_config.update({\n \"grid_style\": \"dynamic\",\n \"max_images\": 6\n })\n \n # 添加资源路径\n base_config[\"font_directory\"] = self._get_font_directory()\n base_config[\"assets_directory\"] = self._get_assets_directory()\n \n return base_config", "code_hash": "6790e467a54e9d01db8e4abd9d1d16d9" }, { "name": "_get_font_directory", "line_start": 128, "line_end": 131, "args": [ { "name": "self" } ], "return_type": "Optional[str]", "docstring": "获取字体目录路径", "is_async": false, "decorators": [], "code": " def _get_font_directory(self) -> Optional[str]:\n \"\"\"获取字体目录路径\"\"\"\n font_dir = self.resource_config.find_resource_directory(\"fonts\")\n return str(font_dir) if font_dir else None", "code_hash": "0bab147fb055ea6b8819c0adf920cc90" }, { "name": "_get_assets_directory", "line_start": 133, "line_end": 136, "args": [ { "name": "self" } ], "return_type": "Optional[str]", "docstring": "获取资源目录路径", "is_async": false, "decorators": [], "code": " def _get_assets_directory(self) -> Optional[str]:\n \"\"\"获取资源目录路径\"\"\"\n assets_dir = self.resource_config.find_resource_directory(\"images\")\n return str(assets_dir) if assets_dir else None", "code_hash": "5238f113782057f60af0684f23bcd352" }, { "name": "register_template", "line_start": 138, "line_end": 155, "args": [ { "name": "self" }, { "name": "name", "type_hint": "str" }, { "name": "template_class", "type_hint": "Type[BaseTemplate]" } ], "return_type": "None", "docstring": "注册新模板\n\nArgs:\n name: 模板名称\n template_class: 模板类", "is_async": false, "decorators": [], "code": " def register_template(self, name: str, template_class: Type[BaseTemplate]) -> None:\n \"\"\"\n 注册新模板\n\n Args:\n name: 模板名称\n template_class: 模板类\n \"\"\"\n if not issubclass(template_class, BaseTemplate):\n raise ValueError(f\"模板类必须继承自 BaseTemplate\")\n \n self.templates[name] = template_class\n \n # 清除缓存中的旧实例(如果存在)\n if name in self._template_cache:\n del self._template_cache[name]\n \n logger.info(f\"模板 '{name}' 注册成功\")", "code_hash": "bd8c4e627dcd1f1190d60b5393d3f9ba" }, { "name": "unregister_template", "line_start": 157, "line_end": 170, "args": [ { "name": "self" }, { "name": "name", "type_hint": "str" } ], "return_type": "None", "docstring": "注销模板\n\nArgs:\n name: 模板名称", "is_async": false, "decorators": [], "code": " def unregister_template(self, name: str) -> None:\n \"\"\"\n 注销模板\n\n Args:\n name: 模板名称\n \"\"\"\n if name in self.templates:\n del self.templates[name]\n \n if name in self._template_cache:\n del self._template_cache[name]\n \n logger.info(f\"模板 '{name}' 已注销\")", "code_hash": "4125fedc101fc98e48d08021396e1d1b" }, { "name": "get_available_templates", "line_start": 172, "line_end": 179, "args": [ { "name": "self" } ], "return_type": "List[str]", "docstring": "获取可用模板列表\n\nReturns:\n 模板名称列表", "is_async": false, "decorators": [], "code": " def get_available_templates(self) -> List[str]:\n \"\"\"\n 获取可用模板列表\n\n Returns:\n 模板名称列表\n \"\"\"\n return list(self.templates.keys())", "code_hash": "033bb3b15cfae0b6070f4384941d5f73" }, { "name": "get_template_info", "line_start": 181, "line_end": 203, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "Dict[str, Any]", "docstring": "获取模板信息\n\nArgs:\n template_name: 模板名称\n\nReturns:\n 模板信息字典", "is_async": false, "decorators": [], "code": " def get_template_info(self, template_name: str) -> Dict[str, Any]:\n \"\"\"\n 获取模板信息\n\n Args:\n template_name: 模板名称\n\n Returns:\n 模板信息字典\n \"\"\"\n if template_name not in self.templates:\n raise ResourceNotFoundError(f\"模板 '{template_name}' 不存在\")\n \n template_class = self.templates[template_name]\n \n return {\n \"name\": template_name,\n \"class_name\": template_class.__name__,\n \"description\": getattr(template_class, \"__doc__\", \"无描述\"),\n \"supported_features\": getattr(template_class, \"SUPPORTED_FEATURES\", []),\n \"default_size\": self.poster_config.default_size,\n \"is_cached\": template_name in self._template_cache\n }", "code_hash": "387fec9e3ad6d56f3fcc5e4b35e86f6e" }, { "name": "get_all_templates_info", "line_start": 205, "line_end": 212, "args": [ { "name": "self" } ], "return_type": "Dict[str, Dict[str, Any]]", "docstring": "获取所有模板的信息\n\nReturns:\n 模板信息字典", "is_async": false, "decorators": [], "code": " def get_all_templates_info(self) -> Dict[str, Dict[str, Any]]:\n \"\"\"\n 获取所有模板的信息\n\n Returns:\n 模板信息字典\n \"\"\"\n return {name: self.get_template_info(name) for name in self.templates.keys()}", "code_hash": "2462ac119f22a0ed50f3667b0ee8482f" }, { "name": "validate_template_config", "line_start": 214, "line_end": 261, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "Dict[str, Any]", "docstring": "验证模板配置\n\nArgs:\n template_name: 模板名称\n\nReturns:\n 验证结果", "is_async": false, "decorators": [], "code": " def validate_template_config(self, template_name: str) -> Dict[str, Any]:\n \"\"\"\n 验证模板配置\n\n Args:\n template_name: 模板名称\n\n Returns:\n 验证结果\n \"\"\"\n validation_result = {\n \"template_name\": template_name,\n \"exists\": template_name in self.templates,\n \"config_valid\": True,\n \"missing_resources\": [],\n \"warnings\": []\n }\n \n if not validation_result[\"exists\"]:\n validation_result[\"config_valid\"] = False\n return validation_result\n \n try:\n # 检查字体资源\n font_dir = self._get_font_directory()\n if not font_dir or not Path(font_dir).exists():\n validation_result[\"missing_resources\"].append(\"font_directory\")\n validation_result[\"warnings\"].append(\"字体目录不存在,可能影响文本渲染\")\n \n # 检查模板特定资源\n if template_name == \"vibrant\":\n # 检查毛玻璃效果配置\n if not self.poster_config.glass_effect:\n validation_result[\"warnings\"].append(\"缺少毛玻璃效果配置\")\n \n # 尝试创建模板实例\n try:\n template = self.get_template(template_name)\n validation_result[\"instance_created\"] = True\n except Exception as e:\n validation_result[\"config_valid\"] = False\n validation_result[\"warnings\"].append(f\"模板实例创建失败: {str(e)}\")\n \n except Exception as e:\n validation_result[\"config_valid\"] = False\n validation_result[\"warnings\"].append(f\"配置验证失败: {str(e)}\")\n \n return validation_result", "code_hash": "47c7a5724e486001f69d6f16f01680d9" }, { "name": "clear_cache", "line_start": 263, "line_end": 266, "args": [ { "name": "self" } ], "return_type": "None", "docstring": "清除模板实例缓存", "is_async": false, "decorators": [], "code": " def clear_cache(self) -> None:\n \"\"\"清除模板实例缓存\"\"\"\n self._template_cache.clear()\n logger.info(\"模板缓存已清除\")", "code_hash": "d9a9fc021e7992f3bfb624ecd2128b72" }, { "name": "get_cache_info", "line_start": 268, "line_end": 274, "args": [ { "name": "self" } ], "return_type": "Dict[str, Any]", "docstring": "获取缓存信息", "is_async": false, "decorators": [], "code": " def get_cache_info(self) -> Dict[str, Any]:\n \"\"\"获取缓存信息\"\"\"\n return {\n \"cached_templates\": list(self._template_cache.keys()),\n \"cache_size\": len(self._template_cache),\n \"total_templates\": len(self.templates)\n }", "code_hash": "89be3327b5b9fca5b757eff7214fb630" }, { "name": "reload_template", "line_start": 276, "line_end": 285, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "None", "docstring": "重新加载模板\n\nArgs:\n template_name: 模板名称", "is_async": false, "decorators": [], "code": " def reload_template(self, template_name: str) -> None:\n \"\"\"\n 重新加载模板\n\n Args:\n template_name: 模板名称\n \"\"\"\n if template_name in self._template_cache:\n del self._template_cache[template_name]\n logger.info(f\"模板 '{template_name}' 已重新加载\")", "code_hash": "a759f1f9f6579a3e959c07863718a447" }, { "name": "get_manager_info", "line_start": 287, "line_end": 301, "args": [ { "name": "self" } ], "return_type": "Dict[str, Any]", "docstring": "获取管理器信息", "is_async": false, "decorators": [], "code": " def get_manager_info(self) -> Dict[str, Any]:\n \"\"\"获取管理器信息\"\"\"\n return {\n \"available_templates\": self.get_available_templates(),\n \"cache_info\": self.get_cache_info(),\n \"poster_config\": {\n \"default_size\": self.poster_config.default_size,\n \"available_themes\": list(self.poster_config.color_themes.keys()),\n \"font_configs\": list(self.poster_config.font_configs.keys())\n },\n \"resource_paths\": {\n \"font_directory\": self._get_font_directory(),\n \"assets_directory\": self._get_assets_directory()\n }\n } ", "code_hash": "5dca79d3e564d65fe2d567dfb629dc25" } ], "classes": [ { "name": "TemplateManager", "line_start": 20, "line_end": 301, "bases": [], "methods": [ { "name": "__init__", "line_start": 26, "line_end": 47, "args": [ { "name": "self" }, { "name": "poster_config", "type_hint": "PosterGenerationConfig" }, { "name": "resource_config", "type_hint": "ResourceConfig" } ], "return_type": null, "docstring": "初始化模板管理器\n\nArgs:\n poster_config: 海报生成配置\n resource_config: 资源配置", "is_async": false, "decorators": [], "code": " def __init__(self, poster_config: PosterGenerationConfig, resource_config: ResourceConfig):\n \"\"\"\n 初始化模板管理器\n\n Args:\n poster_config: 海报生成配置\n resource_config: 资源配置\n \"\"\"\n self.poster_config = poster_config\n self.resource_config = resource_config\n \n # 注册内置模板\n self.templates: Dict[str, Type[BaseTemplate]] = {\n \"vibrant\": VibrantTemplate,\n \"business\": BusinessTemplate,\n \"collage\": CollageTemplate\n }\n \n # 模板实例缓存\n self._template_cache: Dict[str, BaseTemplate] = {}\n \n logger.info(f\"模板管理器初始化完成,注册模板: {list(self.templates.keys())}\")", "code_hash": "9f217b77b8a3bf843d78dfb35dcfa757" }, { "name": "get_template", "line_start": 49, "line_end": 92, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "BaseTemplate", "docstring": "获取模板实例\n\nArgs:\n template_name: 模板名称\n\nReturns:\n 模板实例\n\nRaises:\n ResourceNotFoundError: 模板不存在时抛出", "is_async": false, "decorators": [], "code": " def get_template(self, template_name: str) -> BaseTemplate:\n \"\"\"\n 获取模板实例\n\n Args:\n template_name: 模板名称\n\n Returns:\n 模板实例\n\n Raises:\n ResourceNotFoundError: 模板不存在时抛出\n \"\"\"\n if template_name not in self.templates:\n available_templates = list(self.templates.keys())\n raise ResourceNotFoundError(\n f\"模板 '{template_name}' 不存在。可用模板: {available_templates}\"\n )\n \n # 检查缓存\n if template_name in self._template_cache:\n return self._template_cache[template_name]\n \n try:\n # 创建模板实例\n template_class = self.templates[template_name]\n \n # 获取模板配置\n template_config = self._get_template_config(template_name)\n \n # 实例化模板\n template_instance = template_class(\n size=self.poster_config.default_size,\n config=template_config\n )\n \n # 缓存实例\n self._template_cache[template_name] = template_instance\n \n logger.debug(f\"模板 '{template_name}' 创建成功\")\n return template_instance\n \n except Exception as e:\n raise PosterGenerationError(f\"创建模板 '{template_name}' 失败: {str(e)}\")", "code_hash": "dfa7af216e3c470143e8e3577de2cac5" }, { "name": "_get_template_config", "line_start": 94, "line_end": 126, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "Dict[str, Any]", "docstring": "获取模板特定的配置", "is_async": false, "decorators": [], "code": " def _get_template_config(self, template_name: str) -> Dict[str, Any]:\n \"\"\"获取模板特定的配置\"\"\"\n \n # 基础配置\n base_config = {\n \"size\": self.poster_config.default_size,\n \"color_themes\": self.poster_config.color_themes,\n \"font_configs\": self.poster_config.font_configs,\n \"text_effects\": self.poster_config.text_effects\n }\n \n # 模板特定配置\n if template_name == \"vibrant\":\n base_config.update({\n \"glass_effect\": self.poster_config.glass_effect,\n \"default_theme\": self.poster_config.default_color_theme\n })\n elif template_name == \"business\":\n base_config.update({\n \"professional_colors\": True,\n \"layout_style\": \"symmetrical\"\n })\n elif template_name == \"collage\":\n base_config.update({\n \"grid_style\": \"dynamic\",\n \"max_images\": 6\n })\n \n # 添加资源路径\n base_config[\"font_directory\"] = self._get_font_directory()\n base_config[\"assets_directory\"] = self._get_assets_directory()\n \n return base_config", "code_hash": "6790e467a54e9d01db8e4abd9d1d16d9" }, { "name": "_get_font_directory", "line_start": 128, "line_end": 131, "args": [ { "name": "self" } ], "return_type": "Optional[str]", "docstring": "获取字体目录路径", "is_async": false, "decorators": [], "code": " def _get_font_directory(self) -> Optional[str]:\n \"\"\"获取字体目录路径\"\"\"\n font_dir = self.resource_config.find_resource_directory(\"fonts\")\n return str(font_dir) if font_dir else None", "code_hash": "0bab147fb055ea6b8819c0adf920cc90" }, { "name": "_get_assets_directory", "line_start": 133, "line_end": 136, "args": [ { "name": "self" } ], "return_type": "Optional[str]", "docstring": "获取资源目录路径", "is_async": false, "decorators": [], "code": " def _get_assets_directory(self) -> Optional[str]:\n \"\"\"获取资源目录路径\"\"\"\n assets_dir = self.resource_config.find_resource_directory(\"images\")\n return str(assets_dir) if assets_dir else None", "code_hash": "5238f113782057f60af0684f23bcd352" }, { "name": "register_template", "line_start": 138, "line_end": 155, "args": [ { "name": "self" }, { "name": "name", "type_hint": "str" }, { "name": "template_class", "type_hint": "Type[BaseTemplate]" } ], "return_type": "None", "docstring": "注册新模板\n\nArgs:\n name: 模板名称\n template_class: 模板类", "is_async": false, "decorators": [], "code": " def register_template(self, name: str, template_class: Type[BaseTemplate]) -> None:\n \"\"\"\n 注册新模板\n\n Args:\n name: 模板名称\n template_class: 模板类\n \"\"\"\n if not issubclass(template_class, BaseTemplate):\n raise ValueError(f\"模板类必须继承自 BaseTemplate\")\n \n self.templates[name] = template_class\n \n # 清除缓存中的旧实例(如果存在)\n if name in self._template_cache:\n del self._template_cache[name]\n \n logger.info(f\"模板 '{name}' 注册成功\")", "code_hash": "bd8c4e627dcd1f1190d60b5393d3f9ba" }, { "name": "unregister_template", "line_start": 157, "line_end": 170, "args": [ { "name": "self" }, { "name": "name", "type_hint": "str" } ], "return_type": "None", "docstring": "注销模板\n\nArgs:\n name: 模板名称", "is_async": false, "decorators": [], "code": " def unregister_template(self, name: str) -> None:\n \"\"\"\n 注销模板\n\n Args:\n name: 模板名称\n \"\"\"\n if name in self.templates:\n del self.templates[name]\n \n if name in self._template_cache:\n del self._template_cache[name]\n \n logger.info(f\"模板 '{name}' 已注销\")", "code_hash": "4125fedc101fc98e48d08021396e1d1b" }, { "name": "get_available_templates", "line_start": 172, "line_end": 179, "args": [ { "name": "self" } ], "return_type": "List[str]", "docstring": "获取可用模板列表\n\nReturns:\n 模板名称列表", "is_async": false, "decorators": [], "code": " def get_available_templates(self) -> List[str]:\n \"\"\"\n 获取可用模板列表\n\n Returns:\n 模板名称列表\n \"\"\"\n return list(self.templates.keys())", "code_hash": "033bb3b15cfae0b6070f4384941d5f73" }, { "name": "get_template_info", "line_start": 181, "line_end": 203, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "Dict[str, Any]", "docstring": "获取模板信息\n\nArgs:\n template_name: 模板名称\n\nReturns:\n 模板信息字典", "is_async": false, "decorators": [], "code": " def get_template_info(self, template_name: str) -> Dict[str, Any]:\n \"\"\"\n 获取模板信息\n\n Args:\n template_name: 模板名称\n\n Returns:\n 模板信息字典\n \"\"\"\n if template_name not in self.templates:\n raise ResourceNotFoundError(f\"模板 '{template_name}' 不存在\")\n \n template_class = self.templates[template_name]\n \n return {\n \"name\": template_name,\n \"class_name\": template_class.__name__,\n \"description\": getattr(template_class, \"__doc__\", \"无描述\"),\n \"supported_features\": getattr(template_class, \"SUPPORTED_FEATURES\", []),\n \"default_size\": self.poster_config.default_size,\n \"is_cached\": template_name in self._template_cache\n }", "code_hash": "387fec9e3ad6d56f3fcc5e4b35e86f6e" }, { "name": "get_all_templates_info", "line_start": 205, "line_end": 212, "args": [ { "name": "self" } ], "return_type": "Dict[str, Dict[str, Any]]", "docstring": "获取所有模板的信息\n\nReturns:\n 模板信息字典", "is_async": false, "decorators": [], "code": " def get_all_templates_info(self) -> Dict[str, Dict[str, Any]]:\n \"\"\"\n 获取所有模板的信息\n\n Returns:\n 模板信息字典\n \"\"\"\n return {name: self.get_template_info(name) for name in self.templates.keys()}", "code_hash": "2462ac119f22a0ed50f3667b0ee8482f" }, { "name": "validate_template_config", "line_start": 214, "line_end": 261, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "Dict[str, Any]", "docstring": "验证模板配置\n\nArgs:\n template_name: 模板名称\n\nReturns:\n 验证结果", "is_async": false, "decorators": [], "code": " def validate_template_config(self, template_name: str) -> Dict[str, Any]:\n \"\"\"\n 验证模板配置\n\n Args:\n template_name: 模板名称\n\n Returns:\n 验证结果\n \"\"\"\n validation_result = {\n \"template_name\": template_name,\n \"exists\": template_name in self.templates,\n \"config_valid\": True,\n \"missing_resources\": [],\n \"warnings\": []\n }\n \n if not validation_result[\"exists\"]:\n validation_result[\"config_valid\"] = False\n return validation_result\n \n try:\n # 检查字体资源\n font_dir = self._get_font_directory()\n if not font_dir or not Path(font_dir).exists():\n validation_result[\"missing_resources\"].append(\"font_directory\")\n validation_result[\"warnings\"].append(\"字体目录不存在,可能影响文本渲染\")\n \n # 检查模板特定资源\n if template_name == \"vibrant\":\n # 检查毛玻璃效果配置\n if not self.poster_config.glass_effect:\n validation_result[\"warnings\"].append(\"缺少毛玻璃效果配置\")\n \n # 尝试创建模板实例\n try:\n template = self.get_template(template_name)\n validation_result[\"instance_created\"] = True\n except Exception as e:\n validation_result[\"config_valid\"] = False\n validation_result[\"warnings\"].append(f\"模板实例创建失败: {str(e)}\")\n \n except Exception as e:\n validation_result[\"config_valid\"] = False\n validation_result[\"warnings\"].append(f\"配置验证失败: {str(e)}\")\n \n return validation_result", "code_hash": "47c7a5724e486001f69d6f16f01680d9" }, { "name": "clear_cache", "line_start": 263, "line_end": 266, "args": [ { "name": "self" } ], "return_type": "None", "docstring": "清除模板实例缓存", "is_async": false, "decorators": [], "code": " def clear_cache(self) -> None:\n \"\"\"清除模板实例缓存\"\"\"\n self._template_cache.clear()\n logger.info(\"模板缓存已清除\")", "code_hash": "d9a9fc021e7992f3bfb624ecd2128b72" }, { "name": "get_cache_info", "line_start": 268, "line_end": 274, "args": [ { "name": "self" } ], "return_type": "Dict[str, Any]", "docstring": "获取缓存信息", "is_async": false, "decorators": [], "code": " def get_cache_info(self) -> Dict[str, Any]:\n \"\"\"获取缓存信息\"\"\"\n return {\n \"cached_templates\": list(self._template_cache.keys()),\n \"cache_size\": len(self._template_cache),\n \"total_templates\": len(self.templates)\n }", "code_hash": "89be3327b5b9fca5b757eff7214fb630" }, { "name": "reload_template", "line_start": 276, "line_end": 285, "args": [ { "name": "self" }, { "name": "template_name", "type_hint": "str" } ], "return_type": "None", "docstring": "重新加载模板\n\nArgs:\n template_name: 模板名称", "is_async": false, "decorators": [], "code": " def reload_template(self, template_name: str) -> None:\n \"\"\"\n 重新加载模板\n\n Args:\n template_name: 模板名称\n \"\"\"\n if template_name in self._template_cache:\n del self._template_cache[template_name]\n logger.info(f\"模板 '{template_name}' 已重新加载\")", "code_hash": "a759f1f9f6579a3e959c07863718a447" }, { "name": "get_manager_info", "line_start": 287, "line_end": 301, "args": [ { "name": "self" } ], "return_type": "Dict[str, Any]", "docstring": "获取管理器信息", "is_async": false, "decorators": [], "code": " def get_manager_info(self) -> Dict[str, Any]:\n \"\"\"获取管理器信息\"\"\"\n return {\n \"available_templates\": self.get_available_templates(),\n \"cache_info\": self.get_cache_info(),\n \"poster_config\": {\n \"default_size\": self.poster_config.default_size,\n \"available_themes\": list(self.poster_config.color_themes.keys()),\n \"font_configs\": list(self.poster_config.font_configs.keys())\n },\n \"resource_paths\": {\n \"font_directory\": self._get_font_directory(),\n \"assets_directory\": self._get_assets_directory()\n }\n } ", "code_hash": "5dca79d3e564d65fe2d567dfb629dc25" } ], "docstring": "模板管理器\n负责注册、管理和提供海报模板", "decorators": [], "code": "class TemplateManager:\n \"\"\"\n 模板管理器\n 负责注册、管理和提供海报模板\n \"\"\"\n\n def __init__(self, poster_config: PosterGenerationConfig, resource_config: ResourceConfig):\n \"\"\"\n 初始化模板管理器\n\n Args:\n poster_config: 海报生成配置\n resource_config: 资源配置\n \"\"\"\n self.poster_config = poster_config\n self.resource_config = resource_config\n \n # 注册内置模板\n self.templates: Dict[str, Type[BaseTemplate]] = {\n \"vibrant\": VibrantTemplate,\n \"business\": BusinessTemplate,\n \"collage\": CollageTemplate\n }\n \n # 模板实例缓存\n self._template_cache: Dict[str, BaseTemplate] = {}\n \n logger.info(f\"模板管理器初始化完成,注册模板: {list(self.templates.keys())}\")\n\n def get_template(self, template_name: str) -> BaseTemplate:\n \"\"\"\n 获取模板实例\n\n Args:\n template_name: 模板名称\n\n Returns:\n 模板实例\n\n Raises:\n ResourceNotFoundError: 模板不存在时抛出\n \"\"\"\n if template_name not in self.templates:\n available_templates = list(self.templates.keys())\n raise ResourceNotFoundError(\n f\"模板 '{template_name}' 不存在。可用模板: {available_templates}\"\n )\n \n # 检查缓存\n if template_name in self._template_cache:\n return self._template_cache[template_name]\n \n try:\n # 创建模板实例\n template_class = self.templates[template_name]\n \n # 获取模板配置\n template_config = self._get_template_config(template_name)\n \n # 实例化模板\n template_instance = template_class(\n size=self.poster_config.default_size,\n config=template_config\n )\n \n # 缓存实例\n self._template_cache[template_name] = template_instance\n \n logger.debug(f\"模板 '{template_name}' 创建成功\")\n return template_instance\n \n except Exception as e:\n raise PosterGenerationError(f\"创建模板 '{template_name}' 失败: {str(e)}\")\n\n def _get_template_config(self, template_name: str) -> Dict[str, Any]:\n \"\"\"获取模板特定的配置\"\"\"\n \n # 基础配置\n base_config = {\n \"size\": self.poster_config.default_size,\n \"color_themes\": self.poster_config.color_themes,\n \"font_configs\": self.poster_config.font_configs,\n \"text_effects\": self.poster_config.text_effects\n }\n \n # 模板特定配置\n if template_name == \"vibrant\":\n base_config.update({\n \"glass_effect\": self.poster_config.glass_effect,\n \"default_theme\": self.poster_config.default_color_theme\n })\n elif template_name == \"business\":\n base_config.update({\n \"professional_colors\": True,\n \"layout_style\": \"symmetrical\"\n })\n elif template_name == \"collage\":\n base_config.update({\n \"grid_style\": \"dynamic\",\n \"max_images\": 6\n })\n \n # 添加资源路径\n base_config[\"font_directory\"] = self._get_font_directory()\n base_config[\"assets_directory\"] = self._get_assets_directory()\n \n return base_config\n\n def _get_font_directory(self) -> Optional[str]:\n \"\"\"获取字体目录路径\"\"\"\n font_dir = self.resource_config.find_resource_directory(\"fonts\")\n return str(font_dir) if font_dir else None\n\n def _get_assets_directory(self) -> Optional[str]:\n \"\"\"获取资源目录路径\"\"\"\n assets_dir = self.resource_config.find_resource_directory(\"images\")\n return str(assets_dir) if assets_dir else None\n\n def register_template(self, name: str, template_class: Type[BaseTemplate]) -> None:\n \"\"\"\n 注册新模板\n\n Args:\n name: 模板名称\n template_class: 模板类\n \"\"\"\n if not issubclass(template_class, BaseTemplate):\n raise ValueError(f\"模板类必须继承自 BaseTemplate\")\n \n self.templates[name] = template_class\n \n # 清除缓存中的旧实例(如果存在)\n if name in self._template_cache:\n del self._template_cache[name]\n \n logger.info(f\"模板 '{name}' 注册成功\")\n\n def unregister_template(self, name: str) -> None:\n \"\"\"\n 注销模板\n\n Args:\n name: 模板名称\n \"\"\"\n if name in self.templates:\n del self.templates[name]\n \n if name in self._template_cache:\n del self._template_cache[name]\n \n logger.info(f\"模板 '{name}' 已注销\")\n\n def get_available_templates(self) -> List[str]:\n \"\"\"\n 获取可用模板列表\n\n Returns:\n 模板名称列表\n \"\"\"\n return list(self.templates.keys())\n\n def get_template_info(self, template_name: str) -> Dict[str, Any]:\n \"\"\"\n 获取模板信息\n\n Args:\n template_name: 模板名称\n\n Returns:\n 模板信息字典\n \"\"\"\n if template_name not in self.templates:\n raise ResourceNotFoundError(f\"模板 '{template_name}' 不存在\")\n \n template_class = self.templates[template_name]\n \n return {\n \"name\": template_name,\n \"class_name\": template_class.__name__,\n \"description\": getattr(template_class, \"__doc__\", \"无描述\"),\n \"supported_features\": getattr(template_class, \"SUPPORTED_FEATURES\", []),\n \"default_size\": self.poster_config.default_size,\n \"is_cached\": template_name in self._template_cache\n }\n\n def get_all_templates_info(self) -> Dict[str, Dict[str, Any]]:\n \"\"\"\n 获取所有模板的信息\n\n Returns:\n 模板信息字典\n \"\"\"\n return {name: self.get_template_info(name) for name in self.templates.keys()}\n\n def validate_template_config(self, template_name: str) -> Dict[str, Any]:\n \"\"\"\n 验证模板配置\n\n Args:\n template_name: 模板名称\n\n Returns:\n 验证结果\n \"\"\"\n validation_result = {\n \"template_name\": template_name,\n \"exists\": template_name in self.templates,\n \"config_valid\": True,\n \"missing_resources\": [],\n \"warnings\": []\n }\n \n if not validation_result[\"exists\"]:\n validation_result[\"config_valid\"] = False\n return validation_result\n \n try:\n # 检查字体资源\n font_dir = self._get_font_directory()\n if not font_dir or not Path(font_dir).exists():\n validation_result[\"missing_resources\"].append(\"font_directory\")\n validation_result[\"warnings\"].append(\"字体目录不存在,可能影响文本渲染\")\n \n # 检查模板特定资源\n if template_name == \"vibrant\":\n # 检查毛玻璃效果配置\n if not self.poster_config.glass_effect:\n validation_result[\"warnings\"].append(\"缺少毛玻璃效果配置\")\n \n # 尝试创建模板实例\n try:\n template = self.get_template(template_name)\n validation_result[\"instance_created\"] = True\n except Exception as e:\n validation_result[\"config_valid\"] = False\n validation_result[\"warnings\"].append(f\"模板实例创建失败: {str(e)}\")\n \n except Exception as e:\n validation_result[\"config_valid\"] = False\n validation_result[\"warnings\"].append(f\"配置验证失败: {str(e)}\")\n \n return validation_result\n\n def clear_cache(self) -> None:\n \"\"\"清除模板实例缓存\"\"\"\n self._template_cache.clear()\n logger.info(\"模板缓存已清除\")\n\n def get_cache_info(self) -> Dict[str, Any]:\n \"\"\"获取缓存信息\"\"\"\n return {\n \"cached_templates\": list(self._template_cache.keys()),\n \"cache_size\": len(self._template_cache),\n \"total_templates\": len(self.templates)\n }\n\n def reload_template(self, template_name: str) -> None:\n \"\"\"\n 重新加载模板\n\n Args:\n template_name: 模板名称\n \"\"\"\n if template_name in self._template_cache:\n del self._template_cache[template_name]\n logger.info(f\"模板 '{template_name}' 已重新加载\")\n\n def get_manager_info(self) -> Dict[str, Any]:\n \"\"\"获取管理器信息\"\"\"\n return {\n \"available_templates\": self.get_available_templates(),\n \"cache_info\": self.get_cache_info(),\n \"poster_config\": {\n \"default_size\": self.poster_config.default_size,\n \"available_themes\": list(self.poster_config.color_themes.keys()),\n \"font_configs\": list(self.poster_config.font_configs.keys())\n },\n \"resource_paths\": {\n \"font_directory\": self._get_font_directory(),\n \"assets_directory\": self._get_assets_directory()\n }\n } ", "code_hash": "925cde39d36ee20795f778a98b77571f" } ], "imports": [ { "type": "import", "modules": [ "logging" ], "aliases": [] }, { "type": "from_import", "module": "typing", "names": [ "Dict", "Any", "List", "Optional", "Type" ], "aliases": [], "level": 0 }, { "type": "from_import", "module": "pathlib", "names": [ "Path" ], "aliases": [], "level": 0 }, { "type": "from_import", "module": "config", "names": [ "PosterGenerationConfig", "ResourceConfig" ], "aliases": [], "level": 2 }, { "type": "from_import", "module": "exceptions", "names": [ "ResourceNotFoundError", "PosterGenerationError" ], "aliases": [], "level": 2 }, { "type": "from_import", "module": "templates", "names": [ "BaseTemplate", "VibrantTemplate", "BusinessTemplate", "CollageTemplate" ], "aliases": [], "level": 1 } ], "constants": [], "docstring": "Template Manager\n模板管理器 - 负责管理和加载海报模板", "content_hash": "bb031cdb8b5838feb5a2d3d51e319d8a" }