123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Polyfill\Intl\Icu\DateFormat;
- /**
- * Parser and formatter for month format.
- *
- * @author Igor Wiedler <igor@wiedler.ch>
- *
- * @internal
- */
- class MonthTransformer extends Transformer
- {
- protected static $months = [
- 'January',
- 'February',
- 'March',
- 'April',
- 'May',
- 'June',
- 'July',
- 'August',
- 'September',
- 'October',
- 'November',
- 'December',
- ];
- /**
- * Short months names (first 3 letters).
- */
- protected static $shortMonths = [];
- /**
- * Flipped $months array, $name => $index.
- */
- protected static $flippedMonths = [];
- /**
- * Flipped $shortMonths array, $name => $index.
- */
- protected static $flippedShortMonths = [];
- public function __construct()
- {
- if (0 === \count(self::$shortMonths)) {
- self::$shortMonths = array_map(function ($month) {
- return substr($month, 0, 3);
- }, self::$months);
- self::$flippedMonths = array_flip(self::$months);
- self::$flippedShortMonths = array_flip(self::$shortMonths);
- }
- }
- /**
- * {@inheritdoc}
- */
- public function format(\DateTime $dateTime, int $length): string
- {
- $matchLengthMap = [
- 1 => 'n',
- 2 => 'm',
- 3 => 'M',
- 4 => 'F',
- ];
- if (isset($matchLengthMap[$length])) {
- return $dateTime->format($matchLengthMap[$length]);
- }
- if (5 === $length) {
- return substr($dateTime->format('M'), 0, 1);
- }
- return $this->padLeft($dateTime->format('m'), $length);
- }
- /**
- * {@inheritdoc}
- */
- public function getReverseMatchingRegExp(int $length): string
- {
- switch ($length) {
- case 1:
- $regExp = '\d{1,2}';
- break;
- case 3:
- $regExp = implode('|', self::$shortMonths);
- break;
- case 4:
- $regExp = implode('|', self::$months);
- break;
- case 5:
- $regExp = '[JFMASOND]';
- break;
- default:
- $regExp = '\d{1,'.$length.'}';
- break;
- }
- return $regExp;
- }
- /**
- * {@inheritdoc}
- */
- public function extractDateOptions(string $matched, int $length): array
- {
- if (!is_numeric($matched)) {
- if (3 === $length) {
- $matched = self::$flippedShortMonths[$matched] + 1;
- } elseif (4 === $length) {
- $matched = self::$flippedMonths[$matched] + 1;
- } elseif (5 === $length) {
- // IntlDateFormatter::parse() always returns false for MMMMM or LLLLL
- $matched = false;
- }
- } else {
- $matched = (int) $matched;
- }
- return [
- 'month' => $matched,
- ];
- }
- }
|