(char-db-turtle-write-ideograph-radical-char-data): Add autoload cookie.
[chise/tomoyo-tools.git] / concord-turtle-dump.el
1 ;;; concord-turtle-dump.el --- Character Database utility -*- coding: utf-8-er; -*-
2
3 ;; Copyright (C) 2017,2018 MORIOKA Tomohiko.
4
5 ;; Author: MORIOKA Tomohiko <tomo@kanji.zinbun.kyoto-u.ac.jp>
6 ;; Keywords: CHISE, Character Database, RDF, Turtle, ISO/IEC 10646, UCS, Unicode, MULE.
7
8 ;; This file is part of CHISET (CHISE/Turtle).
9
10 ;; XEmacs CHISE 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 ;; XEmacs CHISE is distributed in the hope that it will be useful,
16 ;; but 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 XEmacs CHISE; 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 'char-db-util)
28 (require 'chiset-common)
29 (require 'isd-turtle)
30 (require 'ideograph-util)
31
32 (setq est-coded-charset-priority-list
33   '(; =ucs
34     =mj
35     =adobe-japan1-0
36     =adobe-japan1-1
37     =adobe-japan1-2
38     =adobe-japan1-3
39     =adobe-japan1-4
40     =adobe-japan1-5
41     =adobe-japan1-6
42     =ucs@iso
43     =jis-x0208 =jis-x0208@1990
44     =jis-x0213-1
45     =jis-x0213-1@2000 =jis-x0213-1@2004
46     =jis-x0213-2
47     =jis-x0212
48     =gt
49     =hanyo-denshi/ks
50     =hanyo-denshi/tk
51     =ucs-itaiji-001
52     =ucs-itaiji-002
53     =ucs-itaiji-003
54     =ucs-itaiji-004
55     =ucs-itaiji-005
56     =ucs-itaiji-006
57     =ucs-itaiji-007
58     =ucs-itaiji-008
59     =ucs-itaiji-009
60     =ucs-itaiji-010
61     =ucs-itaiji-011
62     =ucs-itaiji-084
63     =ucs-var-001
64     =ucs-var-002
65     =ucs-var-003
66     =ucs-var-004
67     =ucs-var-005
68     =ucs-var-006
69     =ucs-var-008
70     =ucs-var-010
71     =cns11643-1 =cns11643-2 =cns11643-3
72     =cns11643-4 =cns11643-5 =cns11643-6 =cns11643-7
73     =gb2312
74     =big5-cdp
75     =ks-x1001
76     =gt-k
77     =ucs@unicode
78     =ucs@JP/hanazono
79     =gb12345
80     =ucs@cns
81     =ucs@gb
82     =zinbun-oracle =>zinbun-oracle
83     =daikanwa
84     =ruimoku-v6
85     =cbeta =jef-china3
86     =daikanwa/+2p
87     =+>ucs@iso =+>ucs@unicode
88     =+>ucs@jis
89     =+>ucs@cns
90     =+>ucs@ks
91     =+>ucs@jis/1990
92     =>mj
93     =>jis-x0208 =>jis-x0213-1
94     =>jis-x0208@1997
95     =>ucs@iwds-1
96     =>ucs@cognate
97     =>ucs@component
98     =>iwds-1
99     =>ucs@iso
100     =>ucs@unicode
101     =>ucs@jis =>ucs@cns =>ucs@ks
102     =>gt
103     =>gt-k
104     =>>ucs@iso =>>ucs@unicode
105     =>>ucs@jis =>>ucs@cns =>>ucs@ks
106     =>>gt-k
107     =>>hanyo-denshi/ks
108     ==mj
109     ==ucs@iso
110     ==ucs@unicode
111     ==adobe-japan1-0
112     ==adobe-japan1-1
113     ==adobe-japan1-2
114     ==adobe-japan1-3
115     ==adobe-japan1-4
116     ==adobe-japan1-5
117     ==adobe-japan1-6
118     ==ks-x1001
119     ==hanyo-denshi/ks
120     ==hanyo-denshi/tk
121     ==ucs@jis
122     ==gt
123     ==cns11643-1 ==cns11643-2 ==cns11643-3
124     ==cns11643-4 ==cns11643-5 ==cns11643-6 ==cns11643-7
125     ==jis-x0212
126     ==ucs@cns
127     ==koseki
128     ==daikanwa
129     ==gt-k
130     ==ucs@gb
131     ==ucs-itaiji-001
132     ==ucs-itaiji-002
133     ==ucs-itaiji-003
134     ==ucs-itaiji-005
135     ==ucs-var-002
136     ==ucs@JP/hanazono
137     ==daikanwa/+2p
138     =>>jis-x0208 =>>jis-x0213-1 =>>jis-x0213-2
139     =+>jis-x0208 =+>jis-x0213-1 =+>jis-x0213-2
140     =+>hanyo-denshi/jt
141     =+>jis-x0208@1978
142     =>>gt
143     =+>adobe-japan1
144     =>>adobe-japan1
145     =jis-x0208@1983 =jis-x0208@1978
146     =>ucs-itaiji-001
147     =>ucs-itaiji-002
148     =>ucs-itaiji-003
149     =>ucs-itaiji-004
150     =>ucs-itaiji-005
151     =>ucs-itaiji-006
152     =>ucs-itaiji-007
153     ==>ucs@bucs
154     =big5
155     =>cbeta
156     ===mj
157     ===ucs@iso
158     ===ucs@unicode
159     ===hanyo-denshi/ks
160     ===ks-x1001
161     ===gt
162     ===gt-k
163     ===ucs@ks
164     ===ucs@gb
165     =shinjigen
166     =shinjigen@rev
167     =shinjigen@1ed
168     =shinjigen/+p@rev
169     ==shinjigen
170     ==shinjigen@rev
171     ==daikanwa/+p
172     ==shinjigen@1ed
173     ===daikanwa/+p
174     =>daikanwa/ho
175     ===daikanwa/ho
176     ))
177
178 (defvar chise-turtle-feature-domains)
179 (setq chise-turtle-feature-domains
180       (append char-db-feature-domains
181               (let (dest domain)
182                 (dolist (feature (char-attribute-list))
183                   (setq feature (symbol-name feature))
184                   (when (string-match
185                          "\\(radical\\|strokes\\)@\\([^@*]+\\)\\(\\*\\|$\\)"
186                          feature)
187                     (setq domain (intern (match-string 2 feature)))
188                     (unless (memq domain dest)
189                       (setq dest (cons domain dest)))))
190                 (sort dest #'string<))))
191
192 (defun chise-turtle-uri-encode-feature-name (feature-name)
193   (cond
194    ((eq '->subsumptive feature-name)
195     ":subsume")
196    ((eq '<-denotational feature-name)
197     ":denotation-of")
198    ((eq '<-formed feature-name)
199     ":form-of")
200    ((eq '<-same feature-name)
201     "ideo:same-as")
202    ((eq '<-simplified feature-name)
203     "ideo:simplified-form-of")
204    ((eq '<-vulgar feature-name)
205     "ideo:vulgar-form-of")
206    ((eq '<-wrong feature-name)
207     "ideo:wrong-form-of")
208    ((eq '<-original feature-name)
209     "ideo:original-form-of")
210    ((eq '<-ancient feature-name)
211     "ideo:ancient-form-of")
212    ((eq '<-Small-Seal feature-name)
213     "ideo:Small-Seal-of")
214    ((eq '<-interchangeable feature-name)
215     "ideo:interchangeable-form-of")
216    ((eq '->interchangeable feature-name)
217     "ideo:interchangeable")
218    ((eq '->mistakable feature-name)
219     "ideo:mistakable")
220    ((eq 'hanyu-dazidian feature-name)
221     "ideo:hanyu-dazidian")
222    ((eq '*note feature-name)
223     "rdfs:comment")
224    ((eq '*instance feature-name)
225     ":instance")
226    (t
227     (concat ":" (chise-turtle-uri-encode-ccs-name feature-name)))))
228
229 (defun concord-turtle-encode-object (obj)
230   (cond ((characterp obj)
231          (chise-turtle-encode-char obj)
232          )
233         ((concord-object-p obj)
234          (let ((genre (est-object-genre obj))
235                (url-object (www-uri-encode-object obj)))
236            (format "<%s/%s/%s>"
237                    "http://www.chise.org/est/view"
238                    genre
239                    url-object)))))
240
241 (defun chise-split-feature-name (feature-name)
242   (let (base domain number meta)
243     (setq feature-name (symbol-name feature-name))
244     (if (string-match ".\\*." feature-name)
245         (setq meta (intern
246                     (format ":%s" (substring feature-name (1- (match-end 0)))))
247               feature-name (substring feature-name 0 (1+ (match-beginning 0)))))
248     (if (string-match "\\$_\\([0-9]+\\)$" feature-name)
249         (setq number (car (read-from-string (match-string 1 feature-name)))
250               feature-name (substring feature-name 0 (match-beginning 0))))
251     (if (string-match "@" feature-name)
252         (setq domain (car (read-from-string (substring feature-name (match-end 0))))
253               base (intern (substring feature-name 0 (match-beginning 0))))
254       (setq base (intern feature-name)))
255     (list base domain number meta)))
256
257 (defun chise-compose-feature-name (base domain number meta)
258   (let ((name (if domain
259                   (format "%s@%s" base domain)
260                 (symbol-name base))))
261     (if number
262         (setq name (format "%s$_%d" name number)))
263     (if meta
264         (setq name (format "%s*%s" name
265                            (substring (symbol-name meta) 1))))
266     (intern name)))
267
268 (defvar chise-feature-name-base-metadata-alist nil)
269
270 (defun chise-update-feature-name-base-metadata-alist ()
271   (interactive)
272   (let (base domain number metadata
273              bcell dcell ncell ret)
274     (setq chise-feature-name-base-metadata-alist nil)
275     (dolist (fname (sort (char-attribute-list)
276                          #'char-attribute-name<))
277       (setq ret (chise-split-feature-name fname)
278             base (car ret)
279             domain (nth 1 ret)
280             number (nth 2 ret)
281             metadata (nth 3 ret))
282       (when metadata
283         (if (setq bcell (assq base chise-feature-name-base-metadata-alist))
284             (if (setq dcell (assq domain (cdr bcell)))
285                 (if (setq ncell (assq number (cdr dcell)))
286                     (unless (memq metadata (cdr ncell))
287                       (setcdr ncell (nconc (cdr ncell)
288                                            (list metadata))))
289                   (setcdr dcell (cons (list number metadata)
290                                       (cdr dcell))))
291               (setcdr bcell (cons (list domain (list number metadata))
292                                   (cdr bcell))))
293           (setq chise-feature-name-base-metadata-alist
294                 (cons (list base (list domain (list number metadata)))
295                       chise-feature-name-base-metadata-alist))
296           )))))
297
298 (chise-update-feature-name-base-metadata-alist)
299
300 (defun chise-get-char-attribute-with-metadata (obj-spec feature-name-base domain)
301   (let ((feature-pair (assq (chise-compose-feature-name
302                              feature-name-base domain nil nil)
303                             obj-spec))
304         value
305         dcell
306         base-metadata metadata
307         ret m i rest dest)
308     (when feature-pair
309       (setq value (cdr feature-pair))
310       (cond
311        ((and (setq ret (assq feature-name-base
312                              chise-feature-name-base-metadata-alist))
313              (setq dcell (assq domain (cdr ret))))
314         (if (setq ret (assq nil (cdr dcell)))
315             (dolist (bmn (cdr ret))
316               (when (setq m (assq (chise-compose-feature-name
317                                    feature-name-base domain nil bmn)
318                                   obj-spec))
319                 (setq m (cdr m))
320                 (setq base-metadata
321                       (list* bmn m base-metadata)))))
322         (setq i 1
323               rest value)
324         (while (consp rest)
325           (setq dest
326                 (cons (cond
327                        ((setq ret (assq i (cdr dcell)))
328                         (setq metadata nil)
329                         (dolist (mn (cdr ret))
330                           (when (setq m (assq (chise-compose-feature-name
331                                                feature-name-base domain i mn)
332                                               obj-spec))
333                             (setq m (cdr m))
334                             (setq metadata (list* mn m metadata))))
335                         (if metadata
336                             (list* :value (car rest) metadata)
337                           (car rest))
338                         )
339                        (t (car rest)))
340                       dest))
341           (setq i (1+ i)
342                 rest (cdr rest)))
343         (list (nconc (nreverse dest) rest)
344               base-metadata)
345         )
346        (t (list value nil)))
347       )))
348           
349 (defun chise-split-ccs-name (ccs)
350   (cond ((eq ccs '=ucs)
351          '(ucs abstract-character nil)
352          )
353         ((eq ccs '=big5)
354          '(big5 abstract-character nil)
355          )
356         (t
357          (setq ccs (symbol-name ccs))
358          (let (ret)
359            (if (string-match "^\\(=[=+>]*\\)\\([^=>@*]+\\)@?" ccs)
360                (list (intern (match-string 2 ccs))
361                      (chise-decode-ccs-prefix (match-string 1 ccs))
362                      (if (string= (setq ret (substring ccs (match-end 0))) "")
363                          nil
364                        (intern ret))))
365            ))))
366
367 (defun chise-decode-ccs-prefix (ccs)
368   (or (cdr (assoc ccs '(("==>" . super-abstract-character)
369                         ("=>"  . abstract-character)
370                         ("=+>" . unified-glyph)
371                         ("="   . abstract-glyph)
372                         ("=>>" . detailed-glyph)
373                         ("=="  . abstract-glyph-form)
374                         ("===" . glyph-image))))
375       'character))
376
377 (defun chise-turtle-uri-split-ccs (uri-ccs)
378   (cond
379    ((string-match "^a2\\." uri-ccs)
380     (cons ":super-abstract-character"
381           (substring uri-ccs (match-end 0)))
382     )
383    ((string-match "^a\\." uri-ccs)
384     (cons ":abstract-character"
385           (substring uri-ccs (match-end 0)))
386     )
387    ((string-match "^o\\." uri-ccs)
388     (cons ":unified-glyph"
389           (substring uri-ccs (match-end 0)))
390     )
391    ((string-match "^rep\\." uri-ccs)
392     (cons ":abstract-glyph"
393           (substring uri-ccs (match-end 0)))
394     )
395    ((string-match "^g\\." uri-ccs)
396     (cons ":detailed-glyph"
397           (substring uri-ccs (match-end 0)))
398     )
399    ((string-match "^g2\\." uri-ccs)
400     (cons ":abstract-glyph-form"
401           (substring uri-ccs (match-end 0)))
402     )
403    ((string-match "^gi\\." uri-ccs)
404     (cons ":abstract-glyph-form"
405           (substring uri-ccs (match-end 0)))
406     )
407    ((string-match "^repi\\." uri-ccs)
408     (cons ":glyph-image"
409           (substring uri-ccs (match-end 0)))
410     )
411    (t (cons ":character" uri-ccs))))
412
413 (defun concord-turtle-insert-relation-feature (char name value line-breaking
414                                                     ccss readable)
415   (insert (format "    %s%s        "
416                   (chise-turtle-uri-encode-feature-name name)
417                   line-breaking))
418   (concord-turtle-insert-relations value readable)
419   (insert " ;")
420   )
421
422 (defun concord-turtle-insert-metadata (name value)
423   (let (col indent ret)
424     (insert (format "%-7s " name))
425     (cond
426      ((or (eq name :sources)
427           (eq name :denied))
428       (setq col (current-column))
429       (setq indent (make-string col ?\ ))
430       (insert (format "chisebib:%s"
431                       (chise-turtle-uri-encode-ccs-name (car value))))
432       (dolist (source (cdr value))
433         (insert (format " ,\n%schisebib:%s" indent
434                         (chise-turtle-uri-encode-ccs-name source))))
435       nil)
436      ((eq name :references)
437       (setq ret (car value))
438       (setq ret (plist-get (nth 1 ret) :ref))
439       (setq col (current-column))
440       (setq indent (make-string col ?\ ))
441       (insert (format "<%s>" ret))
442       (dolist (refspec (cdr value))
443         (setq ret (plist-get (nth 1 refspec) :ref))
444         (insert (format " ,\n%s<%s>" indent ret)))
445       nil)
446      (t
447       (insert (format "%S" value))
448       nil))))
449
450 (defun concord-turtle-insert-radical (radical-number)
451   (insert (format "        %3d ; # %c"
452                   radical-number
453                   (ideographic-radical radical-number)))
454   'with-separator)
455
456 (defun concord-turtle-insert-list (value &optional readable)
457   (let (lbs separator rest cell al cal key ret)
458     (insert "( ")
459     (setq lbs (concat "\n" (make-string (current-column) ?\ ))
460           separator nil)
461     (while (consp value)
462       (setq cell (car value))
463       (if (and (consp cell)
464                (consp (car cell))
465                (setq ret (condition-case nil
466                              (find-char cell)
467                            (error nil))))
468           (progn
469             (setq rest cell
470                   al nil
471                   cal nil)
472             (while rest
473               (setq key (car (car rest)))
474               (if (find-charset key)
475                   (setq cal (cons key cal))
476                 (setq al (cons key al)))
477               (setq rest (cdr rest)))
478             (if separator
479                 (insert lbs))
480             (concord-turtle-insert-object-features ret
481                                                  readable
482                                                  al
483                                                  nil 'for-sub-node)
484             (setq separator lbs))
485         (setq ret (prin1-to-string cell))
486         (if separator
487             (if (< (+ (current-column)
488                       (length ret)
489                       (length separator))
490                    76)
491                 (insert separator)
492               (insert lbs)))
493         (insert ret)
494         (setq separator " "))
495       (setq value (cdr value)))
496     (insert " ) ;")
497     'with-separator))
498
499 (defun concord-turtle-insert-source-list (value &optional readable)
500   (let (lbs separator rest cell al cal key ret)
501     (setq lbs (concat " ,\n" (make-string (current-column) ?\ ))
502           separator nil)
503     (while (consp value)
504       (setq cell (car value))
505       (if (and (consp cell)
506                (consp (car cell))
507                (setq ret (condition-case nil
508                              (find-char cell)
509                            (error nil))))
510           (progn
511             (setq rest cell
512                   al nil
513                   cal nil)
514             (while rest
515               (setq key (car (car rest)))
516               (if (find-charset key)
517                   (setq cal (cons key cal))
518                 (setq al (cons key al)))
519               (setq rest (cdr rest)))
520             (if separator
521                 (insert lbs))
522             (concord-turtle-insert-object-features ret
523                                                  readable
524                                                  al
525                                                  nil 'for-sub-node)
526             (setq separator lbs))
527         (setq ret (prin1-to-string cell))
528         (if separator
529             (if (< (+ (current-column)
530                       (length ret)
531                       (length separator))
532                    76)
533                 (insert separator)
534               (insert lbs)))
535         (if (string-match "=" ret)
536             (insert (format "%s:%s"
537                             (substring ret 0 (match-beginning 0))
538                             (substring ret (match-end 0))))
539           (insert (format "chisebib:%s" ret)))
540         (setq separator " , "))
541       (setq value (cdr value)))
542     (insert " ;")
543     'with-separator))
544
545 (defun concord-turtle-insert-object (cell &optional readable)
546   (if (integerp cell)
547       (setq cell (decode-char '=ucs cell)))
548   (cond
549    ((characterp cell)
550     (insert (format "%-20s" (chise-turtle-encode-char cell)))
551     nil)
552    ((concord-object-p cell)
553     (insert (format "%-20s" (concord-turtle-encode-object cell)))
554     nil)
555    (t
556     (concord-turtle-insert-char-ref cell '<-formed)
557     )))
558
559 (defun concord-turtle-insert-decomposition (value &optional readable)
560   (let ((lbs (concat "\n" (make-string (current-column) ?\ )))
561         base vs lb)
562     (if (characterp value)
563         (setq value (list value)))
564     (if (setq base (pop value))
565         (cond ((setq vs (pop value))
566                (insert "[ :base ")
567                (setq lb (concord-turtle-insert-object base readable))
568                (insert " ;")
569                (insert lbs)
570                (insert "  :vs   ")
571                (setq lb (concord-turtle-insert-object vs readable))
572                (insert lbs)
573                (insert "]")
574                nil)
575               (t
576                (setq lb (concord-turtle-insert-object base readable))
577                ))
578       )))
579
580 (defun concord-turtle-insert-relations (value &optional readable)
581   (let ((lbs (concat "\n" (make-string (current-column) ?\ )))
582         separator cell)
583     (if (characterp value)
584         (setq value (list value)))
585     (while (consp value)
586       (setq cell (car value))
587       ;; (if (integerp cell)
588       ;;     (setq cell (decode-char '=ucs cell)))
589       (if separator
590           (insert separator)
591         (setq separator (format " ,%s" lbs)))
592       ;; (cond
593       ;;  ((characterp cell)
594       ;;   (insert (format "%-20s" (chise-turtle-encode-char cell)))
595       ;;   )
596       ;;  ((concord-object-p cell)
597       ;;   (insert (format "%-20s" (concord-turtle-encode-object cell)))
598       ;;   )
599       ;;  (t
600       ;;   (concord-turtle-insert-char-ref cell '<-formed)))
601       (concord-turtle-insert-object cell readable)
602       (setq value (cdr value)))
603     nil))
604
605 (defun concord-turtle-insert-target-value (value feature-name-base &optional readable)
606   (cond ((eq feature-name-base 'ideographic-radical)
607          (concord-turtle-insert-radical value)
608          )
609         ((eq feature-name-base '=decomposition)
610          (concord-turtle-insert-decomposition value readable)
611          )
612         ((or (eq feature-name-base 'ideographic-combination)
613              (eq feature-name-base '*instance)
614              (eq feature-name-base '<-formed)
615              (string-match "^\\(->\\|<-\\)[^*]*$" (symbol-name feature-name-base)))
616          (concord-turtle-insert-relations value readable)
617          )
618         ((eq feature-name-base 'comment)
619          (insert (format "%S" value))
620          nil)
621         ((eq feature-name-base 'sources)
622          (concord-turtle-insert-source-list value readable)
623          )
624         ((consp value)
625          (concord-turtle-insert-list value readable)
626          )
627         ((or (symbolp value)
628              (char-or-string-p value))
629          (insert (format " %-14s" (format "\"%s\"" value)))
630          nil)
631         (t
632          (insert (format " %-14s" value))
633          nil)))
634
635 (defun concord-turtle-insert-feature-value (value metadata domain feature-name-base)
636   (let (indent0 indent rest mdname mdval lb)
637     (cond
638      ((or metadata domain)
639       (setq indent0 (make-string (current-column) ?\ ))
640       (insert "[ ")
641       (setq indent (make-string (current-column) ?\ ))
642       (when domain
643         (insert (format ":context domain:%-7s ;"
644                         (chise-turtle-uri-encode-ccs-name domain)))
645         (setq lb t))
646       (if lb
647           (insert (format "\n%s" indent)))
648       (insert "rdf:value ")
649       (setq lb (concord-turtle-insert-target-value value feature-name-base))
650       (setq rest metadata)
651       (while rest
652         (setq mdname (pop rest)
653               mdval  (pop rest))
654         (insert (format " ;\n%s" indent))
655         (setq lb (concord-turtle-insert-metadata mdname mdval)))
656       (if lb
657           (insert (format "\n%s] ;" indent0))
658         (insert " ] ;"))
659       'with-separator)
660      (t
661       (concord-turtle-insert-target-value value feature-name-base)
662       ))))
663
664 (defun concord-turtle-insert-char-ref (char-ref feature-name-base)
665   (let (indent0 indent rest mdname mdval lb last-sep)
666     (setq indent0 (make-string (current-column) ?\ ))
667     (insert "[ ")
668     (setq indent (make-string (current-column) ?\ ))
669     (setq rest char-ref)
670     (while rest
671       (setq mdname (pop rest)
672             mdval  (pop rest))
673       (if lb
674           (insert (format "%s\n%s"
675                           (if last-sep
676                               ""
677                             " ;")
678                           indent))
679         (setq lb t))
680       (setq last-sep
681             (cond ((eq mdname :value)
682                    (insert "rdf:value ")
683                    (concord-turtle-insert-target-value mdval feature-name-base)
684                    )
685                   ((eq mdname :note)
686                    (insert "rdfs:comment ")
687                    (insert (format "%S" mdval))
688                    )
689                   (t
690                    (concord-turtle-insert-metadata mdname mdval)))))
691     (if last-sep
692         (insert (format "\n%s]" indent0))
693       (insert " ]"))
694     nil))
695   
696 (defun concord-turtle-insert-object-features (object
697                                               &optional readable attributes column
698                                               for-sub-node)
699   (unless column
700     (setq column (current-column)))
701   (let ((est-coded-charset-priority-list est-coded-charset-priority-list)
702         (est-view-url-prefix "http://chise.org/est/view")
703         (obj-spec (sort (del-alist 'composition
704                                    (if (characterp object)
705                                        (char-attribute-alist object)
706                                      (concord-object-spec object)))
707                         (lambda (a b)
708                           (char-attribute-name< (car a)(car b)))))
709         feature-pair
710         id obj-id type domain
711         name value metadata
712         name-base name-domain
713         radical strokes
714         (line-breaking (concat "\n" (make-string column ?\ )))
715         line-separator
716         ret
717         skey
718         dest-ccss ; sources required-features
719         ccss eq-cpos-list
720         uri-ccs uri-cpos ccs-base children child-ccs-list col indent lb)
721     (setq line-separator line-breaking)
722     (setq id (concord-turtle-encode-object object))
723     (insert (format "%s" id))
724     (cond
725      ((characterp object)
726       (setq obj-id (file-name-nondirectory id))
727       (string-match ":" obj-id)
728       (setq uri-ccs (substring obj-id 0 (match-beginning 0))
729             uri-cpos (substring obj-id (match-end 0)))
730       (setq ret (assoc uri-ccs chise-turtle-ccs-prefix-alist))
731       (setq dest-ccss (list (cdr ret)))
732       (setq ret (chise-split-ccs-name (cdr ret)))
733       (setq ccs-base (car ret)
734             type (nth 1 ret)
735             domain (nth 2 ret))
736       (insert (format "%s    a chisegg:%s ;" line-separator type))
737       (insert (format "%s    :%s-of" line-breaking type))
738       (if (null domain)
739           (insert (format " %s:%s ;"
740                           (chise-turtle-uri-encode-ccs-name ccs-base) uri-cpos))
741         (insert " [ ")
742         (setq col (current-column))
743         (insert (format ":context domain:%-7s ;\n%srdf:value %5s:%-7s ] ;"
744                         (chise-turtle-uri-encode-ccs-name domain)
745                         (make-string col ?\ )
746                         (chise-turtle-uri-encode-ccs-name ccs-base) uri-cpos)))
747       ))
748     (when (setq feature-pair (assq '<-subsumptive obj-spec))
749       (when (or readable (not for-sub-node))
750         (when (setq value (cdr feature-pair))
751           (insert line-separator)
752           (concord-turtle-insert-relation-feature object '<-subsumptive value
753                                                   line-breaking
754                                                   ccss readable)
755           ))
756       (setq obj-spec (delete feature-pair obj-spec))
757       )
758     (when (and (setq feature-pair (assq '<-denotational obj-spec))
759                (setq value (cdr feature-pair)))
760       (insert line-separator)
761       (concord-turtle-insert-relation-feature object '<-denotational value
762                                             line-breaking
763                                             ccss readable)
764       (setq obj-spec (delete feature-pair obj-spec))
765       )
766     (when (and (setq feature-pair (assq '<-denotational@component obj-spec))
767                (setq value (cdr feature-pair)))
768       (insert line-separator)
769       (concord-turtle-insert-relation-feature
770        object '<-denotational@component value
771        line-breaking
772        ccss readable)
773       (setq obj-spec (delete feature-pair obj-spec))
774       )
775     (when (and (setq feature-pair (assq 'name obj-spec))
776                (setq value (cdr feature-pair)))
777       (insert (format "%s    " line-separator))
778       (insert (format
779                (if (> (+ (current-column) (length value)) 48)
780                    ":name %S ;"
781                  ":name                 %S ;")
782                value))
783       (setq obj-spec (delete feature-pair obj-spec))
784       )
785     (when (and (setq feature-pair (assq 'name* obj-spec))
786                (setq value (cdr feature-pair)))
787       (insert (format "%s    " line-separator))
788       (insert (format
789                (if (> (+ (current-column) (length value)) 48)
790                    "rdfs:label %S ;"
791                  "rdfs:label       %S ;")
792                value))
793       (setq obj-spec (delete feature-pair obj-spec))
794       )
795     (when (and (setq feature-pair (assq 'script obj-spec))
796                (setq value (cdr feature-pair)))
797       (insert (format "%s    :script\t\t  ( %s ) ;"
798                       line-separator
799                       (mapconcat (lambda (cell)
800                                    (format "script:%s" cell))
801                                  value " ")))
802       (setq obj-spec (delete feature-pair obj-spec))
803       )
804     (when (and (setq feature-pair (assq '=>ucs obj-spec))
805                (setq value (cdr feature-pair)))
806       (insert (format "%s    :to.ucs\t\t  a.ucs:0x%04X ; # %c"
807                       line-separator value (decode-char '=ucs value)))
808       (setq obj-spec (delete feature-pair obj-spec))
809       )
810     (when (and (setq feature-pair (assq '=>ucs* obj-spec))
811                (setq value (cdr feature-pair)))
812       (insert (format "%s    :to.canonical-ucs\ta.ucs:0x%04X ; # %c"
813                       line-separator value (decode-char '=ucs value)))
814       (setq obj-spec (delete feature-pair obj-spec))
815       )
816     (dolist (name '(=>ucs@gb =>ucs@big5))
817       (when (and (setq feature-pair (assq name obj-spec))
818                  (setq value (cdr feature-pair)))
819         (insert line-separator)
820         (insert (format " \"%-20s\":  #x%04X,\t\"_comment\": \"%c\"%s"
821                         name value
822                         (decode-char (intern
823                                       (concat "="
824                                               (substring
825                                                (symbol-name name) 2)))
826                                      value)
827                         line-breaking))
828         (setq obj-spec (delete feature-pair obj-spec))
829         ))
830     (when (and (setq feature-pair (assq 'general-category obj-spec))
831                (setq value (cdr feature-pair)))
832       (insert (format "%s    :general-category     \"%s\" ; # %s"
833                       line-separator value
834                       (cond ((rassoc value unidata-normative-category-alist)
835                              "Normative Category")
836                             ((rassoc value unidata-informative-category-alist)
837                              "Informative Category")
838                             (t
839                              "Unknown Category"))))
840       (setq obj-spec (delete feature-pair obj-spec))
841       )
842     (when (and (setq feature-pair (assq 'bidi-category obj-spec))
843                (setq value (cdr feature-pair)))
844       (insert (format "%s    :bidi-category        %S ;"
845                       line-separator
846                       value))
847       (setq obj-spec (delete feature-pair obj-spec))
848       )
849     (when (and (setq feature-pair (assq 'mirrored obj-spec))
850                (setq value (cdr feature-pair)))
851       (insert (format "%s    :mirrored             \"%s\" ;"
852                       line-separator
853                       value))
854       (setq obj-spec (delete feature-pair obj-spec))
855       )
856     (cond
857      ((and (and (setq feature-pair (assq 'decimal-digit-value obj-spec))
858                 (setq value (cdr feature-pair))))
859       (insert (format "%s    :decimal-digit-value  %2d ;"
860                       line-separator value))
861       (setq obj-spec (delete feature-pair obj-spec))
862       (when (and (setq feature-pair (assq 'digit-value obj-spec))
863                  (setq value (cdr feature-pair)))
864         (insert (format "%s    :digit-value\t  %2d ;"
865                         line-separator value))
866         (setq obj-spec (delete feature-pair obj-spec))
867         )
868       (when (and (setq feature-pair (assq 'numeric-value obj-spec))
869                  (setq value (cdr feature-pair)))
870         (insert (format "%s    :numeric-value\t  %2d ;"
871                         line-separator value))
872         (setq obj-spec (delete feature-pair obj-spec))
873         )
874       )
875      (t
876       (when (and (setq feature-pair (assq 'digit-value obj-spec))
877                  (setq value (cdr feature-pair)))
878         (insert line-separator)
879         (insert (format "%s    :digit-value\t  %2d ;"
880                         line-separator value))
881         (setq obj-spec (delete feature-pair obj-spec))
882         )
883       (when (and (setq feature-pair (assq 'numeric-value obj-spec))
884                  (setq value (cdr feature-pair)))
885         (insert line-separator)
886         (insert (format "%s    :numeric-value\t  %2d ;"
887                         line-separator value))
888         (setq obj-spec (delete feature-pair obj-spec))
889         )))
890     (when (and (setq feature-pair (assq 'iso-10646-comment obj-spec))
891                (setq value (cdr feature-pair)))
892       (insert line-separator)
893       (insert (format "{\"iso-10646-comment\":\t %S}%s"
894                       value
895                       line-breaking))
896       (setq obj-spec (delete feature-pair obj-spec))
897       )
898     (when (and (setq feature-pair (assq 'morohashi-daikanwa obj-spec))
899                (setq value (cdr feature-pair)))
900       (insert line-separator)
901       (insert (format "%s    :morohashi-daikanwa\t  %S ;"
902                       line-separator value))
903       (setq obj-spec (delete feature-pair obj-spec))
904       )
905     (setq radical nil
906           strokes nil)
907     (when (and (setq feature-pair (assq 'ideographic-radical obj-spec))
908                (setq value (cdr feature-pair)))
909       (setq radical value)
910       (insert (format "%s    ideo:radical         %3d ; # %c "
911                       line-separator
912                       radical
913                       (ideographic-radical radical)
914                       ))
915       (setq obj-spec (delete feature-pair obj-spec))
916       )
917     (when (and (setq feature-pair (assq 'shuowen-radical obj-spec))
918                (setq value (cdr feature-pair)))
919       (insert line-separator)
920       (insert (format " \"shuowen-radical\":\t %S,\t\"_comment\": \"%c\""
921                       value
922                       (shuowen-radical value)))
923       (setq obj-spec (delete feature-pair obj-spec))
924       )
925     (let (key)
926       (dolist (domain chise-turtle-feature-domains)
927         (setq key (intern (format "%s@%s" 'ideographic-radical domain)))
928         (when (and (setq feature-pair (assq key obj-spec))
929                    (setq value (cdr feature-pair)))
930           (setq radical value)
931           (insert (format "%s    ideo:radical           [ "
932                           line-separator))
933           (setq col (current-column))
934           (setq indent (make-string col ?\ ))
935           (insert (format ":context domain:%-7s ;\n%srdf:value "
936                           (chise-turtle-uri-encode-ccs-name domain)
937                           indent))
938           (setq lb (concord-turtle-insert-radical radical))
939           (setq obj-spec (delete feature-pair obj-spec))
940           (setq skey (intern (format "%s*sources" key)))
941           (when (and (setq feature-pair (assq skey obj-spec))
942                      (setq value (cdr feature-pair)))
943             (insert (format "\n%s" indent))
944             (setq lb (concord-turtle-insert-metadata :sources value))
945             ;; (insert (format " ;\n%s:sources (" indent))
946             ;; (setq col (current-column))
947             ;; (setq indent (make-string col ?\ ))
948             ;; (insert (format " chisebib:%s" (car value)))
949             ;; (dolist (cell (cdr value))
950             ;;   (insert (format "\n%s chisebib:%s" indent cell)))
951             ;; (insert " )")
952             )
953           (setq obj-spec (delete feature-pair obj-spec))
954           (if lb
955               (insert (format "\n%s] ;" (make-string (- col 2) ?\ )))
956             (insert " ] ;"))
957           )
958         (setq key (intern (format "%s@%s" 'ideographic-strokes domain)))
959         (when (and (setq feature-pair (assq key obj-spec))
960                    (setq value (cdr feature-pair)))
961           (setq strokes value)
962           (insert (format "%s    ideo:strokes           [ "
963                           line-separator))
964           (setq col (current-column))
965           (setq indent (make-string col ?\ ))
966           (insert (format ":context domain:%-7s ;\n%srdf:value %S"
967                           (chise-turtle-uri-encode-ccs-name domain)
968                           indent strokes))
969           (setq obj-spec (delete feature-pair obj-spec))
970           (setq skey (intern (format "%s*sources" key)))
971           (when (and (setq feature-pair (assq skey obj-spec))
972                      (setq value (cdr feature-pair)))
973             (insert (format " ;\n%s" indent))
974             (concord-turtle-insert-metadata :sources value)
975             ;; (insert (format " ;\n%s:sources (" indent))
976             ;; (setq col (current-column))
977             ;; (setq indent (make-string col ?\ ))
978             ;; (insert (format " chisebib:%s" (car value)))
979             ;; (dolist (cell (cdr value))
980             ;;   (insert (format "\n%s chisebib:%s" indent cell)))
981             ;; (insert " )")
982             )
983           (setq obj-spec (delete feature-pair obj-spec))
984           (insert " ] ;")
985           )
986         (setq key (intern (format "%s@%s" 'total-strokes domain)))
987         (when (and (setq feature-pair (assq key obj-spec))
988                    (setq value (cdr feature-pair)))
989           (insert (format "%s    ideo:total-strokes     [ "
990                           line-separator))
991           (setq col (current-column))
992           (insert (format ":context domain:%-7s ;\n%srdf:value %S"
993                           (chise-turtle-uri-encode-ccs-name domain)
994                           (make-string col ?\ )
995                           value))
996           (setq obj-spec (delete feature-pair obj-spec))
997           (setq skey (intern (format "%s*sources" key)))
998           (when (and (setq feature-pair (assq skey obj-spec))
999                      (setq value (cdr feature-pair)))
1000             (insert (format " ;\n%s" indent))
1001             (concord-turtle-insert-metadata :sources value)
1002             ;; (insert (format " ;\n%s:sources (" indent))
1003             ;; (setq col (current-column))
1004             ;; (setq indent (make-string col ?\ ))
1005             ;; (insert (format " chisebib:%s" (car value)))
1006             ;; (dolist (cell (cdr value))
1007             ;;   (insert (format "\n%s chisebib:%s" indent cell)))
1008             ;; (insert " )")
1009             )
1010           (setq obj-spec (delete feature-pair obj-spec))
1011           (insert " ] ;")
1012           )
1013         ;; (dolist (feature '(ideographic-radical
1014         ;;                    ideographic-strokes
1015         ;;                    total-strokes))
1016         ;;   (setq key (intern (format "%s@%s*sources" feature domain)))
1017         ;;   (when (and (setq feature-pair (assq key obj-spec))
1018         ;;              (setq value (cdr feature-pair)))
1019         ;;     (insert line-separator)
1020         ;;     (insert (format " \"%s\":%s" key line-breaking))
1021         ;;     (dolist (cell value)
1022         ;;       (insert (format " %s" cell)))
1023         ;;     (setq obj-spec (delete feature-pair obj-spec))
1024         ;;     ))
1025         ))
1026     (when (and (setq feature-pair (assq 'ideographic-strokes obj-spec))
1027                (setq value (cdr feature-pair)))
1028       (setq strokes value)
1029       (insert (format "%s    ideo:strokes          %2d ;"
1030                       line-separator strokes))
1031       (setq obj-spec (delete feature-pair obj-spec))
1032       )
1033     (when (and (setq feature-pair (assq 'total-strokes obj-spec))
1034                (setq value (cdr feature-pair)))
1035       (insert (format "%s    ideo:total-strokes    %2d ;"
1036                       line-separator value))
1037       (setq obj-spec (delete feature-pair obj-spec))
1038       )
1039     ;; (if (equal (get-char-attribute char '->titlecase)
1040     ;;            (get-char-attribute char '->uppercase))
1041     ;;     (setq attributes (delq '->titlecase attributes)))
1042     ;; (unless readable
1043     ;;   (dolist (ignored '(composition
1044     ;;                      ->denotational <-subsumptive ->ucs-unified
1045     ;;                      ->ideographic-component-forms))
1046     ;;     (setq attributes (delq ignored attributes))))
1047     (while obj-spec
1048       (setq name (car (car obj-spec)))
1049       (setq ret (chise-split-feature-name name))
1050       (setq name-base (car ret)
1051             name-domain (nth 1 ret))
1052       (when (setq value (chise-get-char-attribute-with-metadata
1053                          obj-spec name-base name-domain))
1054         (setq metadata (nth 1 value)
1055               value (car value))
1056         (cond ((setq ret (find-charset name))
1057                (setq name (charset-name ret))
1058                (when (not (memq name dest-ccss))
1059                  (setq dest-ccss (cons name dest-ccss))
1060                  (if (null value)
1061                      (insert (format "%s    :%-25s rdf:nil ;" line-separator
1062                                      (chise-turtle-uri-encode-ccs-name name)))
1063                    (setq ret (chise-turtle-format-ccs-code-point name value))
1064                    (insert (format "%s    :eq %-25s ; # %c" line-separator
1065                                    ret
1066                                    (char-db-decode-isolated-char name value)))
1067                    (setq eq-cpos-list (cons (list ret name value) eq-cpos-list))))
1068                (if (find-charset
1069                     (setq ret (if (eq name '=ucs)
1070                                   (if (< value #x10000)
1071                                       '==ucs@unicode
1072                                     '==ucs@iso)
1073                                 (intern (format "=%s" name)))))
1074                    (setq child-ccs-list (cons ret child-ccs-list)))
1075                )
1076               ;; ((and
1077               ;;   (not readable)
1078               ;;   (not (eq name '->subsumptive))
1079               ;;   (not (eq name '->uppercase))
1080               ;;   (not (eq name '->lowercase))
1081               ;;   (not (eq name '->titlecase))
1082               ;;   (not (eq name '->canonical))
1083               ;;   (not (eq name '->Bopomofo))
1084               ;;   (not (eq name '->mistakable))
1085               ;;   (not (eq name '->ideographic-variants))
1086               ;;   (or (eq name '<-identical)
1087               ;;       (eq name '<-uppercase)
1088               ;;       (eq name '<-lowercase)
1089               ;;       (eq name '<-titlecase)
1090               ;;       (eq name '<-canonical)
1091               ;;       (eq name '<-ideographic-variants)
1092               ;;       ;; (eq name '<-synonyms)
1093               ;;       (string-match "^<-synonyms" (symbol-name name))
1094               ;;       (eq name '<-mistakable)
1095               ;;       (when (string-match "^->" (symbol-name name))
1096               ;;         (cond
1097               ;;          ((string-match "^->fullwidth" (symbol-name name))
1098               ;;           (not (and (consp value)
1099               ;;                     (characterp (car value))
1100               ;;                     (encode-char
1101               ;;                      (car value) '=ucs 'defined-only)))
1102               ;;           )
1103               ;;          (t)))
1104               ;;       ))
1105               ;;  )
1106               ((eq name 'ideographic-structure)
1107                (insert (isd-turtle-format-char nil nil value (/ column 4)
1108                                                'isd 'without-head-char))
1109                (insert " ;")
1110                )
1111               ((eq name '->subsumptive)
1112                (insert line-separator)
1113                (concord-turtle-insert-relation-feature object name value
1114                                                        line-breaking
1115                                                        ccss readable)
1116                (setq children value)
1117                )
1118               ((eq name 'character)
1119                (insert line-separator)
1120                (concord-turtle-insert-relation-feature object name value
1121                                                        line-breaking
1122                                                        ccss readable)
1123                ;; (setq children value)
1124                )
1125               (t
1126                (insert (format "%s    %-20s "
1127                                line-separator
1128                                (chise-turtle-uri-encode-feature-name name-base)))
1129                (unless (concord-turtle-insert-feature-value
1130                         value metadata name-domain name-base)
1131                  (insert " ;"))
1132                )
1133               ))
1134       (setq obj-spec (cdr obj-spec)))
1135     (insert (format "%s    ." line-breaking))
1136     (dolist (eq-cpos (nreverse eq-cpos-list))
1137       (setq ret (chise-split-ccs-name (nth 1 eq-cpos)))
1138       (insert (format "%s    %s" line-breaking
1139                       (car eq-cpos)))
1140       (insert (format "%s        %s" line-breaking
1141                       (format ":%s-of" (nth 1 ret))))
1142       (if (null (nth 2 ret))
1143           (insert (format " %14s:%-7s ."
1144                           (chise-turtle-uri-encode-ccs-name (car ret))
1145                           (nth 1 (split-string (car eq-cpos) ":"))))
1146         (insert " [ ")
1147         (setq col (current-column))
1148         (insert (format ":context domain:%-7s ;\n%srdf:value %5s:%-7s ] ."
1149                         (chise-turtle-uri-encode-ccs-name (nth 2 ret))
1150                         (make-string col ?\ )
1151                         (chise-turtle-uri-encode-ccs-name (car ret))
1152                         (nth 1 (split-string (car eq-cpos) ":"))))))
1153     (setq est-coded-charset-priority-list
1154           (append est-coded-charset-priority-list
1155                   (nreverse child-ccs-list)))
1156     (when children
1157       (dolist (child children)
1158         (insert (format "%s    " line-breaking))
1159         (concord-turtle-insert-object-features child nil nil nil 'for-sub-node)))
1160     ))
1161
1162 (defun concord-turtle-insert-char-data (char &optional readable attributes)
1163   (save-restriction
1164     (narrow-to-region (point)(point))
1165     (concord-turtle-insert-object-features char readable attributes)
1166     (insert "\n\n")
1167     ))
1168
1169 (defun concord-turtle-insert-prefix ()
1170   (let (base-ccs-list ret)
1171     (insert "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
1172 @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
1173 @prefix : <http://rdf.chise.org/rdf/property/character/main/> .
1174 @prefix ideo: <http://rdf.chise.org/rdf/property/character/ideo/> .
1175 @prefix isd: <http://rdf.chise.org/rdf/property/character/isd/> .
1176 @prefix idc: <http://rdf.chise.org/rdf/type/character/idc/> .
1177 @prefix chisegg: <http://rdf.chise.org/rdf/type/character/ggg/> .
1178 @prefix domain: <http://rdf.chise.org/data/domain/> .
1179 @prefix script: <http://rdf.chise.org/data/script/> .
1180 @prefix ideocomb: <http://rdf.chise.org/data/character/ideo/combination/> .
1181 @prefix chisebib: <http://rdf.chise.org/data/bibliography/> .
1182 @prefix ruimoku: <http://www.chise.org/est/view/article@ruimoku/rep.id=/> .
1183 @prefix zob1959: <http://chise.zinbun.kyoto-u.ac.jp/koukotsu/rubbings/> .
1184
1185 ")
1186     (dolist (cell (sort chise-turtle-ccs-prefix-alist
1187                         (lambda (a b)
1188                           (char-attribute-name< (cdr a)(cdr b)))))
1189       (insert (format "@prefix %s: <%s/%s=> .\n"
1190                       (car cell)
1191                       "http://www.chise.org/est/view/character"
1192                       (www-uri-encode-feature-name (cdr cell))))
1193       (setq ret (chise-split-ccs-name (cdr cell)))
1194       (unless (memq (car ret) base-ccs-list)
1195         (setq base-ccs-list (cons (car ret) base-ccs-list))))
1196     (insert "\n")
1197     (dolist (base-ccs (nreverse base-ccs-list))
1198       (insert (format "@prefix %s: <%s/%s/code-point/> .\n"
1199                       (chise-turtle-uri-encode-ccs-name base-ccs)
1200                       "http://rdf.chise.org/data/ccs"
1201                       (www-uri-encode-feature-name base-ccs))))))
1202
1203 (defun concord-turtle-insert-ideograph-radical-char-data (radical)
1204   (let ((chars
1205          (sort (copy-list (aref ideograph-radical-chars-vector radical))
1206                (lambda (a b)
1207                  (ideograph-char< a b radical))))
1208         attributes)
1209     (dolist (name (char-attribute-list))
1210       (unless (memq name char-db-ignored-attributes)
1211         (push name attributes)
1212         ))
1213     (setq attributes (sort attributes #'char-attribute-name<))
1214     (aset ideograph-radical-chars-vector radical chars)
1215     (dolist (char chars)
1216       (when (not (some (lambda (atr)
1217                          (get-char-attribute char atr))
1218                        char-db-ignored-attributes))
1219         (concord-turtle-insert-char-data char nil attributes)))
1220     ))
1221
1222 ;;;###autoload
1223 (defun char-db-turtle-write-ideograph-radical-char-data (radical file)
1224   (if (file-directory-p file)
1225       (let ((name (char-feature (decode-char 'ucs (+ #x2EFF radical))
1226                                 'name)))
1227         (if (string-match "KANGXI RADICAL " name)
1228             (setq name (capitalize (substring name (match-end 0)))))
1229         (setq name (mapconcat (lambda (char)
1230                                 (if (eq char ? )
1231                                     "-"
1232                                   (char-to-string char))) name ""))
1233         (setq file
1234               (expand-file-name
1235                (format "Ideograph-R%03d-%s.ttl" radical name)
1236                file))))
1237   (let (chise-turtle-ccs-prefix-alist)
1238     (with-temp-buffer
1239       (concord-turtle-insert-ideograph-radical-char-data radical)
1240       (goto-char (point-min))
1241       (concord-turtle-insert-prefix)
1242       (insert "\n")
1243       (goto-char (point-min))
1244       (insert (format "# -*- coding: %s -*-\n"
1245                       char-db-file-coding-system))
1246       (let ((coding-system-for-write char-db-file-coding-system))
1247         (write-region (point-min)(point-max) file)))))
1248
1249
1250 ;;; @ end
1251 ;;;
1252
1253 (provide 'concord-turtle-dump)
1254
1255 ;;; concord-turtle-dump.el ends here