-
Notifications
You must be signed in to change notification settings - Fork 2
/
Program.cs
184 lines (156 loc) · 7.25 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
namespace Wacton.Desu.ExampleConsole
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Wacton.Desu.Enums;
using Wacton.Desu.Japanese;
using Wacton.Desu.Kanji;
using Wacton.Desu.Names;
using Wacton.Desu.Romaji;
public class Program
{
private const bool GenerateExampleJson = false;
private const bool UseAsync = true;
private static readonly Random Random = new();
private static readonly Transliterator Transliterator = new();
public static async Task Main()
{
Console.OutputEncoding = Encoding.UTF8;
if (GenerateExampleJson)
{
OutputLine("Generating example JSON files...");
await SaveAsJson.JapaneseEntry();
await SaveAsJson.NameEntry();
await SaveAsJson.KanjiEntry();
await SaveAsJson.RadicalFromKanjiEntry();
await SaveAsJson.RadicalToKanjiEntry();
await SaveAsJson.StrokeEntry();
}
OutputLine("Getting dictionaries...");
if (UseAsync)
{
await RunAsync();
}
else
{
RunSync();
}
}
private static async Task RunAsync()
{
var japaneseDictionaryStopwatch = new Stopwatch();
var nameDictionaryStopwatch = new Stopwatch();
var kanjiDictionaryStopwatch = new Stopwatch();
japaneseDictionaryStopwatch.Start();
var japaneseEntries = (await JapaneseDictionary.ParseEntriesAsync()).ToList();
japaneseDictionaryStopwatch.Stop();
nameDictionaryStopwatch.Start();
var nameEntries = (await NameDictionary.ParseEntriesAsync()).ToList();
nameDictionaryStopwatch.Stop();
kanjiDictionaryStopwatch.Start();
var kanjiEntries = (await KanjiDictionary.ParseEntriesAsync()).ToList();
kanjiDictionaryStopwatch.Stop();
var japaneseDictionaryCreationDate = await JapaneseDictionary.ParseCreationDateAsync();
var nameDictionaryCreationDate = await NameDictionary.ParseCreationDateAsync();
var kanjiDictionaryCreationDate = await KanjiDictionary.ParseCreationDateAsync();
OutputParseTimes(
japaneseDictionaryStopwatch.Elapsed, japaneseDictionaryCreationDate, japaneseEntries.Count,
nameDictionaryStopwatch.Elapsed, nameDictionaryCreationDate, nameEntries.Count,
kanjiDictionaryStopwatch.Elapsed, kanjiDictionaryCreationDate, kanjiEntries.Count);
while (true)
{
OutputRandomJapaneseEntry(japaneseEntries, kanjiEntries);
}
}
private static void RunSync()
{
var japaneseDictionaryStopwatch = new Stopwatch();
var nameDictionaryStopwatch = new Stopwatch();
var kanjiDictionaryStopwatch = new Stopwatch();
japaneseDictionaryStopwatch.Start();
var japaneseEntries = JapaneseDictionary.ParseEntries().ToList();
japaneseDictionaryStopwatch.Stop();
nameDictionaryStopwatch.Start();
var nameEntries = NameDictionary.ParseEntries().ToList();
nameDictionaryStopwatch.Stop();
kanjiDictionaryStopwatch.Start();
var kanjiEntries = KanjiDictionary.ParseEntries().ToList();
kanjiDictionaryStopwatch.Stop();
var japaneseDictionaryCreationDate = JapaneseDictionary.ParseCreationDate();
var nameDictionaryCreationDate = NameDictionary.ParseCreationDate();
var kanjiDictionaryCreationDate = KanjiDictionary.ParseCreationDate();
OutputParseTimes(
japaneseDictionaryStopwatch.Elapsed, japaneseDictionaryCreationDate, japaneseEntries.Count,
nameDictionaryStopwatch.Elapsed, nameDictionaryCreationDate, nameEntries.Count,
kanjiDictionaryStopwatch.Elapsed, kanjiDictionaryCreationDate, kanjiEntries.Count);
while (true)
{
OutputRandomJapaneseEntry(japaneseEntries, kanjiEntries);
}
}
private static void OutputParseTimes(
TimeSpan japaneseTimeSpan, DateTime japaneseCreationDate, int japaneseCount,
TimeSpan nameTimeSpan, DateTime nameCreationDate, int nameCount,
TimeSpan kanjiTimeSpan, DateTime kanjiCreationDate, int kanjiCount)
{
OutputLine(string.Empty);
OutputLine($"JMdict time to parse: {japaneseTimeSpan}");
OutputLine($"JMdict created: {japaneseCreationDate.ToShortDateString()}");
OutputLine($"JMdict entries: {japaneseCount}");
OutputLine(string.Empty);
OutputLine($"JMnedict time to parse: {nameTimeSpan}");
OutputLine($"JMnedict created: {nameCreationDate.ToShortDateString()}");
OutputLine($"JMnedict entries: {nameCount}");
OutputLine(string.Empty);
OutputLine($"kanjidict2 time to parse: {kanjiTimeSpan}");
OutputLine($"kanjidict2 created: {kanjiCreationDate.ToShortDateString()}");
OutputLine($"kanjidict2 entries: {kanjiCount}");
OutputLine(string.Empty);
}
private static void OutputRandomJapaneseEntry(IReadOnlyList<IJapaneseEntry> japaneseEntries, IReadOnlyList<IKanjiEntry> kanjiEntries)
{
OutputStartEntry();
var index = Random.Next(0, japaneseEntries.Count);
var japaneseEntry = japaneseEntries[index];
var romaji = Transliterator.GetRomaji(japaneseEntry.Readings.First().Text);
OutputLine($"{index} / {japaneseEntries.Count}");
OutputLine($"{japaneseEntry} >>> \"{romaji}\" ");
var firstKanji = japaneseEntry.Kanjis.FirstOrDefault()?.Text;
if (firstKanji == null)
{
OutputEndEntry();
return;
}
foreach (var character in firstKanji)
{
var kanjiEntry = kanjiEntries.SingleOrDefault(kanji => kanji.Literal.Equals(character.ToString()));
if (kanjiEntry == null)
{
continue;
}
var literal = kanjiEntry.Literal;
var radicalDecomposition = string.Join(" ", kanjiEntry.RadicalDecomposition);
var kanjiMeaning = !kanjiEntry.Meanings.Any() ? string.Empty : kanjiEntry.Meanings.First(meaning => meaning.Language.Equals(Language.English)).Term;
OutputLine($"{literal} -> {radicalDecomposition} ({kanjiMeaning})");
}
OutputEndEntry();
}
private static void OutputLineBreak() => OutputLine("------------------------------");
private static void OutputStartEntry() => OutputLineBreak();
private static void OutputEndEntry()
{
OutputLineBreak();
OutputLine(string.Empty);
Console.ReadKey();
}
private static void OutputLine(string text)
{
Debug.WriteLine(text);
Console.WriteLine(text);
}
}
}