#!/usr/bin/env python3 """Generate PDF report from REPORT.md and FRONTEND.md""" import os import sys import argparse import json def read_file_content(path): if not path or not os.path.exists(path): return "" with open(path, 'r', encoding='utf-8') as f: return f.read() def main(): parser = argparse.ArgumentParser(description='Generate PDF grade report') parser.add_argument('--report', default='REPORT.md', help='Path to REPORT.md') parser.add_argument('--frontend', default='FRONTEND.md', help='Path to FRONTEND.md') parser.add_argument('--grade', default='final_grade.json', help='Path to grade JSON') parser.add_argument('--images', default='images', help='Path to images directory') parser.add_argument('--out', default='grade_report.pdf', help='Output PDF path') parser.add_argument('--student-id', default='', help='Student ID') parser.add_argument('--student-name', default='', help='Student name') parser.add_argument('--class-name', default='', help='Class name') parser.add_argument('--commit-sha', default='', help='Commit SHA') args = parser.parse_args() # Read grade data grade_data = {} if os.path.exists(args.grade): with open(args.grade, 'r', encoding='utf-8') as f: grade_data = json.load(f) # Read markdown content report_content = read_file_content(args.report) frontend_content = read_file_content(args.frontend) if not report_content and not frontend_content: print("No report content found, skipping PDF generation") return try: import markdown from weasyprint import HTML # Build HTML content html_parts = [] # Header with student info header = f"""

VibeVault 项目评分报告

学号: {args.student_id or 'N/A'}

姓名: {args.student_name or 'N/A'}

班级: {args.class_name or 'N/A'}

Commit: {args.commit_sha[:7] if args.commit_sha else 'N/A'}

""" html_parts.append(header) # Grade summary if grade_data: grade_html = f"""

成绩汇总

项目得分
编程测试{grade_data.get('programming', 0)}/60
报告{grade_data.get('report', 0)}/10
前端{grade_data.get('frontend', 0)}/10
总分{grade_data.get('total', 0)}/80
""" html_parts.append(grade_html) # Report content if report_content: report_html = markdown.markdown(report_content, extensions=['fenced_code', 'tables']) html_parts.append(f'
{report_html}
') # Frontend content if frontend_content: frontend_html = markdown.markdown(frontend_content, extensions=['fenced_code', 'tables']) html_parts.append(f'
{frontend_html}
') # Full HTML document full_html = f""" {''.join(html_parts)} """ # Generate PDF HTML(string=full_html, base_url=os.getcwd()).write_pdf(args.out) print(f"✅ PDF generated: {args.out}") except ImportError as e: print(f"Cannot generate PDF: {e}") print("Required: pip install markdown weasyprint") sys.exit(1) except Exception as e: print(f"PDF generation failed: {e}") sys.exit(1) if __name__ == "__main__": main()