Skip to content

Commit

Permalink
add: Xunfei OCR
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangyu committed Oct 4, 2022
1 parent e3dfe49 commit 27fbc1d
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 0 deletions.
1 change: 1 addition & 0 deletions addon/chrome/content/overlay.xul
Original file line number Diff line number Diff line change
Expand Up @@ -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" />
Expand Down
1 change: 1 addition & 0 deletions addon/chrome/locale/en-US/overlay.dtd
Original file line number Diff line number Diff line change
Expand Up @@ -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">
Expand Down
1 change: 1 addition & 0 deletions addon/chrome/locale/zh-CN/overlay.dtd
Original file line number Diff line number Diff line change
Expand Up @@ -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 "提升标题层级">
Expand Down
3 changes: 3 additions & 0 deletions addon/defaults/preferences/defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -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", "");
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
105 changes: 105 additions & 0 deletions src/events.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
const CryptoJS = require("crypto-js");
import Knowledge4Zotero from "./addon";
import { CopyHelper, EditorMessage } from "./base";
import AddonBase from "./module";
Expand Down Expand Up @@ -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") {
Expand Down Expand Up @@ -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",
Expand Down

0 comments on commit 27fbc1d

Please sign in to comment.