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))