-(defun insert-char-data (char &optional readable
- attributes ccs-attributes)
- (or attributes
- (setq attributes (sort (char-attribute-list) #'char-attribute-name<)))
- (or ccs-attributes
- (setq ccs-attributes (sort (charset-list) #'char-attribute-name<)))
- (let (name value cell ret has-long-ccs-name rest
- radical strokes)
- (save-restriction
- (narrow-to-region (point)(point))
- (insert "(define-char
- '(")
- (when (setq value (get-char-attribute char 'name))
- (insert (format
- (if (> (length value) 47)
- "(name . %S)
- "
- "(name\t\t. %S)
- ")
- value))
- (setq attributes (delq 'name attributes))
- )
- (when (setq value (get-char-attribute char 'script))
- (insert (format "(script\t\t%s)
- "
- (mapconcat (function prin1-to-string)
- value " ")))
- (setq attributes (del-alist 'script data))
- )
- (when (setq value (get-char-attribute char '->ucs))
- (insert (format "(->ucs\t\t. #x%04X)\t; %c
- "
- value (decode-char 'ucs value)))
- (setq attributes (delq '->ucs attributes))
- )
- (when (setq value (get-char-attribute char 'general-category))
- (insert (format
- "(general-category\t%s) ; %s
- "
- (mapconcat (lambda (cell)
- (format "%S" cell))
- value " ")
- (cond ((rassoc value unidata-normative-category-alist)
- "Normative Category")
- ((rassoc value unidata-informative-category-alist)
- "Informative Category")
- (t
- "Unknown Category"))))
- (setq attributes (delq 'general-category attributes))
- )
- (when (setq value (get-char-attribute char 'bidi-category))
- (insert (format "(bidi-category\t. %S)
- "
- value))
- (setq attributes (delq 'bidi-category attributes))
- )
- (when (setq value (get-char-attribute char 'mirrored))
- (insert (format "(mirrored\t\t. %S)
- "
- value))
- (setq attributes (delq 'mirrored attributes))
- )
- (cond
- ((setq value (get-char-attribute char 'decimal-digit-value))
- (insert (format "(decimal-digit-value . %S)
- "
- value))
- (setq attributes (delq 'decimal-digit-value attributes))
- (when (setq value (get-char-attribute char 'digit-value))
- (insert (format "(digit-value\t . %S)
- "
- value))
- (setq attributes (delq 'digit-value attributes))
- )
- (when (setq value (get-char-attribute char 'numeric-value))
- (insert (format "(numeric-value\t . %S)
- "
- value))
- (setq attributes (delq 'numeric-value attributes))
- )
- )
- (t
- (when (setq value (get-char-attribute char 'digit-value))
- (insert (format "(digit-value\t. %S)
- "
- value))
- (setq attributes (delq 'digit-value attributes))
- )
- (when (setq value (get-char-attribute char 'numeric-value))
- (insert (format "(numeric-value\t. %S)
- "
- value))
- (setq attributes (delq 'numeric-value attributes))
- )))
- (when (setq value (get-char-attribute char 'iso-10646-comment))
- (insert (format "(iso-10646-comment\t. %S)
- "
- value))
- (setq attributes (delq 'iso-10646-comment attributes))
- )
- (when (setq value (get-char-attribute char 'morohashi-daikanwa))
- (insert (format "(morohashi-daikanwa\t%s)
- "
- (mapconcat (function prin1-to-string) value " ")))
- (setq attributes (delq 'morohashi-daikanwa attributes))
- )
- (setq radical nil
- strokes nil)
- (when (setq value (get-char-attribute char 'ideographic-radical))
- (setq radical value)
- (insert (format "(ideographic-radical . %S)\t; %c
- "
- radical
- (aref ideographic-radicals radical)))
- (setq attributes (delq 'ideographic-radical attributes))
- )
- (when (setq value (get-char-attribute char 'ideographic-strokes))
- (setq strokes value)
- (insert (format "(ideographic-strokes . %S)
- "
- strokes))
- (setq attributes (delq 'ideographic-strokes attributes))
- )
- (when (setq value (get-char-attribute char 'kangxi-radical))
- (unless (eq value radical)
- (insert (format "(kangxi-radical\t . %S)\t; %c
- "
- value
- (aref ideographic-radicals value)))
- (or radical
- (setq radical value)))
- (setq attributes (delq 'kangxi-radical attributes))
- )
- (when (setq value (get-char-attribute char 'kangxi-strokes))
- (unless (eq value strokes)
- (insert (format "(kangxi-strokes\t . %S)
- "
- value))
- (or strokes
- (setq strokes value)))
- (setq attributes (delq 'kangxi-strokes attributes))
- )
- (when (setq value (get-char-attribute char 'japanese-radical))
- (unless (eq value radical)
- (insert (format "(japanese-radical\t . %S)\t; %c
- "
- value
- (aref ideographic-radicals value)))
- (or radical
- (setq radical value)))
- (setq attributes (delq 'japanese-radical attributes))
- )
- (when (setq value (get-char-attribute char 'japanese-strokes))
- (unless (eq value strokes)
- (insert (format "(japanese-strokes\t . %S)
- "
- value))
- (or strokes
- (setq strokes value)))
- (setq attributes (delq 'japanese-strokes attributes))
- )
- (when (setq value (get-char-attribute char 'cns-radical))
- (insert (format "(cns-radical\t . %S)\t; %c
- "
+(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 "^mojikyo-" (symbol-name (car rest))))
+ ((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-spec ret al cal key temp-char)
+ (cond ((characterp char)
+ (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-spec (cons (cons 'name ret) char-spec)))
+ )
+ ((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 (or (and (charset-iso-final-char ccs)
+ (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-spec (cons (cons 'name ret) char-spec)))
+ )))
+ ((consp char)
+ (setq char-spec char)
+ (setq char nil)))
+ (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)))
+ (unless (memq key char-db-ignored-attributes)
+ (if (find-charset key)
+ (setq cal (cons key cal))
+ (setq al (cons key al))))
+ (setq char-spec (cdr char-spec)))
+ (unless (or cal
+ (memq 'ideographic-structure al))
+ (push 'ideographic-structure al))
+ (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
+ (setq column (current-column)))
+ (let ((line-breaking
+ (concat "\n" (make-string (1+ column) ?\ )))
+ name value
+ ret al cal key
+ lbs cell rest separator)
+ (insert "(")
+ (while alist
+ (setq name (car (car alist))
+ value (cdr (car alist)))
+ (cond ((eq name 'char)
+ (insert "(char . ")
+ (if (setq ret (condition-case nil
+ (find-char value)
+ (error nil)))
+ (progn
+ (setq al nil
+ cal nil)
+ (while value
+ (setq key (car (car value)))
+ (if (find-charset key)
+ (setq cal (cons key cal))
+ (setq al (cons key al)))
+ (setq value (cdr value)))
+ (insert-char-attributes ret
+ readable
+ (or al 'none) cal))
+ (insert (prin1-to-string value)))
+ (insert ")")
+ (insert line-breaking))
+ ((consp value)
+ (insert (format "(%-18s " name))
+ (setq lbs (concat "\n" (make-string (current-column) ?\ )))
+ (while (consp value)
+ (setq cell (car value))
+ (if (and (consp cell)
+ (consp (car cell))
+ (setq ret (condition-case nil
+ (find-char cell)
+ (error nil)))
+ )
+ (progn
+ (setq rest cell
+ al nil
+ cal nil)
+ (while rest
+ (setq key (car (car rest)))
+ (if (find-charset key)
+ (setq cal (cons key cal))
+ (setq al (cons key al)))
+ (setq rest (cdr rest)))
+ (if separator
+ (insert lbs))
+ (insert-char-attributes ret
+ readable
+ al cal)
+ (setq separator lbs))
+ (if separator
+ (insert separator))
+ (insert (prin1-to-string cell))
+ (setq separator " "))
+ (setq value (cdr value)))
+ (insert ")")
+ (insert line-breaking))
+ (t
+ (insert (format "(%-18s . %S)%s"
+ name value
+ line-breaking))))
+ (setq alist (cdr alist))))
+ (insert ")"))
+
+(defun char-db-insert-char-reference (plist &optional readable column)
+ (unless column
+ (setq column (current-column)))
+ (let ((line-breaking
+ (concat "\n" (make-string (1+ column) ?\ )))
+ name value)
+ (insert "(")
+ (while plist
+ (setq name (pop plist))
+ (setq value (pop plist))
+ (cond ((eq name :char)
+ (insert ":char\t")
+ (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"
+ name value
+ line-breaking))))
+ ))
+ (insert ")"))
+
+(defun char-db-decode-isolated-char (ccs code-point)
+ (let (ret)
+ (setq ret
+ (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))))
+ ((= (char-int ret) #x7F)
+ ?\u2421)
+ (t ret))))
+
+(defvar char-db-convert-obsolete-format t)
+
+(defvar char-db-ignored-attributes nil)
+
+(defun insert-char-attributes (char &optional readable
+ attributes ccs-attributes
+ column)
+ (let (atr-d ccs-d)
+ (setq attributes
+ (sort (if attributes
+ (if (consp attributes)
+ (progn
+ (dolist (name attributes)
+ (unless (memq name char-db-ignored-attributes)
+ (push name atr-d)))
+ atr-d))
+ (dolist (name (char-attribute-list))
+ (unless (memq name char-db-ignored-attributes)
+ (if (find-charset name)
+ (push name ccs-d)
+ (push name atr-d))))
+ atr-d)
+ #'char-attribute-name<))
+ (setq ccs-attributes
+ (sort (if ccs-attributes
+ (progn
+ (setq ccs-d nil)
+ (dolist (name ccs-attributes)
+ (unless (memq name char-db-ignored-attributes)
+ (push name ccs-d)))
+ ccs-d)
+ (or ccs-d
+ (progn
+ (dolist (name (charset-list))
+ (unless (memq name char-db-ignored-attributes)
+ (push name ccs-d)))
+ ccs-d)))
+ #'char-attribute-name<)))
+ (unless column
+ (setq column (current-column)))
+ (let (name value has-long-ccs-name rest
+ radical strokes
+ (line-breaking
+ (concat "\n" (make-string (1+ column) ?\ )))
+ lbs cell separator ret
+ key al cal)
+ (insert "(")
+ (when (and (memq 'name attributes)
+ (setq value (get-char-attribute char 'name)))
+ (insert (format
+ (if (> (+ (current-column) (length value)) 48)
+ "(name . %S)%s"
+ "(name . %S)%s")
+ value line-breaking))
+ (setq attributes (delq 'name attributes))
+ )
+ (when (and (memq 'script attributes)
+ (setq value (get-char-attribute char 'script)))
+ (insert (format "(script\t\t%s)%s"
+ (mapconcat (function prin1-to-string)
+ value " ")
+ line-breaking))
+ (setq attributes (delq 'script attributes))
+ )
+ (when (and (memq '=>ucs attributes)
+ (setq value (get-char-attribute char '=>ucs)))
+ (insert (format "(=>ucs\t\t. #x%04X)\t; %c%s"
+ value (decode-char 'ucs value)
+ line-breaking))
+ (setq attributes (delq '=>ucs attributes))
+ )
+ (when (and (memq '=>ucs* attributes)
+ (setq value (get-char-attribute char '=>ucs*)))
+ (insert (format "(=>ucs*\t\t. #x%04X)\t; %c%s"
+ value (decode-char 'ucs value)
+ line-breaking))
+ (setq attributes (delq '=>ucs* attributes))
+ )
+ (when (and (memq '=>ucs-jis attributes)
+ (setq value (get-char-attribute char '=>ucs-jis)))
+ (insert (format "(=>ucs-jis\t\t. #x%04X)\t; %c%s"
+ value (decode-char 'ucs value)
+ line-breaking))
+ (setq attributes (delq '=>ucs-jis attributes))
+ )
+ (when (and (memq '->ucs attributes)
+ (setq value (get-char-attribute char '->ucs)))
+ (insert (format (if char-db-convert-obsolete-format
+ "(=>ucs\t\t. #x%04X)\t; %c%s"
+ "(->ucs\t\t. #x%04X)\t; %c%s")
+ value (decode-char 'ucs value)
+ line-breaking))
+ (setq attributes (delq '->ucs attributes))
+ )
+ (when (and (memq 'general-category attributes)
+ (setq value (get-char-attribute char 'general-category)))
+ (insert (format
+ "(general-category\t%s) ; %s%s"
+ (mapconcat (lambda (cell)
+ (format "%S" cell))
+ value " ")
+ (cond ((rassoc value unidata-normative-category-alist)
+ "Normative Category")
+ ((rassoc value unidata-informative-category-alist)
+ "Informative Category")
+ (t
+ "Unknown Category"))
+ line-breaking))
+ (setq attributes (delq 'general-category attributes))
+ )
+ (when (and (memq 'bidi-category attributes)
+ (setq value (get-char-attribute char 'bidi-category)))
+ (insert (format "(bidi-category\t. %S)%s"
+ value
+ line-breaking))
+ (setq attributes (delq 'bidi-category attributes))
+ )
+ (unless (or (not (memq 'mirrored attributes))
+ (eq (setq value (get-char-attribute char 'mirrored 'empty))
+ 'empty))
+ (insert (format "(mirrored\t\t. %S)%s"
+ value
+ line-breaking))
+ (setq attributes (delq 'mirrored attributes))
+ )
+ (cond
+ ((and (memq 'decimal-digit-value attributes)
+ (setq value (get-char-attribute char 'decimal-digit-value)))
+ (insert (format "(decimal-digit-value . %S)%s"
+ value
+ line-breaking))
+ (setq attributes (delq 'decimal-digit-value attributes))
+ (when (and (memq 'digit-value attributes)
+ (setq value (get-char-attribute char 'digit-value)))
+ (insert (format "(digit-value\t . %S)%s"