From 2e478de9b7bf4401205675f38fd3f8fec39f8162 Mon Sep 17 00:00:00 2001 From: xiangyu <3170102889@zju.edu.cn> Date: Thu, 2 Jun 2022 17:10:52 +0800 Subject: [PATCH] fix: export duplicate link --- src/Better Note Markdown.js | 2 +- src/knowledge.ts | 61 ++++++++++++++++++++++++++++--------- src/views.ts | 21 +++++++++++-- 3 files changed, 66 insertions(+), 18 deletions(-) diff --git a/src/Better Note Markdown.js b/src/Better Note Markdown.js index 6d407b7..6cc89e8 100644 --- a/src/Better Note Markdown.js +++ b/src/Better Note Markdown.js @@ -1722,7 +1722,7 @@ let bundle; } Zotero.debug(newFile); - img.setAttribute("src", newFile); + img.setAttribute("src", newFile ? newFile : oldFile); img.setAttribute("alt", "image"); } diff --git a/src/knowledge.ts b/src/knowledge.ts index ae47a23..07152e3 100644 --- a/src/knowledge.ts +++ b/src/knowledge.ts @@ -394,7 +394,11 @@ class Knowledge extends AddonBase { return openURI; } - async modifyLineInNote(note: ZoteroItem, text: string, lineIndex: number) { + async modifyLineInNote( + note: ZoteroItem, + text: string | Function, + lineIndex: number + ) { note = note || this.getWorkspaceNote(); if (!note) { return; @@ -403,7 +407,11 @@ class Knowledge extends AddonBase { if (lineIndex < 0 || lineIndex >= noteLines.length) { return; } - noteLines[lineIndex] = text; + if (typeof text === "string") { + noteLines[lineIndex] = text; + } else if (typeof text === "function") { + noteLines[lineIndex] = text(noteLines[lineIndex]); + } this.setLinesToNote(note, noteLines); await this.scrollWithRefresh(lineIndex); } @@ -745,6 +753,11 @@ class Knowledge extends AddonBase { if (convertNoteLinks) { let link = this.getLinkFromText(noteLines[i]); while (link) { + const params = this.getParamsFromLink(link); + if (params.ignore) { + Zotero.debug("ignore link"); + continue; + } Zotero.debug("convert link"); let res = await this.getNoteFromLink(link); const subNote = res.item; @@ -797,25 +810,45 @@ class Knowledge extends AddonBase { return link; } - async getNoteFromLink(uri: string) { - let [groupID, noteKey] = uri.substring("zotero://note/".length).split("/"); - - // User libraryID by defaultx - let libraryID = 1; - - if (groupID !== "u") { - // Not a user item - let _groupID = parseInt(groupID); - libraryID = Zotero.Groups.getLibraryIDFromGroupID(_groupID); + getLinkIndexFromText(text: string): [number, number] { + // Must end with " + const linkIndex = text.search(/zotero:\/\/note\//g); + if (linkIndex === -1) { + return [-1, -1]; } + let link = text.substring(linkIndex); + return [linkIndex, linkIndex + link.search('"')]; + } - if (!libraryID) { + getParamsFromLink(uri: string) { + uri = uri.split("//").pop(); + let params = { + libraryID: "", + noteKey: 0, + ignore: 0, + }; + const router = new Zotero.Router(params); + router.add("note/:libraryID/:noteKey", function () { + if (params.libraryID === "u") { + params.libraryID = Zotero.Libraries.userLibraryID; + } + }); + router.run(uri); + return params; + } + + async getNoteFromLink(uri: string) { + const params = this.getParamsFromLink(uri); + if (!params.libraryID) { return { item: false, infoText: "Library does not exist or access denied.", }; } - let item = await Zotero.Items.getByLibraryAndKeyAsync(libraryID, noteKey); + let item = await Zotero.Items.getByLibraryAndKeyAsync( + params.libraryID, + params.noteKey + ); if (!item || !item.isNote()) { return { item: false, diff --git a/src/views.ts b/src/views.ts index 047154a..423772d 100644 --- a/src/views.ts +++ b/src/views.ts @@ -388,10 +388,25 @@ class AddonViews extends AddonBase { alert(e); } newLines.push(_newLine); - await this._Addon.knowledge.addLinesToNote( + const newLineString = newLines.join("\n"); + await this._Addon.knowledge.modifyLineInNote( undefined, - newLines, - this._Addon.knowledge.currentLine + 1 + (oldLine: string) => { + Zotero.debug(oldLine); + const params = this._Addon.knowledge.getParamsFromLink(link); + if (!params.ignore) { + const newLink = + link + (link.includes("?") ? "&ignore=1" : "?ignore=1"); + const linkIndex = + this._Addon.knowledge.getLinkIndexFromText(oldLine); + Zotero.debug(linkIndex); + return `${oldLine.slice( + 0, + linkIndex[0] + )}${newLink}${oldLine.slice(linkIndex[1])}\n${newLineString}`; + } + }, + this._Addon.knowledge.currentLine ); await Zotero.DB.executeTransaction(async () => { await Zotero.Notes.copyEmbeddedImages(