header(); ?>

# ローマ字ひらがな変換ライブラリ suikyo for Ruby

## suikyo 「水鏡」とは

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(", ")
    # => "すいきゃ, すいきょ, すいきぇ, すいきぃ, すいきゅ"

## API の説明

suikyo を使うには "require 'suikyo/suikyo'" を行う必要があります.

### Suikyo クラス

suikyo のメインとなるクラスです. convert メソッドと expand メソッドを 用いて入力文字列を変換します.

Suikyo.new ([table])
  クラス Suikyo のインスタンスを作成します. table には, suikyo の変換ルールを示すクラス SuikyoTable のインスタンスを 指定可能です. table を指定しない場合は, 変換ルールが空の SuikyoTable のインスタンスが 作成されます.
Suikyo#convert(pattern[, table])
  pattern に table の変換ルールに従って変換します.
Suikyo#expand(pattern[, table])
  pattern に table の変換ルールに従って変換します. pattern の末端が変換の途中で終わっていた場合, 取りうる候補を配列にして 返します. 返り値は Suikyo#convert の結果と, 取りうる候補の配列から構成 された配列です.

      (hiragana, hiragana_array) = suikyo.expand("suiky")
      puts hiragana
      # => "すいky"
      puts hiranaga_array.join(", ")
      # => "すいきゃ, すいきょ, すいきぇ, すいきぃ, すいきゅ"

Suikyo.table
  デフォルトで使用する変換ルールを返します. 返り値は SuikyoTable クラスのインスタンスです.

### SuikyoTable クラス

SuikyoTable クラスは, 変換ルールを格納します. loadfile メソッドでファイルからまとめてルールを読み込むほか, set メソッドでひとつずつ設定することが可能です.

SuikyoTable.new
  クラス SuikyoTable のインスタンスを作成します.
SuikyoTable#loadfile (filename[, tablepath])
  変換ルールのフォーマット で記述されたファイル filename を読み込みます. tablepath が省略された場合は, 定数 SUIKYO_TABLE_PATH がファイルのパスに なります.

      table = SuikyoTable.new
      table.loadfile ("english.kpdef", "/tmp")

SuikyoTable#set (string, result[, cont])
  「入力データ」・「変換データ」・「保留データ」を指定して, 変換ルールを追加します. 各データについては 変換ルールのフォーマット を参照して下さい.

### SuikyoTable2 クラス

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

SuikyoComposer は Suikyo を活用した、かな漢字変換用のプリエディット ライブラリです。予測入力システム PRIME は SuikyoComposer を利用して プリエディット機能を実現しています。

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

## 更新履歴

Ver 1.3.1 (2004-01-31)
  - 内部的なバグの修正. (uim-prime での動作改善)
2003-04-25
  - 内部処理の冗長部分を改善. Hideyuki ENDO <endo-h@remus.dti.ne.jp> さんの報告に感謝.
2003-04-14
  - table を指定しても読み込まれないバグを修正. Hideyuki ENDO さんのパッチに感謝.
2002-11-23
  - リリース

footer(); ?>
小松 弘幸 <komatsu@taiyaki.org>
$Id: index.html,v 1.3 2004/12/10 11:23:56 komatsu Exp $