Skip to content

Commit 3d8247e

Browse files
committed
Japanese worksheets
1 parent 63b7432 commit 3d8247e

9 files changed

+141
-2
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.vscode

src/assets/Trace-lxy0.ttf

22.6 KB
Binary file not shown.

src/index.html

+6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
<meta property="og:type" content="website">
3030
<meta property="og:image" content="https://lewdev.github.io/apps/hw-gen/img/banner-1200x630.png">
3131

32+
<link rel="preconnect" href="https://fonts.googleapis.com">
33+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
34+
<link href="https://fonts.googleapis.com/css2?family=Raleway+Dots&display=swap" rel="stylesheet">
35+
3236
<link rel="stylesheet" href="assets/bootstrap.min.css">
3337
<link rel="stylesheet" href="assets/css-only-modal.css">
3438
<link rel="stylesheet" href="style.css">
@@ -311,8 +315,10 @@ <h3>Author: Lewis Nakao</h3>
311315
</div>
312316
<script src="https://twemoji.maxcdn.com/v/latest/twemoji.min.js" crossorigin="anonymous"></script>
313317
<script src="js/util.js"></script>
318+
<script src="js/jp-data.js"></script>
314319
<script src="js/hw-gen.js"></script>
315320
<script src="js/hw-sets.js"></script>
321+
<script src="js/hw-sets-jp.js"></script>
316322
<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
317323
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
318324
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)

