]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/tidy/RemexCompatFormatter.php
MediaWiki 1.30.2-scripts
[autoinstallsdev/mediawiki.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 }