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 全般のページを参照して下さい.