Revision: 6515
Author: deton.kih
Date: Fri Jul 16 21:50:58 2010
Log: * Change to show bushu conversion candidate which has shorter stroke length
  on auto help window
* Change for performance on auto help
* scm/tutcode.scm
  - (tutcode-reverse-rule-alist, tutcode-reverse-bushudic-alist): New
  - (tutcode-bushu-decompose):
    Change to make and use tutcode-reverse-bushudic-alist for performance
  - (tutcode-auto-help-bushu-decompose):
    Follow the change of tutcode-reverse-find-seq.
    Follow the change of tutcode-auto-help-bushu-decompose-by-subtraction.
    Follow the change of tutcode-auto-help-bushu-decompose-with-part.
  - (tutcode-auto-help-bushu-decompose-looking-bushudic): New
  - (tutcode-auto-help-bushu-decompose-by-subtraction):
    Change to call tutcode-auto-help-bushu-decompose-looking-bushudic
  - (tutcode-auto-help-count-stroke-length): New
  - (tutcode-auto-help-get-stroke-list-by-subtraction):
    Change to check stroke length before bushu conversion for performance
  - (tutcode-auto-help-bushu-decompose-with-part): Remove
  - (tutcode-auto-help-get-stroke-list-with-right-part,
     tutcode-auto-help-get-stroke-list-with-left-part):
    Split from tutcode-auto-help-get-stroke-list-with-part
  - (tutcode-auto-help-get-stroke-list-with-part):
    Split to tutcode-auto-help-get-stroke-list-with-right-part and
    tutcode-auto-help-get-stroke-list-with-left-part
  - (tutcode-reverse-find-seq):
    Change to make and use tutcode-reverse-rule-alist for performance
  - (tutcode-auto-help-update-stroke-alist-with-kanji):
    Follow the change of tutcode-reverse-find-seq
  - (tutcode-auto-help-get-stroke): Ditto

http://code.google.com/p/uim/source/detail?r=6515

Modified:
 /trunk/scm/tutcode.scm

=======================================
--- /trunk/scm/tutcode.scm      Mon Jul 12 05:44:22 2010
+++ /trunk/scm/tutcode.scm      Fri Jul 16 21:50:58 2010
@@ -119,6 +119,13 @@
 ;;; »ÈÍѤ¹¤ë¥³¡¼¥Éɽ¡£
 ;;; tutcode-context-new»þ¤Ë(tutcode-custom-load-rule!)¤ÇÀßÄê
 (define tutcode-rule ())
+;;; tutcode-rule¤«¤éºîÀ®¤¹¤ë¡¢µÕ°ú¤­¸¡º÷(´Á»ú¤«¤éÂǸ°¥ê¥¹¥È¤ò¼èÆÀ)ÍÑalist¡£
+;;; (¼«Æ°¥Ø¥ë¥×ÍѤÎÉô¼ó¹çÀ®ÊÑ´¹¸õÊ両º÷»þ¤Î¹â®²½¤Î¤¿¤á)
+(define tutcode-reverse-rule-alist ())
+;;; tutcode-bushudic¤«¤éºîÀ®¤¹¤ë¡¢
+;;; µÕ°ú¤­¸¡º÷(¹çÀ®¸å¤Îʸ»ú¤«¤é¹çÀ®ÍѤÎ2ʸ»ú¤ò¼èÆÀ)ÍÑalist¡£
+;;; (¼«Æ°¥Ø¥ë¥×ÍѤÎÉô¼ó¹çÀ®ÊÑ´¹¸õÊ両º÷»þ¤Î¹â®²½¤Î¤¿¤á)
+(define tutcode-reverse-bushudic-alist ())

 ;;; ¥³¡¼¥Éɽ¤ò¾å½ñ¤­Êѹ¹/Äɲ乤뤿¤á¤Î¥³¡¼¥Éɽ¡£
 ;;; ~/.uim¤Çtutcode-rule-set-sequences!¤ÇÅÐÏ¿¤·¤Æ¡¢
