Index: includes/api/ApiMain.php =================================================================== --- includes/api/ApiMain.php (revision 75473) +++ includes/api/ApiMain.php (working copy) @@ -63,6 +63,7 @@ 'feedwatchlist' => 'ApiFeedWatchlist', 'help' => 'ApiHelp', 'paraminfo' => 'ApiParamInfo', + 'rsd' => 'ApiRsd', // Write modules 'purge' => 'ApiPurge', Index: includes/api/ApiRsd.php =================================================================== --- includes/api/ApiRsd.php (revision 0) +++ includes/api/ApiRsd.php (revision 0) @@ -0,0 +1,176 @@ +getResult(); + + + $result->addValue( null, 'version', '1.0' ); + $result->addValue( null, 'xmlns', 'http://archipelago.phrasewise.com/rsd' ); + + $service = array( + 'engineName' => array( + '*' => 'MediaWiki' + ), + 'engineLink' => array( + '*' => 'http://www.mediawiki.org/' + ), + 'apis' => $this->formatRsdApiList() + ); + + $result->setIndexedTagName( $service['apis'], 'api' ); + + $result->addValue( null, 'service', $service ); + } + + public function getCustomPrinter() { + $printer = $this->getMain()->createPrinterByName( 'xml' ); + $printer->setRootElement( 'rsd' ); + return $printer; + } + + public function getAllowedParams() { + return array(); + } + + public function getParamDescription() { + return array(); + } + + public function getDescription() { + return 'Export an RSD schema'; + } + + protected function getExamples() { + return array( + 'api.php?action=rsd' + ); + } + + /** + * Builds an internal list of APIs to expose information about. + * Normally this only lists the MediaWiki API, with its base URL, + * link to documentation, and a marker as to available authentication + * (to aid in OAuth client apps switching to support in the future). + * + * Extensions can expose other APIs, such as WordPress or Twitter- + * compatible APIs, by hooking 'ApiRsdServiceApis' and adding more + * elements to the array. + * + * See http://cyber.law.harvard.edu/blogs/gems/tech/rsd.html for + * the base RSD spec, and check WordPress and StatusNet sites for + * in-production examples listing several blogging and micrblogging + * APIs. + * + * @return array + */ + protected function getRsdApiList() + { + $apis = array( + 'MediaWiki' => array( + // The API link is required for all RSD API entries. + 'apiLink' => wfExpandUrl( wfScript( 'api' ) ), + + // Docs link is optional, but recommended. + 'docs' => 'http://mediawiki.org/wiki/API', + + // Some APIs may need a blog ID, but it may be left blank. + 'blogID' => '', + + // Additional settings are optional. + 'settings' => array( + // Change this to true in the future as an aid to + // machine discovery of OAuth for API access. + 'OAuth' => false, + ) + ), + ); + wfRunHooks( 'ApiRsdServiceApis', array( &$apis ) ); + return $apis; + } + + /** + * Formats the internal list of exposed APIs into an array suitable + * to pass to the API's XML formatter. + * + * @return array + */ + protected function formatRsdApiList() + { + $apis = $this->getRsdApiList(); + + $outputData = array(); + foreach ($apis as $name => $info) { + $data = array( + 'name' => $name, + 'preferred' => wfBoolToStr( $name == 'MediaWiki' ), + 'apiLink' => $info['apiLink'], + 'blogID' => isset( $info['blogID'] ) ? $info['blogID'] : '' + ); + if( isset( $info['docs'] ) ) { + $data['settings']['docs'] = array( + '*' => $info['docs'], + ); + } + if( isset( $info['settings'] ) ) { + foreach( $info['settings'] as $setting => $val ) { + if( is_bool( $val ) ) { + $xmlVal = wfBoolToStr( $val ); + } else { + $xmlVal = $val; + } + $data['settings'][] = array( + 'name' => $setting, + '*' => $xmlVal, + ); + } + } + if( isset( $data['settings'] ) ) { + $data['settings']['_element'] = 'setting'; + } + $outputData[] = $data; + } + return $outputData; + } + public function getVersion() { + return __CLASS__ . ': $Id$'; + } +} Property changes on: includes/api/ApiRsd.php ___________________________________________________________________ Added: svn:eol-style + native Index: includes/AutoLoader.php =================================================================== --- includes/AutoLoader.php (revision 75473) +++ includes/AutoLoader.php (working copy) @@ -297,6 +297,7 @@ 'ApiPatrol' => 'includes/api/ApiPatrol.php', 'ApiProtect' => 'includes/api/ApiProtect.php', 'ApiPurge' => 'includes/api/ApiPurge.php', + 'ApiRsd' => 'includes/api/ApiRsd.php', 'ApiQuery' => 'includes/api/ApiQuery.php', 'ApiQueryAllCategories' => 'includes/api/ApiQueryAllCategories.php', 'ApiQueryAllimages' => 'includes/api/ApiQueryAllimages.php', Index: includes/Skin.php =================================================================== --- includes/Skin.php (revision 75473) +++ includes/Skin.php (working copy) @@ -216,6 +216,16 @@ 'title' => wfMsgForContent( 'opensearch-desc' ), ) ); + # Real Simple Discovery link, provides auto-discovery information + # for the MediaWiki API (and potentially additional custom API + # support such as WordPress or Twitter-compatible APIs for a + # blogging extension, etc) + $out->addLink( array( + 'rel' => 'EditURI', + 'type' => 'application/rsd+xml', + 'href' => wfExpandUrl( wfAppendQuery( wfScript( 'api' ), array( 'action' => 'rsd' ) ) ), + ) ); + $this->addMetadataLinks( $out ); $this->mRevisionId = $out->mRevisionId;