(ids-read-buffer): Add setting for C[1-7]-HHHH.
[chise/ids.git] / ids-read.el
1 ;;; ids-read.el --- Reader for IDS-* files
2
3 ;; Copyright (C) 2002,2003 MORIOKA Tomohiko
4
5 ;; Author: MORIOKA Tomohiko <tomo@kanji.zinbun.kyoto-u.ac.jp>
6 ;; Keywords: IDS, IDC, Ideographs, UCS, Unicode
7
8 ;; This file is a part of IDS.
9
10 ;; This program is free software; you can redistribute it and/or
11 ;; modify it under the terms of the GNU General Public License as
12 ;; published by the Free Software Foundation; either version 2, or (at
13 ;; your option) any later version.
14
15 ;; This program is distributed in the hope that it will be useful, but
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 ;; General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with this program; see the file COPYING.  If not, write to
22 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;;; Code:
26
27 (require 'ids)
28
29 ;;;###autoload
30 (defun ids-read-buffer (buffer &optional simplify soft)
31   (interactive "bBuffer = \nP")
32   (save-excursion
33     (set-buffer buffer)
34     (goto-char (point-min))
35     (let (line chs ids code char structure)
36       (while (not (eobp))
37         (unless (looking-at ";")
38           (setq line
39                 (split-string
40                  (buffer-substring (point-at-bol)(point-at-eol))
41                  "\t"))
42           (setq chs (car line)
43                 ids (nth 2 line))
44           (setq char
45                 (cond
46                  ((string-match "U[-+]\\([0-9A-F]+\\)" chs)
47                   (decode-char 'ucs
48                                (string-to-int (match-string 1 chs) 16)))
49                  ((string-match "J90-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\)"
50                                 chs)
51                   (decode-char 'japanese-jisx0208-1990
52                                (string-to-int (match-string 1 chs) 16)))
53                  ((string-match
54                    "C\\([1-7]\\)-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\)"
55                    chs)
56                   (decode-char
57                    (intern
58                     (concat "chinese-cns11643-" (match-string 1 chs)))
59                    (string-to-int (match-string 2 chs) 16)))
60                  ((string-match "CDP-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\)"
61                                 chs)
62                   (decode-char '=big5-cdp
63                                (string-to-int (match-string 1 chs) 16)))
64                  ((string-match
65                    "HZK\\([0-9][0-9]\\)-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\)"
66                    chs)
67                   (decode-char (intern
68                                 (format "=hanziku-%d"
69                                         (string-to-int (match-string 1))))
70                                (string-to-int (match-string 2 chs) 16)))
71                  ((string-match "M-\\([0-9]+\\)'" chs)
72                   (setq code (string-to-int (match-string 1 chs)))
73                   (map-char-attribute
74                    (lambda (key val)
75                      (if (and (eq (car val) code)
76                               (eq (nth 1 val) 1)
77                               (null (nthcdr 2 val)))
78                          key))
79                    'morohashi-daikanwa))
80                  ((string-match "M-\\([0-9]+\\)\"" chs)
81                   (setq code (string-to-int (match-string 1 chs)))
82                   (map-char-attribute
83                    (lambda (key val)
84                      (if (and (eq (car val) code)
85                               (eq (nth 1 val) 2)
86                               (null (nthcdr 2 val)))
87                          key))
88                    'morohashi-daikanwa))
89                  ((string-match "M-\\([0-9]+\\)" chs)
90                   (decode-char 'ideograph-daikanwa
91                                (string-to-int (match-string 1 chs))))
92                  ((string-match "MH-\\([0-9]+\\)" chs)
93                   (setq code (string-to-int (match-string 1 chs)))
94                   (map-char-attribute
95                    (lambda (key val)
96                      (if (and (eq (car val) 'ho)
97                               (eq (nth 1 val) code)
98                               (null (nthcdr 2 val)))
99                          key))
100                    'morohashi-daikanwa))
101                  ((string-match "CB\\([0-9]+\\)" chs)
102                   (decode-char 'ideograph-cbeta
103                                (string-to-int (match-string 1 chs))))
104                  ))
105           (when (and char
106                      (or (not soft)
107                          (null
108                           (get-char-attribute char 'ideographic-structure)))
109                      (>= (length ids) 3)
110                      (not (string-match "\\?" ids))
111                      (consp (setq structure (ids-parse-string ids simplify))))
112             (put-char-attribute char
113                                 'ideographic-structure
114                                 (cdr (car structure))))
115           )
116         (forward-line)
117         ))))
118
119 ;;;###autoload
120 (defun ids-read-file (file &optional simplify soft)
121   (interactive "fIDS file = \nP")
122   (with-temp-buffer
123     (insert-file-contents file)
124     (ids-read-buffer (current-buffer) simplify soft)))
125
126
127 ;;; @ End.
128 ;;;
129
130 (provide 'ids-read)
131
132 ;;; ids-read.el ends here