summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/DataValues/ValueFormatters/DispatchingDataValueFormatter.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/DataValues/ValueFormatters/DispatchingDataValueFormatter.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/DataValues/ValueFormatters/DispatchingDataValueFormatter.php78
1 files changed, 78 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/DataValues/ValueFormatters/DispatchingDataValueFormatter.php b/www/wiki/extensions/SemanticMediaWiki/src/DataValues/ValueFormatters/DispatchingDataValueFormatter.php
new file mode 100644
index 00000000..c8056a98
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/DataValues/ValueFormatters/DispatchingDataValueFormatter.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace SMW\DataValues\ValueFormatters;
+
+use RuntimeException;
+use SMWDataValue as DataValue;
+
+/**
+ * @private
+ *
+ * @license GNU GPL v2+
+ * @since 2.4
+ *
+ * @author mwjames
+ */
+class DispatchingDataValueFormatter {
+
+ /**
+ * @var DataValueFormatter[]
+ */
+ private $dataValueFormatters = [];
+
+ /**
+ * @var DataValueFormatter[]
+ */
+ private $defaultDataValueFormatters = [];
+
+ /**
+ * @since 2.4
+ *
+ * @param DataValueFormatter $dataValueFormatter
+ */
+ public function addDataValueFormatter( DataValueFormatter $dataValueFormatter ) {
+ $this->dataValueFormatters[] = $dataValueFormatter;
+ }
+
+ /**
+ * DataValueFormatters registered with this method are validated after
+ * DispatchingDataValueFormatter::getDataValueFormatterFor was not able to
+ * match any Formatter. This to ensure that a distinct FooStringValueFormatter
+ * is tried before the default StringValueFormatter.
+ *
+ * @since 2.4
+ *
+ * @param DataValueFormatter $dataValueFormatter
+ */
+ public function addDefaultDataValueFormatter( DataValueFormatter $dataValueFormatter ) {
+ $this->defaultDataValueFormatters[] = $dataValueFormatter;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @param DataValue $dataValue
+ *
+ * @return DataValueFormatter
+ * @throws RuntimeException
+ */
+ public function getDataValueFormatterFor( DataValue $dataValue ) {
+
+ foreach ( $this->dataValueFormatters as $dataValueFormatter ) {
+ if ( $dataValueFormatter->isFormatterFor( $dataValue ) ) {
+ $dataValueFormatter->setDataValue( $dataValue );
+ return $dataValueFormatter;
+ }
+ }
+
+ foreach ( $this->defaultDataValueFormatters as $dataValueFormatter ) {
+ if ( $dataValueFormatter->isFormatterFor( $dataValue ) ) {
+ $dataValueFormatter->setDataValue( $dataValue );
+ return $dataValueFormatter;
+ }
+ }
+
+ throw new RuntimeException( "The dispatcher could not match a DataValueFormatter for " . get_class( $dataValue ) );
+ }
+
+}