1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-10-27 20:34:16 +00:00

Xomw: Add some implementation for XomwHooks [#632]

This commit is contained in:
gnosygnu 2020-04-29 07:32:10 -04:00
parent bd71db3ed6
commit db73b4302d
9 changed files with 1736 additions and 1308 deletions

View File

@ -13,7 +13,7 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki; import gplx.*; import gplx.xowa.*;
package gplx.xowa.mediawiki; import gplx.*;
import gplx.core.strings.*;
public class XophpArray_ {
// REF.PHP:https://www.php.net/manual/en/function.array-merge.php
@ -156,6 +156,7 @@ public class XophpArray_ {
public static boolean array_key_exists(String key, XophpArray array) {return array.Has(key);}
public static boolean array_key_exists(int key, XophpArray array) {return array.Has(Int_.To_str(key));}
public static void unset(XophpArray array, String s) {array.unset(s);}
public static void unset(XophpArray array, int i) {array.unset(i);}
public static void unset(Ordered_hash array, Object key) {
array.Del(key);
@ -171,7 +172,7 @@ public class XophpArray_ {
}
// REF.PHP:https://www.php.net/manual/en/function.array-map.php
public static XophpArray array_map(XophpCallbackOwner callback_owner, String method, XophpArray array) {
public static XophpArray array_map(XophpCallableOwner callback_owner, String method, XophpArray array) {
XophpArray rv = XophpArray.New();
int len = array.count();
for (int i = 0; i < len; i++) {
@ -208,7 +209,7 @@ public class XophpArray_ {
public static Object array_pop(XophpArray array) {return array.pop();}
public static boolean isset(XophpArray array, int key) {return XophpObject_.isset_obj(array.Get_at(key));}
public static boolean isset(XophpArray array, String key) {return XophpObject_.isset_obj(array.Get_by(key));}
public static boolean is_array(XophpArray array) {return array != null;}
public static boolean is_array(Object array) {return array != null;}
// REF.PHP: https://www.php.net/manual/en/function.in-array.php
public static boolean in_array(Object needle, XophpArray haystack) {return in_array(needle, haystack, false);}

View File

@ -0,0 +1,10 @@
package gplx.xowa.mediawiki;
public class XophpCallable {
public XophpCallable(XophpCallableOwner owner, String methodName) {
this.owner = owner;
this.methodName = methodName;
}
public XophpCallableOwner Owner() {return owner;} private final XophpCallableOwner owner;
public String MethodName() {return methodName;} private final String methodName;
}

View File

@ -1,6 +1,6 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
Copyright (C) 2012-2020 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
@ -13,7 +13,7 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki; import gplx.*; import gplx.xowa.*;
public interface XophpCallbackOwner {
package gplx.xowa.mediawiki;
public interface XophpCallableOwner {
Object Callback(String method, Object... args);
}

View File

@ -0,0 +1,8 @@
package gplx.xowa.mediawiki;
public class XophpCallable_ {
// REF.PHP: https://www.php.net/manual/en/function.call-user-func-array.phphttps://www.php.net/manual/en/function.call-user-func-array.php
public static Object call_user_func_array(XophpCallable callback, XophpArray param_arr) {
return callback.Owner().Callback(callback.MethodName(), param_arr);
}
}

View File

@ -0,0 +1,22 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2020 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki;
public class XophpFatalError extends XophpError {
public XophpFatalError(String msg) {
super(msg);
}
}

View File

@ -13,13 +13,13 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki; import gplx.*; import gplx.xowa.*;
package gplx.xowa.mediawiki; import gplx.*;
import gplx.core.btries.*;
import gplx.core.intls.*;
import gplx.objects.strings.unicodes.*;
import gplx.core.primitives.*;
import gplx.objects.strings.bfrs.*;
public class XophpString_ implements XophpCallbackOwner {
public class XophpString_ implements XophpCallableOwner {
public static final String False = null;
public static boolean is_true (String s) {return s != null;} // handles code like "if ($var)" where var is an Object;
public static boolean is_false(String s) {return s == null;}
@ -573,5 +573,5 @@ public class XophpString_ implements XophpCallbackOwner {
throw Err_.new_unhandled_default(method);
}
}
public static final XophpCallbackOwner Callback_owner = new XophpString_();
public static final XophpCallableOwner Callback_owner = new XophpString_();
}

View File

@ -1,6 +1,6 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
Copyright (C) 2012-2020 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
@ -13,178 +13,242 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki.includes; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*;
/**
* Hooks cl+ass.
*
* Used to supersede $wgHooks, because globals are EVIL.
*
* @since 1.18
package gplx.xowa.mediawiki.includes;
// MW.SRC:1.33.1
import gplx.xowa.mediawiki.*;
/*
TODO:
* $wgHooks
* array_shift
* Closure?
*/
/**
* Hooks class.
*
* Used to supersede $wgHooks, because globals are EVIL.
*
* @since 1.18
*/
public class XomwHooks {
// /**
// * Array of events mapped to an array of callbacks to be run
// * when that event is triggered.
// */
// protected static $handlers = [];
//
// /**
// * Attach an event handler to a given hook.
// *
// * @param String $name Name of hook
// * @param callable $callback Callback function to attach
// *
// * @since 1.18
// */
// public static function register( $name, $callback ) {
// if ( !isset( self::$handlers[$name] ) ) {
// self::$handlers[$name] = [];
// }
//
// self::$handlers[$name][] = $callback;
// }
//
// /**
// * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
// * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
// *
// * @param String $name The name of the hook to clear.
// *
// * @since 1.21
// * @throws MWException If not in testing mode.
// */
// public static function clear( $name ) {
// if ( !defined( 'MW_PHPUNIT_TEST' ) && !defined( 'MW_PARSER_TEST' ) ) {
// throw new MWException( 'Cannot reset hooks in operation.' );
// }
//
// unset( self::$handlers[$name] );
// }
//
// /**
// * Returns true if a hook has a function registered to it.
// * The function may have been registered either via Hooks::register or in $wgHooks.
// *
// * @since 1.18
// *
// * @param String $name Name of hook
// * @return boolean True if the hook has a function registered to it
// */
// public static function isRegistered( $name ) {
/**
* Array of events mapped to an array of callbacks to be run
* when that event is triggered.
*/
protected static XophpArray handlers = XophpArray.New();
/**
* Attach an event handler to a given hook.
*
* @param string $name Name of hook
* @param callable $callback Callback function to attach
*
* @since 1.18
*/
public static void register(String name, XophpCallable callback) {
handlers.Get_by_ary(name).Add(callback);
}
/**
* Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
* This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
*
* @param string $name The name of the hook to clear.
*
* @since 1.21
* @throws MWException If not in testing mode.
* @codeCoverageIgnore
*/
public static void clear(String name) {
// if (!defined('MW_PHPUNIT_TEST') && !defined('MW_PARSER_TEST')) {
// throw new MWException('Cannot reset hooks in operation.');
// }
XophpArray_.unset(handlers, name);
}
/**
* Returns true if a hook has a function registered to it.
* The function may have been registered either via Hooks::register or in $wgHooks.
*
* @since 1.18
*
* @param string $name Name of hook
* @return bool True if the hook has a function registered to it
*/
public static boolean isRegistered(String name) {
// global $wgHooks;
// return !empty( $wgHooks[$name] ) || !empty( self::$handlers[$name] );
// }
//
// /**
// * Returns an array of all the event functions attached to a hook
// * This combines functions registered via Hooks::register and with $wgHooks.
// *
// * @since 1.18
// *
// * @param String $name Name of the hook
// * @return array
// */
// public static function getHandlers( $name ) {
// return !XophpArray_.empty($wgHooks[$name]) || !XophpArray_.empty(handlers[$name]);
return false;
}
/**
* Returns an array of all the event functions attached to a hook
* This combines functions registered via Hooks::register and with $wgHooks.
*
* @since 1.18
*
* @param string $name Name of the hook
* @return array
*/
public static XophpArray getHandlers(String name) {
// global $wgHooks;
//
// if ( !self::isRegistered( $name ) ) {
// return [];
// } elseif ( !isset( self::$handlers[$name] ) ) {
// return $wgHooks[$name];
// } elseif ( !isset( $wgHooks[$name] ) ) {
// return self::$handlers[$name];
if (!isRegistered(name)) {
return XophpArray.New();
// } else if (!XophpArray_.isset(handlers, name)) {
// return $wgHooks[name];
// } else if (!isset($wgHooks[name])) {
// return handlers[name];
} else {
// return XophpArray_.array_merge(handlers.Get_by_ary(name), $wgHooks[name]);
return XophpArray_.array_merge(handlers.Get_by_ary(name));
}
}
/**
* @param string $event Event name
* @param array|callable hook
* @param array $args Array of parameters passed to hook functions
* @param string|null $deprecatedVersion [optional]
* @param string &$fname [optional] Readable name of hook [returned]
* @return null|string|bool
*/
private static String callHook(String event, Object hookObj, XophpArray args) {return callHook(event, hookObj, args, null, null);}
private static String callHook(String event, Object hookObj, XophpArray args, String deprecatedVersion) {return callHook(event, hookObj, args, deprecatedVersion, null);}
private static String callHook(String event, Object hookObj, XophpArray args, String deprecatedVersion,
String fname
) {
XophpArray hook;
// Turn non-array values into an array. (Can't use casting because of objects.)
if (!XophpArray_.is_array(hookObj)) {
hook = XophpArray.New(hookObj);
}
else { // XO: cast it to XophpArray
hook = (XophpArray)hookObj;
}
// if (!array_filter(hook)) {
// Either array is empty or it's an array filled with null/false/empty.
// return null;
// }
// if (is_array(hook[0])) {
// First element is an array, meaning the developer intended
// the first element to be a callback. Merge it in so that
// processing can be uniform.
// hook = array_merge(hook[0], array_slice(hook, 1));
// }
/**
* hook can be: a function, an object, an array of $function and
* $data, an array of just a function, an array of object and
* method, or an array of object, method, and data.
*/
if (XophpType_.instance_of(hook.Get_at(0), XophpCallable.class)) { // XophpClosure
// $fname = "hook-" + event + "-closure";
// $callback = array_shift(hook);
} else if (XophpObject_.is_object(hook.Get_at_str(0))) {
// Object object = XophpArray_.array_shift(hook);
// Object method = XophpArray_.array_shift(hook);
// If no method was specified, default to on$event.
// if ($method === null) {
// $method = "on" + event;
// }
// $fname = get_class($object) . '::' . $method;
// $callback = [ $object, $method ];
// } else if (is_string(hook[0])) {
// $fname = $callback = array_shift(hook);
// } else {
// return array_merge( self::$handlers[$name], $wgHooks[$name] );
// throw new MWException('Unknown datatype in hooks for ' . $event . "\n");
}
// Run autoloader (workaround for call_user_func_array bug)
// and throw error if not callable.
// if (!is_callable($callback)) {
// throw new MWException('Invalid callback ' . $fname . ' in hooks for ' . $event . "\n");
// }
// }
//
// mark hook as deprecated, if deprecation version is specified
if (deprecatedVersion != null) {
// wfDeprecated("$event hook (used in $fname)", deprecatedVersion);
}
XophpCallable callback = null;
// Call the hook.
XophpArray hook_args = XophpArray_.array_merge(hook, args);
return (String)XophpCallable_.call_user_func_array(callback, hook_args);
}
/**
* Call hook functions defined in Hooks::register and $wgHooks.
*
* For the given hook event, fetch the array of hook events and
* process them. Determine the proper callback for each hook and
* then call the actual hook using the appropriate arguments.
* Finally, process the return value and return/throw accordingly.
*
* For hook event that are not abortable through a handler's return value,
* use runWithoutAbort() instead.
*
* @param string $event Event name
* @param array $args Array of parameters passed to hook functions
* @param string|null $deprecatedVersion [optional] Mark hook as deprecated with version number
* @return bool True if no handler aborted the hook
*
* @throws Exception
* @throws FatalError
* @throws MWException
* @since 1.22 A hook function is not required to return a value for
* processing to continue. Not returning a value (or explicitly
* returning null) is equivalent to returning true.
*/
public static boolean run(String event) {return run(event, XophpArray.New(), null);}
public static boolean run(String event, XophpArray args) {return run(event, args, null);}
public static boolean run(String event, XophpArray args, String deprecatedVersion) {
XophpArray handlers = getHandlers(event);
for (int i = 0; i < handlers.count(); i++) {
XophpCallable hook = (XophpCallable)handlers.Get_at(i);
Object retval = callHook(event, hook, args, deprecatedVersion);
if (retval == null) {
continue;
}
// Process the return value.
if (XophpString_.is_string(retval)) {
// String returned means error.
throw new XophpFatalError((String)retval);
} else if (XophpObject_.is_false(retval)) {
// False was returned. Stop processing, but no error.
return false;
}
}
return true;
}
// /**
// * Call hook functions defined in Hooks::register and $wgHooks.
// *
// * For a certain hook event, fetch the array of hook events and
// * process them. Determine the proper callback for each hook and
// * then call the actual hook using the appropriate arguments.
// * Finally, process the return value and return/throw accordingly.
// *
// * @param String $event Event name
// * @param string $event Event name
// * @param array $args Array of parameters passed to hook functions
// * @param String|null $deprecatedVersion Optionally, mark hook as deprecated with version number
// * @return boolean True if no handler aborted the hook
// *
// * @throws Exception
// * @throws FatalError
// * @throws MWException
// * @since 1.22 A hook function is not required to return a value for
// * processing to continue. Not returning a value (or explicitly
// * returning null) is equivalent to returning true.
// * @param string|null $deprecatedVersion [optional] Mark hook as deprecated with version number
// * @return bool Always true
// * @throws MWException If a callback is invalid, unknown
// * @throws UnexpectedValueException If a callback returns an abort value.
// * @since 1.30
// */
// public static function run( $event, array $args = [], $deprecatedVersion = null ) {
// foreach ( self::getHandlers( $event ) as $hook ) {
// // Turn non-array values into an array. (Can't use casting because of objects.)
// if ( !is_array( $hook ) ) {
// $hook = [ $hook ];
// }
//
// if ( !array_filter( $hook ) ) {
// // Either array is empty or it's an array filled with null/false/empty.
// continue;
// } elseif ( is_array( $hook[0] ) ) {
// // First element is an array, meaning the developer intended
// // the first element to be a callback. Merge it in so that
// // processing can be uniform.
// $hook = array_merge( $hook[0], array_slice( $hook, 1 ) );
// }
//
// /**
// * $hook can be: a function, an Object, an array of $function and
// * $data, an array of just a function, an array of Object and
// * method, or an array of Object, method, and data.
// */
// if ( $hook[0] instanceof Closure ) {
// $func = "hook-$event-closure";
// $callback = array_shift( $hook );
// } elseif ( is_object( $hook[0] ) ) {
// $Object = array_shift( $hook );
// $method = array_shift( $hook );
//
// // If no method was specified, default to on$event.
// if ( $method === null ) {
// $method = "on$event";
// }
//
// $func = get_class( $Object ) . '::' . $method;
// $callback = [ $Object, $method ];
// } elseif ( is_string( $hook[0] ) ) {
// $func = $callback = array_shift( $hook );
// } else {
// throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
// }
//
// // Run autoloader (workaround for call_user_func_array bug)
// // and throw error if not callable.
// if ( !is_callable( $callback ) ) {
// throw new MWException( 'Invalid callback ' . $func . ' in hooks for ' . $event . "\n" );
// }
//
// // mark hook as deprecated, if deprecation version is specified
// if ( $deprecatedVersion !== null ) {
// wfDeprecated( "$event hook (used in $func)", $deprecatedVersion );
// }
//
// // Call the hook.
// $hook_args = array_merge( $hook, $args );
// $retval = call_user_func_array( $callback, $hook_args );
//
// // Process the return value.
// if ( is_string( $retval ) ) {
// // String returned means error.
// throw new FatalError( $retval );
// } elseif ( $retval === false ) {
// // False was returned. Stop processing, but no error.
// return false;
// public static function runWithoutAbort($event, array $args = [], $deprecatedVersion = null) {
// foreach (getHandlers($event) as hook) {
// $fname = null;
// retval = callHook($event, hook, $args, $deprecatedVersion, $fname);
// if (retval !== null && retval !== true) {
// throw new UnexpectedValueException("Invalid return from $fname for unabortable $event.");
// }
// }
//
// return true;
// }
}

View File

@ -1,6 +1,6 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
Copyright (C) 2012-2020 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
@ -13,24 +13,29 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.mediawiki.includes; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*;
import gplx.xowa.mediawiki.languages.*;
import gplx.xowa.mediawiki.includes.interwiki.*;
import gplx.xowa.mediawiki.includes.title.*;
package gplx.xowa.mediawiki.includes;
// MW.SRC:1.33.1
import gplx.xowa.mediawiki.XomwEnv;
import gplx.xowa.mediawiki.includes.interwiki.XomwInterwikiLookup;
import gplx.xowa.mediawiki.includes.title.XomwMediaWikiTitleCodec;
import gplx.xowa.mediawiki.includes.title.XomwTitleFormatter;
import gplx.xowa.mediawiki.languages.XomwLanguage;
/**
* MediaWikiServices is the service locator for the application scope of MediaWiki.
* Its implemented as a simple configurable DI container.
* MediaWikiServices acts as a top level factory/registry for top level services, and builds
* the network of service objects that defines MediaWiki's application logic.
* It acts as an entry point to MediaWiki's dependency injection mechanism.
*
* Services are defined in the "wiring" array passed to the constructor,
* or by calling defineService().
*
* @see docs/injection.txt for an overview of using dependency injection in the
* MediaWiki code super.
*/
public class XomwMediaWikiServices {
* MediaWikiServices is the service locator for the application scope of MediaWiki.
* Its implemented as a simple configurable DI container.
* MediaWikiServices acts as a top level factory/registry for top level services, and builds
* the network of service objects that defines MediaWiki's application logic.
* It acts as an entry point to MediaWiki's dependency injection mechanism.
*
* Services are defined in the "wiring" array passed to the constructor,
* or by calling defineService().
*
* @see docs/injection.txt for an overview of using dependency injection in the
* MediaWiki code base.
*/
public class XomwMediaWikiServices { // extends ServiceContainer
// XO.MW.SKIP:remove global getInstance(). See XomwEnv
private final XomwMediaWikiTitleCodec titleParser;
private final XomwInterwikiLookup interwikiLookup;
@ -42,6 +47,38 @@ public class XomwMediaWikiServices {
this.titleParser = new XomwMediaWikiTitleCodec(this, language, localInterwikis);
}
// /**
// * @var MediaWikiServices|null
// */
// private static $instance = null;
//
// /**
// * Returns the global default instance of the top level service locator.
// *
// * @since 1.27
// *
// * The default instance is initialized using the service instantiator functions
// * defined in ServiceWiring.php.
// *
// * @note This should only be called by static functions! The instance returned here
// * should not be passed around! Objects that need access to a service should have
// * that service injected into the constructor, never a service locator!
// *
// * @return MediaWikiServices
// */
// public static function getInstance() {
// if ( self::$instance === null ) {
// // NOTE: constructing GlobalVarConfig here is not particularly pretty,
// // but some information from the global scope has to be injected here,
// // even if it's just a file name or database credentials to load
// // configuration from.
// $bootstrapConfig = new GlobalVarConfig();
// self::$instance = self::newInstance( $bootstrapConfig, 'load' );
// }
//
// return self::$instance;
// }
//
// /**
// * Replaces the global MediaWikiServices instance.
// *
@ -51,9 +88,9 @@ public class XomwMediaWikiServices {
// *
// * @throws MWException if called outside of PHPUnit tests.
// *
// * @param MediaWikiServices $services The new MediaWikiServices Object.
// * @param MediaWikiServices $services The new MediaWikiServices object.
// *
// * @return MediaWikiServices The old MediaWikiServices Object, so it can be restored later.
// * @return MediaWikiServices The old MediaWikiServices object, so it can be restored later.
// */
// public static function forceGlobalInstance( MediaWikiServices $services ) {
// if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
@ -68,7 +105,7 @@ public class XomwMediaWikiServices {
//
// /**
// * Creates a new instance of MediaWikiServices and sets it as the global default
// * instance. getInstance() will return a different MediaWikiServices Object
// * instance. getInstance() will return a different MediaWikiServices object
// * after every call to resetGlobalInstance().
// *
// * @since 1.28
@ -91,14 +128,14 @@ public class XomwMediaWikiServices {
// * @see resetGlobalInstance()
// * @see resetBetweenTest()
// *
// * @param Config|null $bootstrapConfig The Config Object to be registered as the
// * @param Config|null $bootstrapConfig The Config object to be registered as the
// * 'BootstrapConfig' service. This has to contain at least the information
// * needed to set up the 'ConfigFactory' service. If not given, the bootstrap
// * config of the old instance of MediaWikiServices will be re-used. If there
// * was no previous instance, a new GlobalVarConfig Object will be used to
// * was no previous instance, a new GlobalVarConfig object will be used to
// * bootstrap the services.
// *
// * @param String $quick Set this to "quick" to allow expensive resources to be re-used.
// * @param string $quick Set this to "quick" to allow expensive resources to be re-used.
// * See SalvageableService for details.
// *
// * @throws MWException If called after MW_SERVICE_BOOTSTRAP_COMPLETE has been defined in
@ -162,10 +199,10 @@ public class XomwMediaWikiServices {
// * given $bootstrapConfig. In particular, all wiring files defined in the
// * ServiceWiringFiles setting are loaded, and the MediaWikiServices hook is called.
// *
// * @param Config|null $bootstrapConfig The Config Object to be registered as the
// * @param Config|null $bootstrapConfig The Config object to be registered as the
// * 'BootstrapConfig' service.
// *
// * @param String $loadWiring set this to 'load' to load the wiring files specified
// * @param string $loadWiring set this to 'load' to load the wiring files specified
// * in the 'ServiceWiringFiles' setting in $bootstrapConfig.
// *
// * @return MediaWikiServices
@ -250,8 +287,8 @@ public class XomwMediaWikiServices {
// * should not be needed. It is provided to allow tests that pollute global service
// * instances to clean up.
// *
// * @param String $name
// * @param boolean $destroy Whether the service instance should be destroyed if it exists.
// * @param string $name
// * @param bool $destroy Whether the service instance should be destroyed if it exists.
// * When set to false, any existing service instance will effectively be detached
// * from the container.
// *
@ -284,7 +321,7 @@ public class XomwMediaWikiServices {
// * defined here in the MediaWikiServices services class to have a central place
// * for managing service bootstrapping and resetting.
// *
// * @param String $method the name of the caller method, as given by __METHOD__.
// * @param string $method the name of the caller method, as given by __METHOD__.
// *
// * @throws MWException if called outside bootstrap mode.
// *
@ -304,15 +341,15 @@ public class XomwMediaWikiServices {
// }
//
// /**
// * @param Config $config The Config Object to be registered as the 'BootstrapConfig' service.
// * @param Config $config The Config object to be registered as the 'BootstrapConfig' service.
// * This has to contain at least the information needed to set up the 'ConfigFactory'
// * service.
// */
// public function __construct( Config $config ) {
// parent::__construct();
//
// // Register the given Config Object as the bootstrap config service.
// this.defineService( 'BootstrapConfig', function() use ( $config ) {
// // Register the given Config object as the bootstrap config service.
// this.defineService( 'BootstrapConfig', function () use ( $config ) {
// return $config;
// } );
// }
@ -320,7 +357,39 @@ public class XomwMediaWikiServices {
// // CONVENIENCE GETTERS ////////////////////////////////////////////////////
//
// /**
// * Returns the Config Object containing the bootstrap configuration.
// * @since 1.31
// * @return ActorMigration
// */
// public function getActorMigration() {
// return this.getService( 'ActorMigration' );
// }
//
// /**
// * @since 1.31
// * @return BlobStore
// */
// public function getBlobStore() {
// return this.getService( '_SqlBlobStore' );
// }
//
// /**
// * @since 1.31
// * @return BlobStoreFactory
// */
// public function getBlobStoreFactory() {
// return this.getService( 'BlobStoreFactory' );
// }
//
// /**
// * @since 1.33
// * @return BlockRestrictionStore
// */
// public function getBlockRestrictionStore() : BlockRestrictionStore {
// return this.getService( 'BlockRestrictionStore' );
// }
//
// /**
// * Returns the Config object containing the bootstrap configuration.
// * Bootstrap configuration would typically include database credentials
// * and other information that may be needed before the ConfigFactory
// * service can be instantiated.
@ -337,6 +406,22 @@ public class XomwMediaWikiServices {
// }
//
// /**
// * @since 1.32
// * @return NameTableStore
// */
// public function getChangeTagDefStore() {
// return this.getService( 'NameTableStoreFactory' )->getChangeTagDef();
// }
//
// /**
// * @since 1.31
// * @return CommentStore
// */
// public function getCommentStore() {
// return this.getService( 'CommentStore' );
// }
//
// /**
// * @since 1.27
// * @return ConfigFactory
// */
@ -345,95 +430,53 @@ public class XomwMediaWikiServices {
// }
//
// /**
// * Returns the Config Object that provides configuration for MediaWiki core.
// * This may or may not be the same Object that is returned by getBootstrapConfig().
// *
// * @since 1.27
// * @return Config
// * @since 1.32
// * @return ConfigRepository
// */
// public function getMainConfig() {
// return this.getService( 'MainConfig' );
// public function getConfigRepository() {
// return this.getService( 'ConfigRepository' );
// }
//
// /**
// * @since 1.27
// * @return SiteLookup
// * @since 1.29
// * @return \ConfiguredReadOnlyMode
// */
// public function getSiteLookup() {
// return this.getService( 'SiteLookup' );
// public function getConfiguredReadOnlyMode() {
// return this.getService( 'ConfiguredReadOnlyMode' );
// }
//
// /**
// * @since 1.27
// * @return SiteStore
// * @since 1.32
// * @return \Language
// */
// public function getSiteStore() {
// return this.getService( 'SiteStore' );
// }
/**
* @since 1.28
* @return InterwikiLookup
*/
public XomwInterwikiLookup getInterwikiLookup() {
return interwikiLookup;
}
// /**
// * @since 1.27
// * @return StatsdDataFactory
// */
// public function getStatsdDataFactory() {
// return this.getService( 'StatsdDataFactory' );
// public function getContentLanguage() {
// return this.getService( 'ContentLanguage' );
// }
//
// /**
// * @since 1.27
// * @return EventRelayerGroup
// * @since 1.31
// * @return NameTableStore
// */
// public function getEventRelayerGroup() {
// return this.getService( 'EventRelayerGroup' );
// }
//
// /**
// * @since 1.27
// * @return SearchEngine
// */
// public function newSearchEngine() {
// // New engine Object every time, since they keep state
// return this.getService( 'SearchEngineFactory' )->create();
// }
//
// /**
// * @since 1.27
// * @return SearchEngineFactory
// */
// public function getSearchEngineFactory() {
// return this.getService( 'SearchEngineFactory' );
// }
//
// /**
// * @since 1.27
// * @return SearchEngineConfig
// */
// public function getSearchEngineConfig() {
// return this.getService( 'SearchEngineConfig' );
// }
//
// /**
// * @since 1.27
// * @return SkinFactory
// */
// public function getSkinFactory() {
// return this.getService( 'SkinFactory' );
// public function getContentModelStore() {
// return this.getService( 'NameTableStoreFactory' )->getContentModels();
// }
//
// /**
// * @since 1.28
// * @return LBFactory
// * @return CryptHKDF
// */
// public function getDBLoadBalancerFactory() {
// return this.getService( 'DBLoadBalancerFactory' );
// public function getCryptHKDF() {
// return this.getService( 'CryptHKDF' );
// }
//
// /**
// * @since 1.28
// * @deprecated since 1.32, use random_bytes()/random_int()
// * @return CryptRand
// */
// public function getCryptRand() {
// wfDeprecated( __METHOD__, '1.32' );
// return this.getService( 'CryptRand' );
// }
//
// /**
@ -446,34 +489,121 @@ public class XomwMediaWikiServices {
//
// /**
// * @since 1.28
// * @return WatchedItemStore
// * @return LBFactory
// */
// public function getWatchedItemStore() {
// return this.getService( 'WatchedItemStore' );
// public function getDBLoadBalancerFactory() {
// return this.getService( 'DBLoadBalancerFactory' );
// }
//
// /**
// * @since 1.27
// * @return EventRelayerGroup
// */
// public function getEventRelayerGroup() {
// return this.getService( 'EventRelayerGroup' );
// }
//
// /**
// * @since 1.31
// * @return \ExternalStoreFactory
// */
// public function getExternalStoreFactory() {
// return this.getService( 'ExternalStoreFactory' );
// }
//
// /**
// * @since 1.28
// * @return WatchedItemQueryService
// * @return GenderCache
// */
// public function getWatchedItemQueryService() {
// return this.getService( 'WatchedItemQueryService' );
// public function getGenderCache() {
// return this.getService( 'GenderCache' );
// }
//
// /**
// * @since 1.31
// * @return HttpRequestFactory
// */
// public function getHttpRequestFactory() {
// return this.getService( 'HttpRequestFactory' );
// }
/**
* @since 1.28
* @return InterwikiLookup
*/
public XomwInterwikiLookup getInterwikiLookup() {
// return this.getService( 'InterwikiLookup' );
return interwikiLookup;
}
// /**
// * @since 1.28
// * @return LinkCache
// */
// public function getLinkCache() {
// return this.getService( 'LinkCache' );
// }
//
// /**
// * LinkRenderer instance that can be used
// * if no custom options are needed
// *
// * @since 1.28
// * @return LinkRenderer
// */
// public function getLinkRenderer() {
// return this.getService( 'LinkRenderer' );
// }
//
// /**
// * @since 1.28
// * @return CryptRand
// * @return LinkRendererFactory
// */
// public function getCryptRand() {
// return this.getService( 'CryptRand' );
// public function getLinkRendererFactory() {
// return this.getService( 'LinkRendererFactory' );
// }
//
// /**
// * @since 1.28
// * @return CryptHKDF
// * @return \BagOStuff
// */
// public function getCryptHKDF() {
// return this.getService( 'CryptHKDF' );
// public function getLocalServerObjectCache() {
// return this.getService( 'LocalServerObjectCache' );
// }
//
// /**
// * @since 1.32
// * @return MagicWordFactory
// */
// public function getMagicWordFactory() {
// return this.getService( 'MagicWordFactory' );
// }
//
// /**
// * Returns the Config object that provides configuration for MediaWiki core.
// * This may or may not be the same object that is returned by getBootstrapConfig().
// *
// * @since 1.27
// * @return Config
// */
// public function getMainConfig() {
// return this.getService( 'MainConfig' );
// }
//
// /**
// * @since 1.28
// * @return \BagOStuff
// */
// public function getMainObjectStash() {
// return this.getService( 'MainObjectStash' );
// }
//
// /**
// * @since 1.28
// * @return \WANObjectCache
// */
// public function getMainWANObjectCache() {
// return this.getService( 'MainWANObjectCache' );
// }
//
// /**
@ -493,11 +623,18 @@ public class XomwMediaWikiServices {
// }
//
// /**
// * @since 1.28
// * @return ProxyLookup
// * @since 1.32
// * @return NameTableStoreFactory
// */
// public function getProxyLookup() {
// return this.getService( 'ProxyLookup' );
// public function getNameTableStoreFactory() {
// return this.getService( 'NameTableStoreFactory' );
// }
//
// /**
// * @return OldRevisionImporter
// */
// public function getOldRevisionImporter() {
// return this.getService( 'OldRevisionImporter' );
// }
//
// /**
@ -509,46 +646,213 @@ public class XomwMediaWikiServices {
// }
//
// /**
// * @since 1.28
// * @return GenderCache
// * @since 1.30
// * @return ParserCache
// */
// public function getGenderCache() {
// return this.getService( 'GenderCache' );
// public function getParserCache() {
// return this.getService( 'ParserCache' );
// }
//
// /**
// * @since 1.32
// * @return ParserFactory
// */
// public function getParserFactory() {
// return this.getService( 'ParserFactory' );
// }
//
// /**
// * @since 1.32
// * @return PasswordFactory
// */
// public function getPasswordFactory() {
// return this.getService( 'PasswordFactory' );
// }
//
// /**
// * @since 1.32
// * @return StatsdDataFactoryInterface
// */
// public function getPerDbNameStatsdDataFactory() {
// return this.getService( 'PerDbNameStatsdDataFactory' );
// }
//
// /**
// * @since 1.33
// * @return PermissionManager
// */
// public function getPermissionManager() {
// return this.getService( 'PermissionManager' );
// }
//
// /**
// * @since 1.31
// * @return PreferencesFactory
// */
// public function getPreferencesFactory() {
// return this.getService( 'PreferencesFactory' );
// }
//
// /**
// * @since 1.28
// * @return LinkCache
// * @return ProxyLookup
// */
// public function getLinkCache() {
// return this.getService( 'LinkCache' );
// public function getProxyLookup() {
// return this.getService( 'ProxyLookup' );
// }
//
// /**
// * @since 1.28
// * @return LinkRendererFactory
// * @since 1.29
// * @return \ReadOnlyMode
// */
// public function getLinkRendererFactory() {
// return this.getService( 'LinkRendererFactory' );
// public function getReadOnlyMode() {
// return this.getService( 'ReadOnlyMode' );
// }
//
// /**
// * LinkRenderer instance that can be used
// * if no custom options are needed
// *
// * @since 1.28
// * @return LinkRenderer
// * @since 1.33
// * @return ResourceLoader
// */
// public function getLinkRenderer() {
// return this.getService( 'LinkRenderer' );
// public function getResourceLoader() {
// return this.getService( 'ResourceLoader' );
// }
//
// /**
// * @since 1.31
// * @return RevisionFactory
// */
// public function getRevisionFactory() {
// return this.getService( 'RevisionFactory' );
// }
//
// /**
// * @since 1.31
// * @return RevisionLookup
// */
// public function getRevisionLookup() {
// return this.getService( 'RevisionLookup' );
// }
//
// /**
// * @since 1.32
// * @return RevisionRenderer
// */
// public function getRevisionRenderer() {
// return this.getService( 'RevisionRenderer' );
// }
//
// /**
// * @since 1.31
// * @return RevisionStore
// */
// public function getRevisionStore() {
// return this.getService( 'RevisionStore' );
// }
//
// /**
// * @since 1.32
// * @return RevisionStoreFactory
// */
// public function getRevisionStoreFactory() {
// return this.getService( 'RevisionStoreFactory' );
// }
//
// /**
// * @since 1.27
// * @return SearchEngine
// */
// public function newSearchEngine() {
// // New engine object every time, since they keep state
// return this.getService( 'SearchEngineFactory' )->create();
// }
//
// /**
// * @since 1.27
// * @return SearchEngineConfig
// */
// public function getSearchEngineConfig() {
// return this.getService( 'SearchEngineConfig' );
// }
//
// /**
// * @since 1.27
// * @return SearchEngineFactory
// */
// public function getSearchEngineFactory() {
// return this.getService( 'SearchEngineFactory' );
// }
//
// /**
// * @since 1.30
// * @return CommandFactory
// */
// public function getShellCommandFactory() {
// return this.getService( 'ShellCommandFactory' );
// }
//
// /**
// * @since 1.27
// * @return SiteLookup
// */
// public function getSiteLookup() {
// return this.getService( 'SiteLookup' );
// }
//
// /**
// * @since 1.27
// * @return SiteStore
// */
// public function getSiteStore() {
// return this.getService( 'SiteStore' );
// }
//
// /**
// * @since 1.27
// * @return SkinFactory
// */
// public function getSkinFactory() {
// return this.getService( 'SkinFactory' );
// }
//
// /**
// * @since 1.33
// * @return SlotRoleRegistry
// */
// public function getSlotRoleRegistry() {
// return this.getService( 'SlotRoleRegistry' );
// }
//
// /**
// * @since 1.31
// * @return NameTableStore
// */
// public function getSlotRoleStore() {
// return this.getService( 'NameTableStoreFactory' )->getSlotRoles();
// }
//
// /**
// * @since 1.32
// * @return SpecialPageFactory
// */
// public function getSpecialPageFactory() : SpecialPageFactory {
// return this.getService( 'SpecialPageFactory' );
// }
//
// /**
// * @since 1.27
// * @return IBufferingStatsdDataFactory
// */
// public function getStatsdDataFactory() {
// return this.getService( 'StatsdDataFactory' );
// }
/**
* @since 1.28
* @return TitleFormatter
*/
// public XomwTitleFormatter getTitleFormatter() {
// return this.getService( 'TitleFormatter' );
public XomwMediaWikiTitleCodec getTitleFormatter() {
// return this.getService( 'TitleFormatter' );
return titleParser;
}
@ -556,33 +860,18 @@ public class XomwMediaWikiServices {
* @since 1.28
* @return TitleParser
*/
// public XomwTitleParser getTitleParser() {
// return this.getService( 'TitleParser' );
public XomwMediaWikiTitleCodec getTitleParser() {
// return this.getService( 'TitleParser' );
return titleParser;
}
// /**
// * @since 1.28
// * @return \BagOStuff
// * @since 1.32
// * @return UploadRevisionImporter
// */
// public function getMainObjectStash() {
// return this.getService( 'MainObjectStash' );
// }
//
// /**
// * @since 1.28
// * @return \WANObjectCache
// */
// public function getMainWANObjectCache() {
// return this.getService( 'MainWANObjectCache' );
// }
//
// /**
// * @since 1.28
// * @return \BagOStuff
// */
// public function getLocalServerObjectCache() {
// return this.getService( 'LocalServerObjectCache' );
// public function getUploadRevisionImporter() {
// return this.getService( 'UploadRevisionImporter' );
// }
//
// /**
@ -593,9 +882,44 @@ public class XomwMediaWikiServices {
// return this.getService( 'VirtualRESTServiceClient' );
// }
//
// ///////////////////////////////////////////////////////////////////////////
// // NOTE: When adding a service getter here, don't forget to add a test
// // case for it in MediaWikiServicesTest::provideGetters() and in
// // MediaWikiServicesTest::provideGetService()!
// ///////////////////////////////////////////////////////////////////////////
// /**
// * @since 1.28
// * @return WatchedItemQueryService
// */
// public function getWatchedItemQueryService() {
// return this.getService( 'WatchedItemQueryService' );
// }
//
// /**
// * @since 1.28
// * @return WatchedItemStoreInterface
// */
// public function getWatchedItemStore() {
// return this.getService( 'WatchedItemStore' );
// }
//
// /**
// * @since 1.31
// * @return \OldRevisionImporter
// */
// public function getWikiRevisionOldRevisionImporter() {
// return this.getService( 'OldRevisionImporter' );
// }
//
// /**
// * @since 1.31
// * @return \OldRevisionImporter
// */
// public function getWikiRevisionOldRevisionImporterNoUpdates() {
// return this.getService( 'WikiRevisionOldRevisionImporterNoUpdates' );
// }
//
// /**
// * @since 1.31
// * @return \UploadRevisionImporter
// */
// public function getWikiRevisionUploadImporter() {
// return this.getService( 'UploadRevisionImporter' );
// }
}

View File

@ -4563,13 +4563,12 @@ Tfds.Write(nowiki, isHTML, forceRawInterwiki, isChildObj, isLocalObj, titleText,
// Hooks::run('ParserFetchTemplate',
// [ parser, title, rev, &text, &deps ]);
if (XophpString_.is_false(text) || XophpString_.is_null(text)) {
text = XophpString_.False;
break;
}
} else if (title.getNamespace() == XomwDefines.NS_MEDIAWIKI) {
// message = wfMessage(MediaWikiServices::getInstance().getContentLanguage().
// message = XomwGlobalFunctions.wfMessage(MediaWikiServices.getInstance().getContentLanguage().
// lcfirst(title.getText())).inContentLanguage();
// if (!message.exists()) {
// text = false;