|
|
|
|
|
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 |
|
|