647 lines
46 KiB
JSON
647 lines
46 KiB
JSON
{
|
|
"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"
|
|
} |