slide-em-up 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/README.md +16 -23
  2. data/lib/slide-em-up.rb +1 -0
  3. data/lib/slide-em-up/markdown.rb +41 -0
  4. data/lib/slide-em-up/presentation.rb +14 -32
  5. data/lib/slide-em-up/remote_api.rb +2 -1
  6. data/lib/slide-em-up/version.rb +1 -1
  7. data/themes/CSSS/css/slideshow.css +69 -123
  8. data/themes/CSSS/css/theme.css +11 -36
  9. data/themes/CSSS/index.erb +1 -0
  10. data/themes/CSSS/js/prefixfree.min.js +13 -0
  11. data/themes/CSSS/js/slideshow.js +319 -234
  12. data/themes/common/css/pygments/manni.css +61 -0
  13. data/themes/common/fonts/Lato-BoldItalic.woff +0 -0
  14. data/themes/common/fonts/Lato-Italic.woff +0 -0
  15. data/themes/common/fonts/Lato-bold.woff +0 -0
  16. data/themes/common/fonts/Lato.woff +0 -0
  17. data/themes/common/fonts/OpenSans-Bold.woff +0 -0
  18. data/themes/common/fonts/OpenSans-BoldItalic.woff +0 -0
  19. data/themes/common/fonts/OpenSans-Italic.woff +0 -0
  20. data/themes/common/fonts/OpenSans.woff +0 -0
  21. data/themes/common/fonts/PTMono.woff +0 -0
  22. data/themes/common/fonts/PTSans.Bold.Italic.woff +0 -0
  23. data/themes/common/fonts/PTSans.Bold.woff +0 -0
  24. data/themes/common/fonts/PTSans.Italic.woff +0 -0
  25. data/themes/common/fonts/PTSans.Narrow.Bold.woff +0 -0
  26. data/themes/common/fonts/PTSans.Narrow.woff +0 -0
  27. data/themes/common/fonts/PTSans.woff +0 -0
  28. data/themes/io2012/README +2 -0
  29. data/themes/io2012/css/default.css +1481 -0
  30. data/themes/io2012/css/fonts.css +24 -0
  31. data/themes/io2012/css/phone.css +27 -0
  32. data/themes/io2012/images/google_developers_icon_128.png +0 -0
  33. data/themes/io2012/images/io2012_logo.png +0 -0
  34. data/themes/io2012/index.erb +73 -0
  35. data/themes/io2012/js/hammer.js +586 -0
  36. data/themes/io2012/js/modernizr.custom.45394.js +4 -0
  37. data/themes/io2012/js/order.js +8 -0
  38. data/themes/io2012/js/polyfills/classList.min.js +2 -0
  39. data/themes/io2012/js/polyfills/dataset.min.js +2 -0
  40. data/themes/io2012/js/polyfills/history.min.js +1 -0
  41. data/themes/io2012/js/prettify/lang-apollo.js +2 -0
  42. data/themes/io2012/js/prettify/lang-clj.js +18 -0
  43. data/themes/io2012/js/prettify/lang-css.js +2 -0
  44. data/themes/io2012/js/prettify/lang-go.js +1 -0
  45. data/themes/io2012/js/prettify/lang-hs.js +2 -0
  46. data/themes/io2012/js/prettify/lang-lisp.js +3 -0
  47. data/themes/io2012/js/prettify/lang-lua.js +2 -0
  48. data/themes/io2012/js/prettify/lang-ml.js +2 -0
  49. data/themes/io2012/js/prettify/lang-n.js +4 -0
  50. data/themes/io2012/js/prettify/lang-proto.js +1 -0
  51. data/themes/io2012/js/prettify/lang-scala.js +2 -0
  52. data/themes/io2012/js/prettify/lang-sql.js +2 -0
  53. data/themes/io2012/js/prettify/lang-tex.js +1 -0
  54. data/themes/io2012/js/prettify/lang-vb.js +2 -0
  55. data/themes/io2012/js/prettify/lang-vhdl.js +3 -0
  56. data/themes/io2012/js/prettify/lang-wiki.js +2 -0
  57. data/themes/io2012/js/prettify/lang-xq.js +3 -0
  58. data/themes/io2012/js/prettify/lang-yaml.js +2 -0
  59. data/themes/io2012/js/prettify/prettify.css +1 -0
  60. data/themes/io2012/js/prettify/prettify.js +28 -0
  61. data/themes/io2012/js/require-1.0.8.min.js +33 -0
  62. data/themes/io2012/js/slide-controller.js +109 -0
  63. data/themes/io2012/js/slide-deck.js +768 -0
  64. data/themes/io2012/js/slides.js +5 -0
  65. data/themes/memories/css/slideshow.css +191 -50
  66. data/themes/memories/css/theme.css +10 -4
  67. data/themes/memories/index.erb +2 -0
  68. data/themes/memories/js/prefixfree.min.js +13 -0
  69. data/themes/memories/js/slideshow.js +526 -371
  70. data/themes/reveal/README +2 -0
  71. data/themes/reveal/css/main.css +1029 -0
  72. data/themes/reveal/css/reset.css +57 -0
  73. data/themes/reveal/index.erb +102 -0
  74. data/themes/reveal/js/classList.js +2 -0
  75. data/themes/reveal/js/head.min.js +8 -0
  76. data/themes/reveal/js/reveal.js +951 -0
  77. data/themes/shower/css/fonts.css +39 -7
  78. data/themes/shower/css/reset.css +21 -21
  79. data/themes/shower/css/style.css +108 -75
  80. data/themes/shower/index.erb +3 -0
  81. data/themes/shower/js/script.js +160 -92
  82. metadata +80 -18
