CMUCL commit: src/code (unidata.lisp)
Raymond Toy
rtoy at common-lisp.net
Mon Sep 20 02:59:22 CEST 2010
Date: Sunday, September 19, 2010 @ 20:59:22
Author: rtoy
Path: /project/cmucl/cvsroot/src/code
Modified: unidata.lisp
Improve completion of Hangul syllables and CJK unified ideographs some
more and fix some bugs in previous change.
--------------+
unidata.lisp | 87 ++++++++++++++++++++++-----------------------------------
1 file changed, 35 insertions(+), 52 deletions(-)
Index: src/code/unidata.lisp
diff -u src/code/unidata.lisp:1.19 src/code/unidata.lisp:1.20
--- src/code/unidata.lisp:1.19 Sun Sep 19 19:07:46 2010
+++ src/code/unidata.lisp Sun Sep 19 20:59:22 2010
@@ -4,7 +4,7 @@
;;; This code was written by Paul Foley and has been placed in the public
;;; domain.
;;;
-(ext:file-comment "$Header: /project/cmucl/cvsroot/src/code/unidata.lisp,v 1.19 2010-09-19 23:07:46 rtoy Exp $")
+(ext:file-comment "$Header: /project/cmucl/cvsroot/src/code/unidata.lisp,v 1.20 2010-09-20 00:59:22 rtoy Exp $")
;;;
;;; **********************************************************************
;;;
@@ -18,7 +18,7 @@
(defconstant +unidata-path+ #p"ext-formats:unidata.bin")
-(defvar *unidata-version* "$Revision: 1.19 $")
+(defvar *unidata-version* "$Revision: 1.20 $")
(defstruct unidata
range
@@ -1274,62 +1274,45 @@
completions starting with Prefix. If there is no match, NIL is
returned."
(let (names)
- (cond ((search "Hangul_Syllable_" prefix)
- (initialize-reverse-hangul-tables)
- (unless *hangul-syllable-dictionary*
- (build-hangul-syllable-dictionary))
- (multiple-value-bind (prefix-match next completep)
- (unicode-complete-name (subseq prefix 16)
- *hangul-syllable-dictionary*)
- (loop for x in next
- do (push (concatenate 'string "Hangul_Syllable_" prefix-match x)
- names))
- (when completep
- (push (concatenate 'string "Hangul_Syllable_" prefix-match)
- names))))
- ((search "Cjk_Unified_Ideograph-" prefix)
- (unless *cjk-unified-ideograph-dictionary*
- (build-cjk-unified-ideograph-dictionary))
- (multiple-value-bind (prefix-match next completep)
- (unicode-complete-name (subseq prefix 22)
- *cjk-unified-ideograph-dictionary*)
- (loop for x in next
- do (push (concatenate 'string "Cjk_Unified_Ideograph-" prefix-match x)
- names))
- (when completep
- (push (concatenate 'string "Cjk_Unified_Ideograph-" prefix-match)
- names)))))
(multiple-value-bind (prefix-match next completep)
(unicode-complete-name prefix dict)
(loop for x in next
do (push (concatenate 'string prefix-match x) names))
(when completep
(push prefix-match names))
- ;; Match prefix against Hangul and/or Hangul_syllable
- (cond ((search "Hangul_S" prefix-match
- :end1 (min 8 (length prefix-match)))
- ;; Add syllable as possible completion, and then try to
- ;; complete some more so that we don't end up with slime
- ;; saying "Hangul_Syllable_" is the only completion.
- (multiple-value-bind (m suffixes)
- (unicode-complete-name (subseq prefix-match (min 16 (length prefix-match)))
- *hangul-syllable-dictionary*)
- (declare (ignore m))
- (if suffixes
- (loop for n in suffixes
- do (push (concatenate 'string "Hangul_Syllable_" n) names))
- (push "Hangul_Syllable_" names))))
- ((or ;;(string= prefix-match "Cjk_")
- (search "Cjk_Unified_Ideograph-" prefix-match
- :end1 (min 22 (length prefix-match))))
- ;; Try to complete the first part so we don't get
- ;; "Cjk_Unified_Ideograph-" as the only completion.
- (multiple-value-bind (m suffixes)
- (unicode-complete-name (subseq prefix-match (min 22 (length prefix-match)))
- *cjk-unified-ideograph-dictionary*)
- (declare (ignore m))
- (loop for n in suffixes
- do (push (concatenate 'string "Cjk_Unified_Ideograph-" n) names)))))
+ (flet ((han-or-cjk-completion (prefix-match prefix dictionary)
+ (let* ((prefix-tail (subseq prefix-match
+ (min (length prefix)
+ (length prefix-match))))
+ (full-prefix (concatenate 'string prefix prefix-tail)))
+ (multiple-value-bind (m suffixes)
+ (unicode-complete-name prefix-tail dictionary)
+ (declare (ignore m))
+ (if suffixes
+ (loop for n in suffixes
+ do (push (concatenate 'string full-prefix n) names))
+ (push full-prefix names))))))
+ ;; Match prefix for Hangul syllables or CJK unified ideographs.
+ (cond ((char= (char prefix-match 0) #\H)
+ ;; Add "Hangul_Syllable_" as possible completion for
+ ;; anything beginning with "H".
+ (push "Hangul_Syllable_" names)
+ (when (<= (length names) 1)
+ ;; Hangul_Syllable is the only match, so let's extend it.
+ (unless *hangul-syllable-dictionary*
+ (initialize-reverse-hangul-tables)
+ (build-hangul-syllable-dictionary))
+ (han-or-cjk-completion prefix-match "Hangul_Syllable_"
+ *hangul-syllable-dictionary*)))
+ ((char= (char prefix-match 0) #\C)
+ ;; Add "Cjk_Unified_Ideograph-" as possible completion
+ ;; for anything beginning with "C".
+ (push "Cjk_Unified_Ideograph-" names)
+ (when (<= (length names) 1)
+ (unless *cjk-unified-ideograph-dictionary*
+ (build-cjk-unified-ideograph-dictionary))
+ (han-or-cjk-completion prefix-match "Cjk_Unified_Ideograph-"
+ *cjk-unified-ideograph-dictionary*)))))
(setf names (mapcar #'string-capitalize names))
;;(format t "Final names = ~S~%" names)
names)))
More information about the cmucl-commit
mailing list