slideshow 0.7.7 → 0.7.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/History.txt +93 -0
  2. data/Manifest.txt +58 -0
  3. data/README.txt +51 -0
  4. data/Rakefile +18 -0
  5. data/lib/slideshow.rb +23 -613
  6. data/lib/slideshow/gen.rb +483 -0
  7. data/lib/{helpers → slideshow/helpers}/capture_helper.rb +0 -0
  8. data/lib/{helpers → slideshow/helpers}/coderay_helper.rb +0 -0
  9. data/lib/{helpers → slideshow/helpers}/text_helper.rb +0 -0
  10. data/lib/{helpers → slideshow/helpers}/uv_helper.rb +0 -0
  11. data/lib/slideshow/opts.rb +136 -0
  12. data/templates/fullerscreen.txt +5 -0
  13. data/templates/fullerscreen.txt.gen +7 -0
  14. data/{lib/templates → templates}/fullerscreen.txt.sample +0 -0
  15. data/{lib/templates → templates/fullerscreen}/footer.html.erb +0 -0
  16. data/{lib/templates → templates/fullerscreen}/header.html.erb +0 -0
  17. data/{lib/templates → templates/fullerscreen}/style.css.erb +0 -0
  18. data/{lib/templates → templates}/gradient.svg.erb +0 -0
  19. data/{lib/templates → templates}/s5.txt +1 -1
  20. data/{lib/templates → templates}/s5.txt.gen +0 -0
  21. data/{lib/templates → templates}/s5.txt.sample +0 -0
  22. data/{lib/templates → templates}/s5/footer.html.erb +0 -0
  23. data/{lib/templates → templates}/s5/header.html.erb +0 -0
  24. data/{lib/templates → templates}/s5/opera.css +0 -0
  25. data/{lib/templates → templates}/s5/outline.css +0 -0
  26. data/{lib/templates → templates}/s5/print.css +0 -0
  27. data/{lib/templates → templates}/s5/s5-core.css +0 -0
  28. data/{lib/templates → templates}/s5/slides.js +0 -0
  29. data/{lib/templates → templates}/s5/style.css.erb +0 -0
  30. data/{lib/templates → templates}/s5blank.txt.gen +0 -0
  31. data/{lib/templates → templates}/s5blank.txt.sample +0 -0
  32. data/{lib/templates → templates}/s5blank/blank.textile +0 -0
  33. data/{lib/templates → templates}/s5blank/footer.html.erb +0 -0
  34. data/{lib/templates → templates}/s5blank/header.html.erb +0 -0
  35. data/{lib/templates → templates}/s5blank/ui/default/blank.gif +0 -0
  36. data/{lib/templates → templates}/s5blank/ui/default/bodybg.gif +0 -0
  37. data/{lib/templates → templates}/s5blank/ui/default/framing.css +0 -0
  38. data/{lib/templates → templates}/s5blank/ui/default/iepngfix.htc +0 -0
  39. data/{lib/templates → templates}/s5blank/ui/default/opera.css +0 -0
  40. data/{lib/templates → templates}/s5blank/ui/default/outline.css +0 -0
  41. data/{lib/templates → templates}/s5blank/ui/default/pretty.css +0 -0
  42. data/{lib/templates → templates}/s5blank/ui/default/print.css +0 -0
  43. data/{lib/templates → templates}/s5blank/ui/default/s5-core.css +0 -0
  44. data/{lib/templates → templates}/s5blank/ui/default/slides.css +0 -0
  45. data/{lib/templates → templates}/s5blank/ui/default/slides.js +0 -0
  46. data/{lib/templates → templates}/s6.txt +0 -0
  47. data/{lib/templates → templates}/s6.txt.gen +0 -0
  48. data/{lib/templates → templates}/s6.txt.sample +0 -0
  49. data/{lib/templates → templates}/s6/footer.html.erb +0 -0
  50. data/{lib/templates → templates}/s6/header.html.erb +0 -0
  51. data/{lib/templates → templates}/s6/jquery.js +0 -0
  52. data/{lib/templates → templates}/s6/outline.css +0 -0
  53. data/{lib/templates → templates}/s6/print.css +0 -0
  54. data/{lib/templates → templates}/s6/slides.core.js +0 -0
  55. data/{lib/templates → templates}/s6/slides.css +0 -0
  56. data/{lib/templates → templates}/s6/slides.js +0 -0
  57. data/{lib/templates → templates}/s6/style.css.erb +0 -0
  58. metadata +81 -66
  59. data/lib/templates/fullerscreen.txt +0 -5
  60. data/lib/templates/fullerscreen.txt.gen +0 -7
