依然基于 @BryceAndJuly 大佬的 【分享】使用当前文档的二级标题快速制作闪卡,但是现在不需要手动输入了,可以自动获取当前文档的路径,然后在全部的卡包里进行匹配,匹配一个卡包的名字包括在当前文档路径里的卡包。
举例:卡包名为 test1、test2,当前文档路径为\a\test1\b,那么会自动添加卡片到 test1。
不要尝试 \a\test1\test2 的文档,因为我也不知道会发生什么:)
注意,因为目前获取路径的方法是从页面中读取,在添加卡片之前,需要将鼠标放在当前文档的选项卡上,确定路径已经加载完毕:
如果有更好的获取当前文档路径的方法,请一定告诉我。
使用说明:
前情提要:我已经提前建立了名为内容块的卡包。
另外,一个我写的时候未能想到的好消息:当前页面的嵌入块中的标记也能被添加到卡包中。
欢迎留言使用体验,或者告诉我代码还能怎么改进。
2023.2.2 更新:现在支持添加到多个卡组了,也就是说,卡包名为 test1、test2,当前文档路径为\a\test1\test2 时,会自动添加卡片到 test1、test2 卡组。
// 一键制卡 v0.2
// 请求函数
function request(url, data = null, method = "POST") {
return new Promise((resolve, reject) => {
if (method.toUpperCase() == "POST") {
fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
})
.then(
(data) => resolve(data.json()),
(error) => {
reject(error);
}
)
.catch((err) => {
console.error("请求失败:", err);
});
}
});
}
// 弹出提示信息
async function showMessage(msg) {
await request("/api/notification/pushMsg", { msg, timeout: 3000 });
}
// 添加多个卡片
async function addCards() {
//获取全部deck
let res = await request("/api/riff/getRiffDecks", {});
//获取当前打开文档的路径
let focusItem = document.querySelector("li[class='item item\\-\\-focus']");
focusItemPath = focusItem.getAttribute("aria-label");
if (focusItemPath === null) {
showMessage(`未能当前文档读取路径`);
return;
}
//获取deck.id, 其deck.name 包含在 focusItemPath 中
let customDeckIdArr = [];
Array.from(res.data).forEach((item) => {
let name = item.name;
if (focusItemPath.search(name) != -1) {
customDeckIdArr.push(item.id);
}
})
if (customDeckIdArr.length === 0) {
showMessage(`未能获取到:${focusItemPath} 的卡包`);
return;
} else if (customDeckIdArr.length > 0) {
// 获取需要被制成卡片的块的ID
const currentPage = document.querySelector(
".fn__flex-1.protyle:not(.fn__none)"
);
const markList = currentPage.querySelectorAll("span[data-type='mark']")
if (markList && markList.length > 0) {
let arr = [];
Array.from(markList).forEach((item) => {
let id = item.parentElement.parentElement.getAttribute("data-node-id");
if (id) {
arr.push(id);
}
})
// 去重
arr = [... new Set(arr)]
for (deckIndex in customDeckIdArr) {
// 把标记所在块全部制成卡片
let body = {
deckID: customDeckIdArr[deckIndex],
blockIDs: arr,
};
let res = await request("/api/riff/addRiffCards", body);
if (res.code === 0) {
showMessage(`${res.data.name}卡包的总卡片数:${res.data.size}`);
}
}
}
}
}
// 添加一个按钮
const barMode = document.getElementById("barMode");
barMode.insertAdjacentHTML(
"beforebegin",
'<div id="addCards" class="toolbar__item b3-tooltips b3-tooltips__se" aria-label="制作卡片" ></div>'
);
const addCardsBtn = document.getElementById("addCards");
addCardsBtn.style.width = "auto";
const addCardsBtnIcon = `<svg t="1674130669751" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4526" width="200" height="200"><path d="M928 160H96a32 32 0 0 0-32 32v672a32 32 0 0 0 32 32h832a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32z m-32 672H128V224h768v608z" p-id="4527" fill="#9aa0a6"></path><path d="M230.592 448.096H544a32 32 0 1 0 0-64H230.592a32 32 0 0 0 0 64zM230.592 640.096H544a32 32 0 1 0 0-64H230.592a32 32 0 1 0 0 64zM768 704a32 32 0 0 0 32-32V350.016a32 32 0 1 0-64 0V672a32 32 0 0 0 32 32z" p-id="4528" fill="#9aa0a6"></path></svg>`;
addCardsBtn.innerHTML = addCardsBtnIcon;
addCardsBtn.addEventListener(
"click",
(e) => {
addCards();
e.stopPropagation();
e.preventDefault();
},
true
);```
欢迎留言使用体验,或者告诉我代码还能怎么改进。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于