public function getCustomPrinter() {
switch ( $this->getFormat() ) {
case 'json':
- return $this->getMain()->createPrinterByName( 'json' . $this->fm );
+ return new ApiOpenSearchFormatJson(
+ $this->getMain(), $this->fm, $this->getParameter( 'warningsaserror' )
+ );
case 'xml':
$printer = $this->getMain()->createPrinterByName( 'xml' . $this->fm );
switch ( $this->getFormat() ) {
case 'json':
// http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.1
- $result->addArrayType( null, 'BCarray' );
+ $result->addArrayType( null, 'array' );
$result->addValue( null, 0, strval( $search ) );
$terms = array();
$descriptions = array();
'format' => array(
ApiBase::PARAM_DFLT => 'json',
ApiBase::PARAM_TYPE => array( 'json', 'jsonfm', 'xml', 'xmlfm' ),
- )
+ ),
+ 'warningsaserror' => false,
);
}
}
}
}
+
+class ApiOpenSearchFormatJson extends ApiFormatJson {
+ private $warningsAsError = false;
+
+ public function __construct( ApiMain $main, $fm, $warningsAsError ) {
+ parent::__construct( $main, "json$fm" );
+ $this->warningsAsError = $warningsAsError;
+ }
+
+ public function execute() {
+ if ( !$this->getResult()->getResultData( 'error' ) ) {
+ $result = $this->getResult();
+
+ // Ignore warnings or treat as errors, as requested
+ $warnings = $result->removeValue( 'warnings', null );
+ if ( $this->warningsAsError && $warnings ) {
+ $this->dieUsage(
+ 'Warnings cannot be represented in OpenSearch JSON format', 'warnings', 0,
+ array( 'warnings' => $warnings )
+ );
+ }
+
+ // Ignore any other unexpected keys (e.g. from $wgDebugToolbar)
+ $remove = array_keys( array_diff_key(
+ $result->getResultData(),
+ array( 0 => 'search', 1 => 'terms', 2 => 'descriptions', 3 => 'urls' )
+ ) );
+ foreach ( $remove as $key ) {
+ $result->removeValue( $key, null );
+ }
+ }
+
+ parent::execute();
+ }
+}