X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Futf-2000%2Fchar-db-util.el;h=1cf1792ff2df2090ba91259ddb2df8985f80b39f;hb=339a766b2b42d83e0315eaccd60ec7b2b7ee4d71;hp=2199bff15497b1259335dfb8b5f8bdc7eb1bc449;hpb=eeedc012fb3636a9a369b6342c6b8b313184ad34;p=chise%2Fxemacs-chise.git.1 diff --git a/lisp/utf-2000/char-db-util.el b/lisp/utf-2000/char-db-util.el index 2199bff..1cf1792 100644 --- a/lisp/utf-2000/char-db-util.el +++ b/lisp/utf-2000/char-db-util.el @@ -1,30 +1,32 @@ -;;; char-db-util.el --- Character Database utility +;;; char-db-util.el --- Character Database utility -*- coding: utf-8-er; -*- -;; Copyright (C) 1998,1999,2000,2001,2002,2003 MORIOKA Tomohiko. +;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +;; 2007, 2008, 2009, 2010, 2011, 2012, 2013 MORIOKA Tomohiko. ;; Author: MORIOKA Tomohiko -;; Keywords: UTF-2000, ISO/IEC 10646, Unicode, UCS-4, MULE. +;; Keywords: CHISE, Character Database, ISO/IEC 10646, UCS, Unicode, MULE. -;; This file is part of XEmacs UTF-2000. +;; This file is part of XEmacs CHISE. -;; XEmacs UTF-2000 is free software; you can redistribute it and/or +;; XEmacs CHISE is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 2, or (at ;; your option) any later version. -;; XEmacs UTF-2000 is distributed in the hope that it will be useful, +;; XEmacs CHISE is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs UTF-2000; see the file COPYING. If not, write to +;; along with XEmacs CHISE; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Code: -(require 'alist) +(require 'chise-subr) +(require 'ideograph-subr) (defconst unidata-normative-category-alist '(("Lu" letter uppercase) @@ -61,61 +63,46 @@ ("So" symbol other) )) -(defconst ideographic-radicals - (let ((v (make-vector 215 nil)) - (i 1)) - (while (< i 215) - (aset v i (decode-char '=ucs (+ #x2EFF i))) - (setq i (1+ i))) - v)) +(defconst shuowen-radicals + [?一 ?上 ?示 ?三 ?王 ?玉 ?玨 ?气 ?士 ?丨 ; 010 + ?屮 ?艸 ?蓐 ?茻 ?小 ?八 ?釆 ?半 ?牛 ?犛 ; 020 + ?告 ?口 ?凵 ?吅 ?哭 ?走 ?止 ?癶 ?步 ?此 ; 030 + ?正 ?是 ?辵 ?彳 ?廴 ?㢟 ?行 ?齒 ?牙 ?足 ; 040 + ?疋 ?品 ?龠 ?冊 ?㗊 ?舌 ?干 ?谷 ?只 ?㕯 ; 050 + ?句 ?丩 ?古 ?十 ?卅 ?言 ?誩 ?音 ?䇂 ?丵 ; 060 + ?菐 ?𠬞 ?𠬜 ?共 ?異 ?舁 ?𦥑 ?䢅 ?爨 ?革 ; 070 + ?鬲 ?䰜 ?爪 ?𠃨 ?鬥 ?又 ?𠂇 ?㕜 ?支 ?𦘒 ; 080 + ?聿 ?畫 ?隶 ?臤 ?臣 ?殳 ?殺 ?𠘧 ?寸 ?皮 ; 090 + ?㼱 ?攴 ?敎 ?卜 ?用 ?爻 ?㸚 ?𥄎 ?目 ?䀠 ; 100 + ?眉 ?盾 ?自 ?白 ?鼻 ?皕 ?習 ?羽 ?隹 ?奞 ; 110 + ?萑 ?𦫳 ?苜 ?羊 ?羴 ?瞿 ?雔 ?雥 ?鳥 ?烏 ; 120 + ?𠦒 ?冓 ?幺 ?𢆶 ?叀 ?玄 ?予 ?放 ?𠬪 ?𣦼 ; 130 + ?歺 ?死 ?冎 ?骨 ?肉 ?筋 ?刀 ?刃 ?㓞 ?丰 ; 140 + ?耒 ?𧢲 ?竹 ?箕 ?丌 ?左 ?工 ?㠭 ?巫 ?甘 ; 150 + ?曰 ?乃 ?丂 ?可 ?兮 ?号 ?亏 ?旨 ?喜 ?壴 ; 160 +; ?旨 ?曰 ?乃 ?丂 ?可 ?兮 ?号 ?亏 ?喜 ?壴 ; 160 + ?鼓 ?豈 ?豆 ?豊 ?豐 ?䖒 ?虍 ?虎 ?虤 ?皿 ; 170 + ?𠙴 ?去 ?血 ?丶 ?丹 ?青 ?井 ?皀 ?鬯 ?食 ; 180 + ?亼 ?會 ?倉 ?入 ?缶 ?矢 ?高 ?冂 ?𩫏 ?京 ; 190 + ?亯 ?𣆪 ?畗 ?㐭 ?嗇 ?來 ?麥 ?夊 ?舛 ?䑞 ; 200 + ?韋 ?弟 ?夂 ?久 ?桀 ?木 ?東 ?林 ?才 ?叒 ; 210 + ?之 ?帀 ?出 ?𣎵 ?生 ?乇 ?𠂹 ?𠌶 ?華 ?𥝌 ; 220 + ?稽 ?巢 ?桼 ?束 ?㯻 ?囗 ?員 ?貝 ?邑 ?𨛜 ; 230 + ?日 ?旦 ?倝 ?㫃 ?冥 ?晶 ?月 ?有 ?明 ?囧 ; 240 + ?夕 ?多 ?毌 ?𢎘 ?𣐺 ?卣 ?齊 ?朿 ?片 ?鼎 ; 250 + ?克 ?彔 ?禾 ?秝 ?黍 ?香 ?米 ?毇 ?臼 ?凶 ; 260 + ?𣎳 ?林 ?麻 ?尗 ?耑 ?韭 ?瓜 ?瓠 ?宀 ?宮 ; 270 + ?呂 ?穴 ?㝱 ?𤕫 ?冖 ?𠔼 ?冃 ?㒳 ?网 ?襾 ; 280 + ?巾 ?巿 ?帛 ?白 ?㡀 ?黹 ?人 ?𠤎 ?匕 ?从 ; 290 + ?比 ?北 ?丘 ?㐺 ?𡈼 ?重 ?臥 ?身 ?㐆 ?衣 ; 300 + ]) -(defvar char-db-ignored-attributes nil) +(defun shuowen-radical (number) + (aref shuowen-radicals (1- number))) -(defun char-attribute-name< (ka kb) - (cond - ((find-charset ka) - (cond - ((find-charset kb) - (cond - ((= (charset-dimension ka) - (charset-dimension kb)) - (cond ((= (charset-chars ka)(charset-chars kb)) - (if (charset-iso-final-char ka) - (cond - ((>= (charset-iso-final-char ka) ?@) - (if (and (charset-iso-final-char kb) - (>= (charset-iso-final-char kb) ?@)) - (< (charset-iso-final-char ka) - (charset-iso-final-char kb)) - t)) - (t - (if (charset-iso-final-char kb) - (if (>= (charset-iso-final-char kb) ?@) - nil - (< (charset-iso-final-char ka) - (charset-iso-final-char kb))) - t))) - (if (charset-iso-final-char kb) - nil - (< (charset-id ka)(charset-id kb))))) - ((<= (charset-chars ka)(charset-chars kb))))) - (t - (< (charset-dimension ka) - (charset-dimension kb)) - ))) - ((symbolp kb) - nil) - (t - t))) - ((find-charset kb) - t) - ((symbolp ka) - (cond ((symbolp kb) - (string< (symbol-name ka) - (symbol-name kb))) - (t))) - ((symbolp kb) - nil))) +(defvar char-db-file-coding-system 'utf-8-mcs-er) + +(defvar char-db-ignored-attributes '(ideographic-products)) (defvar char-db-coded-charset-priority-list '(ascii @@ -129,11 +116,19 @@ cyrillic-iso8859-5 greek-iso8859-7 thai-tis620 + =adobe-japan1-0 + =adobe-japan1-1 + =adobe-japan1-2 + =adobe-japan1-3 + =adobe-japan1-4 + =adobe-japan1-5 + =adobe-japan1-6 =jis-x0208 - japanese-jisx0208 + =jis-x0208@1978 + =jis-x0208@1983 japanese-jisx0212 - japanese-jisx0208-1978 chinese-gb2312 + =jis-x0208@1990 chinese-cns11643-1 chinese-cns11643-2 chinese-cns11643-3 @@ -141,21 +136,51 @@ chinese-cns11643-5 chinese-cns11643-6 chinese-cns11643-7 - =jis-x0213-1-2000 - =jis-x0213-2-2000 + =jis-x0213-1 + =jis-x0213-1@2000 + =jis-x0213-1@2004 + =jis-x0213-2 korean-ksc5601 chinese-isoir165 katakana-jisx0201 hebrew-iso8859-8 - =jis-x0208-1990 chinese-gb12345 latin-viscii ethiopic-ucs - =gt =big5-cdp + =hanyo-denshi/ja + =hanyo-denshi/jb + =hanyo-denshi/jc + =hanyo-denshi/jd + =hanyo-denshi/ft + =hanyo-denshi/ia + =hanyo-denshi/ib + =hanyo-denshi/hg + =hanyo-denshi/jt + =hanyo-denshi/ks + =gt =gt-k - ideograph-daikanwa-2 - ideograph-daikanwa + ==adobe-japan1-0 + ==adobe-japan1-1 + ==adobe-japan1-2 + ==adobe-japan1-3 + ==adobe-japan1-4 + ==adobe-japan1-5 + ==adobe-japan1-6 + ==jis-x0208 + ==jis-x0213-1 + ==jis-x0213-2 + ==hanyo-denshi/ja + ==hanyo-denshi/jb + ==hanyo-denshi/jc + ==hanyo-denshi/ft + ==hanyo-denshi/ib + ==hanyo-denshi/hg + ==hanyo-denshi/jt + ==hanyo-denshi/ks + =daikanwa + =daikanwa@rev2 + =daikanwa@rev1 =cbeta ideograph-hanziku-1 ideograph-hanziku-2 @@ -169,10 +194,110 @@ ideograph-hanziku-10 ideograph-hanziku-11 ideograph-hanziku-12 - =cbeta - =jef-china3 + ==gt + ==jis-x0208@1990 + ==ks-x1001 + ==gt-k + ;; =>>>adobe-japan1-0 + ;; =>>>adobe-japan1-1 + ;; =>>>adobe-japan1-2 + ;; =>>>adobe-japan1-3 + ;; =>>>adobe-japan1-4 + ;; =>>>adobe-japan1-5 + ;; =>>>adobe-japan1-6 + ;; =>>>jis-x0208 + ;; =>>>jis-x0213-1 + ;; =>>>jis-x0213-2 + ;; =>>>hanyo-denshi/ja + ;; =>>>hanyo-denshi/jb + ;; =>>>hanyo-denshi/jc + ;; =>>>hanyo-denshi/ft + ;; =>>>hanyo-denshi/ib + ;; =>>>hanyo-denshi/hg + ;; =>>>hanyo-denshi/jt + ;; =>>>hanyo-denshi/ks + ;; =>>>gt + =>>adobe-japan1-0 + =>>adobe-japan1-1 + =>>adobe-japan1-2 + =>>adobe-japan1-3 + =>>adobe-japan1-4 + =>>adobe-japan1-5 + =>>adobe-japan1-6 + =>>jis-x0208 + =>>jis-x0213-1 + =>>jis-x0213-1@2000 + =>>jis-x0213-1@2004 + =>>jis-x0213-2 + =>>jis-x0208@1978 + =>>hanyo-denshi/ft + =>>hanyo-denshi/jt + =>>hanyo-denshi/ks + =>>gt + =>>daikanwa + =+>jis-x0208 + =+>jis-x0213-1 + =+>jis-x0213-2 + =+>adobe-japan1-0 + =+>adobe-japan1-1 + =+>adobe-japan1-2 + =+>adobe-japan1-3 + =+>adobe-japan1-4 + =+>adobe-japan1-5 + =+>adobe-japan1-6 + =+>jis-x0208@1978 + =>jis-x0208 + =>jis-x0208@1997 + =>jis-x0213-1 + =>jis-x0213-1@2000 + =>jis-x0213-1@2004 + =>jis-x0213-2 + ==>ucs@bucs + =>ucs@iso + =>ucs@unicode + =>ucs@jis + =>ucs@cns + =>ucs@ks + =+>ucs@iso + =+>ucs@unicode + =+>ucs@jis + =+>ucs@jis/1990 + =+>ucs@cns + =+>ucs@ks + =>>ucs@iso + =>>ucs@unicode + =>>ucs@jis + =>>ucs@cns + =>>>ucs@iso + =>>>ucs@unicode + ==ucs@iso + ==ucs@unicode + =ucs@iso + =ucs@unicode + =ucs@cns + =>>big5-cdp + =>>gt-k + =+>gt + =>gt + =>big5-cdp + =>daikanwa + =>daikanwa/ho + =>cns11643-7 + =big5 =big5-eten - =big5)) + =>gt-k + =zinbun-oracle + =>zinbun-oracle + =ruimoku-v6 + =>>ruimoku-v6 + =jef-china3 + =shinjigen + =big5-cdp-var-3 + =big5-cdp-var-5)) + + +;;; @ char-db formatters +;;; (defun char-db-make-char-spec (char) (let (ret char-spec) @@ -187,23 +312,73 @@ (setq char-spec (cons (cons 'name* ret) char-spec)) )) ) + ((encode-char char '=adobe-japan1 'defined-only) + (setq char-spec nil) + (dolist (ccs (charset-list)) + (if (and (or (memq ccs + '(=adobe-japan1-0 + =adobe-japan1-1 + =adobe-japan1-2 + =adobe-japan1-3 + =adobe-japan1-4 + =adobe-japan1-5 + =adobe-japan1-6 + )) + ;; (eq (charset-property ccs 'iso-ir) 177) + (string-match "=ucs@" (symbol-name ccs)) + ) + (setq ccs (charset-name ccs)) + (null (assq ccs char-spec)) + (setq ret (encode-char char ccs 'defined-only))) + (setq char-spec (cons (cons ccs ret) char-spec)))) + ) + ((encode-char char '==adobe-japan1 'defined-only) + (setq char-spec nil) + (dolist (ccs (charset-list)) + (if (and (or (memq ccs + '(==adobe-japan1-0 + ==adobe-japan1-1 + ==adobe-japan1-2 + ==adobe-japan1-3 + ==adobe-japan1-4 + ==adobe-japan1-5 + ==adobe-japan1-6 + )) + ;; (eq (charset-property ccs 'iso-ir) 177) + (string-match "=ucs@" (symbol-name ccs)) + ) + (setq ccs (charset-name ccs)) + (null (assq ccs char-spec)) + (setq ret (encode-char char ccs 'defined-only))) + (setq char-spec (cons (cons ccs ret) char-spec)))) + ) ((setq ret (catch 'tag - (let ((rest char-db-coded-charset-priority-list)) + (let ((rest char-db-coded-charset-priority-list) + ccs) (while rest + (setq ccs (charset-name + (find-charset (car rest)))) (if (setq ret - (get-char-attribute char (car rest))) - (throw 'tag (cons (car rest) ret))) + (encode-char char ccs + 'defined-only)) + (throw 'tag (cons ccs ret))) (setq rest (cdr rest)))))) (setq char-spec (list ret)) (dolist (ccs (delq (car ret) (charset-list))) (if (and (or (charset-iso-final-char ccs) (memq ccs - '(ideograph-daikanwa - =daikanwa-rev2 + '(=daikanwa + =daikanwa@rev2 ;; =gt-k - ))) - (setq ret (get-char-attribute char ccs))) + =jis-x0208@1997 + )) + (eq (charset-property ccs 'iso-ir) 177) + ;; (string-match "=ucs@" (symbol-name ccs)) + ) + (setq ccs (charset-name ccs)) + (null (assq ccs char-spec)) + (setq ret (encode-char char ccs 'defined-only))) (setq char-spec (cons (cons ccs ret) char-spec)))) (if (null char-spec) (setq char-spec (split-char char))) @@ -213,15 +388,22 @@ ((setq ret (get-char-attribute char 'name*)) (setq char-spec (cons (cons 'name* ret) char-spec)) )) + ) + ((setq ret (get-char-attribute + char 'ideographic-combination)) + (setq char-spec + (cons (cons 'ideographic-combination ret) + char-spec)) )) char-spec) ((consp char) char)))) -(defun char-db-insert-char-spec (char &optional readable column) +(defun char-db-insert-char-spec (char &optional readable column + required-features) (unless column (setq column (current-column))) - (let (char-spec ret al cal key temp-char) + (let (char-spec temp-char) (setq char-spec (char-db-make-char-spec char)) (unless (or (characterp char) ; char (condition-case nil @@ -233,32 +415,11 @@ 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) - (if (get-char-attribute char key) - (setq cal (cons key cal))) - (setq al (cons key al)))) - (setq char-spec (cdr char-spec))) - (unless cal - (setq char-spec (char-db-make-char-spec char)) - (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) + (union (mapcar #'car char-spec) + required-features) + nil 'for-sub-node) (when temp-char ;; undefine temporary character ;; Current implementation is dirty. @@ -273,7 +434,8 @@ (let ((line-breaking (concat "\n" (make-string (1+ column) ?\ ))) name value - ret al cal key + ret al ; cal + key lbs cell rest separator) (insert "(") (while alist @@ -286,16 +448,19 @@ (error nil))) (progn (setq al nil - cal nil) + ;; cal nil + ) (while value (setq key (car (car value))) - (if (find-charset key) - (setq cal (cons key cal)) - (setq al (cons key al))) + ;; (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)) + (or al 'none) ; cal + nil 'for-sub-node)) (insert (prin1-to-string value))) (insert ")") (insert line-breaking)) @@ -313,18 +478,21 @@ (progn (setq rest cell al nil - cal nil) + ;; cal nil + ) (while rest (setq key (car (car rest))) - (if (find-charset key) - (setq cal (cons key cal)) - (setq al (cons key al))) + ;; (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) + al ; cal + nil 'for-sub-node) (setq separator lbs)) (if separator (insert separator)) @@ -367,7 +535,7 @@ (insert (format "%s%s\t%d ; %c%s" separator name value - (aref ideographic-radicals value) + (ideographic-radical value) line-breaking)) (setq separator "")) (t @@ -381,6 +549,8 @@ (setq ret (cond ((eq ccs 'arabic-iso8859-6) (decode-char ccs code-point)) + ;; ((eq ccs '=gt) + ;; (decode-builtin-char '==gt code-point)) ((and (memq ccs '(=gt-pj-1 =gt-pj-2 =gt-pj-3 @@ -393,7 +563,7 @@ =gt-pj-10 =gt-pj-11)) (setq ret (decode-char ccs code-point)) - (setq ret (get-char-attribute ret '=gt))) + (setq ret (encode-char ret '=gt 'defined-only))) (decode-builtin-char '=gt ret)) (t (decode-builtin-char ccs code-point)))) @@ -406,49 +576,226 @@ (defvar char-db-convert-obsolete-format t) -(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<))) +(defun char-db-insert-ccs-feature (name value line-breaking) + (cond + ((integerp value) + (insert + (format + (cond + ((memq name '(==shinjigen + =shinjigen + =shinjigen@1ed + =shinjigen@rev =shinjigen/+p@rev + =daikanwa/ho =>>daikanwa/ho =>daikanwa/ho)) + "(%-18s . %04d)\t; %c") + ((eq name '=shinjigen@1ed/24pr) + "(%-18s . %04d)\t; %c") + ((or (memq name '(==daikanwa + =daikanwa =>>daikanwa =>daikanwa + =daikanwa@rev1 =daikanwa@rev2 + =daikanwa/+p =>>daikanwa/+p + =daikanwa/+2p =>>daikanwa/+2p + =gt ==gt ; =>>>gt + =>>gt =+>gt =>gt + =gt-k ==gt-k =>>gt-k =>gt-k + =adobe-japan1-0 ==adobe-japan1-0 ; =>>>adobe-japan1-0 + =adobe-japan1-1 ==adobe-japan1-1 ; =>>>adobe-japan1-1 + =adobe-japan1-2 ==adobe-japan1-2 ; =>>>adobe-japan1-2 + =adobe-japan1-3 ==adobe-japan1-3 ; =>>>adobe-japan1-3 + =adobe-japan1-4 ==adobe-japan1-4 ; =>>>adobe-japan1-4 + =adobe-japan1-5 ==adobe-japan1-5 ; =>>>adobe-japan1-5 + =adobe-japan1-6 ==adobe-japan1-6 ; =>>>adobe-japan1-6 + =>>adobe-japan1-0 =+>adobe-japan1-0 + =>>adobe-japan1-1 =+>adobe-japan1-1 + =>>adobe-japan1-2 =+>adobe-japan1-2 + =>>adobe-japan1-3 =+>adobe-japan1-3 + =>>adobe-japan1-4 =+>adobe-japan1-4 + =>>adobe-japan1-5 =+>adobe-japan1-5 + =>>adobe-japan1-6 =+>adobe-japan1-6 + =cbeta =>>cbeta + =zinbun-oracle =>zinbun-oracle)) + ;; (string-match "^=adobe-" (symbol-name name)) + ) + "(%-18s . %05d)\t; %c") + ((memq name '(=hanyo-denshi/ks + ==hanyo-denshi/ks ; =>>>hanyo-denshi/ks + =>>hanyo-denshi/ks + =zihai mojikyo)) + "(%-18s . %06d)\t; %c") + ((>= (charset-dimension name) 2) + "(%-18s . #x%04X)\t; %c") + (t + "(%-18s . #x%02X)\t; %c")) + name + (if (= (charset-iso-graphic-plane name) 1) + (logior value + (cond ((= (charset-dimension name) 1) + #x80) + ((= (charset-dimension name) 2) + #x8080) + ((= (charset-dimension name) 3) + #x808080) + (t 0))) + value) + (char-db-decode-isolated-char name value))) + (if (and (= (charset-chars name) 94) + (= (charset-dimension name) 2)) + (insert (format " [%02d-%02d]" + (- (lsh value -8) 32) + (- (logand value 255) 32)))) + ) + (t + (insert (format "(%-18s . %s)" name value)) + )) + (insert line-breaking)) + +(defun char-db-insert-relation-feature (char name value line-breaking + ccss readable) + (insert (format "(%-18s%s " name line-breaking)) + (let ((lbs (concat "\n" (make-string (current-column) ?\ ))) + separator cell sources required-features + ret) + (while (consp value) + (setq cell (car value)) + (if (integerp cell) + (setq cell (decode-char '=ucs cell))) + (cond + ((eq name '->subsumptive) + (when (or (not (some (lambda (atr) + (get-char-attribute cell atr)) + char-db-ignored-attributes)) + (some (lambda (ccs) + (encode-char cell ccs 'defined-only)) + ccss)) + (if separator + (insert lbs)) + (let ((char-db-ignored-attributes + (cons '<-subsumptive + char-db-ignored-attributes))) + (insert-char-attributes cell readable nil nil 'for-sub-node)) + (setq separator lbs)) + ) + ((characterp cell) + (setq sources + (get-char-attribute + char (intern (format "%s*sources" name)))) + (setq required-features nil) + (dolist (source sources) + (cond + ((memq source '(JP + JP/Jouyou + shinjigen shinjigen@1ed shinjigen@rev)) + (setq required-features + (union required-features + '(=jis-x0208 + =jis-x0208@1990 + =jis-x0213-1@2000 + =jis-x0213-1@2004 + =jis-x0213-2 + =jis-x0212 + =jis-x0208@1983 + =jis-x0208@1978 + =shinjigen + =shinjigen@1ed + =shinjigen@rev + =shinjigen/+p@rev)))) + ((eq source 'CN) + (setq required-features + (union required-features + '(=gb2312 + =gb12345 + =iso-ir165))))) + (cond + ((find-charset (setq ret (intern (format "=%s" source)))) + (setq required-features + (cons ret required-features))) + (t (setq required-features + (cons source required-features))))) + (cond ((string-match "@JP" (symbol-name name)) + (setq required-features + (union required-features + '(=jis-x0208 + =jis-x0208@1990 + =jis-x0213-1-2000 + =jis-x0213-2-2000 + =jis-x0212 + =jis-x0208@1983 + =jis-x0208@1978)))) + ((string-match "@CN" (symbol-name name)) + (setq required-features + (union required-features + '(=gb2312 + =gb12345 + =iso-ir165))))) + (if separator + (insert lbs)) + (if readable + (insert (format "%S" cell)) + (char-db-insert-char-spec cell readable + nil + required-features)) + (setq separator lbs)) + ((consp cell) + (if separator + (insert lbs)) + (if (consp (car cell)) + (char-db-insert-char-spec cell readable) + (char-db-insert-char-reference cell readable)) + (setq separator lbs)) + (t + (if separator + (insert separator)) + (insert (prin1-to-string cell)) + (setq separator " "))) + (setq value (cdr value))) + (insert ")") + (insert line-breaking))) + +(defun insert-char-attributes (char &optional readable attributes column + for-sub-node) (unless column (setq column (current-column))) - (let (name value has-long-ccs-name rest + (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) + key al cal + dest-ccss ; sources required-features + ccss) + (let (atr-d) + (setq attributes + (sort (if attributes + (if (consp attributes) + (progn + (dolist (name attributes) + (unless (memq name char-db-ignored-attributes) + (if (find-charset name) + (push name ccss)) + (push name atr-d))) + atr-d)) + (dolist (name (char-attribute-list)) + (unless (memq name char-db-ignored-attributes) + (if (find-charset name) + (push name ccss)) + (push name atr-d))) + atr-d) + #'char-attribute-name<))) (insert "(") + (when (memq '<-subsumptive attributes) + (when (or readable (not for-sub-node)) + (when (setq value (get-char-attribute char '<-subsumptive)) + (char-db-insert-relation-feature char '<-subsumptive value + line-breaking + ccss readable))) + (setq attributes (delq '<-subsumptive attributes))) + (when (and (memq '<-denotational attributes) + (setq value (get-char-attribute char '<-denotational))) + (char-db-insert-relation-feature char '<-denotational value + line-breaking + ccss readable) + (setq attributes (delq '<-denotational attributes))) (when (and (memq 'name attributes) (setq value (get-char-attribute char 'name))) (insert (format @@ -482,14 +829,7 @@ name value (decode-char '=ucs value) line-breaking)) (setq attributes (delq name 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)) - ;; ) - (dolist (name '(=>ucs@gb =>ucs@cns =>ucs@jis)) + (dolist (name '(=>ucs@gb =>ucs@big5)) (when (and (memq name attributes) (setq value (get-char-attribute char name))) (insert (format "(%-18s . #x%04X)\t; %c%s" @@ -502,50 +842,21 @@ line-breaking)) (setq attributes (delq name attributes)) )) - (when (and (memq '=>ucs-gb attributes) - (setq value (get-char-attribute char '=>ucs-gb))) - (insert (format "(=>ucs@gb\t\t. #x%04X)\t; %c%s" - value (decode-char '=ucs@gb value) - line-breaking)) - (setq attributes (delq '=>ucs-gb attributes)) - ) - (when (and (memq '=>ucs-cns attributes) - (setq value (get-char-attribute char '=>ucs-cns))) - (insert (format "(=>ucs@cns\t\t. #x%04X)\t; %c%s" - value (decode-char '=ucs@cns value) - line-breaking)) - (setq attributes (delq '=>ucs-cns attributes)) - ) - (when (and (memq '=>ucs-big5 attributes) - (setq value (get-char-attribute char '=>ucs-big5))) - (insert (format "(=>ucs-big5\t\t. #x%04X)\t; %c%s" - value (decode-char 'ucs-big5 value) - line-breaking)) - (setq attributes (delq '=>ucs-big5 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@jis value) - line-breaking)) - (setq attributes (delq '=>ucs-jis attributes)) - ) - (when (and (memq '=>ucs-ks attributes) - (setq value (get-char-attribute char '=>ucs-ks))) - (insert (format "(=>ucs-ks\t\t. #x%04X)\t; %c%s" - value (decode-char 'ucs-ks value) - line-breaking)) - (setq attributes (delq '=>ucs-ks 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)) - ) + ;; (dolist (name '(=>daikanwa)) + ;; (when (and (memq name attributes) + ;; (setq value (get-char-attribute char name))) + ;; (insert + ;; (if (integerp value) + ;; (format "(%-18s . %05d)\t; %c%s" + ;; name value (decode-char '=daikanwa value) + ;; line-breaking) + ;; (format "(%-18s %s)\t; %c%s" + ;; name + ;; (mapconcat (function prin1-to-string) + ;; value " ") + ;; (char-representative-of-daikanwa char) + ;; line-breaking))) + ;; (setq attributes (delq name attributes)))) (when (and (memq 'general-category attributes) (setq value (get-char-attribute char 'general-category))) (insert (format @@ -635,10 +946,76 @@ (setq radical value) (insert (format "(ideographic-radical . %S)\t; %c%s" radical - (aref ideographic-radicals radical) + (ideographic-radical radical) line-breaking)) (setq attributes (delq 'ideographic-radical attributes)) ) + (when (and (memq 'shuowen-radical attributes) + (setq value (get-char-attribute char 'shuowen-radical))) + (insert (format "(shuowen-radical\t. %S)\t; %c%s" + value + (shuowen-radical value) + line-breaking)) + (setq attributes (delq 'shuowen-radical attributes)) + ) + (let (key) + (dolist (domain + (append + char-db-feature-domains + (let (dest domain) + (dolist (feature (char-attribute-list)) + (setq feature (symbol-name feature)) + (when (string-match + "\\(radical\\|strokes\\)@\\([^@*]+\\)\\(\\*\\|$\\)" + feature) + (setq domain (intern (match-string 2 feature))) + (unless (memq domain dest) + (setq dest (cons domain dest))))) + (sort dest #'string<)))) + (setq key (intern (format "%s@%s" 'ideographic-radical domain))) + (when (and (memq key attributes) + (setq value (get-char-attribute char key))) + (setq radical value) + (insert (format "(%s . %S)\t; %c%s" + key + radical + (ideographic-radical radical) + line-breaking)) + (setq attributes (delq key attributes)) + ) + (setq key (intern (format "%s@%s" 'ideographic-strokes domain))) + (when (and (memq key attributes) + (setq value (get-char-attribute char key))) + (setq strokes value) + (insert (format "(%s . %S)%s" + key + strokes + line-breaking)) + (setq attributes (delq key attributes)) + ) + (setq key (intern (format "%s@%s" 'total-strokes domain))) + (when (and (memq key attributes) + (setq value (get-char-attribute char key))) + (insert (format "(%s . %S)%s" + key + value + line-breaking)) + (setq attributes (delq key attributes)) + ) + (dolist (feature '(ideographic-radical + ideographic-strokes + total-strokes)) + (setq key (intern (format "%s@%s*sources" feature domain))) + (when (and (memq key attributes) + (setq value (get-char-attribute char key))) + (insert (format "(%s%s" key line-breaking)) + (dolist (cell value) + (insert (format " %s" cell))) + (insert ")") + (insert line-breaking) + (setq attributes (delq key attributes)) + )) + )) (when (and (memq 'ideographic-strokes attributes) (setq value (get-char-attribute char 'ideographic-strokes))) (setq strokes value) @@ -652,7 +1029,7 @@ (unless (eq value radical) (insert (format "(kangxi-radical\t . %S)\t; %c%s" value - (aref ideographic-radicals value) + (ideographic-radical value) line-breaking)) (or radical (setq radical value))) @@ -673,7 +1050,7 @@ (unless (eq value radical) (insert (format "(japanese-radical\t . %S)\t; %c%s" value - (aref ideographic-radicals value) + (ideographic-radical value) line-breaking)) (or radical (setq radical value))) @@ -693,7 +1070,7 @@ (setq value (get-char-attribute char 'cns-radical))) (insert (format "(cns-radical\t . %S)\t; %c%s" value - (aref ideographic-radicals value) + (ideographic-radical value) line-breaking)) (setq attributes (delq 'cns-radical attributes)) ) @@ -707,17 +1084,17 @@ (setq strokes value))) (setq attributes (delq 'cns-strokes attributes)) ) - (when (and (memq 'shinjigen-1-radical attributes) - (setq value (get-char-attribute char 'shinjigen-1-radical))) - (unless (eq value radical) - (insert (format "(shinjigen-1-radical . %S)\t; %c%s" - value - (aref ideographic-radicals value) - line-breaking)) - (or radical - (setq radical value))) - (setq attributes (delq 'shinjigen-1-radical attributes)) - ) + ;; (when (and (memq 'shinjigen-1-radical attributes) + ;; (setq value (get-char-attribute char 'shinjigen-1-radical))) + ;; (unless (eq value radical) + ;; (insert (format "(shinjigen-1-radical . %S)\t; %c%s" + ;; value + ;; (ideographic-radical value) + ;; line-breaking)) + ;; (or radical + ;; (setq radical value))) + ;; (setq attributes (delq 'shinjigen-1-radical attributes)) + ;; ) (when (and (memq 'ideographic- attributes) (setq value (get-char-attribute char 'ideographic-))) (insert "(ideographic- ") @@ -772,26 +1149,26 @@ line-breaking)) (setq attributes (delq '->ideograph attributes)) ) - (when (and (memq '->decomposition attributes) - (setq value (get-char-attribute char '->decomposition))) - (insert (format "(->decomposition\t%s)%s" - (mapconcat (lambda (code) - (cond ((symbolp code) - (symbol-name code)) - ((characterp code) - (if readable - (format "%S" code) - (format "#x%04X" - (char-int code)) - )) - ((integerp code) - (format "#x%04X" code)) - (t - (format "%s%S" line-breaking code)))) - value " ") - line-breaking)) - (setq attributes (delq '->decomposition attributes)) - ) + ;; (when (and (memq '->decomposition attributes) + ;; (setq value (get-char-attribute char '->decomposition))) + ;; (insert (format "(->decomposition\t%s)%s" + ;; (mapconcat (lambda (code) + ;; (cond ((symbolp code) + ;; (symbol-name code)) + ;; ((characterp code) + ;; (if readable + ;; (format "%S" code) + ;; (format "#x%04X" + ;; (char-int code)) + ;; )) + ;; ((integerp code) + ;; (format "#x%04X" code)) + ;; (t + ;; (format "%s%S" line-breaking code)))) + ;; value " ") + ;; line-breaking)) + ;; (setq attributes (delq '->decomposition attributes)) + ;; ) (if (equal (get-char-attribute char '->titlecase) (get-char-attribute char '->uppercase)) (setq attributes (delq '->titlecase attributes))) @@ -821,198 +1198,174 @@ (setq attributes (delq 'hanyu-dazidian-char attributes)) ) (unless readable - (when (memq '->ucs-variants attributes) - (setq attributes (delq '->ucs-variants attributes)) - ) - (when (memq 'composition attributes) - (setq attributes (delq 'composition attributes)) - )) - (setq rest ccs-attributes) - (while (and rest - (progn - (setq value (get-char-attribute char (car rest))) - (if value - (if (>= (length (symbol-name (car rest))) 19) - (progn - (setq has-long-ccs-name t) - nil) - t) - t))) - (setq rest (cdr rest))) + (dolist (ignored '(composition + ->denotational <-subsumptive ->ucs-unified + ->ideographic-component-forms)) + (setq attributes (delq ignored attributes)))) (while attributes (setq name (car attributes)) - (if (setq value (get-char-attribute char name)) - (cond ((string-match "^=>ucs@" (symbol-name name)) - (insert (format "(%-18s . #x%04X)\t; %c%s" - name value (decode-char '=ucs value) - line-breaking)) - ) - ((eq name 'jisx0208-1978/4X) - (insert (format "(%-18s . #x%04X)%s" - name value - line-breaking))) - ((or (eq name 'ideographic-structure) - (eq name 'ideographic-) - (string-match "^\\(->\\|<-\\)" (symbol-name name))) - (insert (format "(%-18s%s " name line-breaking)) - (setq lbs (concat "\n" (make-string (current-column) ?\ )) - separator nil) - (while (consp value) - (setq cell (car value)) - (if (integerp cell) - (setq cell (decode-char '=ucs cell))) - (cond ((characterp cell) - (if separator - (insert lbs)) - (if readable - (insert (format "%S" cell)) - (char-db-insert-char-spec cell readable)) - (setq separator lbs)) - ((consp cell) - (if separator - (insert lbs)) - (if (consp (car cell)) - (char-db-insert-char-spec cell readable) - (char-db-insert-char-reference cell readable)) - (setq separator lbs)) - (t - (if separator - (insert separator)) - (insert (prin1-to-string cell)) - (setq separator " "))) - (setq value (cdr value))) - (insert ")") - (insert line-breaking)) - ((memq name '(ideograph= - original-ideograph-of - ancient-ideograph-of - vulgar-ideograph-of - wrong-ideograph-of - simplified-ideograph-of - ideographic-variants - ideographic-different-form-of)) - (insert (format "(%-18s%s " name line-breaking)) - (setq lbs (concat "\n" (make-string (current-column) ?\ )) - separator nil) - (while (consp value) - (setq cell (car value)) - (if (and (consp cell) - (consp (car cell))) - (progn - (if separator - (insert lbs)) - (char-db-insert-alist cell readable) - (setq separator lbs)) - (if separator - (insert separator)) - (insert (prin1-to-string cell)) - (setq separator " ")) - (setq value (cdr value))) - (insert ")") - (insert line-breaking)) - ;; ((string-match "^->" (symbol-name name)) - ;; (insert - ;; (format "(%-18s %s)%s" - ;; name - ;; (mapconcat (lambda (code) - ;; (cond ((symbolp code) - ;; (symbol-name code)) - ;; ((integerp code) - ;; (format "#x%04X" code)) - ;; (t - ;; (format "%s%S" - ;; line-breaking code)))) - ;; value " ") - ;; line-breaking))) - ((consp value) - (insert (format "(%-18s " name)) - (setq lbs (concat "\n" (make-string (current-column) ?\ )) - separator nil) - (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 ")") + (unless (eq (setq value (get-char-attribute char name 'value-is-empty)) + 'value-is-empty) + (cond ((setq ret (find-charset name)) + (setq name (charset-name ret)) + (when (not (memq name dest-ccss)) + (setq dest-ccss (cons name dest-ccss)) + (char-db-insert-ccs-feature name value line-breaking)) + ) + ((string-match "^=>ucs@" (symbol-name name)) + (insert (format "(%-18s . #x%04X)\t; %c%s" + name value (decode-char '=ucs value) + line-breaking)) + ) + ((eq name 'jisx0208-1978/4X) + (insert (format "(%-18s . #x%04X)%s" + name value + line-breaking)) + ) + ((and + (not readable) + (not (eq name '->subsumptive)) + (not (eq name '->uppercase)) + (not (eq name '->lowercase)) + (not (eq name '->titlecase)) + (not (eq name '->canonical)) + (not (eq name '->Bopomofo)) + (not (eq name '->mistakable)) + (not (eq name '->ideographic-variants)) + (null (get-char-attribute + char (intern (format "%s*sources" name)))) + (not (string-match "\\*sources$" (symbol-name name))) + (null (get-char-attribute + char (intern (format "%s*note" name)))) + (not (string-match "\\*note$" (symbol-name name))) + (or (eq name '<-identical) + (eq name '<-uppercase) + (eq name '<-lowercase) + (eq name '<-titlecase) + (eq name '<-canonical) + (eq name '<-ideographic-variants) + ;; (eq name '<-synonyms) + (string-match "^<-synonyms" (symbol-name name)) + (eq name '<-mistakable) + (when (string-match "^->" (symbol-name name)) + (cond + ((string-match "^->fullwidth" (symbol-name name)) + (not (and (consp value) + (characterp (car value)) + (encode-char + (car value) '=ucs 'defined-only))) + ) + (t))) + )) + ) + ((or (eq name 'ideographic-structure) + (eq name 'ideographic-combination) + (eq name 'ideographic-) + (eq name '=decomposition) + (char-feature-base-name= '=decomposition name) + (char-feature-base-name= '=>decomposition name) + ;; (string-match "^=>*decomposition\\(@[^*]+\\)?$" + ;; (symbol-name name)) + (string-match "^\\(->\\|<-\\)[^*]*$" (symbol-name name)) + (string-match "^\\(->\\|<-\\)[^*]*\\*sources$" + (symbol-name name)) + ) + (char-db-insert-relation-feature char name value + line-breaking + ccss readable)) + ((memq name '(ideograph= + original-ideograph-of + ancient-ideograph-of + vulgar-ideograph-of + wrong-ideograph-of + ;; simplified-ideograph-of + ideographic-variants + ;; ideographic-different-form-of + )) + (insert (format "(%-18s%s " name line-breaking)) + (setq lbs (concat "\n" (make-string (current-column) ?\ )) + separator nil) + (while (consp value) + (setq cell (car value)) + (if (and (consp cell) + (consp (car cell))) + (progn + (if separator + (insert lbs)) + (char-db-insert-alist cell readable) + (setq separator lbs)) + (if separator + (insert separator)) + (insert (prin1-to-string cell)) + (setq separator " ")) + (setq value (cdr value))) + (insert ")") + (insert line-breaking)) + ((consp value) + (insert (format "(%-18s " name)) + (setq lbs (concat "\n" (make-string (current-column) ?\ )) + separator nil) + (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 + nil 'for-sub-node) + (setq separator lbs)) + (setq ret (prin1-to-string cell)) + (if separator + (if (< (+ (current-column) + (length ret) + (length separator)) + 76) + (insert separator) + (insert lbs))) + (insert ret) + (setq separator " ")) + (setq value (cdr value))) + (insert ")") + (insert line-breaking)) + (t + (insert (format "(%-18s" name)) + (setq ret (prin1-to-string value)) + (unless (< (+ (current-column) + (length ret) + 3) + 76) (insert line-breaking)) - (t - (insert (format "(%-18s . %S)%s" - name value - line-breaking))) - )) + (insert " . " ret ")" line-breaking) + ;; (insert (format "(%-18s . %S)%s" + ;; name value + ;; line-breaking)) + ) + )) (setq attributes (cdr attributes))) - (while ccs-attributes - (setq name (car ccs-attributes)) - (if (and (eq name (charset-name name)) - (setq value (get-char-attribute char name))) - (insert - (format - (cond ((memq name '(ideograph-daikanwa - =daikanwa-rev1 - =daikanwa-rev2 - =gt =gt-k =cbeta)) - (if has-long-ccs-name - "(%-26s . %05d)\t; %c%s" - "(%-18s . %05d)\t; %c%s")) - ((eq name 'mojikyo) - (if has-long-ccs-name - "(%-26s . %06d)\t; %c%s" - "(%-18s . %06d)\t; %c%s")) - ((>= (charset-dimension name) 2) - (if has-long-ccs-name - "(%-26s . #x%04X)\t; %c%s" - "(%-18s . #x%04X)\t; %c%s")) - (t - (if has-long-ccs-name - "(%-26s . #x%02X)\t; %c%s" - "(%-18s . #x%02X)\t; %c%s"))) - name - (if (= (charset-iso-graphic-plane name) 1) - (logior value - (cond ((= (charset-dimension name) 1) - #x80) - ((= (charset-dimension name) 2) - #x8080) - ((= (charset-dimension name) 3) - #x808080) - (t 0))) - value) - (char-db-decode-isolated-char name value) - line-breaking))) - (setq ccs-attributes (cdr ccs-attributes))) (insert ")"))) (defun insert-char-data (char &optional readable - attributes ccs-attributes) + attributes) (save-restriction (narrow-to-region (point)(point)) (insert "(define-char '") - (insert-char-attributes char readable - attributes ccs-attributes) + (insert-char-attributes char readable attributes) (insert ")\n") (goto-char (point-min)) (while (re-search-forward "[ \t]+$" nil t) @@ -1029,27 +1382,33 @@ )) (defun insert-char-data-with-variant (char &optional printable - no-ucs-variant + no-ucs-unified script excluded-script) (insert-char-data char printable) - (let ((variants (or (char-variants char) - (let ((ucs (get-char-attribute char '->ucs))) - (if ucs - (delete char (char-variants (int-char ucs))))))) - variant vs) + (let ((variants (char-variants char)) + rest + variant vs ret) (setq variants (sort variants #'<)) - (while variants - (setq variant (car variants)) - (if (and (or (null script) - (null (setq vs (get-char-attribute variant 'script))) - (memq script vs)) - (or (null excluded-script) - (null (setq vs (get-char-attribute variant 'script))) - (not (memq excluded-script vs)))) - (or (and no-ucs-variant (get-char-attribute variant '=ucs)) - (insert-char-data variant printable))) - (setq variants (cdr variants)) - ))) + (setq rest variants) + (setq variants (cons char variants)) + (while rest + (setq variant (car rest)) + (unless (get-char-attribute variant '<-subsumptive) + (if (and (or (null script) + (null (setq vs (get-char-attribute variant 'script))) + (memq script vs)) + (or (null excluded-script) + (null (setq vs (get-char-attribute variant 'script))) + (not (memq excluded-script vs)))) + (unless (and no-ucs-unified (get-char-attribute variant '=ucs)) + (insert-char-data variant printable) + (if (setq ret (char-variants variant)) + (while ret + (or (memq (car ret) variants) + ;; (get-char-attribute (car ret) '<-subsumptive) + (setq rest (nconc rest (list (car ret))))) + (setq ret (cdr ret))))))) + (setq rest (cdr rest))))) (defun insert-char-range-data (min max &optional script excluded-script) (let ((code min) @@ -1057,14 +1416,16 @@ (while (<= code max) (setq char (decode-char '=ucs code)) (if (encode-char char '=ucs 'defined-only) - (insert-char-data-with-variant char nil 'no-ucs-variant + (insert-char-data-with-variant char nil 'no-ucs-unified script excluded-script)) (setq code (1+ code))))) (defun write-char-range-data-to-file (min max file &optional script excluded-script) - (let ((coding-system-for-write 'utf-8)) + (let ((coding-system-for-write char-db-file-coding-system)) (with-temp-buffer + (insert (format ";; -*- coding: %s -*-\n" + char-db-file-coding-system)) (insert-char-range-data min max script excluded-script) (write-region (point-min)(point-max) file)))) @@ -1105,6 +1466,10 @@ what-character-original-window-configuration) (signal (car err) (cdr err))))))) + +;;; @ end +;;; + (provide 'char-db-util) ;;; char-db-util.el ends here