各位老OB们,小弟还不知道如何制作插件,才疏学浅,还在上学,希望能不能说有一款可以完成导入课表,把每天要上的课在日记里面显示出来的插件呀,或者有相同想法的朋友一起讨论一下
要对每一所学校做适配不太现实吧?
楼主找找有没有现成的,例如很多国产手机系统自带的课程表软件
1 个赞
倒是有,一直在用超级课程表,但是广告啥的有点多,用的不舒服。而且加到ob里面后面时间安排起来感觉更得心应手,适配的话,实在不行我就学学咋做插件,试试自己做一个 感谢你的回复
可以试试别的,比如 wake up
1 个赞
是可以,可以试试
感谢,我会尝试一下这种方法的
有个类似的需求,我是这么实现的,用的templater模板,大概得思路是这样的:
- 把课表展开成md表格,每一天是一行,每一列是第几节(这个可以直接用AI生成)
- 用templater读取该文件内容,匹配日记时间和新课表每一行时间
- 如果能匹配到,则读取这个表的表头和匹配到的这一行内容,形成一张新表
- 在日记模板里把这个代码放进去
原课表 → 查询特定文件夹下所有包含“课表”的文件,可以是不同课表文件下的表,也可以是同一文件下不同的表
查询结果 → 这里是按文件名的日期查找的
templater代码
<%*
const currentFileName = tp.file.title;
const folderPath = "02.test"; // 查询的文件夹
// 查找包含“课表”的文件
async function findFilesWithKeyword(folder, keyword) {
let results = [];
const files = await app.vault.getFiles(); // 获取所有文件
for (const file of files) {
if (file.path.startsWith(folder) && file.name.includes(keyword)) {
results.push(file);
}
}
return results;
}
// 查找文件夹及其子文件夹中所有包含“课表”的文件
const filteredFiles = await findFilesWithKeyword(folderPath, "课表");
let results = [];
let headerLine = "";
let headerNextLine = "";
for (const file of filteredFiles) {
const content = await app.vault.read(file);
const lines = content.split('\n');
// 查找表头行
for (let i = 0; i < lines.length; i++) {
if (lines[i].startsWith('| 日期')) {
headerLine = lines[i];
headerNextLine = lines[i + 1];
break;
}
}
for (let i = 2; i < lines.length; i++) {
if (lines[i].includes(currentFileName)) {
results.push(lines[i]);
}
}
}
// 去重结果
results = [...new Set(results)];
// 显示结果
if (results.length > 0 && headerLine) {
tR += `## 当日课程\n${headerLine}\n${headerNextLine}\n`; // 添加表头
results.forEach(result => tR += `${result}\n`); // 添加查询到的行
} else {
tR += "当日好像没课";
}
%>
如果每周的课程比较固定的话,也可以不做1.展开表格,直接匹配星期就可以了
课表
效果
代码
<%*
const currentFileName = tp.file.title;
const folderPath = "02.test";
// 将日期转换为星期
function getDayOfWeek(dateString) {
const date = new Date(dateString);
const days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
return days[date.getDay()];
}
async function findFilesWithKeyword(folder, keyword) {
let results = [];
const files = await app.vault.getFiles();
for (const file of files) {
if (file.path.startsWith(folder) && file.name.includes(keyword)) {
results.push(file);
}
}
return results;
}
const filteredFiles = await findFilesWithKeyword(folderPath, "课表");
let results = [];
for (const file of filteredFiles) {
const content = await app.vault.read(file);
const lines = content.split('\n');
const targetDay = getDayOfWeek(currentFileName);
for (let i = 0; i < lines.length; i++) {
if (lines[i].includes(targetDay)) {
const headerLine = lines[i - 1].trim();
const currentLine = lines[i].trim();
const newRow = currentLine.replace(/^\| | \|$/g, '').trim();
results.push({ headerLine, newRow });
}
}
}
if (results.length > 0) {
let output = `## 当天课程\n| 星期 | 1-2 | 3-4 | 5-6 | 7-8 |\n| --- | --- | --- | --- | --- |\n`;
results.forEach(result => {
output += `| ${result.newRow} |\n`;
});
tR += output.trim();
} else {
tR += "当天好像没课";
}
%>
1 个赞
感谢感谢,抱歉这么晚看到才回复,最近学业有些繁忙,再次感谢
我之前不了解templater模板这个插件,我现在要去学习一下,我的情况是双周单周的课程不一样,以及有些课程在固定的时间段开始,所以我会修改代码,后续或许我会继续跟进,我会把我的解决办法发布在这个帖子上,希望我可以赶快抽身投入
居然还没有解析 .ics 的插件吗,有点惊讶
这种情况就得用AI展开成具体日期的表格,再用templater
用 dataview 的 views 写了一个, 得自己配置 json 格式的课程
const DebugData = {
TableMeta: {// 课程表元数据格式
showWeekend: false, // 显示周末
showRestBreak: true, // 显示午休, 晚休
sections: { // 课程节数设置
morning: 4, // 上午
afternoon: 2, // 中午
night: 0 // 下午
},
},
TimeMeta: [
{ section: 1, start: "08:45", end: "09:25" },
{ section: 2, start: "08:45", end: "09:25" },
{ section: 3, start: "08:45", end: "09:25" },
{ section: 4, start: "08:45", end: "09:25" },
{ section: 5, start: "08:45", end: "09:25" },
{ section: 6, start: "08:45", end: "09:25" },
],
ColorMeta: [ // 配色元
// use ...PresetColorMeta
],
ClassMeta: [
{ id: "chinese", className: "语文", teacher: "李老师", classTime: "18:10", colorTheme: "lemon1" },
{ id: "math", className: "数学", teacher: "赵老师", colorTheme: "blue1" },
{ id: "activity", className: "综合实践活动1", shortName: "综活", teacher: "赵老师", colorTheme: "pink1" },
{ id: "difang", className: "地方", teacher: "李老师", colorTheme: "salmon3" },
{ id: "pe", className: "体育1", teacher: "唐老师", colorTheme: "purple4" },
{ id: "art", className: "美术", classRoom: "教室1", teacher: "徐老师", colorTheme: "orange1" },
{ id: "music", className: "音乐1", teacher: "张老师", colorTheme: "turquoise1" },
{ id: "labor", className: "劳动", teacher: "郭老师", colorTheme: "lavender1" },
{ id: "daofa", className: "道德与法治", teacher: "李老师", colorTheme: "mint3" },
{ id: "science", className: "科学", teacher: "赵老师", colorTheme: "coral1" },
{ id: "meeting", className: "班会", teacher: "李老师", colorTheme: "teal1" },
],
ClassList: [
// section: 第几节, list: [周一到周日课程按顺序排, 没有课程传空对象]
// 课程示例: { meta: "math", className: "", teacher: "", backgroundColor: "", frontColor: ""}
// meta: 课程元id, 从 ClassMeta 中匹配
// className: 课程名
// teacher: 教师名
// xxColor: 单元格配色
// colorTheme: 单元格配色元
{ section: 1, list: [{ meta: "math" }, { meta: "math" }, { meta: "chinese" }, { meta: "chinese" }, { meta: "chinese" }] },
{ section: 2, list: [{ meta: "chinese" }, { meta: "chinese" }, { meta: "chinese" }, { meta: "math" }, { meta: "math" }] },
{ section: 3, list: [{ meta: "chinese" }, { meta: "pe" }, { meta: "music" }, { meta: "labor" }, { meta: "pe" }] },
{ section: 4, list: [{ meta: "activity" }, { meta: "art" }, { meta: "science" }, { meta: "art" }, { meta: "music" }] },
{ section: 5, list: [{ meta: "difang" }, { meta: "daofa" }, { meta: "pe" }, { meta: "pe" }, { meta: "daofa" }] },
{ section: 6, list: [{ none: true }, { none: true }, { none: true }, { none: true }, { meta: "meeting" }] },
]
};