<?php
/**
- * @package MediaWiki
- * @subpackage Language
+ * @addtogroup Language
*
* @author Zhengzhu Feng <zhengzhu@gmail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
var $mTables;
var $mTitleDisplay='';
var $mDoTitleConvert=true, $mDoContentConvert=true;
+ var $mTitleFromFlag = false;
var $mCacheKey;
var $mLangObj;
var $mMarkup;
$variantfallbacks=array(),
$markup=array(),
$flags = array()) {
- global $wgLegalTitleChars;
$this->mLangObj = $langobj;
$this->mMainLanguageCode = $maincode;
$this->mVariants = $variants;
$m = array('begin'=>'-{', 'flagsep'=>'|', 'codesep'=>':',
'varsep'=>';', 'end'=>'}-');
$this->mMarkup = array_merge($m, $markup);
- $f = array('A'=>'A', 'T'=>'T');
+ $f = array('A'=>'A', 'T'=>'T', 'R' => 'R');
$this->mFlags = array_merge($f, $flags);
}
* @access public
*/
function getPreferredVariant( $fromUser = true ) {
- global $wgUser, $wgRequest, $wgVariantArticlePath;
+ global $wgUser, $wgRequest, $wgVariantArticlePath, $wgDefaultLanguageVariant;
if($this->mPreferredVariant)
return $this->mPreferredVariant;
return $this->mPreferredVariant;
}
+ // see if default variant is globaly set
+ if($wgDefaultLanguageVariant != false && in_array( $wgDefaultLanguageVariant, $this->mVariants )){
+ $this->mPreferredVariant = $wgDefaultLanguageVariant;
+ return $this->mPreferredVariant;
+ }
+
# FIXME rewrite code for parsing http header. The current code
# is written specific for detecting zh- variants
if( !$this->mPreferredVariant ) {
$pv = substr($zh,0,5);
}
}
- return $pv;
+ // don't try to return bad variant
+ if(in_array( $pv, $this->mVariants ))
+ return $pv;
}
+
+ return $this->mMainLanguageCode;
+
}
/**
function parserConvert( $text, &$parser ) {
global $wgDisableLangConversion;
/* don't do anything if this is the conversion table */
- if ( $parser->mTitle->getNamespace() == NS_MEDIAWIKI &&
+ if ( $parser->getTitle()->getNamespace() == NS_MEDIAWIKI &&
strpos($parser->mTitle->getText(), "Conversiontable") !== false )
{
return $text;
return $text;
}
+ /**
+ * Parse flags with syntax -{FLAG| ... }-
+ *
+ */
+ function parseFlags($marked){
+ $flags = array();
+
+ // process flag only if the flag is valid
+ if(strlen($marked) < 2 || !(in_array($marked[0],$this->mFlags) && $marked[1]=='|' ) )
+ return array($marked,array());
+
+ $tt = explode($this->mMarkup['flagsep'], $marked, 2);
+
+ if(sizeof($tt) == 2) {
+ $f = explode($this->mMarkup['varsep'], $tt[0]);
+ foreach($f as $ff) {
+ $ff = trim($ff);
+ if(array_key_exists($ff, $this->mFlags) &&
+ !array_key_exists($this->mFlags[$ff], $flags))
+ $flags[] = $this->mFlags[$ff];
+ }
+ $rules = $tt[1];
+ }
+ else
+ $rules = $marked;
+
+ if( !in_array('R',$flags) ){
+ //FIXME: may cause trouble here...
+ //strip since it interferes with the parsing, plus,
+ //all spaces should be stripped in this tag anyway.
+ $rules = str_replace(' ', '', $rules);
+ }
+
+ return array($rules,$flags);
+ }
+
/**
* convert text to different variants of a language. the automatic
* conversion is done in autoConvert(). here we parse the text
return $text;
if( $isTitle ) {
+
+ // use the title from the T flag if any
+ if($this->mTitleFromFlag){
+ $this->mTitleFromFlag = false;
+ return $this->mTitleDisplay;
+ }
+
+ // check for __NOTC__ tag
if( !$this->mDoTitleConvert ) {
$this->mTitleDisplay = $text;
return $text;
}
}
- if( !$this->mDoContentConvert )
- return $text;
-
$plang = $this->getPreferredVariant();
if( isset( $this->mVariantFallbacks[$plang] ) ) {
$fallback = $this->mVariantFallbacks[$plang];
} else {
- // This sounds... bad?
- $fallback = '';
+ $fallback = $this->mMainLanguageCode;
}
$tarray = explode($this->mMarkup['begin'], $text);
$tfirst = array_shift($tarray);
- $text = $this->autoConvert($tfirst);
- foreach($tarray as $txt) {
+ if($this->mDoContentConvert)
+ $text = $this->autoConvert($tfirst);
+ else
+ $text = $tfirst;
+ foreach($tarray as $txt) {
$marked = explode($this->mMarkup['end'], $txt, 2);
- $flags = array();
- $tt = explode($this->mMarkup['flagsep'], $marked[0], 2);
- if(sizeof($tt) == 2) {
- $f = explode($this->mMarkup['varsep'], $tt[0]);
- foreach($f as $ff) {
- $ff = trim($ff);
- if(array_key_exists($ff, $this->mFlags) &&
- !array_key_exists($this->mFlags[$ff], $flags))
- $flags[] = $this->mFlags[$ff];
+ // strip the flags from syntax like -{T| ... }-
+ list($rules,$flags) = $this->parseFlags($marked[0]);
+
+ // proces R flag: output raw content of -{ ... }-
+ if( in_array('R',$flags) ){
+ $disp = $rules;
+ } else if( $this->mDoContentConvert){
+ // parse the contents -{ ... }-
+ $carray = $this->parseManualRule($rules, $flags);
+
+ $disp = '';
+ if(array_key_exists($plang, $carray)) {
+ $disp = $carray[$plang];
+ } else if(array_key_exists($fallback, $carray)) {
+ $disp = $carray[$fallback];
}
- $rules = $tt[1];
+ } else{
+ // if we don't do content convert, still strip the -{}- tags
+ $disp = $rules;
+ $flags = array();
}
- else
- $rules = $marked[0];
-
- //FIXME: may cause trouble here...
- //strip since it interferes with the parsing, plus,
- //all spaces should be stripped in this tag anyway.
- $rules = str_replace(' ', '', $rules);
-
- $carray = $this->parseManualRule($rules, $flags);
- $disp = '';
- if(array_key_exists($plang, $carray))
- $disp = $carray[$plang];
- else if(array_key_exists($fallback, $carray))
- $disp = $carray[$fallback];
+
if($disp) {
- if(in_array('T', $flags))
+ // use syntax -{T|zh:TitleZh;zh-tw:TitleTw}- for custom conversion in title
+ if(in_array('T', $flags)){
+ $this->mTitleFromFlag = true;
$this->mTitleDisplay = $disp;
+ }
else
$text .= $disp;
+ // use syntax -{A|zh:WordZh;zh-tw:WordTw}- to introduce a custom mapping between
+ // words WordZh and WordTw in the whole text
if(in_array('A', $flags)) {
- /* modify the conversion table for this session*/
/* fill in the missing variants, if any,
with fallbacks */
else {
$text .= $marked[0];
}
- if(array_key_exists(1, $marked))
- $text .= $this->autoConvert($marked[1]);
+ if(array_key_exists(1, $marked)){
+ if( $this->mDoContentConvert )
+ $text .= $this->autoConvert($marked[1]);
+ else
+ $text .= $marked[1];
+ }
}
return $text;
// not in cache, or we need a fresh reload.
// we will first load the default tables
// then update them using things in MediaWiki:Zhconversiontable/*
- global $wgMessageCache;
$this->loadDefaultTables();
foreach($this->mVariants as $var) {
$cached = $this->parseCachedTable($var);
/**
* Armour rendered math against conversion
- * Default is do nothing, since the process can interfere with
- * parseManualRule() if format -{ alter1 ; alter2 }- is enabled
+ * Wrap math into rawoutput -{R| math }- syntax
*/
function armourMath($text){
- return $text;
+ $ret = $this->mMarkup['begin'] . 'R|' . $text . $this->mMarkup['end'];
+ return $ret;
}