X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiFormatJson.php;h=1d7e3dccd369cf4f0b01d8f797e1c033e2c2bdd9;hb=305179ffa3d141973d5ddb31261d8e1730c18684;hp=7e72693086ef346cc5dee8022e24a339a0915ee1;hpb=f928f9a6cdd782fa6bbe813747774d49400e27dd;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php index 7e72693086..1d7e3dccd3 100644 --- a/includes/api/ApiFormatJson.php +++ b/includes/api/ApiFormatJson.php @@ -1,12 +1,11 @@ + * Copyright (C) 2006 Yuri Astrakhan @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