From: Shinjiman Date: Sat, 17 Jan 2009 05:01:43 +0000 (+0000) Subject: * Fixing the caching issue by using -{T|xxx}- syntax (only applies on wiki with Langu... X-Git-Tag: 1.31.0-rc.0~43382 X-Git-Url: http://git.cyclocoop.org/%24action?a=commitdiff_plain;h=e2ed772baa47b94e549158c24ec8bd0a3627f2dd;p=lhc%2Fweb%2Fwiklou.git * Fixing the caching issue by using -{T|xxx}- syntax (only applies on wiki with LanguageConverter class) * Improving the efficiency by using -{A|xxx}- syntax (only applies on wiki with LanguageConverter class) patches by PhiLiP --- diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 3fc95a3c64..456e9b852b 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -50,6 +50,8 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN * Page moves should not be minor edits * (bug 17035) Special:Upload now fails gracefully if PHP's file_uploads has been disabled +* Fixing the caching issue by using -{T|xxx}- syntax (only applies on wiki with LanguageConverter class) +* Improving the efficiency by using -{A|xxx}- syntax (only applies on wiki with LanguageConverter class) == API changes in 1.15 == * (bug 16858) Revamped list=deletedrevs to make listing deleted contributions diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 7fcfb90a35..07d449e2d3 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -3304,6 +3304,7 @@ class Parser throw new MWException( ' extension tag encountered unexpectedly' ); } case 'nowiki': + $content = strtr($content, array('-{' => '-{', '}-' => '}-')); $output = Xml::escapeTagsOnly( $content ); break; case 'math': diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index dd69e8267c..aad2963fbb 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -13,7 +13,7 @@ * @ingroup Language * * @author Zhengzhu Feng - * @maintainers fdcn , shinjiman + * @maintainers fdcn , shinjiman , PhiLiP */ class LanguageConverter { var $mPreferredVariant=''; @@ -21,6 +21,8 @@ class LanguageConverter { var $mVariants, $mVariantFallbacks, $mVariantNames; var $mTablesLoaded = false; var $mTables; + var $mManualAddTables; + var $mManualRemoveTables; var $mTitleDisplay=''; var $mDoTitleConvert=true, $mDoContentConvert=true; var $mManualLevel; // 'bidirectional' 'unidirectional' 'disable' for each variants @@ -81,10 +83,13 @@ class LanguageConverter { 'N'=>'N' // current variant name ); $this->mFlags = array_merge($f, $flags); - foreach( $this->mVariants as $v) + foreach( $this->mVariants as $v) { $this->mManualLevel[$v]=array_key_exists($v,$manualLevel) ?$manualLevel[$v] :'bidirectional'; + $this->mManualAddTables[$v] = array(); + $this->mManualRemoveTables[$v] = array(); + } } /** @@ -323,13 +328,12 @@ class LanguageConverter { return $ret; } - - + /** - * apply manual conversion + * prepare manual conversion table * @private */ - function applyManualConv($convRule){ + function prepareManualConv($convRule){ // use syntax -{T|zh:TitleZh;zh-tw:TitleTw}- for custom conversion in title $title = $convRule->getTitle(); if($title){ @@ -342,10 +346,29 @@ class LanguageConverter { $action = $convRule->getRulesAction(); foreach($convTable as $v=>$t) { if( !in_array($v,$this->mVariants) )continue; - if( $action=="add" ) - $this->mTables[$v]->mergeArray($t); + if( $action=="add" ) { + foreach($t as $from=>$to) { + // more efficient than array_merge(), about 2.5 times. + $this->mManualAddTables[$v][$from] = $to; + } + } elseif ( $action=="remove" ) - $this->mTables[$v]->removeArray($t); + $this->mManualRemoveTables[$v] = array_merge($this->mManualRemoveTables[$v], $t); + } + } + + /** + * apply manual conversion from $this->mManualAddTables and $this->mManualRemoveTables + * @private + */ + function applyManualConv(){ + //apply manual conversion table to global table + foreach($this->mVariants as $v) { + if (count($this->mManualAddTables[$v]) > 0) { + $this->mTables[$v]->mergeArray($this->mManualAddTables[$v]); + } + if (count($this->mManualRemoveTables[$v]) > 0) + $this->mTables[$v]->removeArray($this->mManualRemoveTables[$v]); } } @@ -438,33 +461,31 @@ class LanguageConverter { $plang = $this->getPreferredVariant(); $tarray = StringUtils::explode($this->mMarkup['end'], $text); $text = ''; - $lastDelim = false; + + $marks = array(); foreach($tarray as $txt) { $marked = explode($this->mMarkup['begin'], $txt, 2); - - if( $this->mDoContentConvert ) - $text .= $this->autoConvert($marked[0],$plang); - else - $text .= $marked[0]; - - if(array_key_exists(1, $marked)){ - // strip the flags from syntax like -{T| ... }- + if (array_key_exists(1, $marked)) { $crule = new ConverterRule($marked[1], $this); $crule->parse($plang); - - $text .= $crule->getDisplay(); - $this->applyManualConv($crule); - $lastDelim = false; - } else { - // Reinsert the }- which wasn't part of anything - $text .= $this->mMarkup['end']; - $lastDelim = true; + $marked[1] = $crule->getDisplay(); + $this->prepareManualConv($crule); } + else + $marked[0] .= $this->mMarkup['end']; + array_push($marks, $marked); } - if ( $lastDelim ) { - // Remove the last delimiter (wasn't real) - $text = substr( $text, 0, -strlen( $this->mMarkup['end'] ) ); + $this->applyManualConv(); + foreach ($marks as $marked) { + if( $this->mDoContentConvert ) + $text .= $this->autoConvert($marked[0],$plang); + else + $text .= $marked[0]; + if( array_key_exists(1, $marked) ) + $text .= $marked[1]; } + // Remove the last delimiter (wasn't real) + $text = substr( $text, 0, -strlen( $this->mMarkup['end'] ) ); return $text; }