Sync up with the current environment.
[chise/isd.git] / isd-turtle.el
1 ;;; isd-turtle.el --- Utility to dump ideographic-structure as Turtle files
2
3 ;; Copyright (C) 2017, 2018 MORIOKA Tomohiko
4
5 ;; Author: MORIOKA Tomohiko <tomo@kanji.zinbun.kyoto-u.ac.jp>
6 ;; Keywords: Ideographic Structures (漢字構造、解字), IDS, CHISE, RDF, Turtle
7
8 ;; This file is a part of CHISE-ISD (Ideographic Structure Database).
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 'cwiki-common)
28
29 (defvar isd-url-prefix "http://rdf.chise.org/data/")
30
31 (setq est-coded-charset-priority-list
32   '(; =ucs
33     =mj
34     =adobe-japan1-0
35     =adobe-japan1-1
36     =adobe-japan1-2
37     =adobe-japan1-3
38     =adobe-japan1-4
39     =adobe-japan1-5
40     =adobe-japan1-6
41     =ucs@iso
42     =jis-x0208 =jis-x0208@1990
43     =jis-x0213-1
44     =jis-x0213-1@2000 =jis-x0213-1@2004
45     =jis-x0213-2
46     =jis-x0212
47     =gt
48     =hanyo-denshi/ks
49     =hanyo-denshi/tk
50     =ucs-itaiji-001
51     =ucs-itaiji-002
52     =ucs-itaiji-003
53     =ucs-itaiji-004
54     =ucs-itaiji-005
55     =ucs-itaiji-006
56     =ucs-itaiji-007
57     =ucs-itaiji-008
58     =ucs-itaiji-009
59     =ucs-itaiji-010
60     =ucs-itaiji-084
61     =ucs-var-001
62     =ucs-var-002
63     =ucs-var-003
64     =ucs-var-004
65     =ucs-var-005
66     =cns11643-1 =cns11643-2 =cns11643-3
67     =cns11643-4 =cns11643-5 =cns11643-6 =cns11643-7
68     =gb2312
69     =big5-cdp
70     =ks-x1001
71     =gt-k
72     =ucs@unicode
73     =ucs@JP/hanazono
74     =gb12345
75     =ucs@cns
76     =ucs@gb
77     =zinbun-oracle =>zinbun-oracle
78     =daikanwa
79     =ruimoku-v6
80     =cbeta =jef-china3
81     =daikanwa/+2p
82     =+>ucs@iso =+>ucs@unicode
83     =+>ucs@jis
84     =+>ucs@cns
85     =+>ucs@ks
86     =+>ucs@jis/1990
87     =>mj
88     =>jis-x0208 =>jis-x0213-1
89     =>jis-x0208@1997
90     =>ucs@iwds-1
91     =>ucs@cognate
92     =>ucs@component
93     =>iwds-1
94     =>ucs@iso
95     =>ucs@unicode
96     =>ucs@jis =>ucs@cns =>ucs@ks
97     =>gt
98     =>gt-k
99     =>>ucs@iso =>>ucs@unicode
100     =>>ucs@jis =>>ucs@cns =>>ucs@ks
101     =>>gt-k
102     =>>hanyo-denshi/ks
103     ==mj
104     ==ucs@iso
105     ==ucs@unicode
106     ==adobe-japan1-0
107     ==adobe-japan1-1
108     ==adobe-japan1-2
109     ==adobe-japan1-3
110     ==adobe-japan1-4
111     ==adobe-japan1-5
112     ==adobe-japan1-6
113     ==ks-x1001
114     ==hanyo-denshi/ks
115     ==hanyo-denshi/tk
116     ==ucs@jis
117     ==gt
118     ==cns11643-1 ==cns11643-2 ==cns11643-3
119     ==cns11643-4 ==cns11643-5 ==cns11643-6 ==cns11643-7
120     ==jis-x0212
121     ==ucs@cns
122     ==koseki
123     ==daikanwa
124     ==gt-k
125     ==ucs@gb
126     ==ucs-itaiji-003
127     ==ucs@JP/hanazono
128     ==daikanwa/+2p
129     =>>jis-x0208 =>>jis-x0213-1 =>>jis-x0213-2
130     =+>jis-x0208 =+>jis-x0213-1 =+>jis-x0213-2
131     =+>hanyo-denshi/jt
132     =+>jis-x0208@1978
133     =>>gt
134     =+>adobe-japan1
135     =>>adobe-japan1
136     =jis-x0208@1983 =jis-x0208@1978
137     =>ucs-itaiji-001
138     =>ucs-itaiji-002
139     =>ucs-itaiji-003
140     =>ucs-itaiji-004
141     =>ucs-itaiji-005
142     =>ucs-itaiji-006
143     =>ucs-itaiji-007
144     ==>ucs@bucs
145     =big5
146     =>cbeta
147     ===mj
148     ===ucs@iso
149     ===ucs@unicode
150     ===hanyo-denshi/ks
151     ===ks-x1001
152     ===gt
153     ===gt-k
154     ===ucs@ks
155     ===ucs@gb
156     =shinjigen
157     =shinjigen@rev
158     =shinjigen@1ed
159     =shinjigen/+p@rev
160     ==shinjigen
161     ==shinjigen@rev
162     ==daikanwa/+p
163     ==shinjigen@1ed
164     ===daikanwa/+p
165     =>daikanwa/ho
166     ===daikanwa/ho
167     ))
168
169 ;; (defvar isd-turtle-ccs-list nil)
170 (defvar chise-turtle-ccs-prefix-alist nil)
171
172 (defun charset-code-point-format-spec (ccs)
173   (cond ((memq ccs '(=ucs))
174          "0x%04X")
175         (t
176          (let ((ccs-name (symbol-name ccs)))
177            (cond
178             ((string-match
179               "\\(shinjigen\\|daikanwa/ho\\|=>iwds-1\\)"
180               ccs-name)
181              "%04d")
182             ((string-match
183               "\\(gt\\|daikanwa\\|adobe-japan1\\|cbeta\\|zinbun-oracle\\|hng\\)"
184               ccs-name)
185              "%05d")
186             ((string-match "\\(hanyo-denshi/ks\\|koseki\\|mj\\)" ccs-name)
187              "%06d")
188             ((string-match "hanyo-denshi/tk" ccs-name)
189              "%08d")
190             (t
191              "0x%X"))))))
192
193 ;; (defun isd-turtle-uri-encode-feature-name (feature-name)
194 ;;   (cond
195 ;;    ((eq '=ucs feature-name)
196 ;;     "a.ucs")
197 ;;    ((eq '==>ucs@bucs feature-name)
198 ;;     "bucs")
199 ;;    (t
200 ;;     (mapconcat (lambda (c)
201 ;;                  (if (eq c ?@)
202 ;;                      "_"
203 ;;                    (char-to-string c)))
204 ;;                (www-uri-encode-feature-name feature-name)
205 ;;                ""))))
206 (defun chise-turtle-uri-encode-ccs-name (feature-name)
207   (cond
208    ((eq '=ucs feature-name)
209     "a.ucs")
210    ((eq '=big5 feature-name)
211     "a.big5")
212    ((eq '==>ucs@bucs feature-name)
213     "bucs")
214    (t
215     (mapconcat (lambda (c)
216                  (cond
217                   ((eq c ?@)
218                    "_")
219                   ((eq c ?+)
220                    "._.")
221                   ((eq c ?=)
222                    ".:.")
223                   (t
224                    (char-to-string c))))
225                (www-uri-encode-feature-name feature-name)
226                ""))))
227
228 ;; (defun isd-turtle-format-ccs-code-point (ccs code-point)
229 ;;   (unless (memq ccs isd-turtle-ccs-list)
230 ;;     (setq isd-turtle-ccs-list (cons ccs isd-turtle-ccs-list)))
231 ;;   (format "%s:%s"
232 ;;           (isd-turtle-uri-encode-feature-name ccs)
233 ;;           (format (charset-code-point-format-spec ccs)
234 ;;                   code-point)))
235 (defun chise-turtle-format-ccs-code-point (ccs code-point)
236   (let ((ccs-uri (chise-turtle-uri-encode-ccs-name ccs)))
237     (unless (assoc ccs-uri chise-turtle-ccs-prefix-alist)
238       (setq chise-turtle-ccs-prefix-alist
239             (cons (cons ccs-uri ccs)
240                   chise-turtle-ccs-prefix-alist)))
241     (format "%s:%s"
242             ccs-uri
243             (format (charset-code-point-format-spec ccs)
244                     code-point))))
245
246 (defun isd-turtle-encode-char (object)
247   (let ((ccs-list est-coded-charset-priority-list)
248         ccs ret)
249     (if (setq ret (encode-char object '=ucs))
250         (chise-turtle-format-ccs-code-point '=ucs ret)
251       (while (and ccs-list
252                   (setq ccs (pop ccs-list))
253                   (not (setq ret (encode-char object ccs 'defined-only)))))
254       (cond (ret
255              (chise-turtle-format-ccs-code-point ccs ret)
256              )
257             ((and (setq ccs (car (split-char object)))
258                   (setq ret (encode-char object ccs)))
259              (chise-turtle-format-ccs-code-point ccs ret)
260              )
261             (t
262              (format (if est-hide-cgi-mode
263                          "system-char-id=0x%X"
264                        "system-char-id:0x%X")
265                      (encode-char object 'system-char-id))
266              )))))
267
268 (defun isd-turtle-format-component (component separator level prefix)
269   (cond ((characterp component)
270          (format "%s %c # %c"
271                  (isd-turtle-encode-char component)
272                  separator
273                  component)
274          )
275         ((consp component)
276          (let ((ret (find-char component)))
277            (cond (ret
278                   (format "%s %c # %c"
279                           (isd-turtle-encode-char ret) separator ret))
280                  ((setq ret (assq 'ideographic-structure component))
281                   (if (eq separator ?\;)
282                       (format "%s ;"
283                               (isd-turtle-format-char nil nil (cdr ret) (1+ level)
284                                                       prefix))
285                     (isd-turtle-format-char nil nil (cdr ret) (1+ level)
286                                             prefix))))))))
287
288 (defun isd-turtle-format-char (ccs code-point &optional ids-list level
289                                    prefix without-head-char)
290   (unless level
291     (setq level 0))
292   (unless prefix
293     (setq prefix ""))
294   (let ((indent (make-string (* level 4) ?\ ))
295         char
296         idc idc-str
297         p1 p2 p3
298         c1 c2 c3
299         ret)
300     (unless ids-list
301       (if (and ccs code-point
302                (setq char (decode-char ccs code-point)))
303           (setq ids-list (get-char-attribute char 'ideographic-structure))))
304     (setq idc (car ids-list))
305     (setq c1 (nth 1 ids-list)
306           c2 (nth 2 ids-list)
307           c3 (nth 3 ids-list))
308     (if (char-ref-p idc)
309         (setq idc (plist-get idc :char)))
310     (if (and (consp idc)
311              (setq ret (find-char idc)))
312         (setq idc ret))
313     (if (and (consp c1)
314              (setq ret (find-char c1)))
315         (setq c1 ret))
316     (if (and (consp c2)
317              (setq ret (find-char c2)))
318         (setq c2 ret))
319     (if (and (consp c3)
320              (setq ret (find-char c3)))
321         (setq c3 ret))
322     (cond
323      ((eq idc ?\u2FF0) ; ⿰
324       (setq p1 'left
325             p2 'right)
326       )
327      ((eq idc ?⿱)
328       (setq p1 'above
329             p2 'below)
330       )
331      ((eq idc ?⿲)
332       (setq p1 'left
333             p2 'middle
334             p3 'right)
335       )
336      ((eq idc ?⿳)
337       (setq p1 'above
338             p2 'middle
339             p3 'below)
340       )
341      ((memq idc '(?⿴ ?⿵ ?⿶ ?⿷ ?⿸ ?⿹ ?⿺))
342       (setq p1 'surround
343             p2 'filling)
344       )
345      ((eq idc ?⿻)
346       (setq p1 'underlying
347             p2 'overlaying)
348       )
349      ((and idc (eq (encode-char idc '=ucs-itaiji-001) #x2FF6))
350       (setq idc-str "SLR")
351       (setq p1 'surround
352             p2 'filling)
353       )
354      ((and idc (eq (encode-char idc '=>iwds-1) 305))
355       (setq idc-str "⿱・⿸")
356       (setq p1 'above
357             p2 'below)
358       )
359      ((and idc (eq (encode-char idc '=>ucs@component) #x2FF5))
360       (setq idc-str "⿱・⿵")
361       (setq p1 'above
362             p2 'below)
363       ))
364     (cond
365      (p3
366       (format "%s
367 %s    %s:structure [ a idc:%s ;
368 %s        %s:%-8s %s
369 %s        %s:%-8s %s
370 %s        %s:%-8s %s
371 %s    ]%s"
372               (if without-head-char
373                   ""
374                 (if (and ccs code-point)
375                     (format "%s   # %c"
376                             (chise-turtle-format-ccs-code-point ccs code-point)
377                             char)
378                   "["))
379               indent prefix (or idc-str (char-to-string idc))
380               indent prefix p1 (isd-turtle-format-component c1 ?\; (1+ level) prefix)
381               indent prefix p2 (isd-turtle-format-component c2 ?\; (1+ level) prefix)
382               indent prefix p3 (isd-turtle-format-component c3 ?\  (1+ level) prefix)
383               indent
384               (if without-head-char
385                   ""
386                 (if (null char)
387                     (format "\n%s]"
388                             indent)
389                   "")))
390       )
391      (idc
392       (format "%s
393 %s    %s:structure [ a idc:%s ;
394 %s        %s:%-8s %s
395 %s        %s:%-8s %s
396 %s    ]%s"
397               (if without-head-char
398                   ""
399                 (if (and ccs code-point)
400                     (format "%s   # %c"
401                             (chise-turtle-format-ccs-code-point ccs code-point)
402                             char)
403                   "["))
404               indent prefix (or idc-str (char-to-string idc))
405               indent prefix p1 (isd-turtle-format-component c1 ?\; (1+ level) prefix)
406               indent prefix p2 (isd-turtle-format-component c2 ?\  (1+ level) prefix)
407               indent
408               (if without-head-char
409                   ""
410                 (if (null char)
411                     (format "\n%s]"
412                             indent)
413                   "")))))
414     ))
415
416 (defun isd-turtle-insert-char (ccs code-point)
417   (let ((ret (isd-turtle-format-char ccs code-point)))
418     (when ret
419       (insert ret)
420       (insert " .\n"))))
421
422 (defun isd-turtle-insert-ccs-ranges (ccs &rest ranges)
423   (let (range code max-code)
424     (while ranges
425       (setq range (car ranges))
426       (cond ((consp range)
427              (setq code (car range)
428                    max-code (cdr range))
429              (while (<= code max-code)
430                (isd-turtle-insert-char ccs code)
431                (setq code (1+ code)))
432              )
433             ((integerp range)
434              (isd-turtle-insert-char ccs range)
435              )
436             (t (error 'wrong-type-argument range)))
437       (setq ranges (cdr ranges)))))
438
439 (defun isd-turtle-dump-range (file path func &rest args)
440   (with-temp-buffer
441     (let ((coding-system-for-write 'utf-8-mcs-er)
442           ;; isd-turtle-ccs-list
443           chise-turtle-ccs-prefix-alist)
444       (if (file-directory-p path)
445           (setq path (expand-file-name file path)))
446       (apply func args)
447       (goto-char (point-min))
448       ;; (dolist (ccs (sort isd-turtle-ccs-list
449       ;;                    #'char-attribute-name<))
450       ;;   (insert (format "@prefix %s: <%s%s=> .\n"
451       ;;                   (isd-turtle-uri-encode-feature-name ccs)
452       ;;                   "http://www.chise.org/est/view/character/"
453       ;;                   (www-uri-encode-feature-name ccs))))
454       (dolist (cell (sort chise-turtle-ccs-prefix-alist
455                           (lambda (a b)
456                             (char-attribute-name< (cdr a)(cdr b)))))
457         (insert (format "@prefix %s: <%s/%s=> .\n"
458                         (car cell)
459                         "http://www.chise.org/est/view/character"
460                         (www-uri-encode-feature-name (cdr cell)))))
461       (insert "\n")
462       (goto-char (point-min))
463       (insert "# -*- coding: utf-8-mcs-er -*-\n")
464       (insert "@prefix : <http://rdf.chise.org/rdf/property/character/isd/> .
465 @prefix idc: <http://rdf.chise.org/rdf/type/character/idc/> .\n")
466       (write-region (point-min)(point-max) path))))
467
468 ;;;###autoload
469 (defun isd-turtle-dump-ucs-basic (filename)
470   (interactive "Fdump ISD-UCS-Basic : ")
471   (isd-turtle-dump-range "ISD-UCS-Basic.ttl" filename
472                          #'isd-turtle-insert-ccs-ranges
473                          '=ucs '(#x4E00 . #x9FA5)))
474
475 ;;;###autoload
476 (defun isd-turtle-dump-ucs-ext-a (filename)
477   (interactive "Fdump ISD-UCS-Ext-A : ")
478   (isd-turtle-dump-range "ISD-UCS-Ext-A.ttl" filename
479                          #'isd-turtle-insert-ccs-ranges
480                          '=ucs '(#x3400 . #x4DB5) #xFA1F #xFA23))
481
482 ;;;###autoload
483 (defun isd-turtle-dump-ucs-ext-b-1 (filename)
484   (interactive "Fdump IDS-UCS-Ext-B-1 : ")
485   (isd-turtle-dump-range "ISD-UCS-Ext-B-1.ttl" filename
486                          #'isd-turtle-insert-ccs-ranges
487                          'ucs '(#x20000 . #x21FFF)))
488
489 ;;;###autoload
490 (defun isd-turtle-dump-ucs-ext-b-2 (filename)
491   (interactive "Fdump IDS-UCS-Ext-B-2 : ")
492   (isd-turtle-dump-range "ISD-UCS-Ext-B-2.ttl" filename
493                          #'isd-turtle-insert-ccs-ranges
494                          'ucs '(#x22000 . #x23FFF)))
495
496 ;;;###autoload
497 (defun isd-turtle-dump-ucs-ext-b-3 (filename)
498   (interactive "Fdump IDS-UCS-Ext-B-3 : ")
499   (isd-turtle-dump-range "ISD-UCS-Ext-B-3.ttl" filename
500                          #'isd-turtle-insert-ccs-ranges
501                          'ucs '(#x24000 . #x25FFF)))
502
503 ;;;###autoload
504 (defun isd-turtle-dump-ucs-ext-b-4 (filename)
505   (interactive "Fdump IDS-UCS-Ext-B-4 : ")
506   (isd-turtle-dump-range "ISD-UCS-Ext-B-4.ttl" filename
507                          #'isd-turtle-insert-ccs-ranges
508                          'ucs '(#x26000 . #x27FFF)))
509
510 ;;;###autoload
511 (defun isd-turtle-dump-ucs-ext-b-5 (filename)
512   (interactive "Fdump IDS-UCS-Ext-B-5 : ")
513   (isd-turtle-dump-range "ISD-UCS-Ext-B-5.ttl" filename
514                          #'isd-turtle-insert-ccs-ranges
515                          'ucs '(#x28000 . #x29FFF)))
516
517 ;;;###autoload
518 (defun isd-turtle-dump-ucs-ext-b-6 (filename)
519   (interactive "Fdump IDS-UCS-Ext-B-6 : ")
520   (isd-turtle-dump-range "ISD-UCS-Ext-B-6.ttl" filename
521                          #'isd-turtle-insert-ccs-ranges
522                          'ucs '(#x2A000 . #x2A6D6)))
523
524 ;;;###autoload
525 (defun isd-turtle-dump-ucs-ext-c (filename)
526   (interactive "Fdump IDS-UCS-Ext-C : ")
527   (isd-turtle-dump-range "ISD-UCS-Ext-C.ttl" filename
528                          #'isd-turtle-insert-ccs-ranges
529                          'ucs '(#x2A700 . #x2B734)))
530
531 ;;;###autoload
532 (defun isd-turtle-dump-ucs-ext-d (filename)
533   (interactive "Fdump IDS-UCS-Ext-D : ")
534   (isd-turtle-dump-range "ISD-UCS-Ext-D.ttl" filename
535                          #'isd-turtle-insert-ccs-ranges
536                          'ucs '(#x2B740 . #x2B81D)))
537
538 ;;;###autoload
539 (defun isd-turtle-dump-ucs-ext-e (filename)
540   (interactive "Fdump IDS-UCS-Ext-E : ")
541   (isd-turtle-dump-range "ISD-UCS-Ext-E.ttl" filename
542                          #'isd-turtle-insert-ccs-ranges
543                          'ucs '(#x2B820 . #x2CEA1)))
544
545 ;;;###autoload
546 (defun isd-turtle-dump-mj-0 (filename)
547   (interactive "Fdump ISD-MJ-0 : ")
548   (isd-turtle-dump-range "ISD-MJ-0.ttl" filename
549                          #'isd-turtle-insert-ccs-ranges
550                          '=mj '(1 . 9999)))
551
552 ;;;###autoload
553 (defun isd-turtle-dump-mj-1 (filename)
554   (interactive "Fdump ISD-MJ-1 : ")
555   (isd-turtle-dump-range "ISD-MJ-1.ttl" filename
556                          #'isd-turtle-insert-ccs-ranges
557                          '=mj '(10000 . 19999)))
558
559 ;;;###autoload
560 (defun isd-turtle-dump-mj-2 (filename)
561   (interactive "Fdump ISD-MJ-2 : ")
562   (isd-turtle-dump-range "ISD-MJ-2.ttl" filename
563                          #'isd-turtle-insert-ccs-ranges
564                          '=mj '(20000 . 29999)))
565
566 ;;;###autoload
567 (defun isd-turtle-dump-mj-3 (filename)
568   (interactive "Fdump ISD-MJ-3 : ")
569   (isd-turtle-dump-range "ISD-MJ-3.ttl" filename
570                          #'isd-turtle-insert-ccs-ranges
571                          '=mj '(30000 . 39999)))
572
573 ;;;###autoload
574 (defun isd-turtle-dump-mj-4 (filename)
575   (interactive "Fdump ISD-MJ-4 : ")
576   (isd-turtle-dump-range "ISD-MJ-4.ttl" filename
577                          #'isd-turtle-insert-ccs-ranges
578                          '=mj '(40000 . 49999)))
579
580 ;;;###autoload
581 (defun isd-turtle-dump-mj-5 (filename)
582   (interactive "Fdump ISD-MJ-5 : ")
583   (isd-turtle-dump-range "ISD-MJ-5.ttl" filename
584                          #'isd-turtle-insert-ccs-ranges
585                          '=mj '(50000 . 59999)))
586
587 ;;;###autoload
588 (defun isd-turtle-dump-mj-6 (filename)
589   (interactive "Fdump ISD-MJ-6 : ")
590   (isd-turtle-dump-range "ISD-MJ-6.ttl" filename
591                          #'isd-turtle-insert-ccs-ranges
592                          '=mj '(60000 . 69999)))
593
594 ;;;###autoload
595 (defun isd-turtle-dump-all (directory)
596   (interactive "DISD directory : ")
597   (isd-turtle-dump-ucs-basic directory)
598   (isd-turtle-dump-ucs-ext-a directory)
599   (isd-turtle-dump-ucs-ext-b-1 directory)
600   (isd-turtle-dump-ucs-ext-b-2 directory)
601   (isd-turtle-dump-ucs-ext-b-3 directory)
602   (isd-turtle-dump-ucs-ext-b-4 directory)
603   (isd-turtle-dump-ucs-ext-b-5 directory)
604   (isd-turtle-dump-ucs-ext-b-6 directory)
605   (isd-turtle-dump-ucs-ext-c directory)
606   (isd-turtle-dump-ucs-ext-d directory)
607   (isd-turtle-dump-ucs-ext-e directory)
608   (isd-turtle-dump-mj-0 directory)
609   (isd-turtle-dump-mj-1 directory)
610   (isd-turtle-dump-mj-2 directory)
611   (isd-turtle-dump-mj-3 directory)
612   (isd-turtle-dump-mj-4 directory)
613   (isd-turtle-dump-mj-5 directory)
614   (isd-turtle-dump-mj-6 directory)
615   )
616
617
618 ;;; @ End.
619 ;;;
620
621 (provide 'isd-turtle)
622
623 ;;; isd-turtle.el ends here