http://www.mediawiki.org/wiki/Special:Code/MediaWiki/66833

Revision: 66833
Author:   nikerabbit
Date:     2010-05-24 16:23:16 +0000 (Mon, 24 May 2010)

Log Message:
-----------
Handle <nowiki> as good as possible

Modified Paths:
--------------
    trunk/extensions/Translate/tag/PageTranslationHooks.php
    trunk/extensions/Translate/tag/TPParse.php
    trunk/extensions/Translate/tag/TranslatablePage.php

Added Paths:
-----------
    trunk/extensions/Translate/tests/pagetranslation/FailDoubleOpen.ptfile
    trunk/extensions/Translate/tests/pagetranslation/Nowiki.ptfile
    trunk/extensions/Translate/tests/pagetranslation/Nowiki.pttarget
    trunk/extensions/Translate/tests/pagetranslation/NowikiInside.ptfile
    trunk/extensions/Translate/tests/pagetranslation/NowikiInside.pttarget
    trunk/extensions/Translate/tests/pagetranslation/NowikiOnly.ptfile
    trunk/extensions/Translate/tests/pagetranslation/NowikiOnly.pttest

Modified: trunk/extensions/Translate/tag/PageTranslationHooks.php
===================================================================
--- trunk/extensions/Translate/tag/PageTranslationHooks.php     2010-05-24 
15:24:21 UTC (rev 66832)
+++ trunk/extensions/Translate/tag/PageTranslationHooks.php     2010-05-24 
16:23:16 UTC (rev 66833)
@@ -7,12 +7,15 @@
 
        public static function renderTagPage( $parser, &$text, $state ) {
                $title = $parser->getTitle();
-               if ( strpos( $text, '</translate>' ) !== false ) {
+               if ( strpos( $text, '<translate>' ) !== false ) {
+                       $nowiki = array();
+                       $text = TranslatablePage::armourNowiki( $nowiki, $text 
);
                        $cb = array( __CLASS__, 'replaceTagCb' );
                        # Remove the tags nicely, trying to not leave excess 
whitespace lying around
-                       $text = preg_replace_callback( 
'~(\n?<translate>\s*?)(.*?)(\s*?</translate>)~s', $cb, $text );
+                       $text = preg_replace_callback( 
'~(<translate>)\s*(.*?)(</translate>)~s', $cb, $text );
                        # Replace variable markers
                        $text = preg_replace_callback( 
'~(<tvar[^<>]+>)(.*)(</>)~s', $cb, $text );
+                       $text = TranslatablePage::unArmourNowiki( $nowiki, 
$text );
                }
 
                // For translation pages, parse plural, grammar etc with 
correct language
@@ -279,7 +282,9 @@
 
                // Add the ready tag
                $page = TranslatablePage::newFromTitle( $article->getTitle() );
-               $page->addReadyTag( $revision->getId() );
+               if ( $page->getParse()->countSections() > 0 ) {
+                       $page->addReadyTag( $revision->getId() );
+               }
 
                return true;
        }

Modified: trunk/extensions/Translate/tag/TPParse.php
===================================================================
--- trunk/extensions/Translate/tag/TPParse.php  2010-05-24 15:24:21 UTC (rev 
66832)
+++ trunk/extensions/Translate/tag/TPParse.php  2010-05-24 16:23:16 UTC (rev 
66833)
@@ -141,9 +141,13 @@
                        $text = str_replace( $ph, $sectiontext, $text );
                }
 
+               $nph = array();
+               $text = TranslatablePage::armourNowiki( $nph, $text );
+
                // Remove translation markup
                $cb = array( __CLASS__, 'replaceTagCb' );
                $text = preg_replace_callback( 
'~(<translate>\n?)(.*?)(\n?</translate>)~s', $cb, $text );
+               $text = TranslatablePage::unArmourNowiki( $nph, $text );
 
                return $text;
        }

Modified: trunk/extensions/Translate/tag/TranslatablePage.php
===================================================================
--- trunk/extensions/Translate/tag/TranslatablePage.php 2010-05-24 15:24:21 UTC 
(rev 66832)
+++ trunk/extensions/Translate/tag/TranslatablePage.php 2010-05-24 16:23:16 UTC 
(rev 66833)
@@ -139,6 +139,9 @@
 
                $text = $this->getText();
 
+               $nowiki = array();
+               $text = self::armourNowiki( $nowiki, $text );
+
                $sections = array();
                $tagPlaceHolders = array();
 
@@ -149,7 +152,7 @@
                        if ( $ok === 0 ) break; // No matches
 
                        // Do-placehold for the whole stuff
-                       $ph    = $this->getUniq();
+                       $ph    = self::getUniq();
                        $start = $matches[0][0][1];
                        $len   = strlen( $matches[0][0][0] );
                        $end   = $start + $len;
@@ -168,6 +171,8 @@
                                throw new TPException( array( 
'pt-parse-nested', $sectiontext ) );
                        }
 
+                       $sectiontext = self::unArmourNowiki( $nowiki, 
$sectiontext );
+
                        $ret = $this->sectionise( $sections, $sectiontext );
 
                        $tagPlaceHolders[$ph] =
@@ -188,6 +193,8 @@
                        $text = str_replace( $ph, $value, $text );
                }
 