data/README.md CHANGED
@@ -38,6 +38,15 @@ How to do your first presentation with Slide'em up?
38
38
  8. Use the arrows keys to navigate between the slides
39
39
 
40
40
 
41
+ Themes
42
+ ------
43
+
44
+ Several themes are available: `io2012`, `shower`, `3d_slideshow`, `reveal`,
45
+ `html5rocks`, `CSSS` and `memories`. To choose the theme for your
46
+ presentation, edit the `presentation.json` file and change the `"theme"`
47
+ element.
48
+
49
+
41
50
  Markup for the slides
42
51
  ---------------------
43
52
 
@@ -82,14 +91,6 @@ like this:
82
91
  ```
83
92
 
84
93
 
85
- Themes
86
- ------
87
-
88
- Several themes are available: shower, 3d_slideshow, html5rocks, CSSS
89
- and memories. To choose the theme for your presentation, edit the
90
- `presentation.json` file and change the `"theme"` element.
91
-
92
-
93
94
  Remote Control
94
95
  --------------
95
96
 
@@ -111,16 +112,6 @@ setting the `APIKEY` environment variable:
111
112
  APIKEY=foobar slide-em-up
112
113
 
113
114
 
114
- TODO
115
- ----
116
-
117
- * Same command line stuff than showoff
118
- * Add a showoff theme for compatibility
119
- * Many more themes and features
120
- * Favicon
121
- * Optimize process_code (pygments.rb?)
122
-
123
-
124
115
  Issues or Suggestions
125
116
  ---------------------
126
117
 
@@ -129,21 +120,23 @@ Found an issue or have a suggestion? Please report it on
129
120
 
130
121
  If you wants to make a pull request, please check the specs before:
131
122
 
132
- ./spec/slide-em-up_spec.rb
123
+ bundle exec spec/slide-em-up_spec.rb
133
124
 
134
125
 
135
126
  Credits
136
127
  -------
137
128
 
138
129
  Scott Chacon is the guy who made [ShowOff](https://github.com/schacon/showoff).
139
- Slide'em up is only a copy of ShowOff, where sinatra was replaced by Goliath.
130
+ Slide'em up is only a copy of ShowOff with multiple themes and sinatra
131
+ replaced by Goliath.
140
132
 
141
133
  Themes were picked from the internet. Thanks to:
142
134
 
143
- - Hakim El Hattab for 3d_slideshow
135
+ - Hakim El Hattab for 3d_slideshow and reveal
144
136
  - Google for html5rocks
145
137
  - Vadim Makeev for shower
146
- - Lea Verou for CSSS
138
+ - Lea Verou for CSSS (and its modified version, memories)
139
+ - Google for io2012
147
140
 
148
- Copyright (c) 2011 Bruno Michel <bruno.michel@af83.com>
141
+ ♡2011 by Bruno Michel. Copying is an act of love. Please copy and share.
149
142
  Released under the MIT license
data/lib/slide-em-up.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  module SlideEmUp
2
+ autoload :Markdown, "slide-em-up/markdown"
2
3
  autoload :Presentation, "slide-em-up/presentation"
3
4
  autoload :SlidesAPI, "slide-em-up/slides_api"
4
5
  autoload :RemoteAPI, "slide-em-up/remote_api"
@@ -0,0 +1,41 @@
1
+ # Encoding: utf-8
2
+ require "albino"
3
+ require "redcarpet"
4
+
5
+
6
+ module SlideEmUp
7
+ class Markdown < Redcarpet::Render::HTML
8
+ PARSER_OPTIONS = {
9
+ :no_intra_emphasis => true,
10
+ :tables => true,
11
+ :fenced_code_blocks => true,
12
+ :autolink => true,
13
+ :strikethrough => true,
14
+ :superscript => true
15
+ }
16
+
17
+ def self.render(text)
18
+ text ||= ""
19
+ markdown = Redcarpet::Markdown.new(self, PARSER_OPTIONS)
20
+ markdown.render(text)
21
+ end
22
+
23
+ def block_code(code, lang)
24
+ colorized = Albino.new(code, lang || "text").colorize(:P => "nowrap")
25
+ "<pre><code class=\"#{lang}\">#{colorized}</code></pre>"
26
+ end
27
+
28
+ def strikethrough(text)
29
+ "<s>#{text}</s>"
30
+ end
31
+
32
+ def normal_text(text)
33
+ text.gsub!('« ', '«&nbsp;')
34
+ text.gsub!(/ ([:;»!?])/, '&nbsp;\1')
35
+ text.gsub!(' -- ', '—')
36
+ text.gsub!('...', '…')
37
+ text
38
+ end
39
+
40
+ end
41
+ end
@@ -1,23 +1,27 @@
1
- require "albino"
2
- require "digest/sha1"
3
1
  require "erubis"
4
- require "redcarpet"
5
2
  require "yajl"
6
3
 
7
4
 
8
5
  module SlideEmUp
9
6
  class Presentation
10
- Meta = Struct.new(:title, :dir, :css, :js, :duration)
7
+ Meta = Struct.new(:title, :dir, :css, :js, :author, :duration)
11
8
  Theme = Struct.new(:title, :dir, :css, :js)
12
9
  Section = Struct.new(:number, :title, :dir, :slides)
13
- Slide = Struct.new(:number, :classes, :markdown, :html)
10
+
11
+ class Slide < Struct.new(:number, :classes, :html)
12
+ def extract_title
13
+ return @title if @title
14
+ html.sub!(/<h(\d)>(.*)<\/h\1>/) { @title = $2; "" }
15
+ @title
16
+ end
17
+ end
14
18
 
15
19
  attr_accessor :meta, :theme, :common, :parts
16
20
 
17
21
  def initialize(dir)
18
22
  infos = extract_normal_infos(dir) || extract_infos_from_showoff(dir) || {}
19
23
  infos = { "title" => "No title", "theme" => "shower", "duration" => 60 }.merge(infos)
20
- @meta = build_meta(infos["title"], dir, infos["duration"])
24
+ @meta = build_meta(infos["title"], dir, infos["author"], infos["duration"])
21
25
  @theme = build_theme(infos["theme"])
22
26
  @common = build_theme("common")
23
27
  @parts = infos["sections"] || raise(Exception, "check your presentation.json or showoff.json file")
@@ -52,7 +56,7 @@ module SlideEmUp
52
56
  { "title" => infos["name"], "theme" => "showoff", "sections" => sections }
53
57
  end
54
58
 
55
- def build_meta(title, dir, duration)
59
+ def build_meta(title, dir, author, duration)
56
60
  Meta.new.tap do |m|
57
61
  m.title = title
58
62
  m.dir = dir
@@ -60,6 +64,7 @@ module SlideEmUp
60
64
  m.css = Dir["**/*.css"]
61
65
  m.js = Dir["**/*.js"]
62
66
  end
67
+ m.author = author
63
68
  m.duration = duration
64
69
  end
65
70
  end
@@ -83,34 +88,11 @@ module SlideEmUp
83
88
  slides = parts.map.with_index do |slide,j|
84
89
  @codemap = {}
85
90
  classes, md = slide.split("\n", 2)
86
- tmp = extract_code(md)
87
- html = Redcarpet.new(tmp).to_html
88
- html = process_code(html)
89
- Slide.new(j, classes, md, html)
91
+ html = Markdown.render(md)
92
+ Slide.new(j, classes, html)
90
93
  end
91
94
  Section.new(i, title, dir, slides)
92
95
  end
93
96
  end
94
-
95
- # Code taken from gollum (http://github.com/github/gollum)
96
- def extract_code(md)
97
- md.gsub(/^``` ?(.+?)\r?\n(.+?)\r?\n```\r?$/m) do
98
- id = Digest::SHA1.hexdigest($2)
99
- @codemap[id] = { :lang => $1, :code => $2 }
100
- id
101
- end
102
- end
103
-
104
- def process_code(data)
105
- @codemap.each do |id, spec|
106
- lang, code = spec[:lang], spec[:code]
107
- if code.lines.all? { |line| line =~ /\A\r?\n\Z/ || line =~ /^( |\t)/ }
108
- code.gsub!(/^( |\t)/m, '')
109
- end
110
- output = Albino.new(code, lang).colorize(:P => "nowrap")
111
- data.gsub!(id, "<pre><code class=\"#{lang}\">#{output}</code></pre>")
112
- end
113
- data
114
- end
115
97
  end
116
98
  end
@@ -1,5 +1,6 @@
1
1
  require "goliath/api"
2
2
 
3
+
3
4
  module SlideEmUp
4
5
  class RemoteAPI < Goliath::API
5
6
  def initialize(key)
@@ -39,7 +40,7 @@ module SlideEmUp
39
40
  env['subscription'] = @chan.subscribe do |msg|
40
41
  env.stream_send("data: #{msg}\n\n")
41
42
  end
42
- streaming_response(200, {"Content-Type" => "text/event-stream"})
43
+ streaming_response(202, {"Content-Type" => "text/event-stream"})
43
44
  end
44
45
 
45
46
  def forbidden
@@ -1,3 +1,3 @@
1
1
  module SlideEmUp
2
- VERSION = "0.2.4"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -10,16 +10,8 @@
10
10
  .slide,
11
11
  .delayed,
12
12
  .delayed-children > * {
13
- -webkit-transition:1s;
14
- -ms-transition:1s;
15
- -moz-transition:1s;
16
- -o-transition:1s;
17
- transition:1s;
18
- -moz-transition-property: -webkit-transform, opacity, left, top, right, bottom;
19
- -ms-transition-property: -webkit-transform, opacity, left, top, right, bottom;
20
- -o-transition-property: -webkit-transform, opacity, left, top, right, bottom;
21
- -webkit-transition-property: -webkit-transform, opacity, left, top, right, bottom;
22
- transition-property: -webkit-transform, opacity, left, top, right, bottom;
13
+ transition:.5s;
14
+ transition-property: transform, opacity, left, top, right, bottom, background;
23
15
  }
24
16
 
25
17
  /**
@@ -31,50 +23,40 @@
31
23
  }
32
24
 
33
25
  body {
34
- counter-reset: slide;
35
26
  margin: 0;
36
27
  }
37
28
 
38
- .slide {
39
- visibility: hidden;
40
- position:absolute;
41
- top:0;
42
- right:0;
43
- bottom:0;
44
- left:0;
45
- z-index:1;
46
-
47
- font-size:250%;
48
- line-height:1.6;
49
-
50
- opacity:0;
51
- height:0;
52
- width:0;
53
- overflow:hidden;
54
-
55
- counter-increment: slide;
56
- }
29
+ .slide {
30
+ display: none;
31
+ position:absolute;
32
+ top:0;
33
+ right:0;
34
+ bottom:0;
35
+ left:0;
36
+ z-index:1;
37
+
38
+ font-size:250%;
39
+ line-height:1.6;
40
+ }
57
41
 
58
42
  .slide.previous,
59
43
  .slide:target,
60
- .slide:target + .slide, /* just in case, not really needed */
61
44
  .slide.next {
62
- visibility: visible;
45
+ display: block;
46
+ opacity:0;
47
+ overflow:hidden;
63
48
  }
64
49
 
65
50
  .slide:target {
66
51
  z-index:100;
67
52
  opacity:1;
68
- height:auto;
69
- width: auto;
70
53
  overflow: visible;
71
54
  }
72
55
 
73
56
  /**
74
57
  Slide numbers
75
58
  */
76
- .slide:target::before {
77
- content: counter(slide);
59
+ #indicator {
78
60
  position: absolute;
79
61
  top: .05in;
80
62
  right: .5em;
@@ -88,12 +70,7 @@
88
70
  text-align: center;
89
71
  padding: .1em .3em 0;
90
72
  min-width: 1.6em;
91
- -moz-box-sizing: border-box;
92
- -webkit-box-sizing: border-box;
93
73
  box-sizing: border-box;
94
-
95
- -moz-border-radius: 999px;
96
- -webkit-border-radius: 999px;
97
74
  border-radius: 999px;
98
75
  }
99
76
 
@@ -116,10 +93,48 @@
116
93
  .delayed.current,
117
94
  .delayed-children > .current,
118
95
  .delayed.displayed.non-dismissable,
119
- .delayed-children > .displayed.non-dismissable {
96
+ .delayed-children > .displayed.non-dismissable, /* non-dismissable name is deprecated */
97
+ .delayed.displayed.persistent,
98
+ .delayed-children > .displayed.persistent,
99
+ .delayed-children.persistent > .displayed {
120
100
  opacity: 1;
121
101
  }
122
102
 
103
+ /**
104
+ iframe slides
105
+ */
106
+ .iframe.slide {
107
+ padding: 0 !important;
108
+ text-align: center;
109
+ }
110
+
111
+ .iframe.slide > h1 {
112
+ position: absolute;
113
+ bottom: 0; right: 0; left: 0;
114
+ background: rgba(0,0,0,.5);
115
+ font-size: 100%;
116
+ }
117
+
118
+ .iframe.slide > h1 > a {
119
+ display: inline-block;
120
+ padding: .2em .5em;
121
+
122
+ color: white;
123
+ text-align: center;
124
+ text-decoration: none;
125
+ text-shadow: 0 -.05em .05em black;
126
+ }
127
+
128
+ .slide > iframe:only-of-type {
129
+ position: absolute;
130
+ top: 0;
131
+ left: 0;
132
+ border: 0;
133
+ width: 100%;
134
+ height: 100%;
135
+ margin: 0;
136
+ }
137
+
123
138
  /**
124
139
  Show thumbnails
125
140
  */
@@ -132,9 +147,6 @@
132
147
  .presenter .slide.next {
133
148
  width: 1024px;
134
149
  height: 768px;
135
-
136
- -moz-box-sizing: border-box;
137
- -webkit-box-sizing: border-box;
138
150
  box-sizing: border-box;
139
151
 
140
152
  float: left;
@@ -144,14 +156,7 @@
144
156
  margin:-292px -395px;
145
157
  cursor: pointer;
146
158
 
147
- -moz-transform: scale(.2, .2);
148
- -o-transform: scale(.2, .2);
149
- -webkit-transform: scale(.2, .2);
150
159
  transform: scale(.2, .2);
151
-
152
- -webkit-transition:1s -webkit-transform;
153
- -moz-transition:1s -moz-transform;
154
- -o-transition:1s -o-transform;
155
160
  transition:1s transform;
156
161
  }
157
162
 
@@ -172,7 +177,7 @@
172
177
  .show-thumbnails .slide:target,
173
178
  .presenter .slide:target + .slide {
174
179
  outline: 20px solid rgba(255, 255, 255, .6);
175
- -moz-outline-radius:5px;
180
+ outline-radius:5px;
176
181
 
177
182
  box-shadow: 5px 5px 10px black;
178
183
  }
@@ -198,46 +203,15 @@
198
203
  font-size: 250%;
199
204
  text-align: center;
200
205
  text-shadow: .05em .05em .1em black;
201
-
202
- -moz-transform: none;
203
- -ms-transform: none;
204
- -o-transform: none;
205
- -webkit-transform: none;
206
206
  transform: none;
207
207
  }
208
208
 
209
209
  /* Hide all elements in slide by hitting Ctrl + J or Shift + J */
210
210
  .hide-elements .slide:target > * {
211
211
  opacity: 0;
212
-
213
- -moz-transition:.5s;
214
- -webkit-transition:.5s;
215
- -o-transition:.5s;
216
212
  transition:.5s;
217
213
  }
218
214
 
219
- /* Mark slides as incomplete to spot them easier */
220
- .incomplete.slide::after {
221
- content: 'INCOMPLETE';
222
- font-weight: bold;
223
- position: absolute;
224
- top: 40%;
225
- left: 30%;
226
- padding: .1em .4em 0;
227
- border: .1em solid;
228
- color: rgba(255, 0, 0, .8);
229
- font-size: 140%;
230
-
231
- -moz-border-radius: .2em;
232
- -webkit-border-radius: .2em;
233
- border-radius: .2em;
234
-
235
- -moz-transform: rotate(30deg);
236
- -o-transform: rotate(30deg);
237
- -webkit-transform: rotate(30deg);
238
- transform: rotate(30deg);
239
- }
240
-
241
215
  /* Timer */
242
216
 
243
217
  #timer {
@@ -252,50 +226,25 @@
252
226
  background:rgba(0,0,0,.5);
253
227
  overflow: hidden;
254
228
  text-align: right;
255
-
256
- -moz-box-sizing: border-box;
257
- -webkit-box-sizing: border-box;
258
229
  box-sizing: border-box;
230
+ transition: linear;
259
231
  }
260
232
 
261
- #timer:before {
262
- content: 'Progress ';
263
- text-transform: uppercase;
264
- color: white;
265
- font-size: 9px;
266
- }
233
+ #timer:before {
234
+ content: 'Progress ';
235
+ text-transform: uppercase;
236
+ color: white;
237
+ font-size: 9px;
238
+ }
267
239
 
268
240
  #timer.end {
269
241
  width: 100%;
270
242
  }
271
243
 
272
- /* Ribbon */
273
- [data-type].slide:not(.hide-ribbon):after {
274
- content: attr(data-type);
275
- position: fixed;
276
- top: 0;
244
+ #timer.end.overtime {
245
+ width: 0%;
246
+ left: auto;
277
247
  right: 0;
278
- color: white;
279
- font-size: 50%;
280
- text-align: center;
281
- text-transform: uppercase;
282
- font-weight: bold;
283
- background: hsl(40,100%,50%);
284
- background-image: -webkit-linear-gradient(rgba(255, 255, 255, .3), rgba(255, 255, 255, 0));
285
- background-image: -moz-linear-gradient(rgba(255, 255, 255, .3), rgba(255, 255, 255, 0));
286
- background-image: -o-linear-gradient(rgba(255, 255, 255, .3), rgba(255, 255, 255, 0));
287
- line-height: 1.6;
288
- min-width: 20em;
289
-
290
- -moz-box-shadow: 0 10px 5px -5px rgba(0,0,0,.3);
291
- -webkit-box-shadow: 0 10px 5px -5px rgba(0,0,0,.3);
292
- box-shadow: 0 10px 5px -5px rgba(0,0,0,.3);
293
-
294
- -moz-transform: rotate(45deg) translate(6em, -2em);
295
- -ms-transform: rotate(45deg) translate(6em, -2em);
296
- -webkit-transform: rotate(45deg) translate(6em, -2em);
297
- -o-transform: rotate(45deg) translate(6em, -2em);
298
- transform: rotate(45deg) translate(6em, -2em);
299
248
  }
300
249
 
301
250
  /* Presenter & projector views */
@@ -320,9 +269,6 @@
320
269
  background: rgba(255, 255, 255, .5);
321
270
  color: black;
322
271
  text-shadow: 0 1px white;
323
-
324
- -moz-box-shadow: .1em .1em .3em rgba(0,0,0,.5) inset;
325
- -webkit-box-shadow: .1em .1em .3em rgba(0,0,0,.5) inset;
326
272
  box-shadow: .1em .1em .3em rgba(0,0,0,.5) inset;
327
273
  }
328
274
 
@@ -337,4 +283,4 @@
337
283
 
338
284
  .presenter .slide:target > .presenter-notes {
339
285
  display: block;
340
- }
286
+ }