ATOKのローマ字テーブルを作成する車輪の再発明

ATOK2012のローマ字入力をDvorakY+独自変更にして2年ほど使っています。ローマ字テーブルはhata-atok.plを改造して作成したのだけど、スクリプトの配布元のサイトがなくなっていた。
何となく車輪の再発明をする気になり、Rubyで作り直した。作成にあたってはhttp://hossy.info/?date=1105 の解析内容を参考にさせてもらった。

ローマ字テーブルはGoogle日本語入力のフォーマットを採用した。これにより作ったローマ字テーブルがそのままGoogle日本語入力でも使えることになる。
Ruby1.9.3、ATOK2012で動作を確認しています。全てutf-8文字コードでファイルを作成する必要あります。あと、ATOK正規のローマ字カスタマイズでは入力出来ない「,./」等も設定出来ますが、ATOKが正常に動作するかわかりません。ATOK2012では問題無く動いていますが、古いATOKではダメだったらしいです。

Rubyスクリプトのコード

# -*- coding: utf-8 -*-
# ATOKのローマ字テーブルを生成する
# ruby atok-tbl.rb [Google日本語入力のローマ字テーブル] [元styfile] [出力styfile]
# 元styfileのローマ字定義部分を変更して、出力styfileを作成します。
# 例:
# ruby atok-tbl.rb dvoraky.txt atok.sty dvoraky.sty
# 注意:Ruby1.9.3以降、utf-8でないと動かないかもしれません。

require 'csv'
require 'nkf'

# 数値を指定の桁数で16進表記の文字列にする
def nhex(i, od)
  sprintf("%0#{od}x", i)
end

# 文字列を16進数のコードの並びにする
def bstr(str)
  x = str.encode("Shift_JIS") # styファイル内はsjisのコードで作られている
  x.bytes.collect {|b|
    b.to_s(16)
  }.join("")
end

romtbl = Array.new # ローマ字テーブル
romhash = Hash.new(0) # ローマ字の先頭文字の個数 キー数カウント部で使用する

# ローマ字テーブルファイル読み出し
# Google日本語入力の生成物を前提
# ローマ字 [TABコード] ひらがな (必要なら)[TABコード]ローマ字※kkやssで拗音を入力するとき

CSV.open(ARGV[0], "r", :col_sep=>"\t") {|cfile|
  cfile.each {|l|
    head = l[0][0] # 先頭の1文字目

    # 変換後文字は半角カナに変換してしまう
    x = NKF.nkf('-w -h2', l[1])
    l[1] = NKF.nkf('-w -Z4',x)

    ### 特例処理 ###
    if l.size > 2
      if l[0][0] == l[0][1]
        # ooやmmなどで「っ」が入力される場合、2文字目は0x1fとなっている
        l[0][1] = 0x1f.chr
      end
    end
    # atokのローマ字テーブルで使用する半角カナで文字コードが無い
    hash = {
      ''=>0x12.chr,
      ''=>0x13.chr,
      ''=>0x14.chr,
      ''=>0x10.chr,
      ''=>0x11.chr}
    l[1].gsub!(/[ヵヶヮヰヱ]/, hash)
    ################
    romtbl.push l
    romhash[head] += 1
  }
}
romtbl.sort_by! {|r|
  r[0] # ローマ字の先頭文字でsortする
}

dat = String.new # ローマ字テーブルデータ

#ヘッダ部、キー数カウント部、辞書文字数カウント部、辞書部からなる
# http://hossy.info/?date=1105 を参考
# ヘッダ部
hcount_b = bstr(nhex(romtbl.size, 8)) # ローマ字テーブルの個数
head = bstr("01000002") # 意味不明だけど固定
dat << hcount_b + head

# キーカウント部
# ローマ字の先頭文字と変換テーブルの個数
sum = 0
for i in 0x20..0x7f #0x20から0x7fまでの文字コード毎の数を設定
  num = romhash[i.chr] # 変換テーブルの個数
  dat << bstr(nhex(sum,4)) + bstr(nhex(num,4))
  sum += num
end

# 辞書文字数カウント部
#0285 0101 z=や
#合計 入力数 出力数
sum = 0
romtbl.each {|l|
  nin = l[0].size # ローマ字の文字数
  nout = l[1].size # 変換後の文字数
  dat << bstr(nhex(sum,4)) + bstr(nhex(nin,2)) + bstr(nhex(nout,2))
  sum = sum + nin + nout # それまでの合計文字数
}
# 辞書部
# 入力文字コード(unicode) 出力コード(unicode)
romtbl.each {|l|
  strin = ""
  l[0].codepoints {|cp|
    strin += bstr(nhex(cp, 4))
  }
  strout = ""
  l[1].codepoints {|cp|
    strout += bstr(nhex(cp, 4))
  }
  dat << strin + strout
}
# 終端処理
dat << "\r\n".unpack("H*").pop.scan(/[0-9a-f]{2}/).join("")

