add: Xunfei OCR
This commit is contained in:
parent
e3dfe49aaa
commit
27fbc1df12
|
|
@ -110,6 +110,7 @@
|
|||
<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" />
|
||||
<menuitem id="menu_ocr_xunfei_betternotes" class="menu-betternotes" label="&zotero.__addonRef__.workspace.menu.OCRXunfei;" oncommand="Zotero.Knowledge4Zotero.events.onEditorEvent.bind(Zotero.Knowledge4Zotero.events)({type: 'setOCREngine', content: {params: {engine: 'xunfei'}}})" type="checkbox" />
|
||||
</menupopup>
|
||||
</menu>
|
||||
<menuitem id="menu_guide_betternotes menu-betternotes" label="&zotero.__addonRef__.workspace.menu.guide;" command="cmd_guide_betternotes" />
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
<!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.OCRXunfei "Xunfei">
|
||||
<!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">
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
<!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.OCRXunfei "讯飞">
|
||||
<!ENTITY zotero.__addonRef__.workspace.menu.addheading "插入标题...">
|
||||
<!ENTITY zotero.__addonRef__.workspace.menu.indent "降低标题层级">
|
||||
<!ENTITY zotero.__addonRef__.workspace.menu.unindent "提升标题层级">
|
||||
|
|
|
|||
|
|
@ -14,3 +14,6 @@ pref("extensions.zotero.Knowledge4Zotero.exportPDF", false);
|
|||
pref("extensions.zotero.Knowledge4Zotero.OCREngine", "bing");
|
||||
pref("extensions.zotero.Knowledge4Zotero.OCRMathpix.Appid", "");
|
||||
pref("extensions.zotero.Knowledge4Zotero.OCRMathpix.Appkey", "");
|
||||
pref("extensions.zotero.Knowledge4Zotero.OCRXunfei.APPID", "");
|
||||
pref("extensions.zotero.Knowledge4Zotero.OCRMathpix.APISecret", "");
|
||||
pref("extensions.zotero.Knowledge4Zotero.OCRMathpix.APIKey", "");
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
"@syncfusion/ej2-navigations": "^20.1.51",
|
||||
"asciidoctor": "^2.2.6",
|
||||
"compressing": "^1.5.1",
|
||||
"crypto-js": "^4.1.1",
|
||||
"esbuild": "^0.14.34",
|
||||
"replace-in-file": "^6.3.2",
|
||||
"seedrandom": "^3.0.5",
|
||||
|
|
|
|||
105
src/events.ts
105
src/events.ts
|
|
@ -1,3 +1,4 @@
|
|||
const CryptoJS = require("crypto-js");
|
||||
import Knowledge4Zotero from "./addon";
|
||||
import { CopyHelper, EditorMessage } from "./base";
|
||||
import AddonBase from "./module";
|
||||
|
|
@ -2067,6 +2068,28 @@ class AddonEvents extends AddonBase {
|
|||
Zotero.Prefs.get("Knowledge4Zotero.OCRMathpix.Appkey") as string
|
||||
)
|
||||
);
|
||||
} else if (engine === "xunfei") {
|
||||
Zotero.Prefs.set(
|
||||
"Knowledge4Zotero.OCRXunfei.APPID",
|
||||
prompt(
|
||||
"Please input APPID",
|
||||
Zotero.Prefs.get("Knowledge4Zotero.OCRXunfei.APPID") as string
|
||||
)
|
||||
);
|
||||
Zotero.Prefs.set(
|
||||
"Knowledge4Zotero.OCRXunfei.APISecret",
|
||||
prompt(
|
||||
"Please input APISecret",
|
||||
Zotero.Prefs.get("Knowledge4Zotero.OCRXunfei.APISecret") as string
|
||||
)
|
||||
);
|
||||
Zotero.Prefs.set(
|
||||
"Knowledge4Zotero.OCRXunfei.APIKey",
|
||||
prompt(
|
||||
"Please input APIKey",
|
||||
Zotero.Prefs.get("Knowledge4Zotero.OCRXunfei.APIKey") as string
|
||||
)
|
||||
);
|
||||
}
|
||||
Zotero.Prefs.set("Knowledge4Zotero.OCREngine", engine);
|
||||
} else if (message.type === "ocrImageAnnotation") {
|
||||
|
|
@ -2107,6 +2130,88 @@ class AddonEvents extends AddonBase {
|
|||
xhr.status === 200 ? xhr.response.error : `${xhr.status} Error`;
|
||||
success = false;
|
||||
}
|
||||
} else if (engine === "xunfei") {
|
||||
/**
|
||||
* 1.Doc:https://www.xfyun.cn/doc/words/formula-discern/API.html
|
||||
* 2.Error code:https://www.xfyun.cn/document/error-code
|
||||
* @author iflytek
|
||||
*/
|
||||
|
||||
const config = {
|
||||
hostUrl: "https://rest-api.xfyun.cn/v2/itr",
|
||||
host: "rest-api.xfyun.cn",
|
||||
appid: Zotero.Prefs.get("Knowledge4Zotero.OCRXunfei.APPID"),
|
||||
apiSecret: Zotero.Prefs.get("Knowledge4Zotero.OCRXunfei.APISecret"),
|
||||
apiKey: Zotero.Prefs.get("Knowledge4Zotero.OCRXunfei.APIKey"),
|
||||
uri: "/v2/itr",
|
||||
};
|
||||
|
||||
let date = new Date().toUTCString();
|
||||
let postBody = getPostBody();
|
||||
let digest = getDigest(postBody);
|
||||
|
||||
const xhr = await Zotero.HTTP.request("POST", config.hostUrl, {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Accept: "application/json,version=1.0",
|
||||
Host: config.host,
|
||||
Date: date,
|
||||
Digest: digest,
|
||||
Authorization: getAuthStr(date, digest),
|
||||
},
|
||||
body: JSON.stringify(postBody),
|
||||
responseType: "json",
|
||||
});
|
||||
|
||||
if (xhr?.response?.code === 0) {
|
||||
result = xhr.response.data.region
|
||||
.filter((r) => r.type === "text")
|
||||
.map((r) => r.recog.content)
|
||||
.join(" ")
|
||||
.replace(/ifly-latex-(begin)?(end)?/g, "$");
|
||||
console.log(xhr);
|
||||
success = true;
|
||||
} else {
|
||||
result =
|
||||
xhr.status === 200
|
||||
? `${xhr.response.code} ${xhr.response.message}`
|
||||
: `${xhr.status} Error`;
|
||||
success = false;
|
||||
}
|
||||
|
||||
function getPostBody() {
|
||||
let digestObj = {
|
||||
common: {
|
||||
app_id: config.appid,
|
||||
},
|
||||
business: {
|
||||
ent: "teach-photo-print",
|
||||
aue: "raw",
|
||||
},
|
||||
data: {
|
||||
image: message.content.params.src.split(",").pop(),
|
||||
},
|
||||
};
|
||||
return digestObj;
|
||||
}
|
||||
|
||||
function getDigest(body) {
|
||||
return (
|
||||
"SHA-256=" +
|
||||
CryptoJS.enc.Base64.stringify(CryptoJS.SHA256(JSON.stringify(body)))
|
||||
);
|
||||
}
|
||||
|
||||
function getAuthStr(date, digest) {
|
||||
let signatureOrigin = `host: ${config.host}\ndate: ${date}\nPOST ${config.uri} HTTP/1.1\ndigest: ${digest}`;
|
||||
let signatureSha = CryptoJS.HmacSHA256(
|
||||
signatureOrigin,
|
||||
config.apiSecret
|
||||
);
|
||||
let signature = CryptoJS.enc.Base64.stringify(signatureSha);
|
||||
let authorizationOrigin = `api_key="${config.apiKey}", algorithm="hmac-sha256", headers="host date request-line digest", signature="${signature}"`;
|
||||
return authorizationOrigin;
|
||||
}
|
||||
} else if (engine === "bing") {
|
||||
const xhr = await Zotero.HTTP.request(
|
||||
"POST",
|
||||
|
|
|
|||
Loading…
Reference in New Issue