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