--- /dev/null
+<?php
+
+/*
+ * This file is part of the Behat.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Behat\Definition\Printer;
+
+use Behat\Behat\Definition\Definition;
+use Behat\Testwork\Suite\Suite;
+
+/**
+ * Prints definitions with full information about them.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+final class ConsoleDefinitionInformationPrinter extends ConsoleDefinitionPrinter
+{
+ /**
+ * @var null|string
+ */
+ private $searchCriterion;
+
+ /**
+ * Sets search criterion.
+ *
+ * @param string $criterion
+ */
+ public function setSearchCriterion($criterion)
+ {
+ $this->searchCriterion = $criterion;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function printDefinitions(Suite $suite, $definitions)
+ {
+ $search = $this->searchCriterion;
+ $output = array();
+
+ foreach ($definitions as $definition) {
+ $definition = $this->translateDefinition($suite, $definition);
+ $pattern = $definition->getPattern();
+
+ if (null !== $search && false === mb_strpos($pattern, $search, 0, 'utf8')) {
+ continue;
+ }
+
+ $lines = array_merge(
+ $this->extractHeader($suite, $definition),
+ $this->extractDescription($suite, $definition),
+ $this->extractFooter($suite, $definition)
+ );
+
+ $output[] = implode(PHP_EOL, $lines) . PHP_EOL;
+ }
+
+ $this->write(rtrim(implode(PHP_EOL, $output)));
+ }
+
+ /**
+ * Extracts the formatted header from the definition.
+ *
+ * @param Suite $suite
+ * @param Definition $definition
+ *
+ * @return string[]
+ */
+ private function extractHeader(Suite $suite, Definition $definition)
+ {
+ $pattern = $definition->getPattern();
+ $lines = array();
+ $lines[] = strtr(
+ '{suite} <def_dimmed>|</def_dimmed> <info>{type}</info> <def_regex>{regex}</def_regex>', array(
+ '{suite}' => $suite->getName(),
+ '{type}' => $this->getDefinitionType($definition),
+ '{regex}' => $pattern,
+ )
+ );
+
+ return $lines;
+ }
+
+ /**
+ * Extracts the formatted description from the definition.
+ *
+ * @param Suite $suite
+ * @param Definition $definition
+ *
+ * @return string[]
+ */
+ private function extractDescription(Suite $suite, Definition $definition)
+ {
+ $definition = $this->translateDefinition($suite, $definition);
+
+ $lines = array();
+ if ($description = $definition->getDescription()) {
+ foreach (explode("\n", $description) as $descriptionLine) {
+ $lines[] = strtr(
+ '{space}<def_dimmed>|</def_dimmed> {description}', array(
+ '{space}' => str_pad('', mb_strlen($suite->getName(), 'utf8') + 1),
+ '{description}' => $descriptionLine
+ )
+ );
+ }
+ }
+
+ return $lines;
+ }
+
+ /**
+ * Extracts the formatted footer from the definition.
+ *
+ * @param Suite $suite
+ * @param Definition $definition
+ *
+ * @return string[]
+ */
+ private function extractFooter(Suite $suite, Definition $definition)
+ {
+ $lines = array();
+ $lines[] = strtr(
+ '{space}<def_dimmed>|</def_dimmed> at `{path}`', array(
+ '{space}' => str_pad('', mb_strlen($suite->getName(), 'utf8') + 1),
+ '{path}' => $definition->getPath()
+ )
+ );
+
+ if ($this->isVerbose()) {
+ $lines[] = strtr(
+ '{space}<def_dimmed>|</def_dimmed> on `{filepath}[{start}:{end}]`', array(
+ '{space}' => str_pad('', mb_strlen($suite->getName(), 'utf8') + 1),
+ '{filepath}' => $definition->getReflection()->getFileName(),
+ '{start}' => $definition->getReflection()->getStartLine(),
+ '{end}' => $definition->getReflection()->getEndLine()
+ )
+ );
+ }
+
+ return $lines;
+ }
+}