mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Scribunto
synced 2024-11-24 00:05:00 +00:00
First-pass cleanup:
* Removed ScriptingEngineBase::load(), inappropriate interface specification, only used by child classes and more properly defined by them * Fixed inappropriate use of final * Fixed case of a class constant to conform with MediaWiki conventions * Use a factory function interface for module creation instead of a class name accessor * Don't pass unnecessary $engine parameter to ScriptingFunctionBase::__construct(). Pass parent object as the first parameter per convention. * Fixed unnecessary reference parameter in doRunHook() * Have LuaSandboxEngineFunction::call() return the first result or null, per the base class documentation, instead of imploding. * Use strval() to avoid a warning in case call() returns an array or object * Improved some comments
This commit is contained in:
parent
be72db112a
commit
c8f4d0a213
|
@ -3,7 +3,6 @@
|
||||||
/**
|
/**
|
||||||
* Wikitext scripting infrastructure for MediaWiki: base classes.
|
* Wikitext scripting infrastructure for MediaWiki: base classes.
|
||||||
* Copyright (C) 2012 Victor Vasiliev <vasilvv@gmail.com> et al
|
* Copyright (C) 2012 Victor Vasiliev <vasilvv@gmail.com> et al
|
||||||
* Based on MediaWiki file LinksUpdate.php
|
|
||||||
* http://www.mediawiki.org/
|
* http://www.mediawiki.org/
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -31,19 +30,12 @@ abstract class ScriptingEngineBase {
|
||||||
protected
|
protected
|
||||||
$mParser,
|
$mParser,
|
||||||
$mModules = array(),
|
$mModules = array(),
|
||||||
$mModuleTitles = array(),
|
$mModuleTitles = array();
|
||||||
$mLoaded = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required for the lazy-loading of the engine. Should have a sentinel
|
* Creates a new module object within this engine
|
||||||
* inside checking whether it is already loaded.
|
|
||||||
*/
|
*/
|
||||||
abstract public function load();
|
abstract protected function newModule( $title, $code, $revisionID, $source );
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the name of your module class.
|
|
||||||
*/
|
|
||||||
abstract protected function getModuleClassName();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the default options of the engine.
|
* Returns the default options of the engine.
|
||||||
|
@ -61,7 +53,7 @@ abstract class ScriptingEngineBase {
|
||||||
*
|
*
|
||||||
* @param $parser Parser Wikitext parser
|
* @param $parser Parser Wikitext parser
|
||||||
*/
|
*/
|
||||||
public final function __construct( $parser ) {
|
public function __construct( $parser ) {
|
||||||
$this->mParser = $parser;
|
$this->mParser = $parser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +66,7 @@ abstract class ScriptingEngineBase {
|
||||||
* @param $source string Source of the module
|
* @param $source string Source of the module
|
||||||
* @return ScriptingEngineModule
|
* @return ScriptingEngineModule
|
||||||
*/
|
*/
|
||||||
public function getModule( $title, $source = Scripting::Local ) {
|
public function getModule( $title, $source = Scripting::LOCAL ) {
|
||||||
// Convert string to title
|
// Convert string to title
|
||||||
if( !$title instanceof Title ) {
|
if( !$title instanceof Title ) {
|
||||||
$titleobj = Title::newFromText( (string)$title, NS_MODULE );
|
$titleobj = Title::newFromText( (string)$title, NS_MODULE );
|
||||||
|
@ -97,8 +89,7 @@ abstract class ScriptingEngineBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the class
|
// Create the class
|
||||||
$class = $this->getModuleClassName();
|
$this->mModules[$key] = $this->newModule( $title, $rev->getText(), $rev->getID(), $source );
|
||||||
$this->mModules[$key] = new $class( $this, $title, $rev->getText(), $rev->getID(), $source );
|
|
||||||
$this->mModuleTitles[] = $title;
|
$this->mModuleTitles[] = $title;
|
||||||
}
|
}
|
||||||
return $this->mModules[$key];
|
return $this->mModules[$key];
|
||||||
|
@ -108,7 +99,7 @@ abstract class ScriptingEngineBase {
|
||||||
* Fetches the revision for given module title.
|
* Fetches the revision for given module title.
|
||||||
*/
|
*/
|
||||||
private function getModuleRev( $title, $source ) {
|
private function getModuleRev( $title, $source ) {
|
||||||
if( $source != Scripting::Local ) {
|
if( $source != Scripting::LOCAL ) {
|
||||||
throw new MWException( 'Non-local scripts are not supported at this point' );
|
throw new MWException( 'Non-local scripts are not supported at this point' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +119,7 @@ abstract class ScriptingEngineBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates the script and returns an array of the syntax erros for the
|
* Validates the script and returns an array of the syntax errors for the
|
||||||
* given code.
|
* given code.
|
||||||
*
|
*
|
||||||
* @param $code Code to validate
|
* @param $code Code to validate
|
||||||
|
@ -136,8 +127,7 @@ abstract class ScriptingEngineBase {
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
function validate( $code, $title ) {
|
function validate( $code, $title ) {
|
||||||
$class = $this->getModuleClassName();
|
$module = $this->newModule( $title, $code, 0, Scripting::LOCAL );
|
||||||
$module = new $class( $this, $title, $code, 0, Scripting::Local );
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$module->initialize();
|
$module->initialize();
|
||||||
|
@ -195,7 +185,7 @@ abstract class ScriptingEngineBase {
|
||||||
abstract class ScriptingModuleBase {
|
abstract class ScriptingModuleBase {
|
||||||
var $mEngine, $mTitle, $mCode, $mRevisionID, $mSource;
|
var $mEngine, $mTitle, $mCode, $mRevisionID, $mSource;
|
||||||
|
|
||||||
public final function __construct( $engine, $title, $code, $revisionID, $source ) {
|
public function __construct( $engine, $title, $code, $revisionID, $source ) {
|
||||||
$this->mEngine = $engine;
|
$this->mEngine = $engine;
|
||||||
$this->mTitle = $title;
|
$this->mTitle = $title;
|
||||||
$this->mCode = $code;
|
$this->mCode = $code;
|
||||||
|
@ -236,11 +226,11 @@ abstract class ScriptingModuleBase {
|
||||||
abstract class ScriptingFunctionBase {
|
abstract class ScriptingFunctionBase {
|
||||||
protected $mName, $mContents, $mModule, $mEngine;
|
protected $mName, $mContents, $mModule, $mEngine;
|
||||||
|
|
||||||
public final function __construct( $name, $contents, $module, $engine ) {
|
public function __construct( $module, $name, $contents ) {
|
||||||
$this->mName = $name;
|
$this->mName = $name;
|
||||||
$this->mContents = $contents;
|
$this->mContents = $contents;
|
||||||
$this->mModule = $module;
|
$this->mModule = $module;
|
||||||
$this->mEngine = $engine;
|
$this->mEngine = $module->getEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* Generic scripting functions.
|
* Generic scripting functions.
|
||||||
*/
|
*/
|
||||||
class Scripting {
|
class Scripting {
|
||||||
const Local = 'local';
|
const LOCAL = 'local';
|
||||||
|
|
||||||
protected static function getEngineClass() {
|
protected static function getEngineClass() {
|
||||||
global $wgScriptingEngine, $wgScriptingEngines;
|
global $wgScriptingEngine, $wgScriptingEngines;
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hooks for Scripting extension.
|
* Hooks for the Scripting extension.
|
||||||
*/
|
*/
|
||||||
class ScriptingHooks {
|
class ScriptingHooks {
|
||||||
/**
|
/**
|
||||||
|
@ -35,7 +35,7 @@ class ScriptingHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when interpreter is to be reset.
|
* Called when the interpreter is to be reset.
|
||||||
*
|
*
|
||||||
* @static
|
* @static
|
||||||
* @param $parser Parser
|
* @param $parser Parser
|
||||||
|
@ -47,7 +47,7 @@ class ScriptingHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds scriptlinks table to parser tests.
|
* Add scriptlinks table to parser tests.
|
||||||
*/
|
*/
|
||||||
public static function addTestTables( &$tables ) {
|
public static function addTestTables( &$tables ) {
|
||||||
$tables[] = 'scriptlinks';
|
$tables[] = 'scriptlinks';
|
||||||
|
@ -55,7 +55,7 @@ class ScriptingHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the {{#invoke:module|func}} construction.
|
* Hook function for {{#invoke:module|func}}
|
||||||
*
|
*
|
||||||
* @param $parser Parser
|
* @param $parser Parser
|
||||||
* @param $frame PPFrame
|
* @param $frame PPFrame
|
||||||
|
@ -73,7 +73,7 @@ class ScriptingHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the transclusion of the script ({{script:module}} hook).
|
* Hook function for {{script:module}}
|
||||||
*
|
*
|
||||||
* @param $parser Parser
|
* @param $parser Parser
|
||||||
* @param $frame PPFrame
|
* @param $frame PPFrame
|
||||||
|
@ -94,7 +94,7 @@ class ScriptingHooks {
|
||||||
* @return string
|
* @return string
|
||||||
* @throws ScriptingException
|
* @throws ScriptingException
|
||||||
*/
|
*/
|
||||||
private static function doRunHook( &$parser, $frame, $module, $function, $args ) {
|
private static function doRunHook( $parser, $frame, $module, $function, $args ) {
|
||||||
wfProfileIn( __METHOD__ );
|
wfProfileIn( __METHOD__ );
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -104,7 +104,7 @@ class ScriptingHooks {
|
||||||
$arg = $frame->expand( $arg );
|
$arg = $frame->expand( $arg );
|
||||||
}
|
}
|
||||||
|
|
||||||
$module = $engine->getModule( $module, Scripting::Local );
|
$module = $engine->getModule( $module, Scripting::LOCAL );
|
||||||
|
|
||||||
$functionObj = $module->getFunction( $function );
|
$functionObj = $module->getFunction( $function );
|
||||||
if( !$functionObj ) {
|
if( !$functionObj ) {
|
||||||
|
@ -114,7 +114,7 @@ class ScriptingHooks {
|
||||||
$result = $functionObj->call( $args, $frame );
|
$result = $functionObj->call( $args, $frame );
|
||||||
|
|
||||||
wfProfileOut( __METHOD__ );
|
wfProfileOut( __METHOD__ );
|
||||||
return trim( $result );
|
return trim( strval( $result ) );
|
||||||
} catch( ScriptingException $e ) {
|
} catch( ScriptingException $e ) {
|
||||||
$msg = $e->getMessage();
|
$msg = $e->getMessage();
|
||||||
wfProfileOut( __METHOD__ );
|
wfProfileOut( __METHOD__ );
|
||||||
|
|
|
@ -31,7 +31,7 @@ if( !defined( 'MEDIAWIKI' ) )
|
||||||
*/
|
*/
|
||||||
class ScriptLinksUpdateHooks {
|
class ScriptLinksUpdateHooks {
|
||||||
/**
|
/**
|
||||||
* Appends script links to the output.
|
* Append script links to the output.
|
||||||
*/
|
*/
|
||||||
public static function appendToOutput( &$parser, &$text ) {
|
public static function appendToOutput( &$parser, &$text ) {
|
||||||
if( isset( $parser->scripting_engine ) ) {
|
if( isset( $parser->scripting_engine ) ) {
|
||||||
|
@ -41,7 +41,7 @@ class ScriptLinksUpdateHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs the link updater.
|
* Run the link updater.
|
||||||
*/
|
*/
|
||||||
public static function updateLinks( &$update ) {
|
public static function updateLinks( &$update ) {
|
||||||
$output = $update->mParserOutput;
|
$output = $update->mParserOutput;
|
||||||
|
@ -57,7 +57,7 @@ class ScriptLinksUpdateHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Purges cache for all the pages where the script is used.
|
* Purge cache for all the pages where the script is used.
|
||||||
* @param $article Article
|
* @param $article Article
|
||||||
* @param $editInfo
|
* @param $editInfo
|
||||||
* @param $changed
|
* @param $changed
|
||||||
|
@ -71,7 +71,7 @@ class ScriptLinksUpdateHooks {
|
||||||
$engine = Scripting::getEngine( $wgParser );
|
$engine = Scripting::getEngine( $wgParser );
|
||||||
$engine->invalidateModuleCache( $article->getTitle() );
|
$engine->invalidateModuleCache( $article->getTitle() );
|
||||||
|
|
||||||
// Invalidate caches of articles which include the script
|
// Invalidate the caches of articles which include the script
|
||||||
$wgDeferredUpdateList[] = new HTMLCacheUpdate( $article->getTitle(), 'scriptlinks' );
|
$wgDeferredUpdateList[] = new HTMLCacheUpdate( $article->getTitle(), 'scriptlinks' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ class ScriptLinksUpdateHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds scriptlinks to the list of tables supported by BacklinkCache.
|
* Add scriptlinks to the list of tables supported by BacklinkCache.
|
||||||
*/
|
*/
|
||||||
public static function getBacklinkCachePrefix( $table, &$prefix ) {
|
public static function getBacklinkCachePrefix( $table, &$prefix ) {
|
||||||
if( $table == 'scriptlinks' ) {
|
if( $table == 'scriptlinks' ) {
|
||||||
|
@ -91,7 +91,7 @@ class ScriptLinksUpdateHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds scriptlinks to the list of tables supported by BacklinkCache.
|
* Add scriptlinks to the list of tables supported by BacklinkCache.
|
||||||
* @param $table
|
* @param $table
|
||||||
* @param $title Title
|
* @param $title Title
|
||||||
* @param $conds
|
* @param $conds
|
||||||
|
@ -111,7 +111,7 @@ class ScriptLinksUpdateHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class that updates links on scripts like phase3/includes/LinksUpdate.php does that
|
* A class that updates links on scripts like what phase3/includes/LinksUpdate.php does
|
||||||
* with templates.
|
* with templates.
|
||||||
*/
|
*/
|
||||||
class ScriptLinksUpdate {
|
class ScriptLinksUpdate {
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
class LuaSandboxEngine extends ScriptingEngineBase {
|
class LuaSandboxEngine extends ScriptingEngineBase {
|
||||||
public $mSandbox;
|
public $mSandbox, $mLoaded = false;
|
||||||
|
|
||||||
|
public function newModule( $title, $code, $revisionID, $source ) {
|
||||||
|
return new LuaSandboxEngineModule( $this, $title, $code, $revisionID, $source );
|
||||||
|
}
|
||||||
|
|
||||||
public function load() {
|
public function load() {
|
||||||
if( $this->mLoaded ) {
|
if( $this->mLoaded ) {
|
||||||
|
@ -119,7 +123,7 @@ class LuaSandboxEngineModule extends ScriptingModuleBase {
|
||||||
$this->initialize();
|
$this->initialize();
|
||||||
|
|
||||||
if( isset( $this->mContents[$name] ) ) {
|
if( isset( $this->mContents[$name] ) ) {
|
||||||
return new LuaSandboxEngineFunction( $name, $this->mContents[$name], $this, $this->mEngine );
|
return new LuaSandboxEngineFunction( $this, $name, $this->mContents[$name] );
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -139,6 +143,10 @@ class LuaSandboxEngineFunction extends ScriptingFunctionBase {
|
||||||
throw new ScriptingException( 'error', 'luasandbox', null, null, array( $e->getMessage() ) );
|
throw new ScriptingException( 'error', 'luasandbox', null, null, array( $e->getMessage() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
return implode( '', $result );
|
if ( isset( $result[0] ) ) {
|
||||||
|
return $result[0];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue