slideshow 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
data/lib/slideshow.rb CHANGED
@@ -51,7 +51,7 @@ require 'slideshow/filters/slide_filter'
51
51
 
52
52
  module Slideshow
53
53
 
54
- VERSION = '0.9.3'
54
+ VERSION = '0.9.4'
55
55
 
56
56
  # version string for generator meta tag (includes ruby version)
57
57
  def Slideshow.generator
@@ -28,8 +28,34 @@ class Config
28
28
 
29
29
  # for now builtin has no erb processing; add builtin hash to main hash
30
30
  @hash[ 'builtin' ] = YAML.load_file( config_builtin_file )
31
+
32
+ # todo/fix: merge config files
33
+ # check more locations
34
+
35
+ # check for user settings in working folder (check for slideshow.yml)
36
+
37
+ config_user_file = "./slideshow.yml"
38
+ if File.exists?( config_user_file )
39
+ puts "Loading settings from '#{config_user_file}'..."
40
+ @hash[ 'user' ] = YAML.load_file( config_user_file )
41
+ end
42
+
31
43
  end
32
44
 
45
+ def markdown_to_html_method( lib )
46
+ method = @hash.fetch( 'user', {} ).fetch( lib, {} ).fetch( 'converter', nil )
47
+
48
+ # use default name
49
+ if method.nil?
50
+ method = "#{lib.downcase}_to_html"
51
+ end
52
+
53
+ method.tr('-','_').to_sym
54
+ end
55
+
56
+ def markdown_post_processing?( lib )
57
+ @hash.fetch( 'user', {} ).fetch( lib, {} ).fetch( 'post-processing', true )
58
+ end
33
59
 
34
60
  def known_textile_extnames
35
61
  # returns an array of known file extensions e.g.
@@ -39,18 +65,21 @@ class Config
39
65
  # textile:
40
66
  # extnames: [ .textile, .t ]
41
67
 
42
- (@hash[ 'textile' ][ 'extnames' ] || []) + @hash[ 'builtin' ][ 'textile' ][ 'extnames' ]
68
+ @hash[ 'textile' ][ 'extnames' ] + @hash[ 'builtin' ][ 'textile' ][ 'extnames' ]
43
69
  end
44
70
 
45
71
  def known_markdown_extnames
46
- (@hash[ 'markdown' ][ 'extnames' ] || []) + @hash[ 'builtin' ][ 'markdown' ][ 'extnames' ]
72
+ @hash[ 'markdown' ][ 'extnames' ] + @hash[ 'builtin' ][ 'markdown' ][ 'extnames' ]
47
73
  end
48
74
 
49
75
  def known_markdown_libs
50
76
  # returns an array of known markdown engines e.g.
51
77
  # [ pandoc-ruby, rdiscount, rpeg-markdown, maruku, bluecloth, kramdown ]
52
78
 
53
- (@hash[ 'markdown' ][ 'libs' ] || []) + @hash[ 'builtin' ][ 'markdown' ][ 'libs' ]
79
+ libs = @hash[ 'markdown' ][ 'libs' ] + @hash[ 'builtin' ][ 'markdown' ][ 'libs' ]
80
+ user_libs = @hash.fetch( 'user', {} ).fetch( 'markdown', {} ).fetch( 'libs', [] )
81
+
82
+ user_libs + libs
54
83
  end
55
84
 
56
85
  def known_extnames
@@ -61,11 +90,11 @@ class Config
61
90
  end
62
91
 
63
92
  def text_filters
64
- @hash[ 'builtin' ][ 'filters' ] + ( @hash[ 'filters' ] || [] )
93
+ @hash[ 'builtin' ][ 'filters' ] + @hash[ 'filters' ]
65
94
  end
66
95
 
67
96
  def helper_renames
68
- @hash[ 'builtin' ][ 'helper' ][ 'renames' ] + ( @hash[ 'helper' ][ 'renames' ] || [] )
97
+ @hash[ 'builtin' ][ 'helper' ][ 'renames' ] + @hash[ 'helper' ][ 'renames' ]
69
98
  end
70
99
 
71
100
  def helper_unparsed
@@ -76,7 +105,7 @@ class Config
76
105
  def helper_exprs
77
106
  # allow expression as directives (no need for %end block)
78
107
  # by default directives are assumed statements (e.g. %mydir %end)
79
- @hash[ 'builtin' ][ 'helper' ][ 'exprs' ] + ( @hash[ 'helper' ][ 'exprs' ] || [] )
108
+ @hash[ 'builtin' ][ 'helper' ][ 'exprs' ] + @hash[ 'helper' ][ 'exprs' ]
80
109
  end
81
110
 
82
111
  def google_analytics_code
@@ -1,6 +1,7 @@
1
1
  module Slideshow
2
2
  module SlideFilter
3
3
 
4
+
4
5
  # add slide directive before h1 (tells slideshow gem where to break slides)
5
6
  #
6
7
  # e.g. changes:
@@ -17,7 +17,7 @@ def directives_bang_style_to_percent_style( content )
17
17
 
