summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Specials/SearchByProperty/PageRequestOptions.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Specials/SearchByProperty/PageRequestOptions.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Specials/SearchByProperty/PageRequestOptions.php172
1 files changed, 172 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Specials/SearchByProperty/PageRequestOptions.php b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Specials/SearchByProperty/PageRequestOptions.php
new file mode 100644
index 00000000..0d16bf25
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Specials/SearchByProperty/PageRequestOptions.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace SMW\MediaWiki\Specials\SearchByProperty;
+
+use SMW\DataValueFactory;
+use SMW\DataValues\TelephoneUriValue;
+use SMW\Encoder;
+use SMWNumberValue as NumberValue;
+
+/**
+ * @license GNU GPL v2+
+ * @since 2.1
+ *
+ * @author mwjames
+ */
+class PageRequestOptions {
+
+ /**
+ * @var string
+ */
+ private $queryString;
+
+ /**
+ * @var array
+ */
+ private $requestOptions;
+
+ /**
+ * @var Encoder
+ */
+ private $urlEncoder;
+
+ /**
+ * @var PropertyValue
+ */
+ public $property;
+
+ /**
+ * @var string
+ */
+ public $propertyString;
+
+ /**
+ * @var string
+ */
+ public $valueString;
+
+ /**
+ * @var DataValue
+ */
+ public $value;
+
+ /**
+ * @var integer
+ */
+ public $limit = 20;
+
+ /**
+ * @var integer
+ */
+ public $offset = 0;
+
+ /**
+ * @var boolean
+ */
+ public $nearbySearch = false;
+
+ /**
+ * @since 2.1
+ *
+ * @param string $queryString
+ * @param array $requestOptions
+ */
+ public function __construct( $queryString, array $requestOptions ) {
+ $this->queryString = $queryString;
+ $this->requestOptions = $requestOptions;
+ $this->urlEncoder = new Encoder();
+ }
+
+ /**
+ * @since 2.1
+ */
+ public function initialize() {
+
+ $params = explode( '/', $this->queryString );
+ reset( $params );
+ $escaped = false;
+
+ // Remove empty elements
+ $params = array_filter( $params, 'strlen' );
+
+ $property = isset( $this->requestOptions['property'] ) ? $this->requestOptions['property'] : current( $params );
+ $value = isset( $this->requestOptions['value'] ) ? $this->requestOptions['value'] : next( $params );
+
+ // Auto-generated link is marked with a leading :
+ if ( $property !== '' && $property{0} === ':' ) {
+ $escaped = true;
+ $property = $this->urlEncoder->unescape( ltrim( $property, ':' ) );
+ }
+
+ $this->property = DataValueFactory::getInstance()->newPropertyValueByLabel(
+ str_replace( [ '_' ], [ ' ' ], $property )
+ );
+
+ if ( !$this->property->isValid() ) {
+ $this->propertyString = $property;
+ $this->value = null;
+ $this->valueString = $value;
+ } else {
+ $this->propertyString = $this->property->getDataItem()->getLabel();
+ $this->valueString = $this->getValue( (string)$value, $escaped );
+ }
+
+ $this->setLimit();
+ $this->setOffset();
+ $this->setNearbySearch();
+ }
+
+ private function getValue( $value, $escaped ) {
+
+ $this->value = DataValueFactory::getInstance()->newDataValueByProperty(
+ $this->property->getDataItem()
+ );
+
+ $value = $this->unescape( $value, $escaped );
+ $this->value->setUserValue( $value );
+
+ return $this->value->isValid() ? $this->value->getWikiValue() : $value;
+ }
+
+ private function unescape( $value, $escaped ) {
+
+ if ( $this->value instanceof NumberValue ) {
+ $value = $escaped ? str_replace( [ '-20', '-2D' ], [ ' ', '-' ], $value ) : $value;
+ // Do not try to decode things like 1.2e-13
+ // Signals that we don't want any precision limitation
+ $this->value->setOption( NumberValue::NO_DISP_PRECISION_LIMIT, true );
+ } elseif ( $this->value instanceof TelephoneUriValue ) {
+ $value = $escaped ? str_replace( [ '-20', '-2D' ], [ ' ', '-' ], $value ) : $value;
+ // No encoding to avoid turning +1-201-555-0123
+ // into +1 1U523 or further obfuscate %2B1-2D201-2D555-2D0123 ...
+ } else {
+ $value = $escaped ? $this->urlEncoder->unescape( $value ) : $value;
+ }
+
+ return $value;
+ }
+
+ private function setLimit() {
+ if ( isset( $this->requestOptions['limit'] ) ) {
+ $this->limit = intval( $this->requestOptions['limit'] );
+ }
+ }
+
+ private function setOffset() {
+ if ( isset( $this->requestOptions['offset'] ) ) {
+ $this->offset = intval( $this->requestOptions['offset'] );
+ }
+ }
+
+ private function setNearbySearch() {
+
+ if ( $this->value === null ) {
+ return null;
+ }
+
+ if ( isset( $this->requestOptions['nearbySearchForType'] ) && is_array( $this->requestOptions['nearbySearchForType'] ) ) {
+ $this->nearbySearch = in_array( $this->value->getTypeID(), $this->requestOptions['nearbySearchForType'] );
+ }
+ }
+
+}