Skip to content

Commit

Permalink
Add omitSingleParagraphP option to HtmlRenderer.Builder
Browse files Browse the repository at this point in the history
This is useful for rendering single lines where wrapping in a <p> might be undesirable.
Fixes #150.
  • Loading branch information
robinst committed Sep 14, 2024
1 parent db57101 commit 8c819ab
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,15 @@ public void visit(Heading heading) {

@Override
public void visit(Paragraph paragraph) {
boolean inTightList = isInTightList(paragraph);
if (!inTightList) {
boolean omitP = isInTightList(paragraph) || //
(context.shouldOmitSingleParagraphP() && paragraph.getParent() instanceof Document && //
paragraph.getPrevious() == null && paragraph.getNext() == null);
if (!omitP) {
html.line();
html.tag("p", getAttrs(paragraph, "p"));
}
visitChildren(paragraph);
if (!inTightList) {
if (!omitP) {
html.tag("/p");
html.line();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public interface HtmlNodeRendererContext {
/**
* Let extensions modify the HTML tag attributes.
*
* @param node the node for which the attributes are applied
* @param tagName the HTML tag name that these attributes are for (e.g. {@code h1}, {@code pre}, {@code code}).
* @param node the node for which the attributes are applied
* @param tagName the HTML tag name that these attributes are for (e.g. {@code h1}, {@code pre}, {@code code}).
* @param attributes the attributes that were calculated by the renderer
* @return the extended attributes with added/updated/removed entries
*/
Expand Down Expand Up @@ -47,6 +47,11 @@ public interface HtmlNodeRendererContext {
*/
boolean shouldEscapeHtml();

/**
* @return whether documents that only contain a single paragraph should be rendered without the {@code <p>} tag
*/
boolean shouldOmitSingleParagraphP();

/**
* @return true if the {@link UrlSanitizer} should be used.
* @since 0.14.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,19 @@ public class HtmlRenderer implements Renderer {

private final String softbreak;
private final boolean escapeHtml;
private final boolean percentEncodeUrls;
private final boolean omitSingleParagraphP;
private final boolean sanitizeUrls;
private final UrlSanitizer urlSanitizer;
private final boolean percentEncodeUrls;
private final List<AttributeProviderFactory> attributeProviderFactories;
private final List<HtmlNodeRendererFactory> nodeRendererFactories;

private HtmlRenderer(Builder builder) {
this.softbreak = builder.softbreak;
this.escapeHtml = builder.escapeHtml;
this.sanitizeUrls = builder.sanitizeUrls;
this.percentEncodeUrls = builder.percentEncodeUrls;
this.omitSingleParagraphP = builder.omitSingleParagraphP;
this.sanitizeUrls = builder.sanitizeUrls;
this.urlSanitizer = builder.urlSanitizer;
this.attributeProviderFactories = new ArrayList<>(builder.attributeProviderFactories);

Expand Down Expand Up @@ -83,6 +85,7 @@ public static class Builder {
private boolean sanitizeUrls = false;
private UrlSanitizer urlSanitizer = new DefaultUrlSanitizer();
private boolean percentEncodeUrls = false;
private boolean omitSingleParagraphP = false;
private List<AttributeProviderFactory> attributeProviderFactories = new ArrayList<>();
private List<HtmlNodeRendererFactory> nodeRendererFactories = new ArrayList<>();

Expand Down Expand Up @@ -166,6 +169,17 @@ public Builder percentEncodeUrls(boolean percentEncodeUrls) {
return this;
}

/**
* Whether documents that only contain a single paragraph should be rendered without the {@code <p>} tag. Set to
* {@code true} to render without the tag; the default of {@code false} always renders the tag.
*
* @return {@code this}
*/
public Builder omitSingleParagraphP(boolean omitSingleParagraphP) {
this.omitSingleParagraphP = omitSingleParagraphP;
return this;
}

/**
* Add a factory for an attribute provider for adding/changing HTML attributes to the rendered tags.
*
Expand Down Expand Up @@ -242,6 +256,11 @@ public boolean shouldEscapeHtml() {
return escapeHtml;
}

@Override
public boolean shouldOmitSingleParagraphP() {
return omitSingleParagraphP;
}

@Override
public boolean shouldSanitizeUrls() {
return sanitizeUrls;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import org.commonmark.parser.Parser;
import org.commonmark.renderer.NodeRenderer;
import org.commonmark.renderer.html.*;
import org.commonmark.testutil.Asserts;
import org.commonmark.testutil.RenderingTestCase;
import org.commonmark.testutil.TestResources;
import org.junit.Test;

Expand Down Expand Up @@ -308,6 +310,12 @@ public void canRenderContentsOfSingleParagraph() {
defaultRenderer().render(document));
}

@Test
public void omitSingleParagraphP() {
var renderer = HtmlRenderer.builder().omitSingleParagraphP(true).build();
assertEquals("hi <em>there</em>", renderer.render(parse("hi *there*")));
}

@Test
public void threading() throws Exception {
Parser parser = Parser.builder().build();
Expand Down

0 comments on commit 8c819ab

Please sign in to comment.