obsidian社区插件
QuickAdd 脚本 - 常驻一些 YAML 属性与格式化
插件ID:quickadd%E8%84%9A%E6%9C%AC-%E5%B8%B8%E9%A9%BB%E4%B8%80%E4%BA%9Byaml%E5%B1%9E%E6%80%A7%E4%B8%8E%E6%A0%BC%E5%BC%8F%E5%8C%96
quickadd%E8%84%9A%E6%9C%AC-%E5%B8%B8%E9%A9%BB%E4%B8%80%E4%BA%9Byaml%E5%B1%9E%E6%80%A7%E4%B8%8E%E6%A0%BC%E5%BC%8F%E5%8C%96
quickadd%E8%84%9A%E6%9C%AC %E5%B8%B8%E9%A9%BB%E4%B8%80%E4%BA%9Byaml%E5%B1%9E%E6%80%A7%E4%B8%8E%E6%A0%BC%E5%BC%8F%E5%8C%96:常驻一些 YAML 属性与格式化
QuickAdd 脚本 - 常驻一些 YAML 属性与格式化
主要用 Linter 格式化在 YAML 处理方面在一些区域块 (Kanban 和 Lineage 中) 编辑会出现问题,在区域块中添加 yaml 属性,于是我只能关闭关于 Linter 处理 YAML 部分的功能,虽然 TP 能实现一部分功能,但是还是有点不太满意,所以按照自己的需求写了一个 YAML 相关的脚本用来固定和更新一些 YAML 属性值。
脚本功能
这个脚本的主要功能是处理当前文件的 YAML 元数据,用于确保文件的 YAML 元数据完整且一致,特别是在文件的标题和日期信息方面。
具体来说,它执行以下操作:
- 固定一些 YAML 属性:
- 确保某些固定的 YAML 属性(如 uid、banner、title 等)存在,如果不存在则设置为空字符串。
- 默认设置的是
"uid", "banner", "title", "aliases", "tags", "url", "description", 'cssclasses', "date", "created", "modified"
- 自动获取 title 以及更新 aliases
- 设置 title 为第一个一级标题或文件名,并在 title 更新时将旧的 title 移动到 aliases 中。
- 插入创建时间(ctime)和更新修改时间(mtime)
- 时间属性来自 ob 记录的文档的信息
- 时间格式为
YYYY-MM-DD HH:mm:ss
- 设置 uid 为当前时间的特定格式(
YYYYMMDDHHmmssSSS
)。 - 去除重复值:从所有数组属性中去除重复值。
- 脚本可以在阅读模式下触发
脚本源码
// ! 固定的YAML属性
const fixedProperties = ["uid", "banner", "title", "aliases", "tags", "url", "description", 'cssclasses', "date", "created", "modified"];
module.exports = async (QuickAdd, settings, params) => {
// 保存文件
await app.commands.executeCommandById('editor:save-file');
await new Promise(r => setTimeout(r, 300));
// 获取当前文件信息
const file = app.workspace.getActiveFile();
if (!file) {
return; // 如果获取不到文件信息,则不执行后续代码
}
const ctime = new Date(file.stat["ctime"]);
const mtime = new Date(file.stat["mtime"]);
// 获取文件缓存的元数据
const cachedMetadata = await app.metadataCache.getFileCache(file);
const headings = await cachedMetadata.headings;
// 处理 YAML 属性
await app.fileManager.processFrontMatter(file, fm => {
fixedProperties.forEach(prop => {
if (!fm[prop]) {
fm[prop] = ''; // 设置默认值为空字符串
}
});
//! 设置 title 为第一个一级标题或文件名,且如果更新自动移动到aliases中
// 或从第一个一级标题获取,如果有多个一级标题则还是文件名
const fileName = file.basename.replace(/^[\d\.\_\-]+/, '');
if (headings) {
const levelOneHeadings = headings.filter(h => h.level === 1);
const newTitle = levelOneHeadings.length === 1 ? levelOneHeadings[0].heading : fileName;
if (fm.title && fm.title !== newTitle) {
// 如果 title 已存在且与新获取的值不一致
if (!Array.isArray(fm.aliases)) {
fm.aliases = []; // 确保 aliases 是一个数组
}
fm.aliases.push(fm.title); // 将当前 title 添加到 aliases 中
}
fm.title = newTitle;
} else {
const newTitle = fileName;
if (fm.title && fm.title !== newTitle) {
if (!Array.isArray(fm.aliases)) {
fm.aliases = [];
}
fm.aliases.push(fm.title);
}
fm.title = newTitle;
}
// ! 设置一些日期属性
// 设置 uid 为 YYYYMMDDHHmmSSS 格式
if (!fm["uid"]) {
fm.uid = moment().format('YYYYMMDDHHmmssSSS');
}
// 如果 date 不存在,则设置为 ctime 格式化后的值
if (!fm["date"]) {
fm["date"] = moment(ctime).format('YYYY-MM-DD');
}
// 如果 created 不存在,则设置为 ctime 格式化后的值
if (!fm["created"]) {
fm["created"] = moment(ctime).format('YYYY-MM-DD HH:mm:ss');
}
// 设置 modified 为 mtime 格式化后的值
fm["modified"] = moment(mtime).format('YYYY-MM-DD HH:mm:ss');
// !去除所有数组属性中的重复值
for (const key in fm) {
if (Array.isArray(fm[key])) {
fm[key] = [...new Set(fm[key])];
}
}
});
};
讨论
若阁下有独到的见解或新颖的想法,诚邀您在文章下方留言,与大家共同探讨。
反馈交流
其他渠道
版权声明
版权声明:所有 PKMer 文章如果需要转载,请附上原文出处链接。