# 元になるstyファイル
styfile = File.open( ARGV[1], "rb" )
stydat = styfile.read.unpack("H*")[0]
start = bstr('ローマ字=')
# 場所を見つけて
x = stydat.index(/#{start}.+/)
cpi = x+start.bytesize #ローマ字=の次の位置(先頭)
cpk = stydat.index(nhex(0x0a, 2), cpi) + 1 # ローマ字=以降で最初にでた0x0a

# 置き換える
stydat[cpi..cpk] = dat

# ファイル出力
b_data = [stydat].pack("H*")
rf = File.open(ARGV[2], "wb")
rf.write(b_data)
rf.close

自分が使っているDvorakY改のGoogle日本語入力のテーブル

DvorakYに対しAZIK的な独自変更を行っています。

  • (QWRTYの)Qで「ん」
  • (QWRTYの)Rで「っ」
  • (QWRTYの):で「ー」
  • (QWRTYの)@前置で拗音を入力(例えば、@aで「ぁ」)
  • (QWRTYの)Pでパ行*1

文字と文字の間はTAB区切りです。

,,	っ	,
,a	わ
,d	うぇ
,g	うぃ
,jd	うぇ
,jg	うぃ
,js	うぉ
,s	を
.a	ヴァ
.d	ヴェ
.f	ヴ
.g	ヴィ
.s	ヴォ
.v	ヴュ
//	っ	/
/a	ざ
/c	じぇ
/d	ぜ
/f	ず
/g	じ
/s	ぞ
/v	じゅ
/x	じょ
/z	じゃ
:	ー
;;	っ	;
;a	さ
;c	しぇ
;d	せ
;f	す
;g	し
;s	そ
;v	しゅ
;x	しょ
;z	しゃ
@,a	ゎ
@a	ぁ
@d	ぇ
@f	ぅ
@g	ぃ
@ia	ヵ
@id	ヶ
@kf	っ
@s	ぉ
@v	ゅ
@x	ょ
@z	ゃ
a	あ
c	いぇ
d	え
e	。
f	う
g	い
hh	っ	h
h,f	どぅ
ha	だ
hc	ぢぇ
hd	で
hf	づ
hg	ぢ
hjf	でゅ
hjg	でぃ
hs	ど
hv	ぢゅ
hx	ぢょ
hz	ぢゃ
ii	っ	i
i,a	くぁ
i,d	くぇ
i,g	くぃ
i,s	くぉ
ia	か
id	け
if	く
ig	き
is	こ
iv	きゅ
ix	きょ
iz	きゃ
jj	っ	j
ja	は
jd	へ
jf	ふ
jg	ひ
js	ほ
jv	ひゅ
jx	ひょ
jz	ひゃ
kk	っ	k
k,f	とぅ
k;a	つぁ
k;d	つぇ
k;g	つぃ
k;s	つぉ
ka	た
kc	ちぇ
kd	て
kf	つ
kg	ち
kjf	てゅ
kjg	てぃ
ks	と
kv	ちゅ
kx	ちょ
kz	ちゃ
ll	っ	l
la	な
ld	ね
lf	ぬ
lg	に
ls	の
lv	にゅ
lx	にょ
lz	にゃ
mm	っ	m
ma	ま
md	め
mf	む
mg	み
ms	も
mv	みゅ
mx	みょ
mz	みゃ
nn	っ	n
na	ば
nd	べ
nf	ぶ
ng	び
ns	ぼ
nv	びゅ
nx	びょ
nz	びゃ
oo	っ	o
oa	ら
od	れ
of	る
og	り
os	ろ
ov	りゅ
ox	りょ
oz	りゃ
r	っ
q	ん
pp	っ	p
pa	ぱ
pd	ぺ
pf	ぷ
pg	ぴ
ps	ぽ
pv	ぴゅ
px	ぴょ
pz	ぴゃ
s	お
uu	っ	u
u,a	ぐぁ
ua	が
ud	げ
uf	ぐ
ug	ぎ
us	ご
uv	ぎゅ
ux	ぎょ
uz	ぎゃ
v	ゆ
w	、
x	よ
ya	ふぁ
yd	ふぇ
yg	ふぃ
ys	ふぉ
yv	ふゅ
z	や

*1:Dvorak配列でPはQwertyのRに位置するので、子音は右で入力させるため移動した。