From d9cbab16b290321ad2479ea5b6564d8c2c16bc53 Mon Sep 17 00:00:00 2001 From: mh04194357 Date: Tue, 23 Dec 2025 13:52:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .autograde/generate_pdf_report.py | 157 +++++++++++++++++++++++++++++- .gitea/workflows/autograde.yml | 5 +- 2 files changed, 157 insertions(+), 5 deletions(-) diff --git a/.autograde/generate_pdf_report.py b/.autograde/generate_pdf_report.py index 2938797..6ce6be8 100644 --- a/.autograde/generate_pdf_report.py +++ b/.autograde/generate_pdf_report.py @@ -1 +1,156 @@ -print("PDF generation skipped") +#!/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() diff --git a/.gitea/workflows/autograde.yml b/.gitea/workflows/autograde.yml index 18beead..7f54fd3 100644 --- a/.gitea/workflows/autograde.yml +++ b/.gitea/workflows/autograde.yml @@ -296,10 +296,7 @@ jobs: print("Metadata upload skipped (local mode)") UPLOAD_SCRIPT - # Create generate_pdf_report.py (stub) - cat > .autograde/generate_pdf_report.py << 'PDF_SCRIPT' - print("PDF generation skipped (local mode)") - PDF_SCRIPT + # Note: generate_pdf_report.py is NOT overwritten - use the one from repo echo "✅ Local grading scripts created"