Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 65
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
ParserHook
0.00% covered (danger)
0.00%
0 / 65
0.00% covered (danger)
0.00%
0 / 4
306
0.00% covered (danger)
0.00%
0 / 1
 sourceToDom
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
90
 processAttributeEmbeddedHTML
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 domToWikitext
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
30
 getConfig
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2declare( strict_types = 1 );
3
4namespace Wikimedia\Parsoid\ParserTests;
5
6use Closure;
7use Error;
8use Wikimedia\Parsoid\DOM\DocumentFragment;
9use Wikimedia\Parsoid\DOM\Element;
10use Wikimedia\Parsoid\Ext\ExtensionModule;
11use Wikimedia\Parsoid\Ext\ExtensionTagHandler;
12use Wikimedia\Parsoid\Ext\ParsoidExtensionAPI;
13use Wikimedia\Parsoid\Utils\DOMCompat;
14use Wikimedia\Parsoid\Utils\DOMDataUtils;
15use Wikimedia\Parsoid\Utils\WTUtils;
16
17/**
18 * See tests/parser/ParserTestParserHook.php in core.
19 */
20class ParserHook extends ExtensionTagHandler implements ExtensionModule {
21
22    /** @inheritDoc */
23    public function sourceToDom(
24        ParsoidExtensionAPI $extApi, string $content, array $args
25    ): DocumentFragment {
26        $extName = $extApi->extTag->getName();
27        if ( $extApi->extTag->isSelfClosed() ) {
28            $content = null;
29        }
30        switch ( $extName ) {
31            case 'tag':
32            case 'tåg':
33                return $extApi->htmlToDom(
34                    "<pre>\n" .
35                        var_export( $content, true ) . "\n" .
36                        var_export( $extApi->extArgsToArray( $args ), true ) . "\n" .
37                    "</pre>"
38                );
39
40            case 'statictag':
41                // FIXME: Choose a better DOM representation that doesn't mess with
42                // newline constraints.
43                return $extApi->htmlToDom( '<span />' );
44
45            case 'asidetag':
46                // T278565
47                return $extApi->htmlToDom( '<aside>Some aside content</aside>' );
48
49            case 'pwraptest':
50                return $extApi->htmlToDom( '<!--CMT--><style>p{}</style>' );
51
52            case 'spantag':
53                // "Transparent" tag which wraps wikitext in a <span>;
54                // useful in testing various parsoid wrapping scenarios
55                // (we used to use <ref> for this)
56                // NOTE: This tag disables p-wrapping and indent-pre transforms.
57                return $extApi->extTagToDOM( $args, $content, [
58                    'wrapperTag' => 'span',
59                    'parseOpts' => [
60                        'extTag' => $extName,
61                        'context' => 'inline',
62                    ],
63                ] );
64
65            default:
66                throw new Error( "Unexpected tag name: $extName in ParserHook" );
67        }
68    }
69
70    /** @inheritDoc */
71    public function processAttributeEmbeddedHTML(
72        ParsoidExtensionAPI $extApi, Element $elt, Closure $proc
73    ): void {
74        $dataMw = DOMDataUtils::getDataMw( $elt );
75        if ( isset( $dataMw->body->html ) ) {
76            $dataMw->body->html = $proc( $dataMw->body->html );
77        }
78    }
79
80    /** @inheritDoc */
81    public function domToWikitext(
82        ParsoidExtensionAPI $extApi, Element $node, bool $wrapperUnmodified
83    ) {
84        $dataMw = DOMDataUtils::getDataMw( $node );
85        $extName = WTUtils::getExtTagName( $node ) ?? $dataMw->name;
86        if ( $extName !== 'spantag' ) {
87            return false; // use default serialization
88        }
89        $html2wtOpts = [
90            'extName' => $extName,
91            // FIXME: One-off PHP parser state leak. This needs a better solution.
92            'inPHPBlock' => true
93        ];
94        $src = '';
95        if ( $wrapperUnmodified && isset( $dataMw->body->extsrc ) ) {
96            $src = $dataMw->body->extsrc;
97        } elseif ( isset( $dataMw->body->html ) ) {
98            // First look for the extension's content in data-mw.body.html
99            $src = $extApi->htmlToWikitext( $html2wtOpts, $dataMw->body->html );
100        } else {
101            $src = $extApi->htmlToWikitext( $html2wtOpts, DOMCompat::getInnerHTML( $node ) );
102        }
103        return "<$extName>" . $src . "</$extName>";
104    }
105
106    /** @inheritDoc */
107    public function getConfig(): array {
108        return [
109            'name' => 'ParserHook',
110            'tags' => [
111                [ 'name' => 'tag', 'handler' => self::class ],
112                [ 'name' => 'tåg', 'handler' => self::class ],
113                [ 'name' => 'statictag', 'handler' => self::class ],
114                [ 'name' => 'asidetag', 'handler' => self::class ],
115                [ 'name' => 'pwraptest', 'handler' => self::class ],
116                [ 'name' => 'spantag', 'handler' => self::class,
117                  'options' => [
118                      'wt2html' => [
119                          'embedsHTMLInAttributes' => true,
120                      ],
121                      'outputHasCoreMwDomSpecMarkup' => true,
122                  ],
123                ],
124            ],
125            'domProcessors' => [
126                ParserHookProcessor::class
127            ]
128        ];
129    }
130}