From f9ca8f3789288922560a4710b2c1cf8bb0816fc6 Mon Sep 17 00:00:00 2001 From: Abdul Qabiz Date: Sun, 31 May 2020 07:01:32 +0530 Subject: [PATCH 1/4] Inject script in footer if theme is using theming v2 api --- lib/zendesk_apps_tools/theme.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/zendesk_apps_tools/theme.rb b/lib/zendesk_apps_tools/theme.rb index 27389fbe..94accc5c 100644 --- a/lib/zendesk_apps_tools/theme.rb +++ b/lib/zendesk_apps_tools/theme.rb @@ -90,8 +90,15 @@ def generate_payload identifier = template.match(IDENTIFIER_REGEX)['identifier'].to_s templates_payload[identifier] = File.read(template) end + #template where inject_external_tags will inject scripts/tags + script_location = 'document_head' + #use footer as location for tag injections + if metadata_hash['api_version'] == 2 + script_location = 'footer' + end payload['templates'] = templates_payload - payload['templates']['document_head'] = inject_external_tags(payload['templates']['document_head']) + #inject tag in either document_head (theming_v1 based themes), or footer (theming_v2 based themes) + payload['templates'][script_location] = inject_external_tags(payload['templates'][script_location]) payload['templates']['css'] = '' payload['templates']['js'] = '' payload['templates']['assets'] = assets From 04a1f0deb2b85fa7a58d03abf2f31b5119f6aac1 Mon Sep 17 00:00:00 2001 From: Abdul Qabiz Date: Mon, 1 Jun 2020 00:28:38 +0530 Subject: [PATCH 2/4] Refactor code to inject tags at desired locations; and also respect custom port setting --- lib/zendesk_apps_tools/theme.rb | 73 +++++++++++++++--------- lib/zendesk_apps_tools/theming/common.rb | 18 +++--- 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/lib/zendesk_apps_tools/theme.rb b/lib/zendesk_apps_tools/theme.rb index 94accc5c..1d7400f2 100644 --- a/lib/zendesk_apps_tools/theme.rb +++ b/lib/zendesk_apps_tools/theme.rb @@ -90,45 +90,66 @@ def generate_payload identifier = template.match(IDENTIFIER_REGEX)['identifier'].to_s templates_payload[identifier] = File.read(template) end - #template where inject_external_tags will inject scripts/tags script_location = 'document_head' - #use footer as location for tag injections + style_location = 'document_head' + livereload_location = 'document_head' + + #theming_v2 based theme should have script.js + # injected at the end of the page if metadata_hash['api_version'] == 2 script_location = 'footer' end + payload['templates'] = templates_payload #inject tag in either document_head (theming_v1 based themes), or footer (theming_v2 based themes) - payload['templates'][script_location] = inject_external_tags(payload['templates'][script_location]) + payload['templates'][script_location] = inject_external_tags(payload['templates'][script_location], + js_tag_hash['html']) + payload['templates'][style_location] = inject_external_tags(payload['templates'][style_location], + css_tag_hash['html'], true) + payload['templates'][livereload_location] = inject_external_tags(payload['templates'][livereload_location], + live_reload_script_tag_hash['html']) payload['templates']['css'] = '' payload['templates']['js'] = '' - payload['templates']['assets'] = assets - payload['templates']['variables'] = settings_hash + payload['templates']['assets'] = assets(base_url) + payload['templates']['variables'] = settings_hash(base_url) payload['templates']['metadata'] = metadata_hash payload end - def inject_external_tags(head_template) - live_reload_script_tag = <<-html + def base_url + "http://localhost:#{options[:port]}" + end + + def live_reload_script_tag_hash + { 'html' => <<-html - - html - - js_tag = <<-html - - html - - css_tag = <<-html - - html - - template = StringIO.new - template << css_tag - template << head_template - template << js_tag - template << live_reload_script_tag - template.string + + html + } + end + + def js_tag_hash + { 'html' => <<-html + + html + } + end + + def css_tag_hash + { 'html' => <<-html + + html + } + end + + def inject_external_tags(template, tag_html, top=false) + _template = StringIO.new + _template << tag_html if top + _template << template + _template << tag_html unless top + _template.string end alias_method :ensure_manifest!, :manifest @@ -149,7 +170,7 @@ def start_server(callbacks_after_upload) server.set :livereload, options[:livereload] server.set :callbacks_after_load, callbacks_after_upload server.set :callback_map, {} - server.use Rack::LiveReload, live_reload_port: 4567 if options[:livereload] + server.use Rack::LiveReload, live_reload_port: options[:port] if options[:livereload] server.run! end end diff --git a/lib/zendesk_apps_tools/theming/common.rb b/lib/zendesk_apps_tools/theming/common.rb index dfeb8a1f..98a7c7e1 100644 --- a/lib/zendesk_apps_tools/theming/common.rb +++ b/lib/zendesk_apps_tools/theming/common.rb @@ -5,21 +5,22 @@ def theme_package_path(*file) File.expand_path(File.join(app_dir, *file)) end - def url_for(package_file) + def url_for(package_file, base_url='') relative_path = relative_path_for(package_file) path_parts = recursive_pathname_split(relative_path) path_parts.shift - "http://localhost:4567/guide/#{path_parts.join('/')}" + base = "https://localhost:4567" unless base_url + "#{base}/guide/#{path_parts.join('/')}" end def relative_path_for(filename) Pathname.new(filename).relative_path_from(Pathname.new(File.expand_path(app_dir))).cleanpath end - def assets + def assets(base_url='') assets = Dir.glob(theme_package_path('assets', '*')) assets.each_with_object({}) do |asset, asset_payload| - asset_payload[File.basename(asset)] = url_for(asset) + asset_payload[File.basename(asset)] = url_for(asset, base_url) end end @@ -39,9 +40,9 @@ def manifest say_error_and_exit "The manifest file is invalid at #{full_manifest_path}" end - def settings_hash + def settings_hash(base_url='') manifest['settings'].flat_map { |setting_group| setting_group['variables'] }.each_with_object({}) do |variable, result| - result[variable.fetch('identifier')] = value_for_setting(variable) + result[variable.fetch('identifier')] = value_for_setting(variable, base_url) end end @@ -49,12 +50,12 @@ def metadata_hash { 'api_version' => manifest['api_version'] } end - def value_for_setting(variable) + def value_for_setting(variable, base_url='') return variable.fetch('value') unless variable.fetch('type') == 'file' files = Dir.glob(theme_package_path('settings', '*.*')) file = files.find { |f| File.basename(f, '.*') == variable.fetch('identifier') } - url_for(file) + url_for(file, base_url) end def recursive_pathname_split(relative_path) @@ -63,6 +64,7 @@ def recursive_pathname_split(relative_path) return split_path if split_path[0] == joined_directories.split[0] [*recursive_pathname_split(joined_directories), split_path[1]] end + end end end From 78ca2fec95d59f2d5146dbfac4c6a20e3b35749f Mon Sep 17 00:00:00 2001 From: Abdul Qabiz Date: Mon, 1 Jun 2020 01:34:12 +0530 Subject: [PATCH 3/4] Check and set base_url --- lib/zendesk_apps_tools/theming/common.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/zendesk_apps_tools/theming/common.rb b/lib/zendesk_apps_tools/theming/common.rb index 98a7c7e1..4ade3994 100644 --- a/lib/zendesk_apps_tools/theming/common.rb +++ b/lib/zendesk_apps_tools/theming/common.rb @@ -9,7 +9,8 @@ def url_for(package_file, base_url='') relative_path = relative_path_for(package_file) path_parts = recursive_pathname_split(relative_path) path_parts.shift - base = "https://localhost:4567" unless base_url + base = "https://localhost:4567" + base = base_url if base_url "#{base}/guide/#{path_parts.join('/')}" end From aa93aeb8b26b76ada7a3dc6c00206acccf388940 Mon Sep 17 00:00:00 2001 From: Abdul Qabiz Date: Mon, 1 Jun 2020 03:31:08 +0530 Subject: [PATCH 4/4] Refactor theme, common, and server methods preview url --- lib/zendesk_apps_tools/theme.rb | 1 + lib/zendesk_apps_tools/theming/common.rb | 24 +++++++++++------------- lib/zendesk_apps_tools/theming/server.rb | 2 +- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/zendesk_apps_tools/theme.rb b/lib/zendesk_apps_tools/theme.rb index 1d7400f2..40a878f5 100644 --- a/lib/zendesk_apps_tools/theme.rb +++ b/lib/zendesk_apps_tools/theme.rb @@ -168,6 +168,7 @@ def start_server(callbacks_after_upload) server.set :root, app_dir server.set :public_folder, app_dir server.set :livereload, options[:livereload] + server.set :base_url, base_url server.set :callbacks_after_load, callbacks_after_upload server.set :callback_map, {} server.use Rack::LiveReload, live_reload_port: options[:port] if options[:livereload] diff --git a/lib/zendesk_apps_tools/theming/common.rb b/lib/zendesk_apps_tools/theming/common.rb index 4ade3994..aa0cca80 100644 --- a/lib/zendesk_apps_tools/theming/common.rb +++ b/lib/zendesk_apps_tools/theming/common.rb @@ -5,28 +5,26 @@ def theme_package_path(*file) File.expand_path(File.join(app_dir, *file)) end - def url_for(package_file, base_url='') + def path_for(package_file) relative_path = relative_path_for(package_file) path_parts = recursive_pathname_split(relative_path) path_parts.shift - base = "https://localhost:4567" - base = base_url if base_url - "#{base}/guide/#{path_parts.join('/')}" + "/guide/#{path_parts.join('/')}" end def relative_path_for(filename) Pathname.new(filename).relative_path_from(Pathname.new(File.expand_path(app_dir))).cleanpath end - def assets(base_url='') + def assets(base_url) assets = Dir.glob(theme_package_path('assets', '*')) assets.each_with_object({}) do |asset, asset_payload| - asset_payload[File.basename(asset)] = url_for(asset, base_url) + asset_payload[File.basename(asset)] = "#{base_url}#{path_for(asset)}" end end - def assets_hash - assets.each_with_object({}) do |(k,v), h| + def assets_hash(base_url) + assets(base_url).each_with_object({}) do |(k,v), h| parametrized = k.gsub(/[^a-z0-9\-_]+/, '-') h["assets-#{parametrized}"] = v end @@ -41,9 +39,11 @@ def manifest say_error_and_exit "The manifest file is invalid at #{full_manifest_path}" end - def settings_hash(base_url='') + def settings_hash(base_url) manifest['settings'].flat_map { |setting_group| setting_group['variables'] }.each_with_object({}) do |variable, result| - result[variable.fetch('identifier')] = value_for_setting(variable, base_url) + value = value_for_setting(variable) + value = "#{base_url}#{path_for(value)}" if variable.fetch('type') == 'file' + result[variable.fetch('identifier')] = value end end @@ -53,10 +53,8 @@ def metadata_hash def value_for_setting(variable, base_url='') return variable.fetch('value') unless variable.fetch('type') == 'file' - files = Dir.glob(theme_package_path('settings', '*.*')) - file = files.find { |f| File.basename(f, '.*') == variable.fetch('identifier') } - url_for(file, base_url) + files.find { |f| File.basename(f, '.*') == variable.fetch('identifier') } end def recursive_pathname_split(relative_path) diff --git a/lib/zendesk_apps_tools/theming/server.rb b/lib/zendesk_apps_tools/theming/server.rb index a5553783..57632834 100644 --- a/lib/zendesk_apps_tools/theming/server.rb +++ b/lib/zendesk_apps_tools/theming/server.rb @@ -57,7 +57,7 @@ class Server < Sinatra::Base raise Sinatra::NotFound unless File.exist?(style_css) zass_source = File.read(style_css) require 'zendesk_apps_tools/theming/zass_formatter' - response = ZassFormatter.format(zass_source, settings_hash.merge(assets_hash)) + response = ZassFormatter.format(zass_source, settings_hash(settings.base_url).merge(assets_hash(settings.base_url))) response end