Skip to content
Open
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 @@ -28,6 +28,8 @@ public class HtmlRenderer implements Renderer {
private final List<AttributeProviderFactory> attributeProviderFactories;
private final List<HtmlNodeRendererFactory> nodeRendererFactories;



private HtmlRenderer(Builder builder) {
this.softbreak = builder.softbreak;
this.escapeHtml = builder.escapeHtml;
Expand All @@ -36,13 +38,20 @@ private HtmlRenderer(Builder builder) {
this.sanitizeUrls = builder.sanitizeUrls;
this.urlSanitizer = builder.urlSanitizer;
this.attributeProviderFactories = new ArrayList<>(builder.attributeProviderFactories);
// Add as last. This means clients can override the rendering of core nodes if they want.*/
this.nodeRendererFactories = buildNodeRenderers(builder);
}
private static List<HtmlNodeRendererFactory> buildNodeRenderers(Builder builder) {
List<HtmlNodeRendererFactory> result =
new ArrayList<>(builder.nodeRendererFactories.size() + 1);

this.nodeRendererFactories = new ArrayList<>(builder.nodeRendererFactories.size() + 1);
this.nodeRendererFactories.addAll(builder.nodeRendererFactories);
// Add as last. This means clients can override the rendering of core nodes if they want.
this.nodeRendererFactories.add(CoreHtmlNodeRenderer::new);
result.addAll(builder.nodeRendererFactories);
result.add(CoreHtmlNodeRenderer::new);

return result;
}


/**
* Create a new builder for configuring an {@link HtmlRenderer}.
*
Expand All @@ -52,15 +61,20 @@ public static Builder builder() {
return new Builder();
}

private RendererContext createContext(Appendable output) {
return new RendererContext(new HtmlWriter(output));
}

@Override
public void render(Node node, Appendable output) {
Objects.requireNonNull(node, "node must not be null");
RendererContext context = new RendererContext(new HtmlWriter(output));
RendererContext context = createContext(output);
context.beforeRoot(node);
context.render(node);
context.afterRoot(node);
}


@Override
public String render(Node node) {
Objects.requireNonNull(node, "node must not be null");
Expand Down Expand Up @@ -233,12 +247,18 @@ private class RendererContext implements HtmlNodeRendererContext, AttributeProvi

private RendererContext(HtmlWriter htmlWriter) {
this.htmlWriter = htmlWriter;

attributeProviders = new ArrayList<>(attributeProviderFactories.size());
this.attributeProviders = createAttributeProviders();
initializeNodeRenderers();
}
private List<AttributeProvider> createAttributeProviders() {
List<AttributeProvider> providers = new ArrayList<>(attributeProviderFactories.size());
for (var attributeProviderFactory : attributeProviderFactories) {
attributeProviders.add(attributeProviderFactory.create(this));
providers.add(attributeProviderFactory.create(this));
}
return providers;
}

private void initializeNodeRenderers() {
for (var factory : nodeRendererFactories) {
var renderer = factory.create(this);
nodeRendererMap.add(renderer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,12 +130,18 @@ private class RendererContext implements MarkdownNodeRendererContext {
private RendererContext(MarkdownWriter writer) {
// Set fields that are used by interface
this.writer = writer;
this.additionalTextEscapes = createAdditionalTextEscapes();
initializeNodeRenderers();
}
private Set<Character> createAdditionalTextEscapes() {
Set<Character> escapes = new HashSet<>();
for (MarkdownNodeRendererFactory factory : nodeRendererFactories) {
escapes.addAll(factory.getSpecialCharacters());
}
additionalTextEscapes = Collections.unmodifiableSet(escapes);
return Collections.unmodifiableSet(escapes);
}

private void initializeNodeRenderers(){
for (var factory : nodeRendererFactories) {
// Pass in this as context here, which uses the fields set above
var renderer = factory.create(this);
Expand Down