18
18
  content.gsub!(/^!(#{unparsed})(.*)$/) do |match|
19
19
  bang_count += 1
20
- "<%= #{$1.downcase} '#{$2}' %>"
20
+ "<%= #{$1.downcase} '#{$2 ? $2 : ''}' %>"
21
21
  end
22
22
 
23
23
  puts " Patching !-directives (#{bang_count} #{config.helper_unparsed.join('/')}-directives)..."
data/lib/slideshow/gen.rb CHANGED
@@ -40,11 +40,12 @@ class Gen
40
40
  def markdown_to_html( content )
41
41
  # call markdown filter; turn markdown lib name into method_name (mn)
42
42
  # eg. rpeg-markdown => rpeg_markdown_to_html
43
+
44
+ # lets you use differnt options/converters for a single markdown lib
45
+ mn = config.markdown_to_html_method( @markdown_libs.first )
46
+
47
+ puts " Converting Markdown-text (#{content.length} bytes) to HTML using library '#{@markdown_libs.first}' calling '#{mn}'..."
43
48
 
44
- puts " Converting Markdown-text (#{content.length} bytes) to HTML using library '#{@markdown_libs.first}'..."
45
-
46
- mn = @markdown_libs.first.downcase.tr( '-', '_' )
47
- mn = "#{mn}_to_html".to_sym
48
49
  send mn, content # call 1st configured markdown engine e.g. kramdown_to_html( content )
49
50
  end
50
51
 
@@ -424,6 +425,93 @@ class Gen
424
425
  end
425
426
  end
426
427
 
428
+ # move into a filter??
429
+ def post_processing_slides( content )
430
+
431
+ # 1) add slide break
432
+
433
+ if @markup_type == :markdown && @markdown_libs.first == 'pandoc-ruby'
434
+ content = add_slide_directive_before_div_h1( content )
435
+ else
436
+ content = add_slide_directive_before_h1( content )
437
+ end
438
+
439
+ dump_content_to_file_debug_html( content )
440
+
441
+ # 2) use generic slide break processing instruction to
442
+ # split content into slides
443
+
444
+ slide_counter = 0
445
+
446
+ slides = []
447
+ slide_source = ""
448
+
449
+ content.each_line do |line|
450
+ if line.include?( '<!-- _S9SLIDE_' ) then
451
+ if slide_counter > 0 then # found start of new slide (and, thus, end of last slide)
452
+ slides << slide_source # add slide to slide stack
453
+ slide_source = "" # reset slide source buffer
454
+ end
455
+ slide_counter += 1
456
+ end
457
+ slide_source << line
458
+ end
459
+
460
+ if slide_counter > 0 then
461
+ slides << slide_source # add slide to slide stack
462
+ slide_source = "" # reset slide source buffer
463
+ end
464
+
465
+ ## split slide source into header (optional) and content/body
466
+ ## plus check for (css style) classes
467
+
468
+ slides2 = []
469
+ slides.each do |slide_source|
470
+ slide = Slide.new
471
+
472
+ ## check for css style classes
473
+ from = 0
474
+ while (pos = slide_source.index( /<!-- _S9(SLIDE|STYLE)_(.*?)-->/m, from ))
475
+ logger.debug " adding css classes from pi #{$1.downcase}: #{$2.strip}"
476
+
477
+ if slide.classes.nil?
478
+ slide.classes = $2.strip
479
+ else
480
+ slide.classes << " #{$2.strip}"
481
+ end
482
+
483
+ from = Regexp.last_match.end(0)
484
+ end
485
+
486
+ # try to cut off header using non-greedy .+? pattern; tip test regex online at rubular.com
487
+ # note/fix: needs to get improved to also handle case for h1 wrapped into div
488
+ # (e.g. extract h1 - do not assume it starts slide source)
489
+ if slide_source =~ /^\s*(<h1.*?>.*?<\/h\d>)\s*(.*)/m
490
+ slide.header = $1
491
+ slide.content = ($2 ? $2 : "")
492
+ logger.debug " adding slide with header:\n#{slide.header}"
493
+ else
494
+ slide.content = slide_source
495
+ logger.debug " adding slide with *no* header:\n#{slide.content}"
496
+ end
497
+ slides2 << slide
498
+ end
499
+
500
+ # for convenience create a string w/ all in-one-html
501
+ # no need to wrap slides in divs etc.
502
+
503
+ content2 = ""
504
+ slides2.each do |slide|
505
+ content2 << slide.to_classic_html
506
+ end
507
+
508
+ # make content2 and slide2 available to erb template
509
+ # -- todo: cleanup variable names and use attr_readers for content and slide
510
+
511
+ @slides = slides2 # strutured content
512
+ @content = content2 # content all-in-one
513
+ end
514
+
427
515
 
428
516
  def create_slideshow( fn )
429
517
 
@@ -524,89 +612,17 @@ class Gen
524
612
 
525
613
  # post-processing
526
614
 
527
- # 1) add slide break
615
+ # make content2 and slide2 available to erb template
616
+ # -- todo: cleanup variable names and use attr_readers for content and slide
528
617
 
529
- if @markup_type == :markdown && @markdown_libs.first == 'pandoc-ruby'
530
- content = add_slide_directive_before_div_h1( content )
618
+ if @markup_type == :markdown && config.markdown_post_processing?( @markdown_libs.first ) == false
619
+ puts " Skipping post-processing (passing content through as is)..."
620
+ @content = content # content all-in-one - make it available in erb templates
531
621
  else
532
- content = add_slide_directive_before_h1( content )
622
+ # sets @content (all-in-one string) and @slides (structured content; split into slides)
623
+ post_processing_slides( content )
533
624
  end
534
625
 
535
- dump_content_to_file_debug_html( content )
536
-
537
- # 2) use generic slide break processing instruction to
538
- # split content into slides
539
-
540
- slide_counter = 0
541
-
542
- slides = []
543
- slide_source = ""
544
-
545
- content.each_line do |line|
546
- if line.include?( '<!-- _S9SLIDE_' ) then
547
- if slide_counter > 0 then # found start of new slide (and, thus, end of last slide)
548
- slides << slide_source # add slide to slide stack
549
- slide_source = "" # reset slide source buffer
550
- end
551
- slide_counter += 1
552
- end
553
- slide_source << line
554
- end
555
-
556
- if slide_counter > 0 then
557
- slides << slide_source # add slide to slide stack
558
- slide_source = "" # reset slide source buffer
559
- end
560
-
561
- ## split slide source into header (optional) and content/body
562
- ## plus check for (css style) classes
563
-
564
- slides2 = []
565
- slides.each do |slide_source|
566
- slide = Slide.new
567
-
568
- ## check for css style classes
569
- from = 0
570
- while (pos = slide_source.index( /<!-- _S9(SLIDE|STYLE)_(.*?)-->/m, from ))
571
- logger.debug " adding css classes from pi #{$1.downcase}: #{$2.strip}"
572
-
573
- if slide.classes.nil?
574
- slide.classes = $2.strip
575
- else
576
- slide.classes << " #{$2.strip}"
577
- end
578
-
579
- from = Regexp.last_match.end(0)
580
- end
581
-
582
- # try to cut off header using non-greedy .+? pattern; tip test regex online at rubular.com
583
- # note/fix: needs to get improved to also handle case for h1 wrapped into div
584
- # (e.g. extract h1 - do not assume it starts slide source)
585
- if slide_source =~ /^\s*(<h1.*?>.*?<\/h\d>)\s*(.*)/m
586
- slide.header = $1
587
- slide.content = ($2 ? $2 : "")
588
- logger.debug " adding slide with header:\n#{slide.header}"
589
- else
590
- slide.content = slide_source
591
- logger.debug " adding slide with *no* header:\n#{slide.content}"
592
- end
593
- slides2 << slide
594
- end
595
-
596
- # for convenience create a string w/ all in-one-html
597
- # no need to wrap slides in divs etc.
598
-
599
- content2 = ""
600
- slides2.each do |slide|
601
- content2 << slide.to_classic_html
602
- end
603
-
604
- # make content2 and slide2 available to erb template
605
- # -- todo: cleanup variable names and use attr_readers for content and slide
606
-
607
- @slides = slides2 # strutured content
608
- @content = content2 # content all-in-one
609
-
610
626
 
611
627
  manifest.each do |entry|
612
628
  outname = entry[0]
@@ -3,7 +3,31 @@ module Slideshow
3
3
 
4
4
  def pandoc_ruby_to_html( content )
5
5
  content = PandocRuby.new( content, :from => :markdown, :to => :html ).convert
6
- content.gsub( /class="incremental"/, 'class="step"' )
6
+ end
7
+
8
+ def pandoc_ruby_to_html_incremental( content )
9
+ content = PandocRuby.new( content, :from => :markdown, :to => :html ).convert
10
+ content = content.gsub(/<(ul|ol)/) do |match|
11
+ "#{Regexp.last_match(0)} class='step'"
12
+ end
13
+ content
14
+ end
15
+
16
+ # sample how to use your own converter
17
+ # configure in slideshow.yml
18
+ # pandoc-ruby:
19
+ # converter: pandoc-ruby-to-s5
20
+
21
+ def pandoc_ruby_to_s5( content )
22
+ content = PandocRuby.new( content, {:from => :markdown, :to => :s5}, :smart ).convert
23
+ content = content.gsub(/class="incremental"/,'class="step"')
24
+ # content = content.to_a[13..-1].join # remove the layout div
25
+ end
26
+
27
+ def pandoc_ruby_to_s5_incremental( content )
28
+ content = PandocRuby.new( content, {:from => :markdown, :to => :s5 }, :incremental, :smart ).convert
29
+ content = content.gsub(/class="incremental"/,'class="step"')
30
+ # content = content.to_a[13..-1].join # remove the layout div
7
31
  end
8
32
 
9
33
  def rdiscount_to_html( content )
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slideshow
3
3
  version: !ruby/object:Gem::Version
4
- hash: 61
4
+ hash: 51
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 3
10
- version: 0.9.3
9
+ - 4
10
+ version: 0.9.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gerald Bauer
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-13 00:00:00 +02:00
18
+ date: 2010-07-14 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency