add: Mathpix LaTex OCR
This commit is contained in:
parent
929019a408
commit
04b4486b56
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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 "提升标题层级">
|
||||
|
|
|
|||
|
|
@ -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", "");
|
||||
|
|
|
|||
133
src/events.ts
133
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"
|
||||
);
|
||||
}
|
||||
|
|
|
|||
16
src/views.ts
16
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
|
||||
|
|
|
|||
Loading…
Reference in New Issue