2006-09-23 15:57:16 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Created on Sep 19, 2006
|
|
|
|
|
*
|
|
|
|
|
* API for MediaWiki 1.8+
|
|
|
|
|
*
|
2007-05-20 23:31:44 +00:00
|
|
|
* Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
|
2006-09-23 15:57:16 +00:00
|
|
|
*
|
|
|
|
|
* 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
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
if (!defined('MEDIAWIKI')) {
|
|
|
|
|
// Eclipse helper - will be ignored in production
|
2006-10-01 02:02:13 +00:00
|
|
|
require_once ('ApiBase.php');
|
2006-09-23 15:57:16 +00:00
|
|
|
}
|
|
|
|
|
|
2007-04-20 08:55:14 +00:00
|
|
|
/**
|
2007-05-20 10:08:40 +00:00
|
|
|
* This is the abstract base class for API formatters.
|
|
|
|
|
*
|
2007-04-20 08:55:14 +00:00
|
|
|
* @addtogroup API
|
|
|
|
|
*/
|
2006-09-23 15:57:16 +00:00
|
|
|
abstract class ApiFormatBase extends ApiBase {
|
|
|
|
|
|
2007-12-01 17:37:08 +00:00
|
|
|
private $mIsHtml, $mFormat, $mUnescapeAmps, $mHelp;
|
2006-09-23 15:57:16 +00:00
|
|
|
|
|
|
|
|
/**
|
2007-05-20 10:08:40 +00:00
|
|
|
* Create a new instance of the formatter.
|
|
|
|
|
* If the format name ends with 'fm', wrap its output in the proper HTML.
|
2006-09-23 15:57:16 +00:00
|
|
|
*/
|
|
|
|
|
public function __construct($main, $format) {
|
2006-10-03 05:41:55 +00:00
|
|
|
parent :: __construct($main, $format);
|
2006-09-23 15:57:16 +00:00
|
|
|
|
|
|
|
|
$this->mIsHtml = (substr($format, -2, 2) === 'fm'); // ends with 'fm'
|
|
|
|
|
if ($this->mIsHtml)
|
|
|
|
|
$this->mFormat = substr($format, 0, -2); // remove ending 'fm'
|
|
|
|
|
else
|
|
|
|
|
$this->mFormat = $format;
|
|
|
|
|
$this->mFormat = strtoupper($this->mFormat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Overriding class returns the mime type that should be sent to the client.
|
2006-09-27 05:13:48 +00:00
|
|
|
* This method is not called if getIsHtml() returns true.
|
2006-09-23 15:57:16 +00:00
|
|
|
* @return string
|
|
|
|
|
*/
|
2006-09-27 05:13:48 +00:00
|
|
|
public abstract function getMimeType();
|
2006-09-23 15:57:16 +00:00
|
|
|
|
2007-05-20 10:08:40 +00:00
|
|
|
/**
|
|
|
|
|
* If formatter outputs data results as is, the results must first be sanitized.
|
|
|
|
|
* An XML formatter on the other hand uses special tags, such as "_element" for special handling,
|
|
|
|
|
* and thus needs to override this function to return true.
|
|
|
|
|
*/
|
2006-09-27 05:13:48 +00:00
|
|
|
public function getNeedsRawData() {
|
2006-09-25 04:12:07 +00:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2007-09-18 22:10:09 +00:00
|
|
|
/**
|
|
|
|
|
* Specify whether or not ampersands should be escaped to '&' when rendering. This
|
|
|
|
|
* should only be set to true for the help message when rendered in the default (xmlfm)
|
|
|
|
|
* format. This is a temporary special-case fix that should be removed once the help
|
|
|
|
|
* has been reworked to use a fully html interface.
|
|
|
|
|
*
|
|
|
|
|
* @param boolean Whether or not ampersands should be escaped.
|
|
|
|
|
*/
|
|
|
|
|
public function setUnescapeAmps ( $b ) {
|
|
|
|
|
$this->mUnescapeAmps = $b;
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-23 15:57:16 +00:00
|
|
|
/**
|
|
|
|
|
* Returns true when an HTML filtering printer should be used.
|
|
|
|
|
* The default implementation assumes that formats ending with 'fm'
|
|
|
|
|
* should be formatted in HTML.
|
|
|
|
|
*/
|
2006-09-27 05:13:48 +00:00
|
|
|
public function getIsHtml() {
|
2006-09-23 15:57:16 +00:00
|
|
|
return $this->mIsHtml;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initialize the printer function and prepares the output headers, etc.
|
|
|
|
|
* This method must be the first outputing method during execution.
|
|
|
|
|
* A help screen's header is printed for the HTML-based output
|
|
|
|
|
*/
|
2006-09-27 05:13:48 +00:00
|
|
|
function initPrinter($isError) {
|
|
|
|
|
$isHtml = $this->getIsHtml();
|
|
|
|
|
$mime = $isHtml ? 'text/html' : $this->getMimeType();
|
2007-07-06 03:41:04 +00:00
|
|
|
$script = wfScript( 'api' );
|
2006-10-18 06:32:40 +00:00
|
|
|
|
2006-10-16 00:08:03 +00:00
|
|
|
// Some printers (ex. Feed) do their own header settings,
|
|
|
|
|
// in which case $mime will be set to null
|
|
|
|
|
if (is_null($mime))
|
2006-10-18 06:32:40 +00:00
|
|
|
return; // skip any initialization
|
|
|
|
|
|
2007-01-18 00:01:20 +00:00
|
|
|
header("Content-Type: $mime; charset=utf-8");
|
2006-10-18 06:32:40 +00:00
|
|
|
|
2006-09-23 15:57:16 +00:00
|
|
|
if ($isHtml) {
|
2007-06-29 01:25:07 +00:00
|
|
|
?>
|
2006-10-18 06:32:40 +00:00
|
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
2007-10-30 21:39:10 +00:00
|
|
|
<?php if ($this->mUnescapeAmps) {
|
2007-10-24 19:34:29 +00:00
|
|
|
?> <title>MediaWiki API</title>
|
2007-10-30 21:39:10 +00:00
|
|
|
<?php } else {
|
2007-10-24 19:34:29 +00:00
|
|
|
?> <title>MediaWiki API Result</title>
|
2007-10-30 21:39:10 +00:00
|
|
|
<?php } ?>
|
2006-10-18 06:32:40 +00:00
|
|
|
</head>
|
|
|
|
|
<body>
|
2006-09-23 15:57:16 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
2007-07-06 03:41:04 +00:00
|
|
|
if( !$isError ) {
|
2007-06-29 01:25:07 +00:00
|
|
|
?>
|
2006-10-18 06:32:40 +00:00
|
|
|
<br/>
|
|
|
|
|
<small>
|
2007-07-06 03:41:04 +00:00
|
|
|
You are looking at the HTML representation of the <?php echo( $this->mFormat ); ?> format.<br/>
|
2006-10-21 08:26:32 +00:00
|
|
|
HTML is good for debugging, but probably is not suitable for your application.<br/>
|
2007-07-06 02:19:56 +00:00
|
|
|
See <a href='http://www.mediawiki.org/wiki/API'>complete documentation</a>, or
|
2007-07-06 03:41:04 +00:00
|
|
|
<a href='<?php echo( $script ); ?>'>API help</a> for more information.
|
2006-10-18 06:32:40 +00:00
|
|
|
</small>
|
2006-09-23 15:57:16 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2007-06-29 01:25:07 +00:00
|
|
|
?>
|
2006-10-18 06:32:40 +00:00
|
|
|
<pre>
|
2006-09-23 15:57:16 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Finish printing. Closes HTML tags.
|
|
|
|
|
*/
|
2006-09-27 05:13:48 +00:00
|
|
|
public function closePrinter() {
|
|
|
|
|
if ($this->getIsHtml()) {
|
2007-06-29 01:25:07 +00:00
|
|
|
?>
|
2006-10-18 06:32:40 +00:00
|
|
|
|
|
|
|
|
</pre>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
2006-09-23 15:57:16 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2007-05-20 10:08:40 +00:00
|
|
|
/**
|
|
|
|
|
* The main format printing function. Call it to output the result string to the user.
|
|
|
|
|
* This function will automatically output HTML when format name ends in 'fm'.
|
|
|
|
|
*/
|
2006-09-27 05:13:48 +00:00
|
|
|
public function printText($text) {
|
|
|
|
|
if ($this->getIsHtml())
|
|
|
|
|
echo $this->formatHTML($text);
|
2006-09-23 15:57:16 +00:00
|
|
|
else
|
|
|
|
|
echo $text;
|
|
|
|
|
}
|
|
|
|
|
|
2007-12-01 17:37:08 +00:00
|
|
|
/**
|
|
|
|
|
* Says pretty-printer that it should use *bold* and $italics$ formatting
|
|
|
|
|
*/
|
|
|
|
|
public function setHelp( $help = true ) {
|
|
|
|
|
$this->mHelp = true;
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-23 15:57:16 +00:00
|
|
|
/**
|
|
|
|
|
* Prety-print various elements in HTML format, such as xml tags and URLs.
|
2006-10-01 02:02:13 +00:00
|
|
|
* This method also replaces any '<' with <
|
2006-09-23 15:57:16 +00:00
|
|
|
*/
|
2006-09-27 05:13:48 +00:00
|
|
|
protected function formatHTML($text) {
|
2007-09-13 19:06:54 +00:00
|
|
|
// Escape everything first for full coverage
|
|
|
|
|
$text = htmlspecialchars($text);
|
2007-09-18 22:10:09 +00:00
|
|
|
|
2007-09-10 21:01:40 +00:00
|
|
|
// encode all comments or tags as safe blue strings
|
|
|
|
|
$text = preg_replace('/\<(!--.*?--|.*?)\>/', '<span style="color:blue;"><\1></span>', $text);
|
2006-09-23 15:57:16 +00:00
|
|
|
// identify URLs
|
2006-10-19 08:18:19 +00:00
|
|
|
$protos = "http|https|ftp|gopher";
|
2007-05-19 20:26:08 +00:00
|
|
|
$text = ereg_replace("($protos)://[^ \\'\"()<\n]+", '<a href="\\0">\\0</a>', $text);
|
2006-09-23 15:57:16 +00:00
|
|
|
// identify requests to api.php
|
2007-05-19 20:26:08 +00:00
|
|
|
$text = ereg_replace("api\\.php\\?[^ \\()<\n\t]+", '<a href="\\0">\\0</a>', $text);
|
2007-12-01 17:37:08 +00:00
|
|
|
if( $this->mHelp ) {
|
|
|
|
|
// make strings inside * bold
|
|
|
|
|
$text = ereg_replace("\\*[^<>\n]+\\*", '<b>\\0</b>', $text);
|
|
|
|
|
// make strings inside $ italic
|
|
|
|
|
$text = ereg_replace("\\$[^<>\n]+\\$", '<b><i>\\0</i></b>', $text);
|
|
|
|
|
}
|
2007-09-19 14:51:02 +00:00
|
|
|
|
|
|
|
|
/* Temporary fix for bad links in help messages. As a special case,
|
|
|
|
|
* XML-escaped metachars are de-escaped one level in the help message
|
|
|
|
|
* for legibility. Should be removed once we have completed a fully-html
|
|
|
|
|
* version of the help message. */
|
|
|
|
|
if ( $this->mUnescapeAmps )
|
|
|
|
|
$text = preg_replace( '/&(amp|quot|lt|gt);/', '&\1;', $text );
|
2006-09-26 06:37:26 +00:00
|
|
|
|
2006-09-23 15:57:16 +00:00
|
|
|
return $text;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns usage examples for this format.
|
|
|
|
|
*/
|
2006-09-27 05:13:48 +00:00
|
|
|
protected function getExamples() {
|
2006-11-02 02:33:14 +00:00
|
|
|
return 'api.php?action=query&meta=siteinfo&siprop=namespaces&format=' . $this->getModuleName();
|
2006-09-23 15:57:16 +00:00
|
|
|
}
|
2006-10-01 21:20:55 +00:00
|
|
|
|
2006-11-03 06:53:47 +00:00
|
|
|
protected function getDescription() {
|
|
|
|
|
return $this->getIsHtml() ? ' (pretty-print in HTML)' : '';
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-01 21:20:55 +00:00
|
|
|
public static function getBaseVersion() {
|
|
|
|
|
return __CLASS__ . ': $Id$';
|
|
|
|
|
}
|
2006-09-23 15:57:16 +00:00
|
|
|
}
|
2006-10-16 00:08:03 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This printer is used to wrap an instance of the Feed class
|
2007-04-20 08:55:14 +00:00
|
|
|
* @addtogroup API
|
2006-10-16 00:08:03 +00:00
|
|
|
*/
|
|
|
|
|
class ApiFormatFeedWrapper extends ApiFormatBase {
|
|
|
|
|
|
|
|
|
|
public function __construct($main) {
|
|
|
|
|
parent :: __construct($main, 'feed');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2007-05-20 10:08:40 +00:00
|
|
|
* Call this method to initialize output data. See self::execute()
|
2006-10-16 00:08:03 +00:00
|
|
|
*/
|
|
|
|
|
public static function setResult($result, $feed, $feedItems) {
|
|
|
|
|
// Store output in the Result data.
|
|
|
|
|
// This way we can check during execution if any error has occured
|
2006-10-18 06:32:40 +00:00
|
|
|
$data = & $result->getData();
|
2006-10-16 00:08:03 +00:00
|
|
|
$data['_feed'] = $feed;
|
|
|
|
|
$data['_feeditems'] = $feedItems;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Feed does its own headers
|
|
|
|
|
*/
|
|
|
|
|
public function getMimeType() {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Optimization - no need to sanitize data that will not be needed
|
|
|
|
|
*/
|
|
|
|
|
public function getNeedsRawData() {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2006-10-18 06:32:40 +00:00
|
|
|
|
2007-05-20 10:08:40 +00:00
|
|
|
/**
|
|
|
|
|
* This class expects the result data to be in a custom format set by self::setResult()
|
|
|
|
|
* $result['_feed'] - an instance of one of the $wgFeedClasses classes
|
|
|
|
|
* $result['_feeditems'] - an array of FeedItem instances
|
|
|
|
|
*/
|
2006-10-16 00:08:03 +00:00
|
|
|
public function execute() {
|
2006-10-25 03:54:56 +00:00
|
|
|
$data = $this->getResultData();
|
2006-10-18 06:32:40 +00:00
|
|
|
if (isset ($data['_feed']) && isset ($data['_feeditems'])) {
|
2006-10-25 03:54:56 +00:00
|
|
|
$feed = $data['_feed'];
|
|
|
|
|
$items = $data['_feeditems'];
|
2006-10-16 00:08:03 +00:00
|
|
|
|
|
|
|
|
$feed->outHeader();
|
2006-10-18 06:32:40 +00:00
|
|
|
foreach ($items as & $item)
|
2006-10-16 00:08:03 +00:00
|
|
|
$feed->outItem($item);
|
|
|
|
|
$feed->outFooter();
|
|
|
|
|
} else {
|
|
|
|
|
// Error has occured, print something usefull
|
2006-10-21 08:26:32 +00:00
|
|
|
// TODO: make this error more informative using ApiBase :: dieDebug() or similar
|
2006-10-16 00:08:03 +00:00
|
|
|
wfHttpError(500, 'Internal Server Error', '');
|
|
|
|
|
}
|
|
|
|
|
}
|
2006-11-03 06:53:47 +00:00
|
|
|
|
2006-10-16 00:08:03 +00:00
|
|
|
public function getVersion() {
|
2006-10-16 05:53:07 +00:00
|
|
|
return __CLASS__ . ': $Id$';
|
2006-10-16 00:08:03 +00:00
|
|
|
}
|
|
|
|
|
}
|