Merge "Perform a permission check on the title when changing the page language"
[lhc/web/wiklou.git] / includes / tidy / RemexCompatFormatter.php
1 <?php
2
3 namespace MediaWiki\Tidy;
4
5 use RemexHtml\HTMLData;
6 use RemexHtml\Serializer\HtmlFormatter;
7 use RemexHtml\Serializer\SerializerNode;
8
9 /**
10 * @internal
11 */
12 class RemexCompatFormatter extends HtmlFormatter {
13 private static $markedEmptyElements = [
14 'li' => true,
15 'p' => true,
16 'tr' => true,
17 ];
18
19 public function __construct( $options = [] ) {
20 parent::__construct( $options );
21 $this->attributeEscapes["\xc2\xa0"] = '&#160;';
22 unset( $this->attributeEscapes["&"] );
23 $this->textEscapes["\xc2\xa0"] = '&#160;';
24 unset( $this->textEscapes["&"] );
25 }
26
27 public function startDocument( $fragmentNamespace, $fragmentName ) {
28 return '';
29 }
30
31 public function element( SerializerNode $parent, SerializerNode $node, $contents ) {
32 $data = $node->snData;
33 if ( $data && $data->isPWrapper ) {
34 if ( $data->nonblankNodeCount ) {
35 return "<p>$contents</p>";
36 } else {
37 return $contents;
38 }
39 }
40
41 $name = $node->name;
42 $attrs = $node->attrs;
43 if ( isset( self::$markedEmptyElements[$name] ) && $attrs->count() === 0 ) {
44 if ( strspn( $contents, "\t\n\f\r " ) === strlen( $contents ) ) {
45 return "<{$name} class=\"mw-empty-elt\">$contents</{$name}>";
46 }
47 }
48
49 $s = "<$name";
50 foreach ( $attrs->getValues() as $attrName => $attrValue ) {
51 $encValue = strtr( $attrValue, $this->attributeEscapes );
52 $s .= " $attrName=\"$encValue\"";
53 }
54 if ( $node->namespace === HTMLData::NS_HTML && isset( $this->voidElements[$name] ) ) {
55 $s .= ' />';
56 return $s;
57 }
58
59 $s .= '>';
60 if ( $node->namespace === HTMLData::NS_HTML
61 && isset( $contents[0] ) && $contents[0] === "\n"
62 && isset( $this->prefixLfElements[$name] )
63 ) {
64 $s .= "\n$contents</$name>";
65 } else {
66 $s .= "$contents</$name>";
67 }
68 return $s;
69 }
70 }