初始提交:一场soul的创业实验-永平 网站与小程序
Made-with: Cursor
This commit is contained in:
81
scripts/sync_book_to_feishu_export.py
Normal file
81
scripts/sync_book_to_feishu_export.py
Normal file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
《一场soul的创业实验》全书 → 飞书同步用导出
|
||||
|
||||
按飞书「创业实验」下结构导出所有 md 正文,便于复制到飞书对应子页面。
|
||||
用法:
|
||||
python3 sync_book_to_feishu_export.py [--book-root /path/to/书] [--out ./feishu_export]
|
||||
"""
|
||||
import argparse
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# 默认书稿根目录(与上传 README 一致)
|
||||
DEFAULT_BOOK_ROOT = Path("/Users/karuo/Documents/个人/2、我写的书/《一场soul的创业实验》")
|
||||
FEISHU_WIKI_URL = "https://cunkebao.feishu.cn/wiki/FNP6wdvNKij7yMkb3xCce0CYnpd"
|
||||
|
||||
|
||||
def collect_md_files(book_root: Path):
|
||||
"""收集所有 md,返回 (相对路径, 绝对路径) 列表,按路径排序"""
|
||||
book_root = book_root.resolve()
|
||||
out = []
|
||||
for p in book_root.rglob("*.md"):
|
||||
if not p.name.startswith("."):
|
||||
try:
|
||||
rel = p.relative_to(book_root)
|
||||
out.append((str(rel), p))
|
||||
except ValueError:
|
||||
pass
|
||||
out.sort(key=lambda x: x[0])
|
||||
return out
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="导出全书 md 供飞书同步")
|
||||
parser.add_argument("--book-root", type=Path, default=DEFAULT_BOOK_ROOT, help="书稿根目录")
|
||||
parser.add_argument("--out", type=Path, default=Path(__file__).resolve().parent / "feishu_export", help="导出目录")
|
||||
args = parser.parse_args()
|
||||
|
||||
book_root = args.book_root.resolve()
|
||||
if not book_root.is_dir():
|
||||
print(f"错误: 书稿根目录不存在: {book_root}")
|
||||
return 1
|
||||
|
||||
out_dir = args.out.resolve()
|
||||
out_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
files = collect_md_files(book_root)
|
||||
print(f"找到 {len(files)} 个 md 文件,导出到 {out_dir}")
|
||||
|
||||
# 导出:按「篇/章/节」扁平化命名,避免文件名过长或非法字符
|
||||
for rel, abspath in files:
|
||||
name = rel.replace("/", "_").replace("|", "_").replace("?", "_").replace(":", "_")
|
||||
if len(name) > 180:
|
||||
name = name[:177] + ".md"
|
||||
elif not name.endswith(".md"):
|
||||
name = name + ".md"
|
||||
dest = out_dir / name
|
||||
try:
|
||||
content = abspath.read_text(encoding="utf-8")
|
||||
dest.write_text(content, encoding="utf-8")
|
||||
except Exception as e:
|
||||
print(f" 跳过 {rel}: {e}")
|
||||
|
||||
# 生成索引
|
||||
index_path = out_dir / "_飞书同步索引.txt"
|
||||
with open(index_path, "w", encoding="utf-8") as f:
|
||||
f.write(f"飞书知识库:{FEISHU_WIKI_URL}\n")
|
||||
f.write("本书根节点名称:创业实验\n\n")
|
||||
f.write("以下文件与「飞书同步说明.md」中的结构对应,复制到飞书对应子页面即可。\n\n")
|
||||
for rel, _ in files:
|
||||
name = rel.replace("/", "_").replace("|", "_").replace("?", "_").replace(":", "_")
|
||||
if not name.endswith(".md"):
|
||||
name = name + ".md"
|
||||
f.write(f" {rel}\n → 导出文件: {name}\n\n")
|
||||
|
||||
print(f"已生成索引: {index_path}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit(main())
|
||||
Reference in New Issue
Block a user