racket/collects/html/entity-expander.ss
2005-05-27 18:56:37 +00:00

28 lines
1.0 KiB
Scheme

;; copyright by Paul Graunke June 2000 AD
(module entity-expander mzscheme
(provide empty-entity-expander extend-entity-expander expand-entities)
;; warning - this is a really inefficient implementation of a nice interface.
;; building one dfa would be much better
;; Entity-expander : String -> String
;; empty-entity-expander : Entity-expander
(define (empty-entity-expander x) x)
;; extend-entity-expander : Symbol String Entity-expander -> Entity-expander
(define extend-entity-expander
(let ([fix-rhs (regexp "&")])
(lambda (name rhs to-extend)
(let ([pattern (regexp (format "%~a;?" name))]
[rhs (regexp-replace* fix-rhs rhs "\\\\&")])
(lambda (input)
(to-extend (regexp-replace* pattern input rhs)))))))
;; expand-entities : Entity-expander String -> String
(define (expand-entities expander string)
(let loop ([prev string])
(let ([new (expander prev)])
(if (string=? new prev)
new
(loop new))))))