求一个导入课表插件,和日志挂钩

各位老OB们,小弟还不知道如何制作插件,才疏学浅,还在上学,希望能不能说有一款可以完成导入课表,把每天要上的课在日记里面显示出来的插件呀,或者有相同想法的朋友一起讨论一下 :point_right: :point_left: :person_raising_hand:

要对每一所学校做适配不太现实吧?

楼主找找有没有现成的,例如很多国产手机系统自带的课程表软件

1 个赞

倒是有,一直在用超级课程表,但是广告啥的有点多,用的不舒服。而且加到ob里面后面时间安排起来感觉更得心应手,适配的话,实在不行我就学学咋做插件,试试自己做一个 :heart_hands:感谢你的回复

可以试试别的,比如 wake up

1 个赞


看起来很棒的软件

是可以,可以试试

感谢,我会尝试一下这种方法的

有个类似的需求,我是这么实现的,用的templater模板,大概得思路是这样的:

  1. 把课表展开成md表格,每一天是一行,每一列是第几节(这个可以直接用AI生成)
  2. 用templater读取该文件内容,匹配日记时间和新课表每一行时间
  3. 如果能匹配到,则读取这个表的表头和匹配到的这一行内容,形成一张新表
  4. 在日记模板里把这个代码放进去

原课表 → 查询特定文件夹下所有包含“课表”的文件,可以是不同课表文件下的表,也可以是同一文件下不同的表

image

查询结果 → 这里是按文件名的日期查找的

image

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.展开表格,直接匹配星期就可以了

课表

image

效果

image

代码

<%*

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 个赞

感谢感谢,抱歉这么晚看到才回复,最近学业有些繁忙,再次感谢
:heart_hands:

我之前不了解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" }] },
    ]
};