Blender+Python=Happyなページを目標に日々精進のページ。

addJPKana.py


addJPKana.pyはローマ字をかなに変換し、Blenderの3Dテキストを作成します。

なんすか?それ。


さあ。

なんで作った?


そう、一年以上前にbl2unitxt3d.pyという、tkinter窓で日本語入力できるblenderpythonスクリプトを書いているため、ほとんど必要無いはずなんですが。

いや、そう考えているのは日本語環境がデフォだから…。そう、M$-IMEやAnthy+SCIMが無い場合なんて考えていないから。

せめてかなをローマ字で入力して、ポンと変換出来りゃいいんじゃないか?ということで。

いや、「ローマ字かな変換」っていうページを見たから、なんですけどね。

Vista + Microsoft IME2007でbl2unitxt3d.pyのテキストボックスに漢字が入力できなかった、というのも。

エピソード

へ?誰も聞かないって?
脳内モデリング2か月

ええ、結構かかりました。「辞書型のテーブル作って『長い文字』から引かせる」っていうのをなかなか思いつかなくて。最初はif-elif-elseの長いのを、と思っていましたが、

・コンパクトにすること
・メンテナンス性を上げること

ということを考えるとif文は「排除」するほうがいい、と思ったわけです。そうして、「テーブルを引く方法はどうかな」、とか、いや、「テーブルを引くだけじゃ文字の切り分けができないな」と、いろいろと考えてました。

ま、その間にVista SP1にしたらbl2unitxt3d.pyで漢字入力ができるようになってましたし。

コーディング3日くらい?(リハビリ期間3日?)

ま、テーブル用の文字列入力が大変でした(面倒くさくて)。メインとなる変換ルーチンに至ってはごくシンプルな方法を。
あとはひたすら。
えーと、ここは"self"要る?
rangeで"3,2,1"ってするのはどうだったっけ?
"hoge[1,2]" …あれ?エラー?… あぁ、"hoge[1:2]"だよな、文字の切り出しは。

…ふう。

以下、ソース(2つ)

addJPKana.py
#!BPY

"""
Name: 'Add JPKana'
Blender: 245
Group: 'Object'
Tooltip: 'Add JPHiragana/Katakana Text from Roma-ji.'
"""

__author__ = "MITSUDA Tetsuo(Manda)"
__url__ = ("Author's homepage,http://rock.sannet.ne.jp/lab1092/")
__version__ = "0.01ja"
__bpydoc__ = """\
Write Romaji to the field , Press OK.
Then, youshould do is :Load correct font.
"""

#  V0.01ja
#  addJPKana.py 2008.06.12 MITSUDA Tetsuo (Manda)
#  Script for Add Hiragana/Katakana text from Roma-ji 
#  
#  This script should copy to .blender/scripts/




from Blender import sys, Draw, Window, Scene, Curve, Object, Text3d , Text
import bpy
import BPyMessages
import romakanatbl
#import romakanatbl_repr

DEFAULTOBJNAME = 'Text'
DEFAULTTXTNAME = 'myText'


def addText3D(myText,k,o):
    if(len(myText) > 0):
        cvText = romakanatbl.getkana(myText,k,o)
        if( len(cvText) > 0 ):
            txt = Text3d.New(DEFAULTTXTNAME)
            cur = Scene.GetCurrent()
            obj = Object.New(DEFAULTOBJNAME)
            obj.link(txt)
            cur.link(obj)
            obj.makeDisplayList()
            objname=obj.getName()
            crvname=txt.getName()
            txt.setText(cvText)
            pos = list(Window.GetCursorPos())
            obj.setLocation(pos)
            obj.makeDisplayList()
            obj.select(1)
        
            Window.Redraw()
            return True
    return False



