Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
ParserHooks
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 2
72
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onParserAfterTidy
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
56
1<?php
2/**
3 * DiscussionTools parser hooks
4 *
5 * @file
6 * @ingroup Extensions
7 * @license MIT
8 */
9
10namespace MediaWiki\Extension\DiscussionTools\Hooks;
11
12use Config;
13use ConfigFactory;
14use MediaWiki\Extension\DiscussionTools\CommentFormatter;
15use MediaWiki\Hook\ParserAfterTidyHook;
16use Parser;
17
18class ParserHooks implements ParserAfterTidyHook {
19
20    private Config $config;
21
22    public function __construct(
23        ConfigFactory $configFactory
24    ) {
25        $this->config = $configFactory->makeConfig( 'discussiontools' );
26    }
27
28    /**
29     * @see https://www.mediawiki.org/wiki/Manual:Hooks/ParserAfterTidy
30     *
31     * @param Parser $parser
32     * @param string &$text
33     */
34    public function onParserAfterTidy( $parser, &$text ) {
35        if ( $parser->getOptions()->getInterfaceMessage() ) {
36            return;
37        }
38
39        $title = $parser->getTitle();
40        $pout = $parser->getOutput();
41
42        // This condition must be unreliant on current enablement config or user preference.
43        // In other words, include parser output of talk pages with DT disabled.
44        //
45        // This is similar to HookUtils::isAvailableForTitle, but instead of querying the
46        // database for the latest metadata of a page that exists, we check metadata of
47        // the given ParserOutput object only (this runs before the edit is saved).
48        if ( $title->isTalkPage() || $pout->getNewSection() ) {
49            $talkExpiry = $this->config->get( 'DiscussionToolsTalkPageParserCacheExpiry' );
50            // Override parser cache expiry of talk pages (T280605).
51            // Note, this can only shorten it. MediaWiki ignores values higher than the default.
52            if ( $talkExpiry > 0 ) {
53                $pout->updateCacheExpiry( $talkExpiry );
54            }
55        }
56
57        // Always apply the DOM transform if DiscussionTools are available for this page,
58        // to allow linking to individual comments from Echo 'mention' and 'edit-user-talk'
59        // notifications (T253082, T281590), and to reduce parser cache fragmentation (T279864).
60        // The extra buttons are hidden in CSS (ext.discussionTools.init.styles module) when
61        // the user doesn't have DiscussionTools features enabled.
62        if ( HookUtils::isAvailableForTitle( $title ) ) {
63            // This modifies $text
64            CommentFormatter::addDiscussionTools( $text, $pout, $parser );
65
66            if ( $parser->getOptions()->getIsPreview() ) {
67                $text = CommentFormatter::removeInteractiveTools( $text );
68            }
69
70            $pout->addModuleStyles( [
71                'ext.discussionTools.init.styles',
72            ] );
73        }
74    }
75}