data/History.txt ADDED
@@ -0,0 +1,93 @@
1
+ === 0.7.8 / 2009-03-09
2
+
3
+ * Adding SLIDESHOWOPT env variable; lets you set default command line options (e.g. -o slides)
4
+ * Using Hoe Rake tasks to manage gem; adding required files and build script
5
+ * Move templates folder to top-level (out of lib/)
6
+ * Minor code clean-up
7
+
8
+ === 0.7.7 / 2009-03-02
9
+
10
+ * Added new helpers for syntax highlighting (using ultraviolet and coderay gems)
11
+
12
+ === 0.7.6 / 2009-02-24
13
+
14
+ * Added plugin/helpers support
15
+ * Added include and content_for helpers
16
+ * Added __SKIP__/__END__ pragmas
17
+
18
+ === 0.7.5 / 2009-02-19
19
+
20
+ * Updated s6 templates (added support for steps/incrementals)
21
+
22
+ === 0.7.4 / 2009-02-06
23
+
24
+ * Added sample template package generation for S5 v11 blank package
25
+
26
+ === 0.7.3 / 2009-02-04
27
+
28
+ * Added check for installed markdown libs/gems
29
+ * Added support for rdiscount, rpeg-markdown libs/gems
30
+
31
+ === 0.7.2 / 2009-01-27
32
+
33
+ * Added support for output directory switch -o/--output and relative or absolute source file [Thanks Jorge L. Cangas]
34
+
35
+ === 0.7.1 / 2009-01-26
36
+
37
+ * Fixed newline in manifests for file paths on unix bug
38
+
39
+ === 0.7 / 2009-01-26
40
+
41
+ * Adding support for custom template packages using manifests
42
+
43
+ === 0.6.1 / 2008-08-31
44
+
45
+ * Fixed gradient header bug [Thanks Suraj N. Kurapati]
46
+
47
+ === 0.6 / 2008-08-26
48
+
49
+ * Added support for custom templates
50
+
51
+ === 0.5.2 / 2008-07-23
52
+
53
+ * Pumped RedCloth gem dependency to use new 4.0 release
54
+
55
+ === 0.5.1 / 2008-07-08
56
+
57
+ * Added support for S6 JavaScript slide shows as new default
58
+
59
+ === 0.5 / 2008-07-03
60
+
61
+ * Added support for S5
62
+
63
+ === 0.4.2 / 2008-05-20
64
+
65
+ * Added escaping of code blocks and unescaping of html entities in highlighted code
66
+
67
+ === 0.4.1 / 2008-05-19
68
+
69
+ * {{{ and }}} shortcuts now supported standing in for <pre class='code'> and </pre>
70
+ * Added patch for h1 pattern
71
+
72
+ === 0.4 / 2008-05-17
73
+
74
+ * Added support for code syntax highlighting using Ultraviolet gem [Thanks zimbatm]
75
+
76
+ === 0.3.1 / 2008-05-17
77
+
78
+ * Switched markdown processor to maruku gem [Thanks zimbatm]
79
+ * Fix gem executable install for unix systems [Thanks zimbatm]
80
+
81
+ === 0.3 / 2008-03-09
82
+
83
+ * Added support for Markdown using BlueCloth
84
+ * Moved all templates into templates folder processed using erb (embedded ruby)
85
+
86
+ === 0.2 / 2008-02-26
87
+
88
+ * Added theming support using svg gradients
89
+ * Added compatibility support for Opera Show (no browser plugin/addon required)
90
+
91
+ === 0.1 / 2008-02-17
92
+
93
+ * Everything is new. First release
data/Manifest.txt ADDED
@@ -0,0 +1,58 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/slideshow
6
+ lib/slideshow.rb
7
+ lib/slideshow/gen.rb
8
+ lib/slideshow/helpers/capture_helper.rb
9
+ lib/slideshow/helpers/coderay_helper.rb
10
+ lib/slideshow/helpers/text_helper.rb
11
+ lib/slideshow/helpers/uv_helper.rb
12
+ lib/slideshow/opts.rb
13
+ templates/fullerscreen.txt
14
+ templates/fullerscreen.txt.gen
15
+ templates/fullerscreen.txt.sample
16
+ templates/fullerscreen/footer.html.erb
17
+ templates/fullerscreen/header.html.erb
18
+ templates/fullerscreen/style.css.erb
19
+ templates/gradient.svg.erb
20
+ templates/s5.txt
21
+ templates/s5.txt.gen
22
+ templates/s5.txt.sample
23
+ templates/s5/footer.html.erb
24
+ templates/s5/header.html.erb
25
+ templates/s5/opera.css
26
+ templates/s5/outline.css
27
+ templates/s5/print.css
28
+ templates/s5/s5-core.css
29
+ templates/s5/slides.js
30
+ templates/s5/style.css.erb
31
+ templates/s5blank.txt.gen
32
+ templates/s5blank.txt.sample
33
+ templates/s5blank/blank.textile
34
+ templates/s5blank/footer.html.erb
35
+ templates/s5blank/header.html.erb
36
+ templates/s5blank/ui/default/blank.gif
37
+ templates/s5blank/ui/default/bodybg.gif
38
+ templates/s5blank/ui/default/framing.css
39
+ templates/s5blank/ui/default/iepngfix.htc
40
+ templates/s5blank/ui/default/opera.css
41
+ templates/s5blank/ui/default/outline.css
42
+ templates/s5blank/ui/default/pretty.css
43
+ templates/s5blank/ui/default/print.css
44
+ templates/s5blank/ui/default/s5-core.css
45
+ templates/s5blank/ui/default/slides.css
46
+ templates/s5blank/ui/default/slides.js
47
+ templates/s6.txt
48
+ templates/s6.txt.gen
49
+ templates/s6.txt.sample
50
+ templates/s6/footer.html.erb
51
+ templates/s6/header.html.erb
52
+ templates/s6/jquery.js
53
+ templates/s6/outline.css
54
+ templates/s6/print.css
55
+ templates/s6/slides.core.js
56
+ templates/s6/slides.css
57
+ templates/s6/slides.js
58
+ templates/s6/style.css.erb
data/README.txt ADDED
@@ -0,0 +1,51 @@
1
+ = slideshow
2
+
3
+ Slide Show (S9) - A Free Web Alternative to PowerPoint and KeyNote in Ruby
4
+
5
+ * http://slideshow.rubyforge.org
6
+
7
+ == DESCRIPTION:
8
+
9
+ The Slide Show (S9) Ruby gem lets you create slide shows and author slides in plain text
10
+ using a wiki-style markup language that's easy-to-write and easy-to-read.
11
+ The Slide Show (S9) project also collects and welcomes themes and ships
12
+ "out-of-the-gem" with built-in support for "loss-free" gradient vector graphics themes.
13
+
14
+ == SYNOPSIS:
15
+
16
+ Usage: slideshow [options] name
17
+
18
+ Examples:
19
+
20
+ slideshow microformats
21
+ slideshow microformats.textile
22
+ slideshow -s5 microformats # S5 compatible
23
+ slideshow -f microformats # FullerScreen compatible
24
+ slideshow -o slides microformats # Output slideshow to slides folder
25
+
26
+ More examles:
27
+
28
+ slideshow -g # Generate slide show templates
29
+ slideshow -g -s5 # Generate S5 compatible slide show templates
30
+ slideshow -g -f # Generate FullerScreen compatible slide show templates
31
+
32
+ slideshow -t s3.txt microformats # Use custom slide show templates
33
+
34
+ == REQUIREMENTS:
35
+
36
+ * RedCloth (Textile Markup)
37
+ * BlueCloth (Markdown Markup)
38
+
39
+ * RDiscount (Markdown Markup) [Optional]
40
+ * Coderay (Syntax Highlighting) [Optional]
41
+ * Ultraviolet (Syntax Highlighting) [Optional]
42
+
43
+ == INSTALL:
44
+
45
+ Just install the gem:
46
+
47
+ $ sudo gem install slideshow
48
+
49
+ == LICENSE:
50
+
51
+ The slide show scripts and templates are dedicated to the public domain. Use it as you please with no restrictions whatsoever.
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ require 'hoe'
2
+ require './lib/slideshow.rb'
3
+
4
+ Hoe.new('slideshow', Slideshow::VERSION) do |p|
5
+
6
+ p.summary = 'Slide Show (S9) - A Free Web Alternative to PowerPoint and KeyNote in Ruby'
7
+ p.url = 'http://slideshow.rubyforge.org'
8
+
9
+ p.author = 'Gerald Bauer'
10
+ p.email = 'webslideshow@googlegroups.com'
11
+
12
+ p.extra_deps = [
13
+ ['RedCloth','>= 4.0.0'],
14
+ ['BlueCloth','>= 1.0.0']
15
+ ]
16
+
17
+ p.remote_rdoc_dir = 'doc'
18
+ end
data/lib/slideshow.rb CHANGED
@@ -1,635 +1,45 @@
1
1
  $KCODE = 'utf'
2
2
 
3
+ LIB_PATH = File.expand_path( File.dirname(__FILE__) )
4
+ $:.unshift(LIB_PATH)
5
+
6
+ # core and stlibs
3
7
  require 'optparse'
4
8
  require 'erb'
5
- require 'redcloth'
6
9
  require 'logger'
7
10
  require 'fileutils'
8
11
  require 'ftools'
9
12
  require 'pp'
10
13
 
14
+ # required gems
15
+ require 'redcloth'
11
16
 
12
- module Slideshow
13
-
14
- VERSION = '0.7.7'
15
-
16
- # todo: split (command line) options and headers?
17
- # e.g. share (command line) options between slide shows (but not headers?)
18
-
19
- class Opts
20
-
21
- def initialize
22
- @hash = {}
23
- end
24
-
25
- def put( key, value )
26
- key = normalize_key( key )
27
- setter = "#{key}=".to_sym
28
-
29
- if respond_to? setter
30
- send setter, value
31
- else
32
- @hash[ key ] = value
33
- end
34
- end
35
-
36
- def gradient=( value )
37
- put_gradient( value, :theme, :color1, :color2 )
38
- end
39
-
40
- def gradient_colors=( value )
41
- put_gradient( value, :color1, :color2 )
42
- end
43
-
44
- def gradient_color=( value )
45
- put_gradient( value, :color1 )
46
- end
47
-
48
- def gradient_theme=( value )
49
- put_gradient( value, :theme )
50
- end
51
-
52
- def []( key )
53
- value = @hash[ normalize_key( key ) ]
54
- if value.nil?
55
- puts "** Warning: header '#{key}' undefined"
56
- "- #{key} not found -"
57
- else
58
- value
59
- end
60
- end
61
-
62
- def generate?
63
- get_boolean( 'generate', false )
64
- end
65
-
66
- def has_includes?
67
- @hash[ :include ]
68
- end
69
-
70
- def includes
71
- # fix: use os-agnostic delimiter (use : for Mac/Unix?)
72
- has_includes? ? @hash[ :include ].split( ';' ) : []
73
- end
74
-
75
- def s5?
76
- get_boolean( 's5', false )
77
- end
78
-
79
- def fullerscreen?
80
- get_boolean( 'fuller', false ) || get_boolean( 'fullerscreen', false )
81
- end
82
-
83
- def manifest
84
- get( 'manifest', 's6.txt' )
85
- end
86
-
87
- def output_path
88
- get( 'output', '.' )
89
- end
90
-
91
- def code_engine
92
- get( 'code-engine', DEFAULTS[ :code_engine ] )
93
- end
94
-
95
- def code_txmt
96
- get( 'code-txmt', DEFAULTS[ :code_txmt ])
97
- end
98
-
99
-
100
- DEFAULTS =
101
- {
102
- :title => 'Untitled Slide Show',
103
- :footer => '',
104
- :subfooter => '',
105
- :gradient_theme => 'dark',
106
- :gradient_color1 => 'red',
107
- :gradient_color2 => 'black',
108
-
109
- :code_engine => 'uv', # ultraviolet (uv) | coderay (cr)
110
- :code_txmt => 'false', # Text Mate Hyperlink for Source?
111
- }
112
-
113
- def set_defaults
114
- DEFAULTS.each_pair do | key, value |
115
- @hash[ key ] = value if @hash[ key ].nil?
116
- end
117
- end
118
-
119
- def get( key, default )
120
- @hash.fetch( normalize_key(key), default )
121
- end
122
-
123
- private
124
-
125
- def normalize_key( key )
126
- key.to_s.downcase.tr('-', '_').to_sym
127
- end
128
-
129
- # Assigns the given gradient-* keys to the values in the given string.
130
- def put_gradient( string, *keys )
131
- values = string.split( ' ' )
132
-
133
- values.zip(keys).each do |v, k|
134
- @hash[ normalize_key( "gradient-#{k}" ) ] = v.tr( '-', '_' )
135
- end
136
- end
137
-
138
- def get_boolean( key, default )
139
- value = @hash[ normalize_key( key ) ]
140
- if value.nil?
141
- default
142
- else
143
- (value == true || value =~ /true|yes|on/i) ? true : false
144
- end
145
- end
146
-
147
- end # class Opts
148
-
149
-
150
- class Gen
151
-
152
- KNOWN_TEXTILE_EXTNAMES = [ '.textile', '.t' ]
153
- KNOWN_MARKDOWN_EXTNAMES = [ '.markdown', '.m', '.mark', '.mkdn', '.md', '.txt', '.text' ]
154
- KNOWN_EXTNAMES = KNOWN_TEXTILE_EXTNAMES + KNOWN_MARKDOWN_EXTNAMES
155
-
156
- # note: only bluecloth is listed as a dependency in gem specs (because it's Ruby only and, thus, easy to install)
157
- # if you want to use other markdown libs install the required/desired lib e.g.
158
- # use gem install rdiscount for rdiscount and so on
159
- #
160
- # also note for now the first present markdown library gets used
161
- # the search order is first come, first serve, that is: rdiscount, rpeg-markdown, maruku, bluecloth (fallback, always present)
162
- KNOWN_MARKDOWN_LIBS = [
163
- [ 'rdiscount', lambda { |content| RDiscount.new( content ).to_html } ],
164
- [ 'rpeg-markdown', lambda { |content| PEGMarkdown.new( content ).to_html } ],
165
- [ 'maruku', lambda { |content| Maruku.new( content, {:on_error => :raise} ).to_html } ],
166
- [ 'bluecloth', lambda { |content| BlueCloth.new( content ).to_html } ]
167
- ]
168
-
169
- BUILTIN_MANIFESTS = [ 'fullerscreen.txt', 'fullerscreen.txt.gen',
170
- 's5.txt', 's5.txt.gen',
171
- 's6.txt', 's6.txt.gen',
172
- 's5blank.txt.gen' ]
173
-
174
- def initialize
175
- @logger = Logger.new(STDOUT)
176
- @logger.level = Logger::INFO
177
- @opts = Opts.new
178
- end
179
-
180
- # replace w/ attr_reader :logger, :opts ??
181
-
182
- def logger
183
- @logger
184
- end
185
-
186
- def opts
187
- @opts
188
- end
189
-
190
- def headers
191
- # give access to helpers to opts with a different name
192
- @opts
193
- end
194
-
195
- def session
196
- # give helpers/plugins a session-like hash
197
- @session
198
- end
199
-
200
- def markup_type
201
- @markup_type # :textile, :markdown
202
- end
203
-
204
- def load_markdown_libs
205
- # check for available markdown libs/gems
206
- # try to require each lib and remove any not installed
207
- @markdown_libs = []
208
-
209
- KNOWN_MARKDOWN_LIBS.each do |lib|
210
- begin
211
- require lib[0]
212
- @markdown_libs << lib
213
- rescue LoadError => ex
214
- logger.debug "Markdown library #{lib[0]} not found. Use gem install #{lib[0]} to install."
215
- end
216
- end
217
-
218
- logger.debug "Installed Markdown libraries: #{@markdown_libs.map{ |lib| lib[0] }.join(', ')}"
219
- logger.debug "Using Markdown library #{@markdown_libs.first[0]}."
220
- end
221
-
222
- # todo: move to filter (for easier reuse)
223
- def markdown_to_html( content )
224
- @markdown_libs.first[1].call( content )
225
- end
226
-
227
- # todo: move to filter (for easier reuse)
228
- def textile_to_html( content )
229
- # turn off hard line breaks
230
- # turn off span caps (see http://rubybook.ca/2008/08/16/redcloth)
231
- red = RedCloth.new( content, [:no_span_caps] )
232
- red.hard_breaks = false
233
- content = red.to_html
234
- end
235
-
236
- def wrap_markup( text )
237
- if markup_type == :textile
238
- # saveguard with notextile wrapper etc./no further processing needed
239
- "<notextile>\n#{text}\n</notextile>"
240
- else
241
- text
242
- end
243
- end
244
-
245
- def cache_dir
246
- PLATFORM =~ /win32/ ? win32_cache_dir : File.join(File.expand_path("~"), ".slideshow")
247
- end
248
-
249
- def win32_cache_dir
250
- unless File.exists?(home = ENV['HOMEDRIVE'] + ENV['HOMEPATH'])
251
- puts "No HOMEDRIVE or HOMEPATH environment variable. Set one to save a" +
252
- "local cache of stylesheets for syntax highlighting and more."
253
- return false
254
- else
255
- return File.join(home, 'slideshow')
256
- end
257
- end
258
-
259
- def load_manifest( path )
260
-
261
- # check if file exists (if yes use custom template package!) - allows you to override builtin package with same name
262
- if BUILTIN_MANIFESTS.include?( path ) && !File.exists?( path )
263
- templatesdir = "#{File.dirname(__FILE__)}/templates"
264
- logger.debug "use builtin template package"
265
- logger.debug "templatesdir=#{templatesdir}"
266
- filename = "#{templatesdir}/#{path}"
267
- else
268
- templatesdir = File.dirname( path )
269
- logger.debug "use custom template package"
270
- logger.debug "templatesdir=#{templatesdir}"
271
- filename = path
272
- end
273
-
274
- manifest = []
275
- puts " Loading template manifest #{filename}..."
276
-
277
- File.open( filename ).readlines.each_with_index do |line,i|
278
- case line
279
- when /^\s*$/
280
- # skip empty lines
281
- when /^\s*#.*$/
282
- # skip comment lines
283
- else
284
- logger.debug "line #{i+1}: #{line.strip}"
285
- values = line.strip.split( /[ <,+]+/ )
286
-
287
- # add source for shortcuts (assumes relative path; if not issue warning/error)
288
- values << values[0] if values.size == 1
289
-
290
- # normalize all source paths (1..-1) /make full path/add template dir
291
- (1..values.size-1).each do |i|
292
- values[i] = "#{templatesdir}/#{values[i]}"
293
- logger.debug " path[#{i}]=>#{values[i]}<"
294
- end
295
-
296
- manifest << values
297
- end
298
- end
299
-
300
- manifest
301
- end
302
-
303
- def load_template( path )
304
- puts " Loading template #{path}..."
305
- return File.read( path )
306
- end
307
-
308
- def render_template( content, the_binding )
309
- ERB.new( content ).result( the_binding )
310
- end
311
-
312
- def load_template_old_delete( name, builtin )
313
-
314
- if opts.has_includes?
315
- opts.includes.each do |path|
316
- logger.debug "File.exists? #{path}/#{name}"
317
-
318
- if File.exists?( "#{path}/#{name}" ) then
319
- puts "Loading custom template #{path}/#{name}..."
320
- return File.read( "#{path}/#{name}" )
321
- end
322
- end
323
- end
324
-
325
- # fallback load builtin template packaged with gem
326
- load_builtin_template( builtin )
327
- end
328
-
329
- def with_output_path( dest, output_path )
330
- dest_full = File.expand_path( dest, output_path )
331
- logger.debug "dest_full=#{dest_full}"
332
-
333
- # make sure dest path exists
334
- dest_path = File.dirname( dest_full )
335
- logger.debug "dest_path=#{dest_path}"
336
- File.makedirs( dest_path ) unless File.directory? dest_path
337
- dest_full
338
- end
339
-
340
- def create_slideshow_templates
341
- logger.debug "manifest=#{opts.manifest}.gen"
342
- manifest = load_manifest( opts.manifest+".gen" )
343
-
344
- # expand output path in current dir and make sure output path exists
345
- outpath = File.expand_path( opts.output_path )
346
- logger.debug "outpath=#{outpath}"
347
- File.makedirs( outpath ) unless File.directory? outpath
348
-
349
- manifest.each do |entry|
350
- dest = entry[0]
351
- source = entry[1]
352
-
353
- puts "Copying to #{dest} from #{source}..."
354
- File.copy( source, with_output_path( dest, outpath ) )
355
- end
356
-
357
- puts "Done."
358
- end
359
-
360
- def create_slideshow( fn )
361
-
362
- logger.debug "manifest=#{opts.manifest}"
363
- manifest = load_manifest( opts.manifest )
364
- # pp manifest
365
-
366
- # expand output path in current dir and make sure output path exists
367
- outpath = File.expand_path( opts.output_path )
368
- logger.debug "outpath=#{outpath}"
369
- File.makedirs( outpath ) unless File.directory? outpath
370
-
371
- dirname = File.dirname( fn )
372
- basename = File.basename( fn, '.*' )
373
- extname = File.extname( fn )
374
- logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
375
-
376
- # change working dir to sourcefile dir
377
- # todo: add a -c option to commandline? to let you set cwd?
378
-
379
- newcwd = File.expand_path( dirname )
380
- oldcwd = File.expand_path( Dir.pwd )
381
-
382
- unless newcwd == oldcwd then
383
- logger.debug "oldcwd=#{oldcwd}"
384
- logger.debug "newcwd=#{newcwd}"
385
- Dir.chdir newcwd
386
- end
387
-
388
- puts "Preparing slideshow '#{basename}'..."
389
-
390
- if extname.empty? then
391
- extname = ".textile" # default to .textile
392
-
393
- KNOWN_EXTNAMES.each do |e|
394
- logger.debug "File.exists? #{dirname}/#{basename}#{e}"
395
- if File.exists?( "#{dirname}/#{basename}#{e}" ) then
396
- extname = e
397
- logger.debug "extname=#{extname}"
398
- break
399
- end
400
- end
401
- end
402
-
403
- if KNOWN_MARKDOWN_EXTNAMES.include?( extname )
404
- @markup_type = :markdown
405
- else
406
- @markup_type = :textile
407
- end
408
-
409
- # shared variables for templates (binding)
410
- @content_for = {} # reset content_for hash
411
- @name = basename
412
- @headers = @opts # deprecate/remove: use headers method in template
413
-
414
- @session = {} # reset session hash for plugins/helpers
415
-
416
- inname = "#{dirname}/#{basename}#{extname}"
417
-
418
- logger.debug "inname=#{inname}"
419
-
420
- content_with_headers = File.read( inname )
421
-
422
- # todo: read headers before command line options (lets you override options using commandline switch)?
423
-
424
- # read source document; split off optional header from source
425
- # strip leading optional headers (key/value pairs) including optional empty lines
426
-
427
- read_headers = true
428
- content = ""
429
-
430
- # fix: allow comments in header too (#)
431
-
432
- content_with_headers.each do |line|
433
- if read_headers && line =~ /^\s*(\w[\w-]*)[ \t]*:[ \t]*(.*)/
434
- key = $1.downcase
435
- value = $2.strip
436
-
437
- logger.debug " adding option: key=>#{key}< value=>#{value}<"
438
- opts.put( key, value )
439
- elsif line =~ /^\s*$/
440
- content << line unless read_headers
441
- else
442
- read_headers = false
443
- content << line
444
- end
445
- end
446
-
447
- opts.set_defaults
448
-
449
- # ruby note: .*? is non-greedy (shortest-possible) regex match
450
- content.gsub!(/__SKIP__.*?__END__/m, '')
451
- content.sub!(/__END__.*/m, '')
452
-
453
- # allow plugins/helpers; process source (including header) using erb
454
-
455
- # note: include is a ruby keyword; rename to __include__ so we can use it
456
- content.gsub!( /<%=[ \t]*include/, '<%= __include__' )
457
-
458
- content = ERB.new( content ).result( binding )
459
-
460
- # run pre-filters (built-in macros)
461
- # o replace {{{ w/ <pre class='code'>
462
- # o replace }}} w/ </pre>
463
- content.gsub!( "{{{{{{", "<pre class='code'>_S9BEGIN_" )
464
- content.gsub!( "}}}}}}", "_S9END_</pre>" )
465
- content.gsub!( "{{{", "<pre class='code'>" )
466
- content.gsub!( "}}}", "</pre>" )
467
- # restore escaped {{{}}} I'm sure there's a better way! Rubyize this! Anyone?
468
- content.gsub!( "_S9BEGIN_", "{{{" )
469
- content.gsub!( "_S9END_", "}}}" )
470
-
471
- # convert light-weight markup to hypertext
472
-
473
- content = case @markup_type
474
- when :markdown
475
- markdown_to_html( content )
476
- when :textile
477
- textile_to_html( content )
478
- end
479
-
480
- # post-processing
481
-
482
- slide_counter = 0
483
- content2 = ''
484
-
485
- ## todo: move this to a filter (for easier reuse)
486
-
487
- # wrap h1's in slide divs; note use just <h1 since some processors add ids e.g. <h1 id='x'>
488
- content.each_line do |line|
489
- if line.include?( '<h1' ) then
490
- content2 << "\n\n</div>" if slide_counter > 0
491
- content2 << "<div class='slide'>\n\n"
492
- slide_counter += 1
493
- end
494
- content2 << line
495
- end
496
- content2 << "\n\n</div>" if slide_counter > 0
497
-
498
- manifest.each do |entry|
499
- outname = entry[0]
500
- if outname.include? '__file__' # process
501
- outname = outname.gsub( '__file__', basename )
502
- puts "Preparing #{outname}..."
503
-
504
- out = File.new( with_output_path( outname, outpath ), "w+" )
505
-
506
- out << render_template( load_template( entry[1] ), binding )
507
-
508
- if entry.size > 2 # more than one source file? assume header and footer with content added inbetween
509
- out << content2
510
- out << render_template( load_template( entry[2] ), binding )
511
- end
512
-
513
- out.flush
514
- out.close
515
-
516
- else # just copy verbatim if target/dest has no __file__ in name
517
- dest = entry[0]
518
- source = entry[1]
519
-
520
- puts "Copying to #{dest} from #{source}..."
521
- File.copy( source, with_output_path( dest, outpath ) )
522
- end
523
- end
524
-
525
- puts "Done."
526
- end
17
+ # own code
18
+ require 'slideshow/opts'
19
+ require 'slideshow/gen'
527
20
 
