parade 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/LICENSE +21 -0
  2. data/README.md +542 -0
  3. data/Rakefile +15 -0
  4. data/bin/parade +138 -0
  5. data/lib/parade.rb +43 -0
  6. data/lib/parade/commands/commands.rb +84 -0
  7. data/lib/parade/commands/generate_outline.rb +34 -0
  8. data/lib/parade/commands/generate_presentation.rb +34 -0
  9. data/lib/parade/commands/generate_rackup.rb +32 -0
  10. data/lib/parade/commands/html_output.rb +47 -0
  11. data/lib/parade/commands/render_from_template.rb +50 -0
  12. data/lib/parade/commands/static_html.rb +38 -0
  13. data/lib/parade/commands/static_pdf.rb +39 -0
  14. data/lib/parade/commands/unknown.rb +23 -0
  15. data/lib/parade/features/live_ruby.rb +18 -0
  16. data/lib/parade/features/pdf_presentation.rb +24 -0
  17. data/lib/parade/features/preshow.rb +11 -0
  18. data/lib/parade/helpers/encode_image.rb +24 -0
  19. data/lib/parade/helpers/template_generator.rb +130 -0
  20. data/lib/parade/metadata.rb +73 -0
  21. data/lib/parade/metadata/assignment.rb +38 -0
  22. data/lib/parade/metadata/css_classes.rb +22 -0
  23. data/lib/parade/metadata/html_id.rb +35 -0
  24. data/lib/parade/metadata/template.rb +31 -0
  25. data/lib/parade/parsers/dsl.rb +138 -0
  26. data/lib/parade/parsers/dsl_file_parser.rb +17 -0
  27. data/lib/parade/parsers/json_file_parser.rb +67 -0
  28. data/lib/parade/parsers/markdown_image_paths.rb +44 -0
  29. data/lib/parade/parsers/markdown_slide_splitter.rb +63 -0
  30. data/lib/parade/parsers/presentation_directory_parser.rb +36 -0
  31. data/lib/parade/parsers/presentation_file_parser.rb +27 -0
  32. data/lib/parade/parsers/presentation_filepath_parser.rb +35 -0
  33. data/lib/parade/parsers/slides_file_content_parser.rb +27 -0
  34. data/lib/parade/renderers/columns_renderer.rb +68 -0
  35. data/lib/parade/renderers/command_line_renderer.rb +142 -0
  36. data/lib/parade/renderers/html_with_pygments.rb +42 -0
  37. data/lib/parade/renderers/inline_images.rb +31 -0
  38. data/lib/parade/renderers/special_paragraph_renderer.rb +23 -0
  39. data/lib/parade/renderers/update_image_paths.rb +75 -0
  40. data/lib/parade/section.rb +183 -0
  41. data/lib/parade/server.rb +139 -0
  42. data/lib/parade/slide.rb +128 -0
  43. data/lib/parade/version.rb +3 -0
  44. data/lib/public/css/960.css +653 -0
  45. data/lib/public/css/fg.menu.css +114 -0
  46. data/lib/public/css/ghf_marked.css +180 -0
  47. data/lib/public/css/jquery-terminal.css +73 -0
  48. data/lib/public/css/onepage.css +62 -0
  49. data/lib/public/css/parade.css +450 -0
  50. data/lib/public/css/pdf.css +13 -0
  51. data/lib/public/css/reset.css +53 -0
  52. data/lib/public/css/spinner_bar.gif +0 -0
  53. data/lib/public/css/theme/images/ui-bg_diagonals-small_100_f0efea_40x40.png +0 -0
  54. data/lib/public/css/theme/images/ui-bg_flat_35_f0f0f0_40x100.png +0 -0
  55. data/lib/public/css/theme/images/ui-bg_glass_55_fcf0ba_1x400.png +0 -0
  56. data/lib/public/css/theme/images/ui-bg_glow-ball_25_2e2e28_600x600.png +0 -0
  57. data/lib/public/css/theme/images/ui-bg_highlight-soft_100_f0efea_1x100.png +0 -0
  58. data/lib/public/css/theme/images/ui-bg_highlight-soft_25_327E04_1x100.png +0 -0
  59. data/lib/public/css/theme/images/ui-bg_highlight-soft_25_5A9D1A_1x100.png +0 -0
  60. data/lib/public/css/theme/images/ui-bg_highlight-soft_95_ffedad_1x100.png +0 -0
  61. data/lib/public/css/theme/images/ui-bg_inset-soft_22_3b3b35_1x100.png +0 -0
  62. data/lib/public/css/theme/images/ui-icons_808080_256x240.png +0 -0
  63. data/lib/public/css/theme/images/ui-icons_8DC262_256x240.png +0 -0
  64. data/lib/public/css/theme/images/ui-icons_cd0a0a_256x240.png +0 -0
  65. data/lib/public/css/theme/images/ui-icons_e7e6e4_256x240.png +0 -0
  66. data/lib/public/css/theme/images/ui-icons_eeeeee_256x240.png +0 -0
  67. data/lib/public/css/theme/images/ui-icons_ffffff_256x240.png +0 -0
  68. data/lib/public/css/theme/ui.accordion.css +9 -0
  69. data/lib/public/css/theme/ui.all.css +2 -0
  70. data/lib/public/css/theme/ui.base.css +9 -0
  71. data/lib/public/css/theme/ui.core.css +37 -0
  72. data/lib/public/css/theme/ui.datepicker.css +62 -0
  73. data/lib/public/css/theme/ui.dialog.css +13 -0
  74. data/lib/public/css/theme/ui.progressbar.css +4 -0
  75. data/lib/public/css/theme/ui.resizable.css +13 -0
  76. data/lib/public/css/theme/ui.slider.css +17 -0
  77. data/lib/public/css/theme/ui.tabs.css +9 -0
  78. data/lib/public/css/theme/ui.theme.css +245 -0
  79. data/lib/public/favicon.ico +0 -0
  80. data/lib/public/js/coffee-script.js +8 -0
  81. data/lib/public/js/fg.menu.js +645 -0
  82. data/lib/public/js/jTypeWriter.js +26 -0
  83. data/lib/public/js/jquery-1.4.2.js +6240 -0
  84. data/lib/public/js/jquery-print.js +109 -0
  85. data/lib/public/js/jquery-pubsub.js +27 -0
  86. data/lib/public/js/jquery-terminal.js +2712 -0
  87. data/lib/public/js/jquery.batchImageLoad.js +56 -0
  88. data/lib/public/js/jquery.cycle.all.js +1284 -0
  89. data/lib/public/js/keyboard.js +733 -0
  90. data/lib/public/js/parade-code-execution.js +122 -0
  91. data/lib/public/js/parade-command-input.js +16 -0
  92. data/lib/public/js/parade-command-visor.js +92 -0
  93. data/lib/public/js/parade-keyboard-input.js +54 -0
  94. data/lib/public/js/parade.js +675 -0
  95. data/lib/public/js/spine.js +904 -0
  96. data/lib/templates/config.ru.erb +4 -0
  97. data/lib/templates/showoff.erb +27 -0
  98. data/lib/templates/slides.md.erb +25 -0
  99. data/lib/views/header.erb +73 -0
  100. data/lib/views/index.erb +53 -0
  101. data/lib/views/inline_css.erb +3 -0
  102. data/lib/views/inline_js.erb +3 -0
  103. data/lib/views/onepage.erb +17 -0
  104. data/lib/views/pdf.erb +17 -0
  105. data/lib/views/slide.erb +5 -0
  106. metadata +317 -0
