https://www.mediawiki.org/wiki/Special:Code/MediaWiki/110040

Revision: 110040
Author:   preilly
Date:     2012-01-26 00:32:05 +0000 (Thu, 26 Jan 2012)
Log Message:
-----------
create generic method for parsing WikiText to array of options

Modified Paths:
--------------
    trunk/extensions/ZeroRatedMobileAccess/ZeroRatedMobileAccess.body.php

Modified: trunk/extensions/ZeroRatedMobileAccess/ZeroRatedMobileAccess.body.php
===================================================================
--- trunk/extensions/ZeroRatedMobileAccess/ZeroRatedMobileAccess.body.php       
2012-01-26 00:06:50 UTC (rev 110039)
+++ trunk/extensions/ZeroRatedMobileAccess/ZeroRatedMobileAccess.body.php       
2012-01-26 00:32:05 UTC (rev 110040)
@@ -1,7 +1,7 @@
 <?php
 
 class ExtZeroRatedMobileAccess {
-       const VERSION = '0.0.8';
+       const VERSION = '0.0.9';
 
        public static $renderZeroRatedLandingPage;
        public static $renderZeroRatedBanner;
@@ -326,12 +326,96 @@
                return true;
        }
 
+       public function parseWikiTextToArray( Array $formatter, $wikiText, 
$nChild = false ) {
+               $options = array();
+               $data = explode( PHP_EOL, $wikiText );
+               if ( is_array( $formatter ) && !$nChild ) {
+                       $arrayKeys = array_keys( $formatter );
+                       $keyCount = count( $arrayKeys );
+                       $index = 0;
+                       foreach ( $data as $key => $rawData ) {
+                               $index = ( intval( $key ) % $keyCount === 0 ) ? 
0 : $index + 1;
+                               if ( in_array( $index, $arrayKeys ) ) {
+                                       $data = trim( str_replace( '*', '', 
$rawData ) );
+                                       if ( is_array( $formatter[$index] ) ) {
+                                               $name = 
$formatter[$index]['name'];
+                                               if ( isset( 
$formatter[$index]['callback'] ) ) {
+                                                       $callback = 
$formatter[$index]['callback'];
+                                                       if ( method_exists( 
$this, $callback ) ) {
+                                                               if ( isset( 
$formatter[$index]['parameters'] ) ) {
+                                                                       if ( 
is_array( $formatter[$index]['parameters'] ) ) {
+                                                                               
$parameters = array();
+                                                                               
foreach ( $formatter[$index]['parameters'] as $parameter ) {
+                                                                               
        if ( isset( $options[$prefixName][$parameter] ) ) {
+                                                                               
                $parameters[$parameter] = $options[$prefixName][$parameter];
+                                                                               
        }
+                                                                               
}
+                                                                               
$data = $this->$callback( $data, $parameters );
+                                                                       } else {
+                                                                               
$parameter = $formatter[$index]['parameters'];
+                                                                               
if ( isset( $options[$prefixName][$parameter] ) ) {
+                                                                               
        $parameterValue = $options[$prefixName][$parameter];
+                                                                               
        $data = $this->$callback( $data, $parameterValue );
+                                                                               
}
+                                                                       }
+                                                               } else {
+                                                                       $data = 
$this->$callback( $data );
+                                                               }
+                                                       }
+                                               }
+                                       } else {
+                                               $name = $formatter[$index];
+                                       }
+                                       if ( $index === 0 ) {
+                                               $prefixName = strtoupper( $data 
);
+                                       }
+                                       $options[$prefixName][$name] = $data;
+                               }
+                       }
+               } else if ( is_array( $formatter ) && $nChild ) {
+                       foreach ( $data as $key => $rawData ) {
+                               if ( strpos( $rawData, '*' ) === 0 && strpos( 
$rawData, '**' ) !== 0 && $key >= 0 ) {
+                                       $data = trim( str_replace( '*', '', 
$rawData ) );
+                                       $prefixName = strtoupper( $data );
+                                       $options[$prefixName] = '';
+                               } else if ( strpos( $rawData, '**' ) === 0 && 
$key > 0 ) {
+                                       $data = trim( str_replace( '*', '', 
$rawData ) );
+                                       if ( is_array( $formatter ) ) {
+                                               if ( isset( 
$formatter[0]['callback'] ) ) {
+                                                       $callback = 
$formatter[0]['callback'];
+                                                       if ( method_exists( 
$this, $callback ) ) {
+                                                               $data = 
$this->$callback( $data );
+                                                               if ( $data ) {
+                                                                       
$options[$prefixName][] = $data;
+                                                               }
+                                                       }
+                                               }
+                                       } else {
+                                               $options[$prefixName][] = $data;
+                                       }
+                               }
+                       }
+               }
+               return $options;
+       }
+
+       public function createUrlCallback( $url, $name ) {
+               $carrierLink = Html::rawElement( 'a',
+                       array( 'href' => $url ),
+                               $name );
+               return $carrierLink;
+       }
+
+       public function intValCallback( $int ) {
+               return intval( $int );
+       }
+
        /**
        * Returns the carrier options array parsed from a valid wiki page
        *
        * @return Array
        */
