Skip to content

Commit c81c45e

Browse files
nlopesclaude
andcommitted
feat(html5s): improve semantic HTML output for blocks, lists, and images
Adds proper semantic tag selection (section/figure/div), metadata propagation (id, roles, classes), semantic attribution, description list rendering, stem block math markup, and task-list checkbox support. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent a26fc47 commit c81c45e

17 files changed

+795
-116
lines changed

converters/html/src/admonition.rs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,18 +108,30 @@ fn visit_admonition_semantic<V: WritableVisitor<Error = Error>>(
108108
};
109109

110110
let mut writer = visitor.writer_mut();
111-
writeln!(
112-
writer,
113-
"<{tag} class=\"admonition-block {}\" role=\"{role}\">",
114-
admon.variant
115-
)?;
116-
writeln!(
117-
writer,
118-
"<h6 class=\"block-title label-only\"><span class=\"title-label\">{caption}: </span></h6>"
119-
)?;
111+
// Build class: "admonition-block {variant}" + roles
112+
let base_class = format!("admonition-block {}", admon.variant);
113+
let class = crate::build_class(&base_class, &admon.metadata.roles);
114+
write!(writer, "<{tag} class=\"{class}\"")?;
115+
// Propagate id
116+
if let Some(id) = &admon.metadata.id {
117+
write!(writer, " id=\"{}\"", id.id)?;
118+
} else if let Some(anchor) = admon.metadata.anchors.first() {
119+
write!(writer, " id=\"{}\"", anchor.id)?;
120+
}
121+
writeln!(writer, " role=\"{role}\">")?;
120122

121-
if !admon.title.is_empty() {
122-
write!(writer, "<h6 class=\"block-title\">")?;
123+
if admon.title.is_empty() {
124+
// Label-only: no trailing space after colon
125+
writeln!(
126+
writer,
127+
"<h6 class=\"block-title label-only\"><span class=\"title-label\">{caption}:</span></h6>"
128+
)?;
129+
} else {
130+
// With title: single h6 combining label + title (space after colon)
131+
write!(
132+
writer,
133+
"<h6 class=\"block-title\"><span class=\"title-label\">{caption}: </span>"
134+
)?;
123135
let _ = writer;
124136
visitor.visit_inline_nodes(&admon.title)?;
125137
writer = visitor.writer_mut();

0 commit comments

Comments
 (0)