@@ -0,0 +1,15 @@
1
+ require 'rake/testtask'
2
+
3
+ task :default => :example
4
+
5
+ task :example do
6
+ `bin/parade serve example`
7
+ end
8
+
9
+ begin
10
+ require 'mg'
11
+ rescue LoadError
12
+ abort "Please `gem install mg`"
13
+ end
14
+
15
+ MG.new("parade.gemspec")
@@ -0,0 +1,138 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
+ require 'parade'
5
+ require 'parade/version'
6
+ require 'parade/commands/commands'
7
+
8
+ require 'rubygems'
9
+ require 'gli'
10
+
11
+ include GLI
12
+
13
+ version Parade::VERSION
14
+
15
+ desc 'Generate assets (e.g. sections or slides) for your presentation'
16
+ arg_name 'asset_name'
17
+ long_desc "#{Parade::Commands.generators.map {|k,v| "#{k} - #{v.description}" }.join("\n\n")}"
18
+ command [:g,:gen,:generate] do |c|
19
+
20
+ c.desc "Force creation of the asset, even if one already exists with a similar name"
21
+ c.switch [:f, :force]
22
+
23
+ c.action do |global,local,args|
24
+
25
+ asset_name = args.shift
26
+ key_value_args = args.map {|arg| key, value = arg.split(/:|=/) ; [ key, value ] }.flatten
27
+ parsed_arguments = Hash[*key_value_args]
28
+ all_parameters = global.merge(local).merge(parsed_arguments)
29
+
30
+ Parade::Commands.execute(:generator,asset_name,all_parameters) if asset_name
31
+ end
32
+
33
+ end
34
+
35
+ desc 'Serves the parade presentation in the specified (or current) directory'
36
+ arg_name "[pres_dir]"
37
+ default_value "."
38
+ command [:s,:serve,:server] do |c|
39
+
40
+ c.desc 'Show verbose messaging'
41
+ c.switch :verbose
42
+
43
+ c.desc 'Port on which to run'
44
+ c.default_value "9090"
45
+ c.flag [:p,:port]
46
+
47
+ c.desc 'Host or ip to run on'
48
+ c.default_value "localhost"
49
+ c.flag [:h,:host]
50
+
51
+ c.action do |global_options,options,args|
52
+
53
+ url = "http://#{options[:h]}:#{options[:p].to_i}"
54
+ puts "
55
+ -------------------------
56
+
57
+ Your Parade presentation is now starting up.
58
+
59
+ To view it plainly, visit [ #{url} ]
60
+
61
+ -------------------------
62
+
63
+ "
64
+ presentation_filepath = args[0]
65
+
66
+ unless File.directory?(presentation_filepath)
67
+ filename = File.basename(presentation_filepath)
68
+ presentation_filepath = File.dirname(presentation_filepath)
69
+ end
70
+
71
+ Parade::Server.run! :host => options[:h],
72
+ :port => options[:p].to_i,
73
+ :presentation_directory => presentation_filepath,
74
+ :presentation_file => filename,
75
+ :verbose => options[:verbose]
76
+
77
+ end
78
+ end
79
+
80
+ desc 'Output the presentation in a particular format'
81
+ arg_name 'format_type'
82
+ arg_name '[pres_dir]'
83
+ long_desc "#{Parade::Commands.statics.map {|k,v| "#{k} - #{v.description}" }.join("\n\n")}"
84
+ command [:static] do |c|
85
+
86
+ c.desc "Force creation of the asset, even if one already exists with a similar name"
87
+ c.switch [:f, :force]
88
+
89
+ c.action do |global,local,args|
90
+
91
+ format_type = args.shift
92
+ presentation_filepath = args.shift || "."
93
+
94
+ unless File.directory?(presentation_filepath)
95
+ filename = File.basename(presentation_filepath)
96
+ presentation_filepath = File.dirname(presentation_filepath)
97
+ end
98
+
99
+ key_value_args = args.map {|arg| key, value = arg.split(/:|=/) ; [ key, value ] }.flatten
100
+ parsed_arguments = Hash[*key_value_args]
101
+ all_parameters = global.merge(local).merge(parsed_arguments)
102
+
103
+ all_parameters.merge!('filepath' => presentation_filepath, 'parade_file' => filename)
104
+ Parade::Commands.execute(:static,format_type,all_parameters) if format_type
105
+ end
106
+
107
+ end
108
+
109
+ pre do |global,command,options,args|
110
+ # Pre logic here
111
+ # Return true to proceed; false to abourt and not call the
112
+ # chosen command
113
+ true
114
+ end
115
+
116
+ post do |global,command,options,args|
117
+ # Post logic here
118
+ end
119
+
120
+ on_error do |exception|
121
+ # Error logic here
122
+ # return false to skip default error handling
123
+ true
124
+ end
125
+
126
+
127
+ # To allow an easier command-line to launch parade, the following format
128
+ #
129
+ # `parade` is converted to `parade server .`
130
+ # `parade [directoryname] is convereted `parade server [directoryname]`
131
+ #
132
+
133
+ parameters = ARGV
134
+
135
+ parameters = [ "server", "." ] if parameters.empty?
136
+ parameters.unshift "server" if parameters.count == 1
137
+
138
+ exit GLI.run(parameters)
@@ -0,0 +1,43 @@
1
+ require 'rubygems'
2
+ require 'sinatra/base'
3
+ require 'json'
4
+ require 'nokogiri'
5
+ require 'fileutils'
6
+ require 'logger'
7
+ require 'tilt'
8
+ require 'css_parser'
9
+
10
+ begin
11
+ require 'RMagick'
12
+ rescue LoadError
13
+ $stderr.puts %{
14
+ --------------------------------------------------------------------------------
15
+ Please install RMagick:
16
+
17
+ $ gem install rmagick
18
+
19
+ RMagick is required for:
20
+
21
+ * Static output to ensure images are included with the documents
22
+ * Web rendering, auto-re-sizing of images
23
+ --------------------------------------------------------------------------------
24
+ }
25
+ end
26
+
27
+ begin
28
+ require 'pdfkit'
29
+ rescue LoadError
30
+ $stderr.puts %{
31
+ --------------------------------------------------------------------------------
32
+ Please install PDFKit and wkhtmltopdf-binary:
33
+
34
+ $ gem install pdfkit
35
+ $ gem install wkhtmltopdf-binary
36
+
37
+ PDFKit and wkhtmltopdf-binary are required to provide PDF output
38
+ --------------------------------------------------------------------------------
39
+ }
40
+ end
41
+
42
+ require_relative 'parade/helpers/encode_image'
43
+ require_relative 'parade/server'
@@ -0,0 +1,84 @@
1
+ require_relative 'render_from_template'
2
+
3
+ require_relative 'static_html'
4
+ require_relative 'static_pdf'
5
+ require_relative 'unknown'
6
+ require_relative 'generate_presentation'
7
+ require_relative 'generate_outline'
8
+ require_relative 'generate_rackup'
9
+
10
+
11
+ module Parade
12
+
13
+ #
14
+ # Commands is a module that contains commands to be used through the
15
+ # bin/parade utility. This module defines a number of helper methods to
16
+ # define generator and static content output formats.
17
+ #
18
+ module Commands
19
+
20
+ # @return [Hash] an empty command hash with the default, when a command is
21
+ # not found, to return the Unknown command.
22
+ def self.commands_with_unknown_default
23
+ command_hash = {}
24
+ command_hash.default = Unknown.new
25
+ command_hash
26
+ end
27
+
28
+ # @return [Hash] a hash that contains all the avaliable static output commands
29
+ def self.statics
30
+ @statics ||= commands_with_unknown_default
31
+ end
32
+
33
+ # @return [Hash] a hash that contains all the avaliable generator commands
34
+ def self.generators
35
+ @generators ||= commands_with_unknown_default
36
+ end
37
+
38
+ #
39
+ # @param [String,Symbol] type the type of command (e.g. statics or generators)
40
+ # @param [String] name the name which the command can be accessed
41
+ # @param [Object#description,Object#generate] command the command itself, which
42
+ # adheres to the two methods {#description} and {#generate}
43
+ #
44
+ def self.commands(type,name,command=nil)
45
+ command_set = send(type)
46
+ if command
47
+ command_set[name] = command
48
+ else
49
+ command_set[name]
50
+ end
51
+ end
52
+
53
+ # Find or create a static output command. Creates a static output entry
54
+ # if the command is provided.
55
+ def self.static(name,command=nil)
56
+ commands :statics, name, command
57
+ end
58
+
59
+ # Find or create a generator command. Creates a static output entry if the
60
+ # command is provided.
61
+ def self.generator(name,command=nil)
62
+ commands :generators, name, command
63
+ end
64
+
65
+ #
66
+ # @param [String,Symbol] type the typw of command (e.g. statics or generators)
67
+ # @param [String] name the name of the command to be found of the specified type
68
+ # @param [Hash] options a Hash of options that help instruct the execution
69
+ # process.
70
+ #
71
+ def self.execute(type,name,options)
72
+ puts "Generating #{type} #{name} with #{options}"
73
+ send(type,name).generate(options)
74
+ end
75
+
76
+ static "html", StaticHtml.new
77
+ static "pdf", StaticPdf.new
78
+
79
+ generator "presentation", GeneratePresentation.new
80
+ generator "outline", GenerateOutline.new
81
+ generator "rackup", GenerateRackup.new
82
+
83
+ end
84
+ end
@@ -0,0 +1,34 @@
1
+ module Parade
2
+ module Commands
3
+
4
+ #
5
+ # Generate a parade outline presentation file.
6
+ #
7
+ class GenerateOutline
8
+ include RenderFromTemplate
9
+
10
+ def description
11
+ "A generic presentation file (i.e. #{default_outline_filename})"
12
+ end
13
+
14
+ def generate(options)
15
+ outline_filename = options['outline'] || default_outline_filename
16
+ create_file_with_contents outline_filename, outline_template(options), options
17
+ end
18
+
19
+ def default_outline_filename
20
+ "parade"
21
+ end
22
+
23
+ def outline_template(options)
24
+ template_options = { 'erb_template_file' => File.join(default_template_path, "#{default_outline_filename}.erb"),
25
+ 'title' => 'My Presentation',
26
+ 'description' => 'The importance of unicorns!' }.merge(options)
27
+
28
+ render_template template_options
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ module Parade
2
+ module Commands
3
+
4
+ #
5
+ # Generates a presentation directory and the presentation outline if it
6
+ # does not already exist.
7
+ #
8
+ class GeneratePresentation
9
+ include RenderFromTemplate
10
+
11
+ def description
12
+ "A presentation folder with outline file"
13
+ end
14
+
15
+ def generate(options)
16
+
17
+ directory = options['dir'] || default_presentation_dirname
18
+ Dir.mkdir(directory) unless File.exists?(directory)
19
+
20
+ Dir.chdir(directory) do
21
+ outline_generator = GenerateOutline.new
22
+ outline_generator.generate(options)
23
+ end
24
+
25
+ end
26
+
27
+ def default_presentation_dirname
28
+ "presentation"
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ module Parade
2
+ module Commands
3
+
4
+ #
5
+ # Generates the a Rackup `config.ru` file to allow for presentations to
6
+ # be deployed to locations like Heroku.
7
+ #
8
+ class GenerateRackup
9
+ include RenderFromTemplate
10
+
11
+ def description
12
+ "A default rackup file (i.e. #{rackup_filename})"
13
+ end
14
+
15
+ def generate(options)
16
+ create_file_with_contents rackup_filename, rackup_template(options), options
17
+ end
18
+
19
+ def rackup_filename
20
+ "config.ru"
21
+ end
22
+
23
+ def rackup_template(options)
24
+ template_options = { 'erb_template_file' => File.join(default_template_path, "#{rackup_filename}.erb") }.merge(options)
25
+
26
+ render_template template_options
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../renderers/inline_images'
2
+
3
+ module Parade
4
+ module Commands
5
+
6
+ #
7
+ # HtmlOuput creates an HTML representation of the presentation and returns
8
+ # it from the generate method. This is to be consumed by other commands
9
+ # that my use this output to be saved or manipulated.
10
+ #
11
+ # @see StaticHtml
12
+ # @see StaticPdf
13
+ #
14
+ class HtmlOutput
15
+ include RenderFromTemplate
16
+
17
+ def description
18
+ "This method returns HTML output"
19
+ end
20
+
21
+ def generate(options)
22
+ filepath = options['filepath']
23
+
24
+ return unless File.exists? filepath
25
+
26
+ if File.directory? filepath
27
+ root_path = filepath
28
+ root_node = Parsers::PresentationDirectoryParser.parse filepath, :root_path => ".",
29
+ :parade_file => (Array(options['parade_file']) + [ "parade", "parade.json" ]).compact.uniq
30
+ else
31
+ root_path = File.dirname filepath
32
+ root_node = Parsers::PresentationFileParser.parse filepath, :root_path => root_path
33
+ end
34
+
35
+ root_node.add_post_renderer Renderers::InlineImages
36
+
37
+ template_options = { 'erb_template_file' => File.join(default_view_path, "#{options['template']}.erb"),
38
+ 'custom_asset_path' => root_path,
39
+ 'slides' => root_node.to_html }
40
+
41
+ render_template template_options
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,50 @@
1
+ require_relative '../helpers/template_generator'
2
+
3
+ module Parade
4
+ module Commands
5
+
6
+ #
7
+ # A module that shares common methods and information.
8
+ #
9
+ module RenderFromTemplate
10
+
11
+ # @return [String] the filepath to the templates directory within this project.
12
+ def default_template_path
13
+ File.join File.dirname(__FILE__), "..", "..", "templates"
14
+ end
15
+
16
+ #
17
+ # @see HtmlOutput
18
+ # @see StaticPdf
19
+ # @return [String] the filepath to the views directory within this project
20
+ def default_view_path
21
+ File.join File.dirname(__FILE__), "..", "..", "views"
22
+ end
23
+
24
+ #
25
+ # @param [Hash] options parameters that will help create the template
26
+ #
27
+ # @return [String] the string contents from the rendered template.
28
+ def render_template(options)
29
+ template = TemplateGenerator.new options
30
+ template.render
31
+ end
32
+
33
+ #
34
+ # @param [String] filename the file name to save the file
35
+ # @param [String] contents the contents to write to the file
36
+ # @param [Hash] options a hash of options which may influence whether
37
+ # the file should be saved or overwritten.
38
+ #
39
+ def create_file_with_contents(filename,contents,options)
40
+ return if (File.exists?(filename) and not options.key?(:force))
41
+ File.open(filename,'w+') do |file|
42
+ file.puts contents
43
+ end
44
+ true
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end