summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/ParserFunctions/SectionTag.php
blob: f37aea24b4b5fc9d70c585708905bfd5109daad3 (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
<?php

namespace SMW\ParserFunctions;

use Parser;
use PPFrame;
use Html;

/**
 * To support the generation of <section> ... </section>
 *
 * @license GNU GPL v2+
 * @since 3.0
 *
 * @author mwjames
 */
class SectionTag {

	/**
	 * @var Parser
	 */
	private $parser;

	/**
	 * @var PPFrame
	 */
	private $frame;

	/**
	 * @since 3.0
	 *
	 * @param Parser $parser
	 * @param PPFrame $frame
	 */
	public function __construct( Parser $parser, PPFrame $frame ) {
		$this->parser = $parser;
		$this->frame = $frame;
	}

	/**
	 * @since 3.0
	 *
	 * @param Parser $parser
	 * @param boolean $supportSectionTag
	 *
	 * @return boolean
	 */
	public static function register( Parser $parser, $supportSectionTag = true ) {

		if ( $supportSectionTag === false ) {
			return false;
		}

		$parser->setHook( 'section', function( $input, array $args, Parser $parser, PPFrame $frame ) {
			return ( new self( $parser, $frame ) )->parse( $input, $args );
		} );

		return true;
	}

	/**
	 * @since 3.0
	 *
	 * @param string $input
	 * @param array $args
	 *
	 * @return string
	 */
	public function parse( $input, array $args ) {

		$attributes = [];
		$title = $this->parser->getTitle();

		foreach( $args as $name => $value ) {
			$value = htmlspecialchars( $value );

			if ( $name === 'class' ) {
				$attributes['class'] = $value;
			}

			if ( $name === 'id' ) {
				$attributes['id'] = $value;
			}
		}

		if ( $title !== null && $title->getNamespace() === SMW_NS_PROPERTY ) {
			$attributes['class'] = ( isset( $attributes['class'] ) ? ' ' : '' ) . "smw-property-specification";
		}

		return Html::rawElement(
			'section',
			$attributes,
			$this->parser->recursiveTagParse( $input, $this->frame )
		);
	}

}