Skip to content

Commit

Permalink
Add MediaWikiLinksApplication
Browse files Browse the repository at this point in the history
  • Loading branch information
Universal-Omega authored Sep 10, 2024
1 parent a2ae5f7 commit e832357
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 0 deletions.
6 changes: 6 additions & 0 deletions __phutil_library_map__.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -31,6 +34,9 @@
'AdminChangeFileVisibilityController' => 'PhabricatorController',
'GitHubAccountCustomField' => 'PhabricatorUserCustomField',
'MediaWikiUserpageCustomField' => 'PhabricatorUserCustomField',
'MediaWikiLinksApplication' => 'PhabricatorApplication',
'MediaWikiLinksConfigOptions' => 'PhabricatorApplicationConfigOptions',
'MediaWikiLinksRemarkupRule' => 'PhutilRemarkupRule',
'PhabricatorMediaWikiAuthProvider' => 'PhabricatorOAuth1AuthProvider',
'PhutilCustomProxy' => 'PhutilHTTPEngineExtension',
'PhutilMediaWikiAuthAdapter' => 'PhutilOAuth1AuthAdapter',
Expand Down
33 changes: 33 additions & 0 deletions src/mediawikilinks/MediaWikiLinksApplication.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

/**
* @license http://www.apache.org/licenses/ Apache License 2.0
*/
final class MediaWikiLinksApplication extends PhabricatorApplication {

public function getName() {
return pht( 'MediaWiki Links' );
}

public function getShortDescription() {
return pht( 'Use Wikitext Links' );
}

public function getIcon() {
return 'fa-link';
}

public function getTitleGlyph() {
return "\xEF\x83\x81";
}

public function getApplicationGroup() {
return self::GROUP_UTILITIES;
}

public function getRemarkupRules() {
return [
new MediaWikiLinksRemarkupRule(),
];
}
}
38 changes: 38 additions & 0 deletions src/mediawikilinks/MediaWikiLinksConfigOptions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

/**
* @license http://www.apache.org/licenses/ Apache License 2.0
*/
final class MediaWikiLinksConfigOptions
extends PhabricatorApplicationConfigOptions {

public function getName() {
return pht( 'MediaWiki Links' );
}

public function getDescription() {
return pht( 'Configure MediaWiki Links URLs.' );
}

public function getIcon() {
return 'fa-links';
}

public function getGroup() {
return 'utilities';
}

public function getOptions() {
return [
$this->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.'
)
),
];
}
}
95 changes: 95 additions & 0 deletions src/mediawikilinks/MediaWikiLinksRemarkupRule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php

// Copied from https://we.phorge.it/source/phorge/browse/master/src/infrastructure/markup/markuprule/PhutilRemarkupDocumentLinkRule.php

/**
* @license http://www.apache.org/licenses/ Apache License 2.0
*/
final class MediaWikiLinksRemarkupRule extends PhutilRemarkupRule {

public function getPriority(): float {
// Set to 200.0 since Phriction is set to 175.0: https://we.phorge.it/source/phorge/browse/master/src/applications/phriction/markup/PhrictionRemarkupRule.php;b9ea6f1ce823dcd83a431f5913d9b1fe29dd25bd$8
return 200.0;
}

public function apply( $text ) {
// Handle mediawiki-style links: [[ href | [name] ]]
$text = preg_replace_callback(
'@\B\\[\\[([^|\\]]+)(?:\\|([^\\]]*))?\\]\\]\B@U',
[ $this, 'markupDocumentLink' ],
$text
);

return $text;
}

protected function renderHyperlink( $link, $name ) {
$engine = $this->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 ) );
}
}

0 comments on commit e832357

Please sign in to comment.