Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 33
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 / 33
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 / 30
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        foreach ( $lang->getFallbackLanguages() as $code ) {
40            $locales[] = LanguageCode::bcp47( $code );
41        }
42
43        // Discover which fields are required
44        $formats = $lang->getJsDateFormats();
45        $haveField = [];
46        foreach ( $formats as $format ) {
47            $pattern = $format['pattern'] ?? '';
48            foreach ( [ 'mwMonth', 'mwMonthGen', 'mwMonthAbbrev' ] as $field ) {
49                if ( str_contains( $pattern, '{' . $field . '}' ) ) {
50                    $haveField[$field] = true;
51                }
52            }
53        }
54
55        $months = [];
56        // Include only the required month data
57        if ( $haveField ) {
58            // Dummy entry for non-existing month zero
59            $months[] = [];
60            for ( $i = 1; $i <= 12; $i++ ) {
61                // The three array elements are expected in this order in DateFormatter.js
62                $data = [
63                    isset( $haveField['mwMonth'] ) ? $lang->getMonthName( $i ) : '',
64                    isset( $haveField['mwMonthGen'] ) ? $lang->getMonthNameGen( $i ) : '',
65                    isset( $haveField['mwMonthAbbrev'] ) ? $lang->getMonthAbbreviation( $i ) : ''
66                ];
67                // Trim the end of the array
68                while ( array_last( $data ) === '' ) {
69                    array_pop( $data );
70                }
71                $months[$i] = $data;
72            }
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}