82 lines
3.0 KiB
Python
82 lines
3.0 KiB
Python
|
|
#!/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())
|