Finish documenting the tables
[zzz-pokedex.git] / pokedex / roomaji.py
index d1bae0f..e91c960 100644 (file)
@@ -2,6 +2,25 @@
 """Provides `romanize()` for romanizing simple Japanese text."""
 
 _roomaji_kana = {
+    # Hiragana
+    u'あ': 'a',     u'い': 'i',     u'う': 'u',     u'え': 'e',     u'お': 'o',
+    u'か': 'ka',    u'き': 'ki',    u'く': 'ku',    u'け': 'ke',    u'こ': 'ko',
+    u'さ': 'sa',    u'し': 'shi',   u'す': 'su',    u'せ': 'se',    u'そ': 'so',
+    u'た': 'ta',    u'ち': 'chi',   u'つ': 'tsu',   u'て': 'te',    u'と': 'to',
+    u'な': 'na',    u'に': 'ni',    u'ぬ': 'nu',    u'ね': 'ne',    u'の': 'no',
+    u'は': 'ha',    u'ひ': 'hi',    u'ふ': 'fu',    u'へ': 'he',    u'ほ': 'ho',
+    u'ま': 'ma',    u'み': 'mi',    u'む': 'mu',    u'め': 'me',    u'も': 'mo',
+    u'や': 'ya',                    u'ゆ': 'yu',                    u'よ': 'yo',
+    u'ら': 'ra',    u'り': 'ri',    u'る': 'ru',    u'れ': 're',    u'ろ': 'ro',
+    u'わ': 'wa',    u'ゐ': 'wi',                    u'ゑ': 'we',    u'を': 'wo',
+                                                                    u'ん': 'n',
+    u'が': 'ga',    u'ぎ': 'gi',    u'ぐ': 'gu',    u'げ': 'ge',    u'ご': 'go',
+    u'ざ': 'za',    u'じ': 'ji',    u'ず': 'zu',    u'ぜ': 'ze',    u'ぞ': 'zo',
+    u'だ': 'da',    u'ぢ': 'ji',    u'づ': 'dzu',   u'で': 'de',    u'ど': 'do',
+    u'ば': 'ba',    u'び': 'bi',    u'ぶ': 'bu',    u'べ': 'be',    u'ぼ': 'bo',
+    u'ぱ': 'pa',    u'ぴ': 'pi',    u'ぷ': 'pu',    u'ぺ': 'pe',    u'ぽ': 'po',
+
+    # Katakana
     u'ア': 'a',     u'イ': 'i',     u'ウ': 'u',     u'エ': 'e',     u'オ': 'o',
     u'カ': 'ka',    u'キ': 'ki',    u'ク': 'ku',    u'ケ': 'ke',    u'コ': 'ko',
     u'サ': 'sa',    u'シ': 'shi',   u'ス': 'su',    u'セ': 'se',    u'ソ': 'so',
@@ -18,11 +37,15 @@ _roomaji_kana = {
     u'ダ': 'da',    u'ヂ': 'ji',    u'ヅ': 'dzu',   u'デ': 'de',    u'ド': 'do',
     u'バ': 'ba',    u'ビ': 'bi',    u'ブ': 'bu',    u'ベ': 'be',    u'ボ': 'bo',
     u'パ': 'pa',    u'ピ': 'pi',    u'プ': 'pu',    u'ペ': 'pe',    u'ポ': 'po',
+                                    u'ヴ': 'vu',
 }
 
 _roomaji_youon = {
-    u'ャ': 'ya',                    u'ュ': 'yu',                    u'ョ': 'yo',
+    # Hiragana
     u'ゃ': 'ya',                    u'ゅ': 'yu',                    u'ょ': 'yo',
+
+    # Katakana
+    u'ャ': 'ya',                    u'ュ': 'yu',                    u'ョ': 'yo',
 }
 
 # XXX If romanize() ever handles hiragana, it will need to make sure that the
@@ -33,11 +56,24 @@ _roomaji_small_kana = {
     u'ァ': 'a',     u'ィ': 'i',     u'ゥ': 'u',     u'ェ': 'e',     u'ォ': 'o',
 }
 _roomaji_small_kana_combos = {
+    # These are, by the way, fairly arbitrary.  "shi xi" to mean "sy" is
+    # particularly weird, but it seems to be what GF intends
+
+    # Simple vowel replacement
+                    u'ウィ': 'wi',  u'ウゥ': 'wu',  u'ウェ': 'we',  u'ウォ': 'wo',
+    u'ヴァ': 'va',  u'ヴィ': 'vi',                  u'ヴェ': 've',  u'ヴォ': 'vo',
                                                     u'チェ': 'che',
                                                     u'シェ': 'she',
+                                                    u'ジェ': 'je',
     u'テァ': 'tha', u'ティ': 'ti',  u'テゥ': 'thu', u'テェ': 'tye', u'テォ': 'tho',
     u'デァ': 'dha', u'ディ': 'di',  u'デゥ': 'dhu', u'デェ': 'dye', u'デォ': 'dho',
     u'ファ': 'fa',  u'フィ': 'fi',  u'ホゥ': 'hu',  u'フェ': 'fe',  u'フォ': 'fo',
+
+    # Not so much
+    u'シィ': 'sy',
+    u'ミィ': 'my',
+    u'ビィ': 'by',
+    u'ピィ': 'py',
 }
 
 def romanize(string):
@@ -50,11 +86,12 @@ def romanize(string):
     last_char = None  # Used for small kana combos
     for char in string:
         # Full-width Latin
-        if ord(char) >= 0xff11 and ord(char) <= 0xff5e:
+        if 0xff01 <= ord(char) <= 0xff5e:
             if last_kana == 'sokuon':
                 raise ValueError("Sokuon cannot precede Latin characters.")
 
-            char = chr(ord(char) - 0xff11 + 0x31)
+            # XXX Real Unicode decomposition would be nicer
+            char = chr(ord(char) - 0xff01 + 0x21)
             characters.append(char)
 
             last_kana = None
@@ -71,14 +108,16 @@ def romanize(string):
                 # lot, e.g. ピィ is "pii"
                 characters.append(_roomaji_small_kana[char])
 
+            last_kana = _roomaji_small_kana[char]
+
         # Youon
         elif char in _roomaji_youon:
-            if last_kana[-1] != 'i' or last_kana == 'i':
+            if not last_kana or last_kana[-1] != 'i' or last_kana == 'i':
                 raise ValueError("Youon must follow an -i sound.")
 
             # Drop the -i and append the ya/yu/yo sound
             new_sound = _roomaji_youon[char]
-            if last_kana in ['shi', 'ji']:
+            if last_kana in ['chi', 'shi', 'ji']:
                 # Strip the y-
                 new_char = last_kana[:-1] + new_sound[1:]
             else: