Skip to content

Commit c05a1a3

Browse files
committed
handles interrupt in table row
1 parent 6b43484 commit c05a1a3

File tree

2 files changed

+165
-18
lines changed

2 files changed

+165
-18
lines changed

src/Tags/TableRowTag.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Keepsuit\Liquid\Drops\TableRowLoopDrop;
66
use Keepsuit\Liquid\Exceptions\InvalidArgumentException;
7+
use Keepsuit\Liquid\Interrupts\BreakInterrupt;
78
use Keepsuit\Liquid\Nodes\BodyNode;
89
use Keepsuit\Liquid\Nodes\Range;
910
use Keepsuit\Liquid\Parse\TagParseContext;
@@ -87,19 +88,24 @@ public function render(RenderContext $context): string
8788
foreach ($collection as $item) {
8889
$context->set($this->variableName, $item);
8990

90-
$output .= sprintf('<td class="col%s">', $tableRowLoop->col);
91+
$output .= sprintf('%s<td class="col%s">', PHP_EOL, $tableRowLoop->col);
9192
$output .= $this->body->render($context);
9293
$output .= '</td>';
9394

95+
$interrupt = $context->popInterrupt();
96+
if ($interrupt instanceof BreakInterrupt) {
97+
break;
98+
}
99+
94100
if ($tableRowLoop->col_last && ! $tableRowLoop->last) {
95-
$output .= sprintf('</tr><tr class="row%s">', $tableRowLoop->row + 1);
101+
$output .= sprintf('%s</tr>%s<tr class="row%s">', PHP_EOL, PHP_EOL, $tableRowLoop->row + 1);
96102
}
97103

98104
$tableRowLoop->increment();
99105
}
100106
});
101107

102-
$output .= '</tr>';
108+
$output .= PHP_EOL.'</tr>';
103109

104110
return $output;
105111
}

tests/Integration/Tags/TableRowTest.php

Lines changed: 156 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,73 +2,157 @@
22

33
test('table row', function () {
44
assertTemplateResult(
5-
'<tr class="row1"><td class="col1"> 1 </td><td class="col2"> 2 </td><td class="col3"> 3 </td></tr><tr class="row2"><td class="col1"> 4 </td><td class="col2"> 5 </td><td class="col3"> 6 </td></tr>',
5+
<<<'HTML'
6+
<tr class="row1">
7+
<td class="col1"> 1 </td>
8+
<td class="col2"> 2 </td>
9+
<td class="col3"> 3 </td>
10+
</tr>
11+
<tr class="row2">
12+
<td class="col1"> 4 </td>
13+
<td class="col2"> 5 </td>
14+
<td class="col3"> 6 </td>
15+
</tr>
16+
HTML,
617
'{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
718
['numbers' => [1, 2, 3, 4, 5, 6]],
819
);
920

1021
assertTemplateResult(
11-
'<tr class="row1"></tr>',
22+
"<tr class=\"row1\">\n</tr>",
1223
'{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
1324
['numbers' => []],
1425
);
1526
});
1627

1728
test('table row with different cols', function () {
1829
assertTemplateResult(
19-
'<tr class="row1"><td class="col1"> 1 </td><td class="col2"> 2 </td><td class="col3"> 3 </td><td class="col4"> 4 </td><td class="col5"> 5 </td></tr><tr class="row2"><td class="col1"> 6 </td></tr>',
30+
<<<'HTML'
31+
<tr class="row1">
32+
<td class="col1"> 1 </td>
33+
<td class="col2"> 2 </td>
34+
<td class="col3"> 3 </td>
35+
<td class="col4"> 4 </td>
36+
<td class="col5"> 5 </td>
37+
</tr>
38+
<tr class="row2">
39+
<td class="col1"> 6 </td>
40+
</tr>
41+
HTML,
2042
'{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}',
2143
['numbers' => [1, 2, 3, 4, 5, 6]],
2244
);
2345
});
2446

