* added missing setIndexedTagName for some upload api array results
[lhc/web/wiklou.git] / includes / api / ApiFormatJson.php
index 7e72693..1d7e3dc 100644 (file)
@@ -1,12 +1,11 @@
 <?php
 
-
 /*
  * Created on Sep 19, 2006
  *
  * API for MediaWiki 1.8+
  *
- * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,38 +28,80 @@ if (!defined('MEDIAWIKI')) {
        require_once ('ApiFormatBase.php');
 }
 
+/**
+ * @ingroup API
+ */
 class ApiFormatJson extends ApiFormatBase {
 
        private $mIsRaw;
-       
+
        public function __construct($main, $format) {
                parent :: __construct($main, $format);
-               $this->mIsRaw = ($format === 'raw' || $format === 'rawfm');
+               $this->mIsRaw = ($format === 'rawfm');
        }
 
        public function getMimeType() {
-               return 'application/json';
+               return 'text/javascript';
        }
-       
+
        public function getNeedsRawData() {
                return $this->mIsRaw;
        }
        
+       public function getWantsHelp() {
+               // Help is always ugly in JSON
+               return false;
+       }
+
        public function execute() {
-               if (!function_exists('json_encode') || $this->getIsHtml()) {
+               $prefix = $suffix = "";
+
+               $params = $this->extractRequestParams();
+               $callback = $params['callback'];
+               if(!is_null($callback)) {
+                       $prefix = preg_replace("/[^][.\\'\\\"_A-Za-z0-9]/", "", $callback ) . "(";
+                       $suffix = ")";
+               }
+
+               // Some versions of PHP have a broken json_encode, see PHP bug 
+               // 46944. Test encoding an affected character (U+20000) to 
+               // avoid this.
+               $this->printText( $prefix . $this->getJsonEncode($this->getResultData(),   $this->getIsHtml() )  . $suffix);            
+       }       
+       /*
+        * static to support static calls to json output (instead of json_encode function) 
+        * @param array $results  the results array to output as a json string
+        * @parm isHTML if the output is html
+        */     
+       public static function getJsonEncode($value, $isHtml=false){
+               if (!function_exists('json_encode') || $isHtml || strtolower(json_encode("\xf0\xa0\x80\x80")) != '\ud840\udc00') {
                        $json = new Services_JSON();
-                       $this->printText($json->encode($this->getResultData(), $this->getIsHtml()));
+                       return $json->encode($value, $isHtml) ;
                } else {
-                       $this->printText(json_encode($this->getResultData()));
+                       return json_encode($value);
                }
        }
 
-       protected function getDescription() {
-               return 'Output data in JSON format';
+       public function getAllowedParams() {
+               return array (
+                       'callback' => null
+               );
+       }
+
+       public function getParamDescription() {
+               return array (
+                       'callback' => 'If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.',
+               );
+       }
+
+       public function getDescription() {
+               if ($this->mIsRaw)
+                       return 'Output data with the debuging elements in JSON format' . parent :: getDescription();
+               else
+                       return 'Output data in JSON format' . parent :: getDescription();
        }
 
        public function getVersion() {
                return __CLASS__ . ': $Id$';
        }
 }
-?>
\ No newline at end of file