X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fparser%2FBlockLevelPass.php;h=fab9ab7fb1828afb8e1cdfc746115bc7898d70bf;hb=74426f3cf796b149f1ae445e41815bbe148640b2;hp=2ef599a398d79bdb7510743d16f54ee6ca7372b5;hpb=3635092917533a865ae94a78243caef2cd99d577;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/parser/BlockLevelPass.php b/includes/parser/BlockLevelPass.php index 2ef599a398..8cf8f859b9 100644 --- a/includes/parser/BlockLevelPass.php +++ b/includes/parser/BlockLevelPass.php @@ -26,7 +26,7 @@ class BlockLevelPass { private $DTopen = false; private $inPre = false; private $lastSection = ''; - private $linestart; + private $lineStart; private $text; # State constants for the definition list colon extraction @@ -257,12 +257,17 @@ class BlockLevelPass { $output .= $this->nextItem( $prefix[$commonPrefixLength - 1] ); } + # Close an open
if we have a
(":") starting on this line + if ( $this->DTopen && $commonPrefixLength > 0 && $prefix[$commonPrefixLength - 1] === ':' ) { + $output .= $this->nextItem( ':' ); + } + # Open prefixes where appropriate. if ( $lastPrefix && $prefixLength > $commonPrefixLength ) { $output .= "\n"; } while ( $prefixLength > $commonPrefixLength ) { - $char = substr( $prefix, $commonPrefixLength, 1 ); + $char = $prefix[$commonPrefixLength]; $output .= $this->openList( $char ); if ( ';' === $char ) { @@ -286,20 +291,20 @@ class BlockLevelPass { # @todo consider using a stack for nestable elements like span, table and div $openMatch = preg_match( '/(?:closeParagraph(); if ( $preOpenMatch && !$preCloseMatch ) { $this->inPre = true; @@ -353,7 +358,7 @@ class BlockLevelPass { } } } - # somewhere above we forget to get out of pre block (bug 785) + # somewhere above we forget to get out of pre block (T2785) if ( $preCloseMatch && $this->inPre ) { $this->inPre = false; } @@ -412,130 +417,130 @@ class BlockLevelPass { $c = $str[$i]; switch ( $state ) { - case self::COLON_STATE_TEXT: - switch ( $c ) { - case "<": - # Could be either a tag or an tag - $state = self::COLON_STATE_TAGSTART; - break; - case ":": - if ( $ltLevel === 0 ) { - # We found it! - $before = substr( $str, 0, $i ); - $after = substr( $str, $i + 1 ); - return $i; + case self::COLON_STATE_TEXT: + switch ( $c ) { + case "<": + # Could be either a tag or an tag + $state = self::COLON_STATE_TAGSTART; + break; + case ":": + if ( $ltLevel === 0 ) { + # We found it! + $before = substr( $str, 0, $i ); + $after = substr( $str, $i + 1 ); + return $i; + } + # Embedded in a tag; don't break it. + break; + default: + # Skip ahead looking for something interesting + if ( !preg_match( '/:|<|-\{/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) { + # Nothing else interesting + return false; + } + if ( $m[0][0] === '-{' ) { + $state = self::COLON_STATE_LC; + $lcLevel++; + $i = $m[0][1] + 1; + } else { + # Skip ahead to next interesting character. + $i = $m[0][1] - 1; + } + break; } - # Embedded in a tag; don't break it. break; - default: - # Skip ahead looking for something interesting - if ( !preg_match( '/:|<|-\{/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) { - # Nothing else interesting - return false; - } - if ( $m[0][0] === '-{' ) { - $state = self::COLON_STATE_LC; + case self::COLON_STATE_LC: + # In language converter markup -{ ... }- + if ( !preg_match( '/-\{|\}-/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) { + # Nothing else interesting to find; abort! + # We're nested in language converter markup, but there + # are no close tags left. Abort! + break 2; + } elseif ( $m[0][0] === '-{' ) { + $i = $m[0][1] + 1; $lcLevel++; + } elseif ( $m[0][0] === '}-' ) { $i = $m[0][1] + 1; - } else { - # Skip ahead to next interesting character. - $i = $m[0][1] - 1; + $lcLevel--; + if ( $lcLevel === 0 ) { + $state = self::COLON_STATE_TEXT; + } } break; - } - break; - case self::COLON_STATE_LC: - # In language converter markup -{ ... }- - if ( !preg_match( '/-\{|\}-/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) { - # Nothing else interesting to find; abort! - # We're nested in language converter markup, but there - # are no close tags left. Abort! - break 2; - } elseif ( $m[0][0] === '-{' ) { - $i = $m[0][1] + 1; - $lcLevel++; - } elseif ( $m[0][0] === '}-' ) { - $i = $m[0][1] + 1; - $lcLevel--; - if ( $lcLevel === 0 ) { - $state = self::COLON_STATE_TEXT; + case self::COLON_STATE_TAG: + # In a + switch ( $c ) { + case ">": + $ltLevel++; + $state = self::COLON_STATE_TEXT; + break; + case "/": + # Slash may be followed by >? + $state = self::COLON_STATE_TAGSLASH; + break; + default: + # ignore } - } - break; - case self::COLON_STATE_TAG: - # In a - switch ( $c ) { - case ">": - $ltLevel++; - $state = self::COLON_STATE_TEXT; break; - case "/": - # Slash may be followed by >? - $state = self::COLON_STATE_TAGSLASH; + case self::COLON_STATE_TAGSTART: + switch ( $c ) { + case "/": + $state = self::COLON_STATE_CLOSETAG; + break; + case "!": + $state = self::COLON_STATE_COMMENT; + break; + case ">": + # Illegal early close? This shouldn't happen D: + $state = self::COLON_STATE_TEXT; + break; + default: + $state = self::COLON_STATE_TAG; + } break; - default: - # ignore - } - break; - case self::COLON_STATE_TAGSTART: - switch ( $c ) { - case "/": - $state = self::COLON_STATE_CLOSETAG; + case self::COLON_STATE_CLOSETAG: + # In a + if ( $c === ">" ) { + if ( $ltLevel > 0 ) { + $ltLevel--; + } else { + # ignore the excess close tag, but keep looking for + # colons. (This matches Parsoid behavior.) + wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" ); + } + $state = self::COLON_STATE_TEXT; + } break; - case "!": - $state = self::COLON_STATE_COMMENT; + case self::COLON_STATE_TAGSLASH: + if ( $c === ">" ) { + # Yes, a self-closed tag + $state = self::COLON_STATE_TEXT; + } else { + # Probably we're jumping the gun, and this is an attribute + $state = self::COLON_STATE_TAG; + } break; - case ">": - # Illegal early close? This shouldn't happen D: - $state = self::COLON_STATE_TEXT; + case self::COLON_STATE_COMMENT: + if ( $c === "-" ) { + $state = self::COLON_STATE_COMMENTDASH; + } break; - default: - $state = self::COLON_STATE_TAG; - } - break; - case self::COLON_STATE_CLOSETAG: - # In a - if ( $c === ">" ) { - if ( $ltLevel > 0 ) { - $ltLevel--; + case self::COLON_STATE_COMMENTDASH: + if ( $c === "-" ) { + $state = self::COLON_STATE_COMMENTDASHDASH; } else { - # ignore the excess close tag, but keep looking for - # colons. (This matches Parsoid behavior.) - wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" ); + $state = self::COLON_STATE_COMMENT; } - $state = self::COLON_STATE_TEXT; - } - break; - case self::COLON_STATE_TAGSLASH: - if ( $c === ">" ) { - # Yes, a self-closed tag - $state = self::COLON_STATE_TEXT; - } else { - # Probably we're jumping the gun, and this is an attribute - $state = self::COLON_STATE_TAG; - } - break; - case self::COLON_STATE_COMMENT: - if ( $c === "-" ) { - $state = self::COLON_STATE_COMMENTDASH; - } - break; - case self::COLON_STATE_COMMENTDASH: - if ( $c === "-" ) { - $state = self::COLON_STATE_COMMENTDASHDASH; - } else { - $state = self::COLON_STATE_COMMENT; - } - break; - case self::COLON_STATE_COMMENTDASHDASH: - if ( $c === ">" ) { - $state = self::COLON_STATE_TEXT; - } else { - $state = self::COLON_STATE_COMMENT; - } - break; - default: - throw new MWException( "State machine error in " . __METHOD__ ); + break; + case self::COLON_STATE_COMMENTDASHDASH: + if ( $c === ">" ) { + $state = self::COLON_STATE_TEXT; + } else { + $state = self::COLON_STATE_COMMENT; + } + break; + default: + throw new MWException( "State machine error in " . __METHOD__ ); } } if ( $ltLevel > 0 || $lcLevel > 0 ) {