49 MediaWikiServices::getInstance()->getContentLanguage() );
51 $this->mPreprocessors = [];
52 foreach ( self::$classNames
as $className ) {
53 $this->mPreprocessors[$className] =
new $className( $this );
58 return [
'gallery',
'display map' ,
'/foo' ];
63 foreach ( self::$classNames
as $className ) {
64 foreach ( $testCases
as $testCase ) {
65 array_unshift( $testCase, $className );
66 $newTestCases[] = $testCase;
75 [
"Foo",
"<root>Foo</root>" ],
76 [
"<!-- Foo -->",
"<root><comment><!-- Foo --></comment></root>" ],
77 [
"<!-- Foo --><!-- Bar -->",
"<root><comment><!-- Foo --></comment><comment><!-- Bar --></comment></root>" ],
78 [
"<!-- Foo --> <!-- Bar -->",
"<root><comment><!-- Foo --></comment> <comment><!-- Bar --></comment></root>" ],
79 [
"<!-- Foo --> \n <!-- Bar -->",
"<root><comment><!-- Foo --></comment> \n <comment><!-- Bar --></comment></root>" ],
80 [
"<!-- Foo --> \n <!-- Bar -->\n",
"<root><comment><!-- Foo --></comment> \n<comment> <!-- Bar -->\n</comment></root>" ],
81 [
"<!-- Foo --> <!-- Bar -->\n",
"<root><comment><!-- Foo --></comment> <comment><!-- Bar --></comment>\n</root>" ],
82 [
"<!-->Bar",
"<root><comment><!-->Bar</comment></root>" ],
83 [
"<!-- Comment -- comment",
"<root><comment><!-- Comment -- comment</comment></root>" ],
84 [
"== Foo ==\n <!-- Bar -->\n== Baz ==\n",
"<root><h level=\"2\" i=\"1\">== Foo ==</h>\n<comment> <!-- Bar -->\n</comment><h level=\"2\" i=\"2\">== Baz ==</h>\n</root>" ],
85 [
"<gallery/>",
"<root><ext><name>gallery</name><attr></attr></ext></root>" ],
86 [
"Foo <gallery/> Bar",
"<root>Foo <ext><name>gallery</name><attr></attr></ext> Bar</root>" ],
87 [
"<gallery></gallery>",
"<root><ext><name>gallery</name><attr></attr><inner></inner><close></gallery></close></ext></root>" ],
88 [
"<foo> <gallery></gallery>",
"<root><foo> <ext><name>gallery</name><attr></attr><inner></inner><close></gallery></close></ext></root>" ],
89 [
"<foo> <gallery><gallery></gallery>",
"<root><foo> <ext><name>gallery</name><attr></attr><inner><gallery></inner><close></gallery></close></ext></root>" ],
90 [
"<noinclude> Foo bar </noinclude>",
"<root><ignore><noinclude></ignore> Foo bar <ignore></noinclude></ignore></root>" ],
91 [
"<noinclude>\n{{Foo}}\n</noinclude>",
"<root><ignore><noinclude></ignore>\n<template lineStart=\"1\"><title>Foo</title></template>\n<ignore></noinclude></ignore></root>" ],
92 [
"<noinclude>\n{{Foo}}\n</noinclude>\n",
"<root><ignore><noinclude></ignore>\n<template lineStart=\"1\"><title>Foo</title></template>\n<ignore></noinclude></ignore>\n</root>" ],
93 [
"<gallery>foo bar",
"<root><gallery>foo bar</root>" ],
94 [
"<{{foo}}>",
"<root><<template><title>foo</title></template>></root>" ],
95 [
"<{{{foo}}}>",
"<root><<tplarg><title>foo</title></tplarg>></root>" ],
96 [
"<gallery></gallery</gallery>",
"<root><ext><name>gallery</name><attr></attr><inner></gallery</inner><close></gallery></close></ext></root>" ],
97 [
"=== Foo === ",
"<root><h level=\"3\" i=\"1\">=== Foo === </h></root>" ],
98 [
"==<!-- -->= Foo === ",
"<root><h level=\"2\" i=\"1\">==<comment><!-- --></comment>= Foo === </h></root>" ],
99 [
"=== Foo ==<!-- -->= ",
"<root><h level=\"1\" i=\"1\">=== Foo ==<comment><!-- --></comment>= </h></root>" ],
100 [
"=== Foo ===<!-- -->\n",
"<root><h level=\"3\" i=\"1\">=== Foo ===<comment><!-- --></comment></h>\n</root>" ],
101 [
"=== Foo ===<!-- --> <!-- -->\n",
"<root><h level=\"3\" i=\"1\">=== Foo ===<comment><!-- --></comment> <comment><!-- --></comment></h>\n</root>" ],
102 [
"== Foo ==\n== Bar == \n",
"<root><h level=\"2\" i=\"1\">== Foo ==</h>\n<h level=\"2\" i=\"2\">== Bar == </h>\n</root>" ],
103 [
"===========",
"<root><h level=\"5\" i=\"1\">===========</h></root>" ],
104 [
"Foo\n=\n==\n=\n",
"<root>Foo\n=\n==\n=\n</root>" ],
105 [
"{{Foo}}",
"<root><template><title>Foo</title></template></root>" ],
106 [
"\n{{Foo}}",
"<root>\n<template lineStart=\"1\"><title>Foo</title></template></root>" ],
107 [
"{{Foo|bar}}",
"<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part></template></root>" ],
108 [
"{{Foo|bar}}a",
"<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part></template>a</root>" ],
109 [
"{{Foo|bar|baz}}",
"<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name index=\"2\" /><value>baz</value></part></template></root>" ],
110 [
"{{Foo|1=bar}}",
"<root><template><title>Foo</title><part><name>1</name>=<value>bar</value></part></template></root>" ],
111 [
"{{Foo|=bar}}",
"<root><template><title>Foo</title><part><name></name>=<value>bar</value></part></template></root>" ],
112 [
"{{Foo|bar=baz}}",
"<root><template><title>Foo</title><part><name>bar</name>=<value>baz</value></part></template></root>" ],
113 [
"{{Foo|{{bar}}=baz}}",
"<root><template><title>Foo</title><part><name><template><title>bar</title></template></name>=<value>baz</value></part></template></root>" ],
114 [
"{{Foo|1=bar|baz}}",
"<root><template><title>Foo</title><part><name>1</name>=<value>bar</value></part><part><name index=\"1\" /><value>baz</value></part></template></root>" ],
115 [
"{{Foo|1=bar|2=baz}}",
"<root><template><title>Foo</title><part><name>1</name>=<value>bar</value></part><part><name>2</name>=<value>baz</value></part></template></root>" ],
116 [
"{{Foo|bar|foo=baz}}",
"<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name>foo</name>=<value>baz</value></part></template></root>" ],
117 [
"{{{1}}}",
"<root><tplarg><title>1</title></tplarg></root>" ],
118 [
"{{{1|}}}",
"<root><tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg></root>" ],
119 [
"{{{Foo}}}",
"<root><tplarg><title>Foo</title></tplarg></root>" ],
120 [
"{{{Foo|}}}",
"<root><tplarg><title>Foo</title><part><name index=\"1\" /><value></value></part></tplarg></root>" ],
121 [
"{{{Foo|bar|baz}}}",
"<root><tplarg><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name index=\"2\" /><value>baz</value></part></tplarg></root>" ],
122 [
"{<!-- -->{Foo}}",
"<root>{<comment><!-- --></comment>{Foo}}</root>" ],
123 [
"{{{{Foobar}}}}",
"<root>{<tplarg><title>Foobar</title></tplarg>}</root>" ],
124 [
"{{{ {{Foo}} }}}",
"<root><tplarg><title> <template><title>Foo</title></template> </title></tplarg></root>" ],
125 [
"{{ {{{Foo}}} }}",
"<root><template><title> <tplarg><title>Foo</title></tplarg> </title></template></root>" ],
126 [
"{{{{{Foo}}}}}",
"<root><template><title><tplarg><title>Foo</title></tplarg></title></template></root>" ],
127 [
"{{{{{Foo}} }}}",
"<root><tplarg><title><template><title>Foo</title></template> </title></tplarg></root>" ],
128 [
"{{{{{{Foo}}}}}}",
"<root><tplarg><title><tplarg><title>Foo</title></tplarg></title></tplarg></root>" ],
129 [
"{{{{{{Foo}}}}}",
"<root>{<template><title><tplarg><title>Foo</title></tplarg></title></template></root>" ],
130 [
"[[[Foo]]",
"<root>[[[Foo]]</root>" ],
131 [
"{{Foo|[[[[bar]]|baz]]}}",
"<root><template><title>Foo</title><part><name index=\"1\" /><value>[[[[bar]]|baz]]</value></part></template></root>" ],
132 [
"{{Foo|[[[[bar]|baz]]}}",
"<root>{{Foo|[[[[bar]|baz]]}}</root>" ],
133 [
"{{Foo|Foo [[[[bar]|baz]]}}",
"<root>{{Foo|Foo [[[[bar]|baz]]}}</root>" ],
134 [
"Foo <display map>Bar</display map >Baz",
"<root>Foo <ext><name>display map</name><attr></attr><inner>Bar</inner><close></display map ></close></ext>Baz</root>" ],
135 [
"Foo <display map foo>Bar</display map >Baz",
"<root>Foo <ext><name>display map</name><attr> foo</attr><inner>Bar</inner><close></display map ></close></ext>Baz</root>" ],
136 [
"Foo <gallery bar=\"baz\" />",
"<root>Foo <ext><name>gallery</name><attr> bar="baz" </attr></ext></root>" ],
137 [
"Foo <gallery bar=\"1\" baz=2 />",
"<root>Foo <ext><name>gallery</name><attr> bar="1" baz=2 </attr></ext></root>" ],
138 [
"</foo>Foo<//foo>",
"<root><ext><name>/foo</name><attr></attr><inner>Foo</inner><close><//foo></close></ext></root>" ], # Worth blacklisting IMHO
139 [
"{{#ifexpr: ({{{1|1}}} = 2) | Foo | Bar }}",
"<root><template><title>#ifexpr: (<tplarg><title>1</title><part><name index=\"1\" /><value>1</value></part></tplarg> = 2) </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> Bar </value></part></template></root>" ],
140 [
"{{#if: {{{1|}}} | Foo | {{Bar}} }}",
"<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> <template><title>Bar</title></template> </value></part></template></root>" ],
141 [
"{{#if: {{{1|}}} | Foo | [[Bar]] }}",
"<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> [[Bar]] </value></part></template></root>" ],
142 [
"{{#if: {{{1|}}} | [[Foo]] | Bar }}",
"<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> [[Foo]] </value></part><part><name index=\"2\" /><value> Bar </value></part></template></root>" ],
143 [
"{{#if: {{{1|}}} | 1 | {{#if: {{{1|}}} | 2 | 3 }} }}",
"<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> 1 </value></part><part><name index=\"2\" /><value> <template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> 2 </value></part><part><name index=\"2\" /><value> 3 </value></part></template> </value></part></template></root>" ],
144 [
"{{ {{Foo}}",
"<root>{{ <template><title>Foo</title></template></root>" ],
145 [
"{{Foobar {{Foo}} {{Bar}} {{Baz}} ",
"<root>{{Foobar <template><title>Foo</title></template> <template><title>Bar</title></template> <template><title>Baz</title></template> </root>" ],
146 [
"[[Foo]] |",
"<root>[[Foo]] |</root>" ],
147 [
"{{Foo|Bar|",
"<root>{{Foo|Bar|</root>" ],
148 [
"[[Foo]",
"<root>[[Foo]</root>" ],
149 [
"[[Foo|Bar]",
"<root>[[Foo|Bar]</root>" ],
150 [
"{{Foo| [[Bar] }}",
"<root>{{Foo| [[Bar] }}</root>" ],
151 [
"{{Foo| [[Bar|Baz] }}",
"<root>{{Foo| [[Bar|Baz] }}</root>" ],
152 [
"{{Foo|bar=[[baz]}}",
"<root>{{Foo|bar=[[baz]}}</root>" ],
153 [
"{{foo|",
"<root>{{foo|</root>" ],
154 [
"{{foo|}",
"<root>{{foo|}</root>" ],
155 [
"{{foo|} }}",
"<root><template><title>foo</title><part><name index=\"1\" /><value>} </value></part></template></root>" ],
156 [
"{{foo|bar=|}",
"<root>{{foo|bar=|}</root>" ],
157 [
"{{Foo|} Bar=",
"<root>{{Foo|} Bar=</root>" ],
158 [
"{{Foo|} Bar=}}",
"<root><template><title>Foo</title><part><name>} Bar</name>=<value></value></part></template></root>" ],
173 $preprocessor = $this->mPreprocessors[$className];
174 if ( method_exists( $preprocessor,
'preprocessToXml' ) ) {
175 return $this->
normalizeXml( $preprocessor->preprocessToXml( $wikiText ) );
178 $dom = $preprocessor->preprocessToObj( $wikiText );
179 if ( is_callable( [ $dom,
'saveXML' ] ) ) {
180 return $dom->saveXML();
194 $xml = preg_replace(
'!<([a-z]+)/>!',
'<$1></$1>', str_replace(
' />',
'/>', $xml ) );
197 $xml = preg_replace(
'!</?equals>!',
'', $xml );
205 $this->assertEquals( $this->
normalizeXml( $expectedXml ),
215 [
"QuoteQuran" ], #
https:
216 [
"Factorial" ], #
https:
217 [
"All_system_messages" ], #
https:
218 [
"Fundraising" ], #
https:
219 [
"NestedTemplates" ], # T29936
228 $folder = __DIR__ .
"/../../../parser/preprocess";
229 $wikiText = file_get_contents(
"$folder/$filename.txt" );
232 $expectedFilename =
"$folder/$filename.expected";
233 if ( file_exists( $expectedFilename ) ) {
234 $expectedXml = $this->
normalizeXml( file_get_contents( $expectedFilename ) );
235 $this->assertEquals( $expectedXml,
$output );
237 $tempFilename = tempnam( $folder,
"$filename." );
238 file_put_contents( $tempFilename,
$output );
239 $this->markTestIncomplete(
"File $expectedFilename missing. Output stored as $tempFilename" );
250 [
"== h ==<!--c1-->",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment></h></root>" ],
251 [
"== h == <!--c1-->",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment></h></root>" ],
252 [
"== h ==<!--c1--> ",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment> </h></root>" ],
253 [
"== h == <!--c1--> ",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment> </h></root>" ],
254 [
"== h ==<!--c1--><!--c2-->",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment><comment><!--c2--></comment></h></root>" ],
255 [
"== h == <!--c1--><!--c2-->",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment><comment><!--c2--></comment></h></root>" ],
256 [
"== h ==<!--c1--><!--c2--> ",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment><comment><!--c2--></comment> </h></root>" ],
257 [
"== h == <!--c1--><!--c2--> ",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment><comment><!--c2--></comment> </h></root>" ],
258 [
"== h == <!--c1--> <!--c2-->",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment> <comment><!--c2--></comment></h></root>" ],
259 [
"== h ==<!--c1--> <!--c2--> ",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment> <comment><!--c2--></comment> </h></root>" ],
260 [
"== h == <!--c1--> <!--c2--> ",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment> <comment><!--c2--></comment> </h></root>" ],
261 [
"== h ==<!--c1--><!--c2--><!--c3-->",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment><comment><!--c2--></comment><comment><!--c3--></comment></h></root>" ],
262 [
"== h ==<!--c1--> <!--c2--><!--c3-->",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment> <comment><!--c2--></comment><comment><!--c3--></comment></h></root>" ],
263 [
"== h ==<!--c1--><!--c2--> <!--c3-->",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment><comment><!--c2--></comment> <comment><!--c3--></comment></h></root>" ],
264 [
"== h ==<!--c1--> <!--c2--> <!--c3-->",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment> <comment><!--c2--></comment> <comment><!--c3--></comment></h></root>" ],
265 [
"== h == <!--c1--><!--c2--><!--c3-->",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment><comment><!--c2--></comment><comment><!--c3--></comment></h></root>" ],
266 [
"== h == <!--c1--> <!--c2--><!--c3-->",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment> <comment><!--c2--></comment><comment><!--c3--></comment></h></root>" ],
267 [
"== h == <!--c1--><!--c2--> <!--c3-->",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment><comment><!--c2--></comment> <comment><!--c3--></comment></h></root>" ],
268 [
"== h == <!--c1--> <!--c2--> <!--c3-->",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment> <comment><!--c2--></comment> <comment><!--c3--></comment></h></root>" ],
269 [
"== h ==<!--c1--><!--c2--><!--c3--> ",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment><comment><!--c2--></comment><comment><!--c3--></comment> </h></root>" ],
270 [
"== h ==<!--c1--> <!--c2--><!--c3--> ",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment> <comment><!--c2--></comment><comment><!--c3--></comment> </h></root>" ],
271 [
"== h ==<!--c1--><!--c2--> <!--c3--> ",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment><comment><!--c2--></comment> <comment><!--c3--></comment> </h></root>" ],
272 [
"== h ==<!--c1--> <!--c2--> <!--c3--> ",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment> <comment><!--c2--></comment> <comment><!--c3--></comment> </h></root>" ],
273 [
"== h == <!--c1--><!--c2--><!--c3--> ",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment><comment><!--c2--></comment><comment><!--c3--></comment> </h></root>" ],
274 [
"== h == <!--c1--> <!--c2--><!--c3--> ",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment> <comment><!--c2--></comment><comment><!--c3--></comment> </h></root>" ],
275 [
"== h == <!--c1--><!--c2--> <!--c3--> ",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment><comment><!--c2--></comment> <comment><!--c3--></comment> </h></root>" ],
276 [
"== h == <!--c1--> <!--c2--> <!--c3--> ",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment> <comment><!--c2--></comment> <comment><!--c3--></comment> </h></root>" ],
277 [
"== h ==<!--c1--> <!--c2-->",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment> <comment><!--c2--></comment></h></root>" ],
278 [
"== h == <!--c1--> <!--c2-->",
"<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment> <comment><!--c2--></comment></h></root>" ],
279 [
"== h ==<!--c1--> <!--c2--> ",
"<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment> <comment><!--c2--></comment> </h></root>" ],
282 [
"== h == x <!--c1--><!--c2--><!--c3--> ",
"<root>== h == x <comment><!--c1--></comment><comment><!--c2--></comment><comment><!--c3--></comment> </root>" ],
283 [
"== h ==<!--c1--> x <!--c2--><!--c3--> ",
"<root>== h ==<comment><!--c1--></comment> x <comment><!--c2--></comment><comment><!--c3--></comment> </root>" ],
284 [
"== h ==<!--c1--><!--c2--><!--c3--> x ",
"<root>== h ==<comment><!--c1--></comment><comment><!--c2--></comment><comment><!--c3--></comment> x </root>" ],
293 $this->assertEquals( $this->
normalizeXml( $expectedXml ),