mirror of
https://github.com/snowykami/mbcp.git
synced 2026-04-27 12:55:37 +00:00
📝 litedoc新增类继承显示,新增变量自动获取注释,新增类方法和函数的区分,新增魔术方法的特殊展示模式
This commit is contained in:
107
litedoc/output.py
Normal file
107
litedoc/output.py
Normal file
@@ -0,0 +1,107 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
||||
|
||||
@Time : 2024/8/28 下午3:59
|
||||
@Author : snowykami
|
||||
@Email : snowykami@outlook.com
|
||||
@File : output.py
|
||||
@Software: PyCharm
|
||||
"""
|
||||
import os.path
|
||||
|
||||
from litedoc.style.markdown import generate
|
||||
from litedoc.syntax.astparser import AstParser
|
||||
|
||||
|
||||
def write_to_file(content: str, output: str) -> None:
|
||||
"""
|
||||
Write content to file.
|
||||
|
||||
Args:
|
||||
content: str, content to write.
|
||||
output: str, path to output file.
|
||||
"""
|
||||
if not os.path.exists(os.path.dirname(output)):
|
||||
os.makedirs(os.path.dirname(output))
|
||||
|
||||
with open(output, "w", encoding="utf-8") as f:
|
||||
f.write(content)
|
||||
|
||||
|
||||
def get_file_list(module_folder: str):
|
||||
file_list = []
|
||||
for root, dirs, files in os.walk(module_folder):
|
||||
for file in files:
|
||||
if file.endswith((".py", ".pyi")):
|
||||
file_list.append(os.path.join(root, file))
|
||||
return file_list
|
||||
|
||||
|
||||
def get_relative_path(base_path: str, target_path: str) -> str:
|
||||
"""
|
||||
获取相对路径
|
||||
Args:
|
||||
base_path: 基础路径
|
||||
target_path: 目标路径
|
||||
"""
|
||||
return os.path.relpath(target_path, base_path)
|
||||
|
||||
|
||||
def generate_from_module(module_folder: str, output_dir: str, with_top: bool = False, lang: str = "zh-Hans", ignored_paths=None):
|
||||
"""
|
||||
生成文档
|
||||
Args:
|
||||
module_folder: 模块文件夹
|
||||
output_dir: 输出文件夹
|
||||
with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
|
||||
ignored_paths: 忽略的路径
|
||||
lang: 语言
|
||||
"""
|
||||
if ignored_paths is None:
|
||||
ignored_paths = []
|
||||
file_data: dict[str, str] = {} # 路径 -> 字串
|
||||
|
||||
file_list = get_file_list(module_folder)
|
||||
|
||||
# 清理输出目录
|
||||
if not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir)
|
||||
|
||||
replace_data = {
|
||||
"__init__": "index",
|
||||
".py" : ".md",
|
||||
}
|
||||
|
||||
for pyfile_path in file_list:
|
||||
if any(ignored_path.replace("\\", "/") in pyfile_path.replace("\\", "/") for ignored_path in ignored_paths):
|
||||
continue
|
||||
|
||||
no_module_name_pyfile_path = get_relative_path(module_folder, pyfile_path) # 去头路径
|
||||
|
||||
# markdown相对路径
|
||||
rel_md_path = pyfile_path if with_top else no_module_name_pyfile_path
|
||||
for rk, rv in replace_data.items():
|
||||
rel_md_path = rel_md_path.replace(rk, rv)
|
||||
|
||||
abs_md_path = os.path.join(output_dir, rel_md_path)
|
||||
|
||||
# 获取模块信息
|
||||
ast_parser = AstParser(open(pyfile_path, "r", encoding="utf-8").read())
|
||||
|
||||
# 生成markdown
|
||||
|
||||
front_matter = {
|
||||
"title" : pyfile_path.replace("\\", "/").
|
||||
replace("/", ".").
|
||||
replace(".py", "").
|
||||
replace(".__init__", ""),
|
||||
|
||||
}
|
||||
|
||||
md_content = generate(ast_parser, lang=lang, frontmatter=front_matter)
|
||||
print(f"Generate {pyfile_path} -> {abs_md_path}")
|
||||
file_data[abs_md_path] = md_content
|
||||
|
||||
for fn, content in file_data.items():
|
||||
write_to_file(content, fn)
|
||||
Reference in New Issue
Block a user