(est-format-unit): Support :subtype property of list node; if subtype
[chise/est.git] / est-eval.el
index a99bb10..748197a 100644 (file)
        ((eq spec 06) (concat value "&GT-56392;"))
        ((eq spec 07) (concat value "輯"))
        ((eq spec 08) (concat value "&GT-53119;"))
-       ((eq spec 09) (concat value "&GT-53119;分󠄀"))
+       ((eq spec 09) (concat value "&GT-53119;&AJ1-03580;"))
        ((eq spec 10) (concat value "冊"))
-       ((eq spec 11) (concat value "分󠄀冊"))
+       ((eq spec 11) (concat value "&AJ1-03580;冊"))
        ((eq spec 12) (concat value "&J90-3C21;"))
        ((eq spec 13) (concat value "&GT-18140;号"))
        ((eq spec 14) (concat value "特&GT-56392;号"))
        ((eq spec 15) (concat value "本"))
-       ((eq spec 16) (concat value "分󠄀"))
+       ((eq spec 16) (concat value "&AJ1-03580;"))
        ((eq spec 51) (concat "Vol." value))
        ((eq spec 52) (concat "No." value))
        ((eq spec 53) (concat "Part " value))
 ;;         ((string= spec "06") `((decimal (:feature ,feature)) "&GT-56392;"))
 ;;         ((string= spec "07") `((decimal (:feature ,feature)) "輯"))
 ;;         ((string= spec "08") `((decimal (:feature ,feature)) "&GT-53119;"))
-;;         ((string= spec "09") `((decimal (:feature ,feature)) "&GT-53119;分󠄀"))
+;;         ((string= spec "09") `((decimal (:feature ,feature)) "&GT-53119;&AJ1-03580;"))
 ;;         ((string= spec "10") `((decimal (:feature ,feature)) "冊"))
-;;         ((string= spec "11") `((decimal (:feature ,feature)) "分󠄀冊"))
+;;         ((string= spec "11") `((decimal (:feature ,feature)) "&AJ1-03580;冊"))
 ;;         ((string= spec "12") `((decimal (:feature ,feature)) "&J90-3C21;"))
 ;;         ((string= spec "13") `((decimal (:feature ,feature)) "&GT-18140;号"))
 ;;         ((string= spec "14") `((decimal (:feature ,feature)) "特&GT-56392;号"))
 ;;         ((string= spec "15") `((decimal (:feature ,feature)) "本"))
