annotate vendor/consolidation/output-formatters/src/Transformations/TableTransformation.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2 namespace Consolidation\OutputFormatters\Transformations;
Chris@0 3
Chris@0 4 use Consolidation\OutputFormatters\StructuredData\TableDataInterface;
Chris@0 5 use Consolidation\OutputFormatters\StructuredData\OriginalDataInterface;
Chris@13 6 use Consolidation\OutputFormatters\StructuredData\MetadataHolderInterface;
Chris@17 7 use Consolidation\OutputFormatters\Options\FormatterOptions;
Chris@17 8 use Consolidation\OutputFormatters\Formatters\TsvFormatter;
Chris@17 9 use Symfony\Component\Console\Output\BufferedOutput;
Chris@0 10
Chris@17 11 class TableTransformation extends \ArrayObject implements TableDataInterface, StringTransformationInterface, OriginalDataInterface
Chris@0 12 {
Chris@0 13 protected $headers;
Chris@0 14 protected $rowLabels;
Chris@0 15 protected $layout;
Chris@13 16 /** @var MetadataHolderInterface */
Chris@13 17 protected $originalData;
Chris@0 18
Chris@0 19 const TABLE_LAYOUT = 'table';
Chris@0 20 const LIST_LAYOUT = 'list';
Chris@0 21
Chris@0 22 public function __construct($data, $fieldLabels, $rowLabels = [])
Chris@0 23 {
Chris@0 24 $this->headers = $fieldLabels;
Chris@0 25 $this->rowLabels = $rowLabels;
Chris@0 26 $rows = static::transformRows($data, $fieldLabels);
Chris@0 27 $this->layout = self::TABLE_LAYOUT;
Chris@0 28 parent::__construct($rows);
Chris@0 29 }
Chris@0 30
Chris@0 31 public function setLayout($layout)
Chris@0 32 {
Chris@0 33 $this->layout = $layout;
Chris@0 34 }
Chris@0 35
Chris@0 36 public function getLayout()
Chris@0 37 {
Chris@0 38 return $this->layout;
Chris@0 39 }
Chris@0 40
Chris@0 41 public function isList()
Chris@0 42 {
Chris@0 43 return $this->layout == self::LIST_LAYOUT;
Chris@0 44 }
Chris@0 45
Chris@17 46 /**
Chris@17 47 * @inheritdoc
Chris@17 48 */
Chris@17 49 public function simplifyToString(FormatterOptions $options)
Chris@17 50 {
Chris@17 51 $alternateFormatter = new TsvFormatter();
Chris@17 52 $output = new BufferedOutput();
Chris@17 53
Chris@17 54 try {
Chris@17 55 $data = $alternateFormatter->validate($this->getArrayCopy());
Chris@17 56 $alternateFormatter->write($output, $this->getArrayCopy(), $options);
Chris@17 57 } catch (\Exception $e) {
Chris@17 58 }
Chris@17 59 return $output->fetch();
Chris@17 60 }
Chris@17 61
Chris@0 62 protected static function transformRows($data, $fieldLabels)
Chris@0 63 {
Chris@0 64 $rows = [];
Chris@0 65 foreach ($data as $rowid => $row) {
Chris@0 66 $rows[$rowid] = static::transformRow($row, $fieldLabels);
Chris@0 67 }
Chris@0 68 return $rows;
Chris@0 69 }
Chris@0 70
Chris@0 71 protected static function transformRow($row, $fieldLabels)
Chris@0 72 {
Chris@0 73 $result = [];
Chris@0 74 foreach ($fieldLabels as $key => $label) {
Chris@0 75 $result[$key] = array_key_exists($key, $row) ? $row[$key] : '';
Chris@0 76 }
Chris@0 77 return $result;
Chris@0 78 }
Chris@0 79
Chris@0 80 public function getHeaders()
Chris@0 81 {
Chris@0 82 return $this->headers;
Chris@0 83 }
Chris@0 84
Chris@0 85 public function getHeader($key)
Chris@0 86 {
Chris@0 87 if (array_key_exists($key, $this->headers)) {
Chris@0 88 return $this->headers[$key];
Chris@0 89 }
Chris@0 90 return $key;
Chris@0 91 }
Chris@0 92
Chris@0 93 public function getRowLabels()
Chris@0 94 {
Chris@0 95 return $this->rowLabels;
Chris@0 96 }
Chris@0 97
Chris@0 98 public function getRowLabel($rowid)
Chris@0 99 {
Chris@0 100 if (array_key_exists($rowid, $this->rowLabels)) {
Chris@0 101 return $this->rowLabels[$rowid];
Chris@0 102 }
Chris@0 103 return $rowid;
Chris@0 104 }
Chris@0 105
Chris@0 106 public function getOriginalData()
Chris@0 107 {
Chris@13 108 if (isset($this->originalData)) {
Chris@13 109 return $this->originalData->reconstruct($this->getArrayCopy(), $this->originalData->getMetadata());
Chris@13 110 }
Chris@0 111 return $this->getArrayCopy();
Chris@0 112 }
Chris@0 113
Chris@13 114 public function setOriginalData(MetadataHolderInterface $data)
Chris@13 115 {
Chris@13 116 $this->originalData = $data;
Chris@13 117 }
Chris@13 118
Chris@0 119 public function getTableData($includeRowKey = false)
Chris@0 120 {
Chris@0 121 $data = $this->getArrayCopy();
Chris@0 122 if ($this->isList()) {
Chris@0 123 $data = $this->convertTableToList();
Chris@0 124 }
Chris@0 125 if ($includeRowKey) {
Chris@0 126 $data = $this->getRowDataWithKey($data);
Chris@0 127 }
Chris@0 128 return $data;
Chris@0 129 }
Chris@0 130
Chris@0 131 protected function convertTableToList()
Chris@0 132 {
Chris@0 133 $result = [];
Chris@0 134 foreach ($this as $row) {
Chris@0 135 foreach ($row as $key => $value) {
Chris@0 136 $result[$key][] = $value;
Chris@0 137 }
Chris@0 138 }
Chris@0 139 return $result;
Chris@0 140 }
Chris@0 141
Chris@0 142 protected function getRowDataWithKey($data)
Chris@0 143 {
Chris@0 144 $result = [];
Chris@0 145 $i = 0;
Chris@0 146 foreach ($data as $key => $row) {
Chris@0 147 array_unshift($row, $this->getHeader($key));
Chris@0 148 $i++;
Chris@0 149 $result[$key] = $row;
Chris@0 150 }
Chris@0 151 return $result;
Chris@0 152 }
Chris@0 153 }