{"repo": "bcefghj/learn-cs336", "files": {"generate_output.py": {"90036d51a0e9701b5f0fa7ef369791b7e08f18c9": {"t": 1785604021.3497481, "n": 8248, "h": "755d831c9594ba94", "c": "#!/usr/bin/env python3\n\"\"\"\nCS336 学习指南 - 多格式输出生成器\n生成 HTML 静态网站和 PDF 文档\n\"\"\"\n\nimport os\nimport glob\nimport markdown\nfrom pathlib import Path\n\nPROJECT_ROOT = Path(__file__).parent\nDOCS_DIR = PROJECT_ROOT / \"docs\"\nINTERVIEW_DIR = PROJECT_ROOT / \"interview\"\nOUTPUT_DIR = PROJECT_ROOT / \"output\"\nCOMICS_DIR = PROJECT_ROOT / \"comics\"\n\nOUTPUT_DIR.mkdir(exist_ok=True)\n\nHTML_TEMPLATE = \"\"\"\n\n\n \n \n {title}\n \n\n\n \n
\n {content}\n
\n \n\n\"\"\"\n\n\ndef md_to_html(md_text: str) -> str:\n extensions = [\n \"markdown.extensions.tables\",\n \"markdown.extensions.fenced_code\",\n \"markdown.extensions.codehilite\",\n \"markdown.extensions.toc\",\n ]\n return markdown.markdown(md_text, extensions=extensions)\n\n\ndef read_md_file(path: Path) -> str:\n try:\n return path.read_text(encoding=\"utf-8\")\n except Exception as e:\n return f\"*文件读取失败: {e}*\"\n\n\ndef generate_html():\n print(\"Generating HTML...\")\n\n sections = []\n\n sections.append('

目录

\")\n\n sections.append('

课程文档

')\n for f in doc_files:\n md_text = read_md_file(f)\n html_content = md_to_html(md_text)\n sections.append(\n f'
{html_content}
'\n )\n\n sections.append('

面试专区

')\n for f in interview_files:\n md_text = read_md_file(f)\n html_content = md_to_html(md_text)\n sections.append(\n f'
{html_content}
'\n )\n\n sections.append('

漫画图解

')\n sections.append('
')\n comic_files = sorted(COMICS_DIR.glob(\"*.png\"))\n for f in comic_files:\n rel_path = os.path.relpath(f, OUTPUT_DIR)\n sections.append(\n f'

{f.stem}

\"{f.stem}\"'\n )\n sections.append(\"
\")\n\n full_content = \"\\n\".join(sections)\n html_output = HTML_TEMPLATE.format(\n title=\"CS336 面试导向学习指南\", content=full_content\n )\n\n output_path = OUTPUT_DIR / \"index.html\"\n output_path.write_text(html_output, encoding=\"utf-8\")\n print(f\"HTML generated: {output_path}\")\n print(f\" Size: {output_path.stat().st_size / 1024:.1f} KB\")\n\n\ndef generate_combined_markdown():\n \"\"\"Generate a single combined markdown for PDF conversion.\"\"\"\n print(\"Generating combined markdown...\")\n\n parts = []\n parts.append(\"# CS336 面试导向学习指南\\n\\n\")\n parts.append(\"> Stanford CS336: Language Modeling from Scratch - 面试导向完整学习项目\\n\\n\")\n parts.append(\"---\\n\\n\")\n\n doc_files = sorted(DOCS_DIR.glob(\"*.md\"))\n for f in doc_files:\n parts.append(read_md_file(f))\n parts.append(\"\\n\\n---\\n\\n\")\n\n parts.append(\"# 面试专区\\n\\n\")\n interview_files = sorted(INTERVIEW_DIR.glob(\"*.md\"))\n for f in interview_files:\n parts.append(read_md_file(f))\n parts.append(\"\\n\\n---\\n\\n\")\n\n combined_path = OUTPUT_DIR / \"cs336-guide-combined.md\"\n combined_path.write_text(\"\\n\".join(parts), encoding=\"utf-8\")\n print(f\"Combined markdown: {combined_path}\")\n print(f\" Size: {combined_path.stat().st_size / 1024:.1f} KB\")\n return combined_path\n\n\ndef main():\n print(\"=\" * 60)\n print(\"CS336 学习指南 - 多格式输出生成器\")\n print(\"=\" * 60)\n\n generate_html()\n combined_md = generate_combined_markdown()\n\n print(\"\\n\" + \"=\" * 60)\n print(\"Generation complete!\")\n print(f\" HTML: {OUTPUT_DIR / 'index.html'}\")\n print(f\" Markdown: {combined_md}\")\n print()\n print(\"To generate PDF, install weasyprint and run:\")\n print(\" pip install weasyprint\")\n print(\" python -c \\\"\")\n print(\" from weasyprint import HTML\")\n print(\" HTML('output/index.html').write_pdf('output/cs336-guide.pdf')\")\n print(' \"')\n print(\"=\" * 60)\n\n\nif __name__ == \"__main__\":\n main()\n"}}}}