From: Dan Collins Date: Tue, 22 May 2012 23:56:33 +0000 (-0400) Subject: (bug 27936) Improve parser handling of nested braces. X-Git-Tag: 1.31.0-rc.0~20790 X-Git-Url: http://git.cyclocoop.org/%24href?a=commitdiff_plain;h=9846e2558cb598b6dedcc32582d1139f9f9f1158;p=lhc%2Fweb%2Fwiklou.git (bug 27936) Improve parser handling of nested braces. Parser tests also included, test case and original patch supplied by Bergi on bugzilla. Tested against the current version. Change-Id: Id7ec4e694783dd0f682f65f39d8b9e59f82e58aa --- diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php index 250552838a..468802d4ca 100644 --- a/includes/parser/Preprocessor_DOM.php +++ b/includes/parser/Preprocessor_DOM.php @@ -658,19 +658,13 @@ class Preprocessor_DOM implements Preprocessor { $piece->parts = array( new PPDPart ); $piece->count -= $matchingCount; # do we still qualify for any callback with remaining count? - $names = $rules[$piece->open]['names']; - $skippedBraces = 0; - $enclosingAccum =& $accum; - while ( $piece->count ) { - if ( array_key_exists( $piece->count, $names ) ) { - $stack->push( $piece ); - $accum =& $stack->getAccum(); - break; - } - --$piece->count; - $skippedBraces ++; + $min = $rules[$piece->open]['min']; + if ( $piece->count >= $min ) { + $stack->push( $piece ); + $accum =& $stack->getAccum(); + } else { + $accum .= str_repeat( $piece->open, $piece->count ); } - $enclosingAccum .= str_repeat( $piece->open, $skippedBraces ); } $flags = $stack->getFlags(); extract( $flags ); diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php index a871205ff4..c22da6477c 100644 --- a/includes/parser/Preprocessor_Hash.php +++ b/includes/parser/Preprocessor_Hash.php @@ -643,19 +643,13 @@ class Preprocessor_Hash implements Preprocessor { $piece->parts = array( new PPDPart_Hash ); $piece->count -= $matchingCount; # do we still qualify for any callback with remaining count? - $names = $rules[$piece->open]['names']; - $skippedBraces = 0; - $enclosingAccum =& $accum; - while ( $piece->count ) { - if ( array_key_exists( $piece->count, $names ) ) { - $stack->push( $piece ); - $accum =& $stack->getAccum(); - break; - } - --$piece->count; - $skippedBraces ++; + $min = $rules[$piece->open]['min']; + if ( $piece->count >= $min ) { + $stack->push( $piece ); + $accum =& $stack->getAccum(); + } else { + $accum->addLiteral( str_repeat( $piece->open, $piece->count ) ); } - $enclosingAccum->addLiteral( str_repeat( $piece->open, $skippedBraces ) ); } extract( $stack->getFlags() ); diff --git a/tests/parser/preprocess/NestedTemplates.expected b/tests/parser/preprocess/NestedTemplates.expected new file mode 100644 index 0000000000..645626df8c --- /dev/null +++ b/tests/parser/preprocess/NestedTemplates.expected @@ -0,0 +1,90 @@ + + +argument + +Nach [[:meta:Help:Expansion#XML parse tree]] +{vorlagenname} + + +erweiterung + + + <template><title>vorlagenname + +<template><title>vorlagenname + + +nur etwas erweitert +<tplarg><title>vorlagenname + <tplarg><title>vorlagenname +<tplarg><title>vorlagenname +} +{ <template><title>vorlagenname} + +{ <template><title>vorlagenname} +{ +{<template><title>vorlagenname } + + {<template><title>vorlagenname } + +{<tplarg><title> } + + +<tplarg><title><template><title> + +{{<tplarg><title> } } +<template><title><tplarg><title> + +{<template><title><template><title> } +{ } +{ + +<template><title><tplarg><title> +<tplarg><title><template><title> + + + + +argument + +Nach [[:meta:Help:Expansion#XML parse tree]] +{vorlagenname} + + +erweiterung + + + <template><title>vorlagenname + +<template><title>vorlagenname + + +nur etwas erweitert +<tplarg><title>vorlagenname + <tplarg><title>vorlagenname +<tplarg><title>vorlagenname +} +{ <template><title>vorlagenname} + +{ <template><title>vorlagenname} +{ +{<template><title>vorlagenname } + + {<template><title>vorlagenname } + +{<tplarg><title> } + + +<tplarg><title><template><title> + +{{<tplarg><title> } } +<template><title><tplarg><title> + +{<template><title><template><title> } +{ } +{ + +<template><title><tplarg><title> +<tplarg><title><template><title> + + \ No newline at end of file diff --git a/tests/parser/preprocess/NestedTemplates.txt b/tests/parser/preprocess/NestedTemplates.txt new file mode 100644 index 0000000000..aa9a472d43 --- /dev/null +++ b/tests/parser/preprocess/NestedTemplates.txt @@ -0,0 +1,89 @@ +{{vorlage}} + +{{{argument}}} + +Nach [[:meta:Help:Expansion#XML parse tree]] +{{{{vorlagenname}}}} +{{ {{vorlagenname}}}} +{{{{vorlagenname}} }} +{{{{vorlagenname}}erweiterung}} + +{{{{{vorlagenname}}}}} +{{{ {{vorlagenname}}}}} +{{ {{{vorlagenname}}}}} +{{{{{vorlagenname}} }}} +{{{{{vorlagenname}}} }} + +nur etwas erweitert +{{{{{{vorlagenname}}}}}} +{{{ {{{vorlagenname}}}}}} +{{{{{{vorlagenname}}} }}} +{{ {{{{vorlagenname}}}}}} +{{{{ {{vorlagenname}}}}}} +{{ {{ {{vorlagenname}}}}}} +{{{{ {{vorlagenname}}} }}} +{{{{{{vorlagenname}}}} }} +{{{{{{vorlagenname}} }}}} +{{ {{{{vorlagenname}} }}}} +{{{ {{{vorlagenname}} }}}} + +{{{{{{{ }}}}}}} + +{{{{{{{{ }}}}}}}} +{{{{{{{{ }} }}}}}} +{{{{{{{{ }}} }}}}} +{{{{{{{{ }}}} }}}} +{{{{{{{{ }}}}} }}} +{{{{{{{{ }}}}}} }} +{{{{{{{{ }} }} }}}} +{{{{{{{{ }} }}}} }} +{{{{{{{{ }}}} }} }} +{{{{{{{{ }}} }}} }} +{{{{{{{{ }}} }} }}} +{{{{{{{{ }} }}} }}} +{{{{{{{{ }} }} }} }} + +{{vorlage}} + +{{{argument}}} + +Nach [[:meta:Help:Expansion#XML parse tree]] +{{{{vorlagenname}}}} +{{ {{vorlagenname}}}} +{{{{vorlagenname}} }} +{{{{vorlagenname}}erweiterung}} + +{{{{{vorlagenname}}}}} +{{{ {{vorlagenname}}}}} +{{ {{{vorlagenname}}}}} +{{{{{vorlagenname}} }}} +{{{{{vorlagenname}}} }} + +nur etwas erweitert +{{{{{{vorlagenname}}}}}} +{{{ {{{vorlagenname}}}}}} +{{{{{{vorlagenname}}} }}} +{{ {{{{vorlagenname}}}}}} +{{{{ {{vorlagenname}}}}}} +{{ {{ {{vorlagenname}}}}}} +{{{{ {{vorlagenname}}} }}} +{{{{{{vorlagenname}}}} }} +{{{{{{vorlagenname}} }}}} +{{ {{{{vorlagenname}} }}}} +{{{ {{{vorlagenname}} }}}} + +{{{{{{{ }}}}}}} + +{{{{{{{{ }}}}}}}} +{{{{{{{{ }} }}}}}} +{{{{{{{{ }}} }}}}} +{{{{{{{{ }}}} }}}} +{{{{{{{{ }}}}} }}} +{{{{{{{{ }}}}}} }} +{{{{{{{{ }} }} }}}} +{{{{{{{{ }} }}}} }} +{{{{{{{{ }}}} }} }} +{{{{{{{{ }}} }}} }} +{{{{{{{{ }}} }} }}} +{{{{{{{{ }} }}} }}} +{{{{{{{{ }} }} }} }} diff --git a/tests/phpunit/includes/parser/PreprocessorTest.php b/tests/phpunit/includes/parser/PreprocessorTest.php index c3a251f42b..4b1f5193c4 100644 --- a/tests/phpunit/includes/parser/PreprocessorTest.php +++ b/tests/phpunit/includes/parser/PreprocessorTest.php @@ -154,6 +154,7 @@ class PreprocessorTest extends MediaWikiTestCase { array( "Factorial" ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC-BY-SA by Polonium array( "All_system_messages" ), # http://tl.wiktionary.org/w/index.php?title=Suleras:All_system_messages&oldid=2765 GPL text generated by MediaWiki array( "Fundraising" ), # http://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC-BY-SA, copied there by Sky Harbor. + array( "NestedTemplates" ), # bug 27936 ); }