/** * test wrapBlock() indentical to wrap() * * @return void */ public function testWrapBlockIndenticalToWrap() { $text = new Text('This is the song that never ends. This is the song that never ends. This is the song that never ends.'); $result = $text->wrapBlock(33); $expected = $text->wrap(33); $this->assertTextEquals($expected, $result); $result = $text->wrapBlock(['width' => 33, 'indentAt' => 0]); $expected = $text->wrap(['width' => 33, 'indentAt' => 0]); $this->assertTextEquals($expected, $result); }
/** * Wraps a complete block of text to a specific width, can optionally wrap * at word breaks. * * ### Options * * - `width` The width to wrap to. Defaults to 72. * - `wordWrap` Only wrap on words breaks (spaces) Defaults to true. * - `indent` String to indent with. Defaults to null. * - `indentAt` 0 based index to start indenting at. Defaults to 0. * * @param array|int $options Array of options to use, or an integer to wrap the text to. * @return string Formatted text. */ public function wrapBlock($options = []) { if (is_numeric($options)) { $options = ['width' => $options]; } $options += ['width' => 72, 'wordWrap' => true, 'indent' => null, 'indentAt' => 0]; if (!empty($options['indentAt']) && $options['indentAt'] === 0) { $indentLength = !empty($options['indent']) ? strlen($options['indent']) : 0; $options['width'] = $options['width'] - $indentLength; return $this->wrap($options); } $wrapped = $this->wrap($options); if (!empty($options['indent'])) { $indentationLength = mb_strlen($options['indent']); $chunks = explode("\n", $wrapped); $count = count($chunks); if ($count < 2) { return $wrapped; } $toRewrap = ''; for ($i = $options['indentAt']; $i < $count; $i++) { $toRewrap .= mb_substr($chunks[$i], $indentationLength) . ' '; unset($chunks[$i]); } $options['width'] -= $indentationLength; $options['indentAt'] = 0; $toRewrapText = new Text($toRewrap); $rewrapped = $toRewrapText->wrap($options); $newChunks = explode("\n", $rewrapped); $chunks = array_merge($chunks, $newChunks); $wrapped = implode("\n", $chunks); } return $wrapped; }