Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
90.91% |
40 / 44 |
|
50.00% |
1 / 2 |
CRAP | |
0.00% |
0 / 1 |
RemexDriver | |
90.91% |
40 / 44 |
|
50.00% |
1 / 2 |
6.03 | |
0.00% |
0 / 1 |
__construct | |
100.00% |
14 / 14 |
|
100.00% |
1 / 1 |
1 | |||
tidy | |
86.67% |
26 / 30 |
|
0.00% |
0 / 1 |
5.06 |
1 | <?php |
2 | |
3 | namespace MediaWiki\Tidy; |
4 | |
5 | use MediaWiki\Config\ServiceOptions; |
6 | use MediaWiki\MainConfigNames; |
7 | use Wikimedia\RemexHtml\HTMLData; |
8 | use Wikimedia\RemexHtml\Serializer\Serializer; |
9 | use Wikimedia\RemexHtml\Serializer\SerializerWithTracer; |
10 | use Wikimedia\RemexHtml\Tokenizer\Tokenizer; |
11 | use Wikimedia\RemexHtml\TreeBuilder\Dispatcher; |
12 | use Wikimedia\RemexHtml\TreeBuilder\TreeBuilder; |
13 | use Wikimedia\RemexHtml\TreeBuilder\TreeMutationTracer; |
14 | |
15 | class RemexDriver extends TidyDriverBase { |
16 | /** @var bool */ |
17 | private $treeMutationTrace; |
18 | /** @var bool */ |
19 | private $serializerTrace; |
20 | /** @var bool */ |
21 | private $mungerTrace; |
22 | /** @var bool */ |
23 | private $pwrap; |
24 | /** @var bool */ |
25 | private $enableLegacyMediaDOM; |
26 | |
27 | /** @internal */ |
28 | public const CONSTRUCTOR_OPTIONS = [ |
29 | MainConfigNames::TidyConfig, |
30 | MainConfigNames::ParserEnableLegacyMediaDOM, |
31 | ]; |
32 | |
33 | public function __construct( ServiceOptions $options ) { |
34 | $options->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS ); |
35 | $config = $options->get( MainConfigNames::TidyConfig ); |
36 | $this->enableLegacyMediaDOM = $options->get( MainConfigNames::ParserEnableLegacyMediaDOM ); |
37 | $config += [ |
38 | 'treeMutationTrace' => false, |
39 | 'serializerTrace' => false, |
40 | 'mungerTrace' => false, |
41 | 'pwrap' => true |
42 | ]; |
43 | $this->treeMutationTrace = $config['treeMutationTrace']; |
44 | $this->serializerTrace = $config['serializerTrace']; |
45 | $this->mungerTrace = $config['mungerTrace']; |
46 | $this->pwrap = $config['pwrap']; |
47 | parent::__construct( $config ); |
48 | } |
49 | |
50 | /** @inheritDoc */ |
51 | public function tidy( $text, ?callable $textProcessor = null ) { |
52 | $traceCallback = static function ( $msg ) { |
53 | wfDebug( "RemexHtml: $msg" ); |
54 | }; |
55 | $formatter = new RemexCompatFormatter( [ 'textProcessor' => $textProcessor ] ); |
56 | if ( $this->serializerTrace ) { |
57 | $serializer = new SerializerWithTracer( $formatter, null, $traceCallback ); |
58 | } else { |
59 | $serializer = new Serializer( $formatter ); |
60 | } |
61 | if ( $this->pwrap ) { |
62 | $munger = new RemexCompatMunger( $serializer, $this->mungerTrace ); |
63 | } else { |
64 | $munger = $serializer; |
65 | } |
66 | if ( $this->treeMutationTrace ) { |
67 | $tracer = new TreeMutationTracer( $munger, $traceCallback ); |
68 | } else { |
69 | $tracer = $munger; |
70 | } |
71 | $treeBuilderClass = $this->enableLegacyMediaDOM ? TreeBuilder::class : RemexCompatBuilder::class; |
72 | $treeBuilder = new $treeBuilderClass( $tracer, [ |
73 | 'ignoreErrors' => true, |
74 | 'ignoreNulls' => true, |
75 | ] ); |
76 | $dispatcher = new Dispatcher( $treeBuilder ); |
77 | $tokenizer = new Tokenizer( $dispatcher, $text, [ |
78 | 'ignoreErrors' => true, |
79 | 'ignoreCharRefs' => true, |
80 | 'ignoreNulls' => true, |
81 | 'skipPreprocess' => true, |
82 | ] ); |
83 | |
84 | $tokenizer->execute( [ |
85 | 'fragmentNamespace' => HTMLData::NS_HTML, |
86 | 'fragmentName' => 'body' |
87 | ] ); |
88 | return $serializer->getResult(); |
89 | } |
90 | } |