/** * Returns an SnakFormatter for rendering snaks in the desired format * using the given options. * * @param string $format Use the SnakFormatter::FORMAT_XXX constants. * @param FormatterOptions $options * * @throws RuntimeException * @throws InvalidArgumentException * @return SnakFormatter */ public function getSnakFormatter($format, FormatterOptions $options) { $options->defaultOption(SnakFormatter::OPT_ON_ERROR, SnakFormatter::ON_ERROR_WARN); $this->valueFormatterFactory->applyLanguageDefaults($options); $lang = $options->getOption(ValueFormatter::OPT_LANG); $noValueSnakFormatter = new MessageSnakFormatter('novalue', $this->getMessage('wikibase-snakview-snaktypeselector-novalue', $lang), $format); $someValueSnakFormatter = new MessageSnakFormatter('somevalue', $this->getMessage('wikibase-snakview-snaktypeselector-somevalue', $lang), $format); $valueFormatter = $this->valueFormatterFactory->getValueFormatter($format, $options); $valueSnakFormatter = new PropertyValueSnakFormatter($format, $options, $valueFormatter, $this->propertyDataTypeLookup, $this->dataTypeFactory); $formattersBySnakType = array('novalue' => $noValueSnakFormatter, 'somevalue' => $someValueSnakFormatter); $formattersByDataType = $this->createSnakFormatters($format, $options); // Register default formatter for the special '*' key. $formattersByDataType['*'] = $valueSnakFormatter; $snakFormatter = new DispatchingSnakFormatter($format, $this->propertyDataTypeLookup, $formattersBySnakType, $formattersByDataType); if ($options->getOption(SnakFormatter::OPT_ON_ERROR) === SnakFormatter::ON_ERROR_WARN) { $snakFormatter = new ErrorHandlingSnakFormatter($snakFormatter, $valueFormatter, $lang); } return $snakFormatter; }
public function testDefaultOption() { $options = array('foo' => 42, 'bar' => 4.2, 'baz' => array('o_O', false, null, '42' => 42, array())); $formatterOptions = new FormatterOptions($options); foreach ($options as $option => $value) { $formatterOptions->defaultOption($option, 9001); $this->assertEquals(serialize($value), serialize($formatterOptions->getOption($option)), 'Defaulting a set option should not affect its value'); } $defaults = array('N' => 42, 'y' => 4.2, 'a' => false, 'n' => array('42' => 42, array(''))); foreach ($defaults as $option => $value) { $formatterOptions->defaultOption($option, $value); $this->assertEquals(serialize($value), serialize($formatterOptions->getOption($option)), 'Defaulting a not set option should affect its value'); } }
/** * Initializes the options keys ValueFormatter::OPT_LANG and * FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN if they are not yet set. * * @param FormatterOptions $options The options to modify. * * @throws InvalidArgumentException * @todo : Sort out how the desired language is specified. We have two language options, * each accepting different ways of specifying the language. That's not good. * @todo: this shouldn't be public at all. Perhaps factor it out into a helper class. */ public function applyLanguageDefaults(FormatterOptions $options) { $options->defaultOption(ValueFormatter::OPT_LANG, $this->defaultLanguage->getCode()); $lang = $options->getOption(ValueFormatter::OPT_LANG); if (!is_string($lang)) { throw new InvalidArgumentException('The value of OPT_LANG must be a language code. For a fallback chain, use OPT_LANGUAGE_FALLBACK_CHAIN.'); } $fallbackOption = FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN; if (!$options->hasOption($fallbackOption)) { $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL; $options->setOption($fallbackOption, $this->languageFallbackChainFactory->newFromLanguageCode($lang, $fallbackMode)); } if (!$options->getOption($fallbackOption) instanceof LanguageFallbackChain) { throw new InvalidArgumentException('The value of OPT_LANGUAGE_FALLBACK_CHAIN must be ' . 'an instance of LanguageFallbackChain.'); } }