summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/Query/ResultPrinters/ListResultPrinter/ValueTextsBuilder.php
blob: f328772d4bac8d36722afe95203644b066574565 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php

namespace SMW\Query\ResultPrinters\ListResultPrinter;

use Linker;
use SMWDataValue;
use SMWResultArray;

/**
 * Class ValueTextsBuilder
 *
 * @license GNU GPL v2+
 * @since 3.0
 *
 * @author Stephan Gambke
 */
class ValueTextsBuilder {

	use ParameterDictionaryUser;

	private $linker;

	/**
	 * @param SMWResultArray $field
	 * @param int $column
	 *
	 * @return string
	 */
	public function getValuesText( SMWResultArray $field, $column = 0 ) {

		$valueTexts = $this->getValueTexts( $field, $column );

		return join( $this->get( 'valuesep' ), $valueTexts );

	}

	/**
	 * @param SMWResultArray $field
	 * @param int $column
	 *
	 * @return string[]
	 */
	private function getValueTexts( SMWResultArray $field, $column ) {

		$valueTexts = [];

		$field->reset();

		while ( ( $dataValue = $field->getNextDataValue() ) !== false ) {

			$valueTexts[] =
				$this->get( 'value-open-tag' ) .
				$this->getValueText( $dataValue, $column ) .
				$this->get( 'value-close-tag' );
		}

		return $valueTexts;
	}

	/**
	 * @param SMWDataValue $value
	 * @param int $column
	 *
	 * @return string
	 */
	private function getValueText( SMWDataValue $value, $column = 0 ) {

		$text = $value->getShortText( SMW_OUTPUT_WIKI, $this->getLinkerForColumn( $column ) );

		return $this->sanitizeValueText( $text );
	}

	/**
	 * Depending on current linking settings, returns a linker object
	 * for making hyperlinks or NULL if no links should be created.
	 *
	 * @param int $columnNumber Column number
	 *
	 * @return \Linker|null
	 */
	private function getLinkerForColumn( $columnNumber ) {

		if ( ( $columnNumber === 0 && $this->get( 'link-first' ) ) ||
			( $columnNumber > 0 && $this->get( 'link-others' ) ) ) {
			return $this->getLinker();
		}

		return null;
	}

	/**
	 * @return Linker
	 */
	protected function getLinker() {
		return $this->linker;
	}

	/**
	 * @param Linker $linker
	 */
	public function setLinker( Linker $linker ) {
		$this->linker = $linker;
	}

	/**
	 * @param $text
	 *
	 * @return string
	 */
	private function sanitizeValueText( $text ) {

		if ( $this->isSimpleList() ) {
			return $text;
		}

		return \Sanitizer::removeHTMLtags( $text, null, [], [], [ 'table', 'tr', 'th', 'td', 'dl', 'dd', 'ul', 'li', 'ol' ] );
	}

	/**
	 * @return bool
	 */
	private function isSimpleList() {
		$format = $this->get( 'format' );
		return $format !== 'ul' && $format !== 'ol';
	}

}