38 KiB
38 KiB
文档系统归并优化方案
1. 问题分析
通过对当前项目文档系统的全面分析,我们发现以下主要问题:
1.1 文档分散且结构重叠
- 同一主题的文档分散在多个文件夹中(如专题研究文件夹、核心研究文档、archive等)
- 存在功能重叠的目录结构(如core-theory与专题研究-理论分析部分内容重复)
- 缺少统一的文档分类标准和命名规范
1.2 版本管理混乱
- 存在多个版本的相似文档(如各AI模型生成的系列文档)
- 归档文件与活跃文件边界不清晰
- 缺乏明确的版本控制策略
1.3 检索和访问困难
- 文档量大且分散,难以快速定位所需内容
- 索引系统不完善,搜索效率低
- 缺少统一的文档入口和导航机制
1.4 维护成本高
- 文档更新和维护需要在多个位置同步
- 缺乏自动化工具支持大规模文档管理
- 新文档创建没有明确的存放规则
2. 优化目标
2.1 集中化与结构化
- 建立统一的文档存储结构,减少重复和冗余
- 实现按主题和功能的清晰分类体系
- 确保文档的层次结构合理且直观
2.2 标准化与规范化
- 制定统一的文档命名规范和格式要求
- 建立文档元数据标准(如标签、关键词、创建日期等)
- 确保文档内容的一致性和完整性
2.3 易检索与易访问
- 构建高效的索引和搜索系统
- 提供统一的文档入口和导航界面
- 实现按主题、关键词、作者等多维度检索
2.4 可维护与可扩展
- 设计易于维护和更新的文档管理流程
- 开发自动化工具支持文档处理和管理
- 确保系统能够适应未来的扩展需求
3. 文档分类体系
3.1 核心分类架构
/home/ben/code/huhan3000/docs/
├── 1-核心理论/
│ ├── 音韵考古学/
│ ├── 文明传播模型/
│ ├── KYM三链理论/
│ └── 爹学理论体系/
├── 2-专题研究/
│ ├── 孔子研究/
│ ├── 文化研究/
│ ├── 社会制度研究/
│ ├── 理论分析/
│ └── 历史研究/
├── 3-应用实践/
│ ├── 案例分析/
│ ├── 传播策略/
│ └── 可视化工具/
├── 4-学术成果/
│ ├── 学术论文/
│ ├── 研究报告/
│ └── 理论验证/
├── 5-资源库/
│ ├── 术语索引/
│ ├── 概念解释/
│ └── 外部参考文献/
└── 6-项目管理/
├── 项目计划/
├── 会议记录/
└── 开发文档/
3.2 文档类型定义
| 文档类型 | 描述 | 存储位置 | 命名规范 |
|---|---|---|---|
| 核心理论文档 | 基础理论框架和方法论 | 1-核心理论/ | [主题]-[子主题]-理论框架.md |
| 研究报告 | 专题研究成果和分析 | 2-专题研究/ | [主题]-[具体研究点]-研究报告.md |
| 案例分析 | 理论应用案例 | 3-应用实践/案例分析/ | [案例名称]-案例分析.md |
| 学术论文 | 正式学术研究成果 | 4-学术成果/学术论文/ | [年份]-[论文标题].md |
| 索引文档 | 术语和概念索引 | 5-资源库/术语索引/ | [术语类别]-索引.md |
4. 归并策略
4.1 现有文档迁移计划
| 源目录 | 目标目录 | 处理方式 |
|---|---|---|
| core-theory/ | 1-核心理论/ | 直接迁移并按主题分类 |
| 专题研究-*/ | 2-专题研究/对应子目录/ | 合并内容,保留高价值文档 |
| 核心研究文档/ | 2-专题研究/对应子目录/ | 作为主要内容来源,整合其他来源文档 |
| academic-papers/ | 4-学术成果/学术论文/ | 按论文类型重新分类 |
| 汇票/ | 2-专题研究/汇票研究/ | 合并为专题研究下的子类别 |
| 爹学整理中心/ | 1-核心理论/爹学理论体系/ | 提取核心理论内容,其余归档 |
| 胡汉三千年项目/ | 3-应用实践/工具开发/ | 保留工具和应用部分 |
4.2 文档合并原则
- 内容去重:识别并合并重复或高度相似的文档内容
- 价值评估:根据内容质量、完整性和相关性确定文档优先级
- 结构一致性:确保合并后的文档遵循统一的结构和格式
- 引用完整性:保留文档间的引用关系和交叉引用
- 版本保留:对重要文档的历史版本进行适当归档
4.3 元数据管理
为每个文档添加统一的元数据头部,包含以下信息:
---
title: 文档标题
date: 创建日期
last_updated: 最后更新日期
author: 作者
tags: [标签1, 标签2, 标签3]
categories: [分类1, 分类2]
source: 原始文件路径
related_docs: [相关文档1, 相关文档2]
---
5. 索引与检索系统
5.1 中心化索引设计
建立以下中心化索引文档:
- 主索引.md:项目所有文档的总览和导航
- 理论体系索引.md:核心理论文档的结构化索引
- 专题研究索引.md:各专题研究内容的索引
- 概念术语索引.md:关键概念和术语的定义和引用
- 人物索引.md:研究中涉及的历史人物索引
- 时间线索引.md:按时间顺序组织的研究内容
5.2 检索增强策略
- 全文检索支持:使用文档系统支持全文检索
- 标签体系:建立多层级的标签体系,支持多维度筛选
- 交叉引用:在相关文档之间建立明确的交叉引用
- 内容摘要:为每个文档生成标准格式的内容摘要
- 版本标记:明确标识文档的版本状态和更新历史
6. 自动化工具开发
6.1 文档处理工具套件
开发以下自动化工具辅助文档管理:
- 文档扫描与分类工具:自动扫描并初步分类文档
- 内容去重工具:识别和标记重复内容
- 元数据生成工具:自动提取和生成文档元数据
- 索引更新工具:基于文档变更自动更新索引
- 文档合并工具:支持按规则合并多个文档
6.2 脚本示例:文档合并工具
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
文档合并工具
功能:根据配置规则合并多个文档为一个合集
"""
import os
import re
import yaml
from datetime import datetime
# 加载配置
with open('merge_config.yaml', 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)
# 合并文档函数
def merge_documents(source_dirs, output_file, title, introduction=""):
with open(output_file, 'w', encoding='utf-8') as out_f:
# 写入文档头部
out_f.write(f"# {title}\n\n")
out_f.write(f"*合并日期: {datetime.now().strftime('%Y-%m-%d')}*\n\n")
if introduction:
out_f.write(f"## 前言\n{introduction}\n\n")
# 遍历所有源目录
for source_dir in source_dirs:
if not os.path.exists(source_dir):
print(f"警告: 源目录 {source_dir} 不存在")
continue
# 获取并排序文档文件
doc_files = sorted([f for f in os.listdir(source_dir)
if f.endswith('.md') and not f.startswith('_')])
for doc_file in doc_files:
doc_path = os.path.join(source_dir, doc_file)
print(f"处理文件: {doc_path}")
# 读取文档内容
with open(doc_path, 'r', encoding='utf-8') as in_f:
content = in_f.read()
# 提取文档标题或使用文件名
title_match = re.search(r'^#\s+(.+)', content)
if title_match:
doc_title = title_match.group(1)
else:
doc_title = doc_file.replace('.md', '').replace('_', ' ')
# 写入章节
out_f.write(f"## {doc_title}\n\n")
# 写入内容(去除原标题行)
if title_match:
content = re.sub(r'^#\s+.+\n', '', content)
out_f.write(content)
out_f.write("\n\n---\n\n")
print(f"文档合并完成: {output_file}")
# 主执行逻辑
for merge_task in config.get('merge_tasks', []):
merge_documents(
merge_task['source_dirs'],
merge_task['output_file'],
merge_task['title'],
merge_task.get('introduction', '')
)
6.3 配置文件示例
# merge_config.yaml
merge_tasks:
- title: "孔子研究合集"
source_dirs:
- "/home/ben/code/huhan3000/专题研究-孔子研究"
- "/home/ben/code/huhan3000/核心研究文档/孔子研究相关"
output_file: "/home/ben/code/huhan3000/docs/2-专题研究/孔子研究/孔子研究合集.md"
introduction: "本合集整合了所有孔子相关研究文档,按主题和重要性排序。"
- title: "理论分析合集"
source_dirs:
- "/home/ben/code/huhan3000/专题研究-理论分析"
- "/home/ben/code/huhan3000/core-theory/"
output_file: "/home/ben/code/huhan3000/docs/2-专题研究/理论分析/理论分析合集.md"
introduction: "本合集汇总了核心理论分析文档,是理解项目理论框架的关键资料。"
7. 实施计划
7.1 阶段一:准备与规划(1-2周)
- 详细审计:完成现有文档的全面审计和分类
- 确定规范:制定详细的文档命名、格式和元数据规范
- 建立架构:创建新的文档目录结构
- 开发工具:开发并测试文档处理自动化工具
7.2 阶段二:核心迁移(2-3周)
- 核心理论迁移:迁移和整合核心理论文档
- 专题研究整合:合并各专题研究内容
- 建立索引:创建初步的索引文档
- 验证结构:检查迁移后的文档结构和链接
7.3 阶段三:全面整合(3-4周)
- 剩余文档迁移:迁移剩余的学术论文、应用实践等文档
- 内容优化:优化合并后文档的内容和结构
- 完善索引:更新和完善索引系统
- 自动化测试:测试文档管理自动化工具
7.4 阶段四:验证与优化(1-2周)
- 用户测试:邀请核心团队成员测试新文档系统
- 性能优化:根据反馈优化文档结构和检索性能
- 培训文档:创建文档系统使用指南
- 最终审核:完成最终的质量审核和调整
8. 维护与更新机制
8.1 文档管理流程
- 文档创建:新文档创建必须遵循命名规范和存放位置规则
- 审核机制:重要文档需要经过审核才能纳入主文档库
- 定期更新:建立文档定期审核和更新机制
- 归档策略:制定旧版本文档的归档规则
8.2 质量控制
- 格式检查:使用自动化工具检查文档格式一致性
- 链接验证:定期验证文档间的链接有效性
- 内容审核:定期审核文档内容的准确性和完整性
- 反馈收集:建立用户反馈机制,持续改进文档质量
8.3 长期维护计划
- 每周:运行自动化工具更新索引和检查链接
- 每月:进行小规模文档整理和优化
- 每季:全面审核文档系统,调整结构和分类
- 每年:进行大型文档系统重构和优化
9. 预期效果
通过实施本优化方案,预计将实现以下效果:
- 文档组织更加清晰:统一的目录结构和分类体系
- 检索效率显著提高:完善的索引系统和多维度检索能力
- 维护成本大幅降低:自动化工具减少手动管理工作
- 内容质量不断提升:标准化的文档格式和质量控制机制
- 团队协作更加高效:清晰的文档管理流程和规范
本方案注重实用性和可扩展性,在保持现有文档价值的同时,建立更加科学、高效的文档管理体系,为项目的长期发展提供有力支持。
1. 当前文档系统分析
根据对项目的分析,目前存在以下问题:
- 文档分散:研究内容分散在多个专题文件夹中,查找和引用不便
- 重复内容:部分内容可能在多个文件中重复出现
- 结构不一致:不同文件夹的组织结构和命名方式不统一
- 缺乏索引:难以快速定位特定主题的相关内容
- 维护困难:随着研究深入,文档更新和管理变得复杂
2. 优化目标
- 建立统一的文档组织结构
- 创建自动化文档归并和索引工具
- 实现内容的模块化管理
- 建立版本控制和更新机制
- 提供便捷的检索和引用功能
3. 文档归并方案
3.1 统一文档结构
建议采用以下文档结构:
/home/ben/code/huhan3000/
├── core-docs/ # 核心文档目录(替代现有的核心研究文档)
│ ├── 0-overview/ # 概述和介绍文档
│ ├── 1-theory/ # 理论框架文档
│ │ ├── kym-theory/ # KYM三链理论
│ │ ├── y-theory/ # Y音正统性理论
│ │ └── ...
│ ├── 2-topics/ # 专题研究文档
│ │ ├── confucius/ # 孔子研究
│ │ ├── cultural/ # 文化研究
│ │ ├── social/ # 社会制度研究
│ │ ├── bills/ # 汇票研究
│ │ └── ...
│ ├── 3-applications/ # 应用案例和分析
│ └── 4-archives/ # 历史版本和归档
├── tools/ # 工具脚本
│ ├── doc-merger/ # 文档归并工具
│ ├── index-generator/ # 索引生成工具
│ └── content-analyzer/ # 内容分析工具
├── docs-site/ # 文档网站源码
└── scripts/ # 现有脚本目录
3.2 文档分类与命名规范
分类体系
- 理论框架:核心理论体系文档
- 专题研究:按主题分类的研究内容
- 应用分析:理论应用和案例研究
- 参考资料:引用和参考文档
- 工作文档:开发和研究过程文档
命名规范
采用以下命名格式:
[类别前缀]-[主题代码]-[文档标题]-[版本号].md
例如:
TH-KYM-三链理论框架-v1.2.md(理论类-KYM主题-文档标题-版本)TP-CONF-孔子反周复商理论-v2.0.md(专题类-孔子主题-文档标题-版本)
3.3 文档元数据标准
在每个文档开头添加标准化元数据:
---
title: 文档标题
author: 作者/贡献者
created: 2023-01-01
updated: 2023-06-15
version: 1.2
category: 理论/专题/应用/参考/工作
tags: [标签1, 标签2, 标签3]
related_docs: [相关文档1, 相关文档2]
---
4. 自动化工具开发
4.1 文档归并工具
创建一个Python脚本,用于自动归并分散的文档:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""文档归并工具"""
import os
import re
import shutil
import yaml
from datetime import datetime
def load_config(config_file):
"""加载配置文件"""
with open(config_file, 'r', encoding='utf-8') as f:
return yaml.safe_load(f)
def extract_metadata(content):
"""从文档中提取元数据"""
metadata_match = re.search(r'^---\s*(.*?)\s*---', content, re.DOTALL)
if metadata_match:
try:
return yaml.safe_load(metadata_match.group(1))
except:
return {}
return {}
def merge_documents(source_dir, target_dir, config):
"""归并文档"""
# 确保目标目录存在
os.makedirs(target_dir, exist_ok=True)
# 统计信息
stats = {
'processed': 0,
'merged': 0,
'skipped': 0,
'errors': 0
}
# 遍历源目录
for root, dirs, files in os.walk(source_dir):
for file in files:
if file.endswith('.md'):
stats['processed'] += 1
source_path = os.path.join(root, file)
try:
# 读取文件内容
with open(source_path, 'r', encoding='utf-8') as f:
content = f.read()
# 提取或生成元数据
metadata = extract_metadata(content)
if not metadata:
# 生成默认元数据
metadata = {
'title': file.replace('.md', ''),
'created': datetime.now().strftime('%Y-%m-%d'),
'updated': datetime.now().strftime('%Y-%m-%d'),
'version': '1.0',
'category': '未分类',
'tags': [],
'related_docs': []
}
# 确定文档类别和目标路径
category = metadata.get('category', '未分类')
target_category_dir = os.path.join(target_dir, category)
os.makedirs(target_category_dir, exist_ok=True)
# 生成新文件名
title = metadata['title']
version = metadata.get('version', '1.0')
new_filename = f"{category}-{title}-v{version}.md"
target_path = os.path.join(target_category_dir, new_filename)
# 写入新文件(添加或更新元数据)
with open(target_path, 'w', encoding='utf-8') as f:
f.write("---\n")
yaml.dump(metadata, f, allow_unicode=True)
f.write("---\n\n")
# 移除旧的元数据部分
if re.search(r'^---\s*(.*?)\s*---', content, re.DOTALL):
content = re.sub(r'^---\s*(.*?)\s*---\s*', '', content, flags=re.DOTALL)
f.write(content)
stats['merged'] += 1
print(f"归并: {source_path} -> {target_path}")
except Exception as e:
stats['errors'] += 1
print(f"错误处理 {source_path}: {str(e)}")
return stats
def main():
"""主函数"""
config = {
'source_dirs': [
'/home/ben/code/huhan3000/专题研究-理论分析',
'/home/ben/code/huhan3000/专题研究-孔子研究',
'/home/ben/code/huhan3000/专题研究-文化研究',
'/home/ben/code/huhan3000/专题研究-社会制度',
'/home/ben/code/huhan3000/汇票',
'/home/ben/code/huhan3000/爹学整理中心'
],
'target_dir': '/home/ben/code/huhan3000/core-docs',
'backup': True
}
# 创建备份
if config['backup']:
backup_dir = f"{config['target_dir']}_backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
if os.path.exists(config['target_dir']):
shutil.copytree(config['target_dir'], backup_dir)
print(f"创建备份: {backup_dir}")
# 归并每个源目录
for source_dir in config['source_dirs']:
if os.path.exists(source_dir):
print(f"处理目录: {source_dir}")
stats = merge_documents(source_dir, config['target_dir'], config)
print(f"目录统计: 处理={stats['processed']}, 归并={stats['merged']}, 错误={stats['errors']}")
if __name__ == "__main__":
main()
4.2 索引生成工具
创建索引生成器,自动为归并后的文档创建索引:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""文档索引生成工具"""
import os
import re
import yaml
import json
from datetime import datetime
def extract_metadata(file_path):
"""从文件中提取元数据"""
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
metadata_match = re.search(r'^---\s*(.*?)\s*---', content, re.DOTALL)
if metadata_match:
try:
metadata = yaml.safe_load(metadata_match.group(1))
# 添加文件路径
metadata['file_path'] = os.path.relpath(file_path)
# 提取文档摘要(前200个字符)
content_without_metadata = re.sub(r'^---\s*(.*?)\s*---\s*', '', content, flags=re.DOTALL)
metadata['summary'] = content_without_metadata.strip().split('\n')[0][:200] + '...' if content_without_metadata else ''
return metadata
except Exception as e:
print(f"提取元数据错误 {file_path}: {str(e)}")
# 如果没有元数据,返回基本信息
return {
'title': os.path.basename(file_path).replace('.md', ''),
'file_path': os.path.relpath(file_path),
'category': '未分类',
'tags': [],
'created': datetime.now().strftime('%Y-%m-%d')
}
def generate_index(docs_dir, output_file):
"""生成文档索引"""
index = {
'metadata': {
'generated': datetime.now().isoformat(),
'total_docs': 0,
'categories': {}
},
'documents': []
}
# 遍历文档目录
for root, dirs, files in os.walk(docs_dir):
for file in files:
if file.endswith('.md'):
file_path = os.path.join(root, file)
metadata = extract_metadata(file_path)
index['documents'].append(metadata)
# 更新统计信息
category = metadata.get('category', '未分类')
if category not in index['metadata']['categories']:
index['metadata']['categories'][category] = 0
index['metadata']['categories'][category] += 1
# 更新总文档数
index['metadata']['total_docs'] = len(index['documents'])
# 保存索引
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(index, f, ensure_ascii=False, indent=2)
print(f"索引生成完成: {output_file}")
print(f"总文档数: {index['metadata']['total_docs']}")
print("分类统计:")
for category, count in index['metadata']['categories'].items():
print(f" - {category}: {count}")
def generate_md_index(docs_dir, output_file):
"""生成Markdown格式的索引"""
index = {
'metadata': {
'generated': datetime.now().isoformat(),
'total_docs': 0,
'categories': {}
},
'documents': []
}
# 遍历文档目录
for root, dirs, files in os.walk(docs_dir):
for file in files:
if file.endswith('.md'):
file_path = os.path.join(root, file)
metadata = extract_metadata(file_path)
index['documents'].append(metadata)
# 更新统计信息
category = metadata.get('category', '未分类')
if category not in index['metadata']['categories']:
index['metadata']['categories'][category] = []
index['metadata']['categories'][category].append(metadata)
# 更新总文档数
index['metadata']['total_docs'] = len(index['documents'])
# 生成Markdown内容
md_content = f"""# 文档索引
> 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
> 总文档数: {index['metadata']['total_docs']}
## 分类索引
"""
# 按分类生成索引
for category, docs in sorted(index['metadata']['categories'].items()):
md_content += f"### {category} ({len(docs)})
\n"
for doc in sorted(docs, key=lambda x: x.get('title', '')):
title = doc.get('title', os.path.basename(doc['file_path']))
relative_path = os.path.relpath(doc['file_path'], docs_dir)
md_content += f"- [{title}]({relative_path})\n"
md_content += "\n"
# 保存Markdown索引
with open(output_file, 'w', encoding='utf-8') as f:
f.write(md_content)
print(f"Markdown索引生成完成: {output_file}")
def main():
"""主函数"""
docs_dir = '/home/ben/code/huhan3000/core-docs'
json_index_file = '/home/ben/code/huhan3000/core-docs/index.json'
md_index_file = '/home/ben/code/huhan3000/core-docs/文档索引.md'
generate_index(docs_dir, json_index_file)
generate_md_index(docs_dir, md_index_file)
if __name__ == "__main__":
main()
4.3 构建Shell脚本
创建一个整合上述工具的shell脚本:
#!/bin/bash
# 文档系统管理脚本
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${BLUE}胡汉三千年项目文档系统管理工具${NC}"
echo -e "${BLUE}=============================${NC}"
# 设置变量
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
TOOLS_DIR="$PROJECT_DIR/tools/doc-tools"
CORE_DOCS_DIR="$PROJECT_DIR/core-docs"
LOG_FILE="$PROJECT_DIR/doc_management.log"
# 确保工具目录存在
mkdir -p "$TOOLS_DIR"
# 初始化日志
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 检查Python环境
check_python() {
log "检查Python环境..."
if command -v python3 &> /dev/null; then
PYTHON_VERSION=$(python3 --version 2>&1)
log "找到Python: $PYTHON_VERSION"
return 0
else
log "${RED}错误: 未找到Python3${NC}"
return 1
fi
}
# 安装依赖
install_deps() {
log "安装必要依赖..."
pip3 install pyyaml --quiet
if [ $? -eq 0 ]; then
log "${GREEN}依赖安装成功${NC}"
return 0
else
log "${RED}依赖安装失败${NC}"
return 1
fi
}
# 创建归并工具
create_merger_tool() {
log "创建文档归并工具..."
cat > "$TOOLS_DIR/doc_merger.py" << 'EOF'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""文档归并工具"""
import os
import re
import shutil
import yaml
from datetime import datetime
def load_config(config_file):
"""加载配置文件"""
with open(config_file, 'r', encoding='utf-8') as f:
return yaml.safe_load(f)
def extract_metadata(content):
"""从文档中提取元数据"""
metadata_match = re.search(r'^---\s*(.*?)\s*---', content, re.DOTALL)
if metadata_match:
try:
return yaml.safe_load(metadata_match.group(1))
except:
return {}
return {}
def merge_documents(source_dir, target_dir, config):
"""归并文档"""
# 确保目标目录存在
os.makedirs(target_dir, exist_ok=True)
# 统计信息
stats = {
'processed': 0,
'merged': 0,
'skipped': 0,
'errors': 0
}
# 遍历源目录
for root, dirs, files in os.walk(source_dir):
for file in files:
if file.endswith('.md'):
stats['processed'] += 1
source_path = os.path.join(root, file)
try:
# 读取文件内容
with open(source_path, 'r', encoding='utf-8') as f:
content = f.read()
# 提取或生成元数据
metadata = extract_metadata(content)
if not metadata:
# 生成默认元数据
metadata = {
'title': file.replace('.md', ''),
'created': datetime.now().strftime('%Y-%m-%d'),
'updated': datetime.now().strftime('%Y-%m-%d'),
'version': '1.0',
'category': '未分类',
'tags': [],
'related_docs': []
}
# 确定文档类别和目标路径
category = metadata.get('category', '未分类')
target_category_dir = os.path.join(target_dir, category)
os.makedirs(target_category_dir, exist_ok=True)
# 生成新文件名
title = metadata['title']
version = metadata.get('version', '1.0')
new_filename = f"{category}-{title}-v{version}.md"
target_path = os.path.join(target_category_dir, new_filename)
# 写入新文件(添加或更新元数据)
with open(target_path, 'w', encoding='utf-8') as f:
f.write("---\n")
yaml.dump(metadata, f, allow_unicode=True)
f.write("---\n\n")
# 移除旧的元数据部分
if re.search(r'^---\s*(.*?)\s*---', content, re.DOTALL):
content = re.sub(r'^---\s*(.*?)\s*---\s*', '', content, flags=re.DOTALL)
f.write(content)
stats['merged'] += 1
print(f"归并: {source_path} -> {target_path}")
except Exception as e:
stats['errors'] += 1
print(f"错误处理 {source_path}: {str(e)}")
return stats
def main():
"""主函数"""
config = {
'source_dirs': [
'/home/ben/code/huhan3000/专题研究-理论分析',
'/home/ben/code/huhan3000/专题研究-孔子研究',
'/home/ben/code/huhan3000/专题研究-文化研究',
'/home/ben/code/huhan3000/专题研究-社会制度',
'/home/ben/code/huhan3000/汇票',
'/home/ben/code/huhan3000/爹学整理中心'
],
'target_dir': '/home/ben/code/huhan3000/core-docs',
'backup': True
}
# 创建备份
if config['backup']:
backup_dir = f"{config['target_dir']}_backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
if os.path.exists(config['target_dir']):
shutil.copytree(config['target_dir'], backup_dir)
print(f"创建备份: {backup_dir}")
# 归并每个源目录
for source_dir in config['source_dirs']:
if os.path.exists(source_dir):
print(f"处理目录: {source_dir}")
stats = merge_documents(source_dir, config['target_dir'], config)
print(f"目录统计: 处理={stats['processed']}, 归并={stats['merged']}, 错误={stats['errors']}")
if __name__ == "__main__":
main()
EOF
chmod +x "$TOOLS_DIR/doc_merger.py"
log "${GREEN}文档归并工具已创建${NC}"
}
# 创建索引工具
create_index_tool() {
log "创建索引生成工具..."
cat > "$TOOLS_DIR/index_generator.py" << 'EOF'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""文档索引生成工具"""
import os
import re
import yaml
import json
from datetime import datetime
def extract_metadata(file_path):
"""从文件中提取元数据"""
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
metadata_match = re.search(r'^---\s*(.*?)\s*---', content, re.DOTALL)
if metadata_match:
try:
metadata = yaml.safe_load(metadata_match.group(1))
# 添加文件路径
metadata['file_path'] = os.path.relpath(file_path)
# 提取文档摘要(前200个字符)
content_without_metadata = re.sub(r'^---\s*(.*?)\s*---\s*', '', content, flags=re.DOTALL)
metadata['summary'] = content_without_metadata.strip().split('\n')[0][:200] + '...' if content_without_metadata else ''
return metadata
except Exception as e:
print(f"提取元数据错误 {file_path}: {str(e)}")
# 如果没有元数据,返回基本信息
return {
'title': os.path.basename(file_path).replace('.md', ''),
'file_path': os.path.relpath(file_path),
'category': '未分类',
'tags': [],
'created': datetime.now().strftime('%Y-%m-%d')
}
def generate_index(docs_dir, output_file):
"""生成文档索引"""
index = {
'metadata': {
'generated': datetime.now().isoformat(),
'total_docs': 0,
'categories': {}
},
'documents': []
}
# 遍历文档目录
for root, dirs, files in os.walk(docs_dir):
for file in files:
if file.endswith('.md'):
file_path = os.path.join(root, file)
metadata = extract_metadata(file_path)
index['documents'].append(metadata)
# 更新统计信息
category = metadata.get('category', '未分类')
if category not in index['metadata']['categories']:
index['metadata']['categories'][category] = 0
index['metadata']['categories'][category] += 1
# 更新总文档数
index['metadata']['total_docs'] = len(index['documents'])
# 保存索引
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(index, f, ensure_ascii=False, indent=2)
print(f"索引生成完成: {output_file}")
print(f"总文档数: {index['metadata']['total_docs']}")
print("分类统计:")
for category, count in index['metadata']['categories'].items():
print(f" - {category}: {count}")
def generate_md_index(docs_dir, output_file):
"""生成Markdown格式的索引"""
index = {
'metadata': {
'generated': datetime.now().isoformat(),
'total_docs': 0,
'categories': {}
},
'documents': []
}
# 遍历文档目录
for root, dirs, files in os.walk(docs_dir):
for file in files:
if file.endswith('.md'):
file_path = os.path.join(root, file)
metadata = extract_metadata(file_path)
index['documents'].append(metadata)
# 更新统计信息
category = metadata.get('category', '未分类')
if category not in index['metadata']['categories']:
index['metadata']['categories'][category] = []
index['metadata']['categories'][category].append(metadata)
# 更新总文档数
index['metadata']['total_docs'] = len(index['documents'])
# 生成Markdown内容
md_content = f"""# 文档索引
> 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
> 总文档数: {index['metadata']['total_docs']}
## 分类索引
"""
# 按分类生成索引
for category, docs in sorted(index['metadata']['categories'].items()):
md_content += f"### {category} ({len(docs)})
\n"
for doc in sorted(docs, key=lambda x: x.get('title', '')):
title = doc.get('title', os.path.basename(doc['file_path']))
relative_path = os.path.relpath(doc['file_path'], docs_dir)
md_content += f"- [{title}]({relative_path})\n"
md_content += "\n"
# 保存Markdown索引
with open(output_file, 'w', encoding='utf-8') as f:
f.write(md_content)
print(f"Markdown索引生成完成: {output_file}")
def main():
"""主函数"""
docs_dir = '/home/ben/code/huhan3000/core-docs'
json_index_file = '/home/ben/code/huhan3000/core-docs/index.json'
md_index_file = '/home/ben/code/huhan3000/core-docs/文档索引.md'
generate_index(docs_dir, json_index_file)
generate_md_index(docs_dir, md_index_file)
if __name__ == "__main__":
main()
EOF
chmod +x "$TOOLS_DIR/index_generator.py"
log "${GREEN}索引生成工具已创建${NC}"
}
# 执行归并
run_merger() {
log "开始文档归并..."
python3 "$TOOLS_DIR/doc_merger.py"
if [ $? -eq 0 ]; then
log "${GREEN}文档归并完成${NC}"
return 0
else
log "${RED}文档归并失败${NC}"
return 1
fi
}
# 生成索引
generate_index() {
log "开始生成索引..."
python3 "$TOOLS_DIR/index_generator.py"
if [ $? -eq 0 ]; then
log "${GREEN}索引生成完成${NC}"
return 0
else
log "${RED}索引生成失败${NC}"
return 1
fi
}
# 创建配置文件
create_config() {
log "创建配置文件..."
cat > "$TOOLS_DIR/config.yaml" << 'EOF'
source_dirs:
- /home/ben/code/huhan3000/专题研究-理论分析
- /home/ben/code/huhan3000/专题研究-孔子研究
- /home/ben/code/huhan3000/专题研究-文化研究
- /home/ben/code/huhan3000/专题研究-社会制度
- /home/ben/code/huhan3000/汇票
- /home/ben/code/huhan3000/爹学整理中心
target_dir: /home/ben/code/huhan3000/core-docs
backup: true
categories:
- 理论框架
- 专题研究
- 应用分析
- 参考资料
- 工作文档
metadata_template:
title: ""
author: ""
created: ""
updated: ""
version: "1.0"
category: "未分类"
tags: []
related_docs: []
EOF
log "${GREEN}配置文件已创建${NC}"
}
# 显示帮助
show_help() {
echo -e "\n${BLUE}使用方法:${NC} $0 [选项]"
echo -e "\n${YELLOW}选项:${NC}"
echo -e " ${GREEN}--setup${NC} 设置文档管理环境"
echo -e " ${GREEN}--merge${NC} 执行文档归并"
echo -e " ${GREEN}--index${NC} 生成文档索引"
echo -e " ${GREEN}--full${NC} 执行完整流程(归并+索引)"
echo -e " ${GREEN}--help${NC} 显示此帮助信息"
echo -e "\n${YELLOW}示例:${NC}"
echo -e " $0 --setup # 初始化设置"
echo -e " $0 --full # 执行完整的文档归并和索引生成"
}
# 初始化环境
setup_environment() {
log "开始初始化环境..."
# 检查Python
if ! check_python; then
return 1
fi
# 安装依赖
if ! install_deps; then
return 1
fi
# 创建配置文件
create_config
# 创建工具
create_merger_tool
create_index_tool
# 创建目标目录
mkdir -p "$CORE_DOCS_DIR"
log "${GREEN}环境初始化完成${NC}"
return 0
}
# 主流程
main() {
if [ $# -eq 0 ]; then
show_help
return 1
fi
case "$1" in
--setup)
setup_environment
;;
--merge)
run_merger
;;
--index)
generate_index
;;
--full)
run_merger && generate_index
;;
--help)
show_help
;;
*)
echo -e "${RED}未知选项: $1${NC}"
show_help
return 1
;;
esac
}
main "$@"