Switch some HTMLForms in special pages to OOUI
[lhc/web/wiklou.git] / includes / api / ApiFormatJson.php
index 966e82d..43877b7 100644 (file)
  */
 class ApiFormatJson extends ApiFormatBase {
 
-       private $mIsRaw;
+       private $isRaw;
 
        public function __construct( ApiMain $main, $format ) {
                parent::__construct( $main, $format );
-               $this->mIsRaw = ( $format === 'rawfm' );
+               $this->isRaw = ( $format === 'rawfm' );
        }
 
        public function getMimeType() {
                $params = $this->extractRequestParams();
                // callback:
-               if ( $params['callback'] ) {
+               if ( isset( $params['callback'] ) ) {
                        return 'text/javascript';
                }
 
                return 'application/json';
        }
 
+       /**
+        * @deprecated since 1.25
+        */
        public function getNeedsRawData() {
-               return $this->mIsRaw;
+               return $this->isRaw;
        }
 
        /**
@@ -62,11 +65,37 @@ class ApiFormatJson extends ApiFormatBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
-               $json = FormatJson::encode(
-                       $this->getResultData(),
-                       $this->getIsHtml(),
-                       $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK
-               );
+
+               $opt = 0;
+               if ( $this->isRaw ) {
+                       $opt |= FormatJson::ALL_OK;
+                       $transform = array();
+               } else {
+                       switch ( $params['formatversion'] ) {
+                               case 1:
+                                       $opt |= $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK;
+                                       $transform = array(
+                                               'BC' => array(),
+                                               'Types' => array( 'AssocAsObject' => true ),
+                                               'Strip' => 'all',
+                                       );
+                                       break;
+
+                               case 2:
+                               case 'latest':
+                                       $opt |= $params['ascii'] ? FormatJson::XMLMETA_OK : FormatJson::ALL_OK;
+                                       $transform = array(
+                                               'Types' => array( 'AssocAsObject' => true ),
+                                               'Strip' => 'all',
+                                       );
+                                       break;
+
+                               default:
+                                       $this->dieUsage( __METHOD__ . ': Unknown value for \'formatversion\'', 'unknownformatversion' );
+                       }
+               }
+               $data = $this->getResult()->getResultData( null, $transform );
+               $json = FormatJson::encode( $data, $this->getIsHtml(), $opt );
 
                // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API, so we need to
@@ -77,9 +106,8 @@ class ApiFormatJson extends ApiFormatBase {
                        );
                }
 
-               $callback = $params['callback'];
-               if ( $callback !== null ) {
-                       $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback );
+               if ( isset( $params['callback'] ) ) {
+                       $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $params['callback'] );
                        # Prepend a comment to try to avoid attacks against content
                        # sniffers, such as bug 68187.
                        $this->printText( "/**/$callback($json)" );
@@ -89,7 +117,11 @@ class ApiFormatJson extends ApiFormatBase {
        }
 
        public function getAllowedParams() {
-               return array(
+               if ( $this->isRaw ) {
+                       return array();
+               }
+
+               $ret = array(
                        'callback' => array(
                                ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-callback',
                        ),
@@ -97,6 +129,16 @@ class ApiFormatJson extends ApiFormatBase {
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-utf8',
                        ),
+                       'ascii' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-ascii',
+                       ),
+                       'formatversion' => array(
+                               ApiBase::PARAM_TYPE => array( 1, 2, 'latest' ),
+                               ApiBase::PARAM_DFLT => 1,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-formatversion',
+                       ),
                );
+               return $ret;
        }
 }