For my first use of javascript I've made an app that takes an input verb from html in Japanese and outputs it in to many conjugated (manipulated) forms.
Essentially, it defines an alphabet, some initial arrays and functions for use, a function to initially check for values and interact with the html page, an object to pass different verb values to, and then a whole slew of "self invoking functions" that essentially take the verb and pass it to the object, and then another function to interact with the page.
Right now I'm at a loss on how to rewrite it in modular JS. I have a couple libraries defined in the HTML (bootstrap, jQuery, and a Japanese IME). Although I'm using self-invoking functions and have a general idea of what modules are, I have no idea what a practical way of splitting up the code in to modules would be.
$(document).ready(function () {
//hiragana table
var hiragana = {
a: ["あ", "か", "さ", "た", "な", "は", "ま", "や", "ら", "わ", "が", "ざ", "だ", "ば", "ぱ"],
i: ["い", "き", "し", "ち", "に", "ひ", "み", " ", "り", " ", "ぎ", "じ", "ぢ", "び", "ぴ"],
u: ["う", "く", "す", "つ", "ぬ", "ふ", "む", "ゆ", "る", " ", "ぐ", "ず", "づ", "ぶ", "ぷ"],
e: ["え", "け", "せ", "て", "ね", "へ", "め", " ", "れ", " ", "げ", "ぜ", "で", "べ", "ぺ"],
o: ["お", "こ", "そ", "と", "の", "ほ", "も", "よ", "ろ", "を", "ご", "ぞ", "ど", "ぼ", "ぽ"],
teOne: ["み", "に", "び"],
teTwo: ["い", "ち", "り"],
change: function (input, initVowel, desiredVowel) {
var x = hiragana[initVowel].indexOf(input);
return hiragana[desiredVowel][x];
}
};
var groupOneExceptions = ["はいる", "はしる", "かえる", "かぎる", "きる", "しゃべる", "しる", "いる"];
var groupThree = ["くる", "する"];
var existence = [["いる", "ある"], ["です"]];
//check if in array
function isInArray(array, search) {
return array.indexOf(search) >= 0;
}
//add input to the page
function printPage(id, value) {
$("#" + id).replaceWith("<div id = " + id + ">" + value + "</span>");
}
//bind input to wanakana on page load
var input = document.getElementById("input");
wanakana.bind(input);
//check radio buttons and enact changes on enter form
$("input:radio[name=input-method]").change(function () {
if ($(this).val() === "Hiragana") {
//wanakana support
wanakana.bind(input);
$("#input").attr("placeholder", "たべる");
}
if ($(this).val() === "Romaji") {
wanakana.unbind(input);
$("#input").attr("placeholder", "taberu");
}
});
//Click the button to get the form value.
$("#submit").click(function () {
var verb = {
//put an if check here for masu? LATER
group: "",
u: $("#input").val(),
end: "",
endTwo: "",
withoutEnd: "",
i: "",
te: "",
preMasu: "",
masu: "",
ta: "",
taEnd: "",
nakatta: "",
mashita: "",
masendeshita: "",
teEnd: "",
nai: "",
naiEnd: "",
masen: "",
ou: "",
ouEnd: "",
naidarou: "",
eba: "",
ebaEnd: "",
nakereba: "",
eru: "",
eruEnd: "",
erunai: "",
seru: "",
serunai: "",
reru: "",
rerunai: ""
};
var init = (function () {
printPage("callout", "");
//clear table
for (prop in verb) {
if (typeof verb[prop] === "string") {
printPage(prop, "");
}
}
//init verb.u for hiragana processing
if (wanakana.isKana(verb.u) === false) {
verb.u = wanakana.toHiragana(verb.u);
}
//do some initial slicing
verb.end = verb.u.slice(-1);
verb.endTwo = verb.u.slice(-2, -1);
verb.withoutEnd = verb.u.slice(0, -1);
if (isInArray(hiragana.u, verb.end) === false) {
printPage("callout", "<div class=\"bs-callout bs-callout-danger\"> It doesn't look like " + verb.u + " is a valid Japanese verb in plain form. Try something that ends with an \"u\".</div>");
}
if (isInArray(existence[0], verb.u)) {
printPage("callout", "<div class=\"bs-callout bs-callout-info\"> If you were referring to the existence construct " + verb.u + " (to be), refer here.</div>");
} else if (isInArray(existence[1], verb.u)) {
printPage("callout", "<div class=\"bs-callout bs-callout-info\"> If you were referring to the existence construct " + verb.u + " (is), refer here.</div>");
}
})();
if (isInArray(hiragana.u, verb.end)) {
verb.getGroup = (function () {
if (isInArray(groupThree, verb.u)) {
verb.group = "3";
} else if (verb.end === "る" && (isInArray(hiragana.i, verb.endTwo) || isInArray(hiragana.e, verb.endTwo))) {
verb.group = "2";
} else if (isInArray(hiragana.u, verb.end)) {
verb.group = "1";
}
if (isInArray(groupOneExceptions, verb.u)) {
verb.group = "1";
}
})();
verb.getI = (function () {
if (verb.group === "1") {
verb.preMasu = hiragana.change(verb.end, "u", "i");
verb.i = verb.u.slice(0, -1) + verb.preMasu;
}
if (verb.group === "2") {
verb.i = verb.u.slice(0, -1);
}
if (verb.group === "3") {
verb.i = hiragana.change(verb.withoutEnd, "u", "i");
}
})();
verb.getTe = (function () {
if (verb.group === "3" || verb.group === "2") {
verb.te = verb.i + "て";
}
if (verb.group === "1") {
if (isInArray(hiragana.teOne, verb.preMasu)) {
verb.teEnd = "んで";
} else if (isInArray(hiragana.teTwo, verb.preMasu)) {
verb.teEnd = "って";
} else if (verb.preMasu === "き") {
verb.teEnd = "いて";
} else if (verb.preMasu === "ぎ") {
verb.teEnd = "いで";
} else if (verb.preMasu === "し") {
verb.teEnd = "して";
}
//exception
if (verb.u === "いく") {
verb.teEnd = "って";
}
verb.te = verb.withoutEnd + verb.teEnd;
}
})();
verb.getNai = (function () {
if (verb.group === "3") {
if (verb.u === "する") {
verb.nai = "しない";
}
if (verb.u === "くる") {
verb.nai = "こない";
}
}
if (verb.group === "2") {
verb.nai = verb.i + "ない";
}
if (verb.group === "1") {
if (verb.preMasu === "い") {
verb.naiEnd = "わ";
} else {
verb.naiEnd = hiragana.change(verb.preMasu, "i", "a") + "ない";
}
verb.nai = verb.withoutEnd + verb.naiEnd;
if (verb.u === "ある") {
verb.nai = "ない";
}
}
})();
verb.getMasu = (function () {
verb.masu = verb.i + "ます";
})();
verb.getMasen = (function () {
verb.masen = verb.i + "ません";
})();
verb.getTa = (function () {
if (verb.group === "3" || verb.group === "2") {
verb.ta = verb.i + "た";
}
if (verb.group === "1") {
verb.taEnd = verb.teEnd.slice(0, -1) + hiragana.change(verb.teEnd.slice(-1), "e", "a");
verb.ta = verb.withoutEnd + verb.taEnd;
}
})();
verb.getNakatta = (function () {
verb.nakatta = verb.nai.slice(0, -1) + "かった";
})();
verb.getMashita = (function () {
verb.mashita = verb.i + "ました";
})();
verb.getMasendeshita = (function () {
verb.masendeshita = verb.masen + " でした";
})();
verb.getOu = (function () {
if (verb.group === "3") {
verb.ou = verb.nai.slice(0, -2) + "よう";
}
if (verb.group === "2") {
verb.ou = verb.i + "よう";
}
if (verb.group === "1") {
verb.ouEnd = hiragana.change(verb.preMasu, "i", "o") + "う";
verb.ou = verb.withoutEnd + verb.ouEnd;
}
})();
verb.getNaidarou = (function () {
verb.naidarou = verb.nai + " だろう";
})();
verb.getEba = (function () {
if (verb.group === "3") {
verb.eba = verb.withoutEnd + "れば";
}
if (verb.group === "2") {
verb.eba = verb.i + "れば";
}
if (verb.group === "1") {
verb.ebaEnd = hiragana.change(verb.preMasu, "i", "e") + "ば";
verb.eba = verb.withoutEnd + verb.ebaEnd;
}
})();
verb.getNakereba = (function () {
verb.nakereba = verb.nai.slice(0, -1) + "ければ";
})();
verb.getEru = (function () {
if (verb.group === "3") {
if (verb.u === "する") {
verb.eru = "できる";
}
if (verb.u === "くる") {
verb.eru = "こられる";
}
}
if (verb.group === "2") {
verb.eru = verb.withoutEnd + "られる";
}
if (verb.group === "1") {
verb.eruEnd = hiragana.change(verb.preMasu, "i", "e") + "る";
verb.eru = verb.withoutEnd + verb.eruEnd;
}
})();
verb.getErunai = (function () {
verb.erunai = verb.eru.slice(0, -1) + "ない";
})();
verb.getReru = (function () {
if (verb.group === "3") {
if (verb.u === "する") {
verb.reru = "される";
}
if (verb.u === "くる") {
verb.reru = "こらせる";
}
}
if (verb.group === "2") {
verb.reru = verb.eru;
}
if (verb.group === "1") {
verb.reru = verb.nai.slice(0, -2) + "れる";
}
})();
verb.getRerunai = (function () {
verb.rerunai = verb.reru.slice(0, -1) + "ない";
})();
verb.getSeru = (function () {
if (verb.group === "3") {
if (verb.u === "する") {
verb.seru = "させる";
}
if (verb.u === "くる") {
verb.seru = "こさせる";
}
}
if (verb.group === "2") {
verb.seru = verb.withoutEnd + "させる";
}
if (verb.group === "1") {
verb.seru = verb.nai.slice(0, -2) + "せる";
}
})();
verb.getserunai = (function () {
verb.serunai = verb.seru.slice(0, -1) + "ない";
})();
verb.process = (function () {
var prop = "";
//goes through verb object, checks for romaji, prints page
for (prop in verb) {
if (typeof verb[prop] === "string") {
if (wanakana.isKana($("#input").val()) === false) {
verb[prop] = wanakana.toRomaji(verb[prop]);
}
printPage(prop, verb[prop]);
} //string
} //for in
})();
}
});
});