Skip to content

Commit ca6cd28

Browse files
committed
Handle else after each statement
1 parent b7f69f3 commit ca6cd28

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

src/Phug/Compiler/EachCompiler.php

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
use Phug\AbstractStatementNodeCompiler;
66
use Phug\CompilerException;
7+
use Phug\Formatter\Element\CodeElement;
78
use Phug\Formatter\ElementInterface;
9+
use Phug\Parser\Node\CommentNode;
10+
use Phug\Parser\Node\ConditionalNode;
811
use Phug\Parser\Node\EachNode;
912
use Phug\Parser\NodeInterface;
1013

@@ -29,13 +32,21 @@ public function compileNode(NodeInterface $node, ElementInterface $parent = null
2932
);
3033
}
3134

32-
/**
33-
* @var EachNode $node
34-
*/
35+
/** @var EachNode $node */
3536
$subject = $node->getSubject();
3637
$key = $node->getKey();
3738
$item = $node->getItem();
39+
/** @var CodeElement $loop */
40+
$loop = $this->compileLoop($node, $subject, $key, $item);
3841

39-
return $this->compileLoop($node, $subject, $key, $item);
42+
for ($next = $node->getNextSibling(); $next && $next instanceof CommentNode; $next = $node->getNextSibling());
43+
if ($next instanceof ConditionalNode && $next->getName() === 'else') {
44+
$next->setName('if');
45+
$next->setSubject('$__pug_temp_empty');
46+
$loop->setValue('$__pug_temp_empty = true; '.$loop->getValue());
47+
$loop->prependChild(new CodeElement('$__pug_temp_empty = false'));
48+
}
49+
50+
return $loop;
4051
}
4152
}

tests/Phug/Compiler/EachCompilerTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ public function testCompile()
3030
' p?!=$item',
3131
]
3232
);
33+
$this->assertCompile(
34+
[
35+
'<?php $__pug_temp_empty = true; foreach ($items as $item) { ?>',
36+
'<?php $__pug_temp_empty = false ?>',
37+
'<p><?= $item ?></p>',
38+
'<?php } ?>',
39+
'<?php if ($__pug_temp_empty) { ?>',
40+
'<p>no items</p>',
41+
'<?php } ?>',
42+
],
43+
[
44+
'each $item in $items'."\n",
45+
' p?!=$item'."\n",
46+
'else'."\n",
47+
' p no items',
48+
]
49+
);
3350
$this->assertCompile(
3451
[
3552
'<?php foreach ($items as $key => $item) { ?>',

0 commit comments

Comments
 (0)