diff options
Diffstat (limited to 'www/wiki/includes/tidy/RemexCompatFormatter.php')
-rw-r--r-- | www/wiki/includes/tidy/RemexCompatFormatter.php | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/www/wiki/includes/tidy/RemexCompatFormatter.php b/www/wiki/includes/tidy/RemexCompatFormatter.php new file mode 100644 index 00000000..c8a715b1 --- /dev/null +++ b/www/wiki/includes/tidy/RemexCompatFormatter.php @@ -0,0 +1,70 @@ +<?php + +namespace MediaWiki\Tidy; + +use RemexHtml\HTMLData; +use RemexHtml\Serializer\HtmlFormatter; +use RemexHtml\Serializer\SerializerNode; + +/** + * @internal + */ +class RemexCompatFormatter extends HtmlFormatter { + private static $markedEmptyElements = [ + 'li' => true, + 'p' => true, + 'tr' => true, + ]; + + public function __construct( $options = [] ) { + parent::__construct( $options ); + $this->attributeEscapes["\xc2\xa0"] = ' '; + unset( $this->attributeEscapes["&"] ); + $this->textEscapes["\xc2\xa0"] = ' '; + unset( $this->textEscapes["&"] ); + } + + public function startDocument( $fragmentNamespace, $fragmentName ) { + return ''; + } + + public function element( SerializerNode $parent, SerializerNode $node, $contents ) { + $data = $node->snData; + if ( $data && $data->isPWrapper ) { + if ( $data->nonblankNodeCount ) { + return "<p>$contents</p>"; + } else { + return $contents; + } + } + + $name = $node->name; + $attrs = $node->attrs; + if ( isset( self::$markedEmptyElements[$name] ) && $attrs->count() === 0 ) { + if ( strspn( $contents, "\t\n\f\r " ) === strlen( $contents ) ) { + return "<{$name} class=\"mw-empty-elt\">$contents</{$name}>"; + } + } + + $s = "<$name"; + foreach ( $attrs->getValues() as $attrName => $attrValue ) { + $encValue = strtr( $attrValue, $this->attributeEscapes ); + $s .= " $attrName=\"$encValue\""; + } + if ( $node->namespace === HTMLData::NS_HTML && isset( $this->voidElements[$name] ) ) { + $s .= ' />'; + return $s; + } + + $s .= '>'; + if ( $node->namespace === HTMLData::NS_HTML + && isset( $contents[0] ) && $contents[0] === "\n" + && isset( $this->prefixLfElements[$name] ) + ) { + $s .= "\n$contents</$name>"; + } else { + $s .= "$contents</$name>"; + } + return $s; + } +} |