lib/octopress/commands/helpers.rb in octopress-3.0.0.rc.25 vs lib/octopress/commands/helpers.rb in octopress-3.0.0.rc.26

- old
+ new

@@ -1,13 +1,90 @@ module Octopress module CommandHelpers - def self.add_page_options(c) + extend self + + def add_page_options(c) c.option 'template', '--template PATH', "New #{c.name.to_s} from a template." c.option 'date', '--date DATE', "Use 'now' or a String that is parseable by Time#parse." c.option 'force', '--force', 'Overwrite file if it already exists' end - def self.add_common_options(c) - c.option 'config', '--config <CONFIG_FILE>[,CONFIG_FILE2,...]', Array, 'Custom Jekyll configuration file' + def add_common_options(c) + c.option 'config', '--config <CONFIG_FILE>[,CONFIG_FILE2,...]', Array, 'Custom Jekyll configuration file' end + + def select_posts(search, action) + posts = (action == 'publish' ? find_drafts : find_posts) + posts = search_posts(search, posts) + + if posts.size > 1 + post = prompt_for_selection(posts, search, action) + + if post.is_a? Integer + posts[post - 1] + else + abort "#{action.capitalize} canceled: You didn't enter number." + end + else + posts.first + end + end + + def find_drafts + @drafts ||= begin + dir = File.join(Octopress.site.source, '_drafts') + Find.find(dir).to_a.reject do |f| + File.directory?(f) + end + end + end + + def find_all_posts + @posts ||= begin + dir = File.join(Octopress.site.source, '_posts') + Find.find(dir).to_a.reject do |f| + File.directory?(f) + end + end + end + + def find_posts + find_all_posts.reject { |f| f =~ /_exile\// } + end + + def find_exiled_posts + find_all_posts.select { |f| f =~ /_exile\// } + end + + def search_posts(search, posts) + posts = posts.select do |p| + p =~ /#{search.gsub(/\s/, '-')}/i + end + if posts.empty? + abort (STDOUT.tty? ? "No posts found matching: #{search}".red : '') + else + posts + end + end + + def prompt_for_selection(posts, search, action) + abort if !STDOUT.tty? + + puts "Found #{posts.size} posts matching: '#{search}'" + posts.each_with_index do |p, i| + post = p.sub(/#{Octopress.site.source}\/_(posts|drafts)\//, '') + puts " #{i+1}) #{post}" + end + + print "Which do you want to #{action}? (enter a number): " + $stdout.flush + post = $stdin.gets.strip.to_i + + # Give a newline for further output + puts '' + + # Handle invalid input (because "oops".to_i == 0) + (post == 0 ? nil : post) + end + end end