You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							107 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							107 lines
						
					
					
						
							2.4 KiB
						
					
					
				| #!/usr/bin/env ruby
 | |
| 
 | |
| require 'date'
 | |
| require 'optparse'
 | |
| 
 | |
| options = {
 | |
|     # Expects to be in the bin/ sub-directory by default
 | |
|     :path => File.dirname(File.dirname(__FILE__))
 | |
| }
 | |
| 
 | |
| parser = OptionParser.new do |opt|
 | |
|     opt.banner = 'usage: jekyll-page TITLE CATEGORY [FILENAME] [OPTIONS]'
 | |
|     opt.separator ''
 | |
|     opt.separator 'Options'
 | |
|     opt.on('-e', '--edit', 'Edit the page') do |edit|
 | |
|         options[:edit] = true
 | |
|     end
 | |
|     opt.on('-l', '--link', 'Relink pages') do |link|
 | |
|         options[:link] = true
 | |
|     end
 | |
|     opt.on('-p PATH', '--path PATH', String, 'Path to project root') do |path|
 | |
|         options[:path] = path
 | |
|     end
 | |
|     opt.separator ''
 | |
| end
 | |
| 
 | |
| parser.parse!
 | |
| 
 | |
| title = ARGV[0]
 | |
| category = ARGV[1]
 | |
| filename = ARGV[2]
 | |
| 
 | |
| # Resolve any relative links
 | |
| BASE_DIR = File.expand_path(options[:path])
 | |
| POSTS_DIR = "#{BASE_DIR}/_posts"
 | |
| PAGES_DIR = "#{BASE_DIR}/_pages"
 | |
| 
 | |
| # Ensure the _posts directory exists (we are in the correct directory)
 | |
| if not Dir.exists?(POSTS_DIR)
 | |
|     puts "#{POSTS_DIR} directory does not exists"
 | |
|     exit
 | |
| end
 | |
| 
 | |
| # Create _pages directory if it doesn't exist
 | |
| if not Dir.exists?(PAGES_DIR)
 | |
|     Dir.mkdir(PAGES_DIR)
 | |
| end
 | |
| 
 | |
| if options[:link]
 | |
|     Dir.foreach(POSTS_DIR) do |name|
 | |
|         next if name[0] == '.'
 | |
|         nodate = name[/\d{4}-\d{2}-\d{2}-(?<rest>.*)/, 'rest']
 | |
|         if File.symlink?("#{PAGES_DIR}/#{nodate}")
 | |
|             File.delete("#{PAGES_DIR}/#{nodate}")
 | |
|         end
 | |
|         abspath = File.absolute_path("#{POSTS_DIR}/#{name}")
 | |
|         File.symlink(abspath, "#{PAGES_DIR}/#{nodate}")
 | |
|     end
 | |
| end
 | |
| 
 | |
| if not title or not category
 | |
|     # This flag can be used by itself, exit silently if no arguments
 | |
|     # are defined
 | |
|     if not options[:link]
 | |
|         puts parser
 | |
|     end
 | |
|     exit
 | |
| end
 | |
| 
 | |
| if not filename
 | |
|     filename = title.downcase.gsub(/[^a-z0-9\s]/, '').gsub(/\s+/, '-')
 | |
| end
 | |
| 
 | |
| today=Date.today().strftime('%F')
 | |
| now=DateTime.now().strftime('%F %T')
 | |
| 
 | |
| filepath = "#{POSTS_DIR}/#{today}-#{filename}.md"
 | |
| symlink = "#{PAGES_DIR}/#{filename}.md"
 | |
| 
 | |
| if File.exists?(filepath)
 | |
|     puts "File #{filepath} already exists"
 | |
|     exit
 | |
| end
 | |
| 
 | |
| content = <<END
 | |
| ---
 | |
| layout: page
 | |
| title: \"#{title}\"
 | |
| category: #{category}
 | |
| date: #{now}
 | |
| ---
 | |
| END
 | |
| 
 | |
| File.open(filepath, 'w') do |file|
 | |
|     file.puts content
 | |
| end
 | |
| 
 | |
| File.symlink("../_posts/#{today}-#{filename}.md", symlink)
 | |
| 
 | |
| if options[:edit]
 | |
|     if not ENV['EDITOR']
 | |
|         puts 'No $EDITOR variable set'
 | |
|         exit
 | |
|     end
 | |
|     puts ENV['EDITOR']
 | |
|     exec("#{ENV['EDITOR']} #{filename}")
 | |
| end
 | |
| 
 |