From d95ffdfe4ff0fd817879af465903b0697aa79ba2 Mon Sep 17 00:00:00 2001 From: xiangyu <3170102889@zju.edu.cn> Date: Tue, 12 Jul 2022 15:11:52 +0800 Subject: [PATCH] fix: link popup buttons disapper --- addon/chrome/content/overlay.xul | 4 + addon/chrome/content/workspace.xul | 4 + addon/chrome/locale/en-US/overlay.dtd | 2 + addon/chrome/locale/zh-CN/overlay.dtd | 2 + src/events.ts | 109 +++++++++++++++++--------- src/knowledge.ts | 24 ------ src/views.ts | 18 ++++- 7 files changed, 99 insertions(+), 64 deletions(-) diff --git a/addon/chrome/content/overlay.xul b/addon/chrome/content/overlay.xul index 39014c0..b6f9ac6 100644 --- a/addon/chrome/content/overlay.xul +++ b/addon/chrome/content/overlay.xul @@ -37,6 +37,8 @@ + @@ -80,6 +82,8 @@ + diff --git a/addon/chrome/content/workspace.xul b/addon/chrome/content/workspace.xul index 2dec741..e2409ab 100644 --- a/addon/chrome/content/workspace.xul +++ b/addon/chrome/content/workspace.xul @@ -47,6 +47,8 @@ + @@ -87,6 +89,8 @@ + diff --git a/addon/chrome/locale/en-US/overlay.dtd b/addon/chrome/locale/en-US/overlay.dtd index 1ead6c0..f87a3ac 100644 --- a/addon/chrome/locale/en-US/overlay.dtd +++ b/addon/chrome/locale/en-US/overlay.dtd @@ -15,6 +15,8 @@ + + diff --git a/addon/chrome/locale/zh-CN/overlay.dtd b/addon/chrome/locale/zh-CN/overlay.dtd index 269732b..3b8c54d 100644 --- a/addon/chrome/locale/zh-CN/overlay.dtd +++ b/addon/chrome/locale/zh-CN/overlay.dtd @@ -15,6 +15,8 @@ + + diff --git a/src/events.ts b/src/events.ts index 8a622c9..d6ae92e 100644 --- a/src/events.ts +++ b/src/events.ts @@ -708,38 +708,6 @@ class AddonEvents extends AddonBase { header.innerHTML = "Main Note"; header.setAttribute("style", "font-size: medium"); middle.append(header); - - // Link popup listener - const container = - _window.document.getElementsByClassName("relative-container")[0]; - const containerObserver = new MutationObserver(async (mutations) => { - for (const mut of mutations) { - for (const node of mut.addedNodes) { - // wait for ui ready - await Zotero.Promise.delay(20); - const linkElement = (node as Element).getElementsByTagName( - "a" - )[0]; - if (!linkElement) { - return; - } - const linkObserver = new MutationObserver(async (linkMuts) => { - this._Addon.views.updateEditorPopupButtons( - _window, - linkElement.getAttribute("href") - ); - }); - linkObserver.observe(linkElement, { attributes: true }); - this._Addon.views.updateEditorPopupButtons( - _window, - linkElement.getAttribute("href") - ); - } - } - }); - containerObserver.observe(container, { - childList: true, - }); } else { // This is a preview knowledge, hide openWorkspace button add show close botton this._Addon.views.changeEditorButtonView( @@ -998,8 +966,9 @@ class AddonEvents extends AddonBase { Zotero.Prefs.get("Knowledge4Zotero.mainKnowledgeID") ) { // Update current line index - let selection = - message.content.editorInstance._iframeWindow.document.getSelection(); + const _window = message.content.editorInstance._iframeWindow; + const selection = _window.document.getSelection(); + const realElement = selection.focusNode.parentElement; let focusNode = selection.focusNode as XUL.Element; if (!focusNode) { return; @@ -1044,9 +1013,7 @@ class AddonEvents extends AddonBase { if (diveTagNames.includes(focusNode.tagName)) { const eleList = this._Addon.parse.parseListElements(focusNode); for (const i in eleList) { - if ( - selection.focusNode.parentElement.parentElement === eleList[i] - ) { + if (realElement.parentElement === eleList[i]) { currentLineIndex += Number(i); break; } @@ -1055,6 +1022,32 @@ class AddonEvents extends AddonBase { Zotero.debug(`Knowledge4Zotero: line ${currentLineIndex} selected.`); console.log(currentLineIndex); this._Addon.knowledge.currentLine = currentLineIndex; + if (realElement.tagName === "A") { + let link = (realElement as HTMLLinkElement).href; + let linkedNote = (await this._Addon.knowledge.getNoteFromLink(link)) + .item; + if (linkedNote) { + let t = 0; + let linkPopup = _window.document.querySelector(".link-popup"); + while ( + !(linkPopup && linkPopup.querySelector("a").href === link) && + t < 100 + ) { + t += 1; + linkPopup = _window.document.querySelector(".link-popup"); + await Zotero.Promise.delay(30); + } + this._Addon.views.updateEditorPopupButtons( + message.content.editorInstance._iframeWindow, + link + ); + } else { + this._Addon.views.updateEditorPopupButtons( + message.content.editorInstance._iframeWindow, + undefined + ); + } + } } } else if (message.type === "addHeading") { /* @@ -1140,6 +1133,48 @@ class AddonEvents extends AddonBase { -1, node.model.lineIndex ); + } else if (message.type === "importLink") { + /* + message.content = {} + */ + // let newLines = []; + // const convertResult = await this._Addon.knowledge.convertNoteLines( + // note, + // [], + // true, + // false + // ); + // const subNoteLines = convertResult.lines; + // const templateText = await this._Addon.template.renderTemplateAsync( + // "[QuickImport]", + // "subNoteLines, subNoteItem, noteItem", + // [subNoteLines, note, this._Addon.knowledge.getWorkspaceNote()] + // ); + // newLines.push(templateText); + // const newLineString = newLines.join("\n"); + // await this._Addon.knowledge.modifyLineInNote( + // undefined, + // (oldLine: string) => { + // Zotero.debug(oldLine); + // const params = this._Addon.parse.parseParamsFromLink(link); + // if (!params.ignore) { + // const newLink = + // link + (link.includes("?") ? "&ignore=1" : "?ignore=1"); + // const linkIndex = this._Addon.parse.parseLinkIndexInText(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( + // note, + // this._Addon.knowledge.getWorkspaceNote() + // ); + // }); } else if (message.type === "updateAutoAnnotation") { /* message.content = { diff --git a/src/knowledge.ts b/src/knowledge.ts index efb9493..06018ce 100644 --- a/src/knowledge.ts +++ b/src/knowledge.ts @@ -293,29 +293,6 @@ class Knowledge extends AddonBase { } } - // Abandoned - async addLinesToNote( - note: ZoteroItem, - newLines: string[], - lineIndex: number - ) { - note = note || this.getWorkspaceNote(); - if (!note) { - return; - } - let noteLines = this.getLinesInNote(note); - if (lineIndex < 0) { - lineIndex = - this.getWorkspaceNote().id === note.id && this.currentLine >= 0 - ? this.currentLine - : noteLines.length; - } else if (lineIndex >= noteLines.length) { - lineIndex = noteLines.length; - } - await this.addLineToNote(note, newLines.join("\n"), lineIndex); - await this.scrollWithRefresh(lineIndex); - } - _dataURLtoBlob(dataurl: string) { let parts = dataurl.split(","); let mime = parts[0].match(/:(.*?);/)[1]; @@ -545,7 +522,6 @@ class Knowledge extends AddonBase { .replace(headerStopReg, ``), lineIndex ); - await this.scrollWithRefresh(lineIndex); } moveHeaderLineInNote( diff --git a/src/views.ts b/src/views.ts index 46cbe21..174d15f 100644 --- a/src/views.ts +++ b/src/views.ts @@ -381,8 +381,10 @@ class AddonViews extends AddonBase { } async updateEditorPopupButtons(_window: Window, link: string) { - const note: ZoteroItem = (await this._Addon.knowledge.getNoteFromLink(link)) - .item; + const note: ZoteroItem = link + ? (await this._Addon.knowledge.getNoteFromLink(link)).item + : undefined; + // If the note is invalid, we remove the buttons if (note) { let insertButton = _window.document.getElementById("insert-note-link"); if (insertButton) { @@ -519,8 +521,18 @@ class AddonViews extends AddonBase { ); }); _window.document - .getElementsByClassName("link-popup")[0] + .querySelector(".link-popup") .append(insertButton, updateButton); + } else { + const insertLink = _window.document.querySelector("#insert-note-link"); + if (insertLink) { + insertLink.remove(); + } + + const updateLink = _window.document.querySelector("#update-note-link"); + if (updateLink) { + updateLink.remove(); + } } }