add: Mathpix LaTex OCR

This commit is contained in:
xiangyu 2022-09-18 11:29:34 +08:00
parent 929019a408
commit 04b4486b56
6 changed files with 128 additions and 36 deletions

View File

@ -106,6 +106,12 @@
<menupopup id="menu_HelpPopup">
<menuseparator class="menu-betternotes" />
<menu id="menu_ocrsetting_betternotes" class="menu-betternotes" label="&zotero.__addonRef__.workspace.menu.OCRSetting;">
<menupopup id="menu_ocrsettingpopup" onpopupshowing="Zotero.Knowledge4Zotero.views.updateOCRStyleMenu();">
<menuitem id="menu_ocr_bing_betternotes" class="menu-betternotes" label="&zotero.__addonRef__.workspace.menu.OCRBing;" oncommand="Zotero.Knowledge4Zotero.events.onEditorEvent.bind(Zotero.Knowledge4Zotero.events)({type: 'setOCREngine', content: {params: {engine: 'bing'}}})" type="checkbox" />
<menuitem id="menu_ocr_mathpix_betternotes" class="menu-betternotes" label="&zotero.__addonRef__.workspace.menu.OCRMathpix;" oncommand="Zotero.Knowledge4Zotero.events.onEditorEvent.bind(Zotero.Knowledge4Zotero.events)({type: 'setOCREngine', content: {params: {engine: 'mathpix'}}})" type="checkbox" />
</menupopup>
</menu>
<menuitem id="menu_guide_betternotes menu-betternotes" label="&zotero.__addonRef__.workspace.menu.guide;" command="cmd_guide_betternotes" />
<menuitem id="menu_about_betternotes menu-betternotes" label="&zotero.__addonRef__.workspace.menu.about;" command="cmd_about_betternotes" />
</menupopup>

View File

@ -12,6 +12,9 @@
<!ENTITY zotero.__addonRef__.workspace.menu.insertItemTemplate "Insert Items Using Template">
<!ENTITY zotero.__addonRef__.workspace.menu.editTemplate "Note Template Editor">
<!ENTITY zotero.__addonRef__.workspace.menu.citeSetting "Citation Style in Notes">
<!ENTITY zotero.__addonRef__.workspace.menu.OCRSetting "Annotation Math OCR">
<!ENTITY zotero.__addonRef__.workspace.menu.OCRBing "Bing">
<!ENTITY zotero.__addonRef__.workspace.menu.OCRMathpix "Mathpix">
<!ENTITY zotero.__addonRef__.workspace.menu.addheading "Insert Heading...">
<!ENTITY zotero.__addonRef__.workspace.menu.indent "Decrease Heading Level">
<!ENTITY zotero.__addonRef__.workspace.menu.unindent "Increase Heading Level">

View File

@ -12,6 +12,9 @@
<!ENTITY zotero.__addonRef__.workspace.menu.insertItemTemplate "使用模板插入多个条目">
<!ENTITY zotero.__addonRef__.workspace.menu.editTemplate "笔记模板编辑器">
<!ENTITY zotero.__addonRef__.workspace.menu.citeSetting "笔记引用格式">
<!ENTITY zotero.__addonRef__.workspace.menu.OCRSetting "注释公式识别">
<!ENTITY zotero.__addonRef__.workspace.menu.OCRBing "Bing">
<!ENTITY zotero.__addonRef__.workspace.menu.OCRMathpix "Mathpix">
<!ENTITY zotero.__addonRef__.workspace.menu.addheading "插入标题...">
<!ENTITY zotero.__addonRef__.workspace.menu.indent "降低标题层级">
<!ENTITY zotero.__addonRef__.workspace.menu.unindent "提升标题层级">

View File

@ -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", "");

View File

@ -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"
);
}

View File

@ -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