doc_generator.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. SDK 文档生成器
  5. 模块化的文档生成系统,支持配置化的文档构建
  6. """
  7. import sys
  8. import os
  9. from pathlib import Path
  10. # 添加当前目录到Python路径
  11. sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
  12. from utils import ConfigLoader, ProjectScanner, FileProcessor, IndexGenerator
  13. class DocGenerator:
  14. def __init__(self, config_path: str = "config.yaml"):
  15. """初始化文档生成器"""
  16. self.config_loader = ConfigLoader(config_path)
  17. self.config_loader.validate_config()
  18. # 获取配置信息
  19. self.project_info = self.config_loader.get_project_info()
  20. self.repository_info = self.config_loader.get_repository_info()
  21. self.categories = self.config_loader.get_categories()
  22. self.generation_config = self.config_loader.get_generation_config()
  23. # 初始化组件
  24. self.project_scanner = ProjectScanner(
  25. self.repository_info.get('projects_dir', '../projects'),
  26. self.categories
  27. )
  28. self.file_processor = FileProcessor(
  29. self.repository_info.get('projects_dir', '../projects'),
  30. self.repository_info.get('docs_dir', '.'),
  31. self.generation_config
  32. )
  33. self.index_generator = IndexGenerator(
  34. self.repository_info.get('docs_dir', '.'),
  35. self.file_processor
  36. )
  37. def run(self):
  38. """运行文档生成流程"""
  39. print("开始生成文档...")
  40. try:
  41. # 1. 清理目标目录
  42. print("清理目标目录...")
  43. self.file_processor.cleanup_dest_dir()
  44. # 2. 扫描项目
  45. print("扫描项目...")
  46. category_mapping = self.project_scanner.scan_projects()
  47. # 3. 验证项目
  48. if not self.project_scanner.validate_projects():
  49. print("警告: 部分项目目录不存在")
  50. # 4. 处理每个分类
  51. for category, config in self.categories.items():
  52. projects = category_mapping.get(category, [])
  53. if projects:
  54. category_name = config.get('name', category)
  55. print(f"\n处理 {category_name} 分类...")
  56. for project in projects:
  57. self.file_processor.copy_project_files(project, category)
  58. # 5. 生成索引文件
  59. print("\n生成索引文件...")
  60. self.index_generator.generate_all_indexes(
  61. self.categories,
  62. category_mapping,
  63. self.project_info
  64. )
  65. print("\n文档生成完成!")
  66. return True
  67. except Exception as e:
  68. print(f"文档生成失败: {e}")
  69. return False
  70. def get_statistics(self):
  71. """获取生成统计信息"""
  72. stats = {
  73. 'total_projects': len(self.project_scanner.get_all_projects()),
  74. 'categories': {}
  75. }
  76. for category, projects in self.project_scanner.category_mapping.items():
  77. stats['categories'][category] = len(projects)
  78. return stats
  79. def main():
  80. """主函数"""
  81. import argparse
  82. parser = argparse.ArgumentParser(description='SDK 文档生成器')
  83. parser.add_argument('--config', '-c', default='config.yaml',
  84. help='配置文件路径 (默认: config.yaml)')
  85. parser.add_argument('--stats', '-s', action='store_true',
  86. help='显示统计信息')
  87. args = parser.parse_args()
  88. try:
  89. generator = DocGenerator(args.config)
  90. if args.stats:
  91. # 只扫描项目,不生成文档
  92. generator.project_scanner.scan_projects()
  93. stats = generator.get_statistics()
  94. print("项目统计信息:")
  95. print(f"总项目数: {stats['total_projects']}")
  96. for category, count in stats['categories'].items():
  97. print(f"{category}: {count} 个项目")
  98. else:
  99. # 生成文档
  100. success = generator.run()
  101. if success:
  102. stats = generator.get_statistics()
  103. print(f"\n生成完成! 共处理 {stats['total_projects']} 个项目")
  104. else:
  105. sys.exit(1)
  106. except Exception as e:
  107. print(f"错误: {e}")
  108. sys.exit(1)
  109. if __name__ == "__main__":
  110. main()