diff --git a/scribble-lib/scribble/html-render.rkt b/scribble-lib/scribble/html-render.rkt
index 9aa7db7b62..5ab2c88866 100644
--- a/scribble-lib/scribble/html-render.rkt
+++ b/scribble-lib/scribble/html-render.rkt
@@ -1672,6 +1672,13 @@
(let ([s (content-style e)])
(and (style? s)
(style->tag s)))]
+ [semantic-tag
+ (and (symbol? name)
+ (case name
+ [(emph) 'em]
+ [(superscript) 'sup]
+ [(subscript) 'sub]
+ [else #f]))]
[resources (for/list ([p (in-list properties)]
#:when (install-resource? p))
(install-resource-path p))]
@@ -1720,7 +1727,8 @@
(not link?)
(not anchor?)
(not newline?)
- (not alt-tag))
+ (not alt-tag)
+ (not semantic-tag))
content
`(,@(if anchor?
(append-map (lambda (v)
@@ -1733,6 +1741,7 @@
[alt-tag alt-tag]
[link? 'a]
[newline? 'br]
+ [semantic-tag semantic-tag]
[else 'span])
,(append
(if link-resource
@@ -1754,8 +1763,8 @@
[(url) '([class "url"])]
[(no-break) '([class "nobreak"])]
[(sf) '([class "ssansserif"])]
- [(superscript) '([style "vertical-align: super; font-size: 80%"])]
- [(subscript) '([style "vertical-align: sub; font-size: 80%"])]
+ [(superscript) '([style "vertical-align: super; font-size: 80%; line-height: inherit"])]
+ [(subscript) '([style "vertical-align: sub; font-size: 80%; line-height: inherit"])]
[(smaller) '([class "Smaller"])]
[(larger) '([class "Larger"])]
[(hspace) '([class "hspace"])]
diff --git a/scribble-test/tests/scribble/html-render.rkt b/scribble-test/tests/scribble/html-render.rkt
new file mode 100644
index 0000000000..40b476c38f
--- /dev/null
+++ b/scribble-test/tests/scribble/html-render.rkt
@@ -0,0 +1,63 @@
+#lang racket/base
+
+(require racket/class
+ rackunit
+ scribble/base
+ scribble/base-render
+ scribble/core
+ scribble/html-properties
+ (prefix-in html: scribble/html-render))
+
+(define renderer
+ (new (html:render-mixin render%)
+ [dest-dir (find-system-path 'temp-dir)]))
+
+(define (render-content content)
+ (send renderer render-content content #f #f))
+
+(test-case "semantic text styles"
+ (check-equal?
+ (render-content (emph "emphasized"))
+ '((em ((class "emph")) "emphasized")))
+
+ (check-equal?
+ (render-content (emph "outer " (emph "inner")))
+ '((em ((class "emph")) "outer "
+ (em ((class "emph")) "inner"))))
+
+ (check-equal?
+ (render-content
+ (elem #:style
+ (make-style 'emph
+ (list (attributes '((data-test . "value")))))
+ "styled emphasis"))
+ '((em ((class "emph") (data-test "value")) "styled emphasis")))
+
+ (check-equal?
+ (render-content (superscript "superscript"))
+ '((sup ((style "vertical-align: super; font-size: 80%; line-height: inherit"))
+ "superscript")))
+
+ (check-equal?
+ (render-content (subscript "subscript"))
+ '((sub ((style "vertical-align: sub; font-size: 80%; line-height: inherit"))
+ "subscript")))
+
+ (check-equal?
+ (render-content
+ (elem #:style
+ (make-style 'emph (list (alt-tag "i")))
+ "alternate tag"))
+ '((i ((class "emph")) "alternate tag")))
+
+ (check-equal?
+ (render-content
+ (elem #:style
+ (make-style 'emph
+ (list (target-url "https://example.com")))
+ "linked"))
+ '((a ((href "https://example.com") (class "emph")) "linked")))
+
+ (check-equal?
+ (render-content (elem #:style "emph" "custom style"))
+ '((span ((class "emph")) "custom style"))))