Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
LabelLookup
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
2 / 2
4
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getLabelForTitle
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3declare( strict_types = 1 );
4
5namespace EntitySchema\DataAccess;
6
7use MediaWiki\Page\PageIdentity;
8use Wikibase\DataModel\Term\TermFallback;
9use Wikibase\Lib\LanguageFallbackChainFactory;
10
11/**
12 * Lookup for EntitySchema labels, with language fallbacks applied.
13 *
14 * @license GPL-2.0-or-later
15 */
16class LabelLookup {
17
18    private FullViewSchemaDataLookup $fullViewSchemaDataLookup;
19
20    private LanguageFallbackChainFactory $languageFallbackChainFactory;
21
22    public function __construct(
23        FullViewSchemaDataLookup $fullViewSchemaDataLookup,
24        LanguageFallbackChainFactory $languageFallbackChainFactory
25    ) {
26        $this->fullViewSchemaDataLookup = $fullViewSchemaDataLookup;
27        $this->languageFallbackChainFactory = $languageFallbackChainFactory;
28    }
29
30    /**
31     * Look up the label of the EntitySchema with the given title, if any.
32     * Language fallbacks are applied based on the given language code.
33     *
34     * @param PageIdentity $title
35     * @param string $langCode
36     * @return TermFallback|null The label, or null if no label or EntitySchema was found.
37     */
38    public function getLabelForTitle( PageIdentity $title, string $langCode ): ?TermFallback {
39        $schemaData = $this->fullViewSchemaDataLookup->getFullViewSchemaDataForTitle( $title );
40        if ( $schemaData === null ) {
41            return null;
42        }
43
44        $chain = $this->languageFallbackChainFactory->newFromLanguageCode( $langCode );
45        $preferredLabel = $chain->extractPreferredValue( array_map(
46            fn ( $nameBadge ) => $nameBadge->label,
47            $schemaData->nameBadges
48        ) );
49        if ( $preferredLabel !== null ) {
50            return new TermFallback(
51                $langCode,
52                $preferredLabel['value'],
53                $preferredLabel['language'],
54                $preferredLabel['source']
55            );
56        } else {
57            return null;
58        }
59    }
60}