def main():
    TEXT_ROMAJI= Draw.Create('')
    PREF_KATA= Draw.Create(False)
    PREF_ONLY= Draw.Create(False)

    # Get USER Options
    pup_block= [\
    ('Text:', TEXT_ROMAJI, 0, 50, 'Fill the ROMA-JI in this Field.'),\
    ('KATAKANA', PREF_KATA, 'OFF:Hiragana ON:Katakana'),\
    ('ONLY KANA?', PREF_ONLY, 'If you need only KANA, turn it on.'),\
    ]

    if not Draw.PupBlock('Roma-ji to Hiragana', pup_block):
        return

    r = addText3D(TEXT_ROMAJI.val,PREF_KATA.val,PREF_ONLY.val)
    
    if(r):
        Draw.PupMenu('OK,You may have to select a font.')
    else:
        Draw.PupMenu('Do nothing...')
    
    
if __name__ == '__main__':
    main()
bpymodules/romakanatbl.py
#! /usr/bin/env python

#  romakanatbl.py  2008.06.18 MITSUDA Tetsuo (Manda)
#  V0.01b-repr 
#  Roma-ji to Kana conversion class for addJPKana.py
#
#  This script should copy to .blender/scripts/bpymodules


# Roma-ji Table:Hiragana
#---------------------------
ROMANHIRAGANATABLE = {
# A-O
    'A'   :u'\u3042',
    'I'   :u'\u3044',
    'U'   :u'\u3046',
    'E'   :u'\u3048',
    'O'   :u'\u304a',
# K@
    'KA'  :u'\u304b',
    'KI'  :u'\u304d',
    'KU'  :u'\u304f',
    'KE'  :u'\u3051',
    'KO'  :u'\u3053',
# S@
    'SA'  :u'\u3055',
    'SI'  :u'\u3057',
    'SU'  :u'\u3059',
    'SE'  :u'\u305b',
    'SO'  :u'\u305d',
# T@
    'TA'  :u'\u305f',
    'TI'  :u'\u3061',
    'TU'  :u'\u3064',
    'TE'  :u'\u3066',
    'TO'  :u'\u3068',
# N@
    'NA'  :u'\u306a',
    'NI'  :u'\u306b',
    'NU'  :u'\u306c',
    'NE'  :u'\u306d',
    'NO'  :u'\u306e',
# H@
    'HA'  :u'\u306f',
    'HI'  :u'\u3072',
    'HU'  :u'\u3075',
    'HE'  :u'\u3078',
    'HO'  :u'\u307b',
# M@
    'MA'  :u'\u307e',
    'MI'  :u'\u307f',
    'MU'  :u'\u3080',
    'ME'  :u'\u3081',
    'MO'  :u'\u3082',
# Y@
    'YA'  :u'\u3084',
    'YU'  :u'\u3086',
    'YO'  :u'\u3088',
# R@
    'RA'  :u'\u3089',
    'RI'  :u'\u308a',
    'RU'  :u'\u308b',
    'RE'  :u'\u308c',
    'RO'  :u'\u308d',
# W@
    'WA'  :u'\u308f',
    'WI'  :u'\u3046\u3043',
    'WU'  :u'\u3046',
    'WE'  :u'\u3046\u3047',
    'WO'  :u'\u3092',

# NN 

    'NN'  :u'\u3093',


# G@
    'GA'  :u'\u304c',
    'GI'  :u'\u304e',
    'GU'  :u'\u3050',
    'GE'  :u'\u3052',
    'GO'  :u'\u3054',
# Z@
    'ZA'  :u'\u3056',
    'ZI'  :u'\u3058',
    'ZU'  :u'\u305a',
    'ZE'  :u'\u305c',
    'ZO'  :u'\u305e',
# D@
    'DA'  :u'\u3060',
    'DI'  :u'\u3062',
    'DU'  :u'\u3065',
    'DE'  :u'\u3067',
    'DO'  :u'\u3069',
# B@
    'BA'  :u'\u3070',
    'BI'  :u'\u3073',
    'BU'  :u'\u3076',
    'BE'  :u'\u3079',
    'BO'  :u'\u307c',
# P@
    'PA'  :u'\u3071',
    'PI'  :u'\u3074',
    'PU'  :u'\u3077',
    'PE'  :u'\u307a',
    'PO'  :u'\u307d',

# F@
    'FA'  :u'\u3075\u3041',
    'FI'  :u'\u3075\u3043',
    'FU'  :u'\u3075',
    'FE'  :u'\u3075\u3047',
    'FO'  :u'\u3075\u3049',

# C@
    'CA'  :u'\u304b',
    'CI'  :u'\u3057',
    'CU'  :u'\u304f',
    'CE'  :u'\u305b',
    'CO'  :u'\u3053',

# L@
    'LA'  :u'\u3041',
    'LI'  :u'\u3043',
    'LU'  :u'\u3045',
    'LE'  :u'\u3047',
    'LO'  :u'\u3049',
# X@
    'XA'  :u'\u3041',
    'XI'  :u'\u3043',
    'XU'  :u'\u3045',
    'XE'  :u'\u3047',
    'XO'  :u'\u3049',

# KY@
    'KYA' :u'\u304d\u3083',
    'KYI' :u'\u304d\u3043',
    'KYU' :u'\u304d\u3085',
    'KYE' :u'\u304d\u3047',
    'KYO' :u'\u304d\u3087',

# SH@
    'SHA' :u'\u3057\u3083',
    'SHI' :u'\u3057',
    'SHU' :u'\u3057\u3085',
    'SHE' :u'\u3057\u3047',
    'SHO' :u'\u3057\u3087',

# SY@
    'SYA' :u'\u3057\u3083',
    'SYI' :u'\u3057\u3043',
    'SYU' :u'\u3057\u3085',
    'SYE' :u'\u3057\u3047',
    'SYO' :u'\u3057\u3087',

# TY@
    'TYA' :u'\u3061\u3083',
    'TYI' :u'\u3061\u3043',
    'TYU' :u'\u3061\u3085',
    'TYE' :u'\u3061\u3047',
    'TYO' :u'\u3061\u3087',
# CH@
    'CYA' :u'\u3061\u3083',
    'CYI' :u'\u3061\u3043',
    'CYU' :u'\u3061\u3085',
    'CYE' :u'\u3061\u3047',
    'CYO' :u'\u3061\u3087',
# NY@
    'NYA' :u'\u306b\u3083',
    'NYI' :u'\u306b\u3043',
    'NYU' :u'\u306b\u3085',
    'NYE' :u'\u306b\u3047',
    'NYO' :u'\u306b\u3087',

# HY@
    'HYA' :u'\u3072\u3083',
    'HYI' :u'\u3072\u3043',
    'HYU' :u'\u3072\u3085',
    'HYE' :u'\u3072\u3047',
    'HYO' :u'\u3072\u3087',

# MY@
    'MYA' :u'\u307f\u3083',
    'MYI' :u'\u307f\u3043',
    'MYU' :u'\u307f\u3085',
    'MYE' :u'\u307f\u3047',
    'MYO' :u'\u307f\u3087',

# RY@
    'RYA' :u'\u308a\u3083',
    'RYI' :u'\u308a\u3043',
    'RYU' :u'\u308a\u3085',
    'RYE' :u'\u308a\u3047',
    'RYO' :u'\u308a\u3087',

# THI@
    'THA' :u'\u3066\u3083',
    'THI' :u'\u3066\u3043',
    'THU' :u'\u3066\u3085',
    'THE' :u'\u3066\u3047',
    'THO' :u'\u3066\u3087',

# GY@
    'GYA' :u'\u304e\u3083',
    'GYI' :u'\u304e\u3043',
    'GYU' :u'\u304e\u3085',
    'GYE' :u'\u304e\u3047',
    'GYO' :u'\u304e\u3087',
# ZY@
    'ZYA' :u'\u3058\u3083',
    'ZYI' :u'\u3058\u3043',
    'ZYU' :u'\u3058\u3085',
    'ZYE' :u'\u3058\u3047',
    'ZYO' :u'\u3058\u3087',

# JY@
    'JYA' :u'\u3058\u3083',
    'JYI' :u'\u3058\u3043',
    'JYU' :u'\u3058\u3085',
    'JYE' :u'\u3058\u3047',
    'JYO' :u'\u3058\u3087',
    
# J@
    'JA' :u'\u3058\u3083',
    'JI' :u'\u3058',
    'JU' :u'\u3058\u3085',
    'JE' :u'\u3058\u3047',
    'JO' :u'\u3058\u3087',

# DY@
    'DYA' :u'\u3062\u3083',
    'DYI' :u'\u3062\u3043',
    'DYU' :u'\u3062\u3085',
    'DYE' :u'\u3062\u3047',
    'DYO' :u'\u3062\u3087',
# BY@
    'BYA' :u'\u3073\u3083',
    'BYI' :u'\u3073\u3043',
    'BYU' :u'\u3073\u3085',
    'BYE' :u'\u3073\u3047',
    'BYO' :u'\u3073\u3087',
# PY@
    'PYA' :u'\u3074\u3083',
    'PYI' :u'\u3074\u3043',
    'PYU' :u'\u3074\u3085',
    'PYE' :u'\u3074\u3047',
    'PYO' :u'\u3074\u3087',
# FY@
    'FYA' :u'\u3075\u3083',
    'FYI' :u'\u3075\u3043',
    'FYU' :u'\u3075\u3085',
    'FYE' :u'\u3075\u3047',
    'FYO' :u'\u3075\u3087',

# DH@
    'DHA' :u'\u3067\u3083',
    'DHI' :u'\u3067\u3043',
    'DHU' :u'\u3067\u3085',
    'DHE' :u'\u3067\u3047',
    'DHO' :u'\u3067\u3087',

# XY@
    'XYA' :u'\u3083',
    'XYI' :u'\u3043',
    'XYU' :u'\u3085',
    'XYE' :u'\u3047',
    'XYO' :u'\u3087',

# TSU
    'TSU'  :u'\u3064',

# XTU
    'XTU' :u'\u3063',
    

######[NOT TRANSELATE]##########
## V@
#    'VA'  :u'\u30f4\u3041',
#    'VI'  :u'\u30f4\u3043',
#    'VU'  :u'\u30f4',
#    'VE'  :u'\u30f4\u3047',
#    'VO'  :u'\u30f4\u3049',
## VH@
#    'VYA' :u'\u30f4\u3083',
#    'VYI' :u'\u30f4\u3043',
#    'VYU' :u'\u30f4\u3085',
#    'VYE' :u'\u30f4\u3047',
#    'VYO' :u'\u30f4\u3087',
## XWA,LWA
#    'XWA' :u'\u308e',
#    'LWA' :u'\u308e',
#################################
    }

# Nasal "N"
#----------------------------------
ROMANHIRAGANATABLE_NASAL = {
# N
    'N' :u'\u3093',
    }
#----------------------------------

# Geminate : like "T|TE"
ROMANHIRAGANA_GEMINATECONSOANT = [
'K','S','T','H','M','Y','R','W',
'G','Z','J','D','B',
'P','F','C','L','X',
#'V',
]


# Geminate string : 'LTU'
HIRAGANA_GEMINATESTRING = u'\u3063'

#---------------------------

# Roma-ji Table:Hiragana
#---------------------------
ROMANKATAKANATABLE = {
# A-O
    'A'   :u'\u30a2',
    'I'   :u'\u30a4',
    'U'   :u'\u30a6',
    'E'   :u'\u30a8',
    'O'   :u'\u30aa',
# K@
    'KA'  :u'\u30ab',
    'KI'  :u'\u30ad',
    'KU'  :u'\u30af',
    'KE'  :u'\u30b1',
    'KO'  :u'\u30b3',
# S@
    'SA'  :u'\u30b5',
    'SI'  :u'\u30b7',
    'SU'  :u'\u30b9',
    'SE'  :u'\u30bb',
    'SO'  :u'\u30bd',
# T@
    'TA'  :u'\u30bf',
    'TI'  :u'\u30c1',
    'TU'  :u'\u30c4',
    'TE'  :u'\u30c6',
    'TO'  :u'\u30c8',
# N@
    'NA'  :u'\u30ca',
    'NI'  :u'\u30cb',
    'NU'  :u'\u30cc',
    'NE'  :u'\u30cd',
    'NO'  :u'\u30ce',
# H@
    'HA'  :u'\u30cf',
    'HI'  :u'\u30d2',
    'HU'  :u'\u30d5',
    'HE'  :u'\u30d8',
    'HO'  :u'\u30db',
# M@
    'MA'  :u'\u30de',
    'MI'  :u'\u30df',
    'MU'  :u'\u30e0',
    'ME'  :u'\u30e1',
    'MO'  :u'\u30e2',
# Y@
    'YA'  :u'\u30e4',
    'YU'  :u'\u30e6',
    'YO'  :u'\u30e8',
# R@
    'RA'  :u'\u30e9',
    'RI'  :u'\u30ea',
    'RU'  :u'\u30eb',
    'RE'  :u'\u30ec',
    'RO'  :u'\u30ed',
# W@
    'WA'  :u'\u30ef',
    'WI'  :u'\u30a6\u30a3',
    'WU'  :u'\u30a6',
    'WE'  :u'\u30a6\u30a7',
    'WO'  :u'\u30f2',

# NN 

    'NN'  :u'\u30f3',


# G@
    'GA'  :u'\u30ac',
    'GI'  :u'\u30ae',
    'GU'  :u'\u30b0',
    'GE'  :u'\u30b2',
    'GO'  :u'\u30b4',
# Z@
    'ZA'  :u'\u30b6',
    'ZI'  :u'\u30b8',
    'ZU'  :u'\u30ba',
    'ZE'  :u'\u30bc',
    'ZO'  :u'\u30be',
# D@
    'DA'  :u'\u30c0',
    'DI'  :u'\u30c2',
    'DU'  :u'\u30c5',
    'DE'  :u'\u30c7',
    'DO'  :u'\u30c9',
# B@
    'BA'  :u'\u30d0',
    'BI'  :u'\u30d3',
    'BU'  :u'\u30d6',
    'BE'  :u'\u30d9',
    'BO'  :u'\u30dc',
# P@
    'PA'  :u'\u30d1',
    'PI'  :u'\u30d4',
    'PU'  :u'\u30d7',
    'PE'  :u'\u30da',
    'PO'  :u'\u30dd',

# F@
    'FA'  :u'\u30d5\u30a1',
    'FI'  :u'\u30d5\u30a3',
    'FU'  :u'\u30d5',
    'FE'  :u'\u30d5\u30a7',
    'FO'  :u'\u30d5\u30a9',

# C@
    'CA'  :u'\u30ab',
    'CI'  :u'\u30b7',
    'CU'  :u'\u30af',
    'CE'  :u'\u30bb',
    'CO'  :u'\u30b3',

# L@
    'LA'  :u'\u30a1',
    'LI'  :u'\u30a3',
    'LU'  :u'\u30a5',
    'LE'  :u'\u30a7',
    'LO'  :u'\u30a9',
# X@
    'XA'  :u'\u30a1',
    'XI'  :u'\u30a3',
    'XU'  :u'\u30a5',
    'XE'  :u'\u30a7',
    'XO'  :u'\u30a9',

# KY@
    'KYA' :u'\u30ad\u30e3',
    'KYI' :u'\u30ad\u30a3',
    'KYU' :u'\u30ad\u30e5',
    'KYE' :u'\u30ad\u30a7',
    'KYO' :u'\u30ad\u30e7',

# SH@
    'SHA' :u'\u30b7\u30e3',
    'SHI' :u'\u30b7',
    'SHU' :u'\u30b7\u30e5',
    'SHE' :u'\u30b7\u30a7',
    'SHO' :u'\u30b7\u30e7',

# SY@
    'SYA' :u'\u30b7\u30e3',
    'SYI' :u'\u30b7\u30a3',
    'SYU' :u'\u30b7\u30e5',
    'SYE' :u'\u30b7\u30a7',
    'SYO' :u'\u30b7\u30e7',

# TY@
    'TYA' :u'\u30c1\u30e3',
    'TYI' :u'\u30c1\u30a3',
    'TYU' :u'\u30c1\u30e5',
    'TYE' :u'\u30c1\u30a7',
    'TYO' :u'\u30c1\u30e7',
# CH@
    'CYA' :u'\u30c1\u30e3',
    'CYI' :u'\u30c1\u30a3',
    'CYU' :u'\u30c1\u30e5',
    'CYE' :u'\u30c1\u30a7',
    'CYO' :u'\u30c1\u30e7',
# NY@
    'NYA' :u'\u30cb\u30e3',
    'NYI' :u'\u30cb\u30a3',
    'NYU' :u'\u30cb\u30e5',
    'NYE' :u'\u30cb\u30a7',
    'NYO' :u'\u30cb\u30e7',

# HY@
    'HYA' :u'\u30d2\u30e3',
    'HYI' :u'\u30d2\u30a3',
    'HYU' :u'\u30d2\u30e5',
    'HYE' :u'\u30d2\u30a7',
    'HYO' :u'\u30d2\u30e7',

# MY@
    'MYA' :u'\u30df\u30e3',
    'MYI' :u'\u30df\u30a3',
    'MYU' :u'\u30df\u30e5',
    'MYE' :u'\u30df\u30a7',
    'MYO' :u'\u30df\u30e7',

# RY@
    'RYA' :u'\u30ea\u30e3',
    'RYI' :u'\u30ea\u30a3',
    'RYU' :u'\u30ea\u30e5',
    'RYE' :u'\u30ea\u30a7',
    'RYO' :u'\u30ea\u30e7',

# THI@
    'THA' :u'\u30c6\u30e3',
    'THI' :u'\u30c6\u30a3',
    'THU' :u'\u30c6\u30e5',
    'THE' :u'\u30c6\u30a7',
    'THO' :u'\u30c6\u30e7',

# GY@
    'GYA' :u'\u30ae\u30e3',
    'GYI' :u'\u30ae\u30a3',
    'GYU' :u'\u30ae\u30e5',
    'GYE' :u'\u30ae\u30a7',
    'GYO' :u'\u30ae\u30e7',
# ZY@
    'ZYA' :u'\u30b8\u30e3',
    'ZYI' :u'\u30b8\u30a3',
    'ZYU' :u'\u30b8\u30e5',
    'ZYE' :u'\u30b8\u30a7',
    'ZYO' :u'\u30b8\u30e7',

# JY@
    'JYA' :u'\u30b8\u30e3',
    'JYI' :u'\u30b8\u30a3',
    'JYU' :u'\u30b8\u30e5',
    'JYE' :u'\u30b8\u30a7',
    'JYO' :u'\u30b8\u30e7',

# J@
    'JA' :u'\u30b8\u30e3',
    'JI' :u'\u30b8',
    'JU' :u'\u30b8\u30e5',
    'JE' :u'\u30b8\u30a7',
    'JO' :u'\u30b8\u30e7',

# DY@
    'DYA' :u'\u30c2\u30e3',
    'DYI' :u'\u30c2\u30a3',
    'DYU' :u'\u30c2\u30e5',
    'DYE' :u'\u30c2\u30a7',
    'DYO' :u'\u30c2\u30e7',
# BY@
    'BYA' :u'\u30d3\u30e3',
    'BYI' :u'\u30d3\u30a3',
    'BYU' :u'\u30d3\u30e5',
    'BYE' :u'\u30d3\u30a7',
    'BYO' :u'\u30d3\u30e7',
# PY@
    'PYA' :u'\u30d4\u30e3',
    'PYI' :u'\u30d4\u30a3',
    'PYU' :u'\u30d4\u30e5',
    'PYE' :u'\u30d4\u30a7',
    'PYO' :u'\u30d4\u30e7',
# FY@
    'FYA' :u'\u30d5\u30e3',
    'FYI' :u'\u30d5\u30a3',
    'FYU' :u'\u30d5\u30e5',
    'FYE' :u'\u30d5\u30a7',
    'FYO' :u'\u30d5\u30e7',

# DH@
    'DHA' :u'\u30c7\u30e3',
    'DHI' :u'\u30c7\u30a3',
    'DHU' :u'\u30c7\u30e5',
    'DHE' :u'\u30c7\u30a7',
    'DHO' :u'\u30c7\u30e7',

# XY@
    'XYA' :u'\u30e3',
    'XYI' :u'\u30a3',
    'XYU' :u'\u30e5',
    'XYE' :u'\u30a7',
    'XYO' :u'\u30e7',

# TSU
    'TSU'  :u'\u30c4',
# XTU
    'XTU' :u'\u30c3',
    
# V@
    'VA'  :u'\u30f4\u30a1',
    'VI'  :u'\u30f4\u30a3',
    'VU'  :u'\u30f4',
    'VE'  :u'\u30f4\u30a7',
    'VO'  :u'\u30f4\u30a9',
# VH@
    'VYA' :u'\u30f4\u30e3',
    'VYI' :u'\u30f4\u30a3',
   'VYU' :u'\u30f4\u30e5',
    'VYE' :u'\u30f4\u30a7',
    'VYO' :u'\u30f4\u30e7',

######[NOT TRANSELATE]##########
## XWA,LWA
#    'XWA' :u'\u30ee',
#    'LWA' :u'\u30ee',
#################################
    }


