* Allow leading-> as syntax for quoting.
authorAndrew Garrett <werdna@users.mediawiki.org>
Thu, 9 Jul 2009 15:17:56 +0000 (15:17 +0000)
committerAndrew Garrett <werdna@users.mediawiki.org>
Thu, 9 Jul 2009 15:17:56 +0000 (15:17 +0000)
includes/parser/Parser.php
maintenance/parserTests.txt

index f4fc484..dbc6e39 100644 (file)
@@ -1947,7 +1947,7 @@ class Parser
                elseif ( ';' === $char ) {
                        $result .= '<dl><dt>';
                        $this->mDTopen = true;
-               }
+               } elseif ( '>' === $char ) { $result .= "<blockquote><p>"; }
                else { $result = '<!-- ERR 1 -->'; }
 
                return $result;
@@ -1955,6 +1955,7 @@ class Parser
 
        /* private */ function nextItem( $char ) {
                if ( '*' === $char || '#' === $char ) { return '</li><li>'; }
+               elseif ( '>' === $char ) { return "</p><p>"; }
                elseif ( ':' === $char || ';' === $char ) {
                        $close = '</dd>';
                        if ( $this->mDTopen ) { $close = '</dt>'; }
@@ -1972,6 +1973,7 @@ class Parser
        /* private */ function closeList( $char ) {
                if ( '*' === $char ) { $text = '</li></ul>'; }
                elseif ( '#' === $char ) { $text = '</li></ol>'; }
+               elseif ( '>' === $char ) { $text = "</p></blockquote>"; }
                elseif ( ':' === $char ) {
                        if ( $this->mDTopen ) {
                                $this->mDTopen = false;
@@ -2017,14 +2019,23 @@ class Parser
                        // # = ol
                        // ; = dt
                        // : = dd
+                       // > = blockquote
 
                        $lastPrefixLength = strlen( $lastPrefix );
                        $preCloseMatch = preg_match('/<\\/pre/i', $oLine );
                        $preOpenMatch = preg_match('/<pre/i', $oLine );
+                       
+                       // Need to decode &gt; --> > for blockquote syntax. Re-encode later.
+                       // To avoid collision with real >s, we temporarily convert them to &gt;
+                       // This is a weird choice of armouring, but it's totally resistant to any
+                       //  collision.
+                       $orig = $oLine;
+                       $oLine = strtr( $oLine, array( '&gt;' => '>', '>' => '&gt;' ) );
+                       
                        // If not in a <pre> element, scan for and figure out what prefixes are there.
                        if ( !$this->mInPre ) {
                                # Multiple prefixes may abut each other for nested lists.
-                               $prefixLength = strspn( $oLine, '*#:;' );
+                               $prefixLength = strspn( $oLine, '*#:;>' );
                                $prefix = substr( $oLine, 0, $prefixLength );
 
                                # eh?
@@ -2040,6 +2051,9 @@ class Parser
                                $prefix = $prefix2 = '';
                                $t = $oLine;
                        }
+                       
+                       // Re-encode >s now
+                       $t = strtr( $t, array( '&gt;' => '>', '>' => '&gt;' ) );
 
                        # List generation
                        if( $prefixLength && $lastPrefix === $prefix2 ) {
index 3771941..e7ebd96 100644 (file)
@@ -6550,9 +6550,9 @@ RAW magic word
 !! test
 Always escape literal '>' in output, not just after '<'
 !! input
-><>
+test ><>
 !! result
-<p>&gt;&lt;&gt;
+<p>test &gt;&lt;&gt;
 </p>
 !! end
 
@@ -7320,6 +7320,24 @@ wgUseDynamicDates=true
 </p>
 !! end
 
+!! test
+Leading > blockquote syntax
+!! input
+> Hi
+> This
+> Is
+> A
+> Quote
+!! result
+<blockquote><p> Hi
+</p><p> This
+</p><p> Is
+</p><p> A
+</p><p> Quote
+</p></blockquote>
+
+!! end
+
 #
 #
 #