%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/Mantle/includes/ |
| Current File : /www/varak.net/wiki.varak.net/extensions/Mantle/includes/ResourceLoaderTemplateModule.php |
<?php
/**
* ResourceLoaderModule subclass which supports templates
*/
/**
* ResourceLoaderModule subclass for mobile
* Allows basic parsing of messages without arguments
*/
class ResourceLoaderTemplateModule extends ResourceLoaderFileModule {
/** @var array Saves a list of names of modules this module depends on. */
protected $dependencies = array();
/** @var array Saves a list of messages which have been marked as needing parsing. */
protected $parsedMessages = array();
/** @var array Saves a list of message keys used by this module. */
protected $messages = array();
/** @var array Saves a list of the templates named by the modules. */
protected $templates = array();
/** @var string Base path to prepend to all local paths in $options. Defaults to $IP. */
protected $localBasePath;
/** @var array Saves the target for the module (e.g. desktop and mobile). */
protected $targets = array( 'mobile', 'desktop' );
/** @var string The local path to where templates are located, see __construct() */
protected $localTemplateBasePath = '';
/** @var boolean Whether the module has parsed messages or not. */
private $hasParsedMessages = false;
/** @var boolean Whether the module has templates or not. */
private $hasTemplates = false;
/**
* @var array Cache for mtime of templates
* @example array( [hash] => [mtime], [hash] => [mtime], ... )
*/
protected $templateModifiedTime = array();
/**
* Registers core modules and runs registration hooks.
* @param $options List of options; if not given or empty, an empty module will be constructed
*/
public function __construct( $options ) {
foreach ( $options as $member => $option ) {
switch ( $member ) {
case 'localTemplateBasePath':
$this->{$member} = (string) $option;
break;
case 'templates':
$this->hasTemplates = true;
$this->{$member} = (array) $option;
break;
case 'messages':
$this->processMessages( $option );
$this->hasParsedMessages = true;
// Prevent them being reinitialised when parent construct is called.
unset( $options[$member] );
break;
}
}
parent::__construct( $options );
}
/**
* Gets list of names of modules this module depends on.
*
* @return Array List of module names
*/
public function getDependencies() {
return $this->dependencies;
}
/**
* Returns the templates named by the modules
* Each template has a corresponding html file in includes/templates/
* @return array List of template names
*/
function getTemplateNames() {
return $this->templates;
}
/**
* Get the path to load templates from.
* @param string $name name of template including file extension
* @return string
*/
protected function getLocalTemplatePath( $name ) {
// @FIXME: Deprecate usage of template without file extension.
return "{$this->localTemplateBasePath}/$name";
}
/**
* Takes named templates by the module and adds them to the JavaScript output
*
* @return string JavaScript code
*/
function getTemplateScript() {
$js = '';
$templates = $this->getTemplateNames();
foreach( $templates as $templateName ) {
$localPath = $this->getLocalTemplatePath( $templateName );
if ( file_exists( $localPath ) ) {
$content = file_get_contents( $localPath );
$js .= Xml::encodeJsCall( 'mw.mantle.template.add', array( $templateName, $content ) );
} else {
$msg = __METHOD__.": template not found: \"$templateName\"";
$js .= Xml::encodeJsCall( 'throw', array( $msg ) );
}
}
return $js;
}
/**
* Processes messages which have been marked as needing parsing
*
* @return string JavaScript code
*/
public function addParsedMessages() {
$js = "\n";
foreach( $this->parsedMessages as $key ) {
$value = wfMessage( $key )->parse();
$js .= Xml::encodeJsCall( 'mw.messages.set', array( $key, $value ) );
}
return $js;
}
/**
* Separates messages which have been marked as needing parsing from standard messages
* @param array $messages Array of messages to process
*/
public function processMessages( $messages ) {
foreach( $messages as $key => $value ) {
if ( is_array( $value ) ) {
foreach( $value as $directive ) {
if ( $directive == 'parse' ) {
$this->parsedMessages[] = $key;
}
}
} else {
$this->messages[] = $value;
}
}
}
/**
* Gets list of message keys used by this module.
*
* @return array List of message keys
*/
public function getMessages() {
return $this->messages;
}
/**
* Gets all scripts for a given context concatenated together including processed messages
*
* @param ResourceLoaderContext $context Context in which to generate script
* @return string JavaScript code for $context
*/
public function getScript( ResourceLoaderContext $context ) {
$script = parent::getScript( $context );
return $this->addParsedMessages() . $this->getTemplateScript() . $script;
}
/**
* Get the URL or URLs to load for this module's JS in debug mode.
* @param ResourceLoaderContext $context
* @return array list of urls
* @see ResourceLoaderModule::getScriptURLsForDebug
*/
public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
if ( $this->hasParsedMessages || $this->hasTemplates ) {
$derivative = new DerivativeResourceLoaderContext( $context );
$derivative->setDebug( true );
$derivative->setModules( array( $this->getName() ) );
// @todo FIXME: Make this templates and update
// makeModuleResponse so that it only outputs template code.
// When this is done you can merge with parent array and
// retain file names.
$derivative->setOnly( 'scripts' );
$rl = $derivative->getResourceLoader();
$urls = array(
$rl->createLoaderURL( $this->getSource(), $derivative ),
);
} else {
$urls = parent::getScriptURLsForDebug( $context );
}
return $urls;
}
/**
* Checks whether any templates used by module have changed
*
* @param ResourceLoaderContext $context Context in which to generate script
* @return int UNIX timestamp
*/
public function getModifiedTimeTemplates( ResourceLoaderContext $context ) {
$hash = $context->getHash();
if ( isset( $this->templateModifiedTime[$hash] ) ) {
$tlm = $this->templateModifiedTime[$hash];
} else {
// Get local paths to all templates
$files = array_map(
array( $this, 'getLocalTemplatePath' ),
$this->getTemplateNames()
);
// Store for quicker future lookup
if ( count( $files ) === 0 ) {
$tlm = 1;
} else {
// check the last modified time of them
wfProfileIn( __METHOD__ . '-filemtime' );
$tlm = max( array_map( array( __CLASS__, 'safeFilemtime' ), $files ) );
wfProfileOut( __METHOD__ . '-filemtime' );
}
// store for future lookup
$this->templateModifiedTime[$hash] = $tlm;
}
return $tlm;
}
/**
* Checks whether any resources used by module have changed
*
* @param ResourceLoaderContext $context in which to generate script
* @return int UNIX timestamp
*/
public function getModifiedTime( ResourceLoaderContext $context ) {
return max( parent::getModifiedTime( $context ),
$this->getModifiedTimeTemplates( $context ) );
}
}