X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Futf-2000%2Fchar-db-util.el;h=89e99e564bd1c066e13e62b18c2b38e596f7aec3;hb=2c2b1b1825633c16120fd8547e2d38854b7d65f4;hp=563d6a4d1a88c433342b73e3c5a2a899682695d6;hpb=533d79866ec47e68491aaf5a9a48b5f86167e539;p=chise%2Fxemacs-chise.git- diff --git a/lisp/utf-2000/char-db-util.el b/lisp/utf-2000/char-db-util.el index 563d6a4..89e99e5 100644 --- a/lisp/utf-2000/char-db-util.el +++ b/lisp/utf-2000/char-db-util.el @@ -71,6 +71,34 @@ (aset v 34 (make-char 'chinese-gb2312 #x62 #x3A))) v)) +;;;###autoload +(defun char-ref-p (obj) + (and (consp obj) + (keywordp (car obj)))) + +;;;###autoload +(defun char-ref= (cr1 cr2) + (cond ((char-ref-p cr1) + (if (char-ref-p cr2) + (char-spec= (plist-get cr1 :char) + (plist-get cr2 :char)) + (char-spec= (plist-get cr1 :char) cr2))) + (t + (char-spec= cr1 + (if (char-ref-p cr2) + (plist-get cr2 :char) + cr2))))) + +;;;###autoload +(defun char-spec= (cs1 cs2) + (if (characterp cs1) + (if (characterp cs2) + (eq cs1 cs2) + (eq cs1 (find-char cs2))) + (if (characterp cs2) + (eq (find-char cs1) cs2) + (eq (find-char cs1) (find-char cs2))))) + (defun char-attribute-name< (ka kb) (cond ((find-charset ka) @@ -116,45 +144,85 @@ ((symbolp kb) nil))) -(defun char-db-insert-char-ref (char &optional readable column) +(defvar char-db-coded-charset-priority-list + (let ((rest default-coded-charset-priority-list) + dest) + (while rest + (when (symbolp (car rest)) + (cond ((memq (car rest) + '(latin-viscii-lower + latin-viscii-upper + ipa + lao + ethiopic + arabic-digit + arabic-1-column + arabic-2-column))) + ((string-match "^ideograph-gt-pj-" (symbol-name (car rest))) + (unless (memq 'ideograph-gt dest) + (setq dest (cons 'ideograph-gt dest)))) + (t + (setq dest (cons (car rest) dest))))) + (setq rest (cdr rest))) + (sort dest #'char-attribute-name<))) + +(defun char-db-insert-char-spec (char &optional readable column) (unless column (setq column (current-column))) - (let (char-ref ret al cal key) + (let (char-spec ret al cal key temp-char) (cond ((characterp char) - (cond ((setq ret (get-char-attribute char 'ucs)) - (setq char-ref (list (cons 'ucs ret))) + (cond ((and (setq ret (get-char-attribute char 'ucs)) + (not (and (<= #xE000 ret)(<= ret #xF8FF)))) + (setq char-spec (list (cons 'ucs ret))) (if (setq ret (get-char-attribute char 'name)) - (setq char-ref (cons (cons 'name ret) char-ref))) + (setq char-spec (cons (cons 'name ret) char-spec))) ) - ((setq ret (split-char char)) - (setq char-ref (list ret)) + ((setq ret + (let ((default-coded-charset-priority-list + char-db-coded-charset-priority-list)) + (split-char char))) + (setq char-spec (list ret)) (dolist (ccs (delq (car ret) (charset-list))) - (if (and (>= (charset-iso-final-char ccs) ?0) - (setq ret (get-char-attribute char ccs))) - (setq char-ref (cons (cons ccs ret) char-ref)))) + (if (or (and (>= (charset-iso-final-char ccs) ?0) + (setq ret (get-char-attribute char ccs))) + (eq ccs 'ideograph-daikanwa)) + (setq char-spec (cons (cons ccs ret) char-spec)))) + (if (null char-spec) + (setq char-spec (split-char char))) (if (setq ret (get-char-attribute char 'name)) - (setq char-ref (cons (cons 'name ret) char-ref))) + (setq char-spec (cons (cons 'name ret) char-spec))) ))) ((consp char) - (setq char-ref char) + (setq char-spec char) (setq char nil))) - (if (or char - (setq char (condition-case nil - (define-char char-ref) - (error nil)))) - (progn - (setq al nil - cal nil) - (while char-ref - (setq key (car (car char-ref))) - (if (find-charset key) - (setq cal (cons key cal)) - (setq al (cons key al))) - (setq char-ref (cdr char-ref))) - (insert-char-attributes char - readable - (or al 'none) cal)) - (insert (prin1-to-string char-ref))))) + (unless (or char + (condition-case nil + (setq char (find-char char-spec)) + (error nil))) + ;; define temporary character + ;; Current implementation is dirty. + (setq temp-char (define-char (cons '(ideograph-daikanwa . 0) + char-spec))) + (remove-char-attribute temp-char 'ideograph-daikanwa) + (setq char temp-char)) + (setq al nil + cal nil) + (while char-spec + (setq key (car (car char-spec))) + (if (find-charset key) + (setq cal (cons key cal)) + (setq al (cons key al))) + (setq char-spec (cdr char-spec))) + (insert-char-attributes char + readable + (or al 'none) cal) + (when temp-char + ;; undefine temporary character + ;; Current implementation is dirty. + (setq char-spec (char-attribute-alist temp-char)) + (while char-spec + (remove-char-attribute temp-char (car (car char-spec))) + (setq char-spec (cdr char-spec)))))) (defun char-db-insert-alist (alist &optional readable column) (unless column @@ -171,7 +239,7 @@ (cond ((eq name 'char) (insert "(char . ") (if (setq ret (condition-case nil - (define-char value) + (find-char value) (error nil))) (progn (setq al nil @@ -196,7 +264,7 @@ (if (and (consp cell) (consp (car cell)) (setq ret (condition-case nil - (define-char cell) + (find-char cell) (error nil))) ) (progn @@ -229,7 +297,7 @@ (setq alist (cdr alist)))) (insert ")")) -(defun char-db-insert-char-map (plist &optional readable column) +(defun char-db-insert-char-reference (plist &optional readable column) (unless column (setq column (current-column))) (let ((line-breaking @@ -241,7 +309,13 @@ (setq value (pop plist)) (cond ((eq name :char) (insert ":char\t") - (char-db-insert-char-ref value readable) + (cond ((numberp value) + (setq value (decode-char 'ucs value))) + ;; ((consp value) + ;; (setq value (or (find-char value) + ;; value))) + ) + (char-db-insert-char-spec value readable) (insert line-breaking)) (t (insert (format "%s\t%S%s" @@ -253,21 +327,24 @@ (defun char-db-decode-isolated-char (ccs code-point) (let (ret) (setq ret - (if (and (memq ccs '(ideograph-gt-pj-1 - ideograph-gt-pj-2 - ideograph-gt-pj-3 - ideograph-gt-pj-4 - ideograph-gt-pj-5 - ideograph-gt-pj-6 - ideograph-gt-pj-7 - ideograph-gt-pj-8 - ideograph-gt-pj-9 - ideograph-gt-pj-10 - ideograph-gt-pj-11)) - (setq ret (decode-char ccs code-point)) - (setq ret (get-char-attribute ret 'ideograph-gt))) - (decode-builtin-char 'ideograph-gt ret) - (decode-builtin-char ccs code-point))) + (cond ((eq ccs 'arabic-iso8859-6) + (decode-char ccs code-point)) + ((and (memq ccs '(ideograph-gt-pj-1 + ideograph-gt-pj-2 + ideograph-gt-pj-3 + ideograph-gt-pj-4 + ideograph-gt-pj-5 + ideograph-gt-pj-6 + ideograph-gt-pj-7 + ideograph-gt-pj-8 + ideograph-gt-pj-9 + ideograph-gt-pj-10 + ideograph-gt-pj-11)) + (setq ret (decode-char ccs code-point)) + (setq ret (get-char-attribute ret 'ideograph-gt))) + (decode-builtin-char 'ideograph-gt ret)) + (t + (decode-builtin-char ccs code-point)))) (cond ((and (<= 0 (char-int ret)) (<= (char-int ret) #x1F)) (decode-char 'ucs (+ #x2400 (char-int ret)))) @@ -303,7 +380,7 @@ (when (and (memq 'name attributes) (setq value (get-char-attribute char 'name))) (insert (format - (if (> (length value) 47) + (if (> (+ (current-column) (length value)) 48) "(name . %S)%s" "(name . %S)%s") value line-breaking)) @@ -557,6 +634,24 @@ line-breaking)) (setq attributes (delq '->mojikyo attributes)) ) + (when (and (memq 'hanyu-dazidian-vol attributes) + (setq value (get-char-attribute char 'hanyu-dazidian-vol))) + (insert (format "(hanyu-dazidian-vol . %d)%s" + value line-breaking)) + (setq attributes (delq 'hanyu-dazidian-vol attributes)) + ) + (when (and (memq 'hanyu-dazidian-page attributes) + (setq value (get-char-attribute char 'hanyu-dazidian-page))) + (insert (format "(hanyu-dazidian-page . %d)%s" + value line-breaking)) + (setq attributes (delq 'hanyu-dazidian-page attributes)) + ) + (when (and (memq 'hanyu-dazidian-char attributes) + (setq value (get-char-attribute char 'hanyu-dazidian-char))) + (insert (format "(hanyu-dazidian-char . %d)%s" + value line-breaking)) + (setq attributes (delq 'hanyu-dazidian-char attributes)) + ) (setq rest ccs-attributes) (while (and rest (progn @@ -579,11 +674,19 @@ ((memq name '(->lowercase ->uppercase ->titlecase ->fullwidth <-fullwidth + ->identical ->vulgar-ideograph <-vulgar-ideograph ->ancient-ideograph <-ancient-ideograph + ->original-ideograph <-original-ideograph ->simplified-ideograph <-simplified-ideograph + ->wrong-ideograph <-wrong-ideograph ->same-ideograph - ->bopomofo)) + ->ideographic-variants + ->synonyms + ->radical <-radical + ->bopomofo <-bopomofo + ->ideographic <-ideographic + ideographic-structure)) (insert (format "(%-18s%s " name line-breaking)) (setq lbs (concat "\n" (make-string (current-column) ?\ )) separator nil) @@ -594,14 +697,14 @@ (cond ((characterp cell) (if separator (insert lbs)) - (char-db-insert-char-ref cell readable) + (char-db-insert-char-spec cell readable) (setq separator lbs)) ((consp cell) (if separator (insert lbs)) (if (consp (car cell)) - (char-db-insert-char-ref cell readable) - (char-db-insert-char-map cell readable)) + (char-db-insert-char-spec cell readable) + (char-db-insert-char-reference cell readable)) (setq separator lbs)) (t (if separator @@ -661,7 +764,7 @@ (if (and (consp cell) (consp (car cell)) (setq ret (condition-case nil - (define-char cell) + (find-char cell) (error nil)))) (progn (setq rest cell @@ -698,7 +801,8 @@ (setq value (get-char-attribute char name))) (insert (format - (cond ((memq name '(ideograph-daikanwa ideograph-gt)) + (cond ((memq name '(ideograph-daikanwa ideograph-gt + ideograph-cbeta)) (if has-long-ccs-name "(%-26s . %05d)\t; %c%s" "(%-18s . %05d)\t; %c%s")) @@ -790,6 +894,7 @@ (if ucs (delete char (char-variants (int-char ucs))))))) variant vs) + (setq variants (sort variants #'<)) (while variants (setq variant (car variants)) (if (and (or (null script) @@ -837,6 +942,9 @@ (condition-case err (progn (insert-char-data-with-variant char 'printable) + (unless (char-attribute-alist char) + (insert (format ";; = %c\n" + (apply #'make-char (split-char char))))) ;; (char-db-update-comment) (set-buffer-modified-p nil) (view-mode the-buf (lambda (buf)