b7ace7afac9222b5221e8da2d48015cb1b7c8193
[chise/est.git] / cwiki-set.el
1 ;; -*- coding: utf-8-mcs-er -*-
2 (defvar chise-wiki-view-url "../view.cgi")
3 (defvar chise-wiki-edit-url "edit.cgi")
4
5 (require 'cwiki-common)
6 (require 'cwiki-view)
7
8
9 (defun www-parse-string-default (string)
10   (setq string (decode-uri-string string 'utf-8-mcs-er))
11   (condition-case nil
12       (let ((ret
13              (mapcar #'read (split-string string " "))))
14         (if (cdr ret)
15             ret
16           (car ret)))
17     (error nil)))
18
19 (defun www-parse-string-as-space-separated-char-list (string)
20   (let (dest char)
21     (dolist (unit (split-string string "\\+"))
22       (if (setq char (www-uri-decode-char unit))
23           (setq dest (cons char dest))))
24     (nreverse dest)))
25
26 (defun www-parse-string-as-space-separated-ids (string)
27   (cdar
28    (ids-parse-string
29     (let (char)
30       (mapconcat
31        (lambda (unit)
32          (if (setq char (www-uri-decode-char unit))
33              (char-to-string char)
34            unit))
35        (split-string string "\\+")
36        "")))))
37
38 (defun www-parse-string-as-ku-ten (string)
39   (if (string-match "^\\([0-9][0-9]?\\)-\\([0-9][0-9]?\\)" string)
40       (let ((ku (string-to-int (match-string 1 string)))
41             (ten (string-to-int (match-string 2 string))))
42         (if (and (<= 1 ku)(<= ku 94)
43                  (<= 1 ten)(<= ten 94))
44             (+ (lsh (+ ku 32) 8)
45                ten 32)))))
46
47 (defun www-parse-string-as-wiki-text (string)
48   (list (decode-uri-string string 'utf-8-mcs-er)))
49
50 (defun www-feature-parse-string (feature-name string &optional format)
51   (unless format
52     (setq format (www-feature-value-format feature-name)))
53   (cond ((eq format 'space-separated-char-list)
54          (www-parse-string-as-space-separated-char-list string))
55         ((eq format 'space-separated-ids)
56          (www-parse-string-as-space-separated-ids string))
57         ((eq format 'ku-ten)
58          (www-parse-string-as-ku-ten string))
59         ((eq format 'decimal)
60          (string-to-number string))
61         ((or (eq format 'HEX)(eq format 'hex))
62          (string-to-number string 16))
63         ((eq format 'string)
64          (decode-uri-string string 'utf-8-mcs-er)
65          )
66         ((eq format 'wiki-text)
67          (www-parse-string-as-wiki-text string)
68          )
69         ((eq format 'S-exp)
70          (if (= (length string) 0)
71              nil
72            (read (decode-uri-string string 'utf-8-mcs-er)))
73          )
74         (t 
75          (www-parse-string-default string)
76          )))
77
78 (defun www-set-display-char-desc (uri-char feature value format &optional lang)
79   (when (stringp feature)
80     (setq feature (intern feature)))
81   (when (stringp format)
82     (setq format (intern format)))
83   (let ((char (www-uri-decode-char uri-char))
84         latest-feature
85         logical-feature displayed-features)
86     (when (characterp char)
87       (princ
88        (encode-coding-string
89         (format "<head>
90 <title>CHISE-wiki character: %s</title>
91 </head>\n"
92                 (decode-uri-string uri-char 'utf-8-mcs-er))
93         'utf-8-mcs-er))
94       (princ "<body>\n")
95       (www-html-display-paragraph
96        (format "char: %S %S %S %S\n"
97                uri-char feature value lang))
98       (setq value (www-feature-parse-string feature value format))
99       (www-html-display-paragraph
100        (format "char = %c : %S \u2190 %S"
101                char feature value))
102       (setq latest-feature
103             (char-feature-name-at-domain feature '$rev=latest))
104       (if value
105           (if (equal (www-char-feature char feature) value)
106               (www-html-display-paragraph
107                "Feature-value is not changed.")
108             (www-html-display-paragraph
109              (format "New feature-value = %S is different from old value %S"
110                      value
111                      (www-char-feature char feature)))
112             (put-char-attribute char latest-feature value)
113             (save-char-attribute-table latest-feature)
114             )
115         (www-html-display-paragraph
116          "New feature-value is nil, so it is ignored (may be syntax error).")
117         )
118       (princ (format "<h1>%s</h1>\n"
119                      (www-format-encode-string (char-to-string char))))
120       (dolist (cell (sort (char-attribute-alist char)
121                           (lambda (a b)
122                             (char-attribute-name< (car a)(car b)))))
123         (setq logical-feature
124               (char-feature-name-sans-versions (car cell)))
125         (unless (memq logical-feature displayed-features)
126           (push logical-feature displayed-features)
127           (princ "<p>")
128           (princ
129            (www-format-eval-list
130             (or (char-feature-property logical-feature 'format)
131                 '((name) " : " (value)))
132             char logical-feature lang uri-char))
133           (princ
134            (format " <a href=\"%s?char=%s&feature=%s&format=wiki-text\"
135 ><input type=\"submit\" value=\"note\" /></a>"
136                    chise-wiki-edit-url
137                    (www-format-encode-string uri-char)
138                    (www-format-encode-string
139                     (www-uri-encode-feature-name
140                      (intern (format "%s*note" logical-feature))))))
141           (princ "</p>\n")
142           ))
143       (princ
144        (format "<p><a href=\"%s?char=%s\"
145 ><input type=\"submit\" value=\"add feature\" /></a></p>"
146                chise-wiki-add-url
147                (www-format-encode-string uri-char)))
148       )))
149
150 (defun www-set-display-feature-desc (feature-name property-name value
151                                                   &optional lang uri-char)
152   (www-html-display-paragraph
153    (format
154     "set: feature: %S, property-name: %S, value: %S, lang: %S, char: %S\n"
155     feature-name property-name value lang uri-char))
156   (put-char-feature-property feature-name property-name value)
157   (let ((name@lang (intern (format "name@%s" lang)))
158         (uri-feature-name (www-uri-encode-feature-name feature-name)))
159     (princ
160      (encode-coding-string
161       (format "<head>
162 <title>CHISE-wiki feature: %s</title>
163 </head>\n"
164               feature-name)
165       'utf-8-mcs-er))
166     (princ "<body>\n")
167     (princ
168      (encode-coding-string
169       (format "<h1>%s</h1>\n"
170               feature-name)
171       'utf-8-mcs-er))
172     (princ
173      (format "<p>name : %s <a href=\"%s?feature=%s&property=name\"
174 ><input type=\"submit\" value=\"edit\" /></a></p>
175 "
176              (or (www-format-feature-name feature-name) "")
177              chise-wiki-edit-url
178              ;; (char-feature-property feature-name 'name)
179              uri-feature-name ; (www-uri-encode-feature-name feature-name)
180              ))
181     (when lang
182       (princ
183        (format "<p>%s : %s <a href=\"%s?feature=%s&property=%s\"
184 ><input type=\"submit\" value=\"edit\" /></a></p>
185 "
186                name@lang
187                (www-format-encode-string
188                 (or (char-feature-property feature-name name@lang) ""))
189                chise-wiki-edit-url
190                uri-feature-name
191                name@lang)))
192     (www-html-display-paragraph
193      (format "type : %s"
194              (or (www-feature-type feature-name)
195                  ;; (char-feature-property feature-name 'type)
196                  'generic)))
197     (www-html-display-paragraph
198      (format "description : %s"
199              (or (char-feature-property feature-name 'description)
200                  "")))
201     (when lang
202       (www-html-display-paragraph
203        (format "description@%s : %s"
204                lang
205                (or (char-feature-property
206                     feature-name
207                     (intern (format "description@%s" lang)))
208                    ""))))
209     (princ "<hr />")
210     (www-html-display-paragraph
211      (format "「[[%c|../view.cgi?char=%s]]」に\u623Bる"
212              (www-uri-decode-char uri-char) uri-char))
213     ))
214
215 (defun www-batch-set ()
216   (setq terminal-coding-system 'binary)
217   (condition-case err
218       (let* ((target (pop command-line-args-left))
219              (user (pop command-line-args-left))
220              (accept-language (pop command-line-args-left))
221              (lang
222               (intern (car (split-string
223                             (car (split-string
224                                   (car (split-string accept-language ","))
225                                   ";"))
226                             "-"))))
227              ret name val prop)
228         (princ "Content-Type: text/html; charset=UTF-8
229
230 <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"
231             \"http://www.w3.org/TR/html4/loose.dtd\">
232 <html lang=\"ja\">
233 ")
234         (setq target
235               (mapcar (lambda (cell)
236                         (if (string-match "=" cell)
237                             (progn
238                               (setq name (substring
239                                           cell 0 (match-beginning 0))
240                                     val (substring cell (match-end 0)))
241                               (cons
242                                (intern
243                                 (decode-uri-string name 'utf-8-mcs-er))
244                                val))
245                           (list (decode-uri-string cell 'utf-8-mcs-er))))
246                       (split-string target "&")))
247         (setq ret (car target))
248         (cond ((eq (car ret) 'char)
249                (setq prop (nth 2 target))
250                (www-set-display-char-desc
251                 (cdr ret) ; (decode-uri-string (cdr ret) 'utf-8-mcs-er)
252                 (intern (decode-uri-string
253                          (cdr (assq 'feature-name target))
254                          'utf-8-mcs-er))
255                 (cdr prop) ; (decode-uri-string (cdr prop) 'utf-8-mcs-er)
256                 (car prop)
257                 lang)
258                )
259               ((eq (car ret) 'feature)
260                (setq prop (nth 2 target))
261                (www-set-display-feature-desc
262                 (intern (decode-uri-string (cdr ret) 'utf-8-mcs-er))
263                 (car prop)
264                 (decode-uri-string (cdr prop) 'utf-8-mcs-er)
265                 lang
266                 (cdr (assq 'char target))
267                 ;; (decode-uri-string (cdr (assq 'char target)))
268                 )
269                ))
270         (www-html-display-paragraph
271          (format "%S" target))
272         (princ "\n<hr>\n")
273         (princ (format "user=%s\n" user))
274         (princ (format "local user=%s\n" (user-login-name)))
275         (princ (format "lang=%S\n" lang))
276         (princ emacs-version)
277         (princ " CHISE ")
278         (princ xemacs-chise-version)
279         (princ "
280 </body>
281 </html>")
282         )
283     (error nil
284            (princ (format "%S" err)))
285     ))