@@ -675,7 +682,7 @@
 ;;; @return ¹¹¿·¸å¤Î¼«Æ°¥Ø¥ë¥×ÍÑalist
 (define (tutcode-auto-help-update-stroke-alist-with-kanji label-cands-alist
          cand-list kanji)
-  (let ((stroke (tutcode-reverse-find-seq tutcode-rule kanji)))
+  (let ((stroke (tutcode-reverse-find-seq kanji)))
     (if stroke
       (tutcode-auto-help-update-stroke-alist-with-stroke
         label-cands-alist (car cand-list) stroke)
@@ -1213,7 +1220,15 @@
 ;;; @param c ʬ²òÂоݤÎʸ»ú
 ;;; @return ʬ²ò¤·¤Æ¤Ç¤­¤¿2¤Ä¤ÎÉô¼ó¤Î¥ê¥¹¥È¡£Ê¬²ò¤Ç¤­¤Ê¤«¤Ã¤¿¤È¤­¤Ï#f
 (define (tutcode-bushu-decompose c)
-  (tutcode-reverse-find-seq tutcode-bushudic c))
+  (if (null? tutcode-reverse-bushudic-alist)
+    (set! tutcode-reverse-bushudic-alist
+      (map
+        (lambda (elem)
+          (cons (caadr elem) (caar elem)))
+        tutcode-bushudic)))
+  (let ((res (assoc c tutcode-reverse-bushudic-alist)))
+    (and res
+      (cdr res))))

 ;;; ¼«Æ°¥Ø¥ë¥×:ÂоÝʸ»ú¤òÉô¼ó¹çÀ®¤¹¤ë¤Î¤ËɬÍפȤʤ롢
 ;;; ³°»ú¤Ç¤Ê¤¤2¤Ä¤Îʸ»ú¤Î¥ê¥¹¥È¤òÊÖ¤¹
@@ -1223,28 +1238,35 @@
 ;;;  ¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï#f
 (define (tutcode-auto-help-bushu-decompose c)
   (let*
-    ((bushu (tutcode-reverse-find-seq tutcode-bushudic c))
+    ((bushu (tutcode-bushu-decompose c))
      (b1 (and bushu (car bushu)))
      (b2 (and bushu (cadr bushu)))
      (seq1 (and b1 (tutcode-auto-help-get-stroke b1)))
      (seq2 (and b2 (tutcode-auto-help-get-stroke b2))))
     (or
+      ;; ­¤·»»¤Ë¤è¤ë¹çÀ®
       (and seq1 seq2
         (list seq1 seq2))
       ;; ñ½ã¤Ê°ú¤­»»¤Ë¤è¤ë¹çÀ®
-      (tutcode-auto-help-bushu-decompose-by-subtraction c tutcode-bushudic)
+      (tutcode-auto-help-bushu-decompose-by-subtraction c)
       ;; ÉôÉʤˤè¤ë¹çÀ®
       (or
         ;; Éô¼ó1¤¬Ä¾ÀÜÆþÎϲÄǽ
         ;; ¢ª(Éô¼ó1)¤È(Éô¼ó2¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú)¤Ë¤è¤ë¹çÀ®¤¬²Äǽ¤«?
         (and seq1 b2
-          (tutcode-auto-help-bushu-decompose-with-part
-            c seq1 b1 b2 tutcode-bushudic))
+ (tutcode-auto-help-bushu-decompose-looking-bushudic tutcode-bushudic
+            () 99
+            (lambda (elem)
+              (tutcode-auto-help-get-stroke-list-with-right-part
+                c b1 b2 seq1 elem))))
         ;; Éô¼ó2¤¬Ä¾ÀÜÆþÎϲÄǽ
         ;; ¢ª(Éô¼ó2)¤È(Éô¼ó1¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú)¤Ë¤è¤ë¹çÀ®¤¬²Äǽ¤«?
         (and seq2 b1
-          (tutcode-auto-help-bushu-decompose-with-part
-            c seq2 b1 b2 tutcode-bushudic))
+ (tutcode-auto-help-bushu-decompose-looking-bushudic tutcode-bushudic
+            () 99
+            (lambda (elem)
+              (tutcode-auto-help-get-stroke-list-with-left-part
+                c b1 b2 seq2 elem))))
         ;; XXX: ÉôÉʤɤ¦¤·¤Î¹çÀ®¤ä¡¢3ʸ»ú°Ê¾å¤Ç¤Î¹çÀ®¤Ï̤Âбþ
         ))))

@@ -1255,7 +1277,7 @@
 (define (tutcode-auto-help-get-stroke b)
   (let
     ((seq
-      (or (tutcode-reverse-find-seq tutcode-rule b)
+      (or (tutcode-reverse-find-seq b)
;; Éô¼ó¹çÀ®¤Ç»È¤ï¤ì¤ë"3"¤Î¤è¤¦¤ÊľÀÜÆþÎϲÄǽ¤ÊÉô¼ó¤ËÂбþ¤¹¤ë¤¿¤á¡¢
           ;; ¥é¥Ù¥ëʸ»ú¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ì¤Ð¡¢Ä¾ÀÜÆþÎϲÄǽ¤È¤ß¤Ê¤¹
           (and
@@ -1264,6 +1286,33 @@
     (and seq
       (list (list seq) (list b)))))

+;;; ¼«Æ°¥Ø¥ë¥×:Éô¼ó¹çÀ®¼­½ñ¤ÎÍ×ÁǤò½ç¤Ë¸«¤Æ
+;;; ºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿2ÂǸ°¤ÎÉô¼ó¤ÎÁȤ߹ç¤ï¤»¤òÊÖ¤¹¡£
+;;; (filter¤ämap¤ò»È¤Ã¤Æ¡¢ºÇ¾®¤Î¥¹¥È¥í¡¼¥¯¤Î¤â¤Î¤òõ¤¹¤È»þ´Ö¤¬¤«¤«¤ë¤Î¤Ç¡£)
+;;; ξÊý¤È¤â2ÂǸ°¤ÎÉô¼ó¤ÎÁȤ߹ç¤ï¤»¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤é¡¢
+;;; 3ÂǸ°¤ÎÉô¼ó¤È¤ÎÁȤ߹ç¤ï¤»¤¬¤¢¤ì¤ÐÊÖ¤¹¡£
+;;; @param long-stroke-result 3ÂǸ°°Ê¾å¤Îʸ»ú¤ò´Þ¤à·ë²Ì
+;;; @param min-stroke long-stroke-resultÆâ¤Î¸½ºß¤ÎºÇ¾¯ÂǸ°¿ô
+;;; @param get-stroke-list Éô¼ó¹çÀ®ÍѤÎ2¤Ä¤Îʸ»ú¤È¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¤òÊÖ¤¹´Ø¿ô
+;;; @return Éô¼ó¹çÀ®ÍѤÎ2¤Ä¤Îʸ»ú¤È¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¡£
+;;;  ¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï#f
+(define (tutcode-auto-help-bushu-decompose-looking-bushudic bushudic
+          long-stroke-result min-stroke get-stroke-list)
+  (if (null? bushudic)
+    (and
+      (not (null? long-stroke-result))
+      long-stroke-result)
+    (let*
+      ((res
+        (get-stroke-list (list min-stroke (car bushudic))))
+       (len (if (not res) 99 (tutcode-auto-help-count-stroke-length res)))
+       (min (if (< len min-stroke) len min-stroke)))
+ (if (<= len 4) ; "5"Åù¤ò»È¤¦Éô¼ó¹çÀ®¤Ç4ÂǸ°Ì¤Ëþ¤â¤¢¤ë¤¬¡¢¤½¤³¤Þ¤Ç¤Ï¸«¤Ê¤¤
+        res
+        (tutcode-auto-help-bushu-decompose-looking-bushudic (cdr bushudic)
+          (if (< len min-stroke) res long-stroke-result)
+          min get-stroke-list)))))
+
 ;;; ¼«Æ°¥Ø¥ë¥×:ÂоÝʸ»ú¤ò°ú¤­»»¤Ë¤è¤êÉô¼ó¹çÀ®¤¹¤ë¤Î¤ËɬÍפȤʤ롢
 ;;; ³°»ú¤Ç¤Ê¤¤Ê¸»ú¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£
 ;;; Îã: "ÝÆ" => (((("g" "t" "h")) ("Îó")) ((("G" "I")) ("¥ê")))
@@ -1271,107 +1320,116 @@
 ;;; @param c ÂоÝʸ»ú
 ;;; @return ÂоÝʸ»ú¤ÎÉô¼ó¹çÀ®¤ËɬÍפÊ2¤Ä¤Îʸ»ú¤È¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¡£
 ;;;  ¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï#f
-(define (tutcode-auto-help-bushu-decompose-by-subtraction c bushudic)
-  ;; bushudic¤ÎÍ×ÁǤò½ç¤Ë¸«¤ÆºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¤â¤Î¤òÊÖ¤¹¡£
-  ;; filter¤ämap¤ò»È¤Ã¤Æ¡¢ºÇ¾®¤Î¥¹¥È¥í¡¼¥¯¤Î¤â¤Î¤òõ¤¹¤È»þ´Ö¤¬¤«¤«¤ë¤Î¤Ç¡£
-  (and
-    (not (null? bushudic))
-    (or
-      (tutcode-auto-help-get-stroke-list-by-subtraction c (car bushudic))
- (tutcode-auto-help-bushu-decompose-by-subtraction c (cdr bushudic)))))
+(define (tutcode-auto-help-bushu-decompose-by-subtraction c)
+  (tutcode-auto-help-bushu-decompose-looking-bushudic tutcode-bushudic
+    () 99
+    (lambda (elem)
+      (tutcode-auto-help-get-stroke-list-by-subtraction c elem))))
+
+;;; ¼«Æ°¥Ø¥ë¥×:Éô¼ó¹çÀ®¤ËɬÍפÊÂǸ°¿ô¤ò¿ô¤¨¤ë
+;;; @param bushu-compose-list Éô¼ó¹çÀ®¤Ë»È¤¦2ʸ»ú¤È¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¡£
+;;;  Îã: (((("g" "t" "h")) ("Îó")) ((("G" "I")) ("¥ê")))
+;;; @return bushu-compose-list¤Ë´Þ¤Þ¤ì¤ëÂǸ°¿ô¡£(¾å¤ÎÎã¤Î¾ì¹ç¤Ï5)
+(define (tutcode-auto-help-count-stroke-length bushu-compose-list)
+  (+ (length (caaar bushu-compose-list))
+     (length (caaadr bushu-compose-list))))

 ;;; ¼«Æ°¥Ø¥ë¥×:ÂоÝʸ»ú¤ò°ú¤­»»¤Ë¤è¤êÉô¼ó¹çÀ®¤Ç¤­¤ë¾ì¹ç¤Ï¡¢
 ;;; ¹çÀ®¤Ë»È¤¦³ÆÊ¸»ú¤È¡¢¤½¤Î¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£
 ;;; @param c ÂоÝʸ»ú
-;;; @param bushu-list bushudicÆâ¤ÎÍ×ÁÇ¡£Îã: ((("ÝÆ" "¥ê")) ("Îó"))
+;;; @param min-stroke-bushu-list min-stroke¤ÈbushudicÆâ¤ÎÍ×ÁǤΥꥹ¥È¡£
+;;;  Îã: (6 ((("ÝÆ" "¥ê")) ("Îó")))
 ;;; @return ÂоÝʸ»ú¤ÎÉô¼ó¹çÀ®¤ËɬÍפÊ2¤Ä¤Îʸ»ú¤È¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¡£
 ;;;  bushu-list¤ò»È¤Ã¤Æ¹çÀ®¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï#f¡£
 ;;;  Îã: (((("g" "t" "h")) ("Îó")) ((("G" "I")) ("¥ê")))
-(define (tutcode-auto-help-get-stroke-list-by-subtraction c bushu-list)
+(define (tutcode-auto-help-get-stroke-list-by-subtraction
+          c min-stroke-bushu-list)
   (and-let*
-    ((mem (member c (caar bushu-list)))
+    ((min-stroke (car min-stroke-bushu-list))
+     (bushu-list (cadr min-stroke-bushu-list))
+     (mem (member c (caar bushu-list)))
      (b1 (caadr bushu-list))
      ;; 2¤Ä¤ÎÉô¼ó¤Î¤¦¤Á¡¢c°Ê³°¤ÎÉô¼ó¤ò¼èÆÀ
      (b2 (if (= 2 (length mem)) (cadr mem) (car (caar bushu-list))))
+     (seq1 (tutcode-auto-help-get-stroke b1))
+     (seq2 (tutcode-auto-help-get-stroke b2))
+     (ret (list seq1 seq2))
+     ;; Éô¼ó¹çÀ®¤ÏÃÙ¤¤¤Î¤Ç¡¢Àè¤ËÂǸ°¿ô¤ò¥Á¥§¥Ã¥¯
+ (small-stroke? (< (tutcode-auto-help-count-stroke-length ret) min-stroke))
      ;; ¼ÂºÝ¤ËÉô¼ó¹çÀ®¤·¤Æ¡¢ÂоÝʸ»ú¤¬¹çÀ®¤µ¤ì¤Ê¤¤¤â¤Î¤ÏÂÌÌÜ
      (composed (tutcode-bushu-convert b1 b2))
-     (c-composed? (string=? composed c))
-     (seq1 (tutcode-auto-help-get-stroke b1))
-     (seq2 (tutcode-auto-help-get-stroke b2)))
-    (list seq1 seq2)))
-
-;;; ¼«Æ°¥Ø¥ë¥×:ÂоÝʸ»ú¤ò¹çÀ®²Äǽ¤Ê¡¢¶¦¤Ë³°»ú¤Ç¤Ê¤¤¡ÖÉô¼ó1¡×¤È
-;;; ¡ÖÉô¼ó2¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú¡×¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£
-;;; @param c ÂоÝʸ»ú (Îã: "½²")
-;;; @param seq ³°»ú¤Ç¤Ê¤¤Éô¼ó(b1 or b2)¤ÎÆþÎÏ¥­¡¼¥·¡¼¥±¥ó¥¹¤ÈÉô¼ó¤Î¥ê¥¹¥È¡£
-;;;  Îã: ((("b" ",")) ("¸À"))
-;;; @param b1 Éô¼ó1 (Îã: "ð²")
-;;; @param b2 Éô¼ó2 (Îã: "¸À")
-;;; @param bushudic Éô¼ó¹çÀ®ÊÑ´¹¼­½ñ
+     (c-composed? (string=? composed c)))
+    ret))
+
+;;; ¼«Æ°¥Ø¥ë¥×:ÂоÝʸ»ú¤ò¡ÖÉô¼ó1¡×¤È¡ÖÉô¼ó2¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú¡×¤Ë¤è¤ê
+;;; Éô¼ó¹çÀ®¤Ç¤­¤ë¾ì¹ç¤Ï¡¢
+;;; ¹çÀ®¤Ë»È¤¦³ÆÊ¸»ú¤È¡¢¤½¤Î¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£
+;;; @param c ÂоÝʸ»ú
+;;; @param b1 Éô¼ó1(ľÀÜÆþÎϲÄǽ)
+;;; @param b2 Éô¼ó2(ľÀÜÆþÎÏÉÔ²Äǽ)
+;;; @param seq1 b1¤ÎÆþÎÏ¥­¡¼¥·¡¼¥±¥ó¥¹¤ÈÉô¼ó¤Î¥ê¥¹¥È
+;;; @param min-stroke-bushu-list min-stroke¤ÈbushudicÆâ¤ÎÍ×ÁǤΥꥹ¥È¡£
 ;;; @return ÂоÝʸ»ú¤ÎÉô¼ó¹çÀ®¤ËɬÍפÊ2¤Ä¤Îʸ»ú¤È¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¡£
-;;;  ¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï#f¡£
-;;;  Îã: (((("e" "v" ".")) ("°Ô")) ((("b" ",")) ("¸À")))
-(define (tutcode-auto-help-bushu-decompose-with-part c seq b1 b2 bushudic)
-  ;; bushudic¤ÎÍ×ÁǤò½ç¤Ë¸«¤ÆºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¤â¤Î¤òÊÖ¤¹¡£
-  ;; filter¤ämap¤ò»È¤Ã¤Æ¡¢ºÇ¾®¤Î¥¹¥È¥í¡¼¥¯¤Î¤â¤Î¤òõ¤¹¤È»þ´Ö¤¬¤«¤«¤ë¤Î¤Ç¡£
-  ;; XXX: µÕ°ú¤­ÍÑbushudic¤òºî¤Ã¤Æ»È¤¦?
-  (and
-    (not (null? bushudic))
-    (or
- (tutcode-auto-help-get-stroke-list-with-part c seq b1 b2 (car bushudic))
-      (tutcode-auto-help-bushu-decompose-with-part
-        c seq b1 b2 (cdr bushudic)))))
-
-;;; ¼«Æ°¥Ø¥ë¥×:ÂоÝʸ»ú¤ò¡ÖÉô¼ó1¡×¤È¡ÖÉô¼ó2¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú¡×¤Ë¤è¤ê
+;;;  bushu-list¤ò»È¤Ã¤Æ¹çÀ®¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï#f¡£
+(define (tutcode-auto-help-get-stroke-list-with-right-part
+         c b1 b2 seq1 min-stroke-bushu-list)
+  (and-let*
+    ((min-stroke (car min-stroke-bushu-list))
+     (bushu-list (cadr min-stroke-bushu-list))
+     (mem (member b2 (caar bushu-list)))
+     (kanji (caadr bushu-list)) ; Éô¼ó2¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú
+     (seq (tutcode-auto-help-get-stroke kanji))
+     (ret (list seq1 seq))
+     ;; Éô¼ó¹çÀ®¤ÏÃÙ¤¤¤Î¤Ç¡¢Àè¤ËÂǸ°¿ô¤ò¥Á¥§¥Ã¥¯
+ (small-stroke? (< (tutcode-auto-help-count-stroke-length ret) min-stroke))
+     ;; ¼ÂºÝ¤ËÉô¼ó¹çÀ®¤·¤Æ¡¢ÂоÝʸ»ú¤¬¹çÀ®¤µ¤ì¤Ê¤¤¤â¤Î¤ÏÂÌÌÜ
+     (composed (tutcode-bushu-convert b1 kanji))
+     (c-composed? (string=? composed c)))
+    ret))
+
+;;; ¼«Æ°¥Ø¥ë¥×:ÂоÝʸ»ú¤ò¡ÖÉô¼ó1¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú¡×¤È¡ÖÉô¼ó2¡×¤Ë¤è¤ê
 ;;; Éô¼ó¹çÀ®¤Ç¤­¤ë¾ì¹ç¤Ï¡¢
 ;;; ¹çÀ®¤Ë»È¤¦³ÆÊ¸»ú¤È¡¢¤½¤Î¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¤òÊÖ¤¹¡£
 ;;; @param c ÂоÝʸ»ú (Îã: "½²")
-;;; @param seq ³°»ú¤Ç¤Ê¤¤Éô¼ó(b1 or b2)¤ÎÆþÎÏ¥­¡¼¥·¡¼¥±¥ó¥¹¤ÈÉô¼ó¤Î¥ê¥¹¥È¡£
+;;; @param b1 Éô¼ó1(ľÀÜÆþÎÏÉÔ²Äǽ) (Îã: "ð²")
+;;; @param b2 Éô¼ó2(ľÀÜÆþÎϲÄǽ) (Îã: "¸À")
+;;; @param seq2 b2¤ÎÆþÎÏ¥­¡¼¥·¡¼¥±¥ó¥¹¤ÈÉô¼ó¤Î¥ê¥¹¥È¡£
 ;;;  Îã: ((("b" ",")) ("¸À"))
-;;; @param b1 Éô¼ó1 (Îã: "ð²")
-;;; @param b2 Éô¼ó2 (Îã: "¸À")
-;;; @param bushu-list bushudicÆâ¤ÎÍ×ÁÇ¡£Îã: ((("À­" "ð²"))("°Ô"))
+;;; @param min-stroke-bushu-list min-stroke¤ÈbushudicÆâ¤ÎÍ×ÁǤΥꥹ¥È¡£
+;;;  Îã: (6 ((("À­" "ð²")) ("°Ô")))
 ;;; @return ÂоÝʸ»ú¤ÎÉô¼ó¹çÀ®¤ËɬÍפÊ2¤Ä¤Îʸ»ú¤È¥¹¥È¥í¡¼¥¯¤Î¥ê¥¹¥È¡£
 ;;;  bushu-list¤ò»È¤Ã¤Æ¹çÀ®¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï#f¡£
 ;;;  Îã: (((("e" "v" ".")) ("°Ô")) ((("b" ",")) ("¸À")))
-(define (tutcode-auto-help-get-stroke-list-with-part
-         c seq b1 b2 bushu-list)
-  (if (string=? b1 (caadr seq))
-    ;; Éô¼ó1¤Ï³°»ú¤Ç¤Ê¤¤(ľÀÜÆþÎϲÄǽ)
-    (and-let*
-      ((mem (member b2 (caar bushu-list)))
-       (kanji (caadr bushu-list)) ; Éô¼ó2¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú
-       ;; ¼ÂºÝ¤ËÉô¼ó¹çÀ®¤·¤Æ¡¢ÂоÝʸ»ú¤¬¹çÀ®¤µ¤ì¤Ê¤¤¤â¤Î¤ÏÂÌÌÜ
-       (composed (tutcode-bushu-convert b1 kanji))
-       (c-composed? (string=? composed c))
-       (seq2 (tutcode-auto-help-get-stroke kanji)))
-      (list seq seq2))
-    ;; Éô¼ó2¤Ï³°»ú¤Ç¤Ê¤¤(ľÀÜÆþÎϲÄǽ)
-    (and-let*
-      ((mem (member b1 (caar bushu-list)))
-       (kanji (caadr bushu-list)) ; Éô¼ó1¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú
-       ;; ¼ÂºÝ¤ËÉô¼ó¹çÀ®¤·¤Æ¡¢ÂоÝʸ»ú¤¬¹çÀ®¤µ¤ì¤Ê¤¤¤â¤Î¤ÏÂÌÌÜ
-       (composed (tutcode-bushu-convert kanji b2))
-       (c-composed? (string=? composed c))
-       (seq1 (tutcode-auto-help-get-stroke kanji)))
-      (list seq1 seq))))
-
-;;; rule¤òµÕ°ú¤­¤·¤Æ¡¢ÊÑ´¹¸å¤Îʸ»ú¤«¤é¡¢ÆþÎÏ¥­¡¼Îó¤ò¼èÆÀ¤¹¤ë¡£
-;;; Îã: (tutcode-reverse-find-seq tutcode-rule "¤¢") => ("r" "k")
-;;; @param rule rk¤Ç»È¤¦·Á¼°¤Îrule
+(define (tutcode-auto-help-get-stroke-list-with-left-part
+         c b1 b2 seq2 min-stroke-bushu-list)
+  (and-let*
+    ((min-stroke (car min-stroke-bushu-list))
+     (bushu-list (cadr min-stroke-bushu-list))
+     (mem (member b1 (caar bushu-list)))
+     (kanji (caadr bushu-list)) ; Éô¼ó1¤òÉôÉʤȤ·¤Æ»ý¤Ä´Á»ú
+     (seq (tutcode-auto-help-get-stroke kanji))
+     (ret (list seq seq2))
+     ;; Éô¼ó¹çÀ®¤ÏÃÙ¤¤¤Î¤Ç¡¢Àè¤ËÂǸ°¿ô¤ò¥Á¥§¥Ã¥¯
+ (small-stroke? (< (tutcode-auto-help-count-stroke-length ret) min-stroke))
+     ;; ¼ÂºÝ¤ËÉô¼ó¹çÀ®¤·¤Æ¡¢ÂоÝʸ»ú¤¬¹çÀ®¤µ¤ì¤Ê¤¤¤â¤Î¤ÏÂÌÌÜ
+     (composed (tutcode-bushu-convert kanji b2))
+     (c-composed? (string=? composed c)))
+    ret))
+
+;;; tutcode-rule¤òµÕ°ú¤­¤·¤Æ¡¢ÊÑ´¹¸å¤Îʸ»ú¤«¤é¡¢ÆþÎÏ¥­¡¼Îó¤ò¼èÆÀ¤¹¤ë¡£
+;;; Îã: (tutcode-reverse-find-seq "¤¢") => ("r" "k")
 ;;; @param c ÊÑ´¹¸å¤Îʸ»ú
-;;; @return ÆþÎÏ¥­¡¼¤Î¥ê¥¹¥È¡£ruleÃæ¤Ëc¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï#f
-(define (tutcode-reverse-find-seq rule c)
-  ;; XXX: µÕ°ú¤­ÍÑalist¤òºî¤Ã¤Æ»È¤¦?
-  (let ((lst
-          (filter
-            (lambda (elem)
-             ;; string=?¤À¤È'tutcode-mazegaki-start¤Ç¥¨¥é¡¼
-              (equal? c (car (cadr elem))))
-            rule)))
-    (and
-      (not (null? lst))
-      (car (caar lst)))))
+;;; @return ÆþÎÏ¥­¡¼¤Î¥ê¥¹¥È¡£tutcode-ruleÃæ¤Ëc¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï#f
+(define (tutcode-reverse-find-seq c)
+  (if (null? tutcode-reverse-rule-alist)
+    (set! tutcode-reverse-rule-alist
+      (map
+        (lambda (elem)
+          (cons (caadr elem) (caar elem)))
+        tutcode-rule)))
+  (let ((res (assoc c tutcode-reverse-rule-alist)))
+    (and res
+      (cdr res))))

 ;;; ¸½ºß¤Îstate¤¬preedit¤ò»ý¤Ä¤«¤É¤¦¤«¤òÊÖ¤¹¡£
 ;;; @param pc ¥³¥ó¥Æ¥­¥¹¥È¥ê¥¹¥È

Reply via email to