diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/includes/dataitems/SMW_DI_URI.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/includes/dataitems/SMW_DI_URI.php | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/includes/dataitems/SMW_DI_URI.php b/www/wiki/extensions/SemanticMediaWiki/includes/dataitems/SMW_DI_URI.php new file mode 100644 index 00000000..d1aaa67d --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/includes/dataitems/SMW_DI_URI.php @@ -0,0 +1,165 @@ +<?php + +use SMW\Exception\DataItemException; + +/** + * This class implements URI data items. + * + * @since 1.6 + * + * @author Markus Krötzsch + * @ingroup SMWDataItems + */ +class SMWDIUri extends SMWDataItem { + + /** + * URI scheme such as "html" or "mailto". + * @var string + */ + protected $m_scheme; + /** + * "Hierpart" of the URI (usually some authority and path). + * @var string + */ + protected $m_hierpart; + /** + * Query part of the URI. + * @var string + */ + protected $m_query; + /** + * Fragment part of the URI. + * @var string + */ + protected $m_fragment; + + /** + * Initialise a URI by providing its scheme (e.g. "html"), 'hierpart' + * following "scheme:" (e.g. "//username@example.org/path), query (e.g. + * "q=Search+term", and fragment (e.g. "section-one"). The complete URI + * with these examples would be + * http://username@example.org/path?q=Search+term#section-one + * @param $scheme string for the scheme + * @param $hierpart string for the "hierpart" + * @param $query string for the query + * @param $fragment string for the fragment + * + * @todo Implement more validation here. + */ + public function __construct( $scheme, $hierpart, $query, $fragment, $strict = true ) { + if ( $strict && ( ( $scheme === '' ) || ( preg_match( '/[^a-zA-Z]/u', $scheme ) ) ) ) { + throw new DataItemException( "Illegal URI scheme \"$scheme\"." ); + } + if ( $strict && $hierpart === '' ) { + throw new DataItemException( "Illegal URI hierpart \"$hierpart\"." ); + } + $this->m_scheme = $scheme; + $this->m_hierpart = $hierpart; + $this->m_query = $query; + $this->m_fragment = $fragment; + } + + public function getDIType() { + return SMWDataItem::TYPE_URI; + } + + /// @todo This should be changed to the spelling getUri(). + public function getURI() { + $schemesWithDoubleslesh = [ + 'http', 'https', 'ftp' + ]; + + $uri = $this->m_scheme . ':' + . ( in_array( $this->m_scheme, $schemesWithDoubleslesh ) ? '//' : '' ) + . $this->m_hierpart + . ( $this->m_query ? '?' . $this->m_query : '' ) + . ( $this->m_fragment ? '#' . $this->m_fragment : '' ); + + // #1878 + // https://tools.ietf.org/html/rfc3986 + // Normalize spaces to use `_` instead of %20 and so ensure + // that http://example.org/Foo bar === http://example.org/Foo_bar === http://example.org/Foo%20bar + return str_replace( [ ' ', '%20'], '_', $uri ); + } + + public function getScheme() { + return $this->m_scheme; + } + + public function getHierpart() { + return $this->m_hierpart; + } + + public function getQuery() { + return $this->m_query; + } + + public function getFragment() { + return $this->m_fragment; + } + + /** + * @since 1.6 + * + * @return string + */ + public function getSortKey() { + return urldecode( $this->getURI() ); + } + + public function getSerialization() { + return $this->getURI(); + } + + /** + * Create a data item from the provided serialization string and type + * ID. + * @return SMWDIUri + */ + public static function doUnserialize( $serialization ) { + + // try to split "schema:rest" + $parts = explode( ':', $serialization, 2 ); + $strict = true; + + if ( $serialization !== null && count( $parts ) <= 1 ) { + throw new DataItemException( "Unserialization failed: the string \"$serialization\" is no valid URI." ); + } + + if ( $serialization === null ) { + $parts = [ '', 'NO_VALUE' ]; + $strict = false; + } + + $scheme = $parts[0]; + + // try to split "hier-part?queryfrag" + $parts = explode( '?', $parts[1], 2 ); + + if ( count( $parts ) == 2 ) { + $hierpart = $parts[0]; + // try to split "query#frag" + $parts = explode( '#', $parts[1], 2 ); + $query = $parts[0]; + $fragment = ( count( $parts ) == 2 ) ? $parts[1] : ''; + } else { + $query = ''; + // try to split "hier-part#frag" + $parts = explode( '#', $parts[0], 2 ); + $hierpart = $parts[0]; + $fragment = ( count( $parts ) == 2 ) ? $parts[1] : ''; + } + + $hierpart = ltrim( $hierpart, '/' ); + + return new SMWDIUri( $scheme, $hierpart, $query, $fragment, $strict ); + } + + public function equals( SMWDataItem $di ) { + if ( $di->getDIType() !== SMWDataItem::TYPE_URI ) { + return false; + } + + return $di->getURI() === $this->getURI(); + } +} |