文章目录
- def create_simple_markdown(): “””创建简单的Markdown文件””” content = “””# 主标题 这是第一个段落。 ## 二级标题 这是第二个段落。 ### 三级标题 这是一个无序列表: – 项目1 – 项目2 – 项目3 这是一个有序列表: 1. 第一项 2. 第二项 3. 第三项 **粗体文本** 和 *斜体文本* `行内代码` [链接文本](https://example.com)  “”” with open(“simple_document.md”, “w”, encoding=”utf-8″) as f: f.write(content) print(“Markdown文件已创建: simple_document.md”) # 使用 create_simple_markdown()
- def create_dynamic_markdown(data): “””根据数据动态生成Markdown””” content = f”””# {data[‘title’]} **创建时间**: {data[‘date’]} **作者**: {data[‘author’]} ## 概述 {data[‘overview’]} ## 详细内容 {data[‘content’]} ## 特性 “”” # 添加列表 for feature in data[‘features’]: content += f”- {feature}n” content += f””” ## 代码示例 “`python {data[‘code_example’]}
- with open(“dynamic_document.md”, “w”, encoding=”utf-8″) as f: f.write(content) print(“动态Markdown文件已创建”)
- data = { ‘title’: ‘Python项目文档’, ‘date’: ‘2024-01-20′, ‘author’: ‘张三’, ‘overview’: ‘这是一个使用Python生成Markdown的示例项目。’, ‘content’: ‘详细说明了如何使用Python创建Markdown文件。’, ‘features’: [ ‘自动生成文档’, ‘支持多种格式’, ‘可自定义模板’, ‘易于扩展’ ], ‘code_example’: ‘print(“Hello, Markdown!”)’, ‘summary’: ‘这是一个非常有用的工具。’ } create_dynamic_markdown(data)
- #python from string import Template class MarkdownTemplate: “””Markdown模板生成器””” def __init__(self): self.templates = { ‘report’: self._report_template(), ‘api_doc’: self._api_doc_template(), ‘readme’: self._readme_template(), ‘note’: self._note_template() } def _report_template(self): “””报告模板””” return Template(“””# ${title} ## 基本信息 – **项目**: ${project} – **日期**: ${date} – **作者**: ${author} – **版本**: ${version} ## 执行摘要 ${summary} ## 详细内容 ${content} ## 结果分析 ${analysis} ## 结论 ${conclusion} ## 建议 ${recommendations} ## 附录 ${appendix} “””) def _readme_template(self): “””README模板””” return Template(“””# ${project_name} ${badges} ${description} ## ✨ 特性 ${features} ## 🚀 快速开始 ### 安装 “`bash ${install_command} “` ### 使用示例 “`python ${usage_example} “` ## 📖 文档 ${documentation} ## 🤝 贡献 ${contributing} ## 📄 许可证 ${license} ## 📞 联系方式 ${contact} “””) def _api_doc_template(self): “””API文档模板””” return Template(“””# ${api_name} API 文档 ## 概述 ${overview} ## 认证 ${authentication} ## 端点 ### ${endpoint_name} **URL**: `${url}` **方法**: ${method} **参数**: ${parameters} **响应**: “`json ${response_example} “` **错误码**: ${error_codes} ## 使用示例 ${usage_examples} “””) def generate(self, template_name, data, output_file=None): “””生成Markdown文件””” if template_name not in self.templates: raise ValueError(f”模板不存在: {template_name}”) template = self.templates[template_name] content = template.safe_substitute(data) if output_file: with open(output_file, “w”, encoding=”utf-8″) as f: f.write(content) print(f”Markdown文件已生成: {output_file}”) return content # 使用示例 md_generator = MarkdownTemplate() # 生成报告 report_data = { ‘title’: ‘季度项目报告’, ‘project’: ‘数据分析平台’, ‘date’: ‘2024-Q1’, ‘author’: ‘张三’, ‘version’: ‘1.0.0’, ‘summary’: ‘本季度项目进展顺利,完成了主要功能开发。’, ‘content’: ‘详细开发了数据导入、处理和可视化模块。’, ‘analysis’: ‘性能提升了30%,用户满意度达到95%。’, ‘conclusion’: ‘项目按计划推进,达到预期目标。’, ‘recommendations’: ‘建议增加AI分析功能。’, ‘appendix’: ‘详见附件文档。’ } report_md = md_generator.generate(‘report’, report_data, ‘季度报告.md’) # 生成README readme_data = { ‘project_name’: ‘Awesome Project’, ‘badges’: ‘[]’, ‘description’: ‘一个非常棒的项目,用于演示Markdown生成。’, ‘features’: ‘- 功能一n- 功能二n- 功能三’, ‘install_command’: ‘pip install awesome-project’, ‘usage_example’: ‘from awesome import Awesomenobj = Awesome()nobj.do_something()’, ‘documentation’: ‘详见 [文档网站](https://docs.example.com)’, ‘contributing’: ‘欢迎提交PR!’, ‘license’: ‘MIT License’, ‘contact’: ‘邮箱: contact@example.com’ } readme_md = md_generator.generate(‘readme’, readme_data, ‘README.md’)
- from jinja2 import Template, Environment, FileSystemLoader import os class JinjaMarkdownGenerator: “””使用Jinja2生成Markdown””” def __init__(self, template_dir=”templates”): self.env = Environment( loader=FileSystemLoader(template_dir), trim_blocks=True, lstrip_blocks=True, keep_trailing_newline=True ) def generate_from_template(self, template_name, context, output_file): “””从模板生成Markdown””” template = self.env.get_template(template_name) content = template.render(**context) with open(output_file, “w”, encoding=”utf-8″) as f: f.write(content) print(f”Markdown文件已生成: {output_file}”) return content # 创建模板目录和文件 os.makedirs(“templates”, exist_ok=True) # 创建report模板 (templates/report.md.j2) report_template_content = “””# {{ title }} ## 项目信息 – **项目名称**: {{ project_name }} – **版本**: v{{ version }} – **生成时间**: {{ generated_at }} ## 概述 {{ overview }} ## 详细分析 {% for section in sections %} ### {{ section.title }} {{ section.content }} {% if section.items %} **关键点**: {% for item in section.items %} – {{ item }} {% endfor %} {% endif %} {% endfor %} ## 数据统计 | 指标 | 数值 | 状态 | |——|——|——| {% for metric in metrics %} | {{ metric.name }} | {{ metric.value }} | {{ metric.status }} | {% endfor %} ## 代码示例 “`{{ code_language }} {{ code_example }}
- with open(“templates/report.md.j2”, “w”, encoding=“utf-8”) as f: f.write(report_template_content)
- generator = JinjaMarkdownGenerator(“templates”) context = { ‘title’: ‘项目分析报告’, ‘project_name’: ‘数据分析系统’, ‘version’: ‘1.2.0′, ‘generated_at’: ‘2024-01-20 10:30:00′, ‘overview’: ‘本报告分析了系统的运行情况和性能指标。’, ‘sections’: [ { ‘title’: ‘性能分析’, ‘content’: ‘系统性能良好,响应时间在预期范围内。’, ‘items’: [‘平均响应时间: 200ms’, ‘吞吐量: 1000 req/s’, ‘错误率: 0.1%’] }, { ‘title’: ‘用户分析’, ‘content’: ‘用户活跃度持续增长。’, ‘items’: [‘日活用户: 10,000′, ‘月活用户: 50,000′, ‘用户留存率: 85%’] } ], ‘metrics’: [ {‘name’: ‘CPU使用率’, ‘value’: ‘45%’, ‘status’: ‘正常’}, {‘name’: ‘内存使用率’, ‘value’: ‘60%’, ‘status’: ‘正常’}, {‘name’: ‘磁盘空间’, ‘value’: ‘75%’, ‘status’: ‘警告’}, {‘name’: ‘网络延迟’, ‘value’: ‘50ms’, ‘status’: ‘优秀’} ], ‘code_language’: ‘python’, ‘code_example’: ‘def analyze_data(data):n return process(data)’, ‘summary’: ‘系统运行稳定,建议关注磁盘空间使用情况。’ } generator.generate_from_template( ‘report.md.j2′, context, ‘项目分析报告.md’ )
- #python import markdown from markdown.extensions.toc import TocExtension from markdown.extensions.codehilite import CodeHiliteExtension from markdown.extensions.tables import TableExtension class MarkdownGenerator: “””高级Markdown生成器””” def __init__(self): self.elements = [] def add_title(self, text, level=1): “””添加标题””” prefix = ‘#’ * level self.elements.append(f”{prefix} {text}n”) return self def add_paragraph(self, text): “””添加段落””” self.elements.append(f”{text}nn”) return self def add_list(self, items, ordered=False): “””添加列表””” for i, item in enumerate(items): if ordered: self.elements.append(f”{i+1}. {item}n”) else: self.elements.append(f”- {item}n”) self.elements.append(“n”) return self def add_code_block(self, code, language=””): “””添加代码块””” self.elements.append(f”“`{language}nn“`nn”) return self def add_table(self, headers, rows): “””添加表格””” # 表头 header_row = “| ” + ” | “.join(headers) + ” |” separator = “| ” + ” | “.join([“—“] * len(headers)) + ” |” self.elements.append(header_row + “n”) self.elements.append(separator + “n”) # 数据行 for row in rows: row_str = “| ” + ” | “.join(str(cell) for cell in row) + ” |” self.elements.append(row_str + “n”) self.elements.append(“n”) return self def add_blockquote(self, text): “””添加引用””” lines = text.split(‘n’) for line in lines: self.elements.append(f”> {line}n”) self.elements.append(“n”) return self def add_horizontal_rule(self): “””添加水平线””” self.elements.append(“—nn”) return self def add_link(self, text, url): “””添加链接””” self.elements.append(f”[{text}]({url})nn”) return self def add_image(self, alt_text, url, title=””): “””添加图片””” if title: self.elements.append(f’nn’) else: self.elements.append(f’nn’) return self def generate(self, output_file=None): “””生成Markdown内容””” content = “”.join(self.elements) if output_file: with open(output_file, “w”, encoding=”utf-8″) as f: f.write(content) print(f”Markdown文件已生成: {output_file}”) return content # 使用示例 md = MarkdownGenerator() md.add_title(“Python学习笔记”, level=1) md.add_paragraph(“这是我的Python学习笔记,记录了一些重要的概念和示例。”) md.add_horizontal_rule() md.add_title(“基本语法”, level=2) md.add_paragraph(“Python的基本语法非常简洁。”) md.add_title(“数据类型”, level=3) md.add_list([ “整数 (int)”, “浮点数 (float)”, “字符串 (str)”, “列表 (list)”, “字典 (dict)” ]) md.add_title(“代码示例”, level=2) md.add_code_block(“def hello(name):n print(f’Hello, {name}!’)nnhello(‘World’)”, “python”) md.add_title(“数据结构对比”, level=2) md.add_table( [“数据结构”, “可变性”, “有序性”, “示例”], [ [“列表”, “可变”, “有序”, “[1, 2, 3]”], [“元组”, “不可变”, “有序”, “(1, 2, 3)”], [“集合”, “可变”, “无序”, “{1, 2, 3}”], [“字典”, “可变”, “有序(3.7+)”, “{‘a’: 1, ‘b’: 2}”] ] ) md.add_blockquote(“Python之禅:优美胜于丑陋,明了胜于晦涩。”) md.add_title(“参考资源”, level=2) md.add_link(“Python官方文档”, “https://docs.python.org”) md.add_image(“Python Logo”, “https://www.python.org/static/img/python-logo.png”, “Python官方Logo”) # 生成文件 content = md.generate(“学习笔记.md”)
- import mistune class MarkdownRenderer(mistune.HTMLRenderer): “””自定义Markdown渲染器(可用于反向生成)””” def __init__(self, escape=True): super().__init__(escape) self.output = [] def text(self, text): self.output.append(text) return text def paragraph(self, text): self.output.append(f”n{text}n”) return f”<p>{text}</p>” def generate_markdown(self): “””获取生成的Markdown内容””” return “”.join(self.output) # 使用mistune解析并生成 def convert_to_markdown(html_content): “””将HTML转换为Markdown(简单示例)””” # 注意:mistune主要是HTML转Markdown,这里展示反向思路 pass
- import json import yaml from typing import Dict, List, Any class DataToMarkdown: “””从数据结构生成Markdown””” def __init__(self, indent_size=2): self.indent_size = indent_size self.indent_char = ‘ ‘ def from_json(self, json_file: str, output_file: str = None) -> str: “””从JSON文件生成Markdown””” with open(json_file, ‘r’, encoding=’utf-8′) as f: data = json.load(f) return self._generate_from_dict(data, output_file) def from_yaml(self, yaml_file: str, output_file: str = None) -> str: “””从YAML文件生成Markdown””” with open(yaml_file, ‘r’, encoding=’utf-8′) as f: data = yaml.safe_load(f) return self._generate_from_dict(data, output_file) def from_dict(self, data: Dict, output_file: str = None) -> str: “””从字典生成Markdown””” return self._generate_from_dict(data, output_file) def _generate_from_dict(self, data: Dict, output_file: str = None) -> str: “””从字典生成Markdown内容””” lines = [] def process_value(key, value, level=0): indent = self.indent_char * self.indent_size * level if isinstance(value, dict): # 标题 lines.append(f”{indent}# {‘ ‘.join(key.split(‘_’)).title()}n”) # 处理字典的键值对 for k, v in value.items(): if isinstance(v, (dict, list)): process_value(k, v, level + 1) else: lines.append(f”{indent}- **{k.replace(‘_’, ‘ ‘).title()}**: {v}n”) lines.append(“n”) elif isinstance(value, list): # 列表标题 lines.append(f”{indent}## {‘ ‘.join(key.split(‘_’)).title()}n”) for item in value: if isinstance(item, dict): lines.append(f”{indent}###n”) for k, v in item.items(): lines.append(f”{indent}- **{k.replace(‘_’, ‘ ‘).title()}**: {v}n”) else: lines.append(f”{indent}- {item}n”) lines.append(“n”) else: # 简单键值对 lines.append(f”{indent}- **{key.replace(‘_’, ‘ ‘).title()}**: {value}n”) # 开始处理 if isinstance(data, dict): # 添加主标题 title = data.get(‘title’, ‘Document’) lines.append(f”# {title}nn”) # 处理其他内容 for key, value in data.items(): if key != ‘title’: process_value(key, value) else: lines.append(“# Documentnn”) process_value(‘content’, data) # 合并所有行 content = ”.join(lines) # 写入文件 if output_file: with open(output_file, ‘w’, encoding=’utf-8′) as f: f.write(content) print(f”Markdown文件已生成: {output_file}”) return content # 使用示例 json_data = { “title”: “API 配置文档”, “metadata”: { “version”: “1.0.0”, “author”: “张三”, “created_at”: “2024-01-20” }, “endpoints”: [ { “name”: “获取用户信息”, “method”: “GET”, “path”: “/api/users/{id}”, “description”: “根据用户ID获取用户信息”, “parameters”: [ {“name”: “id”, “type”: “integer”, “required”: True} ], “responses”: [ {“code”: 200, “description”: “成功”}, {“code”: 404, “description”: “用户不存在”} ] }, { “name”: “创建用户”, “method”: “POST”, “path”: “/api/users”, “description”: “创建新用户”, “parameters”: [ {“name”: “username”, “type”: “string”, “required”: True}, {“name”: “email”, “type”: “string”, “required”: True} ], “responses”: [ {“code”: 201, “description”: “用户创建成功”}, {“code”: 400, “description”: “参数错误”} ] } ], “authentication”: { “type”: “JWT”, “description”: “需要在请求头中添加Authorization: Bearer <token>” } } # 从字典生成 converter = DataToMarkdown() markdown_content = converter.from_dict(json_data, “api_docs.md”) # 或者从JSON文件生成 with open(“config.json”, “w”, encoding=”utf-8″) as f: json.dump(json_data, f, ensure_ascii=False, indent=2) converter.from_json(“config.json”, “api_docs_from_json.md”)
- import sqlite3 import mysql.connector from typing import List, Dict class DatabaseToMarkdown: “””从数据库生成Markdown文档””” def __init__(self, db_type=’sqlite’, **kwargs): self.db_type = db_type self.connection_params = kwargs def connect(self): “””连接到数据库””” if self.db_type == ‘sqlite’: self.conn = sqlite3.connect(self.connection_params.get(‘database’)) elif self.db_type == ‘mysql’: self.conn = mysql.connector.connect(**self.connection_params) else: raise ValueError(f”不支持的数据库类型: {self.db_type}”) return self.conn def generate_schema_doc(self, output_file: str = None) -> str: “””生成数据库模式文档””” self.connect() cursor = self.conn.cursor() lines = [“# 数据库模式文档nn”] # 获取所有表 if self.db_type == ‘sqlite’: cursor.execute(“SELECT name FROM sqlite_master WHERE type=’table’;”) tables = [row[0] for row in cursor.fetchall()] elif self.db_type == ‘mysql’: cursor.execute(“SHOW TABLES;”) tables = [row[0] for row in cursor.fetchall()] for table in tables: if table.startswith(‘sqlite_’): continue lines.append(f”## 表: `{table}`nn”) # 获取表结构 if self.db_type == ‘sqlite’: cursor.execute(f”PRAGMA table_info({table});”) columns = cursor.fetchall() # 表头 lines.append(“| 字段名 | 类型 | 是否为空 | 默认值 | 主键 |n”) lines.append(“|——–|——|———-|——–|——|n”) for col in columns: col_id, name, type_, notnull, default, pk = col lines.append(f”| {name} | {type_} | {‘NOT NULL’ if notnull else ”} | {default if default else ”} | {‘✓’ if pk else ”} |n”) elif self.db_type == ‘mysql’: cursor.execute(f”DESCRIBE {table};”) columns = cursor.fetchall() lines.append(“| 字段名 | 类型 | 是否为空 | 键 | 默认值 | 额外 |n”) lines.append(“|——–|——|———-|—-|——–|——|n”) for col in columns: lines.append(f”| {col[0]} | {col[1]} | {col[2]} | {col[3]} | {col[4]} | {col[5]} |n”) lines.append(“n”) # 获取索引信息 if self.db_type == ‘sqlite’: cursor.execute(f”PRAGMA index_list({table});”) indexes = cursor.fetchall() if indexes: lines.append(“### 索引nn”) for idx in indexes: idx_id, idx_name, unique = idx lines.append(f”- **{idx_name}** ({‘唯一’ if unique else ‘非唯一’})n”) lines.append(“n”) # 获取外键信息 if self.db_type == ‘sqlite’: cursor.execute(f”PRAGMA foreign_key_list({table});”) foreign_keys = cursor.fetchall() if foreign_keys: lines.append(“### 外键约束nn”) for fk in foreign_keys: lines.append(f”- 从 `{fk[3]}` 到 `{fk[2]}.{fk[4]}`n”) lines.append(“n”) # 关闭连接 cursor.close() self.conn.close() content = “”.join(lines) if output_file: with open(output_file, “w”, encoding=”utf-8″) as f: f.write(content) print(f”数据库文档已生成: {output_file}”) return content def generate_data_dictionary(self, output_file: str = None) -> str: “””生成数据字典””” self.connect() cursor = self.conn.cursor() lines = [“# 数据字典nn”] # 获取所有表 if self.db_type == ‘sqlite’: cursor.execute(“SELECT name FROM sqlite_master WHERE type=’table’;”) tables = [row[0] for row in cursor.fetchall()] elif self.db_type == ‘mysql’: cursor.execute(“SHOW TABLES;”) tables = [row[0] for row in cursor.fetchall()] for table in tables: if table.startswith(‘sqlite_’): continue lines.append(f”## `{table}`nn”) lines.append(“### 描述nn[填写表描述]nn”) lines.append(“### 字段说明nn”) lines.append(“| 字段名 | 数据类型 | 描述 | 示例 | 约束 |n”) lines.append(“|——–|———-|——|——|——|n”) # 获取字段信息 if self.db_type == ‘sqlite’: cursor.execute(f”PRAGMA table_info({table});”) columns = cursor.fetchall() for col in columns: col_id, name, type_, notnull, default, pk = col constraints = [] if pk: constraints.append(“主键”) if notnull: constraints.append(“非空”) if default: constraints.append(f”默认值: {default}”) lines.append(f”| {name} | {type_} | [填写描述] | [填写示例] | {‘, ‘.join(constraints)} |n”) elif self.db_type == ‘mysql’: cursor.execute(f”DESCRIBE {table};”) columns = cursor.fetchall() for col in columns: name, type_, nullable, key, default, extra = col constraints = [] if key == ‘PRI’: constraints.append(“主键”) if key == ‘UNI’: constraints.append(“唯一”) if nullable == ‘NO’: constraints.append(“非空”) if default: constraints.append(f”默认值: {default}”) if extra: constraints.append(extra) lines.append(f”| {name} | {type_} | [填写描述] | [填写示例] | {‘, ‘.join(constraints)} |n”) lines.append(“n### 业务规则nn[填写业务规则]nn”) lines.append(“### 使用示例nn“`sqlnSELECT * FROM {table} LIMIT 5;n“`nn”) lines.append(“—nn”) cursor.close() self.conn.close() content = “”.join(lines) if output_file: with open(output_file, “w”, encoding=”utf-8″) as f: f.write(content) print(f”数据字典已生成: {output_file}”) return content # 使用示例 # 创建测试数据库 conn = sqlite3.connect(“:memory:”) cursor = conn.cursor() cursor.execute(“”” CREATE TABLE users ( id INTEGER PRIMARY KEY, username TEXT NOT NULL UNIQUE, email TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); “””) cursor.execute(“”” CREATE TABLE posts ( id INTEGER PRIMARY KEY, user_id INTEGER, title TEXT NOT NULL, content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ); “””) conn.commit() conn.close() # 生成文档 doc_gen = DatabaseToMarkdown(db_type=’sqlite’, database=”:memory:”) schema_doc = doc_gen.generate_schema_doc(“数据库模式.md”) data_dict = doc_gen.generate_data_dictionary(“数据字典.md”)
目录
- 一、基础方法:直接写入
- 1. 简单文本写入
- 2. 动态生成内容
- 总结
- 使用示例
- 二、使用模板引擎生成
- 1. 使用字符串模板
- 2. 使用 Jinja2 模板引擎
- 总结
- 使用Jinja2生成
- 三、使用专业库生成
- 1. 使用 python-markdown 库(反向生成)
- 2. 使用 mistune 库
- 四、从数据结构生成
- 1. 从JSON/YAML生成
- 2. 从数据库生成文档
- 五、高级功能:自动生成工具
- 1. 从Python代码生成文档
- 结束语
def create_simple_markdown():
"""创建简单的Markdown文件"""
content = """# 主标题
这是第一个段落。
## 二级标题
这是第二个段落。
### 三级标题
这是一个无序列表:
- 项目1
- 项目2
- 项目3
这是一个有序列表:
1. 第一项
2. 第二项
3. 第三项
**粗体文本** 和 *斜体文本*
`行内代码`
[链接文本](https://example.com)

"""
with open("simple_document.md", "w", encoding="utf-8") as f:
f.write(content)
print("Markdown文件已创建: simple_document.md")
# 使用
create_simple_markdown()
def create_dynamic_markdown(data):
"""根据数据动态生成Markdown"""
content = f"""# {data['title']}
**创建时间**: {data['date']}
**作者**: {data['author']}
## 概述
{data['overview']}
## 详细内容
{data['content']}
## 特性
"""
# 添加列表
for feature in data['features']:
content += f"- {feature}n"
content += f"""
## 代码示例
```python
{data['code_example']}
with open("dynamic_document.md", "w", encoding="utf-8") as f:
f.write(content)
print("动态Markdown文件已创建")
data = {
‘title': ‘Python项目文档',
‘date': ‘2024-01-20',
‘author': ‘张三',
‘overview': ‘这是一个使用Python生成Markdown的示例项目。',
‘content': ‘详细说明了如何使用Python创建Markdown文件。',
‘features': [
‘自动生成文档',
‘支持多种格式',
‘可自定义模板',
‘易于扩展'
],
‘code_example': ‘print(“Hello, Markdown!”)',
‘summary': ‘这是一个非常有用的工具。'
}
create_dynamic_markdown(data)
#python
from string import Template
class MarkdownTemplate:
"""Markdown模板生成器"""
def __init__(self):
self.templates = {
'report': self._report_template(),
'api_doc': self._api_doc_template(),
'readme': self._readme_template(),
'note': self._note_template()
}
def _report_template(self):
"""报告模板"""
return Template("""# ${title}
## 基本信息
- **项目**: ${project}
- **日期**: ${date}
- **作者**: ${author}
- **版本**: ${version}
## 执行摘要
${summary}
## 详细内容
${content}
## 结果分析
${analysis}
## 结论
${conclusion}
## 建议
${recommendations}
## 附录
${appendix}
""")
def _readme_template(self):
"""README模板"""
return Template("""# ${project_name}
${badges}
${description}
## ✨ 特性
${features}
## 🚀 快速开始
### 安装
```bash
${install_command}
```
### 使用示例
```python
${usage_example}
```
## 📖 文档
${documentation}
## 🤝 贡献
${contributing}
## 📄 许可证
${license}
## 📞 联系方式
${contact}
""")
def _api_doc_template(self):
"""API文档模板"""
return Template("""# ${api_name} API 文档
## 概述
${overview}
## 认证
${authentication}
## 端点
### ${endpoint_name}
**URL**: `${url}`
**方法**: ${method}
**参数**:
${parameters}
**响应**:
```json
${response_example}
```
**错误码**:
${error_codes}
## 使用示例
${usage_examples}
""")
def generate(self, template_name, data, output_file=None):
"""生成Markdown文件"""
if template_name not in self.templates:
raise ValueError(f"模板不存在: {template_name}")
template = self.templates[template_name]
content = template.safe_substitute(data)
if output_file:
with open(output_file, "w", encoding="utf-8") as f:
f.write(content)
print(f"Markdown文件已生成: {output_file}")
return content
# 使用示例
md_generator = MarkdownTemplate()
# 生成报告
report_data = {
'title': '季度项目报告',
'project': '数据分析平台',
'date': '2024-Q1',
'author': '张三',
'version': '1.0.0',
'summary': '本季度项目进展顺利,完成了主要功能开发。',
'content': '详细开发了数据导入、处理和可视化模块。',
'analysis': '性能提升了30%,用户满意度达到95%。',
'conclusion': '项目按计划推进,达到预期目标。',
'recommendations': '建议增加AI分析功能。',
'appendix': '详见附件文档。'
}
report_md = md_generator.generate('report', report_data, '季度报告.md')
# 生成README
readme_data = {
'project_name': 'Awesome Project',
'badges': '[]',
'description': '一个非常棒的项目,用于演示Markdown生成。',
'features': '- 功能一n- 功能二n- 功能三',
'install_command': 'pip install awesome-project',
'usage_example': 'from awesome import Awesomenobj = Awesome()nobj.do_something()',
'documentation': '详见 [文档网站](https://docs.example.com)',
'contributing': '欢迎提交PR!',
'license': 'MIT License',
'contact': '邮箱: contact@example.com'
}
readme_md = md_generator.generate('readme', readme_data, 'README.md')
from jinja2 import Template, Environment, FileSystemLoader
import os
class JinjaMarkdownGenerator:
"""使用Jinja2生成Markdown"""
def __init__(self, template_dir="templates"):
self.env = Environment(
loader=FileSystemLoader(template_dir),
trim_blocks=True,
lstrip_blocks=True,
keep_trailing_newline=True
)
def generate_from_template(self, template_name, context, output_file):
"""从模板生成Markdown"""
template = self.env.get_template(template_name)
content = template.render(**context)
with open(output_file, "w", encoding="utf-8") as f:
f.write(content)
print(f"Markdown文件已生成: {output_file}")
return content
# 创建模板目录和文件
os.makedirs("templates", exist_ok=True)
# 创建report模板 (templates/report.md.j2)
report_template_content = """# {{ title }}
## 项目信息
- **项目名称**: {{ project_name }}
- **版本**: v{{ version }}
- **生成时间**: {{ generated_at }}
## 概述
{{ overview }}
## 详细分析
{% for section in sections %}
### {{ section.title }}
{{ section.content }}
{% if section.items %}
**关键点**:
{% for item in section.items %}
- {{ item }}
{% endfor %}
{% endif %}
{% endfor %}
## 数据统计
| 指标 | 数值 | 状态 |
|------|------|------|
{% for metric in metrics %}
| {{ metric.name }} | {{ metric.value }} | {{ metric.status }} |
{% endfor %}
## 代码示例
```{{ code_language }}
{{ code_example }}
with open(“templates/report.md.j2”, “w”, encoding=“utf-8”) as f:
f.write(report_template_content)
generator = JinjaMarkdownGenerator(“templates”)
context = {
‘title': ‘项目分析报告',
‘project_name': ‘数据分析系统',
‘version': ‘1.2.0',
‘generated_at': ‘2024-01-20 10:30:00',
‘overview': ‘本报告分析了系统的运行情况和性能指标。',
‘sections': [
{
‘title': ‘性能分析',
‘content': ‘系统性能良好,响应时间在预期范围内。',
‘items': [‘平均响应时间: 200ms', ‘吞吐量: 1000 req/s', ‘错误率: 0.1%']
},
{
‘title': ‘用户分析',
‘content': ‘用户活跃度持续增长。',
‘items': [‘日活用户: 10,000', ‘月活用户: 50,000', ‘用户留存率: 85%']
}
],
‘metrics': [
{‘name': ‘CPU使用率', ‘value': ‘45%', ‘status': ‘正常'},
{‘name': ‘内存使用率', ‘value': ‘60%', ‘status': ‘正常'},
{‘name': ‘磁盘空间', ‘value': ‘75%', ‘status': ‘警告'},
{‘name': ‘网络延迟', ‘value': ‘50ms', ‘status': ‘优秀'}
],
‘code_language': ‘python',
‘code_example': ‘def analyze_data(data):n return process(data)',
‘summary': ‘系统运行稳定,建议关注磁盘空间使用情况。'
}
generator.generate_from_template(
‘report.md.j2',
context,
‘项目分析报告.md'
)
#python
import markdown
from markdown.extensions.toc import TocExtension
from markdown.extensions.codehilite import CodeHiliteExtension
from markdown.extensions.tables import TableExtension
class MarkdownGenerator:
"""高级Markdown生成器"""
def __init__(self):
self.elements = []
def add_title(self, text, level=1):
"""添加标题"""
prefix = '#' * level
self.elements.append(f"{prefix} {text}n")
return self
def add_paragraph(self, text):
"""添加段落"""
self.elements.append(f"{text}nn")
return self
def add_list(self, items, ordered=False):
"""添加列表"""
for i, item in enumerate(items):
if ordered:
self.elements.append(f"{i+1}. {item}n")
else:
self.elements.append(f"- {item}n")
self.elements.append("n")
return self
def add_code_block(self, code, language=""):
"""添加代码块"""
self.elements.append(f"```{language}n
n```nn")
return self
def add_table(self, headers, rows):
"""添加表格"""
# 表头
header_row = "| " + " | ".join(headers) + " |"
separator = "| " + " | ".join(["---"] * len(headers)) + " |"
self.elements.append(header_row + "n")
self.elements.append(separator + "n")
# 数据行
for row in rows:
row_str = "| " + " | ".join(str(cell) for cell in row) + " |"
self.elements.append(row_str + "n")
self.elements.append("n")
return self
def add_blockquote(self, text):
"""添加引用"""
lines = text.split('n')
for line in lines:
self.elements.append(f"> {line}n")
self.elements.append("n")
return self
def add_horizontal_rule(self):
"""添加水平线"""
self.elements.append("---nn")
return self
def add_link(self, text, url):
"""添加链接"""
self.elements.append(f"[{text}]({url})nn")
return self
def add_image(self, alt_text, url, title=""):
"""添加图片"""
if title:
self.elements.append(f'nn')
else:
self.elements.append(f'nn')
return self
def generate(self, output_file=None):
"""生成Markdown内容"""
content = "".join(self.elements)
if output_file:
with open(output_file, "w", encoding="utf-8") as f:
f.write(content)
print(f"Markdown文件已生成: {output_file}")
return content
# 使用示例
md = MarkdownGenerator()
md.add_title("Python学习笔记", level=1)
md.add_paragraph("这是我的Python学习笔记,记录了一些重要的概念和示例。")
md.add_horizontal_rule()
md.add_title("基本语法", level=2)
md.add_paragraph("Python的基本语法非常简洁。")
md.add_title("数据类型", level=3)
md.add_list([
"整数 (int)",
"浮点数 (float)",
"字符串 (str)",
"列表 (list)",
"字典 (dict)"
])
md.add_title("代码示例", level=2)
md.add_code_block("def hello(name):n print(f'Hello, {name}!')nnhello('World')", "python")
md.add_title("数据结构对比", level=2)
md.add_table(
["数据结构", "可变性", "有序性", "示例"],
[
["列表", "可变", "有序", "[1, 2, 3]"],
["元组", "不可变", "有序", "(1, 2, 3)"],
["集合", "可变", "无序", "{1, 2, 3}"],
["字典", "可变", "有序(3.7+)", "{'a': 1, 'b': 2}"]
]
)
md.add_blockquote("Python之禅:优美胜于丑陋,明了胜于晦涩。")
md.add_title("参考资源", level=2)
md.add_link("Python官方文档", "https://docs.python.org")
md.add_image("Python Logo", "https://www.python.org/static/img/python-logo.png", "Python官方Logo")
# 生成文件
content = md.generate("学习笔记.md")
n```nn")
return self
def add_table(self, headers, rows):
"""添加表格"""
# 表头
header_row = "| " + " | ".join(headers) + " |"
separator = "| " + " | ".join(["---"] * len(headers)) + " |"
self.elements.append(header_row + "n")
self.elements.append(separator + "n")
# 数据行
for row in rows:
row_str = "| " + " | ".join(str(cell) for cell in row) + " |"
self.elements.append(row_str + "n")
self.elements.append("n")
return self
def add_blockquote(self, text):
"""添加引用"""
lines = text.split('n')
for line in lines:
self.elements.append(f"> {line}n")
self.elements.append("n")
return self
def add_horizontal_rule(self):
"""添加水平线"""
self.elements.append("---nn")
return self
def add_link(self, text, url):
"""添加链接"""
self.elements.append(f"[{text}]({url})nn")
return self
def add_image(self, alt_text, url, title=""):
"""添加图片"""
if title:
self.elements.append(f'nn')
else:
self.elements.append(f'nn')
return self
def generate(self, output_file=None):
"""生成Markdown内容"""
content = "".join(self.elements)
if output_file:
with open(output_file, "w", encoding="utf-8") as f:
f.write(content)
print(f"Markdown文件已生成: {output_file}")
return content
# 使用示例
md = MarkdownGenerator()
md.add_title("Python学习笔记", level=1)
md.add_paragraph("这是我的Python学习笔记,记录了一些重要的概念和示例。")
md.add_horizontal_rule()
md.add_title("基本语法", level=2)
md.add_paragraph("Python的基本语法非常简洁。")
md.add_title("数据类型", level=3)
md.add_list([
"整数 (int)",
"浮点数 (float)",
"字符串 (str)",
"列表 (list)",
"字典 (dict)"
])
md.add_title("代码示例", level=2)
md.add_code_block("def hello(name):n print(f'Hello, {name}!')nnhello('World')", "python")
md.add_title("数据结构对比", level=2)
md.add_table(
["数据结构", "可变性", "有序性", "示例"],
[
["列表", "可变", "有序", "[1, 2, 3]"],
["元组", "不可变", "有序", "(1, 2, 3)"],
["集合", "可变", "无序", "{1, 2, 3}"],
["字典", "可变", "有序(3.7+)", "{'a': 1, 'b': 2}"]
]
)
md.add_blockquote("Python之禅:优美胜于丑陋,明了胜于晦涩。")
md.add_title("参考资源", level=2)
md.add_link("Python官方文档", "https://docs.python.org")
md.add_image("Python Logo", "https://www.python.org/static/img/python-logo.png", "Python官方Logo")
# 生成文件
content = md.generate("学习笔记.md")
import mistune
class MarkdownRenderer(mistune.HTMLRenderer):
"""自定义Markdown渲染器(可用于反向生成)"""
def __init__(self, escape=True):
super().__init__(escape)
self.output = []
def text(self, text):
self.output.append(text)
return text
def paragraph(self, text):
self.output.append(f"n{text}n")
return f"<p>{text}</p>"
def generate_markdown(self):
"""获取生成的Markdown内容"""
return "".join(self.output)
# 使用mistune解析并生成
def convert_to_markdown(html_content):
"""将HTML转换为Markdown(简单示例)"""
# 注意:mistune主要是HTML转Markdown,这里展示反向思路
pass
import json
import yaml
from typing import Dict, List, Any
class DataToMarkdown:
"""从数据结构生成Markdown"""
def __init__(self, indent_size=2):
self.indent_size = indent_size
self.indent_char = ' '
def from_json(self, json_file: str, output_file: str = None) -> str:
"""从JSON文件生成Markdown"""
with open(json_file, 'r', encoding='utf-8') as f:
data = json.load(f)
return self._generate_from_dict(data, output_file)
def from_yaml(self, yaml_file: str, output_file: str = None) -> str:
"""从YAML文件生成Markdown"""
with open(yaml_file, 'r', encoding='utf-8') as f:
data = yaml.safe_load(f)
return self._generate_from_dict(data, output_file)
def from_dict(self, data: Dict, output_file: str = None) -> str:
"""从字典生成Markdown"""
return self._generate_from_dict(data, output_file)
def _generate_from_dict(self, data: Dict, output_file: str = None) -> str:
"""从字典生成Markdown内容"""
lines = []
def process_value(key, value, level=0):
indent = self.indent_char * self.indent_size * level
if isinstance(value, dict):
# 标题
lines.append(f"{indent}# {' '.join(key.split('_')).title()}n")
# 处理字典的键值对
for k, v in value.items():
if isinstance(v, (dict, list)):
process_value(k, v, level + 1)
else:
lines.append(f"{indent}- **{k.replace('_', ' ').title()}**: {v}n")
lines.append("n")
elif isinstance(value, list):
# 列表标题
lines.append(f"{indent}## {' '.join(key.split('_')).title()}n")
for item in value:
if isinstance(item, dict):
lines.append(f"{indent}###n")
for k, v in item.items():
lines.append(f"{indent}- **{k.replace('_', ' ').title()}**: {v}n")
else:
lines.append(f"{indent}- {item}n")
lines.append("n")
else:
# 简单键值对
lines.append(f"{indent}- **{key.replace('_', ' ').title()}**: {value}n")
# 开始处理
if isinstance(data, dict):
# 添加主标题
title = data.get('title', 'Document')
lines.append(f"# {title}nn")
# 处理其他内容
for key, value in data.items():
if key != 'title':
process_value(key, value)
else:
lines.append("# Documentnn")
process_value('content', data)
# 合并所有行
content = ''.join(lines)
# 写入文件
if output_file:
with open(output_file, 'w', encoding='utf-8') as f:
f.write(content)
print(f"Markdown文件已生成: {output_file}")
return content
# 使用示例
json_data = {
"title": "API 配置文档",
"metadata": {
"version": "1.0.0",
"author": "张三",
"created_at": "2024-01-20"
},
"endpoints": [
{
"name": "获取用户信息",
"method": "GET",
"path": "/api/users/{id}",
"description": "根据用户ID获取用户信息",
"parameters": [
{"name": "id", "type": "integer", "required": True}
],
"responses": [
{"code": 200, "description": "成功"},
{"code": 404, "description": "用户不存在"}
]
},
{
"name": "创建用户",
"method": "POST",
"path": "/api/users",
"description": "创建新用户",
"parameters": [
{"name": "username", "type": "string", "required": True},
{"name": "email", "type": "string", "required": True}
],
"responses": [
{"code": 201, "description": "用户创建成功"},
{"code": 400, "description": "参数错误"}
]
}
],
"authentication": {
"type": "JWT",
"description": "需要在请求头中添加Authorization: Bearer <token>"
}
}
# 从字典生成
converter = DataToMarkdown()
markdown_content = converter.from_dict(json_data, "api_docs.md")
# 或者从JSON文件生成
with open("config.json", "w", encoding="utf-8") as f:
json.dump(json_data, f, ensure_ascii=False, indent=2)
converter.from_json("config.json", "api_docs_from_json.md")
import sqlite3
import mysql.connector
from typing import List, Dict
class DatabaseToMarkdown:
"""从数据库生成Markdown文档"""
def __init__(self, db_type='sqlite', **kwargs):
self.db_type = db_type
self.connection_params = kwargs
def connect(self):
"""连接到数据库"""
if self.db_type == 'sqlite':
self.conn = sqlite3.connect(self.connection_params.get('database'))
elif self.db_type == 'mysql':
self.conn = mysql.connector.connect(**self.connection_params)
else:
raise ValueError(f"不支持的数据库类型: {self.db_type}")
return self.conn
def generate_schema_doc(self, output_file: str = None) -> str:
"""生成数据库模式文档"""
self.connect()
cursor = self.conn.cursor()
lines = ["# 数据库模式文档nn"]
# 获取所有表
if self.db_type == 'sqlite':
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = [row[0] for row in cursor.fetchall()]
elif self.db_type == 'mysql':
cursor.execute("SHOW TABLES;")
tables = [row[0] for row in cursor.fetchall()]
for table in tables:
if table.startswith('sqlite_'):
continue
lines.append(f"## 表: `{table}`nn")
# 获取表结构
if self.db_type == 'sqlite':
cursor.execute(f"PRAGMA table_info({table});")
columns = cursor.fetchall()
# 表头
lines.append("| 字段名 | 类型 | 是否为空 | 默认值 | 主键 |n")
lines.append("|--------|------|----------|--------|------|n")
for col in columns:
col_id, name, type_, notnull, default, pk = col
lines.append(f"| {name} | {type_} | {'NOT NULL' if notnull else ''} | {default if default else ''} | {'✓' if pk else ''} |n")
elif self.db_type == 'mysql':
cursor.execute(f"DESCRIBE {table};")
columns = cursor.fetchall()
lines.append("| 字段名 | 类型 | 是否为空 | 键 | 默认值 | 额外 |n")
lines.append("|--------|------|----------|----|--------|------|n")
for col in columns:
lines.append(f"| {col[0]} | {col[1]} | {col[2]} | {col[3]} | {col[4]} | {col[5]} |n")
lines.append("n")
# 获取索引信息
if self.db_type == 'sqlite':
cursor.execute(f"PRAGMA index_list({table});")
indexes = cursor.fetchall()
if indexes:
lines.append("### 索引nn")
for idx in indexes:
idx_id, idx_name, unique = idx
lines.append(f"- **{idx_name}** ({'唯一' if unique else '非唯一'})n")
lines.append("n")
# 获取外键信息
if self.db_type == 'sqlite':
cursor.execute(f"PRAGMA foreign_key_list({table});")
foreign_keys = cursor.fetchall()
if foreign_keys:
lines.append("### 外键约束nn")
for fk in foreign_keys:
lines.append(f"- 从 `{fk[3]}` 到 `{fk[2]}.{fk[4]}`n")
lines.append("n")
# 关闭连接
cursor.close()
self.conn.close()
content = "".join(lines)
if output_file:
with open(output_file, "w", encoding="utf-8") as f:
f.write(content)
print(f"数据库文档已生成: {output_file}")
return content
def generate_data_dictionary(self, output_file: str = None) -> str:
"""生成数据字典"""
self.connect()
cursor = self.conn.cursor()
lines = ["# 数据字典nn"]
# 获取所有表
if self.db_type == 'sqlite':
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = [row[0] for row in cursor.fetchall()]
elif self.db_type == 'mysql':
cursor.execute("SHOW TABLES;")
tables = [row[0] for row in cursor.fetchall()]
for table in tables:
if table.startswith('sqlite_'):
continue
lines.append(f"## `{table}`nn")
lines.append("### 描述nn[填写表描述]nn")
lines.append("### 字段说明nn")
lines.append("| 字段名 | 数据类型 | 描述 | 示例 | 约束 |n")
lines.append("|--------|----------|------|------|------|n")
# 获取字段信息
if self.db_type == 'sqlite':
cursor.execute(f"PRAGMA table_info({table});")
columns = cursor.fetchall()
for col in columns:
col_id, name, type_, notnull, default, pk = col
constraints = []
if pk:
constraints.append("主键")
if notnull:
constraints.append("非空")
if default:
constraints.append(f"默认值: {default}")
lines.append(f"| {name} | {type_} | [填写描述] | [填写示例] | {', '.join(constraints)} |n")
elif self.db_type == 'mysql':
cursor.execute(f"DESCRIBE {table};")
columns = cursor.fetchall()
for col in columns:
name, type_, nullable, key, default, extra = col
constraints = []
if key == 'PRI':
constraints.append("主键")
if key == 'UNI':
constraints.append("唯一")
if nullable == 'NO':
constraints.append("非空")
if default:
constraints.append(f"默认值: {default}")
if extra:
constraints.append(extra)
lines.append(f"| {name} | {type_} | [填写描述] | [填写示例] | {', '.join(constraints)} |n")
lines.append("n### 业务规则nn[填写业务规则]nn")
lines.append("### 使用示例nn```sqlnSELECT * FROM {table} LIMIT 5;n```nn")
lines.append("---nn")
cursor.close()
self.conn.close()
content = "".join(lines)
if output_file:
with open(output_file, "w", encoding="utf-8") as f:
f.write(content)
print(f"数据字典已生成: {output_file}")
return content
# 使用示例
# 创建测试数据库
conn = sqlite3.connect(":memory:")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE users (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
email TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
""")
cursor.execute("""
CREATE TABLE posts (
id INTEGER PRIMARY KEY,
user_id INTEGER,
title TEXT NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
""")
conn.commit()
conn.close()
# 生成文档
doc_gen = DatabaseToMarkdown(db_type='sqlite', database=":memory:")
schema_doc = doc_gen.generate_schema_doc("数据库模式.md")
data_dict = doc_gen.generate_data_dictionary("数据字典.md")
import ast
import inspect
from typing import List, Dict, Any
import os
class PythonToMarkdown:
"""从Python代码生成Markdown文档"""
def __init__(self):
self.imports = []
self.classes = []
self.functions = []
def analyze_file(self, filepath: str):
"""分析Python文件"""
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
tree = ast.parse(content)
for node in ast.walk(tree):
if isinstance(node, ast.Import):
for alias in node.names:
self.imports.append(alias.name)
elif isinstance(node, ast.ImportFrom):
for alias in node.names:
self.imports.append(f"{node.module}.{alias.name}")
elif isinstance(node, ast.ClassDef):
class_info = self._extract_class_info(node)
self.classes.append(class_info)
elif isinstance(node, ast.FunctionDef):
# 排除类中的方法
if not self._is_method(node):
func_info = self._extract_function_info(node)
self.functions.append(func_info)
def _is_method(self, node: ast.FunctionDef) -> bool:
"""检查是否是类方法"""
parent = node.parent if hasattr(node, 'parent') else None
return isinstance(parent, ast.ClassDef)
def _extract_class_info(self, node: ast.ClassDef) -> Dict:
"""提取类信息"""
class_info = {
'name': node.name,
'docstring': ast.get_docstring(node),
'methods': [],
'bases': [ast.unparse(base) for base in node.bases]
}
# 提取方法
for item in node.body:
if isinstance(item, ast.FunctionDef):
method_info = self._extract_function_info(item)
class_info['methods'].append(method_info)
return class_info
def _extract_function_info(self, node: ast.FunctionDef) -> Dict:
"""提取函数信息"""
func_info = {
'name': node.name,
'docstring': ast.get_docstring(node),
'args': self._extract_arguments(node.args),
'returns': ast.unparse(node.returns) if node.returns else None,
'decorators': [ast.unparse(decorator) for decorator in node.decorator_list]
}
return func_info
def _extract_arguments(self, args: ast.arguments) -> List[Dict]:
"""提取参数信息"""
arguments = []
# 位置参数
for arg in args.args:
arguments.append({
'name': arg.arg,
'type': arg.annotation,
'default': None
})
# 默认参数
for i, default in enumerate(args.defaults):
idx = len(args.args) - len(args.defaults) + i
arguments[idx]['default'] = ast.unparse(default)
# 可变参数
if args.vararg:
arguments.append({
'name': f"*{args.vararg.arg}",
'type': args.vararg.annotation,
'default': None
})
# 关键字参数
for kwonlyarg in args.kwonlyargs:
arguments.append({
'name': kwonlyarg.arg,
'type': kwonlyarg.annotation,
'default': None
})
# 关键字默认值
for i, default in enumerate(args.kw_defaults):
if default:
arguments[len(args.args) + (1 if args.vararg else 0) + i]['default'] = ast.unparse(default)
# 关键字可变参数
if args.kwarg:
arguments.append({
'name': f"**{args.kwarg.arg}",
'type': args.kwarg.annotation,
'default': None
})
return arguments
def generate_documentation(self, output_file: str = None) -> str:
"""生成文档"""
lines = ["# API 文档nn"]
# 导入部分
if self.imports:
lines.append("## 导入nn")
lines.append("```pythonn")
for imp in sorted(set(self.imports)):
if '.' in imp:
module, name = imp.rsplit('.', 1)
lines.append(f"from {module} import {name}n")
else:
lines.append(f"import {imp}n")
lines.append("```nn")
# 函数部分
if self.functions:
lines.append("## 函数nn")
for func in self.functions:
lines.append(f"### `{func['name']}`nn")
if func['docstring']:
lines.append(f"{func['docstring']}nn")
# 函数签名
arg_strs = []
for arg in func['args']:
arg_str = arg['name']
if arg['type']:
arg_str += f": {ast.unparse(arg['type'])}"
if arg['default']:
arg_str += f" = {arg['default']}"
arg_strs.append(arg_str)
signature = f"def {func['name']}({', '.join(arg_strs)})"
if func['returns']:
signature += f" -> {func['returns']}"
lines.append(f"```pythonn{signature}n```nn")
# 类部分
if self.classes:
lines.append("## 类nn")
for cls in self.classes:
lines.append(f"### `{cls['name']}`nn")
if cls['bases']:
lines.append(f"**继承自**: {', '.join(cls['bases'])}nn")
if cls['docstring']:
lines.append(f"{cls['docstring']}nn")
# 类的方法
if cls['methods']:
lines.append("#### 方法nn")
for method in cls['methods']:
lines.append(f"##### `{method['name']}`nn")
if method['docstring']:
lines.append(f"{method['docstring']}nn")
content = "".join(lines)
if output_file:
with open(output_file, "w", encoding="utf-8") as f:
f.write(content)
print(f"API文档已生成: {output_file}")
return content
# 使用示例
# 创建一个示例Python文件
sample_code = '''
"""示例模块"""
import os
from typing import List, Optional
def greet(name: str, greeting: str = "Hello") -> str:
"""生成问候语
Args:
name: 姓名
greeting: 问候语,默认为'Hello'
Returns:
完整的问候字符串
"""
return f"{greeting}, {name}!"
class Calculator:
"""计算器类"""
def __init__(self, precision: int = 2):
"""初始化计算器
Args:
precision: 计算精度
"""
self.precision = precision
def add(self, a: float, b: float) -> float:
"""加法运算"""
return round(a + b, self.precision)
def multiply(self, a: float, b: float) -> float:
"""乘法运算"""
return round(a * b, self.precision)
'''
with open("sample_module.py", "w", encoding="utf-8") as f:
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!
以上就是Python生成Markdown文件的完整指南的详细内容,更多关于Python生成Markdown文件的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- Python实现截图生成符合markdown的链接
- Python3自动生成MySQL数据字典的markdown文本的实现
- Python自动解析markdown中的图片并保存
- 基于Python开发一个现代化Markdown编辑器
- Python 中 Markdown 库的使用教程从入门到实践