我通过 gpt帮我写了一个代码,实现卡片复习功能的按钮。
功能是通过按钮忘记,记得和掌握来修改 yaml 的复习时间,可是为什么按钮没效果,应该参考什么文件或插件可以实现自动修改 yaml 的功能呢
const now = new Date();
// 计算下一次复习时间
function getNextDue(rememberCount) {
const intervals = [2, 4, 7, 15, 30, 90];
const days = intervals[Math.min(rememberCount, intervals.length - 1)];
return window.moment().add(days, "days").toISOString();
}
// 读取并更新 YAML 头部
async function updateYamlInFile(file, field, value) {
const fileContent = await app.vault.read(file);
const yamlMatch = fileContent.match(/^---\n([\s\S]*?)\n---/);
let yamlStr = "";
let body = "";
if (yamlMatch) {
yamlStr = yamlMatch[1];
body = fileContent.slice(yamlMatch[0].length);
} else {
// 如果没 YAML 头,创建空 YAML
body = fileContent;
}
// 解析 YAML 字段(简单实现)
let yamlObj = {};
yamlStr.split('\n').forEach(line => {
const idx = line.indexOf(':');
if (idx > 0) {
const key = line.slice(0, idx).trim();
let val = line.slice(idx + 1).trim();
// 简单转型
if (val === '[]') val = [];
else if (/^\d+$/.test(val)) val = Number(val);
else if (val.startsWith('[') && val.endsWith(']')) {
// 数组,简单处理
val = val.slice(1, -1).split(',').map(s => s.trim());
}
yamlObj[key] = val;
}
});
// 更新字段
yamlObj[field] = value;
// 把复习数组转成字符串
if (field === "复习" && Array.isArray(value)) {
yamlObj[field] = value;
}
// 重新生成 YAML 字符串
let newYamlLines = [];
for (const [k, v] of Object.entries(yamlObj)) {
if (Array.isArray(v)) {
newYamlLines.push(`${k}: [${v.join(', ')}]`);
} else {
newYamlLines.push(`${k}: ${v}`);
}
}
const newYaml = `---\n${newYamlLines.join('\n')}\n---`;
// 写回文件
await app.vault.modify(file, `${newYaml}\n${body}`);
}
// 更新复习记录函数
async function updateReview(file, type, rememberCount, oldReview) {
let newRemember = rememberCount;
let newDue;
if (type === "forgot") {
newRemember = 0;
newDue = window.moment().add(10, "minutes").toISOString();
} else if (type === "remember") {
newRemember += 1;
newDue = getNextDue(newRemember);
} else if (type === "master") {
newRemember = 99;
newDue = window.moment().add(30, "days").toISOString();
}
const today = window.moment().format("YYYY-MM-DD HH:mm");
// 更新复习数组
let newReview = Array.isArray(oldReview) ? [...oldReview] : [];
newReview.push(`${today} ${type}`);
await updateYamlInFile(file, "remember", newRemember);
await updateYamlInFile(file, "due", newDue);
await updateYamlInFile(file, "复习", newReview);
new Notice(`${file.name} 已更新为 ${type}`);
}
// 主程序
const nowMoment = window.moment();
dv.pages()
.filter(p => p.tags === "闪卡" || (Array.isArray(p.tags) && p.tags.includes("闪卡")))
.filter(p => p.due && window.moment(p.due).isSameOrBefore(nowMoment))
.sort(p => p.due, 'asc')
.forEach(p => {
const file = p.file;
const remember = p.remember || 0;
const reviewList = p["复习"] || [];
const dueDate = p.due instanceof Date ? p.due.toISOString() : String(p.due);
const dateOnly = dueDate.split("T")[0];
dv.header(3, file.name);
dv.paragraph(`🕒 下次复习时间: ${dateOnly} | 🧠 记得次数: ${remember}`);
const container = dv.el("div", "", { cls: "review-buttons" });
const btns = [
{ label: "❌ 忘记", type: "forgot" },
{ label: "✅ 记得", type: "remember" },
{ label: "🏆 掌握", type: "master" }
];
btns.forEach(({ label, type }) => {
const btn = dv.el("button", label, { cls: "review-btn" });
btn.style.marginRight = "0.5em";
btn.onclick = () => updateReview(file, type, remember, reviewList);
container.appendChild(btn);
});
});
报错如下,问了 gpt 也没得到解决的答案
Uncaught (in promise) TypeError: e.cache is not a function
at t.<anonymous> (app.js:1:753213)
at app.js:1:248524
at Object.next (app.js:1:248629)
at a (app.js:1:247347)