|
25 | 25 | import com.google.googlejavaformat.java.javadoc.Token.ListItemCloseTag; |
26 | 26 | import com.google.googlejavaformat.java.javadoc.Token.ListItemOpenTag; |
27 | 27 | import com.google.googlejavaformat.java.javadoc.Token.ListOpenTag; |
| 28 | +import com.google.googlejavaformat.java.javadoc.Token.MarkdownFencedCodeBlock; |
28 | 29 | import com.google.googlejavaformat.java.javadoc.Token.ParagraphCloseTag; |
29 | 30 | import com.google.googlejavaformat.java.javadoc.Token.ParagraphOpenTag; |
30 | 31 | import java.util.regex.Matcher; |
31 | 32 | import java.util.regex.Pattern; |
32 | 33 | import org.commonmark.node.BulletList; |
| 34 | +import org.commonmark.node.FencedCodeBlock; |
33 | 35 | import org.commonmark.node.Heading; |
34 | 36 | import org.commonmark.node.ListItem; |
35 | 37 | import org.commonmark.node.Node; |
@@ -102,6 +104,25 @@ void visit(Node node) { |
102 | 104 | visitNodeList(paragraph.getNext()); |
103 | 105 | } |
104 | 106 | } |
| 107 | + case FencedCodeBlock fencedCodeBlock -> { |
| 108 | + // Any indentation before the code block is part of FencedCodeBlock. This makes sense |
| 109 | + // because the lines inside the code block must also be indented by that amount. That |
| 110 | + // indentation gets subtracted from FencedCodeBlock.getLiteral(), which is the actual text |
| 111 | + // represented by the code block. |
| 112 | + int start = startPosition(fencedCodeBlock) + fencedCodeBlock.getFenceIndent(); |
| 113 | + MarkdownFencedCodeBlock token = |
| 114 | + new MarkdownFencedCodeBlock( |
| 115 | + input.substring(start, endPosition(fencedCodeBlock)), |
| 116 | + fencedCodeBlock |
| 117 | + .getFenceCharacter() |
| 118 | + .repeat(fencedCodeBlock.getOpeningFenceLength()) |
| 119 | + + fencedCodeBlock.getInfo(), |
| 120 | + fencedCodeBlock |
| 121 | + .getFenceCharacter() |
| 122 | + .repeat(fencedCodeBlock.getClosingFenceLength()), |
| 123 | + fencedCodeBlock.getLiteral()); |
| 124 | + positionToToken.get(start).addLast(token); |
| 125 | + } |
105 | 126 | // TODO: others |
106 | 127 | default -> {} |
107 | 128 | } |
@@ -131,12 +152,17 @@ private void visitNodeList(Node node) { |
131 | 152 | */ |
132 | 153 | private void addSpan(Node node, Token startToken, Token endToken) { |
133 | 154 | // We could write the first part more simply as a `put`, but we do it this way for symmetry. |
134 | | - var first = node.getSourceSpans().getFirst(); |
135 | | - int startPosition = first.getInputIndex(); |
136 | | - positionToToken.get(startPosition).addLast(startToken); |
| 155 | + positionToToken.get(startPosition(node)).addLast(startToken); |
| 156 | + positionToToken.get(endPosition(node)).addFirst(endToken); |
| 157 | + } |
| 158 | + |
| 159 | + private int startPosition(Node node) { |
| 160 | + return node.getSourceSpans().getFirst().getInputIndex(); |
| 161 | + } |
| 162 | + |
| 163 | + private int endPosition(Node node) { |
137 | 164 | var last = node.getSourceSpans().getLast(); |
138 | | - int endPosition = last.getInputIndex() + last.getLength(); |
139 | | - positionToToken.get(endPosition).addFirst(endToken); |
| 165 | + return last.getInputIndex() + last.getLength(); |
140 | 166 | } |
141 | 167 | } |
142 | 168 |
|
|
0 commit comments