parsoidClientFactory = $parsoidClientFactory; $this->commentParser = $commentParser; $this->tempUserCreator = $tempUserCreator; $this->userFactory = $userFactory; $this->skinFactory = $skinFactory; } /** * @inheritDoc * @throws ApiUsageException */ public function execute() { $params = $this->extractRequestParams(); $title = Title::newFromText( $params['page'] ); if ( !$title ) { $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['page'] ) ] ); } if ( $params['type'] === 'topic' ) { $this->requireAtLeastOneParameter( $params, 'sectiontitle' ); } // Try without adding a signature $result = $this->previewMessage( $params['type'], $title, [ 'wikitext' => $params['wikitext'], 'sectiontitle' => $params['sectiontitle'] ], $params ); $resultHtml = $result->getResultData( [ 'parse', 'text' ] ); // Check if there was a signature in a proper place $container = DOMCompat::getBody( DOMUtils::parseHTML( $resultHtml ) ); $threadItemSet = $this->commentParser->parse( $container, $title->getTitleValue() ); if ( !CommentUtils::isSingleCommentSignedBy( $threadItemSet, $this->getUserForPreview()->getName(), $container ) ) { // If not, add the signature and re-render $signature = $this->msg( 'discussiontools-signature-prefix' )->inContentLanguage()->text() . '~~~~'; // Drop opacity of signature in preview to make message body preview clearer. // Extract any leading spaces outside the markup to ensure accurate previews. $signature = preg_replace_callback( '/^( *)(.+)$/', static function ( $matches ) { list( , $leadingSpaces, $sig ) = $matches; return $leadingSpaces . '' . $sig . ''; }, $signature ); $result = $this->previewMessage( $params['type'], $title, [ 'wikitext' => $params['wikitext'], 'sectiontitle' => $params['sectiontitle'], 'signature' => $signature ], $params ); } $this->getResult()->addValue( null, $this->getModuleName(), $result->serializeForApiResult() ); } /** * @inheritDoc */ public function getAllowedParams() { return [ 'type' => [ ParamValidator::PARAM_REQUIRED => true, ParamValidator::PARAM_TYPE => [ 'reply', 'topic', ], ApiBase::PARAM_HELP_MSG_PER_VALUE => [ 'reply' => 'apihelp-discussiontoolsedit-paramvalue-paction-addcomment', 'topic' => 'apihelp-discussiontoolsedit-paramvalue-paction-addtopic', ], ], 'page' => [ ParamValidator::PARAM_REQUIRED => true, ApiBase::PARAM_HELP_MSG => 'apihelp-visualeditoredit-param-page', ], 'wikitext' => [ ParamValidator::PARAM_REQUIRED => true, ParamValidator::PARAM_TYPE => 'text', ], 'sectiontitle' => [ ParamValidator::PARAM_TYPE => 'string', ApiBase::PARAM_HELP_MSG => 'apihelp-edit-param-sectiontitle', ], 'useskin' => [ ParamValidator::PARAM_TYPE => array_keys( $this->skinFactory->getInstalledSkins() ), ApiBase::PARAM_HELP_MSG => 'apihelp-parse-param-useskin', ], ]; } /** * @inheritDoc */ public function isInternal() { return true; } }