# 文档系统归并优化方案 ## 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 文档合并原则 1. **内容去重**:识别并合并重复或高度相似的文档内容 2. **价值评估**:根据内容质量、完整性和相关性确定文档优先级 3. **结构一致性**:确保合并后的文档遵循统一的结构和格式 4. **引用完整性**:保留文档间的引用关系和交叉引用 5. **版本保留**:对重要文档的历史版本进行适当归档 ### 4.3 元数据管理 为每个文档添加统一的元数据头部,包含以下信息: ```markdown --- title: 文档标题 date: 创建日期 last_updated: 最后更新日期 author: 作者 tags: [标签1, 标签2, 标签3] categories: [分类1, 分类2] source: 原始文件路径 related_docs: [相关文档1, 相关文档2] --- ``` ## 5. 索引与检索系统 ### 5.1 中心化索引设计 建立以下中心化索引文档: 1. **主索引.md**:项目所有文档的总览和导航 2. **理论体系索引.md**:核心理论文档的结构化索引 3. **专题研究索引.md**:各专题研究内容的索引 4. **概念术语索引.md**:关键概念和术语的定义和引用 5. **人物索引.md**:研究中涉及的历史人物索引 6. **时间线索引.md**:按时间顺序组织的研究内容 ### 5.2 检索增强策略 1. **全文检索支持**:使用文档系统支持全文检索 2. **标签体系**:建立多层级的标签体系,支持多维度筛选 3. **交叉引用**:在相关文档之间建立明确的交叉引用 4. **内容摘要**:为每个文档生成标准格式的内容摘要 5. **版本标记**:明确标识文档的版本状态和更新历史 ## 6. 自动化工具开发 ### 6.1 文档处理工具套件 开发以下自动化工具辅助文档管理: 1. **文档扫描与分类工具**:自动扫描并初步分类文档 2. **内容去重工具**:识别和标记重复内容 3. **元数据生成工具**:自动提取和生成文档元数据 4. **索引更新工具**:基于文档变更自动更新索引 5. **文档合并工具**:支持按规则合并多个文档 ### 6.2 脚本示例:文档合并工具 ```python #!/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 配置文件示例 ```yaml # 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周) 1. **详细审计**:完成现有文档的全面审计和分类 2. **确定规范**:制定详细的文档命名、格式和元数据规范 3. **建立架构**:创建新的文档目录结构 4. **开发工具**:开发并测试文档处理自动化工具 ### 7.2 阶段二:核心迁移(2-3周) 1. **核心理论迁移**:迁移和整合核心理论文档 2. **专题研究整合**:合并各专题研究内容 3. **建立索引**:创建初步的索引文档 4. **验证结构**:检查迁移后的文档结构和链接 ### 7.3 阶段三:全面整合(3-4周) 1. **剩余文档迁移**:迁移剩余的学术论文、应用实践等文档 2. **内容优化**:优化合并后文档的内容和结构 3. **完善索引**:更新和完善索引系统 4. **自动化测试**:测试文档管理自动化工具 ### 7.4 阶段四:验证与优化(1-2周) 1. **用户测试**:邀请核心团队成员测试新文档系统 2. **性能优化**:根据反馈优化文档结构和检索性能 3. **培训文档**:创建文档系统使用指南 4. **最终审核**:完成最终的质量审核和调整 ## 8. 维护与更新机制 ### 8.1 文档管理流程 1. **文档创建**:新文档创建必须遵循命名规范和存放位置规则 2. **审核机制**:重要文档需要经过审核才能纳入主文档库 3. **定期更新**:建立文档定期审核和更新机制 4. **归档策略**:制定旧版本文档的归档规则 ### 8.2 质量控制 1. **格式检查**:使用自动化工具检查文档格式一致性 2. **链接验证**:定期验证文档间的链接有效性 3. **内容审核**:定期审核文档内容的准确性和完整性 4. **反馈收集**:建立用户反馈机制,持续改进文档质量 ### 8.3 长期维护计划 1. **每周**:运行自动化工具更新索引和检查链接 2. **每月**:进行小规模文档整理和优化 3. **每季**:全面审核文档系统,调整结构和分类 4. **每年**:进行大型文档系统重构和优化 ## 9. 预期效果 通过实施本优化方案,预计将实现以下效果: 1. **文档组织更加清晰**:统一的目录结构和分类体系 2. **检索效率显著提高**:完善的索引系统和多维度检索能力 3. **维护成本大幅降低**:自动化工具减少手动管理工作 4. **内容质量不断提升**:标准化的文档格式和质量控制机制 5. **团队协作更加高效**:清晰的文档管理流程和规范 本方案注重实用性和可扩展性,在保持现有文档价值的同时,建立更加科学、高效的文档管理体系,为项目的长期发展提供有力支持。 ## 1. 当前文档系统分析 根据对项目的分析,目前存在以下问题: 1. **文档分散**:研究内容分散在多个专题文件夹中,查找和引用不便 2. **重复内容**:部分内容可能在多个文件中重复出现 3. **结构不一致**:不同文件夹的组织结构和命名方式不统一 4. **缺乏索引**:难以快速定位特定主题的相关内容 5. **维护困难**:随着研究深入,文档更新和管理变得复杂 ## 2. 优化目标 1. 建立统一的文档组织结构 2. 创建自动化文档归并和索引工具 3. 实现内容的模块化管理 4. 建立版本控制和更新机制 5. 提供便捷的检索和引用功能 ## 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 文档分类与命名规范 #### 分类体系 1. **理论框架**:核心理论体系文档 2. **专题研究**:按主题分类的研究内容 3. **应用分析**:理论应用和案例研究 4. **参考资料**:引用和参考文档 5. **工作文档**:开发和研究过程文档 #### 命名规范 采用以下命名格式: ``` [类别前缀]-[主题代码]-[文档标题]-[版本号].md ``` 例如: - `TH-KYM-三链理论框架-v1.2.md`(理论类-KYM主题-文档标题-版本) - `TP-CONF-孔子反周复商理论-v2.0.md`(专题类-孔子主题-文档标题-版本) ### 3.3 文档元数据标准 在每个文档开头添加标准化元数据: ```markdown --- 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脚本,用于自动归并分散的文档: ```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 索引生成工具 创建索引生成器,自动为归并后的文档创建索引: ```python #!/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脚本: ```bash #!/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 "$@"