slideshow-models 2.5.0 → 3.0.0

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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +45 -37
  3. data/README.md +3 -2
  4. data/Rakefile +3 -5
  5. data/config/slideshow.yml +7 -14
  6. data/lib/slideshow/commands/fetch.rb +2 -4
  7. data/lib/slideshow/commands/gen.rb +57 -161
  8. data/lib/slideshow/commands/list.rb +2 -4
  9. data/lib/slideshow/commands/plugins.rb +2 -4
  10. data/lib/slideshow/commands/quick.rb +5 -8
  11. data/lib/slideshow/config.rb +11 -50
  12. data/lib/slideshow/drops.rb +35 -0
  13. data/lib/slideshow/filters/debug_filter.rb +3 -3
  14. data/lib/slideshow/filters/slide_filter.rb +1 -67
  15. data/lib/slideshow/filters/text_filter.rb +1 -18
  16. data/lib/slideshow/helpers/background_helper.rb +1 -0
  17. data/lib/slideshow/helpers/step_helper.rb +1 -1
  18. data/lib/slideshow/manifest_helpers.rb +4 -0
  19. data/lib/slideshow/markdown.rb +27 -0
  20. data/lib/slideshow/models.rb +9 -13
  21. data/lib/slideshow/models/deck.rb +188 -0
  22. data/lib/slideshow/{slide.rb → models/slide.rb} +9 -4
  23. data/lib/slideshow/opts.rb +117 -0
  24. data/lib/slideshow/version.rb +2 -2
  25. data/test/helper.rb +9 -0
  26. data/test/samples/test.md +29 -0
  27. data/test/samples/test_content_for.md +25 -0
  28. data/test/templates/test/test.html +52 -0
  29. data/test/templates/test/test.txt +5 -0
  30. data/test/test_gen.rb +54 -0
  31. data/test/test_kramdown.rb +67 -0
  32. data/test/test_slide.rb +44 -0
  33. data/test/test_version.rb +29 -0
  34. metadata +25 -17
  35. data/lib/slideshow/helpers/markdown_helper.rb +0 -20
  36. data/lib/slideshow/markup/markdown.rb +0 -20
  37. data/lib/slideshow/markup/mediawiki.rb +0 -40
  38. data/lib/slideshow/markup/rest.rb +0 -19
  39. data/lib/slideshow/markup/textile.rb +0 -70
