diff --git a/commonmark/src/main/java/org/commonmark/renderer/markdown/CoreMarkdownNodeRenderer.java b/commonmark/src/main/java/org/commonmark/renderer/markdown/CoreMarkdownNodeRenderer.java index 207851113206effc11735c7819cd8f1bb20ddf10..30c6332b9d2e1ad478f652c40d97884d7c1c2579 100644 --- a/commonmark/src/main/java/org/commonmark/renderer/markdown/CoreMarkdownNodeRenderer.java +++ b/commonmark/src/main/java/org/commonmark/renderer/markdown/CoreMarkdownNodeRenderer.java @@ -86,6 +86,114 @@ public class CoreMarkdownNodeRenderer extends AbstractVisitor implements NodeRen writer.line(); } + @Override + public void visit(ThematicBreak thematicBreak) { + writer.write("***"); + writer.block(); + } + + @Override + public void visit(Heading heading) { + if (heading.getLevel() <= 2) { + LineBreakVisitor lineBreakVisitor = new LineBreakVisitor(); + heading.accept(lineBreakVisitor); + boolean isMultipleLines = lineBreakVisitor.hasLineBreak(); + + if (isMultipleLines) { + // Setext headings: Can have multiple lines, but only level 1 or 2 + visitChildren(heading); + writer.line(); + if (heading.getLevel() == 1) { + // Note that it would be nice to match the length of the contents instead of just using 3, but that's + // not easy. + writer.write("==="); + } else { + writer.write("---"); + } + writer.block(); + return; + } + } + + // ATX headings: Can't have multiple lines, but up to level 6. + for (int i = 0; i < heading.getLevel(); i++) { + writer.write('#'); + } + writer.write(' '); + visitChildren(heading); + + writer.block(); + } + + @Override + public void visit(IndentedCodeBlock indentedCodeBlock) { + String literal = indentedCodeBlock.getLiteral(); + // We need to respect line prefixes which is why we need to write it line by line (e.g. an indented code block + // within a block quote) + writer.writePrefix(" "); + writer.pushPrefix(" "); + List<String> lines = getLines(literal); + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + writer.write(line); + if (i != lines.size() - 1) { + writer.line(); + } + } + writer.popPrefix(); + writer.block(); + } + + @Override + public void visit(FencedCodeBlock fencedCodeBlock) { + String literal = fencedCodeBlock.getLiteral(); + String fence = repeat(String.valueOf(fencedCodeBlock.getFenceChar()), fencedCodeBlock.getFenceLength()); + int indent = fencedCodeBlock.getFenceIndent(); + + if (indent > 0) { + String indentPrefix = repeat(" ", indent); + writer.writePrefix(indentPrefix); + writer.pushPrefix(indentPrefix); + } + + writer.write(fence); + if (fencedCodeBlock.getInfo() != null) { + writer.write(fencedCodeBlock.getInfo()); + } + writer.line(); + if (!literal.isEmpty()) { + List<String> lines = getLines(literal); + for (String line : lines) { + writer.write(line); + writer.line(); + } + } + writer.write(fence); + if (indent > 0) { + writer.popPrefix(); + } + writer.block(); + } + + @Override + public void visit(HtmlBlock htmlBlock) { + List<String> lines = getLines(htmlBlock.getLiteral()); + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + writer.write(line); + if (i != lines.size() - 1) { + writer.line(); + } + } + writer.block(); + } + + @Override + public void visit(Paragraph paragraph) { + visitChildren(paragraph); + writer.block(); + } + @Override public void visit(BlockQuote blockQuote) { writer.writePrefix("> "); @@ -183,97 +291,15 @@ public class CoreMarkdownNodeRenderer extends AbstractVisitor implements NodeRen } @Override - public void visit(FencedCodeBlock fencedCodeBlock) { - String literal = fencedCodeBlock.getLiteral(); - String fence = repeat(String.valueOf(fencedCodeBlock.getFenceChar()), fencedCodeBlock.getFenceLength()); - int indent = fencedCodeBlock.getFenceIndent(); - - if (indent > 0) { - String indentPrefix = repeat(" ", indent); - writer.writePrefix(indentPrefix); - writer.pushPrefix(indentPrefix); - } - - writer.write(fence); - if (fencedCodeBlock.getInfo() != null) { - writer.write(fencedCodeBlock.getInfo()); - } - writer.line(); - if (!literal.isEmpty()) { - List<String> lines = getLines(literal); - for (String line : lines) { - writer.write(line); - writer.line(); - } - } - writer.write(fence); - if (indent > 0) { - writer.popPrefix(); - } - writer.block(); - } - - @Override - public void visit(HardLineBreak hardLineBreak) { - writer.write(" "); - writer.line(); - } - - @Override - public void visit(Heading heading) { - if (heading.getLevel() <= 2) { - LineBreakVisitor lineBreakVisitor = new LineBreakVisitor(); - heading.accept(lineBreakVisitor); - boolean isMultipleLines = lineBreakVisitor.hasLineBreak(); - - if (isMultipleLines) { - // Setext headings: Can have multiple lines, but only level 1 or 2 - visitChildren(heading); - writer.line(); - if (heading.getLevel() == 1) { - // Note that it would be nice to match the length of the contents instead of just using 3, but that's - // not easy. - writer.write("==="); - } else { - writer.write("---"); - } - writer.block(); - return; - } - } - - // ATX headings: Can't have multiple lines, but up to level 6. - for (int i = 0; i < heading.getLevel(); i++) { - writer.write('#'); - } - writer.write(' '); - visitChildren(heading); - - writer.block(); - } - - @Override - public void visit(ThematicBreak thematicBreak) { - writer.write("***"); - writer.block(); - } - - @Override - public void visit(HtmlInline htmlInline) { - writer.write(htmlInline.getLiteral()); + public void visit(StrongEmphasis strongEmphasis) { + writer.write("**"); + super.visit(strongEmphasis); + writer.write("**"); } @Override - public void visit(HtmlBlock htmlBlock) { - List<String> lines = getLines(htmlBlock.getLiteral()); - for (int i = 0; i < lines.size(); i++) { - String line = lines.get(i); - writer.write(line); - if (i != lines.size() - 1) { - writer.line(); - } - } - writer.block(); + public void visit(Link link) { + writeLinkLike(link.getTitle(), link.getDestination(), link, "["); } @Override @@ -282,33 +308,14 @@ public class CoreMarkdownNodeRenderer extends AbstractVisitor implements NodeRen } @Override - public void visit(IndentedCodeBlock indentedCodeBlock) { - String literal = indentedCodeBlock.getLiteral(); - // We need to respect line prefixes which is why we need to write it line by line (e.g. an indented code block - // within a block quote) - writer.writePrefix(" "); - writer.pushPrefix(" "); - List<String> lines = getLines(literal); - for (int i = 0; i < lines.size(); i++) { - String line = lines.get(i); - writer.write(line); - if (i != lines.size() - 1) { - writer.line(); - } - } - writer.popPrefix(); - writer.block(); - } - - @Override - public void visit(Link link) { - writeLinkLike(link.getTitle(), link.getDestination(), link, "["); + public void visit(HtmlInline htmlInline) { + writer.write(htmlInline.getLiteral()); } @Override - public void visit(Paragraph paragraph) { - visitChildren(paragraph); - writer.block(); + public void visit(HardLineBreak hardLineBreak) { + writer.write(" "); + writer.line(); } @Override @@ -316,13 +323,6 @@ public class CoreMarkdownNodeRenderer extends AbstractVisitor implements NodeRen writer.line(); } - @Override - public void visit(StrongEmphasis strongEmphasis) { - writer.write("**"); - super.visit(strongEmphasis); - writer.write("**"); - } - @Override public void visit(Text text) { String literal = text.getLiteral();