1
;;; baidu-olime-jp.scm: baidu online ime for uim.
3
;;; Copyright (c) 2011-2012 uim Project http://code.google.com/p/uim/
5
;;; All rights reserved.
7
;;; Redistribution and use in source and binary forms, with or without
8
;;; modification, are permitted provided that the following conditions
10
;;; 1. Redistributions of source code must retain the above copyright
11
;;; notice, this list of conditions and the following disclaimer.
12
;;; 2. Redistributions in binary form must reproduce the above copyright
13
;;; notice, this list of conditions and the following disclaimer in the
14
;;; documentation and/or other materials provided with the distribution.
15
;;; 3. Neither the name of authors nor the names of its contributors
16
;;; may be used to endorse or promote products derived from this software
17
;;; without specific prior written permission.
19
;;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
20
;;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
;;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
23
;;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
;;; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
;;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
;;; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
;;; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
(require-extension (srfi 1 2 6 23 34 48))
35
(require "japanese.scm")
36
(require "http-client.scm")
38
(require "generic-predict.scm")
39
(require-custom "generic-key-custom.scm")
40
(require-custom "baidu-olime-jp-custom.scm")
41
(require-custom "baidu-olime-jp-key-custom.scm")
46
;; canna emulating functions
49
(define baidu-olime-jp-internal-context-rec-spec
54
(list 'candidates '())
56
(list 'prediction-word '())
57
(list 'prediction-candidates '())
58
(list 'prediction-appendix '())
59
(list 'prediction-nr '()))))
60
(define-record 'baidu-olime-jp-internal-context baidu-olime-jp-internal-context-rec-spec)
61
(define baidu-olime-jp-internal-context-new-internal baidu-olime-jp-internal-context-new)
63
(define (baidu-olime-jp-conversion str opts)
64
(define (fromconv str)
65
(let* ((cd (iconv-open "UTF-8" "EUC-JP"))
66
(ret (iconv-code-conv cd str)))
70
(let* ((cd (iconv-open "EUC-JP" "UTF-8"))
71
(ret (iconv-code-conv cd str)))
75
(format "/py?ol=1&web=1&py=~a~a"
76
(http:encode-uri-string (fromconv str)) opts))
79
(unzip2 (call-with-input-string
82
(car (json-read port)))))
83
(cons (map toconv cars)
84
(map (lambda (x) (map toconv x)) cdrs))))
85
(let* ((proxy (make-http-proxy-from-custom))
86
(ssl (make-http-ssl (SSLv3-client-method) 443))
87
(ret (http:get baidu-olime-jp-server (make-query) 80 proxy ssl)))
90
(define (baidu-olime-jp-predict bdc str)
92
(baidu-olime-context-prediction-ctx bdc)
95
(define (baidu-olime-jp-conversion-make-resize-query yomi-seg)
96
(let ((len (length yomi-seg)))
97
(apply string-append (map (lambda (idx)
99
(list-ref yomi-seg idx)
100
(string-append (list-ref yomi-seg idx) ",")))
102
(define (baidu-olime-jp-conversion-resize yomi-seg)
103
(baidu-olime-jp-conversion
104
(baidu-olime-jp-conversion-make-resize-query yomi-seg) ""))
106
(define (baidu-olime-jp-lib-init)
108
(define (baidu-olime-jp-lib-alloc-context)
109
(baidu-olime-jp-internal-context-new-internal))
110
(define (baidu-olime-jp-lib-get-nth-candidate bdc seg nth)
111
(let* ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
112
(cand (baidu-olime-jp-internal-context-candidates bdx-ctx)))
113
(list-ref (list-ref cand seg) nth)))
114
(define (baidu-olime-jp-lib-release-context bdc)
116
(define (baidu-olime-jp-lib-get-unconv-candidate bdc seg-idx)
117
(let* ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
118
(cand (baidu-olime-jp-internal-context-candidates bdx-ctx)))
120
(car (take-right (list-ref cand seg-idx) 1))))
121
(define (baidu-olime-jp-lib-get-nr-segments bdc)
122
(let* ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
123
(cand (baidu-olime-jp-internal-context-candidates bdx-ctx)))
125
(define (baidu-olime-jp-lib-get-nr-candidates bdc seg)
126
(let* ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
127
(cand (baidu-olime-jp-internal-context-candidates bdx-ctx)))
128
(length (list-ref cand seg))))
129
(define (baidu-olime-jp-next-yomi-seg yomi-seg seg cnt)
130
(let* ((kana-str (list-ref yomi-seg seg))
131
(kana-list (reverse (string-to-list kana-str))))
132
(cond ((and (< cnt 0) ;; shrink segment
133
(< 1 (length kana-list)))
134
(let* ((not-edited-head (if (< 0 seg)
137
(edited-head (list (apply string-append (drop-right kana-list (* -1 cnt)))))
138
(edited-tail (if (= (+ 1 seg) (length yomi-seg)) ;; end of segments
139
(take-right kana-list (* -1 cnt))
140
(let* ((next-char (car (take-right kana-list (* -1 cnt))))
141
(kana-next-str (list-ref yomi-seg (+ 1 seg))))
142
(list (string-append next-char kana-next-str)))))
143
(not-edited-tail (if (= (+ 1 seg) (length yomi-seg))
145
(drop yomi-seg (+ seg 2)))))
146
(append not-edited-head edited-head edited-tail not-edited-tail)))
147
((and (< 0 cnt) ;; stretch segment
148
(< (+ seg 1) (length yomi-seg))
149
(< 0 (length (string-to-list (list-ref yomi-seg (+ seg 1))))))
150
(let* ((next-str (list-ref yomi-seg (+ seg 1)))
151
(next-kana-list (reverse (string-to-list next-str)))
152
(not-edited-head (if (< 0 seg)
155
(edited-head (list (apply string-append
157
(take next-kana-list cnt)))))
158
(edited-tail (if (= 1 (length next-kana-list))
160
(list (apply string-append (drop next-kana-list cnt)))))
161
(not-edited-tail (if (< (length yomi-seg) 2)
163
(drop yomi-seg (+ 2 seg)))))
164
(append not-edited-head edited-head edited-tail not-edited-tail)))
167
(define (baidu-olime-jp-lib-resize-segment bdc seg cnt)
168
(let* ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
169
(cand (baidu-olime-jp-internal-context-candidates bdx-ctx))
170
(yomi-seg (baidu-olime-jp-internal-context-yomi-seg bdx-ctx))
171
(next-yomi-seg (baidu-olime-jp-next-yomi-seg yomi-seg seg cnt))
172
(replace-yomi-seg-and-next-cand (baidu-olime-jp-conversion-resize next-yomi-seg))
173
(replace-yomi-seg (car replace-yomi-seg-and-next-cand))
174
(next-cand (cdr replace-yomi-seg-and-next-cand)))
176
(not (equal? next-cand cand)))
178
(baidu-olime-jp-internal-context-set-candidates! bdx-ctx next-cand)
179
(baidu-olime-jp-internal-context-set-yomi-seg! bdx-ctx replace-yomi-seg)))
181
(define (baidu-olime-jp-lib-begin-conversion bdc str)
182
(let* ((yomi-seg-and-cand (baidu-olime-jp-conversion str ""))
183
(yomi-seg (car yomi-seg-and-cand))
184
(cand (cdr yomi-seg-and-cand))
185
(bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc)))
186
(baidu-olime-jp-internal-context-set-yomi-seg! bdx-ctx yomi-seg)
187
(baidu-olime-jp-internal-context-set-candidates! bdx-ctx cand)
189
(define (baidu-olime-jp-lib-commit-segments bdc delta)
191
(define (baidu-olime-jp-lib-reset-conversion bdc)
193
(define (baidu-olime-jp-lib-set-prediction-src-string bdc str)
194
(let* ((ret (predict-meta-search
195
(baidu-olime-jp-context-prediction-ctx bdc)
197
(bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
198
(word (predict-meta-word? ret))
199
(cands (predict-meta-candidates? ret))
200
(appendix (predict-meta-appendix? ret)))
201
(baidu-olime-jp-internal-context-set-prediction-word! bdx-ctx word)
202
(baidu-olime-jp-internal-context-set-prediction-candidates! bdx-ctx cands)
203
(baidu-olime-jp-internal-context-set-prediction-appendix! bdx-ctx appendix)
204
(baidu-olime-jp-internal-context-set-prediction-nr! bdx-ctx (length cands))
206
(define (baidu-olime-jp-lib-get-nr-predictions bdc)
207
(let ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc)))
208
(baidu-olime-jp-internal-context-prediction-nr bdx-ctx)))
209
(define (baidu-olime-jp-lib-get-nth-word bdc nth)
210
(let* ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
211
(word (baidu-olime-jp-internal-context-prediction-word bdx-ctx)))
212
(list-ref word nth)))
213
(define (baidu-olime-jp-lib-get-nth-prediction bdc nth)
214
(let* ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
215
(cands (baidu-olime-jp-internal-context-prediction-candidates bdx-ctx)))
216
(list-ref cands nth)))
217
(define (baidu-olime-jp-lib-get-nth-appendix bdc nth)
218
(let* ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
219
(appendix (baidu-olime-jp-internal-context-prediction-appendix bdx-ctx)))
220
(list-ref appendix nth)))
221
(define (baidu-olime-jp-lib-commit-nth-prediction bdc nth)
222
(let ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc)))
224
(baidu-olime-jp-context-prediction-ctx bdc)
225
(baidu-olime-jp-lib-get-nth-word bdc nth)
226
(baidu-olime-jp-lib-get-nth-prediction bdc nth)
227
(baidu-olime-jp-lib-get-nth-appendix bdc nth))
230
(define baidu-olime-jp-init-lib-ok? #f)
232
(define baidu-olime-jp-type-direct ja-type-direct)
233
(define baidu-olime-jp-type-hiragana ja-type-hiragana)
234
(define baidu-olime-jp-type-katakana ja-type-katakana)
235
(define baidu-olime-jp-type-halfkana ja-type-halfkana)
236
(define baidu-olime-jp-type-halfwidth-alnum ja-type-halfwidth-alnum)
237
(define baidu-olime-jp-type-fullwidth-alnum ja-type-fullwidth-alnum)
239
(define baidu-olime-jp-input-rule-roma 0)
240
(define baidu-olime-jp-input-rule-kana 1)
241
(define baidu-olime-jp-input-rule-azik 2)
242
(define baidu-olime-jp-input-rule-act 3)
243
(define baidu-olime-jp-input-rule-kzik 4)
245
(define baidu-olime-jp-candidate-type-katakana -2)
246
(define baidu-olime-jp-candidate-type-hiragana -3)
247
(define baidu-olime-jp-candidate-type-halfkana -4)
248
(define baidu-olime-jp-candidate-type-halfwidth-alnum -5)
249
(define baidu-olime-jp-candidate-type-fullwidth-alnum -6)
250
(define baidu-olime-jp-candidate-type-upper-halfwidth-alnum -7)
251
(define baidu-olime-jp-candidate-type-upper-fullwidth-alnum -8)
254
;; I don't think the key needs to be customizable.
255
(define-key baidu-olime-jp-space-key? '(" "))
257
(define baidu-olime-jp-prepare-input-rule-activation
260
((baidu-olime-jp-context-state bdc)
261
(baidu-olime-jp-do-commit bdc))
262
((baidu-olime-jp-context-transposing bdc)
263
(im-commit bdc (baidu-olime-jp-transposing-text bdc)))
265
(baidu-olime-jp-context-on bdc)
266
(baidu-olime-jp-has-preedit? bdc))
268
bdc (baidu-olime-jp-make-whole-string bdc #t (baidu-olime-jp-context-kana-mode bdc)))))
269
(baidu-olime-jp-flush bdc)
270
(baidu-olime-jp-update-preedit bdc)))
272
(define baidu-olime-jp-prepare-input-mode-activation
273
(lambda (bdc new-mode)
274
(let ((old-kana (baidu-olime-jp-context-kana-mode bdc)))
276
((baidu-olime-jp-context-state bdc)
277
(baidu-olime-jp-do-commit bdc))
278
((baidu-olime-jp-context-transposing bdc)
279
(im-commit bdc (baidu-olime-jp-transposing-text bdc))
280
(baidu-olime-jp-flush bdc))
282
(baidu-olime-jp-context-on bdc)
283
(baidu-olime-jp-has-preedit? bdc)
284
(not (= old-kana new-mode)))
286
bdc (baidu-olime-jp-make-whole-string bdc #t (baidu-olime-jp-context-kana-mode bdc)))
287
(baidu-olime-jp-flush bdc)))
288
(baidu-olime-jp-update-preedit bdc))))
290
(register-action 'action_baidu-olime-jp_hiragana
291
(lambda (bdc) ;; indication handler
297
(lambda (bdc) ;; activity predicate
298
(and (baidu-olime-jp-context-on bdc)
299
(not (baidu-olime-jp-context-alnum bdc))
300
(= (baidu-olime-jp-context-kana-mode bdc)
301
baidu-olime-jp-type-hiragana)))
303
(lambda (bdc) ;; action handler
304
(baidu-olime-jp-prepare-input-mode-activation bdc baidu-olime-jp-type-hiragana)
305
(baidu-olime-jp-context-set-on! bdc #t)
306
(baidu-olime-jp-context-set-alnum! bdc #f)
307
(baidu-olime-jp-context-change-kana-mode! bdc baidu-olime-jp-type-hiragana)))
309
(register-action 'action_baidu-olime-jp_katakana
316
(and (baidu-olime-jp-context-on bdc)
317
(not (baidu-olime-jp-context-alnum bdc))
318
(= (baidu-olime-jp-context-kana-mode bdc)
319
baidu-olime-jp-type-katakana)))
321
(baidu-olime-jp-prepare-input-mode-activation bdc baidu-olime-jp-type-katakana)
322
(baidu-olime-jp-context-set-on! bdc #t)
323
(baidu-olime-jp-context-set-alnum! bdc #f)
324
(baidu-olime-jp-context-change-kana-mode! bdc baidu-olime-jp-type-katakana)))
326
(register-action 'action_baidu-olime-jp_halfkana
331
"Ⱦ�ѥ����������ϥ⡼��"))
333
(and (baidu-olime-jp-context-on bdc)
334
(not (baidu-olime-jp-context-alnum bdc))
335
(= (baidu-olime-jp-context-kana-mode bdc) baidu-olime-jp-type-halfkana)))
337
(baidu-olime-jp-prepare-input-mode-activation bdc baidu-olime-jp-type-halfkana)
338
(baidu-olime-jp-context-set-on! bdc #t)
339
(baidu-olime-jp-context-set-alnum! bdc #f)
340
(baidu-olime-jp-context-change-kana-mode! bdc baidu-olime-jp-type-halfkana)))
342
(register-action 'action_baidu-olime-jp_halfwidth_alnum
343
(lambda (bdc) ;; indication handler
348
(lambda (bdc) ;; activity predicate
349
(and (baidu-olime-jp-context-on bdc)
350
(baidu-olime-jp-context-alnum bdc)
351
(= (baidu-olime-jp-context-alnum-type bdc)
352
baidu-olime-jp-type-halfwidth-alnum)))
353
(lambda (bdc) ;; action handler
354
(baidu-olime-jp-prepare-input-mode-activation
355
bdc (baidu-olime-jp-context-kana-mode bdc))
356
(baidu-olime-jp-context-set-on! bdc #t)
357
(baidu-olime-jp-context-set-alnum! bdc #t)
358
(baidu-olime-jp-context-set-alnum-type!
359
bdc baidu-olime-jp-type-halfwidth-alnum)))
361
(register-action 'action_baidu-olime-jp_direct
368
(not (baidu-olime-jp-context-on bdc)))
370
(baidu-olime-jp-prepare-input-mode-activation bdc baidu-olime-jp-type-direct)
371
(baidu-olime-jp-context-set-on! bdc #f)))
373
(register-action 'action_baidu-olime-jp_fullwidth_alnum
380
(and (baidu-olime-jp-context-on bdc)
381
(baidu-olime-jp-context-alnum bdc)
382
(= (baidu-olime-jp-context-alnum-type bdc)
383
baidu-olime-jp-type-fullwidth-alnum)))
385
(baidu-olime-jp-prepare-input-mode-activation
386
bdc (baidu-olime-jp-context-kana-mode bdc))
387
(baidu-olime-jp-context-set-on! bdc #t)
388
(baidu-olime-jp-context-set-alnum! bdc #t)
389
(baidu-olime-jp-context-set-alnum-type!
390
bdc baidu-olime-jp-type-fullwidth-alnum)))
392
(register-action 'action_baidu-olime-jp_roma
399
(= (baidu-olime-jp-context-input-rule bdc)
400
baidu-olime-jp-input-rule-roma))
402
(baidu-olime-jp-prepare-input-rule-activation bdc)
403
(rk-context-set-rule! (baidu-olime-jp-context-rkc bdc)
405
(baidu-olime-jp-context-set-input-rule! bdc baidu-olime-jp-input-rule-roma)))
407
(register-action 'action_baidu-olime-jp_kana
414
(= (baidu-olime-jp-context-input-rule bdc)
415
baidu-olime-jp-input-rule-kana))
417
(baidu-olime-jp-prepare-input-rule-activation bdc)
418
(require "japanese-kana.scm")
419
(baidu-olime-jp-context-set-input-rule! bdc baidu-olime-jp-input-rule-kana)
420
(baidu-olime-jp-context-change-kana-mode!
421
bdc (baidu-olime-jp-context-kana-mode bdc))
422
(baidu-olime-jp-context-set-alnum! bdc #f)))
424
(register-action 'action_baidu-olime-jp_azik
429
"AZIK��ĥ���������ϥ⡼��"))
431
(= (baidu-olime-jp-context-input-rule bdc)
432
baidu-olime-jp-input-rule-azik))
434
(baidu-olime-jp-prepare-input-rule-activation bdc)
435
(require "japanese-azik.scm")
436
(rk-context-set-rule! (baidu-olime-jp-context-rkc bdc)
438
(baidu-olime-jp-context-set-input-rule! bdc baidu-olime-jp-input-rule-azik)))
440
(register-action 'action_baidu-olime-jp_kzik
445
"KZIK��ĥ���������ϥ⡼��"))
447
(= (baidu-olime-jp-context-input-rule bdc)
448
baidu-olime-jp-input-rule-kzik))
450
(baidu-olime-jp-prepare-input-rule-activation bdc)
451
(require "japanese-kzik.scm")
452
(rk-context-set-rule! (baidu-olime-jp-context-rkc bdc)
454
(baidu-olime-jp-context-set-input-rule! bdc baidu-olime-jp-input-rule-kzik)))
456
(register-action 'action_baidu-olime-jp_act
461
"ACT��ĥ���������ϥ⡼��"))
463
(= (baidu-olime-jp-context-input-rule bdc)
464
baidu-olime-jp-input-rule-act))
466
(baidu-olime-jp-prepare-input-rule-activation bdc)
467
(require "japanese-act.scm")
468
(rk-context-set-rule! (baidu-olime-jp-context-rkc bdc)
470
(baidu-olime-jp-context-set-input-rule! bdc baidu-olime-jp-input-rule-act)))
472
;; Update widget definitions based on action configurations. The
473
;; procedure is needed for on-the-fly reconfiguration involving the
475
(define baidu-olime-jp-configure-widgets
477
(register-widget 'widget_baidu-olime-jp_input_mode
478
(activity-indicator-new baidu-olime-jp-input-mode-actions)
479
(actions-new baidu-olime-jp-input-mode-actions))
481
(register-widget 'widget_baidu-olime-jp_kana_input_method
482
(activity-indicator-new baidu-olime-jp-kana-input-method-actions)
483
(actions-new baidu-olime-jp-kana-input-method-actions))
484
(context-list-replace-widgets! 'baidu-olime-jp baidu-olime-jp-widgets)))
486
(define baidu-olime-jp-context-rec-spec
492
(list 'transposing #f)
493
(list 'transposing-type 0)
494
(list 'predicting #f)
495
(list 'bdx-ctx ()) ;; baidu-olime-jp-internal-context
496
(list 'preconv-ustr #f) ;; preedit strings
498
(list 'segments #f) ;; ustr of candidate indices
499
(list 'candidate-window #f)
500
(list 'candidate-op-count 0)
501
(list 'prediction-ctx '())
502
(list 'prediction-window #f)
503
(list 'prediction-index #f)
504
(list 'prediction-cache '())
505
(list 'kana-mode baidu-olime-jp-type-hiragana)
507
(list 'alnum-type baidu-olime-jp-type-halfwidth-alnum)
508
(list 'commit-raw #t)
509
(list 'input-rule baidu-olime-jp-input-rule-roma)
510
(list 'raw-ustr #f))))
511
(define-record 'baidu-olime-jp-context baidu-olime-jp-context-rec-spec)
512
(define baidu-olime-jp-context-new-internal baidu-olime-jp-context-new)
514
(define (baidu-olime-jp-context-new id im)
515
(let ((bdc (baidu-olime-jp-context-new-internal id im))
516
(rkc (rk-context-new ja-rk-rule #t #f)))
517
; (baidu-olime-jp-context-set-bdx-ctx! bdc (if baidu-olime-jp-init-lib-ok?
518
; (baidu-olime-jp-lib-alloc-context) ()))
519
(baidu-olime-jp-context-set-bdx-ctx! bdc (baidu-olime-jp-lib-alloc-context))
520
(baidu-olime-jp-context-set-widgets! bdc baidu-olime-jp-widgets)
521
(baidu-olime-jp-context-set-rkc! bdc rkc)
522
(baidu-olime-jp-context-set-preconv-ustr! bdc (ustr-new '()))
523
(baidu-olime-jp-context-set-raw-ustr! bdc (ustr-new '()))
524
(baidu-olime-jp-context-set-segments! bdc (ustr-new '()))
525
(if baidu-olime-jp-use-prediction?
527
(baidu-olime-jp-context-set-prediction-ctx! bdc (predict-make-meta-search))
528
(predict-meta-open (baidu-olime-jp-context-prediction-ctx bdc) "baidu-olime-jp")
529
(predict-meta-set-external-charset! (baidu-olime-jp-context-prediction-ctx bdc) "UTF-8")))
532
(define (baidu-olime-jp-commit-raw bdc)
534
(baidu-olime-jp-context-set-commit-raw! bdc #t))
536
(define (baidu-olime-jp-context-kana-toggle bdc)
537
(let* ((kana (baidu-olime-jp-context-kana-mode bdc))
538
(opposite-kana (ja-opposite-kana kana)))
539
(baidu-olime-jp-context-change-kana-mode! bdc opposite-kana)))
541
(define baidu-olime-jp-context-alkana-toggle
543
(let ((alnum-state (baidu-olime-jp-context-alnum bdc)))
544
(baidu-olime-jp-context-set-alnum! bdc (not alnum-state)))))
546
(define baidu-olime-jp-context-change-kana-mode!
547
(lambda (bdc kana-mode)
548
(if (= (baidu-olime-jp-context-input-rule bdc)
549
baidu-olime-jp-input-rule-kana)
550
(rk-context-set-rule!
551
(baidu-olime-jp-context-rkc bdc)
553
((= kana-mode baidu-olime-jp-type-hiragana) ja-kana-hiragana-rule)
554
((= kana-mode baidu-olime-jp-type-katakana) ja-kana-katakana-rule)
555
((= kana-mode baidu-olime-jp-type-halfkana) ja-kana-halfkana-rule))))
556
(baidu-olime-jp-context-set-kana-mode! bdc kana-mode)))
558
(define baidu-olime-jp-make-whole-string
559
(lambda (bdc convert-pending-into-kana? kana)
560
(let* ((rkc (baidu-olime-jp-context-rkc bdc))
561
(pending (rk-pending rkc))
562
(residual-kana (rk-peek-terminal-match rkc))
563
(rule (baidu-olime-jp-context-input-rule bdc))
564
(preconv-str (baidu-olime-jp-context-preconv-ustr bdc))
566
(if (= rule baidu-olime-jp-input-rule-kana)
567
(lambda (entry) (car entry))
568
(lambda (entry) (list-ref entry kana)))))
570
(if (= rule baidu-olime-jp-input-rule-kana)
572
(ja-make-kana-str-list
575
(string-append-map-ustr-former extract-kana preconv-str)
576
(if convert-pending-into-kana?
578
(if (list? (car residual-kana))
579
(string-append-map extract-kana residual-kana)
580
(extract-kana residual-kana))
583
(string-append-map-ustr-latter extract-kana preconv-str))))
586
(string-append-map-ustr-former extract-kana preconv-str)
587
(if convert-pending-into-kana?
589
(if (list? (car residual-kana))
590
(string-append-map extract-kana residual-kana)
591
(extract-kana residual-kana))
594
(string-append-map-ustr-latter extract-kana preconv-str))))))
596
(define baidu-olime-jp-make-raw-string
597
(lambda (raw-str-list wide? upper?)
598
(if (not (null? raw-str-list))
601
(ja-string-list-to-wide-alphabet
603
(map charcode->string
605
(map string->charcode
606
(string-to-list (car raw-str-list)))))
607
(string-to-list (car raw-str-list))))
608
(baidu-olime-jp-make-raw-string (cdr raw-str-list) wide? upper?))
612
(map charcode->string
614
(map string->charcode
615
(string-to-list (car raw-str-list))))))
617
(baidu-olime-jp-make-raw-string (cdr raw-str-list) wide? upper?)))
620
(define baidu-olime-jp-make-whole-raw-string
621
(lambda (bdc wide? upper?)
622
(baidu-olime-jp-make-raw-string (baidu-olime-jp-get-raw-str-seq bdc) wide? upper?)))
624
(define (baidu-olime-jp-init-handler id im arg)
625
(if (not baidu-olime-jp-init-lib-ok?)
627
(baidu-olime-jp-lib-init)
628
(set! baidu-olime-jp-init-lib-ok? #t)))
629
(baidu-olime-jp-context-new id im))
631
(define (baidu-olime-jp-release-handler bdc)
633
(baidu-olime-jp-lib-release-context bdc)))
635
(define (baidu-olime-jp-flush bdc)
636
(rk-flush (baidu-olime-jp-context-rkc bdc))
637
(ustr-clear! (baidu-olime-jp-context-preconv-ustr bdc))
638
(ustr-clear! (baidu-olime-jp-context-raw-ustr bdc))
639
(ustr-clear! (baidu-olime-jp-context-segments bdc))
640
(baidu-olime-jp-context-set-transposing! bdc #f)
641
(baidu-olime-jp-context-set-state! bdc #f)
643
(baidu-olime-jp-context-candidate-window bdc)
644
(baidu-olime-jp-context-prediction-window bdc))
645
(im-deactivate-candidate-selector bdc))
646
(baidu-olime-jp-context-set-candidate-window! bdc #f)
647
(baidu-olime-jp-context-set-prediction-window! bdc #f)
648
(baidu-olime-jp-context-set-candidate-op-count! bdc 0))
650
(define (baidu-olime-jp-begin-input bdc key key-state)
652
((baidu-olime-jp-on-key? key key-state)
655
baidu-olime-jp-use-mode-transition-keys-in-off-mode?
657
((baidu-olime-jp-hiragana-key? key key-state)
658
(baidu-olime-jp-context-set-kana-mode! bdc baidu-olime-jp-type-hiragana)
659
(baidu-olime-jp-context-set-alnum! bdc #f)
661
((baidu-olime-jp-katakana-key? key key-state)
662
(baidu-olime-jp-context-set-kana-mode! bdc baidu-olime-jp-type-katakana)
663
(baidu-olime-jp-context-set-alnum! bdc #f)
665
((baidu-olime-jp-halfkana-key? key key-state)
666
(baidu-olime-jp-context-set-kana-mode! bdc baidu-olime-jp-type-halfkana)
667
(baidu-olime-jp-context-set-alnum! bdc #f)
669
((baidu-olime-jp-halfwidth-alnum-key? key key-state)
670
(baidu-olime-jp-context-set-alnum-type! bdc baidu-olime-jp-type-halfwidth-alnum)
671
(baidu-olime-jp-context-set-alnum! bdc #t)
673
((baidu-olime-jp-halfwidth-alnum-key? key key-state)
674
(baidu-olime-jp-context-set-alnum-type! bdc baidu-olime-jp-type-fullwidth-alnum)
675
(baidu-olime-jp-context-set-alnum! bdc #t)
677
((baidu-olime-jp-kana-toggle-key? key key-state)
678
(baidu-olime-jp-context-kana-toggle bdc)
679
(baidu-olime-jp-context-set-alnum! bdc #f)
681
((baidu-olime-jp-alkana-toggle-key? key key-state)
682
(baidu-olime-jp-context-alkana-toggle bdc)
689
(baidu-olime-jp-context-set-on! bdc #t)
690
(rk-flush (baidu-olime-jp-context-rkc bdc))
691
(baidu-olime-jp-context-set-state! bdc #f)
695
(define (baidu-olime-jp-update-preedit bdc)
696
(if (not (baidu-olime-jp-context-commit-raw bdc))
697
(let ((segments (if (baidu-olime-jp-context-on bdc)
698
(if (baidu-olime-jp-context-transposing bdc)
699
(baidu-olime-jp-context-transposing-state-preedit bdc)
700
(if (baidu-olime-jp-context-state bdc)
701
(baidu-olime-jp-compose-state-preedit bdc)
702
(if (baidu-olime-jp-context-predicting bdc)
703
(baidu-olime-jp-predicting-state-preedit bdc)
704
(baidu-olime-jp-input-state-preedit bdc))))
706
(context-update-preedit bdc segments))
707
(baidu-olime-jp-context-set-commit-raw! bdc #f)))
709
(define (baidu-olime-jp-begin-conv bdc)
710
(let ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
711
(preconv-str (baidu-olime-jp-make-whole-string bdc #t baidu-olime-jp-type-hiragana)))
713
(> (string-length preconv-str) 0))
714
(let ((num (baidu-olime-jp-lib-begin-conversion bdc preconv-str)))
717
(ustr-set-latter-seq!
718
(baidu-olime-jp-context-segments bdc)
720
(baidu-olime-jp-context-set-state! bdc #t)
721
;; Don't perform rk-flush here. The rkc must be restored when
722
;; baidu-olime-jp-cancel-conv invoked -- YamaKen 2004-10-25
725
(define baidu-olime-jp-cancel-conv
727
(baidu-olime-jp-reset-candidate-window bdc)
728
(baidu-olime-jp-context-set-state! bdc #f)
729
(ustr-clear! (baidu-olime-jp-context-segments bdc))
730
(baidu-olime-jp-lib-reset-conversion bdc)))
732
(define (baidu-olime-jp-proc-input-state-no-preedit bdc key key-state)
734
((rkc (baidu-olime-jp-context-rkc bdc))
735
(direct (ja-direct (charcode->string key)))
736
(rule (baidu-olime-jp-context-input-rule bdc)))
738
((and baidu-olime-jp-use-with-vi?
739
(baidu-olime-jp-vi-escape-key? key key-state))
740
(baidu-olime-jp-flush bdc)
741
(baidu-olime-jp-context-set-on! bdc #f)
742
(baidu-olime-jp-commit-raw bdc))
744
((baidu-olime-jp-off-key? key key-state)
745
(baidu-olime-jp-flush bdc)
746
(baidu-olime-jp-context-set-on! bdc #f))
748
((baidu-olime-jp-backspace-key? key key-state)
749
(baidu-olime-jp-commit-raw bdc))
751
((baidu-olime-jp-delete-key? key key-state)
752
(baidu-olime-jp-commit-raw bdc))
755
(baidu-olime-jp-hiragana-key? key key-state)
758
(= (baidu-olime-jp-context-kana-mode bdc) baidu-olime-jp-type-hiragana)
759
(not (baidu-olime-jp-context-alnum bdc)))))
760
(baidu-olime-jp-context-change-kana-mode! bdc baidu-olime-jp-type-hiragana)
761
(baidu-olime-jp-context-set-alnum! bdc #f))
764
(baidu-olime-jp-katakana-key? key key-state)
767
(= (baidu-olime-jp-context-kana-mode bdc) baidu-olime-jp-type-katakana)
768
(not (baidu-olime-jp-context-alnum bdc)))))
769
(baidu-olime-jp-context-change-kana-mode! bdc baidu-olime-jp-type-katakana)
770
(baidu-olime-jp-context-set-alnum! bdc #f))
773
(baidu-olime-jp-halfkana-key? key key-state)
776
(= (baidu-olime-jp-context-kana-mode bdc) baidu-olime-jp-type-halfkana)
777
(not (baidu-olime-jp-context-alnum bdc)))))
778
(baidu-olime-jp-context-change-kana-mode! bdc baidu-olime-jp-type-halfkana)
779
(baidu-olime-jp-context-set-alnum! bdc #f))
782
(baidu-olime-jp-halfwidth-alnum-key? key key-state)
785
(= (baidu-olime-jp-context-alnum-type bdc) baidu-olime-jp-type-halfwidth-alnum)
786
(baidu-olime-jp-context-alnum bdc))))
787
(baidu-olime-jp-context-set-alnum-type! bdc baidu-olime-jp-type-halfwidth-alnum)
788
(baidu-olime-jp-context-set-alnum! bdc #t))
791
(baidu-olime-jp-fullwidth-alnum-key? key key-state)
794
(= (baidu-olime-jp-context-alnum-type bdc) baidu-olime-jp-type-fullwidth-alnum)
795
(baidu-olime-jp-context-alnum bdc))))
796
(baidu-olime-jp-context-set-alnum-type! bdc baidu-olime-jp-type-fullwidth-alnum)
797
(baidu-olime-jp-context-set-alnum! bdc #t))
800
(not (baidu-olime-jp-context-alnum bdc))
801
(baidu-olime-jp-kana-toggle-key? key key-state))
802
(baidu-olime-jp-context-kana-toggle bdc))
804
((baidu-olime-jp-alkana-toggle-key? key key-state)
805
(baidu-olime-jp-context-alkana-toggle bdc))
807
;; modifiers (except shift) => ignore
808
((and (modifier-key-mask key-state)
809
(not (shift-key-mask key-state)))
810
(baidu-olime-jp-commit-raw bdc))
812
;; direct key => commit
814
(im-commit bdc direct))
817
((baidu-olime-jp-space-key? key key-state)
818
(if (baidu-olime-jp-context-alnum bdc)
819
(im-commit bdc (list-ref
821
(- (baidu-olime-jp-context-alnum-type bdc)
822
baidu-olime-jp-type-halfwidth-alnum)))
823
(im-commit bdc (list-ref ja-space (baidu-olime-jp-context-kana-mode bdc)))))
826
(baidu-olime-jp-commit-raw bdc))
829
(if (baidu-olime-jp-context-alnum bdc)
830
(let ((key-str (charcode->string key)))
831
(ustr-insert-elem! (baidu-olime-jp-context-preconv-ustr bdc)
832
(if (= (baidu-olime-jp-context-alnum-type bdc)
833
baidu-olime-jp-type-halfwidth-alnum)
834
(list key-str key-str key-str)
835
(list (ja-wide key-str) (ja-wide key-str)
837
(ustr-insert-elem! (baidu-olime-jp-context-raw-ustr bdc) key-str))
838
(let* ((key-str (charcode->string
839
(if (= rule baidu-olime-jp-input-rule-kana)
841
(ichar-downcase key))))
842
(res (rk-push-key! rkc key-str)))
845
(if (list? (car res))
846
(ustr-insert-seq! (baidu-olime-jp-context-preconv-ustr bdc) res)
847
(ustr-insert-elem! (baidu-olime-jp-context-preconv-ustr bdc) res))
848
(ustr-insert-elem! (baidu-olime-jp-context-raw-ustr bdc) key-str))
849
(if (null? (rk-context-seq rkc))
850
(baidu-olime-jp-commit-raw bdc)))))))))
852
(define (baidu-olime-jp-has-preedit? bdc)
853
(or (not (ustr-empty? (baidu-olime-jp-context-preconv-ustr bdc)))
854
(> (string-length (rk-pending (baidu-olime-jp-context-rkc bdc))) 0)))
856
(define baidu-olime-jp-rotate-transposing-alnum-type
857
(lambda (cur-type state)
860
(= cur-type baidu-olime-jp-type-halfwidth-alnum)
861
(= state baidu-olime-jp-type-halfwidth-alnum))
862
baidu-olime-jp-candidate-type-upper-halfwidth-alnum)
864
(= cur-type baidu-olime-jp-type-fullwidth-alnum)
865
(= state baidu-olime-jp-type-fullwidth-alnum))
866
baidu-olime-jp-candidate-type-upper-fullwidth-alnum)
870
(define baidu-olime-jp-proc-transposing-state
871
(lambda (bdc key key-state)
872
(let ((rotate-list '())
874
(if (baidu-olime-jp-transpose-as-fullwidth-alnum-key? key key-state)
875
(set! rotate-list (cons baidu-olime-jp-type-fullwidth-alnum rotate-list)))
876
(if (baidu-olime-jp-transpose-as-halfwidth-alnum-key? key key-state)
877
(set! rotate-list (cons baidu-olime-jp-type-halfwidth-alnum rotate-list)))
878
(if (baidu-olime-jp-transpose-as-halfkana-key? key key-state)
879
(set! rotate-list (cons baidu-olime-jp-type-halfkana rotate-list)))
880
(if (baidu-olime-jp-transpose-as-katakana-key? key key-state)
881
(set! rotate-list (cons baidu-olime-jp-type-katakana rotate-list)))
882
(if (baidu-olime-jp-transpose-as-hiragana-key? key key-state)
883
(set! rotate-list (cons baidu-olime-jp-type-hiragana rotate-list)))
885
(if (baidu-olime-jp-context-transposing bdc)
886
(let ((lst (member (baidu-olime-jp-context-transposing-type bdc) rotate-list)))
888
(not (null? (cdr lst))))
889
(set! state (car (cdr lst)))
890
(if (not (null? rotate-list))
891
(set! state (baidu-olime-jp-rotate-transposing-alnum-type
892
(baidu-olime-jp-context-transposing-type bdc)
893
(car rotate-list))))))
895
(baidu-olime-jp-context-set-transposing! bdc #t)
896
(set! state (car rotate-list))))
901
(= state baidu-olime-jp-type-hiragana)
902
(= state baidu-olime-jp-type-katakana)
903
(= state baidu-olime-jp-type-halfkana)))
904
(baidu-olime-jp-context-set-transposing-type! bdc state))
907
(= state baidu-olime-jp-type-halfwidth-alnum)
908
(= state baidu-olime-jp-candidate-type-upper-halfwidth-alnum)
909
(= state baidu-olime-jp-type-fullwidth-alnum)
910
(= state baidu-olime-jp-candidate-type-upper-fullwidth-alnum)))
911
(if (not (= (baidu-olime-jp-context-input-rule bdc) baidu-olime-jp-input-rule-kana))
912
(baidu-olime-jp-context-set-transposing-type! bdc state)))
916
(if (baidu-olime-jp-commit-key? key key-state)
918
(im-commit bdc (baidu-olime-jp-transposing-text bdc))
919
(baidu-olime-jp-flush bdc)
923
(if (baidu-olime-jp-begin-conv-key? key key-state)
925
(baidu-olime-jp-context-set-transposing! bdc #f)
926
(baidu-olime-jp-begin-conv bdc)
931
(baidu-olime-jp-cancel-key? key key-state)
932
(baidu-olime-jp-backspace-key? key key-state))
934
(baidu-olime-jp-context-set-transposing! bdc #f)
939
(baidu-olime-jp-prev-page-key? key key-state)
940
(baidu-olime-jp-next-page-key? key key-state)
941
(baidu-olime-jp-extend-segment-key? key key-state)
942
(baidu-olime-jp-shrink-segment-key? key key-state)
943
(baidu-olime-jp-next-segment-key? key key-state)
944
(baidu-olime-jp-beginning-of-preedit-key? key key-state)
945
(baidu-olime-jp-end-of-preedit-key? key key-state)
946
(baidu-olime-jp-next-candidate-key? key key-state)
947
(baidu-olime-jp-prev-candidate-key? key key-state)
949
(modifier-key-mask key-state)
950
(not (shift-key-mask key-state)))
956
(im-commit bdc (baidu-olime-jp-transposing-text bdc))
957
(baidu-olime-jp-flush bdc)
958
(baidu-olime-jp-proc-input-state bdc key key-state))))))))
960
(define (baidu-olime-jp-move-prediction bdc offset)
961
(let* ((nr (baidu-olime-jp-lib-get-nr-predictions bdc))
962
(idx (baidu-olime-jp-context-prediction-index bdc))
973
(im-select-candidate bdc compensated-n)
974
(baidu-olime-jp-context-set-prediction-index! bdc compensated-n)))
976
(define (baidu-olime-jp-move-prediction-in-page bdc numeralc)
977
(let* ((nr (baidu-olime-jp-lib-get-nr-predictions bdc))
978
(p-idx (baidu-olime-jp-context-prediction-index bdc))
982
(cur-page (if (= baidu-olime-jp-nr-candidate-max 0)
984
(quotient n baidu-olime-jp-nr-candidate-max)))
985
(pageidx (- (numeric-ichar->integer numeralc) 1))
986
(compensated-pageidx (cond
987
((< pageidx 0) ; pressing key_0
991
(idx (+ (* cur-page baidu-olime-jp-nr-candidate-max) compensated-pageidx))
992
(compensated-idx (cond
997
(selected-pageidx (if (not p-idx)
999
(if (= baidu-olime-jp-nr-candidate-max 0)
1002
baidu-olime-jp-nr-candidate-max)))))
1005
(not (eqv? compensated-pageidx selected-pageidx)))
1007
(baidu-olime-jp-context-set-prediction-index! bdc compensated-idx)
1008
(im-select-candidate bdc compensated-idx)
1012
(define (baidu-olime-jp-prediction-select-non-existing-index? bdc numeralc)
1013
(let* ((nr (baidu-olime-jp-lib-get-nr-predictions bdc))
1014
(p-idx (baidu-olime-jp-context-prediction-index bdc))
1015
(cur-page (if (= baidu-olime-jp-nr-candidate-max 0)
1017
(quotient p-idx baidu-olime-jp-nr-candidate-max)))
1018
(pageidx (- (numeric-ichar->integer numeralc) 1))
1019
(compensated-pageidx (cond
1020
((< pageidx 0) ; pressing key_0
1024
(idx (+ (* cur-page baidu-olime-jp-nr-candidate-max) compensated-pageidx)))
1029
(define (baidu-olime-jp-prediction-keys-handled? bdc key key-state)
1031
((baidu-olime-jp-next-prediction-key? key key-state)
1032
(baidu-olime-jp-move-prediction bdc 1)
1034
((baidu-olime-jp-prev-prediction-key? key key-state)
1035
(baidu-olime-jp-move-prediction bdc -1)
1038
baidu-olime-jp-select-prediction-by-numeral-key?
1039
(ichar-numeric? key))
1040
(baidu-olime-jp-move-prediction-in-page bdc key))
1042
(baidu-olime-jp-context-prediction-index bdc)
1043
(baidu-olime-jp-prev-page-key? key key-state))
1044
(im-shift-page-candidate bdc #f)
1047
(baidu-olime-jp-context-prediction-index bdc)
1048
(baidu-olime-jp-next-page-key? key key-state))
1049
(im-shift-page-candidate bdc #t)
1054
(define (baidu-olime-jp-proc-prediction-state bdc key key-state)
1056
;; prediction index change
1057
((baidu-olime-jp-prediction-keys-handled? bdc key key-state))
1060
((baidu-olime-jp-cancel-key? key key-state)
1061
(if (baidu-olime-jp-context-prediction-index bdc)
1062
(baidu-olime-jp-reset-prediction-window bdc)
1064
(baidu-olime-jp-reset-prediction-window bdc)
1065
(baidu-olime-jp-proc-input-state bdc key key-state))))
1069
(baidu-olime-jp-context-prediction-index bdc)
1070
(baidu-olime-jp-commit-key? key key-state))
1071
(baidu-olime-jp-do-commit-prediction bdc))
1074
baidu-olime-jp-use-implicit-commit-prediction?
1075
(baidu-olime-jp-context-prediction-index bdc))
1078
;; check keys used in baidu-olime-jp-proc-input-state-with-preedit
1079
(baidu-olime-jp-begin-conv-key? key key-state)
1080
(baidu-olime-jp-backspace-key? key key-state)
1081
(baidu-olime-jp-delete-key? key key-state)
1082
(baidu-olime-jp-kill-key? key key-state)
1083
(baidu-olime-jp-kill-backward-key? key key-state)
1085
(not (baidu-olime-jp-context-alnum bdc))
1086
(baidu-olime-jp-commit-as-opposite-kana-key? key key-state))
1087
(baidu-olime-jp-transpose-as-hiragana-key? key key-state)
1088
(baidu-olime-jp-transpose-as-katakana-key? key key-state)
1089
(baidu-olime-jp-transpose-as-halfkana-key? key key-state)
1091
(not (= (baidu-olime-jp-context-input-rule bdc) baidu-olime-jp-input-rule-kana))
1093
(baidu-olime-jp-transpose-as-halfwidth-alnum-key? key key-state)
1094
(baidu-olime-jp-transpose-as-fullwidth-alnum-key? key key-state)))
1095
(baidu-olime-jp-hiragana-key? key key-state)
1096
(baidu-olime-jp-katakana-key? key key-state)
1097
(baidu-olime-jp-halfkana-key? key key-state)
1098
(baidu-olime-jp-halfwidth-alnum-key? key key-state)
1099
(baidu-olime-jp-fullwidth-alnum-key? key key-state)
1101
(not (baidu-olime-jp-context-alnum bdc))
1102
(baidu-olime-jp-kana-toggle-key? key key-state))
1103
(baidu-olime-jp-alkana-toggle-key? key key-state)
1104
(baidu-olime-jp-go-left-key? key key-state)
1105
(baidu-olime-jp-go-right-key? key key-state)
1106
(baidu-olime-jp-beginning-of-preedit-key? key key-state)
1107
(baidu-olime-jp-end-of-preedit-key? key key-state)
1109
(modifier-key-mask key-state)
1110
(not (shift-key-mask key-state))))
1111
;; go back to unselected prediction
1112
(baidu-olime-jp-reset-prediction-window bdc)
1113
(baidu-olime-jp-check-prediction bdc #f))
1115
(ichar-numeric? key)
1116
baidu-olime-jp-select-prediction-by-numeral-key?
1117
(not (baidu-olime-jp-prediction-select-non-existing-index? bdc key)))
1118
(baidu-olime-jp-context-set-predicting! bdc #f)
1119
(baidu-olime-jp-context-set-prediction-index! bdc #f)
1120
(baidu-olime-jp-proc-input-state bdc key key-state))
1123
(baidu-olime-jp-do-commit-prediction bdc)
1124
(baidu-olime-jp-proc-input-state bdc key key-state)))
1126
(baidu-olime-jp-context-set-predicting! bdc #f)
1127
(baidu-olime-jp-context-set-prediction-index! bdc #f)
1128
(if (not baidu-olime-jp-use-prediction?)
1129
(baidu-olime-jp-reset-prediction-window bdc))
1130
(baidu-olime-jp-proc-input-state bdc key key-state))))))
1132
(define (baidu-olime-jp-proc-input-state-with-preedit bdc key key-state)
1133
(define (check-auto-conv str)
1136
baidu-olime-jp-auto-start-henkan?
1137
(string-find japanese-auto-start-henkan-keyword-list str)
1139
(baidu-olime-jp-reset-prediction-window bdc)
1140
(baidu-olime-jp-begin-conv bdc))))
1141
(let ((preconv-str (baidu-olime-jp-context-preconv-ustr bdc))
1142
(raw-str (baidu-olime-jp-context-raw-ustr bdc))
1143
(rkc (baidu-olime-jp-context-rkc bdc))
1144
(rule (baidu-olime-jp-context-input-rule bdc))
1145
(kana (baidu-olime-jp-context-kana-mode bdc)))
1148
((baidu-olime-jp-begin-conv-key? key key-state)
1149
(baidu-olime-jp-begin-conv bdc))
1152
((baidu-olime-jp-next-prediction-key? key key-state)
1153
(baidu-olime-jp-check-prediction bdc #t))
1156
((baidu-olime-jp-backspace-key? key key-state)
1157
(if (not (rk-backspace rkc))
1159
(ustr-cursor-delete-backside! preconv-str)
1160
(ustr-cursor-delete-backside! raw-str)
1161
;; fix to valid roma
1163
(= (baidu-olime-jp-context-input-rule bdc) baidu-olime-jp-input-rule-roma)
1164
(not (null? (ustr-former-seq preconv-str)))
1165
(not (ichar-printable?
1167
(car (last (ustr-former-seq preconv-str)))))))
1168
(ja-fix-deleted-raw-str-to-valid-roma! raw-str)))))
1171
((baidu-olime-jp-delete-key? key key-state)
1172
(if (not (rk-delete rkc))
1174
(ustr-cursor-delete-frontside! preconv-str)
1175
(ustr-cursor-delete-frontside! raw-str))))
1178
((baidu-olime-jp-kill-key? key key-state)
1179
(ustr-clear-latter! preconv-str)
1180
(ustr-clear-latter! raw-str))
1183
((baidu-olime-jp-kill-backward-key? key key-state)
1185
(ustr-clear-former! preconv-str)
1186
(ustr-clear-former! raw-str))
1188
;; ���ߤȤϵդΤ��ʥ⡼�ɤǤ��ʤ���ꤹ��
1190
(not (baidu-olime-jp-context-alnum bdc))
1191
(baidu-olime-jp-commit-as-opposite-kana-key? key key-state))
1192
(im-commit bdc (baidu-olime-jp-make-whole-string bdc #t (ja-opposite-kana kana)))
1193
(baidu-olime-jp-flush bdc))
1195
;; Transposing���֤ذܹ�
1196
((or (baidu-olime-jp-transpose-as-hiragana-key? key key-state)
1197
(baidu-olime-jp-transpose-as-katakana-key? key key-state)
1198
(baidu-olime-jp-transpose-as-halfkana-key? key key-state)
1200
(not (= (baidu-olime-jp-context-input-rule bdc) baidu-olime-jp-input-rule-kana))
1202
(baidu-olime-jp-transpose-as-halfwidth-alnum-key? key key-state)
1203
(baidu-olime-jp-transpose-as-fullwidth-alnum-key? key key-state))))
1204
(baidu-olime-jp-reset-prediction-window bdc)
1205
(baidu-olime-jp-proc-transposing-state bdc key key-state))
1207
((baidu-olime-jp-hiragana-key? key key-state)
1208
(if (not (= kana baidu-olime-jp-type-hiragana))
1210
(im-commit bdc (baidu-olime-jp-make-whole-string bdc #t kana))
1211
(baidu-olime-jp-flush bdc)))
1212
(baidu-olime-jp-context-set-kana-mode! bdc baidu-olime-jp-type-hiragana)
1213
(baidu-olime-jp-context-set-alnum! bdc #f))
1215
((baidu-olime-jp-katakana-key? key key-state)
1216
(if (not (= kana baidu-olime-jp-type-katakana))
1218
(im-commit bdc (baidu-olime-jp-make-whole-string bdc #t kana))
1219
(baidu-olime-jp-flush bdc)))
1220
(baidu-olime-jp-context-set-kana-mode! bdc baidu-olime-jp-type-katakana)
1221
(baidu-olime-jp-context-set-alnum! bdc #f))
1223
((baidu-olime-jp-halfkana-key? key key-state)
1224
(if (not (= kana baidu-olime-jp-type-halfkana))
1226
(im-commit bdc (baidu-olime-jp-make-whole-string bdc #t kana))
1227
(baidu-olime-jp-flush bdc)))
1228
(baidu-olime-jp-context-set-kana-mode! bdc baidu-olime-jp-type-halfkana)
1229
(baidu-olime-jp-context-set-alnum! bdc #f))
1232
(baidu-olime-jp-halfwidth-alnum-key? key key-state)
1235
(= (baidu-olime-jp-context-alnum-type bdc) baidu-olime-jp-type-halfwidth-alnum)
1236
(baidu-olime-jp-context-alnum bdc))))
1237
(baidu-olime-jp-context-set-alnum-type! bdc baidu-olime-jp-type-halfwidth-alnum)
1238
(baidu-olime-jp-context-set-alnum! bdc #t))
1241
(baidu-olime-jp-fullwidth-alnum-key? key key-state)
1244
(= (baidu-olime-jp-context-alnum-type bdc) baidu-olime-jp-type-fullwidth-alnum)
1245
(baidu-olime-jp-context-alnum bdc))))
1246
(baidu-olime-jp-context-set-alnum-type! bdc baidu-olime-jp-type-fullwidth-alnum)
1247
(baidu-olime-jp-context-set-alnum! bdc #t))
1249
;; Commit current preedit string, then toggle hiragana/katakana mode.
1251
(not (baidu-olime-jp-context-alnum bdc))
1252
(baidu-olime-jp-kana-toggle-key? key key-state))
1253
(im-commit bdc (baidu-olime-jp-make-whole-string bdc #t kana))
1254
(baidu-olime-jp-flush bdc)
1255
(baidu-olime-jp-context-kana-toggle bdc))
1257
((baidu-olime-jp-alkana-toggle-key? key key-state)
1258
(baidu-olime-jp-context-alkana-toggle bdc))
1261
((baidu-olime-jp-cancel-key? key key-state)
1262
(baidu-olime-jp-flush bdc))
1265
((baidu-olime-jp-commit-key? key key-state)
1269
(baidu-olime-jp-make-whole-string bdc #t kana))
1270
(baidu-olime-jp-flush bdc)))
1273
((baidu-olime-jp-go-left-key? key key-state)
1274
(baidu-olime-jp-context-confirm-kana! bdc)
1275
(ustr-cursor-move-backward! preconv-str)
1276
(ustr-cursor-move-backward! raw-str))
1279
((baidu-olime-jp-go-right-key? key key-state)
1280
(baidu-olime-jp-context-confirm-kana! bdc)
1281
(ustr-cursor-move-forward! preconv-str)
1282
(ustr-cursor-move-forward! raw-str))
1284
;; beginning-of-preedit
1285
((baidu-olime-jp-beginning-of-preedit-key? key key-state)
1286
(baidu-olime-jp-context-confirm-kana! bdc)
1287
(ustr-cursor-move-beginning! preconv-str)
1288
(ustr-cursor-move-beginning! raw-str))
1291
((baidu-olime-jp-end-of-preedit-key? key key-state)
1292
(baidu-olime-jp-context-confirm-kana! bdc)
1293
(ustr-cursor-move-end! preconv-str)
1294
(ustr-cursor-move-end! raw-str))
1296
;; modifiers (except shift) => ignore
1297
((and (modifier-key-mask key-state)
1298
(not (shift-key-mask key-state)))
1305
(if (baidu-olime-jp-context-alnum bdc)
1306
(let ((key-str (charcode->string key))
1307
(pend (rk-pending rkc))
1308
(residual-kana (rk-peek-terminal-match rkc)))
1309
(rk-flush rkc) ;; OK to reset rkc here.
1312
(if (list? (car residual-kana))
1314
(ustr-insert-seq! preconv-str residual-kana)
1315
(ustr-insert-elem! raw-str (reverse
1316
(string-to-list pend))))
1318
(ustr-insert-elem! preconv-str residual-kana)
1319
(ustr-insert-elem! raw-str pend)))))
1320
(ustr-insert-elem! preconv-str
1321
(if (= (baidu-olime-jp-context-alnum-type bdc)
1322
baidu-olime-jp-type-halfwidth-alnum)
1323
(list key-str key-str key-str)
1324
(list (ja-wide key-str) (ja-wide key-str)
1325
(ja-wide key-str))))
1326
(ustr-insert-elem! raw-str key-str)
1327
(check-auto-conv key-str))
1328
(let* ((key-str (charcode->string
1329
(if (= rule baidu-olime-jp-input-rule-kana)
1331
(ichar-downcase key))))
1332
(pend (rk-pending rkc))
1333
(res (rk-push-key! rkc key-str)))
1335
(or (list? (car res))
1336
(not (string=? (car res) ""))))
1337
(let ((next-pend (rk-pending rkc)))
1338
(if (list? (car res))
1339
(ustr-insert-seq! preconv-str res)
1340
(ustr-insert-elem! preconv-str res))
1342
(not (string=? next-pend "")))
1343
(ustr-insert-seq! raw-str
1344
(reverse (string-to-list pend)))
1345
(if (list? (car res))
1349
ja-consonant-syllable-table))
1350
;; treat consonant having more than one
1351
;; charactear as one raw-str in this case
1352
(ustr-insert-elem! raw-str pend)
1353
(ustr-insert-elem! raw-str (reverse
1356
;; assume key-str as a vowel
1357
(ustr-insert-elem! raw-str key-str))
1360
(string-append pend key-str))))))
1361
(check-auto-conv (if res (car res) #f))))))))
1363
(define baidu-olime-jp-context-confirm-kana!
1365
(if (= (baidu-olime-jp-context-input-rule bdc)
1366
baidu-olime-jp-input-rule-kana)
1367
(let* ((preconv-str (baidu-olime-jp-context-preconv-ustr bdc))
1368
(rkc (baidu-olime-jp-context-rkc bdc))
1369
(residual-kana (rk-peek-terminal-match rkc)))
1372
(if (list? (car residual-kana))
1373
(ustr-insert-seq! preconv-str residual-kana)
1374
(ustr-insert-elem! preconv-str residual-kana))
1375
(rk-flush rkc)))))))
1377
(define (baidu-olime-jp-reset-prediction-window bdc)
1378
(if (baidu-olime-jp-context-prediction-window bdc)
1379
(im-deactivate-candidate-selector bdc))
1380
(baidu-olime-jp-context-set-predicting! bdc #f)
1381
(baidu-olime-jp-context-set-prediction-window! bdc #f)
1382
(baidu-olime-jp-context-set-prediction-index! bdc #f))
1384
(define (baidu-olime-jp-check-prediction bdc force-check?)
1386
(not (baidu-olime-jp-context-state bdc))
1387
(not (baidu-olime-jp-context-transposing bdc))
1388
(not (baidu-olime-jp-context-predicting bdc)))
1389
(let* ((use-pending-rk-for-prediction? #t)
1391
(baidu-olime-jp-make-whole-string
1393
(not use-pending-rk-for-prediction?)
1394
(baidu-olime-jp-context-kana-mode bdc)))
1396
(ustr-length (baidu-olime-jp-context-preconv-ustr bdc))
1397
(if (not use-pending-rk-for-prediction?)
1399
(string-length (rk-pending
1400
(baidu-olime-jp-context-rkc
1403
(>= preedit-len baidu-olime-jp-prediction-start-char-count)
1406
(baidu-olime-jp-lib-set-prediction-src-string bdc preconv-str)
1407
(let ((nr (baidu-olime-jp-lib-get-nr-predictions bdc)))
1412
(im-activate-candidate-selector
1413
bdc nr baidu-olime-jp-nr-candidate-max)
1414
(baidu-olime-jp-context-set-prediction-window! bdc #t)
1415
(baidu-olime-jp-context-set-predicting! bdc #t))
1416
(baidu-olime-jp-reset-prediction-window bdc))))
1417
(baidu-olime-jp-reset-prediction-window bdc)))))
1419
(define (baidu-olime-jp-proc-input-state bdc key key-state)
1420
(if (baidu-olime-jp-has-preedit? bdc)
1421
(baidu-olime-jp-proc-input-state-with-preedit bdc key key-state)
1422
(baidu-olime-jp-proc-input-state-no-preedit bdc key key-state))
1423
(if baidu-olime-jp-use-prediction?
1424
(baidu-olime-jp-check-prediction bdc #f)))
1426
(define baidu-olime-jp-separator
1428
(let ((attr (bitwise-ior preedit-separator preedit-underline)))
1429
(if baidu-olime-jp-show-segment-separator?
1430
(cons attr baidu-olime-jp-segment-separator)
1433
(define baidu-olime-jp-context-transposing-state-preedit
1435
(let ((transposing-text (baidu-olime-jp-transposing-text bdc)))
1436
(list (cons preedit-reverse transposing-text)
1437
(cons preedit-cursor "")))))
1439
(define baidu-olime-jp-transposing-text
1441
(let ((transposing-type (baidu-olime-jp-context-transposing-type bdc)))
1444
(= transposing-type baidu-olime-jp-type-hiragana)
1445
(= transposing-type baidu-olime-jp-type-katakana)
1446
(= transposing-type baidu-olime-jp-type-halfkana))
1447
(baidu-olime-jp-make-whole-string bdc #t transposing-type))
1448
((= transposing-type baidu-olime-jp-type-halfwidth-alnum)
1449
(baidu-olime-jp-make-whole-raw-string bdc #f #f))
1450
((= transposing-type baidu-olime-jp-candidate-type-upper-halfwidth-alnum)
1451
(baidu-olime-jp-make-whole-raw-string bdc #f #t))
1452
((= transposing-type baidu-olime-jp-type-fullwidth-alnum)
1453
(baidu-olime-jp-make-whole-raw-string bdc #t #f))
1454
((= transposing-type baidu-olime-jp-candidate-type-upper-fullwidth-alnum)
1455
(baidu-olime-jp-make-whole-raw-string bdc #t #t))))))
1457
(define baidu-olime-jp-get-raw-str-seq
1459
(let* ((rkc (baidu-olime-jp-context-rkc bdc))
1460
(pending (rk-pending rkc))
1461
(residual-kana (rk-peek-terminal-match rkc))
1462
(raw-str (baidu-olime-jp-context-raw-ustr bdc))
1463
(right-str (ustr-latter-seq raw-str))
1464
(left-str (ustr-former-seq raw-str)))
1467
(if (list? (car residual-kana))
1468
(reverse (string-to-list pending))
1473
(define baidu-olime-jp-get-raw-candidate
1474
(lambda (bdc seg-idx cand-idx)
1476
(ja-join-vu (string-to-list
1477
(baidu-olime-jp-make-whole-string bdc #t baidu-olime-jp-type-hiragana))))
1478
(unconv-candidate (baidu-olime-jp-lib-get-unconv-candidate bdc seg-idx))
1479
(unconv (if unconv-candidate
1480
(ja-join-vu (string-to-list unconv-candidate))
1482
(raw-str (reverse (baidu-olime-jp-get-raw-str-seq bdc))))
1484
((= cand-idx baidu-olime-jp-candidate-type-hiragana)
1485
(string-list-concat unconv))
1486
((= cand-idx baidu-olime-jp-candidate-type-katakana)
1487
(ja-make-kana-str (ja-make-kana-str-list unconv) baidu-olime-jp-type-katakana))
1488
((= cand-idx baidu-olime-jp-candidate-type-halfkana)
1489
(ja-make-kana-str (ja-make-kana-str-list unconv) baidu-olime-jp-type-halfkana))
1491
(if (not (null? unconv))
1492
(if (member (car unconv) preconv)
1493
(let ((start (list-seq-contained? preconv unconv))
1494
(len (length unconv)))
1497
(= (length raw-str) (length preconv))) ;; sanity check
1498
(baidu-olime-jp-make-raw-string
1499
(reverse (sublist-rel raw-str start len))
1501
(= cand-idx baidu-olime-jp-candidate-type-halfwidth-alnum)
1503
baidu-olime-jp-candidate-type-upper-halfwidth-alnum))
1507
(= cand-idx baidu-olime-jp-candidate-type-halfwidth-alnum)
1508
(= cand-idx baidu-olime-jp-candidate-type-fullwidth-alnum))
1513
"????")))))) ;; shouldn't happen
1515
(define (baidu-olime-jp-predicting-state-preedit bdc)
1517
(not baidu-olime-jp-use-implicit-commit-prediction?)
1518
(not (baidu-olime-jp-context-prediction-index bdc)))
1519
(baidu-olime-jp-input-state-preedit bdc)
1520
(let ((cand (baidu-olime-jp-get-prediction-string bdc)))
1521
(list (cons (bitwise-ior preedit-reverse preedit-cursor) cand)))))
1523
(define (baidu-olime-jp-compose-state-preedit bdc)
1524
(let* ((segments (baidu-olime-jp-context-segments bdc))
1525
(cur-seg (ustr-cursor-pos segments))
1526
(separator (baidu-olime-jp-separator bdc)))
1528
(lambda (seg-idx cand-idx)
1529
(let* ((attr (if (= seg-idx cur-seg)
1530
(bitwise-ior preedit-reverse
1533
(cand (if (> cand-idx baidu-olime-jp-candidate-type-katakana)
1534
(baidu-olime-jp-lib-get-nth-candidate bdc seg-idx cand-idx)
1535
(baidu-olime-jp-get-raw-candidate bdc seg-idx cand-idx)))
1536
(seg (list (cons attr cand))))
1539
(cons separator seg)
1541
(iota (ustr-length segments))
1542
(ustr-whole-seq segments))))
1544
(define (baidu-olime-jp-input-state-preedit bdc)
1545
(let* ((preconv-str (baidu-olime-jp-context-preconv-ustr bdc))
1546
(rkc (baidu-olime-jp-context-rkc bdc))
1547
(pending (rk-pending rkc))
1548
(kana (baidu-olime-jp-context-kana-mode bdc))
1549
(rule (baidu-olime-jp-context-input-rule bdc))
1551
(if (= rule baidu-olime-jp-input-rule-kana)
1552
(lambda (entry) (car entry))
1553
(lambda (entry) (list-ref entry kana)))))
1555
(and (not (ustr-cursor-at-beginning? preconv-str))
1556
(cons preedit-underline
1557
(string-append-map-ustr-former extract-kana preconv-str)))
1558
(and (> (string-length pending) 0)
1559
(cons preedit-underline pending))
1560
(and (baidu-olime-jp-has-preedit? bdc)
1561
(cons preedit-cursor ""))
1562
(and (not (ustr-cursor-at-end? preconv-str))
1563
(cons preedit-underline
1564
(string-append-map-ustr-latter extract-kana preconv-str))))))
1566
(define (baidu-olime-jp-get-commit-string bdc)
1567
(let ((segments (baidu-olime-jp-context-segments bdc)))
1568
(string-append-map (lambda (seg-idx cand-idx)
1569
(if (> cand-idx baidu-olime-jp-candidate-type-katakana)
1570
(baidu-olime-jp-lib-get-nth-candidate
1571
bdc seg-idx cand-idx)
1572
(baidu-olime-jp-get-raw-candidate
1573
bdc seg-idx cand-idx)))
1574
(iota (ustr-length segments))
1575
(ustr-whole-seq segments))))
1577
(define (baidu-olime-jp-commit-string bdc)
1578
(let ((bdx-ctx (baidu-olime-jp-context-bdx-ctx bdc))
1579
(segments (baidu-olime-jp-context-segments bdc)))
1582
(baidu-olime-jp-lib-commit-segments bdc (ustr-whole-seq segments))
1583
(if (every (lambda (x) (<= x baidu-olime-jp-candidate-type-katakana))
1584
(ustr-whole-seq segments))
1585
(baidu-olime-jp-lib-reset-conversion bdc))))))
1587
(define (baidu-olime-jp-do-commit bdc)
1588
(im-commit bdc (baidu-olime-jp-get-commit-string bdc))
1589
(baidu-olime-jp-commit-string bdc)
1590
(baidu-olime-jp-reset-candidate-window bdc)
1591
(baidu-olime-jp-flush bdc))
1593
(define (baidu-olime-jp-get-prediction-string bdc)
1594
(baidu-olime-jp-lib-get-nth-prediction
1596
(baidu-olime-jp-context-prediction-index bdc)))
1598
(define (baidu-olime-jp-learn-prediction-string bdc)
1599
(baidu-olime-jp-lib-commit-nth-prediction
1601
(baidu-olime-jp-context-prediction-index bdc)))
1603
(define (baidu-olime-jp-do-commit-prediction bdc)
1604
(im-commit bdc (baidu-olime-jp-get-prediction-string bdc))
1605
(baidu-olime-jp-learn-prediction-string bdc)
1606
(baidu-olime-jp-reset-prediction-window bdc)
1607
(baidu-olime-jp-flush bdc))
1609
(define baidu-olime-jp-correct-segment-cursor
1611
(if (ustr-cursor-at-end? segments)
1612
(ustr-cursor-move-backward! segments))))
1614
(define (baidu-olime-jp-move-segment bdc dir)
1615
(baidu-olime-jp-reset-candidate-window bdc)
1616
(let ((segments (baidu-olime-jp-context-segments bdc)))
1617
(ustr-cursor-move! segments dir)
1618
(baidu-olime-jp-correct-segment-cursor segments)))
1620
(define (baidu-olime-jp-resize-segment bdc cnt)
1621
(let* ((segments (baidu-olime-jp-context-segments bdc))
1622
(cur-seg (ustr-cursor-pos segments)))
1623
(baidu-olime-jp-reset-candidate-window bdc)
1624
(baidu-olime-jp-lib-resize-segment bdc cur-seg cnt)
1625
(let* ((resized-nseg (baidu-olime-jp-lib-get-nr-segments bdc))
1626
(latter-nseg (- resized-nseg cur-seg)))
1627
(ustr-set-latter-seq! segments (make-list latter-nseg 0)))))
1629
(define (baidu-olime-jp-move-candidate bdc offset)
1630
(let* ((segments (baidu-olime-jp-context-segments bdc))
1631
(cur-seg (ustr-cursor-pos segments))
1632
(max (baidu-olime-jp-lib-get-nr-candidates bdc cur-seg))
1633
(n (if (< (ustr-cursor-frontside segments) 0) ;; segment-transposing
1635
(+ (ustr-cursor-frontside segments) offset)))
1636
(compensated-n (cond
1643
(new-op-count (+ 1 (baidu-olime-jp-context-candidate-op-count bdc))))
1644
(ustr-cursor-set-frontside! segments compensated-n)
1645
(baidu-olime-jp-context-set-candidate-op-count! bdc new-op-count)
1647
(= (baidu-olime-jp-context-candidate-op-count bdc)
1648
baidu-olime-jp-candidate-op-count)
1649
baidu-olime-jp-use-candidate-window?)
1651
(baidu-olime-jp-context-set-candidate-window! bdc #t)
1652
(im-activate-candidate-selector bdc max baidu-olime-jp-nr-candidate-max)))
1653
(if (baidu-olime-jp-context-candidate-window bdc)
1654
(im-select-candidate bdc compensated-n))))
1656
(define baidu-olime-jp-move-candidate-in-page
1657
(lambda (bdc numeralc)
1658
(let* ((segments (baidu-olime-jp-context-segments bdc))
1659
(cur-seg (ustr-cursor-pos segments))
1660
(max (baidu-olime-jp-lib-get-nr-candidates bdc cur-seg))
1661
(n (ustr-cursor-frontside segments))
1662
(cur-page (if (= baidu-olime-jp-nr-candidate-max 0)
1664
(quotient n baidu-olime-jp-nr-candidate-max)))
1665
(pageidx (- (numeric-ichar->integer numeralc) 1))
1666
(compensated-pageidx (cond
1667
((< pageidx 0) ; pressing key_0
1671
(idx (+ (* cur-page baidu-olime-jp-nr-candidate-max) compensated-pageidx))
1672
(compensated-idx (cond
1677
(new-op-count (+ 1 (baidu-olime-jp-context-candidate-op-count bdc))))
1678
(ustr-cursor-set-frontside! segments compensated-idx)
1679
(baidu-olime-jp-context-set-candidate-op-count! bdc new-op-count)
1680
(im-select-candidate bdc compensated-idx))))
1682
(define (baidu-olime-jp-reset-candidate-window bdc)
1683
(if (baidu-olime-jp-context-candidate-window bdc)
1685
(im-deactivate-candidate-selector bdc)
1686
(baidu-olime-jp-context-set-candidate-window! bdc #f)))
1687
(baidu-olime-jp-context-set-candidate-op-count! bdc 0))
1689
(define baidu-olime-jp-rotate-segment-transposing-alnum-type
1693
(= idx baidu-olime-jp-candidate-type-halfwidth-alnum)
1694
(= state baidu-olime-jp-candidate-type-halfwidth-alnum))
1695
baidu-olime-jp-candidate-type-upper-halfwidth-alnum)
1697
(= idx baidu-olime-jp-candidate-type-fullwidth-alnum)
1698
(= state baidu-olime-jp-candidate-type-fullwidth-alnum))
1699
baidu-olime-jp-candidate-type-upper-fullwidth-alnum)
1703
(define baidu-olime-jp-set-segment-transposing
1704
(lambda (bdc key key-state)
1705
(let ((segments (baidu-olime-jp-context-segments bdc)))
1706
(let ((rotate-list '())
1708
(idx (ustr-cursor-frontside segments)))
1709
(baidu-olime-jp-reset-candidate-window bdc)
1710
(baidu-olime-jp-context-set-candidate-op-count! bdc 0)
1712
(if (baidu-olime-jp-transpose-as-fullwidth-alnum-key? key key-state)
1713
(set! rotate-list (cons baidu-olime-jp-candidate-type-fullwidth-alnum
1715
(if (baidu-olime-jp-transpose-as-halfwidth-alnum-key? key key-state)
1716
(set! rotate-list (cons baidu-olime-jp-candidate-type-halfwidth-alnum
1718
(if (baidu-olime-jp-transpose-as-halfkana-key? key key-state)
1719
(set! rotate-list (cons baidu-olime-jp-candidate-type-halfkana
1721
(if (baidu-olime-jp-transpose-as-katakana-key? key key-state)
1722
(set! rotate-list (cons baidu-olime-jp-candidate-type-katakana
1724
(if (baidu-olime-jp-transpose-as-hiragana-key? key key-state)
1725
(set! rotate-list (cons baidu-olime-jp-candidate-type-hiragana
1728
(= idx baidu-olime-jp-candidate-type-hiragana)
1729
(= idx baidu-olime-jp-candidate-type-katakana)
1730
(= idx baidu-olime-jp-candidate-type-halfkana)
1731
(= idx baidu-olime-jp-candidate-type-halfwidth-alnum)
1732
(= idx baidu-olime-jp-candidate-type-fullwidth-alnum)
1733
(= idx baidu-olime-jp-candidate-type-upper-halfwidth-alnum)
1734
(= idx baidu-olime-jp-candidate-type-upper-fullwidth-alnum))
1735
(let ((lst (member idx rotate-list)))
1737
(not (null? (cdr lst))))
1738
(set! state (car (cdr lst)))
1739
(set! state (baidu-olime-jp-rotate-segment-transposing-alnum-type
1740
idx (car rotate-list)))))
1741
(set! state (car rotate-list)))
1742
(ustr-cursor-set-frontside! segments state)))))
1744
(define (baidu-olime-jp-proc-compose-state bdc key key-state)
1746
((baidu-olime-jp-prev-page-key? key key-state)
1747
(if (baidu-olime-jp-context-candidate-window bdc)
1748
(im-shift-page-candidate bdc #f)))
1750
((baidu-olime-jp-next-page-key? key key-state)
1751
(if (baidu-olime-jp-context-candidate-window bdc)
1752
(im-shift-page-candidate bdc #t)))
1754
((baidu-olime-jp-commit-key? key key-state)
1755
(baidu-olime-jp-do-commit bdc))
1757
((baidu-olime-jp-extend-segment-key? key key-state)
1758
(baidu-olime-jp-resize-segment bdc 1))
1760
((baidu-olime-jp-shrink-segment-key? key key-state)
1761
(baidu-olime-jp-resize-segment bdc -1))
1763
((baidu-olime-jp-next-segment-key? key key-state)
1764
(baidu-olime-jp-move-segment bdc 1))
1766
((baidu-olime-jp-prev-segment-key? key key-state)
1767
(baidu-olime-jp-move-segment bdc -1))
1769
((baidu-olime-jp-beginning-of-preedit-key? key key-state)
1771
(ustr-cursor-move-beginning! (baidu-olime-jp-context-segments bdc))
1772
(baidu-olime-jp-reset-candidate-window bdc)))
1774
((baidu-olime-jp-end-of-preedit-key? key key-state)
1776
(ustr-cursor-move-end! (baidu-olime-jp-context-segments bdc))
1777
(baidu-olime-jp-correct-segment-cursor (baidu-olime-jp-context-segments bdc))
1778
(baidu-olime-jp-reset-candidate-window bdc)))
1780
((baidu-olime-jp-backspace-key? key key-state)
1781
(baidu-olime-jp-cancel-conv bdc))
1783
((baidu-olime-jp-next-candidate-key? key key-state)
1784
(baidu-olime-jp-move-candidate bdc 1))
1786
((baidu-olime-jp-prev-candidate-key? key key-state)
1787
(baidu-olime-jp-move-candidate bdc -1))
1789
((or (baidu-olime-jp-transpose-as-hiragana-key? key key-state)
1790
(baidu-olime-jp-transpose-as-katakana-key? key key-state)
1791
(baidu-olime-jp-transpose-as-halfkana-key? key key-state)
1793
(not (= (baidu-olime-jp-context-input-rule bdc) baidu-olime-jp-input-rule-kana))
1795
(baidu-olime-jp-transpose-as-halfwidth-alnum-key? key key-state)
1796
(baidu-olime-jp-transpose-as-fullwidth-alnum-key? key key-state))))
1797
(baidu-olime-jp-set-segment-transposing bdc key key-state))
1799
((baidu-olime-jp-cancel-key? key key-state)
1800
(baidu-olime-jp-cancel-conv bdc))
1802
((and baidu-olime-jp-select-candidate-by-numeral-key?
1803
(ichar-numeric? key)
1804
(baidu-olime-jp-context-candidate-window bdc))
1805
(baidu-olime-jp-move-candidate-in-page bdc key))
1807
((and (modifier-key-mask key-state)
1808
(not (shift-key-mask key-state)))
1816
(baidu-olime-jp-do-commit bdc)
1817
(baidu-olime-jp-proc-input-state bdc key key-state)))))
1819
(define (baidu-olime-jp-press-key-handler bdc key key-state)
1820
(if (ichar-control? key)
1822
(if (baidu-olime-jp-context-on bdc)
1823
(if (baidu-olime-jp-context-transposing bdc)
1824
(baidu-olime-jp-proc-transposing-state bdc key key-state)
1825
(if (baidu-olime-jp-context-state bdc)
1826
(baidu-olime-jp-proc-compose-state bdc key key-state)
1827
(if (baidu-olime-jp-context-predicting bdc)
1828
(baidu-olime-jp-proc-prediction-state bdc key key-state)
1829
(baidu-olime-jp-proc-input-state bdc key key-state))))
1830
(baidu-olime-jp-proc-raw-state bdc key key-state)))
1831
(baidu-olime-jp-update-preedit bdc))
1834
(define (baidu-olime-jp-release-key-handler bdc key key-state)
1835
(if (or (ichar-control? key)
1836
(not (baidu-olime-jp-context-on bdc)))
1837
(baidu-olime-jp-commit-raw bdc)))
1839
(define (baidu-olime-jp-reset-handler bdc)
1840
(if (baidu-olime-jp-context-on bdc)
1842
(if (baidu-olime-jp-context-state bdc)
1843
(baidu-olime-jp-lib-reset-conversion bdc))
1844
(baidu-olime-jp-flush bdc))))
1847
(define (baidu-olime-jp-get-candidate-handler bdc idx ascel-enum-hint)
1848
(let* ((cur-seg (ustr-cursor-pos (baidu-olime-jp-context-segments bdc)))
1849
(cand (if (baidu-olime-jp-context-state bdc)
1850
(baidu-olime-jp-lib-get-nth-candidate bdc cur-seg idx)
1851
(baidu-olime-jp-lib-get-nth-prediction bdc idx))))
1852
(list cand (digit->string (+ idx 1)) "")))
1854
(define (baidu-olime-jp-set-candidate-index-handler bdc idx)
1856
((baidu-olime-jp-context-state bdc)
1857
(ustr-cursor-set-frontside! (baidu-olime-jp-context-segments bdc) idx)
1858
(baidu-olime-jp-update-preedit bdc))
1859
((baidu-olime-jp-context-predicting bdc)
1860
(baidu-olime-jp-context-set-prediction-index! bdc idx)
1861
(baidu-olime-jp-update-preedit bdc))))
1863
(define (baidu-olime-jp-proc-raw-state bdc key key-state)
1864
(if (not (baidu-olime-jp-begin-input bdc key key-state))
1865
(im-commit-raw bdc)))
1867
(baidu-olime-jp-configure-widgets)
1872
baidu-olime-jp-im-name-label
1873
baidu-olime-jp-im-short-desc
1875
baidu-olime-jp-init-handler
1876
baidu-olime-jp-release-handler
1877
context-mode-handler
1878
baidu-olime-jp-press-key-handler
1879
baidu-olime-jp-release-key-handler
1880
baidu-olime-jp-reset-handler
1881
baidu-olime-jp-get-candidate-handler
1882
baidu-olime-jp-set-candidate-index-handler
1883
context-prop-activate-handler