| |
|
|
| require 'rake' |
| require 'yaml' |
| require 'fileutils' |
| require 'rbconfig' |
| require 'html-proofer' |
|
|
| |
|
|
| |
| task :default => :watch |
|
|
| |
| CONFIG = YAML.load_file("_config.yml") |
|
|
| |
| DATE = Time.now.strftime("%Y-%m-%d") |
|
|
| |
| POSTS = "_posts/" |
| RESOURCES = "resources/_posts/" |
| DRAFTS = "_drafts" |
|
|
| |
|
|
| |
| def execute(command) |
| system "#{command}" |
| end |
|
|
| |
| def check_title(title) |
| if title.nil? or title.empty? |
| raise "Please add a title to your file." |
| end |
| end |
|
|
| |
| def transform_to_slug(title, extension) |
| characters = /("|'|!|\?|:|\s\z)/ |
| whitespace = /\s/ |
| "#{title.gsub(characters,"").gsub(whitespace,"-").downcase}.#{extension}" |
| end |
|
|
| |
| def read_file(template) |
| File.read(template) |
| end |
|
|
| |
| def write_file(content, title, directory, filename) |
| parsed_content = "#{content.sub("title:", "title: \"#{title}\"")}" |
| File.write("#{directory}/#{filename}", parsed_content) |
| puts "#{filename} was created in '#{directory}'." |
| end |
|
|
| |
| def create_file(directory, filename, content, title, editor) |
| if File.exists?("#{directory}/#{filename}") |
| raise "The file already exists." |
| else |
| write_file(content, title, directory, filename) |
| if editor && !editor.nil? |
| sleep 1 |
| execute("#{editor} #{directory}/#{filename}") |
| end |
| end |
| end |
|
|
| |
| def open_command |
| if RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ |
| "start" |
| elsif RbConfig::CONFIG["host_os"] =~ /darwin/ |
| "open" |
| else |
| "xdg-open" |
| end |
| end |
|
|
| |
|
|
| |
| desc "Create a post in _posts/" |
| task :post, :title do |t, args| |
| title = args[:title] |
| template = CONFIG["post"]["template"] |
| extension = CONFIG["post"]["extension"] |
| editor = CONFIG["editor"] |
| check_title(title) |
| filename = "#{DATE}-#{transform_to_slug(title, extension)}" |
| content = read_file(template) |
| create_file(POSTS, filename, content, title, editor) |
| end |
|
|
| |
| desc "Create a post in _drafts" |
| task :draft, :title do |t, args| |
| title = args[:title] |
| template = CONFIG["post"]["template"] |
| extension = CONFIG["post"]["extension"] |
| editor = CONFIG["editor"] |
| check_title(title) |
| filename = transform_to_slug(title, extension) |
| content = read_file(template) |
| create_file(DRAFTS, filename, content, title, editor) |
| end |
|
|
| |
| desc "Move a post from _drafts to _posts" |
| task :publish do |
| extension = CONFIG["post"]["extension"] |
| files = Dir["#{DRAFTS}/*.#{extension}"] |
| files.each_with_index do |file, index| |
| puts "#{index + 1}: #{file}".sub("#{DRAFTS}/", "") |
| end |
| print "> " |
| number = $stdin.gets |
| if number =~ /\D/ |
| filename = files[number.to_i - 1].sub("#{DRAFTS}/", "") |
| FileUtils.mv("#{DRAFTS}/#{filename}", "#{POSTS}/#{DATE}-#{filename}") |
| puts "#{filename} was moved to '#{POSTS}'." |
| else |
| puts "Please choose a draft by the assigned number." |
| end |
| end |
|
|
| |
| desc "Build the site" |
| task :build do |
| execute("jekyll build") |
| end |
|
|
| |
| |
| |
| desc "Serve and watch the site (with post limit or drafts)" |
| task :watch, :option do |t, args| |
| option = args[:option] |
| if option.nil? or option.empty? |
| execute("jekyll serve --watch") |
| else |
| if option == "drafts" |
| execute("jekyll serve --watch --drafts") |
| else |
| execute("jekyll serve --watch --limit_posts #{option}") |
| end |
| end |
| end |
|
|
| |
| desc "build and test website" |
| task :test do |
| sh "bundle exec jekyll build --config _config-test.yml" |
| HTMLProofer.check_directory("./_site", { |
| :empty_alt_ignore => true, |
| :url_ignore => [ |
| /\/app\/?/, |
| /\/blog\/?/, |
| '/book/', |
| '/tool/', |
| '/event/', |
| '/getstarted/', |
| '/products/', |
| '/about/', |
| '/about/faq/', |
| '/about/license/', |
| '/about/logos/', |
| '/about/contact/', |
| /\/getstarted\/?/, |
| /\/products\/?/, |
| 'http://untappd.com/' |
| ], |
| :cache => { |
| :timeframe => '1d' |
| }, |
| :typhoeus => { |
| :followlocation => true, |
| :ssl_verifypeer => false, |
| :headers => { 'User-Agent' => 'html-proofer' } |
| } |
| }).run |
| end |
|
|