38 parent::__construct(
'Specialpages' );
45 $out->getMetadata()->setPreventClickjacking(
false );
46 $out->addModuleStyles(
'mediawiki.special' );
48 $groups = $this->getSpecialPages();
50 if ( $groups ===
false ) {
55 $this->outputPageList( $groups );
59 private function getSpecialPages() {
62 if ( $pages === [] ) {
69 foreach ( $pages as $page ) {
70 $group = $page->getFinalGroupName();
71 $desc = $page->getDescription();
73 if ( is_string( $desc ) ) {
74 wfDeprecated(
"string return from {$page->getName()}::getDescription()",
'1.41' );
75 $desc = (
new RawMessage(
'$1' ) )->rawParams( $desc );
78 if ( !$desc->isDisabled() ) {
79 $specialPages[$desc->text()] = [
80 $page->getPageTitle(),
81 $page->isRestricted(),
89 uasort( $specialPages,
static fn ( $a, $b ) => $a[3] <=> $b[3] );
94 private function outputPageList( array $specialPages ) {
97 $out->addModuleStyles( [
'codex-styles' ] );
98 $out->addModules(
'mediawiki.special.specialpages' );
101 $includesRestrictedPages =
false;
102 foreach ( $specialPages as $desc => [ $title, $restricted, $cached, $group ] ) {
104 $includesRestrictedPages =
true;
109 if ( $includesRestrictedPages ) {
110 $legend = Html::rawElement(
112 [
'class' => [
'cdx-card',
'mw-special-pages-legend' ] ],
115 [
'class' => [
'cdx-card__text' ] ],
116 $this->
msg(
'specialpages-access-restricted-note' )->text()
119 $out->addHTML( $legend );
123 Html::openElement(
'div', [
'class' =>
'cdx-table' ] ) .
124 Html::openElement(
'div', [
'class' =>
'cdx-table__header' ] )
127 $out->addHTML(
new FieldLayout(
128 new SearchInputWidget( [
129 'placeholder' => $this->
msg(
'specialpages-header-search' )->text(),
132 'classes' => [
'mw-special-pages-search' ],
133 'label' => $this->
msg(
'specialpages-header-search' )->text(),
134 'invisibleLabel' =>
true,
140 Html::closeElement(
'div' ) .
141 Html::openElement(
'div', [
'class' =>
'cdx-table__table-wrapper' ] ) .
142 Html::openElement(
'table', [
'class' =>
'cdx-table__table sortable' ] )
145 $accessHeader = $includesRestrictedPages ?
146 Html::element(
'th', [], $this->
msg(
'specialpages-header-access' )->text() ) :
'';
148 Html::openElement(
'thead' ) .
149 Html::openElement(
'tr' ) .
150 Html::element(
'th', [], $this->
msg(
'specialpages-header-name' )->text() ) .
151 Html::element(
'th', [], $this->
msg(
'specialpages-header-category' )->text() ) .
153 Html::closeElement(
'tr' ) .
154 Html::closeElement(
'thead' ) .
155 Html::openElement(
'tbody' )
159 foreach ( $specialPages as $desc => [ $title, $restricted, $cached, $group ] ) {
160 $indexAttr = [
'data-search-index-0' => $language->lc( $title->getText() ) ];
162 foreach ( $aliases as $alias => $target ) {
164 if ( $target == $title->getText() && $language->lc( $alias ) !== $language->lc( $title->getText() ) ) {
165 $indexAttr[
'data-search-index-' . $c ] = $language->lc( $alias );
169 if ( str_contains( $group,
'/' ) ) {
170 [ $group, $subGroup ] = explode(
'/', $group, 2 );
171 $groupName = $this->
msg(
"specialpages-group-$group-$subGroup" )->text();
173 $groupName = $this->
msg(
"specialpages-group-$group" )->text();
175 $rowClasses = [
'mw-special-pages-search-highlight',
'mw-special-pages-row' ];
176 if ( $includesRestrictedPages ) {
177 if ( $restricted ===
true ) {
178 $rowClasses[] =
'mw-special-pages-row-restricted';
179 $accessMessageKey =
'specialpages-access-restricted';
181 $accessMessageKey =
'specialpages-access-public';
183 $accessCell =
Html::element(
'td', [], $this->
msg( $accessMessageKey )->text() );
188 Html::openElement(
'tr', $indexAttr + [
'class' => $rowClasses ] ) .
191 [
'class' =>
'mw-special-pages-name' ],
196 Html::closeElement(
'tr' )
201 Html::closeElement(
'tbody' ) .
202 Html::closeElement(
'table' ) .
203 Html::closeElement(
'div' ) .
204 Html::closeElement(
'div' )
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Logs a warning that a deprecated feature was used.