Class: MiddlemanInlineStyle::Rack::Middleware

Inherits:
Object
  • Object
show all
Defined in:
lib/middleman-inline-style/rack-middleware.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, opts = {}) ⇒ Middleware

Returns a new instance of Middleware.

Parameters:

  • opts (Hash) (defaults to: {})

    Middleware options

Options Hash (opts):

  • :stylesheets_path (String) — default: env['DOCUMENT_ROOT']

    Stylesheets root path or app’s public directory where the stylesheets are to be found

  • :paths (Regexp, Array, String)

    Limit processing to the passed absolute paths Can be an array of strings or regular expressions, a single string or regular expression If not passed will process output for every path. Regexps and strings must comence with ‘/’

  • :pseudo (Boolean) — default: false

    If set to true will inline style for pseudo classes according to the W3C specification: www.w3.org/TR/css-style-attr. Should probably be left as false because browsers don’t seem to comply with the specification for pseudo class style in the style attribute.



18
19
20
21
22
# File 'lib/middleman-inline-style/rack-middleware.rb', line 18

def initialize app, opts = {}
  @app   = app
  @opts  = opts
  @paths = /^(?:#{ [*opts[:paths]].join('|') })/
end

Instance Method Details

#call(env) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/middleman-inline-style/rack-middleware.rb', line 24

def call env
  response = @app.call env
  return response unless @paths === env['PATH_INFO']
  
  status, headers, body = response
  return response unless headers['Content-Type'] == nil or headers['Content-Type'].start_with?('text/html')
  newbody = []
  body.each { |str| newbody << str }
  newbody = newbody.join('')
  newbody = InlineStyle.process(newbody, {:stylesheets_path => "./build/"}.merge(@opts))
  headers['Content-Length'] = Rack::Utils.bytesize(newbody).to_s
  [status, headers, [newbody]]
end