Current File : /home/jvzmxxx/wiki/extensions/Wikibase/lib/includes/Formatters/WikibaseSnakFormatterBuilders.php
<?php

namespace Wikibase\Lib;

use DataTypes\DataTypeFactory;
use InvalidArgumentException;
use ValueFormatters\FormatterOptions;
use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup;
use Wikibase\Lib\Formatters\HtmlExternalIdentifierFormatter;
use Wikibase\Lib\Formatters\WikitextExternalIdentifierFormatter;
use Wikibase\PropertyInfoStore;

/**
 * Low level factory for SnakFormatters for well known data types.
 *
 * @warning: This is a low level factory for use by boostrap code only!
 * Program logic should use an instance of OutputFormatValueFormatterFactory
 * resp. OutputFormatSnakFormatterFactory.
 *
 * @since 0.5
 *
 * @license GPL-2.0+
 * @author Daniel Kinzler
 */
class WikibaseSnakFormatterBuilders {

	/**
	 * @var WikibaseValueFormatterBuilders
	 */
	private $valueFormatterBuilders;

	/**
	 * @var PropertyInfoStore
	 */
	private $propertyInfoStore;

	/**
	 * @var PropertyDataTypeLookup
	 */
	private $dataTypeLookup;

	/**
	 * @var DataTypeFactory
	 */
	private $dataTypeFactory;

	/**
	 * @param WikibaseValueFormatterBuilders $valueFormatterBuilders
	 * @param PropertyInfoStore $propertyInfoStore
	 * @param PropertyDataTypeLookup $dataTypeLookup
	 * @param DataTypeFactory $dataTypeFactory
	 */
	public function __construct(
		WikibaseValueFormatterBuilders $valueFormatterBuilders,
		PropertyInfoStore $propertyInfoStore,
		PropertyDataTypeLookup $dataTypeLookup,
		DataTypeFactory $dataTypeFactory
	) {
		$this->valueFormatterBuilders = $valueFormatterBuilders;
		$this->propertyInfoStore = $propertyInfoStore;
		$this->dataTypeLookup = $dataTypeLookup;
		$this->dataTypeFactory = $dataTypeFactory;
	}

	/**
	 * @param string $format One of the SnakFormatter::FORMAT_... constants.
	 *
	 * @throws InvalidArgumentException
	 * @return string Either SnakFormatter::FORMAT_HTML, ...WIKI or ...PLAIN.
	 */
	private function getBaseFormat( $format ) {
		switch ( $format ) {
			case SnakFormatter::FORMAT_HTML:
			case SnakFormatter::FORMAT_HTML_DIFF:
			case SnakFormatter::FORMAT_HTML_WIDGET:
				return SnakFormatter::FORMAT_HTML;
			case SnakFormatter::FORMAT_WIKI:
			case SnakFormatter::FORMAT_PLAIN:
				return $format;
		}

		throw new InvalidArgumentException( 'Unsupported output format: ' . $format );
	}

	/**
	 * @param string $format The desired target format, see SnakFormatter::FORMAT_XXX
	 *
	 * @throws InvalidArgumentException
	 * @return bool True if $format is one of the SnakFormatter::FORMAT_HTML_XXX formats.
	 */
	private function isHtmlFormat( $format ) {
		return $this->getBaseFormat( $format ) === SnakFormatter::FORMAT_HTML;
	}

	/**
	 * Wraps the given formatter in an EscapingSnakFormatter if necessary.
	 *
	 * @param string $format The desired target format, see SnakFormatter::FORMAT_XXX
	 * @param SnakFormatter $formatter The plain text formatter to wrap.
	 *
	 * @throws InvalidArgumentException
	 * @return SnakFormatter
	 */
	private function escapeSnakFormatter( $format, SnakFormatter $formatter ) {
		switch ( $this->getBaseFormat( $format ) ) {
			case SnakFormatter::FORMAT_HTML:
				return new EscapingSnakFormatter( $format, $formatter, 'htmlspecialchars' );
			case SnakFormatter::FORMAT_WIKI:
				return new EscapingSnakFormatter( $format, $formatter, 'wfEscapeWikiText' );
			case SnakFormatter::FORMAT_PLAIN:
				return $formatter;
		}

		throw new InvalidArgumentException( 'Unsupported output format: ' . $format );
	}

	/**
	 * @param string $format The desired target format, see SnakFormatter::FORMAT_XXX
	 * @param FormatterOptions $options
	 *
	 * @throws InvalidArgumentException
	 * @return SnakFormatter
	 */
	public function newExternalIdentifierFormatter( $format, FormatterOptions $options ) {
		if ( $format === SnakFormatter::FORMAT_PLAIN ) {
			return new PropertyValueSnakFormatter(
				$format,
				$options,
				$this->valueFormatterBuilders->newStringFormatter( $format, $options ),
				$this->dataTypeLookup,
				$this->dataTypeFactory
			);
		}

		$urlProvider = new FieldPropertyInfoProvider(
			$this->propertyInfoStore,
			PropertyInfoStore::KEY_FORMATTER_URL
		);

		$urlExpander = new PropertyInfoSnakUrlExpander( $urlProvider );

		if ( $format === SnakFormatter::FORMAT_WIKI ) {
			return new WikitextExternalIdentifierFormatter( $urlExpander );
		} elseif ( $this->isHtmlFormat( $format ) ) {
			return new HtmlExternalIdentifierFormatter( $urlExpander );
		}

		throw new InvalidArgumentException( 'Unsupported output format: ' . $format );
	}

}