slideshow 0.6.1 → 0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/slideshow.rb +141 -123
- data/lib/slideshow.v6.rb +599 -0
- data/lib/templates/fullerscreen.txt +5 -0
- data/lib/templates/fullerscreen.txt.gen +7 -0
- data/lib/templates/fullerscreen.txt.sample +11 -0
- data/lib/templates/header.html.erb +2 -2
- data/lib/templates/s5.txt +10 -0
- data/lib/templates/s5.txt.gen +12 -0
- data/lib/templates/s5.txt.sample +15 -0
- data/lib/templates/s5/header.html.erb +2 -2
- data/lib/templates/s6.txt +10 -0
- data/lib/templates/s6.txt.gen +12 -0
- data/lib/templates/s6.txt.sample +15 -0
- data/lib/templates/s6/header.html.erb +2 -2
- metadata +17 -3
data/lib/slideshow.rb
CHANGED
@@ -7,17 +7,17 @@ require 'fileutils'
|
|
7
7
|
require 'ftools'
|
8
8
|
require 'hpricot'
|
9
9
|
require 'uv'
|
10
|
+
require 'pp'
|
10
11
|
|
11
12
|
|
12
13
|
module Slideshow
|
13
14
|
|
14
|
-
VERSION = '0.
|
15
|
+
VERSION = '0.7'
|
15
16
|
|
16
17
|
class Params
|
17
18
|
|
18
19
|
def initialize( name, headers )
|
19
|
-
@
|
20
|
-
@cssname = "#{name}.css"
|
20
|
+
@name = name
|
21
21
|
@headers = headers
|
22
22
|
end
|
23
23
|
|
@@ -104,7 +104,11 @@ class Opts
|
|
104
104
|
|
105
105
|
def code_line_numbers?
|
106
106
|
get_boolean( 'code-line-numbers', DEFAULTS[ :code_line_numbers ] )
|
107
|
-
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def manifest
|
110
|
+
get( 'manifest', 's6.txt' )
|
111
|
+
end
|
108
112
|
|
109
113
|
DEFAULTS =
|
110
114
|
{
|
@@ -159,7 +163,10 @@ class Gen
|
|
159
163
|
|
160
164
|
KNOWN_TEXTILE_EXTNAMES = [ '.textile', '.t' ]
|
161
165
|
KNOWN_MARKDOWN_EXTNAMES = [ '.markdown', '.mark', '.m', '.txt', '.text' ]
|
162
|
-
|
166
|
+
BUILTIN_MANIFESTS = [ 'fullerscreen.txt', 'fullerscreen.txt.gen',
|
167
|
+
's5.txt','s5.txt.gen',
|
168
|
+
's6.txt','s6.txt.gen' ]
|
169
|
+
|
163
170
|
def initialize
|
164
171
|
@logger = Logger.new(STDOUT)
|
165
172
|
@logger.level = Logger::INFO
|
@@ -188,7 +195,59 @@ class Gen
|
|
188
195
|
end
|
189
196
|
end
|
190
197
|
|
191
|
-
def
|
198
|
+
def load_manifest( path )
|
199
|
+
|
200
|
+
# check if file exists (if yes use custom template package!) - allows you to override builtin package with same name
|
201
|
+
if BUILTIN_MANIFESTS.include?( path ) && !File.exists?( path )
|
202
|
+
templatesdir = "#{File.dirname(__FILE__)}/templates"
|
203
|
+
logger.debug "use builtin template package"
|
204
|
+
logger.debug "templatesdir=#{templatesdir}"
|
205
|
+
filename = "#{templatesdir}/#{path}"
|
206
|
+
else
|
207
|
+
templatesdir = File.dirname( path )
|
208
|
+
logger.debug "use custom template package"
|
209
|
+
logger.debug "templatesdir=#{templatesdir}"
|
210
|
+
filename = path
|
211
|
+
end
|
212
|
+
|
213
|
+
manifest = []
|
214
|
+
puts " Loading template manifest #{filename}..."
|
215
|
+
|
216
|
+
File.open( filename ).readlines.each_with_index do |line,i|
|
217
|
+
case line
|
218
|
+
when /^\s*$/
|
219
|
+
# skip empty lines
|
220
|
+
when /^\s*#.*$/
|
221
|
+
# skip comment lines
|
222
|
+
else
|
223
|
+
logger.debug "line #{i+1}: #{line}"
|
224
|
+
values = line.split( /[ <,+\n]+/ )
|
225
|
+
|
226
|
+
# add source for shortcuts (assumes relative path; if not issue warning/error)
|
227
|
+
values << values[0] if values.size == 1
|
228
|
+
|
229
|
+
# normalize all source paths (1..-1) /make full path/add template dir
|
230
|
+
(1..values.size-1).each do |i|
|
231
|
+
values[i] = "#{templatesdir}/#{values[i]}"
|
232
|
+
end
|
233
|
+
|
234
|
+
manifest << values
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
manifest
|
239
|
+
end
|
240
|
+
|
241
|
+
def load_template( path )
|
242
|
+
puts " Loading template #{path}..."
|
243
|
+
return File.read( path )
|
244
|
+
end
|
245
|
+
|
246
|
+
def render_template( content, b=TOPLEVEL_BINDING )
|
247
|
+
ERB.new( content ).result( b )
|
248
|
+
end
|
249
|
+
|
250
|
+
def load_template_old_delete( name, builtin )
|
192
251
|
|
193
252
|
if opts.has_includes?
|
194
253
|
opts.includes.each do |path|
|
@@ -205,71 +264,41 @@ class Gen
|
|
205
264
|
load_builtin_template( builtin )
|
206
265
|
end
|
207
266
|
|
208
|
-
def
|
267
|
+
def load_builtin_template_old_delete( name )
|
209
268
|
templatesdir = "#{File.dirname(__FILE__)}/templates"
|
210
269
|
logger.debug "templatesdir=#{templatesdir}"
|
211
270
|
|
212
271
|
File.read( "#{templatesdir}/#{name}" )
|
213
272
|
end
|
214
|
-
|
215
|
-
def render_template( content, b=TOPLEVEL_BINDING )
|
216
|
-
ERB.new( content ).result( b )
|
217
|
-
end
|
218
|
-
|
273
|
+
|
219
274
|
|
220
275
|
def create_slideshow_templates
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
[
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
[[ 's6/header.html.erb', 'header.html.erb' ],
|
234
|
-
[ 's6/footer.html.erb', 'footer.html.erb' ],
|
235
|
-
[ 's6/style.css.erb', 'style.css.erb' ]]
|
236
|
-
end
|
237
|
-
|
238
|
-
# background theming shared between s5/s6/fullerscreen
|
239
|
-
files << [ 'gradient.svg.erb', 'gradient.svg.erb' ]
|
240
|
-
|
241
|
-
files.each do |file|
|
242
|
-
source = "#{File.dirname(__FILE__)}/templates/#{file[0]}"
|
243
|
-
dest = "#{file[1]}"
|
244
|
-
|
245
|
-
puts "Copying '#{source}' to '#{dest}'"
|
276
|
+
logger.debug "manifest=#{opts.manifest}.gen"
|
277
|
+
manifest = load_manifest( opts.manifest+".gen" )
|
278
|
+
|
279
|
+
manifest.each do |entry|
|
280
|
+
dest = entry[0]
|
281
|
+
source = entry[1]
|
282
|
+
|
283
|
+
# make sure dirs exist
|
284
|
+
logger.debug "makedirs( #{File.dirname(dest)} )"
|
285
|
+
File.makedirs( File.dirname(dest) )
|
286
|
+
|
287
|
+
puts "Copying to #{dest} from #{source}..."
|
246
288
|
File.copy( source, dest )
|
247
289
|
end
|
248
290
|
|
249
|
-
puts "Done."
|
291
|
+
puts "Done."
|
250
292
|
end
|
251
293
|
|
252
294
|
def create_slideshow( fn )
|
253
295
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
styledoc = load_template( 'style.css.erb', 's5/style.css.erb' )
|
258
|
-
elsif opts.fullerscreen? # use fullerscreen templates
|
259
|
-
headerdoc = load_template( 'header.html.erb', 'header.html.erb' )
|
260
|
-
footerdoc = load_template( 'footer.html.erb', 'footer.html.erb' )
|
261
|
-
styledoc = load_template( 'style.css.erb', 'style.css.erb' )
|
262
|
-
else # use default s6 templates
|
263
|
-
headerdoc = load_template( 'header.html.erb', 's6/header.html.erb' )
|
264
|
-
footerdoc = load_template( 'footer.html.erb', 's6/footer.html.erb' )
|
265
|
-
styledoc = load_template( 'style.css.erb', 's6/style.css.erb' )
|
266
|
-
end
|
267
|
-
|
268
|
-
# background theming shared between s5/s6/fullerscreen
|
269
|
-
gradientdoc = load_template( 'gradient.svg.erb', 'gradient.svg.erb' )
|
296
|
+
logger.debug "manifest=#{opts.manifest}"
|
297
|
+
manifest = load_manifest( opts.manifest )
|
298
|
+
# pp manifest
|
270
299
|
|
271
|
-
|
272
|
-
|
300
|
+
basename = File.basename( fn, '.*' )
|
301
|
+
extname = File.extname( fn )
|
273
302
|
|
274
303
|
known_extnames = KNOWN_TEXTILE_EXTNAMES + KNOWN_MARKDOWN_EXTNAMES
|
275
304
|
|
@@ -287,14 +316,13 @@ class Gen
|
|
287
316
|
end
|
288
317
|
|
289
318
|
inname = "#{basename}#{extname}"
|
290
|
-
outname = "#{basename}.html"
|
291
|
-
svgname = "#{basename}.svg"
|
292
|
-
cssname = "#{basename}.css"
|
293
319
|
|
294
320
|
logger.debug "inname=#{inname}"
|
295
321
|
|
296
322
|
content = File.read( inname )
|
297
323
|
|
324
|
+
# todo: read headers before command line options (lets you override options using commandline switch)
|
325
|
+
|
298
326
|
# read source document
|
299
327
|
# strip leading optional headers (key/value pairs) including optional empty lines
|
300
328
|
|
@@ -330,15 +358,8 @@ class Gen
|
|
330
358
|
opts.set_defaults
|
331
359
|
|
332
360
|
params = Params.new( basename, opts )
|
333
|
-
|
334
|
-
puts "Preparing slideshow theme '#{svgname}'..."
|
335
361
|
|
336
|
-
|
337
|
-
out << render_template( gradientdoc, params.params_binding )
|
338
|
-
out.flush
|
339
|
-
out.close
|
340
|
-
|
341
|
-
puts "Preparing slideshow '#{outname}'..."
|
362
|
+
puts "Preparing slideshow '#{basename}'..."
|
342
363
|
|
343
364
|
# convert light-weight markup to hypertext
|
344
365
|
|
@@ -370,6 +391,7 @@ class Gen
|
|
370
391
|
end
|
371
392
|
content2 << "\n\n</div>" if slide_counter > 0
|
372
393
|
|
394
|
+
=begin
|
373
395
|
## todo: run syntax highlighting before markup/textilize? lets us add textile to highlighted code?
|
374
396
|
## avoid undoing escaped entities?
|
375
397
|
|
@@ -405,20 +427,42 @@ class Gen
|
|
405
427
|
end
|
406
428
|
|
407
429
|
content2 = doc.to_s
|
430
|
+
=end
|
431
|
+
|
432
|
+
|
433
|
+
manifest.each do |entry|
|
434
|
+
outname = entry[0]
|
435
|
+
if outname.include? '__file__' # process
|
436
|
+
outname = outname.gsub( '__file__', basename )
|
437
|
+
puts "Preparing #{outname}..."
|
438
|
+
|
439
|
+
out = File.new( outname, "w+" )
|
440
|
+
|
441
|
+
out << render_template( load_template( entry[1] ), params.params_binding )
|
442
|
+
|
443
|
+
if entry.size > 2 # more than one source file? assume header and footer with content added inbetween
|
444
|
+
out << content2
|
445
|
+
out << render_template( load_template( entry[2] ), params.params_binding )
|
446
|
+
end
|
408
447
|
|
448
|
+
out.flush
|
449
|
+
out.close
|
450
|
+
|
451
|
+
else # just copy verbatim if target/dest has no __file__ in name
|
452
|
+
dest = entry[0]
|
453
|
+
source = entry[1]
|
454
|
+
|
455
|
+
# make sure dirs exist
|
456
|
+
logger.debug "makedirs( #{File.dirname(dest)} )"
|
457
|
+
File.makedirs( File.dirname(dest) )
|
458
|
+
|
459
|
+
puts "Copying to #{dest} from #{source}..."
|
460
|
+
File.copy( source, dest )
|
461
|
+
end
|
462
|
+
end
|
409
463
|
|
410
|
-
|
411
|
-
|
412
|
-
out << content2
|
413
|
-
out << render_template( footerdoc, params.params_binding )
|
414
|
-
out.flush
|
415
|
-
out.close
|
416
|
-
|
417
|
-
puts "Preparing slideshow stylesheet '#{cssname}'..."
|
418
|
-
|
419
|
-
out = File.new( cssname, "w+" )
|
420
|
-
out << render_template( styledoc, params.params_binding )
|
421
|
-
|
464
|
+
|
465
|
+
=begin
|
422
466
|
if include_code_stylesheet
|
423
467
|
logger.debug "cache_dir=#{cache_dir}"
|
424
468
|
|
@@ -433,39 +477,7 @@ class Gen
|
|
433
477
|
out << "\n"
|
434
478
|
out << theme_content
|
435
479
|
end
|
436
|
-
|
437
|
-
out.flush
|
438
|
-
out.close
|
439
|
-
|
440
|
-
|
441
|
-
if opts.s5?
|
442
|
-
# copy s5 machinery to s5 folder
|
443
|
-
# todo/fix: is there a better way to check if the dir exists?
|
444
|
-
Dir.mkdir( 's5' ) unless File.directory?( 's5' )
|
445
|
-
|
446
|
-
[ 'opera.css', 'outline.css', 'print.css', 's5-core.css', 'slides.js' ].each do |name|
|
447
|
-
|
448
|
-
source = "#{File.dirname(__FILE__)}/templates/s5/#{name}"
|
449
|
-
dest = "s5/#{name}"
|
450
|
-
|
451
|
-
logger.debug "copying '#{source} ' to '#{dest}'"
|
452
|
-
File.copy( source, dest )
|
453
|
-
end
|
454
|
-
elsif opts.fullerscreen?
|
455
|
-
# do nothing; slideshow machinery built into plugin (requires install!)
|
456
|
-
else
|
457
|
-
# copy s6 machinery to s6 folder
|
458
|
-
Dir.mkdir( 's6' ) unless File.directory?( 's6' )
|
459
|
-
|
460
|
-
[ 'outline.css', 'print.css', 'slides.css', 'slides.js', 'jquery.js' ].each do |name|
|
461
|
-
|
462
|
-
source = "#{File.dirname(__FILE__)}/templates/s6/#{name}"
|
463
|
-
dest = "s6/#{name}"
|
464
|
-
|
465
|
-
logger.debug "copying '#{source} ' to '#{dest}'"
|
466
|
-
File.copy( source, dest )
|
467
|
-
end
|
468
|
-
end
|
480
|
+
=end
|
469
481
|
|
470
482
|
puts "Done."
|
471
483
|
end
|
@@ -479,21 +491,28 @@ def run( args )
|
|
479
491
|
|
480
492
|
#todo/fix: use -s5 option without optional hack? possible with OptionParser package/lib?
|
481
493
|
# use -5 switch instead?
|
482
|
-
cmd.on( '-s[OPTIONAL]', '--s5', 'S5 Compatible Slide Show' ) { opts.put( 's5', true ) }
|
483
|
-
cmd.on( '-f[OPTIONAL]', '--fullerscreen', 'FullerScreen Compatible Slide Show' ) { opts.put( 'fuller', true ) }
|
494
|
+
cmd.on( '-s[OPTIONAL]', '--s5', 'S5 Compatible Slide Show' ) { opts.put( 's5', true ); opts.put( 'manifest', 's5.txt' ) }
|
495
|
+
cmd.on( '-f[OPTIONAL]', '--fullerscreen', 'FullerScreen Compatible Slide Show' ) { opts.put( 'fuller', true ); opts.put( 'manifest', 'fullerscreen.txt' ) }
|
484
496
|
# opts.on( "-s", "--style STYLE", "Select Stylesheet" ) { |s| $options[:style]=s }
|
485
497
|
# opts.on( "-v", "--version", "Show version" ) {}
|
486
498
|
|
487
499
|
cmd.on( '-g', '--generate', 'Generate Slide Show Templates' ) { opts.put( 'generate', true ) }
|
488
500
|
# use -d or -o to select output directory for slideshow or slideshow templates?
|
489
501
|
# cmd.on( '-d', '--directory DIRECTORY', 'Output Directory' ) { |s| opts.put( 'directory', s ) }
|
490
|
-
cmd.on( '-i', '--include PATH', 'Load Path' ) { |s| opts.put( 'include', s ) }
|
491
|
-
|
492
|
-
|
502
|
+
# cmd.on( '-i', '--include PATH', 'Load Path' ) { |s| opts.put( 'include', s ) }
|
503
|
+
|
504
|
+
# todo: find different letter for debug trace switch (use v for version?)
|
505
|
+
cmd.on( "-v", "--verbose", "Show debug trace" ) do
|
493
506
|
logger.datetime_format = "%H:%H:%S"
|
494
|
-
logger.level = Logger::DEBUG
|
495
|
-
|
496
|
-
|
507
|
+
logger.level = Logger::DEBUG
|
508
|
+
end
|
509
|
+
|
510
|
+
cmd.on( "-t", "--template TEMPLATE", "Template Manifest" ) do |t|
|
511
|
+
# todo: do some checks on passed in template argument
|
512
|
+
opts.put( 'manifest', t )
|
513
|
+
end
|
514
|
+
|
515
|
+
cmd.on_tail( "-h", "--help", "Show this message" ) do
|
497
516
|
puts
|
498
517
|
puts "Slide Show (S9) is a free web alternative to PowerPoint or KeyNote in Ruby"
|
499
518
|
puts
|
@@ -510,13 +529,12 @@ def run( args )
|
|
510
529
|
puts " slideshow -g -s5 # Generate S5 compatible slide show templates"
|
511
530
|
puts " slideshow -g -f # Generate FullerScreen compatible slide show templates"
|
512
531
|
puts
|
513
|
-
puts " slideshow -
|
514
|
-
puts " slideshow -i . -s5 microformats # Use S5 compatible slide show templates in path ."
|
532
|
+
puts " slideshow -t s3.txt microformats # Use custom slide show templates"
|
515
533
|
puts
|
516
534
|
puts "Further information:"
|
517
535
|
puts " http://slideshow.rubyforge.org"
|
518
536
|
exit
|
519
|
-
|
537
|
+
end
|
520
538
|
end
|
521
539
|
|
522
540
|
opt.parse!( args )
|
data/lib/slideshow.v6.rb
ADDED
@@ -0,0 +1,599 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'erb'
|
3
|
+
require 'redcloth'
|
4
|
+
require 'maruku'
|
5
|
+
require 'logger'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'ftools'
|
8
|
+
require 'hpricot'
|
9
|
+
require 'uv'
|
10
|
+
require 'pp'
|
11
|
+
|
12
|
+
|
13
|
+
module Slideshow
|
14
|
+
|
15
|
+
VERSION = '0.7'
|
16
|
+
|
17
|
+
class Params
|
18
|
+
|
19
|
+
def initialize( name, headers )
|
20
|
+
@svgname = "#{name}.svg"
|
21
|
+
@cssname = "#{name}.css"
|
22
|
+
@headers = headers
|
23
|
+
end
|
24
|
+
|
25
|
+
def params_binding
|
26
|
+
binding
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
# todo: split (command line) options and headers?
|
32
|
+
# e.g. share (command line) options between slide shows (but not headers?)
|
33
|
+
|
34
|
+
class Opts
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
@hash = {}
|
38
|
+
end
|
39
|
+
|
40
|
+
def put( key, value )
|
41
|
+
key = normalize_key( key )
|
42
|
+
setter = "#{key}=".to_sym
|
43
|
+
|
44
|
+
if respond_to? setter
|
45
|
+
send setter, value
|
46
|
+
else
|
47
|
+
@hash[ key ] = value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def code_theme=( value )
|
52
|
+
@hash[ :code_theme ] = value.tr( '-', '_' )
|
53
|
+
end
|
54
|
+
|
55
|
+
def gradient=( value )
|
56
|
+
put_gradient( value, :theme, :color1, :color2 )
|
57
|
+
end
|
58
|
+
|
59
|
+
def gradient_colors=( value )
|
60
|
+
put_gradient( value, :color1, :color2 )
|
61
|
+
end
|
62
|
+
|
63
|
+
def gradient_color=( value )
|
64
|
+
put_gradient( value, :color1 )
|
65
|
+
end
|
66
|
+
|
67
|
+
def gradient_theme=( value )
|
68
|
+
put_gradient( value, :theme )
|
69
|
+
end
|
70
|
+
|
71
|
+
def []( key )
|
72
|
+
value = @hash[ normalize_key( key ) ]
|
73
|
+
if value.nil?
|
74
|
+
puts "** Warning: header '#{key}' undefined"
|
75
|
+
"- #{key} not found -"
|
76
|
+
else
|
77
|
+
value
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def generate?
|
82
|
+
get_boolean( 'generate', false )
|
83
|
+
end
|
84
|
+
|
85
|
+
def has_includes?
|
86
|
+
@hash[ :include ]
|
87
|
+
end
|
88
|
+
|
89
|
+
def includes
|
90
|
+
# fix: use os-agnostic delimiter (use : for Mac/Unix?)
|
91
|
+
has_includes? ? @hash[ :include ].split( ';' ) : []
|
92
|
+
end
|
93
|
+
|
94
|
+
def s5?
|
95
|
+
get_boolean( 's5', false )
|
96
|
+
end
|
97
|
+
|
98
|
+
def fullerscreen?
|
99
|
+
get_boolean( 'fuller', false ) || get_boolean( 'fullerscreen', false )
|
100
|
+
end
|
101
|
+
|
102
|
+
def code_theme
|
103
|
+
get( 'code-theme', DEFAULTS[ :code_theme ] )
|
104
|
+
end
|
105
|
+
|
106
|
+
def code_line_numbers?
|
107
|
+
get_boolean( 'code-line-numbers', DEFAULTS[ :code_line_numbers ] )
|
108
|
+
end
|
109
|
+
|
110
|
+
def template
|
111
|
+
# todo: change to manifest??
|
112
|
+
# todo: use DEFAULTS??
|
113
|
+
get( 'template', 's6.txt' )
|
114
|
+
end
|
115
|
+
|
116
|
+
DEFAULTS =
|
117
|
+
{
|
118
|
+
:title => 'Untitled Slide Show',
|
119
|
+
:footer => '',
|
120
|
+
:subfooter => '',
|
121
|
+
:gradient_theme => 'dark',
|
122
|
+
:gradient_color1 => 'red',
|
123
|
+
:gradient_color2 => 'black',
|
124
|
+
:code_theme => 'amy',
|
125
|
+
:code_line_numbers => 'true'
|
126
|
+
}
|
127
|
+
|
128
|
+
def set_defaults
|
129
|
+
DEFAULTS.each_pair do | key, value |
|
130
|
+
@hash[ key ] = value if @hash[ key ].nil?
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
def normalize_key( key )
|
137
|
+
key.to_s.downcase.tr('-', '_').to_sym
|
138
|
+
end
|
139
|
+
|
140
|
+
# Assigns the given gradient-* keys to the values in the given string.
|
141
|
+
def put_gradient( string, *keys )
|
142
|
+
values = string.split( ' ' )
|
143
|
+
|
144
|
+
values.zip(keys).each do |v, k|
|
145
|
+
@hash[ normalize_key( "gradient-#{k}" ) ] = v.tr( '-', '_' )
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def get( key, default )
|
150
|
+
@hash.fetch( normalize_key(key), default )
|
151
|
+
end
|
152
|
+
|
153
|
+
def get_boolean( key, default )
|
154
|
+
value = @hash[ normalize_key( key ) ]
|
155
|
+
if value.nil?
|
156
|
+
default
|
157
|
+
else
|
158
|
+
(value == true || value =~ /true|yes|on/i) ? true : false
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
end # class Opts
|
163
|
+
|
164
|
+
|
165
|
+
class Gen
|
166
|
+
|
167
|
+
KNOWN_TEXTILE_EXTNAMES = [ '.textile', '.t' ]
|
168
|
+
KNOWN_MARKDOWN_EXTNAMES = [ '.markdown', '.mark', '.m', '.txt', '.text' ]
|
169
|
+
|
170
|
+
def initialize
|
171
|
+
@logger = Logger.new(STDOUT)
|
172
|
+
@logger.level = Logger::INFO
|
173
|
+
@opts = Opts.new
|
174
|
+
end
|
175
|
+
|
176
|
+
def logger
|
177
|
+
@logger
|
178
|
+
end
|
179
|
+
|
180
|
+
def opts
|
181
|
+
@opts
|
182
|
+
end
|
183
|
+
|
184
|
+
def cache_dir
|
185
|
+
PLATFORM =~ /win32/ ? win32_cache_dir : File.join(File.expand_path("~"), ".slideshow")
|
186
|
+
end
|
187
|
+
|
188
|
+
def win32_cache_dir
|
189
|
+
unless File.exists?(home = ENV['HOMEDRIVE'] + ENV['HOMEPATH'])
|
190
|
+
puts "No HOMEDRIVE or HOMEPATH environment variable. Set one to save a" +
|
191
|
+
"local cache of stylesheets for syntax highlighting and more."
|
192
|
+
return false
|
193
|
+
else
|
194
|
+
return File.join(home, 'slideshow')
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def load_manifest( name )
|
199
|
+
# todo: check if file exists (if yes use custom template package!) - allows you to override builtin package with same name
|
200
|
+
if ['fullerscreen.txt','s5.txt','s6.txt'].include? name
|
201
|
+
templatesdir = "#{File.dirname(__FILE__)}/templates"
|
202
|
+
logger.debug "use builtin template package"
|
203
|
+
logger.debug "templatesdir=#{templatesdir}"
|
204
|
+
filename = "#{templatesdir}/#{name}"
|
205
|
+
else
|
206
|
+
templatesdir = File.dirname( name )
|
207
|
+
logger.debug "use custom template package"
|
208
|
+
logger.debug "templatesdir=#{templatesdir}"
|
209
|
+
filename = name
|
210
|
+
end
|
211
|
+
|
212
|
+
manifest = []
|
213
|
+
puts " Loading template manifest #{filename}..."
|
214
|
+
|
215
|
+
File.open( filename ).readlines.each_with_index do |line,i|
|
216
|
+
case line
|
217
|
+
when /^\s*$/
|
218
|
+
# skip empty lines
|
219
|
+
when /^\s*#.*$/
|
220
|
+
# skip comment lines
|
221
|
+
else
|
222
|
+
puts "line #{i+1}: #{line}"
|
223
|
+
values = line.split( /[ <,+\n]+/ )
|
224
|
+
manifest << values
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
manifest
|
229
|
+
end
|
230
|
+
|
231
|
+
def load_template( name, builtin )
|
232
|
+
|
233
|
+
if opts.has_includes?
|
234
|
+
opts.includes.each do |path|
|
235
|
+
logger.debug "File.exists? #{path}/#{name}"
|
236
|
+
|
237
|
+
if File.exists?( "#{path}/#{name}" ) then
|
238
|
+
puts "Loading custom template #{path}/#{name}..."
|
239
|
+
return File.read( "#{path}/#{name}" )
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
# fallback load builtin template packaged with gem
|
245
|
+
load_builtin_template( builtin )
|
246
|
+
end
|
247
|
+
|
248
|
+
def load_builtin_template( name )
|
249
|
+
templatesdir = "#{File.dirname(__FILE__)}/templates"
|
250
|
+
logger.debug "templatesdir=#{templatesdir}"
|
251
|
+
|
252
|
+
File.read( "#{templatesdir}/#{name}" )
|
253
|
+
end
|
254
|
+
|
255
|
+
def render_template( content, b=TOPLEVEL_BINDING )
|
256
|
+
ERB.new( content ).result( b )
|
257
|
+
end
|
258
|
+
|
259
|
+
|
260
|
+
def create_slideshow_templates
|
261
|
+
|
262
|
+
files =
|
263
|
+
case
|
264
|
+
when opts.s5?
|
265
|
+
[[ 's5/header.html.erb', 'header.html.erb' ],
|
266
|
+
[ 's5/footer.html.erb', 'footer.html.erb' ],
|
267
|
+
[ 's5/style.css.erb', 'style.css.erb' ]]
|
268
|
+
when opts.fullerscreen? # use fullerscreen templates
|
269
|
+
[[ 'header.html.erb', 'header.html.erb' ],
|
270
|
+
[ 'footer.html.erb', 'footer.html.erb' ],
|
271
|
+
[ 'style.css.erb', 'style.css.erb' ]]
|
272
|
+
else # use default s6 templates
|
273
|
+
[[ 's6/header.html.erb', 'header.html.erb' ],
|
274
|
+
[ 's6/footer.html.erb', 'footer.html.erb' ],
|
275
|
+
[ 's6/style.css.erb', 'style.css.erb' ]]
|
276
|
+
end
|
277
|
+
|
278
|
+
# background theming shared between s5/s6/fullerscreen
|
279
|
+
files << [ 'gradient.svg.erb', 'gradient.svg.erb' ]
|
280
|
+
|
281
|
+
files.each do |file|
|
282
|
+
source = "#{File.dirname(__FILE__)}/templates/#{file[0]}"
|
283
|
+
dest = "#{file[1]}"
|
284
|
+
|
285
|
+
puts "Copying '#{source}' to '#{dest}'"
|
286
|
+
File.copy( source, dest )
|
287
|
+
end
|
288
|
+
|
289
|
+
puts "Done."
|
290
|
+
end
|
291
|
+
|
292
|
+
def create_slideshow( fn )
|
293
|
+
|
294
|
+
manifest_name = opts.template
|
295
|
+
puts "manifest_name=#{manifest_name}"
|
296
|
+
manifest = load_manifest( manifest_name )
|
297
|
+
pp manifest
|
298
|
+
return
|
299
|
+
|
300
|
+
if opts.s5?
|
301
|
+
headerdoc = load_template( 'header.html.erb', 's5/header.html.erb' )
|
302
|
+
footerdoc = load_template( 'footer.html.erb', 's5/footer.html.erb' )
|
303
|
+
styledoc = load_template( 'style.css.erb', 's5/style.css.erb' )
|
304
|
+
elsif opts.fullerscreen? # use fullerscreen templates
|
305
|
+
headerdoc = load_template( 'header.html.erb', 'header.html.erb' )
|
306
|
+
footerdoc = load_template( 'footer.html.erb', 'footer.html.erb' )
|
307
|
+
styledoc = load_template( 'style.css.erb', 'style.css.erb' )
|
308
|
+
else # use default s6 templates
|
309
|
+
headerdoc = load_template( 'header.html.erb', 's6/header.html.erb' )
|
310
|
+
footerdoc = load_template( 'footer.html.erb', 's6/footer.html.erb' )
|
311
|
+
styledoc = load_template( 'style.css.erb', 's6/style.css.erb' )
|
312
|
+
end
|
313
|
+
|
314
|
+
# background theming shared between s5/s6/fullerscreen
|
315
|
+
gradientdoc = load_template( 'gradient.svg.erb', 'gradient.svg.erb' )
|
316
|
+
|
317
|
+
basename = File.basename( fn, '.*' )
|
318
|
+
extname = File.extname( fn )
|
319
|
+
|
320
|
+
known_extnames = KNOWN_TEXTILE_EXTNAMES + KNOWN_MARKDOWN_EXTNAMES
|
321
|
+
|
322
|
+
if extname.empty? then
|
323
|
+
extname = ".textile" # default to .textile
|
324
|
+
|
325
|
+
known_extnames.each do |e|
|
326
|
+
logger.debug "File.exists? #{basename}#{e}"
|
327
|
+
if File.exists?( "#{basename}#{e}" ) then
|
328
|
+
extname = e
|
329
|
+
logger.debug "extname=#{extname}"
|
330
|
+
break
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
inname = "#{basename}#{extname}"
|
336
|
+
outname = "#{basename}.html"
|
337
|
+
svgname = "#{basename}.svg"
|
338
|
+
cssname = "#{basename}.css"
|
339
|
+
|
340
|
+
logger.debug "inname=#{inname}"
|
341
|
+
|
342
|
+
content = File.read( inname )
|
343
|
+
|
344
|
+
# todo: read headers before command line options (lets you override options using commandline switch)
|
345
|
+
|
346
|
+
# read source document
|
347
|
+
# strip leading optional headers (key/value pairs) including optional empty lines
|
348
|
+
|
349
|
+
read_headers = true
|
350
|
+
content = ""
|
351
|
+
|
352
|
+
File.open( inname ).readlines.each do |line|
|
353
|
+
if read_headers && line =~ /^\s*(\w[\w-]*)[ \t]*:[ \t]*(.*)/
|
354
|
+
key = $1.downcase
|
355
|
+
value = $2.strip
|
356
|
+
|
357
|
+
logger.debug " adding option: key=>#{key}< value=>#{value}<"
|
358
|
+
opts.put( key, value )
|
359
|
+
elsif line =~ /^\s*$/
|
360
|
+
content << line unless read_headers
|
361
|
+
else
|
362
|
+
read_headers = false
|
363
|
+
content << line
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
# run pre-filters (built-in macros)
|
368
|
+
# o replace {{{ w/ <pre class='code'>
|
369
|
+
# o replace }}} w/ </pre>
|
370
|
+
content.gsub!( "{{{{{{", "<pre class='code'>_S9BEGIN_" )
|
371
|
+
content.gsub!( "}}}}}}", "_S9END_</pre>" )
|
372
|
+
content.gsub!( "{{{", "<pre class='code'>" )
|
373
|
+
content.gsub!( "}}}", "</pre>" )
|
374
|
+
# restore escaped {{{}}} I'm sure there's a better way! Rubyize this! Anyone?
|
375
|
+
content.gsub!( "_S9BEGIN_", "{{{" )
|
376
|
+
content.gsub!( "_S9END_", "}}}" )
|
377
|
+
|
378
|
+
opts.set_defaults
|
379
|
+
|
380
|
+
params = Params.new( basename, opts )
|
381
|
+
|
382
|
+
puts "Preparing slideshow theme '#{svgname}'..."
|
383
|
+
|
384
|
+
out = File.new( svgname, "w+" )
|
385
|
+
out << render_template( gradientdoc, params.params_binding )
|
386
|
+
out.flush
|
387
|
+
out.close
|
388
|
+
|
389
|
+
puts "Preparing slideshow '#{outname}'..."
|
390
|
+
|
391
|
+
# convert light-weight markup to hypertext
|
392
|
+
|
393
|
+
if KNOWN_MARKDOWN_EXTNAMES.include?( extname )
|
394
|
+
content = Maruku.new( content, {:on_error => :raise} ).to_html
|
395
|
+
# old code: content = BlueCloth.new( content ).to_html
|
396
|
+
else
|
397
|
+
# turn off hard line breaks
|
398
|
+
# turn off span caps (see http://rubybook.ca/2008/08/16/redcloth)
|
399
|
+
red = RedCloth.new( content, [:no_span_caps] )
|
400
|
+
red.hard_breaks = false
|
401
|
+
content = red.to_html
|
402
|
+
end
|
403
|
+
|
404
|
+
|
405
|
+
# post-processing
|
406
|
+
|
407
|
+
slide_counter = 0
|
408
|
+
content2 = ''
|
409
|
+
|
410
|
+
# wrap h1's in slide divs; note use just <h1 since some processors add ids e.g. <h1 id='x'>
|
411
|
+
content.each_line do |line|
|
412
|
+
if line.include?( '<h1' ) then
|
413
|
+
content2 << "\n\n</div>" if slide_counter > 0
|
414
|
+
content2 << "<div class='slide'>\n\n"
|
415
|
+
slide_counter += 1
|
416
|
+
end
|
417
|
+
content2 << line
|
418
|
+
end
|
419
|
+
content2 << "\n\n</div>" if slide_counter > 0
|
420
|
+
|
421
|
+
## todo: run syntax highlighting before markup/textilize? lets us add textile to highlighted code?
|
422
|
+
## avoid undoing escaped entities?
|
423
|
+
|
424
|
+
include_code_stylesheet = false
|
425
|
+
# syntax highlight code
|
426
|
+
# todo: can the code handle escaped entities? e.g. >
|
427
|
+
doc = Hpricot(content2)
|
428
|
+
doc.search("pre.code, pre > code").each do |e|
|
429
|
+
if e.inner_html =~ /^\s*#!(\w+)/
|
430
|
+
lang = $1.downcase
|
431
|
+
if e.inner_html =~ /^\{\{\{/ # {{{ assumes escape/literal #!lang
|
432
|
+
# do nothing; next
|
433
|
+
logger.debug " skipping syntax highlighting using lang=#{lang}; assumimg escaped literal"
|
434
|
+
else
|
435
|
+
logger.debug " syntax highlighting using lang=#{lang}"
|
436
|
+
if Uv.syntaxes.include?(lang)
|
437
|
+
code = e.inner_html.sub(/^\s*#!\w+/, '').strip
|
438
|
+
|
439
|
+
code.gsub!( "<", "<" )
|
440
|
+
code.gsub!( ">", ">" )
|
441
|
+
code.gsub!( "&", "&" )
|
442
|
+
# todo: missing any other entities? use CGI::unescapeHTML?
|
443
|
+
logger.debug "code=>#{code}<"
|
444
|
+
|
445
|
+
code_highlighted = Uv.parse( code, "xhtml", lang, opts.code_line_numbers?, opts.code_theme )
|
446
|
+
# old code: e.inner_html = code_highlighted
|
447
|
+
# todo: is it ok to replace the pre.code enclosing element to avoid duplicates?
|
448
|
+
e.swap( code_highlighted )
|
449
|
+
include_code_stylesheet = true
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
content2 = doc.to_s
|
456
|
+
|
457
|
+
|
458
|
+
out = File.new( outname, "w+" )
|
459
|
+
out << render_template( headerdoc, params.params_binding )
|
460
|
+
out << content2
|
461
|
+
out << render_template( footerdoc, params.params_binding )
|
462
|
+
out.flush
|
463
|
+
out.close
|
464
|
+
|
465
|
+
puts "Preparing slideshow stylesheet '#{cssname}'..."
|
466
|
+
|
467
|
+
out = File.new( cssname, "w+" )
|
468
|
+
out << render_template( styledoc, params.params_binding )
|
469
|
+
|
470
|
+
if include_code_stylesheet
|
471
|
+
logger.debug "cache_dir=#{cache_dir}"
|
472
|
+
|
473
|
+
FileUtils.mkdir(cache_dir) unless File.exists?(cache_dir) if cache_dir
|
474
|
+
Uv.copy_files "xhtml", cache_dir
|
475
|
+
|
476
|
+
theme = opts.code_theme
|
477
|
+
|
478
|
+
theme_content = File.read( "#{cache_dir}/css/#{theme}.css" )
|
479
|
+
|
480
|
+
out << "/* styles for code syntax highlighting theme '#{theme}' */\n"
|
481
|
+
out << "\n"
|
482
|
+
out << theme_content
|
483
|
+
end
|
484
|
+
|
485
|
+
out.flush
|
486
|
+
out.close
|
487
|
+
|
488
|
+
|
489
|
+
if opts.s5?
|
490
|
+
# copy s5 machinery to s5 folder
|
491
|
+
# todo/fix: is there a better way to check if the dir exists?
|
492
|
+
Dir.mkdir( 's5' ) unless File.directory?( 's5' )
|
493
|
+
|
494
|
+
[ 'opera.css', 'outline.css', 'print.css', 's5-core.css', 'slides.js' ].each do |name|
|
495
|
+
|
496
|
+
source = "#{File.dirname(__FILE__)}/templates/s5/#{name}"
|
497
|
+
dest = "s5/#{name}"
|
498
|
+
|
499
|
+
logger.debug "copying '#{source} ' to '#{dest}'"
|
500
|
+
File.copy( source, dest )
|
501
|
+
end
|
502
|
+
elsif opts.fullerscreen?
|
503
|
+
# do nothing; slideshow machinery built into plugin (requires install!)
|
504
|
+
else
|
505
|
+
# copy s6 machinery to s6 folder
|
506
|
+
Dir.mkdir( 's6' ) unless File.directory?( 's6' )
|
507
|
+
|
508
|
+
[ 'outline.css', 'print.css', 'slides.css', 'slides.js', 'jquery.js' ].each do |name|
|
509
|
+
|
510
|
+
source = "#{File.dirname(__FILE__)}/templates/s6/#{name}"
|
511
|
+
dest = "s6/#{name}"
|
512
|
+
|
513
|
+
logger.debug "copying '#{source} ' to '#{dest}'"
|
514
|
+
File.copy( source, dest )
|
515
|
+
end
|
516
|
+
end
|
517
|
+
|
518
|
+
puts "Done."
|
519
|
+
end
|
520
|
+
|
521
|
+
|
522
|
+
def run( args )
|
523
|
+
|
524
|
+
opt=OptionParser.new do |cmd|
|
525
|
+
|
526
|
+
cmd.banner = "Usage: slideshow [options] name"
|
527
|
+
|
528
|
+
#todo/fix: use -s5 option without optional hack? possible with OptionParser package/lib?
|
529
|
+
# use -5 switch instead?
|
530
|
+
# todo: set template (manifest) to s5
|
531
|
+
cmd.on( '-s[OPTIONAL]', '--s5', 'S5 Compatible Slide Show' ) { opts.put( 's5', true ) }
|
532
|
+
# todo: set template (manifest) to fullerscreen
|
533
|
+
cmd.on( '-f[OPTIONAL]', '--fullerscreen', 'FullerScreen Compatible Slide Show' ) { opts.put( 'fuller', true ) }
|
534
|
+
# opts.on( "-s", "--style STYLE", "Select Stylesheet" ) { |s| $options[:style]=s }
|
535
|
+
# opts.on( "-v", "--version", "Show version" ) {}
|
536
|
+
|
537
|
+
cmd.on( '-g', '--generate', 'Generate Slide Show Templates' ) { opts.put( 'generate', true ) }
|
538
|
+
# use -d or -o to select output directory for slideshow or slideshow templates?
|
539
|
+
# cmd.on( '-d', '--directory DIRECTORY', 'Output Directory' ) { |s| opts.put( 'directory', s ) }
|
540
|
+
cmd.on( '-i', '--include PATH', 'Load Path' ) { |s| opts.put( 'include', s ) }
|
541
|
+
|
542
|
+
# todo: find different letter for debug trace switch (use v for version?)
|
543
|
+
cmd.on( "-v", "--verbose", "Show debug trace" ) {
|
544
|
+
logger.datetime_format = "%H:%H:%S"
|
545
|
+
logger.level = Logger::DEBUG
|
546
|
+
}
|
547
|
+
|
548
|
+
cmd.on( "-t", "--template TEMPLATE", "Template Manifest" ) do |t|
|
549
|
+
# todo: do some checks on passed in template argument
|
550
|
+
puts "Using template #{t}"
|
551
|
+
opts.put( 'template', t )
|
552
|
+
end
|
553
|
+
|
554
|
+
cmd.on_tail( "-h", "--help", "Show this message" ) {
|
555
|
+
puts
|
556
|
+
puts "Slide Show (S9) is a free web alternative to PowerPoint or KeyNote in Ruby"
|
557
|
+
puts
|
558
|
+
puts cmd.help
|
559
|
+
puts
|
560
|
+
puts "Examples:"
|
561
|
+
puts " slideshow microformats"
|
562
|
+
puts " slideshow microformats.textile"
|
563
|
+
puts " slideshow -s5 microformats # S5 compatible"
|
564
|
+
puts " slideshow -f microformats # FullerScreen compatible"
|
565
|
+
puts
|
566
|
+
puts "More examles:"
|
567
|
+
puts " slideshow -g # Generate slide show templates"
|
568
|
+
puts " slideshow -g -s5 # Generate S5 compatible slide show templates"
|
569
|
+
puts " slideshow -g -f # Generate FullerScreen compatible slide show templates"
|
570
|
+
puts
|
571
|
+
puts " slideshow -i . microformats # Use slide show templates in path ."
|
572
|
+
puts " slideshow -i . -s5 microformats # Use S5 compatible slide show templates in path ."
|
573
|
+
puts
|
574
|
+
puts "Further information:"
|
575
|
+
puts " http://slideshow.rubyforge.org"
|
576
|
+
exit
|
577
|
+
}
|
578
|
+
end
|
579
|
+
|
580
|
+
opt.parse!( args )
|
581
|
+
|
582
|
+
puts "Slide Show (S9) Version: #{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
583
|
+
|
584
|
+
if opts.generate?
|
585
|
+
create_slideshow_templates
|
586
|
+
else
|
587
|
+
args.each { |fn| create_slideshow( fn ) }
|
588
|
+
end
|
589
|
+
end
|
590
|
+
|
591
|
+
end # class Gen
|
592
|
+
|
593
|
+
def Slideshow.main
|
594
|
+
Gen.new.run(ARGV)
|
595
|
+
end
|
596
|
+
|
597
|
+
end # module Slideshow
|
598
|
+
|
599
|
+
Slideshow.main if __FILE__ == $0
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# FullerScreen template package manifest sample
|
2
|
+
# Change as desired/needed
|
3
|
+
#
|
4
|
+
# Questions? Comments?
|
5
|
+
# Send them along to the Free Web Slide Show Alternatives (S5, S6, S9 And Friends) Forum/Mailing List.
|
6
|
+
# http://groups.google.com/group/webslideshow
|
7
|
+
|
8
|
+
__file__.html header.html.erb + footer.html.erb
|
9
|
+
__file__.svg gradient.svg.erb
|
10
|
+
__file__.css style.css.erb
|
11
|
+
|
@@ -7,14 +7,14 @@
|
|
7
7
|
|
8
8
|
<title><%= @headers['title'] %></title>
|
9
9
|
|
10
|
-
<link title="Style" href="<%= @
|
10
|
+
<link title="Style" href="<%= "#{@name}.css" %>" type="text/css" rel="STYLESHEET">
|
11
11
|
|
12
12
|
</head>
|
13
13
|
<body>
|
14
14
|
|
15
15
|
<div class="layout">
|
16
16
|
<div class="background">
|
17
|
-
<object data="<%= @
|
17
|
+
<object data="<%= "#{@name}.svg" %>" width="100%" height="100%"></object>
|
18
18
|
</div>
|
19
19
|
</div>
|
20
20
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# S5 manifest to generate sample template package from builtin templates
|
2
|
+
|
3
|
+
s5.txt s5.txt.sample
|
4
|
+
gradient.svg.erb
|
5
|
+
header.html.erb s5/header.html.erb
|
6
|
+
footer.html.erb s5/footer.html.erb
|
7
|
+
style.html.erb s5/style.css.erb
|
8
|
+
s5/opera.css
|
9
|
+
s5/outline.css
|
10
|
+
s5/print.css
|
11
|
+
s5/s5-core.css
|
12
|
+
s5/slides.js
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# S5 template package manifest sample
|
2
|
+
# Change as desired/needed
|
3
|
+
#
|
4
|
+
# Questions? Comments?
|
5
|
+
# Send them along to the Free Web Slide Show Alternatives (S5, S6, S9 And Friends) Forum/Mailing List.
|
6
|
+
# http://groups.google.com/group/webslideshow
|
7
|
+
|
8
|
+
__file__.svg gradient.svg.erb
|
9
|
+
__file__.html header.html.erb + footer.html.erb
|
10
|
+
__file__.css style.css.erb
|
11
|
+
s5/opera.css
|
12
|
+
s5/outline.css
|
13
|
+
s5/print.css
|
14
|
+
s5/s5-core.css
|
15
|
+
s5/slides.js
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<meta name="defaultView" content="slideshow" />
|
9
9
|
<meta name="controlVis" content="hidden" />
|
10
10
|
<!-- style sheet links -->
|
11
|
-
<link rel="stylesheet" href="<%= @
|
11
|
+
<link rel="stylesheet" href="<%= "#{@name}.css" %>" type="text/css" media="projection" id="slideProj" />
|
12
12
|
<link rel="stylesheet" href="s5/outline.css" type="text/css" media="screen" id="outlineStyle" />
|
13
13
|
<link rel="stylesheet" href="s5/print.css" type="text/css" media="print" id="slidePrint" />
|
14
14
|
<link rel="stylesheet" href="s5/opera.css" type="text/css" media="projection" id="operaFix" />
|
@@ -23,7 +23,7 @@
|
|
23
23
|
<div class="layout">
|
24
24
|
|
25
25
|
<div class="background">
|
26
|
-
<object data="<%= @
|
26
|
+
<object data="<%= "#{@name}.svg" %>" width="100%" height="100%"></object>
|
27
27
|
</div>
|
28
28
|
|
29
29
|
<div id="controls"><!-- DO NOT EDIT --></div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# S6 manifest to generate sample template package from builtin templates
|
2
|
+
|
3
|
+
s6.txt s6.txt.sample
|
4
|
+
gradient.svg.erb
|
5
|
+
header.html.erb s6/header.html.erb
|
6
|
+
footer.html.erb s6/footer.html.erb
|
7
|
+
style.css.erb s6/style.css.erb
|
8
|
+
s6/jquery.js
|
9
|
+
s6/outline.css
|
10
|
+
s6/print.css
|
11
|
+
s6/slides.css
|
12
|
+
s6/slides.js
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# S6 template package manifest sample
|
2
|
+
# Change as desired/needed
|
3
|
+
#
|
4
|
+
# Questions? Comments?
|
5
|
+
# Send them along to the Free Web Slide Show Alternatives (S5, S6, S9 And Friends) Forum/Mailing List.
|
6
|
+
# http://groups.google.com/group/webslideshow
|
7
|
+
|
8
|
+
__file__.svg gradient.svg.erb
|
9
|
+
__file__.html header.html.erb + footer.html.erb
|
10
|
+
__file__.css style.css.erb
|
11
|
+
s6/jquery.js
|
12
|
+
s6/outline.css
|
13
|
+
s6/print.css
|
14
|
+
s6/slides.css
|
15
|
+
s6/slides.js
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<!-- configuration parameters -->
|
8
8
|
<meta name="defaultView" content="slideshow" />
|
9
9
|
<!-- style sheet links -->
|
10
|
-
<link rel="stylesheet" href="<%= @
|
10
|
+
<link rel="stylesheet" href="<%= "#{@name}.css" %>" type="text/css" media="projection" id="slideProj" />
|
11
11
|
<link rel="stylesheet" href="s6/outline.css" type="text/css" media="screen" id="outlineStyle" />
|
12
12
|
<link rel="stylesheet" href="s6/print.css" type="text/css" media="print" id="slidePrint" />
|
13
13
|
|
@@ -22,7 +22,7 @@
|
|
22
22
|
<div class="layout">
|
23
23
|
|
24
24
|
<div class="background">
|
25
|
-
<object data="<%= @
|
25
|
+
<object data="<%= "#{@name}.svg" %>" width="100%" height="100%">
|
26
26
|
</object>
|
27
27
|
</div>
|
28
28
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slideshow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: "0.7"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
@@ -9,11 +9,12 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-01-26 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: RedCloth
|
17
|
+
type: :runtime
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
@@ -23,6 +24,7 @@ dependencies:
|
|
23
24
|
version:
|
24
25
|
- !ruby/object:Gem::Dependency
|
25
26
|
name: maruku
|
27
|
+
type: :runtime
|
26
28
|
version_requirement:
|
27
29
|
version_requirements: !ruby/object:Gem::Requirement
|
28
30
|
requirements:
|
@@ -32,6 +34,7 @@ dependencies:
|
|
32
34
|
version:
|
33
35
|
- !ruby/object:Gem::Dependency
|
34
36
|
name: hpricot
|
37
|
+
type: :runtime
|
35
38
|
version_requirement:
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
@@ -41,6 +44,7 @@ dependencies:
|
|
41
44
|
version:
|
42
45
|
- !ruby/object:Gem::Dependency
|
43
46
|
name: ultraviolet
|
47
|
+
type: :runtime
|
44
48
|
version_requirement:
|
45
49
|
version_requirements: !ruby/object:Gem::Requirement
|
46
50
|
requirements:
|
@@ -58,8 +62,12 @@ extra_rdoc_files: []
|
|
58
62
|
|
59
63
|
files:
|
60
64
|
- lib/slideshow.rb
|
65
|
+
- lib/slideshow.v6.rb
|
61
66
|
- lib/templates
|
62
67
|
- lib/templates/footer.html.erb
|
68
|
+
- lib/templates/fullerscreen.txt
|
69
|
+
- lib/templates/fullerscreen.txt.gen
|
70
|
+
- lib/templates/fullerscreen.txt.sample
|
63
71
|
- lib/templates/gradient.svg.erb
|
64
72
|
- lib/templates/header.html.erb
|
65
73
|
- lib/templates/s5
|
@@ -71,6 +79,9 @@ files:
|
|
71
79
|
- lib/templates/s5/s5-core.css
|
72
80
|
- lib/templates/s5/slides.js
|
73
81
|
- lib/templates/s5/style.css.erb
|
82
|
+
- lib/templates/s5.txt
|
83
|
+
- lib/templates/s5.txt.gen
|
84
|
+
- lib/templates/s5.txt.sample
|
74
85
|
- lib/templates/s6
|
75
86
|
- lib/templates/s6/footer.html.erb
|
76
87
|
- lib/templates/s6/header.html.erb
|
@@ -80,6 +91,9 @@ files:
|
|
80
91
|
- lib/templates/s6/slides.css
|
81
92
|
- lib/templates/s6/slides.js
|
82
93
|
- lib/templates/s6/style.css.erb
|
94
|
+
- lib/templates/s6.txt
|
95
|
+
- lib/templates/s6.txt.gen
|
96
|
+
- lib/templates/s6.txt.sample
|
83
97
|
- lib/templates/style.css.erb
|
84
98
|
- bin/slideshow
|
85
99
|
has_rdoc: false
|
@@ -104,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
118
|
requirements: []
|
105
119
|
|
106
120
|
rubyforge_project: slideshow
|
107
|
-
rubygems_version: 1.
|
121
|
+
rubygems_version: 1.3.1
|
108
122
|
signing_key:
|
109
123
|
specification_version: 2
|
110
124
|
summary: Slide Show (S9) - A Free Web Alternative to PowerPoint and KeyNote in Ruby
|