@@ -0,0 +1,188 @@
1
+ # encoding: utf-8
2
+
3
+ module Slideshow
4
+
5
+
6
+ module DeckFilter
7
+
8
+ # add slide directive before h1 (tells slideshow gem where to break slides)
9
+ #
10
+ # e.g. changes:
11
+ # <h1 id='optional' class='optional'>
12
+ # to
13
+ # html comment -> _S9SLIDE_ (note: rdoc can't handle html comments?)
14
+ # <h1 id='optional' class='optional'>
15
+
16
+ def add_slide_directive_before_h1( content )
17
+
18
+ # mark h1 for getting wrapped into slide divs
19
+ # note: use just <h1 since some processors add ids e.g. <h1 id='x'>
20
+
21
+ slide_count = 0
22
+
23
+ content = content.gsub( /<h1/ ) do |match|
24
+ slide_count += 1
25
+ "\n<!-- _S9SLIDE_ -->\n#{Regexp.last_match(0)}"
26
+ end
27
+
28
+ puts " Adding #{slide_count} slide breaks (using h1 rule)..."
29
+
30
+ content
31
+ end
32
+
33
+ def add_slide_directive_before_h2( content )
34
+
35
+ slide_count = 0
36
+
37
+ content = content.gsub( /<h2/ ) do |match|
38
+ slide_count += 1
39
+ "\n<!-- _S9SLIDE_ -->\n#{Regexp.last_match(0)}"
40
+ end
41
+
42
+ puts " Adding #{slide_count} slide breaks (using h2 rule)..."
43
+
44
+ content
45
+ end
46
+
47
+
48
+
49
+ # add slide directive before div h1 (for pandoc-generated html)
50
+ #
51
+ # e.g. changes:
52
+ # <div id='header'>
53
+ # <h1 id='optional' class='optional'>
54
+ # to
55
+ # html comment -> _S9SLIDE_
56
+ # <div id='header'>
57
+ # <h1 id='optional' class='optional'>
58
+
59
+
60
+ def add_slide_directive_before_div_h1( content )
61
+
62
+ slide_count = 0
63
+
64
+ content = content.gsub( /<div[^>]*>\s*<h1/ ) do |match|
65
+ slide_count += 1
66
+ "\n<!-- _S9SLIDE_ -->\n#{Regexp.last_match(0)}"
67
+ end
68
+
69
+ puts " Adding #{slide_count} slide breaks (using div_h1 rule)..."
70
+
71
+ content
72
+ end
73
+
74
+ end # module DeckFilter
75
+
76
+
77
+
78
+ class Deck
79
+
80
+ include LogUtils::Logging
81
+ include DeckFilter # e.g. add_slide_directive_before_h1
82
+
83
+
84
+ attr_accessor :content ## all-in-one content (that is, incl. all slides )
85
+ attr_accessor :slides
86
+
87
+
88
+ def initialize( source, header_level: 1, use_slide: false )
89
+ @source = source ## keep a copy of the original source (input)
90
+
91
+ @header_level = header_level # e.g. 1 or 2 -- todo/fix: allow more options e.g. 1..2 etc.
92
+ @use_slide = use_slide # e.g. opts.slide? -- only allow !SLIDE directives fo slide breaks?
93
+
94
+ @slides = []
95
+ @content = '' # note: gets (re)build from slides in parse
96
+
97
+ parse()
98
+ end
99
+
100
+
101
+ def parse
102
+ #############################
103
+ # step 1 - add slide breaks
104
+
105
+ @content = @source
106
+
107
+ if @use_slide # only allow !SLIDE directives fo slide breaks?
108
+ # do nothing (no extra automagic slide breaks wanted)
109
+ else
110
+ if @header_level == 2
111
+ @content = add_slide_directive_before_h2( @content )
112
+ else # assume level 1
113
+ @content = add_slide_directive_before_h1( @content )
114
+ end
115
+ end
116
+
117
+
118
+ ### todo/fix: add back dump to file (requires @name and outpath !!!!)
119
+ ### dump_content_to_file_debug_html( content )
120
+
121
+
122
+ #############################################################
123
+ # step 2 - use generic slide break processing instruction to
124
+ # split content into slides
125
+
126
+ counter = 0
127
+ chunks = []
128
+ buf = ""
129
+
130
+
131
+ @content.each_line do |line|
132
+ if line.include?( '<!-- _S9SLIDE_' ) || line.include?( '<!-- @SLIDE' ) ## add new format
133
+ if counter > 0 # found start of new slide (and, thus, end of last slide)
134
+ chunks << buf # add slide to slide stack
135
+ buf = "" # reset slide source buffer
136
+ else # counter == 0
137
+ # check for first slide with missing leading SLIDE directive (possible/allowed in takahashi, for example)
138
+ ## remove html comments and whitspaces (still any content?)
139
+ ### more than just whitespace? assume its a slide
140
+ if buf.gsub(/<!--.*?-->/m, '').gsub( /[\n\r\t ]/, '').length > 0
141
+ logger.debug "add slide with missing leading slide directive >#{buf}< with slide_counter == 0"
142
+ chunks << buf
143
+ buf = ""
144
+ else
145
+ logger.debug "** note: skipping slide >#{buf}< with counter == 0"
146
+ end
147
+ end
148
+ counter += 1
149
+ end
150
+ buf << line
151
+ end
152
+
153
+ if counter > 0
154
+ chunks << buf # add slide to slide stack
155
+ buf = "" # reset slide source buffer
156
+ end
157
+
158
+
159
+ @slides = []
160
+ chunks.each do |chunk|
161
+ @slides << Slide.new( chunk, header_level: @header_level )
162
+ end
163
+
164
+
165
+ puts "#{@slides.size} slides found:"
166
+
167
+ @slides.each_with_index do |slide,i|
168
+ print " [#{i+1}] "
169
+ if slide.header.present?
170
+ print slide.header
171
+ else
172
+ # remove html comments
173
+ print "-- no header -- | #{slide.content.gsub(/<!--.*?-->/m, '').gsub(/\n/,'$')[0..40]}"
174
+ end
175
+ puts
176
+ end
177
+
178
+ ## rebuild all-in-one content (incl. all slides)
179
+ @content = ""
180
+ @slides.each do |slide|
181
+ @content << slide.to_classic_html
182
+ end
183
+ end # method parse
184
+
185
+
186
+ end # class Deck
187
+
188
+ end # class Slideshow
@@ -4,7 +4,7 @@ module Slideshow
4
4
 
5
5
  class Slide
6
6
 
7
- attr_accessor :logger
7
+ include LogUtils::Logging
8
8
 
9
9
  # NB: unparsed html source (use content_without_header
10
10
  # for content without option header)
@@ -14,9 +14,12 @@ module Slideshow
14
14
  attr_accessor :header
15
15
  attr_accessor :classes
16
16
 
17
- def initialize( content, options )
18
- @logger = options.logger
19
- @header_level = options.header_level
17
+
18
+ ### def to_drop() SlideDrop.new( self ); end -- add - why? why not??
19
+
20
+ def initialize( content, header_level: 1 )
21
+ ## options
22
+ @header_level = header_level
20
23
 
21
24
  @content = content
22
25
 
@@ -82,6 +85,8 @@ module Slideshow
82
85
 
83
86
 
84
87
  def data_attributes
88
+ return nil if @data.empty? ## note: return nil for empty hash
89
+
85
90
  buf = ""
86
91
  @data.each do | key,value |
87
92
  buf << "data-#{key}='#{value}' "
@@ -0,0 +1,117 @@
1
+ # encoding: utf-8
2
+
3
+ module Slideshow
4
+
5
+
6
+ class Opts
7
+
8
+ def header_level=(value)
9
+ @header_level = value.to_i
10
+ end
11
+
12
+ def header_level
13
+ ## todo: check 0 is not nil?
14
+ @header_level || 1
15
+ end
16
+
17
+ def slide=(boolean)
18
+ @slide = boolean
19
+ end
20
+
21
+ def slide?
22
+ return false if @slide.nil? # default slide flag is false
23
+ @slide == true
24
+ end
25
+
26
+ def takahashi=(boolean)
27
+ @takahashi = boolean
28
+ end
29
+
30
+ def takahashi?
31
+ return false if @takahashi.nil? # default takahashi flag is false
32
+ @takahashi == true
33
+ end
34
+
35
+ def verbose=(boolean) # add: alias for debug ??
36
+ @verbose = boolean
37
+ end
38
+
39
+ def verbose?
40
+ return false if @verbose.nil? # default verbose/debug flag is false
41
+ @verbose == true
42
+ end
43
+
44
+
45
+ def test=(boolean)
46
+ @test = boolean
47
+ end
48
+
49
+ def test?
50
+ return false if @test.nil? # default verbose/debug flag is false
51
+ @test == true
52
+ end
53
+
54
+
55
+ def quick_manifest=(value)
56
+ @quick_manifest = value
57
+ end
58
+
59
+ def quick_manifest
60
+ @quick_manifest || 'welcome'
61
+ end
62
+
63
+
64
+
65
+ def fetch_all=(boolean)
66
+ @fetch_all = boolean
67
+ end
68
+
69
+ def fetch_all?
70
+ return false if @fetch_all.nil? # default fetch all flag is false
71
+ @fetch_all == true
72
+ end
73
+
74
+
75
+
76
+ def includes=(value)
77
+ @includes = value
78
+ end
79
+
80
+ def includes
81
+ # fix: use os-agnostic delimiter (use : for Mac/Unix?)
82
+ @includes.nil? ? [] : @includes.split( ';' )
83
+ end
84
+
85
+ def has_includes?
86
+ @includes.nil? ? false : true
87
+ end
88
+
89
+
90
+ def manifest=(value)
91
+ @manifest = value
92
+ end
93
+
94
+ def manifest
95
+ @manifest || 's6'
96
+ end
97
+
98
+
99
+ def config_path=(value)
100
+ @config_path = value
101
+ end
102
+
103
+ def config_path
104
+ @config_path || File.join( Env.home, '.slideshow' )
105
+ end
106
+
107
+ def output_path=(value)
108
+ @output_path = value
109
+ end
110
+
111
+ def output_path
112
+ @output_path || '.'
113
+ end
114
+
115
+ end # class Opts
116
+
117
+ end # module Slideshow
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Slideshow
4
4
 
