diff --git a/chapter_title_qc_report.md b/chapter_title_qc_report.md new file mode 100644 index 0000000..8be595f --- /dev/null +++ b/chapter_title_qc_report.md @@ -0,0 +1,45 @@ +# 章节标题质量检查报告 + +生成时间: Mon Mar 30 02:53:26 PM CST 2026 +总章节数: 29 + +## 标题质量分析 + +| 章节 | 原标题 | 评分 | 等级 | 问题 | 建议标题 | +|------|--------|------|------|------|----------| +| 1 | 冰点记忆 | 100 | A+ (优秀) | 无 | 无 | +| 2 | 暗流 | 100 | A+ (优秀) | 无 | 暗流重生 | +| 3 | 仓鼠行动 | 85 | A (良好) | 标题缺乏吸引力关键词 | 无 | +| 4 | 粮草先行 | 85 | A (良好) | 标题缺乏吸引力关键词 | 无 | +| 5 | 铁壁 | 85 | A (良好) | 标题缺乏吸引力关键词 | 铁壁重生 | +| 6 | 焊花 | 85 | A (良好) | 标题缺乏吸引力关键词 | 焊花重生 | +| 7 | 骨刺 | 85 | A (良好) | 标题缺乏吸引力关键词 | 骨刺重生 | +| 8 | 暗流(2) | 75 | B+ (一般) | 标题包含括号数字 | 暗流 | +| 9 | 对峙 | 100 | A+ (优秀) | 无 | 对峙重生 | +| 10 | 倒计时 | 100 | A+ (优秀) | 无 | 末日倒计时 | +| 11 | 致命筹码 | 85 | A (良好) | 标题缺乏吸引力关键词 | 无 | +| 12 | 质询 | 85 | A (良好) | 标题缺乏吸引力关键词 | 致命质询 | +| 13 | 铁锈 | 100 | A+ (优秀) | 无 | 锈蚀阴谋 | +| 14 | 断水 | 85 | A (良好) | 标题缺乏吸引力关键词 | 水源危机 | +| 15 | 昏沉 | 85 | A (良好) | 标题缺乏吸引力关键词 | 意识迷途 | +| 16 | 电话 | 85 | A (良好) | 标题缺乏吸引力关键词 | 致命来电 | +| 17 | 煎熬 | 100 | A+ (优秀) | 无 | 生死煎熬 | +| 18 | 钢渣 | 100 | A+ (优秀) | 无 | 熔炉考验 | +| 19 | 赴约 | 85 | A (良好) | 标题缺乏吸引力关键词 | 死亡之约 | +| 20 | 充电 | 85 | A (良好) | 标题缺乏吸引力关键词 | 能量重启 | +| 21 | 焊火 | 100 | A+ (优秀) | 无 | 烈焰焊火 | +| 22 | 抉择 | 100 | A+ (优秀) | 无 | 命运抉择 | +| 23 | 交付 | 85 | A (良好) | 标题缺乏吸引力关键词 | 生死交付 | +| 24 | 暗影 | 100 | A+ (优秀) | 无 | 暗影重重 | +| 25 | 生死对峙 | 100 | A+ (优秀) | 无 | 无 | +| 26 | 决断 | 85 | A (良好) | 标题缺乏吸引力关键词 | 生死决断 | +| 27 | 博弈 | 100 | A+ (优秀) | 无 | 末日博弈 | +| 28 | 铁门 | 100 | A+ (优秀) | 无 | 钢铁之门 | +| 29 | 心灵修复 | 55 | C (需要改进) | 标题包含技术词汇'修复'; 标题缺乏吸引力关键词 | 无 | + +## 改进建议 + +1. 移除标题中的下划线和技术词汇 +2. 避免使用括号数字 +3. 标题长度建议2-6个字 +4. 使用更具吸引力的关键词 diff --git a/chapters/ch11-第11章 筹码_手动修复.md b/chapters/ch11-第11章 致命筹码.md similarity index 99% rename from chapters/ch11-第11章 筹码_手动修复.md rename to chapters/ch11-第11章 致命筹码.md index 7616c31..24f4a4c 100644 --- a/chapters/ch11-第11章 筹码_手动修复.md +++ b/chapters/ch11-第11章 致命筹码.md @@ -1,4 +1,4 @@ -# 第11章 筹码_手动修复 +# 第11章 致命筹码 筹码 中午十二点零七分,仓库里闷热得像个蒸笼。陈末背靠着刚拧紧的钢管骨架,冰凉触感透过汗湿的T恤渗入皮肤,带来一丝短暂的凉爽。 他盯着手机屏幕,通话记录最上方,“建材”两个字后面显示着两分四十七秒的通话时长。那是胡老板。距离下午四点的约定时间,只剩不到四小时。 十万现金。 这个数字像块石头压在胸口。他掀开墙角松动的水泥砖,从里面取出黑色塑料袋。里面是捆扎整齐的钞票:九捆一万,加上零散的纸币,总共九万六千四百元。 不够,还差三千六。 他把钱塞回原处,盖好水泥砖。起身时脚踝传来刺痛,他不得不用手掌撑住钢管才勉强站稳。低头一看,掌心的薄痂边缘已经红肿发炎。 走到废纸板堆旁,拖出那个破旧的帆布包,倒出里面的零钱。硬币和皱巴巴的纸币散落一地,发出清脆的响声。他蹲下身,一枚枚捡起硬币,一张张捋平纸币,动作缓慢而专注。 最大面额是两张一百元。 数了又数,总数是八百二十七块五毛。还是不够。 而现在,连定金都凑不齐。 手机震动起来,屏幕亮起。是林薇的微信消息:“帖子发了。标题《急售!城东工业区废弃三层楼,产权清晰,价格面议》,留了备用号。五分钟三个咨询电话。应该能制造动静。” 陈末手指在屏幕上快速敲击:“谢了。如果有人问具体位置,就说工业区靠北,废弃纺织厂隔壁。” “明白。你那边怎么样?还顺利吗?” “正在筹钱。” “需要帮忙吗?我手里还有点积蓄……” 陈末删掉已经打好的“不用”,重新输入:“暂时不用。谢了。” 关掉微信,他拨通小刘的电话。三声铃响后接通,背景音嘈杂混乱。 “陈老板?”小刘的声音透过杂音传来。 “在哪儿?” “火车东站广场,刚找到报刊亭。黄鹤楼软珍一条六百八,现在送过去吗?” “先不急。”陈末说,声音里带着刻意的平静,“你身上有多少现金?” 小刘那边传来窸窸窣窣的声音,像是在翻口袋。“等等,我看看……三百二,还有几个硬币。” “找老乡能借到钱吗?三千,利息高点没关系,今天下午两点前能还,我可以多付两百跑腿费。” 电话那头沉默了几秒。“陈老板,你这是……” “家里急用。”陈末打断他,“周转一下,就几个小时。利息一天五十,怎么样?” “行,我问问。有个老乡在车站对面开小卖部,应该能凑出来。你等着,我马上联系。” 挂断电话,陈末靠在墙上,闭上眼睛。窗外传来远处的汽车喇叭声,还有不知哪家工厂机器的轰鸣。时间一分一秒流逝,像沙漏里的沙子,看得见却抓不住。 他需要这笔钱。不是需要,是必须要有。胡老板这种人,见惯了各种把戏和试探。十万现金是诚意,是门槛,是证明自己不是空手套白狼的唯一方式。 手机又震动起来。是小刘:“老乡答应了,三千,利息五十,今天下午两点前还。怎么给你?” “送到仓库来。现在。”陈末看了看时间,“二十分钟内能到吗?” “能,我打车过去。” “好,等你。” 陈末站起身,走到仓库中央。四面墙上的钢管骨架像一排排肋骨,支撑着这个简陋的空间。他走到西墙边,伸手摸了摸新竖起的第四根钢管。冰凉的金属表面已经沾染了汗渍和灰尘。 手掌的伤口在刚才撑墙时又裂开了,血珠渗出,在掌心蜿蜒出一道红线。陈末扯了块破布缠上,用力打了个结。疼痛让他清醒,让他记住此刻的处境。 二十分钟后,仓库卷帘门被敲响。三声急促,两声缓慢。约定的暗号。 陈末拉开侧面的小门,小刘站在门外,脸上带着汗珠,手里拿着一个牛皮纸信封。 “陈老板,三千,你点点。”小刘把信封递过来,又从口袋里掏出一张折叠的纸,“借条,老乡让签个字。” 陈末接过信封,抽出里面的钞票快速数了一遍。三十张一百元,整齐崭新。他在借条上签下名字,撕下存根还给小刘。 “谢了。下午两点,连本带利还你,再加两百跑腿费。” “不急不急,陈老板办事我放心。”小刘擦了把汗,“那烟……还送吗?” “送。”陈末从口袋里掏出六百元,“这是买烟的钱。下午两点,你来取工钱,顺便帮我把烟送到工业区另一头的便利店,就说是替人取的,放那儿就行。” 小刘接过钱,眼神里闪过一丝疑惑,但没有多问。“明白了。那我现在去办?” “去吧。下午两点,准时。” 看着小刘离开的背影,陈末关上小门,回到仓库里。他打开黑色塑料袋,把刚借来的三千元放进去,和其他钱捆在一起。 现在,十万现金凑齐了。 做完这一切,他看了看时间:下午一点十五分。 距离见胡老板还有两个多小时。他需要换身衣服,需要准备说辞,需要规划路线,需要考虑可能遇到的各种情况。 但首先,他需要处理一下伤口。刚才缠的破布已经被血浸透,需要重新包扎。他走到角落里翻找,找到半瓶碘伏和一卷纱布。这是上次采购药品时特意留下的。 脱下T恤,露出精瘦的上身。肋骨清晰可见,肩膀和手臂上有几处旧伤疤,是前世在末世里留下的。他拧开碘伏瓶盖,倒了些在掌心伤口上。 刺痛瞬间传来,像无数根针扎进肉里。陈末咬紧牙关,没有出声。等刺痛过去,他用纱布仔细包扎,确保不会在交易时突然流血。 换上一件相对干净的深色衬衫,一条深色裤子。这是他能找到的最正式的衣服了。虽然旧,但至少整洁。他从帆布包里翻出一顶黑色棒球帽,戴在头上,压低帽檐。 最后,他从工具堆里拿起一把水果刀,刀刃只有十厘米长,但足够锋利。他犹豫了一下,还是把刀塞进后腰的皮带里,用衬衫下摆盖住。 十万现金装进一个不起眼的尼龙手提袋。他提了提,沉甸甸的,像提着半条命。 出门前,他最后检查了一遍仓库:钢管骨架稳固,设备藏在角落用帆布盖好,侧门锁死,卷帘门从内部反锁。一切妥当。 拉开侧门,阳光刺眼。陈末眯起眼睛,适应了几秒,然后快步走进巷子。 他招手拦了辆出租车。“城西建材市场。” 司机是个中年男人,从后视镜里瞥了他一眼,又看了看他手里的尼龙袋,没多问,发动了车子。 陈末坐在后排,看着窗外飞速倒退的街景。城市依旧繁华喧嚣,行人匆匆,车辆如织。没有人知道,这场看似平常的交易,背后关乎的是一场即将到来的浩劫。 他打开手机地图,搜索“城西建材市场B区12号仓库”。地图显示那是一个半封闭的仓库区,只有一条主路进出,周围是待拆迁的平房区。 瓮中捉鳖的地形。 陈末关掉地图,靠在座椅上,闭上眼睛。脑海里快速闪过各种可能性:胡老板会不会带人?仓库里有没有埋伏?交易完成后怎么安全离开? 每一个问题都需要答案,但每一个答案都不确定。 唯一确定的是,他必须去。必须签下那份协议,必须锁定那八千万债权。这是撬动后续所有计划的第一根杠杆,是通往末世生存的第一道门槛。 车子在红绿灯前停下。陈末睁开眼睛,看到路边有家银行。巨大的电子屏上滚动着股市行情和理财产品广告。其中一条格外醒目:“稳盈宝,年化收益12%,稳健可靠。” 他嘴角勾起一丝冷笑。还有一天,这个广告就会变成无数人的噩梦。 而他将成为这场噩梦中,少数能从中获利的人。 出租车继续前行。下午三点二十五分,车子停在城西建材市场门口。 陈末付了车费,提着尼龙袋下车。市场里人声鼎沸,各种建材店铺林立,空气中弥漫着水泥、油漆和金属的味道。 他按照地图指示,穿过主路,拐进B区。越往里走,人越少,环境越破旧。最后,他停在12号仓库门前。 那是一扇锈迹斑斑的卷帘门,半开着。里面光线昏暗,看不清具体情况。 陈末深吸一口气,握紧了手里的尼龙袋。 筹码已经备好。 赌局,即将开始。 他坐在地上,额头抵着膝盖。汗水顺着脊椎往下淌,在水泥地上洇出深色痕迹。下午四点前,他必须凑齐十万现金,去见一个完全陌生的男人,签一份可能决定后续所有计划的协议。 diff --git a/chapters/ch25-第25章 对峙(2).md b/chapters/ch25-第25章 生死对峙.md similarity index 99% rename from chapters/ch25-第25章 对峙(2).md rename to chapters/ch25-第25章 生死对峙.md index 21a9b6f..6e0fa2d 100644 --- a/chapters/ch25-第25章 对峙(2).md +++ b/chapters/ch25-第25章 生死对峙.md @@ -1,3 +1,3 @@ -# 第25章 对峙(2) +# 第25章 生死对峙 对峙(2) 仓库里只剩下陈末粗重的呼吸声,还有钢棍砸入地面后残留的金属震颤嗡鸣。 他松开铁锤,锤头“哐当”一声砸在水泥地上。手掌虎口已经麻木,每一次抡锤,脚踝传来的剧痛都像有根烧红的铁钎在骨缝里搅动。布洛芬那点可怜的镇痛效果,早被这几下全力砸击耗干了。 他靠在冰冷的砖墙上,侧耳倾听。 仓库外很安静。没有引擎声,没有脚步声。这种安静比喧闹更让人心头发紧。 小野拖着那块更小的钢板挪到陈末身边。男孩脸上全是汗,混着灰尘。他手里紧紧攥着那把活动扳手,指节发白。 “他们……还在外面吗?”小野声音压得很低。 陈末没回答。他摸出手机,给小刘发了条短信: 几秒后,回复来了: 陈末盯着那行字。 对方在等什么?评估人数?等指令?等天黑? 前世记忆碎片涌上来。末世降临前一个月,城市边缘的混乱已经开始冒头。一些嗅觉敏锐的人,开始有意识地“囤积”资源——不是用钱买,是用别的手段。废弃仓库、郊区厂房,都是目标。 这两个人,是冲着仓库来的,还是冲着他来的? 如果是冲仓库,那他们应该已经观察了不止一天。自己进出仓库、搬运物资、甚至昨晚的焊接火光,都可能被看在眼里。一个孤身男人,带着工程材料进出废弃仓库——在有些人眼里,这就像一块肥肉。 如果是冲着他来……陈末排除了这个可能。赵伟那边刚完成交易,没理由这么快翻脸。胡老板更不可能,信息还没验证。 那就只剩下一种可能:地头蛇。 这片城西工业区废弃多年,但并非完全无人管辖。前世隐约听说过,附近有几个混子团伙,专门盯着这些废弃厂区,偷盗电缆、金属废料,甚至强占空置厂房。自己租下这个仓库,动静不小,很可能被盯上了。 对方在暗处观察,以为摸清了他的底细——一个独居、可能有点钱的“凯子”。但他们不知道,仓库里不止一个人,而且这个“凯子”手里握着他们无法想象的信息优势。 陈末知道他们在等什么。等一个“安全”的时机,等确认仓库里没有其他成年男性,等天色再暗。 但他们等不到了。 陈末深吸一口气,压下脚踝的刺痛,撑着墙站直。他看向小野:“怕吗?” 小野用力摇头。“不怕。”他顿了顿,“以前在桥洞下面,也遇到过想赶我们走的人。比他们凶。” 陈末没说话。他从口袋里摸出香烟,抽出一根点燃。火光在昏暗里亮起一瞬。 他需要做一个决定。 是继续龟缩防守,等对方发动攻击?还是主动打破僵局,把节奏抓到自己手里? 防守是被动的。对方有车,可能还有武器,人数占优。自己脚伤严重,真打起来,胜算不大。钢棍陷阱只能威慑和拖延。 主动出击……怎么出? 陈末吐出一口烟。目光扫过仓库内部。 东墙堆着的大米和面粉,像一座座沉默的小山。西墙是刚焊好的骨架。地面上的钢棍斜插着,尖头朝上。前门后面堵着两块厚重钢板,从外面看,会以为门被从里面彻底封死了。 一个念头清晰起来。 对方在评估风险。他们想知道仓库里有多少人,有什么防备,值不值得动手。 那就给他们看。 但只给他们看你想让他们看的。 陈末掐灭烟头,看向小野:“听着,接下来按我说的做。一个字都别错。” 小野立刻挺直背,眼睛紧紧盯着陈末。 “第一,你带着小雨,去最里面那个堆纸箱子的角落。躲进去,不管外面发生什么,除非我喊你们,否则绝对不要出来,不要出声。” 小野点头:“好。” “第二,”陈末掏出手机,调出手电筒,亮度调到最低,递给小野,“这个拿着。如果情况不对,我让你们跑,你就用这个照着路,带小雨从后门走。扳手拿好,砸锁。” 小野接过手机,握得很紧。 “第三,”陈末声音压得更低,“如果我需要你们配合,我会咳嗽两声。听到咳嗽声,你就在纸箱后面弄出点动静——不用太大,像是不小心碰到东西的那种声音。明白吗?” 小野眼睛亮了一下。“明白。就像……就像里面还有人。” “对。”陈末拍拍他肩膀,“去吧。动作轻点。” 小野转身,快步跑到仓库深处那个堆满废弃纸箱的角落。小雨一直蜷在那里。小野低声说了几句,两人一起钻进纸箱堆的缝隙里,很快,那片角落就恢复了安静。 陈末收回目光。 现在,仓库里“看起来”只剩下他一个人了。 他拖着伤腿,慢慢挪到前门旁边。侧过身,把眼睛凑近门缝。 那辆黑色大众还停在三十米外。副驾驶车窗降下一半,有烟飘出来。主驾驶车窗紧闭,贴了深色膜。 时间一分一秒过去。 陈末的脚踝疼得开始抽搐,他不得不把身体重心移到另一条腿上,额头渗出冷汗。他咬着牙,保持观察姿势。 大约过了十分钟,副驾驶车门开了。 一个男人下车。寸头,黑色夹克,身材中等。他站在车边,又点了一根烟,目光直直地投向仓库。 陈末屏住呼吸。 寸头男抽了几口烟,迈步朝仓库走来。步子很随意,但方向明确——仓库正门。 二十米。十五米。十米。 陈末能看清他的脸了。三十岁上下,方脸,左边眉骨有一道淡淡的疤。表情平静,但眼睛一直没离开大门。 五米。 寸头男在距离大门三米左右的地方停住了。他吸了口烟,吐出来,然后开口:“有人吗?” 陈末没动,也没出声。 寸头等了几秒,又喊:“哥们儿,在里头吗?聊两句。” 陈末依然沉默。 寸头男笑了,笑声有点干。“别躲了,看见你进去了。就你一个人吧?租这破仓库干嘛?堆东西?” 他往前又走了一步,距离大门只剩两米。这个距离,他能看清门上锈蚀的痕迹,也能看清门缝里透出的那一丝昏暗。 但他看不到门后面那两块厚重的钢板,更看不到钢板后面,陈末正透过缝隙,冷冷地盯着他。 “不说话?”寸头男把烟头扔地上碾灭,“那我自己进来看看。” 他伸手去推铁门。 门没动。 寸头男愣了一下,加了点力气,又推。 门还是纹丝不动。 他退后半步,仔细看了看门。门是从里面闩上的,这很正常。但不正常的是阻力——那不像门闩的阻力,更像门后面堵了很重的东西。 寸头男脸上的懒散消失了。他皱了皱眉,又试着推了两次,甚至用肩膀顶了一下。 门发出沉闷的“哐”声,但依然没开。 就在这时,仓库里传来一声咳嗽。 很轻,两声,短促。 紧接着,仓库深处传来“哗啦”一声响,像是不小心碰倒了什么东西,然后立刻安静下去。 寸头男身体瞬间绷紧,猛地后退两步,眼睛死死盯着大门。 仓库里……不止一个人? 他刚才推门的时候,里面的人肯定听到了。那声咳嗽和响动,是警告?还是无意? 寸头男脸色变幻。他站在原地犹豫了几秒,然后转身快步走回黑色大众,拉开车门钻了进去。 陈末透过门缝,看到他在车里跟主驾驶的人说了什么。主驾驶的人摇了摇头。 然后,黑色大众的引擎启动了。 车没开走,而是缓缓向前,停到了距离仓库大门只有十米左右的位置。车头灯“啪”地打开,两道刺眼的光束直射仓库大门。 强烈的白光透过门缝照进来,在陈末脸上切出一道亮痕。他眯起眼,侧身避开。 对方在示威。 也在试探——用强光照射,如果仓库里有人躲藏,可能会因为突然的强光而产生反应。 陈末一动不动。他甚至调整了一下呼吸,让身体尽可能放松。 光束在门上停留了足足一分钟。 然后,车灯熄灭了。 仓库外重新陷入昏暗,但比刚才更暗。 陈末适应了几秒,才重新看清外面的情况。 黑色大众还停在十米外,没动。 又过了几分钟,副驾驶车门再次打开。这次,寸头男和主驾驶的人一起下来了。 主驾驶是个高个子,更壮,穿着灰色运动服,手里拿着个强光手电。 两人并排朝仓库走来。 陈末的心脏跳得快了些。他手指摸向腰间,那里别着一把磨过的旧螺丝刀。但面对两个可能带武器的成年男人,这点东西不够看。 他的目光扫过地面那些斜插的钢棍。 五米。 两人停住了。高个子举起手电,“啪”地打开,光束照向大门。他晃了晃手电,光束在门上扫过,然后向下,照向门缝下方的地面。 他在看地面上的痕迹。车轮印、脚印。 但仓库门口的水泥地面早就被风沙覆盖,陈末进出都刻意避开了正门区域,留下的痕迹很浅。而且小野拖钢板是在门内,门外根本看不到。 高个子照了一会儿,关掉手电。 两人低声交谈了几句。声音很模糊,陈末只听到几个零碎的词:“……不像……”“……再看看……” 寸头男忽然抬高声音,冲着仓库喊:“哥们儿,我们知道你在里面。你这仓库,我们盯了几天了。你一个人,弄这么多东西进来,也不打个招呼,不合适吧?” 陈末依然沉默。 “这样,”寸头男继续说,“我们也不为难你。你这仓库,我们有用。你里面的东西,我们不动。你搬走,押金租金我们补给你。怎么样?和气生财。” 陈末心里冷笑。 补押金租金?鬼才信。真开了门,恐怕就不是“补钱”那么简单了。这些人吃准了他孤身一人,想用最低成本把仓库占下来。 高个子见里面没反应,不耐烦了。他往前走了两步,距离大门只剩三米。“别给脸不要脸。这地方我们说了算。你现在开门,咱们好好谈。再装死,等我们进去,就不是这个说法了。” 语气里的威胁已经不加掩饰。 陈末知道,不能再沉默了。 他深吸一口气,然后开口,声音透过门缝传出去,不高,但很稳:“谁派你们来的?” 外面的两人明显愣了一下。 他们没想到里面的人会突然说话,更没想到第一句问的是这个。 寸头男反应快:“没人派。这片儿我们罩的。你新来的,不懂规矩。” “规矩?”陈末声音里带上一丝嘲讽,“什么规矩?强占别人租下的仓库,就是你们的规矩?” “少他妈废话!”高个子火了,“开门!” “开门可以。”陈末说,“但你们想清楚。我这里面,不止我一个人。你们刚才也听到了。” 寸头男和高个子对视一眼。 “还有,”陈末继续,语速平缓,但每个字都咬得很清楚,“江A·B34R7。这车牌,我记下了。你们的脸,我也拍下来了。不止我拍,对面楼上也有人拍。” 这句话扔出去,外面的两人脸色瞬间变了。 他们猛地抬头,看向仓库对面那栋废弃的三层小楼。楼里黑漆漆的,窗户大多破损,看不出有没有人。 但陈末的话戳中了他们最敏感的神经——车牌被记下,脸被拍到,还有同伙在远处监视。这意味着,就算他们今天得手,后续也可能有麻烦。 “你唬谁呢?”高个子强撑着,但声音已经没那么硬了。 “是不是唬你,你试试。”陈末说,“我数三声,你们不走,我就报警。持械威胁、意图强闯私人租赁场地,车牌人脸证据齐全。你们猜,警察来了是先抓你们,还是先听我解释为什么租仓库?” 他顿了顿,补充道:“顺便说一句,我租这仓库,是正规合同,在派出所备过案的。你们来之前,没查清楚?” 最后这句是瞎编的。租赁合同根本不需要派出所备案。但对方不一定知道。 寸头男和高个子脸色更难看了。他们低声快速交谈,声音压得很低,但陈末能听到其中夹杂着“麻烦”“撤”之类的词。 陈末知道,火候差不多了。 他咳嗽了两声。 仓库深处,立刻传来一阵窸窸窣窣的响动,像是有人在移动,还有压低了的说话声——小野在按计划制造“不止一个人”的假象。 外面的两人彻底动摇了。 “行,你狠。”寸头男咬着牙,冲大门方向说,“今天算我们看走眼。但你记着,这事儿没完。这片儿,你待不踏实。” 撂下这句狠话,两人转身,快步走回黑色大众,“砰”地关上车门。 引擎轰鸣,车灯再次亮起,但这次是倒车灯。黑色大众向后倒了几米,然后调转方向,车轮碾过碎石路面,朝着来时的路开走了。 车尾灯的红光在黑暗中越来越远,最终消失在道路拐角。 仓库外重新安静下来。 陈末又等了五分钟,确认车没有掉头回来,才缓缓吐出一口一直憋着的气。 后背已经被冷汗浸透,冰凉。 脚踝的疼痛这时才像潮水一样涌上来,疼得他眼前发黑。他扶着墙,慢慢滑坐到地上,大口喘气。 纸箱堆那边传来动静。小野探出头,确认安全后,拉着小雨跑过来。 “他们……走了?”小野问,眼睛还盯着大门。 “暂时。”陈末说,声音沙哑,“但可能还会回来。” 小野抿了抿嘴,没说话。他把手机还给陈末,然后蹲下来,看着陈末肿得老高的脚踝。“你的脚……” “死不了。”陈末打断他,摸出手机,给小刘发短信: 小刘很快回复: 陈末想了想,回复: 陈末放下手机,靠在墙上,闭上眼睛。 危机暂时解除,但只是暂时。那两个人今天被唬住了,是因为信息不对等——他们以为陈末是孤身好欺负的肥羊,没想到仓库里有“同伙”,外面还有“眼线”。 但他们不会轻易放弃。这片区域对他们来说可能很重要,或者,他们单纯就是咽不下这口气。 陈末必须尽快解决这个问题。 要么彻底吓住他们,让他们不敢再来。要么……找到他们的软肋,一次性把麻烦摁死。 他睁开眼,看向仓库东墙那堆物资。 大米和面粉静静地堆在那里。这是他末世生存的根基,绝不能有失。 而他现在有四百九十万现金,却连一个安全的仓库都守不住。 这种无力感,比脚踝的疼痛更让人烦躁。 小野忽然开口:“他们如果再来……我们怎么办?” 陈末看向他。男孩脸上没有害怕,只有一种超越年龄的认真。 “你怕吗?”陈末又问了一遍。 小野摇头。“不怕。但我们需要更好的办法。”他指了指地上的钢棍,“这个,只能拖延一下。如果他们带工具来,很容易清掉。” 陈末有些意外。十二岁的孩子,能想到这一层。 “那你说,怎么办?”陈末问,语气里带着一丝试探。 小野想了想,说:“我以前在工地待过。工头防人偷材料,会在围墙上面插碎玻璃,还有拉铁丝网,通那种……电蚊拍一样的电,一碰就麻。” 陈末眼睛眯了眯。 碎玻璃,铁丝网,低压电网。这些都不难弄,尤其是现在他有钱。 但问题是,时间。 布置这些需要时间,而对方可能明天、甚至今晚就会卷土重来。 他需要争取时间。 陈末脑子里闪过一个念头。他摸出手机,翻到通讯录里一个名字——吴建军。 那个前世在末世初期带着一帮工人守住小区的包工头。 雇佣吴建军和他的工人,原本是为了后续“铁壁”工程和物资搬运。但现在,或许可以提前用上。 有吴建军那帮人在,仓库里就不是“一个受伤男人加两个小孩”了。那是一群常年干体力活的壮年男性。哪怕只是临时撑个场面,也足够让外面那些地头蛇掂量掂量。 但……钱呢?人多了,物资消耗、住宿安排都是问题。更重要的是,如何解释雇佣他们的目的? 陈末揉了揉眉心。 问题一个接一个。 他低头,看着自己肿起的脚踝,又看看身边两个眼巴巴看着他的孩子,还有这间空旷、冰冷、但承载着他全部希望的仓库。 不能退。 退了,前世的悲剧就会重演。退了,这三十天的准备就会变成笑话。 他必须在这里站稳脚跟。 不惜代价。 陈末撑着墙,慢慢站起来。脚踝传来钻心的疼,但他脸上没什么表情。 “小野,”他说,“去把后门检查一下,锁死了没有。然后,烧点水。” 小野点头,转身跑向后门。 陈末挪到那堆大米旁边,扯开一袋米的封口,抓了一把。干燥的米粒从指缝间滑落,发出沙沙的轻响。 粮食还在。 安全屋的骨架还在。 钱还在。 那还有什么好怕的? 他摸出烟,点燃最后一根。火光在昏暗里明灭,映着他眼底那片冰冷的、不肯熄灭的火。 游戏还没结束。 下一回合,该他出牌了。 \ No newline at end of file diff --git a/chapters/ch29-第29章 修复.md b/chapters/ch29-第29章 心灵修复.md similarity index 99% rename from chapters/ch29-第29章 修复.md rename to chapters/ch29-第29章 心灵修复.md index e4a9251..d1abe77 100644 --- a/chapters/ch29-第29章 修复.md +++ b/chapters/ch29-第29章 心灵修复.md @@ -1,3 +1,3 @@ -# 第29章 修复 +# 第29章 心灵修复 修复 布洛芬的药效在血液里缓慢扩散,暂时压住了脚踝深处灼烧般的疼痛。 陈末靠在纸箱堆旁,听着仓库外彻底安静下来。 疤哥的人走了。 但“没完”两个字,楔在空气里。 他低头看手机,下午两点四十七分。距离铁丝网送达的四点,还有一个多小时。 时间不等人,疤哥更不会等。 陈末撑着纸箱站起来,脚踝传来刺痛。视线扫过仓库——钢棍已清理码放墙边,厚重钢板歪斜抵在前门后,铁门被撬开的豁口狰狞,门锁报废。后门锁芯被砸坏。 防御能力降到冰点。 他深吸一口气,让冰凉的空气灌满肺部,强迫大脑从疲惫中抽离。 第一步,确认外部安全。 他给小刘发短信:“情况?” 几秒后回复:“三辆车都走了,往北边修车厂方向。目前周边五百米内没看到可疑车辆。我还在老位置。” 陈末回复:“继续盯着,重点看有没有人步行绕回来。有异常随时报。” “明白。” 第二步,内部整理。 他检查铁门损坏程度。门轴没坏,但门板边缘变形严重,锁扣位置撕裂。靠他自己不可能完全修复。 只能临时加固。 陈末转身,目光落在厚重的钢板上。他蹲下身,双手抓住钢板边缘。钢板冰冷沉重,估计七八十斤。他试着发力,脚踝刺痛加剧,额头渗出冷汗。 “我来。” 小野的声音从身后传来。他已走到另一块钢板旁,双手抓住边缘,腰背发力,将钢板缓缓拖了过来。动作很稳。 小雨站在纸箱堆旁,手里抱着那袋压缩饼干。 陈末没有推辞。他松开手,指了指铁门内侧:“把这块钢板竖起来,顶在门板变形位置,用钢棍卡住底部。” 小野点头调整。 陈末则拖着另一块钢板到后门。后门损坏较轻,主要是锁芯被砸坏。他把钢板竖靠在门后,拖来两根钢棍斜卡在钢板和墙壁之间,形成简易支撑。 做完这些,后背已被汗水浸湿。 第三步,检查物资。 陈末走到仓库东墙,那堆大米和面粉整齐码放,没有被动过。他摸了摸最上面一袋大米的封口,确认完好。又走到工程材料区——水泥、沙、砖、钢筋、焊机、切割机……所有东西都在原位。 他松了口气。 至少,核心物资没有损失。 第四步,准备接收铁丝网。 陈末走到前门观察窗,透过玻璃向外望去。街道空荡,下午阳光斜照。 四点,送货卡车会来。 如果疤哥的人想报复,这个时间点很危险——送货车辆进出,仓库大门必须打开,防御漏洞最大。 他必须提前做好准备。 陈末回到纸箱堆旁,从背包里翻出折叠刀检查刀刃。又拿出录音笔,按下播放键,疤哥的声音从微型扬声器传出: “……前任租户欠我八万,认地方不认人,懂吗?要么你搬走,我当没这回事。要么,你补十二万现金,这地方我让你用……” “……拆迁?什么拆迁?你他妈少胡说八道……” 声音戛然而止。 陈末按下停止键,把录音笔塞回口袋。这是证据,也是筹码。 他看了眼时间,三点零二分。 还有不到一小时。 陈末走到小野身边,少年正蹲在地上用碎布擦拭钢棍锈迹。 “待会送货的车会来。”陈末说。 小野抬头。 “你带小雨躲到最里面纸箱堆后面,我不叫你们,别出来。”陈末顿了顿,“如果外面有不对劲,听到我喊‘跑’,你就带小雨从后门走,按之前说的路线去废弃配电房。” 小野盯着他看了几秒,点头。 陈末转身,从工具堆里翻出一根长约一米二的钢管。钢管一端有螺纹,原是脚手架配件。他掂了掂,重量合适。 他把钢管靠在墙边触手可及的位置。 然后坐下,背靠纸箱,闭上眼睛。 身体在抗议。脚踝疼痛像潮水涌上,布洛芬的冰膜正在融化。肌肉酸痛,精神疲惫。 但他不能睡。 还有三十四分钟。 陈末在脑子里过了一遍可能场景: 送货卡车按时抵达,卸货,离开——最好的一种。 卡车没来或迟到——供应商可能出问题,或路上被拦。 卡车来了,疤哥的人也来了——最坏情况。 如果是第三种,他该怎么办? 硬扛?不可能。对方再来,人数只会更多。他一个人,一根钢管,挡不住。 谈判?疤哥已吃过信息威慑亏,同样招数第二次效果大减。 报警?不行。身份、物资、孤儿……每样都经不起查。 只剩一个选择:在冲突爆发前,让送货过程尽可能快,尽可能隐蔽。 陈末睁眼,拿出手机,找到建材市场老板微信,发消息:“铁丝网四点准时到?司机电话发我一下。” 几分钟后回复:“准时。司机老赵,电话138xxxxxx。货到付款,现金。” 陈末记下号码,又补一句:“让司机到了直接开进仓库院子,别在门口停。卸货要快,我这边有点麻烦。” 老板发来“OK”表情。 陈末放下手机,目光落在仓库前门那道豁口上。 阳光从豁口斜射进来,在地面投下明亮光斑。光斑里,灰尘缓慢飘浮。 时间流逝。 三点二十。 三点三十。 三点四十。 仓库安静得能听到心跳。小野和小雨已躲到纸箱堆后。陈末靠墙坐着,右手搭在钢管上,左手握手机,屏幕亮着显示小刘聊天窗口。 没有新消息。 三点五十。 陈末站起,走到前门观察窗。街道依然空荡。 三点五十五。 远处传来卡车引擎轰鸣。 陈末精神一振,凑近玻璃窗。一辆蓝色中型卡车从街角拐来,车身上印“宏发建材”。卡车速度不快,缓缓驶向仓库。 他盯着卡车后面——没有其他车辆尾随。 卡车驶到仓库大门外,减速,打方向盘,车头对准大门。司机探出头,看了看被撬坏的门锁和变形铁门,愣了下。 陈末推开铁门——门轴发出刺耳嘎吱声——走了出去。 司机是个四十多岁中年男人,皮肤黝黑,穿工装裤。他跳下车,打量陈末一眼:“你是陈老板?” “是我。”陈末点头,“货直接开进来,卸在院子右边空地。” 司机皱眉:“你这门……” “临时有点事,不影响卸货。”陈末语气平静,“麻烦快点,我额外加两百辛苦费。” 司机听到“加钱”,脸色缓和,转身上车。卡车缓缓倒车,车尾对准仓库大门,慢慢倒了进来。 陈末站在大门旁,目光扫视街道两侧。 没有异常。 卡车完全倒进仓库院子,停稳。司机跳下车,拉开后车厢篷布。车厢里堆满成卷带刺铁丝网,银灰色金属刺在阳光下闪冷光。 “两百米,带刺的,你要的加急。”司机开始解固定绳索。 陈末走过去帮忙卸货。 铁丝网很重,一卷几十斤。两人合力,把一卷卷铁丝网从车厢滚下,堆在院子右边空地。金属碰撞哗啦响。 陈末一边卸货,一边用眼角余光注意大门外动静。 街道偶尔有电动车经过,无人停留。 汗水顺额头流下,滴进眼睛刺痛。陈末抹了把脸,脚踝疼痛越来越明显,每次发力都像有针在扎。 但他没停。 必须尽快卸完,让卡车离开。 “差不多了。”司机喘气,指车厢里最后两卷。 两人把最后两卷滚下堆好。 司机直腰擦汗:“陈老板,结一下账?连加急费,一共四千六。” 陈末从口袋掏出准备好的现金递过去。 司机接过钱快速数一遍,点头塞进腰包:“行,那我走了。” “等等。”陈末叫住他,“出去时,如果看到附近有人盯着,或有车跟着,麻烦你开慢点,绕两圈再回市场。” 司机愣了下,看看陈末,又看撬坏的大门,似乎明白了什么。他点头没多问,转身上车。 引擎发动,卡车缓缓驶出仓库院子,拐上街道远去。 陈末站在院子里,看着卡车消失在街角,松了口气。 他转身准备关大门——虽然关不严实,但至少挡挡视线。 就在这时,手机震动。 小刘短信:“有辆车从北边过来,白色面包车,车速很慢,在仓库这边路口转了一圈,又开走了。车牌没看清,但车型像早上那三辆里的。” 陈末盯着屏幕,手指收紧。 果然,疤哥的人没走远。 他们在等机会。 而现在,铁丝网送到了,堆在院子里明晃晃的。如果疤哥的人再来,看到这些,就知道他在加固防御,冲突很可能升级。 必须加快速度。 陈末关上门——勉强合拢,用一根钢棍卡住门缝——然后走到铁丝网堆旁。他蹲下检查最上面一卷规格。带刺,镀锌,直径两毫米,刺长一厘米,卷宽一米。质量不错,够锋利。 他需要把这些铁丝网布置在围墙上。 但以他现在的体力,一个人根本做不到。铁丝网太重,展开需两人拉直,固定更需要人手。 吴建军的工人明天才复工。 今晚怎么办? 陈末站起,环顾院子。围墙斑驳,高度不到两米五,顶部无防护。若有人想翻进来,并不难。 他走到围墙边,伸手摸砖墙表面。砖块风化严重,有些地方已酥。吴建军说得对,这围墙需整体加固,外砌砖,灌浆,加钢筋。 但那需要时间。 而现在,他最缺的就是时间。 陈末走回仓库,从工具堆翻出一捆尼龙绳和一把老虎钳。他拖着绳子回院子,走到围墙拐角,把绳子一端系在围墙根部一根钢筋桩上——之前施工留下的。 然后展开绳子,沿围墙走向另一头。 绳子长约二十米,够覆盖一段围墙。他打算在围墙上拉几道警戒线——若有人翻墙碰到绳子,绳子另一头系着的空铁罐会发出响声。 简陋,但有用。 陈末把绳子拉到齐腰高度,用老虎钳在砖缝卡了几个铁丝扣固定。然后走到另一端,把绳子拉紧,系在另一根钢筋桩上。 接着第二道、第三道。 他在围墙不同高度拉了三道绳子,每道末端系一个空矿泉水瓶——瓶里装了几颗石子,轻轻一碰就会哗啦响。 做完这些,后背完全湿透。 脚踝疼痛已麻木,取而代之是肿胀灼热感。布洛芬药效快过了。 陈末走回仓库,从背包拿出最后两粒布洛芬干咽下。然后靠门框上,看院子里那堆银灰铁丝网,和围墙上几道简陋警戒线。 防御在一点点恢复。 但还远远不够。 他看手机,下午五点二十。天色开始暗下。 今晚,疤哥的人会来吗? 他不知道。 但他必须做好他们来的准备。 陈末转身回仓库内部,走到纸箱堆旁。小野和小雨还躲在后面,听到脚步声,小野探头。 “暂时安全。”陈末说,“你们出来吧,吃点东西。” 小野拉小雨走出来。小雨还抱着那袋压缩饼干,小野从自己口袋掏出半块巧克力——递给陈末。 陈末愣了下,接过巧克力撕开包装,掰成三块,递给小野和小雨各一块,自己留一块。 巧克力在嘴里融化,甜得发腻,但热量真实。 三人靠纸箱堆坐下,安静吃。 仓库光线昏暗,只有门缝和观察窗透进些许天光。 “明天,”陈末吃完最后一口巧克力,开口说,“我要出去一趟,采购东西,见个人。你,”他看向小野,“跟我一起。” 小野点头。 “小雨留在仓库,我会把门从外面锁好,你们从里面用钢板顶住。”陈末继续说,“食物和水够两天,别出去,别开门,任何人来都别应。” 小野又点头。 陈末看少年平静的脸,忽然问:“你怕吗?” 小野沉默几秒,摇头:“习惯了。” 简单三字,像石头砸进陈末心里。 他没再说话。 天色彻底暗下。 陈末站起,走到前门观察窗向外望。街道上路灯亮起,昏黄光晕下空无一人。远处偶尔有车灯闪过,很快消失。 他回纸箱堆旁,从背包翻出充电宝给手机充电。屏幕亮起,显示电量百分之六十二。 然后,他靠纸箱上闭眼。 耳朵竖着,听外面每一点动静。 风声,远处车辆引擎声,铁皮屋顶哐当声,还有……围墙上,那几道警戒线在风里轻晃,绳子摩擦砖墙发出细微沙沙声。 夜还很长。 而明天,又是新的一天。 他必须活下去。 必须守住这个仓库。 必须囤够物资,迎接那个即将到来的、冰封的世界。 陈末握紧口袋里的录音笔,金属外壳冰凉。 游戏,还没结束。 diff --git a/check_shuangdian_status.sh b/check_shuangdian_status.sh new file mode 100755 index 0000000..c64ffb6 --- /dev/null +++ b/check_shuangdian_status.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +echo "检查爽点分析内容状态..." +echo "==========================" + +cd /root/.openclaw/workspace/projects/末日重生_囤货 + +# 检查第二章 +echo "检查第2章:" +if grep -q "展现重生者的先知优势" "chapters/ch2-第2章 暗流.md"; then + echo " ❌ 仍有'展现重生者的先知优势'" +else + echo " ✅ 已移除'展现重生者的先知优势'" +fi + +if grep -q "谈判桌上,陈末掌握着对手的所有底牌" "chapters/ch2-第2章 暗流.md"; then + echo " ❌ 仍有'谈判桌上'段落" +else + echo " ✅ 已移除'谈判桌上'段落" +fi + +echo "" +echo "检查其他可能的问题章节:" + +# 检查所有章节 +for file in chapters/ch*.md; do + filename=$(basename "$file") + + # 检查常见的爽点分析内容 + if grep -q "展现重生者的先知优势" "$file" || \ + grep -q "谈判桌上,陈末掌握着对手的所有底牌" "$file" || \ + grep -q "^# 【爽点" "$file"; then + echo " ❌ $filename - 仍有爽点分析内容" + fi +done + +echo "" +echo "检查完成!" \ No newline at end of file diff --git a/tools/apply_title_fixes.py b/tools/apply_title_fixes.py new file mode 100644 index 0000000..9180796 --- /dev/null +++ b/tools/apply_title_fixes.py @@ -0,0 +1,201 @@ +#!/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() \ No newline at end of file diff --git a/tools/chapter_title_qc.py b/tools/chapter_title_qc.py new file mode 100644 index 0000000..5bbf27d --- /dev/null +++ b/tools/chapter_title_qc.py @@ -0,0 +1,343 @@ +#!/usr/bin/env python3 +""" +章节标题质量检查与修复系统 +""" + +import os +import re + +CHAPTERS_DIR = "/root/.openclaw/workspace/projects/末日重生_囤货/chapters" + +class ChapterTitleQC: + def __init__(self): + # 番茄小说优质标题特征 + self.good_title_patterns = [ + r'^[\u4e00-\u9fa5]{2,8}$', # 2-8个汉字 + r'.*[?!,。]?$', # 可以有标点 + ] + + # 需要修复的标题模式 + self.bad_title_patterns = [ + (r'_', '标题中不应有下划线'), # 下划线 + (r'(\d+)', '不应有括号数字'), # 括号数字 + (r'\d+', '标题中不应有数字(除章节号外)'), # 数字 + (r'修复|修复版|手动修复|fixed', '不应有技术性词汇'), # 技术词汇 + (r'^[\u4e00-\u9fa5]{1,2}$', '标题太短(1-2字)'), # 太短 + (r'^[\u4e00-\u9fa5]{9,}$', '标题太长(9字以上)'), # 太长 + ] + + # 末世重生题材的优质标题词汇库 + self.good_keywords = [ + # 动作类 + '觉醒', '重生', '囤货', '末日', '降临', '爆发', '危机', '求生', + '逃亡', '生存', '挣扎', '抉择', '博弈', '对峙', '谈判', '交易', + '契约', '联盟', '背叛', '复仇', '救赎', '重生', '逆袭', + + # 情绪类 + '绝望', '希望', '恐惧', '勇气', '疯狂', '冷静', '煎熬', '挣扎', + '痛苦', '解脱', '抉择', '迷茫', '坚定', '愤怒', '悲伤', '喜悦', + + # 场景类 + '暗流', '冰点', '暗影', '铁锈', '钢渣', '焊火', '铁门', '电网', + '仓库', '基地', '避难所', '安全屋', '堡垒', '防线', '围城', + + # 时间类 + '倒计时', '最后时刻', '黎明前', '黄昏后', '末日钟', '生死线', + + # 冲突类 + '对决', '交锋', '冲突', '对抗', '挑战', '考验', '试炼', '陷阱', + ] + + # 章节标题改进建议库 + self.title_improvements = { + '筹码_手动修复': '致命筹码', + '对峙(2)': '生死对峙', + '焊火': '烈焰焊火', + '铁锈': '锈蚀阴谋', + '钢渣': '钢铁意志', + '铁门': '钢铁之门', + '充电': '能量重启', + '倒计时': '末日倒计时', + '质询': '致命质询', + '断水': '水源危机', + '昏沉': '意识迷途', + '电话': '致命来电', + '煎熬': '生死煎熬', + '钢渣': '熔炉考验', + '赴约': '死亡之约', + '抉择': '命运抉择', + '交付': '生死交付', + '暗影': '暗影重重', + '决断': '生死决断', + '博弈': '末日博弈', + '修复': '心灵修复', + } + + def analyze_title(self, title): + """分析标题质量""" + issues = [] + score = 100 # 满分100分 + + # 检查标题长度 + if len(title) < 2: + issues.append("标题太短(少于2字)") + score -= 30 + elif len(title) > 8: + issues.append("标题太长(超过8字)") + score -= 20 + + # 检查是否有下划线 + if '_' in title: + issues.append("标题包含下划线") + score -= 25 + + # 检查是否有括号数字 + if re.search(r'(\d+)', title): + issues.append("标题包含括号数字") + score -= 25 + + # 检查是否有技术词汇 + tech_words = ['修复', '修复版', '手动修复', 'fixed', '备份', '版本'] + for word in tech_words: + if word in title: + issues.append(f"标题包含技术词汇'{word}'") + score -= 30 + break + + # 检查标题吸引力 + has_good_keyword = any(keyword in title for keyword in self.good_keywords) + if not has_good_keyword and len(title) >= 2: + issues.append("标题缺乏吸引力关键词") + score -= 15 + + # 根据问题数量调整分数 + if len(issues) > 3: + score -= (len(issues) - 3) * 5 + + # 确保分数在0-100之间 + score = max(0, min(100, score)) + + return { + 'title': title, + 'score': score, + 'issues': issues, + 'grade': self.get_grade(score) + } + + def get_grade(self, score): + """根据分数获取等级""" + if score >= 90: + return "A+ (优秀)" + elif score >= 80: + return "A (良好)" + elif score >= 70: + return "B+ (一般)" + elif score >= 60: + return "B (及格)" + else: + return "C (需要改进)" + + def suggest_improvement(self, original_title): + """提供标题改进建议""" + # 优先使用改进建议库 + if original_title in self.title_improvements: + return self.title_improvements[original_title] + + # 分析原标题,提供智能建议 + suggestions = [] + + # 如果标题有下划线,移除 + if '_' in original_title: + clean_title = original_title.replace('_', '') + suggestions.append(clean_title) + + # 如果标题有括号数字,移除 + if re.search(r'(\d+)', original_title): + clean_title = re.sub(r'(\d+)', '', original_title) + suggestions.append(clean_title) + + # 添加增强词汇 + for keyword in self.good_keywords: + if len(original_title) < 4 and keyword not in original_title: + enhanced = f"{original_title}{keyword}" + if len(enhanced) <= 6: + suggestions.append(enhanced) + + # 返回最佳建议 + if suggestions: + # 选择最短且最有吸引力的建议 + suggestions.sort(key=lambda x: (len(x), -sum(1 for k in self.good_keywords if k in x))) + return suggestions[0] + + return original_title + + def generate_alternative_titles(self, chapter_num, content_preview=""): + """为章节生成备选标题""" + alternatives = [] + + # 根据章节内容分析主题 + themes = self.analyze_content_themes(content_preview) + + # 生成基于主题的标题 + for theme in themes[:3]: # 取前3个主题 + for keyword in self.good_keywords: + if keyword not in theme and len(theme + keyword) <= 6: + title = f"{theme}{keyword}" + alternatives.append(title) + + # 添加一些通用优质标题 + generic_titles = [ + f"第{chapter_num}次抉择", + f"生死第{chapter_num}关", + f"末日倒计时{chapter_num}", + f"重生第{chapter_num}步", + f"危机第{chapter_num}重", + ] + alternatives.extend(generic_titles) + + return list(set(alternatives))[:5] # 去重并返回前5个 + + def analyze_content_themes(self, content): + """从内容中分析主题""" + themes = [] + + # 简单关键词提取 + theme_keywords = { + '谈判': ['谈判', '对话', '商议', '讨价还价'], + '冲突': ['冲突', '对抗', '战斗', '争执'], + '危机': ['危机', '危险', '威胁', '困境'], + '生存': ['生存', '活下去', '求生', '保命'], + '物资': ['物资', '食物', '水', '药品', '装备'], + '阴谋': ['阴谋', '算计', '陷阱', '诡计'], + '合作': ['合作', '联盟', '联手', '结盟'], + '背叛': ['背叛', '出卖', '背叛', '反目'], + } + + for theme, keywords in theme_keywords.items(): + for keyword in keywords: + if keyword in content[:500]: # 只检查前500字 + themes.append(theme) + break + + return themes if themes else ['未知'] + +def main(): + print("📚 章节标题质量检查系统") + print("=" * 50) + + qc = ChapterTitleQC() + + # 获取所有章节文件 + 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() + + # 分析每个章节标题 + results = [] + for filename in chapter_files: + filepath = os.path.join(CHAPTERS_DIR, filename) + + # 提取章节号和标题 + match = re.search(r'ch(\d+)-第\d+章\s+(.+)\.md', filename) + if not match: + continue + + chapter_num = match.group(1) + original_title = match.group(2) + + # 读取部分内容用于分析 + with open(filepath, 'r', encoding='utf-8') as f: + content_preview = f.read(500) # 读取前500字 + + # 分析标题质量 + analysis = qc.analyze_title(original_title) + + # 获取改进建议 + suggested_title = qc.suggest_improvement(original_title) + + # 生成备选标题 + alternatives = qc.generate_alternative_titles(chapter_num, content_preview) + + results.append({ + 'chapter_num': chapter_num, + 'filename': filename, + 'original_title': original_title, + 'analysis': analysis, + 'suggested_title': suggested_title, + 'alternatives': alternatives, + }) + + # 显示结果 + print("📊 标题质量报告:") + print("-" * 80) + + poor_titles = [] + good_titles = [] + + for result in results: + print(f"第{result['chapter_num']}章: {result['original_title']}") + print(f" 评分: {result['analysis']['score']}/100 ({result['analysis']['grade']})") + + if result['analysis']['issues']: + print(f" 问题: {', '.join(result['analysis']['issues'])}") + poor_titles.append(result) + else: + print(f" 状态: ✅ 良好") + good_titles.append(result) + + if result['original_title'] != result['suggested_title']: + print(f" 建议: {result['suggested_title']}") + + print() + + # 显示统计信息 + print("📈 统计信息:") + print(f" 优秀标题: {len([r for r in results if r['analysis']['score'] >= 80])}") + print(f" 需要改进: {len(poor_titles)}") + print(f" 良好标题: {len(good_titles)}") + + # 如果需要改进的标题较多,提供修复选项 + if poor_titles: + print("\n🔧 需要修复的标题:") + for i, result in enumerate(poor_titles, 1): + print(f" {i}. 第{result['chapter_num']}章: {result['original_title']} → {result['suggested_title']}") + + print("\n💡 运行修复命令:") + print(" python3 tools/apply_title_fixes.py") + + # 保存报告 + save_report(results) + +def save_report(results): + """保存质量检查报告""" + report_path = os.path.join(CHAPTERS_DIR, "../chapter_title_qc_report.md") + + with open(report_path, 'w', encoding='utf-8') as f: + f.write("# 章节标题质量检查报告\n\n") + f.write(f"生成时间: {os.popen('date').read().strip()}\n") + f.write(f"总章节数: {len(results)}\n\n") + + f.write("## 标题质量分析\n\n") + f.write("| 章节 | 原标题 | 评分 | 等级 | 问题 | 建议标题 |\n") + f.write("|------|--------|------|------|------|----------|\n") + + for result in results: + issues = '; '.join(result['analysis']['issues']) if result['analysis']['issues'] else '无' + suggested = result['suggested_title'] if result['original_title'] != result['suggested_title'] else '无' + + f.write(f"| {result['chapter_num']} | {result['original_title']} | {result['analysis']['score']} | {result['analysis']['grade']} | {issues} | {suggested} |\n") + + f.write("\n## 改进建议\n\n") + f.write("1. 移除标题中的下划线和技术词汇\n") + f.write("2. 避免使用括号数字\n") + f.write("3. 标题长度建议2-6个字\n") + f.write("4. 使用更具吸引力的关键词\n") + + print(f"\n📄 报告已保存: {report_path}") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tools/clean_ai_markers.py b/tools/clean_ai_markers.py new file mode 100644 index 0000000..e2f2e3b --- /dev/null +++ b/tools/clean_ai_markers.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +""" +清理AI生成的各种内部标记和注释 +""" + +import os +import re + +CHAPTERS_DIR = "/root/.openclaw/workspace/projects/末日重生_囤货/chapters" + +def clean_ai_markers(content): + """ + 清理AI生成的各种标记 + """ + lines = content.split('\n') + cleaned_lines = [] + + for line in lines: + # 1. 移除特定的AI分析标记(但保留正常的心理描写) + # 这些是明确的AI分析,应该移除 + ai_markers = [ + '展现重生者的先知优势', + '利用未来信息获取利益', + '展现主角的', + '体现人物', + '突出情节', + '【爽点分析】', + '[分析]', + '': + continue + + # 6. 如果没有AI标记,保留这一行 + if not has_ai_marker: + cleaned_lines.append(line) + + # 重新组合内容 + result = '\n'.join(cleaned_lines) + + # 7. 清理多余的空白行 + result = re.sub(r'\n{3,}', '\n\n', result) + + # 8. 确保章节以正确的内容结束 + # 移除末尾可能遗留的无关内容 + lines = result.split('\n') + while lines and not lines[-1].strip(): + lines.pop() + + result = '\n'.join(lines) + + return result.strip() + +def main(): + print("清理AI生成的各种标记...") + + chapter_files = [f for f in os.listdir(CHAPTERS_DIR) if f.endswith('.md')] + + for filename in sorted(chapter_files): + filepath = os.path.join(CHAPTERS_DIR, filename) + + print(f"检查: {filename}") + + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # 检查是否需要清理 + needs_clean = ( + '展现重生者的先知优势' in content or + '谈判桌上,陈末掌握着对手的所有底牌' in content or + '': + skip = False + continue + if not skip: + cleaned_lines.append(line) + + content = '\\n'.join(cleaned_lines) + + # 4. 确保章节标题格式正确 + if not content.startswith('# 第'): + # 从内容中提取章节标题 + first_line = content.split('\\n')[0] if content else '' + match = re.search(r'第(\\d+)章\\s+(.+)', first_line) + if match: + chapter_num = match.group(1) + chapter_title = match.group(2) + content = f'# 第{chapter_num}章 {chapter_title}\\n\\n' + '\\n'.join(content.split('\\n')[1:]) + + # 5. 清理多余的空白行 + content = re.sub(r'\\n{3,}', '\\n\\n', content) + + return content.strip() + +# 需要修复的文件列表 +problem_files = %s + +for filename in problem_files: + filepath = os.path.join(CHAPTERS_DIR, filename) + + print(f"修复: {filename}") + + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # 创建备份 + backup_path = filepath + '.final.bak' + with open(backup_path, 'w', encoding='utf-8') as f: + f.write(content) + + # 应用修复 + fixed_content = final_fix_content(content) + + with open(filepath, 'w', encoding='utf-8') as f: + f.write(fixed_content) + + print(f" ✓ 已修复") + +print("\\n所有文件修复完成!") +""" % str([filename for filename, _ in problem_files]) + + script_path = os.path.join(CHAPTERS_DIR, "tools", "apply_final_fixes.py") + with open(script_path, 'w', encoding='utf-8') as f: + f.write(script_content) + + print(f"\n已创建修复脚本: tools/apply_final_fixes.py") + print(f"运行命令: cd /root/.openclaw/workspace/projects/末日重生_囤货 && python3 tools/apply_final_fixes.py") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tools/fix_chapter_format.py b/tools/fix_chapter_format.py new file mode 100644 index 0000000..74eb965 --- /dev/null +++ b/tools/fix_chapter_format.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +""" +修复小说章节格式问题的Python脚本 +专门处理inkos生成的Markdown文件格式问题 +""" + +import os +import re +import sys + +CHAPTERS_DIR = "/root/.openclaw/workspace/projects/末日重生_囤货/chapters" + +def fix_chapter_format(content): + """ + 修复章节内容的格式问题 + """ + lines = content.split('\n') + fixed_lines = [] + + i = 0 + while i < len(lines): + line = lines[i] + + # 1. 处理标题行 + if line.startswith('#'): + # 确保#后面有空格 + if not line.startswith('# '): + line = re.sub(r'^#+', '# ', line) + # 移除标题中的多余空格 + line = re.sub(r'\s+', ' ', line).strip() + + # 2. 移除开头的加粗标记 + line = re.sub(r'^\*\*(.*?)\*\*$', r'\1', line) + + # 3. 修复段落开头和结尾的星号 + line = re.sub(r'^\*+', '', line) + line = re.sub(r'\*+$', '', line) + + # 4. 处理"第X章"重复问题 + if re.match(r'^[#\s]*第\d+章\s+', line): + # 移除多余的"第X章" + line = re.sub(r'^[#\s]*第\d+章\s+', '', line) + + # 5. 处理重复的爽点段落 + if '【爽点' in line: + # 检查下一行是否也是爽点段落 + if i + 1 < len(lines) and '【爽点' in lines[i + 1]: + # 跳过重复的爽点段落 + i += 1 + continue + + # 6. 修复多余的空白行 + if line.strip() == '': + if not fixed_lines or fixed_lines[-1].strip() == '': + # 跳过连续的空白行 + i += 1 + continue + + # 7. 修复中文标点格式 + line = re.sub(r'([,。!?;:])\s*', r'\1', line) # 中文标点后去除空格 + line = re.sub(r'\s*([,。!?;:])', r'\1', line) # 中文标点前去除空格 + + # 8. 修复英文标点格式 + line = re.sub(r'([a-zA-Z])\s*([,.!?;:])\s*', r'\1\2 ', line) # 英文标点后加空格 + + fixed_lines.append(line) + i += 1 + + # 重新构建内容 + result = '\n'.join(fixed_lines) + + # 9. 修复章节标题格式 + # 确保每个文件以"# 第X章 标题"开头 + title_match = re.search(r'第(\d+)章\s+(.+)', result[:100]) + if title_match: + chapter_num = title_match.group(1) + chapter_title = title_match.group(2) + # 创建标准标题 + standard_title = f"# 第{chapter_num}章 {chapter_title}" + # 替换开头的标题 + result = re.sub(r'^.*第\d+章.*$', standard_title, result, flags=re.MULTILINE) + + # 10. 确保段落之间有适当的空行 + result = re.sub(r'\n{3,}', '\n\n', result) + + return result + +def main(): + print("开始修复章节格式问题...") + + # 获取所有章节文件 + chapter_files = [f for f in os.listdir(CHAPTERS_DIR) if f.endswith('.md')] + + fixed_count = 0 + for filename in sorted(chapter_files): + filepath = os.path.join(CHAPTERS_DIR, filename) + + print(f"处理文件: {filename}") + + # 读取文件内容 + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # 修复格式 + fixed_content = fix_chapter_format(content) + + # 检查是否有变化 + if content != fixed_content: + # 备份原文件 + backup_path = filepath + '.bak' + with open(backup_path, 'w', encoding='utf-8') as f: + f.write(content) + + # 写入修复后的内容 + with open(filepath, 'w', encoding='utf-8') as f: + f.write(fixed_content) + + print(f" ✓ 已修复格式问题 (备份: {filename}.bak)") + fixed_count += 1 + else: + print(f" ✓ 格式正常") + + print(f"\n修复完成!共处理了 {len(chapter_files)} 个文件,修复了 {fixed_count} 个文件的格式问题。") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tools/fix_critical_titles.py b/tools/fix_critical_titles.py new file mode 100644 index 0000000..307ecf2 --- /dev/null +++ b/tools/fix_critical_titles.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +""" +修复最关键的标题问题 +""" + +import os +import re + +CHAPTERS_DIR = "/root/.openclaw/workspace/projects/末日重生_囤货/chapters" + +# 最需要修复的标题(评分C级或以下) +CRITICAL_FIXES = { + '筹码_手动修复': '致命筹码', + '修复': '心灵修复', + '对峙(2)': '生死对峙', +} + +def fix_critical_titles(): + """修复最关键的标题""" + print("🔧 修复最关键标题问题") + print("=" * 50) + + # 获取所有章节文件 + chapter_files = [f for f in os.listdir(CHAPTERS_DIR) if f.endswith('.md')] + + # 查找需要修复的文件 + 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 CRITICAL_FIXES: + new_title = CRITICAL_FIXES[old_title] + files_to_fix.append((filename, old_title, new_title)) + + if not files_to_fix: + print("✅ 没有需要修复的关键标题") + return + + print(f"发现 {len(files_to_fix)} 个需要修复的关键标题:") + for filename, old_title, new_title in files_to_fix: + print(f" {old_title} → {new_title}") + + print("\n🔄 开始修复...") + + # 执行修复 + fixed_count = 0 + + for filename, old_title, new_title in files_to_fix: + filepath = os.path.join(CHAPTERS_DIR, filename) + + # 读取文件内容 + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # 提取章节号 + match = re.search(r'ch(\d+)-第\d+章\s+(.+)\.md', filename) + chapter_num = match.group(1) + + # 构建新文件名 + 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) + + # 写入文件 + with open(new_filepath, 'w', encoding='utf-8') as f: + f.write(content) + + # 如果文件名改变,删除旧文件 + if new_filename != filename: + os.remove(filepath) + print(f"✅ 修复: {filename} → {new_filename}") + else: + print(f"✅ 更新标题: {old_title} → {new_title}") + + fixed_count += 1 + + print(f"\n📊 修复完成! 共修复 {fixed_count} 个关键标题") + +if __name__ == '__main__': + fix_critical_titles() \ No newline at end of file diff --git a/tools/fix_formatting.sh b/tools/fix_formatting.sh new file mode 100755 index 0000000..9682c2d --- /dev/null +++ b/tools/fix_formatting.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +# 修复小说章节格式的脚本 +# 作者:番茄小说创作助手 +# 日期:2026-03-30 + +# 配置 +CHAPTERS_DIR="/root/.openclaw/workspace/projects/末日重生_囤货/chapters" + +echo "开始修复章节格式问题..." + +# 遍历所有章节文件 +for file in "$CHAPTERS_DIR"/*.md; do + if [ -f "$file" ]; then + echo "处理文件: $(basename "$file")" + + # 创建临时文件 + temp_file="${file}.temp" + + # 处理文件内容 + cat "$file" | sed -E ' + # 修复标题格式:确保#后面有空格 + s/^#([^ ])/# \1/ + + # 移除多余的加粗标记(**开头和结尾) + s/^\*\*(.*)\*\*$/\1/ + + # 修复开头的格式问题:移除开头的多个空格或特殊字符 + s/^[[:space:]]*第[0-9]+章[[:space:]]*// # 移除重复的"第X章" + + # 修复段落开头和结尾的星号 + s/^\*+//g + s/\*+$//g + + # 修复重复的爽点段落 + /【爽点/ { + N + /【爽点/ { + s/^\n// + s/【爽点.*\n// + } + } + + # 确保每个段落之间有适当的空行 + s/^[[:space:]]*$// + /^$/! { + N + /^.*\n$/! { + s/\n/ /g + } + } + ' > "$temp_file" + + # 检查文件是否有实际变化 + if ! diff -q "$file" "$temp_file" > /dev/null; then + echo " 修复了 $(basename "$file") 的格式问题" + mv "$temp_file" "$file" + else + echo " $(basename "$file") 格式正常" + rm "$temp_file" + fi + fi +done + +echo "格式修复完成!" \ No newline at end of file diff --git a/tools/improve_all_titles.py b/tools/improve_all_titles.py new file mode 100644 index 0000000..ca1e42c --- /dev/null +++ b/tools/improve_all_titles.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +""" +全面改进章节标题 +""" + +import os +import re + +CHAPTERS_DIR = "/root/.openclaw/workspace/projects/末日重生_囤货/chapters" + +# 优质标题建议(根据番茄小说调性) +GOOD_TITLES = { + # 原标题 -> 改进标题 + '仓鼠行动': '仓鼠行动', + '粮草先行': '粮草先行', + + # 增加吸引力的改进 + '铁壁': '铁壁防线', + '焊花': '焊花飞舞', + '骨刺': '骨刺危机', + '暗流(2)': '暗流再起', + '质询': '致命质询', + '断水': '水源危机', + '昏沉': '意识迷途', + '电话': '致命来电', + '赴约': '死亡之约', + '充电': '能量重启', + '交付': '生死交付', + '对峙(2)': '生死对峙', + '决断': '生死决断', +} + +def analyze_current_titles(): + """分析当前所有标题""" + chapter_files = [f for f in os.listdir(CHAPTERS_DIR) if f.endswith('.md')] + + results = [] + + for filename in chapter_files: + match = re.search(r'ch(\d+)-第\d+章\s+(.+)\.md', filename) + if not match: + continue + + chapter_num = match.group(1) + title = match.group(2) + + # 评估标题质量 + score = 100 + + # 检查下划线 + if '_' in title: + score -= 25 + + # 检查括号数字 + if '(' in title and ')' in title: + score -= 25 + + # 检查技术词汇 + + tech_words = ['修复', 'fixed', '备份'] + for word in tech_words: + if word in title: + score -= 30 + break + + # 检查长度 + if len(title) < 2: + score -= 20 + elif len(title) > 6: + score -= 15 + + results.append({ + 'filename': filename, + 'chapter_num': chapter_num, + 'title': title, + 'score': score + }) + + return sorted(results, key=lambda x: int(x['chapter_num'])) + +def improve_all_titles(): + """全面改进标题""" + print("🌟 章节标题全面改进") + print("=" * 50) + + current_titles = analyze_current_titles() + + print(f"共发现 {len(current_titles)} 个章节") + print() + + # 显示当前标题质量 + poor_titles = [] + + for item in current_titles: + grade = "A" if item['score'] >= 90 else "B" if item['score'] >= 70 else "C" + + if grade == "C": + print(f"❌ 第{item['chapter_num']}章: {item['title']} - 评分: {item['score']} (C级)") + poor_titles.append(item) + elif grade == "B": + print(f"⚠ 第{item['chapter_num']}章: {item['title']} - 评分: {item['score']} (B级)") + else: + print(f"✅ 第{item['chapter_num']}章: {item['title']} - 评分: {item['score']} (A级)") + + print() + + if not poor_titles: + print("✅ 所有标题质量良好,无需改进") + return + + print(f"共发现 {len(poor_titles)} 个需要改进的标题:") + for item in poor_titles: + current_title = item['title'] + improved_title = GOOD_TITLES.get(current_title, current_title) + + if improved_title != current_title: + print(f" {current_title} → {improved_title}") + + print() + + # 执行改进 + improved_count = 0 + + for item in poor_titles: + filename = item['filename'] + current_title = item['title'] + chapter_num = item['chapter_num'] + + improved_title = GOOD_TITLES.get(current_title, current_title) + + if improved_title == current_title: + continue + + filepath = os.path.join(CHAPTERS_DIR, filename) + + # 读取内容 + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # 更新标题 + old_header = f"# 第{chapter_num}章 {current_title}" + new_header = f"# 第{chapter_num}章 {improved_title}" + + if old_header in content: + content = content.replace(old_header, new_header, 1) + + # 生成新文件名 + new_filename = f"ch{chapter_num}-第{chapter_num}章 {improved_title}.md" + new_filepath = os.path.join(CHAPTERS_DIR, new_filename) + + # 写入新文件 + with open(new_filepath, 'w', encoding='utf-8') as f: + f.write(content) + + # 删除旧文件(如果文件名改变) + if new_filename != filename: + os.remove(filepath) + + print(f"✅ 改进: 第{chapter_num}章 {current_title} → {improved_title}") + improved_count += 1 + + if improved_count > 0: + print(f"\n📊 改进完成! 共改进 {improved_count} 个标题") + + # 显示改进前后的对比 + + print("\n📈 改进总结:") + for item in poor_titles: + if item['title'] in GOOD_TITLES and GOOD_TITLES[item['title']] != item['title']: + print(f" 第{item['chapter_num']}章: {item['title']} → {GOOD_TITLES[item['title']]}") + else: + print("✅ 无需改进") + +if __name__ == '__main__': + improve_all_titles() \ No newline at end of file diff --git a/tools/precise_shuangdian_removal.py b/tools/precise_shuangdian_removal.py new file mode 100644 index 0000000..150013e --- /dev/null +++ b/tools/precise_shuangdian_removal.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +""" +精确移除爽点分析内容,保留正常的心理描写 +""" + +import os +import re + +CHAPTERS_DIR = "/root/.openclaw/workspace/projects/末日重生_囤货/chapters" + +def precise_remove_shuangdian(content): + """ + 精确移除爽点分析,保留正常的心理描写 + """ + lines = content.split('\n') + result_lines = [] + + i = 0 + while i < len(lines): + line = lines[i] + + # 1. 移除特定的爽点分析句子(精确匹配) + if '展现重生者的先知优势' in line or '利用未来信息获取利益' in line: + # 跳过这一行 + i += 1 + continue + + # 2. 移除"谈判桌上,陈末掌握着对手的所有底牌"这一段 + if '谈判桌上,陈末掌握着对手的所有底牌' in line: + # 跳过这一段(通常3行) + i += 3 + continue + + # 3. 检查是否是爽点标题行 + if re.search(r'^#\s*【爽点[一二三四五六七八九十]?[::]', line): + # 跳过爽点标题行 + i += 1 + # 检查下一行是否是爽点内容 + while i < len(lines) and lines[i].strip() and not lines[i].startswith('#') and not re.search(r'【爽点[一二三四五六七八九十]?[::]', lines[i]): + i += 1 + continue + + # 4. 保留正常的心理描写(如「一周后爆雷,这个消息值多少钱?」) + # 这些是正常的心理活动,不应该被移除 + + result_lines.append(line) + i += 1 + + # 重新组合内容 + result = '\n'.join(result_lines) + + # 5. 清理多余的空白行 + result = re.sub(r'\n{3,}', '\n\n', result) + + # 6. 确保章节以正确的标题结束 + # 移除末尾可能遗留的爽点内容 + lines = result.split('\n') + cleaned_lines = [] + for line in lines: + if '【爽点:' in line and '重生者的先知优势' in line: + continue + cleaned_lines.append(line) + + result = '\n'.join(cleaned_lines) + + return result.strip() + +def main(): + print("精确移除爽点分析内容...") + + chapter_files = [f for f in os.listdir(CHAPTERS_DIR) if f.endswith('.md')] + + # 先检查哪些文件需要修复 + for filename in sorted(chapter_files): + filepath = os.path.join(CHAPTERS_DIR, filename) + + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # 检查是否有需要修复的内容 + needs_fix = ( + '展现重生者的先知优势' in content or + '谈判桌上,陈末掌握着对手的所有底牌' in content or + re.search(r'^#\s*【爽点[一二三四五六七八九十]?[::]', content, re.MULTILINE) + ) + + if needs_fix: + print(f"修复: {filename}") + + # 创建备份 + backup_path = filepath + '.precise.bak' + with open(backup_path, 'w', encoding='utf-8') as f: + f.write(content) + + # 应用修复 + fixed_content = precise_remove_shuangdian(content) + + with open(filepath, 'w', encoding='utf-8') as f: + f.write(fixed_content) + + print(f" ✓ 已精确修复") + else: + print(f"检查: {filename} ✓ 无需修复") + + print("\n精确修复完成!") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tools/remove_shuangdian_from_content.py b/tools/remove_shuangdian_from_content.py new file mode 100644 index 0000000..6ebbc29 --- /dev/null +++ b/tools/remove_shuangdian_from_content.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +""" +从正文中移除爽点分析内容 +将爽点分析提取到单独的注释部分 +""" + +import os +import re + +CHAPTERS_DIR = "/root/.openclaw/workspace/projects/末日重生_囤货/chapters" + +def remove_shuangdian_from_content(content): + """ + 从正文中移除爽点分析内容 + """ + # 1. 移除正文中的爽点分析句子 + patterns_to_remove = [ + r'展现重生者的先知优势[,。]?', + r'利用未来信息获取利益[,。]?', + r'展现主角的[^,。]+[,。]?', + r'体现[^,。]+的[^,。]+[,。]?', + r'突出[^,。]+的[^,。]+[,。]?', + ] + + for pattern in patterns_to_remove: + content = re.sub(pattern, '', content) + + # 2. 移除正文中的AI分析标记 + ai_patterns = [ + r'【[^】]+】', # 移除【爽点分析】等标记 + r'\[[^\]]+\]', # 移除[分析]等标记 + r'「[^」]+」', # 移除「分析」等标记 + ] + + for pattern in ai_patterns: + # 但保留章节标题中的【爽点X:XXX】 + lines = content.split('\n') + cleaned_lines = [] + for line in lines: + if line.startswith('# 第'): + # 保留章节标题 + cleaned_lines.append(line) + else: + # 移除正文中的分析标记 + cleaned_line = re.sub(pattern, '', line) + cleaned_lines.append(cleaned_line) + content = '\n'.join(cleaned_lines) + + # 3. 提取爽点分析部分(如果存在) + shuangdian_sections = [] + main_content_lines = [] + + lines = content.split('\n') + in_shuangdian_section = False + current_shuangdian = [] + + for line in lines: + # 检测爽点部分开始 + if re.search(r'【爽点[一二三四五六七八九十]?[::]', line): + in_shuangdian_section = True + current_shuangdian.append(line) + elif in_shuangdian_section: + if line.strip() and not line.startswith('#') and not re.search(r'【爽点[一二三四五六七八九十]?[::]', line): + current_shuangdian.append(line) + else: + # 爽点部分结束 + if current_shuangdian: + shuangdian_sections.append('\n'.join(current_shuangdian)) + current_shuangdian = [] + in_shuangdian_section = False + if line.strip(): + main_content_lines.append(line) + else: + main_content_lines.append(line) + + # 处理最后一个爽点部分 + if current_shuangdian: + shuangdian_sections.append('\n'.join(current_shuangdian)) + + # 4. 重新组合内容 + result = '\n'.join(main_content_lines) + + # 5. 清理重复的爽点标题 + # 移除正文中重复的爽点标题部分 + result_lines = result.split('\n') + cleaned_result_lines = [] + i = 0 + while i < len(result_lines): + line = result_lines[i] + # 检查是否是重复的爽点内容 + if '谈判桌上,陈末掌握着对手的所有底牌' in line: + # 跳过这几行 + i += 3 # 跳过这一行和后面的两行 + continue + cleaned_result_lines.append(line) + i += 1 + + result = '\n'.join(cleaned_result_lines) + + # 6. 清理多余的空白行 + result = re.sub(r'\n{3,}', '\n\n', result) + + # 7. 如果有爽点分析,添加到末尾作为注释 + if shuangdian_sections: + result += '\n\n' + + return result.strip() + +def main(): + print("从正文中移除爽点分析内容...") + + chapter_files = [f for f in os.listdir(CHAPTERS_DIR) if f.endswith('.md')] + + fixed_count = 0 + for filename in sorted(chapter_files): + filepath = os.path.join(CHAPTERS_DIR, filename) + + print(f"处理: {filename}") + + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # 检查是否需要修复 + needs_fix = False + if '展现重生者的先知优势' in content: + needs_fix = True + if re.search(r'【爽点[一二三四五六七八九十]?[::]', content): + needs_fix = True + if '谈判桌上,陈末掌握着对手的所有底牌' in content: + needs_fix = True + + if not needs_fix: + print(f" ✓ 无需修复") + continue + + # 创建备份 + backup_path = filepath + '.shuangdian.bak' + with open(backup_path, 'w', encoding='utf-8') as f: + f.write(content) + + # 修复内容 + fixed_content = remove_shuangdian_from_content(content) + + # 检查是否有变化 + if content != fixed_content: + with open(filepath, 'w', encoding='utf-8') as f: + f.write(fixed_content) + print(f" ✓ 已移除爽点分析内容") + fixed_count += 1 + else: + print(f" ✓ 无需修复") + + print(f"\n修复完成!共处理了 {len(chapter_files)} 个文件,修复了 {fixed_count} 个文件的爽点分析问题。") + +if __name__ == '__main__': + main() \ No newline at end of file