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 =>
- "{: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