2547
test('table col counter', function () {
2648
assertTemplateResult(
27-
'<tr class="row1"><td class="col1">1</td><td class="col2">2</td></tr><tr class="row2"><td class="col1">1</td><td class="col2">2</td></tr><tr class="row3"><td class="col1">1</td><td class="col2">2</td></tr>',
49+
<<<'HTML'
50+
<tr class="row1">
51+
<td class="col1">1</td>
52+
<td class="col2">2</td>
53+
</tr>
54+
<tr class="row2">
55+
<td class="col1">1</td>
56+
<td class="col2">2</td>
57+
</tr>
58+
<tr class="row3">
59+
<td class="col1">1</td>
60+
<td class="col2">2</td>
61+
</tr>
62+
HTML,
2863
'{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}',
2964
['numbers' => [1, 2, 3, 4, 5, 6]],
3065
);
3166
});
3267

3368
test('quoted fragment', function () {
3469
assertTemplateResult(
35-
'<tr class="row1"><td class="col1"> 1 </td><td class="col2"> 2 </td><td class="col3"> 3 </td></tr><tr class="row2"><td class="col1"> 4 </td><td class="col2"> 5 </td><td class="col3"> 6 </td></tr>',
70+
<<<'HTML'
71+
<tr class="row1">
72+
<td class="col1"> 1 </td>
73+
<td class="col2"> 2 </td>
74+
<td class="col3"> 3 </td>
75+
</tr>
76+
<tr class="row2">
77+
<td class="col1"> 4 </td>
78+
<td class="col2"> 5 </td>
79+
<td class="col3"> 6 </td>
80+
</tr>
81+
HTML,
3682
'{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}',
3783
['collections' => ['frontpage' => [1, 2, 3, 4, 5, 6]]],
3884
);
3985
assertTemplateResult(
40-
'<tr class="row1"><td class="col1"> 1 </td><td class="col2"> 2 </td><td class="col3"> 3 </td></tr><tr class="row2"><td class="col1"> 4 </td><td class="col2"> 5 </td><td class="col3"> 6 </td></tr>',
86+
<<<'HTML'
87+
<tr class="row1">
88+
<td class="col1"> 1 </td>
89+
<td class="col2"> 2 </td>
90+
<td class="col3"> 3 </td>
91+
</tr>
92+
<tr class="row2">
93+
<td class="col1"> 4 </td>
94+
<td class="col2"> 5 </td>
95+
<td class="col3"> 6 </td>
96+
</tr>
97+
HTML,
4198
"{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}",
4299
['collections' => ['frontpage' => [1, 2, 3, 4, 5, 6]]],
43100
);
44101
});
45102

46103
test('enumerable drop', function () {
47104
assertTemplateResult(
48-
'<tr class="row1"><td class="col1"> 1 </td><td class="col2"> 2 </td><td class="col3"> 3 </td></tr><tr class="row2"><td class="col1"> 4 </td><td class="col2"> 5 </td><td class="col3"> 6 </td></tr>',
105+
<<<'HTML'
106+
<tr class="row1">
107+
<td class="col1"> 1 </td>
108+
<td class="col2"> 2 </td>
109+
<td class="col3"> 3 </td>
110+
</tr>
111+
<tr class="row2">
112+
<td class="col1"> 4 </td>
113+
<td class="col2"> 5 </td>
114+
<td class="col3"> 6 </td>
115+
</tr>
116+
HTML,
49117
'{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
50118
['numbers' => new \Keepsuit\Liquid\Tests\Stubs\IteratorDrop([1, 2, 3, 4, 5, 6])],
51119
);
52120
});
53121

54122
test('offset and limit', function () {
55123
assertTemplateResult(
56-
'<tr class="row1"><td class="col1"> 1 </td><td class="col2"> 2 </td><td class="col3"> 3 </td></tr><tr class="row2"><td class="col1"> 4 </td><td class="col2"> 5 </td><td class="col3"> 6 </td></tr>',
124+
<<<'HTML'
125+
<tr class="row1">
126+
<td class="col1"> 1 </td>
127+
<td class="col2"> 2 </td>
128+
<td class="col3"> 3 </td>
129+
</tr>
130+
<tr class="row2">
131+
<td class="col1"> 4 </td>
132+
<td class="col2"> 5 </td>
133+
<td class="col3"> 6 </td>
134+
</tr>
135+
HTML,
57136
'{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}',
58137
['numbers' => [0, 1, 2, 3, 4, 5, 6, 7]],
59138
);
60139
});
61140

