lib/rabbit/command/rabbit-slide.rb in rabbit-2.0.1 vs lib/rabbit/command/rabbit-slide.rb in rabbit-2.0.2

- old
+ new

@@ -16,11 +16,13 @@ require "yaml" require "rabbit/console" require "rabbit/author-configuration" +require "rabbit/slide-configuration" require "rabbit/path-manipulatable" +require "rabbit/source-generator" module Rabbit module Command class RabbitSlide include GetText @@ -31,17 +33,13 @@ new.run(arguments) end end def initialize - @config_yaml_path = "config.yaml" - @id = nil - @base_name = nil @title = nil - @tags = [] @allotted_time = nil - @presentation_date = nil + @slide_conf = nil @author_conf = nil @logger = nil end def run(arguments) @@ -63,10 +61,12 @@ def parse_command_line_arguments(arguments) Rabbit::Console.parse!(ARGV) do |parser, options| @logger = options.default_logger @author_conf = AuthorConfiguration.new(@logger) @author_conf.load + @slide_conf = SlideConfiguration.new(@logger) + @slide_conf.author = @author_conf format = _("Usage: %s new [options]\n" \ " e.g.: %s new \\\n" \ " --id rubykaigi2012 \\\n" \ " --base-name rabbit-introduction \\\n" \ @@ -86,21 +86,21 @@ parser.on("--id=ID", _("Slide ID"), _("(e.g.: %s)") % "--id=rubykaigi2012", _("(must)")) do |id| - @id = id + @slide_conf.id = id end messages = [ _("Base name for the slide source file and generated PDF file"), _("(e.g.: %s)") % "--base-name=rabbit-introduction", _("(must)"), ] parser.on("--base-name=NAME", *messages) do |base_name| - @base_name = base_name + @slide_conf.base_name = base_name end available_markup_languages = [:rd, :hiki, :markdown] label = "[" + available_markup_languages.join(", ") + "]" messages = [ @@ -127,11 +127,11 @@ parser.on("--tags=TAG,TAG,...", Array, _("Tags of the new slide"), _("(e.g.: %s)") % "--tags=rabbit,presentation,ruby", _("(optional)")) do |tags| - @tags.concat(tags) + @slide_conf.tags.concat(tags) end parser.on("--allotted-time=TIME", _("Allotted time in presentaion"), _("(e.g.: %s)") % "--allotted-time=5m", @@ -141,11 +141,11 @@ parser.on("--presentation-date=DATE", _("Presentation date with the new slide"), _("(e.g.: %s)") % "--presentation-date=2012/06/29", _("(optional)")) do |date| - @presentation_date = date + @slide_conf.presentation_date = date end parser.separator(_("Your information")) messages = [ @@ -240,34 +240,45 @@ @validation_errors << message end end def validate_id - if @id.nil? + if @slide_conf.id.nil? @validation_errors << (_("%s is missing") % "--id") end end def validate_base_name - if @base_name.nil? + if @slide_conf.base_name.nil? @validation_errors << (_("%s is missing") % "--base-name") end end def generate generate_directory + generate_dot_gitignore generate_dot_rabbit - generate_config_yaml + generate_slide_configuration generate_readme generate_rakefile generate_slide end def generate_directory - create_directory(@id) + create_directory(@slide_conf.id) end + def generate_dot_gitignore + create_file(".gitignore") do |dot_gitignore| + dot_gitignore.puts(<<-EOD) +/.tmp/ +/pkg/ +/pdf/ +EOD + end + end + def generate_dot_rabbit create_file(".rabbit") do |dot_rabbit| options = [] if @author_conf.markup_language.nil? and @allotted_time options << "--allotted-time #{@allotted_time}" @@ -275,137 +286,69 @@ options << slide_path dot_rabbit.puts(options.join("\n")) end end - def generate_config_yaml - create_file(@config_yaml_path) do |config_yaml| - config = { - "id" => @id, - "tags" => @tags, - "base_name" => @base_name, - "name" => @author_conf.name, - "presentation_date" => @presentation_date, - "email" => @author_conf.email, - "rubygems_user" => @author_conf.rubygems_user, - "slideshare_user" => @author_conf.slideshare_user, - "speaker_deck_user" => @author_conf.speaker_deck_user, - } - config_yaml.puts(config.to_yaml) - end + def generate_slide_configuration + @slide_conf.save(@slide_conf.id) end def generate_readme create_file("README.#{readme_extension}") do |readme| readme.puts(readme_content) end end def readme_content markup_language = @author_conf.markup_language || :rd - syntax = markup_syntax(markup_language) + generator = Rabbit::SourceGenerator.find(markup_language) content = "" - content << (syntax[:heading1] % {:title => _("TODO: SLIDE TITLE")}) + title = @title || _("TODO: SLIDE TITLE") + content << generator.heading(1, title) content << "\n\n" content << _("TODO: SLIDE DESCRIPTION") content << "\n\n" - content << (syntax[:heading2] % {:title => _("For author")}) + content << generator.heading(2, _("For author")) content << "\n\n" - content << (syntax[:heading3] % {:title => _("Show")}) + content << generator.heading(3, _("Show")) content << "\n\n" - content << (syntax[:preformatted_line] % {:content => "rake"}) + content << generator.preformatted_line("rake") content << "\n\n" - content << (syntax[:heading3] % {:title => _("Publish")}) + content << generator.heading(3, _("Publish")) content << "\n\n" - content << (syntax[:preformatted_line] % {:content => "rake publish"}) + content << generator.preformatted_line("rake publish") content << "\n\n" - content << (syntax[:heading2] % {:title => _("For viewers")}) + content << generator.heading(2, _("For viewers")) content << "\n\n" - content << (syntax[:heading3] % {:title => _("Install")}) + content << generator.heading(3, _("Install")) content << "\n\n" - install_command = "gem install #{gem_name}" - content << (syntax[:preformatted_line] % {:content => install_command}) + install_command = "gem install #{@slide_conf.gem_name}" + content << generator.preformatted_line(install_command) content << "\n\n" - content << (syntax[:heading3] % {:title => _("Show")}) + content << generator.heading(3, _("Show")) content << "\n\n" - show_command = "rabbit #{gem_name}.gem" - content << (syntax[:preformatted_line] % {:content => show_command}) + show_command = "rabbit #{@slide_conf.gem_name}.gem" + content << generator.preformatted_line(show_command) content << "\n\n" end def generate_rakefile create_file("Rakefile") do |rakefile| rakefile.puts(<<-EOR) -require "time" -require "yaml" require "rabbit/task/slide" -config = YAML.load(File.read("#{@config_yaml_path}")) +# Edit ./config.yaml to customize meta data -slide_id = config["id"] -tags = config["tags"] -base_name = config["base_name"] -pdf_base_path = "\#{base_name}.pdf" - -version = nil -presentation_date = config["presentation_date"] -parsed_presentation_date = nil -if presentation_date - begin - parsed_presentation_date = Time.parse(presentation_date) - rescue ArgumentError - end - if parsed_presentation_date - version = parsed_presentation_date.strftime("%Y.%m.%d") - end +Rabbit::Task::Slide.new do |task| + # task.spec.licenses = ["CC BY-SA 3.0"] + # task.spec.files += Dir.glob("doc/**/*.*") + # task.spec.files -= Dir.glob("private/**/*.*") + # task.spec.add_runtime_dependency("YOUR THEME") end -version ||= "1.0.0" - -name = config["name"] -email = config["email"] -rubygems_user = config["rubygems_user"] -slideshare_user = config["slideshare_user"] -speaker_deck_user = config["speaker_deck_user"] - -readme = File.read(Dir.glob("README*")[0]) - -readme_blocks = readme.split(/(?:\\r?\\n){2,}/) -summary = (readme_blocks[0] || "TODO").gsub(/\\A(?:[=*!]+|h\\d\\.)\s*/, "") -description = readme_blocks[1] || "TODO" - -specification = Gem::Specification.new do |spec| - prefix = "#{gem_name_prefix}" - spec.name = "\#{prefix}-\#{rubygems_user}-\#{slide_id}" - spec.version = version - spec.homepage = "http://slide.rabbit-shockers.org/\#{rubygems_user}/\#{slide_id}/" - spec.authors = [name] - spec.email = [email] - spec.summary = summary - spec.description = description - spec.licenses = [] # ["CC BY-SA 3.0"] - - spec.files = [".rabbit", "#{@config_yaml_path}", "Rakefile"] - spec.files += Dir.glob("{COPYING,GPL,README*}") - spec.files += Dir.glob("rabbit/**/*.*") - spec.files += Dir.glob("**/*.{svg,png,jpg,jpeg,gif,eps,pdf}") - spec.files += Dir.glob("*.{rd,rab,hiki,md,pdf}") - spec.files -= Dir.glob("{pkg,pdf}/**/*.*") - - spec.add_runtime_dependency("rabbit") -end - -Rabbit::Task::Slide.new(specification) do |task| - task.rubygems_user = rubygems_user - task.slideshare_user = slideshare_user - task.speaker_deck_user = speaker_deck_user - task.pdf_base_path = pdf_base_path - task.tags = tags - task.presentation_date = parsed_presentation_date -end EOR end end def generate_slide @@ -415,11 +358,11 @@ slide.puts(source) end end def slide_path - "#{@base_name}.#{slide_source_extension}" + "#{@slide_conf.base_name}.#{slide_source_extension}" end def slide_source_extension case @author_conf.markup_language when :rd @@ -445,127 +388,70 @@ "rd" end end def slide_source - syntax = slide_source_syntax - return nil if syntax.nil? + generator = Rabbit::SourceGenerator.find(@author_conf.markup_language) + return nil if generator.nil? source = "" - slide_source_title(source, syntax, _("TITLE")) - slide_source_metadata(source, syntax) - slide_source_title(source, syntax, _("FIRST SLIDE")) - slide_source_items(source, syntax) - slide_source_title(source, syntax, _("SECOND SLIDE")) - slide_source_image(source, syntax) + slide_source_title(source, generator, @title || _("TITLE")) + slide_source_metadata(source, generator) + slide_source_title(source, generator, _("FIRST SLIDE")) + slide_source_items(source, generator) + slide_source_title(source, generator, _("SECOND SLIDE")) + slide_source_image(source, generator) end - def slide_source_title(source, syntax, title) - source << (syntax[:heading1] % {:title => _("TITLE")}) + def slide_source_title(source, generator, title) + source << generator.heading(1, _("TITLE")) source << "\n\n" end - def slide_source_metadata(source, syntax) + def slide_source_metadata(source, generator) + presentation_date = @slide_conf.presentation_date slide_metadata = [ ["subtitle", nil, _("SUBTITLE")], ["author", @author_conf.name, _("AUTHOR")], ["institution", nil, _("INSTITUTION")], ["content-source", nil, _("EVENT NAME")], - ["date", @presentation_date, Time.now.strftime("%Y/%m/%d")], + ["date", presentation_date, Time.now.strftime("%Y/%m/%d")], ["allotted-time", @allotted_time, "5m"], ["theme", nil, "default"], ] slide_metadata.each do |key, value, default_value| - data = {:item => key, :description => value || default_value} - item = syntax[:definition_list_item] % data + item = generator.definition_list_item(key, value || default_value) item << "\n" if value source << item else item.each_line do |line| - source << (syntax[:comment] % {:content => line}) + source << generator.comment(line) end end end source << "\n\n" end - def slide_source_items(source, syntax) + def slide_source_items(source, generator) 1.upto(3) do |i| - source << syntax[:unorderd_list_item] % {:item => _("ITEM %d") % i} + source << generator.unordered_list_item(_("ITEM %d") % i) source << "\n" end source << "\n" end - def slide_source_image(source, syntax) + def slide_source_image(source, generator) lavie = "https://raw.github.com/shockers/rabbit/master/sample/lavie.png" - data = { - :src => lavie, + options = { :relative_height => 100, } - source << syntax[:image] % data + source << generator.image(lavie, options) source << "\n" end - def slide_source_syntax - markup_syntax(@author_conf.markup_language) - end - - def markup_syntax(markup_language) - case markup_language - when :rd - { - :heading1 => "= %{title}", - :heading2 => "== %{title}", - :heading3 => "=== %{title}", - :definition_list_item => ": %{item}\n %{description}", - :unorderd_list_item => " * %{item}", - :image => - " # image\n" + - " # src = %{src}\n" + - " # relative_height = %{relative_height}", - :preformatted_line => " %{content}", - :comment => "# %{content}", - } - when :hiki - { - :heading1 => "! %{title}", - :heading2 => "!! %{title}", - :heading3 => "!!! %{title}", - :definition_list_item => ":%{item}:%{description}", - :unorderd_list_item => "* %{item}", - :image => - "{{image(\"%{src}\",\n" + - " {\n" + - " :relative_height => %{relative_height},\n" + - " })}}", - :preformatted_line => " %{content}", - :comment => "// %{content}", - } - when :markdown - { - :heading1 => "# %{title}", - :heading2 => "## %{title}", - :heading3 => "### %{title}", - :definition_list_item => "%{item}\n %{description}", - :unorderd_list_item => "* %{item}", - :image => - "![](%{src}){:relative_height='%{relative_height}'}", - :preformatted_line => " %{content}", - :comment => "", - } - else - nil - end - end - - def gem_name - "#{gem_name_prefix}-#{@author_conf.rubygems_user}-#{@id}" - end - - def gem_name_prefix - "rabbit-slide" + def create_file(path, &block) + super(File.join(@slide_conf.id, path), &block) end end end end