comparison lib/Ruby.rb @ 16:598fcbe482b5

imported patch 19_kinput2-v3.1-ruby.patch
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 20:38:17 +0900
parents
children
comparison
equal deleted inserted replaced
15:89750191b165 16:598fcbe482b5
1 $LOAD_PATH.push(ENV['KINPUT2_RUBY'])
2
3 $KCODE = 'e'
4 require "jcode"
5 require "kconv"
6 require 'suikyo/suikyo'
7
8 class TextEdit
9 attr_reader :cursor
10 def initialize (text = "", cursor = 0)
11 set (text, cursor)
12 end
13
14 def set (data, cursor = 0)
15 @data = data
16 @cursor = cursor
17 end
18
19 def text
20 return @data
21 end
22
23 def reset
24 set ("", 0)
25 end
26
27 def insert (string)
28 @data = @data[0,@cursor] + string + @data[@cursor..-1]
29 @cursor += string.length;
30 end
31
32 def delete
33 if (@cursor < @data.length) then
34 @data = @data[0,@cursor] + @data[(@cursor + 1)..-1]
35 end
36 end
37
38 def backspace
39 if (@cursor > 0) then
40 @data = @data[0,(@cursor - 1)] + @data[@cursor..-1]
41 @cursor -= 1
42 end
43 end
44
45 def cursor_left
46 if (@cursor > 0) then
47 @cursor -= 1
48 end
49 end
50
51 def cursor_right
52 if (@cursor < @data.length) then
53 @cursor += 1
54 end
55 end
56
57 def cursor_beginning
58 @cursor = 0
59 end
60
61 def cursor_end
62 @cursor = @data.length
63 end
64
65 def segments
66 # [text before the cursor, text on the cursor, text after the cursor]
67 return [@data[0,@cursor], @data[@cursor,1], @data[(@cursor + 1)..-1]]
68 end
69 end
70
71 class JTextEdit < TextEdit
72 def initialize (text = "", cursor = 0)
73 super
74 @suikyo = Suikyo.new
75 @suikyo.table.loadfile("romaji-kana")
76 end
77
78 def text
79 if @cursor == @data.length then
80 return @suikyo.convert (@data)
81 else
82 return super
83 end
84 end
85
86 def segments
87 if @cursor == @data.length then
88 return [@suikyo.convert (@data), '', '']
89 else
90 return super
91 end
92 end
93 end
94
95 class Window
96 attr_reader :call_open, :call_close, :visible
97
98 def initialize (parent)
99 @parent = parent
100 @visible = false
101 end
102
103 def open
104 @call_open = true unless @visible
105 end
106 def open_end
107 @call_open = false
108 @visible = true
109 end
110
111 def close
112 @call_close = true if @visible
113 end
114 def close_end
115 @call_close = false
116 @visible = false
117 end
118 end
119
120 class Dialog < Window
121 def text
122 @parent.cand_list.join(" ")
123 end
124 end
125
126 class Selection < Window
127 attr_reader :call_right, :call_left, :call_line_beginning, :call_line_end,
128 :call_up, :call_down
129
130 def right
131 @call_right = true
132 end
133 def right_end
134 @call_right = false
135 end
136
137 def left
138 @call_left = true
139 end
140 def left_end
141 @call_left = false
142 end
143
144 def line_beginning
145 @call_line_beginning = true
146 end
147 def line_beginning_end
148 @call_line_beginning = false
149 end
150
151 def line_end
152 @call_line_end = true
153 end
154 def line_end_end
155 @call_line_end = false
156 end
157
158 def up
159 @call_up = true
160 end
161 def up_end
162 @call_up = false
163 end
164
165 def down
166 @call_down = true
167 end
168 def down_end
169 @call_down = false
170 end
171 end
172
173 class KeyMap
174 @@keysym = {
175 :enter => 65293,
176 :space => 32,
177 :tab => 65289,
178 :delete => 65535,
179 :insert => 65379,
180 :home => 65360,
181 :end => 65367,
182 :page_up => 65365,
183 :page_down => 65366,
184 :esc => 65307,
185 :f1 => 65470,
186 :f2 => 65471,
187 :f3 => 65472,
188 :f4 => 65473,
189 :f5 => 65474,
190 :f6 => 65475,
191 :f7 => 65476,
192 :f8 => 65477,
193 :f9 => 65478,
194 :f10 => 65479,
195 :f11 => 65480,
196 :f12 => 65481,
197 :backspace => 65288,
198 :muhenkan => 65314,
199 :henkan => 65315,
200 :hankaku_zenkaku => 65322,
201 :katakana_hiragana => 65319,
202 :up => 65362,
203 :down => 65364,
204 :right => 65363,
205 :left => 65361,
206 :ctrl_l => 65507,
207 :ctrl_r => 65508,
208 :alt_l => 65513,
209 :alt_r => 65514,
210 :shift_l => 65505,
211 :shift_r => 65506,
212 }
213
214 # @@enter = [13, 65293, 0]
215 # @@ctrl_a = [1, 97, 4]; @@alt_a = [97, 97, 8]
216 # @@ctrl_b = [2, 98, 4]; @@alt_b = [98, 98, 8]
217 # @@ctrl_c = [3, 99, 4]; @@alt_c = [99, 99, 8]
218 # @@ctrl_d = [4, 100, 4]; @@alt_d = [100, 100, 8]
219 # @@ctrl_e = [5, 101, 4]; @@alt_e = [101, 101, 8]
220 # @@ctrl_f = [6, 102, 4]; @@alt_f = [102, 102, 8]
221 # @@ctrl_g = [7, 103, 4]; @@alt_g = [103, 103, 8]
222 # @@ctrl_h = [8, 104, 4]; @@alt_h = [104, 104, 8]
223 # @@ctrl_i = [9, 105, 4]; @@alt_i = [105, 105, 8]
224 # @@ctrl_j = [10, 106, 4]; @@alt_j = [106, 106, 8]
225 # @@ctrl_k = [11, 107, 4]; @@alt_k = [107, 107, 8]
226 # @@ctrl_l = [12, 108, 4]; @@alt_l = [108, 108, 8]
227 # @@ctrl_m = [13, 109, 4]; @@alt_m = [109, 109, 8]
228 # @@ctrl_n = [14, 110, 4]; @@alt_n = [110, 110, 8]
229 # @@ctrl_o = [15, 111, 4]; @@alt_o = [111, 111, 8]
230 # @@ctrl_p = [16, 112, 4]; @@alt_p = [112, 112, 8]
231 # @@ctrl_q = [17, 113, 4]; @@alt_q = [113, 113, 8]
232 # @@ctrl_r = [18, 114, 4]; @@alt_r = [114, 114, 8]
233 # @@ctrl_s = [19, 115, 4]; @@alt_s = [115, 115, 8]
234 # @@ctrl_t = [20, 116, 4]; @@alt_t = [116, 116, 8]
235 # @@ctrl_u = [21, 117, 4]; @@alt_u = [117, 117, 8]
236 # @@ctrl_v = [22, 118, 4]; @@alt_v = [118, 118, 8]
237 # @@ctrl_w = [23, 119, 4]; @@alt_w = [119, 119, 8]
238 # @@ctrl_x = [24, 120, 4]; @@alt_x = [120, 120, 8]
239 # @@ctrl_y = [25, 121, 4]; @@alt_y = [121, 121, 8]
240 # @@ctrl_z = [26, 122, 4]; @@alt_z = [122, 122, 8]
241
242 @@modifier = { :shift => 1, :ctrl => 4, :alt => 8 }
243
244 def initialize
245 @keymap = Hash.new
246 end
247
248 def key (stroke)
249 modifiers = 0
250 if stroke.kind_of?(Array) then
251 main_key = stroke[0]
252 stroke[1..-1].each {|modifier|
253 modifiers |=
254 (modifier.kind_of?(Symbol) ? @@modifier[modifier] : modifier)
255 }
256 else
257 main_key = stroke
258 end
259 if main_key.kind_of?(Symbol) then
260 main_key = @@keysym[main_key]
261 end
262 return [main_key, modifiers]
263 end
264
265 def ignore_shift (key)
266 (main_key, modifiers) = key
267 return [main_key, (modifiers & ~@@modifier[:shift])]
268 end
269
270 def add (stroke, command)
271 @keymap[key(stroke)] = command
272 end
273
274 def del (stroke)
275 @keymap.delete(key(stroke))
276 end
277
278 def command (stroke)
279 return @keymap[key(stroke)] || @keymap[ignore_shift(key(stroke))]
280 end
281 end
282
283
284 class ModeCore
285 attr_accessor :trap
286 attr_reader :label, :keymap
287 def initialize (parent)
288 @parent = parent
289 @label = ""
290 @keymap = KeyMap.new
291 initialize_keys
292 @trap = true
293 end
294
295 def on (prev_mode = nil)
296 end
297
298 def off (next_mode = nil)
299 end
300
301 def entries
302 return []
303 end
304
305 def call (char, keysym, modifiers)
306 command = @keymap.command([keysym, modifiers])
307 if command then
308 return send(command, keysym, modifiers)
309 else
310 return @trap
311 end
312 end
313 end
314
315 class ModeMaster
316 attr_reader :current_name
317
318 def initialize (parent, mode = :fund)
319 @parent = parent
320 @mode = Hash.new
321 @current_name = nil
322 end
323
324 def set (name, mode)
325 @mode[name] = mode
326 unless @current then
327 @current_name = name
328 end
329 end
330
331 def current
332 return @mode[@current_name]
333 end
334
335 def change (name)
336 if @mode.key?(name) then
337 @current_name = name
338 current.on
339 return true
340 else
341 return false
342 end
343 end
344
345 def label (name = @current_name)
346 if name then
347 mode = @mode[name]
348 else
349 mode = current
350 end
351
352 if mode then
353 return mode.label.toeuc
354 else
355 return "NOMODE"
356 end
357 end
358 end
359
360 class KanjiConvCore
361 attr_reader :cand_list, :cand_index,
362 :value_fixed, :call_fix, :mode
363
364 def initialize
365 @textEdit = TextEdit.new
366 @mode = ModeMaster.new (self)
367 clear
368 end
369
370 def reset
371 clear
372 end
373
374 def clear
375 @cand_list = []
376 @cand_index = 0
377
378 @call_fix = false
379 @value_fixed = ""
380 end
381
382 ## inputEvent (keynum, keysym = nil, state = nil)
383 ## ReturnValue 1:Pass 0:Trap
384 def inputEvent (keynum, keysym = nil, state = nil)
385 return 1
386 end
387
388 def fix (fixed_arg)
389 # fixed_arg is a string or an index number of cand_list.
390 @call_fix = true
391 if fixed_arg.kind_of?(Integer) then
392 word = @cand_list[fixed_arg]
393 else
394 word = fixed_arg
395 end
396 @value_fixed = word
397 end
398 def fix_end
399 @call_fix = false
400 @value_fixed = ""
401 end
402
403 def modeline
404 return @mode.label
405 end
406
407 def set_cand_list (list, index = nil)
408 if (list.is_a?(Array) && list.length > 0) then
409 @cand_list = list.map {|cand| cand.toeuc}
410 @cand_index = index if index
411 return true
412 else
413 reset_cand_list
414 return false
415 end
416 end
417 def set_cand_index (index)
418 puts "<<set_cand_index>> #{index}"
419 @cand_index = index
420 end
421 def reset_cand_list
422 @cand_list = []
423 @cand_index = 0
424 end
425
426 def segment_length
427 segments = (@mode.current.entries - [''])
428 return segments.length
429 end
430 def segment_word (n)
431 segments = (@mode.current.entries - [''])
432 return segments[n]
433 end
434 def segment_status (n)
435 segments = @mode.current.entries
436 offset = 0
437 if segments[0] == "" then
438 offset += 1
439 end
440 return ((n + offset) % 3 == 1) ? :highlight : :normal
441 end
442 end
443
444 require 'Prime'