Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
AbstractStringWrapper.php
001 <?php
002 /**
003 * Zend Framework (http://framework.zend.com/)
004 *
005 * @link http://github.com/zendframework/zf2 for the canonical source repository
006 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
007 * @license http://framework.zend.com/license/new-bsd New BSD License
008 */
009
010 namespace Zend\Stdlib\StringWrapper;
011
012 use Zend\Stdlib\Exception;
013 use Zend\Stdlib\StringUtils;
014
015 abstract class AbstractStringWrapper implements StringWrapperInterface
016 {
017 /**
018 * The character encoding working on
019 * @var string|null
020 */
021 protected $encoding = 'UTF-8';
022
023 /**
024 * An optionally character encoding to convert to
025 * @var string|null
026 */
027 protected $convertEncoding;
028
029 /**
030 * Check if the given character encoding is supported by this wrapper
031 * and the character encoding to convert to is also supported.
032 *
033 * @param string $encoding
034 * @param string|null $convertEncoding
035 * @return bool
036 */
037 public static function isSupported($encoding, $convertEncoding = null)
038 {
039 $supportedEncodings = static::getSupportedEncodings();
040
041 if (!in_array(strtoupper($encoding), $supportedEncodings)) {
042 return false;
043 }
044
045 if ($convertEncoding !== null && !in_array(strtoupper($convertEncoding), $supportedEncodings)) {
046 return false;
047 }
048
049 return true;
050 }
051
052 /**
053 * Set character encoding working with and convert to
054 *
055 * @param string $encoding The character encoding to work with
056 * @param string|null $convertEncoding The character encoding to convert to
057 * @return StringWrapperInterface
058 */
059 public function setEncoding($encoding, $convertEncoding = null)
060 {
061 $supportedEncodings = static::getSupportedEncodings();
062
063 $encodingUpper = strtoupper($encoding);
064 if (!in_array($encodingUpper, $supportedEncodings)) {
065 throw new Exception\InvalidArgumentException(
066 'Wrapper doesn\'t support character encoding "' . $encoding . '"'
067 );
068 }
069
070 if ($convertEncoding !== null) {
071 $convertEncodingUpper = strtoupper($convertEncoding);
072 if (!in_array($convertEncodingUpper, $supportedEncodings)) {
073 throw new Exception\InvalidArgumentException(
074 'Wrapper doesn\'t support character encoding "' . $convertEncoding . '"'
075 );
076 }
077
078 $this->convertEncoding = $convertEncodingUpper;
079 } else {
080 $this->convertEncoding = null;
081 }
082 $this->encoding = $encodingUpper;
083
084 return $this;
085 }
086
087 /**
088 * Get the defined character encoding to work with
089 *
090 * @return string
091 * @throws Exception\LogicException If no encoding was defined
092 */
093 public function getEncoding()
094 {
095 return $this->encoding;
096 }
097
098 /**
099 * Get the defined character encoding to convert to
100 *
101 * @return string|null
102 */
103 public function getConvertEncoding()
104 {
105 return $this->convertEncoding;
106 }
107
108 /**
109 * Convert a string from defined character encoding to the defined convert encoding
110 *
111 * @param string $str
112 * @param bool $reverse
113 * @return string|false
114 */
115 public function convert($str, $reverse = false)
116 {
117 $encoding = $this->getEncoding();
118 $convertEncoding = $this->getConvertEncoding();
119 if ($convertEncoding === null) {
120 throw new Exception\LogicException(
121 'No convert encoding defined'
122 );
123 }
124
125 if ($encoding === $convertEncoding) {
126 return $str;
127 }
128
129 $from = $reverse ? $convertEncoding : $encoding;
130 $to = $reverse ? $encoding : $convertEncoding;
131 throw new Exception\RuntimeException(sprintf(
132 'Converting from "%s" to "%s" isn\'t supported by this string wrapper',
133 $from,
134 $to
135 ));
136 }
137
138 /**
139 * Wraps a string to a given number of characters
140 *
141 * @param string $string
142 * @param int $width
143 * @param string $break
144 * @param bool $cut
145 * @return string|false
146 */
147 public function wordWrap($string, $width = 75, $break = "\n", $cut = false)
148 {
149 $string = (string) $string;
150 if ($string === '') {
151 return '';
152 }
153
154 $break = (string) $break;
155 if ($break === '') {
156 throw new Exception\InvalidArgumentException('Break string cannot be empty');
157 }
158
159 $width = (int) $width;
160 if ($width === 0 && $cut) {
161 throw new Exception\InvalidArgumentException('Cannot force cut when width is zero');
162 }
163
164 if (StringUtils::isSingleByteEncoding($this->getEncoding())) {
165 return wordwrap($string, $width, $break, $cut);
166 }
167
168 $stringWidth = $this->strlen($string);
169 $breakWidth = $this->strlen($break);
170
171 $result = '';
172 $lastStart = $lastSpace = 0;
173
174 for ($current = 0; $current < $stringWidth; $current++) {
175 $char = $this->substr($string, $current, 1);
176
177 $possibleBreak = $char;
178 if ($breakWidth !== 1) {
179 $possibleBreak = $this->substr($string, $current, $breakWidth);
180 }
181
182 if ($possibleBreak === $break) {
183 $result .= $this->substr($string, $lastStart, $current - $lastStart + $breakWidth);
184 $current += $breakWidth - 1;
185 $lastStart = $lastSpace = $current + 1;
186 continue;
187 }
188
189 if ($char === ' ') {
190 if ($current - $lastStart >= $width) {
191 $result .= $this->substr($string, $lastStart, $current - $lastStart) . $break;
192 $lastStart = $current + 1;
193 }
194
195 $lastSpace = $current;
196 continue;
197 }
198
199 if ($current - $lastStart >= $width && $cut && $lastStart >= $lastSpace) {
200 $result .= $this->substr($string, $lastStart, $current - $lastStart) . $break;
201 $lastStart = $lastSpace = $current;
202 continue;
203 }
204
205 if ($current - $lastStart >= $width && $lastStart < $lastSpace) {
206 $result .= $this->substr($string, $lastStart, $lastSpace - $lastStart) . $break;
207 $lastStart = $lastSpace = $lastSpace + 1;
208 continue;
209 }
210 }
211
212 if ($lastStart !== $current) {
213 $result .= $this->substr($string, $lastStart, $current - $lastStart);
214 }
215
216 return $result;
217 }
218
219 /**
220 * Pad a string to a certain length with another string
221 *
222 * @param string $input
223 * @param int $padLength
224 * @param string $padString
225 * @param int $padType
226 * @return string
227 */
228 public function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT)
229 {
230 if (StringUtils::isSingleByteEncoding($this->getEncoding())) {
231 return str_pad($input, $padLength, $padString, $padType);
232 }
233
234 $lengthOfPadding = $padLength - $this->strlen($input);
235 if ($lengthOfPadding <= 0) {
236 return $input;
237 }
238
239 $padStringLength = $this->strlen($padString);
240 if ($padStringLength === 0) {
241 return $input;
242 }
243
244 $repeatCount = floor($lengthOfPadding / $padStringLength);
245
246 if ($padType === STR_PAD_BOTH) {
247 $repeatCountLeft = $repeatCountRight = ($repeatCount - $repeatCount % 2) / 2;
248
249 $lastStringLength = $lengthOfPadding - 2 * $repeatCountLeft * $padStringLength;
250 $lastStringLeftLength = $lastStringRightLength = floor($lastStringLength / 2);
251 $lastStringRightLength += $lastStringLength % 2;
252
253 $lastStringLeft = $this->substr($padString, 0, $lastStringLeftLength);
254 $lastStringRight = $this->substr($padString, 0, $lastStringRightLength);
255
256 return str_repeat($padString, $repeatCountLeft) . $lastStringLeft
257 . $input
258 . str_repeat($padString, $repeatCountRight) . $lastStringRight;
259 }
260
261 $lastString = $this->substr($padString, 0, $lengthOfPadding % $padStringLength);
262
263 if ($padType === STR_PAD_LEFT) {
264 return str_repeat($padString, $repeatCount) . $lastString . $input;
265 }
266
267 return $input . str_repeat($padString, $repeatCount) . $lastString;
268 }
269 }
270