diff --git a/addon/chrome/content/overlay.xul b/addon/chrome/content/overlay.xul index 8914516..499fc4e 100644 --- a/addon/chrome/content/overlay.xul +++ b/addon/chrome/content/overlay.xul @@ -106,6 +106,12 @@ + + + + + + diff --git a/addon/chrome/locale/en-US/overlay.dtd b/addon/chrome/locale/en-US/overlay.dtd index 57be371..500dee9 100644 --- a/addon/chrome/locale/en-US/overlay.dtd +++ b/addon/chrome/locale/en-US/overlay.dtd @@ -12,6 +12,9 @@ + + + diff --git a/addon/chrome/locale/zh-CN/overlay.dtd b/addon/chrome/locale/zh-CN/overlay.dtd index 5cd1c61..6dbfec7 100644 --- a/addon/chrome/locale/zh-CN/overlay.dtd +++ b/addon/chrome/locale/zh-CN/overlay.dtd @@ -12,6 +12,9 @@ + + + diff --git a/addon/defaults/preferences/defaults.js b/addon/defaults/preferences/defaults.js index ecb7a0b..de75a80 100644 --- a/addon/defaults/preferences/defaults.js +++ b/addon/defaults/preferences/defaults.js @@ -10,3 +10,6 @@ pref("extensions.zotero.Knowledge4Zotero.embedLink", true); pref("extensions.zotero.Knowledge4Zotero.exportNote", false); pref("extensions.zotero.Knowledge4Zotero.exportCopy", false); pref("extensions.zotero.Knowledge4Zotero.exportPDF", false); +pref("extensions.zotero.Knowledge4Zotero.OCREngine", "bing"); +pref("extensions.zotero.Knowledge4Zotero.OCRMathpix.Appid", ""); +pref("extensions.zotero.Knowledge4Zotero.OCRMathpix.Appkey", ""); diff --git a/src/events.ts b/src/events.ts index 79b5bc0..c2a6a9d 100644 --- a/src/events.ts +++ b/src/events.ts @@ -1941,6 +1941,30 @@ class AddonEvents extends AddonBase { "Better Notes", "Image copied to clipboard." ); + } else if (message.type === "setOCREngine") { + /* + message.content = { + params: { engine: string } + } + */ + const engine = message.content.params.engine; + if (engine === "mathpix") { + Zotero.Prefs.set( + "Knowledge4Zotero.OCRMathpix.Appid", + prompt( + "Please input app_id", + Zotero.Prefs.get("Knowledge4Zotero.OCRMathpix.Appid") as string + ) + ); + Zotero.Prefs.set( + "Knowledge4Zotero.OCRMathpix.Appkey", + prompt( + "Please input app_key", + Zotero.Prefs.get("Knowledge4Zotero.OCRMathpix.Appkey") as string + ) + ); + } + Zotero.Prefs.set("Knowledge4Zotero.OCREngine", engine); } else if (message.type === "ocrImageAnnotation") { /* message.content = { @@ -1948,47 +1972,84 @@ class AddonEvents extends AddonBase { } */ const annotationItem: Zotero.Item = message.content.params.annotationItem; - const xhr = await Zotero.HTTP.request( - "POST", - "https://www.bing.com/cameraexp/api/v1/getlatex", - { - headers: { - "content-type": "application/json", - }, - body: JSON.stringify({ - data: message.content.params.src.split(",").pop(), - inputForm: "Image", - clientInfo: { platform: "edge" }, - }), - responseType: "json", - } - ); - if (xhr && xhr.status && xhr.status === 200) { - if (xhr.response.isError) { - this._Addon.views.showProgressWindow( - "Better Notes OCR", - xhr.response.errorMessage, - "fail" - ); + let result: string; + let success: boolean; + const engine = Zotero.Prefs.get("Knowledge4Zotero.OCREngine"); + if (engine === "mathpix") { + const xhr = await Zotero.HTTP.request( + "POST", + "https://api.mathpix.com/v3/text", + { + headers: { + "Content-Type": "application/json; charset=utf-8", + app_id: Zotero.Prefs.get("Knowledge4Zotero.OCRMathpix.Appid"), + app_key: Zotero.Prefs.get("Knowledge4Zotero.OCRMathpix.Appkey"), + }, + body: JSON.stringify({ + src: message.content.params.src, + math_inline_delimiters: ["$", "$"], + math_display_delimiters: ["$$", "$$"], + rm_spaces: true, + }), + responseType: "json", + } + ); + console.log(xhr); + if (xhr && xhr.status && xhr.status === 200 && xhr.response.text) { + result = xhr.response.text; + success = true; } else { - let ocrResult = xhr.response.latex - ? `$${xhr.response.latex.replace(/ /g, "")}$` - : xhr.response.ocrText; - annotationItem.annotationComment = `${ - annotationItem.annotationComment - ? `${annotationItem.annotationComment}\n` - : "" - }${ocrResult}`; - await annotationItem.saveTx(); - this._Addon.views.showProgressWindow( - "Better Notes OCR", - `OCR Result: ${ocrResult}` - ); + result = + xhr.status === 200 ? xhr.response.error : `${xhr.status} Error`; + success = false; } + } else if (engine === "bing") { + const xhr = await Zotero.HTTP.request( + "POST", + "https://www.bing.com/cameraexp/api/v1/getlatex", + { + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + data: message.content.params.src.split(",").pop(), + inputForm: "Image", + clientInfo: { platform: "edge" }, + }), + responseType: "json", + } + ); + if (xhr && xhr.status && xhr.status === 200 && !xhr.response.isError) { + result = xhr.response.latex + ? `$${xhr.response.latex}$` + : xhr.response.ocrText; + success = true; + } else { + result = + xhr.status === 200 + ? xhr.response.errorMessage + : `${xhr.status} Error`; + success = false; + } + } else { + result = "OCR Engine Not Found"; + success = false; + } + if (success) { + annotationItem.annotationComment = `${ + annotationItem.annotationComment + ? `${annotationItem.annotationComment}\n` + : "" + }${result}`; + await annotationItem.saveTx(); + this._Addon.views.showProgressWindow( + "Better Notes OCR", + `OCR Result: ${result}` + ); } else { this._Addon.views.showProgressWindow( "Better Notes OCR", - `${xhr.status} Error`, + result, "fail" ); } diff --git a/src/views.ts b/src/views.ts index 87bb443..9bd0d6d 100644 --- a/src/views.ts +++ b/src/views.ts @@ -939,6 +939,22 @@ class AddonViews extends AddonBase { }); } + updateOCRStyleMenu() { + Zotero.debug(`updateOCRStyleMenu`); + const popup = document.getElementById("menu_ocrsettingpopup"); + Array.prototype.forEach.call(popup.children, (e) => + e.setAttribute("checked", false) + ); + let engine = Zotero.Prefs.get("Knowledge4Zotero.OCREngine"); + if (!engine) { + engine = "bing"; + Zotero.Prefs.set("Knowledge4Zotero.OCREngine", engine); + } + ( + document.getElementById(`menu_ocr_${engine}_betternotes`) as XUL.Menuitem + ).setAttribute("checked", true); + } + updateWordCount() { const _window = this._Addon.knowledge.workspaceTabId ? window