| 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('test').to_s, |
| "destination" => base.join('test/_site').to_s, |
| "force_polling" => false, |
| "serving" => true, |
| "theme" => "minimal-mistakes-jekyll" |
| } |
| |
| 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 |