hlm / Rakefile
locolv's picture
Upload 94 files
fa6b3d1 verified
# == Dependencies ==============================================================
require 'rake'
require 'yaml'
require 'fileutils'
require 'rbconfig'
require 'html-proofer'
# == Configuration =============================================================
# Set "rake watch" as default task
task :default => :watch
# Load the configuration file
CONFIG = YAML.load_file("_config.yml")
# Get and parse the date
DATE = Time.now.strftime("%Y-%m-%d")
# Directories
POSTS = "_posts/"
RESOURCES = "resources/_posts/"
DRAFTS = "_drafts"
# == Helpers ===================================================================
# Execute a system command
def execute(command)
system "#{command}"
end
# Check the title
def check_title(title)
if title.nil? or title.empty?
raise "Please add a title to your file."
end
end
# Transform the filename and date to a slug
def transform_to_slug(title, extension)
characters = /("|'|!|\?|:|\s\z)/
whitespace = /\s/
"#{title.gsub(characters,"").gsub(whitespace,"-").downcase}.#{extension}"
end
# Read the template file
def read_file(template)
File.read(template)
end
# Save the file with the title in the YAML front matter
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
# Create the file with the slug and open the default editor
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
# Get the "open" command
def open_command
if RbConfig::CONFIG["host_os"] =~ /mswin|mingw/
"start"
elsif RbConfig::CONFIG["host_os"] =~ /darwin/
"open"
else
"xdg-open"
end
end
# == Tasks =====================================================================
# rake post["Title"]
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
# rake draft["Title"]
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
# rake publish
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
# rake build
desc "Build the site"
task :build do
execute("jekyll build")
end
# rake watch
# rake watch[number]
# rake watch["drafts"]
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
# rake test
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