Merge "Added a separate error message for mkdir failures"
[lhc/web/wiklou.git] / includes / parser / Preprocessor_Hash.php
index b2e9531..25d253f 100644 (file)
@@ -155,8 +155,7 @@ class Preprocessor_Hash extends Preprocessor {
 
                $searchBase = "[{<\n";
                if ( !$wgDisableLangConversion ) {
-                       // FIXME: disabled due to T153761
-                       // $searchBase .= '-';
+                       $searchBase .= '-';
                }
 
                // For fast reverse searches
@@ -208,6 +207,13 @@ class Preprocessor_Hash extends Preprocessor {
                                $search = $searchBase;
                                if ( $stack->top === false ) {
                                        $currentClosing = '';
+                               } elseif (
+                                       $stack->top->close === '}-' &&
+                                       $stack->top->count > 2
+                               ) {
+                                       # adjust closing for -{{{...{{
+                                       $currentClosing = '}';
+                                       $search .= $currentClosing;
                                } else {
                                        $currentClosing = $stack->top->close;
                                        $search .= $currentClosing;
@@ -264,11 +270,15 @@ class Preprocessor_Hash extends Preprocessor {
                                        } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
                                                $rule = $this->rules[$curChar];
-                                       } elseif ( $curChar == '-' ) {
-                                               $found = 'dash';
                                        } else {
-                                               # Some versions of PHP have a strcspn which stops on null characters
-                                               # Ignore and continue
+                                               # Some versions of PHP have a strcspn which stops on
+                                               # null characters; ignore these and continue.
+                                               # We also may get '-' and '}' characters here which
+                                               # don't match -{ or $currentClosing.  Add these to
+                                               # output and continue.
+                                               if ( $curChar == '-' || $curChar == '}' ) {
+                                                       self::addLiteral( $accum, $curChar );
+                                               }
                                                ++$i;
                                                continue;
                                        }
@@ -294,7 +304,6 @@ class Preprocessor_Hash extends Preprocessor {
                                }
                                // Handle comments
                                if ( isset( $matches[2] ) && $matches[2] == '!--' ) {
-
                                        // To avoid leaving blank lines, when a sequence of
                                        // space-separated comments is both preceded and followed by
                                        // a newline (ignoring spaces), then
@@ -558,7 +567,10 @@ class Preprocessor_Hash extends Preprocessor {
                        } elseif ( $found == 'open' ) {
                                # count opening brace characters
                                $curLen = strlen( $curChar );
-                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i );
+                               $count = ( $curLen > 1 ) ?
+                                       # allow the final character to repeat
+                                       strspn( $text, $curChar[$curLen-1], $i+1 ) + 1 :
+                                       strspn( $text, $curChar, $i );
 
                                # we need to add to stack only if opening brace count is enough for one of the rules
                                if ( $count >= $rule['min'] ) {
@@ -577,17 +589,25 @@ class Preprocessor_Hash extends Preprocessor {
                                        # Add literal brace(s)
                                        self::addLiteral( $accum, str_repeat( $curChar, $count ) );
                                }
-                               $i += $curLen * $count;
+                               $i += $count;
                        } elseif ( $found == 'close' ) {
                                $piece = $stack->top;
                                # lets check if there are enough characters for closing brace
                                $maxCount = $piece->count;
+                               if ( $piece->close === '}-' && $curChar === '}' ) {
+                                       $maxCount--; # don't try to match closing '-' as a '}'
+                               }
                                $curLen = strlen( $curChar );
-                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i, $maxCount );
+                               $count = ( $curLen > 1 ) ? $curLen :
+                                       strspn( $text, $curChar, $i, $maxCount );
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
                                $rule = $this->rules[$piece->open];
+                               if ( $piece->close === '}-' && $piece->count > 2 ) {
+                                       # tweak for -{..{{ }}..}-
+                                       $rule = $this->rules['{'];
+                               }
                                if ( $count > $rule['max'] ) {
                                        # The specified maximum exists in the callback array, unless the caller
                                        # has made an error
@@ -605,15 +625,17 @@ class Preprocessor_Hash extends Preprocessor {
                                if ( $matchingCount <= 0 ) {
                                        # No matching element found in callback array
                                        # Output a literal closing brace and continue
-                                       self::addLiteral( $accum, str_repeat( $curChar, $count ) );
-                                       $i += $curLen * $count;
+                                       $endText = substr( $text, $i, $count );
+                                       self::addLiteral( $accum, $endText );
+                                       $i += $count;
                                        continue;
                                }
                                $name = $rule['names'][$matchingCount];
                                if ( $name === null ) {
                                        // No element, just literal text
+                                       $endText = substr( $text, $i, $matchingCount );
                                        $element = $piece->breakSyntax( $matchingCount );
-                                       self::addLiteral( $element, str_repeat( $rule['end'], $matchingCount ) );
+                                       self::addLiteral( $element, $endText );
                                } else {
                                        # Create XML element
                                        $parts = $piece->parts;
@@ -648,7 +670,7 @@ class Preprocessor_Hash extends Preprocessor {
                                }
 
                                # Advance input pointer
-                               $i += $curLen * $matchingCount;
+                               $i += $matchingCount;
 
                                # Unwind the stack
                                $stack->pop();
@@ -664,7 +686,12 @@ class Preprocessor_Hash extends Preprocessor {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
                                        } else {
-                                               self::addLiteral( $accum, str_repeat( $piece->open, $piece->count ) );
+                                               $s = substr( $piece->open, 0, -1 );
+                                               $s .= str_repeat(
+                                                       substr( $piece->open, -1 ),
+                                                       $piece->count - strlen( $s )
+                                               );
+                                               self::addLiteral( $accum, $s );
                                        }
                                }
 
@@ -762,7 +789,12 @@ class PPDStackElement_Hash extends PPDStackElement {
                        if ( $openingCount === false ) {
                                $openingCount = $this->count;
                        }
-                       $accum = [ str_repeat( $this->open, $openingCount ) ];
+                       $s = substr( $this->open, 0, -1 );
+                       $s .= str_repeat(
+                               substr( $this->open, -1 ),
+                               $openingCount - strlen( $s )
+                       );
+                       $accum = [ $s ];
                        $lastIndex = 0;
                        $first = true;
                        foreach ( $this->parts as $part ) {