*
* @param string $wikiID Wiki'd id (generally database name)
* @param string $page Page name (must be normalised before calling this function!)
+ * @param string|null $fragmentId
+ *
* @return string|bool URL or false if the wiki was not found
*/
- public static function getForeignURL( $wikiID, $page ) {
+ public static function getForeignURL( $wikiID, $page, $fragmentId = null ) {
$wiki = WikiMap::getWiki( $wikiID );
if ( $wiki ) {
- return $wiki->getFullUrl( $page );
+ return $wiki->getFullUrl( $page, $fragmentId );
}
return false;
* Helper function for getUrl()
*
* @todo FIXME: This may be generalized...
- * @param string $page Page name (must be normalised before calling this function!)
- * @return string Url fragment
+ *
+ * @param string $page Page name (must be normalised before calling this function! May contain a section part.)
+ * @param string|null $fragmentId
+ *
+ * @return string relative URL, without the server part.
*/
- private function getLocalUrl( $page ) {
- return str_replace( '$1', wfUrlEncode( str_replace( ' ', '_', $page ) ), $this->mPath );
+ private function getLocalUrl( $page, $fragmentId = null ) {
+ $page = wfUrlEncode( str_replace( ' ', '_', $page ) );
+
+ if ( is_string( $fragmentId ) && $fragmentId !== '' ) {
+ $page .= '#' . wfUrlEncode( $fragmentId );
+ }
+
+ return str_replace( '$1', $page, $this->mPath );
}
/**
* Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki
*
* @param string $page Page name (must be normalised before calling this function!)
+ * @param string|null $fragmentId
+ *
* @return string Url
*/
- public function getCanonicalUrl( $page ) {
- return $this->mCanonicalServer . $this->getLocalUrl( $page );
+ public function getCanonicalUrl( $page, $fragmentId = null ) {
+ return $this->mCanonicalServer . $this->getLocalUrl( $page, $fragmentId );
}
/**
/**
* Alias for getCanonicalUrl(), for backwards compatibility.
* @param string $page
+ * @param string|null $fragmentId
+ *
* @return string
*/
- public function getUrl( $page ) {
- return $this->getCanonicalUrl( $page );
+ public function getUrl( $page, $fragmentId = null ) {
+ return $this->getCanonicalUrl( $page, $fragmentId );
}
/**
* when called locally on the wiki.
*
* @param string $page Page name (must be normalized before calling this function!)
+ * @param string|null $fragmentId
+ *
* @return string URL
*/
- public function getFullUrl( $page ) {
+ public function getFullUrl( $page, $fragmentId = null ) {
return $this->mServer .
- $this->getLocalUrl( $page );
+ $this->getLocalUrl( $page, $fragmentId );
}
}
public function provideGetCanonicalUrl() {
return array(
- 'wiki path' => array( 'https://acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo' ),
- 'empty path' => array( 'https://acme.com/Foo', 'https://acme.com', '//acme.com', '/$1', 'Foo' ),
+ 'no fragement' => array( 'https://acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', null ),
+ 'empty fragement' => array( 'https://acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', '' ),
+ 'fragment' => array( 'https://acme.com/wiki/Foo#Bar', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', 'Bar' ),
+ 'double fragment' => array( 'https://acme.com/wiki/Foo#Bar%23Xus', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', 'Bar#Xus' ),
+ 'escaped fragement' => array( 'https://acme.com/wiki/Foo%23Bar', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo#Bar', null ),
+ 'empty path' => array( 'https://acme.com/Foo', 'https://acme.com', '//acme.com', '/$1', 'Foo', null ),
);
}
/**
* @dataProvider provideGetCanonicalUrl
*/
- public function testGetCanonicalUrl( $expected, $canonicalServer, $server, $path, $page ) {
+ public function testGetCanonicalUrl( $expected, $canonicalServer, $server, $path, $page, $fragmentId ) {
$reference = new WikiReference( 'wiki', 'xx', $canonicalServer, $path, $server );
- $this->assertEquals( $expected, $reference->getCanonicalUrl( $page ) );
+ $this->assertEquals( $expected, $reference->getCanonicalUrl( $page, $fragmentId ) );
}
/**
* @dataProvider provideGetCanonicalUrl
*/
- public function testGetUrl( $expected, $canonicalServer, $server, $path, $page ) {
+ public function testGetUrl( $expected, $canonicalServer, $server, $path, $page, $fragmentId ) {
$reference = new WikiReference( 'wiki', 'xx', $canonicalServer, $path, $server );
- $this->assertEquals( $expected, $reference->getUrl( $page ) );
+ $this->assertEquals( $expected, $reference->getUrl( $page, $fragmentId ) );
}
public function provideGetFullUrl() {
return array(
- 'wiki path' => array( '//acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', null ),
+ 'no fragement' => array( '//acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', null ),
+ 'empty fragement' => array( '//acme.com/wiki/Foo', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', '' ),
+ 'fragment' => array( '//acme.com/wiki/Foo#Bar', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', 'Bar' ),
+ 'double fragment' => array( '//acme.com/wiki/Foo#Bar%23Xus', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo', 'Bar#Xus' ),
+ 'escaped fragement' => array( '//acme.com/wiki/Foo%23Bar', 'https://acme.com', '//acme.com', '/wiki/$1', 'Foo#Bar', null ),
'empty path' => array( '//acme.com/Foo', 'https://acme.com', '//acme.com', '/$1', 'Foo', null ),
);
}
/**
* @dataProvider provideGetFullUrl
*/
- public function testGetFullUrl( $expected, $canonicalServer, $server, $path, $page ) {
+ public function testGetFullUrl( $expected, $canonicalServer, $server, $path, $page, $fragmentId ) {
$reference = new WikiReference( 'wiki', 'xx', $canonicalServer, $path, $server );
- $this->assertEquals( $expected, $reference->getFullUrl( $page ) );
+ $this->assertEquals( $expected, $reference->getFullUrl( $page, $fragmentId ) );
}
}