58
58
(define canna-candidate-type-halfkana -4)
59
59
(define canna-candidate-type-halfwidth-alnum -5)
60
60
(define canna-candidate-type-fullwidth-alnum -6)
61
(define canna-candidate-type-upper-halfwidth-alnum -7)
62
(define canna-candidate-type-upper-fullwidth-alnum -8)
62
64
;; I don't think the key needs to be customizable.
63
65
(define-key canna-space-key? '(" "))
266
268
(list 'transposing #f)
267
269
(list 'transposing-type 0)
268
270
(list 'cc-id ()) ;; canna-context-id
269
271
(list 'preconv-ustr #f) ;; preedit strings
271
273
(list 'segments #f) ;; ustr of candidate indices
272
(list 'candidate-window ())
273
(list 'candidate-op-count ())
274
(list 'candidate-window #f)
275
(list 'candidate-op-count 0)
274
276
(list 'kana-mode canna-type-hiragana)
276
278
(list 'alnum-type canna-type-halfwidth-alnum)
288
290
(canna-context-set-cc-id! cc (canna-lib-alloc-context))
289
291
(canna-context-set-widgets! cc canna-widgets)
290
292
(canna-context-set-rkc! cc rkc)
291
(canna-context-set-preconv-ustr! cc (ustr-new))
292
(canna-context-set-raw-ustr! cc (ustr-new))
293
(canna-context-set-segments! cc (ustr-new))
293
(canna-context-set-preconv-ustr! cc (ustr-new '()))
294
(canna-context-set-raw-ustr! cc (ustr-new '()))
295
(canna-context-set-segments! cc (ustr-new '()))
294
296
(if using-kana-table?
295
297
(canna-context-set-input-rule! cc canna-input-rule-kana)
296
298
(canna-context-set-input-rule! cc canna-input-rule-roma))
357
359
(string-append-map-ustr-latter extract-kana preconv-str))))))
359
361
(define canna-make-raw-string
360
(lambda (raw-str-list wide?)
362
(lambda (raw-str-list wide? upper?)
361
363
(if (not (null? raw-str-list))
364
366
(ja-string-list-to-wide-alphabet
365
(string-to-list (car raw-str-list)))
366
(canna-make-raw-string (cdr raw-str-list) wide?))
368
(map charcode->string
370
(map string->charcode
371
(string-to-list (car raw-str-list)))))
372
(string-to-list (car raw-str-list))))
373
(canna-make-raw-string (cdr raw-str-list) wide? upper?))
369
(canna-make-raw-string (cdr raw-str-list) wide?)))
377
(map charcode->string
379
(map string->charcode
380
(string-to-list (car raw-str-list))))))
382
(canna-make-raw-string (cdr raw-str-list) wide? upper?)))
372
385
(define canna-make-whole-raw-string
374
(canna-make-raw-string (canna-get-raw-str-seq cc) wide?)))
386
(lambda (cc wide? upper?)
387
(canna-make-raw-string (canna-get-raw-str-seq cc) wide? upper?)))
376
389
(define (canna-init-handler id im arg)
377
390
(if (not canna-init-lib-ok?)
457
470
(define (canna-begin-conv cc)
458
471
(let ((cc-id (canna-context-cc-id cc))
459
472
(preconv-str (canna-make-whole-string cc #t canna-type-hiragana)))
460
(if (and (number? cc-id)
461
474
(> (string-length preconv-str) 0))
462
475
(let ((num (canna-lib-begin-conversion cc-id preconv-str)))
600
613
(or (not (ustr-empty? (canna-context-preconv-ustr cc)))
601
614
(> (string-length (rk-pending (canna-context-rkc cc))) 0)))
616
(define canna-rotate-transposing-alnum-type
617
(lambda (cur-type state)
620
(= cur-type canna-type-halfwidth-alnum)
621
(= state canna-type-halfwidth-alnum))
622
canna-candidate-type-upper-halfwidth-alnum)
624
(= cur-type canna-type-fullwidth-alnum)
625
(= state canna-type-fullwidth-alnum))
626
canna-candidate-type-upper-fullwidth-alnum)
603
630
(define canna-proc-transposing-state
604
631
(lambda (cc key key-state)
605
632
(let ((rotate-list '())
621
648
(not (null? (cdr lst))))
622
649
(set! state (car (cdr lst)))
623
(set! state (car rotate-list))))
650
(if (not (null? rotate-list))
651
(set! state (canna-rotate-transposing-alnum-type
652
(canna-context-transposing-type cc)
653
(car rotate-list))))))
625
655
(canna-context-set-transposing! cc #t)
626
656
(set! state (car rotate-list))))
629
((= state canna-type-hiragana)
630
(canna-context-set-transposing-type! cc canna-type-hiragana))
631
((= state canna-type-katakana)
632
(canna-context-set-transposing-type! cc canna-type-katakana))
633
((= state canna-type-halfkana)
634
(canna-context-set-transposing-type! cc canna-type-halfkana))
635
((= state canna-type-halfwidth-alnum)
636
(if (not (= (canna-context-input-rule cc) canna-input-rule-kana))
637
(canna-context-set-transposing-type!
638
cc canna-type-halfwidth-alnum)))
639
((= state canna-type-fullwidth-alnum)
640
(if (not (= (canna-context-input-rule cc) canna-input-rule-kana))
641
(canna-context-set-transposing-type!
642
cc canna-type-fullwidth-alnum)))
661
(= state canna-type-hiragana)
662
(= state canna-type-katakana)
663
(= state canna-type-halfkana)))
664
(canna-context-set-transposing-type! cc state))
667
(= state canna-type-halfwidth-alnum)
668
(= state canna-candidate-type-upper-halfwidth-alnum)
669
(= state canna-type-fullwidth-alnum)
670
(= state canna-candidate-type-upper-fullwidth-alnum)))
671
(if (not (= (canna-context-input-rule cc) canna-input-rule-kana))
672
(canna-context-set-transposing-type! cc state)))
850
880
;; handle "n1" sequence as "��1"
851
881
(if (and (not (canna-context-alnum cc))
852
(not (alphabet-char? key))
882
(not (ichar-alphabetic? key))
853
883
(not (string-find
855
885
(charcode->string
856
886
(if (= rule canna-input-rule-kana)
858
(to-lower-char key))))))
888
(ichar-downcase key))))))
859
889
(let ((pend (rk-pending rkc))
860
890
(residual-kana (rk-push-key-last! rkc)))
861
891
(if residual-kana
938
968
(let ((transposing-type (canna-context-transposing-type cc)))
940
((= transposing-type canna-type-hiragana)
941
(canna-make-whole-string cc #t canna-type-hiragana))
942
((= transposing-type canna-type-katakana)
943
(canna-make-whole-string cc #t canna-type-katakana))
944
((= transposing-type canna-type-halfkana)
945
(canna-make-whole-string cc #t canna-type-halfkana))
971
(= transposing-type canna-type-hiragana)
972
(= transposing-type canna-type-katakana)
973
(= transposing-type canna-type-halfkana))
974
(canna-make-whole-string cc #t transposing-type))
946
975
((= transposing-type canna-type-halfwidth-alnum)
947
(canna-make-whole-raw-string cc #f))
976
(canna-make-whole-raw-string cc #f #f))
977
((= transposing-type canna-candidate-type-upper-halfwidth-alnum)
978
(canna-make-whole-raw-string cc #f #t))
948
979
((= transposing-type canna-type-fullwidth-alnum)
949
(canna-make-whole-raw-string cc #t))))))
980
(canna-make-whole-raw-string cc #t #f))
981
((= transposing-type canna-candidate-type-upper-fullwidth-alnum)
982
(canna-make-whole-raw-string cc #t #t))))))
951
984
(define canna-get-raw-str-seq
985
1019
(len (length unconv)))
987
1021
(canna-make-raw-string
988
(reverse (sublist raw-str start (+ start (- len 1))))
989
(if (= cand-idx canna-candidate-type-halfwidth-alnum)
1022
(reverse (sublist-rel raw-str start len))
1024
(= cand-idx canna-candidate-type-halfwidth-alnum)
1026
canna-candidate-type-upper-halfwidth-alnum))
1030
(= cand-idx canna-candidate-type-halfwidth-alnum)
1031
(= cand-idx canna-candidate-type-fullwidth-alnum))
1002
1044
(lambda (seg-idx cand-idx)
1003
1045
(let* ((attr (if (= seg-idx cur-seg)
1004
(bit-or preedit-reverse
1046
(bitwise-ior preedit-reverse
1006
1048
preedit-underline))
1007
1049
(cand (if (> cand-idx canna-candidate-type-katakana)
1008
1050
(canna-lib-get-nth-candidate cc-id seg-idx cand-idx)
1052
1094
(define (canna-commit-string cc)
1053
1095
(let ((cc-id (canna-context-cc-id cc))
1054
1096
(segments (canna-context-segments cc)))
1055
(for-each (lambda (seg-idx cand-idx)
1056
(if (> cand-idx canna-candidate-type-katakana)
1057
(canna-lib-commit-segment cc-id seg-idx cand-idx)))
1058
(iota (ustr-length segments))
1059
(ustr-whole-seq segments))
1060
(if (every (lambda (x) (<= x canna-candidate-type-katakana))
1061
(ustr-whole-seq segments))
1062
(canna-lib-reset-conversion cc-id))))
1099
(for-each (lambda (seg-idx cand-idx)
1100
(if (> cand-idx canna-candidate-type-katakana)
1101
(canna-lib-commit-segment cc-id seg-idx cand-idx)))
1102
(iota (ustr-length segments))
1103
(ustr-whole-seq segments))
1104
(if (every (lambda (x) (<= x canna-candidate-type-katakana))
1105
(ustr-whole-seq segments))
1106
(canna-lib-reset-conversion cc-id))))))
1064
1108
(define (canna-do-commit cc)
1065
1109
(im-commit cc (canna-get-commit-string cc))
1126
1170
(cur-page (if (= canna-nr-candidate-max 0)
1128
1172
(quotient n canna-nr-candidate-max)))
1129
(pageidx (- (numeral-char->number numeralc) 1))
1173
(pageidx (- (numeric-ichar->integer numeralc) 1))
1130
1174
(compensated-pageidx (cond
1131
1175
((< pageidx 0) ; pressing key_0
1132
1176
(+ pageidx 10))
1150
1194
(canna-context-set-candidate-window! cc #f)))
1151
1195
(canna-context-set-candidate-op-count! cc 0))
1197
(define canna-rotate-segment-transposing-alnum-type
1201
(= idx canna-candidate-type-halfwidth-alnum)
1202
(= state canna-candidate-type-halfwidth-alnum))
1203
canna-candidate-type-upper-halfwidth-alnum)
1205
(= idx canna-candidate-type-fullwidth-alnum)
1206
(= state canna-candidate-type-fullwidth-alnum))
1207
canna-candidate-type-upper-fullwidth-alnum)
1153
1211
(define canna-set-segment-transposing
1154
1212
(lambda (cc key key-state)
1155
1213
(let ((segments (canna-context-segments cc)))
1179
1237
(= idx canna-candidate-type-katakana)
1180
1238
(= idx canna-candidate-type-halfkana)
1181
1239
(= idx canna-candidate-type-halfwidth-alnum)
1182
(= idx canna-candidate-type-fullwidth-alnum))
1240
(= idx canna-candidate-type-fullwidth-alnum)
1241
(= idx canna-candidate-type-upper-halfwidth-alnum)
1242
(= idx canna-candidate-type-upper-fullwidth-alnum))
1183
1243
(let ((lst (member idx rotate-list)))
1184
(if (and (not (null? lst))
1185
1245
(not (null? (cdr lst))))
1186
1246
(set! state (car (cdr lst)))
1187
(set! state (car rotate-list))))
1247
(set! state (canna-rotate-segment-transposing-alnum-type
1248
idx (car rotate-list)))))
1188
1249
(set! state (car rotate-list)))
1189
1250
(ustr-cursor-set-frontside! segments state)))))