Add a rakefile with some basics
authorJoerg Jaspert <joerg@debian.org>
Sat, 20 Feb 2016 21:56:16 +0000 (22:56 +0100)
committerJoerg Jaspert <joerg@debian.org>
Sat, 20 Feb 2016 21:56:16 +0000 (22:56 +0100)
Rakefile [new file with mode: 0644]
_rakeconfig.yml [new file with mode: 0644]

diff --git a/Rakefile b/Rakefile
new file mode 100644 (file)
index 0000000..f7e8dba
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,215 @@
+# == Dependencies ==============================================================
+
+require 'rake'
+require 'yaml'
+require 'fileutils'
+require 'rbconfig'
+
+# == Configuration =============================================================
+
+# Set "rake watch" as default task
+task :default => :watch
+
+# Load the configuration file
+CONFIG = YAML.load_file("_rakeconfig.yml")
+
+# Get and parse the date
+DATE = Time.now.strftime("%Y-%m-%d")
+TIME = Time.now.strftime("%H:%M:%S")
+POST_TIME = DATE + ' ' + TIME
+
+# Directories
+POSTS = "_posts"
+DRAFTS = "_drafts"
+
+# == Helpers ===================================================================
+
+# Execute a system command
+def execute(command)
+  system "#{command}"
+end
+
+# Chech 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}\"")}"
+  parsed_content = "#{parsed_content.sub("date:", "date: #{POST_TIME}")}"
+  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)
+  FileUtils.mkdir(directory) unless File.exists?(directory)
+  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 page["Title"]
+# rake page["Title","Path/to/folder"]
+desc "Create a page (optional filepath)"
+task :page, :title, :path do |t, args|
+  title = args[:title]
+  template = CONFIG["page"]["template"]
+  extension = CONFIG["page"]["extension"]
+  editor = CONFIG["editor"]
+  directory = args[:path]
+  if directory.nil? or directory.empty?
+    directory = "./"
+  else
+    FileUtils.mkdir_p("#{directory}")
+  end
+  check_title(title)
+  filename = transform_to_slug(title, extension)
+  content = read_file(template)
+  create_file(directory, filename, content, title, editor)
+end
+
+# rake build
+desc "Build the site, optionally with changed destination path"
+task :build, :option do |t, args|
+  option = args[:option]
+  if option.nil? or option.empty?
+    execute("jekyll build")
+  else
+    execute("jekyll build -d #{option}")
+  end
+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]
+  interrupted = false
+  trap("INT") { interrupted = true }
+  if option.nil? or option.empty?
+    execute("jekyll serve --incremental --watch")
+  else
+    if option == "drafts"
+      execute("jekyll serve --watch --drafts")
+    else
+      execute("jekyll serve --watch --limit_posts #{option}")
+    end
+  end
+  if interrupted
+    execute("rm -rf _site/")
+  end
+end
+
+# rake preview
+desc "Launch a preview of the site in the browser"
+task :preview do
+  port = CONFIG["port"]
+  if port.nil? or port.empty?
+    port = 4000
+  end
+  Thread.new do
+    puts "Launching browser for preview..."
+    sleep 1
+    execute("#{open_command} http://localhost:#{port}/")
+  end
+  Rake::Task[:watch].invoke
+end
+
+# rake deploy["Commit message"]
+desc "Deploy the site to a remote git repo"
+task :deploy, :message do |t, args|
+  message = args[:message]
+  branch = CONFIG["git"]["branch"]
+  if message.nil? or message.empty?
+    raise "Please add a commit message."
+  end
+  if branch.nil? or branch.empty?
+    raise "Please add a branch."
+  else
+    Rake::Task[:build].invoke
+    execute("git add .")
+    execute("git commit -m \"#{message}\"")
+    execute("git push origin #{branch}")
+  end
+end
diff --git a/_rakeconfig.yml b/_rakeconfig.yml
new file mode 100644 (file)
index 0000000..eaf4d81
--- /dev/null
@@ -0,0 +1,14 @@
+post:
+  template: _post.txt
+  extension: md
+page:
+  template: _page.txt
+  extension: md
+editor: emacsclient
+git:
+  branch: master
+transfer:
+  command: rsync
+  settings: -av
+  source: _site/
+  destination: ~/Git/username.github.com/
\ No newline at end of file