[Note Template] 自定义模板求助:根据标签的层级汇总标注和笔记 #617
Replies: 6 comments
-
我解决了其中一个问题,我需要把异步函数 output += await Zotero.Knowledge4Zotero.NoteParse.parseAnnotationHTML(
topItem,
annotations
);
但是目前我还未解决一旦条目包含notes笔记时模板无法正常工作的问题。 |
Beta Was this translation helpful? Give feedback.
-
条目包含notes笔记时模板能够正在工作,是我的测试样例有问题。感谢作者大大提供这么好用的工具。 贴上最终效果和完整的模板供有需要的朋友使用和借鉴。 标注标签:效果:[Item] all annotations and notes by tag (sorted)// @beforeloop-begin
${(() => {
sharedObj.tagsDict = {};
sharedObj.updateData = (item, tag) => {
const levels = tag.split('/'); // 解析标签层级
let currentLevel = sharedObj.tagsDict;
levels.forEach((level, index) => {
if (!(level in currentLevel)) {
if (index === levels.length - 1) {
currentLevel[level] = { items: [] };
} else {
currentLevel[level] = {};
}
} else if (Array.isArray(currentLevel[level]) && index < levels.length - 1) {
currentLevel[level] = { items: currentLevel[level] };
}
if (index === levels.length - 1) {
if (!("items" in currentLevel[level])) {
currentLevel[level].items = [];
}
currentLevel[level].items.push(item);
} else {
currentLevel = currentLevel[level];
}
});
};
if (!editor) {
alert("No active note editor detected. Please open workspace.");
sharedObj.error = true;
}
return "";
})()}
// @beforeloop-end
// @default-begin
${await new Promise(async (r) => {
if (sharedObj.error) {
return;
}
if (topItem.isRegularItem()) {
const annotations = [];
const attachments = Zotero.Items.get(topItem.getAttachments()).filter((i) =>
i.isPDFAttachment()
);
attachments.forEach((i) => {
annotations.splice(0, 0, ...i.getAnnotations());
});
annotations.forEach((annotation) =>
annotation
.getTags()
.map((tag) => tag.tag)
.forEach((tag) => {
sharedObj.updateData(annotation, tag);
})
);
Zotero.Items.get(topItem.getNotes()).forEach((note) =>
note
.getTags()
.map((tag) => tag.tag)
.forEach((tag) => {
sharedObj.updateData(note, tag);
})
);
} else if (topItem.isNote()) {
topItem
.getTags()
.map((tag) => tag.tag)
.forEach((tag) => {
sharedObj.updateData(topItem, tag);
});
}
return r("");
})}
// @default-end
// @afterloop-begin
${await new Promise(async (r) => {
if (sharedObj.error) {
return;
}
let res = "";
async function processLevel(levelTags, level = 1) {
let output = "";
const sortedTags = Object.keys(levelTags).sort();
for (const tag of sortedTags) {
if (tag !== "items") {
output += `<h${level}>Tag: ${tag}</h${level}>\n`;
}
if ("items" in levelTags[tag]) {
const notes = levelTags[tag].items.filter((item) => item.isNote());
const annotations = levelTags[tag].items.filter((item) => item.isAnnotation());
for (const note of notes) {
output += `<p><a href="${Zotero.Knowledge4Zotero.knowledge.getNoteLink(
note
)}">${note.getNoteTitle()}</a></p>\n`;
}
output += await Zotero.Knowledge4Zotero.NoteParse.parseAnnotationHTML(
editor._item,
annotations
);
}
if (typeof levelTags[tag] === "object" && !Array.isArray(levelTags[tag])) {
output += await processLevel(levelTags[tag], level + 1);
}
}
return output;
}
res += await processLevel(sharedObj.tagsDict);
return r(res);
})}
// @afterloop-end |
Beta Was this translation helpful? Give feedback.
-
能不能按颜色分类 然后将带#标签放在笔记前 或者附着在笔记之后呢? |
Beta Was this translation helpful? Give feedback.
-
这个模板在新版本插件下已经不能用了。你说的需求我一般是手动插入两次模板。 |
Beta Was this translation helpful? Give feedback.
-
两次什么模板?能分享一下如何完成这个效果的吗?说不定找chatgpt可以把代码完善 |
Beta Was this translation helpful? Give feedback.
-
最近没有多余的精力修改代码,你可以自己尝试一下。我之前的用法是先用这个模板把标签笔记整理好,然后再插入按颜色分类的笔记。如果不追求按标签层级分类汇总的话,Discussions里应该都会有你想要的新版笔记模板。 |
Beta Was this translation helpful? Give feedback.
-
Template Type
Item
Desired Template Performance
我想要实现这样的效果
但是我没有接触过js语言,完全零基础,只能在chatgpt的帮助下对 #241 进行一些修改。
我在run javascript中调试模板是可以得到想要的输出,但是添加笔记模板运行后没有反应,几经修改后最多也只能显示目录,而无法显示注释。
除此之外还有一个问题,我的条目不能包含notes,一旦包含notes笔记模板也无反应。
希望作者大大能够给我一些指导,万分感谢!
下面是我的模板以及调试的代码。
当前模板使用后无反应,只能实现目录输出的模板没保存下来。
Current Template
当前调试代码
Beta Was this translation helpful? Give feedback.
All reactions