Chris@0: width = $width; Chris@0: $this->minimumWidths = new ColumnWidths(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Calculate our padding widths from the specified table style. Chris@0: * @param TableStyle $style Chris@0: */ Chris@0: public function setPaddingFromStyle(TableStyle $style) Chris@0: { Chris@0: $verticalBorderLen = strlen(sprintf($style->getBorderFormat(), $style->getVerticalBorderChar())); Chris@0: $paddingLen = strlen($style->getPaddingChar()); Chris@0: Chris@0: $this->extraPaddingAtBeginningOfLine = 0; Chris@0: $this->extraPaddingAtEndOfLine = $verticalBorderLen; Chris@0: $this->paddingInEachCell = $verticalBorderLen + $paddingLen + 1; Chris@0: } Chris@0: Chris@0: /** Chris@0: * If columns have minimum widths, then set them here. Chris@0: * @param array $minimumWidths Chris@0: */ Chris@0: public function setMinimumWidths($minimumWidths) Chris@0: { Chris@0: $this->minimumWidths = new ColumnWidths($minimumWidths); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the minimum width of just one column Chris@0: */ Chris@0: public function minimumWidth($colkey, $width) Chris@0: { Chris@0: $this->minimumWidths->setWidth($colkey, $width); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Wrap the cells in each part of the provided data table Chris@0: * @param array $rows Chris@0: * @return array Chris@0: */ Chris@0: public function wrap($rows, $widths = []) Chris@0: { Chris@0: $auto_widths = $this->calculateWidths($rows, $widths); Chris@0: Chris@0: // If no widths were provided, then disable wrapping Chris@0: if ($auto_widths->isEmpty()) { Chris@0: return $rows; Chris@0: } Chris@0: Chris@0: // Do wordwrap on all cells. Chris@0: $newrows = array(); Chris@0: foreach ($rows as $rowkey => $row) { Chris@0: foreach ($row as $colkey => $cell) { Chris@0: $newrows[$rowkey][$colkey] = $this->wrapCell($cell, $auto_widths->width($colkey)); Chris@0: } Chris@0: } Chris@0: Chris@0: return $newrows; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Determine what widths we'll use for wrapping. Chris@0: */ Chris@0: protected function calculateWidths($rows, $widths = []) Chris@0: { Chris@0: // Widths must be provided in some form or another, or we won't wrap. Chris@0: if (empty($widths) && !$this->width) { Chris@0: return new ColumnWidths(); Chris@0: } Chris@0: Chris@0: // Technically, `$widths`, if provided here, should be used Chris@0: // as the exact widths to wrap to. For now we'll just treat Chris@0: // these as minimum widths Chris@0: $minimumWidths = $this->minimumWidths->combine(new ColumnWidths($widths)); Chris@0: Chris@0: $calculator = new CalculateWidths(); Chris@0: $dataCellWidths = $calculator->calculateLongestCell($rows); Chris@0: Chris@0: $availableWidth = $this->width - $dataCellWidths->paddingSpace($this->paddingInEachCell, $this->extraPaddingAtEndOfLine, $this->extraPaddingAtBeginningOfLine); Chris@0: Chris@0: $this->minimumWidths->adjustMinimumWidths($availableWidth, $dataCellWidths); Chris@0: Chris@0: return $calculator->calculate($availableWidth, $dataCellWidths, $minimumWidths); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Wrap one cell. Guard against modifying non-strings and Chris@0: * then call through to wordwrap(). Chris@0: * Chris@0: * @param mixed $cell Chris@0: * @param string $cellWidth Chris@0: * @return mixed Chris@0: */ Chris@0: protected function wrapCell($cell, $cellWidth) Chris@0: { Chris@0: if (!is_string($cell)) { Chris@0: return $cell; Chris@0: } Chris@0: return wordwrap($cell, $cellWidth, "\n", true); Chris@0: } Chris@0: }