Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/client/includes/Usage/UsageTrackingSnakFormatter.php
<?php

namespace Wikibase\Client\Usage;

use Wikibase\DataModel\Entity\EntityId;
use Wikibase\DataModel\Entity\EntityIdValue;
use Wikibase\DataModel\Snak\PropertyValueSnak;
use Wikibase\DataModel\Snak\Snak;
use Wikibase\Lib\SnakFormatter;

/**
 * SnakFormatter decorator that records entity usage.
 *
 * @see UsageAccumulator
 *
 * @since 0.5
 *
 * @license GPL-2.0+
 * @author Daniel Kinzler
 */
class UsageTrackingSnakFormatter implements SnakFormatter {

	/**
	 * @var SnakFormatter
	 */
	private $snakFormatter;

	/**
	 * @var UsageAccumulator
	 */
	private $usageAccumulator;

	/**
	 * @var string[]
	 */
	private $languages;

	/**
	 * @param SnakFormatter $snakFormatter
	 * @param UsageAccumulator $usageAccumulator
	 * @param string[] $languages language codes to consider used for formatting
	 */
	public function __construct( SnakFormatter $snakFormatter, UsageAccumulator $usageAccumulator, array $languages ) {
		$this->snakFormatter = $snakFormatter;
		$this->usageAccumulator = $usageAccumulator;
		$this->languages = $languages;
	}

	/**
	 * @see SnakFormatter::formatSnak
	 *
	 * @param Snak $snak
	 *
	 * @return string Either plain text, wikitext or HTML, depending on the SnakFormatter provided.
	 */
	public function formatSnak( Snak $snak ) {
		if ( $snak instanceof PropertyValueSnak ) {
			$value = $snak->getDataValue();

			if ( $value instanceof EntityIdValue ) {
				$entityId = $value->getEntityId();
				$this->addLabelUsage( $value->getEntityId() );
				$this->usageAccumulator->addTitleUsage( $entityId );
			}
		}

		return $this->snakFormatter->formatSnak( $snak );
	}

	/**
	 * @param EntityId $id
	 */
	private function addLabelUsage( EntityId $id ) {
		foreach ( $this->languages as $lang ) {
			$this->usageAccumulator->addLabelUsage( $id, $lang );
		}
	}

	/**
	 * Returns the format ID of the format this formatter generates.
	 * This uses the FORMAT_XXX constants defined in OutputFormatSnakFormatterFactory.
	 *
	 * @return string One of the SnakFormatter::FORMAT_... constants.
	 */
	public function getFormat() {
		return $this->snakFormatter->getFormat();
	}

}