suikyo は決定性オートマトンに基づいて, 文字列の変換を行うライブラリです. 主には「ローマ字ひらがな変換」に使用されます. 例えば "suikyou" という 文字列から "すいきょう" と変換を行なったり, 逆に "すいきょう" から "suikyou" に変換することが可能です.
このページ内容は Ruby 用ライブラリの説明です. suikyo 全般のページも参照して下さい.
#!/usr/bin/env ruby
require 'suikyo/suikyo'
suikyo = Suikyo.new
suikyo.table.loadfile("romaji")
### 普通にローマ字をひらがなに変換する.
hiragana = suikyo.convert("suikyou ")
puts hiragana
# => "すいきょう"
## " " 空白は入力の区切りと解釈されます.
hiragana = suikyo.convert("shin")
puts hiragana
# => しn
hiragana = suikyo.convert("shin ")
puts hiragana
# => しん
hiragana = suikyo.convert("shin ai")
puts hiragana
# => しんあい
### 語尾が確定していない場合は, 取りうる候補を配列で返す.
(hiragana, hiragana_array) = suikyo.expand("suiky")
puts hiragana
# => "すいky"
puts hiragana_array.join(", ")
# => "すいきゃ, すいきょ, すいきぇ, すいきぃ, すいきゅ"
suikyo を使うには "require 'suikyo/suikyo'" を行う必要があります.
suikyo のメインとなるクラスです. convert メソッドと expand メソッドを 用いて入力文字列を変換します.
(hiragana, hiragana_array) = suikyo.expand("suiky")
puts hiragana
# => "すいky"
puts hiranaga_array.join(", ")
# => "すいきゃ, すいきょ, すいきぇ, すいきぃ, すいきゅ"
SuikyoTable クラスは, 変換ルールを格納します. loadfile メソッドでファイルからまとめてルールを読み込むほか, set メソッドでひとつずつ設定することが可能です.
table = SuikyoTable.new
table.loadfile ("english.kpdef", "/tmp")
SuikyoTable2 クラスは SuikyoTable クラスのサブクラスです. SuikyoTable との違いは, SuikyoTable2 は入力文字列の 大文字と小文字の違いに寛容なことです. SuikyoTable2 では 変換ルールにない入力は, 大文字と小文字の違いを無視して変換します.
table1 = SuikyoTable.new
table1.loadfile("romaji")
suikyo1 = Suikyo.new(table1)
puts suikyo1.convert("SuIKyoU")
# => "SうIKよU"
table2 = SuikyoTable2.new
table2.loadfile("romaji")
suikyo2 = Suikyo.new(table2)
puts suikyo2.convert("SuIKyoU")
# => "すいきょう"
Suikyo クラスがデフォルトで作成する変換テーブルは SuikyoTable2 の インスタンスです.
SuikyoComposer は Suikyo を活用した、かな漢字変換用のプリエディット ライブラリです。予測入力システム PRIME は SuikyoComposer を利用して プリエディット機能を実現しています。
#!/usr/bin/env ruby
$KCODE= 'e'
require 'suikyo/suikyo-composer'
class TestSuikyo
def initialize ()
table = ( ARGV[0] or "romaji" )
@suikyo = SuikyoComposer.new()
@suikyo.set_table(table)
@suikyo.set_reverse_table(table + "_reverse")
case table
when "romaji" then
@suikyo.hybrid_typing = true
when "tcode" then
@suikyo.mask = true
end
end
def edit (string)
if string.index("^") == 0 then
string[1..-1].split(//).each { | command |
case ( command )
when "b" then
@suikyo.cursor_left()
when "a" then
@suikyo.cursor_left_edge()
when "f" then
@suikyo.cursor_right()
when "e" then
@suikyo.cursor_right_edge()
when "h" then
@suikyo.edit_backspace()
when "d" then
@suikyo.edit_delete()
when "z" then
@suikyo.undo()
when "1" then
@suikyo.set_mode_hybrid()
when "6" then # F6
@suikyo.set_mode_default()
when "7" then # F7
@suikyo.set_mode_katakana()
when "8" then # F8
@suikyo.set_mode_half_katakana()
when "9" then # F9
@suikyo.set_mode_wide_ascii()
when "0" then # F10
@suikyo.set_mode_raw()
when "-" then
@suikyo.edit_erase()
when "!" then
p @suikyo.edit_get_expansion()
when "=" then
p @suikyo.edit_get_preediting_string()
when "?" then
p @suikyo.edit_get_query_string()
end
}
else
@suikyo.edit_insert(string)
end
@suikyo.edit_display()
end
def main ()
loop {
print "> "
line = $stdin.gets
line.chomp!
edit(line)
}
end
end
test = TestSuikyo.new()
test.main()
suikyo 全般のページを参照して下さい.