-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
122 lines (101 loc) · 2.83 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
const { default: rst } = require("restructured")
const axios = require("axios")
const axios_rate_limit = require("axios-rate-limit")
const crypto = require("crypto")
const qs = require("querystring")
const dotenv = require("dotenv")
dotenv.config()
axios.ins = {
baidu_fanyi: axios_rate_limit(axios.create(), { maxRPS: 1 }),
deepl_jsonrpc: axios_rate_limit(axios.create(), { maxRPS: 1 }),
deepl: axios_rate_limit(axios.create(), { maxRPS: 1 })
}
const components = {
parse: {
seikichi: text => rst.parse(text)
},
process: {
complete: node => {
const promises = []
if (use("filter_work")(node))
promises[0] = use("work")(node)
if (node.children && use("filter_process")(node))
promises.push(...node.children?.map(child => use("process")(child)).flat())
return promises
}
},
filter_process: {
default: node =>
node.directive !== "toctree" &&
node.type !== "literal_block"
},
filter_work: {
default: node => node.type === "text" && node.value.trim()
},
work: {
deepl: async node => {
const data = {
text: node.value,
source_lang: "EN",
target_lang: "ZH",
auth_key: process.env.deepl_key,
}
const res = await axios.ins.deepl
.post("https://api-free.deepl.com/v2/translate", qs.stringify(data))
if (res.data.err_code) process.stderr.write(`[ERROR] ${res.data}\n`)
node.value = res.data.translations[0].text
},
deepl_jsonrpc: async node => {
const data = {
text: node.value,
source_lang: "EN",
target_lang: "ZH",
}
const res = await axios.ins.deepl_jsonrpc
.post("https://deepl.lgf.im/translate", data)
if (res.data.err_code) process.stderr.write(`[ERROR] ${res.data}\n`)
node.value = res.data.result
},
baidu_fanyi: async node => {
const salt = Date.now()
const { BAIDU_FANYI_APPID: appid, BAIDU_FANYI_SECRET: secret } = process.env
const sign = crypto.createHash("md5").update(appid + node.value + salt + secret).digest("hex")
const params = {
q: node.value,
from: "en", to: "zh",
appid, salt, sign
}
const res = await axios.ins.baidu_fanyi
.get("http://fanyi-api.baidu.com/api/trans/vip/translate", { params })
if (res.data.err_code) process.stderr.write(`[ERROR] ${res.data}\n`)
node.value = res.data.trans_result[0].dst
}
},
render: {
json: data => {
return JSON.stringify(data, null, 2)
},
rst: data => {
// TODO: 塞回去呗
}
}
}
const use = name => components[name][components.names[name]]
const pipe = names => {
components.names = names
process.stdin.on("data", async input => {
const data = use("parse") (input.toString())
await Promise.all(use("process") (data))
process.stdout.write(
use("render") (data)
)
})
}
pipe({
parse: "seikichi",
process: "complete",
filter_work: "default",
filter_process: "default",
work: "deepl",
render: "json"
})