class Middleman::LiveReloadExtension

Public Class Methods

new(app, options_hash={}, &block) click to toggle source
Calls superclass method
# File lib/middleman-livereload/extension_3_1.rb, line 19
def initialize(app, options_hash={}, &block)
  super

  if app.respond_to?(:server?)
    return unless app.server?
  else
    return unless app.environment == :development
  end

  port = options.port.to_i
  host = options.host
  js_port = options.js_port || port
  js_host = options.js_host || host
  no_swf = options.no_swf
  ignore = options.ignore
  options_hash = options.to_h
  livereload_css_target = options.livereload_css_target
  livereload_css_pattern = options.livereload_css_pattern

  extension = self

  app.ready do
    reactor = ::Middleman::LiveReload::Reactor.create(options_hash, self)

    ignored = lambda do |file|
      return true if app.files.respond_to?(:ignored?) && app.files.send(:ignored?, file)
      ignore.any? { |i| file.to_s.match(i) }
    end

    app.files.changed do |file|
      next if ignored.call(file)

      logger.debug "LiveReload: File changed - #{file}"

      reload_path = "#{Dir.pwd}/#{file}"

      file_url = app.sitemap.file_to_path(file)
      if file_url
        file_resource = app.sitemap.find_resource_by_path(file_url)
        if file_resource
          reload_path = file_resource.url
        end
      end

      # handle imported partials
      # load target file instead of triggering full page refresh
      if livereload_css_pattern.match(file.to_s) and not livereload_css_target.nil?
        logger.info("LiveReload: CSS import changed, reloading target")
        reload_path = livereload_css_target
      end

      reactor.reload_browser(reload_path)
    end

    app.files.deleted do |file|
      next if ignored.call(file)

      logger.debug "LiveReload: File deleted - #{file}"

      reactor.reload_browser("#{Dir.pwd}/#{file}")
    end

    # Use the vendored livereload.js source rather than trying to get it from Middleman
    # https://github.com/johnbintz/rack-livereload#which-livereload-script-does-it-use
    app.use ::Rack::LiveReload, port: js_port, host: js_host, no_swf: no_swf, source: :vendored, ignore: ignore
  end
end