75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
require "bundler/gem_tasks"
 | 
						|
require "jekyll"
 | 
						|
require "listen"
 | 
						|
 | 
						|
def listen_ignore_paths(base, options)
 | 
						|
  [
 | 
						|
    /_config\.ya?ml/,
 | 
						|
    /_site/,
 | 
						|
    /\.jekyll-metadata/
 | 
						|
  ]
 | 
						|
end
 | 
						|
 | 
						|
def listen_handler(base, options)
 | 
						|
  site = Jekyll::Site.new(options)
 | 
						|
  Jekyll::Command.process_site(site)
 | 
						|
  proc do |modified, added, removed|
 | 
						|
    t = Time.now
 | 
						|
    c = modified + added + removed
 | 
						|
    n = c.length
 | 
						|
    relative_paths = c.map{ |p| Pathname.new(p).relative_path_from(base).to_s }
 | 
						|
    print Jekyll.logger.message("Regenerating:", "#{relative_paths.join(", ")} changed... ")
 | 
						|
    begin
 | 
						|
      Jekyll::Command.process_site(site)
 | 
						|
      puts "regenerated in #{Time.now - t} seconds."
 | 
						|
    rescue => e
 | 
						|
      puts "error:"
 | 
						|
      Jekyll.logger.warn "Error:", e.message
 | 
						|
      Jekyll.logger.warn "Error:", "Run jekyll build --trace for more information."
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
task :preview do
 | 
						|
  base = Pathname.new('.').expand_path
 | 
						|
  options = {
 | 
						|
    "source"        => base.join('example').to_s,
 | 
						|
    "destination"   => base.join('example/_site').to_s,
 | 
						|
    "force_polling" => false,
 | 
						|
    "serving"       => true,
 | 
						|
    "theme"         => "jekyll-theme-basically-basic"
 | 
						|
  }
 | 
						|
 | 
						|
  options = Jekyll.configuration(options)
 | 
						|
 | 
						|
  ENV["LISTEN_GEM_DEBUGGING"] = "1"
 | 
						|
  listener = Listen.to(
 | 
						|
    base.join("_includes"),
 | 
						|
    base.join("_layouts"),
 | 
						|
    base.join("_sass"),
 | 
						|
    base.join("assets"),
 | 
						|
    options["source"],
 | 
						|
    :ignore => listen_ignore_paths(base, options),
 | 
						|
    :force_polling => options['force_polling'],
 | 
						|
    &(listen_handler(base, options))
 | 
						|
  )
 | 
						|
 | 
						|
  begin
 | 
						|
    listener.start
 | 
						|
    Jekyll.logger.info "Auto-regeneration:", "enabled for '#{options["source"]}'"
 | 
						|
 | 
						|
    unless options['serving']
 | 
						|
      trap("INT") do
 | 
						|
        listener.stop
 | 
						|
        puts "     Halting auto-regeneration."
 | 
						|
        exit 0
 | 
						|
      end
 | 
						|
 | 
						|
      loop { sleep 1000 }
 | 
						|
    end
 | 
						|
  rescue ThreadError
 | 
						|
    # You pressed Ctrl-C, oh my!
 | 
						|
  end
 | 
						|
 | 
						|
  Jekyll::Commands::Serve.process(options)
 | 
						|
end |