aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/api.js2
-rw-r--r--ext/background.html2
-rw-r--r--ext/jp/api.js55
-rw-r--r--ext/jp/translator.js10
-rw-r--r--ext/jp/yomichan.js73
5 files changed, 84 insertions, 58 deletions
diff --git a/ext/api.js b/ext/api.js
index 6e9d6f4f..496f8be3 100644
--- a/ext/api.js
+++ b/ext/api.js
@@ -18,7 +18,7 @@
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) {
diff --git a/ext/background.html b/ext/background.html
index 09a21779..665bc968 100644
--- a/ext/background.html
+++ b/ext/background.html
@@ -5,6 +5,6 @@
<script src="jp/dictionary.js"></script>
<script src="jp/deinflector.js"></script>
<script src="jp/translator.js"></script>
- <script src="jp/api.js"></script>
+ <script src="jp/yomichan.js"></script>
</body>
</html>
diff --git a/ext/jp/api.js b/ext/jp/api.js
deleted file mode 100644
index 216b961f..00000000
--- a/ext/jp/api.js
+++ /dev/null
@@ -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);
-})();
diff --git a/ext/jp/translator.js b/ext/jp/translator.js
index aef20f19..7a610377 100644
--- a/ext/jp/translator.js
+++ b/ext/jp/translator.js
@@ -18,9 +18,17 @@
class Translator {
- constructor(paths, callback) {
+ constructor() {
this.dictionary = new Dictionary();
this.deinflector = new Deinflector();
+ this.initialized = false;
+ }
+
+ loadData(paths, callback) {
+ if (this.initialized) {
+ callback();
+ return;
+ }
const loaders = [];
for (const key of ['rules', 'edict', 'enamdict', 'kanjidic']) {
diff --git a/ext/jp/yomichan.js b/ext/jp/yomichan.js
new file mode 100644
index 00000000..5c2b579f
--- /dev/null
+++ b/ext/jp/yomichan.js
@@ -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();