mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/DiscussionTools
synced 2024-11-24 00:13:36 +00:00
Move ApiDiscussionTools to ApiDiscussionToolsPageInfo
Also remove 'paction' param, and instead make 'transcludedFrom' a property of the result object. Change-Id: I0a289f6d71e4708afff0b52066b1ed6faf76b9ae
This commit is contained in:
parent
ee2749d34a
commit
7cad692afa
|
@ -404,9 +404,6 @@
|
||||||
"MediaWiki\\Extension\\DiscussionTools\\Tests\\": "tests/phpunit/"
|
"MediaWiki\\Extension\\DiscussionTools\\Tests\\": "tests/phpunit/"
|
||||||
},
|
},
|
||||||
"APIModules": {
|
"APIModules": {
|
||||||
"discussiontools": {
|
|
||||||
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionTools"
|
|
||||||
},
|
|
||||||
"discussiontoolsedit": {
|
"discussiontoolsedit": {
|
||||||
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsEdit"
|
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsEdit"
|
||||||
},
|
},
|
||||||
|
@ -417,6 +414,9 @@
|
||||||
"ConfigFactory"
|
"ConfigFactory"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"discussiontoolspageinfo": {
|
||||||
|
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsPageInfo"
|
||||||
|
},
|
||||||
"discussiontoolssubscribe": {
|
"discussiontoolssubscribe": {
|
||||||
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsSubscribe",
|
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsSubscribe",
|
||||||
"services": [
|
"services": [
|
||||||
|
|
|
@ -8,9 +8,6 @@
|
||||||
"apierror-discussiontools-formtoken-used": "Comment already posted. Reload the page to see it.",
|
"apierror-discussiontools-formtoken-used": "Comment already posted. Reload the page to see it.",
|
||||||
"apierror-discussiontools-subscription-failed-add": "Could not subscribe to this topic.",
|
"apierror-discussiontools-subscription-failed-add": "Could not subscribe to this topic.",
|
||||||
"apierror-discussiontools-subscription-failed-remove": "Could not unsubscribe from this topic.",
|
"apierror-discussiontools-subscription-failed-remove": "Could not unsubscribe from this topic.",
|
||||||
"apihelp-discussiontools-param-oldid": "The revision number to use (defaults to latest revision).",
|
|
||||||
"apihelp-discussiontools-paramvalue-paction-transcludedfrom": "Return titles of pages from which each comment on the given page is transcluded.",
|
|
||||||
"apihelp-discussiontools-summary": "Returns metadata required to initialize the discussion tools.",
|
|
||||||
"apihelp-discussiontoolsedit-param-commentid": "ID of the comment to reply to. Only used when <var>paction</var> is <var>addcomment</var>. Overrides <var>commentname</var>.",
|
"apihelp-discussiontoolsedit-param-commentid": "ID of the comment to reply to. Only used when <var>paction</var> is <var>addcomment</var>. Overrides <var>commentname</var>.",
|
||||||
"apihelp-discussiontoolsedit-param-commentname": "Name of the comment to reply to. Only used when <var>paction</var> is <var>addcomment</var>.",
|
"apihelp-discussiontoolsedit-param-commentname": "Name of the comment to reply to. Only used when <var>paction</var> is <var>addcomment</var>.",
|
||||||
"apihelp-discussiontoolsedit-param-formtoken": "An optional unique ID generated in the client to prevent double-posting.",
|
"apihelp-discussiontoolsedit-param-formtoken": "An optional unique ID generated in the client to prevent double-posting.",
|
||||||
|
@ -22,6 +19,8 @@
|
||||||
"apihelp-discussiontoolsedit-summary": "Post a message on a discussion page.",
|
"apihelp-discussiontoolsedit-summary": "Post a message on a discussion page.",
|
||||||
"apihelp-discussiontoolsgetsubscriptions-param-commentname": "Names of the topics to check",
|
"apihelp-discussiontoolsgetsubscriptions-param-commentname": "Names of the topics to check",
|
||||||
"apihelp-discussiontoolsgetsubscriptions-summary": "Get the subscription statuses of given topics.",
|
"apihelp-discussiontoolsgetsubscriptions-summary": "Get the subscription statuses of given topics.",
|
||||||
|
"apihelp-discussiontoolspageinfo-param-oldid": "The revision number to use (defaults to latest revision).",
|
||||||
|
"apihelp-discussiontoolspageinfo-summary": "Returns metadata required to initialize the discussion tools.",
|
||||||
"apihelp-discussiontoolssubscribe-param-commentname": "Name of the topic to subscribe to (or unsubscribe from)",
|
"apihelp-discussiontoolssubscribe-param-commentname": "Name of the topic to subscribe to (or unsubscribe from)",
|
||||||
"apihelp-discussiontoolssubscribe-param-page": "A page on which the topic appears",
|
"apihelp-discussiontoolssubscribe-param-page": "A page on which the topic appears",
|
||||||
"apihelp-discussiontoolssubscribe-param-subscribe": "True to subscribe, false to unsubscribe",
|
"apihelp-discussiontoolssubscribe-param-subscribe": "True to subscribe, false to unsubscribe",
|
||||||
|
|
|
@ -10,9 +10,6 @@
|
||||||
"apierror-discussiontools-formtoken-used": "{{doc-apierror}}",
|
"apierror-discussiontools-formtoken-used": "{{doc-apierror}}",
|
||||||
"apierror-discussiontools-subscription-failed-add": "{{doc-apierror}}",
|
"apierror-discussiontools-subscription-failed-add": "{{doc-apierror}}",
|
||||||
"apierror-discussiontools-subscription-failed-remove": "{{doc-apierror}}",
|
"apierror-discussiontools-subscription-failed-remove": "{{doc-apierror}}",
|
||||||
"apihelp-discussiontools-param-oldid": "{{doc-apihelp-param|discussiontools|oldid}}",
|
|
||||||
"apihelp-discussiontools-paramvalue-paction-transcludedfrom": "{{doc-apihelp-paramvalue|discussiontools|paction|transcludedfrom}}",
|
|
||||||
"apihelp-discussiontools-summary": "{{doc-apihelp-summary|discussiontools}}",
|
|
||||||
"apihelp-discussiontoolsedit-param-commentid": "{{doc-apihelp-param|discussiontoolsedit|commentid}}",
|
"apihelp-discussiontoolsedit-param-commentid": "{{doc-apihelp-param|discussiontoolsedit|commentid}}",
|
||||||
"apihelp-discussiontoolsedit-param-commentname": "{{doc-apihelp-param|discussiontoolsedit|commentname}}",
|
"apihelp-discussiontoolsedit-param-commentname": "{{doc-apihelp-param|discussiontoolsedit|commentname}}",
|
||||||
"apihelp-discussiontoolsedit-param-formtoken": "{{doc-apihelp-param|discussiontoolsedit|formtoken}}",
|
"apihelp-discussiontoolsedit-param-formtoken": "{{doc-apihelp-param|discussiontoolsedit|formtoken}}",
|
||||||
|
@ -24,6 +21,8 @@
|
||||||
"apihelp-discussiontoolsedit-summary": "{{doc-apihelp-summary|discussiontoolsedit}}",
|
"apihelp-discussiontoolsedit-summary": "{{doc-apihelp-summary|discussiontoolsedit}}",
|
||||||
"apihelp-discussiontoolsgetsubscriptions-param-commentname": "{{doc-apihelp-param|discussiontoolsgetsubscriptions|commentname}}",
|
"apihelp-discussiontoolsgetsubscriptions-param-commentname": "{{doc-apihelp-param|discussiontoolsgetsubscriptions|commentname}}",
|
||||||
"apihelp-discussiontoolsgetsubscriptions-summary": "{{doc-apihelp-summary|discussiontoolsgetsubscriptions}}",
|
"apihelp-discussiontoolsgetsubscriptions-summary": "{{doc-apihelp-summary|discussiontoolsgetsubscriptions}}",
|
||||||
|
"apihelp-discussiontoolspageinfo-param-oldid": "{{doc-apihelp-param|discussiontoolspageinfo|oldid}}",
|
||||||
|
"apihelp-discussiontoolspageinfo-summary": "{{doc-apihelp-summary|discussiontoolspageinfo}}",
|
||||||
"apihelp-discussiontoolssubscribe-param-commentname": "{{doc-apihelp-param|discussiontoolssubscribe|commentname}}",
|
"apihelp-discussiontoolssubscribe-param-commentname": "{{doc-apihelp-param|discussiontoolssubscribe|commentname}}",
|
||||||
"apihelp-discussiontoolssubscribe-param-page": "{{doc-apihelp-param|discussiontoolssubscribe|page}}",
|
"apihelp-discussiontoolssubscribe-param-page": "{{doc-apihelp-param|discussiontoolssubscribe|page}}",
|
||||||
"apihelp-discussiontoolssubscribe-param-subscribe": "{{doc-apihelp-param|discussiontoolssubscribe|subscribe}}",
|
"apihelp-discussiontoolssubscribe-param-subscribe": "{{doc-apihelp-param|discussiontoolssubscribe|subscribe}}",
|
||||||
|
|
|
@ -1,121 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace MediaWiki\Extension\DiscussionTools;
|
|
||||||
|
|
||||||
use ApiBase;
|
|
||||||
use ApiMain;
|
|
||||||
use ApiParsoidTrait;
|
|
||||||
use Title;
|
|
||||||
use Wikimedia\ParamValidator\ParamValidator;
|
|
||||||
use Wikimedia\Parsoid\Utils\DOMCompat;
|
|
||||||
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'] ) ] );
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ( $params['paction'] ) {
|
|
||||||
case 'transcludedfrom':
|
|
||||||
$response = $this->requestRestbasePageHtml(
|
|
||||||
$this->getValidRevision( $title, $params['oldid'] ?? null )
|
|
||||||
);
|
|
||||||
|
|
||||||
$doc = DOMUtils::parseHTML( $response['body'] );
|
|
||||||
$container = DOMCompat::getBody( $doc );
|
|
||||||
|
|
||||||
CommentUtils::unwrapParsoidSections( $container );
|
|
||||||
|
|
||||||
$parser = CommentParser::newFromGlobalState( $container, $title );
|
|
||||||
$threadItems = $parser->getThreadItems();
|
|
||||||
|
|
||||||
$transcludedFrom = [];
|
|
||||||
foreach ( $threadItems as $threadItem ) {
|
|
||||||
$from = $threadItem->getTranscludedFrom();
|
|
||||||
|
|
||||||
// Key by IDs, legacy IDs, and names. This assumes that they can never conflict.
|
|
||||||
|
|
||||||
$transcludedFrom[ $threadItem->getId() ] = $from;
|
|
||||||
|
|
||||||
$legacyId = $threadItem->getLegacyId();
|
|
||||||
if ( $legacyId ) {
|
|
||||||
$transcludedFrom[ $legacyId ] = $from;
|
|
||||||
}
|
|
||||||
|
|
||||||
$name = $threadItem->getName();
|
|
||||||
if ( isset( $transcludedFrom[ $name ] ) && $transcludedFrom[ $name ] !== $from ) {
|
|
||||||
// Two or more items with the same name, transcluded from different pages.
|
|
||||||
// Consider them both to be transcluded from unknown source.
|
|
||||||
$transcludedFrom[ $name ] = true;
|
|
||||||
} else {
|
|
||||||
$transcludedFrom[ $name ] = $from;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$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',
|
|
||||||
ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
|
|
||||||
],
|
|
||||||
'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;
|
|
||||||
}
|
|
||||||
}
|
|
110
includes/ApiDiscussionToolsPageInfo.php
Normal file
110
includes/ApiDiscussionToolsPageInfo.php
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MediaWiki\Extension\DiscussionTools;
|
||||||
|
|
||||||
|
use ApiBase;
|
||||||
|
use ApiMain;
|
||||||
|
use ApiParsoidTrait;
|
||||||
|
use Title;
|
||||||
|
use Wikimedia\ParamValidator\ParamValidator;
|
||||||
|
use Wikimedia\Parsoid\Utils\DOMCompat;
|
||||||
|
use Wikimedia\Parsoid\Utils\DOMUtils;
|
||||||
|
|
||||||
|
class ApiDiscussionToolsPageInfo 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'] );
|
||||||
|
|
||||||
|
if ( !$title ) {
|
||||||
|
$this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['page'] ) ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
$response = $this->requestRestbasePageHtml(
|
||||||
|
$this->getValidRevision( $title, $params['oldid'] ?? null )
|
||||||
|
);
|
||||||
|
|
||||||
|
$doc = DOMUtils::parseHTML( $response['body'] );
|
||||||
|
$container = DOMCompat::getBody( $doc );
|
||||||
|
|
||||||
|
CommentUtils::unwrapParsoidSections( $container );
|
||||||
|
|
||||||
|
$parser = CommentParser::newFromGlobalState( $container, $title );
|
||||||
|
$threadItems = $parser->getThreadItems();
|
||||||
|
|
||||||
|
$transcludedFrom = [];
|
||||||
|
foreach ( $threadItems as $threadItem ) {
|
||||||
|
$from = $threadItem->getTranscludedFrom();
|
||||||
|
|
||||||
|
// Key by IDs, legacy IDs, and names. This assumes that they can never conflict.
|
||||||
|
|
||||||
|
$transcludedFrom[ $threadItem->getId() ] = $from;
|
||||||
|
|
||||||
|
$legacyId = $threadItem->getLegacyId();
|
||||||
|
if ( $legacyId ) {
|
||||||
|
$transcludedFrom[ $legacyId ] = $from;
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $threadItem->getName();
|
||||||
|
if ( isset( $transcludedFrom[ $name ] ) && $transcludedFrom[ $name ] !== $from ) {
|
||||||
|
// Two or more items with the same name, transcluded from different pages.
|
||||||
|
// Consider them both to be transcluded from unknown source.
|
||||||
|
$transcludedFrom[ $name ] = true;
|
||||||
|
} else {
|
||||||
|
$transcludedFrom[ $name ] = $from;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = [
|
||||||
|
'transcludedfrom' => $transcludedFrom
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->getResult()->addValue( null, $this->getModuleName(), $result );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function getAllowedParams() {
|
||||||
|
return [
|
||||||
|
'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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -101,12 +101,11 @@ function getPageData( pageName, oldId, isNewTopic ) {
|
||||||
} );
|
} );
|
||||||
|
|
||||||
transcludedFromPromise = api.get( {
|
transcludedFromPromise = api.get( {
|
||||||
action: 'discussiontools',
|
action: 'discussiontoolspageinfo',
|
||||||
paction: 'transcludedfrom',
|
|
||||||
page: pageName,
|
page: pageName,
|
||||||
oldid: oldId
|
oldid: oldId
|
||||||
} ).then( function ( response ) {
|
} ).then( function ( response ) {
|
||||||
return OO.getProp( response, 'discussiontools' ) || {};
|
return OO.getProp( response, 'discussiontoolspageinfo', 'transcludedfrom' ) || {};
|
||||||
} );
|
} );
|
||||||
} else {
|
} else {
|
||||||
lintPromise = $.Deferred().resolve( [] ).promise();
|
lintPromise = $.Deferred().resolve( [] ).promise();
|
||||||
|
|
Loading…
Reference in a new issue