-;;         ((string= spec "16") `((decimal (:feature ,feature)) "分󠄀"))
+;;         ((string= spec "16") `((decimal (:feature ,feature)) "&AJ1-03580;"))
 ;;         ((string= spec "51") `("Vol." ((decimal (:feature ,feature)))))
 ;;         ((string= spec "52") `("No." ((decimal (:feature ,feature)))))
 ;;         ((string= spec "53") `("Part " ((decimal (:feature ,feature)))))
 ;;         (t nil)
 ;;         ))
 
-(defun est-eval-journal-volume (value)
+(defun est-eval-value-as-journal-volume (value)
   (let ((journal (car (concord-object-get value '<-volume)))
        volume-type number-type
        year)
     (setq volume-type (concord-object-get journal 'volume/type/code)
          number-type (concord-object-get journal 'number/type/code))
-    (setq year (concord-object-get value '->published/date*year))
+    (setq year (or (concord-object-get value '->published/date*year)
+                  (concord-object-get
+                   (car (concord-object-get value 'date)) 'year)))
     ;; (append (list (concord-object-get journal 'name))
     ;;         (est-journal-volume-object-get-volume-format
     ;;          volume-type '<-volume*volume)
             year 'cjk))
     ))
 
+(defun est-eval-value-as-article (value)
+  (let ((creators (concord-object-get value '->creator))
+       (title (concord-object-get value 'title))
+       creator-name creator-role)
+    (concat
+     (mapconcat
+      (lambda (creator)
+       (setq creator-name
+             (concord-object-get
+              (car (concord-object-get creator '->creator/name))
+              '=name))
+       (setq creator-role
+             (or (concord-object-get creator 'role*name)
+                 (format "(%s)"
+                         (concord-object-get creator 'role*type))))
+       (concat creator-name " " creator-role))
+      creators ", ")
+     (if (eq (concord-object-get value 'writing-system) 'cjk)
+        (concat  "「" title "」")
+       (concat " ‘" title "’")))))
+
+(defun est-eval-value-as-book (value)
+  (let ((creators (concord-object-get value '->creator))
+       (title (concord-object-get value 'title))
+       (subtitle (concord-object-get value 'title/subtitle))
+       (series (concord-object-get value 'series))
+       (publisher (car (concord-object-get value 'publisher)))
+       (date (car (concord-object-get value 'date)))
+       creator-name creator-role)
+    (concat
+     (mapconcat
+      (lambda (creator)
+       (setq creator-name
+             (concord-object-get
+              (car (concord-object-get creator '->creator/name))
+              '=name))
+       (setq creator-role
+             (or (concord-object-get creator 'role*name)
+                 (format "(%s)"
+                         (concord-object-get creator 'role*type))))
+       (concat creator-name " " creator-role))
+      creators ", ")
+     (if (eq (concord-object-get value 'writing-system) 'cjk)
+        (concat  "「" title
+                 (if subtitle
+                     (concat " — " subtitle))
+                 "」")
+       (concat " ‘" title
+              (if subtitle
+                  (concat " — " subtitle))
+              "’"))
+     (if series
+        (concat " " series))
+     (if publisher
+        (concat ", "
+                (concord-object-get
+                 (car (concord-object-get
+                       publisher '->publisher/name))
+                 '=name)))
+     (if date
+        (concat ", " (concord-object-get date 'name))))))
+
 ;; (defun est-eval-creator (value)
 ;;   (est-eval-list
 ;;    '((value (:feature ->name))
                  ;; (est-eval-list
                  ;;  (est-journal-volume-get-object-format value)
                  ;;  value nil)
-                 (est-eval-journal-volume value)
+                 (est-eval-value-as-journal-volume value)
+                 )
+                 ((eq genre 'article@ruimoku)
+                 (est-eval-value-as-article value)
+                 )
+                 ((eq genre 'book@ruimoku)
+                 (est-eval-value-as-book value)
                  )
                  ;; ((eq genre 'creator@ruimoku)
                  ;;  (est-eval-creator value)
                                (www-get-feature-value
                                 genre-o 'object-representative-feature))
                           'name))
+                     (www-get-feature-value value '=name)
                      (est-eval-value-default value))
                  ))
                )))
            (format "%c" (ideographic-radical value)))
     (est-eval-value-as-S-exp value)))
 
-(defun est-eval-value-as-object-list (value &optional separator)
-  (if (listp value)
-      (list* 'list
-            (if separator
-                (list :separator separator))
-             ;; (mapcar
-             ;;  (lambda (unit)
-             ;;    (if (characterp unit)
-             ;;        (list 'char-link nil (format "%c" unit))
-             ;;      (format "%s" unit)))
-             ;;  value)
-            (mapcar #'est-eval-value-as-object value)
-            )
+(defun est-eval-value-as-object-list (value &optional separator subtype)
+  (if (and (listp value)
+          (listp (cdr value)))
+      (condition-case err
+         (let (props)
+           (if separator
+               (setq props (list :separator separator)))
+           (if subtype
+               (setq props (list* :subtype subtype props)))
+           (list* 'list props
+                  (mapcar #'est-eval-value-as-object value)))
+       (error err (format "%s" value)))
     (format "%s" value)))
 
 (defun est-eval-value-as-ids (value)
                value)))
     (est-eval-value-default value)))
 
-(defun est-eval-value-as-creators-names (value)
+(defun est-eval-value-as-creators-names (value &optional subtype)
   (if (listp value)
       (let (role-name)
        (list* 'creator-name
-              '(:separator " ")
+              (if subtype
+                  '(:subtype unordered-list)
+                '(:separator " "))
               (mapcar (lambda (creator)
                         (setq role-name
                               (concord-object-get creator
                                                   'role*name))
                         (est-eval-list
                          (list
-                          '(value (:feature ->name))
+                          '(value (:feature ->creator/name))
                           (list
                            'object (list :object creator)
                            (or role-name
               ))
     (est-eval-value-default value)))
 
-(defun est-eval-value-as-created-works (value)
+(defun est-eval-value-as-created-works (value &optional subtype)
   (if (listp value)
       (list* 'creator-name
-            '(:separator " ")
+            (if subtype
+                '(:subtype unordered-list)
+              '(:separator " "))
             (mapcar (lambda (creator)
                       (est-eval-list
-                       '((value (:feature ->created)))
+                       '((value (:feature <-creator)))
                        creator nil))
                     value))
     (est-eval-value-default value)))
         ((or (eq format 'space-separated)
              (eq format 'space-separated-char-list))
          (est-eval-value-as-object-list value " "))
+        ((eq format 'unordered-list)
+         (est-eval-value-as-object-list value nil 'unordered-list))
         ((eq format 'space-separated-ids)
          (est-eval-value-as-space-separated-ids value))
         ((eq format 'space-separated-domain-list)
          (est-eval-value-as-domain-list value))
         ((eq format 'space-separated-creator-name-list)
          (est-eval-value-as-creators-names value))
+        ((eq format 'unordered-creator-name-list)
+         (est-eval-value-as-creators-names value 'unordered-list))
         ((eq format 'space-separated-created-work-list)
          (est-eval-value-as-created-works value))
+        ((eq format 'unordered-created-work-list)
+         (est-eval-value-as-created-works value 'unordered-list))
         (t
          (est-eval-value-default value)
          ))