-
Notifications
You must be signed in to change notification settings - Fork 0
/
offlinedictionary.user.js
95 lines (85 loc) · 3.25 KB
/
offlinedictionary.user.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
// ==UserScript==
// @name offline dictionary
// @version 1
// @include *
// @grant GM.getResourceUrl
// @require https://raw.githubusercontent.com/nodeca/pako/master/dist/pako.min.js
// @require https://raw.githubusercontent.com/HalfdogStudio/offlinedictionary/master/dictzip.js
// @require https://raw.githubusercontent.com/HalfdogStudio/offlinedictionary/master/stardict.js
// @resource dict https://raw.githubusercontent.com/yanyingwang/goldendict/master/dictdd/stardict-langdao-ec-gb-2.4.2/langdao-ec-gb.dict.dz
// @resource idx https://raw.githubusercontent.com/yanyingwang/goldendict/master/dictdd/stardict-langdao-ec-gb-2.4.2/langdao-ec-gb.idx
// @resource ifo https://raw.githubusercontent.com/yanyingwang/goldendict/master/dictdd/stardict-langdao-ec-gb-2.4.2/langdao-ec-gb.ifo
// ==/UserScript==
console.log("----offline dictionary start------");
function handleReject(e) {
console.log(e)
}
async function resourceToFile(resource, fileName){
let url = await GM.getResourceUrl(resource).catch(handleReject);
console.log(url)
let theBlob = await fetch(url).then(r => r.blob()).catch(handleReject)
//A Blob() is almost a File() - it's just missing the two properties below which we will add
theBlob.lastModifiedDate = new Date();
theBlob.name = fileName;
return theBlob;
}
async function loadDict() {
return Promise.all([
resourceToFile('dict', "dict.dict.dz"),
resourceToFile('idx', "dict.idx"),
resourceToFile('ifo', "dict.ifo"),
]).then((files) => {
// files.forEach(f => {
// f.text().then(t => {
// })
// })
// console.log("resources: ", files)
dict = new StarDict()
window.__DICT__ = dict
return dict.load(files)
})
};
loadDict().then(_ => {
// console.log(window.__DICT__)
return window.__DICT__.index()
.then(index => {
console.log('--------------')
console.log(index)
console.log('--------------')
window.__INDEX__ = index.reduce((map, obj) => {
map[obj.term] = obj.dictpos;
return map
}, {})
console.log('ready');
})
.catch(handleReject)
}).then(_ => {
pos = window.__INDEX__['hello']
return window.__DICT__.entry(pos).then(entry => {
console.log(entry)
})
})
.catch(handleReject)
async function translate(e) {
//console.log("translate start");
var selectObj = document.getSelection();
if (selectObj.anchorNode && selectObj.anchorNode.nodeType == 3) {
var word = selectObj.toString();
if (word == "") {
return;
}
// linebreak wordwrap, optimize for pdf.js
word = word.replace('-\n','');
// multiline selection, optimize for pdf.js
word = word.replace('\n', ' ');
}
pos = window.__INDEX__[word]
console.log("search: ", word)
let entry = await window.__DICT__.entry(pos).then(entry=> {
// console.log(entry)
return entry
}).catch(handleReject)
alert(entry[0].content)
}
window.document.body.addEventListener("mouseup", translate, false);
console.log("----offline dictionary end----");