528
- def load_plugins
529
-
530
- # use lib folder unless we're in our very own folder
531
- # (that use lib for its core functionality), thus, use plugins instead
532
- if( File.expand_path( File.dirname(__FILE__) ) == File.expand_path( 'lib' ) )
533
- pattern = 'plugins/**/*.rb'
534
- else
535
- pattern = 'lib/**/*.rb'
536
- end
537
-
538
- logger.debug "pattern=#{pattern}"
539
-
540
- Dir.glob( pattern ) do |plugin|
541
- begin
542
- puts "Loading plugins in '#{plugin}'..."
543
- require( plugin )
544
- rescue Exception => e
545
- puts "** error: failed loading plugins in '#{plugin}': #{e}"
546
- end
547
- end
548
- end
21
+ module Slideshow
549
22
 
550
- def run( args )
23
+ VERSION = '0.7.8'
551
24
 
552
- opt=OptionParser.new do |cmd|
553
-
554
- cmd.banner = "Usage: slideshow [options] name"
25
+ def Slideshow.main
555
26
 
556
- #todo/fix: use -s5 option without optional hack? possible with OptionParser package/lib?
557
- # use -5 switch instead?
558
- cmd.on( '-s[OPTIONAL]', '--s5', 'S5 Compatible Slide Show' ) { opts.put( 's5', true ); opts.put( 'manifest', 's5.txt' ) }
559
- cmd.on( '-f[OPTIONAL]', '--fullerscreen', 'FullerScreen Compatible Slide Show' ) { opts.put( 'fuller', true ); opts.put( 'manifest', 'fullerscreen.txt' ) }
560
- # opts.on( "-s", "--style STYLE", "Select Stylesheet" ) { |s| $options[:style]=s }
561
- # opts.on( "-v", "--version", "Show version" ) {}
27
+ # allow env variable to set RUBYOPT-style default command line options
28
+ # e.g. -o slides -t <your_template_manifest_here>
29
+ slideshowopt = ENV[ 'SLIDESHOWOPT' ]
562
30
 
