MediaWiki REL1_34
CategoryTreeHooks.php
Go to the documentation of this file.
1<?php
30
35 public static function shouldForceHeaders() {
36 global $wgCategoryTreeForceHeaders;
37 return $wgCategoryTreeForceHeaders;
38 }
39
44 public static function initialize() {
45 global $wgRequest;
46 global $wgCategoryTreeDefaultOptions, $wgCategoryTreeDefaultMode;
47 global $wgCategoryTreeCategoryPageOptions, $wgCategoryTreeCategoryPageMode;
48 global $wgCategoryTreeOmitNamespace;
49
50 if ( !isset( $wgCategoryTreeDefaultOptions['mode'] )
51 || is_null( $wgCategoryTreeDefaultOptions['mode'] )
52 ) {
53 $wgCategoryTreeDefaultOptions['mode'] = $wgCategoryTreeDefaultMode;
54 }
55
56 if ( !isset( $wgCategoryTreeDefaultOptions['hideprefix'] )
57 || is_null( $wgCategoryTreeDefaultOptions['hideprefix'] )
58 ) {
59 $wgCategoryTreeDefaultOptions['hideprefix'] = $wgCategoryTreeOmitNamespace;
60 }
61
62 if ( !isset( $wgCategoryTreeCategoryPageOptions['mode'] )
63 || is_null( $wgCategoryTreeCategoryPageOptions['mode'] )
64 ) {
65 $mode = $wgRequest->getVal( 'mode' );
66 $wgCategoryTreeCategoryPageOptions['mode'] = ( $mode )
67 ? CategoryTree::decodeMode( $mode ) : $wgCategoryTreeCategoryPageMode;
68 }
69 }
70
74 public static function setHooks( Parser $parser ) {
75 global $wgCategoryTreeAllowTag;
76 if ( !$wgCategoryTreeAllowTag ) {
77 return;
78 }
79 $parser->setHook( 'categorytree', 'CategoryTreeHooks::parserHook' );
80 $parser->setFunctionHook( 'categorytree', 'CategoryTreeHooks::parserFunction' );
81 }
82
90 public static function parserFunction( Parser $parser, ...$params ) {
91 // first user-supplied parameter must be category name
92 if ( !$params ) {
93 // no category specified, return nothing
94 return '';
95 }
96 $cat = array_shift( $params );
97
98 // build associative arguments from flat parameter list
99 $argv = [];
100 foreach ( $params as $p ) {
101 if ( preg_match( '/^\s*(\S.*?)\s*=\s*(.*?)\s*$/', $p, $m ) ) {
102 $k = $m[1];
103 // strip any quotes enclusing the value
104 $v = preg_replace( '/^"\s*(.*?)\s*"$/', '$1', $m[2] );
105 } else {
106 $k = trim( $p );
107 $v = true;
108 }
109
110 $argv[$k] = $v;
111 }
112
113 // now handle just like a <categorytree> tag
114 $html = self::parserHook( $cat, $argv, $parser );
115 return [ $html, 'noparse' => true, 'isHTML' => true ];
116 }
117
124 public static function onSkinBuildSidebar( Skin $skin, array &$sidebar ) {
125 global $wgCategoryTreeSidebarRoot, $wgCategoryTreeSidebarOptions;
126
127 if ( !$wgCategoryTreeSidebarRoot ) {
128 return;
129 }
130
131 $html = self::parserHook( $wgCategoryTreeSidebarRoot, $wgCategoryTreeSidebarOptions );
132 if ( $html ) {
133 $sidebar['categorytree-portlet'] = $html;
135 }
136 }
137
148 public static function parserHook(
149 $cat,
150 array $argv,
151 Parser $parser = null,
152 $allowMissing = false
153 ) {
154 if ( $parser ) {
155 # flag for use by CategoryTreeHooks::parserOutput
156 $parser->mOutput->mCategoryTreeTag = true;
157 }
158
159 $ct = new CategoryTree( $argv );
160
161 $attr = Sanitizer::validateTagAttributes( $argv, 'div' );
162
163 $hideroot = isset( $argv['hideroot'] )
164 ? CategoryTree::decodeBoolean( $argv['hideroot'] ) : null;
165 $onlyroot = isset( $argv['onlyroot'] )
166 ? CategoryTree::decodeBoolean( $argv['onlyroot'] ) : null;
167 $depthArg = isset( $argv['depth'] ) ? (int)$argv['depth'] : null;
168
169 $depth = CategoryTree::capDepth( $ct->getOption( 'mode' ), $depthArg );
170 if ( $onlyroot ) {
171 $depth = 0;
172 }
173
174 return $ct->getTag( $parser, $cat, $hideroot, $attr, $depth, $allowMissing );
175 }
176
185 public static function parserOutput( OutputPage $outputPage, ParserOutput $parserOutput ) {
186 if ( self::shouldForceHeaders() ) {
187 // Skip, we've already set the headers unconditionally
188 return;
189 }
190 if ( !empty( $parserOutput->mCategoryTreeTag ) ) {
191 CategoryTree::setHeaders( $outputPage );
192 }
193 }
194
201 public static function addHeaders( OutputPage $out ) {
202 if ( !self::shouldForceHeaders() ) {
203 return;
204 }
206 }
207
214 public static function articleFromTitle( Title $title, Article &$article = null ) {
215 if ( $title->getNamespace() == NS_CATEGORY ) {
216 $article = new CategoryTreeCategoryPage( $title );
217 }
218 }
219
227 public static function outputPageMakeCategoryLinks(
228 OutputPage &$out,
229 array $categories,
230 array &$links
231 ) {
232 global $wgCategoryTreePageCategoryOptions, $wgCategoryTreeHijackPageCategories;
233
234 if ( !$wgCategoryTreeHijackPageCategories ) {
235 // Not enabled, don't do anything
236 return true;
237 }
238
239 foreach ( $categories as $category => $type ) {
240 $links[$type][] = self::parserHook( $category, $wgCategoryTreePageCategoryOptions, null, true );
242 }
243
244 return false;
245 }
246
253 public static function getDataForJs() {
254 global $wgCategoryTreeCategoryPageOptions;
255
256 // Look, this is pretty bad but CategoryTree is just whacky, it needs to be rewritten
257 $ct = new CategoryTree( $wgCategoryTreeCategoryPageOptions );
258
259 return [
260 'defaultCtOptions' => $ct->getOptionsAsJsStructure(),
261 ];
262 }
263
271 SpecialPage $specialPage, array $trackingCategories
272 ) {
273 $categoryDbKeys = [];
274 foreach ( $trackingCategories as $catMsg => $data ) {
275 foreach ( $data['cats'] as $catTitle ) {
276 $categoryDbKeys[] = $catTitle->getDbKey();
277 }
278 }
279 $categories = [];
280 if ( $categoryDbKeys ) {
282 $res = $dbr->select(
283 'category',
284 [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
285 [ 'cat_title' => array_unique( $categoryDbKeys ) ],
286 __METHOD__
287 );
288 foreach ( $res as $row ) {
289 $categories[$row->cat_title] = Category::newFromRow( $row );
290 }
291 }
292 $specialPage->categoryTreeCategories = $categories;
293 }
294
303 SpecialPage $specialPage, Title $catTitle, &$html
304 ) {
305 if ( !isset( $specialPage->categoryTreeCategories ) ) {
306 return;
307 }
308
309 $cat = null;
310 if ( isset( $specialPage->categoryTreeCategories[$catTitle->getDbKey()] ) ) {
311 $cat = $specialPage->categoryTreeCategories[$catTitle->getDbKey()];
312 }
313
314 $html .= CategoryTree::createCountString( $specialPage->getContext(), $cat, 0 );
315 }
316}
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
if(! $wgDBerrorLogTZ) $wgRequest
Definition Setup.php:751
Class for viewing MediaWiki article and history.
Definition Article.php:38
Hooks for the CategoryTree extension, an AJAX based gadget to display the category structure of a wik...
static outputPageMakeCategoryLinks(OutputPage &$out, array $categories, array &$links)
OutputPageMakeCategoryLinks hook, override category links.
static onSpecialTrackingCategoriesPreprocess(SpecialPage $specialPage, array $trackingCategories)
Hook handler for the SpecialTrackingCategories::preprocess hook PhanUndeclaredProperty SpecialPage->c...
static parserHook( $cat, array $argv, Parser $parser=null, $allowMissing=false)
Entry point for the <categorytree> tag parser hook.
static parserFunction(Parser $parser,... $params)
Entry point for the {{#categorytree}} tag parser function.
static setHooks(Parser $parser)
static parserOutput(OutputPage $outputPage, ParserOutput $parserOutput)
Hook callback that injects messages and things into the <head> tag, if needed in the current page.
static articleFromTitle(Title $title, Article &$article=null)
ArticleFromTitle hook, override category page handling.
static initialize()
Adjusts config once MediaWiki is fully initialised TODO: Don't do this, lazy initialize the config.
static addHeaders(OutputPage $out)
BeforePageDisplay and BeforePageDisplayMobile hooks.
static onSpecialTrackingCategoriesGenerateCatLink(SpecialPage $specialPage, Title $catTitle, &$html)
Hook handler for the SpecialTrackingCategories::generateCatLink hook PhanUndeclaredProperty SpecialPa...
static getDataForJs()
Get exported data for the "ext.categoryTree" ResourceLoader module.
static onSkinBuildSidebar(Skin $skin, array &$sidebar)
Hook implementation for injecting a category tree into the sidebar.
Core functions for the CategoryTree extension, an AJAX based gadget to display the category structure...
static setHeaders(OutputPage $outputPage)
Add ResourceLoader modules to the OutputPage object.
static decodeBoolean( $value)
Helper function to convert a string to a boolean value.
static decodeMode( $mode)
static createCountString(IContextSource $context, Category $cat=null, $countMode)
Create a string which format the page, subcat and file counts of a category PhanParamReqAfterOpt $cat...
static capDepth( $mode, $depth)
Internal function to cap depth PhanPluginDuplicateConditionalNullCoalescing until PHP7 is required.
This is one of the Core classes and should be read at least once by any new developers.
PHP Parser - Processes wiki markup (which uses a more user-friendly syntax, such as "[[link]]" for ma...
Definition Parser.php:74
setFunctionHook( $id, callable $callback, $flags=0)
Create a function, e.g.
Definition Parser.php:5283
setHook( $tag, callable $callback)
Create an HTML-style tag, e.g.
Definition Parser.php:5189
The main skin class which provides methods and properties for all other skins.
Definition Skin.php:38
Parent class for all special pages.
getContext()
Gets the context this SpecialPage is executed in.
Represents a title within MediaWiki.
Definition Title.php:42
const NS_CATEGORY
Definition Defines.php:83
const DB_REPLICA
Definition defines.php:25
return true
Definition router.php:94