namespace :rocket_docs do
desc 'Generates static HTML documentation files' generator_args = [:version_name, :input_files, :output_folder] task :generate, generator_args => :environment do |_task, args| version, input, output = sanitize_generator_input(args) fail('A version name has to be provided') unless version fail('At leas one input file has to be provided') unless input doc = RocketDocs.documentation_for_files(input, version) template_folder = generator_template_folder layout_path = template_folder + '/layouts/rocket_docs/application.slim' template_path = template_folder + '/docs/rocket_docs/show.slim' prepare_generator_output(output, version, 'html') view_builder = generator_view_builder(template_folder) view_builder.instance_variable_set(:@doc, doc) layout = Slim::Template.new { File.open(layout_path, 'r').read } view = Slim::Template.new { File.open(template_path, 'r').read } html = layout.render(view_builder) do view.render(view_builder).html_safe end File.open(output, 'w+') do |file| file.puts(html) end end task :gen, generator_args => :generate desc 'Generates static MARKDOWN documentation files' md_generator_args = generator_args task :generate_markdown, md_generator_args => :environment do |_task, args| version, input, output = sanitize_generator_input(args) doc = RocketDocs.documentation_for_files(input, version) template_folder = generator_template_folder template_path = template_folder + '/docs/rocket_docs/show.markdown.erb' prepare_generator_output(output, version, 'markdown') view_builder = generator_view_builder(template_folder) view_builder.instance_variable_set(:@doc, doc) view = ERB.new(File.open(template_path, 'r').read) html = view.result(view_builder.instance_eval { binding }) File.open(output, 'w+') do |file| file.puts(html) end end task :generate_md, md_generator_args => :generate_markdown task :gen_md, md_generator_args => :generate_markdown ############### ### HELPERS ### ############### def sanitize_generator_input(args) version = args[:version_name].presence # TODO: Potential bug with pathnames containing spaces input = args[:input_files] && args[:input_files].split.presence output = args[:output_folder].presence || Rails.root.join('public', 'system', 'documentation').to_s fail('A version name has to be provided') unless version fail('At leas one input file has to be provided') unless input [version, input, output] end def generator_template_folder File.expand_path('../../../app/views', __FILE__) end def prepare_generator_output(output, name, ext) FileUtils.mkdir_p(output) output = output[-1] == '/' ? output : output << '/' output << "#{name}.#{ext}" end def generator_view_builder(template_folder) lookup_context = ActionView::LookupContext.new(template_folder) view_builder = ActionView::Base.new(lookup_context) view_builder.extend ActionView::Helpers view_builder.extend RocketDocs::ApplicationHelper view_builder end
end