yamasushi(2013/03/29 10:10:36 UTC)文字実態参照の解決など、おおきなテーブルをつくるときに、うまい方法はないものか?とおもいました。
(use rfc.json) (use util.match) (use gauche.generator) ;html実態参照の定義 ; html4 ; http://www.w3.org/TR/html401/html40.txt ; grep -e '^<!ENTITY *[a-zA-Z]* *CDATA' html40.txt > html40-entities.dtd ; TODO 自動的に生成 (define html4-entities-dtd-path "hogehoge/html40-entities.dtd") ; html5 ; http://www.w3.org/TR/html5/entities.json ; TODO 自動的に生成 (define html5-entities-json-path "hogehoge/html5-entities.json") (define (read-html4-entities) (call-with-input-file html4-entities-dtd-path (^p ($ generator->list $ gmap (^s (rxmatch-if (#/^<!ENTITY\s+(\S+)\s+CDATA\s+\"&#([0-9]+)\;\"/ s) (_ sym code) (begin ;#?=sym ;#?=code (cons (string->symbol sym) ($ string $ integer->char $ string->number code) ) ) (error (format #f "なぞの~a" s) ) ) ) $ port->line-generator p) ) ) ) (define (read-html5-entities) ($ map (cons-pack$ ($ string->symbol $ (cut rxmatch->string #/^&(\w+)\;?/ <> 1) $ car $) ($ (cut assoc-ref <> "characters") $ cdr $) ) $ call-with-input-file html5-entities-json-path (^p (parse-json p) ) ) ) (define (main args) (call-with-output-file "alist-entities.scm" (^p (write `(define-module htmlprag.alist-entities (export alist-html4-entities alist-html5-entities )) p ) (write `(select-module htmlprag.alist-entities) p) (write `(define alist-html4-entities (quote,(read-html4-entities))) p) (write `(define alist-html5-entities (quote,(read-html5-entities))) p) ) ) 0 )(※cons-pack$はGauche:コンビネータプログラミングに定義があります。)
(define-module htmlprag.character-entity ; html実態参照の定義 ; make-character-entity.scmで生成する (use htmlprag.alist-entities) (export hash-html4-entities hash-html5-entities ) ) (select-module htmlprag.character-entity) (define hash-html4-entities (alist->hash-table alist-html4-entities)) (define hash-html5-entities (alist->hash-table alist-html5-entities))