diff --git a/app/assets/javascripts/discourse/helpers/theme-setting-injector.es6 b/app/assets/javascripts/discourse/helpers/theme-setting-injector.es6 new file mode 100644 index 00000000000..4a0d5916efd --- /dev/null +++ b/app/assets/javascripts/discourse/helpers/theme-setting-injector.es6 @@ -0,0 +1,19 @@ +// A small helper to inject theme settings into +// context objects of handlebars templates used +// in themes + +import { registerHelper } from 'discourse-common/lib/helpers'; + +registerHelper('theme-setting-injector', function(arr, hash) { + const context = hash.context; + let value = hash.value; + + if (typeof value === "string") { + value = value.replace(/\\u0022/g, '"'); + } + + if (!context.get("themeSettings")) { + context.set("themeSettings", {}); + } + context.set(`themeSettings.${hash.key}`, value); +}); diff --git a/app/models/theme_field.rb b/app/models/theme_field.rb index 1eeb40831fa..780ff579737 100644 --- a/app/models/theme_field.rb +++ b/app/models/theme_field.rb @@ -59,9 +59,17 @@ PLUGIN_API_JS doc = Nokogiri::HTML.fragment(html) doc.css('script[type="text/x-handlebars"]').each do |node| name = node["name"] || node["data-template-name"] || "broken" + + setting_helpers = '' + theme.cached_settings.each do |k, v| + val = v.is_a?(String) ? "\"#{v.gsub('"', "\\u0022")}\"" : v + setting_helpers += "{{theme-setting-injector context=this key=\"#{k}\" value=#{val}}}\n" + end + hbs_template = setting_helpers + node.inner_html + is_raw = name =~ /\.raw$/ if is_raw - template = "requirejs('discourse-common/lib/raw-handlebars').template(#{Barber::Precompiler.compile(node.inner_html)})" + template = "requirejs('discourse-common/lib/raw-handlebars').template(#{Barber::Precompiler.compile(hbs_template)})" node.replace < (function() { @@ -70,7 +78,7 @@ PLUGIN_API_JS COMPILED else - template = "Ember.HTMLBars.template(#{Barber::Ember::Precompiler.compile(node.inner_html)})" + template = "Ember.HTMLBars.template(#{Barber::Ember::Precompiler.compile(hbs_template)})" node.replace < (function() {