Skip to content
Snippets Groups Projects
Rakefile 1.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • Eloi Perdereau's avatar
    Eloi Perdereau committed
    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("_data"),
        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