Skip to content

Snippet macro: add a parameter to set the CSS class on the generated <pre>/<code> element #1067

Open

Description

@bertysentry

Summary

The snippet macro currently provides no way to set a CSS class (or other attributes) on the <pre>/<code> elements it generates. Supporting an optional class parameter would allow client-side syntax highlighters such as Prism or highlight.js to pick up the language (e.g. language-yaml) without any post-processing.

Current behavior

SnippetMacro.execute() reads the parameters id, url, file, encoding, debug, ignoreDownloadError, verbatim and source, then emits:

sink.verbatim(source ? SinkEventAttributeSet.SOURCE : null);
sink.text(snippet.toString());
sink.verbatim_();

so the only attribute that ever reaches the sink is DECORATION=source, which Xhtml5BaseSink.verbatim() consumes to produce <pre><code> (and strips before writing the tags). There is no way to attach a class to the output.

Why it's a small change

The sink layer already supports this: SinkUtils.SINK_VERBATIM_ATTRIBUTES includes CLASS (as well as ID, LANG, STYLE, TITLE), and Xhtml5BaseSink.verbatim() copies these filtered attributes onto the <pre> start tag. Only the macro fails to forward anything.

Proposed enhancement

Add an optional class parameter to the snippet macro:

%{snippet|id=my-snippet|file=src/main/connector/MyConnector.yaml|class=language-yaml}

which would result in:

SinkEventAttributeSet atts = new SinkEventAttributeSet();
if (source) {
    atts.addAttributes(SinkEventAttributeSet.SOURCE);
}
if (cssClass != null) {
    atts.addAttribute(SinkEventAttributes.CLASS, cssClass);
}
sink.verbatim(atts.getAttributeCount() > 0 ? atts : null);

producing <pre class="language-yaml"><code>â€Ķ</code></pre>.

A class on <pre> is sufficient for Prism (which resolves language-* classes from ancestors) and can be configured for highlight.js. Alternatively (or additionally), the macro could place the class on the <code> element, which is what the HTML spec suggests for indicating the language — but that would require Xhtml5BaseSink to forward attributes to the inner <code> tag as well.

Use case

We generate connector reference documentation with maven-site-plugin 4.0.0-M16 and include YAML fragments from the sources via the snippet macro. All other code blocks on the site (fenced Markdown blocks) get syntax highlighting, but snippet-included blocks render unhighlighted because there is no way to tag them with language-yaml.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions