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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Intl.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 8.19 KiB


001  <?php
002   
003  /*
004   * Copyright (C) 2016 Nicolas Grekas - p@tchwork.com
005   *
006   * This library is free software; you can redistribute it and/or modify it
007   * under the terms of the (at your option):
008   * Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
009   * GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
010   */
011   
012  namespace Patchwork\PHP\Shim;
013   
014  /**
015   * Partial intl implementation in pure PHP.
016   *
017   * Implemented:
018   * - grapheme_extract  - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8
019   * - grapheme_stripos  - Find position (in grapheme units) of first occurrence of a case-insensitive string
020   * - grapheme_stristr  - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack
021   * - grapheme_strlen   - Get string length in grapheme units
022   * - grapheme_strpos   - Find position (in grapheme units) of first occurrence of a string
023   * - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string
024   * - grapheme_strrpos  - Find position (in grapheme units) of last occurrence of a string
025   * - grapheme_strstr   - Returns part of haystack string from the first occurrence of needle to the end of haystack
026   * - grapheme_substr   - Return part of a string
027   *
028   * @internal
029   */
030  class Intl
031  {
032      // (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control])
033      // This regular expression is a work around for http://bugs.exim.org/1279
034      const GRAPHEME_CLUSTER_RX = '(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])';
035   
036      public static function grapheme_extract($s, $size, $type = GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0)
037      {
038          if (!is_scalar($s)) {
039              $hasError = false;
040              set_error_handler(function () use (&$hasError) {$hasError = true;});
041              $next = substr($s, $start);
042              restore_error_handler();
043              if ($hasError) {
044                  substr($s, $start);
045                  $s = '';
046              } else {
047                  $s = $next;
048              }
049          } else {
050              $s = substr($s, $start);
051          }
052          $size = (int) $size;
053          $type = (int) $type;
054          $start = (int) $start;
055   
056          if (!isset($s[0]) || 0 > $size || 0 > $start || 0 > $type || 2 < $type) {
057              return false;
058          }
059          if (0 === $size) {
060              return '';
061          }
062   
063          $next = $start;
064   
065          $s = preg_split('/('.GRAPHEME_CLUSTER_RX.')/u', "\r\n".$s, $size + 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
066   
067          if (!isset($s[1])) {
068              return false;
069          }
070   
071          $i = 1;
072          $ret = '';
073   
074          do {
075              if (GRAPHEME_EXTR_COUNT === $type) {
076                  --$size;
077              } elseif (GRAPHEME_EXTR_MAXBYTES === $type) {
078                  $size -= strlen($s[$i]);
079              } else {
080                  $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE');
081              }
082   
083              if ($size >= 0) {
084                  $ret .= $s[$i];
085              }
086          } while (isset($s[++$i]) && $size > 0);
087   
088          $next += strlen($ret);
089   
090          return $ret;
091      }
092   
093      public static function grapheme_strlen($s)
094      {
095          preg_replace('/'.GRAPHEME_CLUSTER_RX.'/u', '', $s, -1, $len);
096   
097          return 0 === $len && '' !== $s ? null : $len;
098      }
099   
100      public static function grapheme_substr($s, $start, $len = 2147483647)
101      {
102          preg_match_all('/'.GRAPHEME_CLUSTER_RX.'/u', $s, $s);
103   
104          $slen = count($s[0]);
105          $start = (int) $start;
106   
107          if (0 > $start) {
108              $start += $slen;
109          }
110          if (0 > $start) {
111              return false;
112          }
113          if ($start >= $slen) {
114              return false;
115          }
116   
117          $rem = $slen - $start;
118   
119          if (0 > $len) {
120              $len += $rem;
121          }
122          if (0 === $len) {
123              return '';
124          }
125          if (0 > $len) {
126              return false;
127          }
128          if ($len > $rem) {
129              $len = $rem;
130          }
131   
132          return implode('', array_slice($s[0], $start, $len));
133      }
134   
135      public static function grapheme_substr_workaround62759($s, $start, $len)
136      {
137          // Intl based http://bugs.php.net/62759 and 55562 workaround
138   
139          if (2147483647 == $len) {
140              return grapheme_substr($s, $start);
141          }
142   
143          $s .= '';
144          $slen = grapheme_strlen($s);
145          $start = (int) $start;
146   
147          if (0 > $start) {
148              $start += $slen;
149          }
150          if (0 > $start) {
151              return false;
152          }
153          if ($start >= $slen) {
154              return false;
155          }
156   
157          $rem = $slen - $start;
158   
159          if (0 > $len) {
160              $len += $rem;
161          }
162          if (0 === $len) {
163              return '';
164          }
165          if (0 > $len) {
166              return false;
167          }
168          if ($len > $rem) {
169              $len = $rem;
170          }
171   
172          return grapheme_substr($s, $start, $len);
173      }
174   
175      public static function grapheme_strpos($s, $needle, $offset = 0)
176      {
177          return self::grapheme_position($s, $needle, $offset, 0);
178      }
179   
180      public static function grapheme_stripos($s, $needle, $offset = 0)
181      {
182          return self::grapheme_position($s, $needle, $offset, 1);
183      }
184   
185      public static function grapheme_strrpos($s, $needle, $offset = 0)
186      {
187          return self::grapheme_position($s, $needle, $offset, 2);
188      }
189   
190      public static function grapheme_strripos($s, $needle, $offset = 0)
191      {
192          return self::grapheme_position($s, $needle, $offset, 3);
193      }
194   
195      public static function grapheme_stristr($s, $needle, $beforeNeedle = false)
196      {
197          return mb_stristr($s, $needle, $beforeNeedle, 'UTF-8');
198      }
199   
200      public static function grapheme_strstr($s, $needle, $beforeNeedle = false)
201      {
202          return mb_strstr($s, $needle, $beforeNeedle, 'UTF-8');
203      }
204   
205      private static function grapheme_position($s, $needle, $offset, $mode)
206      {
207          if (!preg_match('/./us', $needle .= '')) {
208              return false;
209          }
210          if (!preg_match('/./us', $s .= '')) {
211              return false;
212          }
213          if ($offset > 0) {
214              $s = self::grapheme_substr($s, $offset);
215          } elseif ($offset < 0) {
216              if (defined('HHVM_VERSION_ID') || PHP_VERSION_ID < 50535 || (50600 <= PHP_VERSION_ID && PHP_VERSION_ID < 50621) || (70000 <= PHP_VERSION_ID && PHP_VERSION_ID < 70006)) {
217                  $offset = 0;
218              } else {
219                  return false;
220              }
221          }
222   
223          switch ($mode) {
224              case 0: $needle = iconv_strpos($s, $needle, 0, 'UTF-8'); break;
225              case 1: $needle = mb_stripos($s, $needle, 0, 'UTF-8'); break;
226              case 2: $needle = iconv_strrpos($s, $needle, 'UTF-8'); break;
227              default: $needle = mb_strripos($s, $needle, 0, 'UTF-8'); break;
228          }
229   
230          return $needle ? self::grapheme_strlen(iconv_substr($s, 0, $needle, 'UTF-8')) + $offset : $needle;
231      }
232  }
233