Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/repo/includes/Parsers/TimeParserFactory.php
<?php

namespace Wikibase\Repo\Parsers;

use Language;
use ValueParsers\CalendarModelParser;
use ValueParsers\DispatchingValueParser;
use ValueParsers\EraParser;
use ValueParsers\IsoTimestampParser;
use ValueParsers\MonthNameProvider;
use ValueParsers\MonthNameUnlocalizer;
use ValueParsers\ParserOptions;
use ValueParsers\PhpDateTimeParser;
use ValueParsers\ValueParser;
use ValueParsers\YearMonthDayTimeParser;
use ValueParsers\YearMonthTimeParser;
use ValueParsers\YearTimeParser;

/**
 * @since 0.5
 *
 * @license GPL-2.0+
 * @author Addshore
 * @author Thiemo Mättig
 */
class TimeParserFactory {

	/**
	 * Default, canonical language code. In the MediaWiki world this is always English.
	 */
	const CANONICAL_LANGUAGE_CODE = 'en';

	/**
	 * @var ParserOptions
	 */
	private $options;

	/**
	 * @var MonthNameProvider
	 */
	private $monthNameProvider;

	/**
	 * @param ParserOptions|null $options
	 * @param MonthNameProvider|null $monthNameProvider
	 */
	public function __construct(
		ParserOptions $options = null,
		MonthNameProvider $monthNameProvider = null
	) {
		$this->options = $options ?: new ParserOptions();
		$this->monthNameProvider = $monthNameProvider ?: new MediaWikiMonthNameProvider();

		$this->options->defaultOption( ValueParser::OPT_LANG, self::CANONICAL_LANGUAGE_CODE );
		$this->options->defaultOption(
			YearTimeParser::OPT_DIGIT_GROUP_SEPARATOR,
			$this->getDigitGroupSeparator()
		);
	}

	/**
	 * @return ValueParser
	 */
	public function getTimeParser() {
		return new DispatchingValueParser( $this->getTimeParsers(), 'time' );
	}

	/**
	 * @return ValueParser[]
	 */
	private function getTimeParsers() {
		$eraParser = new EraParser( $this->options );
		$isoTimestampParser = new IsoTimestampParser(
			new CalendarModelParser( $this->options ),
			$this->options
		);

		$parsers = array();

		// Year-month parser must be first, otherwise "May 2014" may be parsed as "2014-05-01".
		$parsers[] = new YearMonthTimeParser( $this->monthNameProvider, $this->options );
		$parsers[] = $isoTimestampParser;
		$parsers[] = new MwTimeIsoParser( $this->options );
		$parsers[] = new YearMonthDayTimeParser( $eraParser, $this->options );
		$parsers[] = new PhpDateTimeParser(
			$this->getMonthNameUnlocalizer(),
			$eraParser,
			$isoTimestampParser
		);
		// Year parser must be last because it accepts some separator characters.
		$parsers[] = new YearTimeParser( $eraParser, $this->options );

		return $parsers;
	}

	/**
	 * @return MonthNameUnlocalizer
	 */
	public function getMonthNameUnlocalizer() {
		$languageCode = $this->options->getOption( ValueParser::OPT_LANG );

		if ( $languageCode === self::CANONICAL_LANGUAGE_CODE ) {
			$replacements = array();
		} else {
			$canonicalMonthNames = $this->monthNameProvider->getLocalizedMonthNames(
				self::CANONICAL_LANGUAGE_CODE
			);
			$replacements = array_map( function( $i ) use ( $canonicalMonthNames ) {
				return $canonicalMonthNames[$i];
			}, $this->monthNameProvider->getMonthNumbers( $languageCode ) );
		}

		return new MonthNameUnlocalizer( $replacements );
	}

	/**
	 * @return string
	 */
	private function getDigitGroupSeparator() {
		$languageCode = $this->options->getOption( ValueParser::OPT_LANG );
		$language = Language::factory( $languageCode );
		$separatorMap = $language->separatorTransformTable();
		$canonical = YearTimeParser::CANONICAL_DIGIT_GROUP_SEPARATOR;

		return isset( $separatorMap[$canonical] ) ? $separatorMap[$canonical] : $canonical;
	}

}