# Nasal "N"
#----------------------------------
ROMANKATAKANATABLE_NASAL = {
# N
    'N' :u'\u30f3',
    }
#----------------------------------

# Geminate : like "T|TE"
ROMANKATAKANA_GEMINATECONSOANT = [
'K','S','T','H','M','Y','R','W',
'G','Z','J','D','B',
'P','F','C','L','X',
'V',
]


# Geminate string : 'LTU'
KATAKANA_GEMINATESTRING = u'\u30c3'


####################################
# class:RomaKanaTable
#
class RomaKanaTable:
    
    kanatable = []
    naseltable = {}
    geminatelist = []
    geminatestring = ""
    normal_max = 0
    rklist = []
    tpflag = False

    #---------------------------------------------------------------------
    # INIT
    def init(self):
        self.kanatable = []
        self.naseltable = {}
        self.geminatelist = []
        self.geminatestring = ""
        self.normal_max = 0
        self.rklist = []
        self.tpflag = False

    #---------------------------------------------------------------------
    # Make kana table
    def makeTable(self,normal,nasel,geminate,gemistr):

        self.init();
        # normal
        self.normal_max = 0
        for x in normal:
            if( len(x) > self.normal_max):
                self.normal_max = len(x) 

        if( self.normal_max == 0):
           return None

        for x in range(self.normal_max):
            self.kanatable.append({})

        for x in normal:
            l = len(x)
            if(l > 0 ):
                if self.kanatable[l-1].has_key(x):
                    print u"Already registed..."
                else:
                    self.kanatable[l-1][x] = normal[x]

        # nasel
        if( len(nasel) == 0 ):
            return None 
        for x in nasel:
            self.naseltable[x] = nasel[x]

        # geminate
        if( len(geminate) == 0 ):
            return None 
        for x in geminate:
            self.geminatelist.append(x)
        
        # gemistr
        # (xtu,ltu)
        self.geminatestring = gemistr

    #---------------------------------------------------------------------
    # Roma-ji to Kana conversion (1line)
    def convertline(self,s):
        l = len(s)
        c = 0
        p = ""
        
        self.rklist = []
        
        if(self.normal_max == 0 ):
            return
        
        while(c < l):
           ss = s[c:c+self.normal_max]
           if( len(ss) == 0 ):
               break
           (sa,sb,sc,sd)=self.convert(ss,p)
           if( (len(sc) > 0) & (sc == p) ):
               # Delete a character from end-of-list.
               # (like "T|TE" pattern)
               self.rklist.pop()
           
           self.rklist.append((sc+sa,sb))
           
           if( len(sb) > 0):
               # Hit-it!!
               c = c+len(sa)
               p= ""
           else:
               
               p = ss[0:1]
               c = c+1
        return( self.rklist )
    #---------------------------------------------------------------------
    # Roma-ji to Kana conversion:Geminate
    # ms = "KA" , rs= "K" -> "K|KA"="\u3063\u304b"
    def convert(self,ms,rs):
        sa = "" # roman
        sb = "" # kana
        sc = "" # ganinmate 
        sd = "" # n/c
        f = False
        # evaluate : 3 ,2, 1 characters string.
        for i in range(self.normal_max,0,-1):
            sa =ms[0:i]
            if( self.kanatable[i-1].has_key(sa)):
               sb = self.kanatable[i-1][sa]
               break
        
        # HIT
        if( len(sb) > 0 ):
            sc = ""
            
            # Geminate 1
            for x in self.geminatelist:
                if( x == rs ):
                    f = True
            
            # Geminate 2
            if( (sa[0:1] == rs) & f):
                sb =self.geminatestring + sb
                sc = rs
        elif(self.naseltable.has_key(sa)):
            # "n" , Same as "NN", but this is special!!
            sb = self.naseltable[sa]
        else:
            sd =ms[0:1]
            
        return((sa,sb,sc,sd))

    #---------------------------------------------------------------------
    # Get Kana string
    # 
    def getkana(self,r_t,o):
        lst = self.convertline(r_t)
        h_t = ""
        for (x,y) in lst:
            if(o):
                c = y
            else:
                c=( y if len(y) != 0 else x ) # (>Py2.5)
            
            h_t = h_t + c
        
        return(h_t)

