(require 'ids-find)
(require 'cwiki-common)
(defun www-format-encode-string (string &optional without-tags as-body)
(with-temp-buffer
(insert string)
(let (plane code subcode start end char variants ret rret)
(when as-body
(goto-char (point-min))
(while (search-forward "&" nil t)
(replace-match "&" nil t)))
(goto-char (point-min))
(while (search-forward "<" nil t)
(replace-match "<" nil t))
(goto-char (point-min))
(while (search-forward ">" nil t)
(replace-match ">" nil t))
(if without-tags
(encode-coding-region (point-min)(point-max) 'utf-8-mcs-er)
(let ((coded-charset-entity-reference-alist
est-coded-charset-entity-reference-alist))
(encode-coding-region (point-min)(point-max) 'utf-8-mcs-er)
(goto-char (point-min))
(while (re-search-forward "&\\(A-\\|G-\\|g2-\\|R-\\)?CB\\([0-9]+\\);" nil t)
(setq code (string-to-int (match-string 2)))
(replace-match
(format ""
code
chise-wiki-legacy-bitmap-glyphs-url
(/ code 1000) code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(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)
(setq plane (match-string 2)
code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
plane code
chise-wiki-legacy-bitmap-glyphs-url
plane
(- (lsh code -8) 32)
(- (logand code 255) 32)
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?J0-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(replace-match
(format "
"
code
chise-wiki-legacy-bitmap-glyphs-url
(- (lsh code -8) 32)
(- (logand code 255) 32)
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(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)
(setq plane (match-string 2)
code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
plane code
chise-wiki-legacy-bitmap-glyphs-url
plane
(- (lsh code -8) 32)
(- (logand code 255) 32)
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(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)
(setq plane (match-string 2)
code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
plane code
chise-wiki-legacy-bitmap-glyphs-url
plane code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?HD-KS-\\([0-9]+\\);" nil t)
(setq code (string-to-int (match-string 2)))
(replace-match
(format "
"
code
chise-wiki-legacy-bitmap-glyphs-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?HD-TK-\\([0-9]+\\);" nil t)
(setq code (string-to-int (match-string 2)))
(replace-match
(format "
"
code
chise-wiki-legacy-bitmap-glyphs-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&G\\([01]\\)-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
(setq plane (string-to-int (match-string 1))
code (string-to-int (match-string 2) 16))
(replace-match
(format "
"
plane code
chise-wiki-legacy-bitmap-glyphs-url
plane
(- (lsh code -8) 32)
(- (logand code 255) 32)
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(R-\\)?C\\([1-7]\\)-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
(setq plane (string-to-int (match-string 2))
code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
plane code
chise-wiki-legacy-bitmap-glyphs-url
plane code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(R-\\)?JC3-\\([0-9A-F][0-9A-F][0-9A-F][0-9A-F]\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(replace-match
(format "
"
code chise-wiki-bitmap-glyph-image-url code)
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 "
"
code
chise-wiki-legacy-bitmap-glyphs-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(A2-\\|g2-\\|R-\\)?DJT-\\([0-9]+\\);" nil t)
(setq code (string-to-int (match-string 2)))
(replace-match
(format "
"
code
chise-wiki-daijiten-bitmap-glyphs-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&SW-JIGUGE\\([45]?\\)-\\([0-9]+\\);" nil t)
(setq subcode (match-string 1)
code (string-to-int (match-string 2)))
(setq plane
(if (string= subcode "")
"5"
subcode))
(replace-match
(format "
"
plane code
chise-wiki-legacy-bitmap-glyphs-url
plane code)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&HNG\\([0-9]+\\)-\\([0-9][0-9][0-9][0-9]\\)\\([0-9]\\);" nil t)
(setq plane (match-string 1)
code (string-to-int (match-string 2))
subcode (string-to-int (match-string 3)))
(setq subcode
(if (eq subcode 0)
""
(char-to-string (decode-char 'ascii (+ 96 subcode)))))
(replace-match
(format
"
"
plane code subcode
chise-wiki-hng-bitmap-glyphs-url
plane code subcode
)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(R-\\)?CHISE-HDIC-TSJ\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(setq char (decode-char '===chise-hdic-tsj code))
(when (setq ret (get-char-attribute char '=hdic-tsj-glyph-id))
(replace-match
(format
"
"
ret ret)
t 'literal)))
(goto-char (point-min))
(while (re-search-forward "&\\(R-\\)?CHISE-HDIC-SYP\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(setq char (decode-char '===chise-hdic-syp code))
(when (setq ret (get-char-attribute char '=hdic-syp-entry-id))
(replace-match
(format
"
"
ret ret)
t 'literal)))
(goto-char (point-min))
(while (re-search-forward "&\\(R-\\)?CHISE-HDIC-KTB\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(setq char (decode-char '===chise-hdic-ktb code))
(when (setq ret (get-char-attribute char '=hdic-ktb-entry-id))
(replace-match
(format
"
"
ret ret)
t 'literal)))
(goto-char (point-min))
(while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?AJ1-\\([0-9]+\\);" nil t)
(setq code (string-to-int (match-string 2)))
(replace-match
(format "
"
code
chise-wiki-legacy-bitmap-glyphs-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(A-\\|o-\\|G-\\|g2-\\|R-\\)?MJ\\([0-9]+\\);" nil t)
(setq code (string-to-int (match-string 2)))
(replace-match
(format "
"
code
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(o-\\|G-\\|g2-\\)?IU[+-]\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(replace-match
(format "
"
code
chise-wiki-glyphwiki-glyph-image-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(o-\\|G-\\|g2-\\|R-\\)?KU[+-]\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(replace-match
(format "
"
code
chise-wiki-glyphwiki-glyph-image-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&A-\\(comp\\|cgn\\)U[+-]\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(replace-match
(format "
"
code
chise-wiki-glyphwiki-glyph-image-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward
"&\\(A-\\|g2-\\)?U-i\\([0-9]+\\)\\+\\([0-9A-F]+\\);"
nil t)
(setq plane (string-to-int (match-string 2))
code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
code
plane
chise-wiki-glyphwiki-glyph-image-url
code
plane
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&A-IWDSU\\+\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 1) 16))
(replace-match
(format "
"
code
chise-wiki-glyphwiki-glyph-image-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward
"&\\(A-\\)?CDP-i\\([0-9]+\\)-\\([0-9A-F]+\\);"
nil t)
(setq plane (string-to-int (match-string 2))
code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
code
plane
chise-wiki-glyphwiki-glyph-image-url
code
plane
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward
"&\\(A-\\)?CDP-v\\([0-9]+\\)-\\([0-9A-F]+\\);"
nil t)
(setq plane (string-to-int (match-string 2))
code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
code
plane
chise-wiki-glyphwiki-glyph-image-url
code
plane
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward
"&\\(A-\\|G-\\|g2-\\|R-\\)?M-\\([0-9]+\\);"
nil t)
(setq code (string-to-int (match-string 2)))
(replace-match
(format "
"
code
chise-wiki-glyphwiki-glyph-image-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(g2-\\)?U-v\\([0-9]+\\)\\+\\([0-9A-F]+\\);" nil t)
(setq plane (string-to-int (match-string 2))
code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
code
plane
chise-wiki-glyphwiki-glyph-image-url
code
plane
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(A-\\|G-\\|R-\\|g2-\\)?GT-\\([0-9]+\\);" nil t)
(setq code (string-to-int (match-string 2)))
(replace-match
(format "
"
code
chise-wiki-glyph-cgi-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(A-\\|G-\\|g2-\\)?GT-K\\([0-9]+\\);" nil t)
(setq code (string-to-int (match-string 2)))
(replace-match
(format "
"
code
chise-wiki-glyph-cgi-url
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 "
"
code
chise-wiki-glyph-cgi-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward
"&\\(A-\\|G-\\|g2-\\|R-\\)?CDP-\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(replace-match
(format "
"
code
chise-wiki-glyph-cgi-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward
"&\\(I-\\)?HZK\\(0[1-9]\\|1[0-2]\\)-\\([0-9A-F]+\\);" nil t)
(setq plane (match-string 2)
code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
plane
code
chise-wiki-glyph-cgi-url
plane
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(A-\\|G-\\|g2-\\|R-\\)?RUI6-\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 2) 16))
(replace-match
(format "
"
code
chise-wiki-glyph-cgi-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&hanaJU\\+\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 1) 16))
(replace-match
(format "
"
code
chise-wiki-glyph-cgi-url
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&\\(A-\\|G-\\|g2-\\|R-\\)?\\(UU\\+\\|U-\\)\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 3) 16))
(replace-match
(format "
"
code
code
www-format-char-img-style)
t 'literal))
(goto-char (point-min))
(while (re-search-forward "&MCS-\\([0-9A-F]+\\);" nil t)
(setq code (string-to-int (match-string 1) 16))
(setq start (match-beginning 0)
end (match-end 0))
(setq char (decode-char 'system-char-id code))
(cond
((and (setq variants
(or (www-get-feature-value char '->subsumptive)
(www-get-feature-value char '->denotational)))
(progn
(if (characterp variants)
(setq variants (list variants)))
(while (and variants
(setq ret (www-format-encode-string
(char-to-string (car variants))))
(string-match "&MCS-\\([0-9A-F]+\\);" ret))
(setq variants (cdr variants)))
ret))
(unless (string-match "&MCS-\\([0-9A-F]+\\);" ret)
(goto-char start)
(delete-region start end)
(insert ret))
)
((setq ret (or (www-get-feature-value char 'ideographic-combination)
(www-get-feature-value char 'ideographic-structure)))
(setq ret
(mapconcat
(lambda (ch)
(if (listp ch)
(if (characterp (setq rret (find-char ch)))
(setq ch rret)))
(if (characterp ch)
(www-format-encode-string
(char-to-string ch) without-tags)
(www-format-encode-string
(format "%S" ch) without-tags)))
ret ""))
(when ret
(goto-char start)
(delete-region start end)
(insert ret))
)))
))
;; (goto-char (point-min))
;; (while (search-forward ">-" nil t)
;; (replace-match ">-" t 'literal))
(buffer-string))))
(setq www-format-char-img-style "vertical-align:middle;")
(defun decode-url-string (string &optional coding-system)
(if (> (length string) 0)
(let ((i 0)
dest)
(while (string-match "%\\([0-9A-F][0-9A-F]\\)" string i)
(setq dest (concat dest
(substring string i (match-beginning 0))
(char-to-string
(int-char
(string-to-int (match-string 1 string) 16))))
i (match-end 0)))
(decode-coding-string
(concat dest (substring string i))
coding-system))))
(defconst www-ids-find-version "0.100.2")
(defvar www-ids-find-ideographic-products-file-name
(expand-file-name "ideographic-products"
(expand-file-name
"feature"
(expand-file-name
"character"
chise-system-db-directory))))
(defvar www-ids-find-char-viewer-url
"/est/view/character/")
(defvar www-ids-find-chise-link-map-url-prefix
"http://fonts.jp/chise_linkmap/map.cgi?code=")
(defvar www-ids-find-tang-chars-file-name
"~tomo/projects/chise/ids/www/tang-chars.udd")
(defun www-ids-find-format-char (c &optional code-desc)
(let* ((ucs (encode-char c '=ucs)))
(princ
(format "%s"
www-ids-find-char-viewer-url
(www-uri-encode-object c)
(if ucs
(format "
%s"
ucs
chise-wiki-glyphwiki-glyph-image-url
ucs
(if code-desc
(encode-coding-string (format " (%c)" c) 'utf-8-mcs-er)
""))
(www-format-encode-string (char-to-string c)))))
))
(defun www-ids-find-format-ids (ids &optional code-desc)
(let (len i ucs ret)
(setq i 0
len (length ids))
(while (< i len)
(www-ids-find-format-char (aref ids i))
(setq i (1+ i)))
(when code-desc
(princ
(format " (%s)"
(mapconcat
(lambda (c)
(setq ucs (or (char-ucs c)
(encode-char c '=>ucs@iso)
(encode-char c '=>ucs@unicode)
(encode-char c '=>ucs@iwds-1)
(encode-char c '=>ucs@iwds-1/normalized)
(encode-char c '=>ucs@component)
(encode-char c '=>ucs@cognate)))
(cond (ucs
(encode-coding-string
(char-to-string (decode-char '=ucs ucs))
'utf-8-mcs-er)
)
(t
(setq ret (encode-coding-string
(char-to-string c) 'utf-8-mcs-er))
(if (eq (aref ret 0) ?&)
(concat "&" (substring ret 1)))
)))
ids ""))))))
(defun www-ids-find-format-line (c is)
(let (ucs ids)
(princ "")
(www-ids-find-format-char c 'code-desc)
(princ "")
(princ
(or (if (setq ucs (or (char-ucs c)
(encode-char c 'ucs)))
(format
" %s"
ucs
(cond ((<= ucs #xFFFF)
(format "U+%04X" ucs))
((<= ucs #x10FFFF)
(format "U-%08X" ucs))))
" ")))
(when ucs
(princ
(format " (link map)"
www-ids-find-chise-link-map-url-prefix ucs)))
(princ " ")
;; (www-ids-find-format-ideographic-structure is 'code-desc)
(when is
(setq ids (ideographic-structure-to-ids is))
;; (setq i 0
;; len (length ids))
(princ "")
(www-ids-find-format-ids ids 'code-desc)
;; (while (< i len)
;; (www-ids-find-format-char (aref ids i))
;; (setq i (1+ i)))
(princ ""))
(when (and ucs
(with-current-buffer
(find-file-noselect
www-ids-find-tang-chars-file-name)
(goto-char (point-min))
(re-search-forward (format "^%d$" ucs) nil t)))
(princ
(format " "
(mapconcat
(lambda (c)
(format "%%%02X" (char-int c)))
(encode-coding-string (char-to-string c)
'utf-8-jp)
"")))
(princ (encode-coding-string "⇒[唐代拓本]" 'utf-8-jp-er)))
(princ "
\n")))
(defun www-ids-insert-chars-including-components* (components
&optional ignored-chars products)
(unless products
(setq products (ideograph-find-products components ignored-chars)))
(let (is as bs len)
(setq len (length products))
(princ "
結果が多すぎるため、再帰的検索を省略しました。
" 'utf-8-jp-er))) (if (>= len 2048) (dolist (c products) (www-ids-find-format-char c)) (setq ignored-chars (nreverse (www-ids-insert-chars-including-components* components ignored-chars products))) (dolist (c ignored-chars) (dolist (vc (char-component-variants c)) (unless (memq vc ignored-chars) (when (setq is (get-char-attribute vc 'ideographic-structure)) (princ "結果が多すぎるため、関連字の再帰的検索を省略しました。
" 'utf-8-jp-er))) (if (>= len 1024) (dolist (c products) (www-ids-find-format-char c)) (dolist (c (sort (copy-tree products) (lambda (a b) (if (setq as (char-total-strokes a)) (if (setq bs (char-total-strokes b)) (if (= as bs) (ideograph-char< a b) (< as bs)) t) (ideograph-char< a b))))) (unless (memq c ignored-chars) (setq is (get-char-attribute c 'ideographic-structure)) (princ "Version ") (princ www-ids-find-version) (princ (format-time-string " (Last-modified: %Y-%m-%d %H:%M:%S)
" (nth 5 (file-attributes www-ids-find-ideographic-products-file-name)))) (princ "現在、システムの更新作業中です。しばらくお待ちください。
指定した部品を全て含む漢字の一覧を表示します。
CHISE で用いられる実態参照形式(例:&M-00256;)で部品を指定する事もできます。
\[Links\]