package gutenberg.pegdown;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.pegdown.Extensions;
import org.pegdown.PegDownProcessor;
import org.pegdown.ast.Node;
import org.pegdown.ast.RootNode;
import org.pegdown.ast.TableCellNode;
import org.pegdown.ast.TableColumnNode;
import org.pegdown.ast.TableNode;
import org.pegdown.ast.TableRowNode;
import java.io.IOException;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author <a href="http://twitter.com/aloyer">@aloyer</a>
*/
@RunWith(JUnitParamsRunner.class)
public class PegdownTest extends AbstractPegdownTest {
@Test
@Parameters({
"astText.md, astText.ast",
})
public void dumpAST(String mkdSrc, String astSrc) throws IOException {
String mkd = loadResource(mkdSrc).trim();
String ast = loadResource(astSrc).trim();
PegDownProcessor processor = new PegDownProcessor(Extensions.ALL);
RootNode rootNode = processor.parseMarkdown(normalize(mkd).toCharArray());
String s = dumpAST(rootNode);
assertThat(normalize(s.trim())).isEqualTo(normalize(ast));
}
@Test
@Ignore("Multiline cell not supported")
public void table_multi_line_cell() throws Exception {
String mkd = loadResource("table-multiline-cells.md").trim();
String ast = loadResource("table-multiline-cells.ast").trim();
PegDownProcessor processor = new PegDownProcessor(Extensions.ALL);
RootNode rootNode = processor.parseMarkdown(mkd.toCharArray());
String s = dumpAST(rootNode);
assertThat(normalize(s.trim())).isEqualTo(normalize(ast));
}
@Test
public void table1AST__with_caption_column_alignment_colspan() throws Exception {
String mkd = loadResource("table1.md").trim();
String ast = loadResource("table1.ast").trim();
PegDownProcessor processor = new PegDownProcessor(Extensions.ALL);
RootNode rootNode = processor.parseMarkdown(normalize(mkd).toCharArray());
String s = new Dumper(normalize(mkd)).dump(rootNode).out.toString();
assertThat(normalize(s.trim())).isEqualTo(normalize(ast));
}
@Test
public void line_break_within_paragraph() throws Exception {
String mkd = "" +
"Two empty space at the end of the line \n" +
"should act as a new line in the paragraph\n" +
"\n" +
"This should be an other paragraph...\n" +
"but with no space at the end of the line\n" +
"\n" +
"\n" +
"And yet another one";
PegDownProcessor processor = new PegDownProcessor(Extensions.ALL);
RootNode rootNode = processor.parseMarkdown(normalize(mkd).toCharArray());
String s = new Dumper(normalize(mkd)).dump(rootNode).out.toString();
assertThat(normalize(s.trim())).isEqualTo(normalize("" +
"RootNode [0-185]\n" +
" ParaNode [0-84]\n" +
" SuperNode [0-82]\n" +
" TextNode [0-38] 'Two empty space at the end of the line'\n" +
" SimpleNode [38-41] Linebreak\n" +
" TextNode [41-82] 'should act as a new line in the paragraph'\n" +
" ParaNode [84-164]\n" +
" SuperNode [84-161]\n" +
" TextNode [84-117] 'This should be an other paragraph'\n" +
" SimpleNode [117-120] Ellipsis\n" +
" SimpleNode [120-121] Linebreak\n" +
" TextNode [121-161] 'but with no space at the end of the line'\n" +
" ParaNode [164-185]\n" +
" SuperNode [164-183]\n" +
" TextNode [164-183] 'And yet another one'"));
}
public static class Dumper {
final String data;
StringBuilder out = new StringBuilder();
public Dumper(String data) {
this.data = data;
}
public Dumper dump(Node node) {
dump(0, node);
return this;
}
public void dump(int indent, Node node) {
String prefix = indent(indent);
out.append(prefix).append(toString(node)).append('\n');
for (Node child : node.getChildren())
dump(indent + 1, child);
}
public String toString(Node node) {
if (node instanceof TableNode)
return toStringNode((TableNode) node);
if (node instanceof TableRowNode)
return toStringNode((TableRowNode) node);
if (node instanceof TableCellNode)
return toStringNode((TableCellNode) node);
return node.toString();
}
private String toStringNode(TableNode node) {
return node.toString() + ", " + toStringNodes(node.getColumns());
}
private String toStringNode(TableRowNode node) {
return node.toString() + ", '" + escape(data.substring(node.getStartIndex(), node.getEndIndex())) + "'";
}
private String escape(String s) {
return s.replace("\n", "\\n");
}
private String toStringNodes(List<TableColumnNode> columns) {
StringBuilder b = new StringBuilder();
b.append("[");
for (TableColumnNode n : columns)
b.append(n.getAlignment()).append(", ");
if (b.length() > 1)
b.setLength(b.length() - 2);
b.append("]");
return b.toString();
}
private String toStringNode(TableCellNode node) {
return node.toString() + ", colspan: " + node.getColSpan();
}
private String indent(int indent) {
StringBuilder b = new StringBuilder();
for (int i = 0; i < indent; i++)
b.append(" ");
return b.toString();
}
}
}