From 9be13bdf1f02a494ddc05890ee75b6c76f9d0698 Mon Sep 17 00:00:00 2001 From: G C Date: Fri, 28 Aug 2020 11:38:45 +0100 Subject: [PATCH] Kanji Test and Reverse Anki Generation --- .../Japanese Conjugation Helper.vbproj | 12 + Japanese Conjugation Helper/Module1.vb | 364 +++++++++++++++++- Japanese Conjugation Helper/packages.config | 1 + 3 files changed, 373 insertions(+), 4 deletions(-) diff --git a/Japanese Conjugation Helper/Japanese Conjugation Helper.vbproj b/Japanese Conjugation Helper/Japanese Conjugation Helper.vbproj index 337ac45..d5a9225 100644 --- a/Japanese Conjugation Helper/Japanese Conjugation Helper.vbproj +++ b/Japanese Conjugation Helper/Japanese Conjugation Helper.vbproj @@ -30,6 +30,8 @@ 1.0.0.%2a false true + + AnyCPU @@ -70,6 +72,9 @@ + + ..\packages\CSAudioConverter.1.1.3\lib\net461\CSAudioConverter.dll + ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll @@ -152,4 +157,11 @@ + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + \ No newline at end of file diff --git a/Japanese Conjugation Helper/Module1.vb b/Japanese Conjugation Helper/Module1.vb index fef24d7..37d3746 100644 --- a/Japanese Conjugation Helper/Module1.vb +++ b/Japanese Conjugation Helper/Module1.vb @@ -30,10 +30,14 @@ Module Module1 Main() End If - If Word = "@" Then + If Word = "/ranki" Or Word = "/revanki" Or Word = "/reverseanki" Or Word = "/reversea" Then ReverseAnki() End If + If Word = "/kt" Or Word = "/kanji" Or Word = "/kanjitest" Or Word = "/k" Then + KanjiTest() + End If + Dim Translated As String = "" If Left(Word, 1) = "!" Then Word = Mid(Word, 2) @@ -1131,7 +1135,7 @@ Module Module1 Try 'Kanji, meanings and reading extract. First open the "/word" page and then extracts instead of extracting from "/search": Dim WordWordURL As String = ("https://jisho.org/word/" & ActualSearchWord) - + WordHTML = Client.DownloadString(New Uri(WordWordURL)) @@ -3339,6 +3343,359 @@ Module Module1 Main() End Sub + Sub KanjiTest() + '小週票用発表田島多摩伊 + Const QUOTE = """" + Dim ActualSearchWord As String + Dim WordWordURL As String + Dim WordHTML As String = "" + Dim Client As New WebClient + Dim Correct As Boolean = False + Dim Answer As String = "" + Dim CutCorrect As String = "" + Dim NeedWork() As String = {""} + Dim Wrong As Integer = 0 + Dim Multiple As Boolean = False + Dim PrevAns As String = "" + + Console.Clear() + Console.WriteLine("Paste any string of Japanese text (must contain kanji)") + Dim KanjisString As String = Console.ReadLine + + Client.Encoding = System.Text.Encoding.UTF8 + For Kanji = 1 To KanjisString.Length + ActualSearchWord = Mid(KanjisString, Kanji, 1) + + Try + 'Kanji, meanings and reading extract. First open the "/word" page and then extracts instead of extracting from "/search": + WordWordURL = ("https://jisho.org/word/" & ActualSearchWord) + WordHTML = Client.DownloadString(New Uri(WordWordURL)) + Catch + Continue For + End Try + + Dim KanjiInfo As String = "" + Try + KanjiInfo = RetrieveClassRange(WordHTML, "", "KanjiInfo") + Catch + Continue For + End Try + + If KanjiInfo = "" Then + Continue For + End If + + Dim KanjiGroupEnd As Integer 'This is going to detect "Details" (the end of a group of kanji info for one kanji) + Dim KanjiGroup(0) As String 'This will store each Kanji group in an array + Dim I As Integer = -1 'This will store the index of which kanji group the loop is on, indexing starts at 0, thus " = 0" + Dim LastDetailsIndex As Integer = KanjiInfo.LastIndexOf("Details") + + Try + KanjiInfo = Left(KanjiInfo, LastDetailsIndex) + + Dim Finished As Boolean = False + Do Until Finished = True 'Do until no more end splitters can be found. The sentences that are pasted won't end in "|" because of how the AHK sentence grabber works + I += 1 + Array.Resize(KanjiGroup, KanjiGroup.Length + 1) + KanjiGroupEnd = KanjiInfo.IndexOf("Details") + 10 + If KanjiGroupEnd = 9 Then '(-1 but at add because of the above line. This means if "Details" isn't found + KanjiGroup(I) = KanjiInfo + Finished = True + Continue Do + End If + + KanjiGroup(I) = Mid(KanjiInfo, 6, KanjiGroupEnd - 5) + KanjiInfo = Mid(KanjiInfo, KanjiGroupEnd) + Loop + Array.Resize(KanjiGroup, KanjiGroup.Length - 1) + Catch + + End Try + + Dim ActualInfo(KanjiGroup.Length - 1, 3) 'X = Kanji (group), Y = Info type. + + Try + 'Y indexs: + '0 = Kanji + '1 = English meaning(s) (I will concatinate multiple meanings) + '2 = kun readings (concatentated if needed, usually so) + '3 = on readings (concatentated if needed, usually so) + Dim FirstFinder As Integer + Dim SecondFinder As Integer + + Dim AllEng, AllKun, AllOn As Boolean + AllEng = False + AllKun = False + AllOn = False + Dim LastReadingFound As Boolean = False 'This is used to find the last reading of a kanji, it knows that it is a last because it ends in "、" and not "" + Dim JustEng As String + Dim KunReading, OnReading, ReadingSnip As String + + KanjiGroup(KanjiGroup.Length - 1) = Mid(KanjiGroup(KanjiGroup.Length - 1), 5) 'This lets the last group work + + For Looper = 0 To KanjiGroup.Length - 1 + Try 'This is for if there are no kanji + FirstFinder = KanjiGroup(Looper).IndexOf("") + Catch + Console.ReadLine() + Main() + End Try + 'KanjiGroup(Looper) = Mid(KanjiGroup(Looper), FirstFinder + 10) + ActualInfo(Looper, 0) = Mid(KanjiGroup(Looper), FirstFinder, 1) + + FirstFinder = KanjiGroup(Looper).IndexOf("sense") + KanjiGroup(Looper) = Mid(KanjiGroup(Looper), FirstFinder + 10) + + FirstFinder = KanjiGroup(Looper).IndexOf("") + + + JustEng = Left(KanjiGroup(Looper), FirstFinder) + + JustEng = Mid(JustEng, 18) + JustEng = Left(JustEng, JustEng.Length - 14) + KanjiGroup(Looper) = KanjiGroup(Looper).Replace(JustEng, "") + + JustEng = JustEng.Replace(" ", "") + FirstFinder = JustEng.IndexOf("") + SecondFinder = JustEng.IndexOf("") + Try + JustEng = JustEng.Replace(Mid(JustEng, FirstFinder, SecondFinder + 7 - FirstFinder), "") + Catch + + End Try + + JustEng = JustEng.Replace(",", ", ") + 'JustEng = Left(JustEng, 1).ToUpper & Mid(JustEng, 2) + + ActualInfo(Looper, 1) = JustEng + + 'Splitting the rest of the HTML (KanjiGroup) into Kun and On readings: + FirstFinder = KanjiGroup(Looper).IndexOf("on readings") - 12 + KunReading = Left(KanjiGroup(Looper), FirstFinder) + OnReading = Mid(KanjiGroup(Looper), FirstFinder) + + LastReadingFound = False + Do Until LastReadingFound = True + If KunReading.IndexOf("、") <> -1 Then 'If the reading that is about to be snipped isn't the last + SecondFinder = KunReading.IndexOf("、") + FirstFinder = Left(KunReading, SecondFinder).LastIndexOf(">") + ReadingSnip = Mid(KunReading, FirstFinder + 2, SecondFinder - 1 - FirstFinder) + + ActualInfo(Looper, 2) &= ReadingSnip.ToLower & ", " 'Adding the reading to the Actual info array + + KunReading = Mid(KunReading, SecondFinder + 10) + + ElseIf KunReading.IndexOf("<") <> -1 Then 'If it is the last, "<" is just the beginning of "" + SecondFinder = KunReading.IndexOf("") + FirstFinder = Left(KunReading, SecondFinder).LastIndexOf(">") + ReadingSnip = Mid(KunReading, FirstFinder + 2, SecondFinder - 1 - FirstFinder) + + ActualInfo(Looper, 2) &= ReadingSnip.ToLower 'Adding the reading to the Actual info array + + LastReadingFound = True + Else + LastReadingFound = True + End If + Loop + LastReadingFound = False + Do Until LastReadingFound = True + If OnReading.IndexOf("、") <> -1 Then 'If the reading that is about to be snipped isn't the last + SecondFinder = OnReading.IndexOf("、") + FirstFinder = Left(OnReading, SecondFinder).LastIndexOf(">") + ReadingSnip = Mid(OnReading, FirstFinder + 2, SecondFinder - 1 - FirstFinder) + + ActualInfo(Looper, 3) &= ReadingSnip.ToLower & ", " 'Adding the reading to the Actual info array + + OnReading = Mid(OnReading, SecondFinder + 10) + + ElseIf OnReading.IndexOf("<") <> -1 Then 'If it is the last, "<" is just the beginning of "" + SecondFinder = OnReading.IndexOf("") + FirstFinder = Left(OnReading, SecondFinder).LastIndexOf(">") + ReadingSnip = Mid(OnReading, FirstFinder + 2, SecondFinder - 1 - FirstFinder) + + ActualInfo(Looper, 3) &= ReadingSnip.ToLower 'Adding the reading to the Actual info array + + LastReadingFound = True + Else + LastReadingFound = True + End If + + Loop + 'Console.BackgroundColor = ConsoleColor.DarkGray + 'Console.WriteLine(ActualInfo(Looper, 0) & " - " & ActualInfo(Looper, 1)) + 'Console.BackgroundColor = ConsoleColor.Black + 'Console.WriteLine(ActualInfo(Looper, 2)) + 'Console.WriteLine(ActualInfo(Looper, 3)) + 'Console.WriteLine("Found in: " & JustResultsScraper(ActualInfo(Looper, 0), 1, ActualSearchWord)) + ActualInfo(Looper, 1) = ActualInfo(Looper, 1) & "," + ActualInfo(Looper, 2) = ActualInfo(Looper, 2) & "," + + + Wrong = 0 + Correct = False + Multiple = False + For Attempt = 1 To 2 + Console.Clear() + Console.WriteLine("Kanji: " & ActualInfo(Looper, 0)) + Console.Write("Meaning: ") + Answer = Console.ReadLine + + Dim CorrectAnswers() As String = ActualInfo(Looper, 1).split(",") + If CorrectAnswers.Length > 3 Then + Multiple = True + End If + + For Check = 0 To CorrectAnswers.Length - 1 + If Answer = CorrectAnswers(Check).Trim And CorrectAnswers(Check).Trim <> "" Then + Attempt = 2 + Check = CorrectAnswers.Length - 1 + Correct = True + Continue For + End If + Next + If Correct = False Then + Wrong += 1 + End If + Next + + Multiple = False + Correct = False + If ActualInfo(Looper, 2) <> "," Then + For Attempt = 1 To 2 + Console.Clear() + Console.WriteLine("Kanji: " & ActualInfo(Looper, 0)) + Console.WriteLine("Meaning: " & ActualInfo(Looper, 1)) + Console.Write("Kun Readings: ") + Answer = Console.ReadLine + Answer = Answer.Replace("-", "") + + Dim CorrectAnswers() As String = ActualInfo(Looper, 2).split(",") + For Check = 0 To CorrectAnswers.Length - 1 + If CorrectAnswers(Check).IndexOf(".") <> -1 Then + CorrectAnswers(Check) = Left(CorrectAnswers(Check), CorrectAnswers(Check).IndexOf(".")) + End If + CorrectAnswers(Check) = CorrectAnswers(Check).Replace("-", "") + + If Answer = CorrectAnswers(Check).Trim And CorrectAnswers(Check).Trim <> "" Then + Attempt = 2 + Check = CorrectAnswers.Length - 1 + Correct = True + Continue For + End If + Next + If Correct = False Then + Wrong += 1 + End If + Next + Else + ActualInfo(Looper, 2) = "" + End If + + Correct = False + If ActualInfo(Looper, 3) <> "," Then + For Attempt = 1 To 2 + Console.Clear() + Console.WriteLine("Kanji: " & ActualInfo(Looper, 0)) + Console.WriteLine("Meaning: " & ActualInfo(Looper, 1)) + Console.WriteLine("Kun Readings: " & ActualInfo(Looper, 2)) + Console.Write("On Readings: ") + Answer = Console.ReadLine + Answer = Answer.Replace("-", "") + + Dim CorrectAnswers() As String = ActualInfo(Looper, 3).split(",") + For Check = 0 To CorrectAnswers.Length - 1 + If CorrectAnswers(Check).IndexOf(".") <> -1 Then + CorrectAnswers(Check) = Left(CorrectAnswers(Check), CorrectAnswers(Check).IndexOf(".")) + End If + CorrectAnswers(Check) = CorrectAnswers(Check).Replace("-", "") + + If Answer = CorrectAnswers(Check).Trim And CorrectAnswers(Check).Trim <> "" Then + Attempt = 2 + Check = CorrectAnswers.Length - 1 + Correct = True + Continue For + End If + Next + If Correct = False Then + Wrong += 1 + End If + Next + Else + ActualInfo(Looper, 3) = "" + End If + + Array.Resize(NeedWork, NeedWork.Length + 1) + NeedWork(NeedWork.Length - 2) = ActualInfo(Looper, 0) & Wrong + + Console.Clear() + Console.WriteLine("Kanji: " & ActualInfo(Looper, 0)) + Console.WriteLine("Meaning: " & ActualInfo(Looper, 1)) + Console.WriteLine("Kun Readings: " & ActualInfo(Looper, 2)) + Console.WriteLine("On Readings: " & ActualInfo(Looper, 3)) + Console.ForegroundColor = ConsoleColor.DarkGray + Console.WriteLine(Wrong & " incorrect answers") + Console.ForegroundColor = ConsoleColor.White + Console.ReadLine() + Next + Catch + Console.WriteLine("...") + End Try + Next + + Array.Resize(NeedWork, NeedWork.Length - 1) + + Console.Clear() + If NeedWork.Length > 0 Then + 'Challenging + Console.WriteLine("Kanji you don't know:") + For Printer = 0 To NeedWork.Length - 1 + Wrong = Right(NeedWork(Printer), 1) + If Wrong > 3 Then + Console.WriteLine(Left(NeedWork(Printer), 1)) + End If + Next + + Console.WriteLine() + Console.WriteLine("Kanji that still needs work:") + For Printer = 0 To NeedWork.Length - 1 + Wrong = Right(NeedWork(Printer), 1) + If Wrong = 2 Or Wrong = 3 Then + Console.WriteLine(Left(NeedWork(Printer), 1)) + End If + Next + + For Printer = 0 To NeedWork.Length - 1 + Wrong = Right(NeedWork(Printer), 1) + If Wrong = 1 Then + If Printer = 0 Then + Console.WriteLine() + Console.WriteLine("Almost Easy Kanji:") + End If + Console.WriteLine(Left(NeedWork(Printer), 1)) + End If + Next + + Console.WriteLine() + Console.WriteLine("Easy Kanji") + For Printer = 0 To NeedWork.Length - 1 + Wrong = Right(NeedWork(Printer), 1) + If Wrong = 0 Then + Console.WriteLine(Left(NeedWork(Printer), 1)) + End If + Next + End If + + Console.WriteLine() + Console.WriteLine() + Console.ForegroundColor = ConsoleColor.DarkGray + Console.WriteLine("KanjiTest will be upgraded to be much better soon!") + Console.ForegroundColor = ConsoleColor.White + Console.ReadLine() + + Main() + End Sub + + Function RetrieveClassRange(ByVal HTML, ByRef Start, ByRef SnipEnd, ByVal ErrorMessage) 'Loading the website's HTML code and storing it in a HTML as a string: @@ -3856,7 +4213,6 @@ Module Module1 Return (ActualSearchWord & " (" & Snip & ")") End Function - Function GTranslate(ByVal inputtext As String, ByVal fromlangid As String, ByVal tolangid As String) As String inputtext = HttpUtility.HtmlAttributeEncode(inputtext) Dim step1 As New WebClient @@ -4234,7 +4590,7 @@ Module Module1 Array.Resize(ReversedCards, ReversedCards.Length - 1) End If - Dim TempSwitcher As String + Dim TempSwitcher As String = "" Dim TempCut1, TempCut2 As String Dim Texter As System.IO.StreamWriter If LastTime = 0 Then diff --git a/Japanese Conjugation Helper/packages.config b/Japanese Conjugation Helper/packages.config index 06ed7f0..7802fa9 100644 --- a/Japanese Conjugation Helper/packages.config +++ b/Japanese Conjugation Helper/packages.config @@ -1,5 +1,6 @@  + \ No newline at end of file