5
- MAJOR = 2
6
- MINOR = 5
5
+ MAJOR = 3
6
+ MINOR = 0
7
7
  PATCH = 0
8
8
  VERSION = [MAJOR,MINOR,PATCH].join('.')
9
9
 
data/test/helper.rb ADDED
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ # minitest setup
4
+ require 'minitest/autorun'
5
+
6
+
7
+ ## our own code
8
+ require 'slideshow/models'
9
+
@@ -0,0 +1,29 @@
1
+ title: test title
2
+ author: test author
3
+
4
+
5
+ # test header 1
6
+
7
+ test content 1
8
+
9
+
10
+ # test header 2
11
+
12
+ test content 2
13
+
14
+
15
+ # test header 3
16
+
17
+ test content 3 with some code
18
+
19
+ ```
20
+ puts 'hello'
21
+ ```
22
+
23
+ # test header 4
24
+
25
+ test content 4 with syntax highlighter
26
+
27
+ ```ruby
28
+ puts 'hello'
29
+ ```
@@ -0,0 +1,25 @@
1
+ title: test title
2
+ author: test author
3
+
4
+
5
+ <% content_for :css do %>
6
+ body { color: red}
7
+ <% end %>
8
+
9
+ <% content_for :js do %>
10
+ console.log( "hello, js" )
11
+ <% end %>
12
+
13
+
14
+ # test header 1
15
+
16
+ test content 1
17
+
18
+ <% content_for :css do %>
19
+ .slide1 { color: green }
20
+ <% end %>
21
+
22
+
23
+ # test header 2
24
+
25
+ test content 2
@@ -0,0 +1,52 @@
1
+ ---
2
+ ---
3
+
4
+ <html>
5
+ <head>
6
+ <title>pakman Test Template</title>
7
+ {{ more_content_for_head }}
8
+
9
+ <style>
10
+ {{ more_content_for_css }}
11
+ {{ content_for_css }}
12
+ {{ extra_css }}
13
+ </style>
14
+ </head>
15
+ <body>
16
+
17
+ <h1>Hello pakman</h1>
18
+
19
+ <h3>Headers</h3>
20
+
21
+ <ul>
22
+ <li>author: {{ headers.author }}</li>
23
+ <li>title: {{ headers.title }}</li>
24
+ <li>email: {{ headers.email }}</li>
25
+ <li>footer: {{ headers.footer }}</li>
26
+ <li>subfooter: {{ headers.subfooter }}</li>
27
+ <li>authorxxx: {{ headers.authorxxx }}</li> <!-- check missing keys too -->
28
+ </ul>
29
+
30
+ <ul>
31
+ <li>author: {{ headers['author'] }}</li>
32
+ <li>title: {{ headers['title'] }}</li>
33
+ <li>authorxxx: {{ headers['authorxxx'] }}</li> <!-- check missing keys too -->
34
+ </ul>
35
+
36
+ <h3>Slides</h3>
37
+
38
+ {% for slide in slides %}
39
+ <div>{{ slide.header }}</div>
40
+ <div>{{ slide.content_without_header }}</div>
41
+ {% endfor %}
42
+
43
+ <!-- begin (all-in-one) content -->
44
+ {{ content }}
45
+ <!-- end (all-in-one) content -->
46
+
47
+ <script>
48
+ {{ more_content_for_js }}
49
+ </script>
50
+
51
+ </body>
52
+ </html>