X-Git-Url: http://git.veekun.com/zzz-pokedex.git/blobdiff_plain/da990eabd3ee7fae1bfa0829b77929d6d522a527..14001d50d3e995a611a492d2bda21b4b75f5ac56:/pokedex/roomaji.py diff --git a/pokedex/roomaji.py b/pokedex/roomaji.py index 0a6b269..e91c960 100644 --- a/pokedex/roomaji.py +++ b/pokedex/roomaji.py @@ -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: @@ -131,4 +170,4 @@ def romanize(string): if last_kana == 'sokuon': raise ValueError("Sokuon cannot be the last character.") - return ''.join(characters) + return unicode(''.join(characters))