Skip to content

Commit 6e529d4

Browse files
committed
Fix tables rendering
1 parent 1906ee9 commit 6e529d4

File tree

3 files changed

+88
-79
lines changed

3 files changed

+88
-79
lines changed

commonmark-ext-gfm-tables/src/main/java/org/commonmark/ext/gfm/tables/internal/TableTextContentNodeRenderer.java

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ public TableTextContentNodeRenderer(TextContentNodeRendererContext context) {
2323
}
2424

2525
protected void renderBlock(TableBlock tableBlock) {
26+
// Render rows tight
27+
textContentWriter.pushTight(true);
2628
renderChildren(tableBlock);
27-
if (tableBlock.getNext() != null) {
28-
textContentWriter.write("\n");
29-
}
29+
textContentWriter.popTight();
30+
textContentWriter.block();
3031
}
3132

3233
protected void renderHead(TableHead tableHead) {
@@ -38,33 +39,24 @@ protected void renderBody(TableBody tableBody) {
3839
}
3940

4041
protected void renderRow(TableRow tableRow) {
41-
textContentWriter.line();
4242
renderChildren(tableRow);
43-
textContentWriter.line();
43+
textContentWriter.block();
4444
}
4545

4646
protected void renderCell(TableCell tableCell) {
4747
renderChildren(tableCell);
48-
textContentWriter.write('|');
49-
textContentWriter.whitespace();
50-
}
51-
52-
private void renderLastCell(TableCell tableCell) {
53-
renderChildren(tableCell);
48+
// For the last cell in row, don't render the delimiter
49+
if (tableCell.getNext() != null) {
50+
textContentWriter.write('|');
51+
textContentWriter.whitespace();
52+
}
5453
}
5554

5655
private void renderChildren(Node parent) {
5756
Node node = parent.getFirstChild();
5857
while (node != null) {
5958
Node next = node.getNext();
60-
61-
// For last cell in row, we dont render the delimiter.
62-
if (node instanceof TableCell && next == null) {
63-
renderLastCell((TableCell) node);
64-
} else {
65-
context.render(node);
66-
}
67-
59+
context.render(node);
6860
node = next;
6961
}
7062
}

commonmark-ext-gfm-tables/src/test/java/org/commonmark/ext/gfm/tables/TablesTextContentTest.java

Lines changed: 65 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,137 +2,165 @@
22

33
import org.commonmark.Extension;
44
import org.commonmark.parser.Parser;
5+
import org.commonmark.renderer.text.LineBreakRendering;
56
import org.commonmark.renderer.text.TextContentRenderer;
6-
import org.commonmark.testutil.RenderingTestCase;
7+
import org.commonmark.testutil.Asserts;
78
import org.junit.Test;
89

910
import java.util.Set;
1011

11-
public class TablesTextContentTest extends RenderingTestCase {
12+
public class TablesTextContentTest {
1213

1314
private static final Set<Extension> EXTENSIONS = Set.of(TablesExtension.create());
1415
private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS).build();
1516
private static final TextContentRenderer RENDERER = TextContentRenderer.builder().extensions(EXTENSIONS).build();
1617

18+
private static final TextContentRenderer COMPACT_RENDERER = TextContentRenderer.builder().extensions(EXTENSIONS).build();
19+
private static final TextContentRenderer SEPARATE_RENDERER = TextContentRenderer.builder().extensions(EXTENSIONS)
20+
.lineBreakRendering(LineBreakRendering.SEPARATE_BLOCKS).build();
21+
private static final TextContentRenderer STRIPPED_RENDERER = TextContentRenderer.builder().extensions(EXTENSIONS)
22+
.lineBreakRendering(LineBreakRendering.STRIP).build();
23+
1724
@Test
1825
public void oneHeadNoBody() {
19-
assertRendering("Abc|Def\n---|---", "Abc| Def\n");
26+
assertCompact("Abc|Def\n---|---", "Abc| Def");
2027
}
2128

2229
@Test
2330
public void oneColumnOneHeadNoBody() {
24-
String expected = "Abc\n";
25-
assertRendering("|Abc\n|---\n", expected);
26-
assertRendering("|Abc|\n|---|\n", expected);
27-
assertRendering("Abc|\n---|\n", expected);
31+
String expected = "Abc";
32+
assertCompact("|Abc\n|---\n", expected);
33+
assertCompact("|Abc|\n|---|\n", expected);
34+
assertCompact("Abc|\n---|\n", expected);
2835

2936
// Pipe required on separator
30-
assertRendering("|Abc\n---\n", "|Abc");
37+
assertCompact("|Abc\n---\n", "|Abc");
3138
// Pipe required on head
32-
assertRendering("Abc\n|---\n", "Abc\n|---");
39+
assertCompact("Abc\n|---\n", "Abc\n|---");
3340
}
3441

3542
@Test
3643
public void oneColumnOneHeadOneBody() {
37-
String expected = "Abc\n1\n";
38-
assertRendering("|Abc\n|---\n|1", expected);
39-
assertRendering("|Abc|\n|---|\n|1|", expected);
40-
assertRendering("Abc|\n---|\n1|", expected);
44+
String expected = "Abc\n1";
45+
assertCompact("|Abc\n|---\n|1", expected);
46+
assertCompact("|Abc|\n|---|\n|1|", expected);
47+
assertCompact("Abc|\n---|\n1|", expected);
4148

4249
// Pipe required on separator
43-
assertRendering("|Abc\n---\n|1", "|Abc\n|1");
50+
assertCompact("|Abc\n---\n|1", "|Abc\n|1");
4451
}
4552

4653
@Test
4754
public void oneHeadOneBody() {
48-
assertRendering("Abc|Def\n---|---\n1|2", "Abc| Def\n1| 2\n");
55+
assertCompact("Abc|Def\n---|---\n1|2", "Abc| Def\n1| 2");
4956
}
5057

5158
@Test
5259
public void separatorMustNotHaveLessPartsThanHead() {
53-
assertRendering("Abc|Def|Ghi\n---|---\n1|2|3", "Abc|Def|Ghi\n---|---\n1|2|3");
60+
assertCompact("Abc|Def|Ghi\n---|---\n1|2|3", "Abc|Def|Ghi\n---|---\n1|2|3");
5461
}
5562

5663
@Test
5764
public void padding() {
58-
assertRendering(" Abc | Def \n --- | --- \n 1 | 2 ", "Abc| Def\n1| 2\n");
65+
assertCompact(" Abc | Def \n --- | --- \n 1 | 2 ", "Abc| Def\n1| 2");
5966
}
6067

6168
@Test
6269
public void paddingWithCodeBlockIndentation() {
63-
assertRendering("Abc|Def\n---|---\n 1|2", "Abc| Def\n1| 2\n");
70+
assertCompact("Abc|Def\n---|---\n 1|2", "Abc| Def\n1| 2");
6471
}
6572

6673
@Test
6774
public void pipesOnOutside() {
68-
assertRendering("|Abc|Def|\n|---|---|\n|1|2|", "Abc| Def\n1| 2\n");
75+
assertCompact("|Abc|Def|\n|---|---|\n|1|2|", "Abc| Def\n1| 2");
6976
}
7077

7178
@Test
7279
public void inlineElements() {
73-
assertRendering("*Abc*|Def\n---|---\n1|2", "Abc| Def\n1| 2\n");
80+
assertCompact("*Abc*|Def\n---|---\n1|2", "Abc| Def\n1| 2");
7481
}
7582

7683
@Test
7784
public void escapedPipe() {
78-
assertRendering("Abc|Def\n---|---\n1\\|2|20", "Abc| Def\n1|2| 20\n");
85+
assertCompact("Abc|Def\n---|---\n1\\|2|20", "Abc| Def\n1|2| 20");
7986
}
8087

8188
@Test
8289
public void alignLeft() {
83-
assertRendering("Abc|Def\n:---|---\n1|2", "Abc| Def\n1| 2\n");
90+
assertCompact("Abc|Def\n:---|---\n1|2", "Abc| Def\n1| 2");
8491
}
8592

8693
@Test
8794
public void alignRight() {
88-
assertRendering("Abc|Def\n---:|---\n1|2", "Abc| Def\n1| 2\n");
95+
assertCompact("Abc|Def\n---:|---\n1|2", "Abc| Def\n1| 2");
8996
}
9097

9198
@Test
9299
public void alignCenter() {
93-
assertRendering("Abc|Def\n:---:|---\n1|2", "Abc| Def\n1| 2\n");
100+
assertCompact("Abc|Def\n:---:|---\n1|2", "Abc| Def\n1| 2");
94101
}
95102

96103
@Test
97104
public void alignCenterSecond() {
98-
assertRendering("Abc|Def\n---|:---:\n1|2", "Abc| Def\n1| 2\n");
105+
assertCompact("Abc|Def\n---|:---:\n1|2", "Abc| Def\n1| 2");
99106
}
100107

101108
@Test
102109
public void alignLeftWithSpaces() {
103-
assertRendering("Abc|Def\n :--- |---\n1|2", "Abc| Def\n1| 2\n");
110+
assertCompact("Abc|Def\n :--- |---\n1|2", "Abc| Def\n1| 2");
104111
}
105112

106113
@Test
107114
public void alignmentMarkerMustBeNextToDashes() {
108-
assertRendering("Abc|Def\n: ---|---", "Abc|Def\n: ---|---");
109-
assertRendering("Abc|Def\n--- :|---", "Abc|Def\n--- :|---");
110-
assertRendering("Abc|Def\n---|: ---", "Abc|Def\n---|: ---");
111-
assertRendering("Abc|Def\n---|--- :", "Abc|Def\n---|--- :");
115+
assertCompact("Abc|Def\n: ---|---", "Abc|Def\n: ---|---");
116+
assertCompact("Abc|Def\n--- :|---", "Abc|Def\n--- :|---");
117+
assertCompact("Abc|Def\n---|: ---", "Abc|Def\n---|: ---");
118+
assertCompact("Abc|Def\n---|--- :", "Abc|Def\n---|--- :");
112119
}
113120

114121
@Test
115122
public void bodyCanNotHaveMoreColumnsThanHead() {
116-
assertRendering("Abc|Def\n---|---\n1|2|3", "Abc| Def\n1| 2\n");
123+
assertCompact("Abc|Def\n---|---\n1|2|3", "Abc| Def\n1| 2");
117124
}
118125

119126
@Test
120127
public void bodyWithFewerColumnsThanHeadResultsInEmptyCells() {
121-
assertRendering("Abc|Def|Ghi\n---|---|---\n1|2", "Abc| Def| Ghi\n1| 2| \n");
128+
assertCompact("Abc|Def|Ghi\n---|---|---\n1|2", "Abc| Def| Ghi\n1| 2| ");
122129
}
123130

124131
@Test
125132
public void insideBlockQuote() {
126-
assertRendering("> Abc|Def\n> ---|---\n> 1|2", \nAbc| Def\n1| 2\n»");
133+
assertCompact("> Abc|Def\n> ---|---\n> 1|2", Abc| Def\n1| 2»");
127134
}
128135

129136
@Test
130137
public void tableWithLazyContinuationLine() {
131-
assertRendering("Abc|Def\n---|---\n1|2\nlazy", "Abc| Def\n1| 2\nlazy| \n");
138+
assertCompact("Abc|Def\n---|---\n1|2\nlazy", "Abc| Def\n1| 2\nlazy| ");
139+
}
140+
141+
@Test
142+
public void tableBetweenOtherBlocks() {
143+
var s = "Foo\n\nAbc|Def\n---|---\n1|2\n\nBar";
144+
assertCompact(s, "Foo\nAbc| Def\n1| 2\nBar");
145+
assertSeparate(s, "Foo\n\nAbc| Def\n1| 2\n\nBar");
146+
assertStripped(s, "Foo Abc| Def 1| 2 Bar");
147+
}
148+
149+
private void assertCompact(String source, String expected) {
150+
var doc = PARSER.parse(source);
151+
var actualRendering = COMPACT_RENDERER.render(doc);
152+
Asserts.assertRendering(source, expected, actualRendering);
153+
}
154+
155+
private void assertSeparate(String source, String expected) {
156+
var doc = PARSER.parse(source);
157+
var actualRendering = SEPARATE_RENDERER.render(doc);
158+
Asserts.assertRendering(source, expected, actualRendering);
132159
}
133160

134-
@Override
135-
protected String render(String source) {
136-
return RENDERER.render(PARSER.parse(source));
161+
private void assertStripped(String source, String expected) {
162+
var doc = PARSER.parse(source);
163+
var actualRendering = STRIPPED_RENDERER.render(doc);
164+
Asserts.assertRendering(source, expected, actualRendering);
137165
}
138166
}

commonmark/src/test/java/org/commonmark/test/TextContentRendererTest.java

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import org.commonmark.renderer.text.LineBreakRendering;
44
import org.commonmark.renderer.text.TextContentRenderer;
5-
import org.commonmark.node.Node;
65
import org.commonmark.parser.Parser;
76
import org.commonmark.testutil.Asserts;
87
import org.junit.Test;
@@ -11,6 +10,12 @@
1110

1211
public class TextContentRendererTest {
1312

13+
private static final Parser PARSER = Parser.builder().build();
14+
private static final TextContentRenderer COMPACT_RENDERER = TextContentRenderer.builder().build();
15+
private static final TextContentRenderer SEPARATE_RENDERER = TextContentRenderer.builder()
16+
.lineBreakRendering(LineBreakRendering.SEPARATE_BLOCKS).build();
17+
private static final TextContentRenderer STRIPPED_RENDERER = TextContentRenderer.builder().stripNewlines(true).build();
18+
1419
@Test
1520
public void textContentText() {
1621
String s;
@@ -179,37 +184,21 @@ public void textContentHtml() {
179184
assertAll(html, html);
180185
}
181186

182-
private TextContentRenderer compactRenderer() {
183-
return TextContentRenderer.builder().build();
184-
}
185-
186-
private TextContentRenderer separateBlocksRenderer() {
187-
return TextContentRenderer.builder().lineBreakRendering(LineBreakRendering.SEPARATE_BLOCKS).build();
188-
}
189-
190-
private TextContentRenderer strippedRenderer() {
191-
return TextContentRenderer.builder().stripNewlines(true).build();
192-
}
193-
194-
private Node parse(String source) {
195-
return Parser.builder().build().parse(source);
196-
}
197-
198187
private void assertCompact(String source, String expected) {
199-
var doc = parse(source);
200-
var actualRendering = compactRenderer().render(doc);
188+
var doc = PARSER.parse(source);
189+
var actualRendering = COMPACT_RENDERER.render(doc);
201190
Asserts.assertRendering(source, expected, actualRendering);
202191
}
203192

204193
private void assertSeparate(String source, String expected) {
205-
var doc = parse(source);
206-
var actualRendering = separateBlocksRenderer().render(doc);
194+
var doc = PARSER.parse(source);
195+
var actualRendering = SEPARATE_RENDERER.render(doc);
207196
Asserts.assertRendering(source, expected, actualRendering);
208197
}
209198

210199
private void assertStripped(String source, String expected) {
211-
var doc = parse(source);
212-
var actualRendering = strippedRenderer().render(doc);
200+
var doc = PARSER.parse(source);
201+
var actualRendering = STRIPPED_RENDERER.render(doc);
213202
Asserts.assertRendering(source, expected, actualRendering);
214203
}
215204

0 commit comments

Comments
 (0)