mediawiki-extensions-Discus.../includes/ApiDiscussionToolsTrait.php
Bartosz Dziewoński 69e8e948b2 Remove now redundant PHPDoc blocks
MediaWiki's PHPCS plugin requires documentation comments on all
methods, unless those methods are fully typed (all parameters and
return value).

It turns out that almost all of our methods are fully typed already.

Procedure:

1. Find: \*(\s*\*\s*(@param \??[\w\\]+(\|null)? &?\$\w+|@return \??[\w\\]+(\|null)?)\n)+\s*\*/
   Replace with: */
   This deletes type annotations, except those not representable
   as PHP type hints such as union types `a|b` or typed arrays `a[]`,
   or those with documentation beyond type hints, or those on
   functions with any other annotations.

2. Find: /\*\*/\n\s*
   Replace with nothing
   This deletes the remaining comments on methods that had no prose
   documentation.

3. Undo all changes that PHPCS complains about (those comments
   were not redundant)

4. Review the diff carefully, these regexps are imprecise :)

Change-Id: Ic82e8b23f2996f44951208dbd9cfb4c8e0738dac
2024-03-10 23:53:04 +00:00

177 lines
5 KiB
PHP

<?php
namespace MediaWiki\Extension\DiscussionTools;
use ApiMain;
use ApiResult;
use DerivativeContext;
use IContextSource;
use MediaWiki\Extension\VisualEditor\ParsoidClient;
use MediaWiki\Extension\VisualEditor\VisualEditorParsoidClientFactory;
use MediaWiki\Request\DerivativeRequest;
use MediaWiki\Request\WebRequest;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Title\Title;
use MediaWiki\User\TempUser\TempUserCreator;
use MediaWiki\User\User;
use MediaWiki\User\UserFactory;
use Wikimedia\Parsoid\Utils\DOMCompat;
use Wikimedia\Parsoid\Utils\DOMUtils;
/**
* Random methods we want to share between API modules.
*
* @property VisualEditorParsoidClientFactory $parsoidClientFactory
* @property CommentParser $commentParser
* @property TempUserCreator $tempUserCreator
* @property UserFactory $userFactory
*/
trait ApiDiscussionToolsTrait {
/**
* Given parameters describing a reply or new topic, transform them into wikitext using Parsoid,
* then preview the wikitext using the legacy parser.
*
* @param string $type 'topic' or 'reply'
* @param Title $title Context title for wikitext transformations
* @param array $params Associative array with the following keys:
* - `wikitext` (string|null) Content of the message, mutually exclusive with `html`
* - `html` (string|null) Content of the message, mutually exclusive with `wikitext`
* - `sectiontitle` (string) Content of the title, when `type` is 'topic'
* - `signature` (string|null) Wikitext signature to add to the message
* @param array $originalParams Original params from the source API call
* @return ApiResult action=parse API result
*/
protected function previewMessage(
string $type, Title $title, array $params, array $originalParams = []
): ApiResult {
$wikitext = $params['wikitext'] ?? null;
$html = $params['html'] ?? null;
$signature = $params['signature'] ?? null;
switch ( $type ) {
case 'topic':
if ( $wikitext !== null ) {
if ( $signature !== null ) {
$wikitext = CommentModifier::appendSignatureWikitext( $wikitext, $signature );
}
} else {
$doc = DOMUtils::parseHTML( '' );
$container = DOMUtils::parseHTMLToFragment( $doc, $html );
if ( $signature !== null ) {
CommentModifier::appendSignature( $container, $signature );
}
$html = DOMUtils::getFragmentInnerHTML( $container );
$wikitext = $this->transformHTML( $title, $html )[ 'body' ];
}
if ( $params['sectiontitle'] ) {
$wikitext = "== " . $params['sectiontitle'] . " ==\n" . $wikitext;
}
break;
case 'reply':
$doc = DOMUtils::parseHTML( '' );
if ( $wikitext !== null ) {
$container = CommentModifier::prepareWikitextReply( $doc, $wikitext );
} else {
$container = CommentModifier::prepareHtmlReply( $doc, $html );
}
if ( $signature !== null ) {
CommentModifier::appendSignature( $container, $signature );
}
$list = CommentModifier::transferReply( $container );
$html = DOMCompat::getOuterHTML( $list );
$wikitext = $this->transformHTML( $title, $html )[ 'body' ];
break;
}
$apiParams = [
'action' => 'parse',
'title' => $title->getPrefixedText(),
'text' => $wikitext,
'pst' => '1',
'preview' => '1',
'disableeditsection' => '1',
'prop' => 'text|modules|jsconfigvars',
];
if ( isset( $originalParams['useskin'] ) ) {
$apiParams['useskin'] = $originalParams['useskin'];
}
if ( isset( $originalParams['mobileformat'] ) && $originalParams['mobileformat'] ) {
$apiParams['mobileformat'] = '1';
}
$context = new DerivativeContext( $this->getContext() );
$context->setRequest(
new DerivativeRequest(
$context->getRequest(),
$apiParams,
/* was posted? */ true
)
);
$api = new ApiMain(
$context,
/* enable write? */ false
);
$api->execute();
return $api->getResult();
}
/**
* @see ApiParse::getUserForPreview
* @return User
*/
private function getUserForPreview() {
$user = $this->getUser();
if ( $this->tempUserCreator->shouldAutoCreate( $user, 'edit' ) ) {
return $this->userFactory->newUnsavedTempUser(
$this->tempUserCreator->getStashedName( $this->getRequest()->getSession() )
);
}
return $user;
}
/**
* @see VisualEditorParsoidClientFactory
* @return ParsoidClient
*/
protected function getParsoidClient(): ParsoidClient {
return $this->parsoidClientFactory->createParsoidClient(
$this->getContext()->getRequest()->getHeader( 'Cookie' )
);
}
/**
* @warning (T323357) - Calling this method writes to stash, so it should be called
* only when we are fetching page HTML for editing.
*/
abstract protected function requestRestbasePageHtml( RevisionRecord $revision ): array;
abstract protected function transformHTML(
Title $title, string $html, int $oldid = null, string $etag = null
): array;
/**
* @return IContextSource
*/
abstract public function getContext();
/**
* @return User
*/
abstract public function getUser();
/**
* @return WebRequest
*/
abstract public function getRequest();
}