Completed
Push — master ( 92154a...3b5a1d )
by mw
03:20
created

createSiteLanguageLinks()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 2

Importance

Changes 6
Bugs 0 Features 0
Metric Value
c 6
b 0
f 0
dl 0
loc 24
ccs 16
cts 16
cp 1
rs 8.9714
cc 2
eloc 14
nc 2
nop 1
crap 2
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
	 * @since 1.0
39
	 *
40
	 * @param Title $title
41
	 * @param LanguageLinkAnnotator $languageLinkAnnotator
42
	 * @param SiteLanguageLinksParserOutputAppender $siteLanguageLinksParserOutputAppender
43
	 */
44 13
	public function __construct( Title $title, LanguageLinkAnnotator $languageLinkAnnotator, SiteLanguageLinksParserOutputAppender $siteLanguageLinksParserOutputAppender ) {
45 13
		$this->title = $title;
46 13
		$this->languageLinkAnnotator = $languageLinkAnnotator;
47 13
		$this->siteLanguageLinksParserOutputAppender = $siteLanguageLinksParserOutputAppender;
48 13
	}
49
50
	/**
51
	 * @since 1.0
52
	 *
53
	 * @param boolean $interlanguageLinksHideState
54
	 */
55 10
	public function setInterlanguageLinksHideState( $interlanguageLinksHideState ) {
56 10
		$this->interlanguageLinksHideState = $interlanguageLinksHideState;
57 10
	}
58
59
	/**
60
	 * @since 1.0
61
	 *
62
	 * @param string $languageCode
63
	 * @param string $linkReference
64
	 *
65
	 * @return null|string
66
	 */
67 12
	public function parse( $languageCode, $linkReference ) {
68
69 12
		if ( $this->interlanguageLinksHideState ) {
70 1
			return $this->createErrorMessageFor( 'sil-interlanguagelink-hideinterlanguagelinks' );
71
		}
72
73 12
		if ( !$this->isSupportedLanguage( $languageCode ) ) {
74 1
			return $this->createErrorMessageFor( 'sil-interlanguagelink-invalidlanguagecode', $languageCode );
75
		}
76
77 12
		$title = Title::newFromText( $linkReference );
78
79 12
		if ( $title === null ) {
80 1
			return $this->createErrorMessageFor( 'sil-interlanguageparser-linkreference-error', $linkReference );
81
		}
82
83 11
		$interlanguageLink = new InterlanguageLink(
84 11
			wfBCP47( $languageCode ),
85 11
			$this->siteLanguageLinksParserOutputAppender->getRedirectTargetFor( $title )
86 11
		);
87
88 11
		if ( $this->languageLinkAnnotator->hasDifferentLanguageAnnotation( $interlanguageLink ) ) {
89 2
			return $this->createErrorMessageFor( 'sil-interlanguagelink-multiplecalls-different-languagecode', $languageCode );
90
		}
91
92 11
		return $this->createSiteLanguageLinks( $interlanguageLink );
93
	}
94
95 11
	private function createSiteLanguageLinks( InterlanguageLink $interlanguageLink ) {
96
97 11
		$knownTargetLink = $this->siteLanguageLinksParserOutputAppender->tryAddLanguageTargetLinksToOutput(
98 11
			$interlanguageLink,
99 11
			$this->title
100 11
		);
101
102
		// If target is known we stop processing and output an error
103 11
		if ( $knownTargetLink ) {
104 2
			return $this->createErrorMessageFor(
105 2
				'sil-interlanguagelink-languagetargetcombination-exists',
106 2
				$interlanguageLink->getLanguageCode(),
107 2
				$interlanguageLink->getLinkReference()->getPrefixedText(),
108 2
				$knownTargetLink,
109 2
				$this->title->getPrefixedText()
110 2
			);
111
		}
112
113 10
		$this->languageLinkAnnotator->addAnnotationForInterlanguageLink(
114
			$interlanguageLink
115 10
		);
116
117 10
		return '<div class="sil-interlanguagelink"></div>';
118
	}
119
120 12
	private function isSupportedLanguage( $languageCode ) {
121
122 12
		$languageCode = trim( $languageCode );
123
124 12
		if ( strlen( $languageCode ) == 0 ) {
125 1
			return false;
126
		}
127
128 12
		return Language::isSupportedLanguage( $languageCode );
129
	}
130
131 4
	private function createErrorMessageFor( $messageKey, $arg1 = '', $arg2 = '', $arg3 = '',$arg4 = '' ) {
132 4
		return '<div class="smw-callout smw-callout-error">' . wfMessage(
133 4
			$messageKey,
134 4
			$arg1,
135 4
			$arg2,
136 4
			$arg3,
137
			$arg4
138 4
		)->inContentLanguage()->text() . '</div>';
139
	}
140
141
}
142