
org.commonmark.ext.gfm.tables.internal.TableNodeRenderer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of commonmark-ext-gfm-tables Show documentation
Show all versions of commonmark-ext-gfm-tables Show documentation
commonmark-java extension for GFM tables using "|" pipes (GitHub Flavored Markdown)
package org.commonmark.ext.gfm.tables.internal;
import org.commonmark.ext.gfm.tables.*;
import org.commonmark.html.HtmlWriter;
import org.commonmark.html.renderer.NodeRenderer;
import org.commonmark.html.renderer.NodeRendererContext;
import org.commonmark.node.Node;
import java.util.*;
public class TableNodeRenderer implements NodeRenderer {
private final HtmlWriter htmlWriter;
private final NodeRendererContext context;
public TableNodeRenderer(NodeRendererContext context) {
this.htmlWriter = context.getHtmlWriter();
this.context = context;
}
@Override
public Set> getNodeTypes() {
return new HashSet<>(Arrays.asList(
TableBlock.class,
TableHead.class,
TableBody.class,
TableRow.class,
TableCell.class
));
}
@Override
public void render(Node node) {
if (node instanceof TableBlock) {
renderBlock((TableBlock) node);
} else if (node instanceof TableHead) {
renderHead((TableHead) node);
} else if (node instanceof TableBody) {
renderBody((TableBody) node);
} else if (node instanceof TableRow) {
renderRow((TableRow) node);
} else if (node instanceof TableCell) {
renderCell((TableCell) node);
}
}
private void renderBlock(TableBlock tableBlock) {
htmlWriter.line();
htmlWriter.tag("table", getAttributes(tableBlock));
renderChildren(tableBlock);
htmlWriter.tag("/table");
htmlWriter.line();
}
private void renderHead(TableHead tableHead) {
htmlWriter.line();
htmlWriter.tag("thead", getAttributes(tableHead));
renderChildren(tableHead);
htmlWriter.tag("/thead");
htmlWriter.line();
}
private void renderBody(TableBody tableBody) {
htmlWriter.line();
htmlWriter.tag("tbody", getAttributes(tableBody));
renderChildren(tableBody);
htmlWriter.tag("/tbody");
htmlWriter.line();
}
private void renderRow(TableRow tableRow) {
htmlWriter.line();
htmlWriter.tag("tr", getAttributes(tableRow));
renderChildren(tableRow);
htmlWriter.tag("/tr");
htmlWriter.line();
}
private void renderCell(TableCell tableCell) {
String tag = tableCell.isHeader() ? "th" : "td";
htmlWriter.tag(tag, getCellAttributes(tableCell));
renderChildren(tableCell);
htmlWriter.tag("/" + tag);
}
private Map getAttributes(Node node) {
return context.extendAttributes(node, Collections.emptyMap());
}
private Map getCellAttributes(TableCell tableCell) {
if (tableCell.getAlignment() != null) {
return context.extendAttributes(tableCell, Collections.singletonMap("align", getAlignValue(tableCell.getAlignment())));
} else {
return context.extendAttributes(tableCell, Collections.emptyMap());
}
}
private static String getAlignValue(TableCell.Alignment alignment) {
switch (alignment) {
case LEFT:
return "left";
case CENTER:
return "center";
case RIGHT:
return "right";
}
throw new IllegalStateException("Unknown alignment: " + alignment);
}
private void renderChildren(Node parent) {
Node node = parent.getFirstChild();
while (node != null) {
Node next = node.getNext();
context.render(node);
node = next;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy