This commit is contained in:
Alex Yatskov 2016-03-26 14:16:21 -07:00
parent d38c5390ee
commit 12696d3e6b
5 changed files with 84 additions and 58 deletions

View File

@ -18,7 +18,7 @@
function sendMessage(action, data, callback) { function sendMessage(action, data, callback) {
window.chrome.runtime.sendMessage({action: action, data: data}, callback); chrome.runtime.sendMessage({action: action, data: data}, callback);
} }
function findTerm(text, callback) { function findTerm(text, callback) {

View File

@ -5,6 +5,6 @@
<script src="jp/dictionary.js"></script> <script src="jp/dictionary.js"></script>
<script src="jp/deinflector.js"></script> <script src="jp/deinflector.js"></script>
<script src="jp/translator.js"></script> <script src="jp/translator.js"></script>
<script src="jp/api.js"></script> <script src="jp/yomichan.js"></script>
</body> </body>
</html> </html>

View File

@ -1,55 +0,0 @@
/*
* Copyright (C) 2016 Alex Yatskov <alex@foosoft.net>
* Author: Alex Yatskov <alex@foosoft.net>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
function onFindTerm({term}) {
return window.trans.findTerm(term);
}
function onMessage(request, sender, callback) {
const {action, data} = request;
const handler = {
findTerm: onFindTerm
}[action];
if (handler !== null) {
const result = handler(data);
if (callback !== null) {
callback(result);
}
}
}
function onInit() {
chrome.runtime.onMessage.addListener(onMessage);
const res1 = window.trans.findTerm('食べられない');
const res2 = window.trans.findTerm('作られている');
}
(() => {
const res = {
rules: 'jp/data/rules.json',
edict: 'jp/data/edict.json',
enamdict: 'jp/data/enamdict.json',
kanjidic: 'jp/data/kanjidic.json'
};
window.trans = new Translator(res, onInit);
})();

View File

@ -18,9 +18,17 @@
class Translator { class Translator {
constructor(paths, callback) { constructor() {
this.dictionary = new Dictionary(); this.dictionary = new Dictionary();
this.deinflector = new Deinflector(); this.deinflector = new Deinflector();
this.initialized = false;
}
loadData(paths, callback) {
if (this.initialized) {
callback();
return;
}
const loaders = []; const loaders = [];
for (const key of ['rules', 'edict', 'enamdict', 'kanjidic']) { for (const key of ['rules', 'edict', 'enamdict', 'kanjidic']) {

73
ext/jp/yomichan.js Normal file
View File

@ -0,0 +1,73 @@
/*
* Copyright (C) 2016 Alex Yatskov <alex@foosoft.net>
* Author: Alex Yatskov <alex@foosoft.net>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class Yomichan {
constructor() {
this.translator = new Translator();
this.res = {
rules: 'jp/data/rules.json',
edict: 'jp/data/edict.json',
enamdict: 'jp/data/enamdict.json',
kanjidic: 'jp/data/kanjidic.json'
};
this.updateState('disabled');
chrome.runtime.onMessage.addListener(this.onMessage.bind(this));
chrome.browserAction.onClicked.addListener(this.onBrowserAction.bind(this));
}
onFindTerm({term}) {
return this.translator.findTerm(term);
}
onMessage(request, sender, callback) {
const {action, data} = request;
const handler = {
findTerm: this.onFindTerm
}[action];
if (handler !== null) {
const result = handler.call(this, data);
if (callback !== null) {
callback(result);
}
}
}
onBrowserAction(tab) {
switch (this.state) {
case 'disabled':
this.updateState('loading');
this.translator.loadData(this.res, () => this.updateState('enabled'));
break;
case 'enabled':
this.updateState('disabled');
break;
}
}
updateState(state) {
const text = {'disabled': '', 'enabled': 'on', 'loading': '...'}[state];
chrome.browserAction.setBadgeText({text: text});
this.state = state;
}
}
window.yomichan = new Yomichan();