Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/bcefghj_learn-cs336.json
T

1 line
9.0 KiB
JSON

{"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 = \"\"\"<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{title}</title>\n <style>\n * {{ margin: 0; padding: 0; box-sizing: border-box; }}\n body {{\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \n \"Helvetica Neue\", Arial, \"Noto Sans SC\", sans-serif;\n line-height: 1.8;\n color: #333;\n background: #f5f5f5;\n }}\n .container {{\n max-width: 960px;\n margin: 0 auto;\n padding: 20px;\n }}\n nav {{\n background: #1a1a2e;\n color: white;\n padding: 20px;\n position: sticky;\n top: 0;\n z-index: 100;\n box-shadow: 0 2px 10px rgba(0,0,0,0.3);\n }}\n nav h1 {{\n font-size: 1.4em;\n margin-bottom: 10px;\n }}\n nav a {{\n color: #64b5f6;\n text-decoration: none;\n margin-right: 15px;\n font-size: 0.9em;\n }}\n nav a:hover {{ color: #90caf9; text-decoration: underline; }}\n .content {{\n background: white;\n padding: 40px;\n margin: 20px 0;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n }}\n h1 {{ color: #1a1a2e; border-bottom: 3px solid #3f51b5; padding-bottom: 10px; margin: 30px 0 20px; }}\n h2 {{ color: #283593; margin: 25px 0 15px; }}\n h3 {{ color: #3949ab; margin: 20px 0 10px; }}\n h4 {{ color: #5c6bc0; margin: 15px 0 8px; }}\n pre {{\n background: #f8f9fa;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n padding: 16px;\n overflow-x: auto;\n font-size: 0.9em;\n line-height: 1.5;\n }}\n code {{\n background: #f0f0f0;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 0.9em;\n }}\n pre code {{ background: none; padding: 0; }}\n table {{\n border-collapse: collapse;\n width: 100%;\n margin: 15px 0;\n }}\n th, td {{\n border: 1px solid #ddd;\n padding: 10px 14px;\n text-align: left;\n }}\n th {{ background: #e8eaf6; font-weight: 600; }}\n tr:nth-child(even) {{ background: #fafafa; }}\n blockquote {{\n border-left: 4px solid #3f51b5;\n padding: 10px 20px;\n margin: 15px 0;\n background: #e8eaf6;\n border-radius: 0 4px 4px 0;\n }}\n img {{ max-width: 100%; height: auto; border-radius: 8px; margin: 10px 0; }}\n .toc {{\n background: #e8eaf6;\n padding: 20px 30px;\n border-radius: 8px;\n margin: 20px 0;\n }}\n .toc h2 {{ margin-top: 0; }}\n .toc ul {{ list-style: none; padding-left: 0; }}\n .toc li {{ padding: 4px 0; }}\n .toc a {{ color: #3f51b5; text-decoration: none; }}\n .toc a:hover {{ text-decoration: underline; }}\n footer {{\n text-align: center;\n padding: 30px;\n color: #888;\n font-size: 0.85em;\n }}\n @media (max-width: 768px) {{\n .content {{ padding: 20px; }}\n nav {{ padding: 15px; }}\n }}\n </style>\n</head>\n<body>\n <nav>\n <div class=\"container\">\n <h1>CS336 面试导向学习指南</h1>\n <div>\n <a href=\"#lessons\">课程文档</a>\n <a href=\"#interview\">面试专区</a>\n <a href=\"#code\">代码实现</a>\n <a href=\"#comics\">漫画图解</a>\n </div>\n </div>\n </nav>\n <div class=\"container\">\n {content}\n </div>\n <footer>\n <p>CS336 面试导向学习指南 | 基于 Stanford CS336: Language Modeling from Scratch</p>\n <p>本项目仅供学习参考,课程内容版权归 Stanford CS336 课程组所有</p>\n </footer>\n</body>\n</html>\"\"\"\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('<div class=\"toc\"><h2>目录</h2><ul>')\n sections.append('<li><strong>课程文档</strong></li>')\n\n doc_files = sorted(DOCS_DIR.glob(\"*.md\"))\n for f in doc_files:\n name = f.stem\n sections.append(f'<li><a href=\"#{name}\">{name}</a></li>')\n\n sections.append('<li><strong>面试专区</strong></li>')\n interview_files = sorted(INTERVIEW_DIR.glob(\"*.md\"))\n for f in interview_files:\n name = f.stem\n sections.append(f'<li><a href=\"#{name}\">{name}</a></li>')\n\n sections.append(\"</ul></div>\")\n\n sections.append('<h1 id=\"lessons\">课程文档</h1>')\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'<div class=\"content\" id=\"{f.stem}\">{html_content}</div>'\n )\n\n sections.append('<h1 id=\"interview\">面试专区</h1>')\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'<div class=\"content\" id=\"{f.stem}\">{html_content}</div>'\n )\n\n sections.append('<h1 id=\"comics\">漫画图解</h1>')\n sections.append('<div class=\"content\">')\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'<h3>{f.stem}</h3><img src=\"{rel_path}\" alt=\"{f.stem}\">'\n )\n sections.append(\"</div>\")\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"}}}}