563
- cmd.on( '-g', '--generate', 'Generate Slide Show Templates' ) { opts.put( 'generate', true ) }
564
-
565
- cmd.on( '-o', '--output PATH', 'outputs to Path' ) { |s| opts.put( 'output', s ) }
566
-
567
- # use -d or -o to select output directory for slideshow or slideshow templates?
568
- # cmd.on( '-d', '--directory DIRECTORY', 'Output Directory' ) { |s| opts.put( 'directory', s ) }
569
- # cmd.on( '-i', '--include PATH', 'Load Path' ) { |s| opts.put( 'include', s ) }
570
-
571
- # todo: find different letter for debug trace switch (use v for version?)
572
- cmd.on( "-v", "--verbose", "Show debug trace" ) do
573
- logger.datetime_format = "%H:%H:%S"
574
- logger.level = Logger::DEBUG
575
- end
576
-
577
- cmd.on( "-t", "--template TEMPLATE", "Template Manifest" ) do |t|
578
- # todo: do some checks on passed in template argument
579
- opts.put( 'manifest', t )
580
- end
581
-
582
- cmd.on_tail( "-h", "--help", "Show this message" ) do
583
- puts
584
- puts "Slide Show (S9) is a free web alternative to PowerPoint or KeyNote in Ruby"
585
- puts
586
- puts cmd.help
587
- puts
588
- puts "Examples:"
589
- puts " slideshow microformats"
590
- puts " slideshow microformats.textile"
591
- puts " slideshow -s5 microformats # S5 compatible"
592
- puts " slideshow -f microformats # FullerScreen compatible"
593
- puts " slideshow -o slides microformats # Output slideshow to slides folder"
594
- puts
595
- puts "More examles:"
596
- puts " slideshow -g # Generate slide show templates"
597
- puts " slideshow -g -s5 # Generate S5 compatible slide show templates"
598
- puts " slideshow -g -f # Generate FullerScreen compatible slide show templates"
599
- puts
600
- puts " slideshow -t s3.txt microformats # Use custom slide show templates"
601
- puts
602
- puts "Further information:"
603
- puts " http://slideshow.rubyforge.org"
604
- exit
605
- end
606
- end
607
-
608
- opt.parse!( args )
609
-
610
- puts "Slide Show (S9) Version: #{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
611
-
612
- if opts.generate?
613
- create_slideshow_templates
614
- else
615
- load_markdown_libs
616
- load_plugins # check for optional plugins/extension in ./lib folder
31
+ args = []
32
+ args += slideshowopt.split if slideshowopt
33
+ args += ARGV.dup
617
34
 
