diff --git a/lang/en/admin.php b/lang/en/admin.php index ca87cd7684d..256abff2c84 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -969,6 +969,7 @@ $string['roleswithexceptions'] = '{$a->roles}, with {$a->exceptions}'; $string['rssglobaldisabled'] = 'Disabled at server level'; $string['save'] = 'Save'; $string['savechanges'] = 'Save changes'; +$string['scssinvalid'] = 'SCSS code is not valid, fails with: {$a}'; $string['search'] = 'Search'; $string['searchalldeleted'] = 'All indexed contents have been deleted'; $string['searchareaenabled'] = 'Search area enabled'; diff --git a/lib/adminlib.php b/lib/adminlib.php index faa3b6482e7..aca0b82f6ee 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -10180,3 +10180,41 @@ class admin_setting_searchsetupinfo extends admin_setting { } } + +/** + * Used to validate the contents of SCSS code and ensuring they are parsable. + * + * It does not attempt to detect undefined SCSS variables because it is designed + * to be used without knowledge of other config/scss included. + * + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright 2016 Dan Poltawski + */ +class admin_setting_scsscode extends admin_setting_configtextarea { + + /** + * Validate the contents of the SCSS to ensure its parsable. Does not + * attempt to detect undefined scss variables. + * + * @param string $data The scss code from text field. + * @return mixed bool true for success or string:error on failure. + */ + public function validate($data) { + if (empty($data)) { + return true; + } + + $scss = new core_scss(); + try { + $scss->compile($data); + } catch (Leafo\ScssPhp\Exception\ParserException $e) { + return get_string('scssinvalid', 'admin', $e->getMessage()); + } catch (Leafo\ScssPhp\Exception\CompilerException $e) { + // Silently ignore this - it could be a scss variable defined from somewhere + // else which we are not examining here. + return true; + } + + return true; + } +} diff --git a/theme/boost/settings.php b/theme/boost/settings.php index 326c2055fe1..15b2c391040 100644 --- a/theme/boost/settings.php +++ b/theme/boost/settings.php @@ -73,13 +73,13 @@ if ($ADMIN->fulltree) { $page = new admin_settingpage('theme_boost_advanced', get_string('advancedsettings', 'theme_boost')); // Raw SCSS to include before the content. - $setting = new admin_setting_configtextarea('theme_boost/scsspre', + $setting = new admin_setting_scsscode('theme_boost/scsspre', get_string('rawscsspre', 'theme_boost'), get_string('rawscsspre_desc', 'theme_boost'), '', PARAM_RAW); $setting->set_updatedcallback('theme_reset_all_caches'); $page->add($setting); // Raw SCSS to include after the content. - $setting = new admin_setting_configtextarea('theme_boost/scss', get_string('rawscss', 'theme_boost'), + $setting = new admin_setting_scsscode('theme_boost/scss', get_string('rawscss', 'theme_boost'), get_string('rawscss_desc', 'theme_boost'), '', PARAM_RAW); $setting->set_updatedcallback('theme_reset_all_caches'); $page->add($setting);