#lang racket/base
(require racket/match
scribble/html-properties
scribble/core)
(provide sxml->element)
(define (sxml->element an-sxml)
(match an-sxml
[(list '& 'nbsp)
'nbsp]
[(list '& sym)
sym]
[(list tag-name (list '@ (list attr-name attr-value) ...) children ...)
(tagged->element tag-name attr-name attr-value children)]
[(list tag-name children ...)
(tagged->element tag-name '() '() children)]
[(? symbol?)
an-sxml]
[(? string?)
an-sxml]
[(? char?)
(string an-sxml)]))
(define (tagged->element tag-name attr-names attr-values children)
(define tag-attr (alt-tag (symbol->string tag-name)))
(define attrs-attr (attributes (map cons attr-names attr-values)))
(define content (map sxml->element children))
(make-element (make-style #f (list tag-attr attrs-attr))
content))