(www-format-encode-string): Copied from est/cwiki-common.el and modify
[chise/ids.git] / www / www-ids-find.el
1 (require 'ids-find)
2 (require 'cwiki-common)
3
4 (defun www-format-encode-string (string &optional without-tags as-body)
5   (with-temp-buffer
6     (insert string)
7     (let (plane code subcode start end char variants ret rret)
8       (when as-body
9         (goto-char (point-min))
10         (while (search-forward "&" nil t)
11           (replace-match "&" nil t)))
12       (goto-char (point-min))
13       (while (search-forward "<" nil t)
14         (replace-match "&lt;" nil t))
15       (goto-char (point-min))
16       (while (search-forward ">" nil t)
17         (replace-match "&gt;" nil t))
18       (if without-tags
19           (encode-coding-region (point-min)(point-max) 'utf-8-mcs-er)
20         (let ((coded-charset-entity-reference-alist
21                (list*
22                 '(=gt                   "GT-" 5 d)
23                 '(=mj                    "MJ" 6 d)
24                 '(=hanyo-denshi/ja   "HD-JA-" 4 X)
25                 '(=hanyo-denshi/jb   "HD-JB-" 4 X)
26                 '(=hanyo-denshi/jc   "HD-JC-" 4 X)
27                 '(=hanyo-denshi/jd   "HD-JD-" 4 X)
28                 '(=hanyo-denshi/ft   "HD-FT-" 4 X)
29                 '(=hanyo-denshi/ia   "HD-IA-" 4 X)
30                 '(=hanyo-denshi/ib   "HD-IB-" 4 X)
31                 '(=hanyo-denshi/hg   "HD-HG-" 4 X)
32                 '(=hanyo-denshi/ip   "HD-IP-" 4 X)
33                 '(=hanyo-denshi/jt   "HD-JT-" 4 X)
34                 '(=hanyo-denshi/ks   "HD-KS-" 6 d)
35                 '(=>>hanyo-denshi/ja "G-HD-JA-" 4 X)
36                 '(=>>hanyo-denshi/jb "G-HD-JB-" 4 X)
37                 '(=>>hanyo-denshi/jc "G-HD-JC-" 4 X)
38                 '(=>>hanyo-denshi/jd "G-HD-JD-" 4 X)
39                 '(=>>hanyo-denshi/ft "G-HD-FT-" 4 X)
40                 '(=>>hanyo-denshi/ia "G-HD-IA-" 4 X)
41                 '(=>>hanyo-denshi/ib "G-HD-IB-" 4 X)
42                 '(=>>hanyo-denshi/hg "G-HD-HG-" 4 X)
43                 '(=>>hanyo-denshi/ip "G-HD-IP-" 4 X)
44                 '(=>>hanyo-denshi/jt "G-HD-JT-" 4 X)
45                 '(=>>hanyo-denshi/ks "G-HD-KS-" 6 d)
46                 '(==mj                  "g2-MJ" 6 d)
47                 '(==hanyo-denshi/ja "g2-HD-JA-" 4 X)
48                 '(==hanyo-denshi/jb "g2-HD-JB-" 4 X)
49                 '(==hanyo-denshi/jc "g2-HD-JC-" 4 X)
50                 '(==hanyo-denshi/jd "g2-HD-JD-" 4 X)
51                 '(==hanyo-denshi/ft "g2-HD-FT-" 4 X)
52                 '(==hanyo-denshi/ia "g2-HD-IA-" 4 X)
53                 '(==hanyo-denshi/ib "g2-HD-IB-" 4 X)
54                 '(==hanyo-denshi/hg "g2-HD-HG-" 4 X)
55                 '(==hanyo-denshi/ip "g2-HD-IP-" 4 X)
56                 '(==hanyo-denshi/jt "g2-HD-JT-" 4 X)
57                 '(==hanyo-denshi/ks "g2-HD-KS-" 6 d)
58                 '(==daijiten          "g2-DJT-" 5 d)
59                 '(=cns11643-1           "C1-" 4 X)
60                 '(=cns11643-2           "C2-" 4 X)
61                 '(=cns11643-3           "C3-" 4 X)
62                 '(=cns11643-4           "C4-" 4 X)
63                 '(=cns11643-5           "C5-" 4 X)
64                 '(=cns11643-6           "C6-" 4 X)
65                 '(=cns11643-7           "C7-" 4 X)
66                 '(=adobe-japan1-6       "AJ1-" 5 d)
67                 '(=big5-cdp             "CDP-" 4 X)
68                 '(=>big5-cdp          "A-CDP-" 4 X)
69                 '(=gb2312               "G0-" 4 X)
70                 '(=gb12345              "G1-" 4 X)
71                 '(=jis-x0208@1990       "J90-" 4 X)
72                 '(=jis-x0212            "JSP-" 4 X)
73                 '(=cbeta                "CB" 5 d)
74                 '(=jis-x0208@1997       "J97-" 4 X)
75                 '(=jis-x0208@1978       "J78-" 4 X)
76                 '(=jis-x0208@1983       "J83-" 4 X)
77                 '(=ruimoku-v6           "RUI6-" 4 X)
78                 '(=zinbun-oracle        "ZOB-" 4 d)
79                 '(=daijiten             "DJT-" 5 d)
80                 '(=jef-china3           "JC3-" 4 X)
81                 '(=ucs@unicode          "UU+" 4 X)
82                 '(=ucs@JP/hanazono  "hanaJU+" 4 X)
83                 '(==cns11643-1        "R-C1-" 4 X)
84                 '(==cns11643-2        "R-C2-" 4 X)
85                 '(==cns11643-3        "R-C3-" 4 X)
86                 '(==cns11643-4        "R-C4-" 4 X)
87                 '(==cns11643-5        "R-C5-" 4 X)
88                 '(==cns11643-6        "R-C6-" 4 X)
89                 '(==cns11643-7        "R-C7-" 4 X)
90                 '(=hanziku-1         "HZK01-" 4 X)
91                 '(=hanziku-2         "HZK02-" 4 X)
92                 '(=hanziku-3         "HZK03-" 4 X)
93                 '(=hanziku-4         "HZK04-" 4 X)
94                 '(=hanziku-5         "HZK05-" 4 X)
95                 '(=hanziku-6         "HZK06-" 4 X)
96                 '(=hanziku-7         "HZK07-" 4 X)
97                 '(=hanziku-8         "HZK08-" 4 X)
98                 '(=hanziku-9         "HZK09-" 4 X)
99                 '(=hanziku-10        "HZK10-" 4 X)
100                 '(=hanziku-11        "HZK11-" 4 X)
101                 '(=hanziku-12        "HZK12-" 4 X)
102                 '(==>daijiten       "A2-DJT-" 5 d)
103                 '(==cbeta               "CB" 5 d)
104                 '(=big5                  "B-" 4 X)
105                 '(=daikanwa              "M-" 5 d)
106                 '(=>>daikanwa          "G-M-" 5 d)
107                 '(===ucs@ks           "R-KU+" 4 X)
108                 coded-charset-entity-reference-alist)))
109           (encode-coding-region (point-min)(point-max) 'utf-8-mcs-er)
110
111           (goto-char (point-min))
112           (while (re-search-forward "&\\(A-\\|G-\\|g2-\\|R-\\)?CB\\([0-9]+\\);" nil t)
113             (setq code (string-to-int (match-string 2)))
114             (replace-match
115              (format "<img alt=\"CB%05d\" src=\"%s/cb-gaiji/%02d/CB%05d.gif\"
116 style=\"%s\">"
117                      code
118                      chise-wiki-legacy-bitmap-glyphs-url
119                      (/ code 1000) code
120                      www-format-char-img-style)
121              t 'literal))
122
123           (goto-char (point-min))
124           (while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?J\\(78\\|83\\|90\\|97\\|SP\\)-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
125             (setq plane (match-string 2)
126                   code (string-to-int (match-string 3) 16))
127             (replace-match
128              (format "<img alt=\"J%s-%04X\" src=\"%s/JIS-%s/%02d-%02d.gif\"
129 style=\"%s\">"
130                      plane code
131                      chise-wiki-legacy-bitmap-glyphs-url
132                      plane
133                      (- (lsh code -8) 32)
134                      (- (logand code 255) 32)
135                      www-format-char-img-style)
136              t 'literal))
137
138           (goto-char (point-min))
139           (while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?J0-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
140             (setq code (string-to-int (match-string 2) 16))
141             (replace-match
142              (format "<img alt=\"J0-%04X\" src=\"%s/JIS-90/%02d-%02d.gif\"
143 style=\"%s\">"
144                      code
145                      chise-wiki-legacy-bitmap-glyphs-url
146                      (- (lsh code -8) 32)
147                      (- (logand code 255) 32)
148                      www-format-char-img-style)
149              t 'literal))
150
151           (goto-char (point-min))
152           (while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?HD-\\(JA\\|JB\\|JC\\|JD\\|FT\\|IA\\|IB\\|HG\\)-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
153             (setq plane (match-string 2)
154                   code (string-to-int (match-string 3) 16))
155             (replace-match
156              (format "<img alt=\"HD-%s-%04X\" src=\"%s/IVD/HanyoDenshi/%s%02d%02d.png\"
157 style=\"%s\">"
158                      plane code
159                      chise-wiki-legacy-bitmap-glyphs-url
160                      plane
161                      (- (lsh code -8) 32)
162                      (- (logand code 255) 32)
163                      www-format-char-img-style)
164              t 'literal))
165
166           (goto-char (point-min))
167           (while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?HD-\\(IP\\|JT\\)-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
168             (setq plane (match-string 2)
169                   code (string-to-int (match-string 3) 16))
170             (replace-match
171              (format "<img alt=\"HD-%s-%04X\" src=\"%s/IVD/HanyoDenshi/%s%04X.png\"
172 style=\"%s\">"
173                      plane code
174                      chise-wiki-legacy-bitmap-glyphs-url
175                      plane code
176                      www-format-char-img-style)
177              t 'literal))
178
179           (goto-char (point-min))
180           (while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?HD-KS-\\([0-9]+\\);" nil t)
181             (setq code (string-to-int (match-string 2)))
182             (replace-match
183              (format "<img alt=\"HD-KS%06d\" src=\"%s/IVD/HanyoDenshi/KS%06d.png\"
184 style=\"vertical-align:middle\">"
185                      code
186                      chise-wiki-legacy-bitmap-glyphs-url
187                      code
188                      www-format-char-img-style)
189              t 'literal))
190
191           (goto-char (point-min))
192           (while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?HD-TK-\\([0-9]+\\);" nil t)
193             (setq code (string-to-int (match-string 2)))
194             (replace-match
195              (format "<img alt=\"HD-KS%06d\" src=\"%s/IVD/HanyoDenshi/TK%08d.png\"
196 style=\"vertical-align:middle\">"
197                      code
198                      chise-wiki-legacy-bitmap-glyphs-url
199                      code
200                      www-format-char-img-style)
201              t 'literal))
202
203           (goto-char (point-min))
204           (while (re-search-forward "&G\\([01]\\)-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
205             (setq plane (string-to-int (match-string 1))
206                   code (string-to-int (match-string 2) 16))
207             (replace-match
208              (format "<img alt=\"GB%d-%04X\" src=\"%s/GB%d/%02d-%02d.gif\"
209 style=\"%s\">"
210                      plane code
211                      chise-wiki-legacy-bitmap-glyphs-url
212                      plane
213                      (- (lsh code -8) 32)
214                      (- (logand code 255) 32)
215                      www-format-char-img-style)
216              t 'literal))
217
218           (goto-char (point-min))
219           (while (re-search-forward "&\\(R-\\)?C\\([1-7]\\)-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
220             (setq plane (string-to-int (match-string 2))
221                   code (string-to-int (match-string 3) 16))
222             (replace-match
223              (format "<img alt=\"CNS%d-%04X\" src=\"%s/CNS%d/%04X.gif\"
224 style=\"%s\">"
225                      plane code
226                      chise-wiki-legacy-bitmap-glyphs-url
227                      plane code
228                      www-format-char-img-style)
229              t 'literal))
230
231           (goto-char (point-min))
232           (while (re-search-forward "&\\(R-\\)?JC3-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
233             (setq code (string-to-int (match-string 2) 16))
234             (replace-match
235              (format "<img alt=\"JC3-%04X\" src=\"%s/JEF-CHINA3/%04X.png\">"
236                      code chise-wiki-bitmap-glyph-image-url code)
237              t 'literal))
238
239           (goto-char (point-min))
240           (while (re-search-forward "&\\(A-\\)?ZOB-\\([0-9]+\\);" nil t)
241             (setq code (string-to-int (match-string 2)))
242             (replace-match
243              (format "<img alt=\"ZOB-%04d\" src=\"%s/ZOB-1968/%04d.png\"
244 style=\"vertical-align:middle\">"
245                      code
246                      chise-wiki-legacy-bitmap-glyphs-url
247                      code
248                      www-format-char-img-style)
249              t 'literal))
250
251           (goto-char (point-min))
252           (while (re-search-forward "&\\(A2-\\|g2-\\|R-\\)?DJT-\\([0-9]+\\);" nil t)
253             (setq code (string-to-int (match-string 2)))
254             (replace-match
255              (format "<img alt=\"DJT-%05d\" src=\"%s/%05d.png\"
256 style=\"vertical-align:middle; width: auto; max-height: 60px\">"
257                      code
258                      chise-wiki-daijiten-bitmap-glyphs-url
259                      code
260                      www-format-char-img-style)
261              t 'literal))
262
263           (goto-char (point-min))
264           (while (re-search-forward "&SW-JIGUGE\\([45]?\\)-\\([0-9]+\\);" nil t)
265             (setq subcode (match-string 1)
266                   code (string-to-int (match-string 2)))
267             (setq plane
268                   (if (string= subcode "")
269                       "5"
270                     subcode))
271             (replace-match
272              (format "<img alt=\"SW-JIGUGE%s-%05d\" src=\"%s/ShuoWen/Jiguge%s/%05d.png\"
273 style=\"vertical-align:middle; width: auto; max-height: 80px\">"
274                      plane code
275                      chise-wiki-legacy-bitmap-glyphs-url
276                      plane code)
277              t 'literal))
278
279           (goto-char (point-min))
280           (while (re-search-forward "&HNG\\([0-9]+\\)-\\([0-9][0-9][0-9][0-9]\\)\\([0-9]\\);" nil t)
281             (setq plane (match-string 1)
282                   code (string-to-int (match-string 2))
283                   subcode (string-to-int (match-string 3)))
284             (setq subcode
285                   (if (eq subcode 0)
286                       ""
287                     (char-to-string (decode-char 'ascii (+ 96 subcode)))))
288             (replace-match
289              (format
290               "<img alt=\"HNG%s-%04d%s\" src=\"%s/%s/%04d%s.png\" style=\"
291 vertical-align:middle; width: auto; max-height: 60px\">"
292               plane code subcode
293               chise-wiki-hng-bitmap-glyphs-url
294               plane code subcode
295               )
296              t 'literal))
297
298           (goto-char (point-min))
299           (while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?AJ1-\\([0-9]+\\);" nil t)
300             (setq code (string-to-int (match-string 2)))
301             (replace-match
302              (format "<img alt=\"AJ1-%05d\" src=\"%s/IVD/AdobeJapan1/CID+%d.png\"
303 style=\"vertical-align:middle\">"
304                      code
305                      chise-wiki-legacy-bitmap-glyphs-url
306                      code
307                      www-format-char-img-style)
308              t 'literal))
309
310           (goto-char (point-min))
311           (while (re-search-forward "&\\(A-\\|o-\\|G-\\|g2-\\|R-\\)?MJ\\([0-9]+\\);" nil t)
312             (setq code (string-to-int (match-string 2)))
313             (replace-match
314              (format "<img alt=\"MJ%06d\" src=\"https://moji.or.jp/mojikibansearch/img/MJ/MJ%06d.png\"
315 style=\"vertical-align:middle; width: 48px; height: 48px\">"
316                      code
317                      code
318                      www-format-char-img-style)
319              t 'literal))
320
321           (goto-char (point-min))
322           (while (re-search-forward "&\\(o-\\|G-\\|g2-\\)?IU[+-]\\([0-9A-F]+\\);" nil t)
323             (setq code (string-to-int (match-string 2) 16))
324             (replace-match
325              (format "<img alt=\"u%04x\" src=\"%s/u%04x.svg\"
326 style=\"vertical-align:middle; width: 48px; height: 48px\">"
327                      code
328                      chise-wiki-glyphwiki-glyph-image-url
329                      code
330                      www-format-char-img-style)
331              t 'literal))
332
333           (goto-char (point-min))
334           (while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?KU[+-]\\([0-9A-F]+\\);" nil t)
335             (setq code (string-to-int (match-string 2) 16))
336             (replace-match
337              (format "<img alt=\"u%04x-k\" src=\"%s/u%04x-k.svg\"
338 style=\"vertical-align:middle; width: 48px; height: 48px\">"
339                      code
340                      chise-wiki-glyphwiki-glyph-image-url
341                      code
342                      www-format-char-img-style)
343              t 'literal))
344
345           (goto-char (point-min))
346           (while (re-search-forward "&A-\\(comp\\|cgn\\)U[+-]\\([0-9A-F]+\\);" nil t)
347             (setq code (string-to-int (match-string 2) 16))
348             (replace-match
349              (format "<img alt=\"u%04x\" src=\"%s/u%04x.svg\"
350 style=\"vertical-align:middle; width: 48px; height: 48px\">"
351                      code
352                      chise-wiki-glyphwiki-glyph-image-url
353                      code
354                      www-format-char-img-style)
355              t 'literal))
356
357           (goto-char (point-min))
358           (while (re-search-forward
359                   "&\\(A-\\|g2-\\)?U-i\\([0-9]+\\)\\+\\([0-9A-F]+\\);"
360                   nil t)
361             (setq plane (string-to-int (match-string 2))
362                   code (string-to-int (match-string 3) 16))
363             (replace-match
364              (format "<img alt=\"u%04x-itaiji-%03d\" src=\"%s/u%04x-itaiji-%03d.svg\"
365 style=\"vertical-align:middle; width: 48px; height: 48px\">"
366                      code
367                      plane
368                      chise-wiki-glyphwiki-glyph-image-url
369                      code
370                      plane
371                      www-format-char-img-style)
372              t 'literal))
373
374           (goto-char (point-min))
375           (while (re-search-forward "&A-IWDSU\\+\\([0-9A-F]+\\);" nil t)
376             (setq code (string-to-int (match-string 1) 16))
377             (replace-match
378              (format "<img alt=\"A-IWDSU+%04x\" src=\"%s/u%04x.svg\"
379 style=\"vertical-align:middle; width: 48px; height: 48px\">"
380                      code
381                      chise-wiki-glyphwiki-glyph-image-url
382                      code
383                      www-format-char-img-style)
384              t 'literal))
385
386           (goto-char (point-min))
387           (while (re-search-forward
388                   "&\\(A-\\)?CDP-i\\([0-9]+\\)-\\([0-9A-F]+\\);"
389                   nil t)
390             (setq plane (string-to-int (match-string 2))
391                   code (string-to-int (match-string 3) 16))
392             (replace-match
393              (format "<img alt=\"cdp-%04x-itaiji-%03d\" src=\"%s/cdp-%04x-itaiji-%03d.svg\"
394 style=\"vertical-align:middle; width: 48px; height: 48px\">"
395                      code
396                      plane
397                      chise-wiki-glyphwiki-glyph-image-url
398                      code
399                      plane
400                      www-format-char-img-style)
401              t 'literal))
402
403           (goto-char (point-min))
404           (while (re-search-forward
405                   "&\\(A-\\)?CDP-v\\([0-9]+\\)-\\([0-9A-F]+\\);"
406                   nil t)
407             (setq plane (string-to-int (match-string 2))
408                   code (string-to-int (match-string 3) 16))
409             (replace-match
410              (format "<img alt=\"cdp-%04x-var-%03d\" src=\"%s/cdp-%04x-var-%03d.svg\"
411 style=\"vertical-align:middle; width: 48px; height: 48px\">"
412                      code
413                      plane
414                      chise-wiki-glyphwiki-glyph-image-url
415                      code
416                      plane
417                      www-format-char-img-style)
418              t 'literal))
419
420           (goto-char (point-min))
421           (while (re-search-forward
422                   "&\\(A-\\|G-\\|g2-\\|R-\\)?M-\\([0-9]+\\);"
423                   nil t)
424             (setq code (string-to-int (match-string 2)))
425             (replace-match
426              (format "<img alt=\"dkw-%05d\" src=\"%s/dkw-%05d.svg\"
427 style=\"vertical-align:middle; width: 48px; height: 48px\">"
428                      code
429                      chise-wiki-glyphwiki-glyph-image-url
430                      code
431                      www-format-char-img-style)
432              t 'literal))
433
434           (goto-char (point-min))
435           (while (re-search-forward "&\\(g2-\\)?U-v\\([0-9]+\\)\\+\\([0-9A-F]+\\);" nil t)
436             (setq plane (string-to-int (match-string 2))
437                   code (string-to-int (match-string 3) 16))
438             (replace-match
439              (format "<img alt=\"u%04x-var-%03d\" src=\"%s/u%04x-var-%03d.svg\"
440 style=\"vertical-align:middle; width: 48px; height: 48px\">"
441                      code
442                      plane
443                      chise-wiki-glyphwiki-glyph-image-url
444                      code
445                      plane
446                      www-format-char-img-style)
447              t 'literal))
448
449           (goto-char (point-min))
450           (while (re-search-forward "&\\(A-\\|G-\\|R-\\|g2-\\)?GT-\\([0-9]+\\);" nil t)
451             (setq code (string-to-int (match-string 2)))
452             (replace-match
453              (format "<img alt=\"GT-%05d\" src=\"%s?char=GT-%05d\"
454 style=\"%s\">"
455                      code
456                      chise-wiki-glyph-cgi-url
457                      code
458                      www-format-char-img-style)
459              t 'literal))
460
461           (goto-char (point-min))
462           (while (re-search-forward "&\\(A-\\|G-\\|g2-\\)?GT-K\\([0-9]+\\);" nil t)
463             (setq code (string-to-int (match-string 2)))
464             (replace-match
465              (format "<img alt=\"GT-K%05d\" src=\"%s?char=GT-K%05d\"
466 style=\"%s\">"
467                      code
468                      chise-wiki-glyph-cgi-url
469                      code
470                      www-format-char-img-style)
471              t 'literal))
472
473           (goto-char (point-min))
474           (while (re-search-forward "&B-\\([0-9A-F]+\\);" nil t)
475             (setq code (string-to-int (match-string 1) 16))
476             (replace-match
477              (format "<img alt=\"B-%04X\" src=\"%s?char=B-%04X\"
478 style=\"%s\">"
479                      code
480                      chise-wiki-glyph-cgi-url
481                      code
482                      www-format-char-img-style)
483              t 'literal))
484
485           (goto-char (point-min))
486           (while (re-search-forward
487                   "&\\(A-\\|G-\\|g2-\\|R-\\)?CDP-\\([0-9A-F]+\\);" nil t)
488             (setq code (string-to-int (match-string 2) 16))
489             (replace-match
490              (format "<img alt=\"CDP-%04X\" src=\"%s?char=CDP-%04X\"
491 style=\"%s\">"
492                      code
493                      chise-wiki-glyph-cgi-url
494                      code
495                      www-format-char-img-style)
496              t 'literal))
497
498           (goto-char (point-min))
499           (while (re-search-forward
500                   "&\\(I-\\)?HZK\\(0[1-9]\\|1[0-2]\\)-\\([0-9A-F]+\\);" nil t)
501             (setq plane (match-string 2)
502                   code (string-to-int (match-string 3) 16))
503             (replace-match
504              (format "<img alt=\"HZK%s-%04X\" src=\"%s?char=HZK%s-%04X\"
505 style=\"%s\">"
506                      plane
507                      code
508                      chise-wiki-glyph-cgi-url
509                      plane
510                      code
511                      www-format-char-img-style)
512              t 'literal))
513
514           (goto-char (point-min))
515           (while (re-search-forward "&\\(A-\\|G-\\|g2-\\|R-\\)?RUI6-\\([0-9A-F]+\\);" nil t)
516             (setq code (string-to-int (match-string 2) 16))
517             (replace-match
518              (format "<img alt=\"RUI6-%04X\" src=\"%s?char=RUI6-%04X\"
519 style=\"vertical-align:middle\">"
520                      code
521                      chise-wiki-glyph-cgi-url
522                      code
523                      www-format-char-img-style)
524              t 'literal))
525
526           (goto-char (point-min))
527           (while (re-search-forward "&hanaJU\\+\\([0-9A-F]+\\);" nil t)
528             (setq code (string-to-int (match-string 1) 16))
529             (replace-match
530              (format "<img alt=\"hanaJU+%04X\" src=\"%s?char=hana-JU+%04X\"
531 style=\"vertical-align:middle\">"
532                      code
533                      chise-wiki-glyph-cgi-url
534                      code
535                      www-format-char-img-style)
536              t 'literal))
537
538           (goto-char (point-min))
539           (while (re-search-forward "&\\(A-\\|G-\\|g2-\\|R-\\)?\\(UU\\+\\|U-\\)\\([0-9A-F]+\\);" nil t)
540             (setq code (string-to-int (match-string 3) 16))
541             (replace-match
542              (format "<img alt=\"UU+%04X\" src=\"https://www.unicode.org/cgi-bin/refglyph?24-%04X\"
543 style=\"vertical-align:middle\">"
544                      code
545                      code
546                      www-format-char-img-style)
547              t 'literal))
548
549           (goto-char (point-min))
550           (while (re-search-forward "&MCS-\\([0-9A-F]+\\);" nil t)
551             (setq code (string-to-int (match-string 1) 16))
552             (setq start (match-beginning 0)
553                   end (match-end 0))
554             (setq char (decode-char 'system-char-id code))
555             (cond
556              ((and (setq variants
557                          (or (www-get-feature-value char '->subsumptive)
558                              (www-get-feature-value char '->denotational)))
559                    (progn
560                      (if (characterp variants)
561                          (setq variants (list variants)))
562                      (while (and variants
563                                  (setq ret (www-format-encode-string
564                                             (char-to-string (car variants))))
565                                  (string-match "&MCS-\\([0-9A-F]+\\);" ret))
566                        (setq variants (cdr variants)))
567                      ret))
568               (unless (string-match "&MCS-\\([0-9A-F]+\\);" ret)
569                 (goto-char start)
570                 (delete-region start end)
571                 (insert ret))
572               )
573              ((setq ret (or (www-get-feature-value char 'ideographic-combination)
574                             (www-get-feature-value char 'ideographic-structure)))
575               (setq ret
576                     (mapconcat
577                      (lambda (ch)
578                        (if (listp ch)
579                            (if (characterp (setq rret (find-char ch)))
580                                (setq ch rret)))
581                        (if (characterp ch)
582                            (www-format-encode-string
583                             (char-to-string ch) without-tags)
584                          (www-format-encode-string
585                           (format "%S" ch) without-tags)))
586                      ret ""))
587               (when ret
588                 (goto-char start)
589                 (delete-region start end)
590                 (insert ret))
591               )))
592           ))
593       ;; (goto-char (point-min))
594       ;; (while (search-forward "&GT-" nil t)
595       ;;   (replace-match "&amp;GT-" t 'literal))
596       (buffer-string))))
597
598 (setq www-format-char-img-style "vertical-align:middle;")
599
600 (defun decode-url-string (string &optional coding-system)
601   (if (> (length string) 0)
602       (let ((i 0)
603             dest)
604         (while (string-match "%\\([0-9A-F][0-9A-F]\\)" string i)
605           (setq dest (concat dest
606                              (substring string i (match-beginning 0))
607                              (char-to-string
608                               (int-char
609                                (string-to-int (match-string 1 string) 16))))
610                 i (match-end 0)))
611         (decode-coding-string
612          (concat dest (substring string i))
613          coding-system))))
614
615 (defconst www-ids-find-version "0.99.2")
616
617 (defvar www-ids-find-ideographic-products-file-name
618   (expand-file-name "ideographic-products"
619                     (expand-file-name
620                      "feature"
621                      (expand-file-name
622                       "character"
623                       chise-system-db-directory))))
624
625 (defvar www-ids-find-char-viewer-url
626   "/est/view/character/")
627
628 (defvar www-ids-find-chise-link-map-url-prefix
629   "http://fonts.jp/chise_linkmap/map.cgi?code=")
630
631 (defvar www-ids-find-tang-chars-file-name
632   "~tomo/projects/chise/ids/www/tang-chars.udd")
633
634 (defun www-ids-find-format-char (c &optional code-desc)
635   (princ
636    (format "<a href=\"%s%s\">%s</a>"
637            www-ids-find-char-viewer-url
638            (www-uri-encode-object c)
639            (www-format-encode-string (char-to-string c))))
640   ;; (let ((str (encode-coding-string (format "%c" c) 'utf-8-er))
641   ;;       plane code)
642   ;;   (princ
643   ;;    (with-temp-buffer
644   ;;      (cond
645   ;;       ((string-match "&CB\\([0-9]+\\);" str)
646   ;;        (setq code (string-to-int (match-string 1 str)))
647   ;;        (insert (format "<a href=\"%s"
648   ;;                        www-ids-find-char-viewer-url))
649   ;;        (insert str)
650   ;;        (insert (format "\"><img alt=\"CB%05d\" src=\"/glyphs/cb-gaiji/%02d/CB%05d.gif\">\n"
651   ;;                        code (/ code 1000) code))
652   ;;        (when code-desc
653   ;;          (insert (format "CB%05d</a>" code)))
654   ;;        )
655   ;;       ((string-match "&JC3-\\([0-9A-F]+\\);" str)
656   ;;        (setq code (string-to-int (match-string 1 str) 16))
657   ;;        (insert (format "<a href=\"%s"
658   ;;                        www-ids-find-char-viewer-url))
659   ;;        (insert str)
660   ;;        (insert (format "\"><img alt=\"JC3-%04X\" src=\"http://kanji.zinbun.kyoto-u.ac.jp/db/CHINA3/Gaiji/%04x.gif\">\n"
661   ;;                        code code))
662   ;;        (when code-desc
663   ;;          (insert (format "JC3-%04X</a>" code)))
664   ;;        )
665   ;;       ((string-match "&J\\(78\\|83\\|90\\|SP\\)-\\([0-9A-F]+\\);" str)
666   ;;        (setq plane (match-string 1 str)
667   ;;              code (string-to-int (match-string 2 str) 16))
668   ;;        (insert (format "<a href=\"%s"
669   ;;                        www-ids-find-char-viewer-url))
670   ;;        (insert str)
671   ;;        (insert (format "\"><img alt=\"J%s-%04X\" src=\"/glyphs/JIS-%s/%02d-%02d.gif\">\n"
672   ;;                        plane code plane
673   ;;                        (- (lsh code -8) 32)
674   ;;                        (- (logand code 255) 32)))
675   ;;        (when code-desc
676   ;;          (insert (format "J%s-%04X</a>" plane code)))
677   ;;        )
678   ;;       ((string-match "&G\\([01]\\)-\\([0-9A-F]+\\);" str)
679   ;;        (setq plane (string-to-int (match-string 1 str))
680   ;;              code (string-to-int (match-string 2 str) 16))
681   ;;        (insert (format "<a href=\"%s"
682   ;;                        www-ids-find-char-viewer-url))
683   ;;        (insert str)
684   ;;        (insert (format "\"><img alt=\"G%d-%04X\" src=\"/glyphs/GB%d/%02d-%02d.gif\">\n"
685   ;;                        plane code plane
686   ;;                        (- (lsh code -8) 32)
687   ;;                        (- (logand code 255) 32)))
688   ;;        (when code-desc
689   ;;          (insert (format "G%d-%04X</a>" plane code)))
690   ;;        )
691   ;;       ((string-match "&C\\([1-7]\\)-\\([0-9A-F]+\\);" str)
692   ;;        (setq plane (string-to-int (match-string 1 str))
693   ;;              code (string-to-int (match-string 2 str) 16))
694   ;;        (insert (format "<a href=\"%s"
695   ;;                        www-ids-find-char-viewer-url))
696   ;;        (insert str)
697   ;;        (insert (format "\"><img alt=\"C%d-%04X\" src=\"/glyphs/CNS%d/%04X.gif\">\n"
698   ;;                        plane code plane code))
699   ;;        (when code-desc
700   ;;          (insert (format "C%d-%04X</a>" plane code)))
701   ;;        )
702   ;;       ((string-match "&ZOB-\\([0-9]+\\);" str)
703   ;;        (setq code (string-to-int (match-string 1 str)))
704   ;;        (insert (format "<a href=\"%s"
705   ;;                        www-ids-find-char-viewer-url))
706   ;;        (insert str)
707   ;;        (insert (format "\"><img alt=\"ZOB-%04d\" src=\"/glyphs/ZOB-1968/%04d.png\">\n"
708   ;;                        code code))
709   ;;        (when code-desc
710   ;;          (insert (format "ZOB-%04d</a>" code)))
711   ;;        )
712   ;;       (t
713   ;;        (insert (format "<a href=\"%s"
714   ;;                        www-ids-find-char-viewer-url))
715   ;;        ;; (insert str)
716   ;;        (insert
717   ;;         (mapconcat (lambda (c)
718   ;;                      (if (<= (char-int c) #x7F)
719   ;;                          (char-to-string c)
720   ;;                        (format "%%%02X" c)))
721   ;;                    str ""))
722   ;;        (insert "\">")
723   ;;        (insert str)
724   ;;        (insert "</a>")
725   ;;        ))
726   ;;      (goto-char (point-min))
727   ;;      (while (search-forward "&" nil t)
728   ;;        (replace-match "&amp;" t 'literal))
729   ;;      (buffer-string))))
730   )
731   
732 (defun www-ids-find-format-line (c is)
733   (let (ucs len i ids)
734     (princ "<span class=\"entry\">")
735     (www-ids-find-format-char c 'code-desc)
736     (princ "</span>")
737     (princ
738      (or (if (setq ucs (or (char-ucs c)
739                            (encode-char c 'ucs)))
740              (format
741               " <a href=\"http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%X\">%s</a>"
742               ucs
743               (cond ((<= ucs #xFFFF)
744                      (format "U+%04X" ucs))
745                     ((<= ucs #x10FFFF)
746                      (format "U-%08X" ucs))))
747            "          ")))
748     (when ucs
749       (princ
750        (format " <a href=\"%s%X\">(link map)</a>"
751                www-ids-find-chise-link-map-url-prefix ucs)))
752     (princ " ")
753     (when is
754       (setq ids (ideographic-structure-to-ids is))
755       (setq i 0
756             len (length ids))
757       (princ "<span class=\"ids\">")      
758       (while (< i len)
759         (www-ids-find-format-char (aref ids i))
760         (setq i (1+ i)))
761       (princ "</span>"))
762     (when (and ucs
763                (with-current-buffer
764                    (find-file-noselect
765                     www-ids-find-tang-chars-file-name)
766                  (goto-char (point-min))
767                  (re-search-forward (format "^%d$" ucs) nil t)))
768       (princ
769        (format " <a href=\"http://coe21.zinbun.kyoto-u.ac.jp/djvuchar?query=%s\">"
770                (mapconcat
771                 (lambda (c)
772                   (format "%%%02X" (char-int c)))
773                 (encode-coding-string (char-to-string c)
774                                       'utf-8-jp)
775                 "")))
776       (princ (encode-coding-string "\e$B"M\e(B[\e$BEbBeBsK\\e(B]</a>" 'utf-8-jp-er)))
777     (princ "<br>\n")))
778
779 (defun www-ids-insert-chars-including-components* (components
780                                                    &optional ignored-chars products)
781   (unless products
782     (setq products (ideograph-find-products components ignored-chars)))
783   (let (is as bs len)
784     (setq len (length products))
785     (princ "<ul>\n")
786     (dolist (c (cond
787                 ((>= len 1024)
788                  (sort (copy-list products)
789                        (lambda (a b)
790                          (< (char-int a)(char-int b))))
791                  )
792                 ((>= len 512)
793                  (sort (copy-list products)
794                        (lambda (a b)
795                          (if (setq as (char-total-strokes a))
796                              (if (setq bs (char-total-strokes b))
797                                  (if (= as bs)
798                                      (< (char-int a)(char-int b))
799                                    (< as bs))
800                                t)
801                            (< (char-int a)(char-int b)))))
802                  )
803                 (t
804                  (sort (copy-list products)
805                        (lambda (a b)
806                          (if (setq as (char-total-strokes a))
807                              (if (setq bs (char-total-strokes b))
808                                  (if (= as bs)
809                                      (ideograph-char< a b)
810                                    (< as bs))
811                                t)
812                            (ideograph-char< a b))))
813                  )))
814       (unless (memq c ignored-chars)
815         (setq is (char-feature c 'ideographic-structure))
816         (princ "<li>")
817         (www-ids-find-format-line c is)
818         (setq ignored-chars
819               (www-ids-insert-chars-including-components*
820                (char-to-string c) (cons c ignored-chars)))
821         )
822       )
823     (princ "</ul>\n")
824     )
825   ignored-chars)
826
827 (defun www-ids-insert-chars-including-components (components
828                                                   &optional ignored-chars)
829   (let ((products (ideograph-find-products components ignored-chars))
830         is as bs len ignore-children)
831     (setq len (length products))
832     (when (>= len 1024)
833       (setq ignore-children t)
834       (princ
835        (encode-coding-string
836         "<p>\e$B7k2L$,B?$9$.$k$?$a!":F5"E*8!:w$r>JN,$7$^$7$?!#\e(B</p>"
837         'utf-8-jp-er)))
838     (if (>= len 2048)
839         (dolist (c products)
840           (www-ids-find-format-char c))
841       (setq ignored-chars
842             (nreverse
843              (www-ids-insert-chars-including-components* components ignored-chars products)))
844       (dolist (c ignored-chars)
845         (dolist (vc (char-component-variants c))
846           (unless (memq vc ignored-chars)
847             (when (setq is (get-char-attribute vc 'ideographic-structure))
848               (princ "<li>")
849               (www-ids-find-format-line vc is)
850               (setq ignored-chars
851                     (www-ids-insert-chars-including-components*
852                      (char-to-string vc)
853                      (cons vc ignored-chars)))))))
854       (setq products (ideograph-find-products-with-variants components ignored-chars))
855       (setq len (length products))
856       (when (>= len 512)
857         (setq ignore-children t)
858         (princ
859          (encode-coding-string
860           "<p>\e$B7k2L$,B?$9$.$k$?$a!"4XO";z$N:F5"E*8!:w$r>JN,$7$^$7$?!#\e(B</p>"
861           'utf-8-jp-er)))
862       (if (>= len 1024)
863           (dolist (c products)
864             (www-ids-find-format-char c))
865         (dolist (c (sort (copy-tree products)
866                          (lambda (a b)
867                            (if (setq as (char-total-strokes a))
868                                (if (setq bs (char-total-strokes b))
869                                    (if (= as bs)
870                                        (ideograph-char< a b)
871                                      (< as bs))
872                                  t)
873                              (ideograph-char< a b)))))
874           (unless (memq c ignored-chars)
875             (setq is (get-char-attribute c 'ideographic-structure))
876             (princ "<li>")
877             (www-ids-find-format-line c is)
878             (unless ignore-children
879               (setq ignored-chars
880                     (www-ids-insert-chars-including-components*
881                      (char-to-string c)
882                      (cons c ignored-chars))))
883             ))
884         ))
885     )
886   ignored-chars)
887
888 (defun www-batch-ids-find ()
889   (let ((components (car command-line-args-left))
890         (coded-charset-entity-reference-alist
891          (list*
892           '(=cns11643-1         "C1-" 4 X)
893           '(=cns11643-2         "C2-" 4 X)
894           '(=cns11643-3         "C3-" 4 X)
895           '(=cns11643-4         "C4-" 4 X)
896           '(=cns11643-5         "C5-" 4 X)
897           '(=cns11643-6         "C6-" 4 X)
898           '(=cns11643-7         "C7-" 4 X)
899           '(=gb2312             "G0-" 4 X)
900           '(=gb12345            "G1-" 4 X)
901           '(=jis-x0208@1990     "J90-" 4 X)
902           '(=jis-x0212          "JSP-" 4 X)
903           '(=cbeta              "CB" 5 d)
904           '(=jef-china3         "JC3-" 4 X)
905           '(=jis-x0208@1978     "J78-" 4 X)
906           '(=jis-x0208@1983     "J83-" 4 X)
907           '(=daikanwa           "M-" 5 d)
908           coded-charset-entity-reference-alist))
909         )
910     (setq command-line-args-left (cdr command-line-args-left))
911     (cond
912      ((stringp components)
913       (if (string-match "^components=" components)
914           (setq components (substring components (match-end 0))))
915       (setq components
916             (if (> (length components) 0)
917                 (decode-url-string components 'utf-8-er)
918               nil))
919       )
920      (t
921       (setq components nil)
922       ))
923     (princ "Content-Type: text/html; charset=UTF-8
924
925 <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"
926             \"http://www.w3.org/TR/html4/loose.dtd\">
927 <html lang=\"ja\">
928 <head>
929 <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">
930 <title>CHISE IDS Find</title>
931 <link href=\"/css/bootstrap-4.5.0.min.css\" rel=\"stylesheet\">
932 <style type=\"text/css\">
933 <!--
934 .entry { font-size: 36px; }
935 .entry a img { height: 36px; }
936 .ids { font-size: 24px; }
937 .ids a img { height: 24px; }
938 img { vertical-align:middle; }
939 a { text-decoration:none; }
940 ul { margin: 0 0; }
941 li { margin: 0 0 -0.2em; }
942 .tooltip {
943     position: relative;
944     display: inline-block;
945 }
946 .tooltip .tooltiptext {
947     display: none;
948 }
949 -->
950 </style>
951 </head>
952
953 <body>
954
955 <div class=\"jumbotron jumbotron-fluid mb-0\">
956 <h1 class=\"display-4 text-center\">")
957     (princ (encode-coding-string "CHISE IDS \e$B4A;z8!:w\e(B" 'utf-8-jp-er))
958     (princ "</h1>")
959     (princ "
960 <p class=\"text-center\">Version ")
961     (princ www-ids-find-version)
962     (princ (format-time-string
963             " (Last-modified: %Y-%m-%d %H:%M:%S)</p>"
964             (nth 5
965                  (file-attributes
966                   www-ids-find-ideographic-products-file-name))))
967     (princ "
968 </div>
969 <div class=\"container mt-0 mw-100 d-inline-block align-top bg-dark\">
970 <p />
971 <div class=\"input-group mb-3 h3 my-4\">
972 <div class=\"input-group-prepend mw-75 ml-3\">
973 <form action=\"/ids-find\" method=\"GET\">
974 <span class=\"input-group-text\" id=\"basic-addon1\">
975 ")
976     (princ (encode-coding-string "\e$BItIJJ8;zNs\e(B" 'utf-8-jp-er))
977     (princ "</span>
978 </div>
979 <input type=\"text\" class=\"form-control\" aria-describedby=\"basic-addon1\" name=\"components\" size=\"30\" maxlength=\"30\" value=\"")
980     (if (> (length components) 0)
981         (princ (encode-coding-string components 'utf-8-er)))
982     (princ "\">
983 <input class=\"mr-3\" type=\"submit\" value=\"")
984     (princ (encode-coding-string "\e$B8!:w3+;O\e(B" 'utf-8-jp-er))
985     (princ "\">
986 </form>
987 </div>
988 </div>
989
990 ")
991     (unless (file-newer-than-file-p
992              www-ids-find-ideographic-products-file-name
993              (locate-file (car command-line-args) exec-path))
994       (princ (encode-coding-string "<hr>
995 <p>
996 \e$B8=:_!"%7%9%F%`$N99?7:n6HCf$G$9!#$7$P$i$/$*BT$A$/$@$5$$!#\e(B
997 <hr>
998 " 'utf-8-jp-er))
999       ;; (setq components nil)
1000       )
1001     (cond
1002      (components
1003       (princ "<div class=\"container\">
1004 ")
1005       ;; (map-char-attribute
1006       ;;  (lambda (c v)
1007       ;;    (when (every (lambda (p)
1008       ;;                   (ideographic-structure-member p v))
1009       ;;                 components)
1010       ;;      (princ (encode-coding-string
1011       ;;              (ids-find-format-line c v)
1012       ;;              'utf-8-jp-er))
1013       ;;      (princ "<br>\n")
1014       ;;      )
1015       ;;    nil)
1016       ;;  'ideographic-structure)
1017       (when (= (length components) 1)
1018         (www-ids-find-format-line (aref components 0)
1019                                   (char-feature (aref components 0)
1020                                                 'ideographic-structure)))
1021       ;; (dolist (c (ideographic-products-find components))
1022       ;;   (setq is (char-feature c 'ideographic-structure))
1023       ;;   ;; to avoid problems caused by wrong indexes
1024       ;;   (when (every (lambda (c)
1025       ;;                  (ideographic-structure-member c is))
1026       ;;                components)
1027       ;;     (www-ids-find-format-line c is)))
1028       ;; (princ "<ul>\n")
1029       (www-ids-insert-chars-including-components components)
1030       ;; (princ "</ul>\n")
1031       (princ "</div>\n")
1032       )
1033      (t
1034       (princ (encode-coding-string "<div class=\"container mt-4\">
1035 <div class=\"ml-3\">
1036 <p>
1037 \e$B;XDj$7$?ItIJ$rA4$F4^$`4A;z$N0lMw$rI=<($7$^$9!#\e(B
1038 </p>
1039 <p>
1040 CHISE \e$B$GMQ$$$i$l$k<BBV;2>H7A<0!JNc!'\e(B&amp;M-00256;\e$B!K$GItIJ$r;XDj$9$k;v$b$G$-$^$9!#\e(B
1041 </p>
1042 </div>
1043 " 'utf-8-jp-er))
1044       (princ (encode-coding-string "
1045 <p  class=\"ml-0\">
1046 \[Links\]
1047 <ul>
1048 <li><a href=\"http://www.shuiren.org/chuden/toyoshi/syoseki/chise_ids.html\"
1049 >\e$B!V\e(BCHISE IDS FIND\e$B$G4A;z$r8!:w!W\e(B</a> \e$B!=\e(B \e$B;3ED?r?N$5$s!J\e(B<a
1050 href=\"http://www.shuiren.org/\">\e$B?g?MDb\e(B</a>\e$B!K$K$h$k2r@b\e(B
1051 </ul>
1052 <ul>
1053 <li><a href=\"http://www.karitsu.org/tools/firefox_plugin.htm\"
1054 >Firefox \e$BMQ\e(B plugin</a> by \e$B=);3M[0lO:$5$s!J\e(B<a href=\"http://www.karitsu.org/\"
1055 >\e$B2aN)c7\e(B</a>\e$B!K\e(B
1056 </ul>
1057 <ul>
1058 <li><a href=\"http://git.chise.org/gitweb/?p=chise/ids.git;a=blob;f=www/www-ids-find.el\"
1059 >www-ids-find.el (source file (Emacs Lisp part))
1060 <li><a href=\"http://www.chise.org/ids/\"
1061 >\e$B!V\e(BCHISE \e$B4A;z9=B$>pJs%G!<%?%Y!<%9!W\e(B</a>
1062 <li><a href=\"http://fonts.jp/chise_linkmap/\"
1063 >\e$B!V\e(Bchise_linkmap : CHISE \e$B4A;zO"4D?^!W\e(B</a> by \e$B>eCO9(0l$5$s\e(B
1064 <li><a href=\"http://www.chise.org/\"
1065 >CHISE Project</a>
1066 </ul>
1067 <ul>
1068 <li><a href=\"http://coe21.zinbun.kyoto-u.ac.jp/djvuchar\"
1069 >\e$B!VBsK\J8;z%G!<%?%Y!<%9!W\e(B</a> by
1070 <a href=\"http://coe21.zinbun.kyoto-u.ac.jp/\"
1071 >\e$B5~ETBg3X\e(B21\e$B@$5*\e(BCOE\e$B!VEl%"%8%"@$3&$N?MJ8>pJs3X8&5f650i5rE@!W\e(B</a>
1072 <li><a href=\"http://www.unicode.org/\"
1073 >Unicode</a>
1074 </ul>
1075 </p>
1076 </div>
1077 "
1078  'utf-8-jp-er))
1079
1080       ))
1081     (princ "<hr>
1082 <div class=\"container\">
1083 ")
1084     (princ "<div class=\"ml-0\">
1085 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2015, 2016, 2017, 2020 <a href=\"http://kanji.zinbun.kyoto-u.ac.jp/~tomo/\"
1086 >MORIOKA Tomohiko</a></div>")
1087     (princ
1088      (format
1089       "<div>Powered by <a
1090 href=\"http://www.chise.org/xemacs/\"
1091 >XEmacs CHISE</a> %s.</div>"
1092       (encode-coding-string xemacs-chise-version 'utf-8-jp-er)))
1093     (princ "
1094 </div>
1095 </body>
1096 </html>
1097 ")))