diff options
| author | davidtsadler <davidtsadler@googlemail.com> | 2012-02-18 16:14:06 +0000 |
|---|---|---|
| committer | davidtsadler <davidtsadler@googlemail.com> | 2012-02-18 16:14:06 +0000 |
| commit | 03fcdf067b48e25821c0e3bf8f09f30f6ddcf686 (patch) | |
| tree | 543b3ea87d0e45b4863dc6761466934544ca9fce | |
| parent | 73cd37f26bfeabc67d7624c1109c1eac786855a3 (diff) | |
Rake task to create a new post.
| -rw-r--r-- | Rakefile | 95 | ||||
| -rw-r--r-- | lib/random.rb | 2 | ||||
| -rw-r--r-- | lib/templates/post.markdown | 1 |
3 files changed, 75 insertions, 23 deletions
@@ -45,40 +45,48 @@ end namespace :test_posts do desc 'Creates several test posts.' - task :create => [:clean, :create_directory] do + task :create => [:load_config, :clean, :create_directory] do (1..@config['num_test_posts']).each do |day| - date, title, category = TestPosts::Random.generate - save_post(date, title, "Testing", "A test post", "[\"#{category}\"]", true) + date, title, categories = TestPosts::Random.generate + save_post(date, title, @config['author'], title, categories, @config['test_posts']) end end desc 'Deletes any test posts.' task :clean => [:load_config] do - FileUtils.rm_rf(@config['posts'] + '/test') + FileUtils.rm_rf(@config['test_posts']) end - desc 'Creates the required posts directory if one does not exist.' + desc 'Creates the required test posts directory if one does not exist.' task :create_directory => [:load_config] do - dir = @config['posts'] + '/test' - FileUtils.mkdir_p(dir) unless File.directory?(dir) + create_directory(@config['test_posts']) end +end + +namespace :post do + desc 'Creates a new post based on user input' + task :create => [:load_config, :create_directory] do + date = Date.today.to_s + title = nil + author = @config['author'] + description = nil + categories = nil + + loop do + date = ask('Date?', date, lambda { |answer| !answer.empty? && answer =~ /^\d{4}-\d{2}-\d{2}$/ }, 'Date must be entered as YYYY-MM-DD') + title = ask('Title?', title, lambda { |answer| !answer.empty? }, 'You must enter a title') + author = ask('Author?', author) + description = ask('Description?', description) + categories = ask('Categories?', categories) + break if agree('Ok to create this post?') + end -private - def save_post(date, title, author, description, categories, test = false) - template = File.read("lib/templates/post.markdown") - template.gsub!(/:title/, title) - template.gsub!(/:author/, author) - template.gsub!(/:description/, description) - template.gsub!(/:categories/, categories) - - filename = "#{@config['source']}/_posts" - filename << '/test' if test - filename << "/#{date.strftime('%Y-%m-%d')}-#{parameterize(title)}.markdown" - File.open(filename, 'w') { |f| f.write(template) } + save_post(date, title, author, description, categories, @config['posts']) end - - def parameterize(string, sep = '-') - string.downcase.gsub(/[^a-z0-9\-_]+/, sep) + + desc 'Creates the required posts directory if one does not exist.' + task :create_directory => [:load_config] do + create_directory(@config['posts']) end end @@ -86,6 +94,7 @@ desc 'Loads the configuration file into an instance variable to be used by other task :load_config do @config = YAML::load_file('_config.yml') @config['posts'] = "#{@config['source']}/_posts" + @config['test_posts'] = @config['posts'] + '/test' end def edit_config(name, value) @@ -94,3 +103,45 @@ def edit_config(name, value) config.sub!(regexp,'\1'+value+'\3') File.open('_config.yml', 'w') {|f| f.write(config)} end + +def create_directory(dir) + FileUtils.mkdir_p(dir) unless File.directory?(dir) +end + +def save_post(date, title, author, description, categories, directory) + # Ensure string is in the form of ["category one", "category two"] + categories = "[#{categories.split(',').map { |c| '"' + c.strip + '"' }.join(',')}]" + + template = File.read("lib/templates/post.markdown") + template.gsub!(/:title/, title) + template.gsub!(/:author/, author) + template.gsub!(/:description/, description) + template.gsub!(/:categories/, categories) + + filename = "#{directory}/#{date}-#{parameterize(title)}.markdown" + File.open(filename, 'w') { |f| f.write(template) } +end + +def parameterize(string, sep = '-') + string.downcase.gsub(/[^a-z0-9\-_]+/, sep) +end + +def ask(prompt, default, validator = nil, message = nil) + prompt << " |#{default}|" if default + prompt << ' ' + answer = '' + loop do + print prompt + answer = $stdin.gets.chomp + answer = default if answer.empty? && default + valid = validator ? validator.call(answer) : true + puts(message) if message && !valid + break if valid + end + answer +end + +def agree(prompt) + yn = ask(prompt, 'y', lambda { |yn| yn.downcase[0] == 'y' || yn.downcase[0] == 'n' }, "Enter y, n or yes, no") + yn.downcase[0] == 'y' +end diff --git a/lib/random.rb b/lib/random.rb index 9204138..ecefd93 100644 --- a/lib/random.rb +++ b/lib/random.rb @@ -25,7 +25,7 @@ module TestPosts def self.date jdFrom = Date.today.prev_year.jd jdTo = Date.today.jd - Date.jd(rand((jdTo + 1) - jdFrom) + jdFrom) + Date.jd(rand((jdTo + 1) - jdFrom) + jdFrom).strftime('%Y-%m-%d') end end end diff --git a/lib/templates/post.markdown b/lib/templates/post.markdown index 5bd0de9..1649b73 100644 --- a/lib/templates/post.markdown +++ b/lib/templates/post.markdown @@ -4,6 +4,7 @@ title: :title author: :author description: :description categories: :categories +robots: follow, noodp, noydir, noarchive --- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce et tellus ac sem vestibulum tristique ac at magna. Proin eros ipsum, egestas sit amet rutrum non, fringilla ut tellus. Sed facilisis rhoncus libero ornare interdum. Morbi a dui id quam dignissim mollis at sit amet purus. Ut pretium malesuada dolor, eu luctus lorem bibendum id. Mauris cursus cursus est sit amet lobortis. Quisque sit amet dui quis sapien fringilla tempus et convallis lectus. Integer pretium tristique sollicitudin. Fusce at ante et tellus vulputate congue. Aliquam nec ligula est. Vestibulum aliquet scelerisque neque, ut elementum neque mattis id. Sed non mauris quam. Vivamus id augue felis. Etiam eleifend, erat sit amet tempor tempor, nibh neque tristique lorem, pretium adipiscing nulla lorem sit amet lacus. Vestibulum odio mauris, hendrerit non dictum sit amet, consequat in mi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est nulla, pulvinar eget volutpat quis, placerat nec metus. Vivamus tristique elit ac lectus vestibulum bibendum. Phasellus ac diam purus, cursus imperdiet lorem. Sed a nulla nec velit placerat tempus. |
