zotero-better-notes/src/modules/reader.ts

106 lines
3.0 KiB
TypeScript

import { config } from "../../package.json";
import { ICONS } from "../utils/config";
import { getNoteLink, getNoteLinkParams } from "../utils/link";
import { addLineToNote } from "../utils/note";
export function registerReaderAnnotationButton() {
Zotero.Reader.registerEventListener(
"renderSidebarAnnotationHeader",
(event) => {
const { doc, append, params, reader } = event;
const annotationData = params.annotation;
append(
ztoolkit.UI.createElement(doc, "div", {
tag: "div",
classList: ["icon"],
properties: {
innerHTML: ICONS.readerQuickNote,
},
listeners: [
{
type: "click",
listener: (e) => {
createNoteFromAnnotation(
reader._item.libraryID,
annotationData.id,
(e as MouseEvent).shiftKey ? "builtin" : "auto",
);
e.preventDefault();
},
},
{
type: "mouseover",
listener: (e) => {
(e.target as HTMLElement).style.backgroundColor = "#F0F0F0";
},
},
{
type: "mouseout",
listener: (e) => {
(e.target as HTMLElement).style.removeProperty(
"background-color",
);
},
},
],
enableElementRecord: false,
}),
);
},
config.addonID,
);
}
async function createNoteFromAnnotation(
libraryID: number,
itemKey: string,
openMode: "builtin" | "auto" = "auto",
) {
const annotationItem = Zotero.Items.getByLibraryAndKey(
libraryID,
itemKey,
) as Zotero.Item;
if (!annotationItem) {
return;
}
const annotationTags = annotationItem.getTags().map((_) => _.tag);
const linkRegex = new RegExp("^zotero://note/(.*)$");
for (const tag of annotationTags) {
if (linkRegex.test(tag)) {
const linkParams = getNoteLinkParams(tag);
if (linkParams.noteItem) {
addon.hooks.onOpenNote(linkParams.noteItem.id, openMode, {
lineIndex: linkParams.lineIndex || undefined,
});
return;
} else {
annotationItem.removeTag(tag);
await annotationItem.saveTx();
}
}
}
const note: Zotero.Item = new Zotero.Item("note");
note.libraryID = annotationItem.libraryID;
note.parentID = annotationItem.parentItem!.parentID;
await note.saveTx();
const renderredTemplate = await addon.api.template.runTemplate(
"[QuickNoteV5]",
"annotationItem, topItem, noteItem",
[annotationItem, annotationItem.parentItem!.parentItem, note],
);
await addLineToNote(note, renderredTemplate);
const tags = annotationItem.getTags();
for (const tag of tags) {
note.addTag(tag.tag, tag.type);
}
await note.saveTx();
ZoteroPane.openNoteWindow(note.id);
annotationItem.addTag(getNoteLink(note)!);
await annotationItem.saveTx();
}