62141
test('blank string not iterable', function () {
63142
assertTemplateResult(
64-
'<tr class="row1"></tr>',
143+
"<tr class=\"row1\">\n</tr>",
65144
'{% tablerow char in characters cols:3 %}I WILL NOT BE OUTPUT{% endtablerow %}',
66145
['characters' => ''],
67146
);
68147
});
69148

70149
test('cols null constant same as evaluated null expression', function () {
71-
$expect = '<tr class="row1"><td class="col1">false</td><td class="col2">false</td></tr>';
150+
$expect = <<<'HTML'
151+
<tr class="row1">
152+
<td class="col1">false</td>
153+
<td class="col2">false</td>
154+
</tr>
155+
HTML;
72156

73157
assertTemplateResult(
74158
$expect,
@@ -82,7 +166,7 @@
82166
});
83167

84168
test('nil limit is treated as zero', function () {
85-
$expect = '<tr class="row1"></tr>';
169+
$expect = "<tr class=\"row1\">\n</tr>";
86170

87171
assertTemplateResult(
88172
$expect,
@@ -96,7 +180,12 @@
96180
});
97181

98182
test('nil offset is treated as zero', function () {
99-
$expect = '<tr class="row1"><td class="col1">1:false</td><td class="col2">2:true</td></tr>';
183+
$expect = <<<'HTML'
184+
<tr class="row1">
185+
<td class="col1">1:false</td>
186+
<td class="col2">2:true</td>
187+
</tr>
188+
HTML;
100189

101190
assertTemplateResult(
102191
$expect,
@@ -128,7 +217,8 @@
128217
LIQUID;
129218

130219
$expect = <<<'HTML'
131-
<tr class="row1"><td class="col1">
220+
<tr class="row1">
221+
<td class="col1">
132222
col: 1
133223
col0: 0
134224
col_first: true
@@ -141,7 +231,8 @@
141231
rindex: 2
142232
rindex0: 1
143233
row: 1
144-
</td><td class="col2">
234+
</td>
235+
<td class="col2">
145236
col: 2
146237
col0: 1
147238
col_first: false
@@ -154,7 +245,8 @@
154245
rindex: 1
155246
rindex0: 0
156247
row: 1
157-
</td></tr>
248+
</td>
249+
</tr>
158250
HTML;
159251

160252
assertTemplateResult($expect, $template);
@@ -177,3 +269,52 @@
177269
renderErrors: true,
178270
);
179271
});
272+
273+
test('tablerow handles interrupts', function () {
274+
assertTemplateResult(
275+
"<tr class=\"row1\">\n<td class=\"col1\"> 1 </td>\n</tr>",
276+
'{% tablerow n in (1..3) cols:2 %} {{n}} {% break %} {{n}} {% endtablerow %}'
277+
);
278+
279+
assertTemplateResult(
280+
"<tr class=\"row1\">\n<td class=\"col1\"> 1 </td>\n<td class=\"col2\"> 2 </td>\n</tr>\n<tr class=\"row2\">\n<td class=\"col1\"> 3 </td>\n</tr>",
281+
'{% tablerow n in (1..3) cols:2 %} {{n}} {% continue %} {{n}} {% endtablerow %}',
282+
);
283+
});
284+
285+
test('tablerow does not leak interrupts', function () {
286+
$template = <<<'LIQUID'
287+
{% for i in (1..2) -%}
288+
{% for j in (1..2) -%}
289+
{% tablerow k in (1..3) %}{% break %}{% endtablerow %}
290+
loop j={{ j }}
291+
{% endfor -%}
292+
loop i={{ i }}
293+
{% endfor -%}
294+
after loop
295+
LIQUID;
296+
297+
$expected = <<<'HTML'
298+
<tr class="row1">
299+
<td class="col1"></td>
300+
</tr>
301+
loop j=1
302+
<tr class="row1">
303+
<td class="col1"></td>
304+
</tr>
305+
loop j=2
306+
loop i=1
307+
<tr class="row1">
308+
<td class="col1"></td>
309+
</tr>
310+
loop j=1
311+
<tr class="row1">
312+
<td class="col1"></td>
313+
</tr>
314+
loop j=2
315+
loop i=2
316+
after loop
317+
HTML;
318+
319+
assertTemplateResult($expected, $template);
320+
});

0 commit comments

Comments
 (0)