1
0
Fork 0

Add trickery to support embedded SVG images

- Specify the svg and xlink namespaces to the `xml->sxml' procedure so that it
  doesn't include them in full for each tag.
- For the default `pre-post-order' handler strip the `svg:' prefix if found.
- Strip the `svg:' namespace from the SVG element and insert the `xmlns' and
  `xmlns:xlink' namespace definition attributes into the attributes.

This is all very brittle and badly done, but for the moment this fixes my
use-case of wanting to display SVG images embedded in the HTML.
This commit is contained in:
Tom Willemse 2021-07-02 02:28:27 -07:00
parent ae3d83d5f2
commit 3924728bab

View file

@ -80,15 +80,24 @@
(define (wordpress->sxml text) (define (wordpress->sxml text)
(let ((sxml (cadr (with-input-from-string* (string-append "<div>" text "</div>") (let ((sxml (cadr (with-input-from-string* (string-append "<div>" text "</div>")
xml->sxml)))) (lambda () (xml->sxml #:namespaces '((svg . "http://www.w3.org/2000/svg"))))))))
(pre-post-order (pre-post-order
sxml sxml
`((*default* . ,(lambda (tag . body) `((*default* . ,(lambda (tag . body)
(let ((tag (if (string-prefix? "svg:" (symbol->string tag))
(string->symbol (substring (symbol->string tag) 4))
tag)))
(if (can-contain-p? tag) (if (can-contain-p? tag)
(wpautop tag body) (wpautop tag body)
(cons tag body)))) (cons tag body)))))
(*text* . ,(lambda (tag text) (*text* . ,(lambda (tag text)
text)))))) text))
(svg:svg . ,(lambda (tag . body)
(cons 'svg
(cons `(@ (xmlns "http://www.w3.org/2000/svg")
(xmlns:xlink "http://www.w3.org/1999/xlink")
,@(cdar body))
(cdr body)))))))))
(define *allowed-tags* (define *allowed-tags*
`((a (href . ,urlish?) title) `((a (href . ,urlish?) title)