HACK: If guessing English input, try Romaji input as well
[jmdict-cli.git] / kana2romaji.cpp
index a51b7ec2ff85a2d788bd7cdff0d3f24e05bfa82d..8508f764c1794ad46e27605236bac4f83427635d 100644 (file)
@@ -324,13 +324,15 @@ void initRomaji() {
     romaji["`"] = "`";
     romaji["|"] = "|";
     romaji["~"] = "~";
-    romaji["ー"] = "-";
+    romaji["ー"] = "";
     romaji["。"] = ".";
     romaji["、"] = ",";
     romaji["〜"] = "~";
     romaji["−"] = "-";
     romaji["―"] = "-";
     romaji[" "] = " ";
+
+    romaji["ー"] = "\3";
 }
 
 void remove_quote_1(
@@ -359,7 +361,7 @@ void kana2romaji(const string& kana, string& rom) {
         if (trans == romaji.end()) {
             rom += ch;
             if (ch.size() > 1)
-                cout << "Don't know how to translate '" << ch << "' in '" << kana << "' to romaji." << endl;
+                cout << "Don't know how to translate '" << ch << "' in '" << kana << "' to romaji.\n";
         }
         else
             rom += trans->second;
@@ -372,13 +374,16 @@ void kana2romaji(const string& kana, string& rom) {
                string const pred = rom.substr(pos - 3, 3);
                if(pred == "chi" ||
                   pred == "shi" ||
-                  pred == "dzi"
+                  pred == "dzi" ||
+                  pred == "tsu" ||
+                  pred == "shi"
                ) {
                  remove_quote_1(pos, rom);
                  pos -= 2;
+                 continue;
                }
             }
-            else if (pos > 1) {
+            if (pos > 1) {
              
                string const pred = rom.substr(pos - 2, 2);
                if(pred == "ki" ||
@@ -403,6 +408,7 @@ void kana2romaji(const string& kana, string& rom) {
                       ? 3
                       : 2);
                   pos -= 2;
+                 continue;
                }
                else if(
                   pred == "fu" ||
@@ -412,22 +418,93 @@ void kana2romaji(const string& kana, string& rom) {
                {
                   remove_quote_1(pos, rom);
                   pos -= 2;
+                 continue;
+               }
+               else if(
+                 pred == "su" ||
+                 pred == "zu" ||
+                 pred == "te" ||
+                 pred == "de" ||
+                 pred == "ku" ||
+                 pred == "gu" ||
+                 pred == "mu"
+               )
+               {
+                 rom[pos - 1] = 'w'; 
+                 rom.erase(pos, 1);
+                 --pos;
+                 continue;
+               }
+               else if(
+                 pred == "to" ||
+                 pred == "do"
+               )
+               {
+                 rom[pos - 1] = 'h';
+                 rom.erase(pos, 1);
+                 --pos;
+                 continue;
                }
             }
+
+            if (pos > 0) {
+              char const pred = rom[pos - 1];
+
+              switch(pred)
+              {
+              case 'a':
+              case 'i':
+              case 'u':
+              case 'e':
+              case 'o':
+                rom.erase(pos, 1);
+                --pos;
+                break;
+              default:
+                cout << "Encountered a special character in " << kana << " but don't know what to do with it.\n";
+              }
+            }
             else
             {
-              rom.erase(pos);
+              rom.erase(pos, 1);
               --pos;
             }
         }
         else if (rom[pos] == '\2')
         {
-          if(pos + 1 < rom.size())
+         // two tsu may follow each other, so just remove them
+          if(pos + 1 < rom.size() && rom[pos + 1] != '\2')
             rom[pos] = rom[pos + 1];
           else
           {
-            rom.erase(pos);
+            rom.erase(pos, 1);
             --pos;
           }
         }
+        else if (rom[pos] == '\3')
+        {
+          if(pos == 0)
+          {
+            if(rom.size() == 1)
+              rom = "chouon";
+            else
+            {
+              cout << "ー is the first letter of " << kana << ". Don't know how to translate this.\n";
+              rom.erase(pos, 1);
+              --pos;
+            }
+          }
+          else
+            rom[pos] = rom[pos-1];
+        }
+
+  for (string::size_type pos = 0; pos < rom.size(); ++pos)
+    switch(rom[pos])
+    {
+    case '\1':
+    case '\2':
+    case '\3':
+      cout << "Failed to translate " << kana << '\n';
+      return;
+    }
 }