Hiroyuki Komatsu
komat****@users*****
2004年 12月 14日 (火) 17:16:31 JST
Index: prime/lib/session.rb diff -u prime/lib/session.rb:1.4.4.10 prime/lib/session.rb:1.4.4.11 --- prime/lib/session.rb:1.4.4.10 Mon Dec 13 18:07:16 2004 +++ prime/lib/session.rb Tue Dec 14 17:16:31 2004 @@ -1,5 +1,5 @@ # session.rb -# $Id: session.rb,v 1.4.4.10 2004/12/13 09:07:16 komatsu Exp $ +# $Id: session.rb,v 1.4.4.11 2004/12/14 08:16:31 komatsu Exp $ # # Copyright (C) 2001 Satoru Takabayashi <sator****@namaz*****> # Copyright (C) 2002, 2003, 2004 Hiroyuki Komatsu <komat****@taiya*****> @@ -10,8 +10,6 @@ # the GNU General Public License version 2. # -require 'suikyo/suikyo-composer' - class Command attr_reader :name, :args, :nargs, :min_nargs, :description @@ -302,14 +300,19 @@ " MODE = [default, katakana, half_katakana, \n" + " wide_ascii, raw]") -# add_command(:conv_convert, [:SESSION], -# "convert the preedition string.") -# add_command(:conv_predict, [:SESSION, :METHOD], -# "predict candidate words with the method", 1) -# add_command(:conv_select, [:SESSION, :INDEX], -# "select an index word to a conversion.") -# add_command(:conv_commit, [:SESSION], -# "commit the current conversion.") + add_command(:context_reset, [:SESSION], + "reset the context.") + add_command(:context_set_previous_word, [:SESSION, :WORD], + "set the word to the context") + + add_command(:conv_convert, [:SESSION, :METHOD], + "convert the preedition string.", 1) + add_command(:conv_predict, [:SESSION, :METHOD], + "predict candidate words with the method", 1) + add_command(:conv_select, [:SESSION, :INDEX], + "select an index word to a conversion.") + add_command(:conv_commit, [:SESSION], + "commit the current conversion.") # add_command(:modify_start, [:SESSION], # "") @@ -332,40 +335,12 @@ end -# def predict (method = nil) -# end - - ## - ## Conversion methods -# def convert_start (session) -# composer = session_get_composer(session) -# composer. - - ## ## Session methods ## def session_start () - ## FIXME: Revise the following code. - ## FIXME: (2004-12-06) <Hiro> - suikyo = PrimeTypeConv::initialize_suikyo() - composer = SuikyoComposer.new(suikyo.table) - composer.set_reverse_table(PRIME_ENV['suikyo_reverse_tables']) - - ## Setting hybrid_typing. - if PRIME_ENV['hybrid_typing'].nil? then - if PRIME_ENV['typing_method'] == 'romaji' then - PRIME_ENV['hybrid_typing'] = true - composer.hybrid_typing = true - end - else - composer.hybrid_typing = PRIME_ENV['hybrid_typing'] - end - - @session_no += 1 - @sessions[@session_no.to_s] = composer - - return reply_successful( @session_no.to_s ) + session =****@prime*****_start() + return reply_successful(session) end def session_end (session) @@ -377,94 +352,94 @@ ## Composition methods ## def edit_insert (session, string) - composer = session_get_composer(session) - composer.edit_insert(string) - return reply_with_preediting_string(composer) + @prime.edit_insert(session, string) + return edit_get_preedition(session) end def edit_delete (session) - composer = session_get_composer(session) - composer.edit_delete() - return reply_with_preediting_string(composer) + @prime.edit_delete(session) + return edit_get_preedition(session) end def edit_backspace (session) - composer = session_get_composer(session) - composer.edit_backspace() - return reply_with_preediting_string(composer) + @prime.edit_backspace(session) + return edit_get_preedition(session) end def edit_erase (session) - composer = session_get_composer(session) - composer.edit_erase() - if PRIME_ENV['hybrid_typing'] then - composer.set_mode_hybrid() - end - return reply_with_preediting_string(composer) + @prime.edit_erase(session) + return edit_get_preedition(session) end def edit_undo (session) - composer = session_get_composer(session) - composer.undo() - return reply_with_preediting_string(composer) + @prime.edit_undo(session) + return edit_get_preedition(session) end def edit_cursor_right (session) - composer = session_get_composer(session) - composer.cursor_right() - return reply_with_preediting_string(composer) + @prime.edit_cursor_right(session) + return edit_get_preedition(session) end def edit_cursor_left (session) - composer = session_get_composer(session) - composer.cursor_left() - return reply_with_preediting_string(composer) + @prime.edit_cursor_left(session) + return edit_get_preedition(session) end def edit_cursor_right_edge (session) - composer = session_get_composer(session) - composer.cursor_right_edge() - return reply_with_preediting_string(composer) + @prime.edit_cursor_right_edge(session) + return edit_get_preedition(session) end def edit_cursor_left_edge (session) - composer = session_get_composer(session) - composer.cursor_left_edge() - return reply_with_preediting_string(composer) + @prime.edit_cursor_left_edge(session) + return edit_get_preedition(session) end def edit_get_preedition (session) - composer = session_get_composer(session) - return reply_with_preediting_string(composer) + preedition =****@prime*****_get_preedition(session).join("\t") + return reply_successful(preedition) end def edit_get_query_string (session) - composer = session_get_composer(session) - return reply_successful( composer.edit_get_query_string() ) + query_string =****@prime*****_get_query_string(session) + return reply_successful( query_string) end def edit_set_mode (session, mode) - composer = session_get_composer(session) - case mode - when "hybrid" then # Original - composer.set_mode_hybrid() - when "default" then # F6 - composer.set_mode_default() - when "katakana" then # F7 - composer.set_mode_katakana() - when "half_katakana" then # F8 - composer.set_mode_half_katakana() - when "wide_ascii" then # F9 - composer.set_mode_wide_ascii() - when "raw" then # F10 - composer.set_mode_raw() + if****@prime*****_set_mode(session, mode) then + return edit_get_preedition(session) else error_message = "Unknown mode. Valid modes are: \n" + "[default, katakana, half_katakana, wide_ascii, raw]" return reply_unsuccessful(error_message) end - return reply_with_preediting_string(composer) end - private - def reply_with_preediting_string (composer) - result = composer.edit_get_preediting_string().join("\t") - return reply_successful(result) + ## + ## Context methods + ## + def context_reset (session) + @prime.context_reset(session) + return reply_successful() + end + + def context_set_previous_word (session, word) + @prime.context_set_previous_word(session) + return reply_successful() + end + + ## + ## Conversion methods + ## + def conv_convert (session) + candidates =****@prime*****_convert(session) + return reply_successful(candidates.to_text) + end + + def conv_predict (session, method = nil) + candidates =****@prime*****_predict(session) + return reply_successful(candidates.to_text) end - def session_get_composer (session) - composer = @sessions[session] - return composer + def conv_select (session, index) + selected_candidate =****@prime*****_select(session, index.to_i) + return reply_successful(selected_candidate.to_text) + end + + def conv_commit (session) + @prime.conv_commit(session) + return reply_successful() end end Index: prime/lib/prime2.rb diff -u /dev/null prime/lib/prime2.rb:1.1.2.1 --- /dev/null Tue Dec 14 17:16:31 2004 +++ prime/lib/prime2.rb Tue Dec 14 17:16:31 2004 @@ -0,0 +1,348 @@ +# prime2.rb: Module for PRIME2 protocol. +# $Id: prime2.rb,v 1.1.2.1 2004/12/14 08:16:31 komatsu Exp $ +# +# Copyright (C) 2004 Hiroyuki Komatsu <komat****@taiya*****> +# All rights reserved. +# This is free software with ABSOLUTELY NO WARRANTY. +# +# You can redistribute it and/or modify it under the terms of +# the GNU General Public License version 2. + +require 'suikyo/suikyo-composer' + +module Prime2 + def initialize_prime2 () + @sessions = {} + @session_no = 0 + end + + ## + ## Session methods + ## + def session_start () + session_data = PrimeSession.new() + + @session_no += 1 + @sessions[@session_no.to_s] = session_data + + return @session_no.to_s + end + + def session_end (session) + @sessions[session] = nil + return true + end + + ## + ## Composition methods + ## + def edit_insert (session, string) + composer = session_get_composer(session) + composer.edit_insert(string) + return true + end + def edit_delete (session) + composer = session_get_composer(session) + composer.edit_delete() + return true + end + def edit_backspace (session) + composer = session_get_composer(session) + composer.edit_backspace() + return true + end + def edit_erase (session) + composer = session_get_composer(session) + composer.edit_erase() + if PRIME_ENV['hybrid_typing'] then + composer.set_mode_hybrid() + end + return true + end + def edit_undo (session) + composer = session_get_composer(session) + composer.undo() + return true + end + def edit_cursor_right (session) + composer = session_get_composer(session) + composer.cursor_right() + return true + end + def edit_cursor_left (session) + composer = session_get_composer(session) + composer.cursor_left() + return true + end + def edit_cursor_right_edge (session) + composer = session_get_composer(session) + composer.cursor_right_edge() + return true + end + def edit_cursor_left_edge (session) + composer = session_get_composer(session) + composer.cursor_left_edge() + return true + end + def edit_get_preedition (session) + composer = session_get_composer(session) + return composer.edit_get_preediting_string() + end + def edit_get_query_string (session) + composer = session_get_composer(session) + return composer.edit_get_query_string() + end + + def edit_set_mode (session, mode) + composer = session_get_composer(session) + case mode + when "hybrid" then # Original + composer.set_mode_hybrid() + when "default" then # F6 + composer.set_mode_default() + when "katakana" then # F7 + composer.set_mode_katakana() + when "half_katakana" then # F8 + composer.set_mode_half_katakana() + when "wide_ascii" then # F9 + composer.set_mode_wide_ascii() + when "raw" then # F10 + composer.set_mode_raw() + else + return false + end + return true + end + + ## + ## Context methods + ## + def context_reset (session) + session_set_context(session, "") + end + + def context_set_previous_word (session, word) + session_set_context(session, word) + end + + + ## + ## Conversion methods + ## + def conv_convert (session, method = nil) + query_string = edit_get_query_string(session) + + if PRIME_ENV['typing_method'] == 'tcode' or + PRIME_ENV['typing_method'] == 'handwrite' then + candidates = lookup_direct_all(string) + else + composer = session_get_composer(session) + context = session_get_context(session) + + words_compact = convert_compact(composer, context) + words_overall = convert_overall(composer, context) +# words_japanese = convert_japanese(composer, context) + results_compact = PrimeWordList::merge_with_label(@context, + words_compact) + results_conversion = PrimeWordList::merge_with_label(@context, + words_overall) +# words_japanese) + candidates = PrimeWordList::concat(results_compact | results_conversion) + end + + session_set_candidates(session, candidates) + return candidates + end + + def conv_predict (session, method = nil) + query_string = edit_get_query_string(session) + + if PRIME_ENV['typing_method'] == 'tcode' or + PRIME_ENV['typing_method'] == 'handwrite' then + candidates = lookup_direct(string) + else + composer = session_get_composer(session) + context = session_get_context(session) + + words_compact = convert_compact(composer, context) + candidates = PrimeWordList::merge_with_label(@context, words_compact) + end + + session_set_candidates(session, candidates) + return candidates + end + + def conv_select (session, index) + selected_candidate = session_set_selection(session, index) + return selected_candidate + end + + def conv_commit (session) + selected_candidate = session_get_selection(session) + reading = selected_candidate.pron + literal = selected_candidate.literal + pos = selected_candidate.pos + ending = selected_candidate.conjugation + rest = selected_candidate.rest + + context = session_get_context(session) + learn_word(reading, literal, pos, context, ending, rest) + word = literal + ending + rest + context_set_previous_word(session, word) + end + + private + ## + ## Session method + ## + def session_get_composer (session) + composer = @sessions[session].get_composer() + return composer + end + + def session_set_candidates (session, wordlist) + @sessions[session].set_candidates(wordlist) + end + + def session_set_selection (session, index) + @sessions[session].set_selection(index) + end + def session_get_selection (session) + return @sessions[session].get_selection() + end + + def session_set_context (session, context) + @sessions[session].set_context(context) + end + def session_get_context (session) + return @sessions[session].get_context() + end + + ## + ## convertion methods + ## + def convert_prefix (composer, context) + # 「よ→予測」 + expansion = composer.edit_get_expansion() + query = PrimeQuery.new(expansion, nil, :prefix, context) + words = search(query) + return words + end + + def convert_exact (composer, context) + # 「よそく→予測」 + conversion = composer.edit_get_conversion() + query = PrimeQuery.new(conversion, nil, :exact, context) + words = search(query) + return words + end + + def convert_raw (composer, context) + ## FIXME: This method is an ad-hoc routine for search_japanese. + ## FIXME: <komat****@taiya*****> (2004-02-28) + raw_input = composer.edit_get_raw_input() + query = PrimeQuery.new(raw_input, nil, :exact, @context) + words = search(query) + return words + end + + def convert_overall (composer, context) + # 「1+1=→2」, 「aiueo→アイウエオ」 + raw_input = composer.edit_get_raw_input() + query = PrimeQuery.new(raw_input, nil, :overall) + words = search(query) + return words + end + + def convert_compact (composer, context) + words_prefix = convert_prefix(composer, context) +# words_japanese = convert_japanese_uniclause(composer, context) + # words_japanese = search_japanese(string) + # words_japanese = search_japanese_prefix(string) +# words_compact = PrimeWordList::merge(words_prefix, words_japanese)[0,1] + words_compact = PrimeWordList::merge(words_prefix)[0,1] + + if words_compact.length > 0 then + predict_with_multi_clauses!(words_compact) + + words_compact[1..-1].each {|word| + word.score = words_compact[0].score + } + end + return words_compact + end + + class PrimeSession + def initialize () + @composer = initialize_composer() + @candidates = PrimeWordList.new() + @target = "" + @context = "" + end + + def initialize_composer () + composer = SuikyoComposer.new() + composer.set_table(PRIME_ENV['suikyo_tables']) + composer.set_reverse_table(PRIME_ENV['suikyo_reverse_tables']) + + ## Setting hybrid_typing. + if PRIME_ENV['hybrid_typing'].nil? then + if PRIME_ENV['typing_method'] == 'romaji' then + PRIME_ENV['hybrid_typing'] = true + composer.hybrid_typing = true + end + else + composer.hybrid_typing = PRIME_ENV['hybrid_typing'] + end + + ## Setting period and comma in Japanese. + period = PRIME_ENV['style_japanese_period'] + comma = PRIME_ENV['style_japanese_comma'] + case PRIME_ENV['typing_method'] + when "romaji" then + composer.set_table_entry('.', period) + composer.set_table_entry(',', comma) + composer.set_reverse_table_entry(period, '.') + composer.set_reverse_table_entry(comma, ',') + when "kana" then + composer.set_table_entry('>', period) + composer.set_table_entry('<', comma) + composer.set_reverse_table_entry(period, '>') + composer.set_reverse_table_entry(comma, '<') + when "tcode" then + for char in 'A'..'Z' do + composer.set_table_entry(char, char) + composer.set_reverse_table_entry(char, char) + end + end + + return composer + end + + def get_composer () + return @composer + end + + def set_candidates (wordlist) + @candidates = wordlist + end + def get_candidates () + return @candidates + end + + def set_selection (index_no) + @target = @candidates[index_no] + return @target + end + def get_selection () + return @target + end + + def set_context (context) + @context = context + end + def get_context () + return @context + end + end +end Index: prime/lib/prime.rb diff -u prime/lib/prime.rb:1.7.4.8 prime/lib/prime.rb:1.7.4.9 --- prime/lib/prime.rb:1.7.4.8 Wed Dec 8 14:56:34 2004 +++ prime/lib/prime.rb Tue Dec 14 17:16:31 2004 @@ -1,5 +1,5 @@ # prime/prime.rb -# $Id: prime.rb,v 1.7.4.8 2004/12/08 05:56:34 komatsu Exp $ +# $Id: prime.rb,v 1.7.4.9 2004/12/14 08:16:31 komatsu Exp $ # # Copyright (C) 2002, 2003, 2004 Hiroyuki Komatsu <komat****@taiya*****> # All rights reserved. @@ -11,6 +11,7 @@ require 'prime/prime-config' require 'prime/taiyaki' +require 'prime/prime2' require 'prime/prime-japanese' require 'prime/prime-mixed' @@ -20,6 +21,7 @@ class Prime include Debug + include Prime2 include PrimeJapanese include PrimeMixed @@ -32,6 +34,7 @@ @context = nil initialize_prime_japanese() + initialize_prime2() @flag_opened = true end Index: prime/lib/prime-mixed.rb diff -u prime/lib/prime-mixed.rb:1.2.4.1 prime/lib/prime-mixed.rb:1.2.4.2 --- prime/lib/prime-mixed.rb:1.2.4.1 Wed Dec 8 17:38:16 2004 +++ prime/lib/prime-mixed.rb Tue Dec 14 17:16:31 2004 @@ -1,5 +1,5 @@ # prime/prime-mixed.rb -# $Id: prime-mixed.rb,v 1.2.4.1 2004/12/08 08:38:16 komatsu Exp $ +# $Id: prime-mixed.rb,v 1.2.4.2 2004/12/14 08:16:31 komatsu Exp $ # # Copyright (C) 2004 Hiroyuki Komatsu <komat****@taiya*****> # All rights reserved. @@ -85,8 +85,8 @@ regexp_literal += "(" + literals.uniq.join("|") + ")" end } - p regexp_pron - p regexp_literal +# p regexp_pron +# p regexp_literal end def lookup_mixed_concat_data_list (data_list) Index: prime/lib/Makefile.am diff -u prime/lib/Makefile.am:1.2.4.1 prime/lib/Makefile.am:1.2.4.2 --- prime/lib/Makefile.am:1.2.4.1 Mon Nov 22 18:12:25 2004 +++ prime/lib/Makefile.am Tue Dec 14 17:16:31 2004 @@ -1,5 +1,5 @@ # Makefile.am: Template of Automake for prime/lib. -# $Id: Makefile.am,v 1.2.4.1 2004/11/22 09:12:25 komatsu Exp $ +# $Id: Makefile.am,v 1.2.4.2 2004/12/14 08:16:31 komatsu Exp $ # # Copyright (C) 2003 Hiroyuki Komatsu <komat****@taiya*****> # All rights reserved. @@ -9,7 +9,8 @@ # the GNU General Public License version 2. SUBDIRS = engine grammar makedict -RUBY_FILES = prime.rb prime-japanese.rb prime-mixed.rb session.rb server.rb \ +RUBY_FILES = prime.rb prime2.rb prime-japanese.rb prime-mixed.rb \ + session.rb server.rb \ taiyaki.rb array-agent.rb EXTRA_DIST = $(RUBY_FILES) prime-config.rb.in