✅ 修复关键标题问题: 1. 筹码_手动修复 → 致命筹码 2. 修复 → 心灵修复 3. 对峙(2) → 生死对峙 ✅ 创建完整质量检查与修复工具集: 1. chapter_title_qc.py - 标题质量分析系统 2. apply_title_fixes.py - 自动修复工具 3. clean_ai_markers.py - AI标记清理工具 4. final_format_fix.py - 最终格式修复工具 5. improve_all_titles.py - 全面标题改进工具 ✅ 所有29个章节标题质量均已优化,评分A级以上 ✅ 移除爽点分析内容,确保正文纯净 ✅ 提升标题吸引力和阅读体验
201 lines
6.3 KiB
Python
201 lines
6.3 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
自动修复章节标题
|
||
"""
|
||
|
||
import os
|
||
import re
|
||
import shutil
|
||
|
||
CHAPTERS_DIR = "/root/.openclaw/workspace/projects/末日重生_囤货/chapters"
|
||
|
||
# 标题修复映射(根据QC报告的建议)
|
||
TITLE_FIXES = {
|
||
# 需要修复的标题
|
||
'筹码_手动修复': '致命筹码',
|
||
'对峙(2)': '生死对峙',
|
||
'修复': '心灵修复',
|
||
|
||
# 改进建议(可选修复)
|
||
'仓鼠行动': '仓鼠行动', # 可以保持原样
|
||
'粮草先行': '粮草先行', # 可以保持原样
|
||
'铁壁': '铁壁防线',
|
||
'焊花': '焊花飞舞',
|
||
'骨刺': '骨刺危机',
|
||
'暗流(2)': '暗流再起',
|
||
'质询': '致命质询',
|
||
'断水': '水源危机',
|
||
'昏沉': '意识迷途',
|
||
'电话': '致命来电',
|
||
'赴约': '死亡之约',
|
||
'充电': '能量重启',
|
||
'交付': '生死交付',
|
||
'对峙(2)': '生死对峙',
|
||
'决断': '生死决断',
|
||
}
|
||
|
||
def fix_chapter_title(filename, new_title):
|
||
"""修复章节标题"""
|
||
filepath = os.path.join(CHAPTERS_DIR, filename)
|
||
|
||
# 读取文件内容
|
||
with open(filepath, 'r', encoding='utf-8') as f:
|
||
content = f.read()
|
||
|
||
# 创建备份
|
||
backup_path = filepath + '.title.bak'
|
||
shutil.copy2(filepath, backup_path)
|
||
|
||
# 提取原章节号和标题
|
||
match = re.search(r'ch(\d+)-第\d+章\s+(.+)\.md', filename)
|
||
if not match:
|
||
print(f"❌ 无法解析文件名: {filename}")
|
||
return False
|
||
|
||
chapter_num = match.group(1)
|
||
old_title = match.group(2)
|
||
|
||
# 构建新文件名
|
||
new_filename = f"ch{chapter_num}-第{chapter_num}章 {new_title}.md"
|
||
new_filepath = os.path.join(CHAPTERS_DIR, new_filename)
|
||
|
||
# 更新文件内容中的标题
|
||
old_header = f"# 第{chapter_num}章 {old_title}"
|
||
new_header = f"# 第{chapter_num}章 {new_title}"
|
||
|
||
if old_header in content:
|
||
content = content.replace(old_header, new_header, 1)
|
||
else:
|
||
# 如果标题格式不同,尝试其他匹配方式
|
||
lines = content.split('\n')
|
||
if lines and lines[0].startswith('# '):
|
||
lines[0] = new_header
|
||
content = '\n'.join(lines)
|
||
|
||
# 写入新文件
|
||
with open(new_filepath, 'w', encoding='utf-8') as f:
|
||
f.write(content)
|
||
|
||
# 如果文件名改变,删除旧文件
|
||
if new_filename != filename:
|
||
os.remove(filepath)
|
||
|
||
return True, new_filename
|
||
|
||
def main():
|
||
print("🔧 章节标题修复系统")
|
||
print("=" * 50)
|
||
|
||
# 获取所有章节文件
|
||
chapter_files = [f for f in os.listdir(CHAPTERS_DIR) if f.endswith('.md')]
|
||
|
||
# 按章节号排序
|
||
chapter_files.sort(key=lambda x: int(re.search(r'ch(\d+)', x).group(1)) if re.search(r'ch(\d+)', x) else 0)
|
||
|
||
print(f"共发现 {len(chapter_files)} 个章节")
|
||
print()
|
||
|
||
# 准备修复列表
|
||
files_to_fix = []
|
||
|
||
for filename in chapter_files:
|
||
# 提取原标题
|
||
match = re.search(r'ch\d+-第\d+章\s+(.+)\.md', filename)
|
||
if not match:
|
||
continue
|
||
|
||
old_title = match.group(1)
|
||
|
||
# 检查是否需要修复
|
||
if old_title in TITLE_FIXES:
|
||
new_title = TITLE_FIXES[old_title]
|
||
if new_title != old_title: # 只有当标题确实改变时才修复
|
||
files_to_fix.append((filename, old_title, new_title))
|
||
|
||
if not files_to_fix:
|
||
print("✅ 所有标题都已是最佳状态,无需修复")
|
||
return
|
||
|
||
print("📋 需要修复的标题:")
|
||
print("-" * 60)
|
||
|
||
for i, (filename, old_title, new_title) in enumerate(files_to_fix, 1):
|
||
print(f"{i:2d}. {old_title:15} → {new_title}")
|
||
|
||
print()
|
||
print(f"共 {len(files_to_fix)} 个标题需要修复")
|
||
print()
|
||
|
||
# 确认修复
|
||
confirm = input("是否执行修复?(y/N): ").strip().lower()
|
||
if confirm != 'y':
|
||
print("❌ 修复已取消")
|
||
return
|
||
|
||
print()
|
||
print("🔄 开始修复...")
|
||
print("-" * 60)
|
||
|
||
# 执行修复
|
||
fixed_count = 0
|
||
rename_map = {}
|
||
|
||
for filename, old_title, new_title in files_to_fix:
|
||
print(f"修复: {old_title} → {new_title}")
|
||
|
||
success, new_filename = fix_chapter_title(filename, new_title)
|
||
|
||
if success:
|
||
fixed_count += 1
|
||
if new_filename != filename:
|
||
rename_map[filename] = new_filename
|
||
print(f" ✅ 修复成功")
|
||
else:
|
||
print(f" ❌ 修复失败")
|
||
|
||
print()
|
||
print("📊 修复完成!")
|
||
print(f" 成功修复: {fixed_count}/{len(files_to_fix)}")
|
||
|
||
if rename_map:
|
||
print("\n📁 文件重命名记录:")
|
||
for old_name, new_name in rename_map.items():
|
||
print(f" {old_name} → {new_name}")
|
||
|
||
# 创建修复日志
|
||
create_repair_log(files_to_fix, rename_map, fixed_count)
|
||
|
||
def create_repair_log(files_to_fix, rename_map, fixed_count):
|
||
"""创建修复日志"""
|
||
log_path = os.path.join(CHAPTERS_DIR, "../chapter_title_repair_log.md")
|
||
|
||
with open(log_path, 'w', encoding='utf-8') as f:
|
||
f.write("# 章节标题修复日志\n\n")
|
||
f.write(f"修复时间: {os.popen('date').read().strip()}\n")
|
||
f.write(f"修复章节数: {fixed_count}\n\n")
|
||
|
||
f.write("## 修复详情\n\n")
|
||
f.write("| 原标题 | 新标题 | 状态 |\n")
|
||
f.write("|--------|--------|------|\n")
|
||
|
||
for filename, old_title, new_title in files_to_fix:
|
||
status = "✅ 成功" if filename not in rename_map or rename_map[filename] else "❌ 失败"
|
||
f.write(f"| {old_title} | {new_title} | {status} |\n")
|
||
|
||
if rename_map:
|
||
f.write("\n## 文件重命名记录\n\n")
|
||
f.write("| 原文件名 | 新文件名 |\n")
|
||
f.write("|----------|----------|\n")
|
||
for old_name, new_name in rename_map.items():
|
||
f.write(f"| {old_name} | {new_name} |\n")
|
||
|
||
f.write("\n## 后续步骤\n\n")
|
||
f.write("1. 运行 `git status` 查看文件变化\n")
|
||
f.write("2. 运行 `git add chapters/` 添加更改\n")
|
||
f.write("3. 运行 `git commit -m '优化章节标题'` 提交\n")
|
||
f.write("4. 运行 `git push origin master` 推送到远程\n")
|
||
|
||
print(f"\n📄 修复日志已保存: {log_path}")
|
||
|
||
if __name__ == '__main__':
|
||
main() |