Class: Slimmer::Skin
- Inherits:
-
Object
- Object
- Slimmer::Skin
- Defined in:
- lib/slimmer/skin.rb,
lib/slimmer/test.rb
Instance Attribute Summary collapse
-
#asset_host ⇒ Object
Returns the value of attribute asset_host.
-
#logger ⇒ Object
Returns the value of attribute logger.
-
#options ⇒ Object
Returns the value of attribute options.
-
#strict ⇒ Object
Returns the value of attribute strict.
Instance Method Summary collapse
- #context(html, error) ⇒ Object
- #ignorable?(error) ⇒ Boolean
-
#initialize(options = {}) ⇒ Skin
constructor
A new instance of Skin.
- #load_template(name) ⇒ Object
- #parse_html(html, description_for_error_message) ⇒ Object
- #process(processors, body, template, _rack_env) ⇒ Object
- #report_parse_errors_if_strict!(nokogiri_doc, _description_for_error_message) ⇒ Object
- #success(source_request, response, body) ⇒ Object
- #template(template_name) ⇒ Object
- #template_url(template_name) ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ Skin
Returns a new instance of Skin.
8 9 10 11 12 13 14 |
# File 'lib/slimmer/skin.rb', line 8 def initialize( = {}) @options = @asset_host = [:asset_host] @logger = [:logger] || NullLogger.instance @strict = [:strict] || %w[development test].include?(ENV["RACK_ENV"]) end |
Instance Attribute Details
#asset_host ⇒ Object
Returns the value of attribute asset_host.
6 7 8 |
# File 'lib/slimmer/skin.rb', line 6 def asset_host @asset_host end |
#logger ⇒ Object
Returns the value of attribute logger.
6 7 8 |
# File 'lib/slimmer/skin.rb', line 6 def logger @logger end |
#options ⇒ Object
Returns the value of attribute options.
6 7 8 |
# File 'lib/slimmer/skin.rb', line 6 def @options end |
#strict ⇒ Object
Returns the value of attribute strict.
6 7 8 |
# File 'lib/slimmer/skin.rb', line 6 def strict @strict end |
Instance Method Details
#context(html, error) ⇒ Object
65 66 67 68 69 70 71 72 73 74 |
# File 'lib/slimmer/skin.rb', line 65 def context(html, error) context_size = 5 lines = [""] + html.split("\n") from = [1, error.line - context_size].max to = [lines.size - 1, error.line + context_size].min context = (from..to).zip(lines[from..to]).map { |lineno, line| sprintf("%4d: %s", lineno, line) } marker = "#{' ' * (error.column - 1)}-----v" context.insert(context_size, marker) context.join("\n") end |
#ignorable?(error) ⇒ Boolean
76 77 78 79 |
# File 'lib/slimmer/skin.rb', line 76 def ignorable?(error) ignorable_codes = [801] ignorable_codes.include?(error.code) || error..match(/Element script embeds close tag/) || error..match(/Unexpected end tag : noscript/) end |
#load_template(name) ⇒ Object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/slimmer/skin.rb', line 22 def load_template(template_name) url = template_url(template_name) HTTPClient.get(url) rescue Errno::ECONNREFUSED, SocketError, OpenSSL::SSL::SSLError, RestClient::Exception => e = "Unable to fetch: '#{template_name}' from '#{url}' because #{e}" if e.is_a?(RestClient::Exception) && e.http_code == 404 raise TemplateNotFoundException, , caller end if e.is_a?(RestClient::Exception) && [502, 503, 504].include?(e.http_code) raise IntermittentRetrievalError, , caller end raise CouldNotRetrieveTemplate, , caller end |
#parse_html(html, description_for_error_message) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/slimmer/skin.rb', line 49 def parse_html(html, ) doc = Nokogiri::HTML.parse(html) if strict errors = doc.errors.select(&:error?).reject { |e| ignorable?(e) } unless errors.empty? error = errors.first = "In #{}: '#{error.}' at line #{error.line} col #{error.column} (code #{error.code}).\n" << "Add ?skip_slimmer=1 to the url to show the raw backend request.\n\n" << context(html, error) raise end end doc end |
#process(processors, body, template, _rack_env) ⇒ Object
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/slimmer/skin.rb', line 81 def process(processors, body, template, _rack_env) logger.debug "Slimmer: starting skinning process" src = parse_html(body.to_s, "backend response") dest = parse_html(template, "template") start_time = Time.now logger.debug "Slimmer: Start time = #{start_time}" processors.each do |p| processor_start_time = Time.now logger.debug "Slimmer: Processor #{p} started at #{processor_start_time}" p.filter(src, dest) processor_end_time = Time.now process_time = processor_end_time - processor_start_time logger.debug "Slimmer: Processor #{p} ended at #{processor_end_time} (#{process_time}s)" end end_time = Time.now logger.debug "Slimmer: Skinning process completed at #{end_time} (#{end_time - start_time}s)" dest.to_html end |
#report_parse_errors_if_strict!(nokogiri_doc, _description_for_error_message) ⇒ Object
45 46 47 |
# File 'lib/slimmer/skin.rb', line 45 def report_parse_errors_if_strict!(nokogiri_doc, ) nokogiri_doc end |
#success(source_request, response, body) ⇒ Object
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/slimmer/skin.rb', line 102 def success(source_request, response, body) wrapper_id = [:wrapper_id] || "wrapper" template_wrapper_id = "wrapper" # All templates in Static use `#wrapper` processors = [ Processors::NonceInserter.new(source_request.env), # for security, this needs to be run before any application HTML is inserted Processors::TitleInserter.new, Processors::TagMover.new, Processors::ConditionalCommentMover.new, Processors::BodyInserter.new(wrapper_id, template_wrapper_id, response.headers), Processors::FeedbackURLSwapper.new(source_request, response.headers), Processors::BodyClassCopier.new, Processors::InsideHeaderInserter.new, Processors::HeaderContextInserter.new, Processors::MetadataInserter.new(response, [:app_name]), Processors::SearchParameterInserter.new(response), Processors::SearchPathSetter.new(response), Processors::SearchRemover.new(response.headers), Processors::AccountsShower.new(response.headers), ] template_name = response.headers[Headers::TEMPLATE_HEADER] || "gem_layout" process(processors, body, template(template_name), source_request.env) end |
#template(template_name) ⇒ Object
16 17 18 19 20 |
# File 'lib/slimmer/skin.rb', line 16 def template(template_name) Slimmer.cache.fetch(template_name, expires_in: Slimmer::CACHE_TTL) do load_template(template_name) end end |
#template_url(template_name) ⇒ Object
39 40 41 42 43 |
# File 'lib/slimmer/skin.rb', line 39 def template_url(template_name) host = asset_host.dup host += "/" unless host =~ /\/$/ "#{host}templates/#{template_name}.html.erb" end |