+               $text = self::unArmourNowiki( $nowiki, $text );
+
                $parse = new TPParse( $this->getTitle() );
                $parse->template = $text;
                $parse->sections = $sections;
@@ -200,10 +207,27 @@
 
        // Inner functionality //
 
+       public static function armourNowiki( &$holders, $text ) {
+               $re = '~(<nowiki>)(.*?)(</nowiki>)~';
+               while ( preg_match( $re, $text, $matches ) ) {
+                       $ph = self::getUniq();
+                       $text = str_replace( $matches[0], $ph, $text );
+                       $holders[$ph] = $matches[0];
+               }
+               return $text;
+       }
+
+       public static function unArmourNowiki( $holders, $text ) {
+               foreach ( $holders as $ph => $value ) {
+                       $text = str_replace( $ph, $value, $text );
+               }
+               return $text;
+       }
+
        /**
         * Returns a random string that can be used as placeholder.
         */
-       protected function getUniq() {
+       protected static function getUniq() {
                static $i = 0;
                return "\x7fUNIQ" . dechex( mt_rand( 0, 0x7fffffff ) ) . 
dechex( mt_rand( 0, 0x7fffffff ) ) . '|' . $i++;
        }
@@ -229,7 +253,7 @@
                        if ( trim( $_ ) === '' ) {
                                $template .= $_;
                        } else {
-                               $ph = $this->getUniq();
+                               $ph = self::getUniq();
                                $sections[$ph] = $this->shakeSection( $_ );
                                $template .= $ph;
                        }

Added: trunk/extensions/Translate/tests/pagetranslation/FailDoubleOpen.ptfile
===================================================================
--- trunk/extensions/Translate/tests/pagetranslation/FailDoubleOpen.ptfile      
                        (rev 0)
+++ trunk/extensions/Translate/tests/pagetranslation/FailDoubleOpen.ptfile      
2010-05-24 16:23:16 UTC (rev 66833)
@@ -0,0 +1,3 @@
+<translate>
+<translate>
+</translate>
\ No newline at end of file

Added: trunk/extensions/Translate/tests/pagetranslation/Nowiki.ptfile
===================================================================
--- trunk/extensions/Translate/tests/pagetranslation/Nowiki.ptfile              
                (rev 0)
+++ trunk/extensions/Translate/tests/pagetranslation/Nowiki.ptfile      
2010-05-24 16:23:16 UTC (rev 66833)
@@ -0,0 +1,3 @@
+I just want to speak about <nowiki><translate></nowiki>.
+
+<translate>Yes!</translate>

Added: trunk/extensions/Translate/tests/pagetranslation/Nowiki.pttarget
===================================================================
--- trunk/extensions/Translate/tests/pagetranslation/Nowiki.pttarget            
                (rev 0)
+++ trunk/extensions/Translate/tests/pagetranslation/Nowiki.pttarget    
2010-05-24 16:23:16 UTC (rev 66833)
@@ -0,0 +1,3 @@
+I just want to speak about <nowiki><translate></nowiki>.
+
+Yes!

Added: trunk/extensions/Translate/tests/pagetranslation/NowikiInside.ptfile
===================================================================
--- trunk/extensions/Translate/tests/pagetranslation/NowikiInside.ptfile        
                        (rev 0)
+++ trunk/extensions/Translate/tests/pagetranslation/NowikiInside.ptfile        
2010-05-24 16:23:16 UTC (rev 66833)
@@ -0,0 +1,4 @@
+<translate>
+I just want to speak about <nowiki><translate></nowiki>.
+
+Yes!</translate>

Added: trunk/extensions/Translate/tests/pagetranslation/NowikiInside.pttarget
===================================================================
--- trunk/extensions/Translate/tests/pagetranslation/NowikiInside.pttarget      
                        (rev 0)
+++ trunk/extensions/Translate/tests/pagetranslation/NowikiInside.pttarget      
2010-05-24 16:23:16 UTC (rev 66833)
@@ -0,0 +1,3 @@
+I just want to speak about <nowiki><translate></nowiki>.
+
+Yes!

Added: trunk/extensions/Translate/tests/pagetranslation/NowikiOnly.ptfile
===================================================================
--- trunk/extensions/Translate/tests/pagetranslation/NowikiOnly.ptfile          
                (rev 0)
+++ trunk/extensions/Translate/tests/pagetranslation/NowikiOnly.ptfile  
2010-05-24 16:23:16 UTC (rev 66833)
@@ -0,0 +1 @@
+<nowiki><translate></nowiki>
\ No newline at end of file

Added: trunk/extensions/Translate/tests/pagetranslation/NowikiOnly.pttest
===================================================================
--- trunk/extensions/Translate/tests/pagetranslation/NowikiOnly.pttest          
                (rev 0)
+++ trunk/extensions/Translate/tests/pagetranslation/NowikiOnly.pttest  
2010-05-24 16:23:16 UTC (rev 66833)
@@ -0,0 +1,7 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) ) die();
+
+if ( $parse->countSections() !== 0 ) {
+       $this->output( "Testfile $filename failed misc tests... number of 
sections should be zero" );
+}
\ No newline at end of file



_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to