-       private static function createCarrierOptionsFromWikiText() {
+       private function createCarrierOptionsFromWikiText() {
                global $wgMemc;
                wfProfileIn( __METHOD__ );
 
@@ -347,33 +431,19 @@
                }
 
                if ( !$carrierOptions ) {
-                       $carrierOptions = array();
-                       $lines = array();
                        if ( $rev ) {
-                               $lines = explode( "\n", $rev );
+                               $formatter = array(
+                                        0 => 'name',
+                                        1 => array( 'name' => 'link',
+                                                                'callback' => 
'createUrlCallback',
+                                                                'parameters' 
=> 'name',
+                                               ),
+                                        2 => array( 'name' => 'partnerId',
+                                                                'callback' => 
'intValCallback'
+                                               ),
+                               );
+                                $carrierOptions = $this->parseWikiTextToArray( 
$formatter, $rev );
                        }
-                       if ( $lines && count( $lines ) > 0 ) {
-                               $sizeOfLines = sizeof( $lines );
-                               for ( $i = 0; $i < $sizeOfLines; $i++ ) {
-                                       $line = $lines[$i];
-                                       if ( strpos( $line, '*' ) === 0 && 
strpos( $line, '**' ) !== 0 && $i >= 0 ) {
-                                               $carrierName = strtoupper( 
str_replace( '* ', '', $line ) );
-                                               $carrierRaw = str_replace( '* 
', '', $line );
-                                               $carrierOptions[$carrierName] = 
'';
-                                               
$carrierOptions[$carrierName]['name'] = $carrierRaw;
-                                       } elseif ( strpos( $line, '**' ) === 0 
&& $i > 0 ) {
-                                               if ( $i % 3 === 1 ) {
-                                                       
$carrierOptions[$carrierName]['url'] = trim( str_replace( '** ', '', $line ) );
-                                                       $carrierLink = 
Html::rawElement( 'a',
-                                                               array( 'href' 
=> $carrierOptions[$carrierName]['url'] ),
-                                                                       
$carrierOptions[$carrierName]['name'] );
-                                                       
$carrierOptions[$carrierName]['link'] = $carrierLink;
-                                               } elseif ( $i % 3 === 2 ) {
-                                                       
$carrierOptions[$carrierName]['partnerId'] = intval( trim( str_replace( '** ', 
'', $line ) ) );
-                                               }
-                                       }
-                               }
-                       }
                        $wgMemc->set( $key, $carrierOptions, self::getMaxAge() 
);
                }
                wfProfileOut( __METHOD__ );
@@ -433,12 +503,25 @@
                return array( $key, $rev );
        }
 
+       public function languagePercentageCallback( $data ) {
+               $languageArray = array();
+               $lineParts = explode( '#', $data );
+               $language = ( isset( $lineParts[0] ) ) ? trim( $lineParts[0] ) 
: trim( $data );
+               if ( $language !== 'portal' && $language !== 'other' ) {
+                       $languageArray = ( isset( $lineParts[1] ) ) ?
+                               array(  'language'  =>  $language,
+                                               'percentage'  =>  intval( 
str_replace( '%', '', trim( $lineParts[1] ) ) ) ) :
+                               $language;
+               }
+               return $languageArray;
+       }
+
        /**
        * Returns the language options array parsed from a valid wiki page
        *
        * @return Array
        */
-       private static function createLanguageOptionsFromWikiText() {
+       private function createLanguageOptionsFromWikiText() {
                global $wgMemc;
                wfProfileIn( __METHOD__ );
                $languageOptionsWikiPage = wfMsgForContent( 
'zero-rated-mobile-access-language-options-wiki-page' );
@@ -456,29 +539,13 @@
                        $languageOptions = array();
                        $lines = array();
                        if ( $rev ) {
-                               $lines = explode( "\n", $rev );
+                               $formatter = array(
+                                        0 => array( 'name' => 'partnerId',
+                                                                'callback' => 
'languagePercentageCallback'
+                                               ),
+                               );
+                               $languageOptions = $this->parseWikiTextToArray( 
$formatter, $rev, true );
                        }
-                       if ( $lines && count( $lines ) > 0 ) {
-                               $sizeOfLines = sizeof( $lines );
-                               for ( $i = 0; $i < $sizeOfLines; $i++ ) {
-                                       $line = $lines[$i];
-                                       if ( strpos( $line, '*' ) === 0 && 
strpos( $line, '**' ) !== 0 && $i >= 0 ) {
-                                               $countryName = strtoupper( 
str_replace( '* ', '', $line ) );
-                                               $languageOptions[$countryName] 
= '';
-                                       } elseif ( strpos( $line, '**' ) === 0 
&& $i > 0 ) {
-                                               $lineParts = explode( '#', 
$line );
-                                               $language = ( isset( 
$lineParts[0] ) ) ?
-                                                       trim( str_replace( '** 
', '', $lineParts[0] ) ) :
-                                                       trim( str_replace( '** 
', '', $line ) ) ;
-                                               if ( $language !== 'portal' && 
$language !== 'other' ) {
-                                                       
$languageOptions[$countryName][] = ( isset( $lineParts[1] ) ) ?
-                                                               array(  
'language'  =>  $language,
-                                                                               
'percentage'  =>  intval( str_replace( '%', '', trim( $lineParts[1] ) ) ) ) :
-                                                               $language;
-                                               }
-                                       }
-                               }
-                       }
                        $wgMemc->set( $key, $languageOptions, self::getMaxAge() 
);
                }
                wfProfileOut( __METHOD__ );


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to