618
- args.each { |fn| create_slideshow( fn ) }
35
+ Gen.new.run(args)
619
36
  end
620
- end
621
-
622
- end # class Gen
623
-
624
- def Slideshow.main
625
- Gen.new.run(ARGV)
626
- end
627
37
 
628
38
  end # module Slideshow
629
39
 
630
40
  # load built-in (required) helpers/plugins
631
- require "#{File.dirname(__FILE__)}/helpers/text_helper.rb"
632
- require "#{File.dirname(__FILE__)}/helpers/capture_helper.rb"
41
+ require 'slideshow/helpers/text_helper.rb'
42
+ require 'slideshow/helpers/capture_helper.rb'
633
43
 
634
44
  # load built-in (optional) helpers/plugins
635
45
  # If a helper fails to load, simply ingnore it
@@ -637,8 +47,8 @@ require "#{File.dirname(__FILE__)}/helpers/capture_helper.rb"
637
47
  # gem install coderay
638
48
  # gem install ultraviolet etc.
639
49
  BUILTIN_OPT_HELPERS = [
640
- "#{File.dirname(__FILE__)}/helpers/uv_helper.rb",
641
- "#{File.dirname(__FILE__)}/helpers/coderay_helper.rb",
50
+ 'slideshow/helpers/uv_helper.rb',
51
+ 'slideshow/helpers/coderay_helper.rb',
642
52
  ]
643
53
 
644
54
  BUILTIN_OPT_HELPERS.each do |helper|