2020-08-19 20:03:41 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace MediaWiki\Extension\DiscussionTools;
|
|
|
|
|
|
|
|
use ApiBase;
|
|
|
|
use ApiMain;
|
|
|
|
use ApiParsoidTrait;
|
|
|
|
use DOMElement;
|
|
|
|
use Title;
|
|
|
|
use Wikimedia\ParamValidator\ParamValidator;
|
|
|
|
use Wikimedia\Parsoid\Utils\DOMUtils;
|
|
|
|
|
|
|
|
class ApiDiscussionTools extends ApiBase {
|
|
|
|
|
|
|
|
use ApiParsoidTrait;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritDoc
|
|
|
|
*/
|
|
|
|
public function __construct( ApiMain $main, string $name ) {
|
|
|
|
parent::__construct( $main, $name );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritDoc
|
|
|
|
*/
|
|
|
|
public function execute() {
|
|
|
|
$params = $this->extractRequestParams();
|
|
|
|
$title = Title::newFromText( $params['page'] );
|
|
|
|
$result = null;
|
|
|
|
|
|
|
|
if ( !$title ) {
|
|
|
|
$this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['page'] ) ] );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch ( $params['paction'] ) {
|
|
|
|
case 'transcludedfrom':
|
|
|
|
$response = $this->requestRestbasePageHtml(
|
|
|
|
$this->getValidRevision( $title, $params['oldid'] ?? null )
|
|
|
|
);
|
|
|
|
|
|
|
|
$doc = DOMUtils::parseHTML( $response['body'] );
|
|
|
|
$container = $doc->getElementsByTagName( 'body' )->item( 0 );
|
|
|
|
'@phan-var DOMElement $container';
|
|
|
|
|
|
|
|
CommentUtils::unwrapParsoidSections( $container );
|
|
|
|
|
|
|
|
$parser = CommentParser::newFromGlobalState( $container );
|
|
|
|
$comments = $parser->getCommentItems();
|
|
|
|
|
|
|
|
$transcludedFrom = [];
|
|
|
|
foreach ( $comments as $comment ) {
|
|
|
|
$from = $comment->getTranscludedFrom();
|
|
|
|
// 'false' is the most likely result, so don't bother sending it,
|
|
|
|
// the client can just assume it if the key is missing
|
|
|
|
if ( $from !== false ) {
|
|
|
|
$transcludedFrom[ $comment->getId() ] = $from;
|
2020-10-21 15:52:04 +00:00
|
|
|
$legacyId = $comment->getLegacyId();
|
|
|
|
if ( $legacyId ) {
|
|
|
|
$transcludedFrom[ $legacyId ] = $from;
|
|
|
|
}
|
2020-08-19 20:03:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$result = $transcludedFrom;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->getResult()->addValue( null, $this->getModuleName(), $result );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritDoc
|
|
|
|
*/
|
|
|
|
public function getAllowedParams() {
|
|
|
|
return [
|
|
|
|
'paction' => [
|
|
|
|
ParamValidator::PARAM_REQUIRED => true,
|
|
|
|
ParamValidator::PARAM_TYPE => [
|
|
|
|
'transcludedfrom',
|
|
|
|
],
|
|
|
|
ApiBase::PARAM_HELP_MSG => 'apihelp-visualeditoredit-param-paction',
|
|
|
|
],
|
|
|
|
'page' => [
|
|
|
|
ParamValidator::PARAM_REQUIRED => true,
|
|
|
|
ApiBase::PARAM_HELP_MSG => 'apihelp-visualeditoredit-param-page',
|
|
|
|
],
|
|
|
|
'oldid' => null,
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritDoc
|
|
|
|
*/
|
|
|
|
public function needsToken() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritDoc
|
|
|
|
*/
|
|
|
|
public function isInternal() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritDoc
|
|
|
|
*/
|
|
|
|
public function isWriteMode() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|