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

setRevisionModeState()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 3
ccs 3
cts 3
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 1
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 14
	public function __construct( Title $title, LanguageLinkAnnotator $languageLinkAnnotator, SiteLanguageLinksParserOutputAppender $siteLanguageLinksParserOutputAppender ) {
50 14
		$this->title = $title;
51 14
		$this->languageLinkAnnotator = $languageLinkAnnotator;
52 14
		$this->siteLanguageLinksParserOutputAppender = $siteLanguageLinksParserOutputAppender;
53 14
	}
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 13
	public function parse( $languageCode, $linkReference ) {
85
86 13
		if ( $this->inRevisionMode ) {
87 1
			return '';
88
		}
89
90 12
		if ( $this->interlanguageLinksHideState ) {
91 1
			return $this->createErrorMessageFor( 'sil-interlanguagelink-hideinterlanguagelinks' );
92
		}
93
94 12
		if ( !$this->isSupportedLanguage( $languageCode ) ) {
95 1
			return $this->createErrorMessageFor( 'sil-interlanguagelink-invalidlanguagecode', $languageCode );
96
		}
97
98 12
		$title = Title::newFromText( $linkReference );
99
100 12
		if ( $title === null ) {
101 1
			return $this->createErrorMessageFor( 'sil-interlanguageparser-linkreference-error', $linkReference );
102
		}
103
104 11
		$interlanguageLink = new InterlanguageLink(
105 11
			wfBCP47( $languageCode ),
106 11
			$this->siteLanguageLinksParserOutputAppender->getRedirectTargetFor( $title )
107 11
		);
108
109 11
		if ( $this->languageLinkAnnotator->hasDifferentLanguageAnnotation( $interlanguageLink ) ) {
110 2
			return $this->createErrorMessageFor( 'sil-interlanguagelink-multiplecalls-different-languagecode', $languageCode );
111
		}
112
113 11
		return $this->createSiteLanguageLinks( $interlanguageLink );
114
	}
115
116 11
	private function createSiteLanguageLinks( InterlanguageLink $interlanguageLink ) {
117
118 11
		$knownTargetLink = $this->siteLanguageLinksParserOutputAppender->tryAddLanguageTargetLinksToOutput(
119 11
			$interlanguageLink,
120 11
			$this->title
121 11
		);
122
123
		// If target is known we stop processing and output an error
124 11
		if ( $knownTargetLink ) {
125 2
			return $this->createErrorMessageFor(
126 2
				'sil-interlanguagelink-languagetargetcombination-exists',
127 2
				$interlanguageLink->getLanguageCode(),
128 2
				$interlanguageLink->getLinkReference()->getPrefixedText(),
129 2
				$knownTargetLink,
0 ignored issues
show
Bug introduced by
It seems like $knownTargetLink defined by $this->siteLanguageLinks...uageLink, $this->title) on line 118 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...
130 2
				$this->title->getPrefixedText()
131 2
			);
132
		}
133
134 10
		$this->languageLinkAnnotator->addAnnotationForInterlanguageLink(
135
			$interlanguageLink
136 10
		);
137
138 10
		return '<div class="sil-interlanguagelink"></div>';
139
	}
140
141 12
	private function isSupportedLanguage( $languageCode ) {
142
143 12
		$languageCode = trim( $languageCode );
144
145 12
		if ( strlen( $languageCode ) == 0 ) {
146 1
			return false;
147
		}
148
149 12
		return Language::isSupportedLanguage( $languageCode );
150
	}
151
152 4
	private function createErrorMessageFor( $messageKey, $arg1 = '', $arg2 = '', $arg3 = '',$arg4 = '' ) {
153 4
		return '<div class="smw-callout smw-callout-error">' . wfMessage(
154 4
			$messageKey,
155 4
			$arg1,
156 4
			$arg2,
157 4
			$arg3,
158
			$arg4
159 4
		)->inContentLanguage()->text() . '</div>';
160
	}
161
162
}
163