API: Allow for format modules that cannot handle errors
[lhc/web/wiklou.git] / includes / api / ApiFormatBase.php
index 63a5502..d43259d 100644 (file)
@@ -120,6 +120,16 @@ abstract class ApiFormatBase extends ApiBase {
                return $this->mDisabled;
        }
 
+       /**
+        * Whether this formatter can handle printing API errors. If this returns
+        * false, then on API errors the default printer will be instantiated.
+        * @since 1.23
+        * @return bool
+        */
+       public function canPrintErrors() {
+               return true;
+       }
+
        /**
         * Initialize the printer function and prepare the output headers, etc.
         * This method must be the first outputting method during execution.
@@ -271,12 +281,22 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
                // encode all comments or tags as safe blue strings
                $text = str_replace( '&lt;', '<span style="color:blue;">&lt;', $text );
                $text = str_replace( '&gt;', '&gt;</span>', $text );
+
                // identify requests to api.php
-               $text = preg_replace( "#api\\.php\\?[^ <\n\t]+#", '<a href="\\0">\\0</a>', $text );
+               $text = preg_replace( '#^(\s*)(api\.php\?[^ <\n\t]+)$#m', '\1<a href="\2">\2</a>', $text );
                if ( $this->mHelp ) {
-                       // make strings inside * bold
-                       $text = preg_replace( "#\\*[^<>\n]+\\*#", '<b>\\0</b>', $text );
+                       // make lines inside * bold
+                       $text = preg_replace( '#^(\s*)(\*[^<>\n]+\*)(\s*)$#m', '$1<b>$2</b>$3', $text );
                }
+
+               // Armor links (bug 61362)
+               $masked = array();
+               $text = preg_replace_callback( '#<a .*?</a>#', function ( $matches ) use ( &$masked ) {
+                       $sha = sha1( $matches[0] );
+                       $masked[$sha] = $matches[0];
+                       return "<$sha>";
+               }, $text );
+
                // identify URLs
                $protos = wfUrlProtocolsWithoutProtRel();
                // This regex hacks around bug 13218 (&quot; included in the URL)
@@ -286,6 +306,12 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
                        $text
                );
 
+               // Unarmor links
+               $text = preg_replace_callback( '#<([0-9a-f]{40})>#', function ( $matches ) use ( &$masked ) {
+                       $sha = $matches[1];
+                       return isset( $masked[$sha] ) ? $masked[$sha] : $matches[0];
+               }, $text );
+
                /**
                 * Temporary fix for bad links in help messages. As a special case,
                 * XML-escaped metachars are de-escaped one level in the help message
@@ -361,6 +387,15 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
                return true;
        }
 
+       /**
+        * ChannelFeed doesn't give us a method to print errors in a friendly
+        * manner, so just punt errors to the default printer.
+        * @return false
+        */
+       public function canPrintErrors() {
+               return false;
+       }
+
        /**
         * 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