Chris@0: convertEncoding = $convertEncodingUpper; Chris@0: } else { Chris@0: $this->convertEncoding = null; Chris@0: } Chris@0: $this->encoding = $encodingUpper; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the defined character encoding to work with Chris@0: * Chris@0: * @return string Chris@0: * @throws Exception\LogicException If no encoding was defined Chris@0: */ Chris@0: public function getEncoding() Chris@0: { Chris@0: return $this->encoding; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Get the defined character encoding to convert to Chris@0: * Chris@0: * @return string|null Chris@0: */ Chris@0: public function getConvertEncoding() Chris@0: { Chris@0: return $this->convertEncoding; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Convert a string from defined character encoding to the defined convert encoding Chris@0: * Chris@0: * @param string $str Chris@0: * @param bool $reverse Chris@0: * @return string|false Chris@0: */ Chris@0: public function convert($str, $reverse = false) Chris@0: { Chris@0: $encoding = $this->getEncoding(); Chris@0: $convertEncoding = $this->getConvertEncoding(); Chris@0: if ($convertEncoding === null) { Chris@0: throw new Exception\LogicException( Chris@0: 'No convert encoding defined' Chris@0: ); Chris@0: } Chris@0: Chris@0: if ($encoding === $convertEncoding) { Chris@0: return $str; Chris@0: } Chris@0: Chris@0: $from = $reverse ? $convertEncoding : $encoding; Chris@0: $to = $reverse ? $encoding : $convertEncoding; Chris@0: throw new Exception\RuntimeException(sprintf( Chris@0: 'Converting from "%s" to "%s" isn\'t supported by this string wrapper', Chris@0: $from, Chris@0: $to Chris@0: )); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Wraps a string to a given number of characters Chris@0: * Chris@0: * @param string $string Chris@0: * @param int $width Chris@0: * @param string $break Chris@0: * @param bool $cut Chris@0: * @return string|false Chris@0: */ Chris@0: public function wordWrap($string, $width = 75, $break = "\n", $cut = false) Chris@0: { Chris@0: $string = (string) $string; Chris@0: if ($string === '') { Chris@0: return ''; Chris@0: } Chris@0: Chris@0: $break = (string) $break; Chris@0: if ($break === '') { Chris@0: throw new Exception\InvalidArgumentException('Break string cannot be empty'); Chris@0: } Chris@0: Chris@0: $width = (int) $width; Chris@0: if ($width === 0 && $cut) { Chris@0: throw new Exception\InvalidArgumentException('Cannot force cut when width is zero'); Chris@0: } Chris@0: Chris@0: if (StringUtils::isSingleByteEncoding($this->getEncoding())) { Chris@0: return wordwrap($string, $width, $break, $cut); Chris@0: } Chris@0: Chris@0: $stringWidth = $this->strlen($string); Chris@0: $breakWidth = $this->strlen($break); Chris@0: Chris@0: $result = ''; Chris@0: $lastStart = $lastSpace = 0; Chris@0: Chris@0: for ($current = 0; $current < $stringWidth; $current++) { Chris@0: $char = $this->substr($string, $current, 1); Chris@0: Chris@0: $possibleBreak = $char; Chris@0: if ($breakWidth !== 1) { Chris@0: $possibleBreak = $this->substr($string, $current, $breakWidth); Chris@0: } Chris@0: Chris@0: if ($possibleBreak === $break) { Chris@0: $result .= $this->substr($string, $lastStart, $current - $lastStart + $breakWidth); Chris@0: $current += $breakWidth - 1; Chris@0: $lastStart = $lastSpace = $current + 1; Chris@0: continue; Chris@0: } Chris@0: Chris@0: if ($char === ' ') { Chris@0: if ($current - $lastStart >= $width) { Chris@0: $result .= $this->substr($string, $lastStart, $current - $lastStart) . $break; Chris@0: $lastStart = $current + 1; Chris@0: } Chris@0: Chris@0: $lastSpace = $current; Chris@0: continue; Chris@0: } Chris@0: Chris@0: if ($current - $lastStart >= $width && $cut && $lastStart >= $lastSpace) { Chris@0: $result .= $this->substr($string, $lastStart, $current - $lastStart) . $break; Chris@0: $lastStart = $lastSpace = $current; Chris@0: continue; Chris@0: } Chris@0: Chris@0: if ($current - $lastStart >= $width && $lastStart < $lastSpace) { Chris@0: $result .= $this->substr($string, $lastStart, $lastSpace - $lastStart) . $break; Chris@0: $lastStart = $lastSpace = $lastSpace + 1; Chris@0: continue; Chris@0: } Chris@0: } Chris@0: Chris@0: if ($lastStart !== $current) { Chris@0: $result .= $this->substr($string, $lastStart, $current - $lastStart); Chris@0: } Chris@0: Chris@0: return $result; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Pad a string to a certain length with another string Chris@0: * Chris@0: * @param string $input Chris@0: * @param int $padLength Chris@0: * @param string $padString Chris@0: * @param int $padType Chris@0: * @return string Chris@0: */ Chris@0: public function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT) Chris@0: { Chris@0: if (StringUtils::isSingleByteEncoding($this->getEncoding())) { Chris@0: return str_pad($input, $padLength, $padString, $padType); Chris@0: } Chris@0: Chris@0: $lengthOfPadding = $padLength - $this->strlen($input); Chris@0: if ($lengthOfPadding <= 0) { Chris@0: return $input; Chris@0: } Chris@0: Chris@0: $padStringLength = $this->strlen($padString); Chris@0: if ($padStringLength === 0) { Chris@0: return $input; Chris@0: } Chris@0: Chris@0: $repeatCount = floor($lengthOfPadding / $padStringLength); Chris@0: Chris@0: if ($padType === STR_PAD_BOTH) { Chris@0: $repeatCountLeft = $repeatCountRight = ($repeatCount - $repeatCount % 2) / 2; Chris@0: Chris@0: $lastStringLength = $lengthOfPadding - 2 * $repeatCountLeft * $padStringLength; Chris@0: $lastStringLeftLength = $lastStringRightLength = floor($lastStringLength / 2); Chris@0: $lastStringRightLength += $lastStringLength % 2; Chris@0: Chris@0: $lastStringLeft = $this->substr($padString, 0, $lastStringLeftLength); Chris@0: $lastStringRight = $this->substr($padString, 0, $lastStringRightLength); Chris@0: Chris@0: return str_repeat($padString, $repeatCountLeft) . $lastStringLeft Chris@0: . $input Chris@0: . str_repeat($padString, $repeatCountRight) . $lastStringRight; Chris@0: } Chris@0: Chris@0: $lastString = $this->substr($padString, 0, $lengthOfPadding % $padStringLength); Chris@0: Chris@0: if ($padType === STR_PAD_LEFT) { Chris@0: return str_repeat($padString, $repeatCount) . $lastString . $input; Chris@0: } Chris@0: Chris@0: return $input . str_repeat($padString, $repeatCount) . $lastString; Chris@0: } Chris@0: }