1 ;; -*- coding: utf-8-mcs-er -*-
2 (require 'cwiki-common)
4 ;;; @ Feature value presentation
7 (defun est-eval-value-as-S-exp (value)
8 (list 'S-exp nil (format "%S" value)))
10 (defun est-eval-value-default (value)
12 (if (eq (car value) 'omitted)
20 (est-eval-value-as-S-exp value)))
22 (defun est-eval-value-as-object (value)
23 (if (or (characterp value)
24 (concord-object-p value))
25 (list 'object (list :object value)
26 (if (characterp value)
27 (char-to-string value)
28 (let ((genre-o (concord-decode-object
29 '=id (concord-object-genre value)
35 genre-o 'object-representative-format))
36 (est-eval-list format value nil))
37 (www-get-feature-value
40 (www-get-feature-value
41 genre-o 'object-representative-feature))
43 (est-eval-value-default value)))))
44 (est-eval-value-default value)))
46 (defun est-eval-value-as-HEX (value)
48 (list 'HEX nil (format "%X" value))
49 (est-eval-value-as-S-exp value)))
51 (defun est-eval-value-as-kuten (value)
57 (- (logand value 255) 32)))
58 (est-eval-value-as-S-exp value)))
60 (defun est-eval-value-as-kangxi-radical (value)
61 (if (and (integerp value)
66 (format "%c" (ideographic-radical value)))
67 (est-eval-value-as-S-exp value)))
69 (defun est-eval-value-as-object-list (value &optional separator)
73 (list :separator separator))
76 ;; (if (characterp unit)
77 ;; (list 'char-link nil (format "%c" unit))
78 ;; (format "%s" unit)))
80 (mapcar #'est-eval-value-as-object value)
84 (defun est-eval-value-as-ids (value)
86 (list 'ids nil (ideographic-structure-to-ids value))
89 (defun est-eval-value-as-space-separated-ids (value)
93 ;; (mapconcat #'char-to-string
94 ;; (ideographic-structure-to-ids value)
96 (mapcar #'est-eval-value-as-object
97 (ideographic-structure-to-ids value))
99 (est-eval-value-default value)))
101 (defun est-eval-value-as-domain-list (value)
103 (let (source item source-objs source0 start end num)
113 ((string-match "=" unit)
115 (substring unit 0 (match-beginning 0)))
116 item (car (read-from-string
117 (substring unit (match-end 0)))))
122 (est-eval-value-as-object
123 (or (concord-decode-object
124 '=id item 'book@ruimoku)
125 (concord-decode-object
126 '=id item 'article@ruimoku)
129 ((eq source 'zob1968)
130 (if (and (symbolp item)
131 (setq num (symbol-name item))
133 "^\\([0-9]+\\)-\\([0-9]+\\)$" num))
134 (setq start (string-to-number
135 (match-string 1 num))
136 end (string-to-number
137 (match-string 2 num)))
140 (if (not (numberp start))
143 (est-eval-value-as-object (intern unit))))
144 (if (eq source source0)
149 (format "http://chise.zinbun.kyoto-u.ac.jp/koukotsu/rubbings/%04d"
152 (setq source0 source)
157 (format "http://chise.zinbun.kyoto-u.ac.jp/koukotsu/rubbings/%04d"
162 (:ref "http://chise.zinbun.kyoto-u.ac.jp/koukotsu/")
163 "\u4EAC大人\u6587研甲\u9AA8")))
165 (setq num (1+ start))
171 (format "http://chise.zinbun.kyoto-u.ac.jp/koukotsu/rubbings/%04d"
176 (setq source-objs (nreverse source-objs)))
180 (list (est-eval-value-as-object (intern unit))))
183 (list :source source :item item)
187 (list 'res-link nil unit)
190 (est-eval-value-default value)))
193 ;;; @ format evaluator
196 ;; (defun est-make-env (object feature-name)
197 ;; (list (cons 'object object)
198 ;; (cons 'feature-name feature-name)))
200 ;; (defun est-env-push-item (env item value)
201 ;; (cons (cons item value)
204 ;; (defun est-env-get-item (env item)
205 ;; (cdr (assq item env)))
207 ;; (defun est-env-current-value (env)
208 ;; (let ((obj (est-env-get-item env 'object))
209 ;; (feature (est-env-get-item env 'feature-name)))
210 ;; (if (characterp obj)
211 ;; (char-feature obj feature)
212 ;; (concord-object-get obj feature))))
215 (defun est-eval-props-to-string (props &optional format)
217 (setq format (plist-get props :format)))
219 (plist-get props :flag)
220 (if (plist-get props :len)
222 (let ((ret (plist-get props :len)))
227 ((eq format 'decimal) "d")
228 ((eq format 'hex) "x")
229 ((eq format 'HEX) "X")
230 ((eq format 'S-exp) "S")
233 (defun est-eval-apply-value (object feature-name format props value
234 &optional uri-object)
237 :feature feature-name)
239 ((memq format '(decimal hex HEX))
243 (format (est-eval-props-to-string props format)
248 (list 'string nil (format "%s" value))
250 ((eq format 'wiki-text)
251 (est-eval-list value object feature-name nil uri-object)
254 (est-eval-value-as-S-exp value)
257 (est-eval-value-as-kuten value))
258 ((eq format 'kangxi-radical)
259 (est-eval-value-as-kangxi-radical value))
261 (est-eval-value-as-ids value))
262 ((or (eq format 'space-separated)
263 (eq format 'space-separated-char-list))
264 (est-eval-value-as-object-list value " "))
265 ((eq format 'space-separated-ids)
266 (est-eval-value-as-space-separated-ids value))
267 ((eq format 'space-separated-domain-list)
268 (est-eval-value-as-domain-list value))
270 (est-eval-value-default value)
274 (defun est-eval-feature-value (object feature-name
275 &optional format lang uri-object value)
277 (setq value (www-get-feature-value object feature-name)))
279 (setq format (www-feature-value-format feature-name)))
281 (let ((ret (condition-case nil
287 (list :object object :feature feature-name)
291 (est-eval-apply-value object feature-name
298 (setq format (car format))
299 (est-eval-apply-value object feature-name
300 (car format) (nth 1 format) value
304 (est-eval-list format object feature-name lang uri-object)
307 (defun est-eval-unit (exp object feature-name
308 &optional lang uri-object value)
310 (setq value (www-get-feature-value object feature-name)))
312 (setq uri-object (www-uri-encode-object object)))
315 ((or (characterp exp)
316 (concord-object-p exp))
317 (est-eval-value-as-object exp)
322 ((memq (car exp) '(value decimal hex HEX ku-ten kangxi-radical
323 S-exp string default))
324 (let ((fn (plist-get (nth 1 exp) :feature))
325 domain domain-fn ret)
328 (setq fn (intern fn)))
329 (setq domain (char-feature-name-domain feature-name))
330 (setq domain-fn (char-feature-name-at-domain fn domain))
331 (if (setq ret (www-get-feature-value object domain-fn))
332 (setq feature-name domain-fn
334 (setq feature-name fn
335 value (www-get-feature-value object fn)))
336 (push feature-name chise-wiki-displayed-features)
338 (if (eq (car exp) 'value)
339 (est-eval-feature-value object feature-name
340 (plist-get (nth 1 exp) :format)
341 lang uri-object value)
342 (est-eval-apply-value
344 (car exp) (nth 1 exp) value
347 ((eq (car exp) 'name)
348 (let ((fn (plist-get (nth 1 exp) :feature))
351 (setq domain (char-feature-name-domain feature-name))
353 (setq fn (intern fn)))
354 (setq domain-fn (char-feature-name-at-domain fn domain))
355 (setq feature-name domain-fn)))
358 :feature feature-name)
359 (www-format-feature-name* feature-name lang))
361 ((eq (car exp) 'name-url)
362 (let ((fn (plist-get (nth 1 exp) :feature))
363 (object (plist-get (nth 1 exp) :object))
366 (setq domain (char-feature-name-domain feature-name))
368 (setq fn (intern fn)))
369 (setq domain-fn (char-feature-name-at-domain fn domain))
370 (setq feature-name domain-fn)))
371 (list 'name-url (list :feature feature-name)
372 (www-uri-make-feature-name-url
373 (est-object-genre object)
374 (www-uri-encode-feature-name feature-name)
377 ((eq (car exp) 'domain-name)
378 (let ((domain (char-feature-name-domain feature-name)))
380 (format "@%s" domain)
383 ((eq (car exp) 'omitted)
385 (list :object object :feature feature-name)
388 ((eq (car exp) 'prev-char)
390 (list :object object :feature feature-name)
391 '(input (:type "submit" :value "-")))
393 ((eq (car exp) 'next-char)
395 (list :object object :feature feature-name)
396 '(input (:type "submit" :value "+")))
398 ((eq (car exp) 'link)
401 (est-eval-list (plist-get (nth 1 exp) :ref)
402 object feature-name lang uri-object))
403 (est-eval-list (nthcdr 2 exp)
404 object feature-name lang uri-object))
409 (defun est-eval-list (format-list object feature-name
410 &optional lang uri-object)
411 (if (consp format-list)
415 (est-eval-unit exp object feature-name lang uri-object nil))
418 (list* 'list nil ret)
420 (est-eval-unit format-list object feature-name lang uri-object nil)))
428 ;;; est-eval.el ends here