japanese-conjugation-drill/conjugation/drill.js

1042 lines
39 KiB
JavaScript
Raw Normal View History

2016-11-22 00:22:00 +00:00
// drill.js
var vowelPart = {
"あ": "あ", "い": "い", "う": "う", "え": "え", "お": "お",
"か": "あ", "き": "い", "く": "う", "け": "え", "こ": "お",
"さ": "あ", "し": "い", "す": "う", "せ": "え", "そ": "お",
"た": "あ", "ち": "い", "つ": "う", "て": "え", "と": "お",
"な": "あ", "に": "い", "ぬ": "う", "ね": "え", "の": "お",
"は": "あ", "ひ": "い", "ふ": "う", "へ": "え", "ほ": "お",
"ま": "あ", "み": "い", "む": "う", "め": "え", "も": "お",
"や": "あ", "ゆ": "う", "よ": "お",
"ら": "あ", "り": "い", "る": "う", "れ": "え", "ろ": "お",
"わ": "あ", "を": "お",
"が": "あ", "ぎ": "い", "ぐ": "う", "げ": "え", "ご": "お",
"ざ": "あ", "じ": "い", "ず": "う", "ぜ": "え", "ぞ": "お",
"だ": "あ", "ぢ": "い", "づ": "う", "で": "え", "ど": "お",
"ば": "あ", "び": "い", "ぶ": "う", "べ": "え", "ぼ": "お",
"ぱ": "あ", "ぴ": "い", "ぷ": "う", "ぺ": "え", "ぽ": "お"
};
var consonantPart = {
"あ": "あ", "い": "あ", "う": "あ", "え": "あ", "お": "あ",
"か": "か", "き": "か", "く": "か", "け": "か", "こ": "か",
"さ": "さ", "し": "さ", "す": "さ", "せ": "さ", "そ": "さ",
"た": "た", "ち": "た", "つ": "た", "て": "た", "と": "た",
"な": "な", "に": "な", "ぬ": "な", "ね": "な", "の": "な",
"は": "は", "ひ": "は", "ふ": "は", "へ": "は", "ほ": "は",
"ま": "ま", "み": "ま", "む": "ま", "め": "ま", "も": "ま",
"や": "や", "ゆ": "や", "よ": "や",
"ら": "ら", "り": "ら", "る": "ら", "れ": "ら", "ろ": "ら",
"わ": "わ", "を": "わ",
"ん": "ん",
"が": "が", "ぎ": "が", "ぐ": "が", "げ": "が", "ご": "が",
"ざ": "ざ", "じ": "ざ", "ず": "ざ", "ぜ": "ざ", "ぞ": "ざ",
"だ": "だ", "ぢ": "だ", "づ": "だ", "で": "だ", "ど": "だ",
"ば": "ば", "び": "ば", "ぶ": "ば", "べ": "ば", "ぼ": "ば",
"ぱ": "ぱ", "ぴ": "ぱ", "ぷ": "ぱ", "ぺ": "ぱ", "ぽ": "ぱ"
};
var combineParts = {
"ああ": "あ", "あい": "い", "あう": "う", "あえ": "え", "あお": "お",
"かあ": "か", "かい": "き", "かう": "く", "かえ": "け", "かお": "こ",
"さあ": "さ", "さい": "し", "さう": "す", "さえ": "せ", "さお": "そ",
"たあ": "た", "たい": "ち", "たう": "つ", "たえ": "て", "たお": "と",
"なあ": "な", "ない": "に", "なう": "ぬ", "なえ": "ね", "なお": "の",
"はあ": "は", "はい": "ひ", "はう": "ふ", "はえ": "へ", "はお": "ほ",
"まあ": "ま", "まい": "み", "まう": "む", "まえ": "め", "まお": "も",
"やあ": "や", "やう": "ゆ", "やお": "よ",
"らあ": "ら", "らい": "り", "らう": "る", "らえ": "れ", "らお": "ろ",
"わあ": "わ", "わお": "を",
"があ": "が", "がい": "ぎ", "がう": "ぐ", "がえ": "げ", "がお": "ご",
"ざあ": "ざ", "ざい": "じ", "ざう": "ず", "ざえ": "ぜ", "ざお": "ぞ",
"だあ": "だ", "だい": "ぢ", "だう": "づ", "だえ": "で", "だお": "ど",
"ばあ": "ば", "ばい": "び", "ばう": "ぶ", "ばえ": "べ", "ばお": "ぼ",
"ぱあ": "ぱ", "ぱい": "ぴ", "ぱう": "ぷ", "ぱえ": "ぺ", "ぱお": "ぽ"
};
var words = [
{
"pos" : "verb",
"english": "to eat",
"word": "食[た]べる",
2016-11-22 00:22:00 +00:00
},
{
"pos": "verb",
"english": "to drink",
"word": "飲[の]む",
2016-11-22 00:22:00 +00:00
},
2016-11-23 17:39:23 +00:00
{
"pos": "verb",
"english": "to make",
"word": "作[つく]る",
2016-11-23 17:39:23 +00:00
},
{
"pos": "verb",
"english": "to add",
"word": "足[た]す",
2016-11-23 17:39:23 +00:00
},
{
"pos": "verb",
"english": "to see",
"word": "見[み]る",
2016-11-23 17:39:23 +00:00
},
{
"pos": "verb",
"english": "to rest",
"word": "休[やす]む",
2016-11-23 17:39:23 +00:00
},
{
"pos": "verb",
"english": "to sing",
"word": "歌[うた]う",
2016-11-23 17:39:23 +00:00
},
2016-11-22 00:22:00 +00:00
{
"pos": "verb",
"english": "to sit",
"word": "座[すわ]る",
2016-11-22 00:22:00 +00:00
},
{
"pos": "verb",
"english": "to buy as a gift",
"word": "買[か]い与[あた]える",
2016-11-22 00:22:00 +00:00
},
{
"pos": "verb",
"english": "to buy as a replacement",
"word": "買[か]い換[か]える",
2016-12-10 01:10:03 +00:00
},
2016-11-22 00:22:00 +00:00
2016-12-10 01:10:03 +00:00
{
"pos": "verb",
"english": "to buy back",
"word": "買[か]い戻[もど]す",
2016-12-10 01:10:03 +00:00
},
2016-11-22 00:22:00 +00:00
2016-12-10 01:10:03 +00:00
{
"pos": "verb",
"english": "to think",
"word": "思[おも]う",
2016-12-10 01:10:03 +00:00
},
2016-11-22 00:22:00 +00:00
2016-12-10 01:10:03 +00:00
{
"pos": "verb",
"english": "to go",
"word": "行[い]く",
2016-12-10 01:10:03 +00:00
},
2016-11-22 00:22:00 +00:00
2016-12-10 01:10:03 +00:00
{
"pos": "verb",
"english": "to read",
"word": "読[よ]む",
2016-12-10 01:10:03 +00:00
},
2016-11-22 00:22:00 +00:00
2016-12-10 01:10:03 +00:00
{
"pos": "verb",
"english": "to wake up",
"word": "起[お]きる",
2016-12-10 01:10:03 +00:00
},
];
2016-11-22 00:22:00 +00:00
2016-12-10 01:10:03 +00:00
var log = { "history": [] };
2016-11-22 00:22:00 +00:00
2016-12-10 01:10:03 +00:00
Array.prototype.randomElement = function () {
return this[Math.floor(Math.random() * this.length)]
}
2016-11-22 00:22:00 +00:00
2016-12-15 22:50:32 +00:00
// From: http://stackoverflow.com/a/2897510
new function($) {
$.fn.getCursorPosition = function() {
var input = this.get(0);
if (!input) return; // No (input) element found
if ('selectionStart' in input) {
// Standard-compliant browsers
return input.selectionStart;
} else if (document.selection) {
// IE
2016-12-15 22:58:31 +00:00
input.fmcus();
2016-12-15 23:00:06 +00:00
var sel = document.selection.createRange();
2016-12-15 22:50:32 +00:00
var selLen = document.selection.createRange().text.length;
sel.moveStart('character', -input.value.length);
return sel.text.length - selLen;
}
}
}(jQuery);
// From: http://stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area
new function($) {
$.fn.setCursorPosition = function(pos) {
if (this.setSelectionRange) {
this.setSelectionRange(pos, pos);
} else if (this.createTextRange) {
var range = this.createTextRange();
range.collapse(true);
if(pos < 0) {
pos = $(this).val().length + pos;
}
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}
}(jQuery);
2016-12-10 01:10:03 +00:00
function getVerbForms(word) {
2016-11-22 00:22:00 +00:00
2016-12-10 01:10:03 +00:00
function aux(dictionary_form, dictionary_kana) {
2016-11-22 00:22:00 +00:00
2016-12-10 01:10:03 +00:00
var forms = new Object();
forms["dictionary"] = dictionary_form;
// Special case for くる and する
if (dictionary_kana == "くる") {
2016-12-10 01:10:03 +00:00
forms["negative"] = "こない";
forms["past"] = "きた";
forms["past negative"] = "こなかった";
forms["polite"] = "きます";
2016-12-10 01:10:03 +00:00
forms["te-form"] = "きて";
// forms["dictionary"] = "来る";
// forms["polite"] = "来ます";
2016-12-10 01:10:03 +00:00
// forms["past"] = "来た";
// forms["polite past"] = "来ました";
2016-12-10 01:10:03 +00:00
// forms["negative"] = "来ない";
// forms["polite negative"] = "来ません";
2016-12-10 01:10:03 +00:00
// forms["past negative"] = "来なかった";
// forms["polite past negative"] = "来ませんでした";
2016-12-10 01:10:03 +00:00
// forms["te-form"] = "来て";
// forms["conditional"] = "来れば";
// forms["volitional"] = "来よう";
// forms["passive"] = "来られる";
// forms["causative"] = "来させる";
// forms["potential"] = "来られる";
// forms["imperative"] = "来い";
return forms;
} else if (dictionary_kana == "する") {
2016-12-10 01:10:03 +00:00
forms["negative"] = "しない";
forms["past"] = "した";
forms["past negative"] = "しなかった";
forms["polite"] = "します";
2016-12-10 01:10:03 +00:00
forms["te-form"] = "して";
return forms;
2016-11-22 00:22:00 +00:00
}
2016-12-10 01:10:03 +00:00
var group;
if (dictionary_kana.slice(-2) == "する") {
2016-12-10 01:10:03 +00:00
group = "suru";
} else if ((dictionary_kana.slice(-1) == "る") && (
(vowelPart[dictionary_kana.slice(-2)[0]] == "い") ||
(vowelPart[dictionary_kana.slice(-2)[0]] == "え"))) {
group = "ichidan";
2016-11-22 00:22:00 +00:00
} else {
2016-12-10 01:10:03 +00:00
group = "godan";
2016-11-22 00:22:00 +00:00
}
2016-12-10 01:10:03 +00:00
// masu form (verbs)
var masu_root;
if (group == "ichidan") {
masu_root = dictionary_form.slice(0, -1);
} if (group == "godan") {
masu_root = dictionary_form.slice(0, -1) + combineParts[consonantPart[dictionary_form.slice(-1)] + "い"];
2016-11-22 00:22:00 +00:00
}
2016-12-10 01:10:03 +00:00
forms["polite"] = masu_root + "ます";
forms["polite past"] = masu_root + "ました";
forms["polite negative"] = masu_root + "ません";
forms["polite past negative"] = masu_root + "ませんでした";
2016-12-10 01:10:03 +00:00
forms["volitional"] = masu_root + "ましょう";
// te form
if (dictionary_kana == "いく") {
forms["te-form"] = dictionary_form.slice(0, -1) + "って";
2016-12-10 01:10:03 +00:00
} else if (group == "godan") {
switch (dictionary_kana.slice(-1)) {
2016-12-10 01:10:03 +00:00
case "う":
case "つ":
case "る":
forms["te-form"] = dictionary_form.slice(0, -1) + "って";
break;
case "す":
forms["te-form"] = dictionary_form.slice(0, -1) + "して";
break;
case "く":
forms["te-form"] = dictionary_form.slice(0, -1) + "いて";
break;
case "ぐ":
forms["te-form"] = dictionary_form.slice(0, -1) + "いで";
break;
case "ぶ":
case "む":
case "ぬ":
forms["te-form"] = dictionary_form.slice(0, -1) + "んで";
break;
}
2016-11-22 00:22:00 +00:00
} else {
2016-12-10 01:10:03 +00:00
forms["te-form"] = dictionary_form.slice(0, -1) + "て";
2016-11-22 00:22:00 +00:00
}
2016-12-10 01:10:03 +00:00
// present negative
if (group == "godan") {
if (dictionary_kana.slice(-1) == "う") {
2016-12-10 01:10:03 +00:00
forms["negative"] = dictionary_form.slice(0, -1) + "わない";
} else {
forms["negative"] = dictionary_form.slice(0, -1) +
combineParts[consonantPart[dictionary_form.slice(-1)] + "あ"] + "ない";
}
} else {
// ichidan verb
forms["negative"] = dictionary_form.slice(0, -1) + "ない";
}
// past plain
2016-12-10 01:10:03 +00:00
if (dictionary_kana == "いく") {
forms["past"] = dictionary_form.slice(0, -1) + "った";
2016-12-10 01:10:03 +00:00
} else if (group == "godan") {
switch (dictionary_form.slice(-1)) {
case "う":
case "つ":
case "る":
forms["past"] = dictionary_form.slice(0, -1) + "った";
break;
case "す":
forms["past"] = dictionary_form.slice(0, -1) + "した";
break;
case "く":
forms["past"] = dictionary_form.slice(0, -1) + "いた";
break;
case "ぐ":
forms["past"] = dictionary_form.slice(0, -1) + "いだ";
break;
case "ぶ":
case "む":
case "ぬ":
forms["past"] = dictionary_form.slice(0, -1) + "んだ";
break;
}
} else {
forms["past"] = dictionary_form.slice(0, -1) + "た";
}
// plain past negative
2016-12-10 01:10:03 +00:00
if (group == "godan") {
if (dictionary_kana.slice(-1) == "う") {
2016-12-10 01:10:03 +00:00
forms["past negative"] = dictionary_form.slice(0, -1) + "わなかった";
} else {
forms["past negative"] = dictionary_form.slice(0, -1) +
combineParts[consonantPart[dictionary_form.slice(-1)] + "あ"] + "なかった";
}
} else {
forms["past negative"] = dictionary_form.slice(0, -1) + "なかった";
}
return forms;
2016-11-22 00:22:00 +00:00
}
var word_form = word["word"].split(/(.)\[[^\]]*\]/).join("");
var kana_form = word["word"].split(/.\[([^\]]*)\]/).join("");
2016-12-10 01:10:03 +00:00
return {
"word": word["word"],
"kanji": aux(word_form, kana_form),
"hiragana": aux(kana_form, kana_form),
"furigana": aux(word["word"], kana_form)
2016-12-10 01:10:03 +00:00
};
2016-11-22 00:22:00 +00:00
}
function getAdjectiveForms(dictionary_form) {
var result = new Object();
// past affirmative form (adjectives)
if (dictionary_form == "いい") {
result["past affirmative adj"] = "よかったです";
} else if (dictionary_form.slice(-1) == "い") {
result["past affirmative adj"] = dictionary_form.slice(0, -1) + "かったです";
} else if (dictionary_form.slice(-1) == "な") {
result["past affirmative adj"] = dictionary_form.slice(0, -1) + "でした";
}
// present negative form (adjectives)
if (dictionary_form == "いい") {
result["present negative adj"] = "よくないです";
} else if (dictionary_form.slice(-1) == "い") {
result["present negative adj"] = dictionary_form.slice(0, -1) + "くないです";
} else if (dictionary_form.slice(-1) == "な") {
result["present negative adj"] = dictionary_form.slice(0, -1) + "じゃないです";
}
}
var verb_relative_form = {
"dictionary" : {
2016-12-10 01:10:03 +00:00
"negative": "affirmative",
"past": "present",
"polite": "plain",
// "te-form": "plain",
2016-11-22 00:22:00 +00:00
},
"negative": {
2016-12-10 01:10:03 +00:00
"dictionary": "negative",
"past negative": "present",
"polite negative": "plain",
2016-12-15 22:58:31 +00:00
// "te-form": "negative",
2016-11-22 00:22:00 +00:00
},
"past" : {
2016-12-10 01:10:03 +00:00
"dictionary": "past",
2016-11-22 00:22:00 +00:00
"past negative" : "affirmative",
"polite past": "plain",
2016-12-15 22:58:31 +00:00
// "te-form": "past",
2016-11-22 00:22:00 +00:00
},
"past negative" : {
2016-12-10 01:10:03 +00:00
"negative": "past",
"past": "negative",
"polite past negative": "plain",
2016-12-15 22:58:31 +00:00
// "te-form": "past negative",
2016-11-22 00:22:00 +00:00
},
"polite": {
2016-11-22 00:22:00 +00:00
"dictionary": "polite",
"polite past": "present",
"polite negative": "affirmative",
// "te-form": "polite",
2016-12-10 01:10:03 +00:00
},
"polite past": {
2016-12-10 01:10:03 +00:00
"past": "polite",
"polite": "past",
"polite past negative": "affirmative",
// "te-form": "polite past",
2016-12-10 01:10:03 +00:00
},
"polite negative": {
2016-12-10 01:10:03 +00:00
"negative": "polite",
"polite": "negative",
"polite past negative": "present",
// "te-form": "polite negative",
2016-12-10 01:10:03 +00:00
},
"polite past negative": {
2016-12-10 01:10:03 +00:00
"past negative": "polite",
"polite past": "negative",
"polite negative": "past",
// "te-form": "polite past negative",
2016-11-22 00:22:00 +00:00
},
};
function wordWithFurigana(word) {
var bits = word.split(/(.)\[([^\]]*)\]/);
while (bits.length > 1) {
bits[0] = bits[0] + "<span tooltip='" + bits[2] + "'>" + bits[1] + "</span>" + bits[3];
bits.splice(1, 3);
}
return bits[0];
}
2016-12-15 22:50:32 +00:00
function processAnswerKey() {
var el = $('#answer');
var pos = el.getCursorPosition();
var val = el.val();
var last1 = val.slice(pos - 1, pos);
var last2 = val.slice(pos - 2, pos);
var last3 = val.slice(pos - 3, pos);
var replace1 = {
"a" : "あ", "i" : "い", "u" : "う", "e" : "え", "o" : "お"
};
var replace2 = {
"ka" : "か", "ki" : "き", "ku" : "く", "ke" : "け", "ko" : "こ",
"sa" : "さ", "si" : "し", "su" : "す", "se" : "せ", "so" : "そ",
"ta" : "た", "ti" : "ち", "tu" : "つ", "te" : "て", "to" : "と",
"na" : "な", "ni" : "に", "nu" : "ぬ", "ne" : "ね", "no" : "の",
"ha" : "は", "hi" : "ひ", "hu" : "ふ", "he" : "へ", "ho" : "ほ",
"ma" : "ま", "mi" : "み", "mu" : "む", "me" : "め", "mo" : "も",
"ra" : "ら", "ri" : "り", "ru" : "る", "re" : "れ", "ro" : "ろ",
"ga" : "が", "gi" : "ぎ", "gu" : "ぐ", "ge" : "げ", "go" : "ご",
"za" : "ざ", "zi" : "じ", "zu" : "ず", "ze" : "ぜ", "zo" : "ぞ",
"da" : "だ", "di" : "ぢ", "du" : "づ", "de" : "で", "do" : "ど",
"ba" : "ば", "bi" : "び", "bu" : "ぶ", "be" : "べ", "bo" : "ぼ",
"pa" : "ぱ", "pi" : "ぴ", "pu" : "ぷ", "pe" : "ぺ", "po" : "ぽ",
"qa" : "くぁ", "qi" : "くぃ", "qu" : "く", "qe" : "くぇ", "qo" : "くぉ",
"wa" : "わ", "wi" : "うぃ", "wu" : "う", "we" : "うぇ", "wo" : "を",
"ya" : "や", "yi" : "い", "yu" : "ゆ", "ye" : "いぇ", "yo" : "よ",
"fa" : "ふぁ", "fi" : "ふぃ", "fu" : "ふ", "fe" : "ふぇ", "fo" : "ふぉ",
"ja" : "じゃ", "ji" : "じ", "ju" : "じゅ", "je" : "じぇ", "jo" : "じょ",
"la" : "ぁ", "li" : "ぃ", "lu" : "ぅ", "le" : "ぇ", "lo" : "ぉ",
"za" : "ざ", "zi" : "じ", "zu" : "ず", "ze" : "ぜ", "zo" : "ぞ",
"xa" : "ぁ", "xi" : "ぃ", "xu" : "ぅ", "xe" : "ぇ", "xo" : "ぉ",
"ca" : "か", "ci" : "し", "cu" : "く", "ce" : "せ", "co" : "こ",
"va" : "ヴぁ", "vi" : "ヴぃ", "vu" : "ヴ", "ve" : "ヴぇ", "vo" : "ヴぉ",
"lu" : "っ",
"nn" : "ん",
"nb" : "んb",
"nc" : "んc",
"nd" : "んd",
"nf" : "んf",
"ng" : "んg",
"nh" : "んh",
"nj" : "んj",
"nk" : "んk",
"nl" : "んl",
"nm" : "んm",
"np" : "んp",
"nq" : "んq",
"nr" : "んr",
"ns" : "んs",
"nt" : "んt",
"nv" : "んv",
"nw" : "んw",
"nx" : "んx",
"nz" : "んz",
"aa" : "っa",
"bb" : "っb",
"cc" : "っc",
"dd" : "っd",
"ee" : "っe",
"ff" : "っf",
"gg" : "っg",
"hh" : "っh",
"ii" : "っi",
"jj" : "っj",
"kk" : "っk",
"ll" : "っl",
"mm" : "っm",
"oo" : "っo",
"pp" : "っp",
"qq" : "っq",
"rr" : "っr",
"ss" : "っs",
"tt" : "っt",
"uu" : "っu",
"vv" : "っv",
"ww" : "っw",
"xx" : "っx",
"yy" : "っy",
"zz" : "っz",
};
var replace3 = {
"kya" : "きゃ", "kyi" : "きぃ", "kyu" : "きゅ", "kye" : "きぇ", "kyo" : "きょ",
"sya" : "しゃ", "syi" : "しぃ", "syu" : "しゅ", "sye" : "しぇ", "syo" : "しょ",
"tya" : "ちゃ", "tyi" : "ちぃ", "tyu" : "ちゅ", "tye" : "ちぇ", "tyo" : "ちょ",
"nya" : "にゃ", "nyi" : "にぃ", "nyu" : "にゅ", "nye" : "にぇ", "nyo" : "にょ",
"hya" : "ひゃ", "hyi" : "ひぃ", "hyu" : "ひゅ", "hye" : "ひぇ", "hyo" : "ひょ",
"mya" : "みゃ", "myi" : "みぃ", "myu" : "みゅ", "mye" : "みぇ", "myo" : "みょ",
"rya" : "りゃ", "ryi" : "りぃ", "ryu" : "りゅ", "rye" : "りぇ", "ryo" : "りょ",
"gya" : "ぎゃ", "gyi" : "ぎぃ", "gyu" : "ぎゅ", "gye" : "ぎぇ", "gyo" : "ぎょ",
"zya" : "じゃ", "zyi" : "じぃ", "zyu" : "じゅ", "zye" : "じぇ", "zyo" : "じょ",
"dya" : "ぢゃ", "dyi" : "ぢぃ", "dyu" : "ぢゅ", "dye" : "ぢぇ", "dyo" : "ぢょ",
"bya" : "びゃ", "byi" : "びぃ", "byu" : "びゅ", "bye" : "びぇ", "byo" : "びょ",
"pya" : "ぴゃ", "pyi" : "ぴぃ", "pyu" : "ぴゅ", "pye" : "ぴぇ", "pyo" : "ぴょ",
"shi" : "し",
"tsu" : "つ",
};
if (replace3[last3]) {
val = val.slice(0, pos - 3) + replace3[last3] + val.slice(pos, -1);
el.val(val);
el.setCursorPosition(pos - 3 + replace3[last3].length);
} else if (replace2[last2]) {
val = val.slice(0, pos - 2) + replace2[last2] + val.slice(pos, -1);
el.val(val);
el.setCursorPosition(pos - 2 + replace2[last2].length);
} else if (replace1[last1]) {
val = val.slice(0, pos - 1) + replace1[last1] + val.slice(pos, -1);
el.val(val);
el.setCursorPosition(pos - 1 + replace1[last1].length);
}
}
2016-11-22 00:22:00 +00:00
function generateVerbQuestion() {
var entry = words.randomElement();
2016-12-10 01:10:03 +00:00
var forms = getVerbForms(entry);
var word = forms["word"];
var kanjiForms = forms["kanji"];
var kanaForms = forms["hiragana"];
var furiganaForms = forms["furigana"];
2016-11-22 00:22:00 +00:00
var to_form = Object.keys(verb_relative_form).randomElement();
var from_form = Object.keys(verb_relative_form[to_form]).randomElement();
var question = "What is the " + verb_relative_form[to_form][from_form] + " form of " + wordWithFurigana(furiganaForms[from_form]) + "?";
2016-11-22 00:22:00 +00:00
var answer = kanjiForms[to_form];
var answer2 = kanaForms[to_form];
console.log("From form = " + from_form);
console.log("To form = " + to_form);
console.log("Question = " + question);
console.log("Answer = " + answer);
2016-12-10 01:10:03 +00:00
$('#question').html(question);
2016-11-26 16:45:32 +00:00
window.question = question;
window.word = word;
2016-12-16 13:30:14 +00:00
window.answer = kanjiForms[to_form];
window.answerWithFurigana = wordWithFurigana(furiganaForms[to_form]);
2016-11-22 00:22:00 +00:00
window.answer2 = answer2;
$('#next').prop('disabled', true);
$('#response').html("");
$('#message').html("");
2016-11-22 01:59:30 +00:00
$('#proceed').hide();
$('#input').show();
$('#answer').focus();
2016-11-26 16:45:32 +00:00
2016-12-15 22:50:32 +00:00
$('#answer').on('input', processAnswerKey);
2016-11-26 16:45:32 +00:00
if (log.start == undefined) {
log.start = Date.now();
}
2016-11-22 00:22:00 +00:00
}
function processAnswer() {
2016-12-10 01:10:03 +00:00
var response = $('#answer').val().trim();
if (response == "")
return;
2016-11-22 01:59:30 +00:00
var correct = ((response == window.answer) || (response == window.answer2));
var klass = correct ? "correct" : "incorrect";
2016-11-22 00:22:00 +00:00
2016-11-26 16:45:32 +00:00
log.history.push({
"question" : window.question,
"response" : response,
2016-12-16 13:30:14 +00:00
"answer" : window.answerWithFurigana,
2016-12-10 01:10:03 +00:00
"kana" : window.answer2,
2016-11-26 16:45:32 +00:00
"correct" : correct
});
2016-11-22 00:22:00 +00:00
$('#answer').val("");
2016-11-22 01:59:30 +00:00
$('#response').prop('class', klass).text(response);
2016-11-22 00:22:00 +00:00
$('#next').prop('disabled', false);
2016-11-22 01:59:30 +00:00
2016-11-22 00:22:00 +00:00
if ((response == window.answer) || (response == window.answer2)) {
2016-11-22 01:59:30 +00:00
$('#message').html("");
2016-11-22 00:22:00 +00:00
} else {
2016-12-16 13:30:14 +00:00
$('#message').html("<div>The correct answer is " + window.answerWithFurigana + "</div>");
2016-11-22 00:22:00 +00:00
}
2016-11-22 01:59:30 +00:00
$('#input').hide();
$('#proceed').show();
$('#proceed button').focus();
2016-11-26 16:45:32 +00:00
if (log.end == undefined) {
log.end = Date.now();
}
updateHistoryView(log);
}
function updateHistoryView(log) {
2016-12-10 01:10:03 +00:00
2016-11-26 16:45:32 +00:00
var review = $('<table>');
var total = 0;
var correct = 0;
2016-12-10 01:10:03 +00:00
var header_tr = $('<tr>');
header_tr.append($('<th>Question</th>'));
header_tr.append($('<th>Answer</th>'));
header_tr.append($('<th>Response</th>'));
review.append(header_tr);
2016-11-26 16:45:32 +00:00
log.history.forEach(function (entry) {
total++;
if (entry.correct) {
correct++;
}
var tr = $('<tr>');
var td1 = $('<td>');
var td2 = $('<td>');
var td3 = $('<td>');
2016-12-10 01:10:03 +00:00
td1.html(entry.question);
2016-12-16 13:30:14 +00:00
td2.html(entry.answerWithFurigana);
2016-11-26 16:45:32 +00:00
td3.text(entry.response);
tr.append(td1);
tr.append(td2);
tr.append(td3);
2016-12-10 01:10:03 +00:00
if (entry.correct) {
td3.append("<span class='answer-correct'> ○</span>");
} else {
td3.append("<span class='answer-wrong'> ×</span>");
}
2016-11-26 16:45:32 +00:00
review.append(tr);
});
$('#history').empty().append(review);
$('#history').append("<p>" + correct + " of " + total + " correct.</p>");
$('#history').append("<p>" + ((log.end - log.start) / 1000.0) + " seconds.</p>");
2016-11-22 01:59:30 +00:00
}
function proceed() {
2016-11-26 16:45:32 +00:00
if (log.history.length == 10) {
2016-12-10 01:10:03 +00:00
console.log("終わり。");
2016-11-26 16:45:32 +00:00
} else {
generateVerbQuestion();
}
2016-11-22 00:22:00 +00:00
}
2016-12-10 01:10:03 +00:00
function tests() {
function assertEqual(expected, actual) {
if (expected != actual) {
throw "Expected: " + expected + ", actual " + actual;
}
}
// Group 1 tests::::
//
// "飲む"
// "作る"
// "買い戻す"
//
// Group 2 tests
//
// "見る"
// "食べる"
// "起きる"
// "買い換える"
//
// // Special case tests
//
// "行く"
var ikuForms = getVerbForms( { "word" : "行[い]く" } );
var nomuForms = getVerbForms( { "word" : "飲[の]む" } );
var tsukuruForms = getVerbForms( { "word" : "作[つく]る" } );
var kaimodosuForms = getVerbForms( { "word" : "買[か]い戻[もど]す" } );
var miruForms = getVerbForms( { "word" : "見[み]る" } );
var taberuForms = getVerbForms( { "word" : "食[た]べる" } );
var okiruForms = getVerbForms( { "word" : "起[お]きる" } );
var kaikaeruForms = getVerbForms( { "word" : "買[か]い換[か]える" } );
assertEqual("行く", ikuForms["kanji"]["dictionary"]);
assertEqual("行きます", ikuForms["kanji"]["polite"]);
assertEqual("行かない", ikuForms["kanji"]["negative"]);
assertEqual("行きません", ikuForms["kanji"]["polite negative"]);
assertEqual("行った", ikuForms["kanji"]["past"]);
assertEqual("行って", ikuForms["kanji"]["te-form"]);
assertEqual("行きました", ikuForms["kanji"]["polite past"]);
assertEqual("行かなかった", ikuForms["kanji"]["past negative"]);
assertEqual("行きませんでした", ikuForms["kanji"]["polite past negative"]);
// assertEqual("行ける", ikuForms["kanji"]["Potential, -ru"]);
// assertEqual("行かれる", ikuForms["kanji"]["Passive, -reru"]);
// assertEqual("行かせる", ikuForms["kanji"]["Causative, -seru"]);
// assertEqual("行かせられる", ikuForms["kanji"]["Passive causative, -serareru"]);
// assertEqual("行け", ikuForms["kanji"]["Imperative"]);
assertEqual("いく", ikuForms["hiragana"]["dictionary"]);
assertEqual("いきます", ikuForms["hiragana"]["polite"]);
assertEqual("いかない", ikuForms["hiragana"]["negative"]);
assertEqual("いきません", ikuForms["hiragana"]["polite negative"]);
assertEqual("いった", ikuForms["hiragana"]["past"]);
assertEqual("いって", ikuForms["hiragana"]["te-form"]);
assertEqual("いきました", ikuForms["hiragana"]["polite past"]);
assertEqual("いかなかった", ikuForms["hiragana"]["past negative"]);
assertEqual("いきませんでした", ikuForms["hiragana"]["polite past negative"]);
// assertEqual("いける", ikuForms["hiragana"]["Potential, -ru"]);
// assertEqual("いかれる", ikuForms["hiragana"]["Passive, -reru"]);
// assertEqual("いかせる", ikuForms["hiragana"]["Causative, -seru"]);
// assertEqual("いかせられる", ikuForms["hiragana"]["Passive causative, -serareru"]);
// assertEqual("いけ", ikuForms["hiragana"]["Imperative"]);
assertEqual("飲む", nomuForms["kanji"]["dictionary"]);
assertEqual("飲みます", nomuForms["kanji"]["polite"]);
assertEqual("飲まない", nomuForms["kanji"]["negative"]);
assertEqual("飲みません", nomuForms["kanji"]["polite negative"]);
assertEqual("飲んだ", nomuForms["kanji"]["past"]);
assertEqual("飲んで", nomuForms["kanji"]["te-form"]);
assertEqual("飲みました", nomuForms["kanji"]["polite past"]);
assertEqual("飲まなかった", nomuForms["kanji"]["past negative"]);
assertEqual("飲みませんでした", nomuForms["kanji"]["polite past negative"]);
// assertEqual("飲める", nomuForms["kanji"]["Potential, -ru"]);
// assertEqual("飲まれる", nomuForms["kanji"]["Passive, -reru"]);
// assertEqual("飲ませる", nomuForms["kanji"]["Causative, -seru"]);
// assertEqual("飲ませられる", nomuForms["kanji"]["Passive causative, -serareru"]);
// assertEqual("飲め", nomuForms["kanji"]["Imperative"]);
assertEqual("のむ", nomuForms["hiragana"]["dictionary"]);
assertEqual("のみます", nomuForms["hiragana"]["polite"]);
assertEqual("のまない", nomuForms["hiragana"]["negative"]);
assertEqual("のみません", nomuForms["hiragana"]["polite negative"]);
assertEqual("のんだ", nomuForms["hiragana"]["past"]);
assertEqual("のんで", nomuForms["hiragana"]["te-form"]);
assertEqual("のみました", nomuForms["hiragana"]["polite past"]);
assertEqual("のまなかった", nomuForms["hiragana"]["past negative"]);
assertEqual("のみませんでした", nomuForms["hiragana"]["polite past negative"]);
// assertEqual("のめる", nomuForms["hiragana"]["Potential, -ru"]);
// assertEqual("のまれる", nomuForms["hiragana"]["Passive, -reru"]);
// assertEqual("のませる", nomuForms["hiragana"]["Causative, -seru"]);
// assertEqual("のませられる", nomuForms["hiragana"]["Passive causative, -serareru"]);
// assertEqual("のめ", nomuForms["hiragana"]["Imperative"]);
assertEqual("作る", tsukuruForms["kanji"]["dictionary"]);
assertEqual("作ります", tsukuruForms["kanji"]["polite"]);
assertEqual("作らない", tsukuruForms["kanji"]["negative"]);
assertEqual("作りません", tsukuruForms["kanji"]["polite negative"]);
assertEqual("作った", tsukuruForms["kanji"]["past"]);
assertEqual("作って", tsukuruForms["kanji"]["te-form"]);
assertEqual("作りました", tsukuruForms["kanji"]["polite past"]);
assertEqual("作らなかった", tsukuruForms["kanji"]["past negative"]);
assertEqual("作りませんでした", tsukuruForms["kanji"]["polite past negative"]);
// assertEqual("作れる", tsukuruForms["kanji"]["Potential, -ru"]);
// assertEqual("作られる", tsukuruForms["kanji"]["Passive, -reru"]);
// assertEqual("作らせる", tsukuruForms["kanji"]["Causative, -seru"]);
// assertEqual("作らせられる", tsukuruForms["kanji"]["Passive causative, -serareru"]);
// assertEqual("作れ", tsukuruForms["kanji"]["Imperative"]);
assertEqual("つくる", tsukuruForms["hiragana"]["dictionary"]);
assertEqual("つくります", tsukuruForms["hiragana"]["polite"]);
assertEqual("つくらない", tsukuruForms["hiragana"]["negative"]);
assertEqual("つくりません", tsukuruForms["hiragana"]["polite negative"]);
assertEqual("つくった", tsukuruForms["hiragana"]["past"]);
assertEqual("つくって", tsukuruForms["hiragana"]["te-form"]);
assertEqual("つくりました", tsukuruForms["hiragana"]["polite past"]);
assertEqual("つくらなかった", tsukuruForms["hiragana"]["past negative"]);
assertEqual("つくりませんでした", tsukuruForms["hiragana"]["polite past negative"]);
// assertEqual("つくれる", tsukuruForms["hiragana"]["Potential, -ru"]);
// assertEqual("つくられる", tsukuruForms["hiragana"]["Passive, -reru"]);
// assertEqual("つくらせる", tsukuruForms["hiragana"]["Causative, -seru"]);
// assertEqual("つくらせられる", tsukuruForms["hiragana"]["Passive causative, -serareru"]);
// assertEqual("つくれ", tsukuruForms["hiragana"]["Imperative"]);
assertEqual("買い戻す", kaimodosuForms["kanji"]["dictionary"]);
assertEqual("買い戻します", kaimodosuForms["kanji"]["polite"]);
assertEqual("買い戻さない", kaimodosuForms["kanji"]["negative"]);
assertEqual("買い戻しません", kaimodosuForms["kanji"]["polite negative"]);
assertEqual("買い戻した", kaimodosuForms["kanji"]["past"]);
assertEqual("買い戻して", kaimodosuForms["kanji"]["te-form"]);
assertEqual("買い戻しました", kaimodosuForms["kanji"]["polite past"]);
assertEqual("買い戻さなかった", kaimodosuForms["kanji"]["past negative"]);
assertEqual("買い戻しませんでした", kaimodosuForms["kanji"]["polite past negative"]);
// assertEqual("買い戻せる", kaimodosuForms["kanji"]["Potential, -ru"]);
// assertEqual("買い戻される", kaimodosuForms["kanji"]["Passive, -reru"]);
// assertEqual("買い戻させる", kaimodosuForms["kanji"]["Causative, -seru"]);
// assertEqual("買い戻させられる", kaimodosuForms["kanji"]["Passive causative, -serareru"]);
// assertEqual("買い戻せ", kaimodosuForms["kanji"]["Imperative"]);
assertEqual("かいもどす", kaimodosuForms["hiragana"]["dictionary"]);
assertEqual("かいもどします", kaimodosuForms["hiragana"]["polite"]);
assertEqual("かいもどさない", kaimodosuForms["hiragana"]["negative"]);
assertEqual("かいもどしません", kaimodosuForms["hiragana"]["polite negative"]);
assertEqual("かいもどした", kaimodosuForms["hiragana"]["past"]);
assertEqual("かいもどして", kaimodosuForms["hiragana"]["te-form"]);
assertEqual("かいもどしました", kaimodosuForms["hiragana"]["polite past"]);
assertEqual("かいもどさなかった", kaimodosuForms["hiragana"]["past negative"]);
assertEqual("かいもどしませんでした", kaimodosuForms["hiragana"]["polite past negative"]);
// assertEqual("かいもどせる", kaimodosuForms["hiragana"]["Potential, -ru"]);
// assertEqual("かいもどされる", kaimodosuForms["hiragana"]["Passive, -reru"]);
// assertEqual("かいもどさせる", kaimodosuForms["hiragana"]["Causative, -seru"]);
// assertEqual("かいもどさせられる", kaimodosuForms["hiragana"]["Passive causative, -serareru"]);
// assertEqual("かいもどせ", kaimodosuForms["hiragana"]["Imperative"]);
assertEqual("見る", miruForms["kanji"]["dictionary"]);
assertEqual("見ます", miruForms["kanji"]["polite"]);
assertEqual("見ない", miruForms["kanji"]["negative"]);
assertEqual("見ません", miruForms["kanji"]["polite negative"]);
assertEqual("見た", miruForms["kanji"]["past"]);
assertEqual("見て", miruForms["kanji"]["te-form"]);
assertEqual("見ました", miruForms["kanji"]["polite past"]);
assertEqual("見なかった", miruForms["kanji"]["past negative"]);
assertEqual("見ませんでした", miruForms["kanji"]["polite past negative"]);
// assertEqual("見られる", miruForms["kanji"]["Potential, -rareru"]);
// assertEqual("見られる", miruForms["kanji"]["Passive, -rareru"]);
// assertEqual("見させる", miruForms["kanji"]["Causative, -saseru"]);
// assertEqual("見させられる", miruForms["kanji"]["Passive causative, -saserareru"]);
// assertEqual("見ろ", miruForms["kanji"]["Imperative, -ro"]);
assertEqual("みる", miruForms["hiragana"]["dictionary"]);
assertEqual("みます", miruForms["hiragana"]["polite"]);
assertEqual("みない", miruForms["hiragana"]["negative"]);
assertEqual("みません", miruForms["hiragana"]["polite negative"]);
assertEqual("みた", miruForms["hiragana"]["past"]);
assertEqual("みて", miruForms["hiragana"]["te-form"]);
assertEqual("みました", miruForms["hiragana"]["polite past"]);
assertEqual("みなかった", miruForms["hiragana"]["past negative"]);
assertEqual("みませんでした", miruForms["hiragana"]["polite past negative"]);
// assertEqual("みられる", miruForms["hiragana"]["Potential, -rareru"]);
// assertEqual("みられる", miruForms["hiragana"]["Passive, -rareru"]);
// assertEqual("みさせる", miruForms["hiragana"]["Causative, -saseru"]);
// assertEqual("みさせられる", miruForms["hiragana"]["Passive causative, -saserareru"]);
// assertEqual("みろ", miruForms["hiragana"]["Imperative, -ro"]);
assertEqual("食べる", taberuForms["kanji"]["dictionary"]);
assertEqual("食べます", taberuForms["kanji"]["polite"]);
assertEqual("食べない", taberuForms["kanji"]["negative"]);
assertEqual("食べません", taberuForms["kanji"]["polite negative"]);
assertEqual("食べた", taberuForms["kanji"]["past"]);
assertEqual("食べて", taberuForms["kanji"]["te-form"]);
assertEqual("食べました", taberuForms["kanji"]["polite past"]);
assertEqual("食べなかった", taberuForms["kanji"]["past negative"]);
assertEqual("食べませんでした", taberuForms["kanji"]["polite past negative"]);
// assertEqual("食べられる", taberuForms["kanji"]["Potential, -rareru"]);
// assertEqual("食べられる", taberuForms["kanji"]["Passive, -rareru"]);
// assertEqual("食べさせる", taberuForms["kanji"]["Causative, -saseru"]);
// assertEqual("食べさせられる", taberuForms["kanji"]["Passive causative, -saserareru"]);
// assertEqual("食べろ", taberuForms["kanji"]["Imperative, -ro"]);
assertEqual("たべる", taberuForms["hiragana"]["dictionary"]);
assertEqual("たべます", taberuForms["hiragana"]["polite"]);
assertEqual("たべない", taberuForms["hiragana"]["negative"]);
assertEqual("たべません", taberuForms["hiragana"]["polite negative"]);
assertEqual("たべた", taberuForms["hiragana"]["past"]);
assertEqual("たべて", taberuForms["hiragana"]["te-form"]);
assertEqual("たべました", taberuForms["hiragana"]["polite past"]);
assertEqual("たべなかった", taberuForms["hiragana"]["past negative"]);
assertEqual("たべませんでした", taberuForms["hiragana"]["polite past negative"]);
// assertEqual("たべられる", taberuForms["hiragana"]["Potential, -rareru"]);
// assertEqual("たべられる", taberuForms["hiragana"]["Passive, -rareru"]);
// assertEqual("たべさせる", taberuForms["hiragana"]["Causative, -saseru"]);
// assertEqual("たべさせられる", taberuForms["hiragana"]["Passive causative, -saserareru"]);
// assertEqual("たべろ", taberuForms["hiragana"]["Imperative, -ro"]);
assertEqual("起きる", okiruForms["kanji"]["dictionary"]);
assertEqual("起きます", okiruForms["kanji"]["polite"]);
assertEqual("起きない", okiruForms["kanji"]["negative"]);
assertEqual("起きません", okiruForms["kanji"]["polite negative"]);
assertEqual("起きた", okiruForms["kanji"]["past"]);
assertEqual("起きて", okiruForms["kanji"]["te-form"]);
assertEqual("起きました", okiruForms["kanji"]["polite past"]);
assertEqual("起きなかった", okiruForms["kanji"]["past negative"]);
assertEqual("起きませんでした", okiruForms["kanji"]["polite past negative"]);
// assertEqual("起きられる", okiruForms["kanji"]["Potential, -rareru"]);
// assertEqual("起きられる", okiruForms["kanji"]["Passive, -rareru"]);
// assertEqual("起きさせる", okiruForms["kanji"]["Causative, -saseru"]);
// assertEqual("起きさせられる", okiruForms["kanji"]["Passive causative, -saserareru"]);
// assertEqual("起きろ", okiruForms["kanji"]["Imperative, -ro"]);
assertEqual("おきる", okiruForms["hiragana"]["dictionary"]);
assertEqual("おきます", okiruForms["hiragana"]["polite"]);
assertEqual("おきない", okiruForms["hiragana"]["negative"]);
assertEqual("おきません", okiruForms["hiragana"]["polite negative"]);
assertEqual("おきた", okiruForms["hiragana"]["past"]);
assertEqual("おきて", okiruForms["hiragana"]["te-form"]);
assertEqual("おきました", okiruForms["hiragana"]["polite past"]);
assertEqual("おきなかった", okiruForms["hiragana"]["past negative"]);
assertEqual("おきませんでした", okiruForms["hiragana"]["polite past negative"]);
// assertEqual("おきられる", okiruForms["hiragana"]["Potential, -rareru"]);
// assertEqual("おきられる", okiruForms["hiragana"]["Passive, -rareru"]);
// assertEqual("おきさせる", okiruForms["hiragana"]["Causative, -saseru"]);
// assertEqual("おきさせられる", okiruForms["hiragana"]["Passive causative, -saserareru"]);
// assertEqual("おきろ", okiruForms["hiragana"]["Imperative, -ro"]);
assertEqual("買い換える", kaikaeruForms["kanji"]["dictionary"]);
assertEqual("買い換えます", kaikaeruForms["kanji"]["polite"]);
assertEqual("買い換えない", kaikaeruForms["kanji"]["negative"]);
assertEqual("買い換えません", kaikaeruForms["kanji"]["polite negative"]);
assertEqual("買い換えた", kaikaeruForms["kanji"]["past"]);
assertEqual("買い換えて", kaikaeruForms["kanji"]["te-form"]);
assertEqual("買い換えました", kaikaeruForms["kanji"]["polite past"]);
assertEqual("買い換えなかった", kaikaeruForms["kanji"]["past negative"]);
assertEqual("買い換えませんでした", kaikaeruForms["kanji"]["polite past negative"]);
// assertEqual("買い換えられる", kaikaeruForms["kanji"]["Potential, -rareru"]);
// assertEqual("買い換えられる", kaikaeruForms["kanji"]["Passive, -rareru"]);
// assertEqual("買い換えさせる", kaikaeruForms["kanji"]["Causative, -saseru"]);
// assertEqual("買い換えさせられる", kaikaeruForms["kanji"]["Passive causative, -saserareru"]);
// assertEqual("買い換えろ", kaikaeruForms["kanji"]["Imperative, -ro"]);
assertEqual("かいかえる", kaikaeruForms["hiragana"]["dictionary"]);
assertEqual("かいかえます", kaikaeruForms["hiragana"]["polite"]);
assertEqual("かいかえない", kaikaeruForms["hiragana"]["negative"]);
assertEqual("かいかえません", kaikaeruForms["hiragana"]["polite negative"]);
assertEqual("かいかえた", kaikaeruForms["hiragana"]["past"]);
assertEqual("かいかえて", kaikaeruForms["hiragana"]["te-form"]);
assertEqual("かいかえました", kaikaeruForms["hiragana"]["polite past"]);
assertEqual("かいかえなかった", kaikaeruForms["hiragana"]["past negative"]);
assertEqual("かいかえませんでした", kaikaeruForms["hiragana"]["polite past negative"]);
// assertEqual("かいかえられる", kaikaeruForms["hiragana"]["Potential, -rareru"]);
// assertEqual("かいかえられる", kaikaeruForms["hiragana"]["Passive, -rareru"]);
// assertEqual("かいかえさせる", kaikaeruForms["hiragana"]["Causative, -saseru"]);
// assertEqual("かいかえさせられる", kaikaeruForms["hiragana"]["Passive causative, -saserareru"]);
// assertEqual("かいかえろ", kaikaeruForms["hiragana"]["Imperative, -ro"]);
2016-12-10 01:10:03 +00:00
console.log("Complete.");
}
2016-11-22 00:22:00 +00:00
$('window').ready(function() {
generateVerbQuestion();
});