165 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| require 'rubygems'
 | |
| require 'rake'
 | |
| require 'rdoc'
 | |
| require 'date'
 | |
| require 'yaml'
 | |
| 
 | |
| $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib]))
 | |
| require 'jekyll/version'
 | |
| 
 | |
| Dir.glob('rake/**.rake').each { |f| import f }
 | |
| 
 | |
| #############################################################################
 | |
| #
 | |
| # Helper functions
 | |
| #
 | |
| #############################################################################
 | |
| 
 | |
| def name
 | |
|   "jekyll"
 | |
| end
 | |
| 
 | |
| def version
 | |
|   Jekyll::VERSION
 | |
| end
 | |
| 
 | |
| def docs_name
 | |
|   "#{name}-docs"
 | |
| end
 | |
| 
 | |
| def docs_folder
 | |
|   "docs"
 | |
| end
 | |
| 
 | |
| def gemspec_file
 | |
|   "#{name}.gemspec"
 | |
| end
 | |
| 
 | |
| def gem_file
 | |
|   "#{name}-#{Gem::Version.new(version).to_s}.gem"
 | |
| end
 | |
| 
 | |
| def normalize_bullets(markdown)
 | |
|   markdown.gsub(/\n\s{2}\*{1}/, "\n-")
 | |
| end
 | |
| 
 | |
| def linkify_prs(markdown)
 | |
|   markdown.gsub(/#(\d+)/) do |word|
 | |
|     "[#{word}]({{ site.repository }}/issues/#{word.delete("#")})"
 | |
|   end
 | |
| end
 | |
| 
 | |
| def linkify_users(markdown)
 | |
|   markdown.gsub(/(@\w+)/) do |username|
 | |
|     "[#{username}](https://github.com/#{username.delete("@")})"
 | |
|   end
 | |
| end
 | |
| 
 | |
| def linkify(markdown)
 | |
|   linkify_users(linkify_prs(markdown))
 | |
| end
 | |
| 
 | |
| def liquid_escape(markdown)
 | |
|   markdown.gsub(/(`{[{%].+[}%]}`)/, "{% raw %}\\1{% endraw %}")
 | |
| end
 | |
| 
 | |
| def custom_release_header_anchors(markdown)
 | |
|   header_regexp = /^(\d{1,2})\.(\d{1,2})\.(\d{1,2}) \/ \d{4}-\d{2}-\d{2}/
 | |
|   section_regexp = /^### \w+ \w+$/
 | |
|   markdown.split(/^##\s/).map do |release_notes|
 | |
|     _, major, minor, patch = *release_notes.match(header_regexp)
 | |
|     release_notes
 | |
|       .gsub(header_regexp, "\\0\n{: #v\\1-\\2-\\3}")
 | |
|       .gsub(section_regexp) { |section| "#{section}\n{: ##{sluffigy(section)}-v#{major}-#{minor}-#{patch}}" }
 | |
|   end.join("\n## ")
 | |
| end
 | |
| 
 | |
| def sluffigy(header)
 | |
|   header.gsub(/#/, '').strip.downcase.gsub(/\s+/, '-')
 | |
| end
 | |
| 
 | |
| def remove_head_from_history(markdown)
 | |
|   index = markdown =~ /^##\s+\d+\.\d+\.\d+/
 | |
|   markdown[index..-1]
 | |
| end
 | |
| 
 | |
| def converted_history(markdown)
 | |
|   remove_head_from_history(
 | |
|     custom_release_header_anchors(
 | |
|       liquid_escape(
 | |
|         linkify(
 | |
|           normalize_bullets(markdown)))))
 | |
| end
 | |
| 
 | |
| def siteify_file(file, overrides_front_matter = {})
 | |
|   abort "You seem to have misplaced your #{file} file. I can haz?" unless File.exists?(file)
 | |
|   title = begin
 | |
|             File.read(file).match(/\A# (.*)$/)[1]
 | |
|           rescue
 | |
|             File.basename(file, ".*").downcase.capitalize
 | |
|           end
 | |
|   slug  = File.basename(file, ".markdown").downcase
 | |
|   front_matter = {
 | |
|     "title"     => title,
 | |
|     "layout"    => "docs",
 | |
|     "permalink" => "/docs/#{slug}/",
 | |
|     "note"      => "This file is autogenerated. Edit /#{file} instead."
 | |
|   }.merge(overrides_front_matter)
 | |
|   contents = "#{front_matter.to_yaml}---\n\n#{content_for(file)}"
 | |
|   File.write("#{docs_folder}/_docs/#{slug}.md", contents)
 | |
| end
 | |
| 
 | |
| def content_for(file)
 | |
|   contents = File.read(file)
 | |
|   case file
 | |
|   when "History.markdown"
 | |
|     converted_history(contents)
 | |
|   else
 | |
|     contents.gsub(/\A# .*\n\n?/, "")
 | |
|   end
 | |
| end
 | |
| 
 | |
| #############################################################################
 | |
| #
 | |
| # Standard tasks
 | |
| #
 | |
| #############################################################################
 | |
| 
 | |
| multitask :default => [:test, :features]
 | |
| 
 | |
| task :spec => :test
 | |
| require 'rake/testtask'
 | |
| Rake::TestTask.new(:test) do |test|
 | |
|   test.libs << 'lib' << 'test'
 | |
|   test.pattern = 'test/**/test_*.rb'
 | |
|   test.verbose = true
 | |
| end
 | |
| 
 | |
| require 'rdoc/task'
 | |
| Rake::RDocTask.new do |rdoc|
 | |
|   rdoc.rdoc_dir = 'rdoc'
 | |
|   rdoc.title = "#{name} #{version}"
 | |
|   rdoc.rdoc_files.include('README*')
 | |
|   rdoc.rdoc_files.include('lib/**/*.rb')
 | |
| end
 | |
| 
 | |
| begin
 | |
|   require 'cucumber/rake/task'
 | |
|   Cucumber::Rake::Task.new(:features) do |t|
 | |
|     t.profile = "travis"
 | |
|   end
 | |
|   Cucumber::Rake::Task.new(:"features:html", "Run Cucumber features and produce HTML output") do |t|
 | |
|     t.profile = "html_report"
 | |
|   end
 | |
| rescue LoadError
 | |
|   desc 'Cucumber rake task not available'
 | |
|   task :features do
 | |
|     abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
 | |
|   end
 | |
| end
 | |
| 
 | |
| desc "Open an irb session preloaded with this library"
 | |
| task :console do
 | |
|   sh "irb -rubygems -r ./lib/#{name}.rb"
 | |
| end
 |