From ce6ae6ada0a3216b5c41d3470dd86165aa3e9a62 Mon Sep 17 00:00:00 2001 From: Fomafix Date: Tue, 10 Apr 2018 21:41:09 +0200 Subject: [PATCH] ResourceLoaderLessVarFileModule: Add parameter 'lessMessages' This change allows to add internationalized messages into CSS. The new parameter 'lessMessages' contains the array of message keys that get set as Less variables. In Less the variables must enclosed in double quotes (") or single quotes (') to prevent CSS injection. Example usage: Resources: "class": "ResourceLoaderLessVarFileModule", "lessMessages": [ "editsection" ], Message 'editsection': edit Less file: content: '[@{msg-editsection}]'; Generated CSS file: content: '[edit]'; Also add a type case (object) to ensure that an empty object is serialized as '{}' and not as '[]'. Also include Less variables from parent. Change-Id: I280b52c6745fe8e5755dc5d58c5621a64757d99d --- .../ResourceLoaderLessVarFileModule.php | 31 ++++++++++++++----- resources/Resources.php | 4 +++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/includes/resourceloader/ResourceLoaderLessVarFileModule.php b/includes/resourceloader/ResourceLoaderLessVarFileModule.php index 17d00e0fab..c4e517ad00 100644 --- a/includes/resourceloader/ResourceLoaderLessVarFileModule.php +++ b/includes/resourceloader/ResourceLoaderLessVarFileModule.php @@ -4,10 +4,21 @@ * Subclass with context specific LESS variables */ class ResourceLoaderLessVarFileModule extends ResourceLoaderFileModule { - protected $lessVariables = [ - 'collapsible-collapse', - 'collapsible-expand', - ]; + protected $lessVariables = []; + + /** + * @inheritDoc + */ + public function __construct( + $options = [], + $localBasePath = null, + $remoteBasePath = null + ) { + if ( isset( $options['lessMessages'] ) ) { + $this->lessVariables = $options['lessMessages']; + } + parent::__construct( $options, $localBasePath, $remoteBasePath ); + } /** * @inheritDoc @@ -19,6 +30,7 @@ class ResourceLoaderLessVarFileModule extends ResourceLoaderFileModule { /** * Exclude a set of messages from a JSON string representation + * * @param string $blob * @param array $exclusions * @return array $blob @@ -29,7 +41,7 @@ class ResourceLoaderLessVarFileModule extends ResourceLoaderFileModule { foreach ( $exclusions as $key ) { unset( $data[$key] ); } - return $data; + return (object)$data; } /** @@ -45,6 +57,7 @@ class ResourceLoaderLessVarFileModule extends ResourceLoaderFileModule { * (ModifyVars) method so that the variable can be loaded and made available to stylesheets. * Note this does not take care of CSS escaping. That will be taken care of as part * of CSS Janus. + * * @param string $msg * @return string wrapped LESS variable definition */ @@ -53,14 +66,16 @@ class ResourceLoaderLessVarFileModule extends ResourceLoaderFileModule { } /** - * @param \ResourceLoaderContext $context + * Get language-specific LESS variables for this module. + * + * @param ResourceLoaderContext $context * @return array LESS variables */ - protected function getLessVars( \ResourceLoaderContext $context ) { + protected function getLessVars( ResourceLoaderContext $context ) { $blob = parent::getMessageBlob( $context ); $lessMessages = $this->excludeMessagesFromBlob( $blob, $this->messages ); - $vars = []; + $vars = parent::getLessVars( $context ); foreach ( $lessMessages as $msgKey => $value ) { $vars['msg-' . $msgKey] = self::wrapAndEscapeMessage( $value ); } diff --git a/resources/Resources.php b/resources/Resources.php index ea4e5eafe7..0fe5dd7513 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -115,6 +115,10 @@ return [ 'jquery.makeCollapsible.styles' => [ 'targets' => [ 'desktop', 'mobile' ], 'class' => ResourceLoaderLessVarFileModule::class, + 'lessMessages' => [ + 'collapsible-collapse', + 'collapsible-expand', + ], 'styles' => [ 'resources/src/jquery/jquery.makeCollapsible.styles.less', ], -- 2.20.1