+ protected $options = array();
+ protected $nondefaults = array();
+ protected $specialPage;
+
+ public function __construct( $specialPage=null ) {
+ $this->specialPage = $specialPage;
+ }
+
+ public function execute( $par ) {
+ global $wgRequest, $wgLang;
+
+ $shownavigation = is_object( $this->specialPage ) && !$this->specialPage->including();
+
+ $defaults = array(
+ /* bool */ 'hideliu' => false,
+ /* bool */ 'hidepatrolled' => false,
+ /* bool */ 'hidebots' => false,
+ /* text */ 'namespace' => "0",
+ /* text */ 'username' => '',
+ /* int */ 'offset' => 0,
+ /* int */ 'limit' => 50,
+ );
+
+ $options = $defaults;
+
+ if ( $par ) {
+ $bits = preg_split( '/\s*,\s*/', trim( $par ) );
+ foreach ( $bits as $bit ) {
+ if ( 'shownav' == $bit )
+ $shownavigation = true;
+ if ( 'hideliu' === $bit )
+ $options['hideliu'] = true;
+ if ( 'hidepatrolled' == $bit )
+ $options['hidepatrolled'] = true;
+ if ( 'hidebots' == $bit )
+ $options['hidebots'] = true;
+ if ( is_numeric( $bit ) )
+ $options['limit'] = intval( $bit );
+
+ $m = array();
+ if ( preg_match( '/^limit=(\d+)$/', $bit, $m ) )
+ $options['limit'] = intval($m[1]);
+ if ( preg_match( '/^offset=(\d+)$/', $bit, $m ) )
+ $options['offset'] = intval($m[1]);
+ if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) {
+ $ns = $wgLang->getNsIndex( $m[1] );
+ if( $ns !== false ) {
+ $options['namespace'] = $ns;
+ }
+ }
+ }
+ }
+
+ // Override all values from requests, if specified
+ foreach ( $defaults as $v => $t ) {
+ if ( is_bool($t) ) {
+ $options[$v] = $wgRequest->getBool( $v, $options[$v] );
+ } elseif( is_int($t) ) {
+ $options[$v] = $wgRequest->getInt( $v, $options[$v] );
+ } elseif( is_string($t) ) {
+ $options[$v] = $wgRequest->getText( $v, $options[$v] );
+ }
+ }
+
+ // Validate limit and offset params
+ if ( $options['limit'] <= 0 ) {
+ $options['limit'] = $defaults['limit'];
+ }
+
+ if ( $options['offset'] < 0 ) {
+ $options['offset'] = $defaults['offset'];
+ }
+
+ $nondefaults = array();
+ foreach ( $options as $v => $t ) {
+ if ( $v === 'offset' ) continue; # Reset offset if parameters change
+ wfAppendToArrayIfNotDefault( $v, $t, $defaults, $nondefaults );
+ }
+
+ # bind to class
+ $this->options = $options;
+ $this->nondefaults = $nondefaults;
+
+ if ( !$this->doFeed( $wgRequest->getVal( 'feed' ), $options['limit'] ) ) {
+ $this->doQuery( $options['offset'], $options['limit'], $shownavigation );
+ }
+ }
+
+ function linkParameters() {
+ $nondefaults = $this->nondefaults;
+ // QueryPage seems to handle limit and offset itself
+ if ( isset( $nondefaults['limit'] ) ) {
+ unset($nondefaults['limit']);
+ }
+ return $nondefaults;