src/js/hw-gen.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ const HwGen = (() => {
8888
case 'Subtraction': return '➖';
8989
case 'Multiplication': return '✖';
9090
case 'Division': return '➗';
91+
case 'Japanese': return '🇯🇵';
9192
}
9293
return '🔢';
9394
};
@@ -126,7 +127,7 @@ const HwGen = (() => {
126127
</div>
127128
<div class="col-md-5">
128129
<a href="./?set=${name}" onclick="HwGen.setWs('${name}'); return false;">${title}</a>
129-
<div>${useAllPossible1Digit ? 64 : count} Problems</div>
130+
<div>${(useAllPossible1Digit ? 64 : myGenEqList ? myGenEqList().length : count || 0)} Problems</div>
130131
${answerKey ? '<div class="text-muted">w/answer key</div>' : ''}
131132
</div>
132133
<div class="col-1">e.g.</div>

src/js/hw-sets-jp.js

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
const jpOutput = ({x, y}, i, columns) => `
2+
<td class="text-muted number"><span class="mr-2">${i + 1}.)</span></td>
3+
<td>
4+
<div class="text-nowrap text-center${x.match(/\w/) ? " font-italic" : ""}">${x}</div>
5+
<div class="mx-auto mt-2 mb-2 text-center">
6+
<input type="text" class="answer-input box"/>
7+
</div>
8+
</td>
9+
${((i + 1) % columns) === 0 ? '</tr><tr>' : ''}`;
10+
11+
const ro2ja = jpSet => jpSet.map(({ ja, ro }) => ({ x: ro, z: ja }));
12+
const ja2ro = jpSet => jpSet.map(({ ja, ro }) => ({ x: ja, z: ro }));
13+
14+
const shuffleEqSetRo2Ja = jpSet => shuffle(ro2ja(jpSet));
15+
const shuffleEqSetJa2Ro = jpSet => shuffle(ja2ro(jpSet));
16+
17+
18+
// Japanese Homework sets
19+
hwSets["hiragana-ro2ja-a-na"] = {
20+
title: "Hiragana Romanized to Kana (A to NA)", category: "Japanese", columns: 5,
21+
myGenEqList: () => shuffleEqSetRo2Ja(hiraganaSets["A-NA"]), outputFunc: jpOutput,
22+
};
23+
hwSets["hiragana-ro2ja-ha-wa"] = {
24+
title: "Hiragana Romanized to Kana (HA to WA)", category: "Japanese", columns: 5,
25+
myGenEqList: () => shuffleEqSetRo2Ja(hiraganaSets["HA-WA"]), outputFunc: jpOutput,
26+
};
27+
hwSets["hiragana-ro2ja-digraphs"] = {
28+
title: "Hiragana Digraphs Romanized to Kana", category: "Japanese", columns: 5,
29+
myGenEqList: () => shuffleEqSetRo2Ja(hiraganaSets["Digraphs"]), outputFunc: jpOutput,
30+
};
31+
hwSets["hiragana-ja2ro-a-na"] = {
32+
title: "Hiragana Kana to Romanized (A to NA)", category: "Japanese", columns: 5,
33+
myGenEqList: () => shuffleEqSetJa2Ro(hiraganaSets["A-NA"]), outputFunc: jpOutput,
34+
};
35+
hwSets["hiragana-ja2ro-ha-wa"] = {
36+
title: "Hiragana Kana to Romanized (HA to WA)", category: "Japanese", columns: 5,
37+
myGenEqList: () => shuffleEqSetJa2Ro(hiraganaSets["HA-WA"]), outputFunc: jpOutput,
38+
};
39+
hwSets["hiragana-ja2ro-digraphs"] = {
40+
title: "Hiragana Digraphs Kana to Romanized", category: "Japanese", columns: 5,
41+
myGenEqList: () => shuffleEqSetJa2Ro(hiraganaSets["Digraphs"]), outputFunc: jpOutput,
42+
};
43+
44+
hwSets["katakana-ro2ja-a-na"] = {
45+
title: "Katakana Romanized to Kana (A to NA)", category: "Japanese", columns: 5,
46+
myGenEqList: () => shuffleEqSetRo2Ja(katakanaSets["A-NA"]), outputFunc: jpOutput,
47+
};
48+
hwSets["katakana-ro2ja-ha-wa"] = {
49+
title: "Katakana Romanized to Kana (HA to WA)", category: "Japanese", columns: 5,
50+
myGenEqList: () => shuffleEqSetRo2Ja(katakanaSets["HA-WA"]), outputFunc: jpOutput,
51+
};
52+
hwSets["katakana-ro2ja-digraphs"] = {
53+
title: "Katakana Digraphs Romanized to Kana", category: "Japanese", columns: 5,
54+
myGenEqList: () => shuffleEqSetRo2Ja(katakanaSets["Digraphs"]), outputFunc: jpOutput,
55+
};
56+
hwSets["katakana-ja2ro-a-na"] = {
57+
title: "Katakana Kana to Romanized(A to NA)", category: "Japanese", columns: 5,
58+
myGenEqList: () => shuffleEqSetJa2Ro(katakanaSets["A-NA"]), outputFunc: jpOutput,
59+
};
60+
hwSets["katakana-ja2ro-ha-wa"] = {
61+
title: "Katakana Kana to Romanized (HA to WA)", category: "Japanese", columns: 5,
62+
myGenEqList: () => shuffleEqSetJa2Ro(katakanaSets["HA-WA"]), outputFunc: jpOutput,
63+
};
64+
hwSets["katakana-ja2ro-digraphs"] = {
65+
title: "Katakana Digraphs Kana to Romanizeda", category: "Japanese", columns: 5,
66+
myGenEqList: () => shuffleEqSetJa2Ro(katakanaSets["Digraphs"]), outputFunc: jpOutput,
67+
};

src/js/hw-sets.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ const hwSets = {
120120
title: "Addition 1-digit Equations", category: "Addition",
121121
columns: 4,
122122
useAllPossible1Digit: true,
123-
xSize: 1, ySize: 1,
123+
xSize: 1, ySize: 1, //number of digits in x & y.
124124
mathSymbol: "+",
125125
outputFunc: (eq, i, columns) => horizontalEq(eq, i, columns, "+"),
126126
},

src/js/jp-data.js

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
const hiraganaCsv = "あ,a,い,i,う,u,え,e,お,o,か,ka,き,ki,く,ku,け,ke,こ,ko,さ,sa,し,shi,す,su,せ,se,そ,so,た,ta,ち,chi,つ,tsu,て,te,と,to,な,na,に,ni,ぬ,nu,ね,ne,の,no,は,ha,ひ,hi,ふ,hu,へ,he,ほ,ho,ま,ma,み,mi,む,mu,め,me,も,mo,や,ya,ゆ,yu,よ,yo,ら,ra,り,ri,る,ru,れ,re,ろ,ro,わ,wa,を,wo,ん,n,が,ga,ぎ,gi,ぐ,gu,げ,ge,ご,go,ざ,za,じ,ji,ず,zu,ぜ,ze,ぞ,zo,だ,da,ぢ,ji,づ,zu,で,de,ど,do,ば,ba,び,bi,ぶ,bu,べ,be,ぼ,bo,ぱ,pa,ぴ,pi,ぷ,pu,ぺ,pe,ぽ,po,きゃ,kya,きゅ,kyu,きょ,kyo,しゃ,sha,しゅ,shu,しょ,sho,ちゃ,cha,ちゅ,chu,ちょ,cho,にゃ,nya,にゅ,nyu,にょ,nyo,ひゃ,hya,ひゅ,hyu,ひょ,hyo,みゃ,mya,みゅ,myu,みょ,myo,りゃ,rya,りゅ,ryu,りょ,ryo,ぎゃ,gya,ぎゅ,gyu,ぎょ,gyo,じゃ,ja,じゅ,ju,じょ,jo,びゃ,bya,びゅ,byu,びょ,byo,ぴゃ,pya,ぴゅ,pyu,ぴょ,pyo";
2+
const katakanaCsv = "ア,a,イ,i,ウ,u,エ,e,オ,o,カ,ka,キ,ki,ク,ku,ケ,ke,コ,ko,サ,sa,シ,shi,ス,su,セ,se,ソ,so,タ,ta,チ,chi,ツ,tsu,テ,te,ト,to,ナ,na,ニ,ni,ヌ,nu,ネ,ne,ノ,no,ハ,ha,ヒ,hi,フ,hu,ヘ,he,ホ,ho,マ,ma,ミ,mi,ム,mu,メ,me,モ,mo,ヤ,ya,ユ,yu,ヨ,yo,ラ,ra,リ,ri,ル,ru,レ,re,ロ,ro,ワ,wa,ヲ,wo,ン,n,ガ,ga,ギ,gi,グ,gu,ゲ,ge,ゴ,go,ザ,za,ジ,ji,ズ,zu,ゼ,ze,ゾ,zo,ダ,da,ヂ,ji,ヅ,zu,デ,de,ド,do,バ,ba,ビ,bi,ブ,bu,ベ,be,ボ,bo,パ,pa,ピ,pi,プ,pu,ペ,pe,ポ,po,キャ,kya,キュ,kyu,キョ,kyo,シャ,sha,シュ,shu,ショ,sho,チャ,cha,チュ,chu,チョ,cho,ニャ,nya,ニュ,nyu,ニョ,nyo,ヒャ,hya,ヒュ,hyu,ヒョ,hyo,ミャ,mya,ミュ,myu,ミョ,myo,リャ,rya,リュ,ryu,リョ,ryo,ギャ,gya,ギュ,gyu,ギョ,gyo,ジャ,ja,ジュ,ju,ジョ,jo,ビャ,bya,ビュ,byu,ビョ,byo,ピャ,pya,ピュ,pyu,ピョ,pyo,イィ,yi,イェ,ye,ヴァ,va,ヴィ,vi,ヴ,vu,ヴェ,ve,ヴォ,vo,ヴャ,vya,ヴュ,vyu,ヴョ,vyo,シェ,she,ジェ,je,チェ,che,スァ,swa,スィ,swi,スゥ,swu,スェ,swe,スォ,swo,スャ,sya,スュ,syu,スョ,syo,セィ,si,ズァ,zwa,ズィ,zwi,ズゥ,zwu,ズェ,zwe,ズォ,zwo,ズャ,zya,ズュ,zyu,ズョ,zyo,ゼィ,zi,ツァ,tsa,ツィ,tsi,ツェ,tse,ツォ,tso,テァ,tha,ティ,ti,テゥ,thu,テェ,tye,テォ,tho,テャ,tya,テュ,tyu,テョ,tyo,デァ,dha,ディ,di,デゥ,dhu,デェ,dye,デォ,dho,デャ,dya,デュ,dyu,デョ,dyo,トァ,twa,トィ,twi,トゥ,tu,トェ,twe,トォ,two,ドァ,dwa,ドィ,dwi,ドゥ,du,ドェ,dwe,ドォ,dwo,ファ,fa,フィ,fi,ホゥ,hu,フェ,fe,フォ,fo,フャ,fya,フュ,fyu,フョ,fyo,リィ,ryi,リェ,rye,ウァ,(wa),ウィ,wi,ウゥ,(wu),ウェ,we,ウォ,wo,ウャ,wya,ウュ,wyu,ウョ,wyo,クァ,kwa,クィ,kwi,クゥ,kwu,クェ,kwe,クォ,kwo,グァ,gwa,グィ,gwi,グゥ,gwu,グェ,gwe,グォ,gwo,ムァ,mwa,ムィ,mwi,ムゥ,mwu,ムェ,mwe,ムォ,mwo";
3+
4+
const csvToJaRo = csvStr => {
5+
const arr = csvStr.split`,`;
6+
return arr.reduce((prev, curr, i) => {
7+
if (i % 2) prev.push({ja: arr[i - 1], ro: curr});
8+
return prev;
9+
}, []);
10+
};
11+
12+
const hiragana = csvToJaRo(hiraganaCsv);
13+
const katakana = csvToJaRo(katakanaCsv);
14+
15+
const hiraganaSets = {
16+
"A-NA": hiragana.filter(({ro}) => ro === "chi" || (
17+
"aiueokstn".includes(ro[0]) && ro[1] !== "y"
18+
&& !"sha,shu,sho,n".split`,`.includes(ro)
19+
)),
20+
"HA-WA": hiragana.filter(({ro}) => "hmyrw".includes(ro[0]) && ro[1] !== "y" || ro === "n"),
21+
//"Non-Digraphs": hiragana.filter(({ro}) => ro[1] !== "y"),
22+
"Digraphs": hiragana.filter(({ro}) => ro[1] === "y"),
23+
};
24+
25+
const katakanaSets = {
26+
"A-NA": katakana.filter(({ro, ja}) => ro === "chi" || (
27+
"aiueokstnc".includes(ro[0])
28+
&& !"yw".includes(ro[1])
29+
&& !(ro.length === 2 && ja[0] === "ウ")
30+
&& !"n,she,si,tsa,tsi,tse,tso,tha,ti,thu,tho,tu,sha,shu,sho,cha,chu,cho,che".split`,`.includes(ro)
31+
)),
32+
"HA-WA": katakana.filter(({ro}) => ro === "n" || ("hmyrw".includes(ro[0]) && ro[1] !== "y"
33+
&& !"yi,ye,hu,wi,we,mwa,mwi,mwu,mwe,mwo".split`,`.includes(ro))),
34+
//"Non-Digraphs": katakana.filter(({ro}) => ro[1] !== "y"),
35+
"Digraphs": katakana.filter(({ro}) => ro[1] === "y"),
36+
};
37+
38+
console.log(hiragana);
39+
40+
41+
const printAllSets = set => {
42+
printSet(set, "A-NA")
43+
printSet(set, "HA-WA")
44+
printSet(set, "Digraphs")
45+
};
46+
const printSet = (set, name) => {
47+
console.log("===================", name)
48+
console.log(set[name].length, set[name])
49+
console.log(set[name].map(a => a.ro).join(","))
50+
};
51+
printAllSets(hiraganaSets);
52+
printAllSets(katakanaSets);

src/js/util.js

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ const countable = "⚽️ 🏀 🏈 ⚾️ 🥎 🎾 🏐 🚗 🚕 🚙 🚌
33
const rand = max => Math.floor(Math.random() * max);
44
const randRange = (min, max) => rand(max - min) + min;
55
const randArr = arr => arr[rand(arr.length)];
6+
const shuffle = arr => arr.map(val => ({ val, sort: Math.random() }))
7+
.sort((a, b) => a.sort - b.sort)
8+
.map(({val}) => val)
9+
;
610
const SINGLE_DIGITS = [2,3,4,5,6,7,8,9];
711
const randNoOnes = () => randArr(SINGLE_DIGITS);
812
const randRangeByDigits = digits => {

src/style.css

+8
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@ tr.long > td > div.vert-equation > .answer-input { width: 10rem; }
114114
border-bottom: 3px solid black;
115115
text-align: center;
116116
}
117+
.answer-input.box {
118+
border: 3px solid black;
119+
text-align: center;
120+
width: 10rem;
121+
height: 10rem;
122+
margin: 0 auto;
123+
display: block;
124+
}
117125
.answer-key-table { font-size: 16px; border: 1px solid gray; }
118126
.answer-key { width: 5rem; display: inline-block; }
119127
/* .worksheets-view-panel { margin-top: -1rem; } */

0 commit comments

Comments
 (0)