~ 3 min
obsidian&jekyll进阶(2)
鉴于一篇只写了电脑端的如何新建文章发布博客,在移动端同样测试之后出现一点问题,于是小小修改一下代码,我的脚本文件夹myob/assets/new_blog.js
:
module.exports = async (params) => {
const { app, quickAddApi } = params;
// 设置你的 Obsidian 文件夹路径
const obsidianFolder = '日记本/posts'; // 替换为实际路径
// 输出调试信息
console.log('Obsidian folder path:', obsidianFolder);
let mdFiles;
try {
mdFiles = await app.vault.adapter.list(obsidianFolder);
console.log('Files in folder:', mdFiles.files);
} catch (error) {
console.error('Error reading directory:', error);
new Notice('Failed to read Obsidian folder. Please check the folder path.');
return;
}
const markdownFiles = mdFiles.files.filter(file => file.endsWith('.md'));
// 初始化最大 slug
let maxSlug = 0;
// 正则表达式匹配 slug
const slugPattern = /slug:\s*"(\d+)"/;
// 遍历文件以找到最大 slug
for (const file of markdownFiles) {
const content = await app.vault.adapter.read(file);
const match = content.match(slugPattern);
if (match) {
maxSlug = Math.max(maxSlug, parseInt(match[1], 10));
}
}
// 新文章的 slug 为最大 slug + 1
const newSlug = maxSlug + 1;
// 让用户输入标题
const userTitle = await quickAddApi.inputPrompt("请输入标题");
// 如果用户取消输入标题,则终止脚本执行
if (!userTitle) {
new Notice('操作已取消,未创建新笔记。');
return;
}
const currentDate = new Date().toISOString().split('T')[0];
// 设置 YAML 头部内容,确保 date 字段始终用双引号包裹
const yamlContent = `---
categories:
-
tags:
-
date: "${new Date().toISOString().replace('T', ' ').split('.')[0]}"
slug: "${newSlug}"
title: "${userTitle}"
thumb:
backgrounds:
---
`;
// 获取新笔记的文件名,以“yyyy-mm-dd-标题”的格式命名
const fileName = `${currentDate}-${userTitle}.md`;
// 组合文件路径,使用字符串拼接代替 path 模块
const filePath = `${obsidianFolder}/${fileName}`;
try {
await app.vault.create(filePath, yamlContent + '\n# Your Note Content\n');
new Notice(`New note created at: ${filePath}`);
// 在新标签中打开新创建的笔记
const createdFile = app.vault.getAbstractFileByPath(filePath);
app.workspace.getLeaf(true).openFile(createdFile);
} catch (error) {
console.error('Error creating note:', error);
new Notice('Failed to create note. Please check the folder path and permissions.');
}
};
修改点总结:
- 移除 path 模块:直接使用字符串拼接来生成 filePath,使其适应 Obsidian 环境。
- 确保 YAML 内容正确格式化:代码生成的 YAML 头部确保在 Obsidian 中能够被正确识别。
演示视频如下:
此版本应能在 Obsidian 的 QuickAdd 插件中顺利运行,并创建带有 YAML 头部的新笔记文件。
如果单纯把文章放在文件夹里不见天日也不好,有时候隔太长时间不知道自己写了什么,所以利用dataviewjs
获取最新的博客文章状态展示:
代码如下,需要利用dataview插件:
```dataviewjs
const folderPath = "日记本/posts"; // 替换为你的文件夹路径
let pages = dv.pages().filter(p => p.file.path.startsWith(folderPath)) // 获取指定文件夹下的文件
.filter(p => p.file.name.match(/^\d{4}-\d{2}-\d{2}/)) // 过滤出符合日期格式的文件
.sort(p => p.file.name.substring(0, 10), 'desc') // 按文件名中的日期排序
.limit(3);
for (let page of pages) {
let filePath = page.file.path.replace(/ /g, '%20'); // 替换空格为 %20
dv.paragraph(`- [${page.file.name}](${filePath})`);
}
```
一个小bug就是dataviewjs代码块不能包含在callout代码块,要不然就会出现插件冲突问题,实在有点遗憾。