Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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