25 lines
657 B
Racket
25 lines
657 B
Racket
#lang scheme/base
|
|
|
|
(provide encode-name)
|
|
|
|
(define (encode-name s)
|
|
(let ([s (if (symbol? s)
|
|
(symbol->string s)
|
|
s)])
|
|
(cond
|
|
[(regexp-match #rx"(.*?)([^a-zA-Z0-9_+-]+)(.*)" s)
|
|
=> (lambda (m)
|
|
(string-append
|
|
(cadr m)
|
|
(apply
|
|
string-append
|
|
(map (lambda (c)
|
|
(let ([s (format "0~x" c)])
|
|
(string-append
|
|
"%"
|
|
(substring s (- (string-length s) 2)))))
|
|
(bytes->list (string->bytes/utf-8 (caddr m)))))
|
|
(encode-name (cadddr m))))]
|
|
[else s])))
|
|
|