(instance@ruimoku/bibliography/title): Mount char-feature
[chise/est.git] / cwiki-common.el
index c682cbd..6e7b014 100644 (file)
@@ -1,14 +1,34 @@
 ;; -*- coding: utf-8-mcs-er -*-
 (require 'char-db-util)
 
+(setq file-name-coding-system 'utf-8-mcs-er)
+
+
+(concord-assign-genre 'creator@ruimoku "/usr/local/var/ruimoku/db")
+(concord-assign-genre 'person-name@ruimoku "/usr/local/var/ruimoku/db")
+
+(concord-assign-genre 'journal-volume@ruimoku "/usr/local/var/ruimoku/db")
+(concord-assign-genre 'article@ruimoku "/usr/local/var/ruimoku/db")
+(concord-assign-genre 'book@ruimoku "/usr/local/var/ruimoku/db")
+
+(concord-assign-genre 'classification@ruimoku "/usr/local/var/ruimoku/db")
+(concord-assign-genre 'region@ruimoku "/usr/local/var/ruimoku/db")
+(concord-assign-genre 'era@ruimoku "/usr/local/var/ruimoku/db")
+(concord-assign-genre 'period@ruimoku "/usr/local/var/ruimoku/db")
+(concord-assign-genre 'journal@ruimoku "/usr/local/var/ruimoku/db")
+
+(mount-char-attribute-table 'instance@ruimoku/bibliography/title)
+;; (mount-char-attribute-table 'instance@ruimoku/bibliography/content*note)
+
+
 (defvar chise-wiki-view-url "view.cgi")
 (defvar chise-wiki-edit-url "edit.cgi")
 
 (defvar chise-wiki-bitmap-glyphs-url
-  "http://chise.zinbun.kyoto-u.ac.jp/glyphs")
+  "http://www.chise.org/glyphs")
 
 (defvar chise-wiki-glyph-cgi-url
-  "http://chise.zinbun.kyoto-u.ac.jp/chisewiki/glyph.cgi")
+  "http://www.chise.org/chisewiki/glyph.cgi")
 
 (defvar chise-wiki-displayed-features nil)
 
        (intern (substring feature-name 0 (match-beginning 0)))
       feature)))
 
-(defun www-char-feature (character feature)
+(defun est-object-genre (object)
+  (if (characterp object)
+      'character
+    (concord-object-genre object)))
+
+(defun www-get-feature-value (object feature)
   (let ((latest-feature (char-feature-name-at-domain feature '$rev=latest)))
-    (mount-char-attribute-table latest-feature)
-    (or (char-feature character latest-feature)
-       (char-feature character feature))))
+    (cond
+     ((characterp object)
+      (mount-char-attribute-table latest-feature)
+      (or (char-feature object latest-feature)
+         (char-feature object feature))
+      )
+     (t
+      (or (condition-case nil
+             (concord-object-get object latest-feature)
+           (error nil))
+         (condition-case nil
+             (concord-object-get object feature)
+           (error nil)))
+      ))))
 
 (defun get-previous-code-point (ccs code)
   (let ((chars (charset-chars ccs))
     )
    (t feature-name)))
 
-(defun www-uri-make-feature-name-url (uri-feature-name uri-char)
-  (format "%s?feature=%s&char=%s"
-         chise-wiki-view-url uri-feature-name uri-char))
+(defun www-uri-make-feature-name-url (uri-genre uri-feature-name uri-object)
+  (format "%s?feature=%s&%s=%s"
+         chise-wiki-view-url uri-feature-name uri-genre uri-object))
 
-(defun www-uri-decode-char (char-rep)
+(defun www-uri-decode-object (genre char-rep)
   (let (ccs cpos)
     (cond
      ((string-match "\\(%3A\\|:\\)" char-rep)
              (string-to-number (substring cpos (match-end 0)) 16))
        )
        (t
-       (setq cpos (string-to-number cpos))
+       (setq cpos (car (read-from-string cpos)))
        ))
-      (if (numberp cpos)
-         (decode-char ccs cpos))
+      (if (and (eq genre 'character)
+              (numberp cpos))
+         (decode-char ccs cpos)
+       (concord-decode-object ccs cpos genre))
       )
      (t
       (setq char-rep (decode-uri-string char-rep 'utf-8-mcs-er))
-      (when (= (length char-rep) 1)
-       (aref char-rep 0))
-      ))))
-
-(defun www-uri-encode-char (char)
-  (if (encode-char char '=ucs)
-      (mapconcat
-       (lambda (byte)
-        (format "%%%02X" byte))
-       (encode-coding-string (char-to-string char) 'utf-8-mcs-er)
-       "")
-    (let ((ccs-list '(; =ucs
-                     =cns11643-1 =cns11643-2 =cns11643-3
-                     =cns11643-4 =cns11643-5 =cns11643-6 =cns11643-7
-                     =gb2312 =gb12345
-                     =jis-x0208 =jis-x0208@1990
-                     =jis-x0212
-                     =cbeta =jef-china3
-                     =jis-x0213-1@2000 =jis-x0213-1@2004
-                     =jis-x0208@1983 =jis-x0208@1978
-                     =zinbun-oracle =>zinbun-oracle
-                     =daikanwa
-                     =gt =gt-k
-                     =>>jis-x0208 =>>jis-x0213-1
-                     =>jis-x0208 =>jis-x0213-1
-                     =>>gt
-                     =ruimoku-v6
-                     =big5
-                     =big5-cdp))
-         ccs ret)
-      (while (and ccs-list
-                 (setq ccs (pop ccs-list))
-                 (not (setq ret (encode-char char ccs 'defined-only)))))
-      (cond (ret
-            (format "%s:0x%X"
-                    (www-uri-encode-feature-name ccs)
-                    ret))
-           ((and (setq ccs (car (split-char char)))
-                 (setq ret (encode-char char ccs)))
-            (format "%s:0x%X"
-                    (www-uri-encode-feature-name ccs)
-                    ret))
-           (t
-            (format "system-char-id:0x%X"
-                    (encode-char char 'system-char-id))
-            )))))
+      (cond
+       ((eq genre 'character)
+       (when (= (length char-rep) 1)
+         (aref char-rep 0))
+       )
+       ((eq genre 'feature)
+       (concord-decode-object
+        '=id (www-uri-decode-feature-name char-rep) 'feature)
+       )
+       (t
+       (concord-decode-object
+        '=id (car (read-from-string char-rep)) genre)
+       ))))))
+
+(defun www-uri-encode-object (object)
+  (if (characterp object)
+      (if (encode-char object '=ucs)
+         (mapconcat
+          (lambda (byte)
+            (format "%%%02X" byte))
+          (encode-coding-string (char-to-string object) 'utf-8-mcs-er)
+          "")
+       (let ((ccs-list '(; =ucs
+                         =cns11643-1 =cns11643-2 =cns11643-3
+                         =cns11643-4 =cns11643-5 =cns11643-6 =cns11643-7
+                         =gb2312 =gb12345
+                         =jis-x0208 =jis-x0208@1990
+                         =jis-x0212
+                         =cbeta =jef-china3
+                         =jis-x0213-1@2000 =jis-x0213-1@2004
+                         =jis-x0208@1983 =jis-x0208@1978
+                         =zinbun-oracle =>zinbun-oracle
+                         =daikanwa
+                         =gt =gt-k
+                         =>>jis-x0208 =>>jis-x0213-1
+                         =>jis-x0208 =>jis-x0213-1
+                         =>>gt
+                         =ruimoku-v6
+                         =big5
+                         =big5-cdp))
+             ccs ret)
+         (while (and ccs-list
+                     (setq ccs (pop ccs-list))
+                     (not (setq ret (encode-char object ccs 'defined-only)))))
+         (cond (ret
+                (format "%s:0x%X"
+                        (www-uri-encode-feature-name ccs)
+                        ret))
+               ((and (setq ccs (car (split-char object)))
+                     (setq ret (encode-char object ccs)))
+                (format "%s:0x%X"
+                        (www-uri-encode-feature-name ccs)
+                        ret))
+               (t
+                (format "system-char-id:0x%X"
+                        (encode-char object 'system-char-id))
+                ))))
+    (format "rep.id:%s" (concord-object-id object))))
+
+(defun est-format-object (object)
+  (if (characterp object)
+      (char-to-string object)
+    (format "%s" (concord-object-id object))))
+
+(defun www-uri-make-object-url (object &optional uri-object)
+  (format "%s?%s=%s"
+         chise-wiki-view-url
+         (est-object-genre object)
+         (or uri-object
+             (www-uri-encode-object object))))
 
 
 ;;; @ Feature name presentation
    (www-format-feature-name* feature-name lang)))
 
 
-;;; @ Feature value presentation
+;;; @ HTML generator
 ;;;
 
-(defun www-format-value-as-kuten (value)
-  (format "%02d-%02d"
-         (- (lsh value -8) 32)
-         (- (logand value 255) 32)))
-
-(defun www-format-value-default (value &optional without-tags)
-  (if (listp value)
-      (mapconcat
-       (lambda (unit)
-        (www-format-encode-string
-         (format "%S" unit)
-         without-tags))
-       value " ")
-    (www-format-encode-string (format "%S" value) without-tags)))
-  
-(defun www-format-value-as-char-list (value &optional without-tags)
-  (if (listp value)
-      (mapconcat
-       (if without-tags
-          (lambda (unit)
-            (www-format-encode-string
-             (format (if (characterp unit)
-                         "%c"
-                       "%s")
-                     unit)
-             'without-tags))
-        (lambda (unit)
-          (if (characterp unit)
-              (format "<a href=\"%s?char=%s\">%s</a>"
-                      chise-wiki-view-url
-                      (www-uri-encode-char unit)
-                      (www-format-encode-string (char-to-string unit)))
-            (www-format-encode-string (format "%s" unit)))))
-       value " ")
-    (www-format-encode-string (format "%s" value) without-tags)))
-
-(defun www-format-value-as-domain-list (value &optional without-tags)
-  (let (name source0 source num dest rest unit start end ddest)
-    (if (listp value)
-       (if without-tags
-           (mapconcat
-            (lambda (unit)
-              (format "%s" unit))
-            value " ")
-         (setq rest value)
-         (while rest
-           (setq unit (pop rest))
-           (if (symbolp unit)
-               (setq name (symbol-name unit)))
-           (setq dest
-                 (concat
-                  dest
-                  (cond
-                   ((string-match "^zob1968=" name)
-                    (setq source (intern (substring name 0 (match-end 0)))
-                          num (substring name (match-end 0)))
-                    (if (string-match "^\\([0-9]+\\)-\\([0-9]+\\)$" num)
-                        (setq start (string-to-number
-                                     (match-string 1 num))
-                              end (string-to-number
-                                   (match-string 2 num)))
-                      (setq start (string-to-number num)
-                            end start))
-                    (setq ddest
-                          (if (eq source source0)
-                              (format
-                               ", <a href=\"http://chise.zinbun.kyoto-u.ac.jp/koukotsu/rubbings/%04d\">%04d</a>"
-                               start start)
-                            (setq source0 source)
-                            (format
-                             " <a href=\"http://chise.zinbun.kyoto-u.ac.jp/koukotsu/\">%s</a>=<a href=\"http://chise.zinbun.kyoto-u.ac.jp/koukotsu/rubbings/%04d\">%04d</a>"
-                             (www-format-encode-string "\u4EAC大人\u6587研甲\u9AA8")
-                             start start)))
-                    (setq start (1+ start))
-                    (while (<= start end)
-                      (setq ddest
-                            (concat
-                             ddest
-                             (format
-                              ", <a href=\"http://chise.zinbun.kyoto-u.ac.jp/koukotsu/rubbings/%04d\">%04d</a>"
-                              start start)))
-                      (setq start (1+ start)))
-                    ddest)
-                   (t
-                    (setq source unit)
-                    (if (eq source source0)
-                        ""
-                      (setq source0 source)
-                      (concat " " name))
-                    )))))
-         dest)
-      (www-format-encode-string (format "%s" value) without-tags))))
-
-(defun www-format-value-as-ids (value &optional without-tags)
-  (if (listp value)
-      (mapconcat
-       (if without-tags
-          (lambda (unit)
-            (www-format-encode-string
-             (format (if (characterp unit)
-                         "%c"
-                       "%s")
-                     unit)
-             'without-tags))
-        (lambda (unit)
-          (if (characterp unit)
-              (format "<a href=\"%s?char=%s\">%s</a>"
-                      chise-wiki-view-url
-                      (www-uri-encode-char unit)
-                      (www-format-encode-string (char-to-string unit)))
-            (www-format-encode-string (format "%s" unit)))))
-       (ideographic-structure-to-ids value) " ")
-    (www-format-encode-string (format "%s" value) without-tags)))
-
-(defun www-format-value-as-S-exp (value &optional without-tags)
-  (www-format-encode-string (format "%S" value) without-tags))
-
-(defun www-format-value-as-HEX (value)
-  (if (integerp value)
-      (format "%X" value)
-    (www-format-value-as-S-exp value)))
-
-(defun www-format-value-as-CCS-default (value)
-  (if (integerp value)
-      (format "0x%s (%d)"
-             (www-format-value-as-HEX value)
-             value)
-    (www-format-value-as-S-exp value)))
-
-(defun www-format-value-as-CCS-94x94 (value)
-  (if (integerp value)
-      (format "0x%s [%s] (%d)"
-             (www-format-value-as-HEX value)
-             (www-format-value-as-kuten value)
-             value)
-    (www-format-value-as-S-exp value)))
-
-(defun www-format-value-as-kangxi-radical (value)
-  (if (and (integerp value)
-          (<= 0 value)
-          (<= value 214))
-      (www-format-encode-string
-       (format "%c" (ideographic-radical value)))
-    (www-format-value-as-S-exp value)))
-
-(defun www-format-value (object feature-name
-                               &optional value format
-                               without-tags without-edit)
-  (unless value
-    (setq value (www-char-feature object feature-name)))
-  (www-format-apply-value object feature-name
-                         format nil value nil nil
-                         without-tags without-edit)
-  )
-
-
-;;; @ format evaluator
-;;;
+(defvar www-format-char-img-style "vertical-align:bottom;")
 
-(defun www-format-encode-string (string &optional without-tags)
+(defun www-format-encode-string (string &optional without-tags as-body)
   (with-temp-buffer
     (insert string)
     (let (plane code start end char variants ret rret)
+      (when as-body
+       (goto-char (point-min))
+       (while (search-forward "&" nil t)
+         (replace-match "&amp;" nil t)))
       (goto-char (point-min))
       (while (search-forward "<" nil t)
        (replace-match "&lt;" nil t))
          (while (re-search-forward "&CB\\([0-9]+\\);" nil t)
            (setq code (string-to-int (match-string 1)))
            (replace-match
-            (format "<img alt=\"CB%05d\" src=\"%s/cb-gaiji/%02d/CB%05d.gif\">"
+            (format "<img alt=\"CB%05d\" src=\"%s/cb-gaiji/%02d/CB%05d.gif\"
+style=\"%s\">"
                     code
                     chise-wiki-bitmap-glyphs-url
-                    (/ code 1000) code)
+                    (/ code 1000) code
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
            (setq plane (match-string 1)
                  code (string-to-int (match-string 2) 16))
            (replace-match
-            (format "<img alt=\"J%s-%04X\" src=\"%s/JIS-%s/%02d-%02d.gif\">"
+            (format "<img alt=\"J%s-%04X\" src=\"%s/JIS-%s/%02d-%02d.gif\"
+style=\"%s\">"
                     plane code
                     chise-wiki-bitmap-glyphs-url
                     plane
                     (- (lsh code -8) 32)
-                    (- (logand code 255) 32))
+                    (- (logand code 255) 32)
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
            (setq plane (string-to-int (match-string 1))
                  code (string-to-int (match-string 2) 16))
            (replace-match
-            (format "<img alt=\"GB%d-%04X\" src=\"%s/GB%d/%02d-%02d.gif\">"
+            (format "<img alt=\"GB%d-%04X\" src=\"%s/GB%d/%02d-%02d.gif\"
+style=\"%s\">"
                     plane code
                     chise-wiki-bitmap-glyphs-url
                     plane
                     (- (lsh code -8) 32)
-                    (- (logand code 255) 32))
+                    (- (logand code 255) 32)
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
            (setq plane (string-to-int (match-string 1))
                  code (string-to-int (match-string 2) 16))
            (replace-match
-            (format "<img alt=\"CNS%d-%04X\" src=\"%s/CNS%d/%04X.gif\">"
+            (format "<img alt=\"CNS%d-%04X\" src=\"%s/CNS%d/%04X.gif\"
+style=\"%s\">"
                     plane code
                     chise-wiki-bitmap-glyphs-url
-                    plane code)
+                    plane code
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
          (while (re-search-forward "&\\(A-\\)?ZOB-\\([0-9]+\\);" nil t)
            (setq code (string-to-int (match-string 2)))
            (replace-match
-            (format "<img alt=\"ZOB-%04d\" src=\"%s/ZOB-1968/%04d.png\">"
+            (format "<img alt=\"ZOB-%04d\" src=\"%s/ZOB-1968/%04d.png\"
+style=\"vertical-align:middle\">"
                     code
                     chise-wiki-bitmap-glyphs-url
-                    code)
+                    code
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
          (while (re-search-forward "&\\(G-\\)?GT-\\([0-9]+\\);" nil t)
            (setq code (string-to-int (match-string 2)))
            (replace-match
-            (format "<img alt=\"GT-%05d\" src=\"%s?char=GT-%05d\">"
+            (format "<img alt=\"GT-%05d\" src=\"%s?char=GT-%05d\"
+style=\"%s\">"
                     code
                     chise-wiki-glyph-cgi-url
-                    code)
+                    code
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
          (while (re-search-forward "&\\(G-\\)?GT-K\\([0-9]+\\);" nil t)
            (setq code (string-to-int (match-string 2)))
            (replace-match
-            (format "<img alt=\"GT-K%05d\" src=\"%s?char=GT-K%05d\">"
+            (format "<img alt=\"GT-K%05d\" src=\"%s?char=GT-K%05d\"
+style=\"%s\">"
                     code
                     chise-wiki-glyph-cgi-url
-                    code)
+                    code
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
          (while (re-search-forward "&B-\\([0-9A-F]+\\);" nil t)
            (setq code (string-to-int (match-string 1) 16))
            (replace-match
-            (format "<img alt=\"B-%04X\" src=\"%s?char=B-%04X\">"
+            (format "<img alt=\"B-%04X\" src=\"%s?char=B-%04X\"
+style=\"%s\">"
                     code
                     chise-wiki-glyph-cgi-url
-                    code)
+                    code
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
          (while (re-search-forward "&CDP-\\([0-9A-F]+\\);" nil t)
            (setq code (string-to-int (match-string 1) 16))
            (replace-match
-            (format "<img alt=\"CDP-%04X\" src=\"%s?char=CDP-%04X\">"
+            (format "<img alt=\"CDP-%04X\" src=\"%s?char=CDP-%04X\"
+style=\"%s\">"
                     code
                     chise-wiki-glyph-cgi-url
-                    code)
+                    code
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
          (while (re-search-forward "&RUI6-\\([0-9A-F]+\\);" nil t)
            (setq code (string-to-int (match-string 1) 16))
            (replace-match
-            (format "<img alt=\"RUI6-%04X\" src=\"%s?char=RUI6-%04X\">"
+            (format "<img alt=\"RUI6-%04X\" src=\"%s?char=RUI6-%04X\"
+style=\"vertical-align:middle\">"
                     code
                     chise-wiki-glyph-cgi-url
-                    code)
+                    code
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
          (while (re-search-forward "&\\(UU\\+\\|U-\\)\\([0-9A-F]+\\);" nil t)
            (setq code (string-to-int (match-string 2) 16))
            (replace-match
-            (format "<img alt=\"UU+%04X\" src=\"http://www.unicode.org/cgi-bin/refglyph?24-%04X\">"
+            (format "<img alt=\"UU+%04X\" src=\"http://www.unicode.org/cgi-bin/refglyph?24-%04X\"
+style=\"vertical-align:middle\">"
+                    code
                     code
-                    code)
+                    www-format-char-img-style)
             t 'literal))
 
          (goto-char (point-min))
            (setq char (decode-char 'system-char-id code))
            (cond
             ((and (setq variants
-                        (or (www-char-feature char '->subsumptive)
-                            (www-char-feature char '->denotational)))
+                        (or (www-get-feature-value char '->subsumptive)
+                            (www-get-feature-value char '->denotational)))
                   (progn
                     (while (and variants
                                 (setq ret (www-format-encode-string
                (delete-region start end)
                (insert ret))
              )
-            ((setq ret (or (www-char-feature char 'ideographic-combination)
-                           (www-char-feature char 'ideographic-structure)))
+            ((setq ret (or (www-get-feature-value char 'ideographic-combination)
+                           (www-get-feature-value char 'ideographic-structure)))
              (setq ret
                    (mapconcat
                     (lambda (ch)
       ;;   (replace-match "&amp;GT-" t 'literal))
       (buffer-string))))
 
-(defun www-format-props-to-string (props &optional format)
-  (unless format
-    (setq format (plist-get props :format)))
-  (concat "%"
-         (plist-get props :flag)
-          ;; (if (plist-get props :zero-padding)
-          ;;     "0")
-         (if (plist-get props :len)
-             (format "0%d"
-                     (let ((ret (plist-get props :len)))
-                       (if (stringp ret)
-                           (string-to-int ret)
-                         ret))))
-         (cond
-          ((eq format 'decimal) "d")
-          ((eq format 'hex) "x")
-          ((eq format 'HEX) "X")
-          ((eq format 'S-exp) "S")
-          (t "s"))))      
-
-(defun www-format-apply-value (object feature-name
-                                     format props value
-                                     &optional uri-char uri-feature
-                                     without-tags without-edit)
-  (let (ret)
-    (setq ret
-         (cond
-          ((memq format '(decimal hex HEX))
-           (if (integerp value)
-               (format (www-format-props-to-string props format)
-                       value)
-             (www-format-encode-string
-              (format "%s" value)
-              without-tags))
-           )
-          ((eq format 'wiki-text)
-           (if without-tags
-               (www-xml-format-list value)
-             (www-format-eval-list value object feature-name nil uri-char
-                                   without-tags without-edit))
-           )
-          ((eq format 'S-exp)
-           (www-format-encode-string
-            (format (www-format-props-to-string props format)
-                    value)
-            without-tags))
-          ((eq format 'ku-ten)
-           (www-format-value-as-kuten value))
-          ((eq format 'kangxi-radical)
-           (www-format-value-as-kangxi-radical value))
-          ((eq format 'space-separated-char-list)
-           (www-format-value-as-char-list value without-tags))
-          ((eq format 'space-separated-ids)
-           (www-format-value-as-ids value without-tags))
-          ((eq format 'space-separated-domain-list)
-           (www-format-value-as-domain-list value without-tags))
-          ((eq format 'string)
-           (www-format-encode-string (format "%s" value) without-tags)
-           )
-          (t
-           (www-format-value-default value without-tags)
-            ))
-         )
-    (if (or without-tags
-           without-edit
-           (eq (plist-get props :mode) 'peek))
-       ret
-      (format "%s <a href=\"%s?char=%s&feature=%s&format=%s\"
-><input type=\"submit\" value=\"edit\" /></a>"
-             ret
-             chise-wiki-edit-url
-             uri-char uri-feature format))))
-
-(defun www-format-eval-feature-value (char
-                                     feature-name
-                                     &optional format lang uri-char value
-                                     without-tags without-edit)
-  (unless value
-    (setq value (www-char-feature char feature-name)))
-  (unless format
-    (setq format (www-feature-value-format feature-name)))
-  (cond
-   ((symbolp format)
-    (www-format-apply-value
-     char feature-name
-     format nil value
-     uri-char (www-uri-encode-feature-name feature-name)
-     without-tags without-edit)
-    )
-   ((consp format)
-    (cond ((null (cdr format))
-          (setq format (car format))
-          (www-format-apply-value
-           char feature-name
-           (car format) (nth 1 format) value
-           uri-char (www-uri-encode-feature-name feature-name)
-           without-tags without-edit)
-          )
-         (t
-          (www-format-eval-list format char feature-name lang uri-char
-                                without-tags without-edit)
-          )))))
-
-(defun www-format-eval-unit (exp char feature-name
-                                &optional lang uri-char value
-                                without-tags without-edit)
-  (unless value
-    (setq value (www-char-feature char feature-name)))
-  (unless uri-char
-    (setq uri-char (www-uri-encode-char char)))
-  (cond
-   ((stringp exp) (www-format-encode-string exp))
-   ((null exp) "")
-   ((consp exp)
-    (cond
-     ((memq (car exp) '(value decimal hex HEX ku-ten kangxi-radical
-                             S-exp string default))
-      (let ((fn (plist-get (nth 1 exp) :feature))
-           domain domain-fn ret)
-       (when fn
-         (when (stringp fn)
-           (setq fn (intern fn)))
-         (setq domain (char-feature-name-domain feature-name))
-         (setq domain-fn (char-feature-name-at-domain fn domain))
-         (if (setq ret (www-char-feature char domain-fn))
-             (setq feature-name domain-fn
-                   value ret)
-           (setq feature-name fn
-                 value (www-char-feature char fn)))
-         (push feature-name chise-wiki-displayed-features)
-          ))
-      (if (eq (car exp) 'value)
-         (www-format-eval-feature-value char feature-name
-                                        (plist-get (nth 1 exp) :format)
-                                        lang uri-char value
-                                        without-tags without-edit)
-       (www-format-apply-value
-        char feature-name
-        (car exp) (nth 1 exp) value
-        uri-char (www-uri-encode-feature-name feature-name)
-        without-tags without-edit))
-      )
-     ((eq (car exp) 'name)
-      (let ((fn (plist-get (nth 1 exp) :feature))
-           domain domain-fn)
-       (when fn
-         (setq domain (char-feature-name-domain feature-name))
-         (when (stringp fn)
-           (setq fn (intern fn)))
-         (setq domain-fn (char-feature-name-at-domain fn domain))
-         (setq feature-name domain-fn)))
-      (if without-tags
-         (www-format-feature-name feature-name lang)
-       (format "<a href=\"%s\">%s</a>"
-               (www-uri-make-feature-name-url
-                (www-uri-encode-feature-name feature-name)
-                uri-char)
-               (www-format-feature-name feature-name lang))
-        )
-      )
-     ((eq (car exp) 'name-url)
-      (let ((fn (plist-get (nth 1 exp) :feature))
-           domain domain-fn)
-       (when fn
-         (setq domain (char-feature-name-domain feature-name))
-         (when (stringp fn)
-           (setq fn (intern fn)))
-         (setq domain-fn (char-feature-name-at-domain fn domain))
-         (setq feature-name domain-fn)))
-      (www-uri-make-feature-name-url
-       (www-uri-encode-feature-name feature-name)
-       uri-char)
-      )
-     ((eq (car exp) 'domain-name)
-      (let ((domain (char-feature-name-domain feature-name)))
-       (if domain
-           (format "@%s" domain))))
-     ((eq (car exp) 'prev-char)
-      (if without-tags
-         ""
-       (let ((prev-char (find-previous-defined-code-point
-                         feature-name value)))
-         (if prev-char
-             (format "\n<a href=\"%s?char=%s\">%s</a>"
-                     chise-wiki-view-url
-                     (www-uri-encode-char prev-char)
-                      "<input type=\"submit\" value=\"-\" />"
-                     ;; (www-format-encode-string
-                      ;;  (char-to-string prev-char))
-                     )
-           "")))
-      )
-     ((eq (car exp) 'next-char)
-      (if without-tags
-         ""
-       (let ((next-char (find-next-defined-code-point
-                         feature-name value)))
-         (if next-char
-             (format "<a href=\"%s?char=%s\">%s</a>"
-                     chise-wiki-view-url
-                     (www-uri-encode-char next-char)
-                      "<input type=\"submit\" value=\"+\" />"
-                     ;; (www-format-encode-string
-                      ;;  (char-to-string next-char))
-                     )
-           "")))
-      )
-     ((eq (car exp) 'link)
-      (if without-tags
-         (www-format-eval-list (nthcdr 2 exp)
-                               char feature-name lang uri-char
-                               without-tags without-edit)
-       (format "<a
- href=\"%s\"
->%s</a
->"
-               (www-format-eval-list (plist-get (nth 1 exp) :ref)
-                                     char feature-name lang uri-char
-                                     'without-tags 'without-edit)
-               (www-format-eval-list (nthcdr 2 exp)
-                                     char feature-name lang uri-char
-                                     without-tags without-edit)))
-      )
-     (t
-      (format "<%s
->%s</%s
->"
-             (car exp)
-             (www-format-eval-list (nthcdr 2 exp) char feature-name
-                                   lang uri-char
-                                   without-tags without-edit)
-             (car exp)))))))
-
-(defun www-format-eval-list (format-list char feature-name
-                                        &optional lang uri-char
-                                        without-tags without-edit)
-  (if (consp format-list)
-      (mapconcat
-       (lambda (exp)
-        (www-format-eval-unit exp char feature-name lang uri-char
-                              nil without-tags without-edit))
-       format-list "")
-    (www-format-eval-unit format-list char feature-name lang uri-char
-                         nil without-tags without-edit)))
-
-
-;;; @ XML generator
-;;;
-
-(defun www-xml-format-props (props)
-  (let ((dest "")
-       key val)
-    (while props
-      (setq key (pop props)
-           val (pop props))
-      (if (symbolp key)
-         (setq key (symbol-name key)))
-      (if (eq (aref key 0) ?:)
-         (setq key (substring key 1)))
-      (setq dest
-           (format "%s %s=\"%s\""
-                   dest key
-                   (www-format-encode-string
-                    (format "%s" val) 'without-tags))))
-    dest))
-
-(defun www-xml-format-unit (format-unit)
-  (let (name props children ret)
-    (cond
-     ((stringp format-unit)
-      (mapconcat (lambda (c)
-                  (cond
-                   ((eq c ?&) "&amp;")
-                    ;; ((eq c ?<) "&amp;lt;")
-                    ;; ((eq c ?>) "&amp;gt;")
-                   (t
-                    (char-to-string c))))
-                (www-format-encode-string format-unit 'without-tags)
-                "")
-      )
-     ((consp format-unit)
-      (setq name (car format-unit)
-           props (nth 1 format-unit)
-           children (nthcdr 2 format-unit))
-      (when (eq name 'link)
-       (setq ret (plist-get props :ref))
-       (unless (stringp ret)
-         (setq props (plist-remprop (copy-list props) :ref))
-         (setq children
-               (cons (list* 'ref nil ret)
-                     children))))
-      (if children
-         (format "<%s%s>%s</%s>"
-                 name
-                 (if props
-                     (www-xml-format-props props)
-                   "")
-                 (www-xml-format-list children)
-                 name)
-       (format "<%s%s/>"
-               name (www-xml-format-props props)))
-      )
-     (t
-      (format "%s" format-unit)))))
-
-(defun www-xml-format-list (format-list)
-  (if (atom format-list)
-      (www-xml-format-unit format-list)
-    (mapconcat #'www-xml-format-unit
-              format-list "")))
-
-
-;;; @ HTML generator
-;;;
-
 (defun www-html-display-text (text)
   (princ
    (with-temp-buffer