Completed
Push — master ( 97f192...39c216 )
by mw
9s
created

InterlanguageLinkParserFunction::parse()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 3

Importance

Changes 9
Bugs 1 Features 2
Metric Value
c 9
b 1
f 2
dl 0
loc 17
ccs 10
cts 10
cp 1
rs 9.4285
cc 3
eloc 9
nc 3
nop 2
crap 3
1
<?php
2
3
namespace SIL;
4
5
use Onoi\Cache\CacheFactory;
6
use Title;
7
use Language;
8
9
/**
10
 * @license GNU GPL v2+
11
 * @since 1.0
12
 *
13
 * @author mwjames
14
 */
15
class InterlanguageLinkParserFunction {
16
17
	/**
18
	 * @var Title
19
	 */
20
	private $title;
21
22
	/**
23
	 * @var LanguageLinkAnnotator
24
	 */
25
	private $languageLinkAnnotator;
26
27
	/**
28
	 * @var SiteLanguageLinksParserOutputAppender
29
	 */
30
	private $siteLanguageLinksParserOutputAppender;
31
32
	/**
33
	 * @var boolean
34
	 */
35
	private $interlanguageLinksHideState = false;
36
37
	/**
38
	 * @var boolean
39
	 */
40
	private $inRevisionMode = false;
41
42
	/**
43
	 * @since 1.0
44
	 *
45
	 * @param Title $title
46
	 * @param LanguageLinkAnnotator $languageLinkAnnotator
47
	 * @param SiteLanguageLinksParserOutputAppender $siteLanguageLinksParserOutputAppender
48
	 */
49 15
	public function __construct( Title $title, LanguageLinkAnnotator $languageLinkAnnotator, SiteLanguageLinksParserOutputAppender $siteLanguageLinksParserOutputAppender ) {
50 15
		$this->title = $title;
51 15
		$this->languageLinkAnnotator = $languageLinkAnnotator;
52 15
		$this->siteLanguageLinksParserOutputAppender = $siteLanguageLinksParserOutputAppender;
53 15
	}
54
55
	/**
56
	 * @since 1.0
57
	 *
58
	 * @param boolean $interlanguageLinksHideState
59
	 */
60 10
	public function setInterlanguageLinksHideState( $interlanguageLinksHideState ) {
61 10
		$this->interlanguageLinksHideState = $interlanguageLinksHideState;
62 10
	}
63
64
	/**
65
	 * Revision mode means either in preview or edit state which is not to be
66
	 * handled to avoid storage of yet unprocessed data in cache.
67
	 *
68
	 * @since 1.2
69
	 *
70
	 * @param boolean $inRevisionMode
71
	 */
72 8
	public function setRevisionModeState( $inRevisionMode ) {
73 8
		$this->inRevisionMode = $inRevisionMode;
74 8
	}
75
76
	/**
77
	 * @since 1.0
78
	 *
79
	 * @param string $languageCode
80
	 * @param string $linkReference
81
	 *
82
	 * @return null|string
83
	 */
84 14
	public function parse( $languageCode, $linkReference ) {
85
86 14
		if ( !( $title = $this->getTitleFrom( $languageCode, $linkReference ) ) instanceof Title ) {
87 3
			return $title;
88
		}
89
90 11
		$interlanguageLink = new InterlanguageLink(
91 11
			wfBCP47( $languageCode ),
92 11
			$this->siteLanguageLinksParserOutputAppender->getRedirectTargetFor( $title )
93 11
		);
94
95 11
		if ( $this->languageLinkAnnotator->hasDifferentLanguageAnnotation( $interlanguageLink ) ) {
96 2
			return $this->createErrorMessageFor( 'sil-interlanguagelink-multiplecalls-different-languagecode', $languageCode );
97
		}
98
99 11
		return $this->createSiteLanguageLinks( $interlanguageLink );
100
	}
101
102 14
	private function getTitleFrom( $languageCode, $linkReference ) {
103
104 14
		if ( $this->inRevisionMode || !$this->languageLinkAnnotator->canAddAnnotation() ) {
105 2
			return '';
106
		}
107
108 12
		if ( $this->interlanguageLinksHideState ) {
109 1
			return $this->createErrorMessageFor( 'sil-interlanguagelink-hideinterlanguagelinks' );
110
		}
111
112 12
		if ( !$this->isSupportedLanguage( $languageCode ) ) {
113 1
			return $this->createErrorMessageFor( 'sil-interlanguagelink-invalidlanguagecode', $languageCode );
114
		}
115
116 12
		$title = Title::newFromText( $linkReference );
117
118 12
		if ( $title === null ) {
119 1
			return $this->createErrorMessageFor( 'sil-interlanguageparser-linkreference-error', $linkReference );
120
		}
121
122 11
		return $title;
123
	}
124
125 11
	private function createSiteLanguageLinks( InterlanguageLink $interlanguageLink ) {
126
127 11
		$knownTargetLink = $this->siteLanguageLinksParserOutputAppender->tryAddLanguageTargetLinksToOutput(
128 11
			$interlanguageLink,
129 11
			$this->title
130 11
		);
131
132
		// If target is known we stop processing and output an error
133 11
		if ( $knownTargetLink ) {
134 2
			return $this->createErrorMessageFor(
135 2
				'sil-interlanguagelink-languagetargetcombination-exists',
136 2
				$interlanguageLink->getLanguageCode(),
137 2
				$interlanguageLink->getLinkReference()->getPrefixedText(),
138 2
				$knownTargetLink,
0 ignored issues
show
Bug introduced by
It seems like $knownTargetLink defined by $this->siteLanguageLinks...uageLink, $this->title) on line 127 can also be of type boolean; however, SIL\InterlanguageLinkPar...createErrorMessageFor() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
139 2
				$this->title->getPrefixedText()
140 2
			);
141
		}
142
143 10
		$this->languageLinkAnnotator->addAnnotationForInterlanguageLink(
144
			$interlanguageLink
145 10
		);
146
147 10
		return '<div class="sil-interlanguagelink"></div>';
148
	}
149
150 12
	private function isSupportedLanguage( $languageCode ) {
151
152 12
		$languageCode = trim( $languageCode );
153
154 12
		if ( strlen( $languageCode ) == 0 ) {
155 1
			return false;
156
		}
157
158 12
		return Language::isSupportedLanguage( $languageCode );
159
	}
160
161 4
	private function createErrorMessageFor( $messageKey, $arg1 = '', $arg2 = '', $arg3 = '',$arg4 = '' ) {
162 4
		return '<div class="smw-callout smw-callout-error">' . wfMessage(
163 4
			$messageKey,
164 4
			$arg1,
165 4
			$arg2,
166 4
			$arg3,
167
			$arg4
168 4
		)->inContentLanguage()->text() . '</div>';
169
	}
170
171
}
172