diff --git a/__phutil_library_map__.php b/__phutil_library_map__.php index e0514ac..9331a17 100644 --- a/__phutil_library_map__.php +++ b/__phutil_library_map__.php @@ -14,6 +14,9 @@ 'AdminManageObjectsApplication' => 'src/admin/AdminManageObjectsApplication.php', 'GitHubAccountCustomField' => 'src/customfields/GitHubAccountCustomField.php', 'MediaWikiUserpageCustomField' => 'src/customfields/MediaWikiUserpageCustomField.php', + 'MediaWikiLinksApplication' => 'src/mediawikilinks/MediaWikiLinksApplication.php', + 'MediaWikiLinksConfigOptions' => 'src/mediawikilinks/MediaWikiLinksConfigOptions.php', + 'MediaWikiLinksRemarkupRule' => 'src/mediawikilinks/MediaWikiLinksRemarkupRule.php', 'PhutilCustomProxy' => 'src/proxy/PhutilCustomProxy.php', 'PhabricatorMediaWikiAuthProvider' => 'src/oauth/PhabricatorMediaWikiAuthProvider.php', 'PhutilMediaWikiAuthAdapter' => 'src/oauth/PhutilMediaWikiAuthAdapter.php', @@ -31,6 +34,9 @@ 'AdminChangeFileVisibilityController' => 'PhabricatorController', 'GitHubAccountCustomField' => 'PhabricatorUserCustomField', 'MediaWikiUserpageCustomField' => 'PhabricatorUserCustomField', + 'MediaWikiLinksApplication' => 'PhabricatorApplication', + 'MediaWikiLinksConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'MediaWikiLinksRemarkupRule' => 'PhutilRemarkupRule', 'PhabricatorMediaWikiAuthProvider' => 'PhabricatorOAuth1AuthProvider', 'PhutilCustomProxy' => 'PhutilHTTPEngineExtension', 'PhutilMediaWikiAuthAdapter' => 'PhutilOAuth1AuthAdapter', diff --git a/src/mediawikilinks/MediaWikiLinksApplication.php b/src/mediawikilinks/MediaWikiLinksApplication.php new file mode 100644 index 0000000..013d55a --- /dev/null +++ b/src/mediawikilinks/MediaWikiLinksApplication.php @@ -0,0 +1,33 @@ +newOption( 'mediawikilinks.base', 'string', null ) + ->addExample( 'https://www.mediawiki.org/wiki/', pht( 'MediaWiki wiki' ) ) + ->addExample( 'https://meta.miraheze.org/wiki/', pht( 'Miraheze Meta' ) ) + ->setDescription( + pht( + 'URL prefix of where Wikitext-style links go to. The page will ' . + 'be appended to the URL.' + ) + ), + ]; + } +} diff --git a/src/mediawikilinks/MediaWikiLinksRemarkupRule.php b/src/mediawikilinks/MediaWikiLinksRemarkupRule.php new file mode 100644 index 0000000..cefea16 --- /dev/null +++ b/src/mediawikilinks/MediaWikiLinksRemarkupRule.php @@ -0,0 +1,95 @@ +getEngine(); + + if ( $engine->isTextMode() ) { + if ( !strlen( $name ) ) { + return $link; + } + + return $name . ' <' . $link . '>'; + } + + if ( $engine->getState( 'toc' ) ) { + return $name; + } + + return phutil_tag( + 'a', + [ + 'href' => $link, + 'class' => $this->getRemarkupLinkClass( false ), + 'target' => '_blank', + 'rel' => 'noreferrer', + ], + $name + ); + } + + protected function doPipeTrick( string $page ): string { + // Remove leading prefix (e.g. [[w:Egg]]) + $page = preg_replace( '/^:?\\w+:/', '', $page ); + + $oldPage = $page; + // Remove parenthesis + $page = preg_replace( '/\(.+/', '', $page ); + + // Remove commas if parenthesis were not removed + if ( $oldPage === $page ) { + $page = preg_replace( '/,.+/', '', $page ); + } + + return trim( $page ); + } + + public function markupDocumentLink( array $matches ) { + $page = trim( $matches[1] ); + $name = isset( $matches[2] ) ? trim( $matches[2] ) : null; + + if ( !$this->isFlatText( $page ) ) { + return $matches[0]; + } + + if ( !$this->isFlatText( $name ) ) { + return $matches[0]; + } + + $urlPrefix = PhabricatorEnv::getEnvConfig( 'mediawikilinks.base' ); + if ( !phutil_nonempty_string( $urlPrefix ) ) { + return $matches[0]; + } + + $url = $urlPrefix . str_replace( ' ', '_', $page ); + if ( $name === null ) { + $name = $page; + } elseif ( $name === '' ) { + $name = $this->doPipeTrick( $page ); + } + + return $this->getEngine()->storeText( $this->renderHyperlink( $url, $name ) ); + } +}