def getkana(myText,k,o):
    ht = RomaKanaTable()
    ht.init()

    if(k):
        ht.makeTable(ROMANKATAKANATABLE,ROMANKATAKANATABLE_NASAL,
                     ROMANKATAKANA_GEMINATECONSOANT,KATAKANA_GEMINATESTRING)
    else:
        ht.makeTable(ROMANHIRAGANATABLE,ROMANHIRAGANATABLE_NASAL,
                     ROMANHIRAGANA_GEMINATECONSOANT,HIRAGANA_GEMINATESTRING)
    
    return(ht.getkana(myText,o))
    
    
#####
# Main
if __name__=='__main__':
    ht = RomaKanaTable()
    ht.init()
    ht.makeTable(ROMANHIRAGANATABLE,ROMANHIRAGANATABLE_NASAL,
                 ROMANHIRAGANA_GEMINATECONSOANT,HIRAGANA_GEMINATESTRING)
    #print ht.kanatable

    for x in ["KONNITIWA","KONNNITIWA","SUTTAMONDA","XXYULLUYYU","!@AS#SA"]:
        ht.convertline(x)
        a = ""
        b = ""
        c = ""
        # Test
        for (y,z) in ht.rklist:
            a = a+"|"+y
            b = b+"|"+z
            c = c+( z if len(z) != 0 else y ) # (>Py2.5)
        print x,"->",a ,"=" , b ," (",c,")"

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メニューバーA

Next comes OSAKA!!!

Blender party @OSAKA,Japan 2009
bpoj2009

Blender party @Tokyo,Japan 2009
bptj2009

Eventsupport blog(Della Nagoya)
bpnj2008 - blog

Nagoya
NAGOYA2008本編

どなたでも編集できます