Files
recipe_tool/scripts/test-remove-days.ts
T
hanhan 6e1d2c6728 feat: 新增135编辑器转换子功能
- 新增 /editor135 子页面:上传幼儿园食谱docx → 解析并填充135模板 → 预览/源代码/解析结果三视图
- 新增 /api/editor135/render 解析接口(jsdom 解析填充,逐条回读校验 mismatch)
- 新增 /api/editor135/img 微信CDN图片代理(解决预览防盗链,仅允许 *.qpic.cn)
- 缺失星期自动删除:docx 缺某天(含周末/间隔天)时整段移除该天内容,尾部三审三校/温馨提示保留
- 逐节点精确区间删除算法:处理相邻天共用容器、嵌套结构,不误删保留天
- 新增依赖 jsdom + @types/jsdom;附 6 场景回归测试脚本 scripts/test-remove-days.ts
- 首页 header 增加「135编辑器转换」导航入口
2026-09-08 23:18:53 +08:00

42 lines
3.4 KiB
TypeScript

import { readFileSync } from "node:fs";
import { fillTemplate } from "../lib/editor135-core.ts";
const tpl = readFileSync("../public/template135.html", "utf8");
const DAY_EN: Record<string, string> = { "星期一": "Mon", "星期二": "Tue", "星期三": "Wed", "星期四": "Thu", "星期五": "Fri", "星期六": "Sat", "星期日": "Sun" };
const mkDay = (day: string, counts: number[]) => {
const mealNames = ["早餐", "早点", "午餐", "体弱儿餐", "午点"];
return { day, meals: mealNames.slice(0, counts.length).map((meal, i) => ({
meal, items: Array.from({ length: counts[i] }, (_, k) => ({ zh: day + meal + "菜" + (k + 1), en: DAY_EN[day] + "-M" + (i + 1) + "-D" + (k + 1) })),
})) };
};
const strip = (h: string) => h.replace(/<[^>]+>/g, "");
// 场景1: 间隔天 一/三/五
const r1 = fillTemplate(tpl, { days: [mkDay("星期一", [4, 3, 5, 1, 1]), mkDay("星期三", [4, 3, 5, 1, 1]), mkDay("星期五", [4, 3, 5, 1, 1])] });
console.log("场景1(一/三/五) removedDays:", r1.report.removedDays, "mismatch:", r1.report.mismatch.length ? r1.report.mismatch : "无 ✓");
for (const d of ["星期一", "星期二", "星期三", "星期四", "星期五"]) console.log(" " + d + " 残留:", strip(r1.html).split(d).length - 1, "(含合成菜名)");
// 场景2: 全周 + 周末(模板无周末区块)
const r2 = fillTemplate(tpl, { days: ["星期一","星期二","星期三","星期四","星期五","星期六","星期日"].map((d) => mkDay(d, [4, 3, 5, 1, 1])) });
console.log("\n场景2(全周+周末) removedDays:", r2.report.removedDays, "mismatch:", r2.report.mismatch.length ? r2.report.mismatch : "无 ✓");
console.log(" warnings:", r2.report.warnings);
// 场景3: 只有周末
const r3 = fillTemplate(tpl, { days: [mkDay("星期六", [4, 3, 5, 1, 1]), mkDay("星期日", [4, 3, 5, 1, 1])] });
console.log("\n场景3(仅周末) removedDays:", r3.report.removedDays, "mismatch:", r3.report.mismatch.length ? r3.report.mismatch : "无 ✓");
for (const d of ["星期一", "星期二", "星期三", "星期四", "星期五"]) console.log(" " + d + " 残留:", strip(r3.html).split(d).length - 1);
console.log(" 尾部保留:", strip(r3.html).includes("三审三校") || strip(r3.html).includes("温馨提示"));
// 场景4: 一/四 (中间连续缺)
const r4 = fillTemplate(tpl, { days: [mkDay("星期一", [4, 3, 5, 1, 1]), mkDay("星期四", [4, 3, 5, 1, 1])] });
console.log("\n场景4(一/四) removedDays:", r4.report.removedDays, "mismatch:", r4.report.mismatch.length ? r4.report.mismatch : "无 ✓");
// 场景5: 条数不匹配(少/多) 触发增删路径
const r5 = fillTemplate(tpl, { days: [mkDay("星期一", [2, 1, 7, 1, 3]), mkDay("星期二", [4, 3, 5, 1, 1]), mkDay("星期三", [4, 3, 5, 1, 1]), mkDay("星期四", [4, 3, 5, 1, 1]), mkDay("星期五", [4, 3, 5, 1, 1])] });
console.log("\n场景5(增删路径) mismatch:", r5.report.mismatch.length ? r5.report.mismatch : "无 ✓");
console.log(" filled:", r5.report.filled.filter((f) => f.day === "星期一").map((f) => f.meal + ":" + f.replaced + "+" + f.added + "-" + f.removed).join(", "));
// 场景6: 完整周正常填充(等价真实回归)
const r6 = fillTemplate(tpl, { days: ["星期一","星期二","星期三","星期四","星期五"].map((d) => mkDay(d, [4, 3, 5, 1, 1])) });
console.log("\n场景6(完整周) removedDays:", r6.report.removedDays, "mismatch:", r6.report.mismatch.length ? r6.report.mismatch : "无 ✓");
console.log(" verification:", JSON.stringify(r6.report.verification));