Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 34
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
DateFormatterConfig
0.00% covered (danger)
0.00%
0 / 34
0.00% covered (danger)
0.00%
0 / 2
156
0.00% covered (danger)
0.00%
0 / 1
 getData
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 getDataForLang
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 1
132
1<?php
2
3namespace MediaWiki\ResourceLoader;
4
5use MediaWiki\Config\Config;
6use MediaWiki\Language\Language;
7use MediaWiki\Language\LanguageCode;
8use MediaWiki\MainConfigNames;
9use MediaWiki\MediaWikiServices;
10
11/**
12 * @internal
13 */
14class DateFormatterConfig extends Module {
15    /**
16     * Callback for mediawiki.DateFormatter/config.json
17     *
18     * @internal
19     * @param Context $context
20     * @param Config $config
21     * @return array
22     */
23    public static function getData( Context $context, Config $config ) {
24        $lang = MediaWikiServices::getInstance()->getLanguageFactory()
25            ->getLanguage( $context->getLanguage() );
26        return self::getDataForLang( $lang, $config );
27    }
28
29    /**
30     * Get configuration data for DateFormatter given parameters
31     *
32     * @internal
33     * @param Language $lang
34     * @param Config $config
35     * @return array
36     */
37    public static function getDataForLang( Language $lang, Config $config ) {
38        $locales = [ $lang->getHtmlCode() ];
39        $fallbacks = $lang->getFallbackLanguages();
40        foreach ( $fallbacks as $code ) {
41            $locales[] = LanguageCode::bcp47( $code );
42        }
43
44        // Discover which fields are required
45        $formats = $lang->getJsDateFormats();
46        $haveField = [];
47        foreach ( $formats as $format ) {
48            $pattern = $format['pattern'] ?? '';
49            foreach ( [ 'mwMonth', 'mwMonthGen', 'mwMonthAbbrev' ] as $field ) {
50                if ( str_contains( $pattern, "{$field}" ) ) {
51                    $haveField[$field] = true;
52                }
53            }
54        }
55
56        // Include only the required month data
57        if ( $haveField ) {
58            $months = [ [] ];
59            for ( $i = 1; $i <= 12; $i++ ) {
60                $data = [
61                    isset( $haveField['mwMonth'] ) ? $lang->getMonthName( $i ) : '',
62                    isset( $haveField['mwMonthGen'] ) ? $lang->getMonthNameGen( $i ) : '',
63                    isset( $haveField['mwMonthAbbrev'] ) ? $lang->getMonthAbbreviation( $i ) : ''
64                ];
65                // Trim the end of the array
66                while ( end( $data ) === '' ) {
67                    unset( $data[ array_key_last( $data ) ] );
68                }
69                $months[] = $data;
70            }
71        } else {
72            $months = [];
73        }
74
75        return [
76            'locales' => $locales,
77            'formats' => $formats,
78            'defaultStyle' => $lang->getDefaultDateFormat(),
79            'localZone' => $config->get( MainConfigNames::Localtimezone ),
80            'localOffset' => (int)$config->get( MainConfigNames::LocalTZoffset ),
81            'months' => $months
82        ];
83    }
84}